src/internet/model/ipv4-l3-protocol.cc
changeset 7625 17e4957e0cce
parent 7562 be2b2c3c480c
child 7717 cfa1741013dd
--- a/src/internet/model/ipv4-l3-protocol.cc	Thu Dec 08 00:33:13 2011 -0800
+++ b/src/internet/model/ipv4-l3-protocol.cc	Sat Dec 10 23:52:40 2011 +0100
@@ -1135,8 +1135,16 @@
 
   uint16_t offset = 0;
   bool moreFragment = true;
+  uint16_t originalOffset = 0;
+  bool alreadyFragmented = false;
   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
@@ -1158,14 +1166,21 @@
         {
           moreFragment = false;
           currentFragmentablePartSize = p->GetSize () - offset;
-          fragmentHeader.SetLastFragment ();
+          if (alreadyFragmented)
+            {
+              fragmentHeader.SetMoreFragments ();
+            }
+          else
+            {
+              fragmentHeader.SetLastFragment ();
+            }
         }
 
       NS_LOG_LOGIC ("Fragment creation - " << offset << ", " << currentFragmentablePartSize  );
       Ptr<Packet> fragment = p->CreateFragment (offset, currentFragmentablePartSize);
       NS_LOG_LOGIC ("Fragment created - " << offset << ", " << fragment->GetSize ()  );
 
-      fragmentHeader.SetFragmentOffset (offset);
+      fragmentHeader.SetFragmentOffset (offset+originalOffset);
       fragmentHeader.SetPayloadSize (currentFragmentablePartSize);
 
       if (Node::ChecksumEnabled ())