]> git.baikalelectronics.ru Git - kernel.git/commitdiff
net/mlx5e: Support header rewrite actions with remote port mirroring
authorEli Britstein <elibr@mellanox.com>
Mon, 26 Nov 2018 05:24:08 +0000 (07:24 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Tue, 11 Dec 2018 22:52:19 +0000 (14:52 -0800)
A rule with the following actions is split to a two level FDB:
1. Forward to local mirror vport
2. Header rewrite
3. Forward to local vport
In the first level flow table, forward the packet to the local port and
forward the packet to the second level flow table for header rewrite and
local port forwarding. This configuration fails when mirroring to a
remote encapsulated destination because currently an FTE cannot support
encap and table destinations.

Use the extended destination capabilities to configure the first level
flow table with a multi-destination FTE to the uplink and second level
table and the second level flow table for the header rewrite and local
port forwarding.

Signed-off-by: Eli Britstein <elibr@mellanox.com>
Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index 1e3688a0c4f93dd04cff421d141282da806ccb2d..4030462f56dc3f8aaadd4413deb81cf9a50571c5 100644 (file)
@@ -943,8 +943,8 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
                }
                out_priv = netdev_priv(encap_dev);
                rpriv = out_priv->ppriv;
-               attr->dests[attr->out_count].rep = rpriv->rep;
-               attr->dests[attr->out_count++].mdev = out_priv->mdev;
+               attr->dests[out_index].rep = rpriv->rep;
+               attr->dests[out_index].mdev = out_priv->mdev;
        }
 
        err = mlx5_eswitch_add_vlan_action(esw, attr);
@@ -2487,6 +2487,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts,
                                attr->parse_attr = parse_attr;
                                attr->dests[attr->out_count].flags |=
                                        MLX5_ESW_DEST_ENCAP;
+                               attr->out_count++;
                                /* attr->dests[].rep is resolved when we
                                 * handle encap
                                 */
index bb96c4661e261fb0b26fa37f0389b93af96ebd7e..b0652e44a68d580e5dfdac6a278a75595a025b36 100644 (file)
@@ -226,6 +226,10 @@ mlx5_eswitch_add_fwd_rule(struct mlx5_eswitch *esw,
                        MLX5_CAP_GEN(attr->dests[i].mdev, vhca_id);
                if (MLX5_CAP_ESW(esw->dev, merged_eswitch))
                        dest[i].vport.flags |= MLX5_FLOW_DEST_VPORT_VHCA_ID;
+               if (attr->dests[i].flags & MLX5_ESW_DEST_ENCAP) {
+                       dest[i].vport.flags |= MLX5_FLOW_DEST_VPORT_REFORMAT_ID;
+                       dest[i].vport.reformat_id = attr->encap_id;
+               }
        }
        dest[i].type = MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE;
        dest[i].ft = fwd_fdb,