Commit bd2dcb94 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller
Browse files

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: default avatarIdo Schimmel <idosch@nvidia.com>
Acked-by: default avatarPetr Machata <petrm@nvidia.com>
Reviewed-by: default avatarHangbin Liu <liuhangbin@gmail.com>
Acked-by: default avatarNikolay Aleksandrov <razor@blackwall.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2601e9c4
Loading
Loading
Loading
Loading
+189 −2
Original line number Diff line number Diff line
@@ -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