xref: /openbsd/regress/sys/netinet6/rh0/Makefile (revision 3cab2bb3)
1#	$OpenBSD: Makefile,v 1.13 2020/01/15 20:47:14 bluhm Exp $
2
3# The following ports must be installed:
4#
5# python-2.7		interpreted object-oriented programming language
6# scapy			powerful interactive packet manipulation in python
7
8.if ! exists(/usr/local/bin/python2.7) || ! exists(/usr/local/bin/scapy)
9.BEGIN:
10	@true
11regress:
12	@echo Install python and the scapy module for additional tests.
13	@echo SKIPPED
14.endif
15
16# This test needs a manual setup of two machines
17# Set up machines: LOCAL REMOTE
18# LOCAL is the machine where this makefile is running.
19# REMOTE is running OpenBSD, pf gets disabled to test the IPv6 stack.
20# OTHER is an address on REMOTE, but configured on another interface.
21# OTHER_FAKE source routed host, no packets reach this host,
22#     it represents just bunch of addresses in the OTHER net.
23
24# Configure Addresses on the machines.
25# Adapt interface and address variables to your local setup.
26
27LOCAL_IF ?=	em1
28LOCAL_MAC ?=	00:1b:21:0e:6e:8e
29REMOTE_MAC ?=	00:04:23:b0:68:8e
30
31LOCAL_ADDR6 ?=	fdd7:e83e:66bc:81::21
32REMOTE_ADDR6 ?=	fdd7:e83e:66bc:81::22
33OTHER_ADDR6 ?=	fdd7:e83e:66bc:82::22
34OTHER_FAKE1_ADDR6 ?=	fdd7:e83e:66bc:82::dead
35OTHER_FAKE2_ADDR6 ?=	fdd7:e83e:66bc:82::beef
36
37REMOTE_SSH ?=
38
39.if empty (LOCAL_IF) || empty (LOCAL_MAC) || empty (REMOTE_MAC) || \
40    empty (LOCAL_ADDR6) || empty (REMOTE_ADDR6) || empty(OTHER_ADDR6) || \
41    empty (OTHER_FAKE1_ADDR6) || empty (OTHER_FAKE2_ADDR6) || \
42    empty (REMOTE_SSH)
43.BEGIN:
44	@true
45regress:
46	@echo This tests needs a remote machine to operate on.
47	@echo LOCAL_IF LOCAL_MAC REMOTE_MAC LOCAL_ADDR6 REMOTE_ADDR6
48	@echo OTHER_ADDR6 OTHER_FAKE1_ADDR6 OTHER_FAKE2_ADDR6 REMOTE_SSH
49	@echo Fill out these variables for additional tests.
50	@echo SKIPPED
51.endif
52
53.MAIN: all
54
55.if make (regress) || make (all)
56.BEGIN:
57	@echo
58	${SUDO} true
59	ssh -t ${REMOTE_SSH} ${SUDO} true
60	rm -f stamp-stack stamp-pf
61.endif
62
63# Create python include file containing the addresses.
64addr.py: Makefile
65	rm -f $@ $@.tmp
66	echo 'LOCAL_IF = "${LOCAL_IF}"' >>$@.tmp
67	echo 'LOCAL_MAC = "${LOCAL_MAC}"' >>$@.tmp
68	echo 'REMOTE_MAC = "${REMOTE_MAC}"' >>$@.tmp
69.for var in LOCAL_ADDR REMOTE_ADDR OTHER_FAKE1_ADDR OTHER_FAKE2_ADDR
70	echo '${var}6 = "${${var}6}"' >>$@.tmp
71.endfor
72	mv $@.tmp $@
73
74# Set variables so that make runs with and without obj directory.
75# Only do that if necessary to keep visible output short.
76.if ${.CURDIR} == ${.OBJDIR}
77PYTHON =	python2.7 -u ./
78.else
79PYTHON =	PYTHONPATH=${.OBJDIR} python2.7 -u ${.CURDIR}/
80.endif
81
82stamp-stack:
83	@echo '\n======== $@ ========'
84	rm -f stamp-stack stamp-pf
85	-ssh ${REMOTE_SSH} ${SUDO} pfctl -d
86	ssh ${REMOTE_SSH} ${SUDO} pfctl -a regress -Fr
87	date >$@
88
89# After running the tests, turn on pf on remote machine.
90# This is the expected default configuration.
91REGRESS_CLEANUP +=      stamp-pf
92stamp-pf:
93	@echo '\n======== $@ ========'
94	rm -f stamp-stack stamp-pf
95	echo 'pass proto tcp from port ssh no state\n'\
96	    'pass proto tcp to port ssh no state'|\
97	    ssh ${REMOTE_SSH} ${SUDO} pfctl -a regress -f -
98	-ssh ${REMOTE_SSH} ${SUDO} pfctl -e
99	date >$@
100
101RH0_SCRIPTS !!=		cd ${.CURDIR} && ls -1 rh0*.py
102
103.for s in ${RH0_SCRIPTS}
104REGRESS_TARGETS =	run-${s}
105run-${s}: addr.py stamp-stack
106	@echo '\n======== $@ ========'
107	${SUDO} ${PYTHON}${s}
108.endfor
109
110CLEANFILES +=		addr.py *.pyc *.log stamp-*
111
112.PHONY: check-setup check-setup-local check-setup-remote
113
114# Check wether the address, route and remote setup is correct
115check-setup: check-setup-local check-setup-remote
116
117check-setup-local:
118	@echo '\n======== $@ ========'
119	ping6 -n -c 1 ${LOCAL_ADDR6}  # LOCAL_ADDR6
120	route -n get -inet6 ${LOCAL_ADDR6} |\
121	    grep -q 'flags: .*LOCAL'  # LOCAL_ADDR6
122	ping6 -n -c 1 ${REMOTE_ADDR6}  # REMOTE_ADDR6
123	route -n get -inet6 ${REMOTE_ADDR6} |\
124	    grep -q 'interface: ${LOCAL_IF}$$'  # REMOTE_ADDR6 LOCAL_IF
125.for ip in OTHER_ADDR6 OTHER_FAKE1_ADDR6 OTHER_FAKE2_ADDR6
126	route -n get -inet6 ${${ip}} |\
127	    grep -q 'gateway: ${REMOTE_ADDR6}$$'  # ${ip} REMOTE_ADDR6
128.endfor
129	ndp -n ${REMOTE_ADDR6} |\
130	    grep -q ' ${REMOTE_MAC} '  # REMOTE_ADDR6 REMOTE_MAC
131
132check-setup-remote:
133	@echo '\n======== $@ ========'
134	ssh ${REMOTE_SSH} ping6 -n -c 1 ${REMOTE_ADDR6}  # REMOTE_ADDR6
135	ssh ${REMOTE_SSH} route -n get -inet6 ${REMOTE_ADDR6} |\
136	    grep -q 'flags: .*LOCAL'  # REMOTE_ADDR6
137	ssh ${REMOTE_SSH} ping6 -n -c 1 ${LOCAL_ADDR6}  # LOCAL_ADDR6
138	ssh ${REMOTE_SSH} ping6 -n -c 1 ${OTHER_ADDR6}  # OTHER_ADDR6
139	ssh ${REMOTE_SSH} route -n get -inet6 ${OTHER_ADDR6} |\
140	    grep -q 'flags: .*LOCAL'  # OTHER_ADDR6
141.for ip in OTHER_FAKE1_ADDR6 OTHER_FAKE2_ADDR6
142	ssh ${REMOTE_SSH} route -n get -inet6 ${${ip}} |\
143	    grep -q 'if address: ${OTHER_ADDR6}$$'  # ${ip} OTHER_ADDR6
144.endfor
145	ssh ${REMOTE_SSH} ndp -n ${LOCAL_ADDR6} |\
146	    grep -q ' ${LOCAL_MAC} '  # LOCAL_ADDR6 LOCAL_MAC
147
148.include <bsd.regress.mk>
149