]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
selftests: bridge_mdb: Add a test for MDB flush on snooping disable
authorPetr Machata <petrm@nvidia.com>
Thu, 23 Oct 2025 14:45:38 +0000 (16:45 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 28 Oct 2025 00:57:21 +0000 (17:57 -0700)
Check that non-permanent MDB entries are removed as IGMP / MLD snooping is
disabled.

Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
Link: https://patch.msgid.link/9420dfbcf26c8e1134d31244e9e7d6a49d677a69.1761228273.git.petrm@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/testing/selftests/net/forwarding/bridge_mdb.sh

index 8c1597ebc2d38be0daab22e4b7d0025372c5f704..e86d7794658531dd1bde055a6c412f9b6c8f8fc5 100755 (executable)
@@ -28,6 +28,7 @@ ALL_TESTS="
        cfg_test
        fwd_test
        ctrl_test
+       disable_test
 "
 
 NUM_NETIFS=4
@@ -64,7 +65,10 @@ h2_destroy()
 
 switch_create()
 {
-       ip link add name br0 type bridge vlan_filtering 1 vlan_default_pvid 0 \
+       local vlan_filtering=$1; shift
+
+       ip link add name br0 type bridge \
+               vlan_filtering "$vlan_filtering" vlan_default_pvid 0 \
                mcast_snooping 1 mcast_igmp_version 3 mcast_mld_version 2
        bridge vlan add vid 10 dev br0 self
        bridge vlan add vid 20 dev br0 self
@@ -118,7 +122,7 @@ setup_prepare()
 
        h1_create
        h2_create
-       switch_create
+       switch_create 1
 }
 
 cleanup()
@@ -1357,6 +1361,98 @@ ctrl_test()
        ctrl_mldv2_is_in_test
 }
 
+check_group()
+{
+       local group=$1; shift
+       local vid=$1; shift
+       local should_fail=$1; shift
+       local when=$1; shift
+       local -a vidkws
+
+       if ((vid)); then
+               vidkws=(vid "$vid")
+       fi
+
+       bridge mdb get dev br0 grp "$group" "${vidkws[@]}" 2>/dev/null |
+               grep -q "port $swp1"
+       check_err_fail "$should_fail" $? "$group seen $when snooping disable:"
+}
+
+__disable_test()
+{
+       local vid=$1; shift
+       local what=$1; shift
+       local -a vidkws
+
+       if ((vid)); then
+               vidkws=(vid "$vid")
+       fi
+
+       RET=0
+
+       bridge mdb add dev br0 port "$swp1" grp ff0e::1 permanent \
+               "${vidkws[@]}" filter_mode include source_list 2001:db8:1::1
+       bridge mdb add dev br0 port "$swp1" grp ff0e::2 permanent \
+               "${vidkws[@]}" filter_mode exclude
+
+       bridge mdb add dev br0 port "$swp1" grp ff0e::3 \
+               "${vidkws[@]}" filter_mode include source_list 2001:db8:1::2
+       bridge mdb add dev br0 port "$swp1" grp ff0e::4 \
+               "${vidkws[@]}" filter_mode exclude
+
+       bridge mdb add dev br0 port "$swp1" grp 239.1.1.1 permanent \
+               "${vidkws[@]}" filter_mode include source_list 192.0.2.1
+       bridge mdb add dev br0 port "$swp1" grp 239.1.1.2 permanent \
+               "${vidkws[@]}" filter_mode exclude
+
+       bridge mdb add dev br0 port "$swp1" grp 239.1.1.3 \
+               "${vidkws[@]}" filter_mode include source_list 192.0.2.2
+       bridge mdb add dev br0 port "$swp1" grp 239.1.1.4 \
+               "${vidkws[@]}" filter_mode exclude
+
+       check_group ff0e::1 "$vid" 0 "before"
+       check_group ff0e::2 "$vid" 0 "before"
+       check_group ff0e::3 "$vid" 0 "before"
+       check_group ff0e::4 "$vid" 0 "before"
+
+       check_group 239.1.1.1 "$vid" 0 "before"
+       check_group 239.1.1.2 "$vid" 0 "before"
+       check_group 239.1.1.3 "$vid" 0 "before"
+       check_group 239.1.1.4 "$vid" 0 "before"
+
+       ip link set dev br0 type bridge mcast_snooping 0
+
+       check_group ff0e::1 "$vid" 0 "after"
+       check_group ff0e::2 "$vid" 0 "after"
+       check_group ff0e::3 "$vid" 1 "after"
+       check_group ff0e::4 "$vid" 1 "after"
+
+       check_group 239.1.1.1 "$vid" 0 "after"
+       check_group 239.1.1.2 "$vid" 0 "after"
+       check_group 239.1.1.3 "$vid" 1 "after"
+       check_group 239.1.1.4 "$vid" 1 "after"
+
+       log_test "$what: Flush after disable"
+
+       ip link set dev br0 type bridge mcast_snooping 1
+       sleep 10
+}
+
+disable_test()
+{
+       __disable_test 10 802.1q
+
+       switch_destroy
+       switch_create 0
+       setup_wait
+
+       __disable_test 0 802.1d
+
+       switch_destroy
+       switch_create 1
+       setup_wait
+}
+
 if ! bridge mdb help 2>&1 | grep -q "flush"; then
        echo "SKIP: iproute2 too old, missing bridge mdb flush support"
        exit $ksft_skip