1#!/usr/local/bin/python2.7 2# old fragment completely overlaps new one 3 4# |------------| 5# |XXXX| 6# |----| 7 8# RFC 5722 drop overlapping fragments 9 10import os 11import threading 12from addr import * 13from scapy.all import * 14 15class Sniff1(threading.Thread): 16 filter = None 17 captured = None 18 packet = None 19 def run(self): 20 self.captured = sniff(iface=SRC_IF, filter=self.filter, 21 count=1, timeout=3) 22 if self.captured: 23 self.packet = self.captured[0] 24 25dstaddr=sys.argv[1] 26pid=os.getpid() & 0xffff 27payload="ABCDEFGHIJKLOMNOQRSTUVWX" 28dummy="01234567" 29packet=IPv6(src=SRC_OUT6, dst=dstaddr)/ICMPv6EchoRequest(id=pid, data=payload) 30frag0=IPv6ExtHdrFragment(nh=58, id=pid, offset=0, m=1)/str(packet)[40:48] 31frag1=IPv6ExtHdrFragment(nh=58, id=pid, offset=2, m=1)/dummy 32frag2=IPv6ExtHdrFragment(nh=58, id=pid, offset=1)/str(packet)[48:72] 33pkt0=IPv6(src=SRC_OUT6, dst=dstaddr)/frag0 34pkt1=IPv6(src=SRC_OUT6, dst=dstaddr)/frag1 35pkt2=IPv6(src=SRC_OUT6, dst=dstaddr)/frag2 36eth=[] 37eth.append(Ether(src=SRC_MAC, dst=PF_MAC)/pkt2) 38eth.append(Ether(src=SRC_MAC, dst=PF_MAC)/pkt1) 39eth.append(Ether(src=SRC_MAC, dst=PF_MAC)/pkt0) 40 41sniffer = Sniff1(); 42sniffer.filter = "ip6 and src %s and dst %s and icmp6" % (dstaddr, SRC_OUT6) 43sniffer.start() 44time.sleep(1) 45sendp(eth, iface=SRC_IF) 46sniffer.join(timeout=5) 47a = sniffer.packet 48 49if a is None: 50 print "no reply" 51 exit(0) 52if a and a.type == ETH_P_IPV6 and \ 53 ipv6nh[a.payload.nh] == 'ICMPv6' and \ 54 icmp6types[a.payload.payload.type] == 'Echo Reply': 55 id=a.payload.payload.id 56 print "id=%#x" % (id) 57 if id != pid: 58 print "WRONG ECHO REPLY ID" 59 exit(2) 60 data=a.payload.payload.data 61 print "payload=%s" % (data) 62 if data == payload: 63 print "ECHO REPLY" 64 exit(1) 65 print "PAYLOAD!=%s" % (payload) 66 exit(2) 67print "NO ECHO REPLY" 68exit(2) 69