1#!/usr/local/bin/python3
2# send a ping6 packet with routing header type 0
3# the address list is empty
4# hide the routing header behind a fragment header to avoid header scan
5# we expect an echo reply, as there are no more hops
6
7print("send with fragment and routing header type 0 but empty address list")
8
9import os
10from addr import *
11from scapy.all import *
12
13pid=os.getpid()
14eid=pid & 0xffff
15fid=pid & 0xffffffff
16payload=b"ABCDEFGHIJKLMNOP"
17packet=IPv6(src=LOCAL_ADDR6, dst=REMOTE_ADDR6)/\
18    IPv6ExtHdrFragment(id=fid)/\
19    IPv6ExtHdrRouting(addresses=[])/\
20    ICMPv6EchoRequest(id=eid, data=payload)
21eth=Ether(src=LOCAL_MAC, dst=REMOTE_MAC)/packet
22
23if os.fork() == 0:
24	time.sleep(1)
25	sendp(eth, iface=LOCAL_IF)
26	os._exit(0)
27
28ans=sniff(iface=LOCAL_IF, timeout=3, filter=
29    "ip6 and dst "+LOCAL_ADDR6+" and icmp6")
30for a in ans:
31	if a and a.type == ETH_P_IPV6 and \
32	    ipv6nh[a.payload.nh] == 'ICMPv6' and \
33	    icmp6types[a.payload.payload.type] == 'Echo Reply':
34		reply=a.payload.payload
35		id=reply.id
36		print("id=%#x" % (id))
37		if id != eid:
38			print("WRONG ECHO REPLY ID")
39			exit(2)
40		data=reply.data
41		print("payload=%s" % (data))
42		if data != payload:
43			print("WRONG PAYLOAD")
44			exit(2)
45		exit(0)
46print("NO ICMP6 ECHO REPLY")
47exit(1)
48