2 # SPDX-License-Identifier: GPL-2.0
4 # Test devlink-trap L2 drops functionality over mlxsw. Each registered L2 drop
5 # packet trap is tested to make sure it is triggered under the right
8 lib_dir=$(dirname $0)/../../../net/forwarding
11 source_mac_is_multicast_test
12 vlan_tag_mismatch_test
13 ingress_vlan_filter_test
14 ingress_stp_filter_test
15 port_list_is_empty_test
16 port_loopback_filter_test
19 source $lib_dir/tc_common.sh
20 source $lib_dir/lib.sh
21 source $lib_dir/devlink_lib.sh
45 ip link add dev br0 type bridge vlan_filtering 1 mcast_snooping 0
47 ip link set dev $swp1 master br0
48 ip link set dev $swp2 master br0
50 ip link set dev br0 up
51 ip link set dev $swp1 up
52 ip link set dev $swp2 up
54 tc qdisc add dev $swp2 clsact
59 tc qdisc del dev $swp2 clsact
61 ip link set dev $swp2 down
62 ip link set dev $swp1 down
97 local trap_name=$1; shift
98 local group_name=$1; shift
100 # This is the common part of all the tests. It checks that stats are
101 # initially idle, then non-idle after changing the trap action and
102 # finally idle again. It also makes sure the packets are dropped and
104 devlink_trap_stats_idle_test $trap_name
105 check_err $? "Trap stats not idle with initial drop action"
106 devlink_trap_group_stats_idle_test $group_name
107 check_err $? "Trap group stats not idle with initial drop action"
109 devlink_trap_action_set $trap_name "trap"
111 devlink_trap_stats_idle_test $trap_name
112 check_fail $? "Trap stats idle after setting action to trap"
113 devlink_trap_group_stats_idle_test $group_name
114 check_fail $? "Trap group stats idle after setting action to trap"
116 devlink_trap_action_set $trap_name "drop"
118 devlink_trap_stats_idle_test $trap_name
119 check_err $? "Trap stats not idle after setting action to drop"
120 devlink_trap_group_stats_idle_test $group_name
121 check_err $? "Trap group stats not idle after setting action to drop"
123 tc_check_packets "dev $swp2 egress" 101 0
124 check_err $? "Packets were not dropped"
129 local mz_pid=$1; shift
131 kill $mz_pid && wait $mz_pid &> /dev/null
132 tc filter del dev $swp2 egress protocol ip pref 1 handle 101 flower
135 source_mac_is_multicast_test()
137 local trap_name="source_mac_is_multicast"
138 local smac=01:02:03:04:05:06
139 local group_name="l2_drops"
142 tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \
143 flower src_mac $smac action drop
145 $MZ $h1 -c 0 -p 100 -a $smac -b bcast -t ip -d 1msec -q &
150 l2_drops_test $trap_name $group_name
152 log_test "Source MAC is multicast"
154 l2_drops_cleanup $mz_pid
157 __vlan_tag_mismatch_test()
159 local trap_name="vlan_tag_mismatch"
160 local dmac=de:ad:be:ef:13:37
161 local group_name="l2_drops"
165 # Remove PVID flag. This should prevent untagged and prio-tagged
166 # packets from entering the bridge.
167 bridge vlan add vid 1 dev $swp1 untagged master
169 tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \
170 flower dst_mac $dmac action drop
172 $MZ $h1 "$opt" -c 0 -p 100 -a own -b $dmac -t ip -d 1msec -q &
175 l2_drops_test $trap_name $group_name
177 # Add PVID and make sure packets are no longer dropped.
178 bridge vlan add vid 1 dev $swp1 pvid untagged master
179 devlink_trap_action_set $trap_name "trap"
181 devlink_trap_stats_idle_test $trap_name
182 check_err $? "Trap stats not idle when packets should not be dropped"
183 devlink_trap_group_stats_idle_test $group_name
184 check_err $? "Trap group stats not idle with when packets should not be dropped"
186 tc_check_packets "dev $swp2 egress" 101 0
187 check_fail $? "Packets not forwarded when should"
189 devlink_trap_action_set $trap_name "drop"
191 l2_drops_cleanup $mz_pid
194 vlan_tag_mismatch_untagged_test()
198 __vlan_tag_mismatch_test
200 log_test "VLAN tag mismatch - untagged packets"
203 vlan_tag_mismatch_vid_0_test()
207 __vlan_tag_mismatch_test "-Q 0"
209 log_test "VLAN tag mismatch - prio-tagged packets"
212 vlan_tag_mismatch_test()
214 vlan_tag_mismatch_untagged_test
215 vlan_tag_mismatch_vid_0_test
218 ingress_vlan_filter_test()
220 local trap_name="ingress_vlan_filter"
221 local dmac=de:ad:be:ef:13:37
222 local group_name="l2_drops"
226 bridge vlan add vid $vid dev $swp2 master
230 tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \
231 flower dst_mac $dmac action drop
233 $MZ $h1 -Q $vid -c 0 -p 100 -a own -b $dmac -t ip -d 1msec -q &
236 l2_drops_test $trap_name $group_name
238 # Add the VLAN on the bridge port and make sure packets are no longer
240 bridge vlan add vid $vid dev $swp1 master
241 devlink_trap_action_set $trap_name "trap"
243 devlink_trap_stats_idle_test $trap_name
244 check_err $? "Trap stats not idle when packets should not be dropped"
245 devlink_trap_group_stats_idle_test $group_name
246 check_err $? "Trap group stats not idle with when packets should not be dropped"
248 tc_check_packets "dev $swp2 egress" 101 0
249 check_fail $? "Packets not forwarded when should"
251 devlink_trap_action_set $trap_name "drop"
253 log_test "Ingress VLAN filter"
255 l2_drops_cleanup $mz_pid
257 bridge vlan del vid $vid dev $swp1 master
258 bridge vlan del vid $vid dev $swp2 master
261 __ingress_stp_filter_test()
263 local trap_name="ingress_spanning_tree_filter"
264 local dmac=de:ad:be:ef:13:37
265 local group_name="l2_drops"
266 local state=$1; shift
270 bridge vlan add vid $vid dev $swp2 master
271 bridge vlan add vid $vid dev $swp1 master
272 ip link set dev $swp1 type bridge_slave state $state
274 tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \
275 flower dst_mac $dmac action drop
277 $MZ $h1 -Q $vid -c 0 -p 100 -a own -b $dmac -t ip -d 1msec -q &
280 l2_drops_test $trap_name $group_name
282 # Change STP state to forwarding and make sure packets are no longer
284 ip link set dev $swp1 type bridge_slave state 3
285 devlink_trap_action_set $trap_name "trap"
287 devlink_trap_stats_idle_test $trap_name
288 check_err $? "Trap stats not idle when packets should not be dropped"
289 devlink_trap_group_stats_idle_test $group_name
290 check_err $? "Trap group stats not idle with when packets should not be dropped"
292 tc_check_packets "dev $swp2 egress" 101 0
293 check_fail $? "Packets not forwarded when should"
295 devlink_trap_action_set $trap_name "drop"
297 l2_drops_cleanup $mz_pid
299 bridge vlan del vid $vid dev $swp1 master
300 bridge vlan del vid $vid dev $swp2 master
303 ingress_stp_filter_listening_test()
305 local state=$1; shift
309 __ingress_stp_filter_test $state
311 log_test "Ingress STP filter - listening state"
314 ingress_stp_filter_learning_test()
316 local state=$1; shift
320 __ingress_stp_filter_test $state
322 log_test "Ingress STP filter - learning state"
325 ingress_stp_filter_test()
327 ingress_stp_filter_listening_test 1
328 ingress_stp_filter_learning_test 2
331 port_list_is_empty_uc_test()
333 local trap_name="port_list_is_empty"
334 local dmac=de:ad:be:ef:13:37
335 local group_name="l2_drops"
338 # Disable unicast flooding on both ports, so that packets cannot egress
340 ip link set dev $swp1 type bridge_slave flood off
341 ip link set dev $swp2 type bridge_slave flood off
345 tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \
346 flower dst_mac $dmac action drop
348 $MZ $h1 -c 0 -p 100 -a own -b $dmac -t ip -d 1msec -q &
351 l2_drops_test $trap_name $group_name
353 # Allow packets to be flooded to one port.
354 ip link set dev $swp2 type bridge_slave flood on
355 devlink_trap_action_set $trap_name "trap"
357 devlink_trap_stats_idle_test $trap_name
358 check_err $? "Trap stats not idle when packets should not be dropped"
359 devlink_trap_group_stats_idle_test $group_name
360 check_err $? "Trap group stats not idle with when packets should not be dropped"
362 tc_check_packets "dev $swp2 egress" 101 0
363 check_fail $? "Packets not forwarded when should"
365 devlink_trap_action_set $trap_name "drop"
367 log_test "Port list is empty - unicast"
369 l2_drops_cleanup $mz_pid
371 ip link set dev $swp1 type bridge_slave flood on
374 port_list_is_empty_mc_test()
376 local trap_name="port_list_is_empty"
377 local dmac=01:00:5e:00:00:01
378 local group_name="l2_drops"
382 # Disable multicast flooding on both ports, so that packets cannot
383 # egress any port. We also need to flush IP addresses from the bridge
384 # in order to prevent packets from being flooded to the router port.
385 ip link set dev $swp1 type bridge_slave mcast_flood off
386 ip link set dev $swp2 type bridge_slave mcast_flood off
387 ip address flush dev br0
391 tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \
392 flower dst_mac $dmac action drop
394 $MZ $h1 -c 0 -p 100 -a own -b $dmac -t ip -B $dip -d 1msec -q &
397 l2_drops_test $trap_name $group_name
399 # Allow packets to be flooded to one port.
400 ip link set dev $swp2 type bridge_slave mcast_flood on
401 devlink_trap_action_set $trap_name "trap"
403 devlink_trap_stats_idle_test $trap_name
404 check_err $? "Trap stats not idle when packets should not be dropped"
405 devlink_trap_group_stats_idle_test $group_name
406 check_err $? "Trap group stats not idle with when packets should not be dropped"
408 tc_check_packets "dev $swp2 egress" 101 0
409 check_fail $? "Packets not forwarded when should"
411 devlink_trap_action_set $trap_name "drop"
413 log_test "Port list is empty - multicast"
415 l2_drops_cleanup $mz_pid
417 ip link set dev $swp1 type bridge_slave mcast_flood on
420 port_list_is_empty_test()
422 port_list_is_empty_uc_test
423 port_list_is_empty_mc_test
426 port_loopback_filter_uc_test()
428 local trap_name="port_loopback_filter"
429 local dmac=de:ad:be:ef:13:37
430 local group_name="l2_drops"
433 # Make sure packets can only egress the input port.
434 ip link set dev $swp2 type bridge_slave flood off
438 tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \
439 flower dst_mac $dmac action drop
441 $MZ $h1 -c 0 -p 100 -a own -b $dmac -t ip -d 1msec -q &
444 l2_drops_test $trap_name $group_name
446 # Allow packets to be flooded.
447 ip link set dev $swp2 type bridge_slave flood on
448 devlink_trap_action_set $trap_name "trap"
450 devlink_trap_stats_idle_test $trap_name
451 check_err $? "Trap stats not idle when packets should not be dropped"
452 devlink_trap_group_stats_idle_test $group_name
453 check_err $? "Trap group stats not idle with when packets should not be dropped"
455 tc_check_packets "dev $swp2 egress" 101 0
456 check_fail $? "Packets not forwarded when should"
458 devlink_trap_action_set $trap_name "drop"
460 log_test "Port loopback filter - unicast"
462 l2_drops_cleanup $mz_pid
465 port_loopback_filter_test()
467 port_loopback_filter_uc_test