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