mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 11:06:41 -05:00
net: bridge: BROPT_FDB_LOCAL_VLAN_0: On port changeaddr, skip per-VLAN FDBs
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>
This commit is contained in:
committed by
Jakub Kicinski
parent
60d6be0931
commit
4cf5fd8497
@@ -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 @@ void br_fdb_changeaddr(struct net_bridge_port *p, const unsigned char *newaddr)
|
||||
/* 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.
|
||||
|
||||
Reference in New Issue
Block a user