xref: /openbsd/regress/sys/netinet/pmtu/Makefile (revision d6623619)
1*d6623619Sbluhm#	$OpenBSD: Makefile,v 1.16 2023/05/24 11:52:30 bluhm Exp $
2b83a2f27Sbluhm
3b83a2f27Sbluhm# The following ports must be installed:
4b83a2f27Sbluhm#
5b83a2f27Sbluhm# scapy               powerful interactive packet manipulation in python
6b83a2f27Sbluhm
770788dfdSkn.if ! exists(/usr/local/bin/scapy)
8b83a2f27Sbluhmregress:
970788dfdSkn	@echo Install scapy package to run this regress.
1054eefd0cSbluhm	@echo SKIPPED
11b83a2f27Sbluhm.endif
12b83a2f27Sbluhm
13b83a2f27Sbluhm# This test needs a manual setup of two machines
14b83a2f27Sbluhm# Set up machines: LOCAL REMOTE
15b83a2f27Sbluhm# LOCAL is the machine where this makefile is running.
16b83a2f27Sbluhm# REMOTE is running OpenBSD with echo and chargen server to test PMTU
17b83a2f27Sbluhm# FAKE is an non existing machine in a non existing network.
18b83a2f27Sbluhm# REMOTE_SSH is the hostname to log in on the REMOTE machine.
19b83a2f27Sbluhm
20b83a2f27Sbluhm# Configure Addresses on the machines.
21b83a2f27Sbluhm# Adapt interface and addresse variables to your local setup.
22b83a2f27Sbluhm#
23b83a2f27SbluhmLOCAL_IF ?=
24f516a404SbluhmLOCAL_MAC ?=
25f516a404SbluhmREMOTE_MAC ?=
26b83a2f27SbluhmREMOTE_SSH ?=
27b83a2f27Sbluhm
28b83a2f27SbluhmLOCAL_ADDR ?=
29b83a2f27SbluhmREMOTE_ADDR ?=
30b83a2f27SbluhmFAKE_NET ?=
31b83a2f27SbluhmFAKE_NET_ADDR ?=
32b83a2f27Sbluhm
33b83a2f27SbluhmLOCAL_ADDR6 ?=
34b83a2f27SbluhmREMOTE_ADDR6 ?=
35b83a2f27SbluhmFAKE_NET6 ?=
36b83a2f27SbluhmFAKE_NET_ADDR6 ?=
37b83a2f27Sbluhm
38b83a2f27Sbluhm.if empty (LOCAL_IF) || empty (REMOTE_SSH) || \
39f516a404Sbluhm    empty (LOCAL_MAC) || empty (REMOTE_MAC) || \
40b83a2f27Sbluhm    empty (LOCAL_ADDR) || empty (LOCAL_ADDR6) || \
41b83a2f27Sbluhm    empty (REMOTE_ADDR) || empty (REMOTE_ADDR6) || \
42b83a2f27Sbluhm    empty (FAKE_NET) || empty (FAKE_NET6) || \
43b83a2f27Sbluhm    empty (FAKE_NET_ADDR) || empty (FAKE_NET_ADDR6)
44b83a2f27Sbluhmregress:
45b83a2f27Sbluhm	@echo This tests needs a remote machine to operate on
46f516a404Sbluhm	@echo LOCAL_IF REMOTE_SSH LOCAL_MAC REMOTE_MAC LOCAL_ADDR LOCAL_ADDR6
47f516a404Sbluhm	@echo REMOTE_ADDR REMOTE_ADDR6 FAKE_NET FAKE_NET6 FAKE_NET_ADDR
48f516a404Sbluhm	@echo FAKE_NET_ADDR6
49b83a2f27Sbluhm	@echo are empty.  Fill out these variables for additional tests.
5054eefd0cSbluhm	@echo SKIPPED
51b83a2f27Sbluhm
526f20e9eaSkettenis.elif make (regress) || make (all)
53f39ab060Sbluhm.BEGIN: addr.py
54510ab291Sbluhm	${SUDO} true
55510ab291Sbluhm	ssh -t ${REMOTE_SSH} ${SUDO} true
56e7abe75aSbluhm	@echo
57510ab291Sbluhm.endif
58510ab291Sbluhm
59b83a2f27Sbluhm# Create python include file containing the addresses.
60b83a2f27Sbluhmaddr.py: Makefile
61b83a2f27Sbluhm	rm -f $@ $@.tmp
62b83a2f27Sbluhm	echo 'LOCAL_IF = "${LOCAL_IF}"' >>$@.tmp
63b83a2f27Sbluhm	echo 'LOCAL_MAC = "${LOCAL_MAC}"' >>$@.tmp
64b83a2f27Sbluhm	echo 'REMOTE_MAC = "${REMOTE_MAC}"' >>$@.tmp
65b83a2f27Sbluhm.for var in LOCAL REMOTE FAKE_NET
66b83a2f27Sbluhm	echo '${var}_ADDR = "${${var}_ADDR}"' >>$@.tmp
67b83a2f27Sbluhm	echo '${var}_ADDR6 = "${${var}_ADDR6}"' >>$@.tmp
68b83a2f27Sbluhm.endfor
69b83a2f27Sbluhm	echo 'FAKE_NET = "${FAKE_NET}"' >>$@.tmp
70b83a2f27Sbluhm	echo 'FAKE_NET6 = "${FAKE_NET6}"' >>$@.tmp
71b83a2f27Sbluhm	mv $@.tmp $@
72b83a2f27Sbluhm
73*d6623619SbluhmREGRESS_SETUP_ONCE +=	pfctl
74*d6623619Sbluhmstamp-pfctl: addr.py pf.conf
75*d6623619Sbluhmpfctl:
76*d6623619Sbluhm	# default "block return; pass" interferes with test, use "block; pass"
77*d6623619Sbluhm	cat addr.py ${.CURDIR}/pf.conf | /sbin/pfctl -n -f -
78*d6623619Sbluhm	cat addr.py ${.CURDIR}/pf.conf | ${SUDO} /sbin/pfctl -a regress -f -
79*d6623619Sbluhm	cat addr.py ${.CURDIR}/pf.conf | \
80*d6623619Sbluhm	    ssh ${REMOTE_SSH} ${SUDO} pfctl -a regress -f -
81*d6623619Sbluhm
82b83a2f27Sbluhm# Set variables so that make runs with and without obj directory.
83b83a2f27Sbluhm# Only do that if necessary to keep visible output short.
84b83a2f27Sbluhm.if ${.CURDIR} == ${.OBJDIR}
85e7abe75aSbluhmPYTHON =	python3 -u ./
86b83a2f27Sbluhm.else
87e7abe75aSbluhmPYTHON =	PYTHONPATH=${.OBJDIR} python3 -u ${.CURDIR}/
88b83a2f27Sbluhm.endif
89b83a2f27Sbluhm
90b83a2f27Sbluhm# Clear local and remote path mtu routes, set fake net route
91f39ab060SbluhmREGRESS_CLEANUP +=	reset-route
92b83a2f27Sbluhmreset-route:
93f516a404Sbluhm	${SUDO} route -n delete -inet -host ${REMOTE_ADDR} || true
94f516a404Sbluhm	ssh ${REMOTE_SSH} ${SUDO} route -n delete -inet -host ${FAKE_NET_ADDR} || true
95f39ab060SbluhmREGRESS_CLEANUP +=	reset-route6
96b83a2f27Sbluhmreset-route6:
97f516a404Sbluhm	${SUDO} route -n delete -inet6 -host ${REMOTE_ADDR6} || true
98f516a404Sbluhm	ssh ${REMOTE_SSH} ${SUDO} route -n delete -inet6 -host ${FAKE_NET_ADDR6} || true
99b83a2f27Sbluhm
100b83a2f27Sbluhm# Clear host routes and ping all addresses.  This ensures that
101b83a2f27Sbluhm# the IP addresses are configured and all routing table are set up
102b83a2f27Sbluhm# to allow bidirectional packet flow.
103f39ab060SbluhmREGRESS_TARGETS +=	run-ping
104f39ab060Sbluhmrun-ping: reset-route
105b83a2f27Sbluhm.for ip in LOCAL_ADDR REMOTE_ADDR
106b83a2f27Sbluhm	@echo Check ping ${ip}
107b83a2f27Sbluhm	ping -n -c 1 ${${ip}}
108b83a2f27Sbluhm.endfor
109f39ab060SbluhmREGRESS_TARGETS +=	run-ping6
110f39ab060Sbluhmrun-ping6: reset-route6
111b83a2f27Sbluhm.for ip in LOCAL_ADDR REMOTE_ADDR
112b83a2f27Sbluhm	@echo Check ping6 ${ip}6
113b83a2f27Sbluhm	ping6 -n -c 1 ${${ip}6}
114b83a2f27Sbluhm.endfor
115b83a2f27Sbluhm
116f39ab060SbluhmREGRESS_TARGETS +=	run-pmtu
117f39ab060Sbluhmrun-pmtu: addr.py reset-route
118b83a2f27Sbluhm	@echo Send ICMP fragmentation needed after fake TCP connect
119b83a2f27Sbluhm	${SUDO} ${PYTHON}tcp_connect.py
120f39ab060SbluhmREGRESS_TARGETS +=	run-pmtu6
121f39ab060Sbluhmrun-pmtu6: addr.py reset-route6
122b83a2f27Sbluhm	@echo Send ICMP6 packet too big after fake TCP connect
123b83a2f27Sbluhm	${SUDO} ${PYTHON}tcp_connect6.py
124b83a2f27Sbluhm
125f39ab060SbluhmREGRESS_TARGETS +=	run-udp6
126f39ab060Sbluhmrun-udp6: addr.py reset-route6
127b83a2f27Sbluhm	@echo Send ICMP6 packet too big after UDP echo
128b83a2f27Sbluhm	${SUDO} ${PYTHON}udp_echo6.py
129b83a2f27Sbluhm
130f39ab060SbluhmREGRESS_TARGETS +=	run-gateway6
131f39ab060Sbluhmrun-gateway6: run-udp6
132b83a2f27Sbluhm	@echo Remove gateway route of a dynamic PMTU route
133b83a2f27Sbluhm	ssh ${REMOTE_SSH} ${SUDO} route -n delete -inet6 -host ${LOCAL_ADDR6}
134b83a2f27Sbluhm	ssh ${REMOTE_SSH} route -n get -inet6 -host ${FAKE_NET_ADDR6}\
135b83a2f27Sbluhm	    >pmtu.route
136b83a2f27Sbluhm	cat pmtu.route
137b83a2f27Sbluhm	grep -q 'gateway: ${LOCAL_ADDR6}' pmtu.route
138b83a2f27Sbluhm	grep -q 'flags: <UP,GATEWAY,HOST,DYNAMIC,DONE>' pmtu.route
139b83a2f27Sbluhm	${SUDO} ${PYTHON}udp_echo6.py
140b83a2f27Sbluhm
141f39ab060SbluhmREGRESS_TARGETS +=	run-tcpfrag6
142f39ab060Sbluhmrun-tcpfrag6: addr.py reset-route6
14393a55b4aSbluhm	@echo Send ICMP6 and try to trigger a short TCP segment
14493a55b4aSbluhm	${SUDO} ${PYTHON}tcp_atomicfrag6.py
145f39ab060SbluhmREGRESS_TARGETS +=	run-udpfrag6
146f39ab060Sbluhmrun-udpfrag6: addr.py reset-route6
14793a55b4aSbluhm	@echo Send ICMP6 and try to trigger an atomic UDP IPv6 fragment
14893a55b4aSbluhm	${SUDO} ${PYTHON}udp_atomicfrag6.py
14993a55b4aSbluhm
150b83a2f27SbluhmCLEANFILES +=		addr.py *.pyc *.log *.route
151b83a2f27Sbluhm
152f516a404Sbluhm.PHONY: check-setup check-setup-local check-setup-remote
153f516a404Sbluhm
154f516a404Sbluhm# Check wether the address, route and remote setup is correct
155f516a404Sbluhmcheck-setup: check-setup-local check-setup-remote
156f516a404Sbluhm
157f516a404Sbluhmcheck-setup-local:
158f516a404Sbluhm	@echo '\n======== $@ ========'
159f516a404Sbluhm	ping -n -c 1 ${LOCAL_ADDR}  # LOCAL_ADDR
160f516a404Sbluhm	route -n get -inet ${LOCAL_ADDR} | grep -q 'flags: .*LOCAL'  # LOCAL_ADDR
161f516a404Sbluhm	arp -na | grep -q '^${LOCAL_ADDR} * ${LOCAL_MAC} * ${LOCAL_IF} permanent'  # LOCAL_ADDR LOCAL_MAC LOCAL_IF
162f516a404Sbluhm	ping -n -c 1 ${REMOTE_ADDR}  # REMOTE_ADDR
163f516a404Sbluhm	route -n get -inet ${REMOTE_ADDR} | fgrep -q 'interface: ${LOCAL_IF}'  # REMOTE_ADDR LOCAL_IF
164f516a404Sbluhm	! ping -n -c 1 -w 1 ${FAKE_NET_ADDR}  # FAKE_NET_ADDR
165f516a404Sbluhm	route -n get -inet ${FAKE_NET_ADDR} | grep -q 'flags: .*BLACKHOLE'  # FAKE_NET_ADDR
166f516a404Sbluhm	route -n get -inet -net ${FAKE_NET} | grep -q 'flags: .*BLACKHOLE'  # FAKE_NET
167f516a404Sbluhm	ping6 -n -c 1 ${LOCAL_ADDR6}  # LOCAL_ADDR6
168f516a404Sbluhm	route -n get -inet6 ${LOCAL_ADDR6} | grep -q 'flags: .*LOCAL'  # LOCAL_ADDR6
169f516a404Sbluhm	ndp -na | grep -q '^${LOCAL_ADDR6} * ${LOCAL_MAC} * ${LOCAL_IF} permanent'  # LOCAL_ADDR6 LOCAL_MAC LOCAL_IF
170f516a404Sbluhm	ping6 -n -c 1 ${REMOTE_ADDR6}  # REMOTE_ADDR6
171f516a404Sbluhm	route -n get -inet6 ${REMOTE_ADDR6} | fgrep -q 'interface: ${LOCAL_IF}'  # REMOTE_ADDR6 LOCAL_IF
172f516a404Sbluhm	! ping -n -c 1 -w 1 ${FAKE_NET_ADDR6}  # FAKE_NET_ADDR6
173f516a404Sbluhm	route -n get -inet6 ${FAKE_NET_ADDR6} | grep -q 'flags: .*BLACKHOLE'  # FAKE_NET_ADDR6
174f516a404Sbluhm	route -n get -inet6 -net ${FAKE_NET6} | grep -q 'flags: .*BLACKHOLE'  # FAKE_NET6
175*d6623619Sbluhm	${SUDO} pfctl -sr | grep '^anchor "regress" all$$'
176*d6623619Sbluhm	${SUDO} pfctl -si | grep '^Status: Enabled '
177f516a404Sbluhm
178f516a404Sbluhmcheck-setup-remote:
179f516a404Sbluhm	@echo '\n======== $@ ========'
180f516a404Sbluhm	ssh ${REMOTE_SSH} ping -n -c 1 ${REMOTE_ADDR}  # REMOTE_ADDR
181f516a404Sbluhm	ssh ${REMOTE_SSH} route -n get -inet ${REMOTE_ADDR} | grep -q 'flags: .*LOCAL'  # REMOTE_ADDR
182f516a404Sbluhm	ssh ${REMOTE_SSH} arp -na | grep -q '^${REMOTE_ADDR} * ${REMOTE_MAC} * .* permanent'  # REMOTE_ADDR REMOTE_MAC
183f516a404Sbluhm	ssh ${REMOTE_SSH} ping -n -c 1 ${LOCAL_ADDR}  # LOCAL_ADDR
184f516a404Sbluhm.for ip in FAKE_NET FAKE_NET_ADDR
185f516a404Sbluhm	ssh ${REMOTE_SSH} route -n get -inet ${${ip}} | fgrep -q 'gateway: ${LOCAL_ADDR}'  # ${ip} LOCAL_ADDR
186f516a404Sbluhm.endfor
187f516a404Sbluhm	ssh ${REMOTE_SSH} ping6 -n -c 1 ${REMOTE_ADDR6}  # REMOTE_ADDR6
188f516a404Sbluhm	ssh ${REMOTE_SSH} route -n get -inet6 ${REMOTE_ADDR6} | grep -q 'flags: .*LOCAL'  # REMOTE_ADDR6
189f516a404Sbluhm	ssh ${REMOTE_SSH} ndp -na | grep -q '^${REMOTE_ADDR6} * ${REMOTE_MAC} * .* permanent'  # REMOTE_ADDR6 REMOTE_MAC
190f516a404Sbluhm	ssh ${REMOTE_SSH} ping6 -n -c 1 ${LOCAL_ADDR6}  # LOCAL_ADDR6
191f516a404Sbluhm.for ip in FAKE_NET6 FAKE_NET_ADDR6
192f516a404Sbluhm	ssh ${REMOTE_SSH} route -n get -inet6 ${${ip}} | fgrep -q 'gateway: ${LOCAL_ADDR6}'  # ${ip} LOCAL_ADDR6
193f516a404Sbluhm.endfor
194f516a404Sbluhm.for af in inet inet6
1955cbd8848Sbluhm	ssh ${REMOTE_SSH} netstat -na -f ${af} -p tcp | fgrep ' *.19 '
196f516a404Sbluhm.endfor
1975cbd8848Sbluhm	ssh ${REMOTE_SSH} netstat -na -f inet6 -p udp | fgrep ' *.7 '
198f516a404Sbluhm	ssh ${REMOTE_SSH} ${SUDO} pfctl -sr | grep '^anchor "regress" all$$'
199f516a404Sbluhm	ssh ${REMOTE_SSH} ${SUDO} pfctl -si | grep '^Status: Enabled '
200f516a404Sbluhm
201b83a2f27Sbluhm.include <bsd.regress.mk>
202