diff --git a/scapy/layers/inet6.py b/scapy/layers/inet6.py index bd2122ef6f57a980143e99d939b7166cc7c82c4c..b7dcb416157fb3d9f781c1609b14ff4cb7fc0df6 100644 --- a/scapy/layers/inet6.py +++ b/scapy/layers/inet6.py @@ -958,10 +958,6 @@ def fragment6(pkt, fragSize): """ pkt = pkt.copy() - s = str(pkt) # for instantiation to get upper layer checksum right - - if len(s) <= fragSize: - return [pkt] if not IPv6ExtHdrFragment in pkt: # TODO : automatically add a fragment before upper Layer @@ -969,6 +965,15 @@ def fragment6(pkt, fragSize): # as single element of a list return [pkt] + # If the payload is bigger than 65535, IPv6().post_build() will throw an exception + if len(str(pkt[IPv6ExtHdrFragment])) > 65535: + pkt[IPv6].plen = 65535 + + s = str(pkt) # for instantiation to get upper layer checksum right + + if len(s) <= fragSize: + return [pkt] + # Fragmentable part : fake IPv6 for Fragmentable part length computation fragPart = pkt[IPv6ExtHdrFragment].payload tmp = str(IPv6(src="::1", dst="::1")/fragPart)