# from scapy inet.pyif struct.pack("H",1)==b"\x00\x01":# big endian
checksum_endian_transform =lambda chk: chk
else:
checksum_endian_transform =lambda chk:((chk >>8)&0xff)| chk <<8defchecksum(pkt):iflen(pkt)%2==1:
pkt +=b"\0"
s =sum(array.array("H", pkt))
s =(s >>16)+(s &0xffff)
s += s >>16
s =~s
return checksum_endian_transform(s)&0xffffdefin4_chksum(proto, u, p):"""
As Specified in RFC 2460 - 8.1 Upper-Layer Checksums
Performs IPv4 Upper Layer checksum computation. Provided parameters are:
- 'proto' : value of upper layer protocol
- 'u' : IP upper layer instance
- 'p' : the payload of the upper layer provided as a string
"""ifnotisinstance(u, IP):
warning("No IP underlayer to compute checksum. Leaving null.")return0if u.lenisnotNone:if u.ihl isNone:
olen =sum(len(x)for x in u.options)
ihl =5+ olen //4+(1if olen %4else0)else:
ihl = u.ihl
ln =max(u.len-4* ihl,0)else:
ln =len(p)
psdhdr = struct.pack("!4s4sHH",
inet_pton(socket.AF_INET, u.src),
inet_pton(socket.AF_INET, u.dst),
proto,
ln)return checksum(psdhdr + p)