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