162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci
462306a36Sopenharmony_cilib_dir=$(dirname $0)/../../../net/forwarding
562306a36Sopenharmony_ci
662306a36Sopenharmony_ciALL_TESTS="fw_flash_test params_test regions_test reload_test \
762306a36Sopenharmony_ci	   netns_reload_test resource_test dev_info_test \
862306a36Sopenharmony_ci	   empty_reporter_test dummy_reporter_test rate_test"
962306a36Sopenharmony_ciNUM_NETIFS=0
1062306a36Sopenharmony_cisource $lib_dir/lib.sh
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciBUS_ADDR=10
1362306a36Sopenharmony_ciPORT_COUNT=4
1462306a36Sopenharmony_ciVF_COUNT=4
1562306a36Sopenharmony_ciDEV_NAME=netdevsim$BUS_ADDR
1662306a36Sopenharmony_ciSYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV_NAME/net/
1762306a36Sopenharmony_ciDEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV_NAME/
1862306a36Sopenharmony_ciDL_HANDLE=netdevsim/$DEV_NAME
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciwait_for_devlink()
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	"$@" | grep -q $DL_HANDLE
2362306a36Sopenharmony_ci}
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cidevlink_wait()
2662306a36Sopenharmony_ci{
2762306a36Sopenharmony_ci	local timeout=$1
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	busywait "$timeout" wait_for_devlink devlink dev
3062306a36Sopenharmony_ci}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cifw_flash_test()
3362306a36Sopenharmony_ci{
3462306a36Sopenharmony_ci	RET=0
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	devlink dev flash $DL_HANDLE file dummy
3762306a36Sopenharmony_ci	check_err $? "Failed to flash with status updates on"
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	devlink dev flash $DL_HANDLE file dummy component fw.mgmt
4062306a36Sopenharmony_ci	check_err $? "Failed to flash with component attribute"
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	devlink dev flash $DL_HANDLE file dummy overwrite settings
4362306a36Sopenharmony_ci	check_fail $? "Flash with overwrite settings should be rejected"
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	echo "1"> $DEBUGFS_DIR/fw_update_overwrite_mask
4662306a36Sopenharmony_ci	check_err $? "Failed to change allowed overwrite mask"
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	devlink dev flash $DL_HANDLE file dummy overwrite settings
4962306a36Sopenharmony_ci	check_err $? "Failed to flash with settings overwrite enabled"
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	devlink dev flash $DL_HANDLE file dummy overwrite identifiers
5262306a36Sopenharmony_ci	check_fail $? "Flash with overwrite settings should be identifiers"
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	echo "3"> $DEBUGFS_DIR/fw_update_overwrite_mask
5562306a36Sopenharmony_ci	check_err $? "Failed to change allowed overwrite mask"
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	devlink dev flash $DL_HANDLE file dummy overwrite identifiers overwrite settings
5862306a36Sopenharmony_ci	check_err $? "Failed to flash with settings and identifiers overwrite enabled"
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	echo "n"> $DEBUGFS_DIR/fw_update_status
6162306a36Sopenharmony_ci	check_err $? "Failed to disable status updates"
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	devlink dev flash $DL_HANDLE file dummy
6462306a36Sopenharmony_ci	check_err $? "Failed to flash with status updates off"
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	log_test "fw flash test"
6762306a36Sopenharmony_ci}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ciparam_get()
7062306a36Sopenharmony_ci{
7162306a36Sopenharmony_ci	local name=$1
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	cmd_jq "devlink dev param show $DL_HANDLE name $name -j" \
7462306a36Sopenharmony_ci	       '.[][][].values[] | select(.cmode == "driverinit").value'
7562306a36Sopenharmony_ci}
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ciparam_set()
7862306a36Sopenharmony_ci{
7962306a36Sopenharmony_ci	local name=$1
8062306a36Sopenharmony_ci	local value=$2
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	devlink dev param set $DL_HANDLE name $name cmode driverinit value $value
8362306a36Sopenharmony_ci}
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cicheck_value()
8662306a36Sopenharmony_ci{
8762306a36Sopenharmony_ci	local name=$1
8862306a36Sopenharmony_ci	local phase_name=$2
8962306a36Sopenharmony_ci	local expected_param_value=$3
9062306a36Sopenharmony_ci	local expected_debugfs_value=$4
9162306a36Sopenharmony_ci	local value
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	value=$(param_get $name)
9462306a36Sopenharmony_ci	check_err $? "Failed to get $name param value"
9562306a36Sopenharmony_ci	[ "$value" == "$expected_param_value" ]
9662306a36Sopenharmony_ci	check_err $? "Unexpected $phase_name $name param value"
9762306a36Sopenharmony_ci	value=$(<$DEBUGFS_DIR/$name)
9862306a36Sopenharmony_ci	check_err $? "Failed to get $name debugfs value"
9962306a36Sopenharmony_ci	[ "$value" == "$expected_debugfs_value" ]
10062306a36Sopenharmony_ci	check_err $? "Unexpected $phase_name $name debugfs value"
10162306a36Sopenharmony_ci}
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ciparams_test()
10462306a36Sopenharmony_ci{
10562306a36Sopenharmony_ci	RET=0
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci	local max_macs
10862306a36Sopenharmony_ci	local test1
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci	check_value max_macs initial 32 32
11162306a36Sopenharmony_ci	check_value test1 initial true Y
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	param_set max_macs 16
11462306a36Sopenharmony_ci	check_err $? "Failed to set max_macs param value"
11562306a36Sopenharmony_ci	param_set test1 false
11662306a36Sopenharmony_ci	check_err $? "Failed to set test1 param value"
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci	check_value max_macs post-set 16 32
11962306a36Sopenharmony_ci	check_value test1 post-set false Y
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci	devlink dev reload $DL_HANDLE
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	check_value max_macs post-reload 16 16
12462306a36Sopenharmony_ci	check_value test1 post-reload false N
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci	log_test "params test"
12762306a36Sopenharmony_ci}
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_cicheck_region_size()
13062306a36Sopenharmony_ci{
13162306a36Sopenharmony_ci	local name=$1
13262306a36Sopenharmony_ci	local size
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci	size=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].size')
13562306a36Sopenharmony_ci	check_err $? "Failed to get $name region size"
13662306a36Sopenharmony_ci	[ $size -eq 32768 ]
13762306a36Sopenharmony_ci	check_err $? "Invalid $name region size"
13862306a36Sopenharmony_ci}
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_cicheck_region_snapshot_count()
14162306a36Sopenharmony_ci{
14262306a36Sopenharmony_ci	local name=$1
14362306a36Sopenharmony_ci	local phase_name=$2
14462306a36Sopenharmony_ci	local expected_count=$3
14562306a36Sopenharmony_ci	local count
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci	count=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].snapshot | length')
14862306a36Sopenharmony_ci	[ $count -eq $expected_count ]
14962306a36Sopenharmony_ci	check_err $? "Unexpected $phase_name snapshot count"
15062306a36Sopenharmony_ci}
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ciregions_test()
15362306a36Sopenharmony_ci{
15462306a36Sopenharmony_ci	RET=0
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci	local count
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci	check_region_size dummy
15962306a36Sopenharmony_ci	check_region_snapshot_count dummy initial 0
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	echo ""> $DEBUGFS_DIR/take_snapshot
16262306a36Sopenharmony_ci	check_err $? "Failed to take first dummy region snapshot"
16362306a36Sopenharmony_ci	check_region_snapshot_count dummy post-first-snapshot 1
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci	echo ""> $DEBUGFS_DIR/take_snapshot
16662306a36Sopenharmony_ci	check_err $? "Failed to take second dummy region snapshot"
16762306a36Sopenharmony_ci	check_region_snapshot_count dummy post-second-snapshot 2
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci	echo ""> $DEBUGFS_DIR/take_snapshot
17062306a36Sopenharmony_ci	check_err $? "Failed to take third dummy region snapshot"
17162306a36Sopenharmony_ci	check_region_snapshot_count dummy post-third-snapshot 3
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci	devlink region del $DL_HANDLE/dummy snapshot 1
17462306a36Sopenharmony_ci	check_err $? "Failed to delete first dummy region snapshot"
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci	check_region_snapshot_count dummy post-first-delete 2
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci	devlink region new $DL_HANDLE/dummy snapshot 25
17962306a36Sopenharmony_ci	check_err $? "Failed to create a new snapshot with id 25"
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci	check_region_snapshot_count dummy post-first-request 3
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci	devlink region dump $DL_HANDLE/dummy snapshot 25 >> /dev/null
18462306a36Sopenharmony_ci	check_err $? "Failed to dump snapshot with id 25"
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci	devlink region read $DL_HANDLE/dummy snapshot 25 addr 0 len 1 >> /dev/null
18762306a36Sopenharmony_ci	check_err $? "Failed to read snapshot with id 25 (1 byte)"
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci	devlink region read $DL_HANDLE/dummy snapshot 25 addr 128 len 128 >> /dev/null
19062306a36Sopenharmony_ci	check_err $? "Failed to read snapshot with id 25 (128 bytes)"
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci	devlink region read $DL_HANDLE/dummy snapshot 25 addr 128 len $((1<<32)) >> /dev/null
19362306a36Sopenharmony_ci	check_err $? "Failed to read snapshot with id 25 (oversized)"
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci	devlink region read $DL_HANDLE/dummy snapshot 25 addr $((1<<32)) len 128 >> /dev/null 2>&1
19662306a36Sopenharmony_ci	check_fail $? "Bad read of snapshot with id 25 did not fail"
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci	devlink region del $DL_HANDLE/dummy snapshot 25
19962306a36Sopenharmony_ci	check_err $? "Failed to delete snapshot with id 25"
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci	check_region_snapshot_count dummy post-second-delete 2
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci	sid=$(devlink -j region new $DL_HANDLE/dummy | jq '.[][][][]')
20462306a36Sopenharmony_ci	check_err $? "Failed to create a new snapshot with id allocated by the kernel"
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci	check_region_snapshot_count dummy post-first-request 3
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	devlink region dump $DL_HANDLE/dummy snapshot $sid >> /dev/null
20962306a36Sopenharmony_ci	check_err $? "Failed to dump a snapshot with id allocated by the kernel"
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci	devlink region del $DL_HANDLE/dummy snapshot $sid
21262306a36Sopenharmony_ci	check_err $? "Failed to delete snapshot with id allocated by the kernel"
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci	check_region_snapshot_count dummy post-first-request 2
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci	log_test "regions test"
21762306a36Sopenharmony_ci}
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_cireload_test()
22062306a36Sopenharmony_ci{
22162306a36Sopenharmony_ci	RET=0
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	devlink dev reload $DL_HANDLE
22462306a36Sopenharmony_ci	check_err $? "Failed to reload"
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci	echo "y"> $DEBUGFS_DIR/fail_reload
22762306a36Sopenharmony_ci	check_err $? "Failed to setup devlink reload to fail"
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci	devlink dev reload $DL_HANDLE
23062306a36Sopenharmony_ci	check_fail $? "Unexpected success of devlink reload"
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci	echo "n"> $DEBUGFS_DIR/fail_reload
23362306a36Sopenharmony_ci	check_err $? "Failed to setup devlink reload not to fail"
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci	devlink dev reload $DL_HANDLE
23662306a36Sopenharmony_ci	check_err $? "Failed to reload after set not to fail"
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci	echo "y"> $DEBUGFS_DIR/dont_allow_reload
23962306a36Sopenharmony_ci	check_err $? "Failed to forbid devlink reload"
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci	devlink dev reload $DL_HANDLE
24262306a36Sopenharmony_ci	check_fail $? "Unexpected success of devlink reload"
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci	echo "n"> $DEBUGFS_DIR/dont_allow_reload
24562306a36Sopenharmony_ci	check_err $? "Failed to re-enable devlink reload"
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci	devlink dev reload $DL_HANDLE
24862306a36Sopenharmony_ci	check_err $? "Failed to reload after re-enable"
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci	log_test "reload test"
25162306a36Sopenharmony_ci}
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_cinetns_reload_test()
25462306a36Sopenharmony_ci{
25562306a36Sopenharmony_ci	RET=0
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci	ip netns add testns1
25862306a36Sopenharmony_ci	check_err $? "Failed add netns \"testns1\""
25962306a36Sopenharmony_ci	ip netns add testns2
26062306a36Sopenharmony_ci	check_err $? "Failed add netns \"testns2\""
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci	devlink dev reload $DL_HANDLE netns testns1
26362306a36Sopenharmony_ci	check_err $? "Failed to reload into netns \"testns1\""
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci	devlink -N testns1 dev reload $DL_HANDLE netns testns2
26662306a36Sopenharmony_ci	check_err $? "Failed to reload from netns \"testns1\" into netns \"testns2\""
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci	ip netns del testns2
26962306a36Sopenharmony_ci	ip netns del testns1
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci	# Wait until netns async cleanup is done.
27262306a36Sopenharmony_ci	devlink_wait 2000
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ci	log_test "netns reload test"
27562306a36Sopenharmony_ci}
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ciDUMMYDEV="dummytest"
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_cires_val_get()
28062306a36Sopenharmony_ci{
28162306a36Sopenharmony_ci	local netns=$1
28262306a36Sopenharmony_ci	local parentname=$2
28362306a36Sopenharmony_ci	local name=$3
28462306a36Sopenharmony_ci	local type=$4
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci	cmd_jq "devlink -N $netns resource show $DL_HANDLE -j" \
28762306a36Sopenharmony_ci	       ".[][][] | select(.name == \"$parentname\").resources[] \
28862306a36Sopenharmony_ci	        | select(.name == \"$name\").$type"
28962306a36Sopenharmony_ci}
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ciresource_test()
29262306a36Sopenharmony_ci{
29362306a36Sopenharmony_ci	RET=0
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci	ip netns add testns1
29662306a36Sopenharmony_ci	check_err $? "Failed add netns \"testns1\""
29762306a36Sopenharmony_ci	ip netns add testns2
29862306a36Sopenharmony_ci	check_err $? "Failed add netns \"testns2\""
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci	devlink dev reload $DL_HANDLE netns testns1
30162306a36Sopenharmony_ci	check_err $? "Failed to reload into netns \"testns1\""
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci	# Create dummy dev to add the address and routes on.
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ci	ip -n testns1 link add name $DUMMYDEV type dummy
30662306a36Sopenharmony_ci	check_err $? "Failed create dummy device"
30762306a36Sopenharmony_ci	ip -n testns1 link set $DUMMYDEV up
30862306a36Sopenharmony_ci	check_err $? "Failed bring up dummy device"
30962306a36Sopenharmony_ci	ip -n testns1 a a 192.0.1.1/24 dev $DUMMYDEV
31062306a36Sopenharmony_ci	check_err $? "Failed add an IP address to dummy device"
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci	local occ=$(res_val_get testns1 IPv4 fib occ)
31362306a36Sopenharmony_ci	local limit=$((occ+1))
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_ci	# Set fib size limit to handle one another route only.
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci	devlink -N testns1 resource set $DL_HANDLE path IPv4/fib size $limit
31862306a36Sopenharmony_ci	check_err $? "Failed to set IPv4/fib resource size"
31962306a36Sopenharmony_ci	local size_new=$(res_val_get testns1 IPv4 fib size_new)
32062306a36Sopenharmony_ci	[ "$size_new" -eq "$limit" ]
32162306a36Sopenharmony_ci	check_err $? "Unexpected \"size_new\" value (got $size_new, expected $limit)"
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci	devlink -N testns1 dev reload $DL_HANDLE
32462306a36Sopenharmony_ci	check_err $? "Failed to reload"
32562306a36Sopenharmony_ci	local size=$(res_val_get testns1 IPv4 fib size)
32662306a36Sopenharmony_ci	[ "$size" -eq "$limit" ]
32762306a36Sopenharmony_ci	check_err $? "Unexpected \"size\" value (got $size, expected $limit)"
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci	# Insert 2 routes, the first is going to be inserted,
33062306a36Sopenharmony_ci	# the second is expected to fail to be inserted.
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci	ip -n testns1 r a 192.0.2.0/24 via 192.0.1.2
33362306a36Sopenharmony_ci	check_err $? "Failed to add route"
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci	ip -n testns1 r a 192.0.3.0/24 via 192.0.1.2
33662306a36Sopenharmony_ci	check_fail $? "Unexpected successful route add over limit"
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci	# Now create another dummy in second network namespace and
33962306a36Sopenharmony_ci	# insert two routes. That is over the limit of the netdevsim
34062306a36Sopenharmony_ci	# instance in the first namespace. Move the netdevsim instance
34162306a36Sopenharmony_ci	# into the second namespace and expect it to fail.
34262306a36Sopenharmony_ci
34362306a36Sopenharmony_ci	ip -n testns2 link add name $DUMMYDEV type dummy
34462306a36Sopenharmony_ci	check_err $? "Failed create dummy device"
34562306a36Sopenharmony_ci	ip -n testns2 link set $DUMMYDEV up
34662306a36Sopenharmony_ci	check_err $? "Failed bring up dummy device"
34762306a36Sopenharmony_ci	ip -n testns2 a a 192.0.1.1/24 dev $DUMMYDEV
34862306a36Sopenharmony_ci	check_err $? "Failed add an IP address to dummy device"
34962306a36Sopenharmony_ci	ip -n testns2 r a 192.0.2.0/24 via 192.0.1.2
35062306a36Sopenharmony_ci	check_err $? "Failed to add route"
35162306a36Sopenharmony_ci	ip -n testns2 r a 192.0.3.0/24 via 192.0.1.2
35262306a36Sopenharmony_ci	check_err $? "Failed to add route"
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci	devlink -N testns1 dev reload $DL_HANDLE netns testns2
35562306a36Sopenharmony_ci	check_fail $? "Unexpected successful reload from netns \"testns1\" into netns \"testns2\""
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ci	devlink -N testns2 resource set $DL_HANDLE path IPv4/fib size ' -1'
35862306a36Sopenharmony_ci	check_err $? "Failed to reset IPv4/fib resource size"
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci	devlink -N testns2 dev reload $DL_HANDLE netns 1
36162306a36Sopenharmony_ci	check_err $? "Failed to reload devlink back"
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci	ip netns del testns2
36462306a36Sopenharmony_ci	ip netns del testns1
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci	# Wait until netns async cleanup is done.
36762306a36Sopenharmony_ci	devlink_wait 2000
36862306a36Sopenharmony_ci
36962306a36Sopenharmony_ci	log_test "resource test"
37062306a36Sopenharmony_ci}
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ciinfo_get()
37362306a36Sopenharmony_ci{
37462306a36Sopenharmony_ci	local name=$1
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci	cmd_jq "devlink dev info $DL_HANDLE -j" ".[][][\"$name\"]" "-e"
37762306a36Sopenharmony_ci}
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_cidev_info_test()
38062306a36Sopenharmony_ci{
38162306a36Sopenharmony_ci	RET=0
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ci	driver=$(info_get "driver")
38462306a36Sopenharmony_ci	check_err $? "Failed to get driver name"
38562306a36Sopenharmony_ci	[ "$driver" == "netdevsim" ]
38662306a36Sopenharmony_ci	check_err $? "Unexpected driver name $driver"
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_ci	log_test "dev_info test"
38962306a36Sopenharmony_ci}
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_ciempty_reporter_test()
39262306a36Sopenharmony_ci{
39362306a36Sopenharmony_ci	RET=0
39462306a36Sopenharmony_ci
39562306a36Sopenharmony_ci	devlink health show $DL_HANDLE reporter empty >/dev/null
39662306a36Sopenharmony_ci	check_err $? "Failed show empty reporter"
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci	devlink health dump show $DL_HANDLE reporter empty >/dev/null
39962306a36Sopenharmony_ci	check_err $? "Failed show dump of empty reporter"
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_ci	devlink health diagnose $DL_HANDLE reporter empty >/dev/null
40262306a36Sopenharmony_ci	check_err $? "Failed diagnose empty reporter"
40362306a36Sopenharmony_ci
40462306a36Sopenharmony_ci	devlink health recover $DL_HANDLE reporter empty
40562306a36Sopenharmony_ci	check_err $? "Failed recover empty reporter"
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ci	log_test "empty reporter test"
40862306a36Sopenharmony_ci}
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_cicheck_reporter_info()
41162306a36Sopenharmony_ci{
41262306a36Sopenharmony_ci	local name=$1
41362306a36Sopenharmony_ci	local expected_state=$2
41462306a36Sopenharmony_ci	local expected_error=$3
41562306a36Sopenharmony_ci	local expected_recover=$4
41662306a36Sopenharmony_ci	local expected_grace_period=$5
41762306a36Sopenharmony_ci	local expected_auto_recover=$6
41862306a36Sopenharmony_ci
41962306a36Sopenharmony_ci	local show=$(devlink health show $DL_HANDLE reporter $name -j | jq -e -r ".[][][]")
42062306a36Sopenharmony_ci	check_err $? "Failed show $name reporter"
42162306a36Sopenharmony_ci
42262306a36Sopenharmony_ci	local state=$(echo $show | jq -r ".state")
42362306a36Sopenharmony_ci	[ "$state" == "$expected_state" ]
42462306a36Sopenharmony_ci	check_err $? "Unexpected \"state\" value (got $state, expected $expected_state)"
42562306a36Sopenharmony_ci
42662306a36Sopenharmony_ci	local error=$(echo $show | jq -r ".error")
42762306a36Sopenharmony_ci	[ "$error" == "$expected_error" ]
42862306a36Sopenharmony_ci	check_err $? "Unexpected \"error\" value (got $error, expected $expected_error)"
42962306a36Sopenharmony_ci
43062306a36Sopenharmony_ci	local recover=`echo $show | jq -r ".recover"`
43162306a36Sopenharmony_ci	[ "$recover" == "$expected_recover" ]
43262306a36Sopenharmony_ci	check_err $? "Unexpected \"recover\" value (got $recover, expected $expected_recover)"
43362306a36Sopenharmony_ci
43462306a36Sopenharmony_ci	local grace_period=$(echo $show | jq -r ".grace_period")
43562306a36Sopenharmony_ci	check_err $? "Failed get $name reporter grace_period"
43662306a36Sopenharmony_ci	[ "$grace_period" == "$expected_grace_period" ]
43762306a36Sopenharmony_ci	check_err $? "Unexpected \"grace_period\" value (got $grace_period, expected $expected_grace_period)"
43862306a36Sopenharmony_ci
43962306a36Sopenharmony_ci	local auto_recover=$(echo $show | jq -r ".auto_recover")
44062306a36Sopenharmony_ci	[ "$auto_recover" == "$expected_auto_recover" ]
44162306a36Sopenharmony_ci	check_err $? "Unexpected \"auto_recover\" value (got $auto_recover, expected $expected_auto_recover)"
44262306a36Sopenharmony_ci}
44362306a36Sopenharmony_ci
44462306a36Sopenharmony_cidummy_reporter_test()
44562306a36Sopenharmony_ci{
44662306a36Sopenharmony_ci	RET=0
44762306a36Sopenharmony_ci
44862306a36Sopenharmony_ci	check_reporter_info dummy healthy 0 0 0 true
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_ci	devlink health set $DL_HANDLE reporter dummy auto_recover false
45162306a36Sopenharmony_ci	check_err $? "Failed to dummy reporter auto_recover option"
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_ci	check_reporter_info dummy healthy 0 0 0 false
45462306a36Sopenharmony_ci
45562306a36Sopenharmony_ci	local BREAK_MSG="foo bar"
45662306a36Sopenharmony_ci	echo "$BREAK_MSG"> $DEBUGFS_DIR/health/break_health
45762306a36Sopenharmony_ci	check_err $? "Failed to break dummy reporter"
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_ci	check_reporter_info dummy error 1 0 0 false
46062306a36Sopenharmony_ci
46162306a36Sopenharmony_ci	local dump=$(devlink health dump show $DL_HANDLE reporter dummy -j)
46262306a36Sopenharmony_ci	check_err $? "Failed show dump of dummy reporter"
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_ci	local dump_break_msg=$(echo $dump | jq -r ".break_message")
46562306a36Sopenharmony_ci	[ "$dump_break_msg" == "$BREAK_MSG" ]
46662306a36Sopenharmony_ci	check_err $? "Unexpected dump break message value (got $dump_break_msg, expected $BREAK_MSG)"
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_ci	devlink health dump clear $DL_HANDLE reporter dummy
46962306a36Sopenharmony_ci	check_err $? "Failed clear dump of dummy reporter"
47062306a36Sopenharmony_ci
47162306a36Sopenharmony_ci	devlink health recover $DL_HANDLE reporter dummy
47262306a36Sopenharmony_ci	check_err $? "Failed recover dummy reporter"
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_ci	check_reporter_info dummy healthy 1 1 0 false
47562306a36Sopenharmony_ci
47662306a36Sopenharmony_ci	devlink health set $DL_HANDLE reporter dummy auto_recover true
47762306a36Sopenharmony_ci	check_err $? "Failed to dummy reporter auto_recover option"
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_ci	check_reporter_info dummy healthy 1 1 0 true
48062306a36Sopenharmony_ci
48162306a36Sopenharmony_ci	echo "$BREAK_MSG"> $DEBUGFS_DIR/health/break_health
48262306a36Sopenharmony_ci	check_err $? "Failed to break dummy reporter"
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_ci	check_reporter_info dummy healthy 2 2 0 true
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_ci	local diagnose=$(devlink health diagnose $DL_HANDLE reporter dummy -j -p)
48762306a36Sopenharmony_ci	check_err $? "Failed show diagnose of dummy reporter"
48862306a36Sopenharmony_ci
48962306a36Sopenharmony_ci	local rcvrd_break_msg=$(echo $diagnose | jq -r ".recovered_break_message")
49062306a36Sopenharmony_ci	[ "$rcvrd_break_msg" == "$BREAK_MSG" ]
49162306a36Sopenharmony_ci	check_err $? "Unexpected recovered break message value (got $rcvrd_break_msg, expected $BREAK_MSG)"
49262306a36Sopenharmony_ci
49362306a36Sopenharmony_ci	devlink health set $DL_HANDLE reporter dummy grace_period 10
49462306a36Sopenharmony_ci	check_err $? "Failed to dummy reporter grace_period option"
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_ci	check_reporter_info dummy healthy 2 2 10 true
49762306a36Sopenharmony_ci
49862306a36Sopenharmony_ci	echo "Y"> $DEBUGFS_DIR/health/fail_recover
49962306a36Sopenharmony_ci	check_err $? "Failed set dummy reporter recovery to fail"
50062306a36Sopenharmony_ci
50162306a36Sopenharmony_ci	echo "$BREAK_MSG"> $DEBUGFS_DIR/health/break_health
50262306a36Sopenharmony_ci	check_fail $? "Unexpected success of dummy reporter break"
50362306a36Sopenharmony_ci
50462306a36Sopenharmony_ci	check_reporter_info dummy error 3 2 10 true
50562306a36Sopenharmony_ci
50662306a36Sopenharmony_ci	devlink health recover $DL_HANDLE reporter dummy
50762306a36Sopenharmony_ci	check_fail $? "Unexpected success of dummy reporter recover"
50862306a36Sopenharmony_ci
50962306a36Sopenharmony_ci	echo "N"> $DEBUGFS_DIR/health/fail_recover
51062306a36Sopenharmony_ci	check_err $? "Failed set dummy reporter recovery to be successful"
51162306a36Sopenharmony_ci
51262306a36Sopenharmony_ci	devlink health recover $DL_HANDLE reporter dummy
51362306a36Sopenharmony_ci	check_err $? "Failed recover dummy reporter"
51462306a36Sopenharmony_ci
51562306a36Sopenharmony_ci	check_reporter_info dummy healthy 3 3 10 true
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_ci	echo 8192 > $DEBUGFS_DIR/health/binary_len
51862306a36Sopenharmony_ci	check_err $? "Failed set dummy reporter binary len to 8192"
51962306a36Sopenharmony_ci
52062306a36Sopenharmony_ci	local dump=$(devlink health dump show $DL_HANDLE reporter dummy -j)
52162306a36Sopenharmony_ci	check_err $? "Failed show dump of dummy reporter"
52262306a36Sopenharmony_ci
52362306a36Sopenharmony_ci	devlink health dump clear $DL_HANDLE reporter dummy
52462306a36Sopenharmony_ci	check_err $? "Failed clear dump of dummy reporter"
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_ci	log_test "dummy reporter test"
52762306a36Sopenharmony_ci}
52862306a36Sopenharmony_ci
52962306a36Sopenharmony_cirate_leafs_get()
53062306a36Sopenharmony_ci{
53162306a36Sopenharmony_ci	local handle=$1
53262306a36Sopenharmony_ci
53362306a36Sopenharmony_ci	cmd_jq "devlink port function rate show -j" \
53462306a36Sopenharmony_ci	       '.[] | to_entries | .[] | select(.value.type == "leaf") | .key | select(contains("'$handle'"))'
53562306a36Sopenharmony_ci}
53662306a36Sopenharmony_ci
53762306a36Sopenharmony_cirate_nodes_get()
53862306a36Sopenharmony_ci{
53962306a36Sopenharmony_ci	local handle=$1
54062306a36Sopenharmony_ci
54162306a36Sopenharmony_ci	cmd_jq "devlink port function rate show -j" \
54262306a36Sopenharmony_ci		'.[] | to_entries | .[] | select(.value.type == "node") | .key | select(contains("'$handle'"))'
54362306a36Sopenharmony_ci}
54462306a36Sopenharmony_ci
54562306a36Sopenharmony_cirate_attr_set()
54662306a36Sopenharmony_ci{
54762306a36Sopenharmony_ci	local handle=$1
54862306a36Sopenharmony_ci	local name=$2
54962306a36Sopenharmony_ci	local value=$3
55062306a36Sopenharmony_ci	local units=$4
55162306a36Sopenharmony_ci
55262306a36Sopenharmony_ci	devlink port function rate set $handle $name $value$units
55362306a36Sopenharmony_ci}
55462306a36Sopenharmony_ci
55562306a36Sopenharmony_cirate_attr_get()
55662306a36Sopenharmony_ci{
55762306a36Sopenharmony_ci	local handle=$1
55862306a36Sopenharmony_ci	local name=$2
55962306a36Sopenharmony_ci
56062306a36Sopenharmony_ci	cmd_jq "devlink port function rate show $handle -j" '.[][].'$name
56162306a36Sopenharmony_ci}
56262306a36Sopenharmony_ci
56362306a36Sopenharmony_cirate_attr_tx_rate_check()
56462306a36Sopenharmony_ci{
56562306a36Sopenharmony_ci	local handle=$1
56662306a36Sopenharmony_ci	local name=$2
56762306a36Sopenharmony_ci	local rate=$3
56862306a36Sopenharmony_ci	local debug_file=$4
56962306a36Sopenharmony_ci
57062306a36Sopenharmony_ci	rate_attr_set $handle $name $rate mbit
57162306a36Sopenharmony_ci	check_err $? "Failed to set $name value"
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_ci	local debug_value=$(cat $debug_file)
57462306a36Sopenharmony_ci	check_err $? "Failed to read $name value from debugfs"
57562306a36Sopenharmony_ci	[ "$debug_value" == "$rate" ]
57662306a36Sopenharmony_ci	check_err $? "Unexpected $name debug value $debug_value != $rate"
57762306a36Sopenharmony_ci
57862306a36Sopenharmony_ci	local api_value=$(( $(rate_attr_get $handle $name) * 8 / 1000000 ))
57962306a36Sopenharmony_ci	check_err $? "Failed to get $name attr value"
58062306a36Sopenharmony_ci	[ "$api_value" == "$rate" ]
58162306a36Sopenharmony_ci	check_err $? "Unexpected $name attr value $api_value != $rate"
58262306a36Sopenharmony_ci}
58362306a36Sopenharmony_ci
58462306a36Sopenharmony_cirate_attr_parent_check()
58562306a36Sopenharmony_ci{
58662306a36Sopenharmony_ci	local handle=$1
58762306a36Sopenharmony_ci	local parent=$2
58862306a36Sopenharmony_ci	local debug_file=$3
58962306a36Sopenharmony_ci
59062306a36Sopenharmony_ci	rate_attr_set $handle parent $parent
59162306a36Sopenharmony_ci	check_err $? "Failed to set parent"
59262306a36Sopenharmony_ci
59362306a36Sopenharmony_ci	debug_value=$(cat $debug_file)
59462306a36Sopenharmony_ci	check_err $? "Failed to get parent debugfs value"
59562306a36Sopenharmony_ci	[ "$debug_value" == "$parent" ]
59662306a36Sopenharmony_ci	check_err $? "Unexpected parent debug value $debug_value != $parent"
59762306a36Sopenharmony_ci
59862306a36Sopenharmony_ci	api_value=$(rate_attr_get $r_obj parent)
59962306a36Sopenharmony_ci	check_err $? "Failed to get parent attr value"
60062306a36Sopenharmony_ci	[ "$api_value" == "$parent" ]
60162306a36Sopenharmony_ci	check_err $? "Unexpected parent attr value $api_value != $parent"
60262306a36Sopenharmony_ci}
60362306a36Sopenharmony_ci
60462306a36Sopenharmony_cirate_node_add()
60562306a36Sopenharmony_ci{
60662306a36Sopenharmony_ci	local handle=$1
60762306a36Sopenharmony_ci
60862306a36Sopenharmony_ci	devlink port function rate add $handle
60962306a36Sopenharmony_ci}
61062306a36Sopenharmony_ci
61162306a36Sopenharmony_cirate_node_del()
61262306a36Sopenharmony_ci{
61362306a36Sopenharmony_ci	local handle=$1
61462306a36Sopenharmony_ci
61562306a36Sopenharmony_ci	devlink port function rate del $handle
61662306a36Sopenharmony_ci}
61762306a36Sopenharmony_ci
61862306a36Sopenharmony_cirate_test()
61962306a36Sopenharmony_ci{
62062306a36Sopenharmony_ci	RET=0
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_ci	echo $VF_COUNT > /sys/bus/netdevsim/devices/$DEV_NAME/sriov_numvfs
62362306a36Sopenharmony_ci	devlink dev eswitch set $DL_HANDLE mode switchdev
62462306a36Sopenharmony_ci	local leafs=`rate_leafs_get $DL_HANDLE`
62562306a36Sopenharmony_ci	local num_leafs=`echo $leafs | wc -w`
62662306a36Sopenharmony_ci	[ "$num_leafs" == "$VF_COUNT" ]
62762306a36Sopenharmony_ci	check_err $? "Expected $VF_COUNT rate leafs but got $num_leafs"
62862306a36Sopenharmony_ci
62962306a36Sopenharmony_ci	rate=10
63062306a36Sopenharmony_ci	for r_obj in $leafs
63162306a36Sopenharmony_ci	do
63262306a36Sopenharmony_ci		rate_attr_tx_rate_check $r_obj tx_share $rate \
63362306a36Sopenharmony_ci			$DEBUGFS_DIR/ports/${r_obj##*/}/tx_share
63462306a36Sopenharmony_ci		rate=$(($rate+10))
63562306a36Sopenharmony_ci	done
63662306a36Sopenharmony_ci
63762306a36Sopenharmony_ci	rate=100
63862306a36Sopenharmony_ci	for r_obj in $leafs
63962306a36Sopenharmony_ci	do
64062306a36Sopenharmony_ci		rate_attr_tx_rate_check $r_obj tx_max $rate \
64162306a36Sopenharmony_ci			$DEBUGFS_DIR/ports/${r_obj##*/}/tx_max
64262306a36Sopenharmony_ci		rate=$(($rate+100))
64362306a36Sopenharmony_ci	done
64462306a36Sopenharmony_ci
64562306a36Sopenharmony_ci	local node1_name='group1'
64662306a36Sopenharmony_ci	local node1="$DL_HANDLE/$node1_name"
64762306a36Sopenharmony_ci	rate_node_add "$node1"
64862306a36Sopenharmony_ci	check_err $? "Failed to add node $node1"
64962306a36Sopenharmony_ci
65062306a36Sopenharmony_ci	local num_nodes=`rate_nodes_get $DL_HANDLE | wc -w`
65162306a36Sopenharmony_ci	[ $num_nodes == 1 ]
65262306a36Sopenharmony_ci	check_err $? "Expected 1 rate node in output but got $num_nodes"
65362306a36Sopenharmony_ci
65462306a36Sopenharmony_ci	local node_tx_share=10
65562306a36Sopenharmony_ci	rate_attr_tx_rate_check $node1 tx_share $node_tx_share \
65662306a36Sopenharmony_ci		$DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_share
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_ci	local node_tx_max=100
65962306a36Sopenharmony_ci	rate_attr_tx_rate_check $node1 tx_max $node_tx_max \
66062306a36Sopenharmony_ci		$DEBUGFS_DIR/rate_nodes/${node1##*/}/tx_max
66162306a36Sopenharmony_ci
66262306a36Sopenharmony_ci	rate_node_del "$node1"
66362306a36Sopenharmony_ci	check_err $? "Failed to delete node $node1"
66462306a36Sopenharmony_ci	local num_nodes=`rate_nodes_get $DL_HANDLE | wc -w`
66562306a36Sopenharmony_ci	[ $num_nodes == 0 ]
66662306a36Sopenharmony_ci	check_err $? "Expected 0 rate node but got $num_nodes"
66762306a36Sopenharmony_ci
66862306a36Sopenharmony_ci	local node1_name='group1'
66962306a36Sopenharmony_ci	local node1="$DL_HANDLE/$node1_name"
67062306a36Sopenharmony_ci	rate_node_add "$node1"
67162306a36Sopenharmony_ci	check_err $? "Failed to add node $node1"
67262306a36Sopenharmony_ci
67362306a36Sopenharmony_ci	rate_attr_parent_check $r_obj $node1_name \
67462306a36Sopenharmony_ci		$DEBUGFS_DIR/ports/${r_obj##*/}/rate_parent
67562306a36Sopenharmony_ci
67662306a36Sopenharmony_ci	local node2_name='group2'
67762306a36Sopenharmony_ci	local node2="$DL_HANDLE/$node2_name"
67862306a36Sopenharmony_ci	rate_node_add "$node2"
67962306a36Sopenharmony_ci	check_err $? "Failed to add node $node2"
68062306a36Sopenharmony_ci
68162306a36Sopenharmony_ci	rate_attr_parent_check $node2 $node1_name \
68262306a36Sopenharmony_ci		$DEBUGFS_DIR/rate_nodes/$node2_name/rate_parent
68362306a36Sopenharmony_ci	rate_node_del "$node2"
68462306a36Sopenharmony_ci	check_err $? "Failed to delete node $node2"
68562306a36Sopenharmony_ci	rate_attr_set "$r_obj" noparent
68662306a36Sopenharmony_ci	check_err $? "Failed to unset $r_obj parent node"
68762306a36Sopenharmony_ci	rate_node_del "$node1"
68862306a36Sopenharmony_ci	check_err $? "Failed to delete node $node1"
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_ci	log_test "rate test"
69162306a36Sopenharmony_ci}
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_cisetup_prepare()
69462306a36Sopenharmony_ci{
69562306a36Sopenharmony_ci	modprobe netdevsim
69662306a36Sopenharmony_ci	echo "$BUS_ADDR $PORT_COUNT" > /sys/bus/netdevsim/new_device
69762306a36Sopenharmony_ci	while [ ! -d $SYSFS_NET_DIR ] ; do :; done
69862306a36Sopenharmony_ci}
69962306a36Sopenharmony_ci
70062306a36Sopenharmony_cicleanup()
70162306a36Sopenharmony_ci{
70262306a36Sopenharmony_ci	pre_cleanup
70362306a36Sopenharmony_ci	echo "$BUS_ADDR" > /sys/bus/netdevsim/del_device
70462306a36Sopenharmony_ci	modprobe -r netdevsim
70562306a36Sopenharmony_ci}
70662306a36Sopenharmony_ci
70762306a36Sopenharmony_citrap cleanup EXIT
70862306a36Sopenharmony_ci
70962306a36Sopenharmony_cisetup_prepare
71062306a36Sopenharmony_ci
71162306a36Sopenharmony_citests_run
71262306a36Sopenharmony_ci
71362306a36Sopenharmony_ciexit $EXIT_STATUS
714