From 9d0002e5cb97d939f2f74ab1e635b616d634e7db Mon Sep 17 00:00:00 2001 From: Mauro Sardara Date: Wed, 20 Feb 2019 14:32:42 +0100 Subject: [HICN-73] Performance improvements of interest/data transmission and reception at low level in the stack (portal.h) Change-Id: I1525726f52040f1609e284bb9b995ea8794c5d5e Signed-off-by: Mauro Sardara --- libtransport/src/hicn/transport/core/packet.cc | 70 +++++++++++++++++--------- 1 file changed, 46 insertions(+), 24 deletions(-) (limited to 'libtransport/src/hicn/transport/core/packet.cc') diff --git a/libtransport/src/hicn/transport/core/packet.cc b/libtransport/src/hicn/transport/core/packet.cc index ec99bb3f7..d925375ce 100644 --- a/libtransport/src/hicn/transport/core/packet.cc +++ b/libtransport/src/hicn/transport/core/packet.cc @@ -50,30 +50,7 @@ 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())) {} @@ -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 &&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 &&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 Packet::getPayload() const { + const_cast(this)->separateHeaderPayload(); + if (TRANSPORT_EXPECT_FALSE(payload_head_ == nullptr)) { return utils::Array(); } @@ -263,6 +254,8 @@ Packet::Format Packet::getFormat() const { const std::shared_ptr Packet::data() { return packet_; } void Packet::dump() const { + const_cast(this)->separateHeaderPayload(); + std::cout << "HEADER -- Length: " << headerSize() << std::endl; hicn_packet_dump((uint8_t *)header_head_->data(), headerSize()); @@ -604,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 -- cgit 1.2.3-korg