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