Commit b11bde56 authored by Jianbo Liu's avatar Jianbo Liu Committed by Jakub Kicinski
Browse files

net/mlx5e: TC, Offload rewrite and mirror to both internal and external dests



Firmware has the limitation that it cannot offload a rule with rewrite
and mirror to internal and external destinations simultaneously.

This patch adds a workaround to this issue. Here the destination array
is split again, just like what's done in previous commit, but after
the action indexed by split_count - 1. An extra rule is added for the
leftover destinations. Such rule can be offloaded, even there are
destinations to both internal and external destinations, because the
header rewrite is left in the original FTE.

Signed-off-by: default avatarJianbo Liu <jianbol@nvidia.com>
Reviewed-by: default avatarCosmin Ratiu <cratiu@nvidia.com>
Signed-off-by: default avatarTariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20240808055927.2059700-5-tariqt@nvidia.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 16bb8c61
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -1742,12 +1742,17 @@ has_encap_dests(struct mlx5_flow_attr *attr)
static int
extra_split_attr_dests_needed(struct mlx5e_tc_flow *flow, struct mlx5_flow_attr *attr)
{
	bool int_dest = false, ext_dest = false;
	struct mlx5_esw_flow_attr *esw_attr;
	int i;

	if (flow->attr != attr ||
	    !list_is_first(&attr->list, &flow->attrs))
		return 0;

	if (flow_flag_test(flow, SLOW))
		return 0;

	esw_attr = attr->esw_attr;
	if (!esw_attr->split_count ||
	    esw_attr->split_count == esw_attr->out_count - 1)
@@ -1758,6 +1763,18 @@ extra_split_attr_dests_needed(struct mlx5e_tc_flow *flow, struct mlx5_flow_attr
	     MLX5_ESW_DEST_CHAIN_WITH_SRC_PORT_CHANGE))
		return esw_attr->split_count + 1;

	for (i = esw_attr->split_count; i < esw_attr->out_count; i++) {
		/* external dest with encap is considered as internal by firmware */
		if (esw_attr->dests[i].vport == MLX5_VPORT_UPLINK &&
		    !(esw_attr->dests[i].flags & MLX5_ESW_DEST_ENCAP_VALID))
			ext_dest = true;
		else
			int_dest = true;

		if (ext_dest && int_dest)
			return esw_attr->split_count;
	}

	return 0;
}