]> www.infradead.org Git - users/hch/misc.git/commitdiff
net: bridge: BROPT_FDB_LOCAL_VLAN_0: On port changeaddr, skip per-VLAN FDBs
authorPetr Machata <petrm@nvidia.com>
Thu, 4 Sep 2025 17:07:20 +0000 (19:07 +0200)
committerJakub Kicinski <kuba@kernel.org>
Fri, 12 Sep 2025 02:02:50 +0000 (19:02 -0700)
When BROPT_FDB_LOCAL_VLAN_0 is enabled, the local FDB entries for member
ports should not be created per-VLAN, but instead only on VLAN 0. When the
member port address changes, the local FDB entries need to be updated,
which is done in br_fdb_changeaddr().

Under the VLAN-0 mode, only one local FDB entry will ever be added for a
port's address, and that on VLAN 0. Thus bail out of the delete loop early.
For the same reason, also skip adding the per-VLAN entries.

Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: Petr Machata <petrm@nvidia.com>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
Link: https://patch.msgid.link/0cf9d41836d2a245b0ce07e1a16ee05ca506cbe9.1757004393.git.petrm@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/bridge/br_fdb.c

index 902694c0ce643ec448978e4c4625692ccb1facd9..918c375546386a2c34a8aee4e3b7b75919ffca97 100644 (file)
@@ -459,6 +459,9 @@ void br_fdb_changeaddr(struct net_bridge_port *p, const unsigned char *newaddr)
        struct net_bridge_fdb_entry *f;
        struct net_bridge *br = p->br;
        struct net_bridge_vlan *v;
+       bool local_vlan_0;
+
+       local_vlan_0 = br_opt_get(br, BROPT_FDB_LOCAL_VLAN_0);
 
        spin_lock_bh(&br->hash_lock);
        vg = nbp_vlan_group(p);
@@ -468,11 +471,11 @@ void br_fdb_changeaddr(struct net_bridge_port *p, const unsigned char *newaddr)
                        /* delete old one */
                        fdb_delete_local(br, p, f);
 
-                       /* if this port has no vlan information
-                        * configured, we can safely be done at
-                        * this point.
+                       /* if this port has no vlan information configured, or
+                        * local entries are only kept on VLAN 0, we can safely
+                        * be done at this point.
                         */
-                       if (!vg || !vg->num_vlans)
+                       if (!vg || !vg->num_vlans || local_vlan_0)
                                goto insert;
                }
        }
@@ -481,7 +484,7 @@ insert:
        /* insert new address,  may fail if invalid address or dup. */
        fdb_add_local(br, p, newaddr, 0);
 
-       if (!vg || !vg->num_vlans)
+       if (!vg || !vg->num_vlans || local_vlan_0)
                goto done;
 
        /* Now add entries for every VLAN configured on the port.