selftests: bridge_mdb: Add MDB bulk deletion test

Add test cases to verify the behavior of the MDB bulk deletion
functionality in the bridge driver.

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Acked-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Hangbin Liu <liuhangbin@gmail.com>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Ido Schimmel 2023-12-17 10:32:43 +02:00 committed by David S. Miller
parent 2601e9c4b1
commit bd2dcb94c8

View file

@ -803,11 +803,198 @@ cfg_test_dump()
cfg_test_dump_common "L2" l2_grps_get
}
# Check flush functionality with different parameters.
cfg_test_flush()
{
local num_entries
# Add entries with different attributes and check that they are all
# flushed when the flush command is given with no parameters.
# Different port.
bridge mdb add dev br0 port $swp1 grp 239.1.1.1 vid 10
bridge mdb add dev br0 port $swp2 grp 239.1.1.2 vid 10
# Different VLAN ID.
bridge mdb add dev br0 port $swp1 grp 239.1.1.3 vid 10
bridge mdb add dev br0 port $swp1 grp 239.1.1.4 vid 20
# Different routing protocol.
bridge mdb add dev br0 port $swp1 grp 239.1.1.5 vid 10 proto bgp
bridge mdb add dev br0 port $swp1 grp 239.1.1.6 vid 10 proto zebra
# Different state.
bridge mdb add dev br0 port $swp1 grp 239.1.1.7 vid 10 permanent
bridge mdb add dev br0 port $swp1 grp 239.1.1.8 vid 10 temp
bridge mdb flush dev br0
num_entries=$(bridge mdb show dev br0 | wc -l)
[[ $num_entries -eq 0 ]]
check_err $? 0 "Not all entries flushed after flush all"
# Check that when flushing by port only entries programmed with the
# specified port are flushed and the rest are not.
bridge mdb add dev br0 port $swp1 grp 239.1.1.1 vid 10
bridge mdb add dev br0 port $swp2 grp 239.1.1.1 vid 10
bridge mdb add dev br0 port br0 grp 239.1.1.1 vid 10
bridge mdb flush dev br0 port $swp1
bridge mdb get dev br0 grp 239.1.1.1 vid 10 | grep -q "port $swp1"
check_fail $? "Entry not flushed by specified port"
bridge mdb get dev br0 grp 239.1.1.1 vid 10 | grep -q "port $swp2"
check_err $? "Entry flushed by wrong port"
bridge mdb get dev br0 grp 239.1.1.1 vid 10 | grep -q "port br0"
check_err $? "Host entry flushed by wrong port"
bridge mdb flush dev br0 port br0
bridge mdb get dev br0 grp 239.1.1.1 vid 10 | grep -q "port br0"
check_fail $? "Host entry not flushed by specified port"
bridge mdb flush dev br0
# Check that when flushing by VLAN ID only entries programmed with the
# specified VLAN ID are flushed and the rest are not.
bridge mdb add dev br0 port $swp1 grp 239.1.1.1 vid 10
bridge mdb add dev br0 port $swp2 grp 239.1.1.1 vid 10
bridge mdb add dev br0 port $swp1 grp 239.1.1.1 vid 20
bridge mdb add dev br0 port $swp2 grp 239.1.1.1 vid 20
bridge mdb flush dev br0 vid 10
bridge mdb get dev br0 grp 239.1.1.1 vid 10 &> /dev/null
check_fail $? "Entry not flushed by specified VLAN ID"
bridge mdb get dev br0 grp 239.1.1.1 vid 20 &> /dev/null
check_err $? "Entry flushed by wrong VLAN ID"
bridge mdb flush dev br0
# Check that all permanent entries are flushed when "permanent" is
# specified and that temporary entries are not.
bridge mdb add dev br0 port $swp1 grp 239.1.1.1 permanent vid 10
bridge mdb add dev br0 port $swp2 grp 239.1.1.1 temp vid 10
bridge mdb flush dev br0 permanent
bridge mdb get dev br0 grp 239.1.1.1 vid 10 | grep -q "port $swp1"
check_fail $? "Entry not flushed by \"permanent\" state"
bridge mdb get dev br0 grp 239.1.1.1 vid 10 | grep -q "port $swp2"
check_err $? "Entry flushed by wrong state (\"permanent\")"
bridge mdb flush dev br0
# Check that all temporary entries are flushed when "nopermanent" is
# specified and that permanent entries are not.
bridge mdb add dev br0 port $swp1 grp 239.1.1.1 permanent vid 10
bridge mdb add dev br0 port $swp2 grp 239.1.1.1 temp vid 10
bridge mdb flush dev br0 nopermanent
bridge mdb get dev br0 grp 239.1.1.1 vid 10 | grep -q "port $swp1"
check_err $? "Entry flushed by wrong state (\"nopermanent\")"
bridge mdb get dev br0 grp 239.1.1.1 vid 10 | grep -q "port $swp2"
check_fail $? "Entry not flushed by \"nopermanent\" state"
bridge mdb flush dev br0
# Check that L2 host entries are not flushed when "nopermanent" is
# specified, but flushed when "permanent" is specified.
bridge mdb add dev br0 port br0 grp 01:02:03:04:05:06 permanent vid 10
bridge mdb flush dev br0 nopermanent
bridge mdb get dev br0 grp 01:02:03:04:05:06 vid 10 &> /dev/null
check_err $? "L2 host entry flushed by wrong state (\"nopermanent\")"
bridge mdb flush dev br0 permanent
bridge mdb get dev br0 grp 01:02:03:04:05:06 vid 10 &> /dev/null
check_fail $? "L2 host entry not flushed by \"permanent\" state"
bridge mdb flush dev br0
# Check that IPv4 host entries are not flushed when "permanent" is
# specified, but flushed when "nopermanent" is specified.
bridge mdb add dev br0 port br0 grp 239.1.1.1 temp vid 10
bridge mdb flush dev br0 permanent
bridge mdb get dev br0 grp 239.1.1.1 vid 10 &> /dev/null
check_err $? "IPv4 host entry flushed by wrong state (\"permanent\")"
bridge mdb flush dev br0 nopermanent
bridge mdb get dev br0 grp 239.1.1.1 vid 10 &> /dev/null
check_fail $? "IPv4 host entry not flushed by \"nopermanent\" state"
bridge mdb flush dev br0
# Check that IPv6 host entries are not flushed when "permanent" is
# specified, but flushed when "nopermanent" is specified.
bridge mdb add dev br0 port br0 grp ff0e::1 temp vid 10
bridge mdb flush dev br0 permanent
bridge mdb get dev br0 grp ff0e::1 vid 10 &> /dev/null
check_err $? "IPv6 host entry flushed by wrong state (\"permanent\")"
bridge mdb flush dev br0 nopermanent
bridge mdb get dev br0 grp ff0e::1 vid 10 &> /dev/null
check_fail $? "IPv6 host entry not flushed by \"nopermanent\" state"
bridge mdb flush dev br0
# Check that when flushing by routing protocol only entries programmed
# with the specified routing protocol are flushed and the rest are not.
bridge mdb add dev br0 port $swp1 grp 239.1.1.1 vid 10 proto bgp
bridge mdb add dev br0 port $swp2 grp 239.1.1.1 vid 10 proto zebra
bridge mdb add dev br0 port br0 grp 239.1.1.1 vid 10
bridge mdb flush dev br0 proto bgp
bridge mdb get dev br0 grp 239.1.1.1 vid 10 | grep -q "port $swp1"
check_fail $? "Entry not flushed by specified routing protocol"
bridge mdb get dev br0 grp 239.1.1.1 vid 10 | grep -q "port $swp2"
check_err $? "Entry flushed by wrong routing protocol"
bridge mdb get dev br0 grp 239.1.1.1 vid 10 | grep -q "port br0"
check_err $? "Host entry flushed by wrong routing protocol"
bridge mdb flush dev br0
# Test that an error is returned when trying to flush using unsupported
# parameters.
bridge mdb flush dev br0 src_vni 10 &> /dev/null
check_fail $? "Managed to flush by source VNI"
bridge mdb flush dev br0 dst 198.51.100.1 &> /dev/null
check_fail $? "Managed to flush by destination IP"
bridge mdb flush dev br0 dst_port 4789 &> /dev/null
check_fail $? "Managed to flush by UDP destination port"
bridge mdb flush dev br0 vni 10 &> /dev/null
check_fail $? "Managed to flush by destination VNI"
log_test "Flush tests"
}
cfg_test()
{
cfg_test_host
cfg_test_port
cfg_test_dump
cfg_test_flush
}
__fwd_test_host_ip()
@ -1166,8 +1353,8 @@ ctrl_test()
ctrl_mldv2_is_in_test
}
if ! bridge mdb help 2>&1 | grep -q "get"; then
echo "SKIP: iproute2 too old, missing bridge mdb get support"
if ! bridge mdb help 2>&1 | grep -q "flush"; then
echo "SKIP: iproute2 too old, missing bridge mdb flush support"
exit $ksft_skip
fi