net/mlx5e: Move mod hdr allocation to a single place
[ Upstream commit d9581e2fa73fadba187b2e62e05306e24e8a1ded ] Move mod hdr allocation chunk from parse_tc_fdb_actions() and parse_tc_nic_actions() to a shared function. Signed-off-by: Roi Dayan <roid@nvidia.com> Reviewed-by: Maor Dickman <maord@nvidia.com> Reviewed-by: Oz Shlomo <ozsh@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com> Stable-dep-of: 0c101a23ca7e ("net/mlx5e: Fix pedit endianness") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
c0f37a3715
commit
39f95b1d0d
@ -3502,10 +3502,50 @@ static int validate_goto_chain(struct mlx5e_priv *priv,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_tc_nic_actions(struct mlx5e_priv *priv,
|
||||
struct flow_action *flow_action,
|
||||
static int
|
||||
actions_prepare_mod_hdr_actions(struct mlx5e_priv *priv,
|
||||
struct mlx5e_tc_flow *flow,
|
||||
struct mlx5_flow_attr *attr,
|
||||
struct pedit_headers_action *hdrs,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct mlx5e_tc_flow_parse_attr *parse_attr = attr->parse_attr;
|
||||
enum mlx5_flow_namespace_type ns_type;
|
||||
int err;
|
||||
|
||||
if (!hdrs[TCA_PEDIT_KEY_EX_CMD_SET].pedits &&
|
||||
!hdrs[TCA_PEDIT_KEY_EX_CMD_ADD].pedits)
|
||||
return 0;
|
||||
|
||||
ns_type = get_flow_name_space(flow);
|
||||
|
||||
err = alloc_tc_pedit_action(priv, ns_type, parse_attr, hdrs,
|
||||
&attr->action, extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/* In case all pedit actions are skipped, remove the MOD_HDR flag. */
|
||||
if (parse_attr->mod_hdr_acts.num_actions > 0)
|
||||
return 0;
|
||||
|
||||
attr->action &= ~MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
|
||||
dealloc_mod_hdr_actions(&parse_attr->mod_hdr_acts);
|
||||
|
||||
if (ns_type != MLX5_FLOW_NAMESPACE_FDB)
|
||||
return 0;
|
||||
|
||||
if (!((attr->action & MLX5_FLOW_CONTEXT_ACTION_VLAN_POP) ||
|
||||
(attr->action & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH)))
|
||||
attr->esw_attr->split_count = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
parse_tc_nic_actions(struct mlx5e_priv *priv,
|
||||
struct flow_action *flow_action,
|
||||
struct mlx5e_tc_flow *flow,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct mlx5e_tc_flow_parse_attr *parse_attr;
|
||||
struct mlx5_flow_attr *attr = flow->attr;
|
||||
@ -3617,21 +3657,6 @@ static int parse_tc_nic_actions(struct mlx5e_priv *priv,
|
||||
}
|
||||
}
|
||||
|
||||
if (hdrs[TCA_PEDIT_KEY_EX_CMD_SET].pedits ||
|
||||
hdrs[TCA_PEDIT_KEY_EX_CMD_ADD].pedits) {
|
||||
err = alloc_tc_pedit_action(priv, MLX5_FLOW_NAMESPACE_KERNEL,
|
||||
parse_attr, hdrs, &action, extack);
|
||||
if (err)
|
||||
return err;
|
||||
/* in case all pedit actions are skipped, remove the MOD_HDR
|
||||
* flag.
|
||||
*/
|
||||
if (parse_attr->mod_hdr_acts.num_actions == 0) {
|
||||
action &= ~MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
|
||||
dealloc_mod_hdr_actions(&parse_attr->mod_hdr_acts);
|
||||
}
|
||||
}
|
||||
|
||||
attr->action = action;
|
||||
|
||||
if (attr->dest_chain && parse_attr->mirred_ifindex[0]) {
|
||||
@ -3639,6 +3664,10 @@ static int parse_tc_nic_actions(struct mlx5e_priv *priv,
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
err = actions_prepare_mod_hdr_actions(priv, flow, attr, hdrs, extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (!actions_match_supported(priv, flow_action, parse_attr, flow, extack))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
@ -4192,26 +4221,12 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
|
||||
return err;
|
||||
}
|
||||
|
||||
if (hdrs[TCA_PEDIT_KEY_EX_CMD_SET].pedits ||
|
||||
hdrs[TCA_PEDIT_KEY_EX_CMD_ADD].pedits) {
|
||||
err = alloc_tc_pedit_action(priv, MLX5_FLOW_NAMESPACE_FDB,
|
||||
parse_attr, hdrs, &action, extack);
|
||||
if (err)
|
||||
return err;
|
||||
/* in case all pedit actions are skipped, remove the MOD_HDR
|
||||
* flag. we might have set split_count either by pedit or
|
||||
* pop/push. if there is no pop/push either, reset it too.
|
||||
*/
|
||||
if (parse_attr->mod_hdr_acts.num_actions == 0) {
|
||||
action &= ~MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
|
||||
dealloc_mod_hdr_actions(&parse_attr->mod_hdr_acts);
|
||||
if (!((action & MLX5_FLOW_CONTEXT_ACTION_VLAN_POP) ||
|
||||
(action & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH)))
|
||||
esw_attr->split_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
attr->action = action;
|
||||
|
||||
err = actions_prepare_mod_hdr_actions(priv, flow, attr, hdrs, extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (!actions_match_supported(priv, flow_action, parse_attr, flow, extack))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user