diff mbox series

[net-next,8/9] selftests: bridge_mdb: Add MDB bulk deletion test

Message ID 20231217083244.4076193-9-idosch@nvidia.com (mailing list archive)
State Accepted
Commit bd2dcb94c81e3408731d129e884954c36ef2f1fa
Delegated to: Netdev Maintainers
Headers show
Series Add MDB bulk deletion support | expand

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net-next, async
netdev/ynl success Generated files up to date; no warnings/errors; no diff in generated;
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 8 this patch: 8
netdev/cc_maintainers warning 2 maintainers not CCed: linux-kselftest@vger.kernel.org shuah@kernel.org
netdev/build_clang success Errors and warnings before: 8 this patch: 8
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success net selftest script(s) already in Makefile
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 8 this patch: 8
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 208 lines checked
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Ido Schimmel Dec. 17, 2023, 8:32 a.m. UTC
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>
---
 .../selftests/net/forwarding/bridge_mdb.sh    | 191 +++++++++++++++++-
 1 file changed, 189 insertions(+), 2 deletions(-)

Comments

Hangbin Liu Dec. 18, 2023, 8:22 a.m. UTC | #1
On Sun, Dec 17, 2023 at 10:32:43AM +0200, Ido Schimmel wrote:
> 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>

> ---
>  .../selftests/net/forwarding/bridge_mdb.sh    | 191 +++++++++++++++++-
>  1 file changed, 189 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/testing/selftests/net/forwarding/bridge_mdb.sh b/tools/testing/selftests/net/forwarding/bridge_mdb.sh
> index e4e3e9405056..61348f71728c 100755
> --- a/tools/testing/selftests/net/forwarding/bridge_mdb.sh
> +++ b/tools/testing/selftests/net/forwarding/bridge_mdb.sh
> @@ -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
>  
> -- 
> 2.40.1
>
Nikolay Aleksandrov Dec. 18, 2023, 10:25 a.m. UTC | #2
On 17/12/2023 10:32, Ido Schimmel wrote:
> 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>
> ---
>   .../selftests/net/forwarding/bridge_mdb.sh    | 191 +++++++++++++++++-
>   1 file changed, 189 insertions(+), 2 deletions(-)
> 

Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
diff mbox series

Patch

diff --git a/tools/testing/selftests/net/forwarding/bridge_mdb.sh b/tools/testing/selftests/net/forwarding/bridge_mdb.sh
index e4e3e9405056..61348f71728c 100755
--- a/tools/testing/selftests/net/forwarding/bridge_mdb.sh
+++ b/tools/testing/selftests/net/forwarding/bridge_mdb.sh
@@ -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