Bug 2177 - Ipv6ExtensionHeader length - code cleanup and remove hardcoded values
authorTommaso Pecorella <tommaso.pecorella@unifi.it>
Sat, 19 Sep 2015 16:14:49 +0200
changeset 11673 71b37dda3fe8
parent 11672 1905dcc9d4ef
child 11674 f5f18bea8021
Bug 2177 - Ipv6ExtensionHeader length - code cleanup and remove hardcoded values
src/applications/model/ping6.cc
src/internet/model/ipv6-extension-header.cc
src/internet/model/ipv6-extension-header.h
src/internet/model/ipv6-extension.cc
--- a/src/applications/model/ping6.cc	Fri Sep 18 11:18:45 2015 +0200
+++ b/src/applications/model/ping6.cc	Sat Sep 19 16:14:49 2015 +0200
@@ -214,7 +214,6 @@
     {
       Ipv6ExtensionLooseRoutingHeader routingHeader;
       routingHeader.SetNextHeader (Ipv6Header::IPV6_ICMPV6);
-      routingHeader.SetLength (m_routers.size () * 16 + 8);
       routingHeader.SetTypeRouting (0);
       routingHeader.SetSegmentsLeft (m_routers.size ());
       routingHeader.SetRoutersAddress (m_routers);
--- a/src/internet/model/ipv6-extension-header.cc	Fri Sep 18 11:18:45 2015 +0200
+++ b/src/internet/model/ipv6-extension-header.cc	Sat Sep 19 16:14:49 2015 +0200
@@ -46,8 +46,8 @@
 }
 
 Ipv6ExtensionHeader::Ipv6ExtensionHeader ()
-  : m_nextHeader (0),
-    m_length (0),
+  : m_length (0),
+    m_nextHeader (0),
     m_data (0)
 {
 }
@@ -254,7 +254,7 @@
   Buffer::Iterator i = start;
 
   SetNextHeader (i.ReadU8 ());
-  SetLength ((i.ReadU8 () + 1) << 3);
+  m_length = i.ReadU8 ();
   OptionField::Deserialize (i, GetLength () - 2);
 
   return GetSerializedSize ();
@@ -310,7 +310,7 @@
   Buffer::Iterator i = start;
 
   SetNextHeader (i.ReadU8 ());
-  SetLength ((i.ReadU8 () + 1) << 3);
+  m_length = i.ReadU8 ();
   OptionField::Deserialize (i, GetLength () - 2);
 
   return GetSerializedSize ();
@@ -337,7 +337,7 @@
   : m_offset (0),
     m_identification (0)
 {
-  SetLength (16);
+  m_length = 0;
 }
 
 Ipv6ExtensionFragmentHeader::~Ipv6ExtensionFragmentHeader ()
@@ -392,6 +392,7 @@
   Buffer::Iterator i = start;
 
   i.WriteU8 (GetNextHeader ());
+  // Fragment header does not carry an extension length
   i.WriteU8 (0);
   i.WriteHtonU16 (m_offset);
   i.WriteHtonU32 (m_identification);
@@ -402,7 +403,8 @@
   Buffer::Iterator i = start;
 
   SetNextHeader (i.ReadU8 ());
-  SetLength ((i.ReadU8 () + 1) << 3);
+  // Fragment header does not carry an extension length
+  i.ReadU8 ();
   m_offset = i.ReadNtohU16 ();
   m_identification = i.ReadNtohU32 ();
 
@@ -472,7 +474,7 @@
   Buffer::Iterator i = start;
 
   i.WriteU8 (GetNextHeader ());
-  i.WriteU8 ((GetLength () >> 3) - 1);
+  i.WriteU8 (m_length);
   i.WriteU8 (m_typeRouting);
   i.WriteU8 (m_segmentsLeft);
 }
@@ -482,7 +484,7 @@
   Buffer::Iterator i = start;
 
   SetNextHeader (i.ReadU8 ());
-  SetLength ((i.ReadU8 () + 1) << 3);
+  m_length = i.ReadU8 ();
   m_typeRouting = i.ReadU8 ();
   m_segmentsLeft = i.ReadU8 ();
 
@@ -564,8 +566,10 @@
   Buffer::Iterator i = start;
   uint8_t buff[16];
 
+  uint8_t addressNum = m_routersAddress.size ();
+
   i.WriteU8 (GetNextHeader ());
-  i.WriteU8 ((GetLength () >> 3) - 1);
+  i.WriteU8 (addressNum*2);
   i.WriteU8 (GetTypeRouting ());
   i.WriteU8 (GetSegmentsLeft ());
   i.WriteU32 (0);
@@ -583,15 +587,17 @@
   uint8_t buff[16];
 
   SetNextHeader (i.ReadU8 ());
-  SetLength ((i.ReadU8 () + 1) << 3);
+  m_length = i.ReadU8 ();
   SetTypeRouting (i.ReadU8 ());
   SetSegmentsLeft (i.ReadU8 ());
   i.ReadU32 ();
 
-  for (std::vector<Ipv6Address>::iterator it = m_routersAddress.begin (); it != m_routersAddress.end (); it++)
+  uint8_t addressNum = m_length / 2;
+  SetNumberAddress (addressNum);
+  for (uint8_t index = 0; index < addressNum; index++)
     {
       i.Read (buff, 16);
-      it->Set (buff);
+      SetRouterAddress (index, Ipv6Address (buff));
     }
 
   return GetSerializedSize ();
--- a/src/internet/model/ipv6-extension-header.h	Fri Sep 18 11:18:45 2015 +0200
+++ b/src/internet/model/ipv6-extension-header.h	Sat Sep 19 16:14:49 2015 +0200
@@ -111,6 +111,12 @@
    */
   virtual uint32_t Deserialize (Buffer::Iterator start);
 
+protected:
+  /**
+   * \brief The "length" field.
+   */
+  uint8_t m_length;
+
 private:
   /**
    * \brief The "next header" field.
@@ -118,11 +124,6 @@
   uint8_t m_nextHeader;
 
   /**
-   * \brief The "length" field.
-   */
-  uint8_t m_length;
-
-  /**
    * \brief The data of the extension.
    */
   Buffer m_data;
--- a/src/internet/model/ipv6-extension.cc	Fri Sep 18 11:18:45 2015 +0200
+++ b/src/internet/model/ipv6-extension.cc	Sat Sep 19 16:14:49 2015 +0200
@@ -1020,7 +1020,6 @@
       return routingHeader.GetSerializedSize ();
     }
 
-  routingHeader.SetLength (88);
   ipv6header.SetHopLimit (hopLimit - 1);
   p->AddHeader (routingHeader);