From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7C5BBA00C2 for ; Sun, 15 May 2022 22:03:35 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A23E640A7F; Sun, 15 May 2022 22:03:34 +0200 (CEST) Received: from forward500p.mail.yandex.net (forward500p.mail.yandex.net [77.88.28.110]) by mails.dpdk.org (Postfix) with ESMTP id 3A99840A79; Sun, 15 May 2022 22:03:32 +0200 (CEST) Received: from sas1-46a35d8d365a.qloud-c.yandex.net (sas1-46a35d8d365a.qloud-c.yandex.net [IPv6:2a02:6b8:c08:1aa0:0:640:46a3:5d8d]) by forward500p.mail.yandex.net (Yandex) with ESMTP id 98B26F01A39; Sun, 15 May 2022 23:03:31 +0300 (MSK) Received: from sas2-ffeb92823cb1.qloud-c.yandex.net (sas2-ffeb92823cb1.qloud-c.yandex.net [2a02:6b8:c08:6803:0:640:ffeb:9282]) by sas1-46a35d8d365a.qloud-c.yandex.net (mxback/Yandex) with ESMTP id j0M9vfLx8C-3Vh0uSHE; Sun, 15 May 2022 23:03:31 +0300 X-Yandex-Fwd: 2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1652645011; bh=zpb5D4jUHR2BLFwaAlaQNnwjr216hWnj8MfePcPYeek=; h=In-Reply-To:References:Date:Subject:Cc:To:From:Message-Id; b=s1SwHejbXITBdUqh27T5iQAUm57wIn8Kjh/SCEKTp/3fmnJb96TjQHNOb153xxokD Z09xafybqxL8B4qKtVcAYVW3KeUGe/ONwtRW087BVjPyf/SQjLVmxIrbtrgqObyVIw 7hkpbuEZRH1kRjgpIe0ITqMTgekTI+WpH+nTYPs4= Authentication-Results: sas1-46a35d8d365a.qloud-c.yandex.net; dkim=pass header.i=@yandex.ru Received: by sas2-ffeb92823cb1.qloud-c.yandex.net (smtp/Yandex) with ESMTPSA id 46XcTS98Er-3UMCV3IB; Sun, 15 May 2022 23:03:30 +0300 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (Client certificate not present) From: Konstantin Ananyev To: dev@dpdk.org Cc: ido@cgstowernetworks.com, stable@dpdk.org Subject: [PATCH v2 1/2] acl: fix rules with 8 bytes field size are broken Date: Sun, 15 May 2022 21:03:18 +0100 Message-Id: <20220515200319.81002-2-konstantin.v.ananyev@yandex.ru> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220515200319.81002-1-konstantin.v.ananyev@yandex.ru> References: <20220426174454.311999-1-konstantin.v.ananyev@yandex.ru> <20220515200319.81002-1-konstantin.v.ananyev@yandex.ru> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org 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 Signed-off-by: Konstantin Ananyev --- 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