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