diff --git a/RELEASE_NOTES b/RELEASE_NOTES index 98e2a4c3e..e72d20d06 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -55,6 +55,7 @@ Bugs fixed - Bug 1802 - FlowMon header deserialization problem with IPv4 fragments - Bug 1807 - Multiple bugs in Ipv4L3Protocol::LocalDeliver - Bug 1810 - IP packets can be sent on NetDevices not respecting the minimum MTU requirements +- Bug 1814 - IPv6 Packet with length not multiple of 8 bytes are fragmented incorrectly. Release 3.18.1 ============== diff --git a/src/internet/model/ipv6-extension-header.cc b/src/internet/model/ipv6-extension-header.cc index 57e6114ed..3f9bfa392 100644 --- a/src/internet/model/ipv6-extension-header.cc +++ b/src/internet/model/ipv6-extension-header.cc @@ -334,6 +334,7 @@ Ipv6ExtensionFragmentHeader::Ipv6ExtensionFragmentHeader () : m_offset (0), m_identification (0) { + SetLength (0); } Ipv6ExtensionFragmentHeader::~Ipv6ExtensionFragmentHeader () @@ -388,7 +389,7 @@ void Ipv6ExtensionFragmentHeader::Serialize (Buffer::Iterator start) const Buffer::Iterator i = start; i.WriteU8 (GetNextHeader ()); - i.WriteU8 ((GetLength () >> 3) - 1); + i.WriteU8 (0); i.WriteHtonU16 (m_offset); i.WriteHtonU32 (m_identification); } @@ -398,7 +399,8 @@ uint32_t Ipv6ExtensionFragmentHeader::Deserialize (Buffer::Iterator start) Buffer::Iterator i = start; SetNextHeader (i.ReadU8 ()); - SetLength ((i.ReadU8 () + 1) << 3); + i.ReadU8(); + SetLength (0); m_offset = i.ReadNtohU16 (); m_identification = i.ReadNtohU32 (); diff --git a/src/internet/model/ipv6-extension.cc b/src/internet/model/ipv6-extension.cc index 3f592d759..348156d8e 100755 --- a/src/internet/model/ipv6-extension.cc +++ b/src/internet/model/ipv6-extension.cc @@ -510,6 +510,7 @@ void Ipv6ExtensionFragment::GetFragments (Ptr packet, uint32_t maxFragme { moreFragment = true; currentFragmentablePartSize = maxFragmentablePartSize; + currentFragmentablePartSize -= currentFragmentablePartSize % 8; } else { @@ -517,10 +518,8 @@ void Ipv6ExtensionFragment::GetFragments (Ptr packet, uint32_t maxFragme currentFragmentablePartSize = p->GetSize () - offset; } - currentFragmentablePartSize -= currentFragmentablePartSize % 8; fragmentHeader.SetNextHeader (nextHeader); - fragmentHeader.SetLength (currentFragmentablePartSize); fragmentHeader.SetOffset (offset); fragmentHeader.SetMoreFragment (moreFragment); fragmentHeader.SetIdentification (identification); diff --git a/src/internet/test/ipv6-fragmentation-test.cc b/src/internet/test/ipv6-fragmentation-test.cc index 9c9a35a5b..b4900d11e 100644 --- a/src/internet/test/ipv6-fragmentation-test.cc +++ b/src/internet/test/ipv6-fragmentation-test.cc @@ -295,7 +295,7 @@ Ipv6FragmentationTest::DoRun (void) { clientDev = CreateObject (); clientDev->SetAddress (Mac48Address::ConvertFrom (Mac48Address::Allocate ())); - clientDev->SetMtu (1000); + clientDev->SetMtu (1500); clientDev->SetReceiveErrorModel (clientDevErrorModel); clientDevErrorModel->Disable (); clientNode->AddDevice (clientDev); @@ -315,7 +315,7 @@ Ipv6FragmentationTest::DoRun (void) // some small packets, some rather big ones - uint32_t packetSizes[5] = {1000, 2000, 5000, 10000, 65000}; + uint32_t packetSizes[5] = {2000, 2500, 5000, 10000, 65000}; // using the alphabet uint8_t fillData[78];