From 70d2462a17e51f3e66307b45fa8bd972954c8fb4 Mon Sep 17 00:00:00 2001 From: Tommaso Pecorella Date: Sat, 20 May 2017 19:47:42 +0200 Subject: [PATCH] internet: (fixes #2741) IPv4 fragmentation fails when re-fragmenting a previous last fragment. --- RELEASE_NOTES | 1 + src/internet/model/ipv4-l3-protocol.cc | 12 +++--------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/RELEASE_NOTES b/RELEASE_NOTES index eb4052b54..fe9c72682 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -103,6 +103,7 @@ Bugs fixed - Bug 2671 - ArpCache::Entry::SetMacAddress is misspelled - Bug 2717 - Fix mask generation for Ipv4RoutingTableEntry::CreateDefaultRoute - Bug 2722 - 802.11g sends DSSS spectrum signals using CreateOfdmTxPowerSpectralDensity +- Bug 2741 - IPv4 fragmentation fails when last fragment have to be re-fragmented. Known issues ------------ diff --git a/src/internet/model/ipv4-l3-protocol.cc b/src/internet/model/ipv4-l3-protocol.cc index 43a198a5c..88a4223c8 100644 --- a/src/internet/model/ipv4-l3-protocol.cc +++ b/src/internet/model/ipv4-l3-protocol.cc @@ -1422,16 +1422,10 @@ Ipv4L3Protocol::DoFragmentation (Ptr packet, const Ipv4Header & ipv4Head uint16_t offset = 0; bool moreFragment = true; - uint16_t originalOffset = 0; - bool alreadyFragmented = false; + uint16_t originalOffset = ipv4Header.GetFragmentOffset(); + bool isLastFragment = ipv4Header.IsLastFragment(); uint32_t currentFragmentablePartSize = 0; - if (!ipv4Header.IsLastFragment()) - { - alreadyFragmented = true; - originalOffset = ipv4Header.GetFragmentOffset(); - } - // IPv4 fragments are all 8 bytes aligned but the last. // The IP payload size is: // floor( ( outIfaceMtu - ipv4Header.GetSerializedSize() ) /8 ) *8 @@ -1453,7 +1447,7 @@ Ipv4L3Protocol::DoFragmentation (Ptr packet, const Ipv4Header & ipv4Head { moreFragment = false; currentFragmentablePartSize = p->GetSize () - offset; - if (alreadyFragmented) + if (!isLastFragment) { fragmentHeader.SetMoreFragments (); }