18c2ecf20Sopenharmony_ci#!/bin/bash
28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_cilib_dir=$(dirname $0)/../../../net/forwarding
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ciALL_TESTS="fw_flash_test params_test regions_test reload_test \
78c2ecf20Sopenharmony_ci	   netns_reload_test resource_test dev_info_test \
88c2ecf20Sopenharmony_ci	   empty_reporter_test dummy_reporter_test"
98c2ecf20Sopenharmony_ciNUM_NETIFS=0
108c2ecf20Sopenharmony_cisource $lib_dir/lib.sh
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ciBUS_ADDR=10
138c2ecf20Sopenharmony_ciPORT_COUNT=4
148c2ecf20Sopenharmony_ciDEV_NAME=netdevsim$BUS_ADDR
158c2ecf20Sopenharmony_ciSYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV_NAME/net/
168c2ecf20Sopenharmony_ciDEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV_NAME/
178c2ecf20Sopenharmony_ciDL_HANDLE=netdevsim/$DEV_NAME
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ciwait_for_devlink()
208c2ecf20Sopenharmony_ci{
218c2ecf20Sopenharmony_ci	"$@" | grep -q $DL_HANDLE
228c2ecf20Sopenharmony_ci}
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_cidevlink_wait()
258c2ecf20Sopenharmony_ci{
268c2ecf20Sopenharmony_ci	local timeout=$1
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci	busywait "$timeout" wait_for_devlink devlink dev
298c2ecf20Sopenharmony_ci}
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cifw_flash_test()
328c2ecf20Sopenharmony_ci{
338c2ecf20Sopenharmony_ci	RET=0
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	devlink dev flash $DL_HANDLE file dummy
368c2ecf20Sopenharmony_ci	check_err $? "Failed to flash with status updates on"
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	devlink dev flash $DL_HANDLE file dummy component fw.mgmt
398c2ecf20Sopenharmony_ci	check_err $? "Failed to flash with component attribute"
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	devlink dev flash $DL_HANDLE file dummy overwrite settings
428c2ecf20Sopenharmony_ci	check_fail $? "Flash with overwrite settings should be rejected"
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	echo "1"> $DEBUGFS_DIR/fw_update_overwrite_mask
458c2ecf20Sopenharmony_ci	check_err $? "Failed to change allowed overwrite mask"
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci	devlink dev flash $DL_HANDLE file dummy overwrite settings
488c2ecf20Sopenharmony_ci	check_err $? "Failed to flash with settings overwrite enabled"
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci	devlink dev flash $DL_HANDLE file dummy overwrite identifiers
518c2ecf20Sopenharmony_ci	check_fail $? "Flash with overwrite settings should be identifiers"
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	echo "3"> $DEBUGFS_DIR/fw_update_overwrite_mask
548c2ecf20Sopenharmony_ci	check_err $? "Failed to change allowed overwrite mask"
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	devlink dev flash $DL_HANDLE file dummy overwrite identifiers overwrite settings
578c2ecf20Sopenharmony_ci	check_err $? "Failed to flash with settings and identifiers overwrite enabled"
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci	echo "n"> $DEBUGFS_DIR/fw_update_status
608c2ecf20Sopenharmony_ci	check_err $? "Failed to disable status updates"
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci	devlink dev flash $DL_HANDLE file dummy
638c2ecf20Sopenharmony_ci	check_err $? "Failed to flash with status updates off"
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci	log_test "fw flash test"
668c2ecf20Sopenharmony_ci}
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ciparam_get()
698c2ecf20Sopenharmony_ci{
708c2ecf20Sopenharmony_ci	local name=$1
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci	cmd_jq "devlink dev param show $DL_HANDLE name $name -j" \
738c2ecf20Sopenharmony_ci	       '.[][][].values[] | select(.cmode == "driverinit").value'
748c2ecf20Sopenharmony_ci}
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ciparam_set()
778c2ecf20Sopenharmony_ci{
788c2ecf20Sopenharmony_ci	local name=$1
798c2ecf20Sopenharmony_ci	local value=$2
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci	devlink dev param set $DL_HANDLE name $name cmode driverinit value $value
828c2ecf20Sopenharmony_ci}
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_cicheck_value()
858c2ecf20Sopenharmony_ci{
868c2ecf20Sopenharmony_ci	local name=$1
878c2ecf20Sopenharmony_ci	local phase_name=$2
888c2ecf20Sopenharmony_ci	local expected_param_value=$3
898c2ecf20Sopenharmony_ci	local expected_debugfs_value=$4
908c2ecf20Sopenharmony_ci	local value
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci	value=$(param_get $name)
938c2ecf20Sopenharmony_ci	check_err $? "Failed to get $name param value"
948c2ecf20Sopenharmony_ci	[ "$value" == "$expected_param_value" ]
958c2ecf20Sopenharmony_ci	check_err $? "Unexpected $phase_name $name param value"
968c2ecf20Sopenharmony_ci	value=$(<$DEBUGFS_DIR/$name)
978c2ecf20Sopenharmony_ci	check_err $? "Failed to get $name debugfs value"
988c2ecf20Sopenharmony_ci	[ "$value" == "$expected_debugfs_value" ]
998c2ecf20Sopenharmony_ci	check_err $? "Unexpected $phase_name $name debugfs value"
1008c2ecf20Sopenharmony_ci}
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ciparams_test()
1038c2ecf20Sopenharmony_ci{
1048c2ecf20Sopenharmony_ci	RET=0
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_ci	local max_macs
1078c2ecf20Sopenharmony_ci	local test1
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci	check_value max_macs initial 32 32
1108c2ecf20Sopenharmony_ci	check_value test1 initial true Y
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ci	param_set max_macs 16
1138c2ecf20Sopenharmony_ci	check_err $? "Failed to set max_macs param value"
1148c2ecf20Sopenharmony_ci	param_set test1 false
1158c2ecf20Sopenharmony_ci	check_err $? "Failed to set test1 param value"
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci	check_value max_macs post-set 16 32
1188c2ecf20Sopenharmony_ci	check_value test1 post-set false Y
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ci	devlink dev reload $DL_HANDLE
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ci	check_value max_macs post-reload 16 16
1238c2ecf20Sopenharmony_ci	check_value test1 post-reload false N
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ci	log_test "params test"
1268c2ecf20Sopenharmony_ci}
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_cicheck_region_size()
1298c2ecf20Sopenharmony_ci{
1308c2ecf20Sopenharmony_ci	local name=$1
1318c2ecf20Sopenharmony_ci	local size
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_ci	size=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].size')
1348c2ecf20Sopenharmony_ci	check_err $? "Failed to get $name region size"
1358c2ecf20Sopenharmony_ci	[ $size -eq 32768 ]
1368c2ecf20Sopenharmony_ci	check_err $? "Invalid $name region size"
1378c2ecf20Sopenharmony_ci}
1388c2ecf20Sopenharmony_ci
1398c2ecf20Sopenharmony_cicheck_region_snapshot_count()
1408c2ecf20Sopenharmony_ci{
1418c2ecf20Sopenharmony_ci	local name=$1
1428c2ecf20Sopenharmony_ci	local phase_name=$2
1438c2ecf20Sopenharmony_ci	local expected_count=$3
1448c2ecf20Sopenharmony_ci	local count
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci	count=$(devlink region show $DL_HANDLE/$name -j | jq -e -r '.[][].snapshot | length')
1478c2ecf20Sopenharmony_ci	[ $count -eq $expected_count ]
1488c2ecf20Sopenharmony_ci	check_err $? "Unexpected $phase_name snapshot count"
1498c2ecf20Sopenharmony_ci}
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_ciregions_test()
1528c2ecf20Sopenharmony_ci{
1538c2ecf20Sopenharmony_ci	RET=0
1548c2ecf20Sopenharmony_ci
1558c2ecf20Sopenharmony_ci	local count
1568c2ecf20Sopenharmony_ci
1578c2ecf20Sopenharmony_ci	check_region_size dummy
1588c2ecf20Sopenharmony_ci	check_region_snapshot_count dummy initial 0
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ci	echo ""> $DEBUGFS_DIR/take_snapshot
1618c2ecf20Sopenharmony_ci	check_err $? "Failed to take first dummy region snapshot"
1628c2ecf20Sopenharmony_ci	check_region_snapshot_count dummy post-first-snapshot 1
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_ci	echo ""> $DEBUGFS_DIR/take_snapshot
1658c2ecf20Sopenharmony_ci	check_err $? "Failed to take second dummy region snapshot"
1668c2ecf20Sopenharmony_ci	check_region_snapshot_count dummy post-second-snapshot 2
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_ci	echo ""> $DEBUGFS_DIR/take_snapshot
1698c2ecf20Sopenharmony_ci	check_err $? "Failed to take third dummy region snapshot"
1708c2ecf20Sopenharmony_ci	check_region_snapshot_count dummy post-third-snapshot 3
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_ci	devlink region del $DL_HANDLE/dummy snapshot 1
1738c2ecf20Sopenharmony_ci	check_err $? "Failed to delete first dummy region snapshot"
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_ci	check_region_snapshot_count dummy post-first-delete 2
1768c2ecf20Sopenharmony_ci
1778c2ecf20Sopenharmony_ci	devlink region new $DL_HANDLE/dummy snapshot 25
1788c2ecf20Sopenharmony_ci	check_err $? "Failed to create a new snapshot with id 25"
1798c2ecf20Sopenharmony_ci
1808c2ecf20Sopenharmony_ci	check_region_snapshot_count dummy post-first-request 3
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_ci	devlink region dump $DL_HANDLE/dummy snapshot 25 >> /dev/null
1838c2ecf20Sopenharmony_ci	check_err $? "Failed to dump snapshot with id 25"
1848c2ecf20Sopenharmony_ci
1858c2ecf20Sopenharmony_ci	devlink region read $DL_HANDLE/dummy snapshot 25 addr 0 len 1 >> /dev/null
1868c2ecf20Sopenharmony_ci	check_err $? "Failed to read snapshot with id 25 (1 byte)"
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_ci	devlink region read $DL_HANDLE/dummy snapshot 25 addr 128 len 128 >> /dev/null
1898c2ecf20Sopenharmony_ci	check_err $? "Failed to read snapshot with id 25 (128 bytes)"
1908c2ecf20Sopenharmony_ci
1918c2ecf20Sopenharmony_ci	devlink region read $DL_HANDLE/dummy snapshot 25 addr 128 len $((1<<32)) >> /dev/null
1928c2ecf20Sopenharmony_ci	check_err $? "Failed to read snapshot with id 25 (oversized)"
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_ci	devlink region read $DL_HANDLE/dummy snapshot 25 addr $((1<<32)) len 128 >> /dev/null 2>&1
1958c2ecf20Sopenharmony_ci	check_fail $? "Bad read of snapshot with id 25 did not fail"
1968c2ecf20Sopenharmony_ci
1978c2ecf20Sopenharmony_ci	devlink region del $DL_HANDLE/dummy snapshot 25
1988c2ecf20Sopenharmony_ci	check_err $? "Failed to delete snapshot with id 25"
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_ci	check_region_snapshot_count dummy post-second-delete 2
2018c2ecf20Sopenharmony_ci
2028c2ecf20Sopenharmony_ci	sid=$(devlink -j region new $DL_HANDLE/dummy | jq '.[][][][]')
2038c2ecf20Sopenharmony_ci	check_err $? "Failed to create a new snapshot with id allocated by the kernel"
2048c2ecf20Sopenharmony_ci
2058c2ecf20Sopenharmony_ci	check_region_snapshot_count dummy post-first-request 3
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ci	devlink region dump $DL_HANDLE/dummy snapshot $sid >> /dev/null
2088c2ecf20Sopenharmony_ci	check_err $? "Failed to dump a snapshot with id allocated by the kernel"
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_ci	devlink region del $DL_HANDLE/dummy snapshot $sid
2118c2ecf20Sopenharmony_ci	check_err $? "Failed to delete snapshot with id allocated by the kernel"
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_ci	check_region_snapshot_count dummy post-first-request 2
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_ci	log_test "regions test"
2168c2ecf20Sopenharmony_ci}
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_cireload_test()
2198c2ecf20Sopenharmony_ci{
2208c2ecf20Sopenharmony_ci	RET=0
2218c2ecf20Sopenharmony_ci
2228c2ecf20Sopenharmony_ci	devlink dev reload $DL_HANDLE
2238c2ecf20Sopenharmony_ci	check_err $? "Failed to reload"
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_ci	echo "y"> $DEBUGFS_DIR/fail_reload
2268c2ecf20Sopenharmony_ci	check_err $? "Failed to setup devlink reload to fail"
2278c2ecf20Sopenharmony_ci
2288c2ecf20Sopenharmony_ci	devlink dev reload $DL_HANDLE
2298c2ecf20Sopenharmony_ci	check_fail $? "Unexpected success of devlink reload"
2308c2ecf20Sopenharmony_ci
2318c2ecf20Sopenharmony_ci	echo "n"> $DEBUGFS_DIR/fail_reload
2328c2ecf20Sopenharmony_ci	check_err $? "Failed to setup devlink reload not to fail"
2338c2ecf20Sopenharmony_ci
2348c2ecf20Sopenharmony_ci	devlink dev reload $DL_HANDLE
2358c2ecf20Sopenharmony_ci	check_err $? "Failed to reload after set not to fail"
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_ci	echo "y"> $DEBUGFS_DIR/dont_allow_reload
2388c2ecf20Sopenharmony_ci	check_err $? "Failed to forbid devlink reload"
2398c2ecf20Sopenharmony_ci
2408c2ecf20Sopenharmony_ci	devlink dev reload $DL_HANDLE
2418c2ecf20Sopenharmony_ci	check_fail $? "Unexpected success of devlink reload"
2428c2ecf20Sopenharmony_ci
2438c2ecf20Sopenharmony_ci	echo "n"> $DEBUGFS_DIR/dont_allow_reload
2448c2ecf20Sopenharmony_ci	check_err $? "Failed to re-enable devlink reload"
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ci	devlink dev reload $DL_HANDLE
2478c2ecf20Sopenharmony_ci	check_err $? "Failed to reload after re-enable"
2488c2ecf20Sopenharmony_ci
2498c2ecf20Sopenharmony_ci	log_test "reload test"
2508c2ecf20Sopenharmony_ci}
2518c2ecf20Sopenharmony_ci
2528c2ecf20Sopenharmony_cinetns_reload_test()
2538c2ecf20Sopenharmony_ci{
2548c2ecf20Sopenharmony_ci	RET=0
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_ci	ip netns add testns1
2578c2ecf20Sopenharmony_ci	check_err $? "Failed add netns \"testns1\""
2588c2ecf20Sopenharmony_ci	ip netns add testns2
2598c2ecf20Sopenharmony_ci	check_err $? "Failed add netns \"testns2\""
2608c2ecf20Sopenharmony_ci
2618c2ecf20Sopenharmony_ci	devlink dev reload $DL_HANDLE netns testns1
2628c2ecf20Sopenharmony_ci	check_err $? "Failed to reload into netns \"testns1\""
2638c2ecf20Sopenharmony_ci
2648c2ecf20Sopenharmony_ci	devlink -N testns1 dev reload $DL_HANDLE netns testns2
2658c2ecf20Sopenharmony_ci	check_err $? "Failed to reload from netns \"testns1\" into netns \"testns2\""
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_ci	ip netns del testns2
2688c2ecf20Sopenharmony_ci	ip netns del testns1
2698c2ecf20Sopenharmony_ci
2708c2ecf20Sopenharmony_ci	# Wait until netns async cleanup is done.
2718c2ecf20Sopenharmony_ci	devlink_wait 2000
2728c2ecf20Sopenharmony_ci
2738c2ecf20Sopenharmony_ci	log_test "netns reload test"
2748c2ecf20Sopenharmony_ci}
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_ciDUMMYDEV="dummytest"
2778c2ecf20Sopenharmony_ci
2788c2ecf20Sopenharmony_cires_val_get()
2798c2ecf20Sopenharmony_ci{
2808c2ecf20Sopenharmony_ci	local netns=$1
2818c2ecf20Sopenharmony_ci	local parentname=$2
2828c2ecf20Sopenharmony_ci	local name=$3
2838c2ecf20Sopenharmony_ci	local type=$4
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_ci	cmd_jq "devlink -N $netns resource show $DL_HANDLE -j" \
2868c2ecf20Sopenharmony_ci	       ".[][][] | select(.name == \"$parentname\").resources[] \
2878c2ecf20Sopenharmony_ci	        | select(.name == \"$name\").$type"
2888c2ecf20Sopenharmony_ci}
2898c2ecf20Sopenharmony_ci
2908c2ecf20Sopenharmony_ciresource_test()
2918c2ecf20Sopenharmony_ci{
2928c2ecf20Sopenharmony_ci	RET=0
2938c2ecf20Sopenharmony_ci
2948c2ecf20Sopenharmony_ci	ip netns add testns1
2958c2ecf20Sopenharmony_ci	check_err $? "Failed add netns \"testns1\""
2968c2ecf20Sopenharmony_ci	ip netns add testns2
2978c2ecf20Sopenharmony_ci	check_err $? "Failed add netns \"testns2\""
2988c2ecf20Sopenharmony_ci
2998c2ecf20Sopenharmony_ci	devlink dev reload $DL_HANDLE netns testns1
3008c2ecf20Sopenharmony_ci	check_err $? "Failed to reload into netns \"testns1\""
3018c2ecf20Sopenharmony_ci
3028c2ecf20Sopenharmony_ci	# Create dummy dev to add the address and routes on.
3038c2ecf20Sopenharmony_ci
3048c2ecf20Sopenharmony_ci	ip -n testns1 link add name $DUMMYDEV type dummy
3058c2ecf20Sopenharmony_ci	check_err $? "Failed create dummy device"
3068c2ecf20Sopenharmony_ci	ip -n testns1 link set $DUMMYDEV up
3078c2ecf20Sopenharmony_ci	check_err $? "Failed bring up dummy device"
3088c2ecf20Sopenharmony_ci	ip -n testns1 a a 192.0.1.1/24 dev $DUMMYDEV
3098c2ecf20Sopenharmony_ci	check_err $? "Failed add an IP address to dummy device"
3108c2ecf20Sopenharmony_ci
3118c2ecf20Sopenharmony_ci	local occ=$(res_val_get testns1 IPv4 fib occ)
3128c2ecf20Sopenharmony_ci	local limit=$((occ+1))
3138c2ecf20Sopenharmony_ci
3148c2ecf20Sopenharmony_ci	# Set fib size limit to handle one another route only.
3158c2ecf20Sopenharmony_ci
3168c2ecf20Sopenharmony_ci	devlink -N testns1 resource set $DL_HANDLE path IPv4/fib size $limit
3178c2ecf20Sopenharmony_ci	check_err $? "Failed to set IPv4/fib resource size"
3188c2ecf20Sopenharmony_ci	local size_new=$(res_val_get testns1 IPv4 fib size_new)
3198c2ecf20Sopenharmony_ci	[ "$size_new" -eq "$limit" ]
3208c2ecf20Sopenharmony_ci	check_err $? "Unexpected \"size_new\" value (got $size_new, expected $limit)"
3218c2ecf20Sopenharmony_ci
3228c2ecf20Sopenharmony_ci	devlink -N testns1 dev reload $DL_HANDLE
3238c2ecf20Sopenharmony_ci	check_err $? "Failed to reload"
3248c2ecf20Sopenharmony_ci	local size=$(res_val_get testns1 IPv4 fib size)
3258c2ecf20Sopenharmony_ci	[ "$size" -eq "$limit" ]
3268c2ecf20Sopenharmony_ci	check_err $? "Unexpected \"size\" value (got $size, expected $limit)"
3278c2ecf20Sopenharmony_ci
3288c2ecf20Sopenharmony_ci	# Insert 2 routes, the first is going to be inserted,
3298c2ecf20Sopenharmony_ci	# the second is expected to fail to be inserted.
3308c2ecf20Sopenharmony_ci
3318c2ecf20Sopenharmony_ci	ip -n testns1 r a 192.0.2.0/24 via 192.0.1.2
3328c2ecf20Sopenharmony_ci	check_err $? "Failed to add route"
3338c2ecf20Sopenharmony_ci
3348c2ecf20Sopenharmony_ci	ip -n testns1 r a 192.0.3.0/24 via 192.0.1.2
3358c2ecf20Sopenharmony_ci	check_fail $? "Unexpected successful route add over limit"
3368c2ecf20Sopenharmony_ci
3378c2ecf20Sopenharmony_ci	# Now create another dummy in second network namespace and
3388c2ecf20Sopenharmony_ci	# insert two routes. That is over the limit of the netdevsim
3398c2ecf20Sopenharmony_ci	# instance in the first namespace. Move the netdevsim instance
3408c2ecf20Sopenharmony_ci	# into the second namespace and expect it to fail.
3418c2ecf20Sopenharmony_ci
3428c2ecf20Sopenharmony_ci	ip -n testns2 link add name $DUMMYDEV type dummy
3438c2ecf20Sopenharmony_ci	check_err $? "Failed create dummy device"
3448c2ecf20Sopenharmony_ci	ip -n testns2 link set $DUMMYDEV up
3458c2ecf20Sopenharmony_ci	check_err $? "Failed bring up dummy device"
3468c2ecf20Sopenharmony_ci	ip -n testns2 a a 192.0.1.1/24 dev $DUMMYDEV
3478c2ecf20Sopenharmony_ci	check_err $? "Failed add an IP address to dummy device"
3488c2ecf20Sopenharmony_ci	ip -n testns2 r a 192.0.2.0/24 via 192.0.1.2
3498c2ecf20Sopenharmony_ci	check_err $? "Failed to add route"
3508c2ecf20Sopenharmony_ci	ip -n testns2 r a 192.0.3.0/24 via 192.0.1.2
3518c2ecf20Sopenharmony_ci	check_err $? "Failed to add route"
3528c2ecf20Sopenharmony_ci
3538c2ecf20Sopenharmony_ci	devlink -N testns1 dev reload $DL_HANDLE netns testns2
3548c2ecf20Sopenharmony_ci	check_fail $? "Unexpected successful reload from netns \"testns1\" into netns \"testns2\""
3558c2ecf20Sopenharmony_ci
3568c2ecf20Sopenharmony_ci	devlink -N testns2 resource set $DL_HANDLE path IPv4/fib size ' -1'
3578c2ecf20Sopenharmony_ci	check_err $? "Failed to reset IPv4/fib resource size"
3588c2ecf20Sopenharmony_ci
3598c2ecf20Sopenharmony_ci	devlink -N testns2 dev reload $DL_HANDLE netns 1
3608c2ecf20Sopenharmony_ci	check_err $? "Failed to reload devlink back"
3618c2ecf20Sopenharmony_ci
3628c2ecf20Sopenharmony_ci	ip netns del testns2
3638c2ecf20Sopenharmony_ci	ip netns del testns1
3648c2ecf20Sopenharmony_ci
3658c2ecf20Sopenharmony_ci	# Wait until netns async cleanup is done.
3668c2ecf20Sopenharmony_ci	devlink_wait 2000
3678c2ecf20Sopenharmony_ci
3688c2ecf20Sopenharmony_ci	log_test "resource test"
3698c2ecf20Sopenharmony_ci}
3708c2ecf20Sopenharmony_ci
3718c2ecf20Sopenharmony_ciinfo_get()
3728c2ecf20Sopenharmony_ci{
3738c2ecf20Sopenharmony_ci	local name=$1
3748c2ecf20Sopenharmony_ci
3758c2ecf20Sopenharmony_ci	cmd_jq "devlink dev info $DL_HANDLE -j" ".[][][\"$name\"]" "-e"
3768c2ecf20Sopenharmony_ci}
3778c2ecf20Sopenharmony_ci
3788c2ecf20Sopenharmony_cidev_info_test()
3798c2ecf20Sopenharmony_ci{
3808c2ecf20Sopenharmony_ci	RET=0
3818c2ecf20Sopenharmony_ci
3828c2ecf20Sopenharmony_ci	driver=$(info_get "driver")
3838c2ecf20Sopenharmony_ci	check_err $? "Failed to get driver name"
3848c2ecf20Sopenharmony_ci	[ "$driver" == "netdevsim" ]
3858c2ecf20Sopenharmony_ci	check_err $? "Unexpected driver name $driver"
3868c2ecf20Sopenharmony_ci
3878c2ecf20Sopenharmony_ci	log_test "dev_info test"
3888c2ecf20Sopenharmony_ci}
3898c2ecf20Sopenharmony_ci
3908c2ecf20Sopenharmony_ciempty_reporter_test()
3918c2ecf20Sopenharmony_ci{
3928c2ecf20Sopenharmony_ci	RET=0
3938c2ecf20Sopenharmony_ci
3948c2ecf20Sopenharmony_ci	devlink health show $DL_HANDLE reporter empty >/dev/null
3958c2ecf20Sopenharmony_ci	check_err $? "Failed show empty reporter"
3968c2ecf20Sopenharmony_ci
3978c2ecf20Sopenharmony_ci	devlink health dump show $DL_HANDLE reporter empty >/dev/null
3988c2ecf20Sopenharmony_ci	check_err $? "Failed show dump of empty reporter"
3998c2ecf20Sopenharmony_ci
4008c2ecf20Sopenharmony_ci	devlink health diagnose $DL_HANDLE reporter empty >/dev/null
4018c2ecf20Sopenharmony_ci	check_err $? "Failed diagnose empty reporter"
4028c2ecf20Sopenharmony_ci
4038c2ecf20Sopenharmony_ci	devlink health recover $DL_HANDLE reporter empty
4048c2ecf20Sopenharmony_ci	check_err $? "Failed recover empty reporter"
4058c2ecf20Sopenharmony_ci
4068c2ecf20Sopenharmony_ci	log_test "empty reporter test"
4078c2ecf20Sopenharmony_ci}
4088c2ecf20Sopenharmony_ci
4098c2ecf20Sopenharmony_cicheck_reporter_info()
4108c2ecf20Sopenharmony_ci{
4118c2ecf20Sopenharmony_ci	local name=$1
4128c2ecf20Sopenharmony_ci	local expected_state=$2
4138c2ecf20Sopenharmony_ci	local expected_error=$3
4148c2ecf20Sopenharmony_ci	local expected_recover=$4
4158c2ecf20Sopenharmony_ci	local expected_grace_period=$5
4168c2ecf20Sopenharmony_ci	local expected_auto_recover=$6
4178c2ecf20Sopenharmony_ci
4188c2ecf20Sopenharmony_ci	local show=$(devlink health show $DL_HANDLE reporter $name -j | jq -e -r ".[][][]")
4198c2ecf20Sopenharmony_ci	check_err $? "Failed show $name reporter"
4208c2ecf20Sopenharmony_ci
4218c2ecf20Sopenharmony_ci	local state=$(echo $show | jq -r ".state")
4228c2ecf20Sopenharmony_ci	[ "$state" == "$expected_state" ]
4238c2ecf20Sopenharmony_ci	check_err $? "Unexpected \"state\" value (got $state, expected $expected_state)"
4248c2ecf20Sopenharmony_ci
4258c2ecf20Sopenharmony_ci	local error=$(echo $show | jq -r ".error")
4268c2ecf20Sopenharmony_ci	[ "$error" == "$expected_error" ]
4278c2ecf20Sopenharmony_ci	check_err $? "Unexpected \"error\" value (got $error, expected $expected_error)"
4288c2ecf20Sopenharmony_ci
4298c2ecf20Sopenharmony_ci	local recover=`echo $show | jq -r ".recover"`
4308c2ecf20Sopenharmony_ci	[ "$recover" == "$expected_recover" ]
4318c2ecf20Sopenharmony_ci	check_err $? "Unexpected \"recover\" value (got $recover, expected $expected_recover)"
4328c2ecf20Sopenharmony_ci
4338c2ecf20Sopenharmony_ci	local grace_period=$(echo $show | jq -r ".grace_period")
4348c2ecf20Sopenharmony_ci	check_err $? "Failed get $name reporter grace_period"
4358c2ecf20Sopenharmony_ci	[ "$grace_period" == "$expected_grace_period" ]
4368c2ecf20Sopenharmony_ci	check_err $? "Unexpected \"grace_period\" value (got $grace_period, expected $expected_grace_period)"
4378c2ecf20Sopenharmony_ci
4388c2ecf20Sopenharmony_ci	local auto_recover=$(echo $show | jq -r ".auto_recover")
4398c2ecf20Sopenharmony_ci	[ "$auto_recover" == "$expected_auto_recover" ]
4408c2ecf20Sopenharmony_ci	check_err $? "Unexpected \"auto_recover\" value (got $auto_recover, expected $expected_auto_recover)"
4418c2ecf20Sopenharmony_ci}
4428c2ecf20Sopenharmony_ci
4438c2ecf20Sopenharmony_cidummy_reporter_test()
4448c2ecf20Sopenharmony_ci{
4458c2ecf20Sopenharmony_ci	RET=0
4468c2ecf20Sopenharmony_ci
4478c2ecf20Sopenharmony_ci	check_reporter_info dummy healthy 0 0 0 true
4488c2ecf20Sopenharmony_ci
4498c2ecf20Sopenharmony_ci	devlink health set $DL_HANDLE reporter dummy auto_recover false
4508c2ecf20Sopenharmony_ci	check_err $? "Failed to dummy reporter auto_recover option"
4518c2ecf20Sopenharmony_ci
4528c2ecf20Sopenharmony_ci	check_reporter_info dummy healthy 0 0 0 false
4538c2ecf20Sopenharmony_ci
4548c2ecf20Sopenharmony_ci	local BREAK_MSG="foo bar"
4558c2ecf20Sopenharmony_ci	echo "$BREAK_MSG"> $DEBUGFS_DIR/health/break_health
4568c2ecf20Sopenharmony_ci	check_err $? "Failed to break dummy reporter"
4578c2ecf20Sopenharmony_ci
4588c2ecf20Sopenharmony_ci	check_reporter_info dummy error 1 0 0 false
4598c2ecf20Sopenharmony_ci
4608c2ecf20Sopenharmony_ci	local dump=$(devlink health dump show $DL_HANDLE reporter dummy -j)
4618c2ecf20Sopenharmony_ci	check_err $? "Failed show dump of dummy reporter"
4628c2ecf20Sopenharmony_ci
4638c2ecf20Sopenharmony_ci	local dump_break_msg=$(echo $dump | jq -r ".break_message")
4648c2ecf20Sopenharmony_ci	[ "$dump_break_msg" == "$BREAK_MSG" ]
4658c2ecf20Sopenharmony_ci	check_err $? "Unexpected dump break message value (got $dump_break_msg, expected $BREAK_MSG)"
4668c2ecf20Sopenharmony_ci
4678c2ecf20Sopenharmony_ci	devlink health dump clear $DL_HANDLE reporter dummy
4688c2ecf20Sopenharmony_ci	check_err $? "Failed clear dump of dummy reporter"
4698c2ecf20Sopenharmony_ci
4708c2ecf20Sopenharmony_ci	devlink health recover $DL_HANDLE reporter dummy
4718c2ecf20Sopenharmony_ci	check_err $? "Failed recover dummy reporter"
4728c2ecf20Sopenharmony_ci
4738c2ecf20Sopenharmony_ci	check_reporter_info dummy healthy 1 1 0 false
4748c2ecf20Sopenharmony_ci
4758c2ecf20Sopenharmony_ci	devlink health set $DL_HANDLE reporter dummy auto_recover true
4768c2ecf20Sopenharmony_ci	check_err $? "Failed to dummy reporter auto_recover option"
4778c2ecf20Sopenharmony_ci
4788c2ecf20Sopenharmony_ci	check_reporter_info dummy healthy 1 1 0 true
4798c2ecf20Sopenharmony_ci
4808c2ecf20Sopenharmony_ci	echo "$BREAK_MSG"> $DEBUGFS_DIR/health/break_health
4818c2ecf20Sopenharmony_ci	check_err $? "Failed to break dummy reporter"
4828c2ecf20Sopenharmony_ci
4838c2ecf20Sopenharmony_ci	check_reporter_info dummy healthy 2 2 0 true
4848c2ecf20Sopenharmony_ci
4858c2ecf20Sopenharmony_ci	local diagnose=$(devlink health diagnose $DL_HANDLE reporter dummy -j -p)
4868c2ecf20Sopenharmony_ci	check_err $? "Failed show diagnose of dummy reporter"
4878c2ecf20Sopenharmony_ci
4888c2ecf20Sopenharmony_ci	local rcvrd_break_msg=$(echo $diagnose | jq -r ".recovered_break_message")
4898c2ecf20Sopenharmony_ci	[ "$rcvrd_break_msg" == "$BREAK_MSG" ]
4908c2ecf20Sopenharmony_ci	check_err $? "Unexpected recovered break message value (got $rcvrd_break_msg, expected $BREAK_MSG)"
4918c2ecf20Sopenharmony_ci
4928c2ecf20Sopenharmony_ci	devlink health set $DL_HANDLE reporter dummy grace_period 10
4938c2ecf20Sopenharmony_ci	check_err $? "Failed to dummy reporter grace_period option"
4948c2ecf20Sopenharmony_ci
4958c2ecf20Sopenharmony_ci	check_reporter_info dummy healthy 2 2 10 true
4968c2ecf20Sopenharmony_ci
4978c2ecf20Sopenharmony_ci	echo "Y"> $DEBUGFS_DIR/health/fail_recover
4988c2ecf20Sopenharmony_ci	check_err $? "Failed set dummy reporter recovery to fail"
4998c2ecf20Sopenharmony_ci
5008c2ecf20Sopenharmony_ci	echo "$BREAK_MSG"> $DEBUGFS_DIR/health/break_health
5018c2ecf20Sopenharmony_ci	check_fail $? "Unexpected success of dummy reporter break"
5028c2ecf20Sopenharmony_ci
5038c2ecf20Sopenharmony_ci	check_reporter_info dummy error 3 2 10 true
5048c2ecf20Sopenharmony_ci
5058c2ecf20Sopenharmony_ci	devlink health recover $DL_HANDLE reporter dummy
5068c2ecf20Sopenharmony_ci	check_fail $? "Unexpected success of dummy reporter recover"
5078c2ecf20Sopenharmony_ci
5088c2ecf20Sopenharmony_ci	echo "N"> $DEBUGFS_DIR/health/fail_recover
5098c2ecf20Sopenharmony_ci	check_err $? "Failed set dummy reporter recovery to be successful"
5108c2ecf20Sopenharmony_ci
5118c2ecf20Sopenharmony_ci	devlink health recover $DL_HANDLE reporter dummy
5128c2ecf20Sopenharmony_ci	check_err $? "Failed recover dummy reporter"
5138c2ecf20Sopenharmony_ci
5148c2ecf20Sopenharmony_ci	check_reporter_info dummy healthy 3 3 10 true
5158c2ecf20Sopenharmony_ci
5168c2ecf20Sopenharmony_ci	echo 8192 > $DEBUGFS_DIR/health/binary_len
5178c2ecf20Sopenharmony_ci	check_err $? "Failed set dummy reporter binary len to 8192"
5188c2ecf20Sopenharmony_ci
5198c2ecf20Sopenharmony_ci	local dump=$(devlink health dump show $DL_HANDLE reporter dummy -j)
5208c2ecf20Sopenharmony_ci	check_err $? "Failed show dump of dummy reporter"
5218c2ecf20Sopenharmony_ci
5228c2ecf20Sopenharmony_ci	devlink health dump clear $DL_HANDLE reporter dummy
5238c2ecf20Sopenharmony_ci	check_err $? "Failed clear dump of dummy reporter"
5248c2ecf20Sopenharmony_ci
5258c2ecf20Sopenharmony_ci	log_test "dummy reporter test"
5268c2ecf20Sopenharmony_ci}
5278c2ecf20Sopenharmony_ci
5288c2ecf20Sopenharmony_cisetup_prepare()
5298c2ecf20Sopenharmony_ci{
5308c2ecf20Sopenharmony_ci	modprobe netdevsim
5318c2ecf20Sopenharmony_ci	echo "$BUS_ADDR $PORT_COUNT" > /sys/bus/netdevsim/new_device
5328c2ecf20Sopenharmony_ci	while [ ! -d $SYSFS_NET_DIR ] ; do :; done
5338c2ecf20Sopenharmony_ci}
5348c2ecf20Sopenharmony_ci
5358c2ecf20Sopenharmony_cicleanup()
5368c2ecf20Sopenharmony_ci{
5378c2ecf20Sopenharmony_ci	pre_cleanup
5388c2ecf20Sopenharmony_ci	echo "$BUS_ADDR" > /sys/bus/netdevsim/del_device
5398c2ecf20Sopenharmony_ci	modprobe -r netdevsim
5408c2ecf20Sopenharmony_ci}
5418c2ecf20Sopenharmony_ci
5428c2ecf20Sopenharmony_citrap cleanup EXIT
5438c2ecf20Sopenharmony_ci
5448c2ecf20Sopenharmony_cisetup_prepare
5458c2ecf20Sopenharmony_ci
5468c2ecf20Sopenharmony_citests_run
5478c2ecf20Sopenharmony_ci
5488c2ecf20Sopenharmony_ciexit $EXIT_STATUS
549