1#!/usr/local/bin/python2.7 2 3import os 4from addr import * 5from scapy.all import * 6 7ip=IP(src=FAKE_NET_ADDR, dst=REMOTE_ADDR) 8port=os.getpid() & 0xffff 9 10print "Send SYN packet, receive SYN+ACK." 11syn=TCP(sport=port, dport='chargen', seq=1, flags='S', window=(2**16)-1) 12synack=sr1(ip/syn, iface=LOCAL_IF, timeout=5) 13 14print "Send ack packet, receive chargen data." 15ack=TCP(sport=synack.dport, dport=synack.sport, seq=2, flags='A', 16 ack=synack.seq+1, window=(2**16)-1) 17data=sr1(ip/ack, iface=LOCAL_IF, timeout=5) 18 19print "Fill our receive buffer." 20time.sleep(1) 21 22print "Send ICMP fragmentation needed packet with MTU 1300." 23icmp=ICMP(type="dest-unreach", code="fragmentation-needed", 24 nexthopmtu=1300)/data 25send(IP(src=LOCAL_ADDR, dst=REMOTE_ADDR)/icmp, iface=LOCAL_IF) 26 27print "Path MTU discovery will resend first data with length 1300." 28data=sr1(ip/ack, iface=LOCAL_IF, timeout=5) 29 30print "Cleanup the other's socket with a reset packet." 31rst=TCP(sport=synack.dport, dport=synack.sport, seq=2, flags='AR', 32 ack=synack.seq+1) 33send(ip/rst, iface=LOCAL_IF) 34 35len = data.len 36print "len=%d" % len 37if len != 1300: 38 print "ERROR: TCP data packet len is %d, expected 1300." % len 39 exit(1) 40exit(0) 41