mlxsw: spectrum: Split handling of pedit mangle by chip type
Certain ACL actions are only available on some Spectrum revisions. In particular, L4_PORT_ACTION is not available on Spectrum-1. Introduce a new ops struct intended to hold these differences, mlxsw_sp_rulei_ops. Prime it with a sole member, act_mangle_field, meant for handling of pedit mangles. Create two ops structures, one for Spectrum-1, the other for Spectrum-2 and above. Add callbacks for act_mangle_field and dispatch to the common handler. Invoke mlxsw_sp_rulei_ops.act_mangle_field from the field mangler instead of calling the common handler directly. Signed-off-by: Petr Machata <petrm@mellanox.com> Reviewed-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
73f782d523
commit
3cc9a15a0b
@ -4594,6 +4594,7 @@ static int mlxsw_sp1_init(struct mlxsw_core *mlxsw_core,
|
||||
mlxsw_sp->afa_ops = &mlxsw_sp1_act_afa_ops;
|
||||
mlxsw_sp->afk_ops = &mlxsw_sp1_afk_ops;
|
||||
mlxsw_sp->mr_tcam_ops = &mlxsw_sp1_mr_tcam_ops;
|
||||
mlxsw_sp->acl_rulei_ops = &mlxsw_sp1_acl_rulei_ops;
|
||||
mlxsw_sp->acl_tcam_ops = &mlxsw_sp1_acl_tcam_ops;
|
||||
mlxsw_sp->nve_ops_arr = mlxsw_sp1_nve_ops_arr;
|
||||
mlxsw_sp->mac_mask = mlxsw_sp1_mac_mask;
|
||||
@ -4621,6 +4622,7 @@ static int mlxsw_sp2_init(struct mlxsw_core *mlxsw_core,
|
||||
mlxsw_sp->afa_ops = &mlxsw_sp2_act_afa_ops;
|
||||
mlxsw_sp->afk_ops = &mlxsw_sp2_afk_ops;
|
||||
mlxsw_sp->mr_tcam_ops = &mlxsw_sp2_mr_tcam_ops;
|
||||
mlxsw_sp->acl_rulei_ops = &mlxsw_sp2_acl_rulei_ops;
|
||||
mlxsw_sp->acl_tcam_ops = &mlxsw_sp2_acl_tcam_ops;
|
||||
mlxsw_sp->nve_ops_arr = mlxsw_sp2_nve_ops_arr;
|
||||
mlxsw_sp->mac_mask = mlxsw_sp2_mac_mask;
|
||||
@ -4644,6 +4646,7 @@ static int mlxsw_sp3_init(struct mlxsw_core *mlxsw_core,
|
||||
mlxsw_sp->afa_ops = &mlxsw_sp2_act_afa_ops;
|
||||
mlxsw_sp->afk_ops = &mlxsw_sp2_afk_ops;
|
||||
mlxsw_sp->mr_tcam_ops = &mlxsw_sp2_mr_tcam_ops;
|
||||
mlxsw_sp->acl_rulei_ops = &mlxsw_sp2_acl_rulei_ops;
|
||||
mlxsw_sp->acl_tcam_ops = &mlxsw_sp2_acl_tcam_ops;
|
||||
mlxsw_sp->nve_ops_arr = mlxsw_sp2_nve_ops_arr;
|
||||
mlxsw_sp->mac_mask = mlxsw_sp2_mac_mask;
|
||||
|
@ -120,6 +120,7 @@ struct mlxsw_sp_kvdl;
|
||||
struct mlxsw_sp_nve;
|
||||
struct mlxsw_sp_kvdl_ops;
|
||||
struct mlxsw_sp_mr_tcam_ops;
|
||||
struct mlxsw_sp_acl_rulei_ops;
|
||||
struct mlxsw_sp_acl_tcam_ops;
|
||||
struct mlxsw_sp_nve_ops;
|
||||
struct mlxsw_sp_sb_vals;
|
||||
@ -164,6 +165,7 @@ struct mlxsw_sp {
|
||||
const struct mlxsw_afa_ops *afa_ops;
|
||||
const struct mlxsw_afk_ops *afk_ops;
|
||||
const struct mlxsw_sp_mr_tcam_ops *mr_tcam_ops;
|
||||
const struct mlxsw_sp_acl_rulei_ops *acl_rulei_ops;
|
||||
const struct mlxsw_sp_acl_tcam_ops *acl_tcam_ops;
|
||||
const struct mlxsw_sp_nve_ops **nve_ops_arr;
|
||||
const struct mlxsw_sp_rif_ops **rif_ops_arr;
|
||||
@ -856,6 +858,17 @@ void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp);
|
||||
u32 mlxsw_sp_acl_region_rehash_intrvl_get(struct mlxsw_sp *mlxsw_sp);
|
||||
int mlxsw_sp_acl_region_rehash_intrvl_set(struct mlxsw_sp *mlxsw_sp, u32 val);
|
||||
|
||||
struct mlxsw_sp_acl_mangle_action;
|
||||
|
||||
struct mlxsw_sp_acl_rulei_ops {
|
||||
int (*act_mangle_field)(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_acl_rule_info *rulei,
|
||||
struct mlxsw_sp_acl_mangle_action *mact, u32 val,
|
||||
struct netlink_ext_ack *extack);
|
||||
};
|
||||
|
||||
extern struct mlxsw_sp_acl_rulei_ops mlxsw_sp1_acl_rulei_ops;
|
||||
extern struct mlxsw_sp_acl_rulei_ops mlxsw_sp2_acl_rulei_ops;
|
||||
|
||||
/* spectrum_acl_tcam.c */
|
||||
struct mlxsw_sp_acl_tcam;
|
||||
struct mlxsw_sp_acl_tcam_region;
|
||||
|
@ -563,11 +563,39 @@ mlxsw_sp_acl_rulei_act_mangle_field(struct mlxsw_sp *mlxsw_sp,
|
||||
case MLXSW_SP_ACL_MANGLE_FIELD_IP_ECN:
|
||||
return mlxsw_afa_block_append_qos_ecn(rulei->act_block,
|
||||
val, extack);
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
/* We shouldn't have gotten a match in the first place! */
|
||||
WARN_ONCE(1, "Unhandled mangle field");
|
||||
return -EINVAL;
|
||||
static int mlxsw_sp1_acl_rulei_act_mangle_field(struct mlxsw_sp *mlxsw_sp,
|
||||
struct mlxsw_sp_acl_rule_info *rulei,
|
||||
struct mlxsw_sp_acl_mangle_action *mact,
|
||||
u32 val, struct netlink_ext_ack *extack)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = mlxsw_sp_acl_rulei_act_mangle_field(mlxsw_sp, rulei, mact, val, extack);
|
||||
if (err != -EOPNOTSUPP)
|
||||
return err;
|
||||
|
||||
NL_SET_ERR_MSG_MOD(extack, "Unsupported mangle field");
|
||||
return err;
|
||||
}
|
||||
|
||||
static int mlxsw_sp2_acl_rulei_act_mangle_field(struct mlxsw_sp *mlxsw_sp,
|
||||
struct mlxsw_sp_acl_rule_info *rulei,
|
||||
struct mlxsw_sp_acl_mangle_action *mact,
|
||||
u32 val, struct netlink_ext_ack *extack)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = mlxsw_sp_acl_rulei_act_mangle_field(mlxsw_sp, rulei, mact, val, extack);
|
||||
if (err != -EOPNOTSUPP)
|
||||
return err;
|
||||
|
||||
NL_SET_ERR_MSG_MOD(extack, "Unsupported mangle field");
|
||||
return err;
|
||||
}
|
||||
|
||||
int mlxsw_sp_acl_rulei_act_mangle(struct mlxsw_sp *mlxsw_sp,
|
||||
@ -576,6 +604,7 @@ int mlxsw_sp_acl_rulei_act_mangle(struct mlxsw_sp *mlxsw_sp,
|
||||
u32 offset, u32 mask, u32 val,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
const struct mlxsw_sp_acl_rulei_ops *acl_rulei_ops = mlxsw_sp->acl_rulei_ops;
|
||||
struct mlxsw_sp_acl_mangle_action *mact;
|
||||
size_t i;
|
||||
|
||||
@ -585,13 +614,13 @@ int mlxsw_sp_acl_rulei_act_mangle(struct mlxsw_sp *mlxsw_sp,
|
||||
mact->offset == offset &&
|
||||
mact->mask == mask) {
|
||||
val >>= mact->shift;
|
||||
return mlxsw_sp_acl_rulei_act_mangle_field(mlxsw_sp,
|
||||
rulei, mact,
|
||||
val, extack);
|
||||
return acl_rulei_ops->act_mangle_field(mlxsw_sp,
|
||||
rulei, mact,
|
||||
val, extack);
|
||||
}
|
||||
}
|
||||
|
||||
NL_SET_ERR_MSG_MOD(extack, "Unsupported mangle field");
|
||||
NL_SET_ERR_MSG_MOD(extack, "Unknown mangle field");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -930,3 +959,11 @@ int mlxsw_sp_acl_region_rehash_intrvl_set(struct mlxsw_sp *mlxsw_sp, u32 val)
|
||||
return mlxsw_sp_acl_tcam_vregion_rehash_intrvl_set(mlxsw_sp,
|
||||
&acl->tcam, val);
|
||||
}
|
||||
|
||||
struct mlxsw_sp_acl_rulei_ops mlxsw_sp1_acl_rulei_ops = {
|
||||
.act_mangle_field = mlxsw_sp1_acl_rulei_act_mangle_field,
|
||||
};
|
||||
|
||||
struct mlxsw_sp_acl_rulei_ops mlxsw_sp2_acl_rulei_ops = {
|
||||
.act_mangle_field = mlxsw_sp2_acl_rulei_act_mangle_field,
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user