879 lines · 23.2 KB · Shell
RawDownload
#!/bin/bash# SPDX-License-Identifier: GPL-2.0 lib_dir=$(dirname $0)/../../../net/forwarding ALL_TESTS="fw_flash_test params_test  \	   params_default_test regions_test reload_test \	   netns_reload_test resource_test dev_info_test \	   empty_reporter_test dummy_reporter_test rate_test"NUM_NETIFS=0source $lib_dir/lib.sh BUS_ADDR=10PORT_COUNT=4VF_COUNT=4DEV_NAME=netdevsim$BUS_ADDRSYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV_NAME/net/DEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV_NAME/DL_HANDLE=netdevsim/$DEV_NAME wait_for_devlink(){	"$@" | grep -q $DL_HANDLE} devlink_wait(){	local timeout=$1 	busywait "$timeout" wait_for_devlink devlink dev} fw_flash_test(){	DUMMYFILE=$(find /lib/firmware -type f -printf '%P\n' | head -1)	RET=0 	if [ -z "$DUMMYFILE" ]	then		echo "SKIP: unable to find suitable dummy firmware file"		return	fi 	echo "10"> $DEBUGFS_DIR/fw_update_flash_chunk_time_ms 	devlink dev flash $DL_HANDLE file $DUMMYFILE	check_err $? "Failed to flash with status updates on" 	devlink dev flash $DL_HANDLE file $DUMMYFILE component fw.mgmt	check_err $? "Failed to flash with component attribute" 	devlink dev flash $DL_HANDLE file $DUMMYFILE overwrite settings	check_fail $? "Flash with overwrite settings should be rejected" 	echo "1"> $DEBUGFS_DIR/fw_update_overwrite_mask	check_err $? "Failed to change allowed overwrite mask" 	devlink dev flash $DL_HANDLE file $DUMMYFILE overwrite settings	check_err $? "Failed to flash with settings overwrite enabled" 	devlink dev flash $DL_HANDLE file $DUMMYFILE overwrite identifiers	check_fail $? "Flash with overwrite settings should be identifiers" 	echo "3"> $DEBUGFS_DIR/fw_update_overwrite_mask	check_err $? "Failed to change allowed overwrite mask" 	devlink dev flash $DL_HANDLE file $DUMMYFILE overwrite identifiers overwrite settings	check_err $? "Failed to flash with settings and identifiers overwrite enabled" 	echo "n"> $DEBUGFS_DIR/fw_update_status	check_err $? "Failed to disable status updates" 	devlink dev flash $DL_HANDLE file $DUMMYFILE	check_err $? "Failed to flash with status updates off" 	log_test "fw flash test"} param_get(){	local name=$1	local attr=${2:-value}	local cmode=${3:-driverinit} 	cmd_jq "devlink dev param show $DL_HANDLE name $name -j" \	       '.[][][].values[] | select(.cmode == "'"$cmode"'").'"$attr"} param_set(){	local name=$1	local value=$2	local cmode=${3:-driverinit} 	devlink dev param set $DL_HANDLE name $name cmode $cmode value $value} param_set_default(){	local name=$1	local cmode=${2:-driverinit} 	devlink dev param set $DL_HANDLE name $name default cmode $cmode} check_value(){	local name=$1	local phase_name=$2	local expected_param_value=$3	local expected_debugfs_value=$4	local cmode=${5:-driverinit}	local value	local attr="value" 	if [[ "$phase_name" == *"default"* ]]; then		attr="default"	fi 	value=$(param_get $name $attr $cmode)	check_err $? "Failed to get $name param $attr"	[ "$value" == "$expected_param_value" ]	check_err $? "Unexpected $phase_name $name param $attr"	value=$(<$DEBUGFS_DIR/$name)	check_err $? "Failed to get $name debugfs value"	[ "$value" == "$expected_debugfs_value" ]	check_err $? "Unexpected $phase_name $name debugfs value"} params_test(){	RET=0 	local max_macs	local test1 	check_value max_macs initial 32 32	check_value test1 initial true Y 	param_set max_macs 16	check_err $? "Failed to set max_macs param value"	param_set test1 false	check_err $? "Failed to set test1 param value" 	check_value max_macs post-set 16 32	check_value test1 post-set false Y 	devlink dev reload $DL_HANDLE 	check_value max_macs post-reload 16 16	check_value test1 post-reload false N 	log_test "params test"} value_to_debugfs(){	local value=$1 	case "$value" in		true)			echo "Y"			;;		false)			echo "N"			;;		*)			echo "$value"			;;	esac} test_default(){	local param_name=$1	local new_value=$2	local expected_default=$3	local cmode=${4:-driverinit}	local default_debugfs	local new_debugfs	local expected_debugfs 	default_debugfs=$(value_to_debugfs $expected_default)	new_debugfs=$(value_to_debugfs $new_value) 	expected_debugfs=$default_debugfs	check_value $param_name initial-default $expected_default $expected_debugfs $cmode 	param_set $param_name $new_value $cmode	check_err $? "Failed to set $param_name to $new_value" 	expected_debugfs=$([ "$cmode" == "runtime" ] && echo "$new_debugfs" || echo "$default_debugfs")	check_value $param_name post-set $new_value $expected_debugfs $cmode 	devlink dev reload $DL_HANDLE	check_err $? "Failed to reload device" 	expected_debugfs=$new_debugfs	check_value $param_name post-reload-new-value $new_value $expected_debugfs $cmode 	param_set_default $param_name $cmode	check_err $? "Failed to set $param_name to default" 	expected_debugfs=$([ "$cmode" == "runtime" ] && echo "$default_debugfs" || echo "$new_debugfs")	check_value $param_name post-set-default $expected_default $expected_debugfs $cmode 	devlink dev reload $DL_HANDLE	check_err $? "Failed to reload device" 	expected_debugfs=$default_debugfs	check_value $param_name post-reload-default $expected_default $expected_debugfs $cmode} params_default_test(){	RET=0 	if ! devlink dev param help 2>&1 | grep -q "value VALUE | default"; then		echo "SKIP: devlink cli missing default feature"		return	fi 	# Remove side effects of previous tests. Use plain param_set, because	# param_set_default is a feature under test here.	param_set max_macs 32 driverinit	check_err $? "Failed to reset max_macs to default value"	param_set test1 true driverinit	check_err $? "Failed to reset test1 to default value"	param_set test2 1234 runtime	check_err $? "Failed to reset test2 to default value" 	devlink dev reload $DL_HANDLE	check_err $? "Failed to reload device for clean state" 	test_default max_macs 16 32 driverinit	test_default test1 false true driverinit	test_default test2 100 1234 runtime 	log_test "params default test"} check_region_size(){	local name=$1	local size 	size=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].size')	check_err $? "Failed to get $name region size"	[ $size -eq 32768 ]	check_err $? "Invalid $name region size"} check_region_snapshot_count(){	local name=$1	local phase_name=$2	local expected_count=$3	local count 	count=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].snapshot | length')	[ $count -eq $expected_count ]	check_err $? "Unexpected $phase_name snapshot count"} regions_test(){	RET=0 	local count 	check_region_size dummy	check_region_snapshot_count dummy initial 0 	echo ""> $DEBUGFS_DIR/take_snapshot	check_err $? "Failed to take first dummy region snapshot"	check_region_snapshot_count dummy post-first-snapshot 1 	echo ""> $DEBUGFS_DIR/take_snapshot	check_err $? "Failed to take second dummy region snapshot"	check_region_snapshot_count dummy post-second-snapshot 2 	echo ""> $DEBUGFS_DIR/take_snapshot	check_err $? "Failed to take third dummy region snapshot"	check_region_snapshot_count dummy post-third-snapshot 3 	devlink region del $DL_HANDLE/dummy snapshot 1	check_err $? "Failed to delete first dummy region snapshot" 	check_region_snapshot_count dummy post-first-delete 2 	devlink region new $DL_HANDLE/dummy snapshot 25	check_err $? "Failed to create a new snapshot with id 25" 	check_region_snapshot_count dummy post-first-request 3 	devlink region dump $DL_HANDLE/dummy snapshot 25 >> /dev/null	check_err $? "Failed to dump snapshot with id 25" 	devlink region read $DL_HANDLE/dummy snapshot 25 addr 0 len 1 >> /dev/null	check_err $? "Failed to read snapshot with id 25 (1 byte)" 	devlink region read $DL_HANDLE/dummy snapshot 25 addr 128 len 128 >> /dev/null	check_err $? "Failed to read snapshot with id 25 (128 bytes)" 	devlink region read $DL_HANDLE/dummy snapshot 25 addr 128 len $((1<<32)) >> /dev/null	check_err $? "Failed to read snapshot with id 25 (oversized)" 	devlink region read $DL_HANDLE/dummy snapshot 25 addr $((1<<32)) len 128 >> /dev/null 2>&1	check_fail $? "Bad read of snapshot with id 25 did not fail" 	devlink region del $DL_HANDLE/dummy snapshot 25	check_err $? "Failed to delete snapshot with id 25" 	check_region_snapshot_count dummy post-second-delete 2 	sid=$(devlink -j region new $DL_HANDLE/dummy | jq '.[][][][]')	check_err $? "Failed to create a new snapshot with id allocated by the kernel" 	check_region_snapshot_count dummy post-first-request 3 	devlink region dump $DL_HANDLE/dummy snapshot $sid >> /dev/null	check_err $? "Failed to dump a snapshot with id allocated by the kernel" 	devlink region del $DL_HANDLE/dummy snapshot $sid	check_err $? "Failed to delete snapshot with id allocated by the kernel" 	check_region_snapshot_count dummy post-first-request 2 	log_test "regions test"} reload_test(){	RET=0 	devlink dev reload $DL_HANDLE	check_err $? "Failed to reload" 	echo "y"> $DEBUGFS_DIR/fail_reload	check_err $? "Failed to setup devlink reload to fail" 	devlink dev reload $DL_HANDLE	check_fail $? "Unexpected success of devlink reload" 	echo "n"> $DEBUGFS_DIR/fail_reload	check_err $? "Failed to setup devlink reload not to fail" 	devlink dev reload $DL_HANDLE	check_err $? "Failed to reload after set not to fail" 	echo "y"> $DEBUGFS_DIR/dont_allow_reload	check_err $? "Failed to forbid devlink reload" 	devlink dev reload $DL_HANDLE	check_fail $? "Unexpected success of devlink reload" 	echo "n"> $DEBUGFS_DIR/dont_allow_reload	check_err $? "Failed to re-enable devlink reload" 	devlink dev reload $DL_HANDLE	check_err $? "Failed to reload after re-enable" 	log_test "reload test"} netns_reload_test(){	RET=0 	ip netns add testns1	check_err $? "Failed add netns \"testns1\""	ip netns add testns2	check_err $? "Failed add netns \"testns2\"" 	devlink dev reload $DL_HANDLE netns testns1	check_err $? "Failed to reload into netns \"testns1\"" 	devlink -N testns1 dev reload $DL_HANDLE netns testns2	check_err $? "Failed to reload from netns \"testns1\" into netns \"testns2\"" 	ip netns del testns2	ip netns del testns1 	# Wait until netns async cleanup is done.	devlink_wait 2000 	log_test "netns reload test"} DUMMYDEV="dummytest" res_val_get(){	local netns=$1	local parentname=$2	local name=$3	local type=$4 	cmd_jq "devlink -N $netns resource show $DL_HANDLE -j" \	       ".[][][] | select(.name == \"$parentname\").resources[] \	        | select(.name == \"$name\").$type"} resource_test(){	RET=0 	ip netns add testns1	check_err $? "Failed add netns \"testns1\""	ip netns add testns2	check_err $? "Failed add netns \"testns2\"" 	devlink dev reload $DL_HANDLE netns testns1	check_err $? "Failed to reload into netns \"testns1\"" 	# Create dummy dev to add the address and routes on. 	ip -n testns1 link add name $DUMMYDEV type dummy	check_err $? "Failed create dummy device"	ip -n testns1 link set $DUMMYDEV up	check_err $? "Failed bring up dummy device"	ip -n testns1 a a 192.0.1.1/24 dev $DUMMYDEV	check_err $? "Failed add an IP address to dummy device" 	local occ=$(res_val_get testns1 IPv4 fib occ)	local limit=$((occ+1)) 	# Set fib size limit to handle one another route only. 	devlink -N testns1 resource set $DL_HANDLE path IPv4/fib size $limit	check_err $? "Failed to set IPv4/fib resource size"	local size_new=$(res_val_get testns1 IPv4 fib size_new)	[ "$size_new" -eq "$limit" ]	check_err $? "Unexpected \"size_new\" value (got $size_new, expected $limit)" 	devlink -N testns1 dev reload $DL_HANDLE	check_err $? "Failed to reload"	local size=$(res_val_get testns1 IPv4 fib size)	[ "$size" -eq "$limit" ]	check_err $? "Unexpected \"size\" value (got $size, expected $limit)" 	# Insert 2 routes, the first is going to be inserted,	# the second is expected to fail to be inserted. 	ip -n testns1 r a 192.0.2.0/24 via 192.0.1.2	check_err $? "Failed to add route" 	ip -n testns1 r a 192.0.3.0/24 via 192.0.1.2	check_fail $? "Unexpected successful route add over limit" 	# Now create another dummy in second network namespace and	# insert two routes. That is over the limit of the netdevsim	# instance in the first namespace. Move the netdevsim instance	# into the second namespace and expect it to fail. 	ip -n testns2 link add name $DUMMYDEV type dummy	check_err $? "Failed create dummy device"	ip -n testns2 link set $DUMMYDEV up	check_err $? "Failed bring up dummy device"	ip -n testns2 a a 192.0.1.1/24 dev $DUMMYDEV	check_err $? "Failed add an IP address to dummy device"	ip -n testns2 r a 192.0.2.0/24 via 192.0.1.2	check_err $? "Failed to add route"	ip -n testns2 r a 192.0.3.0/24 via 192.0.1.2	check_err $? "Failed to add route" 	devlink -N testns1 dev reload $DL_HANDLE netns testns2	check_fail $? "Unexpected successful reload from netns \"testns1\" into netns \"testns2\"" 	devlink -N testns2 resource set $DL_HANDLE path IPv4/fib size ' -1'	check_err $? "Failed to reset IPv4/fib resource size" 	devlink -N testns2 dev reload $DL_HANDLE netns 1	check_err $? "Failed to reload devlink back" 	ip netns del testns2	ip netns del testns1 	# Wait until netns async cleanup is done.	devlink_wait 2000 	log_test "resource test"} info_get(){	local name=$1 	cmd_jq "devlink dev info $DL_HANDLE -j" ".[][][\"$name\"]" "-e"} dev_info_test(){	RET=0 	driver=$(info_get "driver")	check_err $? "Failed to get driver name"	[ "$driver" == "netdevsim" ]	check_err $? "Unexpected driver name $driver" 

Lines 1–500 of 879.