mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-02 10:59:18 -04:00
mlxsw: spectrum_switchdev: Add an internal API for VXLAN leave
There is asymmetry in how the VXLAN join and leave functions are used. The join function (mlxsw_sp_bridge_vxlan_join()) is only called in response to netdev events (e.g., VXLAN device joining a bridge), but the leave function is also called in response to switchdev events (e.g., VLAN configuration on top of the VXLAN device) in order to invalidate VNI to FID mappings. This asymmetry will cause problems when the functions will be later extended to mark VXLAN bridge ports as offloaded or not. Therefore, create an internal function (__mlxsw_sp_bridge_vxlan_leave()) that is used to invalidate VNI to FID mappings and call it from mlxsw_sp_bridge_vxlan_leave() which will only be invoked in response to netdev events, like mlxsw_sp_bridge_vxlan_join(). No functional changes intended. Signed-off-by: Amit Cohen <amcohen@nvidia.com> Reviewed-by: Petr Machata <petrm@nvidia.com> Reviewed-by: Ido Schimmel <idosch@nvidia.com> Signed-off-by: Petr Machata <petrm@nvidia.com> Reviewed-by: Simon Horman <horms@kernel.org> Link: https://patch.msgid.link/f3a32bd2d87a0b7ac4d2bb98a427dc6d95a01cd0.1742224300.git.petrm@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
a13fc7ebd9
commit
413e2c0699
@@ -2944,8 +2944,8 @@ int mlxsw_sp_bridge_vxlan_join(struct mlxsw_sp *mlxsw_sp,
|
||||
extack);
|
||||
}
|
||||
|
||||
void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,
|
||||
const struct net_device *vxlan_dev)
|
||||
static void __mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,
|
||||
const struct net_device *vxlan_dev)
|
||||
{
|
||||
struct vxlan_dev *vxlan = netdev_priv(vxlan_dev);
|
||||
struct mlxsw_sp_fid *fid;
|
||||
@@ -2963,6 +2963,12 @@ void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,
|
||||
mlxsw_sp_fid_put(fid);
|
||||
}
|
||||
|
||||
void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,
|
||||
const struct net_device *vxlan_dev)
|
||||
{
|
||||
__mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
|
||||
}
|
||||
|
||||
static void
|
||||
mlxsw_sp_switchdev_vxlan_addr_convert(const union vxlan_addr *vxlan_addr,
|
||||
enum mlxsw_sp_l3proto *proto,
|
||||
@@ -3867,7 +3873,7 @@ mlxsw_sp_switchdev_vxlan_vlan_add(struct mlxsw_sp *mlxsw_sp,
|
||||
mlxsw_sp_fid_put(fid);
|
||||
return -EINVAL;
|
||||
}
|
||||
mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
|
||||
__mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
|
||||
mlxsw_sp_fid_put(fid);
|
||||
return 0;
|
||||
}
|
||||
@@ -3883,7 +3889,7 @@ mlxsw_sp_switchdev_vxlan_vlan_add(struct mlxsw_sp *mlxsw_sp,
|
||||
/* Fourth case: Thew new VLAN is PVID, which means the VLAN currently
|
||||
* mapped to the VNI should be unmapped
|
||||
*/
|
||||
mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
|
||||
__mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
|
||||
mlxsw_sp_fid_put(fid);
|
||||
|
||||
/* Fifth case: The new VLAN is also egress untagged, which means the
|
||||
@@ -3923,7 +3929,7 @@ mlxsw_sp_switchdev_vxlan_vlan_del(struct mlxsw_sp *mlxsw_sp,
|
||||
if (mlxsw_sp_fid_8021q_vid(fid) != vid)
|
||||
goto out;
|
||||
|
||||
mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
|
||||
__mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
|
||||
|
||||
out:
|
||||
mlxsw_sp_fid_put(fid);
|
||||
|
||||
Reference in New Issue
Block a user