OSDN Git Service

net/mlx5e: Enable setting multiple match criteria for flow group
authorYevgeny Kliteynik <kliteyn@mellanox.com>
Wed, 30 Jan 2019 13:52:35 +0000 (15:52 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 31 May 2019 20:04:25 +0000 (13:04 -0700)
When filling in flow spec match criteria, to allow previous
modifications of the match criteria, use "|=" rather than "=".

Tunnel options are parsed before the match criteria of the offloaded
flow are being set. If the the flow that we're about to offload has
encapsulation options, the flow group might need to match on additional
criteria.

For Geneve, an additional flow group matching parameter should
be used - misc3. The appropriate bit in the match criteria is set
while parsing the tunnel options, so the criteria value shouldn't
be overwritten.

This is a pre-step for supporting Geneve TLV options offload.

Reviewed-by: Oz Shlomo <ozsh@mellanox.com>
Signed-off-by: Yevgeny Kliteynik <kliteyn@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 1c49b74..8e2d8e7 100644 (file)
@@ -799,7 +799,7 @@ mlx5e_tc_add_nic_flow(struct mlx5e_priv *priv,
        }
 
        if (attr->match_level != MLX5_MATCH_NONE)
-               parse_attr->spec.match_criteria_enable = MLX5_MATCH_OUTER_HEADERS;
+               parse_attr->spec.match_criteria_enable |= MLX5_MATCH_OUTER_HEADERS;
 
        flow->rule[0] = mlx5_add_flow_rules(priv->fs.tc.t, &parse_attr->spec,
                                            &flow_act, dest, dest_ix);
index d987bd0..a8c6683 100644 (file)
@@ -173,7 +173,7 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
                MLX5_SET_TO_ONES(fte_match_set_misc, misc,
                                 source_eswitch_owner_vhca_id);
 
-       spec->match_criteria_enable = MLX5_MATCH_MISC_PARAMETERS;
+       spec->match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS;
        if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_DECAP) {
                if (attr->tunnel_match_level != MLX5_MATCH_NONE)
                        spec->match_criteria_enable |= MLX5_MATCH_OUTER_HEADERS;
@@ -266,10 +266,10 @@ mlx5_eswitch_add_fwd_rule(struct mlx5_eswitch *esw,
                                 source_eswitch_owner_vhca_id);
 
        if (attr->match_level == MLX5_MATCH_NONE)
-               spec->match_criteria_enable = MLX5_MATCH_MISC_PARAMETERS;
+               spec->match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS;
        else
-               spec->match_criteria_enable = MLX5_MATCH_OUTER_HEADERS |
-                                             MLX5_MATCH_MISC_PARAMETERS;
+               spec->match_criteria_enable |= MLX5_MATCH_OUTER_HEADERS |
+                                              MLX5_MATCH_MISC_PARAMETERS;
 
        rule = mlx5_add_flow_rules(fast_fdb, spec, &flow_act, dest, i);