tcp_connect6.py revision 1.3
1#!/usr/local/bin/python2.7
2
3import os
4from addr import *
5from scapy.all import *
6
7e=Ether(src=LOCAL_MAC, dst=REMOTE_MAC)
8ip6=IPv6(src=FAKE_NET_ADDR6, dst=REMOTE_ADDR6)
9port=os.getpid() & 0xffff
10
11print "Send SYN packet, receive SYN+ACK."
12syn=TCP(sport=port, dport='chargen', seq=1, flags='S', window=(2**16)-1)
13synack=srp1(e/ip6/syn, iface=LOCAL_IF, timeout=5)
14
15if synack is None:
16	print "ERROR: no SYN+ACK from chargen server received"
17	exit(1)
18
19print "Send ACK packet, receive chargen data."
20ack=TCP(sport=synack.dport, dport=synack.sport, seq=2, flags='A',
21    ack=synack.seq+1, window=(2**16)-1)
22data=srp1(e/ip6/ack, iface=LOCAL_IF, timeout=5)
23
24if data is None:
25	print "ERROR: no data from chargen server received"
26	exit(1)
27
28print "Fill our receive buffer."
29time.sleep(1)
30
31print "Send ICMP6 packet too big packet with MTU 1300."
32icmp6=ICMPv6PacketTooBig(mtu=1300)/data.payload
33sendp(e/IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/icmp6, iface=LOCAL_IF)
34
35print "Path MTU discovery will resend first data with length 1300."
36data=srp1(e/ip6/ack, iface=LOCAL_IF, timeout=5)
37
38if data is None:
39	print "ERROR: no data retransmit from chargen server received"
40	exit(1)
41
42print "Cleanup the other's socket with a reset packet."
43rst=TCP(sport=synack.dport, dport=synack.sport, seq=2, flags='AR',
44    ack=synack.seq+1)
45sendp(e/ip6/rst, iface=LOCAL_IF)
46
47len = data.plen + len(IPv6())
48print "len=%d" % len
49if len != 1300:
50	print "ERROR: TCP data packet len is %d, expected 1300." % len
51	exit(1)
52exit(0)
53