diff options
Diffstat (limited to 'libtransport/src/hicn/transport/core/packet.cc')
-rw-r--r-- | libtransport/src/hicn/transport/core/packet.cc | 96 |
1 files changed, 53 insertions, 43 deletions
diff --git a/libtransport/src/hicn/transport/core/packet.cc b/libtransport/src/hicn/transport/core/packet.cc index b3e5526ab..d925375ce 100644 --- a/libtransport/src/hicn/transport/core/packet.cc +++ b/libtransport/src/hicn/transport/core/packet.cc @@ -50,37 +50,14 @@ Packet::Packet(MemBufPtr &&buffer) packet_start_(packet_->writableData()), header_head_(packet_.get()), payload_head_(nullptr), - format_(getFormatFromBuffer(packet_start_)) { - int signature_size = 0; - - if (_is_ah(format_)) { - signature_size = (uint32_t)getSignatureSize(); - } - - auto header_size = getHeaderSizeFromFormat(format_, signature_size); - auto payload_length = packet_->length() - header_size; - if (!payload_length) { - return; - } - - packet_->trimEnd(packet_->length()); - - if (payload_length) { - auto payload = packet_->cloneOne(); - payload_head_ = payload.get(); - payload_head_->advance(header_size); - payload_head_->append(payload_length); - packet_->prependChain(std::move(payload)); - packet_->append(header_size); - } -} + format_(getFormatFromBuffer(packet_start_)) {} Packet::Packet(const uint8_t *buffer, std::size_t size) : Packet(MemBufPtr(utils::MemBuf::copyBuffer(buffer, size).release())) {} Packet::Packet(Packet &&other) : packet_(std::move(other.packet_)), - packet_start_(packet_->writableData()), + packet_start_(other.packet_start_), header_head_(other.header_head_), payload_head_(other.payload_head_), format_(other.format_) { @@ -145,6 +122,14 @@ std::size_t Packet::getPayloadSizeFromBuffer(Format format, return payload_length; } +void Packet::replace(MemBufPtr &&buffer) { + packet_ = std::move(buffer); + packet_start_ = packet_->writableData(); + header_head_ = packet_.get(); + payload_head_ = nullptr; + format_ = getFormatFromBuffer(packet_start_); +} + std::size_t Packet::payloadSize() const { return getPayloadSizeFromBuffer(format_, packet_start_); } @@ -173,6 +158,8 @@ uint32_t Packet::getLifetime() const { } Packet &Packet::appendPayload(std::unique_ptr<utils::MemBuf> &&payload) { + separateHeaderPayload(); + if (!payload_head_) { payload_head_ = payload.get(); } @@ -187,6 +174,8 @@ Packet &Packet::appendPayload(const uint8_t *buffer, std::size_t length) { } Packet &Packet::appendHeader(std::unique_ptr<utils::MemBuf> &&header) { + separateHeaderPayload(); + if (!payload_head_) { header_head_->prependChain(std::move(header)); } else { @@ -202,6 +191,8 @@ Packet &Packet::appendHeader(const uint8_t *buffer, std::size_t length) { } utils::Array<uint8_t> Packet::getPayload() const { + const_cast<Packet *>(this)->separateHeaderPayload(); + if (TRANSPORT_EXPECT_FALSE(payload_head_ == nullptr)) { return utils::Array<uint8_t>(); } @@ -263,13 +254,15 @@ Packet::Format Packet::getFormat() const { const std::shared_ptr<utils::MemBuf> Packet::data() { return packet_; } void Packet::dump() const { + const_cast<Packet *>(this)->separateHeaderPayload(); + std::cout << "HEADER -- Length: " << headerSize() << std::endl; hicn_packet_dump((uint8_t *)header_head_->data(), headerSize()); std::cout << std::endl << "PAYLOAD -- Length: " << payloadSize() << std::endl; for (utils::MemBuf *current = payload_head_; current && current != header_head_; current = current->next()) { - std::cout << "First MemBuf Length: " << current->length() << std::endl; + std::cout << "MemBuf Length: " << current->length() << std::endl; hicn_packet_dump((uint8_t *)current->data(), current->length()); } } @@ -310,17 +303,6 @@ std::size_t Packet::getSignatureSize() const { return size_bytes; } -void Packet::setSignature(std::unique_ptr<utils::MemBuf> &&signature) { - // Check if packet already contains a signature - auto header = header_head_->next(); - while (header != payload_head_) { - header->unlink(); - header = header->next(); - } - - appendHeader(std::move(signature)); -} - void Packet::setSignatureTimestamp(const uint64_t ×tamp) { int ret = hicn_packet_set_signature_timestamp( format_, (hicn_header_t *)packet_start_, timestamp); @@ -397,12 +379,11 @@ utils::CryptoHash Packet::computeDigest(HashAlgorithm algorithm) const { const_cast<Packet *>(this)->resetForHash(); - std::size_t payload_len = getPayloadSizeFromBuffer(format_, packet_start_); - std::size_t header_length = getHeaderSizeFromFormat(format_); - std::size_t signature_size = _is_ah(format_) ? getSignatureSize() : 0; - - hasher.updateBytes(packet_start_, - payload_len + header_length + signature_size); + auto current = header_head_; + do { + hasher.updateBytes(current->data(), current->length()); + current = current->next(); + } while (current != header_head_); hicn_packet_copy_header(format_, &header_copy, (hicn_header_t *)packet_start_, false); @@ -616,6 +597,35 @@ uint8_t Packet::getTTL() const { return hops; } +void Packet::separateHeaderPayload() { + if (payload_head_) { + return; + } + + int signature_size = 0; + + if (_is_ah(format_)) { + signature_size = (uint32_t)getSignatureSize(); + } + + auto header_size = getHeaderSizeFromFormat(format_, signature_size); + auto payload_length = packet_->length() - header_size; + if (!payload_length) { + return; + } + + packet_->trimEnd(packet_->length()); + + if (payload_length) { + auto payload = packet_->cloneOne(); + payload_head_ = payload.get(); + payload_head_->advance(header_size); + payload_head_->append(payload_length); + packet_->prependChain(std::move(payload)); + packet_->append(header_size); + } +} + } // end namespace core } // end namespace transport |