1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 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_ipv4 41 ping_ipv6 42 multipath_test 43 multipath16_test 44 ping_ipv4_blackhole 45 ping_ipv6_blackhole 46 nh_stats_test_v4 47 nh_stats_test_v6 48" 49NUM_NETIFS=8 50source lib.sh 51source router_mpath_nh_lib.sh 52 53h1_create() 54{ 55 vrf_create "vrf-h1" 56 ip link set dev $h1 master vrf-h1 57 58 ip link set dev vrf-h1 up 59 ip link set dev $h1 up 60 61 ip address add 192.0.2.2/24 dev $h1 62 ip address add 2001:db8:1::2/64 dev $h1 63 64 ip route add 198.51.100.0/24 vrf vrf-h1 nexthop via 192.0.2.1 65 ip route add 2001:db8:2::/64 vrf vrf-h1 nexthop via 2001:db8:1::1 66} 67 68h1_destroy() 69{ 70 ip route del 2001:db8:2::/64 vrf vrf-h1 71 ip route del 198.51.100.0/24 vrf vrf-h1 72 73 ip address del 2001:db8:1::2/64 dev $h1 74 ip address del 192.0.2.2/24 dev $h1 75 76 ip link set dev $h1 down 77 vrf_destroy "vrf-h1" 78} 79 80h2_create() 81{ 82 vrf_create "vrf-h2" 83 ip link set dev $h2 master vrf-h2 84 85 ip link set dev vrf-h2 up 86 ip link set dev $h2 up 87 88 ip address add 198.51.100.2/24 dev $h2 89 ip address add 2001:db8:2::2/64 dev $h2 90 91 ip route add 192.0.2.0/24 vrf vrf-h2 nexthop via 198.51.100.1 92 ip route add 2001:db8:1::/64 vrf vrf-h2 nexthop via 2001:db8:2::1 93} 94 95h2_destroy() 96{ 97 ip route del 2001:db8:1::/64 vrf vrf-h2 98 ip route del 192.0.2.0/24 vrf vrf-h2 99 100 ip address del 2001:db8:2::2/64 dev $h2 101 ip address del 198.51.100.2/24 dev $h2 102 103 ip link set dev $h2 down 104 vrf_destroy "vrf-h2" 105} 106 107router1_create() 108{ 109 vrf_create "vrf-r1" 110 ip link set dev $rp11 master vrf-r1 111 ip link set dev $rp12 master vrf-r1 112 ip link set dev $rp13 master vrf-r1 113 114 ip link set dev vrf-r1 up 115 ip link set dev $rp11 up 116 ip link set dev $rp12 up 117 ip link set dev $rp13 up 118 119 ip address add 192.0.2.1/24 dev $rp11 120 ip address add 2001:db8:1::1/64 dev $rp11 121 122 ip address add 169.254.2.12/24 dev $rp12 123 ip address add fe80:2::12/64 dev $rp12 124 125 ip address add 169.254.3.13/24 dev $rp13 126 ip address add fe80:3::13/64 dev $rp13 127} 128 129router1_destroy() 130{ 131 ip route del 2001:db8:2::/64 vrf vrf-r1 132 ip route del 198.51.100.0/24 vrf vrf-r1 133 134 ip address del fe80:3::13/64 dev $rp13 135 ip address del 169.254.3.13/24 dev $rp13 136 137 ip address del fe80:2::12/64 dev $rp12 138 ip address del 169.254.2.12/24 dev $rp12 139 140 ip address del 2001:db8:1::1/64 dev $rp11 141 ip address del 192.0.2.1/24 dev $rp11 142 143 ip nexthop del id 103 144 ip nexthop del id 101 145 ip nexthop del id 102 146 ip nexthop del id 106 147 ip nexthop del id 104 148 ip nexthop del id 105 149 150 ip link set dev $rp13 down 151 ip link set dev $rp12 down 152 ip link set dev $rp11 down 153 154 vrf_destroy "vrf-r1" 155} 156 157router2_create() 158{ 159 vrf_create "vrf-r2" 160 ip link set dev $rp21 master vrf-r2 161 ip link set dev $rp22 master vrf-r2 162 ip link set dev $rp23 master vrf-r2 163 164 ip link set dev vrf-r2 up 165 ip link set dev $rp21 up 166 ip link set dev $rp22 up 167 ip link set dev $rp23 up 168 169 ip address add 198.51.100.1/24 dev $rp21 170 ip address add 2001:db8:2::1/64 dev $rp21 171 172 ip address add 169.254.2.22/24 dev $rp22 173 ip address add fe80:2::22/64 dev $rp22 174 175 ip address add 169.254.3.23/24 dev $rp23 176 ip address add fe80:3::23/64 dev $rp23 177} 178 179router2_destroy() 180{ 181 ip route del 2001:db8:1::/64 vrf vrf-r2 182 ip route del 192.0.2.0/24 vrf vrf-r2 183 184 ip address del fe80:3::23/64 dev $rp23 185 ip address del 169.254.3.23/24 dev $rp23 186 187 ip address del fe80:2::22/64 dev $rp22 188 ip address del 169.254.2.22/24 dev $rp22 189 190 ip address del 2001:db8:2::1/64 dev $rp21 191 ip address del 198.51.100.1/24 dev $rp21 192 193 ip nexthop del id 201 194 ip nexthop del id 202 195 ip nexthop del id 204 196 ip nexthop del id 205 197 198 ip link set dev $rp23 down 199 ip link set dev $rp22 down 200 ip link set dev $rp21 down 201 202 vrf_destroy "vrf-r2" 203} 204 205routing_nh_obj() 206{ 207 ip nexthop add id 101 via 169.254.2.22 dev $rp12 208 ip nexthop add id 102 via 169.254.3.23 dev $rp13 209 ip nexthop add id 103 group 101/102 210 ip route add 198.51.100.0/24 vrf vrf-r1 nhid 103 211 212 ip nexthop add id 104 via fe80:2::22 dev $rp12 213 ip nexthop add id 105 via fe80:3::23 dev $rp13 214 ip nexthop add id 106 group 104/105 215 ip route add 2001:db8:2::/64 vrf vrf-r1 nhid 106 216 217 ip nexthop add id 201 via 169.254.2.12 dev $rp22 218 ip nexthop add id 202 via 169.254.3.13 dev $rp23 219 ip nexthop add id 203 group 201/202 220 ip route add 192.0.2.0/24 vrf vrf-r2 nhid 203 221 222 ip nexthop add id 204 via fe80:2::12 dev $rp22 223 ip nexthop add id 205 via fe80:3::13 dev $rp23 224 ip nexthop add id 206 group 204/205 225 ip route add 2001:db8:1::/64 vrf vrf-r2 nhid 206 226} 227 228multipath4_test() 229{ 230 local desc=$1; shift 231 local weight_rp12=$1; shift 232 local weight_rp13=$1; shift 233 local ports=${1-sp=1024,dp=0-32768}; shift 234 235 local t0_rp12 t0_rp13 t1_rp12 t1_rp13 236 local packets_rp12 packets_rp13 237 238 # Transmit multiple flows from h1 to h2 and make sure they are 239 # distributed between both multipath links (rp12 and rp13) 240 # according to the configured weights. 241 sysctl_set net.ipv4.fib_multipath_hash_policy 1 242 ip nexthop replace id 103 group 101,$weight_rp12/102,$weight_rp13 243 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 1 250 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_rp13 257 258 # Restore settings. 259 ip nexthop replace id 103 group 101/102 260 sysctl_restore net.ipv4.fib_multipath_hash_policy 261} 262 263multipath6_test() 264{ 265 local desc=$1; shift 266 local weight_rp12=$1; shift 267 local weight_rp13=$1; shift 268 local ports=${1-sp=1024,dp=0-32768}; shift 269 270 local t0_rp12 t0_rp13 t1_rp12 t1_rp13 271 local packets_rp12 packets_rp13 272 273 # Transmit multiple flows from h1 to h2 and make sure they are 274 # distributed between both multipath links (rp12 and rp13) 275 # according to the configured weights. 276 sysctl_set net.ipv6.fib_multipath_hash_policy 1 277 278 ip nexthop replace id 106 group 104,$weight_rp12/105,$weight_rp13 279 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 1 286 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_rp13 293 294 ip nexthop replace id 106 group 104/105 295 296 sysctl_restore net.ipv6.fib_multipath_hash_policy 297} 298 299multipath_test() 300{ 301 log_info "Running IPv4 multipath tests" 302 multipath4_test "ECMP" 1 1 303 multipath4_test "Weighted MP 2:1" 2 1 304 multipath4_test "Weighted MP 11:45" 11 45 305 306 log_info "Running IPv4 multipath tests with IPv6 link-local nexthops" 307 ip nexthop replace id 101 via fe80:2::22 dev $rp12 308 ip nexthop replace id 102 via fe80:3::23 dev $rp13 309 310 multipath4_test "ECMP" 1 1 311 multipath4_test "Weighted MP 2:1" 2 1 312 multipath4_test "Weighted MP 11:45" 11 45 313 314 ip nexthop replace id 102 via 169.254.3.23 dev $rp13 315 ip nexthop replace id 101 via 169.254.2.22 dev $rp12 316 317 log_info "Running IPv6 multipath tests" 318 multipath6_test "ECMP" 1 1 319 multipath6_test "Weighted MP 2:1" 2 1 320 multipath6_test "Weighted MP 11:45" 11 45 321} 322 323multipath16_test() 324{ 325 check_nhgw16 104 || return 326 327 log_info "Running 16-bit IPv4 multipath tests" 328 multipath4_test "65535:65535" 65535 65535 329 multipath4_test "128:512" 128 512 330 omit_on_slow \ 331 multipath4_test "255:65535" 255 65535 sp=1024-1026,dp=0-65535 332 333 log_info "Running 16-bit IPv6 multipath tests" 334 multipath6_test "65535:65535" 65535 65535 335 multipath6_test "128:512" 128 512 336 omit_on_slow \ 337 multipath6_test "255:65535" 255 65535 sp=1024-1026,dp=0-65535 338} 339 340ping_ipv4_blackhole() 341{ 342 RET=0 343 344 ip nexthop add id 1001 blackhole 345 ip nexthop add id 1002 group 1001 346 347 ip route replace 198.51.100.0/24 vrf vrf-r1 nhid 1001 348 ping_do $h1 198.51.100.2 349 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 1002 352 ping_do $h1 198.51.100.2 353 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 103 356 ping_do $h1 198.51.100.2 357 check_err $? "ping failed with a valid nexthop" 358 359 log_test "IPv4 blackhole ping" 360 361 ip nexthop del id 1002 362 ip nexthop del id 1001 363} 364 365ping_ipv6_blackhole() 366{ 367 RET=0 368 369 ip -6 nexthop add id 1001 blackhole 370 ip nexthop add id 1002 group 1001 371 372 ip route replace 2001:db8:2::/64 vrf vrf-r1 nhid 1001 373 ping6_do $h1 2001:db8:2::2 374 check_fail $? "ping did not fail when using a blackhole nexthop" 375 376 ip route replace 2001:db8:2::/64 vrf vrf-r1 nhid 1002 377 ping6_do $h1 2001:db8:2::2 378 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 106 381 ping6_do $h1 2001:db8:2::2 382 check_err $? "ping failed with a valid nexthop" 383 384 log_test "IPv6 blackhole ping" 385 386 ip nexthop del id 1002 387 ip -6 nexthop del id 1001 388} 389 390nh_stats_test_v4() 391{ 392 __nh_stats_test_v4 mpath 393} 394 395nh_stats_test_v6() 396{ 397 __nh_stats_test_v6 mpath 398} 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_prepare 415 416 h1_create 417 h2_create 418 419 router1_create 420 router2_create 421 422 forwarding_enable 423} 424 425cleanup() 426{ 427 pre_cleanup 428 429 forwarding_restore 430 431 router2_destroy 432 router1_destroy 433 434 h2_destroy 435 h1_destroy 436 437 vrf_cleanup 438} 439 440ping_ipv4() 441{ 442 ping_test $h1 198.51.100.2 443} 444 445ping_ipv6() 446{ 447 ping6_test $h1 2001:db8:2::2 448} 449 450ip nexthop ls >/dev/null 2>&1 451if [ $? -ne 0 ]; then 452 echo "Nexthop objects not supported; skipping tests" 453 exit $ksft_skip 454fi 455 456trap cleanup EXIT 457 458setup_prepare 459setup_wait 460routing_nh_obj 461 462tests_run 463 464exit $EXIT_STATUS 465