2 # SPDX-License-Identifier: GPL-2.0
10 locked_port_mab_config
12 locked_port_mab_redirect
21 simple_if_init
$h1 192.0.2.1/24 2001:db8
:1::1/64
22 vlan_create
$h1 100 v
$h1 198.51.100.1/24
28 simple_if_fini
$h1 192.0.2.1/24 2001:db8
:1::1/64
33 simple_if_init
$h2 192.0.2.2/24 2001:db8
:1::2/64
34 vlan_create
$h2 100 v
$h2 198.51.100.2/24
40 simple_if_fini
$h2 192.0.2.2/24 2001:db8
:1::2/64
45 ip link add dev br0
type bridge vlan_filtering
1
47 ip link
set dev
$swp1 master br0
48 ip link
set dev
$swp2 master br0
50 bridge link
set dev
$swp1 learning off
52 ip link
set dev br0 up
53 ip link
set dev
$swp1 up
54 ip link
set dev
$swp2 up
59 ip link
set dev
$swp2 down
60 ip link
set dev
$swp1 down
97 check_locked_port_support ||
return 0
100 check_err $?
"Ping did not work before locking port"
102 bridge link
set dev
$swp1 locked on
104 ping_do
$h1 192.0.2.2
105 check_fail $?
"Ping worked after locking port, but before adding FDB entry"
107 bridge fdb add
`mac_get $h1` dev
$swp1 master static
109 ping_do
$h1 192.0.2.2
110 check_err $?
"Ping did not work after locking port and adding FDB entry"
112 bridge link
set dev
$swp1 locked off
113 bridge fdb del
`mac_get $h1` dev
$swp1 master static
115 ping_do
$h1 192.0.2.2
116 check_err $?
"Ping did not work after unlocking port and removing FDB entry."
118 log_test
"Locked port ipv4"
125 check_locked_port_support ||
return 0
127 bridge vlan add vid
100 dev
$swp1
128 bridge vlan add vid
100 dev
$swp2
130 ping_do
$h1.100
198.51.100.2
131 check_err $?
"Ping through vlan did not work before locking port"
133 bridge link
set dev
$swp1 locked on
134 ping_do
$h1.100
198.51.100.2
135 check_fail $?
"Ping through vlan worked after locking port, but before adding FDB entry"
137 bridge fdb add
`mac_get $h1` dev
$swp1 vlan
100 master static
139 ping_do
$h1.100
198.51.100.2
140 check_err $?
"Ping through vlan did not work after locking port and adding FDB entry"
142 bridge link
set dev
$swp1 locked off
143 bridge fdb del
`mac_get $h1` dev
$swp1 vlan
100 master static
145 ping_do
$h1.100
198.51.100.2
146 check_err $?
"Ping through vlan did not work after unlocking port and removing FDB entry"
148 bridge vlan del vid
100 dev
$swp1
149 bridge vlan del vid
100 dev
$swp2
150 log_test
"Locked port vlan"
156 check_locked_port_support ||
return 0
158 ping6_do
$h1 2001:db8
:1::2
159 check_err $?
"Ping6 did not work before locking port"
161 bridge link
set dev
$swp1 locked on
163 ping6_do
$h1 2001:db8
:1::2
164 check_fail $?
"Ping6 worked after locking port, but before adding FDB entry"
166 bridge fdb add
`mac_get $h1` dev
$swp1 master static
167 ping6_do
$h1 2001:db8
:1::2
168 check_err $?
"Ping6 did not work after locking port and adding FDB entry"
170 bridge link
set dev
$swp1 locked off
171 bridge fdb del
`mac_get $h1` dev
$swp1 master static
173 ping6_do
$h1 2001:db8
:1::2
174 check_err $?
"Ping6 did not work after unlocking port and removing FDB entry"
176 log_test
"Locked port ipv6"
182 check_port_mab_support ||
return 0
184 ping_do
$h1 192.0.2.2
185 check_err $?
"Ping did not work before locking port"
187 bridge link
set dev
$swp1 learning on locked on
189 ping_do
$h1 192.0.2.2
190 check_fail $?
"Ping worked on a locked port without an FDB entry"
192 bridge fdb get
`mac_get $h1` br br0 vlan
1 &> /dev
/null
193 check_fail $?
"FDB entry created before enabling MAB"
195 bridge link
set dev
$swp1 learning on locked on mab on
197 ping_do
$h1 192.0.2.2
198 check_fail $?
"Ping worked on MAB enabled port without an FDB entry"
200 bridge fdb get
`mac_get $h1` br br0 vlan
1 |
grep "dev $swp1" |
grep -q "locked"
201 check_err $?
"Locked FDB entry not created"
203 bridge fdb replace
`mac_get $h1` dev
$swp1 master static
205 ping_do
$h1 192.0.2.2
206 check_err $?
"Ping did not work after replacing FDB entry"
208 bridge fdb get
`mac_get $h1` br br0 vlan
1 |
grep "dev $swp1" |
grep -q "locked"
209 check_fail $?
"FDB entry marked as locked after replacement"
211 bridge fdb del
`mac_get $h1` dev
$swp1 master
212 bridge link
set dev
$swp1 learning off locked off mab off
214 log_test
"Locked port MAB"
217 # Check that entries cannot roam to a locked port, but that entries can roam
218 # to an unlocked port.
219 locked_port_mab_roam
()
221 local mac
=a0
:b0
:c0
:c0
:b0
:a0
224 check_port_mab_support ||
return 0
226 bridge link
set dev
$swp1 learning on locked on mab on
228 $MZ $h1 -q -c 5 -d 100msec
-t udp
-a $mac -b rand
229 bridge fdb get
$mac br br0 vlan
1 |
grep "dev $swp1" |
grep -q "locked"
230 check_err $?
"No locked entry on first injection"
232 $MZ $h2 -q -c 5 -d 100msec
-t udp
-a $mac -b rand
233 bridge fdb get
$mac br br0 vlan
1 |
grep -q "dev $swp2"
234 check_err $?
"Entry did not roam to an unlocked port"
236 bridge fdb get
$mac br br0 vlan
1 |
grep -q "locked"
237 check_fail $?
"Entry roamed with locked flag on"
239 $MZ $h1 -q -c 5 -d 100msec
-t udp
-a $mac -b rand
240 bridge fdb get
$mac br br0 vlan
1 |
grep -q "dev $swp1"
241 check_fail $?
"Entry roamed back to locked port"
243 bridge fdb del
$mac vlan
1 dev
$swp2 master
244 bridge link
set dev
$swp1 learning off locked off mab off
246 log_test
"Locked port MAB roam"
249 # Check that MAB can only be enabled on a port that is both locked and has
251 locked_port_mab_config
()
254 check_port_mab_support ||
return 0
256 bridge link
set dev
$swp1 learning on locked off mab on
&> /dev
/null
257 check_fail $?
"MAB enabled while port is unlocked"
259 bridge link
set dev
$swp1 learning off locked on mab on
&> /dev
/null
260 check_fail $?
"MAB enabled while port has learning disabled"
262 bridge link
set dev
$swp1 learning on locked on mab on
263 check_err $?
"Failed to enable MAB when port is locked and has learning enabled"
265 bridge link
set dev
$swp1 learning off locked off mab off
267 log_test
"Locked port MAB configuration"
270 # Check that locked FDB entries are flushed from a port when MAB is disabled.
271 locked_port_mab_flush
()
273 local locked_mac1
=00:01:02:03:04:05
274 local unlocked_mac1
=00:01:02:03:04:06
275 local locked_mac2
=00:01:02:03:04:07
276 local unlocked_mac2
=00:01:02:03:04:08
279 check_port_mab_support ||
return 0
281 bridge link
set dev
$swp1 learning on locked on mab on
282 bridge link
set dev
$swp2 learning on locked on mab on
284 # Create regular and locked FDB entries on each port.
285 bridge fdb add
$unlocked_mac1 dev
$swp1 vlan
1 master static
286 bridge fdb add
$unlocked_mac2 dev
$swp2 vlan
1 master static
288 $MZ $h1 -q -c 5 -d 100msec
-t udp
-a $locked_mac1 -b rand
289 bridge fdb get
$locked_mac1 br br0 vlan
1 |
grep "dev $swp1" | \
291 check_err $?
"Failed to create locked FDB entry on first port"
293 $MZ $h2 -q -c 5 -d 100msec
-t udp
-a $locked_mac2 -b rand
294 bridge fdb get
$locked_mac2 br br0 vlan
1 |
grep "dev $swp2" | \
296 check_err $?
"Failed to create locked FDB entry on second port"
298 # Disable MAB on the first port and check that only the first locked
299 # FDB entry was flushed.
300 bridge link
set dev
$swp1 mab off
302 bridge fdb get
$unlocked_mac1 br br0 vlan
1 &> /dev
/null
303 check_err $?
"Regular FDB entry on first port was flushed after disabling MAB"
305 bridge fdb get
$unlocked_mac2 br br0 vlan
1 &> /dev
/null
306 check_err $?
"Regular FDB entry on second port was flushed after disabling MAB"
308 bridge fdb get
$locked_mac1 br br0 vlan
1 &> /dev
/null
309 check_fail $?
"Locked FDB entry on first port was not flushed after disabling MAB"
311 bridge fdb get
$locked_mac2 br br0 vlan
1 &> /dev
/null
312 check_err $?
"Locked FDB entry on second port was flushed after disabling MAB"
314 bridge fdb del
$unlocked_mac2 dev
$swp2 vlan
1 master static
315 bridge fdb del
$unlocked_mac1 dev
$swp1 vlan
1 master static
317 bridge link
set dev
$swp2 learning on locked off mab off
318 bridge link
set dev
$swp1 learning off locked off mab off
320 log_test
"Locked port MAB FDB flush"
323 # Check that traffic can be redirected from a locked bridge port and that it
324 # does not create locked FDB entries.
325 locked_port_mab_redirect
()
328 check_port_mab_support ||
return 0
330 tc qdisc add dev
$swp1 clsact
331 tc filter add dev
$swp1 ingress protocol all pref
1 handle
101 flower \
332 action mirred egress redirect dev
$swp2
333 bridge link
set dev
$swp1 learning on locked on mab on
335 ping_do
$h1 192.0.2.2
336 check_err $?
"Ping did not work with redirection"
338 bridge fdb get
`mac_get $h1` br br0 vlan
1 2> /dev
/null | \
339 grep "dev $swp1" |
grep -q "locked"
340 check_fail $?
"Locked entry created for redirected traffic"
342 tc filter del dev
$swp1 ingress protocol all pref
1 handle
101 flower
344 ping_do
$h1 192.0.2.2
345 check_fail $?
"Ping worked without redirection"
347 bridge fdb get
`mac_get $h1` br br0 vlan
1 2> /dev
/null | \
348 grep "dev $swp1" |
grep -q "locked"
349 check_err $?
"Locked entry not created after deleting filter"
351 bridge fdb del
`mac_get $h1` vlan
1 dev
$swp1 master
352 bridge link
set dev
$swp1 learning off locked off mab off
353 tc qdisc del dev
$swp1 clsact
355 log_test
"Locked port MAB redirect"