]> git.baikalelectronics.ru Git - kernel.git/commitdiff
net/mlx5: E-Switch, Allow offloading fwd dest flow table with vport
authorRoi Dayan <roid@nvidia.com>
Sun, 2 Oct 2022 04:56:30 +0000 (21:56 -0700)
committerJakub Kicinski <kuba@kernel.org>
Mon, 3 Oct 2022 23:55:29 +0000 (16:55 -0700)
Before this commit a fwd dest flow table resulted in ignoring vport dests
which is incorrect and is supported.
With this commit the dests can be a mix of flow table and vport dests.
There is still a limitation that there cannot be more than one flow table dest.

Signed-off-by: Roi Dayan <roid@nvidia.com>
Reviewed-by: Maor Dickman <maord@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index c98c6af21581f30f621e610ff43f00268055dee8..4e50df3139c68e7b02f5dc88f2b5506d4b022745 100644 (file)
@@ -483,25 +483,27 @@ esw_setup_dests(struct mlx5_flow_destination *dest,
            !(attr->flags & MLX5_ATTR_FLAG_SLOW_PATH)) {
                esw_setup_sampler_dest(dest, flow_act, attr->sample_attr.sampler_id, *i);
                (*i)++;
-       } else if (attr->dest_ft) {
-               esw_setup_ft_dest(dest, flow_act, esw, attr, spec, *i);
-               (*i)++;
        } else if (attr->flags & MLX5_ATTR_FLAG_SLOW_PATH) {
                esw_setup_slow_path_dest(dest, flow_act, esw, *i);
                (*i)++;
        } else if (attr->flags & MLX5_ATTR_FLAG_ACCEPT) {
                esw_setup_accept_dest(dest, flow_act, chains, *i);
                (*i)++;
-       } else if (attr->dest_chain) {
-               err = esw_setup_chain_dest(dest, flow_act, chains, attr->dest_chain,
-                                          1, 0, *i);
-               (*i)++;
        } else if (esw_is_indir_table(esw, attr)) {
                err = esw_setup_indir_table(dest, flow_act, esw, attr, spec, true, i);
        } else if (esw_is_chain_src_port_rewrite(esw, esw_attr)) {
                err = esw_setup_chain_src_port_rewrite(dest, flow_act, esw, chains, attr, i);
        } else {
                *i = esw_setup_vport_dests(dest, flow_act, esw, esw_attr, *i);
+
+               if (attr->dest_ft) {
+                       err = esw_setup_ft_dest(dest, flow_act, esw, attr, spec, *i);
+                       (*i)++;
+               } else if (attr->dest_chain) {
+                       err = esw_setup_chain_dest(dest, flow_act, chains, attr->dest_chain,
+                                                  1, 0, *i);
+                       (*i)++;
+               }
        }
 
        return err;