diff --git a/scapy/layers/inet.py b/scapy/layers/inet.py index 1ed71e97f35b95031e26c06fbfe5a57b4f59aee0..760e0675de19a1d79ee84f13ef19c45effc0362c 100644 --- a/scapy/layers/inet.py +++ b/scapy/layers/inet.py @@ -462,13 +462,11 @@ class IP(Packet, IPTools): del(q[fnb].payload) del(q[fnb].chksum) del(q[fnb].len) - if i == nb-1: - q[IP].flags &= ~1 - else: - q[IP].flags |= 1 - q[IP].frag = i*fragsize/8 + if i != nb - 1: + q[fnb].flags |= 1 + q[fnb].frag += i * fragsize / 8 r = conf.raw_layer(load=s[i*fragsize:(i+1)*fragsize]) - r.overload_fields = p[IP].payload.overload_fields.copy() + r.overload_fields = p[fnb].payload.overload_fields.copy() q.add_payload(r) lst.append(q) return lst @@ -816,11 +814,9 @@ def fragment(pkt, fragsize=1480): del(q[IP].payload) del(q[IP].chksum) del(q[IP].len) - if i == nb-1: - q[IP].flags &= ~1 - else: - q[IP].flags |= 1 - q[IP].frag = i*fragsize/8 + if i != nb - 1: + q[IP].flags |= 1 + q[IP].frag += i * fragsize / 8 r = conf.raw_layer(load=s[i*fragsize:(i+1)*fragsize]) r.overload_fields = p[IP].payload.overload_fields.copy() q.add_payload(r) diff --git a/test/regression.uts b/test/regression.uts index f4f410ffe704e8eb6561afa59c1069965ff49d4d..7c379a502190553ff289704d22c571bf7abcc28b 100644 --- a/test/regression.uts +++ b/test/regression.uts @@ -4787,6 +4787,22 @@ pkt2 = fragment(pkt1)[0] pkt3 = pkt2.__class__(str(pkt2)) assert pkt1[IP].proto == pkt2[IP].proto == pkt3[IP].proto += fragment() already fragmented packets +payloadlen = 1480 * 3 +ffrags = fragment(IP() / ("X" * payloadlen), 1480) +ffrags = fragment(ffrags, 1400) +len(ffrags) == 6 +* each fragment except the last one should have MF set +assert all(p.flags == 1 for p in ffrags[:-1]) +assert ffrags[-1].flags == 0 +* fragment offset should be well computed +plen = 0 +for p in ffrags: + assert p.frag == plen / 8 + plen += len(p.payload) + +assert plen == payloadlen + = defragment() defrags = defragment(frags) * we should have one single packet