xref: /openbsd/regress/sys/net/loop/Makefile (revision 427e22f8)
1*427e22f8Santon#	$OpenBSD: Makefile,v 1.11 2023/10/19 18:36:40 anton Exp $
23effdb81Sbluhm
320b3c463Sbluhm# Copyright (c) 2017-2020 Alexander Bluhm <bluhm@openbsd.org>
43effdb81Sbluhm#
53effdb81Sbluhm# Permission to use, copy, modify, and distribute this software for any
63effdb81Sbluhm# purpose with or without fee is hereby granted, provided that the above
73effdb81Sbluhm# copyright notice and this permission notice appear in all copies.
83effdb81Sbluhm#
93effdb81Sbluhm# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
103effdb81Sbluhm# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
113effdb81Sbluhm# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
123effdb81Sbluhm# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
133effdb81Sbluhm# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
143effdb81Sbluhm# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
153effdb81Sbluhm# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
163effdb81Sbluhm
173effdb81Sbluhm# Set up two loopback interfaces in different routing domains.
183effdb81Sbluhm# Try to ping existing and non existing addresses in these domains.
1990f50367Sbluhm# Also test pinging to different rdomains via pf.  Check that the
2090f50367Sbluhm# ttl is decremented while looping though loopback interfaces.
213effdb81Sbluhm
22e2c14723Sbluhm# This test uses routing domain and interface number 11 and 12.
23125b8ed2Sbluhm# Adjust it here, if you want to use something else.
24125b8ed2SbluhmN1 =		11
25125b8ed2SbluhmN2 =		12
26125b8ed2SbluhmNUMS =		${N1} ${N2}
27125b8ed2Sbluhm
28125b8ed2Sbluhm.include <bsd.own.mk>
29125b8ed2Sbluhm
30de963903Sbluhm.if ! (make(clean) || make(cleandir) || make(obj))
313effdb81Sbluhm
3220b3c463SbluhmSYSCTL_FORWARDING !=	sysctl net.inet.ip.forwarding
333effdb81Sbluhm.if ${SYSCTL_FORWARDING:C/.*=//} != 1
343effdb81Sbluhmregress:
3520b3c463Sbluhm	@echo sysctl: "${SYSCTL_FORWARDING}"
3620b3c463Sbluhm	@echo Set sysctl to 1 to run this regress.
373effdb81Sbluhm	@echo SKIPPED
383effdb81Sbluhm.endif
393effdb81Sbluhm
403a262c66SbluhmPF_STATUS !=	${SUDO} /sbin/pfctl -si | sed -n 's/^Status: \([^ ]*\) .*/\1/p'
4120b3c463Sbluhm.if empty(PF_STATUS:MEnabled)
42125b8ed2Sbluhmregress:
4320b3c463Sbluhm	@echo pf status: "${PF_STATUS}"
4420b3c463Sbluhm	@echo Enable pf to run this regress.
4520b3c463Sbluhm	@echo SKIPPED
4620b3c463Sbluhm.endif
4720b3c463Sbluhm
484be5cdd0SantonPF_SKIP !=	${SUDO} /sbin/pfctl -sI -v | sed -n 's/ (skip)//p' | \
494be5cdd0Santon		grep -w -e lo${N1} -e lo${N2} || :
504be5cdd0Santon.if ! empty(PF_SKIP)
5120b3c463Sbluhmregress:
5220b3c463Sbluhm	@echo pf skip: "${PF_SKIP}"
53125b8ed2Sbluhm	@echo Do not set skip on interface lo, lo${N1}, or lo${N2}.
54125b8ed2Sbluhm	@echo SKIPPED
55125b8ed2Sbluhm.endif
5620b3c463Sbluhm
573a262c66SbluhmPF_ANCHOR !=	${SUDO} /sbin/pfctl -sr |\
583a262c66Sbluhm		    sed -n 's/^anchor "\([^"]*\)" all$$/\1/p'
5920b3c463Sbluhm.if empty(PF_ANCHOR:Mregress)
6020b3c463Sbluhmregress:
6120b3c463Sbluhm	@echo pf anchor: "${PF_ANCHOR}"
6220b3c463Sbluhm	@echo Need anchor '"regress"' in pf.conf to load additional rules.
6320b3c463Sbluhm	@echo SKIPPED
6420b3c463Sbluhm.endif
6520b3c463Sbluhm
66de963903Sbluhm.endif
673effdb81Sbluhm
68ae9fff4eSbluhm.PHONY: busy-rdomains ifconfig unconfig pfctl
693effdb81Sbluhm
70ae9fff4eSbluhmREGRESS_SETUP_ONCE +=	busy-rdomains
71ca7f5f6fSbluhmbusy-rdomains:
72ae9fff4eSbluhm	# Check if rdomains are busy.
733effdb81Sbluhm.for n in ${NUMS}
74ae9fff4eSbluhm	@if /sbin/ifconfig | grep -v '^lo$n:' | grep ' rdomain $n '; then\
75ae9fff4eSbluhm	    echo routing domain $n is already used >&2; exit 1; fi
763effdb81Sbluhm.endfor
773effdb81Sbluhm
78ae9fff4eSbluhmREGRESS_SETUP_ONCE +=	ifconfig
79ca7f5f6fSbluhmifconfig: unconfig
80ae9fff4eSbluhm	# Create and configure loopback interfaces.
813effdb81Sbluhm.for n in ${NUMS}
823a262c66Sbluhm	${SUDO} /sbin/ifconfig lo$n rdomain $n
833a262c66Sbluhm	${SUDO} /sbin/ifconfig lo$n inet 127.0.0.1/8
843a262c66Sbluhm	${SUDO} /sbin/ifconfig lo$n inet 127.0.0.$n alias
853a262c66Sbluhm	${SUDO} /sbin/route -n -T $n add -inet -host 10.6.6.6 127.0.0.1
863a262c66Sbluhm	${SUDO} /sbin/route -n -T $n add -inet -host 10.7.7.7 127.0.0.1
873effdb81Sbluhm.endfor
883a262c66Sbluhm	${SUDO} /sbin/route -n -T ${N1} add -inet -host 127.0.0.${N2} 127.0.0.1
893a262c66Sbluhm	${SUDO} /sbin/route -n -T ${N2} add -inet -host 127.0.0.${N1} 127.0.0.1
903a262c66Sbluhm	# Wait until IPv6 addresses are no longer tentative.
913a262c66Sbluhm	for i in `jot 50`; do\
923a262c66Sbluhm	    if ! { /sbin/ifconfig lo${N1}; /sbin/ifconfig lo${N2}; }\
933a262c66Sbluhm		| fgrep -q tentative; then\
943a262c66Sbluhm		    break;\
953a262c66Sbluhm	    fi;\
963a262c66Sbluhm	    sleep .1;\
973a262c66Sbluhm	done
983a262c66Sbluhm	! { /sbin/ifconfig lo${N1}; /sbin/ifconfig lo${N2}; }\
993a262c66Sbluhm	    | fgrep tentative
1003effdb81Sbluhm
101ae9fff4eSbluhmREGRESS_CLEANUP +=	unconfig
102ae9fff4eSbluhmunconfig: stamp-stop
103ae9fff4eSbluhm	# Destroy interfaces.
1043effdb81Sbluhm.for n in ${NUMS}
1053a262c66Sbluhm	-${SUDO} /sbin/ifconfig lo$n rdomain $n
1063a262c66Sbluhm	-${SUDO} /sbin/ifconfig lo$n inet 127.0.0.1 delete
1073a262c66Sbluhm	-${SUDO} /sbin/ifconfig lo$n inet 127.0.0.$n delete
108*427e22f8Santon	-${SUDO} /sbin/ifconfig lo$n destroy
1093effdb81Sbluhm.endfor
110ae9fff4eSbluhm	rm -f stamp-ifconfig
1113effdb81Sbluhm
1123effdb81Sbluhmaddr.py: Makefile
113ae9fff4eSbluhm	# Create python include file containing the addresses.
1143effdb81Sbluhm	rm -f $@ $@.tmp
1153effdb81Sbluhm.for var in N1 N2
1163effdb81Sbluhm	echo '${var}="${${var}}"' >>$@.tmp
11790f50367Sbluhm	echo 'IF_${var}="lo${${var}}"' >>$@.tmp
1183effdb81Sbluhm	echo 'ADDR_${var}="127.0.0.${${var}}"' >>$@.tmp
1193effdb81Sbluhm.endfor
1203effdb81Sbluhm	mv $@.tmp $@
1213effdb81Sbluhm
122ae9fff4eSbluhmREGRESS_SETUP_ONCE +=	pfctl
123ae9fff4eSbluhmpfctl: addr.py pf.conf
1243effdb81Sbluhm	# Load the pf rules into the kernel.
125125b8ed2Sbluhm	cat addr.py ${.CURDIR}/pf.conf | /sbin/pfctl -n -f -
1263a262c66Sbluhm	cat addr.py ${.CURDIR}/pf.conf | ${SUDO} /sbin/pfctl -a regress -f -
1273effdb81Sbluhm
12890f50367Sbluhm# run tcpdump on lo devices
129125b8ed2SbluhmDUMPCMD =	/usr/sbin/tcpdump -l -e -vvv -s 2048 -ni
13090f50367Sbluhm
13190f50367Sbluhmstamp-bpf: stamp-bpf-${N1} stamp-bpf-${N2}
13290f50367Sbluhm	sleep 2  # XXX
13390f50367Sbluhm	@date >$@
13490f50367Sbluhm
13590f50367Sbluhm.for n in ${N1} ${N2}
13690f50367Sbluhm
137ae9fff4eSbluhmstamp-bpf-$n: stamp-ifconfig
138ae9fff4eSbluhm	rm -f lo$n.tcpdump
139ae9fff4eSbluhm	${SUDO} pkill -f '^${DUMPCMD} lo$n' || true
140ae9fff4eSbluhm	${SUDO} ${DUMPCMD} lo$n >lo$n.tcpdump &
14190f50367Sbluhm	rm -f stamp-stop
14290f50367Sbluhm	@date >$@
14390f50367Sbluhm
14490f50367Sbluhm.endfor
14590f50367Sbluhm
14690f50367Sbluhmstamp-stop:
14790f50367Sbluhm	sleep 2  # XXX
14890f50367Sbluhm	-${SUDO} pkill -f '^${DUMPCMD}'
14990f50367Sbluhm	rm -f stamp-bpf*
15090f50367Sbluhm	@date >$@
15190f50367Sbluhm
1523effdb81Sbluhm.for n in ${N1} ${N2}
1533effdb81Sbluhm
154ae9fff4eSbluhmREGRESS_TARGETS +=	run-ping-local-$n
155ae9fff4eSbluhmrun-ping-local-$n: stamp-bpf
156ae9fff4eSbluhm	# Ping localhost in routing domain $n.
157ae9fff4eSbluhm	/sbin/ping -n -w 1 -c 1 -V $n 127.0.0.1
1583effdb81Sbluhm
159ae9fff4eSbluhmREGRESS_TARGETS +=	run-ping-loop-$n
160ae9fff4eSbluhmrun-ping-loop-$n: stamp-bpf
161ae9fff4eSbluhm	# Ping non existing address with loopback route in routing domain $n.
162ae9fff4eSbluhm	! /sbin/ping -n -w 1 -c 1 -V $n 10.6.6.6
1633effdb81Sbluhm
164ae9fff4eSbluhmREGRESS_TARGETS +=	run-ping-address-$n
165ae9fff4eSbluhmrun-ping-address-$n:
166ae9fff4eSbluhm	# Ping local address in routing domain $n.
167ae9fff4eSbluhm	/sbin/ping -n -w 1 -c 1 -V $n 127.0.0.$n
1683effdb81Sbluhm
1693effdb81Sbluhm.endfor
1703effdb81Sbluhm
171ae9fff4eSbluhmREGRESS_TARGETS +=	run-ping-rdomain-pass
172ae9fff4eSbluhmrun-ping-rdomain-pass:
1733effdb81Sbluhm	# Pass ping packets between routing domains with pf rule.
1743effdb81Sbluhm	/sbin/ping -n -w 1 -c 1 -V ${N1} 127.0.0.${N2}
1753effdb81Sbluhm
176ae9fff4eSbluhmREGRESS_TARGETS +=	run-ping-rdomain-block
177ae9fff4eSbluhmrun-ping-rdomain-block:
1783effdb81Sbluhm	# Check that reverse direction without pf rule is not allowed.
1793effdb81Sbluhm	! /sbin/ping -n -w 1 -c 1 -V ${N2} 127.0.0.${N1}
1803effdb81Sbluhm
181ae9fff4eSbluhmREGRESS_TARGETS +=	run-ping-rdomain-loop
182ae9fff4eSbluhmrun-ping-rdomain-loop: stamp-bpf
18390f50367Sbluhm	# Ping non existing address and loop between routing domains.
18490f50367Sbluhm	! /sbin/ping -n -w 1 -c 1 -V ${N1} 10.7.7.7
18590f50367Sbluhm
18690f50367Sbluhm.for n in ${N1} ${N2}
18790f50367Sbluhm
188ae9fff4eSbluhmREGRESS_TARGETS +=	run-bpf-local-$n
189ae9fff4eSbluhmrun-bpf-local-$n: stamp-stop
19090f50367Sbluhm	# Check that the ping packet went through loopback.
191ae9fff4eSbluhm	grep '127.0.0.1 > 127.0.0.1: icmp: echo request' lo$n.tcpdump
19290f50367Sbluhm
193ae9fff4eSbluhmREGRESS_TARGETS +=	run-bpf-loop-$n
194ae9fff4eSbluhmrun-bpf-loop-$n: stamp-stop
19590f50367Sbluhm	# Check that the ping packet went multiple times through loopback.
19690f50367Sbluhm	grep '[0-9] 127.0.0.1 > 10.6.6.6: icmp: echo request .*ttl 255,' \
197ae9fff4eSbluhm	    lo$n.tcpdump
19890f50367Sbluhm	grep '[0-9] 127.0.0.1 > 10.6.6.6: icmp: echo request .* \[ttl 1\]' \
199ae9fff4eSbluhm	    lo$n.tcpdump
20090f50367Sbluhm
20190f50367Sbluhm.endfor
20290f50367Sbluhm
203ae9fff4eSbluhmREGRESS_TARGETS +=	run-bpf-rdomain-loop-${N1}
204ae9fff4eSbluhmrun-bpf-rdomain-loop-${N1}: stamp-stop
20590f50367Sbluhm	# Check the ping packet went multiple times in routing domains.
20690f50367Sbluhm	grep '[0-9] 127.0.0.1 > 10.7.7.7: icmp: echo request .*ttl 255,' \
20790f50367Sbluhm	    lo${N1}.tcpdump
20890f50367Sbluhm	! grep '[0-9] 127.0.0.1 > 10.7.7.7: icmp: echo request .*ttl 254,' \
20990f50367Sbluhm	    lo${N1}.tcpdump
21090f50367Sbluhm	grep '[0-9] 127.0.0.1 > 10.7.7.7: icmp: echo request .* \[ttl 1\]' \
21190f50367Sbluhm	    lo${N1}.tcpdump
21290f50367Sbluhm
213ae9fff4eSbluhmREGRESS_TARGETS +=	run-bpf-rdomain-loop-${N2}
214ae9fff4eSbluhmrun-bpf-rdomain-loop-${N2}: stamp-stop
21590f50367Sbluhm	# Check the ping packet went multiple times in routing domains.
21690f50367Sbluhm	grep '[0-9] 127.0.0.1 > 10.7.7.7: icmp: echo request .*ttl 254,' \
21790f50367Sbluhm	    lo${N2}.tcpdump
21890f50367Sbluhm	grep '[0-9] 127.0.0.1 > 10.7.7.7: icmp: echo request .*ttl 2,' \
21990f50367Sbluhm	    lo${N2}.tcpdump
22090f50367Sbluhm	! grep '[0-9] 127.0.0.1 > 10.7.7.7: icmp: echo request .* \[ttl 1\]' \
22190f50367Sbluhm	    lo${N2}.tcpdump
22290f50367Sbluhm
22390f50367SbluhmCLEANFILES +=	addr.py *.pyc *.tcpdump *.log stamp-*
2243effdb81Sbluhm
2253effdb81Sbluhm.include <bsd.regress.mk>
226