xref: /openbsd/regress/sys/netinet6/frag6/Makefile (revision fc61954a)
1#	$OpenBSD: Makefile,v 1.13 2016/10/19 14:31:19 tb Exp $
2
3# The following ports must be installed:
4#
5# python-2.7          interpreted object-oriented programming language
6# py-libdnet          python interface to libdnet
7# scapy               powerful interactive packet manipulation in python
8
9.if ! (make(clean) || make(cleandir) || make(obj))
10# Check wether all required python packages are installed.  If some
11# are missing print a warning and skip the tests, but do not fail.
12PYTHON_IMPORT != python2.7 -c 'from scapy.all import *' 2>&1 || true
13.endif
14.if ! empty(PYTHON_IMPORT)
15regress:
16	@echo '${PYTHON_IMPORT}'
17	@echo install python and the scapy module for additional tests
18	@echo SKIPPED
19.endif
20
21# This test needs a manual setup of two machines
22# Set up machines: SRC DST
23# SRC is the machine where this makefile is running.
24# DST is running OpenBSD with pf disabled to test the IPv6 stack.
25# Enable echo udp6 in inetd.conf of DST to test UDP fragments.
26#
27# +---+   1   +---+
28# |SRC| ----> |DST|
29# +---+       +---+
30#     out    in
31
32# Configure Addresses on the machines.
33# Adapt interface and addresse variables to your local setup.
34#
35SRC_IF ?=
36SRC_MAC ?=
37DST_MAC ?=
38
39SRC_OUT6 ?=
40DST_IN6 ?=
41
42.if empty (SRC_IF) || empty (SRC_MAC) || empty (DST_MAC) || \
43    empty (SRC_OUT6) || empty (DST_IN6)
44regress:
45	@echo this tests needs a remote machine to operate on
46	@echo SRC_IF SRC_MAC DST_MAC SRC_OUT6 DST_IN6 are empty
47	@echo fill out these variables for additional tests
48	@echo SKIPPED
49.endif
50
51depend: addr.py
52
53# Create python include file containing the addresses.
54addr.py: Makefile
55	rm -f $@ $@.tmp
56	echo 'SRC_IF = "${SRC_IF}"' >>$@.tmp
57	echo 'SRC_MAC = "${SRC_MAC}"' >>$@.tmp
58	echo 'DST_MAC = "${DST_MAC}"' >>$@.tmp
59.for var in SRC_OUT DST_IN
60	echo '${var}6 = "${${var}6}"' >>$@.tmp
61.endfor
62	mv $@.tmp $@
63
64# Set variables so that make runs with and without obj directory.
65# Only do that if necessary to keep visible output short.
66.if ${.CURDIR} == ${.OBJDIR}
67PYTHON =	python2.7 ./
68.else
69PYTHON =	PYTHONPATH=${.OBJDIR} python2.7 ${.CURDIR}/
70.endif
71
72# Ping all addresses.  This ensures that the ip addresses are configured
73# and all routing table are set up to allow bidirectional packet flow.
74TARGETS +=	ping6
75run-regress-ping6:
76	@echo '\n======== $@ ========'
77.for ip in SRC_OUT DST_IN
78	@echo Check ping6 ${ip}6:
79	ping6 -n -c 1 ${${ip}6}
80.endfor
81
82# Ping all addresses again but with 5000 bytes payload.  These large
83# packets get fragmented by SRC and must be handled by DST.
84TARGETS +=	fragping6
85run-regress-fragping6:
86	@echo '\n======== $@ ========'
87.for ip in SRC_OUT DST_IN
88	@echo Check ping6 ${ip}6:
89	ping6 -n -c 1 -s 5000 -m ${${ip}6}
90.endfor
91
92# Send hand-crafted fragmented packet
93TARGETS +=	frag6
94run-regress-frag6: addr.py
95	@echo '\n======== $@ ========'
96	@echo Check ping6 reassembly
97	${SUDO} ${PYTHON}frag6.py
98
99# An hop by hop options extension header before the fragment header
100TARGETS +=	frag6-ext
101run-regress-frag6-ext: addr.py
102	@echo '\n======== $@ ========'
103	@echo Check ping6 extension header reassembly
104	${SUDO} ${PYTHON}frag6_ext.py
105
106# An destination options extension header after the fragment header
107TARGETS +=	frag6-opt
108run-regress-frag6-opt: addr.py
109	@echo '\n======== $@ ========'
110	@echo Check ping6 destination option reassembly
111	${SUDO} ${PYTHON}frag6_opt.py
112
113# The ethernet frame has some padding that must be ignored by reassembly
114TARGETS +=	frag6-padding
115run-regress-frag6-padding: addr.py
116	@echo '\n======== $@ ========'
117	@echo Check ping6 ethernet padding
118	${SUDO} ${PYTHON}frag6_padding.py
119
120# fragmented packet with head overlapping first fragment
121TARGETS +=	frag6-overhead0
122run-regress-frag6-overhead0: addr.py
123	@echo '\n======== $@ ========'
124	@echo Check ping6 head overlapping first fragment
125	${SUDO} ${PYTHON}frag6_overhead0.py
126
127# fragmented packet with head overlapping second fragment
128TARGETS +=	frag6-overhead
129run-regress-frag6-overhead: addr.py
130	@echo '\n======== $@ ========'
131	@echo Check ping6 head overlapping second fragment
132	${SUDO} ${PYTHON}frag6_overhead.py
133
134# fragmented packet with tail overlapping last fragment
135TARGETS +=	frag6-overtail
136run-regress-frag6-overtail: addr.py
137	@echo '\n======== $@ ========'
138	@echo Check ping6 tail overlapping last fragment
139	${SUDO} ${PYTHON}frag6_overtail.py
140
141# fragmented packet with overlap, drop future fragments
142TARGETS +=	frag6-overdrop
143run-regress-frag6-overdrop: addr.py
144	@echo '\n======== $@ ========'
145	@echo Check ping6 overlap drop future fragments
146	${SUDO} ${PYTHON}frag6_overdrop.py
147
148# fragmented packet with overlap, atomic fragment must be processed
149TARGETS +=	frag6-overatomic
150run-regress-frag6-overatomic: addr.py
151	@echo '\n======== $@ ========'
152	@echo Check ping6 overlapping and atomic fragments
153	${SUDO} ${PYTHON}frag6_overatomic.py
154
155# atomic fragment with short fragmented payload
156TARGETS +=	frag6-shortatomic
157run-regress-frag6-shortatomic: addr.py
158	@echo '\n======== $@ ========'
159	@echo Check ping6 short atomic fragments
160	${SUDO} ${PYTHON}frag6_shortatomic.py
161
162# fragmented packet permuted fragments
163TARGETS +=	frag6-permute
164run-regress-frag6-permute: addr.py
165	@echo '\n======== $@ ========'
166	@echo Check ping6 permuted fragments
167	${SUDO} ${PYTHON}frag6_permute.py
168
169# fragmented packet with zero length first fragment
170TARGETS +=	frag6-zerofirst
171run-regress-frag6-zerofirst: addr.py
172	@echo '\n======== $@ ========'
173	@echo Check ping6 zero length first fragment
174	${SUDO} ${PYTHON}frag6_zerofirst.py
175
176# fragmented packet with zero length second fragment
177TARGETS +=	frag6-zerosecond
178run-regress-frag6-zerosecond: addr.py
179	@echo '\n======== $@ ========'
180	@echo Check ping6 zero length second fragment
181	${SUDO} ${PYTHON}frag6_zerosecond.py
182
183# fragmented large ping packet that has to be refragmented by reflector
184TARGETS +=	frag6-refrag
185run-regress-frag6-refrag: addr.py
186	@echo '\n======== $@ ========'
187	@echo Check ping6 with fragmented reply
188	${SUDO} ${PYTHON}frag6_refrag.py
189
190# atomic fragmented udp packet
191TARGETS +=	frag6-udpatomic
192run-regress-frag6-udpatomic: addr.py
193	@echo '\n======== $@ ========'
194	@echo Check ping6 atomic udp fragment
195	${SUDO} ${PYTHON}frag6_udpatomic.py
196
197# fragmented udp packet after header
198TARGETS +=	frag6-udpheader
199run-regress-frag6-udpheader: addr.py
200	@echo '\n======== $@ ========'
201	@echo Check ping6 udp header fragment
202	${SUDO} ${PYTHON}frag6_udpheader.py
203
204# fragmented udp packet within payload
205TARGETS +=	frag6-udppayload
206run-regress-frag6-udppayload: addr.py
207	@echo '\n======== $@ ========'
208	@echo Check ping6 udp payload fragment
209	${SUDO} ${PYTHON}frag6_udppayload.py
210
211# fragmented icmp packet not within 60 second timeout, test takes 90 seconds
212TARGETS +=	frag6-timeout
213run-regress-frag6-timeout: addr.py
214	@echo '\n======== $@ ========'
215	@echo Check ping6 fragment timeout
216	${SUDO} ${PYTHON}frag6_timeout.py
217
218REGRESS_TARGETS =	${TARGETS:S/^/run-regress-/}
219
220CLEANFILES +=		addr.py *.pyc *.log
221
222.include <bsd.regress.mk>
223