Commit 6ba2e2b3 authored by Vlad Buslov's avatar Vlad Buslov Committed by Saeed Mahameed
Browse files

net/mlx5e: Support accept action



Support TC generic 'accept' action in mlx5 by introducing
MLX5_ESW_ATTR_FLAG_ACCEPT attribute flag. Flag has similar semantics to
existing MLX5_ESW_ATTR_FLAG_SLOW_PATH flag, however, dedicated flag is
required because existing 'slow path' flag can be flipped by tunneling
subsystem when neighbor changes state.

Introduce new helper function mlx5_esw_attr_flags_skip() to check whether
attribute flags for 'slow path' or 'accept' action are set and use it in
eswitch code instead of direct bit manipulation.

Signed-off-by: default avatarVlad Buslov <vladbu@nvidia.com>
Reviewed-by: default avatarPaul Blakey <paulb@nvidia.com>
Reviewed-by: default avatarRoi Dayan <roid@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 2f8ec867
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -3810,6 +3810,11 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,

	flow_action_for_each(i, act, flow_action) {
		switch (act->id) {
		case FLOW_ACTION_ACCEPT:
			action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST |
				MLX5_FLOW_CONTEXT_ACTION_COUNT;
			attr->flags |= MLX5_ESW_ATTR_FLAG_ACCEPT;
			break;
		case FLOW_ACTION_DROP:
			action |= MLX5_FLOW_CONTEXT_ACTION_DROP |
				  MLX5_FLOW_CONTEXT_ACTION_COUNT;
+8 −0
Original line number Diff line number Diff line
@@ -447,8 +447,16 @@ enum {
	MLX5_ESW_ATTR_FLAG_NO_IN_PORT    = BIT(2),
	MLX5_ESW_ATTR_FLAG_SRC_REWRITE   = BIT(3),
	MLX5_ESW_ATTR_FLAG_SAMPLE        = BIT(4),
	MLX5_ESW_ATTR_FLAG_ACCEPT        = BIT(5),
};

/* Returns true if any of the flags that require skipping further TC/NF processing are set. */
static inline bool
mlx5_esw_attr_flags_skip(u32 attr_flags)
{
	return attr_flags & (MLX5_ESW_ATTR_FLAG_SLOW_PATH | MLX5_ESW_ATTR_FLAG_ACCEPT);
}

struct mlx5_esw_flow_attr {
	struct mlx5_eswitch_rep *in_rep;
	struct mlx5_core_dev	*in_mdev;
+3 −3
Original line number Diff line number Diff line
@@ -440,7 +440,7 @@ esw_setup_dests(struct mlx5_flow_destination *dest,
	} else if (attr->dest_ft) {
		esw_setup_ft_dest(dest, flow_act, esw, attr, spec, *i);
		(*i)++;
	} else if (attr->flags & MLX5_ESW_ATTR_FLAG_SLOW_PATH) {
	} else if (mlx5_esw_attr_flags_skip(attr->flags)) {
		esw_setup_slow_path_dest(dest, flow_act, chains, *i);
		(*i)++;
	} else if (attr->dest_chain) {
@@ -467,7 +467,7 @@ esw_cleanup_dests(struct mlx5_eswitch *esw,

	if (attr->dest_ft) {
		esw_cleanup_decap_indir(esw, attr);
	} else if (!(attr->flags & MLX5_ESW_ATTR_FLAG_SLOW_PATH)) {
	} else if (!mlx5_esw_attr_flags_skip(attr->flags)) {
		if (attr->dest_chain)
			esw_cleanup_chain_dest(chains, attr->dest_chain, 1, 0);
		else if (esw_is_indir_table(esw, attr))
@@ -678,7 +678,7 @@ __mlx5_eswitch_del_rule(struct mlx5_eswitch *esw,

	mlx5_del_flow_rules(rule);

	if (!(attr->flags & MLX5_ESW_ATTR_FLAG_SLOW_PATH)) {
	if (!mlx5_esw_attr_flags_skip(attr->flags)) {
		/* unref the term table */
		for (i = 0; i < MLX5_MAX_FLOW_FWD_VPORTS; i++) {
			if (esw_attr->dests[i].termtbl)
+1 −1
Original line number Diff line number Diff line
@@ -219,7 +219,7 @@ mlx5_eswitch_termtbl_required(struct mlx5_eswitch *esw,

	if (!MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, termination_table) ||
	    !MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, ignore_flow_level) ||
	    attr->flags & MLX5_ESW_ATTR_FLAG_SLOW_PATH ||
	    mlx5_esw_attr_flags_skip(attr->flags) ||
	    !mlx5_eswitch_offload_is_uplink_port(esw, spec))
		return false;