diff --git a/src/main/java/net/floodlightcontroller/packet/IPv4.java b/src/main/java/net/floodlightcontroller/packet/IPv4.java index afc31425dc5106b9587d03088bfe0135e0b2331d..870d17ae10641d6d645ba0fab2e08404b18818e5 100644 --- a/src/main/java/net/floodlightcontroller/packet/IPv4.java +++ b/src/main/java/net/floodlightcontroller/packet/IPv4.java @@ -378,8 +378,9 @@ public class IPv4 extends BasePacket { } IPacket payload; - isFragment = ((this.flags & IPV4_FLAGS_MOREFRAG) != 0) || - (this.fragmentOffset != 0); + isFragment = ((this.flags & IPV4_FLAGS_DONTFRAG) == 0) && + ((this.flags & IPV4_FLAGS_MOREFRAG) != 0 || + this.fragmentOffset != 0); if (!isFragment && IPv4.protocolClassMap.containsKey(this.protocol)) { Class<? extends IPacket> clazz = IPv4.protocolClassMap.get(this.protocol); try { diff --git a/src/test/java/net/floodlightcontroller/packet/IPv4Test.java b/src/test/java/net/floodlightcontroller/packet/IPv4Test.java index c62b77602b2124eb9305162ba9e0e7ccd48df6cf..c9a86b03c73e3d7a7ba374c18f5f10c475dfbe06 100644 --- a/src/test/java/net/floodlightcontroller/packet/IPv4Test.java +++ b/src/test/java/net/floodlightcontroller/packet/IPv4Test.java @@ -143,4 +143,22 @@ public class IPv4Test { assertTrue(packet2.isFragment()); assertTrue(Arrays.equals(pktSerializedLastFrag, pktSerialized2)); } + + @Test + public void testDeserializeDontFragment() { + // IP packet with more frag bit set + byte[] pktSerializedDontFrag = new byte[] { 0x45, 0x00, + 0x00, 0x2e, 0x41, (byte) 0xbe, 0x60, 0x00, 0x40, 0x06, + (byte) 0xd4, (byte) 0xf0, (byte) 0xc0, (byte) 0xa8, 0x02, (byte) 0xdb, (byte) 0xd0, 0x55, + (byte) 0x90, 0x42, (byte) 0xd5, 0x48, 0x01, (byte) 0xbb, (byte) 0xe3, 0x50, + (byte) 0xb2, 0x2f, (byte) 0xfc, (byte) 0xf8, (byte) 0xa8, 0x2c, 0x50, 0x18, + (byte) 0xff, (byte) 0xff, 0x24, 0x3c, 0x00, 0x00, 0x14, 0x03, + 0x01, 0x00, 0x01, 0x01, + }; + IPv4 packet1 = new IPv4(); + packet1.deserialize(pktSerializedDontFrag, 0, pktSerializedDontFrag.length); + byte[] pktSerialized1 = packet1.serialize(); + assertTrue(!packet1.isFragment()); + assertTrue(Arrays.equals(pktSerializedDontFrag, pktSerialized1)); + } }