xref: /openbsd/regress/sys/netinet6/nd6/Makefile (revision 274d7c50)
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