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