Commit 413e2c06 authored by Amit Cohen's avatar Amit Cohen Committed by Jakub Kicinski
Browse files

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: default avatarAmit Cohen <amcohen@nvidia.com>
Reviewed-by: default avatarPetr Machata <petrm@nvidia.com>
Reviewed-by: default avatarIdo Schimmel <idosch@nvidia.com>
Signed-off-by: default avatarPetr Machata <petrm@nvidia.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Link: https://patch.msgid.link/f3a32bd2d87a0b7ac4d2bb98a427dc6d95a01cd0.1742224300.git.petrm@nvidia.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent a13fc7eb
Loading
Loading
Loading
Loading
+11 −5
Original line number Diff line number Diff line
@@ -2944,7 +2944,7 @@ int mlxsw_sp_bridge_vxlan_join(struct mlxsw_sp *mlxsw_sp,
					      extack);
}

void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,
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);
@@ -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);