1#!/usr/local/bin/python2.7 2# check udp6 checksum in returned icmp packet 3 4import os 5from addr import * 6from scapy.all import * 7 8dstaddr=sys.argv[1] 9pid=os.getpid() & 0xffff 10payload="a" * 1452 11p=(Ether(src=SRC_MAC, dst=PF_MAC)/IPv6(src=SRC_OUT6, dst=dstaddr)/ 12 UDP(sport=pid,dport=9)/payload) 13udpcksum=IPv6(str(p.payload)).payload.chksum 14print "udpcksum=%#04x" % (udpcksum) 15a=srp1(p, iface=SRC_IF, timeout=2) 16if a and a.type == ETH_P_IPV6 and \ 17 ipv6nh[a.payload.nh] == 'ICMPv6' and \ 18 icmp6types[a.payload.payload.type] == 'Packet too big': 19 outercksum=a.payload.payload.cksum 20 print "outercksum=%#04x" % (outercksum) 21 q=a.payload.payload.payload 22 if ipv6nh[q.nh] == 'UDP': 23 innercksum=q.payload.chksum 24 print "innercksum=%#04x" % (innercksum) 25 if innercksum == udpcksum: 26 exit(0) 27 print "INNERCKSUM!=UDPCKSUM" 28 exit(1) 29 print "NO INNER UDP PACKET" 30 exit(2) 31print "NO PACKET TOO BIG" 32exit(2) 33