xref: /openbsd-src/regress/sys/netinet/pmtu/tcp_connect.py (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
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