[HICN-679] Do not throw exception when receiving corrupted/not-hicn packet from netwo... 12/31112/5
authorMauro Sardara <msardara@cisco.com>
Thu, 4 Feb 2021 11:20:30 +0000 (12:20 +0100)
committerMauro Sardara <msardara@cisco.com>
Fri, 5 Feb 2021 08:54:15 +0000 (09:54 +0100)
Signed-off-by: Mauro Sardara <msardara@cisco.com>
Change-Id: I082e3c1b5fc9f535089114cfe14940f094947b66
Signed-off-by: Mauro Sardara <msardara@cisco.com>
lib/includes/hicn/common.h
lib/src/common.c
libtransport/includes/hicn/transport/core/packet.h
libtransport/src/core/packet.cc
libtransport/src/core/portal.h
libtransport/src/core/tcp_socket_connector.cc

index 30f3702..6904c63 100644 (file)
@@ -250,7 +250,7 @@ u32 cumulative_hash32 (const void *data, size_t len, u32 lastValue);
 u32 hash32 (const void *data, size_t len);
 u64 cumulative_hash64 (const void *data, size_t len, u64 lastValue);
 u64 hash64 (const void *data, size_t len);
-void hicn_packet_dump (uint8_t * buffer, size_t len);
+void hicn_packet_dump (const uint8_t * buffer, size_t len);
 
 #endif /* ! HICN_VPP_PLUGIN */
 
index 78d25b7..228a59d 100644 (file)
@@ -29,6 +29,7 @@
 #include <stdio.h>
 
 #include <hicn/common.h>
+#include <hicn/util/log.h>
 
 
 
@@ -109,7 +110,7 @@ hash64 (const void *data, size_t len)
 }
 
 void
