xref: /openbsd/regress/sys/netinet6/rh0/Makefile (revision 653fceec)
1*653fceecSbluhm#	$OpenBSD: Makefile,v 1.10 2017/03/01 00:58:22 bluhm Exp $
2694d4422Sbluhm
3694d4422Sbluhm# The following ports must be installed:
4694d4422Sbluhm#
5694d4422Sbluhm# python-2.7		interpreted object-oriented programming language
6694d4422Sbluhm# py-libdnet		python interface to libdnet
7694d4422Sbluhm# scapy			powerful interactive packet manipulation in python
8694d4422Sbluhm
90502cf93Stb.if ! (make(clean) || make(cleandir) || make(obj))
10a91e3c70Sbluhm# Check wether all required python packages are installed.  If some
11a91e3c70Sbluhm# are missing print a warning and skip the tests, but do not fail.
122d33a7beSbluhmPYTHON_IMPORT !!= python2.7 -c 'from scapy.all import *' 2>&1 || true
130502cf93Stb.endif
142d33a7beSbluhm
15a91e3c70Sbluhm.if ! empty(PYTHON_IMPORT)
167b3475a7Sbluhm.BEGIN:
177b3475a7Sbluhm	@true
18a91e3c70Sbluhmregress:
19a91e3c70Sbluhm	@echo '${PYTHON_IMPORT}'
202d33a7beSbluhm	@echo Install python and the scapy module for additional tests.
2154eefd0cSbluhm	@echo SKIPPED
22a91e3c70Sbluhm.endif
23a91e3c70Sbluhm
24694d4422Sbluhm# This test needs a manual setup of two machines
257b3475a7Sbluhm# Set up machines: LOCAL REMOTE
267b3475a7Sbluhm# LOCAL is the machine where this makefile is running.
277b3475a7Sbluhm# REMOTE is running OpenBSD, pf gets disabled to test the IPv6 stack.
287b3475a7Sbluhm# OTHER is an address on REMOTE, but configured on another interface.
297b3475a7Sbluhm# OTHER_FAKE source routed host, no packets reach this host,
307b3475a7Sbluhm#     it represents just bunch of addresses in the OTHER net.
31694d4422Sbluhm
32694d4422Sbluhm# Configure Addresses on the machines.
33694d4422Sbluhm# Adapt interface and address variables to your local setup.
34694d4422Sbluhm
357b3475a7SbluhmLOCAL_IF ?=	em1
367b3475a7SbluhmLOCAL_MAC ?=	00:1b:21:0e:6e:8e
377b3475a7SbluhmREMOTE_MAC ?=	00:04:23:b0:68:8e
38a91e3c70Sbluhm
397b3475a7SbluhmLOCAL_ADDR6 ?=	fdd7:e83e:66bc:81::21
407b3475a7SbluhmREMOTE_ADDR6 ?=	fdd7:e83e:66bc:81::22
417b3475a7SbluhmOTHER_ADDR6 ?=	fdd7:e83e:66bc:82::22
427b3475a7SbluhmOTHER_FAKE1_ADDR6 ?=	fdd7:e83e:66bc:82::dead
437b3475a7SbluhmOTHER_FAKE2_ADDR6 ?=	fdd7:e83e:66bc:82::beef
447b3475a7Sbluhm
457b3475a7SbluhmREMOTE_SSH ?=
467b3475a7Sbluhm
477b3475a7Sbluhm.if empty (LOCAL_IF) || empty (LOCAL_MAC) || empty (REMOTE_MAC) || \
487b3475a7Sbluhm    empty (LOCAL_ADDR6) || empty (REMOTE_ADDR6) || empty(OTHER_ADDR6) || \
497b3475a7Sbluhm    empty (OTHER_FAKE1_ADDR6) || empty (OTHER_FAKE2_ADDR6) || \
507b3475a7Sbluhm    empty (REMOTE_SSH)
517b3475a7Sbluhm.BEGIN:
527b3475a7Sbluhm	@true
53a91e3c70Sbluhmregress:
542d33a7beSbluhm	@echo This tests needs a remote machine to operate on.
557b3475a7Sbluhm	@echo LOCAL_IF LOCAL_MAC REMOTE_MAC LOCAL_ADDR6 REMOTE_ADDR6
567b3475a7Sbluhm	@echo OTHER_ADDR6 OTHER_FAKE1_ADDR6 OTHER_FAKE2_ADDR6 REMOTE_SSH
572d33a7beSbluhm	@echo Fill out these variables for additional tests.
5854eefd0cSbluhm	@echo SKIPPED
59a91e3c70Sbluhm.endif
60694d4422Sbluhm
612d33a7beSbluhm.MAIN: all
622d33a7beSbluhm
632d33a7beSbluhm.if make (regress) || make (all)
642d33a7beSbluhm.BEGIN: addr.py
652d33a7beSbluhm	@echo
662d33a7beSbluhm	${SUDO} true
67*653fceecSbluhm	ssh -t ${REMOTE_SSH} ${SUDO} true
682d33a7beSbluhm	rm -f stamp-stack stamp-pf
692d33a7beSbluhm.endif
702d33a7beSbluhm
71694d4422Sbluhmdepend: addr.py
72694d4422Sbluhm
73694d4422Sbluhm# Create python include file containing the addresses.
74694d4422Sbluhmaddr.py: Makefile
75694d4422Sbluhm	rm -f $@ $@.tmp
767b3475a7Sbluhm	echo 'LOCAL_IF = "${LOCAL_IF}"' >>$@.tmp
777b3475a7Sbluhm	echo 'LOCAL_MAC = "${LOCAL_MAC}"' >>$@.tmp
787b3475a7Sbluhm	echo 'REMOTE_MAC = "${REMOTE_MAC}"' >>$@.tmp
797b3475a7Sbluhm.for var in LOCAL_ADDR REMOTE_ADDR OTHER_FAKE1_ADDR OTHER_FAKE2_ADDR
80694d4422Sbluhm	echo '${var}6 = "${${var}6}"' >>$@.tmp
81694d4422Sbluhm.endfor
82694d4422Sbluhm	mv $@.tmp $@
83694d4422Sbluhm
84a91e3c70Sbluhm# Set variables so that make runs with and without obj directory.
85a91e3c70Sbluhm# Only do that if necessary to keep visible output short.
86a91e3c70Sbluhm.if ${.CURDIR} == ${.OBJDIR}
87a91e3c70SbluhmPYTHON =	python2.7 ./
88a91e3c70Sbluhm.else
89a91e3c70SbluhmPYTHON =	PYTHONPATH=${.OBJDIR} python2.7 ${.CURDIR}/
90a91e3c70Sbluhm.endif
91a91e3c70Sbluhm
922d33a7beSbluhmstamp-stack:
932d33a7beSbluhm	rm -f stamp-stack stamp-pf
94*653fceecSbluhm	-ssh ${REMOTE_SSH} ${SUDO} pfctl -d
95*653fceecSbluhm	ssh ${REMOTE_SSH} ${SUDO} pfctl -a regress -Fr
962d33a7beSbluhm	date >$@
972d33a7beSbluhm
982d33a7beSbluhmstamp-pf:
992d33a7beSbluhm	rm -f stamp-stack stamp-pf
1002d33a7beSbluhm	echo 'pass proto tcp from port ssh no state\n'\
1012d33a7beSbluhm	    'pass proto tcp to port ssh no state'|\
102*653fceecSbluhm	    ssh ${REMOTE_SSH} ${SUDO} pfctl -a regress -f -
103*653fceecSbluhm	-ssh ${REMOTE_SSH} ${SUDO} pfctl -e
1042d33a7beSbluhm	date >$@
1052d33a7beSbluhm
1062d33a7beSbluhmRH0_SCRIPTS !!=		cd ${.CURDIR} && ls -1 rh0*.py
1072d33a7beSbluhm
1082d33a7beSbluhm.for s in ${RH0_SCRIPTS}
1092d33a7beSbluhmrun-regress-${s}: addr.py stamp-stack
110a91e3c70Sbluhm	@echo '\n======== $@ ========'
1112d33a7beSbluhm	${SUDO} ${PYTHON}${s}
1122d33a7beSbluhm.endfor
113694d4422Sbluhm
1142d33a7beSbluhmREGRESS_TARGETS =	${RH0_SCRIPTS:S/^/run-regress-/}
115a91e3c70Sbluhm
1162d33a7beSbluhm# After running the tests, turn on pf on remote machine.
1172d33a7beSbluhm# This is the expected default configuration.
1182d33a7beSbluhmREGRESS_TARGETS +=      stamp-pf
119a91e3c70Sbluhm
1202d33a7beSbluhmCLEANFILES +=		addr.py *.pyc *.log stamp-*
121694d4422Sbluhm
1227b3475a7Sbluhm.PHONY: check-setup check-setup-local check-setup-remote
1237e8c0af0Sbluhm
1247e8c0af0Sbluhm# Check wether the address, route and remote setup is correct
1257b3475a7Sbluhmcheck-setup: check-setup-local check-setup-remote
1267b3475a7Sbluhm
1277b3475a7Sbluhmcheck-setup-local:
128c54bd846Sbluhm	@echo '\n======== $@ ========'
1297b3475a7Sbluhm	ping6 -n -c 1 ${LOCAL_ADDR6}  # LOCAL_ADDR6
1307b3475a7Sbluhm	route -n get -inet6 ${LOCAL_ADDR6} |\
1317b3475a7Sbluhm	    grep -q 'flags: .*LOCAL'  # LOCAL_ADDR6
1327b3475a7Sbluhm	ping6 -n -c 1 ${REMOTE_ADDR6}  # REMOTE_ADDR6
1337b3475a7Sbluhm	route -n get -inet6 ${REMOTE_ADDR6} |\
1347b3475a7Sbluhm	    grep -q 'interface: ${LOCAL_IF}$$'  # REMOTE_ADDR6 LOCAL_IF
1357b3475a7Sbluhm.for ip in OTHER_ADDR6 OTHER_FAKE1_ADDR6 OTHER_FAKE2_ADDR6
1367b3475a7Sbluhm	route -n get -inet6 ${${ip}} |\
1377b3475a7Sbluhm	    grep -q 'gateway: ${REMOTE_ADDR6}$$'  # ${ip} REMOTE_ADDR6
1387b3475a7Sbluhm.endfor
1397b3475a7Sbluhm	ndp -n ${REMOTE_ADDR6} |\
1407b3475a7Sbluhm	    grep -q ' ${REMOTE_MAC} '  # REMOTE_ADDR6 REMOTE_MAC
1417b3475a7Sbluhm
1427b3475a7Sbluhmcheck-setup-remote:
1437b3475a7Sbluhm	@echo '\n======== $@ ========'
1447b3475a7Sbluhm	ssh ${REMOTE_SSH} ping6 -n -c 1 ${REMOTE_ADDR6}  # REMOTE_ADDR6
1457b3475a7Sbluhm	ssh ${REMOTE_SSH} route -n get -inet6 ${REMOTE_ADDR6} |\
1467b3475a7Sbluhm	    grep -q 'flags: .*LOCAL'  # REMOTE_ADDR6
1477b3475a7Sbluhm	ssh ${REMOTE_SSH} ping6 -n -c 1 ${LOCAL_ADDR6}  # LOCAL_ADDR6
1487b3475a7Sbluhm	ssh ${REMOTE_SSH} ping6 -n -c 1 ${OTHER_ADDR6}  # OTHER_ADDR6
1497b3475a7Sbluhm	ssh ${REMOTE_SSH} route -n get -inet6 ${OTHER_ADDR6} |\
1507b3475a7Sbluhm	    grep -q 'flags: .*LOCAL'  # OTHER_ADDR6
1517b3475a7Sbluhm.for ip in OTHER_FAKE1_ADDR6 OTHER_FAKE2_ADDR6
1527b3475a7Sbluhm	ssh ${REMOTE_SSH} route -n get -inet6 ${${ip}} |\
1537b3475a7Sbluhm	    grep -q 'if address: ${OTHER_ADDR6}$$'  # ${ip} OTHER_ADDR6
1547b3475a7Sbluhm.endfor
1557b3475a7Sbluhm	ssh ${REMOTE_SSH} ndp -n ${LOCAL_ADDR6} |\
1567b3475a7Sbluhm	    grep -q ' ${LOCAL_MAC} '  # LOCAL_ADDR6 LOCAL_MAC
1577e8c0af0Sbluhm
158694d4422Sbluhm.include <bsd.regress.mk>
159