net/mlx5: CT: Add support for mirroring
authorPaul Blakey <paulb@mellanox.com>
Mon, 21 Sep 2020 08:49:26 +0000 (11:49 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Fri, 12 Mar 2021 23:29:33 +0000 (15:29 -0800)
Add support for mirroring before the CT action by spliting the pre ct rule.
Mirror outputs are done first on the tc chain,prio table rule (the fwd
rule), which will then forward to a per port fwd table.
On this fwd table, we insert the original pre ct rule that forwards to
ct/ct nat table.

Signed-off-by: Paul Blakey <paulb@mellanox.com>
Signed-off-by: Maor Dickman <maord@nvidia.com>
Reviewed-by: Roi Dayan <roid@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/en/tc_ct.c
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

index 3a6095c912f181ebe06de9455e2492e5e9153abc..5e3d31b888ce99270506a2e627cd8443a1a7940e 100644 (file)
@@ -1797,6 +1797,10 @@ __mlx5_tc_ct_flow_offload(struct mlx5_tc_ct_priv *ct_priv,
        ct_flow->post_ct_attr->prio = 0;
        ct_flow->post_ct_attr->ft = ct_priv->post_ct;
 
+       /* Splits were handled before CT */
+       if (ct_priv->ns_type == MLX5_FLOW_NAMESPACE_FDB)
+               ct_flow->post_ct_attr->esw_attr->split_count = 0;
+
        ct_flow->post_ct_attr->inner_match_level = MLX5_MATCH_NONE;
        ct_flow->post_ct_attr->outer_match_level = MLX5_MATCH_NONE;
        ct_flow->post_ct_attr->action &= ~(MLX5_FLOW_CONTEXT_ACTION_DECAP);
index c72725c3f53b40b401293eb65a42b113c12c67c0..121f0a744e551b62f23e6878173fe5b76583b554 100644 (file)
@@ -1087,19 +1087,23 @@ mlx5e_tc_offload_fdb_rules(struct mlx5_eswitch *esw,
        if (flow_flag_test(flow, CT)) {
                mod_hdr_acts = &attr->parse_attr->mod_hdr_acts;
 
-               return mlx5_tc_ct_flow_offload(get_ct_priv(flow->priv),
+               rule = mlx5_tc_ct_flow_offload(get_ct_priv(flow->priv),
                                               flow, spec, attr,
                                               mod_hdr_acts);
+       } else {
+               rule = mlx5_eswitch_add_offloaded_rule(esw, spec, attr);
        }
 
-       rule = mlx5_eswitch_add_offloaded_rule(esw, spec, attr);
        if (IS_ERR(rule))
                return rule;
 
        if (attr->esw_attr->split_count) {
                flow->rule[1] = mlx5_eswitch_add_fwd_rule(esw, spec, attr);
                if (IS_ERR(flow->rule[1])) {
-                       mlx5_eswitch_del_offloaded_rule(esw, rule, attr);
+                       if (flow_flag_test(flow, CT))
+                               mlx5_tc_ct_delete_flow(get_ct_priv(flow->priv), flow, attr);
+                       else
+                               mlx5_eswitch_del_offloaded_rule(esw, rule, attr);
                        return flow->rule[1];
                }
        }
@@ -2989,7 +2993,8 @@ static bool actions_match_supported(struct mlx5e_priv *priv,
        actions = flow->attr->action;
 
        if (mlx5e_is_eswitch_flow(flow)) {
-               if (flow->attr->esw_attr->split_count && ct_flow) {
+               if (flow->attr->esw_attr->split_count && ct_flow &&
+                   !MLX5_CAP_GEN(flow->attr->esw_attr->in_mdev, reg_c_preserve)) {
                        /* All registers used by ct are cleared when using
                         * split rules.
                         */
@@ -3789,6 +3794,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
                                return err;
 
                        flow_flag_set(flow, CT);
+                       esw_attr->split_count = esw_attr->out_count;
                        break;
                default:
                        NL_SET_ERR_MSG_MOD(extack, "The offload action is not supported");
@@ -3851,11 +3857,6 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
                        return -EOPNOTSUPP;
                }
 
-               if (attr->action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
-                       NL_SET_ERR_MSG_MOD(extack,
-                                          "Mirroring goto chain rules isn't supported");
-                       return -EOPNOTSUPP;
-               }
                attr->action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
        }