1bc7cbb1eSPetr Machata#!/bin/bash
2bc7cbb1eSPetr Machata# SPDX-License-Identifier: GPL-2.0
3bc7cbb1eSPetr Machata
47844ec21SPo-Hsu Lin# Kselftest framework requirement - SKIP code is 4.
57844ec21SPo-Hsu Linksft_skip=4
67844ec21SPo-Hsu Lin
7bc7cbb1eSPetr Machata##############################################################################
8bc7cbb1eSPetr Machata# Defines
9bc7cbb1eSPetr Machata
10bc030d9cSIdo Schimmelif [[ ! -v DEVLINK_DEV ]]; then
115b3a53c9SPetr Machata	DEVLINK_DEV=$(devlink port show "${NETIFS[p1]:-$NETIF_NO_CABLE}" -j \
128e46aee6SPetr Machata			     | jq -r '.port | keys[]' | cut -d/ -f-2)
13bc7cbb1eSPetr Machata	if [ -z "$DEVLINK_DEV" ]; then
14bc7cbb1eSPetr Machata		echo "SKIP: ${NETIFS[p1]} has no devlink device registered for it"
157844ec21SPo-Hsu Lin		exit $ksft_skip
16bc7cbb1eSPetr Machata	fi
17bc7cbb1eSPetr Machata	if [[ "$(echo $DEVLINK_DEV | grep -c pci)" -eq 0 ]]; then
18bc7cbb1eSPetr Machata		echo "SKIP: devlink device's bus is not PCI"
197844ec21SPo-Hsu Lin		exit $ksft_skip
20bc7cbb1eSPetr Machata	fi
21bc7cbb1eSPetr Machata
22bc7cbb1eSPetr Machata	DEVLINK_VIDDID=$(lspci -s $(echo $DEVLINK_DEV | cut -d"/" -f2) \
23bc7cbb1eSPetr Machata			 -n | cut -d" " -f3)
240521a262SPetr Machataelif [[ ! -z "$DEVLINK_DEV" ]]; then
25557c4d2fSJiri Pirko	devlink dev show $DEVLINK_DEV &> /dev/null
26557c4d2fSJiri Pirko	if [ $? -ne 0 ]; then
27557c4d2fSJiri Pirko		echo "SKIP: devlink device \"$DEVLINK_DEV\" not found"
287844ec21SPo-Hsu Lin		exit $ksft_skip
29557c4d2fSJiri Pirko	fi
30bc030d9cSIdo Schimmelfi
31bc7cbb1eSPetr Machata
32bc7cbb1eSPetr Machata##############################################################################
33bc7cbb1eSPetr Machata# Sanity checks
34bc7cbb1eSPetr Machata
356f64bcb6SJiri Pirkodevlink help 2>&1 | grep resource &> /dev/null
36bc7cbb1eSPetr Machataif [ $? -ne 0 ]; then
37bc7cbb1eSPetr Machata	echo "SKIP: iproute2 too old, missing devlink resource support"
387844ec21SPo-Hsu Lin	exit $ksft_skip
39bc7cbb1eSPetr Machatafi
40bc7cbb1eSPetr Machata
41a054c8d9SIdo Schimmeldevlink help 2>&1 | grep trap &> /dev/null
42a054c8d9SIdo Schimmelif [ $? -ne 0 ]; then
43a054c8d9SIdo Schimmel	echo "SKIP: iproute2 too old, missing devlink trap support"
447844ec21SPo-Hsu Lin	exit $ksft_skip
45a054c8d9SIdo Schimmelfi
46a054c8d9SIdo Schimmel
47552ec3d9SShalom Toledodevlink dev help 2>&1 | grep info &> /dev/null
48552ec3d9SShalom Toledoif [ $? -ne 0 ]; then
49552ec3d9SShalom Toledo	echo "SKIP: iproute2 too old, missing devlink dev info support"
507844ec21SPo-Hsu Lin	exit $ksft_skip
51552ec3d9SShalom Toledofi
52552ec3d9SShalom Toledo
53bc7cbb1eSPetr Machata##############################################################################
54bc7cbb1eSPetr Machata# Devlink helpers
55bc7cbb1eSPetr Machata
56bc7cbb1eSPetr Machatadevlink_resource_names_to_path()
57bc7cbb1eSPetr Machata{
58bc7cbb1eSPetr Machata	local resource
59bc7cbb1eSPetr Machata	local path=""
60bc7cbb1eSPetr Machata
61bc7cbb1eSPetr Machata	for resource in "${@}"; do
62bc7cbb1eSPetr Machata		if [ "$path" == "" ]; then
63bc7cbb1eSPetr Machata			path="$resource"
64bc7cbb1eSPetr Machata		else
65bc7cbb1eSPetr Machata			path="${path}/$resource"
66bc7cbb1eSPetr Machata		fi
67bc7cbb1eSPetr Machata	done
68bc7cbb1eSPetr Machata
69bc7cbb1eSPetr Machata	echo "$path"
70bc7cbb1eSPetr Machata}
71bc7cbb1eSPetr Machata
72bc7cbb1eSPetr Machatadevlink_resource_get()
73bc7cbb1eSPetr Machata{
74bc7cbb1eSPetr Machata	local name=$1
75bc7cbb1eSPetr Machata	local resource_name=.[][\"$DEVLINK_DEV\"]
76bc7cbb1eSPetr Machata
77bc7cbb1eSPetr Machata	resource_name="$resource_name | .[] | select (.name == \"$name\")"
78bc7cbb1eSPetr Machata
79bc7cbb1eSPetr Machata	shift
80bc7cbb1eSPetr Machata	for resource in "${@}"; do
81bc7cbb1eSPetr Machata		resource_name="${resource_name} | .[\"resources\"][] | \
82bc7cbb1eSPetr Machata			       select (.name == \"$resource\")"
83bc7cbb1eSPetr Machata	done
84bc7cbb1eSPetr Machata
85bc7cbb1eSPetr Machata	devlink -j resource show "$DEVLINK_DEV" | jq "$resource_name"
86bc7cbb1eSPetr Machata}
87bc7cbb1eSPetr Machata
88bc7cbb1eSPetr Machatadevlink_resource_size_get()
89bc7cbb1eSPetr Machata{
90bc7cbb1eSPetr Machata	local size=$(devlink_resource_get "$@" | jq '.["size_new"]')
91bc7cbb1eSPetr Machata
92bc7cbb1eSPetr Machata	if [ "$size" == "null" ]; then
93bc7cbb1eSPetr Machata		devlink_resource_get "$@" | jq '.["size"]'
94bc7cbb1eSPetr Machata	else
95bc7cbb1eSPetr Machata		echo "$size"
96bc7cbb1eSPetr Machata	fi
97bc7cbb1eSPetr Machata}
98bc7cbb1eSPetr Machata
99bc7cbb1eSPetr Machatadevlink_resource_size_set()
100bc7cbb1eSPetr Machata{
101bc7cbb1eSPetr Machata	local new_size=$1
102bc7cbb1eSPetr Machata	local path
103bc7cbb1eSPetr Machata
104bc7cbb1eSPetr Machata	shift
105bc7cbb1eSPetr Machata	path=$(devlink_resource_names_to_path "$@")
106bc7cbb1eSPetr Machata	devlink resource set "$DEVLINK_DEV" path "$path" size "$new_size"
107bc7cbb1eSPetr Machata	check_err $? "Failed setting path $path to size $size"
108bc7cbb1eSPetr Machata}
109bc7cbb1eSPetr Machata
11046b171d7SIdo Schimmeldevlink_resource_occ_get()
11146b171d7SIdo Schimmel{
11246b171d7SIdo Schimmel	devlink_resource_get "$@" | jq '.["occ"]'
11346b171d7SIdo Schimmel}
11446b171d7SIdo Schimmel
115bc7cbb1eSPetr Machatadevlink_reload()
116bc7cbb1eSPetr Machata{
117bc7cbb1eSPetr Machata	local still_pending
118bc7cbb1eSPetr Machata
119bc7cbb1eSPetr Machata	devlink dev reload "$DEVLINK_DEV" &> /dev/null
120bc7cbb1eSPetr Machata	check_err $? "Failed reload"
121bc7cbb1eSPetr Machata
122bc7cbb1eSPetr Machata	still_pending=$(devlink resource show "$DEVLINK_DEV" | \
123bc7cbb1eSPetr Machata			grep -c "size_new")
124bc7cbb1eSPetr Machata	check_err $still_pending "Failed reload - There are still unset sizes"
125f67a90a0SAmit Cohen
126f67a90a0SAmit Cohen	udevadm settle
127bc7cbb1eSPetr Machata}
128d04cc726SPetr Machata
129d04cc726SPetr Machatadeclare -A DEVLINK_ORIG
130d04cc726SPetr Machata
1316e0972e0SPetr Machata# Changing pool type from static to dynamic causes reinterpretation of threshold
1326e0972e0SPetr Machata# values. They therefore need to be saved before pool type is changed, then the
1336e0972e0SPetr Machata# pool type can be changed, and then the new values need to be set up. Therefore
1346e0972e0SPetr Machata# instead of saving the current state implicitly in the _set call, provide
1356e0972e0SPetr Machata# functions for all three primitives: save, set, and restore.
1366e0972e0SPetr Machata
137d04cc726SPetr Machatadevlink_port_pool_threshold()
138d04cc726SPetr Machata{
139d04cc726SPetr Machata	local port=$1; shift
140d04cc726SPetr Machata	local pool=$1; shift
141d04cc726SPetr Machata
142d04cc726SPetr Machata	devlink sb port pool show $port pool $pool -j \
143d04cc726SPetr Machata		| jq '.port_pool."'"$port"'"[].threshold'
144d04cc726SPetr Machata}
145d04cc726SPetr Machata
1466e0972e0SPetr Machatadevlink_port_pool_th_save()
1476e0972e0SPetr Machata{
1486e0972e0SPetr Machata	local port=$1; shift
1496e0972e0SPetr Machata	local pool=$1; shift
1506e0972e0SPetr Machata	local key="port_pool($port,$pool).threshold"
1516e0972e0SPetr Machata
1526e0972e0SPetr Machata	DEVLINK_ORIG[$key]=$(devlink_port_pool_threshold $port $pool)
1536e0972e0SPetr Machata}
1546e0972e0SPetr Machata
155d04cc726SPetr Machatadevlink_port_pool_th_set()
156d04cc726SPetr Machata{
157d04cc726SPetr Machata	local port=$1; shift
158d04cc726SPetr Machata	local pool=$1; shift
159d04cc726SPetr Machata	local th=$1; shift
160d04cc726SPetr Machata
161d04cc726SPetr Machata	devlink sb port pool set $port pool $pool th $th
162d04cc726SPetr Machata}
163d04cc726SPetr Machata
164d04cc726SPetr Machatadevlink_port_pool_th_restore()
165d04cc726SPetr Machata{
166d04cc726SPetr Machata	local port=$1; shift
167d04cc726SPetr Machata	local pool=$1; shift
168d04cc726SPetr Machata	local key="port_pool($port,$pool).threshold"
1696e0972e0SPetr Machata	local -a orig=(${DEVLINK_ORIG[$key]})
170d04cc726SPetr Machata
1716e0972e0SPetr Machata	if [[ -z $orig ]]; then
1726e0972e0SPetr Machata		echo "WARNING: Mismatched devlink_port_pool_th_restore"
1736e0972e0SPetr Machata	else
1746e0972e0SPetr Machata		devlink sb port pool set $port pool $pool th $orig
1756e0972e0SPetr Machata	fi
176d04cc726SPetr Machata}
177d04cc726SPetr Machata
178d04cc726SPetr Machatadevlink_pool_size_thtype()
179d04cc726SPetr Machata{
180d04cc726SPetr Machata	local pool=$1; shift
181d04cc726SPetr Machata
182d04cc726SPetr Machata	devlink sb pool show "$DEVLINK_DEV" pool $pool -j \
183d04cc726SPetr Machata	    | jq -r '.pool[][] | (.size, .thtype)'
184d04cc726SPetr Machata}
185d04cc726SPetr Machata
1866e0972e0SPetr Machatadevlink_pool_size_thtype_save()
1876e0972e0SPetr Machata{
1886e0972e0SPetr Machata	local pool=$1; shift
1896e0972e0SPetr Machata	local key="pool($pool).size_thtype"
1906e0972e0SPetr Machata
1916e0972e0SPetr Machata	DEVLINK_ORIG[$key]=$(devlink_pool_size_thtype $pool)
1926e0972e0SPetr Machata}
1936e0972e0SPetr Machata
194d04cc726SPetr Machatadevlink_pool_size_thtype_set()
195d04cc726SPetr Machata{
196d04cc726SPetr Machata	local pool=$1; shift
197d04cc726SPetr Machata	local thtype=$1; shift
198d04cc726SPetr Machata	local size=$1; shift
199d04cc726SPetr Machata
200d04cc726SPetr Machata	devlink sb pool set "$DEVLINK_DEV" pool $pool size $size thtype $thtype
201d04cc726SPetr Machata}
202d04cc726SPetr Machata
203d04cc726SPetr Machatadevlink_pool_size_thtype_restore()
204d04cc726SPetr Machata{
205d04cc726SPetr Machata	local pool=$1; shift
206d04cc726SPetr Machata	local key="pool($pool).size_thtype"
207d04cc726SPetr Machata	local -a orig=(${DEVLINK_ORIG[$key]})
208d04cc726SPetr Machata
2096e0972e0SPetr Machata	if [[ -z ${orig[0]} ]]; then
2106e0972e0SPetr Machata		echo "WARNING: Mismatched devlink_pool_size_thtype_restore"
2116e0972e0SPetr Machata	else
212d04cc726SPetr Machata		devlink sb pool set "$DEVLINK_DEV" pool $pool \
213d04cc726SPetr Machata			size ${orig[0]} thtype ${orig[1]}
2146e0972e0SPetr Machata	fi
215d04cc726SPetr Machata}
216d04cc726SPetr Machata
217d04cc726SPetr Machatadevlink_tc_bind_pool_th()
218d04cc726SPetr Machata{
219d04cc726SPetr Machata	local port=$1; shift
220d04cc726SPetr Machata	local tc=$1; shift
221d04cc726SPetr Machata	local dir=$1; shift
222d04cc726SPetr Machata
223d04cc726SPetr Machata	devlink sb tc bind show $port tc $tc type $dir -j \
224d04cc726SPetr Machata	    | jq -r '.tc_bind[][] | (.pool, .threshold)'
225d04cc726SPetr Machata}
226d04cc726SPetr Machata
2276e0972e0SPetr Machatadevlink_tc_bind_pool_th_save()
2286e0972e0SPetr Machata{
2296e0972e0SPetr Machata	local port=$1; shift
2306e0972e0SPetr Machata	local tc=$1; shift
2316e0972e0SPetr Machata	local dir=$1; shift
2326e0972e0SPetr Machata	local key="tc_bind($port,$dir,$tc).pool_th"
2336e0972e0SPetr Machata
2346e0972e0SPetr Machata	DEVLINK_ORIG[$key]=$(devlink_tc_bind_pool_th $port $tc $dir)
2356e0972e0SPetr Machata}
2366e0972e0SPetr Machata
237d04cc726SPetr Machatadevlink_tc_bind_pool_th_set()
238d04cc726SPetr Machata{
239d04cc726SPetr Machata	local port=$1; shift
240d04cc726SPetr Machata	local tc=$1; shift
241d04cc726SPetr Machata	local dir=$1; shift
242d04cc726SPetr Machata	local pool=$1; shift
243d04cc726SPetr Machata	local th=$1; shift
244d04cc726SPetr Machata
245d04cc726SPetr Machata	devlink sb tc bind set $port tc $tc type $dir pool $pool th $th
246d04cc726SPetr Machata}
247d04cc726SPetr Machata
248d04cc726SPetr Machatadevlink_tc_bind_pool_th_restore()
249d04cc726SPetr Machata{
250d04cc726SPetr Machata	local port=$1; shift
251d04cc726SPetr Machata	local tc=$1; shift
252d04cc726SPetr Machata	local dir=$1; shift
253d04cc726SPetr Machata	local key="tc_bind($port,$dir,$tc).pool_th"
254d04cc726SPetr Machata	local -a orig=(${DEVLINK_ORIG[$key]})
255d04cc726SPetr Machata
2566e0972e0SPetr Machata	if [[ -z ${orig[0]} ]]; then
2576e0972e0SPetr Machata		echo "WARNING: Mismatched devlink_tc_bind_pool_th_restore"
2586e0972e0SPetr Machata	else
259d04cc726SPetr Machata		devlink sb tc bind set $port tc $tc type $dir \
260d04cc726SPetr Machata			pool ${orig[0]} th ${orig[1]}
2616e0972e0SPetr Machata	fi
262d04cc726SPetr Machata}
263a054c8d9SIdo Schimmel
264a054c8d9SIdo Schimmeldevlink_traps_num_get()
265a054c8d9SIdo Schimmel{
266a054c8d9SIdo Schimmel	devlink -j trap | jq '.[]["'$DEVLINK_DEV'"] | length'
267a054c8d9SIdo Schimmel}
268a054c8d9SIdo Schimmel
269a054c8d9SIdo Schimmeldevlink_traps_get()
270a054c8d9SIdo Schimmel{
271a054c8d9SIdo Schimmel	devlink -j trap | jq -r '.[]["'$DEVLINK_DEV'"][].name'
272a054c8d9SIdo Schimmel}
273a054c8d9SIdo Schimmel
274a054c8d9SIdo Schimmeldevlink_trap_type_get()
275a054c8d9SIdo Schimmel{
276a054c8d9SIdo Schimmel	local trap_name=$1; shift
277a054c8d9SIdo Schimmel
278a054c8d9SIdo Schimmel	devlink -j trap show $DEVLINK_DEV trap $trap_name \
279a054c8d9SIdo Schimmel		| jq -r '.[][][].type'
280a054c8d9SIdo Schimmel}
281a054c8d9SIdo Schimmel
282a054c8d9SIdo Schimmeldevlink_trap_action_set()
283a054c8d9SIdo Schimmel{
284a054c8d9SIdo Schimmel	local trap_name=$1; shift
285a054c8d9SIdo Schimmel	local action=$1; shift
286a054c8d9SIdo Schimmel
287a054c8d9SIdo Schimmel	# Pipe output to /dev/null to avoid expected warnings.
288a054c8d9SIdo Schimmel	devlink trap set $DEVLINK_DEV trap $trap_name \
289a054c8d9SIdo Schimmel		action $action &> /dev/null
290a054c8d9SIdo Schimmel}
291a054c8d9SIdo Schimmel
292a054c8d9SIdo Schimmeldevlink_trap_action_get()
293a054c8d9SIdo Schimmel{
294a054c8d9SIdo Schimmel	local trap_name=$1; shift
295a054c8d9SIdo Schimmel
296a054c8d9SIdo Schimmel	devlink -j trap show $DEVLINK_DEV trap $trap_name \
297a054c8d9SIdo Schimmel		| jq -r '.[][][].action'
298a054c8d9SIdo Schimmel}
299a054c8d9SIdo Schimmel
300a054c8d9SIdo Schimmeldevlink_trap_group_get()
301a054c8d9SIdo Schimmel{
302a054c8d9SIdo Schimmel	devlink -j trap show $DEVLINK_DEV trap $trap_name \
303a054c8d9SIdo Schimmel		| jq -r '.[][][].group'
304a054c8d9SIdo Schimmel}
305a054c8d9SIdo Schimmel
306a054c8d9SIdo Schimmeldevlink_trap_metadata_test()
307a054c8d9SIdo Schimmel{
308a054c8d9SIdo Schimmel	local trap_name=$1; shift
309a054c8d9SIdo Schimmel	local metadata=$1; shift
310a054c8d9SIdo Schimmel
311a054c8d9SIdo Schimmel	devlink -jv trap show $DEVLINK_DEV trap $trap_name \
312a054c8d9SIdo Schimmel		| jq -e '.[][][].metadata | contains(["'$metadata'"])' \
313a054c8d9SIdo Schimmel		&> /dev/null
314a054c8d9SIdo Schimmel}
315a054c8d9SIdo Schimmel
316a054c8d9SIdo Schimmeldevlink_trap_rx_packets_get()
317a054c8d9SIdo Schimmel{
318a054c8d9SIdo Schimmel	local trap_name=$1; shift
319a054c8d9SIdo Schimmel
320a054c8d9SIdo Schimmel	devlink -js trap show $DEVLINK_DEV trap $trap_name \
321a054c8d9SIdo Schimmel		| jq '.[][][]["stats"]["rx"]["packets"]'
322a054c8d9SIdo Schimmel}
323a054c8d9SIdo Schimmel
324a054c8d9SIdo Schimmeldevlink_trap_rx_bytes_get()
325a054c8d9SIdo Schimmel{
326a054c8d9SIdo Schimmel	local trap_name=$1; shift
327a054c8d9SIdo Schimmel
328a054c8d9SIdo Schimmel	devlink -js trap show $DEVLINK_DEV trap $trap_name \
329a054c8d9SIdo Schimmel		| jq '.[][][]["stats"]["rx"]["bytes"]'
330a054c8d9SIdo Schimmel}
331a054c8d9SIdo Schimmel
33253f1bd6bSOleksandr Mazurdevlink_trap_drop_packets_get()
33353f1bd6bSOleksandr Mazur{
33453f1bd6bSOleksandr Mazur	local trap_name=$1; shift
33553f1bd6bSOleksandr Mazur
33653f1bd6bSOleksandr Mazur	devlink -js trap show $DEVLINK_DEV trap $trap_name \
33753f1bd6bSOleksandr Mazur		| jq '.[][][]["stats"]["rx"]["dropped"]'
33853f1bd6bSOleksandr Mazur}
33953f1bd6bSOleksandr Mazur
340a054c8d9SIdo Schimmeldevlink_trap_stats_idle_test()
341a054c8d9SIdo Schimmel{
342a054c8d9SIdo Schimmel	local trap_name=$1; shift
343a054c8d9SIdo Schimmel	local t0_packets t0_bytes
344a054c8d9SIdo Schimmel	local t1_packets t1_bytes
345a054c8d9SIdo Schimmel
346a054c8d9SIdo Schimmel	t0_packets=$(devlink_trap_rx_packets_get $trap_name)
347a054c8d9SIdo Schimmel	t0_bytes=$(devlink_trap_rx_bytes_get $trap_name)
348a054c8d9SIdo Schimmel
349a054c8d9SIdo Schimmel	sleep 1
350a054c8d9SIdo Schimmel
351a054c8d9SIdo Schimmel	t1_packets=$(devlink_trap_rx_packets_get $trap_name)
352a054c8d9SIdo Schimmel	t1_bytes=$(devlink_trap_rx_bytes_get $trap_name)
353a054c8d9SIdo Schimmel
354a054c8d9SIdo Schimmel	if [[ $t0_packets -eq $t1_packets && $t0_bytes -eq $t1_bytes ]]; then
355a054c8d9SIdo Schimmel		return 0
356a054c8d9SIdo Schimmel	else
357a054c8d9SIdo Schimmel		return 1
358a054c8d9SIdo Schimmel	fi
359a054c8d9SIdo Schimmel}
360a054c8d9SIdo Schimmel
36153f1bd6bSOleksandr Mazurdevlink_trap_drop_stats_idle_test()
36253f1bd6bSOleksandr Mazur{
36353f1bd6bSOleksandr Mazur	local trap_name=$1; shift
36453f1bd6bSOleksandr Mazur	local t0_packets t0_bytes
36553f1bd6bSOleksandr Mazur
36653f1bd6bSOleksandr Mazur	t0_packets=$(devlink_trap_drop_packets_get $trap_name)
36753f1bd6bSOleksandr Mazur
36853f1bd6bSOleksandr Mazur	sleep 1
36953f1bd6bSOleksandr Mazur
37053f1bd6bSOleksandr Mazur	t1_packets=$(devlink_trap_drop_packets_get $trap_name)
37153f1bd6bSOleksandr Mazur
37253f1bd6bSOleksandr Mazur	if [[ $t0_packets -eq $t1_packets ]]; then
37353f1bd6bSOleksandr Mazur		return 0
37453f1bd6bSOleksandr Mazur	else
37553f1bd6bSOleksandr Mazur		return 1
37653f1bd6bSOleksandr Mazur	fi
37753f1bd6bSOleksandr Mazur}
37853f1bd6bSOleksandr Mazur
379a054c8d9SIdo Schimmeldevlink_traps_enable_all()
380a054c8d9SIdo Schimmel{
381a054c8d9SIdo Schimmel	local trap_name
382a054c8d9SIdo Schimmel
383a054c8d9SIdo Schimmel	for trap_name in $(devlink_traps_get); do
384a054c8d9SIdo Schimmel		devlink_trap_action_set $trap_name "trap"
385a054c8d9SIdo Schimmel	done
386a054c8d9SIdo Schimmel}
387a054c8d9SIdo Schimmel
388a054c8d9SIdo Schimmeldevlink_traps_disable_all()
389a054c8d9SIdo Schimmel{
390a054c8d9SIdo Schimmel	for trap_name in $(devlink_traps_get); do
391a054c8d9SIdo Schimmel		devlink_trap_action_set $trap_name "drop"
392a054c8d9SIdo Schimmel	done
393a054c8d9SIdo Schimmel}
394a054c8d9SIdo Schimmel
395a054c8d9SIdo Schimmeldevlink_trap_groups_get()
396a054c8d9SIdo Schimmel{
397a054c8d9SIdo Schimmel	devlink -j trap group | jq -r '.[]["'$DEVLINK_DEV'"][].name'
398a054c8d9SIdo Schimmel}
399a054c8d9SIdo Schimmel
400a054c8d9SIdo Schimmeldevlink_trap_group_action_set()
401a054c8d9SIdo Schimmel{
402a054c8d9SIdo Schimmel	local group_name=$1; shift
403a054c8d9SIdo Schimmel	local action=$1; shift
404a054c8d9SIdo Schimmel
405a054c8d9SIdo Schimmel	# Pipe output to /dev/null to avoid expected warnings.
406a054c8d9SIdo Schimmel	devlink trap group set $DEVLINK_DEV group $group_name action $action \
407a054c8d9SIdo Schimmel		&> /dev/null
408a054c8d9SIdo Schimmel}
409a054c8d9SIdo Schimmel
410a054c8d9SIdo Schimmeldevlink_trap_group_rx_packets_get()
411a054c8d9SIdo Schimmel{
412a054c8d9SIdo Schimmel	local group_name=$1; shift
413a054c8d9SIdo Schimmel
414a054c8d9SIdo Schimmel	devlink -js trap group show $DEVLINK_DEV group $group_name \
415a054c8d9SIdo Schimmel		| jq '.[][][]["stats"]["rx"]["packets"]'
416a054c8d9SIdo Schimmel}
417a054c8d9SIdo Schimmel
418a054c8d9SIdo Schimmeldevlink_trap_group_rx_bytes_get()
419a054c8d9SIdo Schimmel{
420a054c8d9SIdo Schimmel	local group_name=$1; shift
421a054c8d9SIdo Schimmel
422a054c8d9SIdo Schimmel	devlink -js trap group show $DEVLINK_DEV group $group_name \
423a054c8d9SIdo Schimmel		| jq '.[][][]["stats"]["rx"]["bytes"]'
424a054c8d9SIdo Schimmel}
425a054c8d9SIdo Schimmel
426a054c8d9SIdo Schimmeldevlink_trap_group_stats_idle_test()
427a054c8d9SIdo Schimmel{
428a054c8d9SIdo Schimmel	local group_name=$1; shift
429a054c8d9SIdo Schimmel	local t0_packets t0_bytes
430a054c8d9SIdo Schimmel	local t1_packets t1_bytes
431a054c8d9SIdo Schimmel
432a054c8d9SIdo Schimmel	t0_packets=$(devlink_trap_group_rx_packets_get $group_name)
433a054c8d9SIdo Schimmel	t0_bytes=$(devlink_trap_group_rx_bytes_get $group_name)
434a054c8d9SIdo Schimmel
435a054c8d9SIdo Schimmel	sleep 1
436a054c8d9SIdo Schimmel
437a054c8d9SIdo Schimmel	t1_packets=$(devlink_trap_group_rx_packets_get $group_name)
438a054c8d9SIdo Schimmel	t1_bytes=$(devlink_trap_group_rx_bytes_get $group_name)
439a054c8d9SIdo Schimmel
440a054c8d9SIdo Schimmel	if [[ $t0_packets -eq $t1_packets && $t0_bytes -eq $t1_bytes ]]; then
441a054c8d9SIdo Schimmel		return 0
442a054c8d9SIdo Schimmel	else
443a054c8d9SIdo Schimmel		return 1
444a054c8d9SIdo Schimmel	fi
445a054c8d9SIdo Schimmel}
4466b45fe95SAmit Cohen
4477ce4e760SAmit Cohendevlink_trap_exception_test()
4487ce4e760SAmit Cohen{
4497ce4e760SAmit Cohen	local trap_name=$1; shift
45004cc99d9SIdo Schimmel	local group_name
45104cc99d9SIdo Schimmel
45204cc99d9SIdo Schimmel	group_name=$(devlink_trap_group_get $trap_name)
4537ce4e760SAmit Cohen
4547ce4e760SAmit Cohen	devlink_trap_stats_idle_test $trap_name
4557ce4e760SAmit Cohen	check_fail $? "Trap stats idle when packets should have been trapped"
4567ce4e760SAmit Cohen
4577ce4e760SAmit Cohen	devlink_trap_group_stats_idle_test $group_name
4587ce4e760SAmit Cohen	check_fail $? "Trap group idle when packets should have been trapped"
4597ce4e760SAmit Cohen}
4607ce4e760SAmit Cohen
4616b45fe95SAmit Cohendevlink_trap_drop_test()
4626b45fe95SAmit Cohen{
4636b45fe95SAmit Cohen	local trap_name=$1; shift
4646b45fe95SAmit Cohen	local dev=$1; shift
465c902a52cSJiri Pirko	local handle=$1; shift
46604cc99d9SIdo Schimmel	local group_name
46704cc99d9SIdo Schimmel
46804cc99d9SIdo Schimmel	group_name=$(devlink_trap_group_get $trap_name)
4696b45fe95SAmit Cohen
4706b45fe95SAmit Cohen	# This is the common part of all the tests. It checks that stats are
4716b45fe95SAmit Cohen	# initially idle, then non-idle after changing the trap action and
4726b45fe95SAmit Cohen	# finally idle again. It also makes sure the packets are dropped and
4736b45fe95SAmit Cohen	# never forwarded.
4746b45fe95SAmit Cohen	devlink_trap_stats_idle_test $trap_name
4756b45fe95SAmit Cohen	check_err $? "Trap stats not idle with initial drop action"
4766b45fe95SAmit Cohen	devlink_trap_group_stats_idle_test $group_name
4776b45fe95SAmit Cohen	check_err $? "Trap group stats not idle with initial drop action"
4786b45fe95SAmit Cohen
4796b45fe95SAmit Cohen	devlink_trap_action_set $trap_name "trap"
4806b45fe95SAmit Cohen	devlink_trap_stats_idle_test $trap_name
4816b45fe95SAmit Cohen	check_fail $? "Trap stats idle after setting action to trap"
4826b45fe95SAmit Cohen	devlink_trap_group_stats_idle_test $group_name
4836b45fe95SAmit Cohen	check_fail $? "Trap group stats idle after setting action to trap"
4846b45fe95SAmit Cohen
4856b45fe95SAmit Cohen	devlink_trap_action_set $trap_name "drop"
4866b45fe95SAmit Cohen
4876b45fe95SAmit Cohen	devlink_trap_stats_idle_test $trap_name
4886b45fe95SAmit Cohen	check_err $? "Trap stats not idle after setting action to drop"
4896b45fe95SAmit Cohen	devlink_trap_group_stats_idle_test $group_name
4906b45fe95SAmit Cohen	check_err $? "Trap group stats not idle after setting action to drop"
4916b45fe95SAmit Cohen
492c902a52cSJiri Pirko	tc_check_packets "dev $dev egress" $handle 0
4936b45fe95SAmit Cohen	check_err $? "Packets were not dropped"
4946b45fe95SAmit Cohen}
4956b45fe95SAmit Cohen
4966b45fe95SAmit Cohendevlink_trap_drop_cleanup()
4976b45fe95SAmit Cohen{
4986b45fe95SAmit Cohen	local mz_pid=$1; shift
4996b45fe95SAmit Cohen	local dev=$1; shift
500ef7f6b16SAmit Cohen	local proto=$1; shift
501c902a52cSJiri Pirko	local pref=$1; shift
502c902a52cSJiri Pirko	local handle=$1; shift
5036b45fe95SAmit Cohen
504*46f6569cSPetr Machata	kill_process $mz_pid
505c902a52cSJiri Pirko	tc filter del dev $dev egress protocol $proto pref $pref handle $handle flower
5066b45fe95SAmit Cohen}
5079fb74734SShalom Toledo
508da23a713SIdo Schimmeldevlink_trap_stats_check()
5099959b389SIdo Schimmel{
5109959b389SIdo Schimmel	local trap_name=$1; shift
5119959b389SIdo Schimmel	local send_one="$@"
5129959b389SIdo Schimmel	local t0_packets
5139959b389SIdo Schimmel	local t1_packets
5149959b389SIdo Schimmel
5159959b389SIdo Schimmel	t0_packets=$(devlink_trap_rx_packets_get $trap_name)
5169959b389SIdo Schimmel
5179959b389SIdo Schimmel	$send_one && sleep 1
5189959b389SIdo Schimmel
5199959b389SIdo Schimmel	t1_packets=$(devlink_trap_rx_packets_get $trap_name)
5209959b389SIdo Schimmel
521da23a713SIdo Schimmel	[[ $t1_packets -ne $t0_packets ]]
522da23a713SIdo Schimmel}
523da23a713SIdo Schimmel
524da23a713SIdo Schimmeldevlink_trap_stats_test()
525da23a713SIdo Schimmel{
526da23a713SIdo Schimmel	local test_name=$1; shift
527da23a713SIdo Schimmel
528da23a713SIdo Schimmel	RET=0
529da23a713SIdo Schimmel
530da23a713SIdo Schimmel	devlink_trap_stats_check "$@"
531da23a713SIdo Schimmel	check_err $? "Trap stats did not increase"
5329959b389SIdo Schimmel
5339959b389SIdo Schimmel	log_test "$test_name"
5349959b389SIdo Schimmel}
5359959b389SIdo Schimmel
5365fbff58eSIdo Schimmeldevlink_trap_policers_num_get()
5375fbff58eSIdo Schimmel{
5385fbff58eSIdo Schimmel	devlink -j -p trap policer show | jq '.[]["'$DEVLINK_DEV'"] | length'
5395fbff58eSIdo Schimmel}
5405fbff58eSIdo Schimmel
5415fbff58eSIdo Schimmeldevlink_trap_policer_rate_get()
5425fbff58eSIdo Schimmel{
5435fbff58eSIdo Schimmel	local policer_id=$1; shift
5445fbff58eSIdo Schimmel
5455fbff58eSIdo Schimmel	devlink -j -p trap policer show $DEVLINK_DEV policer $policer_id \
5465fbff58eSIdo Schimmel		| jq '.[][][]["rate"]'
5475fbff58eSIdo Schimmel}
5485fbff58eSIdo Schimmel
5495fbff58eSIdo Schimmeldevlink_trap_policer_burst_get()
5505fbff58eSIdo Schimmel{
5515fbff58eSIdo Schimmel	local policer_id=$1; shift
5525fbff58eSIdo Schimmel
5535fbff58eSIdo Schimmel	devlink -j -p trap policer show $DEVLINK_DEV policer $policer_id \
5545fbff58eSIdo Schimmel		| jq '.[][][]["burst"]'
5555fbff58eSIdo Schimmel}
5565fbff58eSIdo Schimmel
5575fbff58eSIdo Schimmeldevlink_trap_policer_rx_dropped_get()
5585fbff58eSIdo Schimmel{
5595fbff58eSIdo Schimmel	local policer_id=$1; shift
5605fbff58eSIdo Schimmel
5615fbff58eSIdo Schimmel	devlink -j -p -s trap policer show $DEVLINK_DEV policer $policer_id \
5625fbff58eSIdo Schimmel		| jq '.[][][]["stats"]["rx"]["dropped"]'
5635fbff58eSIdo Schimmel}
5645fbff58eSIdo Schimmel
5655fbff58eSIdo Schimmeldevlink_trap_group_policer_get()
5665fbff58eSIdo Schimmel{
5675fbff58eSIdo Schimmel	local group_name=$1; shift
5685fbff58eSIdo Schimmel
5695fbff58eSIdo Schimmel	devlink -j -p trap group show $DEVLINK_DEV group $group_name \
5705fbff58eSIdo Schimmel		| jq '.[][][]["policer"]'
5715fbff58eSIdo Schimmel}
5725fbff58eSIdo Schimmel
5739fb74734SShalom Toledodevlink_port_by_netdev()
5749fb74734SShalom Toledo{
5759fb74734SShalom Toledo	local if_name=$1
5769fb74734SShalom Toledo
5779fb74734SShalom Toledo	devlink -j port show $if_name | jq -e '.[] | keys' | jq -r '.[]'
5789fb74734SShalom Toledo}
5799fb74734SShalom Toledo
5809fb74734SShalom Toledodevlink_cpu_port_get()
5819fb74734SShalom Toledo{
5829fb74734SShalom Toledo	local cpu_dl_port_num=$(devlink port list | grep "$DEVLINK_DEV" |
5839fb74734SShalom Toledo				grep cpu | cut -d/ -f3 | cut -d: -f1 |
5849fb74734SShalom Toledo				sed -n '1p')
5859fb74734SShalom Toledo
5869fb74734SShalom Toledo	echo "$DEVLINK_DEV/$cpu_dl_port_num"
5879fb74734SShalom Toledo}
588294f44c1SPetr Machata
589294f44c1SPetr Machatadevlink_cell_size_get()
590294f44c1SPetr Machata{
591294f44c1SPetr Machata	devlink sb pool show "$DEVLINK_DEV" pool 0 -j \
592294f44c1SPetr Machata	    | jq '.pool[][].cell_size'
593294f44c1SPetr Machata}
594bd3f7850SAmit Cohen
595bd3f7850SAmit Cohendevlink_pool_size_get()
596bd3f7850SAmit Cohen{
597bd3f7850SAmit Cohen	devlink sb show "$DEVLINK_DEV" -j | jq '.[][][]["size"]'
598bd3f7850SAmit Cohen}
599