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