xref: /openbsd/regress/sys/net/pf_fragment/frag.py (revision a6445c1d)
1#!/usr/local/bin/python2.7
2# send 2 non-overlapping ping fragments
3
4import os
5from addr import *
6from scapy.all import *
7
8dstaddr=sys.argv[1]
9pid=os.getpid()
10payload="ABCDEFGHIJKLOMNO"
11packet=IP(src=SRC_OUT, dst=dstaddr)/ICMP(id=pid)/payload
12frag0=str(packet)[20:36]
13frag1=str(packet)[36:44]
14pkt0=IP(src=SRC_OUT, dst=dstaddr, proto=1, id=pid, frag=0, flags='MF')/frag0
15pkt1=IP(src=SRC_OUT, dst=dstaddr, proto=1, id=pid, frag=2)/frag1
16eth=[]
17eth.append(Ether(src=SRC_MAC, dst=PF_MAC)/pkt0)
18eth.append(Ether(src=SRC_MAC, dst=PF_MAC)/pkt1)
19
20if os.fork() == 0:
21	time.sleep(1)
22	sendp(eth, iface=SRC_IF)
23	os._exit(0)
24
25ans=sniff(iface=SRC_IF, timeout=3, filter=
26    "ip and src "+dstaddr+" and dst "+SRC_OUT+" and icmp")
27a=ans[0]
28if a and a.type == scapy.layers.dot11.ETHER_TYPES.IPv4 and \
29    a.payload.proto == 1 and \
30    a.payload.frag == 0 and a.payload.flags == 0 and \
31    icmptypes[a.payload.payload.type] == 'echo-reply':
32	id=a.payload.payload.id
33	print "id=%#x" % (id)
34	if id != pid:
35		print "WRONG ECHO REPLY ID"
36		exit(2)
37	load=a.payload.payload.payload.load
38	print "payload=%s" % (load)
39	if load == payload:
40		exit(0)
41	print "PAYLOAD!=%s" % (payload)
42	exit(1)
43print "NO ECHO REPLY"
44exit(2)
45