-hicn_packet_dump (uint8_t * buffer, size_t len)
+hicn_packet_dump (const uint8_t * buffer, size_t len)
 {
   int i;
   unsigned char buff[17];
@@ -118,7 +119,7 @@ hicn_packet_dump (uint8_t * buffer, size_t len)
   // Output description if given.
   if (len == 0)
     {
-      printf ("  ZERO LENGTH\n");
+      TRACE ("  ZERO LENGTH\n");
       return;
     }
 
@@ -131,14 +132,14 @@ hicn_packet_dump (uint8_t * buffer, size_t len)
        {
          // Just don't print ASCII for the zeroth line.
          if (i != 0)
-           printf ("  %s\n", buff);
+           TRACE ("  %s\n", buff);
 
          // Output the offset.
-         printf ("  %04x ", i);
+         TRACE ("  %04x ", i);
        }
 
       // Now the hex code for the specific character.
-      printf (" %02x", pc[i]);
+      TRACE (" %02x", pc[i]);
 
       // And store a printable ASCII character for later.
       if ((pc[i] < 0x20) || (pc[i] > 0x7e))
@@ -151,12 +152,12 @@ hicn_packet_dump (uint8_t * buffer, size_t len)
   // Pad out last line if not exactly 16 characters.
   while ((i % 16) != 0)
     {
-      printf ("   ");
+      TRACE ("   ");
       i++;
     }
 
   // And print the final ASCII bit.
-  printf ("  %s\n", buff);
+  TRACE ("  %s\n", buff);
 }
 
 /*
index 2efd743..91f9579 100644 (file)
@@ -23,6 +23,7 @@
 #include <hicn/transport/security/crypto_suite.h>
 #include <hicn/transport/security/key_id.h>
 #include <hicn/transport/utils/branch_prediction.h>
+#include <hicn/transport/utils/log.h>
 #include <hicn/transport/utils/membuf.h>
 #include <hicn/transport/utils/object_pool.h>
 
@@ -97,13 +98,16 @@ class Packet : public std::enable_shared_from_this<Packet> {
 
   static bool isInterest(const uint8_t *buffer);
 
-  static Format getFormatFromBuffer(const uint8_t *buffer) {
+  static Format getFormatFromBuffer(const uint8_t *buffer, std::size_t length) {
     Format format = HF_UNSPEC;
 
     if (TRANSPORT_EXPECT_FALSE(
             hicn_packet_get_format((const hicn_header_t *)buffer, &format) <
             0)) {
-      throw errors::MalformedPacketException();
+      TRANSPORT_LOGE(
+          "Error while getting format from packet buffer. Packet will be "
+          "discarded.");
+      hicn_packet_dump(buffer, length);
     }
 
     return format;
@@ -114,7 +118,8 @@ class Packet : public std::enable_shared_from_this<Packet> {
     packet_start_ = reinterpret_cast<hicn_header_t *>(packet_->writableData());
     header_head_ = packet_.get();
     payload_head_ = nullptr;
-    format_ = getFormatFromBuffer(reinterpret_cast<uint8_t *>(packet_start_));
+    format_ = getFormatFromBuffer(reinterpret_cast<uint8_t *>(packet_start_),
+                                  packet_->length());
     name_.clear();
   }
 
index 6815868..cd2c5aa 100644 (file)
@@ -50,7 +50,8 @@ Packet::Packet(MemBufPtr &&buffer)
       packet_start_(reinterpret_cast<hicn_header_t *>(packet_->writableData())),
       header_head_(packet_.get()),
       payload_head_(nullptr),
-      format_(getFormatFromBuffer(packet_->writableData())) {}
+      format_(getFormatFromBuffer(packet_->writableData(), packet_->length())) {
+}
 
 Packet::Packet(const uint8_t *buffer, std::size_t size)
     : Packet(MemBufPtr(utils::MemBuf::copyBuffer(buffer, size).release())) {}
@@ -210,13 +211,13 @@ const std::shared_ptr<utils::MemBuf> Packet::acquireMemBufReference() const {
 void Packet::dump() const {
   const_cast<Packet *>(this)->separateHeaderPayload();
 
-  std::cout << "HEADER -- Length: " << headerSize() << std::endl;
+  TRANSPORT_LOGI("HEADER -- Length: %zu", headerSize());
   hicn_packet_dump((uint8_t *)header_head_->data(), headerSize());
 
-  std::cout << std::endl << "PAYLOAD -- Length: " << payloadSize() << std::endl;
+  TRANSPORT_LOGI("PAYLOAD -- Length: %zu", payloadSize());
   for (utils::MemBuf *current = payload_head_;
        current && current != header_head_; current = current->next()) {
-    std::cout << "MemBuf Length: " << current->length() << std::endl;
+    TRANSPORT_LOGI("MemBuf Length: %zu", current->length());
     hicn_packet_dump((uint8_t *)current->data(), current->length());
   }
 }
index 364a365..b63eab3 100644 (file)
@@ -96,13 +96,13 @@ class HandlerAllocator {
   HandlerAllocator(const HandlerAllocator<U> &other) noexcept
       : memory_(other.memory_) {}
 
-  TRANSPORT_ALWAYS_INLINE bool operator==(const HandlerAllocator &other) const
-      noexcept {
+  TRANSPORT_ALWAYS_INLINE bool operator==(
+      const HandlerAllocator &other) const noexcept {
     return &memory_ == &other.memory_;
   }
 
-  TRANSPORT_ALWAYS_INLINE bool operator!=(const HandlerAllocator &other) const
-      noexcept {
+  TRANSPORT_ALWAYS_INLINE bool operator!=(
+      const HandlerAllocator &other) const noexcept {
     return &memory_ != &other.memory_;
   }
 
@@ -139,7 +139,7 @@ class CustomAllocatorHandler {
   }
 
   template <typename... Args>
-  void operator()(Args &&... args) {
+  void operator()(Args &&...args) {
     handler_(std::forward<Args>(args)...);
   }
 
@@ -548,7 +548,8 @@ class Portal {
       return;
     }
 
-    Packet::Format format = Packet::getFormatFromBuffer(packet_buffer->data());
+    Packet::Format format = Packet::getFormatFromBuffer(
+        packet_buffer->data(), packet_buffer->length());
 
     if (TRANSPORT_EXPECT_TRUE(_is_tcp(format))) {
       if (!Packet::isInterest(packet_buffer->data())) {
index 20b3d6c..fa029c6 100644 (file)
@@ -33,6 +33,8 @@ namespace {
 class NetworkMessage {
  public:
   static constexpr std::size_t fixed_header_length = 10;
+  static constexpr std::uint8_t ccnx_flag = 102;
+  static constexpr std::size_t ccnx_packet_length = 44;
 
   static std::size_t decodeHeader(const uint8_t *packet) {
     // General checks
@@ -40,11 +42,12 @@ class NetworkMessage {
     uint8_t first_byte = packet[0];
     uint8_t ip_format = (packet[0] & 0xf0) >> 4;
 
-    if (TRANSPORT_EXPECT_FALSE(first_byte == 102)) {
+    if (TRANSPORT_EXPECT_FALSE(first_byte == ccnx_flag)) {
       // Get packet length
-      return 44;
+      return ccnx_packet_length;
     } else if (TRANSPORT_EXPECT_TRUE(ip_format == 6 || ip_format == 4)) {
-      Packet::Format format = Packet::getFormatFromBuffer(packet);
+      Packet::Format format =
+          Packet::getFormatFromBuffer(packet, fixed_header_length);
       return Packet::getHeaderSizeFromBuffer(format, packet) +
              Packet::getPayloadSizeFromBuffer(format, packet);
     }