465 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 ping_ipv4_blackhole45 ping_ipv6_blackhole46 nh_stats_test_v447 nh_stats_test_v648"49NUM_NETIFS=850source lib.sh51source router_mpath_nh_lib.sh52 53h1_create()54{55 vrf_create "vrf-h1"56 ip link set dev $h1 master vrf-h157 58 ip link set dev vrf-h1 up59 ip link set dev $h1 up60 61 ip address add 192.0.2.2/24 dev $h162 ip address add 2001:db8:1::2/64 dev $h163 64 ip route add 198.51.100.0/24 vrf vrf-h1 nexthop via 192.0.2.165 ip route add 2001:db8:2::/64 vrf vrf-h1 nexthop via 2001:db8:1::166}67 68h1_destroy()69{70 ip route del 2001:db8:2::/64 vrf vrf-h171 ip route del 198.51.100.0/24 vrf vrf-h172 73 ip address del 2001:db8:1::2/64 dev $h174 ip address del 192.0.2.2/24 dev $h175 76 ip link set dev $h1 down77 vrf_destroy "vrf-h1"78}79 80h2_create()81{82 vrf_create "vrf-h2"83 ip link set dev $h2 master vrf-h284 85 ip link set dev vrf-h2 up86 ip link set dev $h2 up87 88 ip address add 198.51.100.2/24 dev $h289 ip address add 2001:db8:2::2/64 dev $h290 91 ip route add 192.0.2.0/24 vrf vrf-h2 nexthop via 198.51.100.192 ip route add 2001:db8:1::/64 vrf vrf-h2 nexthop via 2001:db8:2::193}94 95h2_destroy()96{97 ip route del 2001:db8:1::/64 vrf vrf-h298 ip route del 192.0.2.0/24 vrf vrf-h299 100 ip address del 2001:db8:2::2/64 dev $h2101 ip address del 198.51.100.2/24 dev $h2102 103 ip link set dev $h2 down104 vrf_destroy "vrf-h2"105}106 107router1_create()108{109 vrf_create "vrf-r1"110 ip link set dev $rp11 master vrf-r1111 ip link set dev $rp12 master vrf-r1112 ip link set dev $rp13 master vrf-r1113 114 ip link set dev vrf-r1 up115 ip link set dev $rp11 up116 ip link set dev $rp12 up117 ip link set dev $rp13 up118 119 ip address add 192.0.2.1/24 dev $rp11120 ip address add 2001:db8:1::1/64 dev $rp11121 122 ip address add 169.254.2.12/24 dev $rp12123 ip address add fe80:2::12/64 dev $rp12124 125 ip address add 169.254.3.13/24 dev $rp13126 ip address add fe80:3::13/64 dev $rp13127}128 129router1_destroy()130{131 ip route del 2001:db8:2::/64 vrf vrf-r1132 ip route del 198.51.100.0/24 vrf vrf-r1133 134 ip address del fe80:3::13/64 dev $rp13135 ip address del 169.254.3.13/24 dev $rp13136 137 ip address del fe80:2::12/64 dev $rp12138 ip address del 169.254.2.12/24 dev $rp12139 140 ip address del 2001:db8:1::1/64 dev $rp11141 ip address del 192.0.2.1/24 dev $rp11142 143 ip nexthop del id 103144 ip nexthop del id 101145 ip nexthop del id 102146 ip nexthop del id 106147 ip nexthop del id 104148 ip nexthop del id 105149 150 ip link set dev $rp13 down151 ip link set dev $rp12 down152 ip link set dev $rp11 down153 154 vrf_destroy "vrf-r1"155}156 157router2_create()158{159 vrf_create "vrf-r2"160 ip link set dev $rp21 master vrf-r2161 ip link set dev $rp22 master vrf-r2162 ip link set dev $rp23 master vrf-r2163 164 ip link set dev vrf-r2 up165 ip link set dev $rp21 up166 ip link set dev $rp22 up167 ip link set dev $rp23 up168 169 ip address add 198.51.100.1/24 dev $rp21170 ip address add 2001:db8:2::1/64 dev $rp21171 172 ip address add 169.254.2.22/24 dev $rp22173 ip address add fe80:2::22/64 dev $rp22174 175 ip address add 169.254.3.23/24 dev $rp23176 ip address add fe80:3::23/64 dev $rp23177}178 179router2_destroy()180{181 ip route del 2001:db8:1::/64 vrf vrf-r2182 ip route del 192.0.2.0/24 vrf vrf-r2183 184 ip address del fe80:3::23/64 dev $rp23185 ip address del 169.254.3.23/24 dev $rp23186 187 ip address del fe80:2::22/64 dev $rp22188 ip address del 169.254.2.22/24 dev $rp22189 190 ip address del 2001:db8:2::1/64 dev $rp21191 ip address del 198.51.100.1/24 dev $rp21192 193 ip nexthop del id 201194 ip nexthop del id 202195 ip nexthop del id 204196 ip nexthop del id 205197 198 ip link set dev $rp23 down199 ip link set dev $rp22 down200 ip link set dev $rp21 down201 202 vrf_destroy "vrf-r2"203}204 205routing_nh_obj()206{207 ip nexthop add id 101 via 169.254.2.22 dev $rp12208 ip nexthop add id 102 via 169.254.3.23 dev $rp13209 ip nexthop add id 103 group 101/102210 ip route add 198.51.100.0/24 vrf vrf-r1 nhid 103211 212 ip nexthop add id 104 via fe80:2::22 dev $rp12213 ip nexthop add id 105 via fe80:3::23 dev $rp13214 ip nexthop add id 106 group 104/105215 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/202220 ip route add 192.0.2.0/24 vrf vrf-r2 nhid 203221 222 ip nexthop add id 204 via fe80:2::12 dev $rp22223 ip nexthop add id 205 via fe80:3::13 dev $rp23224 ip nexthop add id 206 group 204/205225 ip route add 2001:db8:1::/64 vrf vrf-r2 nhid 206226}227 228multipath4_test()229{230 local desc=$1; shift231 local weight_rp12=$1; shift232 local weight_rp13=$1; shift233 local ports=${1-sp=1024,dp=0-32768}; shift234 235 local t0_rp12 t0_rp13 t1_rp12 t1_rp13236 local packets_rp12 packets_rp13237 238 # Transmit multiple flows from h1 to h2 and make sure they are239 # distributed between both multipath links (rp12 and rp13)240 # according to the configured weights.241 sysctl_set net.ipv4.fib_multipath_hash_policy 1242 ip nexthop replace id 103 group 101,$weight_rp12/102,$weight_rp13243 244 t0_rp12=$(link_stats_tx_packets_get $rp12)245 t0_rp13=$(link_stats_tx_packets_get $rp13)246 247 ip vrf exec vrf-h1 $MZ $h1 -q -p 64 -A 192.0.2.2 -B 198.51.100.2 \248 -d $MZ_DELAY -t udp "$ports"249 sleep 1250 251 t1_rp12=$(link_stats_tx_packets_get $rp12)252 t1_rp13=$(link_stats_tx_packets_get $rp13)253 254 let "packets_rp12 = $t1_rp12 - $t0_rp12"255 let "packets_rp13 = $t1_rp13 - $t0_rp13"256 multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13257 258 # Restore settings.259 ip nexthop replace id 103 group 101/102260 sysctl_restore net.ipv4.fib_multipath_hash_policy261}262 263multipath6_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 configured weights.276 sysctl_set net.ipv6.fib_multipath_hash_policy 1277 278 ip nexthop replace id 106 group 104,$weight_rp12/105,$weight_rp13279 280 t0_rp12=$(link_stats_tx_packets_get $rp12)281 t0_rp13=$(link_stats_tx_packets_get $rp13)282 283 $MZ $h1 -6 -q -p 64 -A 2001:db8:1::2 -B 2001:db8:2::2 \284 -d $MZ_DELAY -t udp "$ports"285 sleep 1286 287 t1_rp12=$(link_stats_tx_packets_get $rp12)288 t1_rp13=$(link_stats_tx_packets_get $rp13)289 290 let "packets_rp12 = $t1_rp12 - $t0_rp12"291 let "packets_rp13 = $t1_rp13 - $t0_rp13"292 multipath_eval "$desc" $weight_rp12 $weight_rp13 $packets_rp12 $packets_rp13293 294 ip nexthop replace id 106 group 104/105295 296 sysctl_restore net.ipv6.fib_multipath_hash_policy297}298 299multipath_test()300{301 log_info "Running IPv4 multipath tests"302 multipath4_test "ECMP" 1 1303 multipath4_test "Weighted MP 2:1" 2 1304 multipath4_test "Weighted MP 11:45" 11 45305 306 log_info "Running IPv4 multipath tests with IPv6 link-local nexthops"307 ip nexthop replace id 101 via fe80:2::22 dev $rp12308 ip nexthop replace id 102 via fe80:3::23 dev $rp13309 310 multipath4_test "ECMP" 1 1311 multipath4_test "Weighted MP 2:1" 2 1312 multipath4_test "Weighted MP 11:45" 11 45313 314 ip nexthop replace id 102 via 169.254.3.23 dev $rp13315 ip nexthop replace id 101 via 169.254.2.22 dev $rp12316 317 log_info "Running IPv6 multipath tests"318 multipath6_test "ECMP" 1 1319 multipath6_test "Weighted MP 2:1" 2 1320 multipath6_test "Weighted MP 11:45" 11 45321}322 323multipath16_test()324{325 check_nhgw16 104 || return326 327 log_info "Running 16-bit IPv4 multipath tests"328 multipath4_test "65535:65535" 65535 65535329 multipath4_test "128:512" 128 512330 omit_on_slow \331 multipath4_test "255:65535" 255 65535 sp=1024-1026,dp=0-65535332 333 log_info "Running 16-bit IPv6 multipath tests"334 multipath6_test "65535:65535" 65535 65535335 multipath6_test "128:512" 128 512336 omit_on_slow \337 multipath6_test "255:65535" 255 65535 sp=1024-1026,dp=0-65535338}339 340ping_ipv4_blackhole()341{342 RET=0343 344 ip nexthop add id 1001 blackhole345 ip nexthop add id 1002 group 1001346 347 ip route replace 198.51.100.0/24 vrf vrf-r1 nhid 1001348 ping_do $h1 198.51.100.2349 check_fail $? "ping did not fail when using a blackhole nexthop"350 351 ip route replace 198.51.100.0/24 vrf vrf-r1 nhid 1002352 ping_do $h1 198.51.100.2353 check_fail $? "ping did not fail when using a blackhole nexthop group"354 355 ip route replace 198.51.100.0/24 vrf vrf-r1 nhid 103356 ping_do $h1 198.51.100.2357 check_err $? "ping failed with a valid nexthop"358 359 log_test "IPv4 blackhole ping"360 361 ip nexthop del id 1002362 ip nexthop del id 1001363}364 365ping_ipv6_blackhole()366{367 RET=0368 369 ip -6 nexthop add id 1001 blackhole370 ip nexthop add id 1002 group 1001371 372 ip route replace 2001:db8:2::/64 vrf vrf-r1 nhid 1001373 ping6_do $h1 2001:db8:2::2374 check_fail $? "ping did not fail when using a blackhole nexthop"375 376 ip route replace 2001:db8:2::/64 vrf vrf-r1 nhid 1002377 ping6_do $h1 2001:db8:2::2378 check_fail $? "ping did not fail when using a blackhole nexthop group"379 380 ip route replace 2001:db8:2::/64 vrf vrf-r1 nhid 106381 ping6_do $h1 2001:db8:2::2382 check_err $? "ping failed with a valid nexthop"383 384 log_test "IPv6 blackhole ping"385 386 ip nexthop del id 1002387 ip -6 nexthop del id 1001388}389 390nh_stats_test_v4()391{392 __nh_stats_test_v4 mpath393}394 395nh_stats_test_v6()396{397 __nh_stats_test_v6 mpath398}399 400setup_prepare()401{402 h1=${NETIFS[p1]}403 rp11=${NETIFS[p2]}404 405 rp12=${NETIFS[p3]}406 rp22=${NETIFS[p4]}407 408 rp13=${NETIFS[p5]}409 rp23=${NETIFS[p6]}410 411 rp21=${NETIFS[p7]}412 h2=${NETIFS[p8]}413 414 vrf_prepare415 416 h1_create417 h2_create418 419 router1_create420 router2_create421 422 forwarding_enable423}424 425cleanup()426{427 pre_cleanup428 429 forwarding_restore430 431 router2_destroy432 router1_destroy433 434 h2_destroy435 h1_destroy436 437 vrf_cleanup438}439 440ping_ipv4()441{442 ping_test $h1 198.51.100.2443}444 445ping_ipv6()446{447 ping6_test $h1 2001:db8:2::2448}449 450ip nexthop ls >/dev/null 2>&1451if [ $? -ne 0 ]; then452 echo "Nexthop objects not supported; skipping tests"453 exit $ksft_skip454fi455 456trap cleanup EXIT457 458setup_prepare459setup_wait460routing_nh_obj461 462tests_run463 464exit $EXIT_STATUS465