1#!/usr/local/bin/python3
2# check icmp6 checksum in returned icmp packet
3
4import os
5from addr import *
6from scapy.all import *
7
8dstaddr=sys.argv[1]
9eid=os.getpid() & 0xffff
10payload=b"a" * 1452
11p=(Ether(src=SRC_MAC, dst=PF_MAC)/IPv6(src=SRC_OUT6, dst=dstaddr)/
12    ICMPv6EchoRequest(id=eid, data=payload))
13echocksum=IPv6(bytes(p.payload)).payload.cksum
14print("echocksum=%#04x" % (echocksum))
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] == '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