491 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4# +-------------------------+5# | H1 |6# | $h1 + |7# | 192.0.2.2/24 | |8# | 2001:db8:1::2/64 | |9# +-------------------|-----+10# |11# +-------------------|----------------------+12# | | R1 |13# | $rp11 + |14# | 192.0.2.1/24 |15# | 2001:db8:1::1/64 |16# | |17# | + $rp12 + $rp13 |18# | | 169.254.2.12/24 | 169.254.3.13/24 |19# | | fe80:2::12/64 | fe80:3::13/64 |20# +--|--------------------|------------------+21# | |22# +--|--------------------|------------------+23# | + $rp22 + $rp23 |24# | 169.254.2.22/24 169.254.3.23/24 |25# | fe80:2::22/64 fe80:3::23/64 |26# | |27# | $rp21 + |28# | 198.51.100.1/24 | |29# | 2001:db8:2::1/64 | R2 |30# +-------------------|----------------------+31# |32# +-------------------|-----+33# | | |34# | $h2 + |35# | 198.51.100.2/24 |36# | 2001:db8:2::2/64 H2 |37# +-------------------------+38 39ALL_TESTS="40 ping_ipv441 ping_ipv642 multipath_test43 multipath16_test44 nh_stats_test_v445 nh_stats_test_v646"47NUM_NETIFS=848source lib.sh49source router_mpath_nh_lib.sh50 51h1_create()52{53 vrf_create "vrf-h1"54 ip link set dev $h1 master vrf-h155 56 ip link set dev vrf-h1 up57 ip link set dev $h1 up58 59 ip address add 192.0.2.2/24 dev $h160 ip address add 2001:db8:1::2/64 dev $h161 62 ip route add 198.51.100.0/24 vrf vrf-h1 nexthop via 192.0.2.163 ip route add 2001:db8:2::/64 vrf vrf-h1 nexthop via 2001:db8:1::164}65 66h1_destroy()67{68 ip route del 2001:db8:2::/64 vrf vrf-h169 ip route del 198.51.100.0/24 vrf vrf-h170 71 ip address del 2001:db8:1::2/64 dev $h172 ip address del 192.0.2.2/24 dev $h173 74 ip link set dev $h1 down75 vrf_destroy "vrf-h1"76}77 78h2_create()79{80 vrf_create "vrf-h2"81 ip link set dev $h2 master vrf-h282 83 ip link set dev vrf-h2 up84 ip link set dev $h2 up85 86 ip address add 198.51.100.2/24 dev $h287 ip address add 2001:db8:2::2/64 dev $h288 89 ip route add 192.0.2.0/24 vrf vrf-h2 nexthop via 198.51.100.190 ip route add 2001:db8:1::/64 vrf vrf-h2 nexthop via 2001:db8:2::191}92 93h2_destroy()94{95 ip route del 2001:db8:1::/64 vrf vrf-h296 ip route del 192.0.2.0/24 vrf vrf-h297 98 ip address del 2001:db8:2::2/64 dev $h299 ip address del 198.51.100.2/24 dev $h2100 101 ip link set dev $h2 down102 vrf_destroy "vrf-h2"103}104 105router1_create()106{107 vrf_create "vrf-r1"108 ip link set dev $rp11 master vrf-r1109 ip link set dev $rp12 master vrf-r1110 ip link set dev $rp13 master vrf-r1111 112 ip link set dev vrf-r1 up113 ip link set dev $rp11 up114 ip link set dev $rp12 up115 ip link set dev $rp13 up116 117 ip address add 192.0.2.1/24 dev $rp11118 ip address add 2001:db8:1::1/64 dev $rp11119 120 ip address add 169.254.2.12/24 dev $rp12121 ip address add fe80:2::12/64 dev $rp12122 123 ip address add 169.254.3.13/24 dev $rp13124 ip address add fe80:3::13/64 dev $rp13125}126 127router1_destroy()128{129 ip route del 2001:db8:2::/64 vrf vrf-r1130 ip route del 198.51.100.0/24 vrf vrf-r1131 132 ip address del fe80:3::13/64 dev $rp13133 ip address del 169.254.3.13/24 dev $rp13134 135 ip address del fe80:2::12/64 dev $rp12136 ip address del 169.254.2.12/24 dev $rp12137 138 ip address del 2001:db8:1::1/64 dev $rp11139 ip address del 192.0.2.1/24 dev $rp11140 141 ip nexthop del id 103142 ip nexthop del id 101143 ip nexthop del id 102144 ip nexthop del id 106145 ip nexthop del id 104146 ip nexthop del id 105147 148 ip link set dev $rp13 down149 ip link set dev $rp12 down150 ip link set dev $rp11 down151 152 vrf_destroy "vrf-r1"153}154 155router2_create()156{157 vrf_create "vrf-r2"158 ip link set dev $rp21 master vrf-r2159 ip link set dev $rp22 master vrf-r2160 ip link set dev $rp23 master vrf-r2161 162 ip link set dev vrf-r2 up163 ip link set dev $rp21 up164 ip link set dev $rp22 up165 ip link set dev $rp23 up166 167 ip address add 198.51.100.1/24 dev $rp21168 ip address add 2001:db8:2::1/64 dev $rp21169 170 ip address add 169.254.2.22/24 dev $rp22171 ip address add fe80:2::22/64 dev $rp22172 173 ip address add 169.254.3.23/24 dev $rp23174 ip address add fe80:3::23/64 dev $rp23175}176 177router2_destroy()178{179 ip route del 2001:db8:1::/64 vrf vrf-r2180 ip route del 192.0.2.0/24 vrf vrf-r2181 182 ip address del fe80:3::23/64 dev $rp23183 ip address del 169.254.3.23/24 dev $rp23184 185 ip address del fe80:2::22/64 dev $rp22186 ip address del 169.254.2.22/24 dev $rp22187 188 ip address del 2001:db8:2::1/64 dev $rp21189 ip address del 198.51.100.1/24 dev $rp21190 191 ip nexthop del id 201192 ip nexthop del id 202193 ip nexthop del id 204194 ip nexthop del id 205195 196 ip link set dev $rp23 down197 ip link set dev $rp22 down198 ip link set dev $rp21 down199 200 vrf_destroy "vrf-r2"201}202 203routing_nh_obj()204{205 ip nexthop add id 101 via 169.254.2.22 dev $rp12206 ip nexthop add id 102 via 169.254.3.23 dev $rp13207 ip nexthop add id 103 group 101/102 type resilient buckets 512 \208 idle_timer 0209 ip route add 198.51.100.0/24 vrf vrf-r1 nhid 103210 211 ip nexthop add id 104 via fe80:2::22 dev $rp12212 ip nexthop add id 105 via fe80:3::23 dev $rp13213 ip nexthop add id 106 group 104/105 type resilient buckets 512 \214 idle_timer 0215 ip route add 2001:db8:2::/64 vrf vrf-r1 nhid 106216 217 ip nexthop add id 201 via 169.254.2.12 dev $rp22218 ip nexthop add id 202 via 169.254.3.13 dev $rp23219 ip nexthop add id 203 group 201/202 type resilient buckets 512 \220 idle_timer 0221 ip route add 192.0.2.0/24 vrf vrf-r2 nhid 203222 223 ip nexthop add id 204 via fe80:2::12 dev $rp22224 ip nexthop add id 205 via fe80:3::13 dev $rp23225 ip nexthop add id 206 group 204/205 type resilient buckets 512 \226 idle_timer 0227 ip route add 2001:db8:1::/64 vrf vrf-r2 nhid 206228}229 230multipath4_test()231{232 local desc=$1; shift233 local weight_rp12=$1; shift234 local weight_rp13=$1; shift235 local ports=${1-sp=1024,dp=0-32768}; shift236 237 local t0_rp12 t0_rp13 t1_rp12 t1_rp13238 local packets_rp12 packets_rp13239 240 # Transmit multiple flows from h1 to h2 and make sure they are241 # distributed between both multipath links (rp12 and rp13)242 # according to the provided weights.243 sysctl_set net.ipv4.fib_multipath_hash_policy 1244 245 t0_rp12=$(link_stats_tx_packets_get $rp12)246 t0_rp13=$(link_stats_tx_packets_get $rp13)247 248 ip vrf exec vrf-h1 $MZ $h1 -q -p 64 -A 192.0.2.2 -B 198.51.100.2 \249 -d $MZ_DELAY -t udp "$ports"250 sleep 1251 252 t1_rp12=$(link_stats_tx_packets_get $rp12)253 t1_rp13=$(link_stats_tx_packets_get $rp13)254 255 let "packets_rp12 = $t1_rp12 - $t0_rp12"256 let "packets_rp13 = $t1_rp13 - $t0_rp13"257 multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13258 259 # Restore settings.260 sysctl_restore net.ipv4.fib_multipath_hash_policy261}262 263multipath6_l4_test()264{265 local desc=$1; shift266 local weight_rp12=$1; shift267 local weight_rp13=$1; shift268 local ports=${1-sp=1024,dp=0-32768}; shift269 270 local t0_rp12 t0_rp13 t1_rp12 t1_rp13271 local packets_rp12 packets_rp13272 273 # Transmit multiple flows from h1 to h2 and make sure they are274 # distributed between both multipath links (rp12 and rp13)275 # according to the provided weights.276 sysctl_set net.ipv6.fib_multipath_hash_policy 1277 278 t0_rp12=$(link_stats_tx_packets_get $rp12)279 t0_rp13=$(link_stats_tx_packets_get $rp13)280 281 $MZ $h1 -6 -q -p 64 -A 2001:db8:1::2 -B 2001:db8:2::2 \282 -d $MZ_DELAY -t udp "$ports"283 sleep 1284 285 t1_rp12=$(link_stats_tx_packets_get $rp12)286 t1_rp13=$(link_stats_tx_packets_get $rp13)287 288 let "packets_rp12 = $t1_rp12 - $t0_rp12"289 let "packets_rp13 = $t1_rp13 - $t0_rp13"290 multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13291 292 sysctl_restore net.ipv6.fib_multipath_hash_policy293}294 295multipath_test()296{297 # Without an idle timer, weight replacement should happen immediately.298 log_info "Running multipath tests without an idle timer"299 ip nexthop replace id 103 group 101/102 type resilient idle_timer 0300 ip nexthop replace id 106 group 104/105 type resilient idle_timer 0301 302 log_info "Running IPv4 multipath tests"303 ip nexthop replace id 103 group 101,1/102,1 type resilient304 multipath4_test "ECMP" 1 1305 ip nexthop replace id 103 group 101,2/102,1 type resilient306 multipath4_test "Weighted MP 2:1" 2 1307 ip nexthop replace id 103 group 101,11/102,45 type resilient308 multipath4_test "Weighted MP 11:45" 11 45309 310 ip nexthop replace id 103 group 101,1/102,1 type resilient311 312 log_info "Running IPv6 L4 hash multipath tests"313 ip nexthop replace id 106 group 104,1/105,1 type resilient314 multipath6_l4_test "ECMP" 1 1315 ip nexthop replace id 106 group 104,2/105,1 type resilient316 multipath6_l4_test "Weighted MP 2:1" 2 1317 ip nexthop replace id 106 group 104,11/105,45 type resilient318 multipath6_l4_test "Weighted MP 11:45" 11 45319 320 ip nexthop replace id 106 group 104,1/105,1 type resilient321 322 # With an idle timer, weight replacement should not happen, so the323 # expected ratio should always be the initial one (1:1).324 log_info "Running multipath tests with an idle timer of 120 seconds"325 ip nexthop replace id 103 group 101/102 type resilient idle_timer 120326 ip nexthop replace id 106 group 104/105 type resilient idle_timer 120327 328 log_info "Running IPv4 multipath tests"329 ip nexthop replace id 103 group 101,1/102,1 type resilient330 multipath4_test "ECMP" 1 1331 ip nexthop replace id 103 group 101,2/102,1 type resilient332 multipath4_test "Weighted MP 2:1" 1 1333 ip nexthop replace id 103 group 101,11/102,45 type resilient334 multipath4_test "Weighted MP 11:45" 1 1335 336 ip nexthop replace id 103 group 101,1/102,1 type resilient337 338 log_info "Running IPv6 L4 hash multipath tests"339 ip nexthop replace id 106 group 104,1/105,1 type resilient340 multipath6_l4_test "ECMP" 1 1341 ip nexthop replace id 106 group 104,2/105,1 type resilient342 multipath6_l4_test "Weighted MP 2:1" 1 1343 ip nexthop replace id 106 group 104,11/105,45 type resilient344 multipath6_l4_test "Weighted MP 11:45" 1 1345 346 ip nexthop replace id 106 group 104,1/105,1 type resilient347 348 # With a short idle timer and enough idle time, weight replacement349 # should happen.350 log_info "Running multipath tests with an idle timer of 5 seconds"351 ip nexthop replace id 103 group 101/102 type resilient idle_timer 5352 ip nexthop replace id 106 group 104/105 type resilient idle_timer 5353 354 log_info "Running IPv4 multipath tests"355 sleep 10356 ip nexthop replace id 103 group 101,1/102,1 type resilient357 multipath4_test "ECMP" 1 1358 sleep 10359 ip nexthop replace id 103 group 101,2/102,1 type resilient360 multipath4_test "Weighted MP 2:1" 2 1361 sleep 10362 ip nexthop replace id 103 group 101,11/102,45 type resilient363 multipath4_test "Weighted MP 11:45" 11 45364 365 ip nexthop replace id 103 group 101,1/102,1 type resilient366 367 log_info "Running IPv6 L4 hash multipath tests"368 sleep 10369 ip nexthop replace id 106 group 104,1/105,1 type resilient370 multipath6_l4_test "ECMP" 1 1371 sleep 10372 ip nexthop replace id 106 group 104,2/105,1 type resilient373 multipath6_l4_test "Weighted MP 2:1" 2 1374 sleep 10375 ip nexthop replace id 106 group 104,11/105,45 type resilient376 multipath6_l4_test "Weighted MP 11:45" 11 45377 378 ip nexthop replace id 106 group 104,1/105,1 type resilient379}380 381multipath16_test()382{383 check_nhgw16 104 || return384 385 log_info "Running 16-bit IPv4 multipath tests"386 ip nexthop replace id 103 group 101/102 type resilient idle_timer 0387 388 ip nexthop replace id 103 group 101,65535/102,65535 type resilient389 multipath4_test "65535:65535" 65535 65535390 391 ip nexthop replace id 103 group 101,128/102,512 type resilient392 multipath4_test "128:512" 128 512393 394 ip nexthop replace id 103 group 101,255/102,65535 type resilient395 omit_on_slow \396 multipath4_test "255:65535" 255 65535 sp=1024-1026,dp=0-65535397 398 ip nexthop replace id 103 group 101,1/102,1 type resilient399 400 log_info "Running 16-bit IPv6 L4 hash multipath tests"401 ip nexthop replace id 106 group 104/105 type resilient idle_timer 0402 403 ip nexthop replace id 106 group 104,65535/105,65535 type resilient404 multipath6_l4_test "65535:65535" 65535 65535405 406 ip nexthop replace id 106 group 104,128/105,512 type resilient407 multipath6_l4_test "128:512" 128 512408 409 ip nexthop replace id 106 group 104,255/105,65535 type resilient410 omit_on_slow \411 multipath6_l4_test "255:65535" 255 65535 sp=1024-1026,dp=0-65535412 413 ip nexthop replace id 106 group 104,1/105,1 type resilient414}415 416nh_stats_test_v4()417{418 __nh_stats_test_v4 resilient419}420 421nh_stats_test_v6()422{423 __nh_stats_test_v6 resilient424}425 426setup_prepare()427{428 h1=${NETIFS[p1]}429 rp11=${NETIFS[p2]}430 431 rp12=${NETIFS[p3]}432 rp22=${NETIFS[p4]}433 434 rp13=${NETIFS[p5]}435 rp23=${NETIFS[p6]}436 437 rp21=${NETIFS[p7]}438 h2=${NETIFS[p8]}439 440 vrf_prepare441 442 h1_create443 h2_create444 445 router1_create446 router2_create447 448 forwarding_enable449}450 451cleanup()452{453 pre_cleanup454 455 forwarding_restore456 457 router2_destroy458 router1_destroy459 460 h2_destroy461 h1_destroy462 463 vrf_cleanup464}465 466ping_ipv4()467{468 ping_test $h1 198.51.100.2469}470 471ping_ipv6()472{473 ping6_test $h1 2001:db8:2::2474}475 476ip nexthop ls >/dev/null 2>&1477if [ $? -ne 0 ]; then478 echo "Nexthop objects not supported; skipping tests"479 exit $ksft_skip480fi481 482trap cleanup EXIT483 484setup_prepare485setup_wait486routing_nh_obj487 488tests_run489 490exit $EXIT_STATUS491