net/mlx5e: Refactor tc vlan push/pop actions offloading
Extract actions offloading code to a new function, and also extend data structures for double vlan actions. Signed-off-by: Jianbo Liu <jianbol@mellanox.com> Reviewed-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
699e96ddf4
commit
1482bd3d50
|
@ -2578,6 +2578,32 @@ out_err:
|
|||
return err;
|
||||
}
|
||||
|
||||
static int parse_tc_vlan_action(struct mlx5e_priv *priv,
|
||||
const struct tc_action *a,
|
||||
struct mlx5_esw_flow_attr *attr,
|
||||
u32 *action)
|
||||
{
|
||||
if (tcf_vlan_action(a) == TCA_VLAN_ACT_POP) {
|
||||
*action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_POP;
|
||||
} else if (tcf_vlan_action(a) == TCA_VLAN_ACT_PUSH) {
|
||||
*action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH;
|
||||
attr->vlan_vid[0] = tcf_vlan_push_vid(a);
|
||||
if (mlx5_eswitch_vlan_actions_supported(priv->mdev)) {
|
||||
attr->vlan_prio[0] = tcf_vlan_push_prio(a);
|
||||
attr->vlan_proto[0] = tcf_vlan_push_proto(a);
|
||||
if (!attr->vlan_proto[0])
|
||||
attr->vlan_proto[0] = htons(ETH_P_8021Q);
|
||||
} else if (tcf_vlan_push_proto(a) != htons(ETH_P_8021Q) ||
|
||||
tcf_vlan_push_prio(a)) {
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
} else { /* action is TCA_VLAN_ACT_MODIFY */
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
|
||||
struct mlx5e_tc_flow_parse_attr *parse_attr,
|
||||
struct mlx5e_tc_flow *flow)
|
||||
|
@ -2589,6 +2615,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
|
|||
LIST_HEAD(actions);
|
||||
bool encap = false;
|
||||
u32 action = 0;
|
||||
int err;
|
||||
|
||||
if (!tcf_exts_has_actions(exts))
|
||||
return -EINVAL;
|
||||
|
@ -2605,8 +2632,6 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
|
|||
}
|
||||
|
||||
if (is_tcf_pedit(a)) {
|
||||
int err;
|
||||
|
||||
err = parse_tc_pedit_action(priv, a, MLX5_FLOW_NAMESPACE_FDB,
|
||||
parse_attr);
|
||||
if (err)
|
||||
|
@ -2673,23 +2698,11 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
|
|||
}
|
||||
|
||||
if (is_tcf_vlan(a)) {
|
||||
if (tcf_vlan_action(a) == TCA_VLAN_ACT_POP) {
|
||||
action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_POP;
|
||||
} else if (tcf_vlan_action(a) == TCA_VLAN_ACT_PUSH) {
|
||||
action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH;
|
||||
attr->vlan_vid = tcf_vlan_push_vid(a);
|
||||
if (mlx5_eswitch_vlan_actions_supported(priv->mdev)) {
|
||||
attr->vlan_prio = tcf_vlan_push_prio(a);
|
||||
attr->vlan_proto = tcf_vlan_push_proto(a);
|
||||
if (!attr->vlan_proto)
|
||||
attr->vlan_proto = htons(ETH_P_8021Q);
|
||||
} else if (tcf_vlan_push_proto(a) != htons(ETH_P_8021Q) ||
|
||||
tcf_vlan_push_prio(a)) {
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
} else { /* action is TCA_VLAN_ACT_MODIFY */
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
err = parse_tc_vlan_action(priv, a, attr, &action);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
attr->mirror_count = attr->out_count;
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -256,9 +256,9 @@ struct mlx5_esw_flow_attr {
|
|||
int out_count;
|
||||
|
||||
int action;
|
||||
__be16 vlan_proto;
|
||||
u16 vlan_vid;
|
||||
u8 vlan_prio;
|
||||
__be16 vlan_proto[1];
|
||||
u16 vlan_vid[1];
|
||||
u8 vlan_prio[1];
|
||||
bool vlan_handled;
|
||||
u32 encap_id;
|
||||
u32 mod_hdr_id;
|
||||
|
|
|
@ -70,9 +70,9 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
|
|||
flow_act.action &= ~(MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH |
|
||||
MLX5_FLOW_CONTEXT_ACTION_VLAN_POP);
|
||||
else if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH) {
|
||||
flow_act.vlan[0].ethtype = ntohs(attr->vlan_proto);
|
||||
flow_act.vlan[0].vid = attr->vlan_vid;
|
||||
flow_act.vlan[0].prio = attr->vlan_prio;
|
||||
flow_act.vlan[0].ethtype = ntohs(attr->vlan_proto[0]);
|
||||
flow_act.vlan[0].vid = attr->vlan_vid[0];
|
||||
flow_act.vlan[0].prio = attr->vlan_prio[0];
|
||||
}
|
||||
|
||||
if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
|
||||
|
@ -266,7 +266,7 @@ static int esw_add_vlan_action_check(struct mlx5_esw_flow_attr *attr,
|
|||
/* protects against (1) setting rules with different vlans to push and
|
||||
* (2) setting rules w.o vlans (attr->vlan = 0) && w. vlans to push (!= 0)
|
||||
*/
|
||||
if (push && in_rep->vlan_refcount && (in_rep->vlan != attr->vlan_vid))
|
||||
if (push && in_rep->vlan_refcount && (in_rep->vlan != attr->vlan_vid[0]))
|
||||
goto out_notsupp;
|
||||
|
||||
return 0;
|
||||
|
@ -324,11 +324,11 @@ int mlx5_eswitch_add_vlan_action(struct mlx5_eswitch *esw,
|
|||
if (vport->vlan_refcount)
|
||||
goto skip_set_push;
|
||||
|
||||
err = __mlx5_eswitch_set_vport_vlan(esw, vport->vport, attr->vlan_vid, 0,
|
||||
err = __mlx5_eswitch_set_vport_vlan(esw, vport->vport, attr->vlan_vid[0], 0,
|
||||
SET_VLAN_INSERT | SET_VLAN_STRIP);
|
||||
if (err)
|
||||
goto out;
|
||||
vport->vlan = attr->vlan_vid;
|
||||
vport->vlan = attr->vlan_vid[0];
|
||||
skip_set_push:
|
||||
vport->vlan_refcount++;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue