mlxsw: spectrum_nve: Add mlxsw_sp_nve_ops.fdb_replay
authorPetr Machata <petrm@mellanox.com>
Fri, 7 Dec 2018 19:55:12 +0000 (19:55 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 7 Dec 2018 20:59:08 +0000 (12:59 -0800)
A replay of FDB needs to be performed so that the FDB entries existing
at the NVE device are offloaded. How the replay is done depends on NVE
device type, and therefore add a per-NVE-type operation.

Implement the operation for the sole NVE device type currently supported
by mlxsw, VXLAN.

Signed-off-by: Petr Machata <petrm@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_nve.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_nve_vxlan.c

index 4cc3297e13d6d52da281cf60eb6cc3c6d13e24ac..e2f945543433b9a1a35f2193158ed38cadf16ce8 100644 (file)
@@ -41,6 +41,7 @@ struct mlxsw_sp_nve_ops {
        int (*init)(struct mlxsw_sp_nve *nve,
                    const struct mlxsw_sp_nve_config *config);
        void (*fini)(struct mlxsw_sp_nve *nve);
+       int (*fdb_replay)(const struct net_device *nve_dev, __be32 vni);
 };
 
 extern const struct mlxsw_sp_nve_ops mlxsw_sp1_nve_vxlan_ops;
index 4e9cc00a88fdaaf7c9f19c82bcf7edf6ea0882c1..1651c912ef77976f960079eb66c060d108d2def5 100644 (file)
@@ -211,12 +211,21 @@ static void mlxsw_sp1_nve_vxlan_fini(struct mlxsw_sp_nve *nve)
                                 config->udp_dport);
 }
 
+static int
+mlxsw_sp_nve_vxlan_fdb_replay(const struct net_device *nve_dev, __be32 vni)
+{
+       if (WARN_ON(!netif_is_vxlan(nve_dev)))
+               return -EINVAL;
+       return vxlan_fdb_replay(nve_dev, vni, &mlxsw_sp_switchdev_notifier);
+}
+
 const struct mlxsw_sp_nve_ops mlxsw_sp1_nve_vxlan_ops = {
        .type           = MLXSW_SP_NVE_TYPE_VXLAN,
        .can_offload    = mlxsw_sp1_nve_vxlan_can_offload,
        .nve_config     = mlxsw_sp_nve_vxlan_config,
        .init           = mlxsw_sp1_nve_vxlan_init,
        .fini           = mlxsw_sp1_nve_vxlan_fini,
+       .fdb_replay     = mlxsw_sp_nve_vxlan_fdb_replay,
 };
 
 static bool mlxsw_sp2_nve_vxlan_can_offload(const struct mlxsw_sp_nve *nve,
@@ -242,4 +251,5 @@ const struct mlxsw_sp_nve_ops mlxsw_sp2_nve_vxlan_ops = {
        .nve_config     = mlxsw_sp_nve_vxlan_config,
        .init           = mlxsw_sp2_nve_vxlan_init,
        .fini           = mlxsw_sp2_nve_vxlan_fini,
+       .fdb_replay     = mlxsw_sp_nve_vxlan_fdb_replay,
 };