--- 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);