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