Path: blob/main/tests/sys/netpfil/pf/frag-adjhole.py
39507 views
#!/usr/bin/env python31#2# Copyright (c) 2025 Alexander Bluhm <[email protected]>34from fragcommon import *56# |--------|7# |--------|8# |-------|9# |----|1011def send(src, dst, send_if, recv_if):12pid = os.getpid()13eid = pid & 0xffff14payload = b"ABCDEFGHIJKLMNOP" * 215packet = sp.IP(src=src, dst=dst)/ \16sp.ICMP(type='echo-request', id=eid) / payload17frag = []18fid = pid & 0xffff19frag.append(sp.IP(src=src, dst=dst, proto=1, id=fid,20flags='MF') / bytes(packet)[20:36])21frag.append(sp.IP(src=src, dst=dst, proto=1, id=fid,22frag=2, flags='MF') / bytes(packet)[36:52])23frag.append(sp.IP(src=src, dst=dst, proto=1, id=fid,24frag=1, flags='MF') / bytes(packet)[28:44])25frag.append(sp.IP(src=src, dst=dst, proto=1, id=fid,26frag=4) / bytes(packet)[52:60])27eth=[]28for f in frag:29eth.append(sp.Ether()/f)30if os.fork() == 0:31time.sleep(1)32sp.sendp(eth, iface=send_if)33os._exit(0)3435ans = sp.sniff(iface=recv_if, timeout=3, filter=36"ip and src " + dst + " and dst " + src + " and icmp")37for a in ans:38if a and a.type == sp.ETH_P_IP and \39a.payload.proto == 1 and \40a.payload.frag == 0 and a.payload.flags == 0 and \41sp.icmptypes[a.payload.payload.type] == 'echo-reply':42id = a.payload.payload.id43print("id=%#x" % (id))44if id != eid:45print("WRONG ECHO REPLY ID")46exit(2)47data = a.payload.payload.payload.load48print("payload=%s" % (data))49if data == payload:50exit(0)51print("PAYLOAD!=%s" % (payload))52exit(1)53print("NO ECHO REPLY")54exit(2)5556if __name__ == '__main__':57main(send)585960