* [PATCH 1/2] acl: fix rules with 8 bytes field size are broken
[not found] <20220426174454.311999-1-konstantin.v.ananyev@yandex.ru>
@ 2022-04-26 17:44 ` Konstantin Ananyev
[not found] ` <20220515200319.81002-1-konstantin.v.ananyev@yandex.ru>
1 sibling, 0 replies; 3+ messages in thread
From: Konstantin Ananyev @ 2022-04-26 17:44 UTC (permalink / raw)
To: dev; +Cc: stable, Ido Goshen
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: dc276b5780c2 ("acl: new library")
Cc: stable@dpdk.org
Reported-by: Ido Goshen <ido@cgstowernetworks.com>
Signed-off-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
---
lib/acl/acl_bld.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/lib/acl/acl_bld.c b/lib/acl/acl_bld.c
index 7ea30f4186..2816632803 100644
--- a/lib/acl/acl_bld.c
+++ b/lib/acl/acl_bld.c
@@ -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
@@ -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];
@@ -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 */
@@ -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);
}
}
@@ -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;
}
}
@@ -1643,7 +1649,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. */
--
2.34.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH v2 1/2] acl: fix rules with 8 bytes field size are broken
[not found] ` <20220515200319.81002-1-konstantin.v.ananyev@yandex.ru>
@ 2022-05-15 20:03 ` Konstantin Ananyev
2022-05-16 6:23 ` Ido Goshen
0 siblings, 1 reply; 3+ messages in thread
From: Konstantin Ananyev @ 2022-05-15 20:03 UTC (permalink / raw)
To: dev; +Cc: ido, stable
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: dc276b5780c2 ("acl: new library")
Cc: stable@dpdk.org
Reported-by: Ido Goshen <ido@cgstowernetworks.com>
Signed-off-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
---
lib/acl/acl_bld.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/lib/acl/acl_bld.c b/lib/acl/acl_bld.c
index 7ea30f4186..2816632803 100644
--- a/lib/acl/acl_bld.c
+++ b/lib/acl/acl_bld.c
@@ -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
@@ -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];
@@ -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 */
@@ -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);
}
}
@@ -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;
}
}
@@ -1643,7 +1649,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. */
--
2.34.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* RE: [PATCH v2 1/2] acl: fix rules with 8 bytes field size are broken
2022-05-15 20:03 ` [PATCH v2 " Konstantin Ananyev
@ 2022-05-16 6:23 ` Ido Goshen
0 siblings, 0 replies; 3+ messages in thread
From: Ido Goshen @ 2022-05-16 6:23 UTC (permalink / raw)
To: Konstantin Ananyev, dev; +Cc: stable
Tested-by: Ido Goshen <ido@cgstowernetworks.com>
> -----Original Message-----
> From: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
> Sent: Sunday, 15 May 2022 23:03
> To: dev@dpdk.org
> Cc: Ido Goshen <Ido@cgstowernetworks.com>; stable@dpdk.org
> Subject: [PATCH v2 1/2] acl: fix rules with 8 bytes field size are broken
>
> 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: dc276b5780c2 ("acl: new library")
> Cc: stable@dpdk.org
>
> Reported-by: Ido Goshen <ido@cgstowernetworks.com>
> Signed-off-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
> ---
> lib/acl/acl_bld.c | 14 ++++++++++----
> 1 file changed, 10 insertions(+), 4 deletions(-)
>
> diff --git a/lib/acl/acl_bld.c b/lib/acl/acl_bld.c index 7ea30f4186..2816632803
> 100644
> --- a/lib/acl/acl_bld.c
> +++ b/lib/acl/acl_bld.c
> @@ -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
> @@ -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];
> @@ -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 */ @@ -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);
> }
> }
>
> @@ -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;
> }
> }
>
> @@ -1643,7 +1649,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. */
> --
> 2.34.1
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2022-05-16 6:23 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20220426174454.311999-1-konstantin.v.ananyev@yandex.ru>
2022-04-26 17:44 ` [PATCH 1/2] acl: fix rules with 8 bytes field size are broken Konstantin Ananyev
[not found] ` <20220515200319.81002-1-konstantin.v.ananyev@yandex.ru>
2022-05-15 20:03 ` [PATCH v2 " Konstantin Ananyev
2022-05-16 6:23 ` Ido Goshen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).