mlxsw: Veto Q-in-VNI for Spectrum-1 ASIC
authorAmit Cohen <amcohen@nvidia.com>
Tue, 8 Dec 2020 09:22:50 +0000 (11:22 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 8 Dec 2020 23:45:56 +0000 (15:45 -0800)
Implementation of Q-in-VNI is different between ASIC types, this set adds
support only for Spectrum-2.

Return an error when trying to create VxLAN device and enslave it to
802.1ad bridge in Spectrum-1.

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

index adf499665f8717d2db2c919c65bd17f62f8690df..e5ec595593f45e6c12238d6468e43c899d220560 100644 (file)
@@ -798,7 +798,7 @@ int mlxsw_sp_nve_fid_enable(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_fid *fid,
 
        ops = nve->nve_ops_arr[params->type];
 
-       if (!ops->can_offload(nve, params->dev, extack))
+       if (!ops->can_offload(nve, params, extack))
                return -EINVAL;
 
        memset(&config, 0, sizeof(config));
index 68bd9422be2a02b79eafe708a81a658bd6bb5df3..2796d365997904310f449df70ddee3c5865da30b 100644 (file)
@@ -36,7 +36,7 @@ struct mlxsw_sp_nve {
 struct mlxsw_sp_nve_ops {
        enum mlxsw_sp_nve_type type;
        bool (*can_offload)(const struct mlxsw_sp_nve *nve,
-                           const struct net_device *dev,
+                           const struct mlxsw_sp_nve_params *params,
                            struct netlink_ext_ack *extack);
        void (*nve_config)(const struct mlxsw_sp_nve *nve,
                           const struct mlxsw_sp_nve_params *params,
index b586c8f34d49fb977ead67413fe09833f6b85be7..3e2bb22e9ca657c1158554c25757c939dce1ba57 100644 (file)
                                                 VXLAN_F_LEARN)
 
 static bool mlxsw_sp_nve_vxlan_can_offload(const struct mlxsw_sp_nve *nve,
-                                          const struct net_device *dev,
+                                          const struct mlxsw_sp_nve_params *params,
                                           struct netlink_ext_ack *extack)
 {
-       struct vxlan_dev *vxlan = netdev_priv(dev);
+       struct vxlan_dev *vxlan = netdev_priv(params->dev);
        struct vxlan_config *cfg = &vxlan->cfg;
 
        if (cfg->saddr.sa.sa_family != AF_INET) {
@@ -86,6 +86,18 @@ static bool mlxsw_sp_nve_vxlan_can_offload(const struct mlxsw_sp_nve *nve,
        return true;
 }
 
+static bool mlxsw_sp1_nve_vxlan_can_offload(const struct mlxsw_sp_nve *nve,
+                                           const struct mlxsw_sp_nve_params *params,
+                                           struct netlink_ext_ack *extack)
+{
+       if (params->ethertype == ETH_P_8021AD) {
+               NL_SET_ERR_MSG_MOD(extack, "VxLAN: 802.1ad bridge is not supported with VxLAN");
+               return false;
+       }
+
+       return mlxsw_sp_nve_vxlan_can_offload(nve, params, extack);
+}
+
 static void mlxsw_sp_nve_vxlan_config(const struct mlxsw_sp_nve *nve,
                                      const struct mlxsw_sp_nve_params *params,
                                      struct mlxsw_sp_nve_config *config)
@@ -287,7 +299,7 @@ mlxsw_sp_nve_vxlan_clear_offload(const struct net_device *nve_dev, __be32 vni)
 
 const struct mlxsw_sp_nve_ops mlxsw_sp1_nve_vxlan_ops = {
        .type           = MLXSW_SP_NVE_TYPE_VXLAN,
-       .can_offload    = mlxsw_sp_nve_vxlan_can_offload,
+       .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,