|
@@ -309,89 +309,17 @@ static struct fs_prio *find_prio(struct mlx5_flow_namespace *ns,
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-static bool check_last_reserved(const u32 *match_criteria)
|
|
|
-{
|
|
|
- char *match_criteria_reserved =
|
|
|
- MLX5_ADDR_OF(fte_match_param, match_criteria, MLX5_FTE_MATCH_PARAM_RESERVED);
|
|
|
-
|
|
|
- return !match_criteria_reserved[0] &&
|
|
|
- !memcmp(match_criteria_reserved, match_criteria_reserved + 1,
|
|
|
- MLX5_FLD_SZ_BYTES(fte_match_param,
|
|
|
- MLX5_FTE_MATCH_PARAM_RESERVED) - 1);
|
|
|
-}
|
|
|
-
|
|
|
-static bool check_valid_mask(u8 match_criteria_enable, const u32 *match_criteria)
|
|
|
-{
|
|
|
- if (match_criteria_enable & ~(
|
|
|
- (1 << MLX5_CREATE_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_OUTER_HEADERS) |
|
|
|
- (1 << MLX5_CREATE_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS) |
|
|
|
- (1 << MLX5_CREATE_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_INNER_HEADERS) |
|
|
|
- (1 << MLX5_CREATE_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS_2)))
|
|
|
- return false;
|
|
|
-
|
|
|
- if (!(match_criteria_enable &
|
|
|
- 1 << MLX5_CREATE_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_OUTER_HEADERS)) {
|
|
|
- char *fg_type_mask = MLX5_ADDR_OF(fte_match_param,
|
|
|
- match_criteria, outer_headers);
|
|
|
-
|
|
|
- if (fg_type_mask[0] ||
|
|
|
- memcmp(fg_type_mask, fg_type_mask + 1,
|
|
|
- MLX5_ST_SZ_BYTES(fte_match_set_lyr_2_4) - 1))
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (!(match_criteria_enable &
|
|
|
- 1 << MLX5_CREATE_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS)) {
|
|
|
- char *fg_type_mask = MLX5_ADDR_OF(fte_match_param,
|
|
|
- match_criteria, misc_parameters);
|
|
|
-
|
|
|
- if (fg_type_mask[0] ||
|
|
|
- memcmp(fg_type_mask, fg_type_mask + 1,
|
|
|
- MLX5_ST_SZ_BYTES(fte_match_set_misc) - 1))
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (!(match_criteria_enable &
|
|
|
- 1 << MLX5_CREATE_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_INNER_HEADERS)) {
|
|
|
- char *fg_type_mask = MLX5_ADDR_OF(fte_match_param,
|
|
|
- match_criteria, inner_headers);
|
|
|
-
|
|
|
- if (fg_type_mask[0] ||
|
|
|
- memcmp(fg_type_mask, fg_type_mask + 1,
|
|
|
- MLX5_ST_SZ_BYTES(fte_match_set_lyr_2_4) - 1))
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- if (!(match_criteria_enable &
|
|
|
- 1 << MLX5_CREATE_FLOW_GROUP_IN_MATCH_CRITERIA_ENABLE_MISC_PARAMETERS_2)) {
|
|
|
- char *fg_type_mask = MLX5_ADDR_OF(fte_match_param,
|
|
|
- match_criteria, misc_parameters_2);
|
|
|
-
|
|
|
- if (fg_type_mask[0] ||
|
|
|
- memcmp(fg_type_mask, fg_type_mask + 1,
|
|
|
- MLX5_ST_SZ_BYTES(fte_match_set_misc2) - 1))
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- return check_last_reserved(match_criteria);
|
|
|
-}
|
|
|
-
|
|
|
static bool check_valid_spec(const struct mlx5_flow_spec *spec)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
|
- if (!check_valid_mask(spec->match_criteria_enable, spec->match_criteria)) {
|
|
|
- pr_warn("mlx5_core: Match criteria given mismatches match_criteria_enable\n");
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
for (i = 0; i < MLX5_ST_SZ_DW_MATCH_PARAM; i++)
|
|
|
if (spec->match_value[i] & ~spec->match_criteria[i]) {
|
|
|
pr_warn("mlx5_core: match_value differs from match_criteria\n");
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- return check_last_reserved(spec->match_value);
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
static struct mlx5_flow_root_namespace *find_root(struct fs_node *node)
|
|
@@ -1158,9 +1086,6 @@ struct mlx5_flow_group *mlx5_create_flow_group(struct mlx5_flow_table *ft,
|
|
|
struct mlx5_flow_group *fg;
|
|
|
int err;
|
|
|
|
|
|
- if (!check_valid_mask(match_criteria_enable, match_criteria))
|
|
|
- return ERR_PTR(-EINVAL);
|
|
|
-
|
|
|
if (ft->autogroup.active)
|
|
|
return ERR_PTR(-EPERM);
|
|
|
|