mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
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: Jianbo Liu <jianbol@nvidia.com> Reviewed-by: Cosmin Ratiu <cratiu@nvidia.com> Signed-off-by: Tariq Toukan <tariqt@nvidia.com> Link: https://patch.msgid.link/20240808055927.2059700-5-tariqt@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
16bb8c6133
commit
b11bde5624
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user