1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# 4# This test is for checking the nexthop offload API. It makes use of netdevsim 5# which registers a listener to the nexthop notification chain. 6 7lib_dir=$(dirname $0)/../../../net/forwarding 8 9ALL_TESTS=" 10 nexthop_single_add_test 11 nexthop_single_add_err_test 12 nexthop_group_add_test 13 nexthop_group_add_err_test 14 nexthop_res_group_add_test 15 nexthop_res_group_add_err_test 16 nexthop_group_replace_test 17 nexthop_group_replace_err_test 18 nexthop_res_group_replace_test 19 nexthop_res_group_replace_err_test 20 nexthop_res_group_idle_timer_test 21 nexthop_res_group_idle_timer_del_test 22 nexthop_res_group_increase_idle_timer_test 23 nexthop_res_group_decrease_idle_timer_test 24 nexthop_res_group_unbalanced_timer_test 25 nexthop_res_group_unbalanced_timer_del_test 26 nexthop_res_group_no_unbalanced_timer_test 27 nexthop_res_group_short_unbalanced_timer_test 28 nexthop_res_group_increase_unbalanced_timer_test 29 nexthop_res_group_decrease_unbalanced_timer_test 30 nexthop_res_group_force_migrate_busy_test 31 nexthop_single_replace_test 32 nexthop_single_replace_err_test 33 nexthop_single_in_group_replace_test 34 nexthop_single_in_group_replace_err_test 35 nexthop_single_in_res_group_replace_test 36 nexthop_single_in_res_group_replace_err_test 37 nexthop_single_in_group_delete_test 38 nexthop_single_in_group_delete_err_test 39 nexthop_single_in_res_group_delete_test 40 nexthop_single_in_res_group_delete_err_test 41 nexthop_replay_test 42 nexthop_replay_err_test 43" 44NETDEVSIM_PATH=/sys/bus/netdevsim/ 45DEV_ADDR=1337 46DEV=netdevsim${DEV_ADDR} 47SYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV/net/ 48DEBUGFS_NET_DIR=/sys/kernel/debug/netdevsim/$DEV/ 49NUM_NETIFS=0 50source $lib_dir/lib.sh 51 52DEVLINK_DEV= 53source $lib_dir/devlink_lib.sh 54DEVLINK_DEV=netdevsim/${DEV} 55 56nexthop_check() 57{ 58 local nharg="$1"; shift 59 local expected="$1"; shift 60 61 out=$($IP nexthop show ${nharg} | sed -e 's/ *$//') 62 if [[ "$out" != "$expected" ]]; then 63 return 1 64 fi 65 66 return 0 67} 68 69nexthop_bucket_nhid_count_check() 70{ 71 local group_id=$1; shift 72 local expected 73 local count 74 local nhid 75 local ret 76 77 while (($# > 0)); do 78 nhid=$1; shift 79 expected=$1; shift 80 81 count=$($IP nexthop bucket show id $group_id nhid $nhid | 82 grep "trap" | wc -l) 83 if ((expected != count)); then 84 return 1 85 fi 86 done 87 88 return 0 89} 90 91nexthop_resource_check() 92{ 93 local expected_occ=$1; shift 94 95 occ=$($DEVLINK -jp resource show $DEVLINK_DEV \ 96 | jq '.[][][] | select(.name=="nexthops") | .["occ"]') 97 98 if [ $expected_occ -ne $occ ]; then 99 return 1 100 fi 101 102 return 0 103} 104 105nexthop_resource_set() 106{ 107 local size=$1; shift 108 109 $DEVLINK resource set $DEVLINK_DEV path nexthops size $size 110 $DEVLINK dev reload $DEVLINK_DEV 111} 112 113nexthop_single_add_test() 114{ 115 RET=0 116 117 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 118 nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap" 119 check_err $? "Unexpected nexthop entry" 120 121 nexthop_resource_check 1 122 check_err $? "Wrong nexthop occupancy" 123 124 $IP nexthop del id 1 125 nexthop_resource_check 0 126 check_err $? "Wrong nexthop occupancy after delete" 127 128 log_test "Single nexthop add and delete" 129} 130 131nexthop_single_add_err_test() 132{ 133 RET=0 134 135 nexthop_resource_set 1 136 137 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 138 139 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 &> /dev/null 140 check_fail $? "Nexthop addition succeeded when should fail" 141 142 nexthop_resource_check 1 143 check_err $? "Wrong nexthop occupancy" 144 145 log_test "Single nexthop add failure" 146 147 $IP nexthop flush &> /dev/null 148 nexthop_resource_set 9999 149} 150 151nexthop_group_add_test() 152{ 153 RET=0 154 155 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 156 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 157 158 $IP nexthop add id 10 group 1/2 159 nexthop_check "id 10" "id 10 group 1/2 trap" 160 check_err $? "Unexpected nexthop group entry" 161 162 nexthop_resource_check 4 163 check_err $? "Wrong nexthop occupancy" 164 165 $IP nexthop del id 10 166 nexthop_resource_check 2 167 check_err $? "Wrong nexthop occupancy after delete" 168 169 $IP nexthop add id 10 group 1,20/2,39 170 nexthop_check "id 10" "id 10 group 1,20/2,39 trap" 171 check_err $? "Unexpected weighted nexthop group entry" 172 173 nexthop_resource_check 61 174 check_err $? "Wrong weighted nexthop occupancy" 175 176 $IP nexthop del id 10 177 nexthop_resource_check 2 178 check_err $? "Wrong nexthop occupancy after delete" 179 180 log_test "Nexthop group add and delete" 181 182 $IP nexthop flush &> /dev/null 183} 184 185nexthop_group_add_err_test() 186{ 187 RET=0 188 189 nexthop_resource_set 2 190 191 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 192 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 193 194 $IP nexthop add id 10 group 1/2 &> /dev/null 195 check_fail $? "Nexthop group addition succeeded when should fail" 196 197 nexthop_resource_check 2 198 check_err $? "Wrong nexthop occupancy" 199 200 log_test "Nexthop group add failure" 201 202 $IP nexthop flush &> /dev/null 203 nexthop_resource_set 9999 204} 205 206nexthop_res_group_add_test() 207{ 208 RET=0 209 210 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 211 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 212 213 $IP nexthop add id 10 group 1/2 type resilient buckets 4 214 nexthop_check "id 10" "id 10 group 1/2 type resilient buckets 4 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap" 215 check_err $? "Unexpected nexthop group entry" 216 217 nexthop_bucket_nhid_count_check 10 1 2 218 check_err $? "Wrong nexthop buckets count" 219 nexthop_bucket_nhid_count_check 10 2 2 220 check_err $? "Wrong nexthop buckets count" 221 222 nexthop_resource_check 6 223 check_err $? "Wrong nexthop occupancy" 224 225 $IP nexthop del id 10 226 nexthop_resource_check 2 227 check_err $? "Wrong nexthop occupancy after delete" 228 229 $IP nexthop add id 10 group 1,3/2,2 type resilient buckets 5 230 nexthop_check "id 10" "id 10 group 1,3/2,2 type resilient buckets 5 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap" 231 check_err $? "Unexpected weighted nexthop group entry" 232 233 nexthop_bucket_nhid_count_check 10 1 3 234 check_err $? "Wrong nexthop buckets count" 235 nexthop_bucket_nhid_count_check 10 2 2 236 check_err $? "Wrong nexthop buckets count" 237 238 nexthop_resource_check 7 239 check_err $? "Wrong weighted nexthop occupancy" 240 241 $IP nexthop del id 10 242 nexthop_resource_check 2 243 check_err $? "Wrong nexthop occupancy after delete" 244 245 log_test "Resilient nexthop group add and delete" 246 247 $IP nexthop flush &> /dev/null 248} 249 250nexthop_res_group_add_err_test() 251{ 252 RET=0 253 254 nexthop_resource_set 2 255 256 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 257 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 258 259 $IP nexthop add id 10 group 1/2 type resilient buckets 4 &> /dev/null 260 check_fail $? "Nexthop group addition succeeded when should fail" 261 262 nexthop_resource_check 2 263 check_err $? "Wrong nexthop occupancy" 264 265 log_test "Resilient nexthop group add failure" 266 267 $IP nexthop flush &> /dev/null 268 nexthop_resource_set 9999 269} 270 271nexthop_group_replace_test() 272{ 273 RET=0 274 275 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 276 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 277 $IP nexthop add id 3 via 192.0.2.4 dev dummy1 278 $IP nexthop add id 10 group 1/2 279 280 $IP nexthop replace id 10 group 1/2/3 281 nexthop_check "id 10" "id 10 group 1/2/3 trap" 282 check_err $? "Unexpected nexthop group entry" 283 284 nexthop_resource_check 6 285 check_err $? "Wrong nexthop occupancy" 286 287 log_test "Nexthop group replace" 288 289 $IP nexthop flush &> /dev/null 290} 291 292nexthop_group_replace_err_test() 293{ 294 RET=0 295 296 nexthop_resource_set 5 297 298 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 299 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 300 $IP nexthop add id 3 via 192.0.2.4 dev dummy1 301 $IP nexthop add id 10 group 1/2 302 303 $IP nexthop replace id 10 group 1/2/3 &> /dev/null 304 check_fail $? "Nexthop group replacement succeeded when should fail" 305 306 nexthop_check "id 10" "id 10 group 1/2 trap" 307 check_err $? "Unexpected nexthop group entry after failure" 308 309 nexthop_resource_check 5 310 check_err $? "Wrong nexthop occupancy after failure" 311 312 log_test "Nexthop group replace failure" 313 314 $IP nexthop flush &> /dev/null 315 nexthop_resource_set 9999 316} 317 318nexthop_res_group_replace_test() 319{ 320 RET=0 321 322 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 323 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 324 $IP nexthop add id 3 via 192.0.2.4 dev dummy1 325 $IP nexthop add id 10 group 1/2 type resilient buckets 6 326 327 $IP nexthop replace id 10 group 1/2/3 type resilient 328 nexthop_check "id 10" "id 10 group 1/2/3 type resilient buckets 6 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap" 329 check_err $? "Unexpected nexthop group entry" 330 331 nexthop_bucket_nhid_count_check 10 1 2 332 check_err $? "Wrong nexthop buckets count" 333 nexthop_bucket_nhid_count_check 10 2 2 334 check_err $? "Wrong nexthop buckets count" 335 nexthop_bucket_nhid_count_check 10 3 2 336 check_err $? "Wrong nexthop buckets count" 337 338 nexthop_resource_check 9 339 check_err $? "Wrong nexthop occupancy" 340 341 log_test "Resilient nexthop group replace" 342 343 $IP nexthop flush &> /dev/null 344} 345 346nexthop_res_group_replace_err_test() 347{ 348 RET=0 349 350 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 351 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 352 $IP nexthop add id 3 via 192.0.2.4 dev dummy1 353 $IP nexthop add id 10 group 1/2 type resilient buckets 6 354 355 ip netns exec testns1 \ 356 echo 1 > $DEBUGFS_NET_DIR/fib/fail_res_nexthop_group_replace 357 $IP nexthop replace id 10 group 1/2/3 type resilient &> /dev/null 358 check_fail $? "Nexthop group replacement succeeded when should fail" 359 360 nexthop_check "id 10" "id 10 group 1/2 type resilient buckets 6 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap" 361 check_err $? "Unexpected nexthop group entry after failure" 362 363 nexthop_bucket_nhid_count_check 10 1 3 364 check_err $? "Wrong nexthop buckets count" 365 nexthop_bucket_nhid_count_check 10 2 3 366 check_err $? "Wrong nexthop buckets count" 367 368 nexthop_resource_check 9 369 check_err $? "Wrong nexthop occupancy after failure" 370 371 log_test "Resilient nexthop group replace failure" 372 373 $IP nexthop flush &> /dev/null 374 ip netns exec testns1 \ 375 echo 0 > $DEBUGFS_NET_DIR/fib/fail_res_nexthop_group_replace 376} 377 378nexthop_res_mark_buckets_busy() 379{ 380 local group_id=$1; shift 381 local nhid=$1; shift 382 local count=$1; shift 383 local index 384 385 for index in $($IP -j nexthop bucket show id $group_id nhid $nhid | 386 jq '.[].bucket.index' | head -n ${count:--0}) 387 do 388 echo $group_id $index \ 389 > $DEBUGFS_NET_DIR/fib/nexthop_bucket_activity 390 done 391} 392 393nexthop_res_num_nhid_buckets() 394{ 395 local group_id=$1; shift 396 local nhid=$1; shift 397 398 $IP -j nexthop bucket show id $group_id nhid $nhid | jq length 399} 400 401nexthop_res_group_idle_timer_test() 402{ 403 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 404 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 405 406 RET=0 407 408 $IP nexthop add id 10 group 1/2 type resilient buckets 8 idle_timer 4 409 nexthop_res_mark_buckets_busy 10 1 410 $IP nexthop replace id 10 group 1/2,3 type resilient 411 412 nexthop_bucket_nhid_count_check 10 1 4 2 4 413 check_err $? "Group expected to be unbalanced" 414 415 sleep 6 416 417 nexthop_bucket_nhid_count_check 10 1 2 2 6 418 check_err $? "Group expected to be balanced" 419 420 log_test "Bucket migration after idle timer" 421 422 $IP nexthop flush &> /dev/null 423} 424 425nexthop_res_group_idle_timer_del_test() 426{ 427 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 428 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 429 $IP nexthop add id 3 via 192.0.2.3 dev dummy1 430 431 RET=0 432 433 $IP nexthop add id 10 group 1,50/2,50/3,1 \ 434 type resilient buckets 8 idle_timer 6 435 nexthop_res_mark_buckets_busy 10 1 436 $IP nexthop replace id 10 group 1,50/2,150/3,1 type resilient 437 438 nexthop_bucket_nhid_count_check 10 1 4 2 4 3 0 439 check_err $? "Group expected to be unbalanced" 440 441 sleep 4 442 443 # Deletion prompts group replacement. Check that the bucket timers 444 # are kept. 445 $IP nexthop delete id 3 446 447 nexthop_bucket_nhid_count_check 10 1 4 2 4 448 check_err $? "Group expected to still be unbalanced" 449 450 sleep 4 451 452 nexthop_bucket_nhid_count_check 10 1 2 2 6 453 check_err $? "Group expected to be balanced" 454 455 log_test "Bucket migration after idle timer (with delete)" 456 457 $IP nexthop flush &> /dev/null 458} 459 460__nexthop_res_group_increase_timer_test() 461{ 462 local timer=$1; shift 463 464 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 465 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 466 467 RET=0 468 469 $IP nexthop add id 10 group 1/2 type resilient buckets 8 $timer 4 470 nexthop_res_mark_buckets_busy 10 1 471 $IP nexthop replace id 10 group 1/2,3 type resilient 472 473 nexthop_bucket_nhid_count_check 10 2 6 474 check_fail $? "Group expected to be unbalanced" 475 476 sleep 2 477 $IP nexthop replace id 10 group 1/2,3 type resilient $timer 8 478 sleep 4 479 480 # 6 seconds, past the original timer. 481 nexthop_bucket_nhid_count_check 10 2 6 482 check_fail $? "Group still expected to be unbalanced" 483 484 sleep 4 485 486 # 10 seconds, past the new timer. 487 nexthop_bucket_nhid_count_check 10 2 6 488 check_err $? "Group expected to be balanced" 489 490 log_test "Bucket migration after $timer increase" 491 492 $IP nexthop flush &> /dev/null 493} 494 495__nexthop_res_group_decrease_timer_test() 496{ 497 local timer=$1; shift 498 499 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 500 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 501 502 RET=0 503 504 $IP nexthop add id 10 group 1/2 type resilient buckets 8 $timer 8 505 nexthop_res_mark_buckets_busy 10 1 506 $IP nexthop replace id 10 group 1/2,3 type resilient 507 508 nexthop_bucket_nhid_count_check 10 2 6 509 check_fail $? "Group expected to be unbalanced" 510 511 sleep 2 512 $IP nexthop replace id 10 group 1/2,3 type resilient $timer 4 513 sleep 4 514 515 # 6 seconds, past the new timer, before the old timer. 516 nexthop_bucket_nhid_count_check 10 2 6 517 check_err $? "Group expected to be balanced" 518 519 log_test "Bucket migration after $timer decrease" 520 521 $IP nexthop flush &> /dev/null 522} 523 524__nexthop_res_group_increase_timer_del_test() 525{ 526 local timer=$1; shift 527 528 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 529 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 530 $IP nexthop add id 3 via 192.0.2.3 dev dummy1 531 532 RET=0 533 534 $IP nexthop add id 10 group 1,100/2,100/3,1 \ 535 type resilient buckets 8 $timer 4 536 nexthop_res_mark_buckets_busy 10 1 537 $IP nexthop replace id 10 group 1,100/2,300/3,1 type resilient 538 539 nexthop_bucket_nhid_count_check 10 2 6 540 check_fail $? "Group expected to be unbalanced" 541 542 sleep 2 543 $IP nexthop replace id 10 group 1/2,3 type resilient $timer 8 544 sleep 4 545 546 # 6 seconds, past the original timer. 547 nexthop_bucket_nhid_count_check 10 2 6 548 check_fail $? "Group still expected to be unbalanced" 549 550 sleep 4 551 552 # 10 seconds, past the new timer. 553 nexthop_bucket_nhid_count_check 10 2 6 554 check_err $? "Group expected to be balanced" 555 556 log_test "Bucket migration after $timer increase" 557 558 $IP nexthop flush &> /dev/null 559} 560 561nexthop_res_group_increase_idle_timer_test() 562{ 563 __nexthop_res_group_increase_timer_test idle_timer 564} 565 566nexthop_res_group_decrease_idle_timer_test() 567{ 568 __nexthop_res_group_decrease_timer_test idle_timer 569} 570 571nexthop_res_group_unbalanced_timer_test() 572{ 573 local i 574 575 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 576 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 577 578 RET=0 579 580 $IP nexthop add id 10 group 1/2 type resilient \ 581 buckets 8 idle_timer 6 unbalanced_timer 10 582 nexthop_res_mark_buckets_busy 10 1 583 $IP nexthop replace id 10 group 1/2,3 type resilient 584 585 for i in 1 2; do 586 sleep 4 587 nexthop_bucket_nhid_count_check 10 1 4 2 4 588 check_err $? "$i: Group expected to be unbalanced" 589 nexthop_res_mark_buckets_busy 10 1 590 done 591 592 # 3 x sleep 4 > unbalanced timer 10 593 sleep 4 594 nexthop_bucket_nhid_count_check 10 1 2 2 6 595 check_err $? "Group expected to be balanced" 596 597 log_test "Bucket migration after unbalanced timer" 598 599 $IP nexthop flush &> /dev/null 600} 601 602nexthop_res_group_unbalanced_timer_del_test() 603{ 604 local i 605 606 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 607 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 608 $IP nexthop add id 3 via 192.0.2.3 dev dummy1 609 610 RET=0 611 612 $IP nexthop add id 10 group 1,50/2,50/3,1 type resilient \ 613 buckets 8 idle_timer 6 unbalanced_timer 10 614 nexthop_res_mark_buckets_busy 10 1 615 $IP nexthop replace id 10 group 1,50/2,150/3,1 type resilient 616 617 # Check that NH delete does not reset unbalanced time. 618 sleep 4 619 $IP nexthop delete id 3 620 nexthop_bucket_nhid_count_check 10 1 4 2 4 621 check_err $? "1: Group expected to be unbalanced" 622 nexthop_res_mark_buckets_busy 10 1 623 624 sleep 4 625 nexthop_bucket_nhid_count_check 10 1 4 2 4 626 check_err $? "2: Group expected to be unbalanced" 627 nexthop_res_mark_buckets_busy 10 1 628 629 # 3 x sleep 4 > unbalanced timer 10 630 sleep 4 631 nexthop_bucket_nhid_count_check 10 1 2 2 6 632 check_err $? "Group expected to be balanced" 633 634 log_test "Bucket migration after unbalanced timer (with delete)" 635 636 $IP nexthop flush &> /dev/null 637} 638 639nexthop_res_group_no_unbalanced_timer_test() 640{ 641 local i 642 643 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 644 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 645 646 RET=0 647 648 $IP nexthop add id 10 group 1/2 type resilient buckets 8 649 nexthop_res_mark_buckets_busy 10 1 650 $IP nexthop replace id 10 group 1/2,3 type resilient 651 652 for i in $(seq 3); do 653 sleep 60 654 nexthop_bucket_nhid_count_check 10 2 6 655 check_fail $? "$i: Group expected to be unbalanced" 656 nexthop_res_mark_buckets_busy 10 1 657 done 658 659 log_test "Buckets never force-migrated without unbalanced timer" 660 661 $IP nexthop flush &> /dev/null 662} 663 664nexthop_res_group_short_unbalanced_timer_test() 665{ 666 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 667 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 668 669 RET=0 670 671 $IP nexthop add id 10 group 1/2 type resilient \ 672 buckets 8 idle_timer 120 unbalanced_timer 4 673 nexthop_res_mark_buckets_busy 10 1 674 $IP nexthop replace id 10 group 1/2,3 type resilient 675 676 nexthop_bucket_nhid_count_check 10 2 6 677 check_fail $? "Group expected to be unbalanced" 678 679 sleep 5 680 681 nexthop_bucket_nhid_count_check 10 2 6 682 check_err $? "Group expected to be balanced" 683 684 log_test "Bucket migration after unbalanced < idle timer" 685 686 $IP nexthop flush &> /dev/null 687} 688 689nexthop_res_group_increase_unbalanced_timer_test() 690{ 691 __nexthop_res_group_increase_timer_test unbalanced_timer 692} 693 694nexthop_res_group_decrease_unbalanced_timer_test() 695{ 696 __nexthop_res_group_decrease_timer_test unbalanced_timer 697} 698 699nexthop_res_group_force_migrate_busy_test() 700{ 701 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 702 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 703 704 RET=0 705 706 $IP nexthop add id 10 group 1/2 type resilient \ 707 buckets 8 idle_timer 120 708 nexthop_res_mark_buckets_busy 10 1 709 $IP nexthop replace id 10 group 1/2,3 type resilient 710 711 nexthop_bucket_nhid_count_check 10 2 6 712 check_fail $? "Group expected to be unbalanced" 713 714 $IP nexthop replace id 10 group 2 type resilient 715 nexthop_bucket_nhid_count_check 10 2 8 716 check_err $? "All buckets expected to have migrated" 717 718 log_test "Busy buckets force-migrated when NH removed" 719 720 $IP nexthop flush &> /dev/null 721} 722 723nexthop_single_replace_test() 724{ 725 RET=0 726 727 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 728 729 $IP nexthop replace id 1 via 192.0.2.3 dev dummy1 730 nexthop_check "id 1" "id 1 via 192.0.2.3 dev dummy1 scope link trap" 731 check_err $? "Unexpected nexthop entry" 732 733 nexthop_resource_check 1 734 check_err $? "Wrong nexthop occupancy" 735 736 log_test "Single nexthop replace" 737 738 $IP nexthop flush &> /dev/null 739} 740 741nexthop_single_replace_err_test() 742{ 743 RET=0 744 745 # This is supposed to cause the replace to fail because the new nexthop 746 # is programmed before deleting the replaced one. 747 nexthop_resource_set 1 748 749 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 750 751 $IP nexthop replace id 1 via 192.0.2.3 dev dummy1 &> /dev/null 752 check_fail $? "Nexthop replace succeeded when should fail" 753 754 nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap" 755 check_err $? "Unexpected nexthop entry after failure" 756 757 nexthop_resource_check 1 758 check_err $? "Wrong nexthop occupancy after failure" 759 760 log_test "Single nexthop replace failure" 761 762 $IP nexthop flush &> /dev/null 763 nexthop_resource_set 9999 764} 765 766nexthop_single_in_group_replace_test() 767{ 768 RET=0 769 770 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 771 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 772 $IP nexthop add id 10 group 1/2 773 774 $IP nexthop replace id 1 via 192.0.2.4 dev dummy1 775 check_err $? "Failed to replace nexthop when should not" 776 777 nexthop_check "id 10" "id 10 group 1/2 trap" 778 check_err $? "Unexpected nexthop group entry" 779 780 nexthop_resource_check 4 781 check_err $? "Wrong nexthop occupancy" 782 783 log_test "Single nexthop replace while in group" 784 785 $IP nexthop flush &> /dev/null 786} 787 788nexthop_single_in_group_replace_err_test() 789{ 790 RET=0 791 792 nexthop_resource_set 5 793 794 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 795 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 796 $IP nexthop add id 10 group 1/2 797 798 $IP nexthop replace id 1 via 192.0.2.4 dev dummy1 &> /dev/null 799 check_fail $? "Nexthop replacement succeeded when should fail" 800 801 nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap" 802 check_err $? "Unexpected nexthop entry after failure" 803 804 nexthop_check "id 10" "id 10 group 1/2 trap" 805 check_err $? "Unexpected nexthop group entry after failure" 806 807 nexthop_resource_check 4 808 check_err $? "Wrong nexthop occupancy" 809 810 log_test "Single nexthop replace while in group failure" 811 812 $IP nexthop flush &> /dev/null 813 nexthop_resource_set 9999 814} 815 816nexthop_single_in_res_group_replace_test() 817{ 818 RET=0 819 820 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 821 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 822 $IP nexthop add id 10 group 1/2 type resilient buckets 4 823 824 $IP nexthop replace id 1 via 192.0.2.4 dev dummy1 825 check_err $? "Failed to replace nexthop when should not" 826 827 nexthop_check "id 10" "id 10 group 1/2 type resilient buckets 4 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap" 828 check_err $? "Unexpected nexthop group entry" 829 830 nexthop_bucket_nhid_count_check 10 1 2 2 2 831 check_err $? "Wrong nexthop buckets count" 832 833 nexthop_resource_check 6 834 check_err $? "Wrong nexthop occupancy" 835 836 log_test "Single nexthop replace while in resilient group" 837 838 $IP nexthop flush &> /dev/null 839} 840 841nexthop_single_in_res_group_replace_err_test() 842{ 843 RET=0 844 845 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 846 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 847 $IP nexthop add id 10 group 1/2 type resilient buckets 4 848 849 ip netns exec testns1 \ 850 echo 1 > $DEBUGFS_NET_DIR/fib/fail_nexthop_bucket_replace 851 $IP nexthop replace id 1 via 192.0.2.4 dev dummy1 &> /dev/null 852 check_fail $? "Nexthop replacement succeeded when should fail" 853 854 nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap" 855 check_err $? "Unexpected nexthop entry after failure" 856 857 nexthop_check "id 10" "id 10 group 1/2 type resilient buckets 4 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap" 858 check_err $? "Unexpected nexthop group entry after failure" 859 860 nexthop_bucket_nhid_count_check 10 1 2 2 2 861 check_err $? "Wrong nexthop buckets count" 862 863 nexthop_resource_check 6 864 check_err $? "Wrong nexthop occupancy" 865 866 log_test "Single nexthop replace while in resilient group failure" 867 868 $IP nexthop flush &> /dev/null 869 ip netns exec testns1 \ 870 echo 0 > $DEBUGFS_NET_DIR/fib/fail_nexthop_bucket_replace 871} 872 873nexthop_single_in_group_delete_test() 874{ 875 RET=0 876 877 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 878 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 879 $IP nexthop add id 10 group 1/2 880 881 $IP nexthop del id 1 882 nexthop_check "id 10" "id 10 group 2 trap" 883 check_err $? "Unexpected nexthop group entry" 884 885 nexthop_resource_check 2 886 check_err $? "Wrong nexthop occupancy" 887 888 log_test "Single nexthop delete while in group" 889 890 $IP nexthop flush &> /dev/null 891} 892 893nexthop_single_in_group_delete_err_test() 894{ 895 RET=0 896 897 # First, nexthop 1 will be deleted, which will reduce the occupancy to 898 # 5. Afterwards, a replace notification will be sent for nexthop group 899 # 10 with only two nexthops. Since the new group is allocated before 900 # the old is deleted, the replacement will fail as it will result in an 901 # occupancy of 7. 902 nexthop_resource_set 6 903 904 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 905 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 906 $IP nexthop add id 3 via 192.0.2.4 dev dummy1 907 $IP nexthop add id 10 group 1/2/3 908 909 $IP nexthop del id 1 910 911 nexthop_resource_check 5 912 check_err $? "Wrong nexthop occupancy" 913 914 log_test "Single nexthop delete while in group failure" 915 916 $IP nexthop flush &> /dev/null 917 nexthop_resource_set 9999 918} 919 920nexthop_single_in_res_group_delete_test() 921{ 922 RET=0 923 924 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 925 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 926 $IP nexthop add id 10 group 1/2 type resilient buckets 4 927 928 $IP nexthop del id 1 929 nexthop_check "id 10" "id 10 group 2 type resilient buckets 4 idle_timer 120 unbalanced_timer 0 unbalanced_time 0 trap" 930 check_err $? "Unexpected nexthop group entry" 931 932 nexthop_bucket_nhid_count_check 10 2 4 933 check_err $? "Wrong nexthop buckets count" 934 935 nexthop_resource_check 5 936 check_err $? "Wrong nexthop occupancy" 937 938 log_test "Single nexthop delete while in resilient group" 939 940 $IP nexthop flush &> /dev/null 941} 942 943nexthop_single_in_res_group_delete_err_test() 944{ 945 RET=0 946 947 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 948 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 949 $IP nexthop add id 3 via 192.0.2.4 dev dummy1 950 $IP nexthop add id 10 group 1/2/3 type resilient buckets 6 951 952 ip netns exec testns1 \ 953 echo 1 > $DEBUGFS_NET_DIR/fib/fail_nexthop_bucket_replace 954 $IP nexthop del id 1 955 956 # We failed to replace the two nexthop buckets that were originally 957 # assigned to nhid 1. 958 nexthop_bucket_nhid_count_check 10 2 2 3 2 959 check_err $? "Wrong nexthop buckets count" 960 961 nexthop_resource_check 8 962 check_err $? "Wrong nexthop occupancy" 963 964 log_test "Single nexthop delete while in resilient group failure" 965 966 $IP nexthop flush &> /dev/null 967 ip netns exec testns1 \ 968 echo 0 > $DEBUGFS_NET_DIR/fib/fail_nexthop_bucket_replace 969} 970 971nexthop_replay_test() 972{ 973 RET=0 974 975 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 976 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 977 $IP nexthop add id 10 group 1/2 978 979 $DEVLINK dev reload $DEVLINK_DEV 980 check_err $? "Failed to reload when should not" 981 982 nexthop_check "id 1" "id 1 via 192.0.2.2 dev dummy1 scope link trap" 983 check_err $? "Unexpected nexthop entry after reload" 984 985 nexthop_check "id 2" "id 2 via 192.0.2.3 dev dummy1 scope link trap" 986 check_err $? "Unexpected nexthop entry after reload" 987 988 nexthop_check "id 10" "id 10 group 1/2 trap" 989 check_err $? "Unexpected nexthop group entry after reload" 990 991 nexthop_resource_check 4 992 check_err $? "Wrong nexthop occupancy" 993 994 log_test "Nexthop replay" 995 996 $IP nexthop flush &> /dev/null 997} 998 999nexthop_replay_err_test() 1000{ 1001 RET=0 1002 1003 $IP nexthop add id 1 via 192.0.2.2 dev dummy1 1004 $IP nexthop add id 2 via 192.0.2.3 dev dummy1 1005 $IP nexthop add id 10 group 1/2 1006 1007 # Reduce size of nexthop resource so that reload will fail. 1008 $DEVLINK resource set $DEVLINK_DEV path nexthops size 3 1009 $DEVLINK dev reload $DEVLINK_DEV &> /dev/null 1010 check_fail $? "Reload succeeded when should fail" 1011 1012 $DEVLINK resource set $DEVLINK_DEV path nexthops size 9999 1013 $DEVLINK dev reload $DEVLINK_DEV 1014 check_err $? "Failed to reload when should not" 1015 1016 log_test "Nexthop replay failure" 1017 1018 $IP nexthop flush &> /dev/null 1019} 1020 1021setup_prepare() 1022{ 1023 local netdev 1024 1025 modprobe netdevsim &> /dev/null 1026 1027 echo "$DEV_ADDR 1" > ${NETDEVSIM_PATH}/new_device 1028 while [ ! -d $SYSFS_NET_DIR ] ; do :; done 1029 1030 set -e 1031 1032 ip netns add testns1 1033 devlink dev reload $DEVLINK_DEV netns testns1 1034 1035 IP="ip -netns testns1" 1036 DEVLINK="devlink -N testns1" 1037 1038 $IP link add name dummy1 up type dummy 1039 $IP address add 192.0.2.1/24 dev dummy1 1040 1041 set +e 1042} 1043 1044cleanup() 1045{ 1046 pre_cleanup 1047 ip netns del testns1 1048 echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device 1049 modprobe -r netdevsim &> /dev/null 1050} 1051 1052trap cleanup EXIT 1053 1054setup_prepare 1055 1056tests_run 1057 1058exit $EXIT_STATUS 1059