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