Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1482bd3d authored by Jianbo Liu's avatar Jianbo Liu Committed by Saeed Mahameed
Browse files

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: default avatarJianbo Liu <jianbol@mellanox.com>
Reviewed-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
parent 699e96dd
Loading
Loading
Loading
Loading
+32 −19
Original line number Diff line number Diff line
@@ -2578,6 +2578,32 @@ static int mlx5e_attach_encap(struct mlx5e_priv *priv,
	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;
		}
+3 −3
Original line number Diff line number Diff line
@@ -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;
+6 −6
Original line number Diff line number Diff line
@@ -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++;
	}