1#!/usr/local/bin/python2.7 2# end of new fragment overlaps old one 3 4# |XXXXX----| 5# |--------| 6 7# RFC 5722 drop overlapping fragments 8 9import os 10from addr import * 11from scapy.all import * 12 13dstaddr=sys.argv[1] 14pid=os.getpid() 15payload="ABCDEFGHIJKLOMNO" 16dummy="01234567" 17packet=IPv6(src=SRC_OUT6, dst=dstaddr)/ICMPv6EchoRequest(id=pid, data=payload) 18frag0=IPv6ExtHdrFragment(nh=58, id=pid, m=1)/str(packet)[40:56] 19frag1=IPv6ExtHdrFragment(nh=58, id=pid, offset=1)/(dummy+str(packet)[56:64]) 20pkt0=IPv6(src=SRC_OUT6, dst=dstaddr)/frag0 21pkt1=IPv6(src=SRC_OUT6, dst=dstaddr)/frag1 22eth=[] 23eth.append(Ether(src=SRC_MAC, dst=PF_MAC)/pkt1) 24eth.append(Ether(src=SRC_MAC, dst=PF_MAC)/pkt0) 25 26if os.fork() == 0: 27 time.sleep(1) 28 sendp(eth, iface=SRC_IF) 29 os._exit(0) 30 31ans=sniff(iface=SRC_IF, timeout=3, filter= 32 "ip6 and src "+dstaddr+" and dst "+SRC_OUT6+" and icmp6") 33if len(ans) == 0: 34 print "no reply" 35 exit(0) 36a=ans[0] 37if a and a.type == ETH_P_IPV6 and \ 38 ipv6nh[a.payload.nh] == 'ICMPv6' and \ 39 icmp6types[a.payload.payload.type] == 'Echo Reply': 40 id=a.payload.payload.id 41 print "id=%#x" % (id) 42 if id != pid: 43 print "WRONG ECHO REPLY ID" 44 exit(2) 45 data=a.payload.payload.data 46 print "payload=%s" % (data) 47 if data == payload: 48 print "ECHO REPLY" 49 exit(1) 50 print "PAYLOAD!=%s" % (payload) 51 exit(2) 52print "NO ECHO REPLY" 53exit(2) 54