1#!/usr/local/bin/python2.7
2# check icmp6 checksum in returned icmp packet
3
4import os
5from addr import *
6from scapy.all import *
7
8dstaddr=sys.argv[1]
9pid=os.getpid()
10payload="a" * 1452
11p=(Ether(src=SRC_MAC, dst=PF_MAC)/IPv6(src=SRC_OUT6, dst=dstaddr)/
12    ICMPv6EchoRequest(id=pid, data=payload))
13echocksum=IPv6(str(p.payload)).payload.cksum
14print "echocksum=%#04x" % (echocksum)
15a=srp1(p, iface=SRC_IF, timeout=2)
16if a and a.type == scapy.layers.dot11.ETHER_TYPES.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] == 'ICMPv6' and \
23	    icmp6types[q.payload.type] == 'Echo Request':
24		innercksum=q.payload.cksum
25		print "innercksum=%#04x" % (innercksum)
26		if innercksum == echocksum:
27			exit(0)
28		print "INNERCKSUM!=ECHOCKSUM"
29		exit(1)
30	print "NO INNER ECHO REQUEST"
31	exit(2)
32print "NO PACKET TOO BIG"
33exit(2)
34