mlxsw: Veto Q-in-VNI for Spectrum-1 ASIC
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>
This commit is contained in:
committed by
David S. Miller
parent
7e9c72a5da
commit
efbcb67339
@@ -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];
|
ops = nve->nve_ops_arr[params->type];
|
||||||
|
|
||||||
if (!ops->can_offload(nve, params->dev, extack))
|
if (!ops->can_offload(nve, params, extack))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
memset(&config, 0, sizeof(config));
|
memset(&config, 0, sizeof(config));
|
||||||
|
@@ -36,7 +36,7 @@ struct mlxsw_sp_nve {
|
|||||||
struct mlxsw_sp_nve_ops {
|
struct mlxsw_sp_nve_ops {
|
||||||
enum mlxsw_sp_nve_type type;
|
enum mlxsw_sp_nve_type type;
|
||||||
bool (*can_offload)(const struct mlxsw_sp_nve *nve,
|
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);
|
struct netlink_ext_ack *extack);
|
||||||
void (*nve_config)(const struct mlxsw_sp_nve *nve,
|
void (*nve_config)(const struct mlxsw_sp_nve *nve,
|
||||||
const struct mlxsw_sp_nve_params *params,
|
const struct mlxsw_sp_nve_params *params,
|
||||||
|
@@ -22,10 +22,10 @@
|
|||||||
VXLAN_F_LEARN)
|
VXLAN_F_LEARN)
|
||||||
|
|
||||||
static bool mlxsw_sp_nve_vxlan_can_offload(const struct mlxsw_sp_nve *nve,
|
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 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;
|
struct vxlan_config *cfg = &vxlan->cfg;
|
||||||
|
|
||||||
if (cfg->saddr.sa.sa_family != AF_INET) {
|
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;
|
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,
|
static void mlxsw_sp_nve_vxlan_config(const struct mlxsw_sp_nve *nve,
|
||||||
const struct mlxsw_sp_nve_params *params,
|
const struct mlxsw_sp_nve_params *params,
|
||||||
struct mlxsw_sp_nve_config *config)
|
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 = {
|
const struct mlxsw_sp_nve_ops mlxsw_sp1_nve_vxlan_ops = {
|
||||||
.type = MLXSW_SP_NVE_TYPE_VXLAN,
|
.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,
|
.nve_config = mlxsw_sp_nve_vxlan_config,
|
||||||
.init = mlxsw_sp1_nve_vxlan_init,
|
.init = mlxsw_sp1_nve_vxlan_init,
|
||||||
.fini = mlxsw_sp1_nve_vxlan_fini,
|
.fini = mlxsw_sp1_nve_vxlan_fini,
|
||||||
|
Reference in New Issue
Block a user