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 1c49b745b579b4a8816d703554eb23791f2609d1..8e2d8e735faa88a377ae9a14d372584f2cc1e68b 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 d987bd06935dd2c3e22f0074cd4eed7cb25e66f8..a8c6683c33490bc4dffb7980226d6f9cf691eb2b 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);