Commit 941f1979 authored by Muhammad Sammar's avatar Muhammad Sammar Committed by Saeed Mahameed
Browse files

net/mlx5: DR, Add check for unsupported fields in match param



When a matcher is being built, we "consume" (clear) mask fields one by one,
and to verify that we do support all the required fields we check if the
whole mask was consumed, else the matching request includes unsupported
fields.

Signed-off-by: default avatarMuhammad Sammar <muhammads@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
Reviewed-by: default avatarYevgeny Kliteynik <kliteyn@nvidia.com>
parent 504e1572
Loading
Loading
Loading
Loading
+25 −3
Original line number Diff line number Diff line
@@ -875,9 +875,10 @@ static int dr_matcher_init_fdb(struct mlx5dr_matcher *matcher)
static int dr_matcher_init(struct mlx5dr_matcher *matcher,
			   struct mlx5dr_match_parameters *mask)
{
	struct mlx5dr_match_parameters consumed_mask;
	struct mlx5dr_table *tbl = matcher->tbl;
	struct mlx5dr_domain *dmn = tbl->dmn;
	int ret;
	int i, ret;

	if (matcher->match_criteria >= DR_MATCHER_CRITERIA_MAX) {
		mlx5dr_err(dmn, "Invalid match criteria attribute\n");
@@ -889,8 +890,16 @@ static int dr_matcher_init(struct mlx5dr_matcher *matcher,
			mlx5dr_err(dmn, "Invalid match size attribute\n");
			return -EINVAL;
		}

		consumed_mask.match_buf = kzalloc(mask->match_sz, GFP_KERNEL);
		if (!consumed_mask.match_buf)
			return -ENOMEM;

		consumed_mask.match_sz = mask->match_sz;
		memcpy(consumed_mask.match_buf, mask->match_buf, mask->match_sz);
		mlx5dr_ste_copy_param(matcher->match_criteria,
				      &matcher->mask, mask);
				      &matcher->mask, &consumed_mask,
				      true);
	}

	switch (dmn->type) {
@@ -909,9 +918,22 @@ static int dr_matcher_init(struct mlx5dr_matcher *matcher,
		break;
	default:
		WARN_ON(true);
		return -EINVAL;
		ret = -EINVAL;
		goto free_consumed_mask;
	}

	/* Check that all mask data was consumed */
	for (i = 0; i < consumed_mask.match_sz; i++) {
		if (consumed_mask.match_buf[i]) {
			mlx5dr_dbg(dmn, "Match param mask contains unsupported parameters\n");
			ret = -EOPNOTSUPP;
			goto free_consumed_mask;
		}
	}

	ret =  0;
free_consumed_mask:
	kfree(consumed_mask.match_buf);
	return ret;
}

+1 −1
Original line number Diff line number Diff line
@@ -917,7 +917,7 @@ static bool dr_rule_verify(struct mlx5dr_matcher *matcher,
		return false;
	}

	mlx5dr_ste_copy_param(matcher->match_criteria, param, value);
	mlx5dr_ste_copy_param(matcher->match_criteria, param, value, false);

	if (match_criteria & DR_MATCHER_CRITERIA_OUTER) {
		s_idx = offsetof(struct mlx5dr_match_param, outer);
+144 −128

File changed.

Preview size limit exceeded, changes collapsed.

+2 −1
Original line number Diff line number Diff line
@@ -1230,7 +1230,8 @@ void mlx5dr_ste_set_formatted_ste(struct mlx5dr_ste_ctx *ste_ctx,
				  struct mlx5dr_htbl_connect_info *connect_info);
void mlx5dr_ste_copy_param(u8 match_criteria,
			   struct mlx5dr_match_param *set_param,
			   struct mlx5dr_match_parameters *mask);
			   struct mlx5dr_match_parameters *mask,
			   bool clear);

struct mlx5dr_qp {
	struct mlx5_core_dev *mdev;