1#!/usr/local/bin/python2.7
2
3print "udp fragments with splitted payload"
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=LOCAL_ADDR6, dst=REMOTE_ADDR6)/ \
19    UDP(sport=uport, dport=7)/payload
20frag=[]
21fid=pid & 0xffffffff
22frag.append(IPv6ExtHdrFragment(nh=17, id=fid, m=1)/str(packet)[40:56])
23frag.append(IPv6ExtHdrFragment(nh=17, id=fid, offset=2)/str(packet)[56:64])
24eth=[]
25for f in frag:
26	pkt=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/f
27	eth.append(Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/pkt)
28
29if os.fork() == 0:
30	time.sleep(1)
31	sendp(eth, iface=LOCAL_IF)
32	os._exit(0)
33
34ans=sniff(iface=LOCAL_IF, timeout=3, filter=
35    "ip6 and src "+REMOTE_ADDR6+" and dst "+LOCAL_ADDR6+" and udp")
36for a in ans:
37	if a and a.type == ETH_P_IPV6 and \
38	    ipv6nh[a.payload.nh] == 'UDP' and \
39	    a.payload.payload.sport == 7:
40		port=a.payload.payload.dport
41		print "port=%d" % (port)
42		if port != uport:
43			print "WRONG UDP ECHO REPLY PORT"
44			exit(2)
45		data=a.payload.payload.load
46		print "payload=%s" % (data)
47		if data == payload:
48			exit(0)
49		print "PAYLOAD!=%s" % (payload)
50		exit(1)
51print "NO UDP ECHO REPLY"
52exit(2)
53