xref: /openbmc/linux/tools/testing/selftests/drivers/net/netdevsim/devlink_trap.sh (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1b3cb7df9SIdo Schimmel#!/bin/bash
2b3cb7df9SIdo Schimmel# SPDX-License-Identifier: GPL-2.0
3b3cb7df9SIdo Schimmel#
4b3cb7df9SIdo Schimmel# This test is for checking devlink-trap functionality. It makes use of
5b3cb7df9SIdo Schimmel# netdevsim which implements the required callbacks.
6b3cb7df9SIdo Schimmel
7b3cb7df9SIdo Schimmellib_dir=$(dirname $0)/../../../net/forwarding
8b3cb7df9SIdo Schimmel
9b3cb7df9SIdo SchimmelALL_TESTS="
10b3cb7df9SIdo Schimmel	init_test
11b3cb7df9SIdo Schimmel	trap_action_test
12b3cb7df9SIdo Schimmel	trap_metadata_test
13b3cb7df9SIdo Schimmel	bad_trap_test
14b3cb7df9SIdo Schimmel	bad_trap_action_test
15b3cb7df9SIdo Schimmel	trap_stats_test
16b3cb7df9SIdo Schimmel	trap_group_action_test
17b3cb7df9SIdo Schimmel	bad_trap_group_test
18b3cb7df9SIdo Schimmel	trap_group_stats_test
195fbff58eSIdo Schimmel	trap_policer_test
205fbff58eSIdo Schimmel	trap_policer_bind_test
21b3cb7df9SIdo Schimmel	port_del_test
22b3cb7df9SIdo Schimmel	dev_del_test
23b3cb7df9SIdo Schimmel"
24b3cb7df9SIdo SchimmelNETDEVSIM_PATH=/sys/bus/netdevsim/
25b3cb7df9SIdo SchimmelDEV_ADDR=1337
26b3cb7df9SIdo SchimmelDEV=netdevsim${DEV_ADDR}
275fbff58eSIdo SchimmelDEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV/
28b3cb7df9SIdo SchimmelSLEEP_TIME=1
29b3cb7df9SIdo SchimmelNETDEV=""
30b3cb7df9SIdo SchimmelNUM_NETIFS=0
31b3cb7df9SIdo Schimmelsource $lib_dir/lib.sh
320521a262SPetr Machata
330521a262SPetr MachataDEVLINK_DEV=
34b3cb7df9SIdo Schimmelsource $lib_dir/devlink_lib.sh
350521a262SPetr MachataDEVLINK_DEV=netdevsim/${DEV}
36b3cb7df9SIdo Schimmel
37b3cb7df9SIdo Schimmelrequire_command udevadm
38b3cb7df9SIdo Schimmel
39b3cb7df9SIdo Schimmelmodprobe netdevsim &> /dev/null
40b3cb7df9SIdo Schimmelif [ ! -d "$NETDEVSIM_PATH" ]; then
41b3cb7df9SIdo Schimmel	echo "SKIP: No netdevsim support"
42b3cb7df9SIdo Schimmel	exit 1
43b3cb7df9SIdo Schimmelfi
44b3cb7df9SIdo Schimmel
45b3cb7df9SIdo Schimmelif [ -d "${NETDEVSIM_PATH}/devices/netdevsim${DEV_ADDR}" ]; then
46b3cb7df9SIdo Schimmel	echo "SKIP: Device netdevsim${DEV_ADDR} already exists"
47b3cb7df9SIdo Schimmel	exit 1
48b3cb7df9SIdo Schimmelfi
49b3cb7df9SIdo Schimmel
50*d1c4a346SJakub Kicinskicheck_netdev_down()
51*d1c4a346SJakub Kicinski{
52*d1c4a346SJakub Kicinski	state=$(cat /sys/class/net/${NETDEV}/flags)
53*d1c4a346SJakub Kicinski
54*d1c4a346SJakub Kicinski	if [ $((state & 1)) -ne 0 ]; then
55*d1c4a346SJakub Kicinski		echo "WARNING: unexpected interface UP, disable NetworkManager?"
56*d1c4a346SJakub Kicinski
57*d1c4a346SJakub Kicinski		ip link set dev $NETDEV down
58*d1c4a346SJakub Kicinski	fi
59*d1c4a346SJakub Kicinski}
60*d1c4a346SJakub Kicinski
61b3cb7df9SIdo Schimmelinit_test()
62b3cb7df9SIdo Schimmel{
63b3cb7df9SIdo Schimmel	RET=0
64b3cb7df9SIdo Schimmel
65b3cb7df9SIdo Schimmel	test $(devlink_traps_num_get) -ne 0
66b3cb7df9SIdo Schimmel	check_err $? "No traps were registered"
67b3cb7df9SIdo Schimmel
68b3cb7df9SIdo Schimmel	log_test "Initialization"
69b3cb7df9SIdo Schimmel}
70b3cb7df9SIdo Schimmel
71b3cb7df9SIdo Schimmeltrap_action_test()
72b3cb7df9SIdo Schimmel{
73b3cb7df9SIdo Schimmel	local orig_action
74b3cb7df9SIdo Schimmel	local trap_name
75b3cb7df9SIdo Schimmel	local action
76b3cb7df9SIdo Schimmel
77b3cb7df9SIdo Schimmel	RET=0
78b3cb7df9SIdo Schimmel
79b3cb7df9SIdo Schimmel	for trap_name in $(devlink_traps_get); do
80b3cb7df9SIdo Schimmel		# The action of non-drop traps cannot be changed.
81b3cb7df9SIdo Schimmel		if [ $(devlink_trap_type_get $trap_name) = "drop" ]; then
82b3cb7df9SIdo Schimmel			devlink_trap_action_set $trap_name "trap"
83b3cb7df9SIdo Schimmel			action=$(devlink_trap_action_get $trap_name)
84b3cb7df9SIdo Schimmel			if [ $action != "trap" ]; then
85b3cb7df9SIdo Schimmel				check_err 1 "Trap $trap_name did not change action to trap"
86b3cb7df9SIdo Schimmel			fi
87b3cb7df9SIdo Schimmel
88b3cb7df9SIdo Schimmel			devlink_trap_action_set $trap_name "drop"
89b3cb7df9SIdo Schimmel			action=$(devlink_trap_action_get $trap_name)
90b3cb7df9SIdo Schimmel			if [ $action != "drop" ]; then
91b3cb7df9SIdo Schimmel				check_err 1 "Trap $trap_name did not change action to drop"
92b3cb7df9SIdo Schimmel			fi
93b3cb7df9SIdo Schimmel		else
94b3cb7df9SIdo Schimmel			orig_action=$(devlink_trap_action_get $trap_name)
95b3cb7df9SIdo Schimmel
96b3cb7df9SIdo Schimmel			devlink_trap_action_set $trap_name "trap"
97b3cb7df9SIdo Schimmel			action=$(devlink_trap_action_get $trap_name)
98b3cb7df9SIdo Schimmel			if [ $action != $orig_action ]; then
99b3cb7df9SIdo Schimmel				check_err 1 "Trap $trap_name changed action when should not"
100b3cb7df9SIdo Schimmel			fi
101b3cb7df9SIdo Schimmel
102b3cb7df9SIdo Schimmel			devlink_trap_action_set $trap_name "drop"
103b3cb7df9SIdo Schimmel			action=$(devlink_trap_action_get $trap_name)
104b3cb7df9SIdo Schimmel			if [ $action != $orig_action ]; then
105b3cb7df9SIdo Schimmel				check_err 1 "Trap $trap_name changed action when should not"
106b3cb7df9SIdo Schimmel			fi
107b3cb7df9SIdo Schimmel		fi
108b3cb7df9SIdo Schimmel	done
109b3cb7df9SIdo Schimmel
110b3cb7df9SIdo Schimmel	log_test "Trap action"
111b3cb7df9SIdo Schimmel}
112b3cb7df9SIdo Schimmel
113b3cb7df9SIdo Schimmeltrap_metadata_test()
114b3cb7df9SIdo Schimmel{
115b3cb7df9SIdo Schimmel	local trap_name
116b3cb7df9SIdo Schimmel
117b3cb7df9SIdo Schimmel	RET=0
118b3cb7df9SIdo Schimmel
119b3cb7df9SIdo Schimmel	for trap_name in $(devlink_traps_get); do
120b3cb7df9SIdo Schimmel		devlink_trap_metadata_test $trap_name "input_port"
121b3cb7df9SIdo Schimmel		check_err $? "Input port not reported as metadata of trap $trap_name"
1227a3c3f44SJiri Pirko		if [ $trap_name == "ingress_flow_action_drop" ] ||
1237a3c3f44SJiri Pirko		   [ $trap_name == "egress_flow_action_drop" ]; then
1247a3c3f44SJiri Pirko			devlink_trap_metadata_test $trap_name "flow_action_cookie"
1257a3c3f44SJiri Pirko			check_err $? "Flow action cookie not reported as metadata of trap $trap_name"
1267a3c3f44SJiri Pirko		fi
127b3cb7df9SIdo Schimmel	done
128b3cb7df9SIdo Schimmel
129b3cb7df9SIdo Schimmel	log_test "Trap metadata"
130b3cb7df9SIdo Schimmel}
131b3cb7df9SIdo Schimmel
132b3cb7df9SIdo Schimmelbad_trap_test()
133b3cb7df9SIdo Schimmel{
134b3cb7df9SIdo Schimmel	RET=0
135b3cb7df9SIdo Schimmel
136b3cb7df9SIdo Schimmel	devlink_trap_action_set "made_up_trap" "drop"
137b3cb7df9SIdo Schimmel	check_fail $? "Did not get an error for non-existing trap"
138b3cb7df9SIdo Schimmel
139b3cb7df9SIdo Schimmel	log_test "Non-existing trap"
140b3cb7df9SIdo Schimmel}
141b3cb7df9SIdo Schimmel
142b3cb7df9SIdo Schimmelbad_trap_action_test()
143b3cb7df9SIdo Schimmel{
144b3cb7df9SIdo Schimmel	local traps_arr
145b3cb7df9SIdo Schimmel	local trap_name
146b3cb7df9SIdo Schimmel
147b3cb7df9SIdo Schimmel	RET=0
148b3cb7df9SIdo Schimmel
149b3cb7df9SIdo Schimmel	# Pick first trap.
150b3cb7df9SIdo Schimmel	traps_arr=($(devlink_traps_get))
151b3cb7df9SIdo Schimmel	trap_name=${traps_arr[0]}
152b3cb7df9SIdo Schimmel
153b3cb7df9SIdo Schimmel	devlink_trap_action_set $trap_name "made_up_action"
154b3cb7df9SIdo Schimmel	check_fail $? "Did not get an error for non-existing trap action"
155b3cb7df9SIdo Schimmel
156b3cb7df9SIdo Schimmel	log_test "Non-existing trap action"
157b3cb7df9SIdo Schimmel}
158b3cb7df9SIdo Schimmel
159b3cb7df9SIdo Schimmeltrap_stats_test()
160b3cb7df9SIdo Schimmel{
161b3cb7df9SIdo Schimmel	local trap_name
162b3cb7df9SIdo Schimmel
163b3cb7df9SIdo Schimmel	RET=0
164b3cb7df9SIdo Schimmel
165*d1c4a346SJakub Kicinski	check_netdev_down
166b3cb7df9SIdo Schimmel	for trap_name in $(devlink_traps_get); do
167b3cb7df9SIdo Schimmel		devlink_trap_stats_idle_test $trap_name
168b3cb7df9SIdo Schimmel		check_err $? "Stats of trap $trap_name not idle when netdev down"
169b3cb7df9SIdo Schimmel
170b3cb7df9SIdo Schimmel		ip link set dev $NETDEV up
171b3cb7df9SIdo Schimmel
172b3cb7df9SIdo Schimmel		if [ $(devlink_trap_type_get $trap_name) = "drop" ]; then
173b3cb7df9SIdo Schimmel			devlink_trap_action_set $trap_name "trap"
174b3cb7df9SIdo Schimmel			devlink_trap_stats_idle_test $trap_name
175b3cb7df9SIdo Schimmel			check_fail $? "Stats of trap $trap_name idle when action is trap"
176b3cb7df9SIdo Schimmel
177b3cb7df9SIdo Schimmel			devlink_trap_action_set $trap_name "drop"
178b3cb7df9SIdo Schimmel			devlink_trap_stats_idle_test $trap_name
179b3cb7df9SIdo Schimmel			check_err $? "Stats of trap $trap_name not idle when action is drop"
1807a4f5479SOleksandr Mazur
1817a4f5479SOleksandr Mazur			echo "y"> $DEBUGFS_DIR/fail_trap_drop_counter_get
1827a4f5479SOleksandr Mazur			devlink -s trap show $DEVLINK_DEV trap $trap_name &> /dev/null
1837a4f5479SOleksandr Mazur			check_fail $? "Managed to read trap (hard dropped) statistics when should not"
1847a4f5479SOleksandr Mazur			echo "n"> $DEBUGFS_DIR/fail_trap_drop_counter_get
1857a4f5479SOleksandr Mazur			devlink -s trap show $DEVLINK_DEV trap $trap_name &> /dev/null
1867a4f5479SOleksandr Mazur			check_err $? "Did not manage to read trap (hard dropped) statistics when should"
1877a4f5479SOleksandr Mazur
1887a4f5479SOleksandr Mazur			devlink_trap_drop_stats_idle_test $trap_name
1897a4f5479SOleksandr Mazur			check_fail $? "Drop stats of trap $trap_name idle when should not"
190b3cb7df9SIdo Schimmel		else
191b3cb7df9SIdo Schimmel			devlink_trap_stats_idle_test $trap_name
192b3cb7df9SIdo Schimmel			check_fail $? "Stats of non-drop trap $trap_name idle when should not"
193b3cb7df9SIdo Schimmel		fi
194b3cb7df9SIdo Schimmel
195b3cb7df9SIdo Schimmel		ip link set dev $NETDEV down
196b3cb7df9SIdo Schimmel	done
197b3cb7df9SIdo Schimmel
198b3cb7df9SIdo Schimmel	log_test "Trap statistics"
199b3cb7df9SIdo Schimmel}
200b3cb7df9SIdo Schimmel
201b3cb7df9SIdo Schimmeltrap_group_action_test()
202b3cb7df9SIdo Schimmel{
203b3cb7df9SIdo Schimmel	local curr_group group_name
204b3cb7df9SIdo Schimmel	local trap_name
205b3cb7df9SIdo Schimmel	local trap_type
206b3cb7df9SIdo Schimmel	local action
207b3cb7df9SIdo Schimmel
208b3cb7df9SIdo Schimmel	RET=0
209b3cb7df9SIdo Schimmel
210b3cb7df9SIdo Schimmel	for group_name in $(devlink_trap_groups_get); do
211b3cb7df9SIdo Schimmel		devlink_trap_group_action_set $group_name "trap"
212b3cb7df9SIdo Schimmel
213b3cb7df9SIdo Schimmel		for trap_name in $(devlink_traps_get); do
214b3cb7df9SIdo Schimmel			curr_group=$(devlink_trap_group_get $trap_name)
215b3cb7df9SIdo Schimmel			if [ $curr_group != $group_name ]; then
216b3cb7df9SIdo Schimmel				continue
217b3cb7df9SIdo Schimmel			fi
218b3cb7df9SIdo Schimmel
219b3cb7df9SIdo Schimmel			trap_type=$(devlink_trap_type_get $trap_name)
220b3cb7df9SIdo Schimmel			if [ $trap_type != "drop" ]; then
221b3cb7df9SIdo Schimmel				continue
222b3cb7df9SIdo Schimmel			fi
223b3cb7df9SIdo Schimmel
224b3cb7df9SIdo Schimmel			action=$(devlink_trap_action_get $trap_name)
225b3cb7df9SIdo Schimmel			if [ $action != "trap" ]; then
226b3cb7df9SIdo Schimmel				check_err 1 "Trap $trap_name did not change action to trap"
227b3cb7df9SIdo Schimmel			fi
228b3cb7df9SIdo Schimmel		done
229b3cb7df9SIdo Schimmel
230b3cb7df9SIdo Schimmel		devlink_trap_group_action_set $group_name "drop"
231b3cb7df9SIdo Schimmel
232b3cb7df9SIdo Schimmel		for trap_name in $(devlink_traps_get); do
233b3cb7df9SIdo Schimmel			curr_group=$(devlink_trap_group_get $trap_name)
234b3cb7df9SIdo Schimmel			if [ $curr_group != $group_name ]; then
235b3cb7df9SIdo Schimmel				continue
236b3cb7df9SIdo Schimmel			fi
237b3cb7df9SIdo Schimmel
238b3cb7df9SIdo Schimmel			trap_type=$(devlink_trap_type_get $trap_name)
239b3cb7df9SIdo Schimmel			if [ $trap_type != "drop" ]; then
240b3cb7df9SIdo Schimmel				continue
241b3cb7df9SIdo Schimmel			fi
242b3cb7df9SIdo Schimmel
243b3cb7df9SIdo Schimmel			action=$(devlink_trap_action_get $trap_name)
244b3cb7df9SIdo Schimmel			if [ $action != "drop" ]; then
245b3cb7df9SIdo Schimmel				check_err 1 "Trap $trap_name did not change action to drop"
246b3cb7df9SIdo Schimmel			fi
247b3cb7df9SIdo Schimmel		done
248b3cb7df9SIdo Schimmel	done
249b3cb7df9SIdo Schimmel
250b3cb7df9SIdo Schimmel	log_test "Trap group action"
251b3cb7df9SIdo Schimmel}
252b3cb7df9SIdo Schimmel
253b3cb7df9SIdo Schimmelbad_trap_group_test()
254b3cb7df9SIdo Schimmel{
255b3cb7df9SIdo Schimmel	RET=0
256b3cb7df9SIdo Schimmel
257b3cb7df9SIdo Schimmel	devlink_trap_group_action_set "made_up_trap_group" "drop"
258b3cb7df9SIdo Schimmel	check_fail $? "Did not get an error for non-existing trap group"
259b3cb7df9SIdo Schimmel
260b3cb7df9SIdo Schimmel	log_test "Non-existing trap group"
261b3cb7df9SIdo Schimmel}
262b3cb7df9SIdo Schimmel
263b3cb7df9SIdo Schimmeltrap_group_stats_test()
264b3cb7df9SIdo Schimmel{
265b3cb7df9SIdo Schimmel	local group_name
266b3cb7df9SIdo Schimmel
267b3cb7df9SIdo Schimmel	RET=0
268b3cb7df9SIdo Schimmel
269*d1c4a346SJakub Kicinski	check_netdev_down
270b3cb7df9SIdo Schimmel	for group_name in $(devlink_trap_groups_get); do
271b3cb7df9SIdo Schimmel		devlink_trap_group_stats_idle_test $group_name
272b3cb7df9SIdo Schimmel		check_err $? "Stats of trap group $group_name not idle when netdev down"
273b3cb7df9SIdo Schimmel
274b3cb7df9SIdo Schimmel		ip link set dev $NETDEV up
275b3cb7df9SIdo Schimmel
276b3cb7df9SIdo Schimmel		devlink_trap_group_action_set $group_name "trap"
277b3cb7df9SIdo Schimmel		devlink_trap_group_stats_idle_test $group_name
278b3cb7df9SIdo Schimmel		check_fail $? "Stats of trap group $group_name idle when action is trap"
279b3cb7df9SIdo Schimmel
280b3cb7df9SIdo Schimmel		devlink_trap_group_action_set $group_name "drop"
281b3cb7df9SIdo Schimmel		ip link set dev $NETDEV down
282b3cb7df9SIdo Schimmel	done
283b3cb7df9SIdo Schimmel
284b3cb7df9SIdo Schimmel	log_test "Trap group statistics"
285b3cb7df9SIdo Schimmel}
286b3cb7df9SIdo Schimmel
2875fbff58eSIdo Schimmeltrap_policer_test()
2885fbff58eSIdo Schimmel{
2895fbff58eSIdo Schimmel	local packets_t0
2905fbff58eSIdo Schimmel	local packets_t1
2915fbff58eSIdo Schimmel
2924d59e59cSIdo Schimmel	RET=0
2934d59e59cSIdo Schimmel
2945fbff58eSIdo Schimmel	if [ $(devlink_trap_policers_num_get) -eq 0 ]; then
2955fbff58eSIdo Schimmel		check_err 1 "Failed to dump policers"
2965fbff58eSIdo Schimmel	fi
2975fbff58eSIdo Schimmel
2985fbff58eSIdo Schimmel	devlink trap policer set $DEVLINK_DEV policer 1337 &> /dev/null
2995fbff58eSIdo Schimmel	check_fail $? "Did not get an error for setting a non-existing policer"
3005fbff58eSIdo Schimmel	devlink trap policer show $DEVLINK_DEV policer 1337 &> /dev/null
3015fbff58eSIdo Schimmel	check_fail $? "Did not get an error for getting a non-existing policer"
3025fbff58eSIdo Schimmel
3035fbff58eSIdo Schimmel	devlink trap policer set $DEVLINK_DEV policer 1 rate 2000 burst 16
3045fbff58eSIdo Schimmel	check_err $? "Failed to set valid parameters for a valid policer"
3055fbff58eSIdo Schimmel	if [ $(devlink_trap_policer_rate_get 1) -ne 2000 ]; then
3065fbff58eSIdo Schimmel		check_err 1 "Policer rate was not changed"
3075fbff58eSIdo Schimmel	fi
3085fbff58eSIdo Schimmel	if [ $(devlink_trap_policer_burst_get 1) -ne 16 ]; then
3095fbff58eSIdo Schimmel		check_err 1 "Policer burst size was not changed"
3105fbff58eSIdo Schimmel	fi
3115fbff58eSIdo Schimmel
3125fbff58eSIdo Schimmel	devlink trap policer set $DEVLINK_DEV policer 1 rate 0 &> /dev/null
3135fbff58eSIdo Schimmel	check_fail $? "Policer rate was changed to rate lower than limit"
3145fbff58eSIdo Schimmel	devlink trap policer set $DEVLINK_DEV policer 1 rate 9000 &> /dev/null
3155fbff58eSIdo Schimmel	check_fail $? "Policer rate was changed to rate higher than limit"
3165fbff58eSIdo Schimmel	devlink trap policer set $DEVLINK_DEV policer 1 burst 2 &> /dev/null
3175fbff58eSIdo Schimmel	check_fail $? "Policer burst size was changed to burst size lower than limit"
3185fbff58eSIdo Schimmel	devlink trap policer set $DEVLINK_DEV policer 1 rate 65537 &> /dev/null
3195fbff58eSIdo Schimmel	check_fail $? "Policer burst size was changed to burst size higher than limit"
3205fbff58eSIdo Schimmel	echo "y" > $DEBUGFS_DIR/fail_trap_policer_set
3215fbff58eSIdo Schimmel	devlink trap policer set $DEVLINK_DEV policer 1 rate 3000 &> /dev/null
3225fbff58eSIdo Schimmel	check_fail $? "Managed to set policer rate when should not"
3235fbff58eSIdo Schimmel	echo "n" > $DEBUGFS_DIR/fail_trap_policer_set
3245fbff58eSIdo Schimmel	if [ $(devlink_trap_policer_rate_get 1) -ne 2000 ]; then
3255fbff58eSIdo Schimmel		check_err 1 "Policer rate was changed to an invalid value"
3265fbff58eSIdo Schimmel	fi
3275fbff58eSIdo Schimmel	if [ $(devlink_trap_policer_burst_get 1) -ne 16 ]; then
3285fbff58eSIdo Schimmel		check_err 1 "Policer burst size was changed to an invalid value"
3295fbff58eSIdo Schimmel	fi
3305fbff58eSIdo Schimmel
3315fbff58eSIdo Schimmel	packets_t0=$(devlink_trap_policer_rx_dropped_get 1)
3325fbff58eSIdo Schimmel	sleep .5
3335fbff58eSIdo Schimmel	packets_t1=$(devlink_trap_policer_rx_dropped_get 1)
3345fbff58eSIdo Schimmel	if [ ! $packets_t1 -gt $packets_t0 ]; then
3355fbff58eSIdo Schimmel		check_err 1 "Policer drop counter was not incremented"
3365fbff58eSIdo Schimmel	fi
3375fbff58eSIdo Schimmel
3385fbff58eSIdo Schimmel	echo "y"> $DEBUGFS_DIR/fail_trap_policer_counter_get
3395fbff58eSIdo Schimmel	devlink -s trap policer show $DEVLINK_DEV policer 1 &> /dev/null
3405fbff58eSIdo Schimmel	check_fail $? "Managed to read policer drop counter when should not"
3415fbff58eSIdo Schimmel	echo "n"> $DEBUGFS_DIR/fail_trap_policer_counter_get
3425fbff58eSIdo Schimmel	devlink -s trap policer show $DEVLINK_DEV policer 1 &> /dev/null
3435fbff58eSIdo Schimmel	check_err $? "Did not manage to read policer drop counter when should"
3445fbff58eSIdo Schimmel
3455fbff58eSIdo Schimmel	log_test "Trap policer"
3465fbff58eSIdo Schimmel}
3475fbff58eSIdo Schimmel
3485fbff58eSIdo Schimmeltrap_group_check_policer()
3495fbff58eSIdo Schimmel{
3505fbff58eSIdo Schimmel	local group_name=$1; shift
3515fbff58eSIdo Schimmel
3525fbff58eSIdo Schimmel	devlink -j -p trap group show $DEVLINK_DEV group $group_name \
3535fbff58eSIdo Schimmel		| jq -e '.[][][]["policer"]' &> /dev/null
3545fbff58eSIdo Schimmel}
3555fbff58eSIdo Schimmel
3565fbff58eSIdo Schimmeltrap_policer_bind_test()
3575fbff58eSIdo Schimmel{
3584d59e59cSIdo Schimmel	RET=0
3594d59e59cSIdo Schimmel
3605fbff58eSIdo Schimmel	devlink trap group set $DEVLINK_DEV group l2_drops policer 1
3615fbff58eSIdo Schimmel	check_err $? "Failed to bind a valid policer"
3625fbff58eSIdo Schimmel	if [ $(devlink_trap_group_policer_get "l2_drops") -ne 1 ]; then
3635fbff58eSIdo Schimmel		check_err 1 "Bound policer was not changed"
3645fbff58eSIdo Schimmel	fi
3655fbff58eSIdo Schimmel
3665fbff58eSIdo Schimmel	devlink trap group set $DEVLINK_DEV group l2_drops policer 1337 \
3675fbff58eSIdo Schimmel		&> /dev/null
3685fbff58eSIdo Schimmel	check_fail $? "Did not get an error for binding a non-existing policer"
3695fbff58eSIdo Schimmel	if [ $(devlink_trap_group_policer_get "l2_drops") -ne 1 ]; then
3705fbff58eSIdo Schimmel		check_err 1 "Bound policer was changed when should not"
3715fbff58eSIdo Schimmel	fi
3725fbff58eSIdo Schimmel
3735fbff58eSIdo Schimmel	devlink trap group set $DEVLINK_DEV group l2_drops policer 0
3745fbff58eSIdo Schimmel	check_err $? "Failed to unbind a policer when using ID 0"
3755fbff58eSIdo Schimmel	trap_group_check_policer "l2_drops"
3765fbff58eSIdo Schimmel	check_fail $? "Trap group has a policer after unbinding with ID 0"
3775fbff58eSIdo Schimmel
3785fbff58eSIdo Schimmel	devlink trap group set $DEVLINK_DEV group l2_drops policer 1
3795fbff58eSIdo Schimmel	check_err $? "Failed to bind a valid policer"
3805fbff58eSIdo Schimmel
3815fbff58eSIdo Schimmel	devlink trap group set $DEVLINK_DEV group l2_drops nopolicer
3825fbff58eSIdo Schimmel	check_err $? "Failed to unbind a policer when using 'nopolicer' keyword"
3835fbff58eSIdo Schimmel	trap_group_check_policer "l2_drops"
3845fbff58eSIdo Schimmel	check_fail $? "Trap group has a policer after unbinding with 'nopolicer' keyword"
3855fbff58eSIdo Schimmel
3865fbff58eSIdo Schimmel	devlink trap group set $DEVLINK_DEV group l2_drops policer 1
3875fbff58eSIdo Schimmel	check_err $? "Failed to bind a valid policer"
3885fbff58eSIdo Schimmel
3895fbff58eSIdo Schimmel	echo "y"> $DEBUGFS_DIR/fail_trap_group_set
3905fbff58eSIdo Schimmel	devlink trap group set $DEVLINK_DEV group l2_drops policer 2 \
3915fbff58eSIdo Schimmel		&> /dev/null
3925fbff58eSIdo Schimmel	check_fail $? "Managed to bind a policer when should not"
3935fbff58eSIdo Schimmel	echo "n"> $DEBUGFS_DIR/fail_trap_group_set
3945fbff58eSIdo Schimmel	devlink trap group set $DEVLINK_DEV group l2_drops policer 2
3955fbff58eSIdo Schimmel	check_err $? "Did not manage to bind a policer when should"
3965fbff58eSIdo Schimmel
3975fbff58eSIdo Schimmel	devlink trap group set $DEVLINK_DEV group l2_drops action drop \
3985fbff58eSIdo Schimmel		policer 1337 &> /dev/null
3995fbff58eSIdo Schimmel	check_fail $? "Did not get an error for partially modified trap group"
4005fbff58eSIdo Schimmel
4015fbff58eSIdo Schimmel	log_test "Trap policer binding"
4025fbff58eSIdo Schimmel}
4035fbff58eSIdo Schimmel
404b3cb7df9SIdo Schimmelport_del_test()
405b3cb7df9SIdo Schimmel{
406b3cb7df9SIdo Schimmel	local group_name
407b3cb7df9SIdo Schimmel	local i
408b3cb7df9SIdo Schimmel
409b3cb7df9SIdo Schimmel	# The test never fails. It is meant to exercise different code paths
410b3cb7df9SIdo Schimmel	# and make sure we properly dismantle a port while packets are
411b3cb7df9SIdo Schimmel	# in-flight.
412b3cb7df9SIdo Schimmel	RET=0
413b3cb7df9SIdo Schimmel
414b3cb7df9SIdo Schimmel	devlink_traps_enable_all
415b3cb7df9SIdo Schimmel
416b3cb7df9SIdo Schimmel	for i in $(seq 1 10); do
417b3cb7df9SIdo Schimmel		ip link set dev $NETDEV up
418b3cb7df9SIdo Schimmel
419b3cb7df9SIdo Schimmel		sleep $SLEEP_TIME
420b3cb7df9SIdo Schimmel
421b3cb7df9SIdo Schimmel		netdevsim_port_destroy
422b3cb7df9SIdo Schimmel		netdevsim_port_create
423b3cb7df9SIdo Schimmel		udevadm settle
424b3cb7df9SIdo Schimmel	done
425b3cb7df9SIdo Schimmel
426b3cb7df9SIdo Schimmel	devlink_traps_disable_all
427b3cb7df9SIdo Schimmel
428b3cb7df9SIdo Schimmel	log_test "Port delete"
429b3cb7df9SIdo Schimmel}
430b3cb7df9SIdo Schimmel
431b3cb7df9SIdo Schimmeldev_del_test()
432b3cb7df9SIdo Schimmel{
433b3cb7df9SIdo Schimmel	local group_name
434b3cb7df9SIdo Schimmel	local i
435b3cb7df9SIdo Schimmel
436b3cb7df9SIdo Schimmel	# The test never fails. It is meant to exercise different code paths
437b3cb7df9SIdo Schimmel	# and make sure we properly unregister traps while packets are
438b3cb7df9SIdo Schimmel	# in-flight.
439b3cb7df9SIdo Schimmel	RET=0
440b3cb7df9SIdo Schimmel
441b3cb7df9SIdo Schimmel	devlink_traps_enable_all
442b3cb7df9SIdo Schimmel
443b3cb7df9SIdo Schimmel	for i in $(seq 1 10); do
444b3cb7df9SIdo Schimmel		ip link set dev $NETDEV up
445b3cb7df9SIdo Schimmel
446b3cb7df9SIdo Schimmel		sleep $SLEEP_TIME
447b3cb7df9SIdo Schimmel
448b3cb7df9SIdo Schimmel		cleanup
449b3cb7df9SIdo Schimmel		setup_prepare
450b3cb7df9SIdo Schimmel	done
451b3cb7df9SIdo Schimmel
452b3cb7df9SIdo Schimmel	devlink_traps_disable_all
453b3cb7df9SIdo Schimmel
454b3cb7df9SIdo Schimmel	log_test "Device delete"
455b3cb7df9SIdo Schimmel}
456b3cb7df9SIdo Schimmel
457b3cb7df9SIdo Schimmelnetdevsim_dev_create()
458b3cb7df9SIdo Schimmel{
459b3cb7df9SIdo Schimmel	echo "$DEV_ADDR 0" > ${NETDEVSIM_PATH}/new_device
460b3cb7df9SIdo Schimmel}
461b3cb7df9SIdo Schimmel
462b3cb7df9SIdo Schimmelnetdevsim_dev_destroy()
463b3cb7df9SIdo Schimmel{
464b3cb7df9SIdo Schimmel	echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device
465b3cb7df9SIdo Schimmel}
466b3cb7df9SIdo Schimmel
467b3cb7df9SIdo Schimmelnetdevsim_port_create()
468b3cb7df9SIdo Schimmel{
469b3cb7df9SIdo Schimmel	echo 1 > ${NETDEVSIM_PATH}/devices/${DEV}/new_port
470b3cb7df9SIdo Schimmel}
471b3cb7df9SIdo Schimmel
472b3cb7df9SIdo Schimmelnetdevsim_port_destroy()
473b3cb7df9SIdo Schimmel{
474b3cb7df9SIdo Schimmel	echo 1 > ${NETDEVSIM_PATH}/devices/${DEV}/del_port
475b3cb7df9SIdo Schimmel}
476b3cb7df9SIdo Schimmel
477b3cb7df9SIdo Schimmelsetup_prepare()
478b3cb7df9SIdo Schimmel{
479b3cb7df9SIdo Schimmel	local netdev
480b3cb7df9SIdo Schimmel
481b3cb7df9SIdo Schimmel	netdevsim_dev_create
482b3cb7df9SIdo Schimmel
483b3cb7df9SIdo Schimmel	if [ ! -d "${NETDEVSIM_PATH}/devices/${DEV}" ]; then
484b3cb7df9SIdo Schimmel		echo "Failed to create netdevsim device"
485b3cb7df9SIdo Schimmel		exit 1
486b3cb7df9SIdo Schimmel	fi
487b3cb7df9SIdo Schimmel
488b3cb7df9SIdo Schimmel	netdevsim_port_create
489b3cb7df9SIdo Schimmel
490b3cb7df9SIdo Schimmel	if [ ! -d "${NETDEVSIM_PATH}/devices/${DEV}/net/" ]; then
491b3cb7df9SIdo Schimmel		echo "Failed to create netdevsim port"
492b3cb7df9SIdo Schimmel		exit 1
493b3cb7df9SIdo Schimmel	fi
494b3cb7df9SIdo Schimmel
495b3cb7df9SIdo Schimmel	# Wait for udev to rename newly created netdev.
496b3cb7df9SIdo Schimmel	udevadm settle
497b3cb7df9SIdo Schimmel
498b3cb7df9SIdo Schimmel	NETDEV=$(ls ${NETDEVSIM_PATH}/devices/${DEV}/net/)
499b3cb7df9SIdo Schimmel}
500b3cb7df9SIdo Schimmel
501b3cb7df9SIdo Schimmelcleanup()
502b3cb7df9SIdo Schimmel{
503b3cb7df9SIdo Schimmel	pre_cleanup
504b3cb7df9SIdo Schimmel	netdevsim_port_destroy
505b3cb7df9SIdo Schimmel	netdevsim_dev_destroy
506b3cb7df9SIdo Schimmel}
507b3cb7df9SIdo Schimmel
508b3cb7df9SIdo Schimmeltrap cleanup EXIT
509b3cb7df9SIdo Schimmel
510b3cb7df9SIdo Schimmelsetup_prepare
511b3cb7df9SIdo Schimmel
512b3cb7df9SIdo Schimmeltests_run
513b3cb7df9SIdo Schimmel
514b3cb7df9SIdo Schimmelexit $EXIT_STATUS
515