1fc4c93f1SJiri Pirko#!/bin/bash 2fc4c93f1SJiri Pirko# SPDX-License-Identifier: GPL-2.0 3fc4c93f1SJiri Pirko 4fc4c93f1SJiri Pirkolib_dir=$(dirname $0)/../../../net/forwarding 5fc4c93f1SJiri Pirko 6b74c37fdSJiri PirkoALL_TESTS="fw_flash_test params_test regions_test reload_test \ 79b88fc54SJiri Pirko netns_reload_test resource_test dev_info_test \ 8a27d8e35SDmytro Linkin empty_reporter_test dummy_reporter_test rate_test" 9fc4c93f1SJiri PirkoNUM_NETIFS=0 10fc4c93f1SJiri Pirkosource $lib_dir/lib.sh 11fc4c93f1SJiri Pirko 12fc4c93f1SJiri PirkoBUS_ADDR=10 13fc4c93f1SJiri PirkoPORT_COUNT=4 14a27d8e35SDmytro LinkinVF_COUNT=4 15fc4c93f1SJiri PirkoDEV_NAME=netdevsim$BUS_ADDR 16fc4c93f1SJiri PirkoSYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV_NAME/net/ 17fc4c93f1SJiri PirkoDEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV_NAME/ 18fc4c93f1SJiri PirkoDL_HANDLE=netdevsim/$DEV_NAME 19fc4c93f1SJiri Pirko 20*f922c7b1SJiri Pirkowait_for_devlink() 21*f922c7b1SJiri Pirko{ 22*f922c7b1SJiri Pirko "$@" | grep -q $DL_HANDLE 23*f922c7b1SJiri Pirko} 24*f922c7b1SJiri Pirko 25*f922c7b1SJiri Pirkodevlink_wait() 26*f922c7b1SJiri Pirko{ 27*f922c7b1SJiri Pirko local timeout=$1 28*f922c7b1SJiri Pirko 29*f922c7b1SJiri Pirko busywait "$timeout" wait_for_devlink devlink dev 30*f922c7b1SJiri Pirko} 31*f922c7b1SJiri Pirko 32fc4c93f1SJiri Pirkofw_flash_test() 33fc4c93f1SJiri Pirko{ 34fc4c93f1SJiri Pirko RET=0 35fc4c93f1SJiri Pirko 36fc4c93f1SJiri Pirko devlink dev flash $DL_HANDLE file dummy 37fc4c93f1SJiri Pirko check_err $? "Failed to flash with status updates on" 38fc4c93f1SJiri Pirko 39bc75c054SJacob Keller devlink dev flash $DL_HANDLE file dummy component fw.mgmt 40bc75c054SJacob Keller check_err $? "Failed to flash with component attribute" 41bc75c054SJacob Keller 42cbb58368SJacob Keller devlink dev flash $DL_HANDLE file dummy overwrite settings 43cbb58368SJacob Keller check_fail $? "Flash with overwrite settings should be rejected" 44cbb58368SJacob Keller 45cbb58368SJacob Keller echo "1"> $DEBUGFS_DIR/fw_update_overwrite_mask 46cbb58368SJacob Keller check_err $? "Failed to change allowed overwrite mask" 47cbb58368SJacob Keller 48cbb58368SJacob Keller devlink dev flash $DL_HANDLE file dummy overwrite settings 49cbb58368SJacob Keller check_err $? "Failed to flash with settings overwrite enabled" 50cbb58368SJacob Keller 51cbb58368SJacob Keller devlink dev flash $DL_HANDLE file dummy overwrite identifiers 52cbb58368SJacob Keller check_fail $? "Flash with overwrite settings should be identifiers" 53cbb58368SJacob Keller 54cbb58368SJacob Keller echo "3"> $DEBUGFS_DIR/fw_update_overwrite_mask 55cbb58368SJacob Keller check_err $? "Failed to change allowed overwrite mask" 56cbb58368SJacob Keller 57cbb58368SJacob Keller devlink dev flash $DL_HANDLE file dummy overwrite identifiers overwrite settings 58cbb58368SJacob Keller check_err $? "Failed to flash with settings and identifiers overwrite enabled" 59cbb58368SJacob Keller 60fc4c93f1SJiri Pirko echo "n"> $DEBUGFS_DIR/fw_update_status 61fc4c93f1SJiri Pirko check_err $? "Failed to disable status updates" 62fc4c93f1SJiri Pirko 63fc4c93f1SJiri Pirko devlink dev flash $DL_HANDLE file dummy 64fc4c93f1SJiri Pirko check_err $? "Failed to flash with status updates off" 65fc4c93f1SJiri Pirko 66fc4c93f1SJiri Pirko log_test "fw flash test" 67fc4c93f1SJiri Pirko} 68fc4c93f1SJiri Pirko 69dc8a670aSJiri Pirkoparam_get() 70dc8a670aSJiri Pirko{ 71dc8a670aSJiri Pirko local name=$1 72dc8a670aSJiri Pirko 73dc8a670aSJiri Pirko cmd_jq "devlink dev param show $DL_HANDLE name $name -j" \ 74dc8a670aSJiri Pirko '.[][][].values[] | select(.cmode == "driverinit").value' 75dc8a670aSJiri Pirko} 76dc8a670aSJiri Pirko 77dc8a670aSJiri Pirkoparam_set() 78dc8a670aSJiri Pirko{ 79dc8a670aSJiri Pirko local name=$1 80dc8a670aSJiri Pirko local value=$2 81dc8a670aSJiri Pirko 82dc8a670aSJiri Pirko devlink dev param set $DL_HANDLE name $name cmode driverinit value $value 83dc8a670aSJiri Pirko} 84dc8a670aSJiri Pirko 85dc8a670aSJiri Pirkocheck_value() 86dc8a670aSJiri Pirko{ 87dc8a670aSJiri Pirko local name=$1 88dc8a670aSJiri Pirko local phase_name=$2 89dc8a670aSJiri Pirko local expected_param_value=$3 90dc8a670aSJiri Pirko local expected_debugfs_value=$4 91dc8a670aSJiri Pirko local value 92dc8a670aSJiri Pirko 93dc8a670aSJiri Pirko value=$(param_get $name) 94dc8a670aSJiri Pirko check_err $? "Failed to get $name param value" 95dc8a670aSJiri Pirko [ "$value" == "$expected_param_value" ] 96dc8a670aSJiri Pirko check_err $? "Unexpected $phase_name $name param value" 97dc8a670aSJiri Pirko value=$(<$DEBUGFS_DIR/$name) 98dc8a670aSJiri Pirko check_err $? "Failed to get $name debugfs value" 99dc8a670aSJiri Pirko [ "$value" == "$expected_debugfs_value" ] 100dc8a670aSJiri Pirko check_err $? "Unexpected $phase_name $name debugfs value" 101dc8a670aSJiri Pirko} 102dc8a670aSJiri Pirko 103dc8a670aSJiri Pirkoparams_test() 104dc8a670aSJiri Pirko{ 105dc8a670aSJiri Pirko RET=0 106dc8a670aSJiri Pirko 107dc8a670aSJiri Pirko local max_macs 108dc8a670aSJiri Pirko local test1 109dc8a670aSJiri Pirko 110dc8a670aSJiri Pirko check_value max_macs initial 32 32 111dc8a670aSJiri Pirko check_value test1 initial true Y 112dc8a670aSJiri Pirko 113dc8a670aSJiri Pirko param_set max_macs 16 114dc8a670aSJiri Pirko check_err $? "Failed to set max_macs param value" 115dc8a670aSJiri Pirko param_set test1 false 116dc8a670aSJiri Pirko check_err $? "Failed to set test1 param value" 117dc8a670aSJiri Pirko 118dc8a670aSJiri Pirko check_value max_macs post-set 16 32 119dc8a670aSJiri Pirko check_value test1 post-set false Y 120dc8a670aSJiri Pirko 121dc8a670aSJiri Pirko devlink dev reload $DL_HANDLE 122dc8a670aSJiri Pirko 123dc8a670aSJiri Pirko check_value max_macs post-reload 16 16 124dc8a670aSJiri Pirko check_value test1 post-reload false N 125dc8a670aSJiri Pirko 126dc8a670aSJiri Pirko log_test "params test" 127dc8a670aSJiri Pirko} 128dc8a670aSJiri Pirko 1295156d7efSJiri Pirkocheck_region_size() 1305156d7efSJiri Pirko{ 1315156d7efSJiri Pirko local name=$1 1325156d7efSJiri Pirko local size 1335156d7efSJiri Pirko 1345156d7efSJiri Pirko size=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].size') 1355156d7efSJiri Pirko check_err $? "Failed to get $name region size" 1365156d7efSJiri Pirko [ $size -eq 32768 ] 1375156d7efSJiri Pirko check_err $? "Invalid $name region size" 1385156d7efSJiri Pirko} 1395156d7efSJiri Pirko 1405156d7efSJiri Pirkocheck_region_snapshot_count() 1415156d7efSJiri Pirko{ 1425156d7efSJiri Pirko local name=$1 1435156d7efSJiri Pirko local phase_name=$2 1445156d7efSJiri Pirko local expected_count=$3 1455156d7efSJiri Pirko local count 1465156d7efSJiri Pirko 1475156d7efSJiri Pirko count=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].snapshot | length') 1485156d7efSJiri Pirko [ $count -eq $expected_count ] 1495156d7efSJiri Pirko check_err $? "Unexpected $phase_name snapshot count" 1505156d7efSJiri Pirko} 1515156d7efSJiri Pirko 1525156d7efSJiri Pirkoregions_test() 1535156d7efSJiri Pirko{ 1545156d7efSJiri Pirko RET=0 1555156d7efSJiri Pirko 1565156d7efSJiri Pirko local count 1575156d7efSJiri Pirko 1585156d7efSJiri Pirko check_region_size dummy 1595156d7efSJiri Pirko check_region_snapshot_count dummy initial 0 1605156d7efSJiri Pirko 1615156d7efSJiri Pirko echo ""> $DEBUGFS_DIR/take_snapshot 1625156d7efSJiri Pirko check_err $? "Failed to take first dummy region snapshot" 1635156d7efSJiri Pirko check_region_snapshot_count dummy post-first-snapshot 1 1645156d7efSJiri Pirko 1655156d7efSJiri Pirko echo ""> $DEBUGFS_DIR/take_snapshot 1665156d7efSJiri Pirko check_err $? "Failed to take second dummy region snapshot" 1675156d7efSJiri Pirko check_region_snapshot_count dummy post-second-snapshot 2 1685156d7efSJiri Pirko 1695156d7efSJiri Pirko echo ""> $DEBUGFS_DIR/take_snapshot 1705156d7efSJiri Pirko check_err $? "Failed to take third dummy region snapshot" 1715156d7efSJiri Pirko check_region_snapshot_count dummy post-third-snapshot 3 1725156d7efSJiri Pirko 1735156d7efSJiri Pirko devlink region del $DL_HANDLE/dummy snapshot 1 1745156d7efSJiri Pirko check_err $? "Failed to delete first dummy region snapshot" 1755156d7efSJiri Pirko 1765156d7efSJiri Pirko check_region_snapshot_count dummy post-first-delete 2 1775156d7efSJiri Pirko 1783fe0fd53SJacob Keller devlink region new $DL_HANDLE/dummy snapshot 25 1793fe0fd53SJacob Keller check_err $? "Failed to create a new snapshot with id 25" 1803fe0fd53SJacob Keller 1813fe0fd53SJacob Keller check_region_snapshot_count dummy post-first-request 3 1823fe0fd53SJacob Keller 1835a46b062SJakub Kicinski devlink region dump $DL_HANDLE/dummy snapshot 25 >> /dev/null 1845a46b062SJakub Kicinski check_err $? "Failed to dump snapshot with id 25" 1855a46b062SJakub Kicinski 1865a46b062SJakub Kicinski devlink region read $DL_HANDLE/dummy snapshot 25 addr 0 len 1 >> /dev/null 1875a46b062SJakub Kicinski check_err $? "Failed to read snapshot with id 25 (1 byte)" 1885a46b062SJakub Kicinski 1895a46b062SJakub Kicinski devlink region read $DL_HANDLE/dummy snapshot 25 addr 128 len 128 >> /dev/null 1905a46b062SJakub Kicinski check_err $? "Failed to read snapshot with id 25 (128 bytes)" 1915a46b062SJakub Kicinski 1925a46b062SJakub Kicinski devlink region read $DL_HANDLE/dummy snapshot 25 addr 128 len $((1<<32)) >> /dev/null 1935a46b062SJakub Kicinski check_err $? "Failed to read snapshot with id 25 (oversized)" 1945a46b062SJakub Kicinski 1955a46b062SJakub Kicinski devlink region read $DL_HANDLE/dummy snapshot 25 addr $((1<<32)) len 128 >> /dev/null 2>&1 1965a46b062SJakub Kicinski check_fail $? "Bad read of snapshot with id 25 did not fail" 1975a46b062SJakub Kicinski 1983fe0fd53SJacob Keller devlink region del $DL_HANDLE/dummy snapshot 25 1993fe0fd53SJacob Keller check_err $? "Failed to delete snapshot with id 25" 2003fe0fd53SJacob Keller 2013fe0fd53SJacob Keller check_region_snapshot_count dummy post-second-delete 2 2023fe0fd53SJacob Keller 203043b3e22SJakub Kicinski sid=$(devlink -j region new $DL_HANDLE/dummy | jq '.[][][][]') 204043b3e22SJakub Kicinski check_err $? "Failed to create a new snapshot with id allocated by the kernel" 205043b3e22SJakub Kicinski 206043b3e22SJakub Kicinski check_region_snapshot_count dummy post-first-request 3 207043b3e22SJakub Kicinski 208043b3e22SJakub Kicinski devlink region dump $DL_HANDLE/dummy snapshot $sid >> /dev/null 209043b3e22SJakub Kicinski check_err $? "Failed to dump a snapshot with id allocated by the kernel" 210043b3e22SJakub Kicinski 211043b3e22SJakub Kicinski devlink region del $DL_HANDLE/dummy snapshot $sid 212043b3e22SJakub Kicinski check_err $? "Failed to delete snapshot with id allocated by the kernel" 213043b3e22SJakub Kicinski 214043b3e22SJakub Kicinski check_region_snapshot_count dummy post-first-request 2 215043b3e22SJakub Kicinski 2165156d7efSJiri Pirko log_test "regions test" 2175156d7efSJiri Pirko} 2185156d7efSJiri Pirko 219b74c37fdSJiri Pirkoreload_test() 220b74c37fdSJiri Pirko{ 221b74c37fdSJiri Pirko RET=0 222b74c37fdSJiri Pirko 223b74c37fdSJiri Pirko devlink dev reload $DL_HANDLE 224b74c37fdSJiri Pirko check_err $? "Failed to reload" 225b74c37fdSJiri Pirko 2269278bc9fSJiri Pirko echo "y"> $DEBUGFS_DIR/fail_reload 2279278bc9fSJiri Pirko check_err $? "Failed to setup devlink reload to fail" 2289278bc9fSJiri Pirko 2299278bc9fSJiri Pirko devlink dev reload $DL_HANDLE 2309278bc9fSJiri Pirko check_fail $? "Unexpected success of devlink reload" 2319278bc9fSJiri Pirko 2329278bc9fSJiri Pirko echo "n"> $DEBUGFS_DIR/fail_reload 2339278bc9fSJiri Pirko check_err $? "Failed to setup devlink reload not to fail" 2349278bc9fSJiri Pirko 2359278bc9fSJiri Pirko devlink dev reload $DL_HANDLE 2369278bc9fSJiri Pirko check_err $? "Failed to reload after set not to fail" 2379278bc9fSJiri Pirko 2389278bc9fSJiri Pirko echo "y"> $DEBUGFS_DIR/dont_allow_reload 2399278bc9fSJiri Pirko check_err $? "Failed to forbid devlink reload" 2409278bc9fSJiri Pirko 2419278bc9fSJiri Pirko devlink dev reload $DL_HANDLE 2429278bc9fSJiri Pirko check_fail $? "Unexpected success of devlink reload" 2439278bc9fSJiri Pirko 2449278bc9fSJiri Pirko echo "n"> $DEBUGFS_DIR/dont_allow_reload 2459278bc9fSJiri Pirko check_err $? "Failed to re-enable devlink reload" 2469278bc9fSJiri Pirko 2479278bc9fSJiri Pirko devlink dev reload $DL_HANDLE 2489278bc9fSJiri Pirko check_err $? "Failed to reload after re-enable" 2499278bc9fSJiri Pirko 250b74c37fdSJiri Pirko log_test "reload test" 251b74c37fdSJiri Pirko} 252b74c37fdSJiri Pirko 253b74c37fdSJiri Pirkonetns_reload_test() 254b74c37fdSJiri Pirko{ 255b74c37fdSJiri Pirko RET=0 256b74c37fdSJiri Pirko 257b74c37fdSJiri Pirko ip netns add testns1 258b74c37fdSJiri Pirko check_err $? "Failed add netns \"testns1\"" 259b74c37fdSJiri Pirko ip netns add testns2 260b74c37fdSJiri Pirko check_err $? "Failed add netns \"testns2\"" 261b74c37fdSJiri Pirko 262b74c37fdSJiri Pirko devlink dev reload $DL_HANDLE netns testns1 263b74c37fdSJiri Pirko check_err $? "Failed to reload into netns \"testns1\"" 264b74c37fdSJiri Pirko 265b74c37fdSJiri Pirko devlink -N testns1 dev reload $DL_HANDLE netns testns2 266b74c37fdSJiri Pirko check_err $? "Failed to reload from netns \"testns1\" into netns \"testns2\"" 267b74c37fdSJiri Pirko 268b74c37fdSJiri Pirko ip netns del testns2 269b74c37fdSJiri Pirko ip netns del testns1 270b74c37fdSJiri Pirko 271*f922c7b1SJiri Pirko # Wait until netns async cleanup is done. 272*f922c7b1SJiri Pirko devlink_wait 2000 273*f922c7b1SJiri Pirko 274b74c37fdSJiri Pirko log_test "netns reload test" 275b74c37fdSJiri Pirko} 276b74c37fdSJiri Pirko 277b74c37fdSJiri PirkoDUMMYDEV="dummytest" 278b74c37fdSJiri Pirko 279b74c37fdSJiri Pirkores_val_get() 280b74c37fdSJiri Pirko{ 281b74c37fdSJiri Pirko local netns=$1 282b74c37fdSJiri Pirko local parentname=$2 283b74c37fdSJiri Pirko local name=$3 284b74c37fdSJiri Pirko local type=$4 285b74c37fdSJiri Pirko 286b74c37fdSJiri Pirko cmd_jq "devlink -N $netns resource show $DL_HANDLE -j" \ 287b74c37fdSJiri Pirko ".[][][] | select(.name == \"$parentname\").resources[] \ 288b74c37fdSJiri Pirko | select(.name == \"$name\").$type" 289b74c37fdSJiri Pirko} 290b74c37fdSJiri Pirko 291b74c37fdSJiri Pirkoresource_test() 292b74c37fdSJiri Pirko{ 293b74c37fdSJiri Pirko RET=0 294b74c37fdSJiri Pirko 295b74c37fdSJiri Pirko ip netns add testns1 296b74c37fdSJiri Pirko check_err $? "Failed add netns \"testns1\"" 297b74c37fdSJiri Pirko ip netns add testns2 298b74c37fdSJiri Pirko check_err $? "Failed add netns \"testns2\"" 299b74c37fdSJiri Pirko 300b74c37fdSJiri Pirko devlink dev reload $DL_HANDLE netns testns1 301b74c37fdSJiri Pirko check_err $? "Failed to reload into netns \"testns1\"" 302b74c37fdSJiri Pirko 303b74c37fdSJiri Pirko # Create dummy dev to add the address and routes on. 304b74c37fdSJiri Pirko 305b74c37fdSJiri Pirko ip -n testns1 link add name $DUMMYDEV type dummy 306b74c37fdSJiri Pirko check_err $? "Failed create dummy device" 307b74c37fdSJiri Pirko ip -n testns1 link set $DUMMYDEV up 308b74c37fdSJiri Pirko check_err $? "Failed bring up dummy device" 309b74c37fdSJiri Pirko ip -n testns1 a a 192.0.1.1/24 dev $DUMMYDEV 310b74c37fdSJiri Pirko check_err $? "Failed add an IP address to dummy device" 311b74c37fdSJiri Pirko 312b74c37fdSJiri Pirko local occ=$(res_val_get testns1 IPv4 fib occ) 313b74c37fdSJiri Pirko local limit=$((occ+1)) 314b74c37fdSJiri Pirko 315b74c37fdSJiri Pirko # Set fib size limit to handle one another route only. 316b74c37fdSJiri Pirko 317b74c37fdSJiri Pirko devlink -N testns1 resource set $DL_HANDLE path IPv4/fib size $limit 318b74c37fdSJiri Pirko check_err $? "Failed to set IPv4/fib resource size" 319b74c37fdSJiri Pirko local size_new=$(res_val_get testns1 IPv4 fib size_new) 320b74c37fdSJiri Pirko [ "$size_new" -eq "$limit" ] 321b74c37fdSJiri Pirko check_err $? "Unexpected \"size_new\" value (got $size_new, expected $limit)" 322b74c37fdSJiri Pirko 323b74c37fdSJiri Pirko devlink -N testns1 dev reload $DL_HANDLE 324b74c37fdSJiri Pirko check_err $? "Failed to reload" 325b74c37fdSJiri Pirko local size=$(res_val_get testns1 IPv4 fib size) 326b74c37fdSJiri Pirko [ "$size" -eq "$limit" ] 327b74c37fdSJiri Pirko check_err $? "Unexpected \"size\" value (got $size, expected $limit)" 328b74c37fdSJiri Pirko 329b74c37fdSJiri Pirko # Insert 2 routes, the first is going to be inserted, 330b74c37fdSJiri Pirko # the second is expected to fail to be inserted. 331b74c37fdSJiri Pirko 332b74c37fdSJiri Pirko ip -n testns1 r a 192.0.2.0/24 via 192.0.1.2 333b74c37fdSJiri Pirko check_err $? "Failed to add route" 334b74c37fdSJiri Pirko 335b74c37fdSJiri Pirko ip -n testns1 r a 192.0.3.0/24 via 192.0.1.2 336b74c37fdSJiri Pirko check_fail $? "Unexpected successful route add over limit" 337b74c37fdSJiri Pirko 338b74c37fdSJiri Pirko # Now create another dummy in second network namespace and 339b74c37fdSJiri Pirko # insert two routes. That is over the limit of the netdevsim 340b74c37fdSJiri Pirko # instance in the first namespace. Move the netdevsim instance 341b74c37fdSJiri Pirko # into the second namespace and expect it to fail. 342b74c37fdSJiri Pirko 343b74c37fdSJiri Pirko ip -n testns2 link add name $DUMMYDEV type dummy 344b74c37fdSJiri Pirko check_err $? "Failed create dummy device" 345b74c37fdSJiri Pirko ip -n testns2 link set $DUMMYDEV up 346b74c37fdSJiri Pirko check_err $? "Failed bring up dummy device" 347b74c37fdSJiri Pirko ip -n testns2 a a 192.0.1.1/24 dev $DUMMYDEV 348b74c37fdSJiri Pirko check_err $? "Failed add an IP address to dummy device" 349b74c37fdSJiri Pirko ip -n testns2 r a 192.0.2.0/24 via 192.0.1.2 350b74c37fdSJiri Pirko check_err $? "Failed to add route" 351b74c37fdSJiri Pirko ip -n testns2 r a 192.0.3.0/24 via 192.0.1.2 352b74c37fdSJiri Pirko check_err $? "Failed to add route" 353b74c37fdSJiri Pirko 354b74c37fdSJiri Pirko devlink -N testns1 dev reload $DL_HANDLE netns testns2 355b74c37fdSJiri Pirko check_fail $? "Unexpected successful reload from netns \"testns1\" into netns \"testns2\"" 356b74c37fdSJiri Pirko 357462ef975SJakub Kicinski devlink -N testns2 resource set $DL_HANDLE path IPv4/fib size ' -1' 358462ef975SJakub Kicinski check_err $? "Failed to reset IPv4/fib resource size" 359462ef975SJakub Kicinski 360462ef975SJakub Kicinski devlink -N testns2 dev reload $DL_HANDLE netns 1 361462ef975SJakub Kicinski check_err $? "Failed to reload devlink back" 362462ef975SJakub Kicinski 363b74c37fdSJiri Pirko ip netns del testns2 364b74c37fdSJiri Pirko ip netns del testns1 365b74c37fdSJiri Pirko 366*f922c7b1SJiri Pirko # Wait until netns async cleanup is done. 367*f922c7b1SJiri Pirko devlink_wait 2000 368*f922c7b1SJiri Pirko 369b74c37fdSJiri Pirko log_test "resource test" 370b74c37fdSJiri Pirko} 371b74c37fdSJiri Pirko 37262ede55fSJiri Pirkoinfo_get() 37362ede55fSJiri Pirko{ 37462ede55fSJiri Pirko local name=$1 37562ede55fSJiri Pirko 37662ede55fSJiri Pirko cmd_jq "devlink dev info $DL_HANDLE -j" ".[][][\"$name\"]" "-e" 37762ede55fSJiri Pirko} 37862ede55fSJiri Pirko 37962ede55fSJiri Pirkodev_info_test() 38062ede55fSJiri Pirko{ 38162ede55fSJiri Pirko RET=0 38262ede55fSJiri Pirko 38362ede55fSJiri Pirko driver=$(info_get "driver") 38462ede55fSJiri Pirko check_err $? "Failed to get driver name" 38562ede55fSJiri Pirko [ "$driver" == "netdevsim" ] 38662ede55fSJiri Pirko check_err $? "Unexpected driver name $driver" 38762ede55fSJiri Pirko 38862ede55fSJiri Pirko log_test "dev_info test" 38962ede55fSJiri Pirko} 39062ede55fSJiri Pirko 3919b88fc54SJiri Pirkoempty_reporter_test() 3929b88fc54SJiri Pirko{ 3939b88fc54SJiri Pirko RET=0 3949b88fc54SJiri Pirko 3959b88fc54SJiri Pirko devlink health show $DL_HANDLE reporter empty >/dev/null 3969b88fc54SJiri Pirko check_err $? "Failed show empty reporter" 3979b88fc54SJiri Pirko 3989b88fc54SJiri Pirko devlink health dump show $DL_HANDLE reporter empty >/dev/null 3999b88fc54SJiri Pirko check_err $? "Failed show dump of empty reporter" 4009b88fc54SJiri Pirko 4019b88fc54SJiri Pirko devlink health diagnose $DL_HANDLE reporter empty >/dev/null 4029b88fc54SJiri Pirko check_err $? "Failed diagnose empty reporter" 4039b88fc54SJiri Pirko 4049b88fc54SJiri Pirko devlink health recover $DL_HANDLE reporter empty 4059b88fc54SJiri Pirko check_err $? "Failed recover empty reporter" 4069b88fc54SJiri Pirko 4079b88fc54SJiri Pirko log_test "empty reporter test" 4089b88fc54SJiri Pirko} 4099b88fc54SJiri Pirko 4109b88fc54SJiri Pirkocheck_reporter_info() 4119b88fc54SJiri Pirko{ 4129b88fc54SJiri Pirko local name=$1 4139b88fc54SJiri Pirko local expected_state=$2 4149b88fc54SJiri Pirko local expected_error=$3 4159b88fc54SJiri Pirko local expected_recover=$4 4169b88fc54SJiri Pirko local expected_grace_period=$5 4179b88fc54SJiri Pirko local expected_auto_recover=$6 4189b88fc54SJiri Pirko 4199b88fc54SJiri Pirko local show=$(devlink health show $DL_HANDLE reporter $name -j | jq -e -r ".[][][]") 4209b88fc54SJiri Pirko check_err $? "Failed show $name reporter" 4219b88fc54SJiri Pirko 4229b88fc54SJiri Pirko local state=$(echo $show | jq -r ".state") 4239b88fc54SJiri Pirko [ "$state" == "$expected_state" ] 4249b88fc54SJiri Pirko check_err $? "Unexpected \"state\" value (got $state, expected $expected_state)" 4259b88fc54SJiri Pirko 4269b88fc54SJiri Pirko local error=$(echo $show | jq -r ".error") 4279b88fc54SJiri Pirko [ "$error" == "$expected_error" ] 4289b88fc54SJiri Pirko check_err $? "Unexpected \"error\" value (got $error, expected $expected_error)" 4299b88fc54SJiri Pirko 4309b88fc54SJiri Pirko local recover=`echo $show | jq -r ".recover"` 4319b88fc54SJiri Pirko [ "$recover" == "$expected_recover" ] 4329b88fc54SJiri Pirko check_err $? "Unexpected \"recover\" value (got $recover, expected $expected_recover)" 4339b88fc54SJiri Pirko 4349b88fc54SJiri Pirko local grace_period=$(echo $show | jq -r ".grace_period") 4359b88fc54SJiri Pirko check_err $? "Failed get $name reporter grace_period" 4369b88fc54SJiri Pirko [ "$grace_period" == "$expected_grace_period" ] 4379b88fc54SJiri Pirko check_err $? "Unexpected \"grace_period\" value (got $grace_period, expected $expected_grace_period)" 4389b88fc54SJiri Pirko 4399b88fc54SJiri Pirko local auto_recover=$(echo $show | jq -r ".auto_recover") 4409b88fc54SJiri Pirko [ "$auto_recover" == "$expected_auto_recover" ] 4419b88fc54SJiri Pirko check_err $? "Unexpected \"auto_recover\" value (got $auto_recover, expected $expected_auto_recover)" 4429b88fc54SJiri Pirko} 4439b88fc54SJiri Pirko 4449b88fc54SJiri Pirkodummy_reporter_test() 4459b88fc54SJiri Pirko{ 4469b88fc54SJiri Pirko RET=0 4479b88fc54SJiri Pirko 448c7f0d4c8SEran Ben Elisha check_reporter_info dummy healthy 0 0 0 true 449c7f0d4c8SEran Ben Elisha 450c7f0d4c8SEran Ben Elisha devlink health set $DL_HANDLE reporter dummy auto_recover false 451c7f0d4c8SEran Ben Elisha check_err $? "Failed to dummy reporter auto_recover option" 452c7f0d4c8SEran Ben Elisha 4539b88fc54SJiri Pirko check_reporter_info dummy healthy 0 0 0 false 4549b88fc54SJiri Pirko 4559b88fc54SJiri Pirko local BREAK_MSG="foo bar" 4569b88fc54SJiri Pirko echo "$BREAK_MSG"> $DEBUGFS_DIR/health/break_health 4579b88fc54SJiri Pirko check_err $? "Failed to break dummy reporter" 4589b88fc54SJiri Pirko 4599b88fc54SJiri Pirko check_reporter_info dummy error 1 0 0 false 4609b88fc54SJiri Pirko 4619b88fc54SJiri Pirko local dump=$(devlink health dump show $DL_HANDLE reporter dummy -j) 4629b88fc54SJiri Pirko check_err $? "Failed show dump of dummy reporter" 4639b88fc54SJiri Pirko 4649b88fc54SJiri Pirko local dump_break_msg=$(echo $dump | jq -r ".break_message") 4659b88fc54SJiri Pirko [ "$dump_break_msg" == "$BREAK_MSG" ] 4669b88fc54SJiri Pirko check_err $? "Unexpected dump break message value (got $dump_break_msg, expected $BREAK_MSG)" 4679b88fc54SJiri Pirko 4689b88fc54SJiri Pirko devlink health dump clear $DL_HANDLE reporter dummy 4699b88fc54SJiri Pirko check_err $? "Failed clear dump of dummy reporter" 4709b88fc54SJiri Pirko 4719b88fc54SJiri Pirko devlink health recover $DL_HANDLE reporter dummy 4729b88fc54SJiri Pirko check_err $? "Failed recover dummy reporter" 4739b88fc54SJiri Pirko 4749b88fc54SJiri Pirko check_reporter_info dummy healthy 1 1 0 false 4759b88fc54SJiri Pirko 4769b88fc54SJiri Pirko devlink health set $DL_HANDLE reporter dummy auto_recover true 4779b88fc54SJiri Pirko check_err $? "Failed to dummy reporter auto_recover option" 4789b88fc54SJiri Pirko 4799b88fc54SJiri Pirko check_reporter_info dummy healthy 1 1 0 true 4809b88fc54SJiri Pirko 4819b88fc54SJiri Pirko echo "$BREAK_MSG"> $DEBUGFS_DIR/health/break_health 4829b88fc54SJiri Pirko check_err $? "Failed to break dummy reporter" 4839b88fc54SJiri Pirko 4849b88fc54SJiri Pirko check_reporter_info dummy healthy 2 2 0 true 4859b88fc54SJiri Pirko 4869b88fc54SJiri Pirko local diagnose=$(devlink health diagnose $DL_HANDLE reporter dummy -j -p) 4879b88fc54SJiri Pirko check_err $? "Failed show diagnose of dummy reporter" 4889b88fc54SJiri Pirko 4899b88fc54SJiri Pirko local rcvrd_break_msg=$(echo $diagnose | jq -r ".recovered_break_message") 4909b88fc54SJiri Pirko [ "$rcvrd_break_msg" == "$BREAK_MSG" ] 4919b88fc54SJiri Pirko check_err $? "Unexpected recovered break message value (got $rcvrd_break_msg, expected $BREAK_MSG)" 4929b88fc54SJiri Pirko 4939b88fc54SJiri Pirko devlink health set $DL_HANDLE reporter dummy grace_period 10 4949b88fc54SJiri Pirko check_err $? "Failed to dummy reporter grace_period option" 4959b88fc54SJiri Pirko 4969b88fc54SJiri Pirko check_reporter_info dummy healthy 2 2 10 true 4979b88fc54SJiri Pirko 4989b88fc54SJiri Pirko echo "Y"> $DEBUGFS_DIR/health/fail_recover 4999b88fc54SJiri Pirko check_err $? "Failed set dummy reporter recovery to fail" 5009b88fc54SJiri Pirko 5019b88fc54SJiri Pirko echo "$BREAK_MSG"> $DEBUGFS_DIR/health/break_health 5029b88fc54SJiri Pirko check_fail $? "Unexpected success of dummy reporter break" 5039b88fc54SJiri Pirko 5049b88fc54SJiri Pirko check_reporter_info dummy error 3 2 10 true 5059b88fc54SJiri Pirko 5069b88fc54SJiri Pirko devlink health recover $DL_HANDLE reporter dummy 5079b88fc54SJiri Pirko check_fail $? "Unexpected success of dummy reporter recover" 5089b88fc54SJiri Pirko 5099b88fc54SJiri Pirko echo "N"> $DEBUGFS_DIR/health/fail_recover 5109b88fc54SJiri Pirko check_err $? "Failed set dummy reporter recovery to be successful" 5119b88fc54SJiri Pirko 5129b88fc54SJiri Pirko devlink health recover $DL_HANDLE reporter dummy 5139b88fc54SJiri Pirko check_err $? "Failed recover dummy reporter" 5149b88fc54SJiri Pirko 5159b88fc54SJiri Pirko check_reporter_info dummy healthy 3 3 10 true 5169b88fc54SJiri Pirko 517ff18176aSAya Levin echo 8192 > $DEBUGFS_DIR/health/binary_len 5182fc60e2fSJakub Kicinski check_err $? "Failed set dummy reporter binary len to 8192" 519ff18176aSAya Levin 520ff18176aSAya Levin local dump=$(devlink health dump show $DL_HANDLE reporter dummy -j) 521ff18176aSAya Levin check_err $? "Failed show dump of dummy reporter" 522ff18176aSAya Levin 523ff18176aSAya Levin devlink health dump clear $DL_HANDLE reporter dummy 524ff18176aSAya Levin check_err $? "Failed clear dump of dummy reporter" 525ff18176aSAya Levin 5269b88fc54SJiri Pirko log_test "dummy reporter test" 5279b88fc54SJiri Pirko} 5289b88fc54SJiri Pirko 529a27d8e35SDmytro Linkinrate_leafs_get() 530a27d8e35SDmytro Linkin{ 531a27d8e35SDmytro Linkin local handle=$1 532a27d8e35SDmytro Linkin 533a27d8e35SDmytro Linkin cmd_jq "devlink port function rate show -j" \ 534a27d8e35SDmytro Linkin '.[] | to_entries | .[] | select(.value.type == "leaf") | .key | select(contains("'$handle'"))' 535a27d8e35SDmytro Linkin} 536a27d8e35SDmytro Linkin 537413ee943SDmytro Linkinrate_nodes_get() 538413ee943SDmytro Linkin{ 539413ee943SDmytro Linkin local handle=$1 540413ee943SDmytro Linkin 541413ee943SDmytro Linkin cmd_jq "devlink port function rate show -j" \ 542413ee943SDmytro Linkin '.[] | to_entries | .[] | select(.value.type == "node") | .key | select(contains("'$handle'"))' 543413ee943SDmytro Linkin} 544413ee943SDmytro Linkin 54531f07233SDmytro Linkinrate_attr_set() 54631f07233SDmytro Linkin{ 54731f07233SDmytro Linkin local handle=$1 54831f07233SDmytro Linkin local name=$2 54931f07233SDmytro Linkin local value=$3 55031f07233SDmytro Linkin local units=$4 55131f07233SDmytro Linkin 55231f07233SDmytro Linkin devlink port function rate set $handle $name $value$units 55331f07233SDmytro Linkin} 55431f07233SDmytro Linkin 55531f07233SDmytro Linkinrate_attr_get() 55631f07233SDmytro Linkin{ 55731f07233SDmytro Linkin local handle=$1 55831f07233SDmytro Linkin local name=$2 55931f07233SDmytro Linkin 56031f07233SDmytro Linkin cmd_jq "devlink port function rate show $handle -j" '.[][].'$name 56131f07233SDmytro Linkin} 56231f07233SDmytro Linkin 56331f07233SDmytro Linkinrate_attr_tx_rate_check() 56431f07233SDmytro Linkin{ 56531f07233SDmytro Linkin local handle=$1 56631f07233SDmytro Linkin local name=$2 56731f07233SDmytro Linkin local rate=$3 56831f07233SDmytro Linkin local debug_file=$4 56931f07233SDmytro Linkin 57031f07233SDmytro Linkin rate_attr_set $handle $name $rate mbit 57131f07233SDmytro Linkin check_err $? "Failed to set $name value" 57231f07233SDmytro Linkin 57331f07233SDmytro Linkin local debug_value=$(cat $debug_file) 57431f07233SDmytro Linkin check_err $? "Failed to read $name value from debugfs" 57531f07233SDmytro Linkin [ "$debug_value" == "$rate" ] 57631f07233SDmytro Linkin check_err $? "Unexpected $name debug value $debug_value != $rate" 57731f07233SDmytro Linkin 57831f07233SDmytro Linkin local api_value=$(( $(rate_attr_get $handle $name) * 8 / 1000000 )) 57931f07233SDmytro Linkin check_err $? "Failed to get $name attr value" 58031f07233SDmytro Linkin [ "$api_value" == "$rate" ] 58131f07233SDmytro Linkin check_err $? "Unexpected $name attr value $api_value != $rate" 58231f07233SDmytro Linkin} 58331f07233SDmytro Linkin 5841a9c0482SDmytro Linkinrate_attr_parent_check() 5851a9c0482SDmytro Linkin{ 5861a9c0482SDmytro Linkin local handle=$1 5871a9c0482SDmytro Linkin local parent=$2 5881a9c0482SDmytro Linkin local debug_file=$3 5891a9c0482SDmytro Linkin 5901a9c0482SDmytro Linkin rate_attr_set $handle parent $parent 5911a9c0482SDmytro Linkin check_err $? "Failed to set parent" 5921a9c0482SDmytro Linkin 5931a9c0482SDmytro Linkin debug_value=$(cat $debug_file) 5941a9c0482SDmytro Linkin check_err $? "Failed to get parent debugfs value" 5951a9c0482SDmytro Linkin [ "$debug_value" == "$parent" ] 5961a9c0482SDmytro Linkin check_err $? "Unexpected parent debug value $debug_value != $parent" 5971a9c0482SDmytro Linkin 5981a9c0482SDmytro Linkin api_value=$(rate_attr_get $r_obj parent) 5991a9c0482SDmytro Linkin check_err $? "Failed to get parent attr value" 6001a9c0482SDmytro Linkin [ "$api_value" == "$parent" ] 6011a9c0482SDmytro Linkin check_err $? "Unexpected parent attr value $api_value != $parent" 6021a9c0482SDmytro Linkin} 6031a9c0482SDmytro Linkin 604413ee943SDmytro Linkinrate_node_add() 605413ee943SDmytro Linkin{ 606413ee943SDmytro Linkin local handle=$1 607413ee943SDmytro Linkin 608413ee943SDmytro Linkin devlink port function rate add $handle 609413ee943SDmytro Linkin} 610413ee943SDmytro Linkin 611413ee943SDmytro Linkinrate_node_del() 612413ee943SDmytro Linkin{ 613413ee943SDmytro Linkin local handle=$1 614413ee943SDmytro Linkin 615413ee943SDmytro Linkin devlink port function rate del $handle 616413ee943SDmytro Linkin} 617413ee943SDmytro Linkin 618a27d8e35SDmytro Linkinrate_test() 619a27d8e35SDmytro Linkin{ 620a27d8e35SDmytro Linkin RET=0 621a27d8e35SDmytro Linkin 622a27d8e35SDmytro Linkin echo $VF_COUNT > /sys/bus/netdevsim/devices/$DEV_NAME/sriov_numvfs 623a27d8e35SDmytro Linkin devlink dev eswitch set $DL_HANDLE mode switchdev 624a27d8e35SDmytro Linkin local leafs=`rate_leafs_get $DL_HANDLE` 625a27d8e35SDmytro Linkin local num_leafs=`echo $leafs | wc -w` 626a27d8e35SDmytro Linkin [ "$num_leafs" == "$VF_COUNT" ] 627a27d8e35SDmytro Linkin check_err $? "Expected $VF_COUNT rate leafs but got $num_leafs" 628a27d8e35SDmytro Linkin 62931f07233SDmytro Linkin rate=10 63031f07233SDmytro Linkin for r_obj in $leafs 63131f07233SDmytro Linkin do 63231f07233SDmytro Linkin rate_attr_tx_rate_check $r_obj tx_share $rate \ 63331f07233SDmytro Linkin $DEBUGFS_DIR/ports/${r_obj##*/}/tx_share 63431f07233SDmytro Linkin rate=$(($rate+10)) 63531f07233SDmytro Linkin done 63631f07233SDmytro Linkin 63731f07233SDmytro Linkin rate=100 63831f07233SDmytro Linkin for r_obj in $leafs 63931f07233SDmytro Linkin do 64031f07233SDmytro Linkin rate_attr_tx_rate_check $r_obj tx_max $rate \ 64131f07233SDmytro Linkin $DEBUGFS_DIR/ports/${r_obj##*/}/tx_max 64231f07233SDmytro Linkin rate=$(($rate+100)) 64331f07233SDmytro Linkin done 64431f07233SDmytro Linkin 645413ee943SDmytro Linkin local node1_name='group1' 646413ee943SDmytro Linkin local node1="$DL_HANDLE/$node1_name" 647413ee943SDmytro Linkin rate_node_add "$node1" 648413ee943SDmytro Linkin check_err $? "Failed to add node $node1" 649413ee943SDmytro Linkin 650413ee943SDmytro Linkin local num_nodes=`rate_nodes_get $DL_HANDLE | wc -w` 651413ee943SDmytro Linkin [ $num_nodes == 1 ] 652413ee943SDmytro Linkin check_err $? "Expected 1 rate node in output but got $num_nodes" 653413ee943SDmytro Linkin 654413ee943SDmytro Linkin local node_tx_share=10 655413ee943SDmytro Linkin rate_attr_tx_rate_check $node1 tx_share $node_tx_share \ 656413ee943SDmytro Linkin $DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_share 657413ee943SDmytro Linkin 658413ee943SDmytro Linkin local node_tx_max=100 659413ee943SDmytro Linkin rate_attr_tx_rate_check $node1 tx_max $node_tx_max \ 660413ee943SDmytro Linkin $DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_max 661413ee943SDmytro Linkin 662413ee943SDmytro Linkin rate_node_del "$node1" 663413ee943SDmytro Linkin check_err $? "Failed to delete node $node1" 664413ee943SDmytro Linkin local num_nodes=`rate_nodes_get $DL_HANDLE | wc -w` 665413ee943SDmytro Linkin [ $num_nodes == 0 ] 666413ee943SDmytro Linkin check_err $? "Expected 0 rate node but got $num_nodes" 667413ee943SDmytro Linkin 6681a9c0482SDmytro Linkin local node1_name='group1' 6691a9c0482SDmytro Linkin local node1="$DL_HANDLE/$node1_name" 6701a9c0482SDmytro Linkin rate_node_add "$node1" 6711a9c0482SDmytro Linkin check_err $? "Failed to add node $node1" 6721a9c0482SDmytro Linkin 6731a9c0482SDmytro Linkin rate_attr_parent_check $r_obj $node1_name \ 6741a9c0482SDmytro Linkin $DEBUGFS_DIR/ports/${r_obj##*/}/rate_parent 6751a9c0482SDmytro Linkin 6761a9c0482SDmytro Linkin local node2_name='group2' 6771a9c0482SDmytro Linkin local node2="$DL_HANDLE/$node2_name" 6781a9c0482SDmytro Linkin rate_node_add "$node2" 6791a9c0482SDmytro Linkin check_err $? "Failed to add node $node2" 6801a9c0482SDmytro Linkin 6811a9c0482SDmytro Linkin rate_attr_parent_check $node2 $node1_name \ 6821a9c0482SDmytro Linkin $DEBUGFS_DIR/rate_nodes/$node2_name/rate_parent 6831a9c0482SDmytro Linkin rate_node_del "$node2" 6841a9c0482SDmytro Linkin check_err $? "Failed to delete node $node2" 6851a9c0482SDmytro Linkin rate_attr_set "$r_obj" noparent 6861a9c0482SDmytro Linkin check_err $? "Failed to unset $r_obj parent node" 6871a9c0482SDmytro Linkin rate_node_del "$node1" 6881a9c0482SDmytro Linkin check_err $? "Failed to delete node $node1" 6891a9c0482SDmytro Linkin 690a27d8e35SDmytro Linkin log_test "rate test" 691a27d8e35SDmytro Linkin} 692a27d8e35SDmytro Linkin 693fc4c93f1SJiri Pirkosetup_prepare() 694fc4c93f1SJiri Pirko{ 695fc4c93f1SJiri Pirko modprobe netdevsim 696fc4c93f1SJiri Pirko echo "$BUS_ADDR $PORT_COUNT" > /sys/bus/netdevsim/new_device 697fc4c93f1SJiri Pirko while [ ! -d $SYSFS_NET_DIR ] ; do :; done 698fc4c93f1SJiri Pirko} 699fc4c93f1SJiri Pirko 700fc4c93f1SJiri Pirkocleanup() 701fc4c93f1SJiri Pirko{ 702fc4c93f1SJiri Pirko pre_cleanup 703fc4c93f1SJiri Pirko echo "$BUS_ADDR" > /sys/bus/netdevsim/del_device 704fc4c93f1SJiri Pirko modprobe -r netdevsim 705fc4c93f1SJiri Pirko} 706fc4c93f1SJiri Pirko 707fc4c93f1SJiri Pirkotrap cleanup EXIT 708fc4c93f1SJiri Pirko 709fc4c93f1SJiri Pirkosetup_prepare 710fc4c93f1SJiri Pirko 711fc4c93f1SJiri Pirkotests_run 712fc4c93f1SJiri Pirko 713fc4c93f1SJiri Pirkoexit $EXIT_STATUS 714