Commit c65686d7 authored by Roi Dayan's avatar Roi Dayan Committed by Saeed Mahameed
Browse files

net/mlx5e: Add tunnel encap/decap to tc action infra



Add parsing support by implementing struct mlx5e_tc_act
for this action.

Signed-off-by: default avatarRoi Dayan <roid@nvidia.com>
Reviewed-by: default avatarOz Shlomo <ozsh@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 67d62ee7
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -48,7 +48,8 @@ mlx5_core-$(CONFIG_MLX5_CLS_ACT) += en_tc.o en/rep/tc.o en/rep/neigh.o \
					en/tc/post_act.o en/tc/int_port.o

mlx5_core-$(CONFIG_MLX5_CLS_ACT)     += en/tc/act/act.o en/tc/act/drop.o en/tc/act/trap.o \
					en/tc/act/accept.o en/tc/act/mark.o en/tc/act/goto.o
					en/tc/act/accept.o en/tc/act/mark.o en/tc/act/goto.o \
					en/tc/act/tun.o

mlx5_core-$(CONFIG_MLX5_TC_CT)	     += en/tc_ct.o
mlx5_core-$(CONFIG_MLX5_TC_SAMPLE)   += en/tc/sample.o
+9 −0
Original line number Diff line number Diff line
@@ -11,6 +11,15 @@ static struct mlx5e_tc_act *tc_acts_fdb[NUM_FLOW_ACTIONS] = {
	&mlx5e_tc_act_drop,
	&mlx5e_tc_act_trap,
	&mlx5e_tc_act_goto,
	NULL, /* FLOW_ACTION_REDIRECT, */
	NULL, /* FLOW_ACTION_MIRRED, */
	NULL, /* FLOW_ACTION_REDIRECT_INGRESS, */
	NULL, /* FLOW_ACTION_MIRRED_INGRESS, */
	NULL, /* FLOW_ACTION_VLAN_PUSH, */
	NULL, /* FLOW_ACTION_VLAN_POP, */
	NULL, /* FLOW_ACTION_VLAN_MANGLE, */
	&mlx5e_tc_act_tun_encap,
	&mlx5e_tc_act_tun_decap,
};

/* Must be aligned with enum flow_action_id. */
+5 −0
Original line number Diff line number Diff line
@@ -14,6 +14,9 @@ struct mlx5e_tc_act_parse_state {
	unsigned int num_actions;
	struct mlx5e_tc_flow *flow;
	struct netlink_ext_ack *extack;
	bool encap;
	bool decap;
	const struct ip_tunnel_info *tun_info;
};

