xref: /openbsd-src/regress/sys/net/pf_forward/ping_mtu.py (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
1#!/usr/local/bin/python2.7
2# check wether path mtu to dst is as expected
3
4import os
5from addr import *
6from scapy.all import *
7
8# usage: ping_mtu src dst size icmp-size
9
10srcaddr=sys.argv[1]
11dstaddr=sys.argv[2]
12size=int(sys.argv[3])
13expect=int(sys.argv[4])
14pid=os.getpid() & 0xffff
15hdr=IP(flags="DF", src=srcaddr, dst=dstaddr)/ICMP(id=pid)
16payload="a" * (size - len(str(hdr)))
17ip=hdr/payload
18iplen=IP(str(ip)).len
19eth=Ether(src=SRC_MAC, dst=PF_MAC)/ip
20a=srp1(eth, iface=SRC_IF, timeout=2)
21
22if a and a.payload.payload.type==3 and a.payload.payload.code==4:
23	mtu=a.payload.payload.nexthopmtu
24	print "mtu=%d" % (mtu)
25	if mtu != expect:
26		print "MTU!=%d" % (expect)
27		exit(1)
28	iip=a.payload.payload.payload
29	iiplen=iip.len
30	if iiplen != iplen:
31		print "inner IP len %d!=%d" % (iiplen, iplen)
32		exit(1)
33	isrc=iip.src
34	if isrc != srcaddr:
35		print "inner IP src %d!=%d" % (isrc, srcaddr)
36		exit(1)
37	idst=iip.dst
38	if idst != dstaddr:
39		print "inner IP dst %d!=%d" % (idst, dstaddr)
40		exit(1)
41	exit(0)
42print "MTU=UNKNOWN"
43exit(2)
44