tcp_connect6.py revision 1.6
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) 9tport=os.getpid() & 0xffff 10 11print "Send SYN packet, receive SYN+ACK." 12syn=TCP(sport=tport, 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 33# srp1 cannot be used, TCP data will not match outgoing ICMP6 packet 34if os.fork() == 0: 35 time.sleep(1) 36 sendp(e/IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/icmp6, iface=LOCAL_IF) 37 os._exit(0) 38 39print "Path MTU discovery will resend first data with length 1300." 40ans=sniff(iface=LOCAL_IF, timeout=3, count=1, filter= 41 "ip6 and src %s and tcp port %u and dst %s and tcp port %u" % 42 (ip6.dst, syn.dport, ip6.src, syn.sport)) 43 44if len(ans) == 0: 45 print "ERROR: no data retransmit from chargen server received" 46 exit(1) 47data=ans[0] 48 49print "Cleanup the other's socket with a reset packet." 50rst=TCP(sport=synack.dport, dport=synack.sport, seq=2, flags='AR', 51 ack=synack.seq+1) 52sendp(e/ip6/rst, iface=LOCAL_IF) 53 54len = data.plen + len(IPv6()) 55print "len=%d" % len 56if len != 1300: 57 print "ERROR: TCP data packet len is %d, expected 1300." % len 58 exit(1) 59 60exit(0) 61