x86/speculation: Fix redundant MDS mitigation message
[linux-2.6-block.git] / tools / testing / selftests / drivers / net / mlxsw / devlink_trap_l2_drops.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 #
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
6 # conditions.
7
8 lib_dir=$(dirname $0)/../../../net/forwarding
9
10 ALL_TESTS="
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
17 "
18 NUM_NETIFS=4
19 source $lib_dir/tc_common.sh
20 source $lib_dir/lib.sh
21 source $lib_dir/devlink_lib.sh
22
23 h1_create()
24 {
25         simple_if_init $h1
26 }
27
28 h1_destroy()
29 {
30         simple_if_fini $h1
31 }
32
33 h2_create()
34 {
35         simple_if_init $h2
36 }
37
38 h2_destroy()
39 {
40         simple_if_fini $h2
41 }
42
43 switch_create()
44 {
45         ip link add dev br0 type bridge vlan_filtering 1 mcast_snooping 0
46
47         ip link set dev $swp1 master br0
48         ip link set dev $swp2 master br0
49
50         ip link set dev br0 up
51         ip link set dev $swp1 up
52         ip link set dev $swp2 up
53
54         tc qdisc add dev $swp2 clsact
55 }
56
57 switch_destroy()
58 {
59         tc qdisc del dev $swp2 clsact
60
61         ip link set dev $swp2 down
62         ip link set dev $swp1 down
63
64         ip link del dev br0
65 }
66
67 setup_prepare()
68 {
69         h1=${NETIFS[p1]}
70         swp1=${NETIFS[p2]}
71
72         swp2=${NETIFS[p3]}
73         h2=${NETIFS[p4]}
74
75         vrf_prepare
76
77         h1_create
78         h2_create
79
80         switch_create
81 }
82
83 cleanup()
84 {
85         pre_cleanup
86
87         switch_destroy
88
89         h2_destroy
90         h1_destroy
91
92         vrf_cleanup
93 }
94
95 l2_drops_test()
96 {
97         local trap_name=$1; shift
98         local group_name=$1; shift
99
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
103         # never forwarded.
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"
108
109         devlink_trap_action_set $trap_name "trap"
110
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"
115
116         devlink_trap_action_set $trap_name "drop"
117
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"
122
123         tc_check_packets "dev $swp2 egress" 101 0
124         check_err $? "Packets were not dropped"
125 }
126
127 l2_drops_cleanup()
128 {
129         local mz_pid=$1; shift
130
131         kill $mz_pid && wait $mz_pid &> /dev/null
132         tc filter del dev $swp2 egress protocol ip pref 1 handle 101 flower
133 }
134
135 source_mac_is_multicast_test()
136 {
137         local trap_name="source_mac_is_multicast"
138         local smac=01:02:03:04:05:06
139         local group_name="l2_drops"
140         local mz_pid
141
142         tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \
143                 flower src_mac $smac action drop
144
145         $MZ $h1 -c 0 -p 100 -a $smac -b bcast -t ip -d 1msec -q &
146         mz_pid=$!
147
148         RET=0
149
150         l2_drops_test $trap_name $group_name
151
152         log_test "Source MAC is multicast"
153
154         l2_drops_cleanup $mz_pid
155 }
156
157 __vlan_tag_mismatch_test()
158 {
159         local trap_name="vlan_tag_mismatch"
160         local dmac=de:ad:be:ef:13:37
161         local group_name="l2_drops"
162         local opt=$1; shift
163         local mz_pid
164
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
168
169         tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \
170                 flower dst_mac $dmac action drop
171
172         $MZ $h1 "$opt" -c 0 -p 100 -a own -b $dmac -t ip -d 1msec -q &
173         mz_pid=$!
174
175         l2_drops_test $trap_name $group_name
176
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"
180
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"
185
186         tc_check_packets "dev $swp2 egress" 101 0
187         check_fail $? "Packets not forwarded when should"
188
189         devlink_trap_action_set $trap_name "drop"
190
191         l2_drops_cleanup $mz_pid
192 }
193
194 vlan_tag_mismatch_untagged_test()
195 {
196         RET=0
197
198         __vlan_tag_mismatch_test
199
200         log_test "VLAN tag mismatch - untagged packets"
201 }
202
203 vlan_tag_mismatch_vid_0_test()
204 {
205         RET=0
206
207         __vlan_tag_mismatch_test "-Q 0"
208
209         log_test "VLAN tag mismatch - prio-tagged packets"
210 }
211
212 vlan_tag_mismatch_test()
213 {
214         vlan_tag_mismatch_untagged_test
215         vlan_tag_mismatch_vid_0_test
216 }
217
218 ingress_vlan_filter_test()
219 {
220         local trap_name="ingress_vlan_filter"
221         local dmac=de:ad:be:ef:13:37
222         local group_name="l2_drops"
223         local mz_pid
224         local vid=10
225
226         bridge vlan add vid $vid dev $swp2 master
227
228         RET=0
229
230         tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \
231                 flower dst_mac $dmac action drop
232
233         $MZ $h1 -Q $vid -c 0 -p 100 -a own -b $dmac -t ip -d 1msec -q &
234         mz_pid=$!
235
236         l2_drops_test $trap_name $group_name
237
238         # Add the VLAN on the bridge port and make sure packets are no longer
239         # dropped.
240         bridge vlan add vid $vid dev $swp1 master
241         devlink_trap_action_set $trap_name "trap"
242
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"
247
248         tc_check_packets "dev $swp2 egress" 101 0
249         check_fail $? "Packets not forwarded when should"
250
251         devlink_trap_action_set $trap_name "drop"
252
253         log_test "Ingress VLAN filter"
254
255         l2_drops_cleanup $mz_pid
256
257         bridge vlan del vid $vid dev $swp1 master
258         bridge vlan del vid $vid dev $swp2 master
259 }
260
261 __ingress_stp_filter_test()
262 {
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
267         local mz_pid
268         local vid=20
269
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
273
274         tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \
275                 flower dst_mac $dmac action drop
276
277         $MZ $h1 -Q $vid -c 0 -p 100 -a own -b $dmac -t ip -d 1msec -q &
278         mz_pid=$!
279
280         l2_drops_test $trap_name $group_name
281
282         # Change STP state to forwarding and make sure packets are no longer
283         # dropped.
284         ip link set dev $swp1 type bridge_slave state 3
285         devlink_trap_action_set $trap_name "trap"
286
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"
291
292         tc_check_packets "dev $swp2 egress" 101 0
293         check_fail $? "Packets not forwarded when should"
294
295         devlink_trap_action_set $trap_name "drop"
296
297         l2_drops_cleanup $mz_pid
298
299         bridge vlan del vid $vid dev $swp1 master
300         bridge vlan del vid $vid dev $swp2 master
301 }
302
303 ingress_stp_filter_listening_test()
304 {
305         local state=$1; shift
306
307         RET=0
308
309         __ingress_stp_filter_test $state
310
311         log_test "Ingress STP filter - listening state"
312 }
313
314 ingress_stp_filter_learning_test()
315 {
316         local state=$1; shift
317
318         RET=0
319
320         __ingress_stp_filter_test $state
321
322         log_test "Ingress STP filter - learning state"
323 }
324
325 ingress_stp_filter_test()
326 {
327         ingress_stp_filter_listening_test 1
328         ingress_stp_filter_learning_test 2
329 }
330
331 port_list_is_empty_uc_test()
332 {
333         local trap_name="port_list_is_empty"
334         local dmac=de:ad:be:ef:13:37
335         local group_name="l2_drops"
336         local mz_pid
337
338         # Disable unicast flooding on both ports, so that packets cannot egress
339         # any port.
340         ip link set dev $swp1 type bridge_slave flood off
341         ip link set dev $swp2 type bridge_slave flood off
342
343         RET=0
344
345         tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \
346                 flower dst_mac $dmac action drop
347
348         $MZ $h1 -c 0 -p 100 -a own -b $dmac -t ip -d 1msec -q &
349         mz_pid=$!
350
351         l2_drops_test $trap_name $group_name
352
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"
356
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"
361
362         tc_check_packets "dev $swp2 egress" 101 0
363         check_fail $? "Packets not forwarded when should"
364
365         devlink_trap_action_set $trap_name "drop"
366
367         log_test "Port list is empty - unicast"
368
369         l2_drops_cleanup $mz_pid
370
371         ip link set dev $swp1 type bridge_slave flood on
372 }
373
374 port_list_is_empty_mc_test()
375 {
376         local trap_name="port_list_is_empty"
377         local dmac=01:00:5e:00:00:01
378         local group_name="l2_drops"
379         local dip=239.0.0.1
380         local mz_pid
381
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
388
389         RET=0
390
391         tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \
392                 flower dst_mac $dmac action drop
393
394         $MZ $h1 -c 0 -p 100 -a own -b $dmac -t ip -B $dip -d 1msec -q &
395         mz_pid=$!
396
397         l2_drops_test $trap_name $group_name
398
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"
402
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"
407
408         tc_check_packets "dev $swp2 egress" 101 0
409         check_fail $? "Packets not forwarded when should"
410
411         devlink_trap_action_set $trap_name "drop"
412
413         log_test "Port list is empty - multicast"
414
415         l2_drops_cleanup $mz_pid
416
417         ip link set dev $swp1 type bridge_slave mcast_flood on
418 }
419
420 port_list_is_empty_test()
421 {
422         port_list_is_empty_uc_test
423         port_list_is_empty_mc_test
424 }
425
426 port_loopback_filter_uc_test()
427 {
428         local trap_name="port_loopback_filter"
429         local dmac=de:ad:be:ef:13:37
430         local group_name="l2_drops"
431         local mz_pid
432
433         # Make sure packets can only egress the input port.
434         ip link set dev $swp2 type bridge_slave flood off
435
436         RET=0
437
438         tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \
439                 flower dst_mac $dmac action drop
440
441         $MZ $h1 -c 0 -p 100 -a own -b $dmac -t ip -d 1msec -q &
442         mz_pid=$!
443
444         l2_drops_test $trap_name $group_name
445
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"
449
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"
454
455         tc_check_packets "dev $swp2 egress" 101 0
456         check_fail $? "Packets not forwarded when should"
457
458         devlink_trap_action_set $trap_name "drop"
459
460         log_test "Port loopback filter - unicast"
461
462         l2_drops_cleanup $mz_pid
463 }
464
465 port_loopback_filter_test()
466 {
467         port_loopback_filter_uc_test
468 }
469
470 trap cleanup EXIT
471
472 setup_prepare
473 setup_wait
474
475 tests_run
476
477 exit $EXIT_STATUS