1#!/usr/local/bin/python3
2# start of new fragment overlaps old one
3
4# |--------|
5#     |>>>>>----|
6
7# If the tail of an older fragment overlaps the beginning of the
8# current fragment, cut the newer fragment.
9#                 m_adj(frent->fe_m, precut);
10# Newer data wins.
11
12import os
13import threading
14from addr import *
15from scapy.all import *
16
17class Sniff1(threading.Thread):
18	filter = None
19	captured = None
20	packet = None
21	def run(self):
22		self.captured = sniff(iface=SRC_IF, filter=self.filter,
23		    count=1, timeout=3)
24		if self.captured:
25			self.packet = self.captured[0]
26
27dstaddr=sys.argv[1]
28pid=os.getpid()
29eid=pid & 0xffff
30payload=b"ABCDEFGHIJKLOMNO"
31dummy=b"01234567"
32packet=IP(src=SRC_OUT, dst=dstaddr)/ICMP(type='echo-request', id=eid)/payload
33frag0=bytes(packet)[20:36]
34frag1=dummy+bytes(packet)[36:44]
35fid=pid & 0xffff
36pkt0=IP(src=SRC_OUT, dst=dstaddr, proto=1, id=fid, frag=0, flags='MF')/frag0
37pkt1=IP(src=SRC_OUT, dst=dstaddr, proto=1, id=fid, frag=1)/frag1
38eth=[]
39eth.append(Ether(src=SRC_MAC, dst=PF_MAC)/pkt0)
40eth.append(Ether(src=SRC_MAC, dst=PF_MAC)/pkt1)
41
42sniffer = Sniff1();
43sniffer.filter = "ip and src %s and dst %s and icmp" % (dstaddr, SRC_OUT)
44sniffer.start()
45time.sleep(1)
46sendp(eth, iface=SRC_IF)
47sniffer.join(timeout=5)
48a = sniffer.packet
49
50if a and a.type == ETH_P_IP and \
51    a.payload.proto == 1 and \
52    a.payload.frag == 0 and a.payload.flags == 0 and \
53    icmptypes[a.payload.payload.type] == 'echo-reply':
54	id=a.payload.payload.id
55	print("id=%#x" % (id))
56	if id != eid:
57		print("WRONG ECHO REPLY ID")
58		exit(2)
59	load=a.payload.payload.payload.load
60	print("payload=%s" % (load))
61	if load == payload:
62		exit(0)
63	print("PAYLOAD!=%s" % (payload))
64	exit(1)
65print("NO ECHO REPLY")
66exit(2)
67