874 lines · bash
1# SPDX-License-Identifier: GPL-2.02#3# Various helpers and tests to verify FIB offload.4 5__fib_trap_check()6{7 local ns=$1; shift8 local family=$1; shift9 local route=$1; shift10 local should_fail=$1; shift11 local ret12 13 ip -n $ns -j -p -$family route show $route \14 | jq -e '.[]["flags"] | contains(["trap"])' &> /dev/null15 ret=$?16 if [[ $should_fail == "true" ]]; then17 if [[ $ret -ne 0 ]]; then18 return 019 else20 return 121 fi22 fi23 24 return $ret25}26 27fib_trap_check()28{29 local ns=$1; shift30 local family=$1; shift31 local route=$1; shift32 local should_fail=$1; shift33 34 busywait 5000 __fib_trap_check $ns $family "$route" $should_fail35}36 37fib4_trap_check()38{39 local ns=$1; shift40 local route=$1; shift41 local should_fail=$1; shift42 43 fib_trap_check $ns 4 "$route" $should_fail44}45 46fib6_trap_check()47{48 local ns=$1; shift49 local route=$1; shift50 local should_fail=$1; shift51 52 fib_trap_check $ns 6 "$route" $should_fail53}54 55fib_ipv4_identical_routes_test()56{57 local ns=$1; shift58 local i59 60 RET=061 62 for i in $(seq 1 3); do63 ip -n $ns link add name dummy$i type dummy64 ip -n $ns link set dev dummy$i up65 done66 67 ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 0 metric 102468 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 0 metric 1024" false69 check_err $? "Route not in hardware when should"70 71 ip -n $ns route append 192.0.2.0/24 dev dummy2 tos 0 metric 102472 fib4_trap_check $ns "192.0.2.0/24 dev dummy2 tos 0 metric 1024" true73 check_err $? "Appended route in hardware when should not"74 75 ip -n $ns route prepend 192.0.2.0/24 dev dummy3 tos 0 metric 102476 fib4_trap_check $ns "192.0.2.0/24 dev dummy3 tos 0 metric 1024" false77 check_err $? "Prepended route not in hardware when should"78 79 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 0 metric 1024" true80 check_err $? "Route was not replaced in hardware by prepended one"81 82 log_test "IPv4 identical routes"83 84 for i in $(seq 1 3); do85 ip -n $ns link del dev dummy$i86 done87}88 89fib_ipv4_tos_test()90{91 local ns=$1; shift92 93 RET=094 95 ip -n $ns link add name dummy1 type dummy96 ip -n $ns link set dev dummy1 up97 98 ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 0 metric 102499 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 0 metric 1024" false100 check_err $? "Route not in hardware when should"101 102 ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 8 metric 1024103 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 8 metric 1024" false104 check_err $? "Highest TOS route not in hardware when should"105 106 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 0 metric 1024" true107 check_err $? "Lowest TOS route still in hardware when should not"108 109 ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 4 metric 1024110 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 4 metric 1024" true111 check_err $? "Middle TOS route in hardware when should not"112 113 log_test "IPv4 routes with TOS"114 115 ip -n $ns link del dev dummy1116}117 118fib_ipv4_metric_test()119{120 local ns=$1; shift121 122 RET=0123 124 ip -n $ns link add name dummy1 type dummy125 ip -n $ns link set dev dummy1 up126 127 ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1024128 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1024" false129 check_err $? "Route not in hardware when should"130 131 ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1022132 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1022" false133 check_err $? "Lowest metric route not in hardware when should"134 135 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1024" true136 check_err $? "Highest metric route still in hardware when should not"137 138 ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1023139 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1023" true140 check_err $? "Middle metric route in hardware when should not"141 142 log_test "IPv4 routes with metric"143 144 ip -n $ns link del dev dummy1145}146 147fib_ipv4_replace_test()148{149 local ns=$1; shift150 local i151 152 RET=0153 154 for i in $(seq 1 2); do155 ip -n $ns link add name dummy$i type dummy156 ip -n $ns link set dev dummy$i up157 done158 159 ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1024160 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1024" false161 check_err $? "Route not in hardware when should"162 163 ip -n $ns route replace 192.0.2.0/24 dev dummy2 metric 1024164 fib4_trap_check $ns "192.0.2.0/24 dev dummy2 metric 1024" false165 check_err $? "Replacement route not in hardware when should"166 167 # Add a route with an higher metric and make sure that replacing it168 # does not affect the lower metric one.169 ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1025170 ip -n $ns route replace 192.0.2.0/24 dev dummy2 metric 1025171 172 fib4_trap_check $ns "192.0.2.0/24 dev dummy2 metric 1024" false173 check_err $? "Lowest metric route not in hardware when should"174 fib4_trap_check $ns "192.0.2.0/24 dev dummy2 metric 1025" true175 check_err $? "Highest metric route in hardware when should not"176 177 log_test "IPv4 route replace"178 179 for i in $(seq 1 2); do180 ip -n $ns link del dev dummy$i181 done182}183 184fib_ipv4_delete_test()185{186 local ns=$1; shift187 local metric188 189 RET=0190 191 ip -n $ns link add name dummy1 type dummy192 ip -n $ns link set dev dummy1 up193 194 # Insert multiple routes with the same prefix and length and varying195 # metrics. Make sure that throughout delete operations the lowest196 # metric route is the one in hardware.197 for metric in $(seq 1024 1026); do198 ip -n $ns route add 192.0.2.0/24 dev dummy1 metric $metric199 done200 201 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1024" false202 check_err $? "Route not in hardware when should"203 204 ip -n $ns route del 192.0.2.0/24 dev dummy1 metric 1024205 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1025" false206 check_err $? "Lowest metric route not in hardware when should"207 208 ip -n $ns route del 192.0.2.0/24 dev dummy1 metric 1026209 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1025" false210 check_err $? "Sole route not in hardware when should"211 212 log_test "IPv4 route delete"213 214 ip -n $ns link del dev dummy1215}216 217fib_ipv4_plen_test()218{219 local ns=$1; shift220 221 RET=0222 223 ip -n $ns link add name dummy1 type dummy224 ip -n $ns link set dev dummy1 up225 226 # Add two routes with the same key and different prefix length and227 # make sure both are in hardware. It can be verified that both are228 # sharing the same leaf by checking the /proc/net/fib_trie229 ip -n $ns route add 192.0.2.0/24 dev dummy1230 ip -n $ns route add 192.0.2.0/25 dev dummy1231 232 fib4_trap_check $ns "192.0.2.0/24 dev dummy1" false233 check_err $? "/24 not in hardware when should"234 235 fib4_trap_check $ns "192.0.2.0/25 dev dummy1" false236 check_err $? "/25 not in hardware when should"237 238 log_test "IPv4 routes with different prefix length"239 240 ip -n $ns link del dev dummy1241}242 243fib_ipv4_replay_metric_test()244{245 local ns=$1; shift246 local devlink_dev=$1; shift247 248 RET=0249 250 ip -n $ns link add name dummy1 type dummy251 ip -n $ns link set dev dummy1 up252 253 ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1024254 ip -n $ns route add 192.0.2.0/24 dev dummy1 metric 1025255 256 devlink -N $ns dev reload $devlink_dev257 258 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1024" false259 check_err $? "Lowest metric route not in hardware when should"260 261 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 metric 1025" true262 check_err $? "Highest metric route in hardware when should not"263 264 log_test "IPv4 routes replay - metric"265 266 ip -n $ns link del dev dummy1267}268 269fib_ipv4_replay_tos_test()270{271 local ns=$1; shift272 local devlink_dev=$1; shift273 274 RET=0275 276 ip -n $ns link add name dummy1 type dummy277 ip -n $ns link set dev dummy1 up278 279 ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 0280 ip -n $ns route add 192.0.2.0/24 dev dummy1 tos 4281 282 devlink -N $ns dev reload $devlink_dev283 284 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 4" false285 check_err $? "Highest TOS route not in hardware when should"286 287 fib4_trap_check $ns "192.0.2.0/24 dev dummy1 tos 0" true288 check_err $? "Lowest TOS route in hardware when should not"289 290 log_test "IPv4 routes replay - TOS"291 292 ip -n $ns link del dev dummy1293}294 295fib_ipv4_replay_plen_test()296{297 local ns=$1; shift298 local devlink_dev=$1; shift299 300 RET=0301 302 ip -n $ns link add name dummy1 type dummy303 ip -n $ns link set dev dummy1 up304 305 ip -n $ns route add 192.0.2.0/24 dev dummy1306 ip -n $ns route add 192.0.2.0/25 dev dummy1307 308 devlink -N $ns dev reload $devlink_dev309 310 fib4_trap_check $ns "192.0.2.0/24 dev dummy1" false311 check_err $? "/24 not in hardware when should"312 313 fib4_trap_check $ns "192.0.2.0/25 dev dummy1" false314 check_err $? "/25 not in hardware when should"315 316 log_test "IPv4 routes replay - prefix length"317 318 ip -n $ns link del dev dummy1319}320 321fib_ipv4_flush_test()322{323 local ns=$1; shift324 local metric325 326 RET=0327 328 ip -n $ns link add name dummy1 type dummy329 ip -n $ns link set dev dummy1 up330 331 # Exercise the routes flushing code paths by inserting various332 # prefix routes on a netdev and then deleting it.333 for metric in $(seq 1 20); do334 ip -n $ns route add 192.0.2.0/24 dev dummy1 metric $metric335 done336 337 ip -n $ns link del dev dummy1338 339 log_test "IPv4 routes flushing"340}341 342fib_ipv6_add_test()343{344 local ns=$1; shift345 346 RET=0347 348 for i in $(seq 1 2); do349 ip -n $ns link add name dummy$i type dummy350 ip -n $ns link set dev dummy$i up351 done352 353 ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1024354 fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1024" false355 check_err $? "Route not in hardware when should"356 357 ip -n $ns route append 2001:db8:1::/64 dev dummy2 metric 1024358 fib6_trap_check $ns "2001:db8:1::/64 dev dummy2 metric 1024" true359 check_err $? "Route in hardware when should not"360 361 fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1024" false362 check_err $? "Route not in hardware after appending route"363 364 log_test "IPv6 single route add"365 366 for i in $(seq 1 2); do367 ip -n $ns link del dev dummy$i368 done369}370 371fib_ipv6_metric_test()372{373 local ns=$1; shift374 375 RET=0376 377 ip -n $ns link add name dummy1 type dummy378 ip -n $ns link set dev dummy1 up379 380 ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1024381 fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1024" false382 check_err $? "Route not in hardware when should"383 384 ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1022385 fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1022" false386 check_err $? "Lowest metric route not in hardware when should"387 388 fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1024" true389 check_err $? "Highest metric route still in hardware when should not"390 391 ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1023392 fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1023" true393 check_err $? "Middle metric route in hardware when should not"394 395 log_test "IPv6 routes with metric"396 397 ip -n $ns link del dev dummy1398}399 400fib_ipv6_append_single_test()401{402 local ns=$1; shift403 404 # When an IPv6 multipath route is added without the 'nexthop' keyword,405 # different code paths are taken compared to when the keyword is used.406 # This test tries to verify the former.407 RET=0408 409 for i in $(seq 1 2); do410 ip -n $ns link add name dummy$i type dummy411 ip -n $ns link set dev dummy$i up412 ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i413 done414 415 ip -n $ns route add 2001:db8:10::/64 via 2001:db8:1::2 metric 1024416 fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false417 check_err $? "Route not in hardware when should"418 419 ip -n $ns route append 2001:db8:10::/64 via 2001:db8:2::2 metric 1024420 fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false421 check_err $? "Route not in hardware after appending"422 423 ip -n $ns route add 2001:db8:10::/64 via 2001:db8:1::2 metric 1025424 fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true425 check_err $? "Route in hardware when should not"426 427 ip -n $ns route append 2001:db8:10::/64 via 2001:db8:2::2 metric 1025428 fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true429 check_err $? "Route in hardware when should not after appending"430 431 fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false432 check_err $? "Lowest metric route not in hardware when should"433 434 log_test "IPv6 append single route without 'nexthop' keyword"435 436 for i in $(seq 1 2); do437 ip -n $ns link del dev dummy$i438 done439}440 441fib_ipv6_replace_single_test()442{443 local ns=$1; shift444 local i445 446 RET=0447 448 for i in $(seq 1 2); do449 ip -n $ns link add name dummy$i type dummy450 ip -n $ns link set dev dummy$i up451 done452 453 ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1024454 fib6_trap_check $ns "2001:db8:1::/64 dev dummy1 metric 1024" false455 check_err $? "Route not in hardware when should"456 457 ip -n $ns route replace 2001:db8:1::/64 dev dummy2 metric 1024458 fib6_trap_check $ns "2001:db8:1::/64 dev dummy2 metric 1024" false459 check_err $? "Replacement route not in hardware when should"460 461 # Add a route with an higher metric and make sure that replacing it462 # does not affect the lower metric one.463 ip -n $ns route add 2001:db8:1::/64 dev dummy1 metric 1025464 ip -n $ns route replace 2001:db8:1::/64 dev dummy2 metric 1025465 466 fib6_trap_check $ns "2001:db8:1::/64 dev dummy2 metric 1024" false467 check_err $? "Lowest metric route not in hardware when should"468 fib6_trap_check $ns "2001:db8:1::/64 dev dummy2 metric 1025" true469 check_err $? "Highest metric route in hardware when should not"470 471 log_test "IPv6 single route replace"472 473 for i in $(seq 1 2); do474 ip -n $ns link del dev dummy$i475 done476}477 478fib_ipv6_metric_multipath_test()479{480 local ns=$1; shift481 482 RET=0483 484 for i in $(seq 1 2); do485 ip -n $ns link add name dummy$i type dummy486 ip -n $ns link set dev dummy$i up487 ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i488 done489 490 ip -n $ns route add 2001:db8:10::/64 metric 1024 \491 nexthop via 2001:db8:1::2 dev dummy1 \492 nexthop via 2001:db8:2::2 dev dummy2493 fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false494 check_err $? "Route not in hardware when should"495 496 ip -n $ns route add 2001:db8:10::/64 metric 1022 \497 nexthop via 2001:db8:1::2 dev dummy1 \498 nexthop via 2001:db8:2::2 dev dummy2499 fib6_trap_check $ns "2001:db8:10::/64 metric 1022" false500 check_err $? "Lowest metric route not in hardware when should"501 502 ip -n $ns route add 2001:db8:10::/64 metric 1023 \503 nexthop via 2001:db8:1::2 dev dummy1 \504 nexthop via 2001:db8:2::2 dev dummy2505 fib6_trap_check $ns "2001:db8:10::/64 metric 1024" true506 check_err $? "Highest metric route still in hardware when should not"507 508 fib6_trap_check $ns "2001:db8:10::/64 metric 1023" true509 check_err $? "Middle metric route in hardware when should not"510 511 log_test "IPv6 multipath routes with metric"512 513 for i in $(seq 1 2); do514 ip -n $ns link del dev dummy$i515 done516}517 518fib_ipv6_append_multipath_test()519{520 local ns=$1; shift521 522 RET=0523 524 for i in $(seq 1 3); do525 ip -n $ns link add name dummy$i type dummy526 ip -n $ns link set dev dummy$i up527 ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i528 done529 530 ip -n $ns route add 2001:db8:10::/64 metric 1024 \531 nexthop via 2001:db8:1::2 dev dummy1532 fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false533 check_err $? "Route not in hardware when should"534 535 ip -n $ns route append 2001:db8:10::/64 metric 1024 \536 nexthop via 2001:db8:2::2 dev dummy2 \537 nexthop via 2001:db8:3::2 dev dummy3538 fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false539 check_err $? "Route not in hardware after appending"540 541 ip -n $ns route add 2001:db8:10::/64 metric 1025 \542 nexthop via 2001:db8:1::2 dev dummy1543 fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true544 check_err $? "Route in hardware when should not"545 546 ip -n $ns route append 2001:db8:10::/64 metric 1025 \547 nexthop via 2001:db8:2::2 dev dummy2 \548 nexthop via 2001:db8:3::2 dev dummy3549 fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true550 check_err $? "Route in hardware when should not after appending"551 552 fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false553 check_err $? "Lowest metric route not in hardware when should"554 555 log_test "IPv6 append multipath route with 'nexthop' keyword"556 557 for i in $(seq 1 3); do558 ip -n $ns link del dev dummy$i559 done560}561 562fib_ipv6_replace_multipath_test()563{564 local ns=$1; shift565 local i566 567 RET=0568 569 for i in $(seq 1 3); do570 ip -n $ns link add name dummy$i type dummy571 ip -n $ns link set dev dummy$i up572 ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i573 done574 575 ip -n $ns route add 2001:db8:10::/64 metric 1024 \576 nexthop via 2001:db8:1::2 dev dummy1 \577 nexthop via 2001:db8:2::2 dev dummy2578 fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false579 check_err $? "Route not in hardware when should"580 581 ip -n $ns route replace 2001:db8:10::/64 metric 1024 \582 nexthop via 2001:db8:1::2 dev dummy1 \583 nexthop via 2001:db8:3::2 dev dummy3584 fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false585 check_err $? "Replacement route not in hardware when should"586 587 # Add a route with an higher metric and make sure that replacing it588 # does not affect the lower metric one.589 ip -n $ns route add 2001:db8:10::/64 metric 1025 \590 nexthop via 2001:db8:1::2 dev dummy1 \591 nexthop via 2001:db8:2::2 dev dummy2592 ip -n $ns route replace 2001:db8:10::/64 metric 1025 \593 nexthop via 2001:db8:1::2 dev dummy1 \594 nexthop via 2001:db8:3::2 dev dummy3595 596 fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false597 check_err $? "Lowest metric route not in hardware when should"598 fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true599 check_err $? "Highest metric route in hardware when should not"600 601 log_test "IPv6 multipath route replace"602 603 for i in $(seq 1 3); do604 ip -n $ns link del dev dummy$i605 done606}607 608fib_ipv6_append_multipath_to_single_test()609{610 local ns=$1; shift611 612 # Test that when the first route in the leaf is not a multipath route613 # and we try to append a multipath route with the same metric to it, it614 # is not notified.615 RET=0616 617 for i in $(seq 1 2); do618 ip -n $ns link add name dummy$i type dummy619 ip -n $ns link set dev dummy$i up620 ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i621 done622 623 ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1024624 fib6_trap_check $ns "2001:db8:10::/64 dev dummy1 metric 1024" false625 check_err $? "Route not in hardware when should"626 627 ip -n $ns route append 2001:db8:10::/64 metric 1024 \628 nexthop via 2001:db8:2::2 dev dummy2629 fib6_trap_check $ns "2001:db8:10::/64 dev dummy2 metric 1024" true630 check_err $? "Route in hardware when should not"631 632 fib6_trap_check $ns "2001:db8:10::/64 dev dummy1 metric 1024" false633 check_err $? "Route not in hardware after append"634 635 log_test "IPv6 append multipath route to non-multipath route"636 637 for i in $(seq 1 2); do638 ip -n $ns link del dev dummy$i639 done640}641 642fib_ipv6_delete_single_test()643{644 local ns=$1; shift645 646 # Test various deletion scenarios, where only a single route is647 # deleted from the FIB node.648 for i in $(seq 1 2); do649 ip -n $ns link add name dummy$i type dummy650 ip -n $ns link set dev dummy$i up651 ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i652 done653 654 # Test deletion of a single route when it is the only route in the FIB655 # node.656 RET=0657 658 ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1024659 ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1024660 661 log_test "IPv6 delete sole single route"662 663 # Test that deletion of last route does not affect the first one.664 RET=0665 666 ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1024667 ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1025668 ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1025669 670 fib6_trap_check $ns "2001:db8:10::/64 dev dummy1 metric 1024" false671 check_err $? "Route not in hardware after deleting higher metric route"672 673 log_test "IPv6 delete single route not in hardware"674 675 ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1024676 677 # Test that first route is replaced by next single route in the FIB678 # node.679 RET=0680 681 ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1024682 ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1025683 ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1024684 685 fib6_trap_check $ns "2001:db8:10::/64 dev dummy1 metric 1025" false686 check_err $? "Route not in hardware after deleting lowest metric route"687 688 log_test "IPv6 delete single route - replaced by single"689 690 ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1025691 692 # Test that first route is replaced by next multipath route in the FIB693 # node.694 RET=0695 696 ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1024697 ip -n $ns route add 2001:db8:10::/64 metric 1025 \698 nexthop via 2001:db8:1::2 dev dummy1 \699 nexthop via 2001:db8:2::2 dev dummy2700 ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1024701 702 fib6_trap_check $ns "2001:db8:10::/64 metric 1025" false703 check_err $? "Route not in hardware after deleting lowest metric route"704 705 log_test "IPv6 delete single route - replaced by multipath"706 707 ip -n $ns route del 2001:db8:10::/64 metric 1025708 709 # Test deletion of a single nexthop from a multipath route.710 ip -n $ns route add 2001:db8:10::/64 metric 1024 \711 nexthop via 2001:db8:1::2 dev dummy1 \712 nexthop via 2001:db8:2::2 dev dummy2713 ip -n $ns route del 2001:db8:10::/64 metric 1024 \714 nexthop via 2001:db8:1::2 dev dummy1715 716 fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false717 check_err $? "Route not in hardware after deleting a single nexthop"718 719 log_test "IPv6 delete single nexthop"720 721 ip -n $ns route del 2001:db8:10::/64 metric 1024722 723 for i in $(seq 1 2); do724 ip -n $ns link del dev dummy$i725 done726}727 728fib_ipv6_delete_multipath_test()729{730 local ns=$1; shift731 732 # Test various deletion scenarios, where an entire multipath route is733 # deleted from the FIB node.734 for i in $(seq 1 2); do735 ip -n $ns link add name dummy$i type dummy736 ip -n $ns link set dev dummy$i up737 ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i738 done739 740 # Test deletion of a multipath route when it is the only route in the741 # FIB node.742 RET=0743 744 ip -n $ns route add 2001:db8:10::/64 metric 1024 \745 nexthop via 2001:db8:1::2 dev dummy1 \746 nexthop via 2001:db8:2::2 dev dummy2747 ip -n $ns route del 2001:db8:10::/64 metric 1024748 749 log_test "IPv6 delete sole multipath route"750 751 # Test that deletion of last route does not affect the first one.752 RET=0753 754 ip -n $ns route add 2001:db8:10::/64 metric 1024 \755 nexthop via 2001:db8:1::2 dev dummy1 \756 nexthop via 2001:db8:2::2 dev dummy2757 ip -n $ns route add 2001:db8:10::/64 metric 1025 \758 nexthop via 2001:db8:1::2 dev dummy1 \759 nexthop via 2001:db8:2::2 dev dummy2760 ip -n $ns route del 2001:db8:10::/64 metric 1025761 762 fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false763 check_err $? "Route not in hardware after deleting higher metric route"764 765 log_test "IPv6 delete multipath route not in hardware"766 767 ip -n $ns route del 2001:db8:10::/64 metric 1024768 769 # Test that first route is replaced by next single route in the FIB770 # node.771 RET=0772 773 ip -n $ns route add 2001:db8:10::/64 metric 1024 \774 nexthop via 2001:db8:1::2 dev dummy1 \775 nexthop via 2001:db8:2::2 dev dummy2776 ip -n $ns route add 2001:db8:10::/64 dev dummy1 metric 1025777 ip -n $ns route del 2001:db8:10::/64 metric 1024778 779 fib6_trap_check $ns "2001:db8:10::/64 dev dummy1 metric 1025" false780 check_err $? "Route not in hardware after deleting lowest metric route"781 782 log_test "IPv6 delete multipath route - replaced by single"783 784 ip -n $ns route del 2001:db8:10::/64 dev dummy1 metric 1025785 786 # Test that first route is replaced by next multipath route in the FIB787 # node.788 RET=0789 790 ip -n $ns route add 2001:db8:10::/64 metric 1024 \791 nexthop via 2001:db8:1::2 dev dummy1 \792 nexthop via 2001:db8:2::2 dev dummy2793 ip -n $ns route add 2001:db8:10::/64 metric 1025 \794 nexthop via 2001:db8:1::2 dev dummy1 \795 nexthop via 2001:db8:2::2 dev dummy2796 ip -n $ns route del 2001:db8:10::/64 metric 1024797 798 fib6_trap_check $ns "2001:db8:10::/64 metric 1025" false799 check_err $? "Route not in hardware after deleting lowest metric route"800 801 log_test "IPv6 delete multipath route - replaced by multipath"802 803 ip -n $ns route del 2001:db8:10::/64 metric 1025804 805 for i in $(seq 1 2); do806 ip -n $ns link del dev dummy$i807 done808}809 810fib_ipv6_replay_single_test()811{812 local ns=$1; shift813 local devlink_dev=$1; shift814 815 RET=0816 817 for i in $(seq 1 2); do818 ip -n $ns link add name dummy$i type dummy819 ip -n $ns link set dev dummy$i up820 done821 822 ip -n $ns route add 2001:db8:1::/64 dev dummy1823 ip -n $ns route append 2001:db8:1::/64 dev dummy2824 825 devlink -N $ns dev reload $devlink_dev826 827 fib6_trap_check $ns "2001:db8:1::/64 dev dummy1" false828 check_err $? "First route not in hardware when should"829 830 fib6_trap_check $ns "2001:db8:1::/64 dev dummy2" true831 check_err $? "Second route in hardware when should not"832 833 log_test "IPv6 routes replay - single route"834 835 for i in $(seq 1 2); do836 ip -n $ns link del dev dummy$i837 done838}839 840fib_ipv6_replay_multipath_test()841{842 local ns=$1; shift843 local devlink_dev=$1; shift844 845 RET=0846 847 for i in $(seq 1 2); do848 ip -n $ns link add name dummy$i type dummy849 ip -n $ns link set dev dummy$i up850 ip -n $ns address add 2001:db8:$i::1/64 dev dummy$i851 done852 853 ip -n $ns route add 2001:db8:10::/64 metric 1024 \854 nexthop via 2001:db8:1::2 dev dummy1 \855 nexthop via 2001:db8:2::2 dev dummy2856 ip -n $ns route add 2001:db8:10::/64 metric 1025 \857 nexthop via 2001:db8:1::2 dev dummy1 \858 nexthop via 2001:db8:2::2 dev dummy2859 860 devlink -N $ns dev reload $devlink_dev861 862 fib6_trap_check $ns "2001:db8:10::/64 metric 1024" false863 check_err $? "First route not in hardware when should"864 865 fib6_trap_check $ns "2001:db8:10::/64 metric 1025" true866 check_err $? "Second route in hardware when should not"867 868 log_test "IPv6 routes replay - multipath route"869 870 for i in $(seq 1 2); do871 ip -n $ns link del dev dummy$i872 done873}874