Commit 69e2916e authored by Paul Blakey's avatar Paul Blakey Committed by Saeed Mahameed
Browse files

net/mlx5: CT: Add support for mirroring



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: default avatarPaul Blakey <paulb@mellanox.com>
Signed-off-by: default avatarMaor Dickman <maord@nvidia.com>
Reviewed-by: default avatarRoi Dayan <roid@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 287e0df0
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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);
+10 −9
Original line number Diff line number Diff line
@@ -1087,18 +1087,22 @@ 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])) {
			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;
	}