Path: blob/master/tools/testing/selftests/drivers/net/netdevsim/devlink.sh
26299 views
#!/bin/bash1# SPDX-License-Identifier: GPL-2.023lib_dir=$(dirname $0)/../../../net/forwarding45ALL_TESTS="fw_flash_test params_test regions_test reload_test \6netns_reload_test resource_test dev_info_test \7empty_reporter_test dummy_reporter_test rate_test"8NUM_NETIFS=09source $lib_dir/lib.sh1011BUS_ADDR=1012PORT_COUNT=413VF_COUNT=414DEV_NAME=netdevsim$BUS_ADDR15SYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV_NAME/net/16DEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV_NAME/17DL_HANDLE=netdevsim/$DEV_NAME1819wait_for_devlink()20{21"$@" | grep -q $DL_HANDLE22}2324devlink_wait()25{26local timeout=$12728busywait "$timeout" wait_for_devlink devlink dev29}3031fw_flash_test()32{33DUMMYFILE=$(find /lib/firmware -type f -printf '%P\n' | head -1)34RET=03536if [ -z "$DUMMYFILE" ]37then38echo "SKIP: unable to find suitable dummy firmware file"39return40fi4142echo "10"> $DEBUGFS_DIR/fw_update_flash_chunk_time_ms4344devlink dev flash $DL_HANDLE file $DUMMYFILE45check_err $? "Failed to flash with status updates on"4647devlink dev flash $DL_HANDLE file $DUMMYFILE component fw.mgmt48check_err $? "Failed to flash with component attribute"4950devlink dev flash $DL_HANDLE file $DUMMYFILE overwrite settings51check_fail $? "Flash with overwrite settings should be rejected"5253echo "1"> $DEBUGFS_DIR/fw_update_overwrite_mask54check_err $? "Failed to change allowed overwrite mask"5556devlink dev flash $DL_HANDLE file $DUMMYFILE overwrite settings57check_err $? "Failed to flash with settings overwrite enabled"5859devlink dev flash $DL_HANDLE file $DUMMYFILE overwrite identifiers60check_fail $? "Flash with overwrite settings should be identifiers"6162echo "3"> $DEBUGFS_DIR/fw_update_overwrite_mask63check_err $? "Failed to change allowed overwrite mask"6465devlink dev flash $DL_HANDLE file $DUMMYFILE overwrite identifiers overwrite settings66check_err $? "Failed to flash with settings and identifiers overwrite enabled"6768echo "n"> $DEBUGFS_DIR/fw_update_status69check_err $? "Failed to disable status updates"7071devlink dev flash $DL_HANDLE file $DUMMYFILE72check_err $? "Failed to flash with status updates off"7374log_test "fw flash test"75}7677param_get()78{79local name=$18081cmd_jq "devlink dev param show $DL_HANDLE name $name -j" \82'.[][][].values[] | select(.cmode == "driverinit").value'83}8485param_set()86{87local name=$188local value=$28990devlink dev param set $DL_HANDLE name $name cmode driverinit value $value91}9293check_value()94{95local name=$196local phase_name=$297local expected_param_value=$398local expected_debugfs_value=$499local value100101value=$(param_get $name)102check_err $? "Failed to get $name param value"103[ "$value" == "$expected_param_value" ]104check_err $? "Unexpected $phase_name $name param value"105value=$(<$DEBUGFS_DIR/$name)106check_err $? "Failed to get $name debugfs value"107[ "$value" == "$expected_debugfs_value" ]108check_err $? "Unexpected $phase_name $name debugfs value"109}110111params_test()112{113RET=0114115local max_macs116local test1117118check_value max_macs initial 32 32119check_value test1 initial true Y120121param_set max_macs 16122check_err $? "Failed to set max_macs param value"123param_set test1 false124check_err $? "Failed to set test1 param value"125126check_value max_macs post-set 16 32127check_value test1 post-set false Y128129devlink dev reload $DL_HANDLE130131check_value max_macs post-reload 16 16132check_value test1 post-reload false N133134log_test "params test"135}136137check_region_size()138{139local name=$1140local size141142size=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].size')143check_err $? "Failed to get $name region size"144[ $size -eq 32768 ]145check_err $? "Invalid $name region size"146}147148check_region_snapshot_count()149{150local name=$1151local phase_name=$2152local expected_count=$3153local count154155count=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].snapshot | length')156[ $count -eq $expected_count ]157check_err $? "Unexpected $phase_name snapshot count"158}159160regions_test()161{162RET=0163164local count165166check_region_size dummy167check_region_snapshot_count dummy initial 0168169echo ""> $DEBUGFS_DIR/take_snapshot170check_err $? "Failed to take first dummy region snapshot"171check_region_snapshot_count dummy post-first-snapshot 1172173echo ""> $DEBUGFS_DIR/take_snapshot174check_err $? "Failed to take second dummy region snapshot"175check_region_snapshot_count dummy post-second-snapshot 2176177echo ""> $DEBUGFS_DIR/take_snapshot178check_err $? "Failed to take third dummy region snapshot"179check_region_snapshot_count dummy post-third-snapshot 3180181devlink region del $DL_HANDLE/dummy snapshot 1182check_err $? "Failed to delete first dummy region snapshot"183184check_region_snapshot_count dummy post-first-delete 2185186devlink region new $DL_HANDLE/dummy snapshot 25187check_err $? "Failed to create a new snapshot with id 25"188189check_region_snapshot_count dummy post-first-request 3190191devlink region dump $DL_HANDLE/dummy snapshot 25 >> /dev/null192check_err $? "Failed to dump snapshot with id 25"193194devlink region read $DL_HANDLE/dummy snapshot 25 addr 0 len 1 >> /dev/null195check_err $? "Failed to read snapshot with id 25 (1 byte)"196197devlink region read $DL_HANDLE/dummy snapshot 25 addr 128 len 128 >> /dev/null198check_err $? "Failed to read snapshot with id 25 (128 bytes)"199200devlink region read $DL_HANDLE/dummy snapshot 25 addr 128 len $((1<<32)) >> /dev/null201check_err $? "Failed to read snapshot with id 25 (oversized)"202203devlink region read $DL_HANDLE/dummy snapshot 25 addr $((1<<32)) len 128 >> /dev/null 2>&1204check_fail $? "Bad read of snapshot with id 25 did not fail"205206devlink region del $DL_HANDLE/dummy snapshot 25207check_err $? "Failed to delete snapshot with id 25"208209check_region_snapshot_count dummy post-second-delete 2210211sid=$(devlink -j region new $DL_HANDLE/dummy | jq '.[][][][]')212check_err $? "Failed to create a new snapshot with id allocated by the kernel"213214check_region_snapshot_count dummy post-first-request 3215216devlink region dump $DL_HANDLE/dummy snapshot $sid >> /dev/null217check_err $? "Failed to dump a snapshot with id allocated by the kernel"218219devlink region del $DL_HANDLE/dummy snapshot $sid220check_err $? "Failed to delete snapshot with id allocated by the kernel"221222check_region_snapshot_count dummy post-first-request 2223224log_test "regions test"225}226227reload_test()228{229RET=0230231devlink dev reload $DL_HANDLE232check_err $? "Failed to reload"233234echo "y"> $DEBUGFS_DIR/fail_reload235check_err $? "Failed to setup devlink reload to fail"236237devlink dev reload $DL_HANDLE238check_fail $? "Unexpected success of devlink reload"239240echo "n"> $DEBUGFS_DIR/fail_reload241check_err $? "Failed to setup devlink reload not to fail"242243devlink dev reload $DL_HANDLE244check_err $? "Failed to reload after set not to fail"245246echo "y"> $DEBUGFS_DIR/dont_allow_reload247check_err $? "Failed to forbid devlink reload"248249devlink dev reload $DL_HANDLE250check_fail $? "Unexpected success of devlink reload"251252echo "n"> $DEBUGFS_DIR/dont_allow_reload253check_err $? "Failed to re-enable devlink reload"254255devlink dev reload $DL_HANDLE256check_err $? "Failed to reload after re-enable"257258log_test "reload test"259}260261netns_reload_test()262{263RET=0264265ip netns add testns1266check_err $? "Failed add netns \"testns1\""267ip netns add testns2268check_err $? "Failed add netns \"testns2\""269270devlink dev reload $DL_HANDLE netns testns1271check_err $? "Failed to reload into netns \"testns1\""272273devlink -N testns1 dev reload $DL_HANDLE netns testns2274check_err $? "Failed to reload from netns \"testns1\" into netns \"testns2\""275276ip netns del testns2277ip netns del testns1278279# Wait until netns async cleanup is done.280devlink_wait 2000281282log_test "netns reload test"283}284285DUMMYDEV="dummytest"286287res_val_get()288{289local netns=$1290local parentname=$2291local name=$3292local type=$4293294cmd_jq "devlink -N $netns resource show $DL_HANDLE -j" \295".[][][] | select(.name == \"$parentname\").resources[] \296| select(.name == \"$name\").$type"297}298299resource_test()300{301RET=0302303ip netns add testns1304check_err $? "Failed add netns \"testns1\""305ip netns add testns2306check_err $? "Failed add netns \"testns2\""307308devlink dev reload $DL_HANDLE netns testns1309check_err $? "Failed to reload into netns \"testns1\""310311# Create dummy dev to add the address and routes on.312313ip -n testns1 link add name $DUMMYDEV type dummy314check_err $? "Failed create dummy device"315ip -n testns1 link set $DUMMYDEV up316check_err $? "Failed bring up dummy device"317ip -n testns1 a a 192.0.1.1/24 dev $DUMMYDEV318check_err $? "Failed add an IP address to dummy device"319320local occ=$(res_val_get testns1 IPv4 fib occ)321local limit=$((occ+1))322323# Set fib size limit to handle one another route only.324325devlink -N testns1 resource set $DL_HANDLE path IPv4/fib size $limit326check_err $? "Failed to set IPv4/fib resource size"327local size_new=$(res_val_get testns1 IPv4 fib size_new)328[ "$size_new" -eq "$limit" ]329check_err $? "Unexpected \"size_new\" value (got $size_new, expected $limit)"330331devlink -N testns1 dev reload $DL_HANDLE332check_err $? "Failed to reload"333local size=$(res_val_get testns1 IPv4 fib size)334[ "$size" -eq "$limit" ]335check_err $? "Unexpected \"size\" value (got $size, expected $limit)"336337# Insert 2 routes, the first is going to be inserted,338# the second is expected to fail to be inserted.339340ip -n testns1 r a 192.0.2.0/24 via 192.0.1.2341check_err $? "Failed to add route"342343ip -n testns1 r a 192.0.3.0/24 via 192.0.1.2344check_fail $? "Unexpected successful route add over limit"345346# Now create another dummy in second network namespace and347# insert two routes. That is over the limit of the netdevsim348# instance in the first namespace. Move the netdevsim instance349# into the second namespace and expect it to fail.350351ip -n testns2 link add name $DUMMYDEV type dummy352check_err $? "Failed create dummy device"353ip -n testns2 link set $DUMMYDEV up354check_err $? "Failed bring up dummy device"355ip -n testns2 a a 192.0.1.1/24 dev $DUMMYDEV356check_err $? "Failed add an IP address to dummy device"357ip -n testns2 r a 192.0.2.0/24 via 192.0.1.2358check_err $? "Failed to add route"359ip -n testns2 r a 192.0.3.0/24 via 192.0.1.2360check_err $? "Failed to add route"361362devlink -N testns1 dev reload $DL_HANDLE netns testns2363check_fail $? "Unexpected successful reload from netns \"testns1\" into netns \"testns2\""364365devlink -N testns2 resource set $DL_HANDLE path IPv4/fib size ' -1'366check_err $? "Failed to reset IPv4/fib resource size"367368devlink -N testns2 dev reload $DL_HANDLE netns 1369check_err $? "Failed to reload devlink back"370371ip netns del testns2372ip netns del testns1373374# Wait until netns async cleanup is done.375devlink_wait 2000376377log_test "resource test"378}379380info_get()381{382local name=$1383384cmd_jq "devlink dev info $DL_HANDLE -j" ".[][][\"$name\"]" "-e"385}386387dev_info_test()388{389RET=0390391driver=$(info_get "driver")392check_err $? "Failed to get driver name"393[ "$driver" == "netdevsim" ]394check_err $? "Unexpected driver name $driver"395396log_test "dev_info test"397}398399empty_reporter_test()400{401RET=0402403devlink health show $DL_HANDLE reporter empty >/dev/null404check_err $? "Failed show empty reporter"405406devlink health dump show $DL_HANDLE reporter empty >/dev/null407check_err $? "Failed show dump of empty reporter"408409devlink health diagnose $DL_HANDLE reporter empty >/dev/null410check_err $? "Failed diagnose empty reporter"411412devlink health recover $DL_HANDLE reporter empty413check_err $? "Failed recover empty reporter"414415log_test "empty reporter test"416}417418check_reporter_info()419{420local name=$1421local expected_state=$2422local expected_error=$3423local expected_recover=$4424local expected_grace_period=$5425local expected_auto_recover=$6426427local show=$(devlink health show $DL_HANDLE reporter $name -j | jq -e -r ".[][][]")428check_err $? "Failed show $name reporter"429430local state=$(echo $show | jq -r ".state")431[ "$state" == "$expected_state" ]432check_err $? "Unexpected \"state\" value (got $state, expected $expected_state)"433434local error=$(echo $show | jq -r ".error")435[ "$error" == "$expected_error" ]436check_err $? "Unexpected \"error\" value (got $error, expected $expected_error)"437438local recover=`echo $show | jq -r ".recover"`439[ "$recover" == "$expected_recover" ]440check_err $? "Unexpected \"recover\" value (got $recover, expected $expected_recover)"441442local grace_period=$(echo $show | jq -r ".grace_period")443check_err $? "Failed get $name reporter grace_period"444[ "$grace_period" == "$expected_grace_period" ]445check_err $? "Unexpected \"grace_period\" value (got $grace_period, expected $expected_grace_period)"446447local auto_recover=$(echo $show | jq -r ".auto_recover")448[ "$auto_recover" == "$expected_auto_recover" ]449check_err $? "Unexpected \"auto_recover\" value (got $auto_recover, expected $expected_auto_recover)"450}451452dummy_reporter_test()453{454RET=0455456check_reporter_info dummy healthy 0 0 0 true457458devlink health set $DL_HANDLE reporter dummy auto_recover false459check_err $? "Failed to dummy reporter auto_recover option"460461check_reporter_info dummy healthy 0 0 0 false462463local BREAK_MSG="foo bar"464echo "$BREAK_MSG"> $DEBUGFS_DIR/health/break_health465check_err $? "Failed to break dummy reporter"466467check_reporter_info dummy error 1 0 0 false468469local dump=$(devlink health dump show $DL_HANDLE reporter dummy -j)470check_err $? "Failed show dump of dummy reporter"471472local dump_break_msg=$(echo $dump | jq -r ".break_message")473[ "$dump_break_msg" == "$BREAK_MSG" ]474check_err $? "Unexpected dump break message value (got $dump_break_msg, expected $BREAK_MSG)"475476devlink health dump clear $DL_HANDLE reporter dummy477check_err $? "Failed clear dump of dummy reporter"478479devlink health recover $DL_HANDLE reporter dummy480check_err $? "Failed recover dummy reporter"481482check_reporter_info dummy healthy 1 1 0 false483484devlink health set $DL_HANDLE reporter dummy auto_recover true485check_err $? "Failed to dummy reporter auto_recover option"486487check_reporter_info dummy healthy 1 1 0 true488489echo "$BREAK_MSG"> $DEBUGFS_DIR/health/break_health490check_err $? "Failed to break dummy reporter"491492check_reporter_info dummy healthy 2 2 0 true493494local diagnose=$(devlink health diagnose $DL_HANDLE reporter dummy -j -p)495check_err $? "Failed show diagnose of dummy reporter"496497local rcvrd_break_msg=$(echo $diagnose | jq -r ".recovered_break_message")498[ "$rcvrd_break_msg" == "$BREAK_MSG" ]499check_err $? "Unexpected recovered break message value (got $rcvrd_break_msg, expected $BREAK_MSG)"500501devlink health set $DL_HANDLE reporter dummy grace_period 10502check_err $? "Failed to dummy reporter grace_period option"503504check_reporter_info dummy healthy 2 2 10 true505506echo "Y"> $DEBUGFS_DIR/health/fail_recover507check_err $? "Failed set dummy reporter recovery to fail"508509echo "$BREAK_MSG"> $DEBUGFS_DIR/health/break_health510check_fail $? "Unexpected success of dummy reporter break"511512check_reporter_info dummy error 3 2 10 true513514devlink health recover $DL_HANDLE reporter dummy515check_fail $? "Unexpected success of dummy reporter recover"516517echo "N"> $DEBUGFS_DIR/health/fail_recover518check_err $? "Failed set dummy reporter recovery to be successful"519520devlink health recover $DL_HANDLE reporter dummy521check_err $? "Failed recover dummy reporter"522523check_reporter_info dummy healthy 3 3 10 true524525echo 8192 > $DEBUGFS_DIR/health/binary_len526check_err $? "Failed set dummy reporter binary len to 8192"527528local dump=$(devlink health dump show $DL_HANDLE reporter dummy -j)529check_err $? "Failed show dump of dummy reporter"530531devlink health dump clear $DL_HANDLE reporter dummy532check_err $? "Failed clear dump of dummy reporter"533534log_test "dummy reporter test"535}536537rate_leafs_get()538{539local handle=$1540541cmd_jq "devlink port function rate show -j" \542'.[] | to_entries | .[] | select(.value.type == "leaf") | .key | select(contains("'$handle'"))'543}544545rate_nodes_get()546{547local handle=$1548549cmd_jq "devlink port function rate show -j" \550'.[] | to_entries | .[] | select(.value.type == "node") | .key | select(contains("'$handle'"))'551}552553rate_attr_set()554{555local handle=$1556local name=$2557local value=$3558local units=$4559560devlink port function rate set $handle $name $value$units561}562563rate_attr_get()564{565local handle=$1566local name=$2567568cmd_jq "devlink port function rate show $handle -j" '.[][].'$name569}570571rate_attr_tx_rate_check()572{573local handle=$1574local name=$2575local rate=$3576local debug_file=$4577578rate_attr_set $handle $name $rate mbit579check_err $? "Failed to set $name value"580581local debug_value=$(cat $debug_file)582check_err $? "Failed to read $name value from debugfs"583[ "$debug_value" == "$rate" ]584check_err $? "Unexpected $name debug value $debug_value != $rate"585586local api_value=$(( $(rate_attr_get $handle $name) * 8 / 1000000 ))587check_err $? "Failed to get $name attr value"588[ "$api_value" == "$rate" ]589check_err $? "Unexpected $name attr value $api_value != $rate"590}591592rate_attr_parent_check()593{594local handle=$1595local parent=$2596local debug_file=$3597598rate_attr_set $handle parent $parent599check_err $? "Failed to set parent"600601debug_value=$(cat $debug_file)602check_err $? "Failed to get parent debugfs value"603[ "$debug_value" == "$parent" ]604check_err $? "Unexpected parent debug value $debug_value != $parent"605606api_value=$(rate_attr_get $r_obj parent)607check_err $? "Failed to get parent attr value"608[ "$api_value" == "$parent" ]609check_err $? "Unexpected parent attr value $api_value != $parent"610}611612rate_attr_tc_bw_check()613{614local handle=$1615local tc_bw=$2616local debug_file=$3617618local tc_bw_str=""619for bw in $tc_bw; do620local tc=${bw%%:*}621local value=${bw##*:}622tc_bw_str="$tc_bw_str $tc:$value"623done624tc_bw_str=${tc_bw_str# }625626rate_attr_set "$handle" tc-bw "$tc_bw_str"627check_err $? "Failed to set tc-bw values"628629for bw in $tc_bw; do630local tc=${bw%%:*}631local value=${bw##*:}632local debug_value633debug_value=$(cat "$debug_file"/tc"${tc}"_bw)634check_err $? "Failed to read tc-bw value from debugfs for tc$tc"635[ "$debug_value" == "$value" ]636check_err $? "Unexpected tc-bw debug value for tc$tc: $debug_value != $value"637done638639for bw in $tc_bw; do640local tc=${bw%%:*}641local expected_value=${bw##*:}642local api_value643api_value=$(rate_attr_get "$handle" tc_"$tc")644if [ "$api_value" = "null" ]; then645api_value=0646fi647[ "$api_value" == "$expected_value" ]648check_err $? "Unexpected tc-bw value for tc$tc: $api_value != $expected_value"649done650}651652rate_node_add()653{654local handle=$1655656devlink port function rate add $handle657}658659rate_node_del()660{661local handle=$1662663devlink port function rate del $handle664}665666rate_test()667{668RET=0669670echo $VF_COUNT > /sys/bus/netdevsim/devices/$DEV_NAME/sriov_numvfs671devlink dev eswitch set $DL_HANDLE mode switchdev672local leafs=`rate_leafs_get $DL_HANDLE`673local num_leafs=`echo $leafs | wc -w`674[ "$num_leafs" == "$VF_COUNT" ]675check_err $? "Expected $VF_COUNT rate leafs but got $num_leafs"676677rate=10678for r_obj in $leafs679do680rate_attr_tx_rate_check $r_obj tx_share $rate \681$DEBUGFS_DIR/ports/${r_obj##*/}/tx_share682rate=$(($rate+10))683done684685rate=100686for r_obj in $leafs687do688rate_attr_tx_rate_check $r_obj tx_max $rate \689$DEBUGFS_DIR/ports/${r_obj##*/}/tx_max690rate=$(($rate+100))691done692693local tc_bw="0:0 1:40 2:0 3:0 4:0 5:0 6:60 7:0"694for r_obj in $leafs695do696rate_attr_tc_bw_check "$r_obj" "$tc_bw" \697"$DEBUGFS_DIR"/ports/"${r_obj##*/}"698done699700local node1_name='group1'701local node1="$DL_HANDLE/$node1_name"702rate_node_add "$node1"703check_err $? "Failed to add node $node1"704705local num_nodes=`rate_nodes_get $DL_HANDLE | wc -w`706[ $num_nodes == 1 ]707check_err $? "Expected 1 rate node in output but got $num_nodes"708709local node_tx_share=10710rate_attr_tx_rate_check $node1 tx_share $node_tx_share \711$DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_share712713local node_tx_max=100714rate_attr_tx_rate_check $node1 tx_max $node_tx_max \715$DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_max716717718local tc_bw="0:20 1:0 2:0 3:0 4:0 5:20 6:60 7:0"719rate_attr_tc_bw_check $node1 "$tc_bw" \720"$DEBUGFS_DIR"/rate_nodes/"${node1##*/}"721722723rate_node_del "$node1"724check_err $? "Failed to delete node $node1"725local num_nodes=`rate_nodes_get $DL_HANDLE | wc -w`726[ $num_nodes == 0 ]727check_err $? "Expected 0 rate node but got $num_nodes"728729local node1_name='group1'730local node1="$DL_HANDLE/$node1_name"731rate_node_add "$node1"732check_err $? "Failed to add node $node1"733734rate_attr_parent_check $r_obj $node1_name \735$DEBUGFS_DIR/ports/${r_obj##*/}/rate_parent736737local node2_name='group2'738local node2="$DL_HANDLE/$node2_name"739rate_node_add "$node2"740check_err $? "Failed to add node $node2"741742rate_attr_parent_check $node2 $node1_name \743$DEBUGFS_DIR/rate_nodes/$node2_name/rate_parent744rate_node_del "$node2"745check_err $? "Failed to delete node $node2"746rate_attr_set "$r_obj" noparent747check_err $? "Failed to unset $r_obj parent node"748rate_node_del "$node1"749check_err $? "Failed to delete node $node1"750751log_test "rate test"752}753754setup_prepare()755{756modprobe netdevsim757echo "$BUS_ADDR $PORT_COUNT" > /sys/bus/netdevsim/new_device758while [ ! -d $SYSFS_NET_DIR ] ; do :; done759}760761cleanup()762{763pre_cleanup764echo "$BUS_ADDR" > /sys/bus/netdevsim/del_device765modprobe -r netdevsim766}767768trap cleanup EXIT769770setup_prepare771772tests_run773774exit $EXIT_STATUS775776777