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