xref: /openbsd/regress/sys/net/mpath/Makefile (revision 6fe8d8b9)
1*6fe8d8b9Sbluhm#	$OpenBSD: Makefile,v 1.2 2024/04/19 22:20:36 bluhm Exp $
21342eebbSbluhm
31342eebbSbluhm# Copyright (c) 2024 Alexander Bluhm <bluhm@openbsd.org>
41342eebbSbluhm#
51342eebbSbluhm# Permission to use, copy, modify, and distribute this software for any
61342eebbSbluhm# purpose with or without fee is hereby granted, provided that the above
71342eebbSbluhm# copyright notice and this permission notice appear in all copies.
81342eebbSbluhm#
91342eebbSbluhm# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
101342eebbSbluhm# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
111342eebbSbluhm# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
121342eebbSbluhm# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
131342eebbSbluhm# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
141342eebbSbluhm# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
151342eebbSbluhm# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
161342eebbSbluhm
171342eebbSbluhm# Regression test for multipath routing.
181342eebbSbluhm
191342eebbSbluhm# Test that routes set with the -mpath flag distribute the traffic.
201342eebbSbluhm# Each route has a different gateway and the UDP packets have different
211342eebbSbluhm# source addresses.  The destination address is identical for all
221342eebbSbluhm# routes and packets.  Analyze the use counter in netstat -r output
231342eebbSbluhm# to check that multiple routes have been used.  Currently this works
241342eebbSbluhm# only for IPv4.  sysctl net.inet.ip.multipath and net.inet6.ip6.multipath
251342eebbSbluhm# are enabled before testing and reset afterwards.  All routes and
261342eebbSbluhm# interface addresses are created on loopback in a separate routing
271342eebbSbluhm# domain.
281342eebbSbluhm
291342eebbSbluhm# Set up loopback interface in a different routing domain.
301342eebbSbluhm# Create multipath routes on this loopback.
311342eebbSbluhm# Send a bunch of packets with multiple source IP to same destination.
321342eebbSbluhm# Count in netstart -r that most routes have been used.
331342eebbSbluhm
341342eebbSbluhm# This test uses routing domain and interface number 11.
351342eebbSbluhm# Adjust it here, if you want to use something else.
361342eebbSbluhmN1 =		11
371342eebbSbluhmNUMS =		${N1}
38*6fe8d8b9SbluhmIPS !=		jot 100 100
391342eebbSbluhm
401342eebbSbluhm# Traffic distribution has not been implemented for IPv6.
411342eebbSbluhmREGRESS_EXPECTED_FAILURES +=	run-netstat6
421342eebbSbluhm
431342eebbSbluhm.include <bsd.own.mk>
441342eebbSbluhm
451342eebbSbluhm.PHONY: busy-rdomains ifconfig unconfig pfctl
461342eebbSbluhm
471342eebbSbluhmREGRESS_SETUP_ONCE +=	busy-rdomains
481342eebbSbluhmbusy-rdomains:
491342eebbSbluhm	# Check if rdomains are busy.
501342eebbSbluhm.for n in ${NUMS}
511342eebbSbluhm	@if /sbin/ifconfig | grep -v '^lo$n:' | grep ' rdomain $n '; then\
521342eebbSbluhm	    echo routing domain $n is already used >&2; exit 1; fi
531342eebbSbluhm.endfor
541342eebbSbluhm
551342eebbSbluhmREGRESS_SETUP_ONCE +=	multipath
561342eebbSbluhmmultipath:
571342eebbSbluhm	${SUDO} /sbin/sysctl net.inet.ip.multipath=1
581342eebbSbluhm	${SUDO} /sbin/sysctl net.inet6.ip6.multipath=1
591342eebbSbluhm
601342eebbSbluhmREGRESS_CLEANUP +=	singlepath
611342eebbSbluhmsinglepath:
621342eebbSbluhm	${SUDO} /sbin/sysctl net.inet.ip.multipath=0
631342eebbSbluhm	${SUDO} /sbin/sysctl net.inet6.ip6.multipath=0
641342eebbSbluhm
651342eebbSbluhmREGRESS_SETUP_ONCE +=	ifconfig
661342eebbSbluhmifconfig: unconfig
671342eebbSbluhm	# Create and configure loopback interfaces.
681342eebbSbluhm.for n in ${NUMS}
691342eebbSbluhm	${SUDO} /sbin/ifconfig lo$n rdomain $n
701342eebbSbluhm	${SUDO} /sbin/ifconfig lo$n inet 10.0.0.1/8
711342eebbSbluhm	${SUDO} /sbin/ifconfig lo$n inet 10.0.0.$n alias
72*6fe8d8b9Sbluhm.for i in ${IPS}
731342eebbSbluhm	${SUDO} /sbin/ifconfig lo$n inet 10.0.$n.$i alias
741342eebbSbluhm	${SUDO} /sbin/route -n -T $n add -inet -blackhole -mpath -host \
751342eebbSbluhm	    10.$n.0.0 10.0.$n.$i
761342eebbSbluhm.endfor
771342eebbSbluhm	${SUDO} /sbin/ifconfig lo$n inet6 fc00::$n alias
78*6fe8d8b9Sbluhm.for i in ${IPS}
791342eebbSbluhm	${SUDO} /sbin/ifconfig lo$n inet6 fc00::$n:$i alias
801342eebbSbluhm	${SUDO} /sbin/route -n -T $n add -inet6 -blackhole -mpath -host \
811342eebbSbluhm	    fc00::$n:0:0 fc00::$n:$i
821342eebbSbluhm.endfor
831342eebbSbluhm	# Wait until IPv6 addresses are no longer tentative.
841342eebbSbluhm	for i in `jot 50`; do\
851342eebbSbluhm	    if ! /sbin/ifconfig lo$n | fgrep -q tentative; then\
861342eebbSbluhm		    break;\
871342eebbSbluhm	    fi;\
881342eebbSbluhm	    sleep .1;\
891342eebbSbluhm	done
901342eebbSbluhm	! /sbin/ifconfig lo${N1} | fgrep tentative
911342eebbSbluhm.endfor
921342eebbSbluhm
931342eebbSbluhmREGRESS_CLEANUP +=	unconfig
941342eebbSbluhmunconfig:
951342eebbSbluhm	# Destroy interfaces.
961342eebbSbluhm.for n in ${NUMS}
971342eebbSbluhm	-${SUDO} /sbin/ifconfig lo$n rdomain $n
98*6fe8d8b9Sbluhm.for i in ${IPS}
991342eebbSbluhm	-${SUDO} /sbin/route -n -T $n delete -inet6 -host \
1001342eebbSbluhm	    fc00::$n:0:0 fc00::$n:$i
1011342eebbSbluhm	-${SUDO} /sbin/route -n -T $n delete -inet -host \
1021342eebbSbluhm	    10.$n.0.0 10.0.$n.$i
1031342eebbSbluhm.endfor
1041342eebbSbluhm	-${SUDO} /sbin/ifconfig lo$n -inet -inet6
1051342eebbSbluhm	-${SUDO} /sbin/ifconfig lo$n destroy
1061342eebbSbluhm.endfor
1071342eebbSbluhm	rm -f stamp-ifconfig
1081342eebbSbluhm
1091342eebbSbluhmREGRESS_TARGETS +=	run-netcat
1101342eebbSbluhmrun-netcat netstat.log:
1111342eebbSbluhm	# count UDP IPv6 packets used with multipath routes
1121342eebbSbluhm	rm -f netstat.log
113*6fe8d8b9Sbluhm.for i in ${IPS}
1141342eebbSbluhm	/usr/bin/nc -4 -V${N1} -u -z -s10.0.${N1}.$i 10.${N1}.0.0 discard
1151342eebbSbluhm.endfor
1161342eebbSbluhm	/usr/bin/netstat -T${N1} -f inet -rn >netstat.log
1171342eebbSbluhm
1181342eebbSbluhmREGRESS_TARGETS +=	run-netstat
1191342eebbSbluhmrun-netstat: netstat.log
1201342eebbSbluhm	# check route distribution of IPv4 packets
1211342eebbSbluhm	awk 'BEGIN{ mpath = uses = used = maxuse = 0; }\
1221342eebbSbluhm	    /^10.${N1}.0.0 /{\
1231342eebbSbluhm		if ($$3 == "UGHSBP") mpath++;\
1241342eebbSbluhm		if ($$5 > 0) used++;\
1251342eebbSbluhm		if ($$5 > max) max = $$5;\
1261342eebbSbluhm		uses += $$5;\
1271342eebbSbluhm	    }\
1281342eebbSbluhm	    END{\
1291342eebbSbluhm		print "mpath "mpath", uses "uses", max "max", used "used;\
130*6fe8d8b9Sbluhm		if (mpath != 100) { print "not 100 mpath: " mpath; exit 1; }\
131*6fe8d8b9Sbluhm		if (uses != 100) { print "not 100 uses: " uses; exit 1; }\
132*6fe8d8b9Sbluhm		if (max > 30) { print "max more than 30: " max; exit 1; }\
133*6fe8d8b9Sbluhm		if (used < 50) { print "used less than 50: " used; exit 1; }\
1341342eebbSbluhm	    }' \
1351342eebbSbluhm	    netstat.log
1361342eebbSbluhm
1371342eebbSbluhmREGRESS_TARGETS +=	run-netcat6
1381342eebbSbluhmrun-netcat6 netstat6.log:
1391342eebbSbluhm	# count UDP IPv6 packets used with multipath routes
1401342eebbSbluhm	rm -f netstat6.log
141*6fe8d8b9Sbluhm.for i in ${IPS}
1421342eebbSbluhm	/usr/bin/nc -6 -V${N1} -u -z -sfc00::${N1}:$i fc00::${N1}:0:0 discard
1431342eebbSbluhm.endfor
1441342eebbSbluhm	/usr/bin/netstat -T${N1} -f inet6 -rn >netstat6.log
1451342eebbSbluhm
1461342eebbSbluhmREGRESS_TARGETS +=	run-netstat6
1471342eebbSbluhmrun-netstat6: netstat6.log
1481342eebbSbluhm	# check route distribution of IPv6 packets
1491342eebbSbluhm	awk 'BEGIN{ mpath = used = uses = max = 0; }\
1501342eebbSbluhm	    /^fc00::${N1}:0:0 /{\
1511342eebbSbluhm		if ($$3 == "UGHSBP") mpath++;\
1521342eebbSbluhm		if ($$5 > 0) used++;\
1531342eebbSbluhm		if ($$5 > max) max = $$5;\
1541342eebbSbluhm		uses += $$5;\
1551342eebbSbluhm	    }\
1561342eebbSbluhm	    END{\
1571342eebbSbluhm		print "mpath "mpath", uses "uses", max "max", used "used;\
158*6fe8d8b9Sbluhm		if (mpath != 100) { print "not 100 mpath: " mpath; exit 1; }\
159*6fe8d8b9Sbluhm		if (uses != 100) { print "not 100 uses: " uses; exit 1; }\
160*6fe8d8b9Sbluhm		if (max > 30) { print "max more than 30: " max; exit 1; }\
161*6fe8d8b9Sbluhm		if (used < 50) { print "used less than 50: " used; exit 1; }\
1621342eebbSbluhm	    }' \
1631342eebbSbluhm	    netstat6.log
1641342eebbSbluhm
1651342eebbSbluhmCLEANFILES +=	*.log stamp-*
1661342eebbSbluhm
1671342eebbSbluhm.include <bsd.regress.mk>
168