2 # SPDX-License-Identifier: GPL-2.0
4 # This test is for checking devlink-trap functionality. It makes use of
5 # netdevsim which implements the required callbacks.
7 lib_dir=$(dirname $0)/../../../net/forwarding
16 trap_group_action_test
20 trap_policer_bind_test
24 NETDEVSIM_PATH=/sys/bus/netdevsim/
26 DEV=netdevsim${DEV_ADDR}
27 DEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV/
31 source $lib_dir/lib.sh
34 source $lib_dir/devlink_lib.sh
35 DEVLINK_DEV=netdevsim/${DEV}
37 require_command udevadm
39 modprobe netdevsim &> /dev/null
40 if [ ! -d "$NETDEVSIM_PATH" ]; then
41 echo "SKIP: No netdevsim support"
45 if [ -d "${NETDEVSIM_PATH}/devices/netdevsim${DEV_ADDR}" ]; then
46 echo "SKIP: Device netdevsim${DEV_ADDR} already exists"
54 test $(devlink_traps_num_get) -ne 0
55 check_err $? "No traps were registered"
57 log_test "Initialization"
68 for trap_name in $(devlink_traps_get); do
69 # The action of non-drop traps cannot be changed.
70 if [ $(devlink_trap_type_get $trap_name) = "drop" ]; then
71 devlink_trap_action_set $trap_name "trap"
72 action=$(devlink_trap_action_get $trap_name)
73 if [ $action != "trap" ]; then
74 check_err 1 "Trap $trap_name did not change action to trap"
77 devlink_trap_action_set $trap_name "drop"
78 action=$(devlink_trap_action_get $trap_name)
79 if [ $action != "drop" ]; then
80 check_err 1 "Trap $trap_name did not change action to drop"
83 orig_action=$(devlink_trap_action_get $trap_name)
85 devlink_trap_action_set $trap_name "trap"
86 action=$(devlink_trap_action_get $trap_name)
87 if [ $action != $orig_action ]; then
88 check_err 1 "Trap $trap_name changed action when should not"
91 devlink_trap_action_set $trap_name "drop"
92 action=$(devlink_trap_action_get $trap_name)
93 if [ $action != $orig_action ]; then
94 check_err 1 "Trap $trap_name changed action when should not"
99 log_test "Trap action"
108 for trap_name in $(devlink_traps_get); do
109 devlink_trap_metadata_test $trap_name "input_port"
110 check_err $? "Input port not reported as metadata of trap $trap_name"
111 if [ $trap_name == "ingress_flow_action_drop" ] ||
112 [ $trap_name == "egress_flow_action_drop" ]; then
113 devlink_trap_metadata_test $trap_name "flow_action_cookie"
114 check_err $? "Flow action cookie not reported as metadata of trap $trap_name"
118 log_test "Trap metadata"
125 devlink_trap_action_set "made_up_trap" "drop"
126 check_fail $? "Did not get an error for non-existing trap"
128 log_test "Non-existing trap"
131 bad_trap_action_test()
139 traps_arr=($(devlink_traps_get))
140 trap_name=${traps_arr[0]}
142 devlink_trap_action_set $trap_name "made_up_action"
143 check_fail $? "Did not get an error for non-existing trap action"
145 log_test "Non-existing trap action"
154 for trap_name in $(devlink_traps_get); do
155 devlink_trap_stats_idle_test $trap_name
156 check_err $? "Stats of trap $trap_name not idle when netdev down"
158 ip link set dev $NETDEV up
160 if [ $(devlink_trap_type_get $trap_name) = "drop" ]; then
161 devlink_trap_action_set $trap_name "trap"
162 devlink_trap_stats_idle_test $trap_name
163 check_fail $? "Stats of trap $trap_name idle when action is trap"
165 devlink_trap_action_set $trap_name "drop"
166 devlink_trap_stats_idle_test $trap_name
167 check_err $? "Stats of trap $trap_name not idle when action is drop"
169 echo "y"> $DEBUGFS_DIR/fail_trap_drop_counter_get
170 devlink -s trap show $DEVLINK_DEV trap $trap_name &> /dev/null
171 check_fail $? "Managed to read trap (hard dropped) statistics when should not"
172 echo "n"> $DEBUGFS_DIR/fail_trap_drop_counter_get
173 devlink -s trap show $DEVLINK_DEV trap $trap_name &> /dev/null
174 check_err $? "Did not manage to read trap (hard dropped) statistics when should"
176 devlink_trap_drop_stats_idle_test $trap_name
177 check_fail $? "Drop stats of trap $trap_name idle when should not"
179 devlink_trap_stats_idle_test $trap_name
180 check_fail $? "Stats of non-drop trap $trap_name idle when should not"
183 ip link set dev $NETDEV down
186 log_test "Trap statistics"
189 trap_group_action_test()
191 local curr_group group_name
198 for group_name in $(devlink_trap_groups_get); do
199 devlink_trap_group_action_set $group_name "trap"
201 for trap_name in $(devlink_traps_get); do
202 curr_group=$(devlink_trap_group_get $trap_name)
203 if [ $curr_group != $group_name ]; then
207 trap_type=$(devlink_trap_type_get $trap_name)
208 if [ $trap_type != "drop" ]; then
212 action=$(devlink_trap_action_get $trap_name)
213 if [ $action != "trap" ]; then
214 check_err 1 "Trap $trap_name did not change action to trap"
218 devlink_trap_group_action_set $group_name "drop"
220 for trap_name in $(devlink_traps_get); do
221 curr_group=$(devlink_trap_group_get $trap_name)
222 if [ $curr_group != $group_name ]; then
226 trap_type=$(devlink_trap_type_get $trap_name)
227 if [ $trap_type != "drop" ]; then
231 action=$(devlink_trap_action_get $trap_name)
232 if [ $action != "drop" ]; then
233 check_err 1 "Trap $trap_name did not change action to drop"
238 log_test "Trap group action"
241 bad_trap_group_test()
245 devlink_trap_group_action_set "made_up_trap_group" "drop"
246 check_fail $? "Did not get an error for non-existing trap group"
248 log_test "Non-existing trap group"
251 trap_group_stats_test()
257 for group_name in $(devlink_trap_groups_get); do
258 devlink_trap_group_stats_idle_test $group_name
259 check_err $? "Stats of trap group $group_name not idle when netdev down"
261 ip link set dev $NETDEV up
263 devlink_trap_group_action_set $group_name "trap"
264 devlink_trap_group_stats_idle_test $group_name
265 check_fail $? "Stats of trap group $group_name idle when action is trap"
267 devlink_trap_group_action_set $group_name "drop"
268 ip link set dev $NETDEV down
271 log_test "Trap group statistics"
281 if [ $(devlink_trap_policers_num_get) -eq 0 ]; then
282 check_err 1 "Failed to dump policers"
285 devlink trap policer set $DEVLINK_DEV policer 1337 &> /dev/null
286 check_fail $? "Did not get an error for setting a non-existing policer"
287 devlink trap policer show $DEVLINK_DEV policer 1337 &> /dev/null
288 check_fail $? "Did not get an error for getting a non-existing policer"
290 devlink trap policer set $DEVLINK_DEV policer 1 rate 2000 burst 16
291 check_err $? "Failed to set valid parameters for a valid policer"
292 if [ $(devlink_trap_policer_rate_get 1) -ne 2000 ]; then
293 check_err 1 "Policer rate was not changed"
295 if [ $(devlink_trap_policer_burst_get 1) -ne 16 ]; then
296 check_err 1 "Policer burst size was not changed"
299 devlink trap policer set $DEVLINK_DEV policer 1 rate 0 &> /dev/null
300 check_fail $? "Policer rate was changed to rate lower than limit"
301 devlink trap policer set $DEVLINK_DEV policer 1 rate 9000 &> /dev/null
302 check_fail $? "Policer rate was changed to rate higher than limit"
303 devlink trap policer set $DEVLINK_DEV policer 1 burst 2 &> /dev/null
304 check_fail $? "Policer burst size was changed to burst size lower than limit"
305 devlink trap policer set $DEVLINK_DEV policer 1 rate 65537 &> /dev/null
306 check_fail $? "Policer burst size was changed to burst size higher than limit"
307 echo "y" > $DEBUGFS_DIR/fail_trap_policer_set
308 devlink trap policer set $DEVLINK_DEV policer 1 rate 3000 &> /dev/null
309 check_fail $? "Managed to set policer rate when should not"
310 echo "n" > $DEBUGFS_DIR/fail_trap_policer_set
311 if [ $(devlink_trap_policer_rate_get 1) -ne 2000 ]; then
312 check_err 1 "Policer rate was changed to an invalid value"
314 if [ $(devlink_trap_policer_burst_get 1) -ne 16 ]; then
315 check_err 1 "Policer burst size was changed to an invalid value"
318 packets_t0=$(devlink_trap_policer_rx_dropped_get 1)
320 packets_t1=$(devlink_trap_policer_rx_dropped_get 1)
321 if [ ! $packets_t1 -gt $packets_t0 ]; then
322 check_err 1 "Policer drop counter was not incremented"
325 echo "y"> $DEBUGFS_DIR/fail_trap_policer_counter_get
326 devlink -s trap policer show $DEVLINK_DEV policer 1 &> /dev/null
327 check_fail $? "Managed to read policer drop counter when should not"
328 echo "n"> $DEBUGFS_DIR/fail_trap_policer_counter_get
329 devlink -s trap policer show $DEVLINK_DEV policer 1 &> /dev/null
330 check_err $? "Did not manage to read policer drop counter when should"
332 log_test "Trap policer"
335 trap_group_check_policer()
337 local group_name=$1; shift
339 devlink -j -p trap group show $DEVLINK_DEV group $group_name \
340 | jq -e '.[][][]["policer"]' &> /dev/null
343 trap_policer_bind_test()
347 devlink trap group set $DEVLINK_DEV group l2_drops policer 1
348 check_err $? "Failed to bind a valid policer"
349 if [ $(devlink_trap_group_policer_get "l2_drops") -ne 1 ]; then
350 check_err 1 "Bound policer was not changed"
353 devlink trap group set $DEVLINK_DEV group l2_drops policer 1337 \
355 check_fail $? "Did not get an error for binding a non-existing policer"
356 if [ $(devlink_trap_group_policer_get "l2_drops") -ne 1 ]; then
357 check_err 1 "Bound policer was changed when should not"
360 devlink trap group set $DEVLINK_DEV group l2_drops policer 0
361 check_err $? "Failed to unbind a policer when using ID 0"
362 trap_group_check_policer "l2_drops"
363 check_fail $? "Trap group has a policer after unbinding with ID 0"
365 devlink trap group set $DEVLINK_DEV group l2_drops policer 1
366 check_err $? "Failed to bind a valid policer"
368 devlink trap group set $DEVLINK_DEV group l2_drops nopolicer
369 check_err $? "Failed to unbind a policer when using 'nopolicer' keyword"
370 trap_group_check_policer "l2_drops"
371 check_fail $? "Trap group has a policer after unbinding with 'nopolicer' keyword"
373 devlink trap group set $DEVLINK_DEV group l2_drops policer 1
374 check_err $? "Failed to bind a valid policer"
376 echo "y"> $DEBUGFS_DIR/fail_trap_group_set
377 devlink trap group set $DEVLINK_DEV group l2_drops policer 2 \
379 check_fail $? "Managed to bind a policer when should not"
380 echo "n"> $DEBUGFS_DIR/fail_trap_group_set
381 devlink trap group set $DEVLINK_DEV group l2_drops policer 2
382 check_err $? "Did not manage to bind a policer when should"
384 devlink trap group set $DEVLINK_DEV group l2_drops action drop \
385 policer 1337 &> /dev/null
386 check_fail $? "Did not get an error for partially modified trap group"
388 log_test "Trap policer binding"
396 # The test never fails. It is meant to exercise different code paths
397 # and make sure we properly dismantle a port while packets are
401 devlink_traps_enable_all
403 for i in $(seq 1 10); do
404 ip link set dev $NETDEV up
408 netdevsim_port_destroy
409 netdevsim_port_create
413 devlink_traps_disable_all
415 log_test "Port delete"
423 # The test never fails. It is meant to exercise different code paths
424 # and make sure we properly unregister traps while packets are
428 devlink_traps_enable_all
430 for i in $(seq 1 10); do
431 ip link set dev $NETDEV up
439 devlink_traps_disable_all
441 log_test "Device delete"
444 netdevsim_dev_create()
446 echo "$DEV_ADDR 0" > ${NETDEVSIM_PATH}/new_device
449 netdevsim_dev_destroy()
451 echo "$DEV_ADDR" > ${NETDEVSIM_PATH}/del_device
454 netdevsim_port_create()
456 echo 1 > ${NETDEVSIM_PATH}/devices/${DEV}/new_port
459 netdevsim_port_destroy()
461 echo 1 > ${NETDEVSIM_PATH}/devices/${DEV}/del_port
470 if [ ! -d "${NETDEVSIM_PATH}/devices/${DEV}" ]; then
471 echo "Failed to create netdevsim device"
475 netdevsim_port_create
477 if [ ! -d "${NETDEVSIM_PATH}/devices/${DEV}/net/" ]; then
478 echo "Failed to create netdevsim port"
482 # Wait for udev to rename newly created netdev.
485 NETDEV=$(ls ${NETDEVSIM_PATH}/devices/${DEV}/net/)
491 netdevsim_port_destroy
492 netdevsim_dev_destroy