xref: /openbsd-src/regress/sys/netinet6/frag6/frag6_udpheader.py (revision 704ff92d962698f5ebdfd62a29b08dbd83c39f22)
1#!/usr/local/bin/python2.7
2
3print "udp fragments splitted after udp header"
4
5# |----|
6#      |--------|
7
8import os
9from addr import *
10from scapy.all import *
11
12pid=os.getpid()
13uport=pid & 0xffff
14# inetd ignores UDP packets from privileged port or nfs
15if uport < 1024 or uport == 2049:
16	uport+=1024
17payload="ABCDEFGHIJKLMNOP"
18packet=IPv6(src=SRC_OUT6, dst=DST_IN6)/UDP(sport=uport, dport=7)/payload
19frag=[]
20fid=pid & 0xffffffff
21frag.append(IPv6ExtHdrFragment(nh=17, id=fid, m=1)/str(packet)[40:48])
22frag.append(IPv6ExtHdrFragment(nh=17, id=fid, offset=1)/str(packet)[48:64])
23eth=[]
24for f in frag:
25	pkt=IPv6(src=SRC_OUT6, dst=DST_IN6)/f
26	eth.append(Ether(src=SRC_MAC, dst=DST_MAC)/pkt)
27
28if os.fork() == 0:
29	time.sleep(1)
30	sendp(eth, iface=SRC_IF)
31	os._exit(0)
32
33ans=sniff(iface=SRC_IF, timeout=3, filter=
34    "ip6 and src "+DST_IN6+" and dst "+SRC_OUT6+" and udp")
35for a in ans:
36	if a and a.type == ETH_P_IPV6 and \
37	    ipv6nh[a.payload.nh] == 'UDP' and \
38	    a.payload.payload.sport == 7:
39		port=a.payload.payload.dport
40		print "port=%d" % (port)
41		if port != uport:
42			print "WRONG UDP ECHO REPLY PORT"
43			exit(2)
44		data=a.payload.payload.load
45		print "payload=%s" % (data)
46		if data == payload:
47			exit(0)
48		print "PAYLOAD!=%s" % (payload)
49		exit(1)
50print "NO UDP ECHO REPLY"
51exit(2)
52