1#!/usr/local/bin/python2.7 2# send 6 non-overlapping ping6 fragments in 75 seconds, timeout is 60 3 4# |----| 5# |----| 6# |----| 7# |----| 8# |----| <--- timeout 9# |----| 10 11import os 12from addr import * 13from scapy.all import * 14 15pid=os.getpid() 16payload="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcd" 17packet=IPv6(src=SRC_OUT6, dst=DST_IN6)/ICMPv6EchoRequest(id=pid, data=payload) 18frag=[] 19frag.append(IPv6ExtHdrFragment(nh=58, id=pid, m=1)/str(packet)[40:48]) 20frag.append(IPv6ExtHdrFragment(nh=58, id=pid, offset=1, m=1)/str(packet)[48:56]) 21frag.append(IPv6ExtHdrFragment(nh=58, id=pid, offset=2, m=1)/str(packet)[56:64]) 22frag.append(IPv6ExtHdrFragment(nh=58, id=pid, offset=3, m=1)/str(packet)[64:72]) 23frag.append(IPv6ExtHdrFragment(nh=58, id=pid, offset=4, m=1)/str(packet)[72:80]) 24frag.append(IPv6ExtHdrFragment(nh=58, id=pid, offset=5)/str(packet)[80:88]) 25eth=[] 26for f in frag: 27 pkt=IPv6(src=SRC_OUT6, dst=DST_IN6)/f 28 eth.append(Ether(src=SRC_MAC, dst=DST_MAC)/pkt) 29 30if os.fork() == 0: 31 time.sleep(1) 32 for e in eth: 33 sendp(e, iface=SRC_IF) 34 time.sleep(15) 35 os._exit(0) 36 37ans=sniff(iface=SRC_IF, timeout=90, filter= 38 "ip6 and src "+DST_IN6+" and dst "+SRC_OUT6+" and icmp6") 39for a in ans: 40 if a and a.type == ETH_P_IPV6 and \ 41 ipv6nh[a.payload.nh] == 'ICMPv6' and \ 42 icmp6types[a.payload.payload.type] == 'Echo Reply': 43 id=a.payload.payload.id 44 print "id=%#x" % (id) 45 if id != pid: 46 print "WRONG ECHO REPLY ID" 47 exit(2) 48 data=a.payload.payload.data 49 print "payload=%s" % (data) 50 if data == payload: 51 print "ECHO REPLY" 52 exit(1) 53 print "PAYLOAD!=%s" % (payload) 54 exit(2) 55print "no echo reply" 56exit(0) 57