xref: /openbsd/regress/sys/net/pf_forward/ping_mtu.py (revision 097a140d)
1#!/usr/local/bin/python3
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])
14eid=os.getpid() & 0xffff
15hdr=IP(flags="DF", src=srcaddr, dst=dstaddr)/ICMP(type='echo-request', id=eid)
16payload="a" * (size - len(bytes(hdr)))
17ip=hdr/payload
18iplen=IP(bytes(ip)).len
19eth=Ether(src=SRC_MAC, dst=PF_MAC)/ip
20a=srp1(eth, iface=SRC_IF, timeout=2)
21
22if a is None:
23	print("no packet sniffed")
24	exit(2)
25if a and a.payload.payload.type==3 and a.payload.payload.code==4:
26	mtu=a.payload.payload.nexthopmtu
27	print("mtu=%d" % (mtu))
28	if mtu != expect:
29		print("MTU!=%d" % (expect))
30		exit(1)
31	iip=a.payload.payload.payload
32	iiplen=iip.len
33	if iiplen != iplen:
34		print("inner IP len %d!=%d" % (iiplen, iplen))
35		exit(1)
36	isrc=iip.src
37	if isrc != srcaddr:
38		print("inner IP src %d!=%d" % (isrc, srcaddr))
39		exit(1)
40	idst=iip.dst
41	if idst != dstaddr:
42		print("inner IP dst %d!=%d" % (idst, dstaddr))
43		exit(1)
44	exit(0)
45print("MTU=UNKNOWN")
46exit(2)
47