Skip to content

Commit

Permalink
acl: fix rules with 8-byte field size
Browse files Browse the repository at this point in the history
[ upstream commit 451098159c2209bc5c395a30d2dae325af93e8c2 ]

In theory ACL library allows fields with 8B long.
Though in practice they usually not used, not tested,
and as was revealed by Ido, this functionality is not working properly.
There are few places inside ACL build code-path that need to be addressed.

Bugzilla ID: 673
Fixes: dc276b5 ("acl: new library")

Reported-by: Ido Goshen <ido@cgstowernetworks.com>
Signed-off-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
Tested-by: Ido Goshen <ido@cgstowernetworks.com>
  • Loading branch information
Konstantin Ananyev authored and cpaelzer committed Jul 6, 2022
1 parent c4b081a commit c807a4c
Showing 1 changed file with 10 additions and 4 deletions.
14 changes: 10 additions & 4 deletions lib/librte_acl/acl_bld.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
/* number of pointers per alloc */
#define ACL_PTR_ALLOC 32

/* account for situation when all fields are 8B long */
#define ACL_MAX_INDEXES (2 * RTE_ACL_MAX_FIELDS)

/* macros for dividing rule sets heuristics */
#define NODE_MAX 0x4000
#define NODE_MIN 0x800
Expand Down Expand Up @@ -80,7 +83,7 @@ struct acl_build_context {
struct tb_mem_pool pool;
struct rte_acl_trie tries[RTE_ACL_MAX_TRIES];
struct rte_acl_bld_trie bld_tries[RTE_ACL_MAX_TRIES];
uint32_t data_indexes[RTE_ACL_MAX_TRIES][RTE_ACL_MAX_FIELDS];
uint32_t data_indexes[RTE_ACL_MAX_TRIES][ACL_MAX_INDEXES];

/* memory free lists for nodes and blocks used for node ptrs */
struct acl_mem_block blocks[MEM_BLOCK_NUM];
Expand Down Expand Up @@ -988,7 +991,7 @@ build_trie(struct acl_build_context *context, struct rte_acl_build_rule *head,
*/
uint64_t mask;
mask = RTE_ACL_MASKLEN_TO_BITMASK(
fld->mask_range.u32,
fld->mask_range.u64,
rule->config->defs[n].size);

/* gen a mini-trie for this field */
Expand Down Expand Up @@ -1301,6 +1304,9 @@ acl_build_index(const struct rte_acl_config *config, uint32_t *data_index)
if (last_header != config->defs[n].input_index) {
last_header = config->defs[n].input_index;
data_index[m++] = config->defs[n].offset;
if (config->defs[n].size > sizeof(uint32_t))
data_index[m++] = config->defs[n].offset +
sizeof(uint32_t);
}
}

Expand Down Expand Up @@ -1487,7 +1493,7 @@ acl_set_data_indexes(struct rte_acl_ctx *ctx)
memcpy(ctx->data_indexes + ofs, ctx->trie[i].data_index,
n * sizeof(ctx->data_indexes[0]));
ctx->trie[i].data_index = ctx->data_indexes + ofs;
ofs += RTE_ACL_MAX_FIELDS;
ofs += ACL_MAX_INDEXES;
}
}

Expand Down Expand Up @@ -1612,7 +1618,7 @@ rte_acl_build(struct rte_acl_ctx *ctx, const struct rte_acl_config *cfg)
/* allocate and fill run-time structures. */
rc = rte_acl_gen(ctx, bcx.tries, bcx.bld_tries,
bcx.num_tries, bcx.cfg.num_categories,
RTE_ACL_MAX_FIELDS * RTE_DIM(bcx.tries) *
ACL_MAX_INDEXES * RTE_DIM(bcx.tries) *
sizeof(ctx->data_indexes[0]), max_size);
if (rc == 0) {
/* set data indexes. */
Expand Down

0 comments on commit c807a4c

Please sign in to comment.