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