Bug 1814 - IPv6 Packets with length not multiple of 8 bytes are fragmented incorrectly.

This commit is contained in:
Tommaso Pecorella
2013-12-12 23:16:28 +01:00
parent e7cfaab44d
commit ad1ef6acc0
4 changed files with 8 additions and 6 deletions

View File

@@ -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
==============

View File

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

View File

@@ -510,6 +510,7 @@ void Ipv6ExtensionFragment::GetFragments (Ptr<Packet> packet, uint32_t maxFragme
{
moreFragment = true;
currentFragmentablePartSize = maxFragmentablePartSize;
currentFragmentablePartSize -= currentFragmentablePartSize % 8;
}
else
{
@@ -517,10 +518,8 @@ void Ipv6ExtensionFragment::GetFragments (Ptr<Packet> 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);

View File

@@ -295,7 +295,7 @@ Ipv6FragmentationTest::DoRun (void)
{
clientDev = CreateObject<SimpleNetDevice> ();
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];