aboutsummaryrefslogtreecommitdiffstats
path: root/libtransport/src/hicn/transport/core/packet.cc
diff options
context:
space:
mode:
authorMauro Sardara <msardara@cisco.com>2019-02-20 14:32:42 +0100
committerMauro Sardara <msardara@cisco.com>2019-03-05 11:42:39 +0100
commit9d0002e5cb97d939f2f74ab1e635b616d634e7db (patch)
tree730e4240a637264f859b3b7efeeb8fb83d476f3d /libtransport/src/hicn/transport/core/packet.cc
parent6d7704c1b497341fd6dd3c27e3f64d0db062ccc2 (diff)
[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 <msardara@cisco.com>
Diffstat (limited to 'libtransport/src/hicn/transport/core/packet.cc')
-rw-r--r--libtransport/src/hicn/transport/core/packet.cc70
1 files changed, 46 insertions, 24 deletions
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<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,6 +254,8 @@ 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());
@@ -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