From 7870451290d356784093fbff3c734dffa6d53b41 Mon Sep 17 00:00:00 2001 From: Tommaso Pecorella Date: Sat, 19 Sep 2015 16:14:49 +0200 Subject: [PATCH] Bug 2177 - Ipv6ExtensionHeader length - code cleanup and remove hardcoded values --- src/applications/model/ping6.cc | 1 - src/internet/model/ipv6-extension-header.cc | 30 ++++++++++++--------- src/internet/model/ipv6-extension-header.h | 11 ++++---- src/internet/model/ipv6-extension.cc | 1 - 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/applications/model/ping6.cc b/src/applications/model/ping6.cc index ac2707fc3..21a30237a 100644 --- a/src/applications/model/ping6.cc +++ b/src/applications/model/ping6.cc @@ -214,7 +214,6 @@ void Ping6::Send () { 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); diff --git a/src/internet/model/ipv6-extension-header.cc b/src/internet/model/ipv6-extension-header.cc index 273a04867..1eb0c7e71 100644 --- a/src/internet/model/ipv6-extension-header.cc +++ b/src/internet/model/ipv6-extension-header.cc @@ -46,8 +46,8 @@ TypeId Ipv6ExtensionHeader::GetInstanceTypeId () const } Ipv6ExtensionHeader::Ipv6ExtensionHeader () - : m_nextHeader (0), - m_length (0), + : m_length (0), + m_nextHeader (0), m_data (0) { } @@ -254,7 +254,7 @@ uint32_t Ipv6ExtensionHopByHopHeader::Deserialize (Buffer::Iterator start) 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 @@ uint32_t Ipv6ExtensionDestinationHeader::Deserialize (Buffer::Iterator start) 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 @@ Ipv6ExtensionFragmentHeader::Ipv6ExtensionFragmentHeader () : m_offset (0), m_identification (0) { - SetLength (16); + m_length = 0; } Ipv6ExtensionFragmentHeader::~Ipv6ExtensionFragmentHeader () @@ -392,6 +392,7 @@ void Ipv6ExtensionFragmentHeader::Serialize (Buffer::Iterator start) const 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 @@ uint32_t Ipv6ExtensionFragmentHeader::Deserialize (Buffer::Iterator start) 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 @@ void Ipv6ExtensionRoutingHeader::Serialize (Buffer::Iterator start) const 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 @@ uint32_t Ipv6ExtensionRoutingHeader::Deserialize (Buffer::Iterator start) 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 @@ void Ipv6ExtensionLooseRoutingHeader::Serialize (Buffer::Iterator start) const 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 @@ uint32_t Ipv6ExtensionLooseRoutingHeader::Deserialize (Buffer::Iterator start) 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::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 (); diff --git a/src/internet/model/ipv6-extension-header.h b/src/internet/model/ipv6-extension-header.h index f311d99c6..3be3544ef 100644 --- a/src/internet/model/ipv6-extension-header.h +++ b/src/internet/model/ipv6-extension-header.h @@ -111,17 +111,18 @@ public: */ virtual uint32_t Deserialize (Buffer::Iterator start); +protected: + /** + * \brief The "length" field. + */ + uint8_t m_length; + private: /** * \brief The "next header" field. */ uint8_t m_nextHeader; - /** - * \brief The "length" field. - */ - uint8_t m_length; - /** * \brief The data of the extension. */ diff --git a/src/internet/model/ipv6-extension.cc b/src/internet/model/ipv6-extension.cc index a1855371b..e20c986a2 100644 --- a/src/internet/model/ipv6-extension.cc +++ b/src/internet/model/ipv6-extension.cc @@ -1020,7 +1020,6 @@ uint8_t Ipv6ExtensionLooseRouting::Process (Ptr& packet, return routingHeader.GetSerializedSize (); } - routingHeader.SetLength (88); ipv6header.SetHopLimit (hopLimit - 1); p->AddHeader (routingHeader);