1937eeb34SIdo Schimmel#!/bin/bash 2937eeb34SIdo Schimmel# SPDX-License-Identifier: GPL-2.0 3937eeb34SIdo Schimmel 40eb8053cSIdo SchimmelALL_TESTS="ping_ipv4 ping_ipv6 multipath_test" 5937eeb34SIdo SchimmelNUM_NETIFS=8 6937eeb34SIdo Schimmelsource lib.sh 7937eeb34SIdo Schimmel 8937eeb34SIdo Schimmelh1_create() 9937eeb34SIdo Schimmel{ 10937eeb34SIdo Schimmel vrf_create "vrf-h1" 11937eeb34SIdo Schimmel ip link set dev $h1 master vrf-h1 12937eeb34SIdo Schimmel 13937eeb34SIdo Schimmel ip link set dev vrf-h1 up 14937eeb34SIdo Schimmel ip link set dev $h1 up 15937eeb34SIdo Schimmel 16937eeb34SIdo Schimmel ip address add 192.0.2.2/24 dev $h1 17937eeb34SIdo Schimmel ip address add 2001:db8:1::2/64 dev $h1 18937eeb34SIdo Schimmel 19937eeb34SIdo Schimmel ip route add 198.51.100.0/24 vrf vrf-h1 nexthop via 192.0.2.1 20937eeb34SIdo Schimmel ip route add 2001:db8:2::/64 vrf vrf-h1 nexthop via 2001:db8:1::1 21937eeb34SIdo Schimmel} 22937eeb34SIdo Schimmel 23937eeb34SIdo Schimmelh1_destroy() 24937eeb34SIdo Schimmel{ 25937eeb34SIdo Schimmel ip route del 2001:db8:2::/64 vrf vrf-h1 26937eeb34SIdo Schimmel ip route del 198.51.100.0/24 vrf vrf-h1 27937eeb34SIdo Schimmel 28937eeb34SIdo Schimmel ip address del 2001:db8:1::2/64 dev $h1 29937eeb34SIdo Schimmel ip address del 192.0.2.2/24 dev $h1 30937eeb34SIdo Schimmel 31937eeb34SIdo Schimmel ip link set dev $h1 down 32937eeb34SIdo Schimmel vrf_destroy "vrf-h1" 33937eeb34SIdo Schimmel} 34937eeb34SIdo Schimmel 35937eeb34SIdo Schimmelh2_create() 36937eeb34SIdo Schimmel{ 37937eeb34SIdo Schimmel vrf_create "vrf-h2" 38937eeb34SIdo Schimmel ip link set dev $h2 master vrf-h2 39937eeb34SIdo Schimmel 40937eeb34SIdo Schimmel ip link set dev vrf-h2 up 41937eeb34SIdo Schimmel ip link set dev $h2 up 42937eeb34SIdo Schimmel 43937eeb34SIdo Schimmel ip address add 198.51.100.2/24 dev $h2 44937eeb34SIdo Schimmel ip address add 2001:db8:2::2/64 dev $h2 45937eeb34SIdo Schimmel 46937eeb34SIdo Schimmel ip route add 192.0.2.0/24 vrf vrf-h2 nexthop via 198.51.100.1 47937eeb34SIdo Schimmel ip route add 2001:db8:1::/64 vrf vrf-h2 nexthop via 2001:db8:2::1 48937eeb34SIdo Schimmel} 49937eeb34SIdo Schimmel 50937eeb34SIdo Schimmelh2_destroy() 51937eeb34SIdo Schimmel{ 52937eeb34SIdo Schimmel ip route del 2001:db8:1::/64 vrf vrf-h2 53937eeb34SIdo Schimmel ip route del 192.0.2.0/24 vrf vrf-h2 54937eeb34SIdo Schimmel 55937eeb34SIdo Schimmel ip address del 2001:db8:2::2/64 dev $h2 56937eeb34SIdo Schimmel ip address del 198.51.100.2/24 dev $h2 57937eeb34SIdo Schimmel 58937eeb34SIdo Schimmel ip link set dev $h2 down 59937eeb34SIdo Schimmel vrf_destroy "vrf-h2" 60937eeb34SIdo Schimmel} 61937eeb34SIdo Schimmel 62937eeb34SIdo Schimmelrouter1_create() 63937eeb34SIdo Schimmel{ 64937eeb34SIdo Schimmel vrf_create "vrf-r1" 65937eeb34SIdo Schimmel ip link set dev $rp11 master vrf-r1 66937eeb34SIdo Schimmel ip link set dev $rp12 master vrf-r1 67937eeb34SIdo Schimmel ip link set dev $rp13 master vrf-r1 68937eeb34SIdo Schimmel 69937eeb34SIdo Schimmel ip link set dev vrf-r1 up 70937eeb34SIdo Schimmel ip link set dev $rp11 up 71937eeb34SIdo Schimmel ip link set dev $rp12 up 72937eeb34SIdo Schimmel ip link set dev $rp13 up 73937eeb34SIdo Schimmel 74937eeb34SIdo Schimmel ip address add 192.0.2.1/24 dev $rp11 75937eeb34SIdo Schimmel ip address add 2001:db8:1::1/64 dev $rp11 76937eeb34SIdo Schimmel 77937eeb34SIdo Schimmel ip address add 169.254.2.12/24 dev $rp12 78937eeb34SIdo Schimmel ip address add fe80:2::12/64 dev $rp12 79937eeb34SIdo Schimmel 80937eeb34SIdo Schimmel ip address add 169.254.3.13/24 dev $rp13 81937eeb34SIdo Schimmel ip address add fe80:3::13/64 dev $rp13 82937eeb34SIdo Schimmel 83937eeb34SIdo Schimmel ip route add 198.51.100.0/24 vrf vrf-r1 \ 84937eeb34SIdo Schimmel nexthop via 169.254.2.22 dev $rp12 \ 85937eeb34SIdo Schimmel nexthop via 169.254.3.23 dev $rp13 86937eeb34SIdo Schimmel ip route add 2001:db8:2::/64 vrf vrf-r1 \ 87937eeb34SIdo Schimmel nexthop via fe80:2::22 dev $rp12 \ 88937eeb34SIdo Schimmel nexthop via fe80:3::23 dev $rp13 89937eeb34SIdo Schimmel} 90937eeb34SIdo Schimmel 91937eeb34SIdo Schimmelrouter1_destroy() 92937eeb34SIdo Schimmel{ 93937eeb34SIdo Schimmel ip route del 2001:db8:2::/64 vrf vrf-r1 94937eeb34SIdo Schimmel ip route del 198.51.100.0/24 vrf vrf-r1 95937eeb34SIdo Schimmel 96937eeb34SIdo Schimmel ip address del fe80:3::13/64 dev $rp13 97937eeb34SIdo Schimmel ip address del 169.254.3.13/24 dev $rp13 98937eeb34SIdo Schimmel 99937eeb34SIdo Schimmel ip address del fe80:2::12/64 dev $rp12 100937eeb34SIdo Schimmel ip address del 169.254.2.12/24 dev $rp12 101937eeb34SIdo Schimmel 102937eeb34SIdo Schimmel ip address del 2001:db8:1::1/64 dev $rp11 103937eeb34SIdo Schimmel ip address del 192.0.2.1/24 dev $rp11 104937eeb34SIdo Schimmel 105937eeb34SIdo Schimmel ip link set dev $rp13 down 106937eeb34SIdo Schimmel ip link set dev $rp12 down 107937eeb34SIdo Schimmel ip link set dev $rp11 down 108937eeb34SIdo Schimmel 109937eeb34SIdo Schimmel vrf_destroy "vrf-r1" 110937eeb34SIdo Schimmel} 111937eeb34SIdo Schimmel 112937eeb34SIdo Schimmelrouter2_create() 113937eeb34SIdo Schimmel{ 114937eeb34SIdo Schimmel vrf_create "vrf-r2" 115937eeb34SIdo Schimmel ip link set dev $rp21 master vrf-r2 116937eeb34SIdo Schimmel ip link set dev $rp22 master vrf-r2 117937eeb34SIdo Schimmel ip link set dev $rp23 master vrf-r2 118937eeb34SIdo Schimmel 119937eeb34SIdo Schimmel ip link set dev vrf-r2 up 120937eeb34SIdo Schimmel ip link set dev $rp21 up 121937eeb34SIdo Schimmel ip link set dev $rp22 up 122937eeb34SIdo Schimmel ip link set dev $rp23 up 123937eeb34SIdo Schimmel 124937eeb34SIdo Schimmel ip address add 198.51.100.1/24 dev $rp21 125937eeb34SIdo Schimmel ip address add 2001:db8:2::1/64 dev $rp21 126937eeb34SIdo Schimmel 127937eeb34SIdo Schimmel ip address add 169.254.2.22/24 dev $rp22 128937eeb34SIdo Schimmel ip address add fe80:2::22/64 dev $rp22 129937eeb34SIdo Schimmel 130937eeb34SIdo Schimmel ip address add 169.254.3.23/24 dev $rp23 131937eeb34SIdo Schimmel ip address add fe80:3::23/64 dev $rp23 132937eeb34SIdo Schimmel 133937eeb34SIdo Schimmel ip route add 192.0.2.0/24 vrf vrf-r2 \ 134937eeb34SIdo Schimmel nexthop via 169.254.2.12 dev $rp22 \ 135937eeb34SIdo Schimmel nexthop via 169.254.3.13 dev $rp23 136937eeb34SIdo Schimmel ip route add 2001:db8:1::/64 vrf vrf-r2 \ 137937eeb34SIdo Schimmel nexthop via fe80:2::12 dev $rp22 \ 138937eeb34SIdo Schimmel nexthop via fe80:3::13 dev $rp23 139937eeb34SIdo Schimmel} 140937eeb34SIdo Schimmel 141937eeb34SIdo Schimmelrouter2_destroy() 142937eeb34SIdo Schimmel{ 143937eeb34SIdo Schimmel ip route del 2001:db8:1::/64 vrf vrf-r2 144937eeb34SIdo Schimmel ip route del 192.0.2.0/24 vrf vrf-r2 145937eeb34SIdo Schimmel 146937eeb34SIdo Schimmel ip address del fe80:3::23/64 dev $rp23 147937eeb34SIdo Schimmel ip address del 169.254.3.23/24 dev $rp23 148937eeb34SIdo Schimmel 149937eeb34SIdo Schimmel ip address del fe80:2::22/64 dev $rp22 150937eeb34SIdo Schimmel ip address del 169.254.2.22/24 dev $rp22 151937eeb34SIdo Schimmel 152937eeb34SIdo Schimmel ip address del 2001:db8:2::1/64 dev $rp21 153937eeb34SIdo Schimmel ip address del 198.51.100.1/24 dev $rp21 154937eeb34SIdo Schimmel 155937eeb34SIdo Schimmel ip link set dev $rp23 down 156937eeb34SIdo Schimmel ip link set dev $rp22 down 157937eeb34SIdo Schimmel ip link set dev $rp21 down 158937eeb34SIdo Schimmel 159937eeb34SIdo Schimmel vrf_destroy "vrf-r2" 160937eeb34SIdo Schimmel} 161937eeb34SIdo Schimmel 1623d578d87SIdo Schimmelmultipath4_test() 1633d578d87SIdo Schimmel{ 16436b4c0adSDavid Ahern local desc="$1" 16536b4c0adSDavid Ahern local weight_rp12=$2 16636b4c0adSDavid Ahern local weight_rp13=$3 1673d578d87SIdo Schimmel local t0_rp12 t0_rp13 t1_rp12 t1_rp13 1683d578d87SIdo Schimmel local packets_rp12 packets_rp13 1693d578d87SIdo Schimmel 1703d578d87SIdo Schimmel # Transmit multiple flows from h1 to h2 and make sure they are 1713d578d87SIdo Schimmel # distributed between both multipath links (rp12 and rp13) 1723d578d87SIdo Schimmel # according to the configured weights. 173d51d10aaSPetr Machata sysctl_set net.ipv4.fib_multipath_hash_policy 1 1743d578d87SIdo Schimmel ip route replace 198.51.100.0/24 vrf vrf-r1 \ 1753d578d87SIdo Schimmel nexthop via 169.254.2.22 dev $rp12 weight $weight_rp12 \ 1763d578d87SIdo Schimmel nexthop via 169.254.3.23 dev $rp13 weight $weight_rp13 1773d578d87SIdo Schimmel 1783d578d87SIdo Schimmel t0_rp12=$(link_stats_tx_packets_get $rp12) 1793d578d87SIdo Schimmel t0_rp13=$(link_stats_tx_packets_get $rp13) 1803d578d87SIdo Schimmel 181*11df27f7SDanielle Ratson ip vrf exec vrf-h1 $MZ $h1 -q -p 64 -A 192.0.2.2 -B 198.51.100.2 \ 1823d578d87SIdo Schimmel -d 1msec -t udp "sp=1024,dp=0-32768" 1833d578d87SIdo Schimmel 1843d578d87SIdo Schimmel t1_rp12=$(link_stats_tx_packets_get $rp12) 1853d578d87SIdo Schimmel t1_rp13=$(link_stats_tx_packets_get $rp13) 1863d578d87SIdo Schimmel 1873d578d87SIdo Schimmel let "packets_rp12 = $t1_rp12 - $t0_rp12" 1883d578d87SIdo Schimmel let "packets_rp13 = $t1_rp13 - $t0_rp13" 18936b4c0adSDavid Ahern multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13 1903d578d87SIdo Schimmel 1913d578d87SIdo Schimmel # Restore settings. 1923d578d87SIdo Schimmel ip route replace 198.51.100.0/24 vrf vrf-r1 \ 1933d578d87SIdo Schimmel nexthop via 169.254.2.22 dev $rp12 \ 1943d578d87SIdo Schimmel nexthop via 169.254.3.23 dev $rp13 195d51d10aaSPetr Machata sysctl_restore net.ipv4.fib_multipath_hash_policy 1963d578d87SIdo Schimmel} 1973d578d87SIdo Schimmel 19891a5c1ecSDavid Ahernmultipath6_l4_test() 19991a5c1ecSDavid Ahern{ 20091a5c1ecSDavid Ahern local desc="$1" 20191a5c1ecSDavid Ahern local weight_rp12=$2 20291a5c1ecSDavid Ahern local weight_rp13=$3 20391a5c1ecSDavid Ahern local t0_rp12 t0_rp13 t1_rp12 t1_rp13 20491a5c1ecSDavid Ahern local packets_rp12 packets_rp13 20591a5c1ecSDavid Ahern 20691a5c1ecSDavid Ahern # Transmit multiple flows from h1 to h2 and make sure they are 20791a5c1ecSDavid Ahern # distributed between both multipath links (rp12 and rp13) 20891a5c1ecSDavid Ahern # according to the configured weights. 209d51d10aaSPetr Machata sysctl_set net.ipv6.fib_multipath_hash_policy 1 21091a5c1ecSDavid Ahern 21191a5c1ecSDavid Ahern ip route replace 2001:db8:2::/64 vrf vrf-r1 \ 21291a5c1ecSDavid Ahern nexthop via fe80:2::22 dev $rp12 weight $weight_rp12 \ 21391a5c1ecSDavid Ahern nexthop via fe80:3::23 dev $rp13 weight $weight_rp13 21491a5c1ecSDavid Ahern 21591a5c1ecSDavid Ahern t0_rp12=$(link_stats_tx_packets_get $rp12) 21691a5c1ecSDavid Ahern t0_rp13=$(link_stats_tx_packets_get $rp13) 21791a5c1ecSDavid Ahern 21891a5c1ecSDavid Ahern $MZ $h1 -6 -q -p 64 -A 2001:db8:1::2 -B 2001:db8:2::2 \ 21991a5c1ecSDavid Ahern -d 1msec -t udp "sp=1024,dp=0-32768" 22091a5c1ecSDavid Ahern 22191a5c1ecSDavid Ahern t1_rp12=$(link_stats_tx_packets_get $rp12) 22291a5c1ecSDavid Ahern t1_rp13=$(link_stats_tx_packets_get $rp13) 22391a5c1ecSDavid Ahern 22491a5c1ecSDavid Ahern let "packets_rp12 = $t1_rp12 - $t0_rp12" 22591a5c1ecSDavid Ahern let "packets_rp13 = $t1_rp13 - $t0_rp13" 22691a5c1ecSDavid Ahern multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13 22791a5c1ecSDavid Ahern 22891a5c1ecSDavid Ahern ip route replace 2001:db8:2::/64 vrf vrf-r1 \ 22991a5c1ecSDavid Ahern nexthop via fe80:2::22 dev $rp12 \ 23091a5c1ecSDavid Ahern nexthop via fe80:3::23 dev $rp13 23191a5c1ecSDavid Ahern 232d51d10aaSPetr Machata sysctl_restore net.ipv6.fib_multipath_hash_policy 23391a5c1ecSDavid Ahern} 23491a5c1ecSDavid Ahern 2354fb20ae1SIdo Schimmelmultipath6_test() 2364fb20ae1SIdo Schimmel{ 23736b4c0adSDavid Ahern local desc="$1" 23836b4c0adSDavid Ahern local weight_rp12=$2 23936b4c0adSDavid Ahern local weight_rp13=$3 2404fb20ae1SIdo Schimmel local t0_rp12 t0_rp13 t1_rp12 t1_rp13 2414fb20ae1SIdo Schimmel local packets_rp12 packets_rp13 2424fb20ae1SIdo Schimmel 2434fb20ae1SIdo Schimmel ip route replace 2001:db8:2::/64 vrf vrf-r1 \ 2444fb20ae1SIdo Schimmel nexthop via fe80:2::22 dev $rp12 weight $weight_rp12 \ 2454fb20ae1SIdo Schimmel nexthop via fe80:3::23 dev $rp13 weight $weight_rp13 2464fb20ae1SIdo Schimmel 2474fb20ae1SIdo Schimmel t0_rp12=$(link_stats_tx_packets_get $rp12) 2484fb20ae1SIdo Schimmel t0_rp13=$(link_stats_tx_packets_get $rp13) 2494fb20ae1SIdo Schimmel 2504fb20ae1SIdo Schimmel # Generate 16384 echo requests, each with a random flow label. 2514fb20ae1SIdo Schimmel for _ in $(seq 1 16384); do 252993d337cSDavid Ahern ip vrf exec vrf-h1 $PING6 2001:db8:2::2 -F 0 -c 1 -q &> /dev/null 2534fb20ae1SIdo Schimmel done 2544fb20ae1SIdo Schimmel 2554fb20ae1SIdo Schimmel t1_rp12=$(link_stats_tx_packets_get $rp12) 2564fb20ae1SIdo Schimmel t1_rp13=$(link_stats_tx_packets_get $rp13) 2574fb20ae1SIdo Schimmel 2584fb20ae1SIdo Schimmel let "packets_rp12 = $t1_rp12 - $t0_rp12" 2594fb20ae1SIdo Schimmel let "packets_rp13 = $t1_rp13 - $t0_rp13" 26036b4c0adSDavid Ahern multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13 2614fb20ae1SIdo Schimmel 2624fb20ae1SIdo Schimmel ip route replace 2001:db8:2::/64 vrf vrf-r1 \ 2634fb20ae1SIdo Schimmel nexthop via fe80:2::22 dev $rp12 \ 2644fb20ae1SIdo Schimmel nexthop via fe80:3::23 dev $rp13 2654fb20ae1SIdo Schimmel} 2664fb20ae1SIdo Schimmel 2673d578d87SIdo Schimmelmultipath_test() 2683d578d87SIdo Schimmel{ 2693d578d87SIdo Schimmel log_info "Running IPv4 multipath tests" 27036b4c0adSDavid Ahern multipath4_test "ECMP" 1 1 27136b4c0adSDavid Ahern multipath4_test "Weighted MP 2:1" 2 1 27236b4c0adSDavid Ahern multipath4_test "Weighted MP 11:45" 11 45 2734fb20ae1SIdo Schimmel 2744fb20ae1SIdo Schimmel log_info "Running IPv6 multipath tests" 27536b4c0adSDavid Ahern multipath6_test "ECMP" 1 1 27636b4c0adSDavid Ahern multipath6_test "Weighted MP 2:1" 2 1 27736b4c0adSDavid Ahern multipath6_test "Weighted MP 11:45" 11 45 27891a5c1ecSDavid Ahern 27991a5c1ecSDavid Ahern log_info "Running IPv6 L4 hash multipath tests" 28091a5c1ecSDavid Ahern multipath6_l4_test "ECMP" 1 1 28191a5c1ecSDavid Ahern multipath6_l4_test "Weighted MP 2:1" 2 1 28291a5c1ecSDavid Ahern multipath6_l4_test "Weighted MP 11:45" 11 45 2833d578d87SIdo Schimmel} 2843d578d87SIdo Schimmel 285937eeb34SIdo Schimmelsetup_prepare() 286937eeb34SIdo Schimmel{ 287937eeb34SIdo Schimmel h1=${NETIFS[p1]} 288937eeb34SIdo Schimmel rp11=${NETIFS[p2]} 289937eeb34SIdo Schimmel 290937eeb34SIdo Schimmel rp12=${NETIFS[p3]} 291937eeb34SIdo Schimmel rp22=${NETIFS[p4]} 292937eeb34SIdo Schimmel 293937eeb34SIdo Schimmel rp13=${NETIFS[p5]} 294937eeb34SIdo Schimmel rp23=${NETIFS[p6]} 295937eeb34SIdo Schimmel 296937eeb34SIdo Schimmel rp21=${NETIFS[p7]} 297937eeb34SIdo Schimmel h2=${NETIFS[p8]} 298937eeb34SIdo Schimmel 299937eeb34SIdo Schimmel vrf_prepare 300937eeb34SIdo Schimmel 301937eeb34SIdo Schimmel h1_create 302937eeb34SIdo Schimmel h2_create 303937eeb34SIdo Schimmel 304937eeb34SIdo Schimmel router1_create 305937eeb34SIdo Schimmel router2_create 306937eeb34SIdo Schimmel 307937eeb34SIdo Schimmel forwarding_enable 308937eeb34SIdo Schimmel} 309937eeb34SIdo Schimmel 310937eeb34SIdo Schimmelcleanup() 311937eeb34SIdo Schimmel{ 312937eeb34SIdo Schimmel pre_cleanup 313937eeb34SIdo Schimmel 314937eeb34SIdo Schimmel forwarding_restore 315937eeb34SIdo Schimmel 316937eeb34SIdo Schimmel router2_destroy 317937eeb34SIdo Schimmel router1_destroy 318937eeb34SIdo Schimmel 319937eeb34SIdo Schimmel h2_destroy 320937eeb34SIdo Schimmel h1_destroy 321937eeb34SIdo Schimmel 322937eeb34SIdo Schimmel vrf_cleanup 323937eeb34SIdo Schimmel} 324937eeb34SIdo Schimmel 3250eb8053cSIdo Schimmelping_ipv4() 3260eb8053cSIdo Schimmel{ 3270eb8053cSIdo Schimmel ping_test $h1 198.51.100.2 3280eb8053cSIdo Schimmel} 3290eb8053cSIdo Schimmel 3300eb8053cSIdo Schimmelping_ipv6() 3310eb8053cSIdo Schimmel{ 3320eb8053cSIdo Schimmel ping6_test $h1 2001:db8:2::2 3330eb8053cSIdo Schimmel} 3340eb8053cSIdo Schimmel 335937eeb34SIdo Schimmeltrap cleanup EXIT 336937eeb34SIdo Schimmel 337937eeb34SIdo Schimmelsetup_prepare 338937eeb34SIdo Schimmelsetup_wait 339937eeb34SIdo Schimmel 3400eb8053cSIdo Schimmeltests_run 341937eeb34SIdo Schimmel 342937eeb34SIdo Schimmelexit $EXIT_STATUS 343