Skip to content

Commit 8a5969d

Browse files
pmachatadavem330
authored andcommitted
mlxsw: spectrum_nve: Un/offload FDB on nve_fid_disable/enable
Any existing NVE FDB entries need to be offloaded when NVE is enabled for a given FID. Recent patches have added fdb_replay op for this, so just invoke it from mlxsw_sp_nve_fid_enable(). When NVE is disabled on a FID, any existing FDB offloaded marks need to be cleared on NVE device as well as on its bridge master. An op to handle this, fdb_clear_offload, has been added to FID ops and NVE ops in previous patches. Add code to resolve the NVE device, NVE type, and dispatch to both fdb_clear_offload ops. Signed-off-by: Petr Machata <[email protected]> Signed-off-by: Ido Schimmel <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 83de788 commit 8a5969d

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,21 @@ static void mlxsw_sp_nve_fdb_flush_by_fid(struct mlxsw_sp *mlxsw_sp,
789789
mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfdf), sfdf_pl);
790790
}
791791

792+
static void mlxsw_sp_nve_fdb_clear_offload(struct mlxsw_sp *mlxsw_sp,
793+
const struct mlxsw_sp_fid *fid,
794+
const struct net_device *nve_dev,
795+
__be32 vni)
796+
{
797+
const struct mlxsw_sp_nve_ops *ops;
798+
enum mlxsw_sp_nve_type type;
799+
800+
if (WARN_ON(mlxsw_sp_fid_nve_type(fid, &type)))
801+
return;
802+
803+
ops = mlxsw_sp->nve->nve_ops_arr[type];
804+
ops->fdb_clear_offload(nve_dev, vni);
805+
}
806+
792807
int mlxsw_sp_nve_fid_enable(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_fid *fid,
793808
struct mlxsw_sp_nve_params *params,
794809
struct netlink_ext_ack *extack)
@@ -826,8 +841,16 @@ int mlxsw_sp_nve_fid_enable(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_fid *fid,
826841

827842
nve->config = config;
828843

844+
err = ops->fdb_replay(params->dev, params->vni);
845+
if (err) {
846+
NL_SET_ERR_MSG_MOD(extack, "Failed to offload the FDB");
847+
goto err_fdb_replay;
848+
}
849+
829850
return 0;
830851

852+
err_fdb_replay:
853+
mlxsw_sp_fid_vni_clear(fid);
831854
err_fid_vni_set:
832855
mlxsw_sp_nve_tunnel_fini(mlxsw_sp);
833856
return err;
@@ -837,9 +860,27 @@ void mlxsw_sp_nve_fid_disable(struct mlxsw_sp *mlxsw_sp,
837860
struct mlxsw_sp_fid *fid)
838861
{
839862
u16 fid_index = mlxsw_sp_fid_index(fid);
863+
struct net_device *nve_dev;
864+
int nve_ifindex;
865+
__be32 vni;
840866

841867
mlxsw_sp_nve_flood_ip_flush(mlxsw_sp, fid);
842868
mlxsw_sp_nve_fdb_flush_by_fid(mlxsw_sp, fid_index);
869+
870+
if (WARN_ON(mlxsw_sp_fid_nve_ifindex(fid, &nve_ifindex) ||
871+
mlxsw_sp_fid_vni(fid, &vni)))
872+
goto out;
873+
874+
nve_dev = dev_get_by_index(&init_net, nve_ifindex);
875+
if (!nve_dev)
876+
goto out;
877+
878+
mlxsw_sp_nve_fdb_clear_offload(mlxsw_sp, fid, nve_dev, vni);
879+
mlxsw_sp_fid_fdb_clear_offload(fid, nve_dev);
880+
881+
dev_put(nve_dev);
882+
883+
out:
843884
mlxsw_sp_fid_vni_clear(fid);
844885
mlxsw_sp_nve_tunnel_fini(mlxsw_sp);
845886
}

0 commit comments

Comments
 (0)