1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4lib_dir=$(dirname $0)/../../../net/forwarding 5 6ALL_TESTS="fw_flash_test params_test \ 7 params_default_test regions_test reload_test \ 8 netns_reload_test resource_test dev_info_test \ 9 empty_reporter_test dummy_reporter_test rate_test" 10NUM_NETIFS=0 11source $lib_dir/lib.sh 12 13BUS_ADDR=10 14PORT_COUNT=4 15VF_COUNT=4 16DEV_NAME=netdevsim$BUS_ADDR 17SYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV_NAME/net/ 18DEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV_NAME/ 19DL_HANDLE=netdevsim/$DEV_NAME 20 21wait_for_devlink() 22{ 23 "$@" | grep -q $DL_HANDLE 24} 25 26devlink_wait() 27{ 28 local timeout=$1 29 30 busywait "$timeout" wait_for_devlink devlink dev 31} 32 33fw_flash_test() 34{ 35 DUMMYFILE=$(find /lib/firmware -type f -printf '%P\n' | head -1) 36 RET=0 37 38 if [ -z "$DUMMYFILE" ] 39 then 40 echo "SKIP: unable to find suitable dummy firmware file" 41 return 42 fi 43 44 echo "10"> $DEBUGFS_DIR/fw_update_flash_chunk_time_ms 45 46 devlink dev flash $DL_HANDLE file $DUMMYFILE 47 check_err $? "Failed to flash with status updates on" 48 49 devlink dev flash $DL_HANDLE file $DUMMYFILE component fw.mgmt 50 check_err $? "Failed to flash with component attribute" 51 52 devlink dev flash $DL_HANDLE file $DUMMYFILE overwrite settings 53 check_fail $? "Flash with overwrite settings should be rejected" 54 55 echo "1"> $DEBUGFS_DIR/fw_update_overwrite_mask 56 check_err $? "Failed to change allowed overwrite mask" 57 58 devlink dev flash $DL_HANDLE file $DUMMYFILE overwrite settings 59 check_err $? "Failed to flash with settings overwrite enabled" 60 61 devlink dev flash $DL_HANDLE file $DUMMYFILE overwrite identifiers 62 check_fail $? "Flash with overwrite settings should be identifiers" 63 64 echo "3"> $DEBUGFS_DIR/fw_update_overwrite_mask 65 check_err $? "Failed to change allowed overwrite mask" 66 67 devlink dev flash $DL_HANDLE file $DUMMYFILE overwrite identifiers overwrite settings 68 check_err $? "Failed to flash with settings and identifiers overwrite enabled" 69 70 echo "n"> $DEBUGFS_DIR/fw_update_status 71 check_err $? "Failed to disable status updates" 72 73 devlink dev flash $DL_HANDLE file $DUMMYFILE 74 check_err $? "Failed to flash with status updates off" 75 76 log_test "fw flash test" 77} 78 79param_get() 80{ 81 local name=$1 82 local attr=${2:-value} 83 local cmode=${3:-driverinit} 84 85 cmd_jq "devlink dev param show $DL_HANDLE name $name -j" \ 86 '.[][][].values[] | select(.cmode == "'"$cmode"'").'"$attr" 87} 88 89param_set() 90{ 91 local name=$1 92 local value=$2 93 local cmode=${3:-driverinit} 94 95 devlink dev param set $DL_HANDLE name $name cmode $cmode value $value 96} 97 98param_set_default() 99{ 100 local name=$1 101 local cmode=${2:-driverinit} 102 103 devlink dev param set $DL_HANDLE name $name default cmode $cmode 104} 105 106check_value() 107{ 108 local name=$1 109 local phase_name=$2 110 local expected_param_value=$3 111 local expected_debugfs_value=$4 112 local cmode=${5:-driverinit} 113 local value 114 local attr="value" 115 116 if [[ "$phase_name" == *"default"* ]]; then 117 attr="default" 118 fi 119 120 value=$(param_get $name $attr $cmode) 121 check_err $? "Failed to get $name param $attr" 122 [ "$value" == "$expected_param_value" ] 123 check_err $? "Unexpected $phase_name $name param $attr" 124 value=$(<$DEBUGFS_DIR/$name) 125 check_err $? "Failed to get $name debugfs value" 126 [ "$value" == "$expected_debugfs_value" ] 127 check_err $? "Unexpected $phase_name $name debugfs value" 128} 129 130params_test() 131{ 132 RET=0 133 134 local max_macs 135 local test1 136 137 check_value max_macs initial 32 32 138 check_value test1 initial true Y 139 140 param_set max_macs 16 141 check_err $? "Failed to set max_macs param value" 142 param_set test1 false 143 check_err $? "Failed to set test1 param value" 144 145 check_value max_macs post-set 16 32 146 check_value test1 post-set false Y 147 148 devlink dev reload $DL_HANDLE 149 150 check_value max_macs post-reload 16 16 151 check_value test1 post-reload false N 152 153 log_test "params test" 154} 155 156value_to_debugfs() 157{ 158 local value=$1 159 160 case "$value" in 161 true) 162 echo "Y" 163 ;; 164 false) 165 echo "N" 166 ;; 167 *) 168 echo "$value" 169 ;; 170 esac 171} 172 173test_default() 174{ 175 local param_name=$1 176 local new_value=$2 177 local expected_default=$3 178 local cmode=${4:-driverinit} 179 local default_debugfs 180 local new_debugfs 181 local expected_debugfs 182 183 default_debugfs=$(value_to_debugfs $expected_default) 184 new_debugfs=$(value_to_debugfs $new_value) 185 186 expected_debugfs=$default_debugfs 187 check_value $param_name initial-default $expected_default $expected_debugfs $cmode 188 189 param_set $param_name $new_value $cmode 190 check_err $? "Failed to set $param_name to $new_value" 191 192 expected_debugfs=$([ "$cmode" == "runtime" ] && echo "$new_debugfs" || echo "$default_debugfs") 193 check_value $param_name post-set $new_value $expected_debugfs $cmode 194 195 devlink dev reload $DL_HANDLE 196 check_err $? "Failed to reload device" 197 198 expected_debugfs=$new_debugfs 199 check_value $param_name post-reload-new-value $new_value $expected_debugfs $cmode 200 201 param_set_default $param_name $cmode 202 check_err $? "Failed to set $param_name to default" 203 204 expected_debugfs=$([ "$cmode" == "runtime" ] && echo "$default_debugfs" || echo "$new_debugfs") 205 check_value $param_name post-set-default $expected_default $expected_debugfs $cmode 206 207 devlink dev reload $DL_HANDLE 208 check_err $? "Failed to reload device" 209 210 expected_debugfs=$default_debugfs 211 check_value $param_name post-reload-default $expected_default $expected_debugfs $cmode 212} 213 214params_default_test() 215{ 216 RET=0 217 218 if ! devlink dev param help 2>&1 | grep -q "value VALUE | default"; then 219 echo "SKIP: devlink cli missing default feature" 220 return 221 fi 222 223 # Remove side effects of previous tests. Use plain param_set, because 224 # param_set_default is a feature under test here. 225 param_set max_macs 32 driverinit 226 check_err $? "Failed to reset max_macs to default value" 227 param_set test1 true driverinit 228 check_err $? "Failed to reset test1 to default value" 229 param_set test2 1234 runtime 230 check_err $? "Failed to reset test2 to default value" 231 232 devlink dev reload $DL_HANDLE 233 check_err $? "Failed to reload device for clean state" 234 235 test_default max_macs 16 32 driverinit 236 test_default test1 false true driverinit 237 test_default test2 100 1234 runtime 238 239 log_test "params default test" 240} 241 242check_region_size() 243{ 244 local name=$1 245 local size 246 247 size=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].size') 248 check_err $? "Failed to get $name region size" 249 [ $size -eq 32768 ] 250 check_err $? "Invalid $name region size" 251} 252 253check_region_snapshot_count() 254{ 255 local name=$1 256 local phase_name=$2 257 local expected_count=$3 258 local count 259 260 count=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].snapshot | length') 261 [ $count -eq $expected_count ] 262 check_err $? "Unexpected $phase_name snapshot count" 263} 264 265regions_test() 266{ 267 RET=0 268 269 local count 270 271 check_region_size dummy 272 check_region_snapshot_count dummy initial 0 273 274 echo ""> $DEBUGFS_DIR/take_snapshot 275 check_err $? "Failed to take first dummy region snapshot" 276 check_region_snapshot_count dummy post-first-snapshot 1 277 278 echo ""> $DEBUGFS_DIR/take_snapshot 279 check_err $? "Failed to take second dummy region snapshot" 280 check_region_snapshot_count dummy post-second-snapshot 2 281 282 echo ""> $DEBUGFS_DIR/take_snapshot 283 check_err $? "Failed to take third dummy region snapshot" 284 check_region_snapshot_count dummy post-third-snapshot 3 285 286 devlink region del $DL_HANDLE/dummy snapshot 1 287 check_err $? "Failed to delete first dummy region snapshot" 288 289 check_region_snapshot_count dummy post-first-delete 2 290 291 devlink region new $DL_HANDLE/dummy snapshot 25 292 check_err $? "Failed to create a new snapshot with id 25" 293 294 check_region_snapshot_count dummy post-first-request 3 295 296 devlink region dump $DL_HANDLE/dummy snapshot 25 >> /dev/null 297 check_err $? "Failed to dump snapshot with id 25" 298 299 devlink region read $DL_HANDLE/dummy snapshot 25 addr 0 len 1 >> /dev/null 300 check_err $? "Failed to read snapshot with id 25 (1 byte)" 301 302 devlink region read $DL_HANDLE/dummy snapshot 25 addr 128 len 128 >> /dev/null 303 check_err $? "Failed to read snapshot with id 25 (128 bytes)" 304 305 devlink region read $DL_HANDLE/dummy snapshot 25 addr 128 len $((1<<32)) >> /dev/null 306 check_err $? "Failed to read snapshot with id 25 (oversized)" 307 308 devlink region read $DL_HANDLE/dummy snapshot 25 addr $((1<<32)) len 128 >> /dev/null 2>&1 309 check_fail $? "Bad read of snapshot with id 25 did not fail" 310 311 devlink region del $DL_HANDLE/dummy snapshot 25 312 check_err $? "Failed to delete snapshot with id 25" 313 314 check_region_snapshot_count dummy post-second-delete 2 315 316 sid=$(devlink -j region new $DL_HANDLE/dummy | jq '.[][][][]') 317 check_err $? "Failed to create a new snapshot with id allocated by the kernel" 318 319 check_region_snapshot_count dummy post-first-request 3 320 321 devlink region dump $DL_HANDLE/dummy snapshot $sid >> /dev/null 322 check_err $? "Failed to dump a snapshot with id allocated by the kernel" 323 324 devlink region del $DL_HANDLE/dummy snapshot $sid 325 check_err $? "Failed to delete snapshot with id allocated by the kernel" 326 327 check_region_snapshot_count dummy post-first-request 2 328 329 log_test "regions test" 330} 331 332reload_test() 333{ 334 RET=0 335 336 devlink dev reload $DL_HANDLE 337 check_err $? "Failed to reload" 338 339 echo "y"> $DEBUGFS_DIR/fail_reload 340 check_err $? "Failed to setup devlink reload to fail" 341 342 devlink dev reload $DL_HANDLE 343 check_fail $? "Unexpected success of devlink reload" 344 345 echo "n"> $DEBUGFS_DIR/fail_reload 346 check_err $? "Failed to setup devlink reload not to fail" 347 348 devlink dev reload $DL_HANDLE 349 check_err $? "Failed to reload after set not to fail" 350 351 echo "y"> $DEBUGFS_DIR/dont_allow_reload 352 check_err $? "Failed to forbid devlink reload" 353 354 devlink dev reload $DL_HANDLE 355 check_fail $? "Unexpected success of devlink reload" 356 357 echo "n"> $DEBUGFS_DIR/dont_allow_reload 358 check_err $? "Failed to re-enable devlink reload" 359 360 devlink dev reload $DL_HANDLE 361 check_err $? "Failed to reload after re-enable" 362 363 log_test "reload test" 364} 365 366netns_reload_test() 367{ 368 RET=0 369 370 ip netns add testns1 371 check_err $? "Failed add netns \"testns1\"" 372 ip netns add testns2 373 check_err $? "Failed add netns \"testns2\"" 374 375 devlink dev reload $DL_HANDLE netns testns1 376 check_err $? "Failed to reload into netns \"testns1\"" 377 378 devlink -N testns1 dev reload $DL_HANDLE netns testns2 379 check_err $? "Failed to reload from netns \"testns1\" into netns \"testns2\"" 380 381 ip netns del testns2 382 ip netns del testns1 383 384 # Wait until netns async cleanup is done. 385 devlink_wait 2000 386 387 log_test "netns reload test" 388} 389 390DUMMYDEV="dummytest" 391 392res_val_get() 393{ 394 local netns=$1 395 local parentname=$2 396 local name=$3 397 local type=$4 398 399 cmd_jq "devlink -N $netns resource show $DL_HANDLE -j" \ 400 ".[][][] | select(.name == \"$parentname\").resources[] \ 401 | select(.name == \"$name\").$type" 402} 403 404resource_test() 405{ 406 RET=0 407 408 ip netns add testns1 409 check_err $? "Failed add netns \"testns1\"" 410 ip netns add testns2 411 check_err $? "Failed add netns \"testns2\"" 412 413 devlink dev reload $DL_HANDLE netns testns1 414 check_err $? "Failed to reload into netns \"testns1\"" 415 416 # Create dummy dev to add the address and routes on. 417 418 ip -n testns1 link add name $DUMMYDEV type dummy 419 check_err $? "Failed create dummy device" 420 ip -n testns1 link set $DUMMYDEV up 421 check_err $? "Failed bring up dummy device" 422 ip -n testns1 a a 192.0.1.1/24 dev $DUMMYDEV 423 check_err $? "Failed add an IP address to dummy device" 424 425 local occ=$(res_val_get testns1 IPv4 fib occ) 426 local limit=$((occ+1)) 427 428 # Set fib size limit to handle one another route only. 429 430 devlink -N testns1 resource set $DL_HANDLE path IPv4/fib size $limit 431 check_err $? "Failed to set IPv4/fib resource size" 432 local size_new=$(res_val_get testns1 IPv4 fib size_new) 433 [ "$size_new" -eq "$limit" ] 434 check_err $? "Unexpected \"size_new\" value (got $size_new, expected $limit)" 435 436 devlink -N testns1 dev reload $DL_HANDLE 437 check_err $? "Failed to reload" 438 local size=$(res_val_get testns1 IPv4 fib size) 439 [ "$size" -eq "$limit" ] 440 check_err $? "Unexpected \"size\" value (got $size, expected $limit)" 441 442 # Insert 2 routes, the first is going to be inserted, 443 # the second is expected to fail to be inserted. 444 445 ip -n testns1 r a 192.0.2.0/24 via 192.0.1.2 446 check_err $? "Failed to add route" 447 448 ip -n testns1 r a 192.0.3.0/24 via 192.0.1.2 449 check_fail $? "Unexpected successful route add over limit" 450 451 # Now create another dummy in second network namespace and 452 # insert two routes. That is over the limit of the netdevsim 453 # instance in the first namespace. Move the netdevsim instance 454 # into the second namespace and expect it to fail. 455 456 ip -n testns2 link add name $DUMMYDEV type dummy 457 check_err $? "Failed create dummy device" 458 ip -n testns2 link set $DUMMYDEV up 459 check_err $? "Failed bring up dummy device" 460 ip -n testns2 a a 192.0.1.1/24 dev $DUMMYDEV 461 check_err $? "Failed add an IP address to dummy device" 462 ip -n testns2 r a 192.0.2.0/24 via 192.0.1.2 463 check_err $? "Failed to add route" 464 ip -n testns2 r a 192.0.3.0/24 via 192.0.1.2 465 check_err $? "Failed to add route" 466 467 devlink -N testns1 dev reload $DL_HANDLE netns testns2 468 check_fail $? "Unexpected successful reload from netns \"testns1\" into netns \"testns2\"" 469 470 devlink -N testns2 resource set $DL_HANDLE path IPv4/fib size ' -1' 471 check_err $? "Failed to reset IPv4/fib resource size" 472 473 devlink -N testns2 dev reload $DL_HANDLE netns 1 474 check_err $? "Failed to reload devlink back" 475 476 ip netns del testns2 477 ip netns del testns1 478 479 # Wait until netns async cleanup is done. 480 devlink_wait 2000 481 482 log_test "resource test" 483} 484 485info_get() 486{ 487 local name=$1 488 489 cmd_jq "devlink dev info $DL_HANDLE -j" ".[][][\"$name\"]" "-e" 490} 491 492dev_info_test() 493{ 494 RET=0 495 496 driver=$(info_get "driver") 497 check_err $? "Failed to get driver name" 498 [ "$driver" == "netdevsim" ] 499 check_err $? "Unexpected driver name $driver" 500 501 log_test "dev_info test" 502} 503 504empty_reporter_test() 505{ 506 RET=0 507 508 devlink health show $DL_HANDLE reporter empty >/dev/null 509 check_err $? "Failed show empty reporter" 510 511 devlink health dump show $DL_HANDLE reporter empty >/dev/null 512 check_err $? "Failed show dump of empty reporter" 513 514 devlink health diagnose $DL_HANDLE reporter empty >/dev/null 515 check_err $? "Failed diagnose empty reporter" 516 517 devlink health recover $DL_HANDLE reporter empty 518 check_err $? "Failed recover empty reporter" 519 520 log_test "empty reporter test" 521} 522 523check_reporter_info() 524{ 525 local name=$1 526 local expected_state=$2 527 local expected_error=$3 528 local expected_recover=$4 529 local expected_grace_period=$5 530 local expected_auto_recover=$6 531 532 local show=$(devlink health show $DL_HANDLE reporter $name -j | jq -e -r ".[][][]") 533 check_err $? "Failed show $name reporter" 534 535 local state=$(echo $show | jq -r ".state") 536 [ "$state" == "$expected_state" ] 537 check_err $? "Unexpected \"state\" value (got $state, expected $expected_state)" 538 539 local error=$(echo $show | jq -r ".error") 540 [ "$error" == "$expected_error" ] 541 check_err $? "Unexpected \"error\" value (got $error, expected $expected_error)" 542 543 local recover=`echo $show | jq -r ".recover"` 544 [ "$recover" == "$expected_recover" ] 545 check_err $? "Unexpected \"recover\" value (got $recover, expected $expected_recover)" 546 547 local grace_period=$(echo $show | jq -r ".grace_period") 548 check_err $? "Failed get $name reporter grace_period" 549 [ "$grace_period" == "$expected_grace_period" ] 550 check_err $? "Unexpected \"grace_period\" value (got $grace_period, expected $expected_grace_period)" 551 552 local auto_recover=$(echo $show | jq -r ".auto_recover") 553 [ "$auto_recover" == "$expected_auto_recover" ] 554 check_err $? "Unexpected \"auto_recover\" value (got $auto_recover, expected $expected_auto_recover)" 555} 556 557dummy_reporter_test() 558{ 559 RET=0 560 561 check_reporter_info dummy healthy 0 0 0 true 562 563 devlink health set $DL_HANDLE reporter dummy auto_recover false 564 check_err $? "Failed to dummy reporter auto_recover option" 565 566 check_reporter_info dummy healthy 0 0 0 false 567 568 local BREAK_MSG="foo bar" 569 echo "$BREAK_MSG"> $DEBUGFS_DIR/health/break_health 570 check_err $? "Failed to break dummy reporter" 571 572 check_reporter_info dummy error 1 0 0 false 573 574 local dump=$(devlink health dump show $DL_HANDLE reporter dummy -j) 575 check_err $? "Failed show dump of dummy reporter" 576 577 local dump_break_msg=$(echo $dump | jq -r ".break_message") 578 [ "$dump_break_msg" == "$BREAK_MSG" ] 579 check_err $? "Unexpected dump break message value (got $dump_break_msg, expected $BREAK_MSG)" 580 581 devlink health dump clear $DL_HANDLE reporter dummy 582 check_err $? "Failed clear dump of dummy reporter" 583 584 devlink health recover $DL_HANDLE reporter dummy 585 check_err $? "Failed recover dummy reporter" 586 587 check_reporter_info dummy healthy 1 1 0 false 588 589 devlink health set $DL_HANDLE reporter dummy auto_recover true 590 check_err $? "Failed to dummy reporter auto_recover option" 591 592 check_reporter_info dummy healthy 1 1 0 true 593 594 echo "$BREAK_MSG"> $DEBUGFS_DIR/health/break_health 595 check_err $? "Failed to break dummy reporter" 596 597 check_reporter_info dummy healthy 2 2 0 true 598 599 local diagnose=$(devlink health diagnose $DL_HANDLE reporter dummy -j -p) 600 check_err $? "Failed show diagnose of dummy reporter" 601 602 local rcvrd_break_msg=$(echo $diagnose | jq -r ".recovered_break_message") 603 [ "$rcvrd_break_msg" == "$BREAK_MSG" ] 604 check_err $? "Unexpected recovered break message value (got $rcvrd_break_msg, expected $BREAK_MSG)" 605 606 devlink health set $DL_HANDLE reporter dummy grace_period 10 607 check_err $? "Failed to dummy reporter grace_period option" 608 609 check_reporter_info dummy healthy 2 2 10 true 610 611 echo "Y"> $DEBUGFS_DIR/health/fail_recover 612 check_err $? "Failed set dummy reporter recovery to fail" 613 614 echo "$BREAK_MSG"> $DEBUGFS_DIR/health/break_health 615 check_fail $? "Unexpected success of dummy reporter break" 616 617 check_reporter_info dummy error 3 2 10 true 618 619 devlink health recover $DL_HANDLE reporter dummy 620 check_fail $? "Unexpected success of dummy reporter recover" 621 622 echo "N"> $DEBUGFS_DIR/health/fail_recover 623 check_err $? "Failed set dummy reporter recovery to be successful" 624 625 devlink health recover $DL_HANDLE reporter dummy 626 check_err $? "Failed recover dummy reporter" 627 628 check_reporter_info dummy healthy 3 3 10 true 629 630 echo 8192 > $DEBUGFS_DIR/health/binary_len 631 check_err $? "Failed set dummy reporter binary len to 8192" 632 633 local dump=$(devlink health dump show $DL_HANDLE reporter dummy -j) 634 check_err $? "Failed show dump of dummy reporter" 635 636 devlink health dump clear $DL_HANDLE reporter dummy 637 check_err $? "Failed clear dump of dummy reporter" 638 639 log_test "dummy reporter test" 640} 641 642rate_leafs_get() 643{ 644 local handle=$1 645 646 cmd_jq "devlink port function rate show -j" \ 647 '.[] | to_entries | .[] | select(.value.type == "leaf") | .key | select(contains("'$handle'"))' 648} 649 650rate_nodes_get() 651{ 652 local handle=$1 653 654 cmd_jq "devlink port function rate show -j" \ 655 '.[] | to_entries | .[] | select(.value.type == "node") | .key | select(contains("'$handle'"))' 656} 657 658rate_attr_set() 659{ 660 local handle=$1 661 local name=$2 662 local value=$3 663 local units=$4 664 665 devlink port function rate set $handle $name $value$units 666} 667 668rate_attr_get() 669{ 670 local handle=$1 671 local name=$2 672 673 cmd_jq "devlink port function rate show $handle -j" '.[][].'$name 674} 675 676rate_attr_tx_rate_check() 677{ 678 local handle=$1 679 local name=$2 680 local rate=$3 681 local debug_file=$4 682 683 rate_attr_set $handle $name $rate mbit 684 check_err $? "Failed to set $name value" 685 686 local debug_value=$(cat $debug_file) 687 check_err $? "Failed to read $name value from debugfs" 688 [ "$debug_value" == "$rate" ] 689 check_err $? "Unexpected $name debug value $debug_value != $rate" 690 691 local api_value=$(( $(rate_attr_get $handle $name) * 8 / 1000000 )) 692 check_err $? "Failed to get $name attr value" 693 [ "$api_value" == "$rate" ] 694 check_err $? "Unexpected $name attr value $api_value != $rate" 695} 696 697rate_attr_parent_check() 698{ 699 local handle=$1 700 local parent=$2 701 local debug_file=$3 702 703 rate_attr_set $handle parent $parent 704 check_err $? "Failed to set parent" 705 706 debug_value=$(cat $debug_file) 707 check_err $? "Failed to get parent debugfs value" 708 [ "$debug_value" == "$parent" ] 709 check_err $? "Unexpected parent debug value $debug_value != $parent" 710 711 api_value=$(rate_attr_get $r_obj parent) 712 check_err $? "Failed to get parent attr value" 713 [ "$api_value" == "$parent" ] 714 check_err $? "Unexpected parent attr value $api_value != $parent" 715} 716 717rate_attr_tc_bw_check() 718{ 719 local handle=$1 720 local tc_bw=$2 721 local debug_file=$3 722 723 local tc_bw_str="" 724 for bw in $tc_bw; do 725 local tc=${bw%%:*} 726 local value=${bw##*:} 727 tc_bw_str="$tc_bw_str $tc:$value" 728 done 729 tc_bw_str=${tc_bw_str# } 730 731 rate_attr_set "$handle" tc-bw "$tc_bw_str" 732 check_err $? "Failed to set tc-bw values" 733 734 for bw in $tc_bw; do 735 local tc=${bw%%:*} 736 local value=${bw##*:} 737 local debug_value 738 debug_value=$(cat "$debug_file"/tc"${tc}"_bw) 739 check_err $? "Failed to read tc-bw value from debugfs for tc$tc" 740 [ "$debug_value" == "$value" ] 741 check_err $? "Unexpected tc-bw debug value for tc$tc: $debug_value != $value" 742 done 743 744 for bw in $tc_bw; do 745 local tc=${bw%%:*} 746 local expected_value=${bw##*:} 747 local api_value 748 api_value=$(rate_attr_get "$handle" tc_"$tc") 749 if [ "$api_value" = "null" ]; then 750 api_value=0 751 fi 752 [ "$api_value" == "$expected_value" ] 753 check_err $? "Unexpected tc-bw value for tc$tc: $api_value != $expected_value" 754 done 755} 756 757rate_node_add() 758{ 759 local handle=$1 760 761 devlink port function rate add $handle 762} 763 764rate_node_del() 765{ 766 local handle=$1 767 768 devlink port function rate del $handle 769} 770 771rate_test() 772{ 773 RET=0 774 775 echo $VF_COUNT > /sys/bus/netdevsim/devices/$DEV_NAME/sriov_numvfs 776 devlink dev eswitch set $DL_HANDLE mode switchdev 777 local leafs=`rate_leafs_get $DL_HANDLE` 778 local num_leafs=`echo $leafs | wc -w` 779 [ "$num_leafs" == "$VF_COUNT" ] 780 check_err $? "Expected $VF_COUNT rate leafs but got $num_leafs" 781 782 rate=10 783 for r_obj in $leafs 784 do 785 rate_attr_tx_rate_check $r_obj tx_share $rate \ 786 $DEBUGFS_DIR/ports/${r_obj##*/}/tx_share 787 rate=$(($rate+10)) 788 done 789 790 rate=100 791 for r_obj in $leafs 792 do 793 rate_attr_tx_rate_check $r_obj tx_max $rate \ 794 $DEBUGFS_DIR/ports/${r_obj##*/}/tx_max 795 rate=$(($rate+100)) 796 done 797 798 local tc_bw="0:0 1:40 2:0 3:0 4:0 5:0 6:60 7:0" 799 for r_obj in $leafs 800 do 801 rate_attr_tc_bw_check "$r_obj" "$tc_bw" \ 802 "$DEBUGFS_DIR"/ports/"${r_obj##*/}" 803 done 804 805 local node1_name='group1' 806 local node1="$DL_HANDLE/$node1_name" 807 rate_node_add "$node1" 808 check_err $? "Failed to add node $node1" 809 810 local num_nodes=`rate_nodes_get $DL_HANDLE | wc -w` 811 [ $num_nodes == 1 ] 812 check_err $? "Expected 1 rate node in output but got $num_nodes" 813 814 local node_tx_share=10 815 rate_attr_tx_rate_check $node1 tx_share $node_tx_share \ 816 $DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_share 817 818 local node_tx_max=100 819 rate_attr_tx_rate_check $node1 tx_max $node_tx_max \ 820 $DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_max 821 822 823 local tc_bw="0:20 1:0 2:0 3:0 4:0 5:20 6:60 7:0" 824 rate_attr_tc_bw_check $node1 "$tc_bw" \ 825 "$DEBUGFS_DIR"/rate_nodes/"${node1##*/}" 826 827 828 rate_node_del "$node1" 829 check_err $? "Failed to delete node $node1" 830 local num_nodes=`rate_nodes_get $DL_HANDLE | wc -w` 831 [ $num_nodes == 0 ] 832 check_err $? "Expected 0 rate node but got $num_nodes" 833 834 local node1_name='group1' 835 local node1="$DL_HANDLE/$node1_name" 836 rate_node_add "$node1" 837 check_err $? "Failed to add node $node1" 838 839 rate_attr_parent_check $r_obj $node1_name \ 840 $DEBUGFS_DIR/ports/${r_obj##*/}/rate_parent 841 842 local node2_name='group2' 843 local node2="$DL_HANDLE/$node2_name" 844 rate_node_add "$node2" 845 check_err $? "Failed to add node $node2" 846 847 rate_attr_parent_check $node2 $node1_name \ 848 $DEBUGFS_DIR/rate_nodes/$node2_name/rate_parent 849 rate_node_del "$node2" 850 check_err $? "Failed to delete node $node2" 851 rate_attr_set "$r_obj" noparent 852 check_err $? "Failed to unset $r_obj parent node" 853 rate_node_del "$node1" 854 check_err $? "Failed to delete node $node1" 855 856 log_test "rate test" 857} 858 859setup_prepare() 860{ 861 modprobe netdevsim 862 echo "$BUS_ADDR $PORT_COUNT" > /sys/bus/netdevsim/new_device 863 while [ ! -d $SYSFS_NET_DIR ] ; do :; done 864} 865 866cleanup() 867{ 868 pre_cleanup 869 echo "$BUS_ADDR" > /sys/bus/netdevsim/del_device 870 modprobe -r netdevsim 871} 872 873trap cleanup EXIT 874 875setup_prepare 876 877tests_run 878 879exit $EXIT_STATUS 880