struct mlx5e_tc_act {
@@ -32,6 +35,8 @@ extern struct mlx5e_tc_act mlx5e_tc_act_trap;
extern struct mlx5e_tc_act mlx5e_tc_act_accept;
extern struct mlx5e_tc_act mlx5e_tc_act_mark;
extern struct mlx5e_tc_act mlx5e_tc_act_goto;
extern struct mlx5e_tc_act mlx5e_tc_act_tun_encap;
extern struct mlx5e_tc_act mlx5e_tc_act_tun_decap;

struct mlx5e_tc_act *
mlx5e_tc_act_get(enum flow_action_id act_id,
+61 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
// Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved.

#include "act.h"
#include "en/tc_tun_encap.h"
#include "en/tc_priv.h"

static bool
tc_act_can_offload_tun_encap(struct mlx5e_tc_act_parse_state *parse_state,
			     const struct flow_action_entry *act,
			     int act_index)
{
	if (!act->tunnel) {
		NL_SET_ERR_MSG_MOD(parse_state->extack,
				   "Zero tunnel attributes is not supported");
		return false;
	}

	return true;
}

static int
tc_act_parse_tun_encap(struct mlx5e_tc_act_parse_state *parse_state,
		       const struct flow_action_entry *act,
		       struct mlx5e_priv *priv,
		       struct mlx5_flow_attr *attr)
{
	parse_state->tun_info = act->tunnel;
	parse_state->encap = true;

	return 0;
}

static bool
tc_act_can_offload_tun_decap(struct mlx5e_tc_act_parse_state *parse_state,
			     const struct flow_action_entry *act,
			     int act_index)
{
	return true;
}

static int
tc_act_parse_tun_decap(struct mlx5e_tc_act_parse_state *parse_state,
		       const struct flow_action_entry *act,
		       struct mlx5e_priv *priv,
		       struct mlx5_flow_attr *attr)
{
	parse_state->decap = true;

	return 0;
}

struct mlx5e_tc_act mlx5e_tc_act_tun_encap = {
	.can_offload = tc_act_can_offload_tun_encap,
	.parse_action = tc_act_parse_tun_encap,
};

struct mlx5e_tc_act mlx5e_tc_act_tun_decap = {
	.can_offload = tc_act_can_offload_tun_decap,
	.parse_action = tc_act_parse_tun_decap,
};
+4 −20
Original line number Diff line number Diff line
@@ -3819,14 +3819,12 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
	struct mlx5e_tc_flow_parse_attr *parse_attr;
	struct mlx5e_rep_priv *rpriv = priv->ppriv;
	struct mlx5e_sample_attr sample_attr = {};
	const struct ip_tunnel_info *info = NULL;
	struct mlx5_flow_attr *attr = flow->attr;
	int ifindexes[MLX5_MAX_FLOW_FWD_VPORTS];
	bool ft_flow = mlx5e_is_ft_flow(flow);
	enum mlx5_flow_namespace_type ns_type;
	const struct flow_action_entry *act;
	struct mlx5_esw_flow_attr *esw_attr;
	bool encap = false, decap = false;
	struct mlx5e_tc_act *tc_act;
	int err, i, if_count = 0;
	bool ptype_host = false;
@@ -3985,14 +3983,14 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,

			attr->action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST |
					MLX5_FLOW_CONTEXT_ACTION_COUNT;
			if (encap) {
			if (parse_state->encap) {
				parse_attr->mirred_ifindex[esw_attr->out_count] =
					out_dev->ifindex;
				parse_attr->tun_info[esw_attr->out_count] =
					mlx5e_dup_tun_info(info);
					mlx5e_dup_tun_info(parse_state->tun_info);
				if (!parse_attr->tun_info[esw_attr->out_count])
					return -ENOMEM;
				encap = false;
				parse_state->encap = false;
				esw_attr->dests[esw_attr->out_count].flags |=
					MLX5_ESW_DEST_ENCAP;
				esw_attr->out_count++;
@@ -4080,17 +4078,6 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
				return -EOPNOTSUPP;
			}
			}
			break;
		case FLOW_ACTION_TUNNEL_ENCAP:
			info = act->tunnel;
			if (info) {
				encap = true;
			} else {
				NL_SET_ERR_MSG_MOD(extack,
						   "Zero tunnel attributes is not supported");
				return -EOPNOTSUPP;
			}

			break;
		case FLOW_ACTION_VLAN_PUSH:
		case FLOW_ACTION_VLAN_POP:
@@ -4121,9 +4108,6 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,

			esw_attr->split_count = esw_attr->out_count;
			break;
		case FLOW_ACTION_TUNNEL_DECAP:
			decap = true;
			break;
		case FLOW_ACTION_CT:
			if (flow_flag_test(flow, SAMPLE)) {
				NL_SET_ERR_MSG_MOD(extack, "Sample action with connection tracking is not supported");
@@ -4194,7 +4178,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
	if (!actions_match_supported(priv, flow_action, parse_attr, flow, extack))
		return -EOPNOTSUPP;

	if (attr->dest_chain && decap) {
	if (attr->dest_chain && parse_state->decap) {
		/* It can be supported if we'll create a mapping for
		 * the tunnel device only (without tunnel), and set
		 * this tunnel id with this decap flow.