1# $OpenBSD: Makefile,v 1.9 2019/05/10 02:22:34 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) 9regress: 10 @echo Install python and the scapy module for additional tests. 11 @echo SKIPPED 12.endif 13 14# This test needs a manual setup of two machines 15# Set up machines: LOCAL REMOTE 16# LOCAL is the machine where this makefile is running. 17# REMOTE is running OpenBSD with pf to test the neighbor discovery states. 18 19# Configure addresses on the machines. 20# Adapt interface and addresse variables to your local setup. 21 22LOCAL_IF ?= em1 23LOCAL_MAC ?= 00:1b:21:0e:6e:8e 24REMOTE_MAC ?= 00:04:23:b0:68:8e 25 26LOCAL_ADDR6 ?= fdd7:e83e:66bc:81::21 27REMOTE_ADDR6 ?= fdd7:e83e:66bc:81::22 28 29REMOTE_SSH ?= 30 31# pf rules on REMOTE should look like this: 32# 33# block log 34# pass inet6 proto icmp6 icmp6-type echoreq keep state 35# pass inet6 proto icmp6 icmp6-type neighbrsol keep state 36# pass inet6 proto icmp6 icmp6-type neighbradv keep state 37 38# RFC 4861 7. describes the following test cases for ND: 39# 40# Duplicate Address Detection 41# - request NS from unspecified address to target solicitated-node multicast 42# - response NA from interface address to all-nodes multicast 43# 44# Address Resolution 45# - request NS from interface address to target solicitated-node multicast 46# - response NA from interface address to source of NS 47# 48# Unsolicited Neighbor Advertisements 49# - request NA from interface address to all-nodes multicast 50# 51# Neighbor Unreachability Detection 52# - request NS from interface address to target unicast 53# - response NA from interface address to source of NS 54 55.if empty (LOCAL_IF) || empty (LOCAL_MAC) || empty (REMOTE_MAC) || \ 56 empty (LOCAL_ADDR6) || empty (REMOTE_ADDR6) || empty (REMOTE_SSH) 57regress: 58 @echo This tests needs a remote machine to operate on. 59 @echo LOCAL_IF LOCAL_MAC REMOTE_MAC LOCAL_ADDR6 REMOTE_ADDR6 60 @echo REMOTE_SSH are empty. 61 @echo Fill out these variables for additional tests. 62 @echo SKIPPED 63.endif 64 65# Create python include file containing the addresses. 66addr.py: Makefile 67 rm -f $@ $@.tmp 68 echo 'LOCAL_IF = "${LOCAL_IF}"' >>$@.tmp 69 echo 'LOCAL_MAC = "${LOCAL_MAC}"' >>$@.tmp 70 echo 'REMOTE_MAC = "${REMOTE_MAC}"' >>$@.tmp 71.for var in LOCAL_ADDR REMOTE_ADDR 72 echo '${var} = "${${var}}"' >>$@.tmp 73 echo '${var}6 = "${${var}6}"' >>$@.tmp 74.endfor 75 mv $@.tmp $@ 76 77# Set variables so that make runs with and without obj directory. 78# Only do that if necessary to keep visible output short. 79.if ${.CURDIR} == ${.OBJDIR} 80PYTHON = python2.7 -u ./ 81.else 82PYTHON = PYTHONPATH=${.OBJDIR} python2.7 -u ${.CURDIR}/ 83.endif 84 85# Clear neighbor cache and ping all addresses. This ensures that 86# the ip addresses are configured and all routing table are set up 87# to allow bidirectional packet flow. 88REGRESS_TARGETS = run-ping6 89run-ping6: 90 @echo '\n======== $@ ========' 91 ${SUDO} ndp -c 92.for ip in LOCAL_ADDR REMOTE_ADDR 93 @echo Check ping6 ${ip}6: 94 ping6 -n -c 1 ${${ip}6} 95.endfor 96 97ND6_SCRIPTS !!= cd ${.CURDIR} && ls -1 nd6*.py 98 99.for s in ${ND6_SCRIPTS} 100REGRESS_TARGETS = run-${s} 101run-${s}: addr.py 102 @echo '\n======== $@ ========' 103 ${SUDO} ${PYTHON}${s} 104.endfor 105 106CLEANFILES += addr.py *.pyc *.log 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 ndp -n ${REMOTE_ADDR6} |\ 122 grep -q ' ${REMOTE_MAC} ' # REMOTE_ADDR6 REMOTE_MAC 123 124check-setup-remote: 125 @echo '\n======== $@ ========' 126 ssh ${REMOTE_SSH} ping6 -n -c 1 ${REMOTE_ADDR6} # REMOTE_ADDR6 127 ssh ${REMOTE_SSH} route -n get -inet6 ${REMOTE_ADDR6} |\ 128 grep -q 'flags: .*LOCAL' # REMOTE_ADDR6 129 ssh ${REMOTE_SSH} ping6 -n -c 1 ${LOCAL_ADDR6} # LOCAL_ADDR6 130 ssh ${REMOTE_SSH} ndp -n ${LOCAL_ADDR6} |\ 131 grep -q ' ${LOCAL_MAC} ' # LOCAL_ADDR6 LOCAL_MAC 132 133.include <bsd.regress.mk> 134