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 1907545644 for ; Thu, 18 Jul 2024 12:02:11 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 112B440E16; Thu, 18 Jul 2024 12:02:11 +0200 (CEST) Received: from frasgout.his.huawei.com (frasgout.his.huawei.com [185.176.79.56]) by mails.dpdk.org (Postfix) with ESMTP id DEFA9402B1; Thu, 18 Jul 2024 12:01:54 +0200 (CEST) Received: from mail.maildlp.com (unknown [172.18.186.216]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4WPpF636WGz6K8wN; Thu, 18 Jul 2024 17:59:38 +0800 (CST) Received: from frapeml100007.china.huawei.com (unknown [7.182.85.133]) by mail.maildlp.com (Postfix) with ESMTPS id 0302D140B73; Thu, 18 Jul 2024 18:01:54 +0800 (CST) Received: from frapeml500007.china.huawei.com (7.182.85.172) by frapeml100007.china.huawei.com (7.182.85.133) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Thu, 18 Jul 2024 12:01:53 +0200 Received: from frapeml500007.china.huawei.com ([7.182.85.172]) by frapeml500007.china.huawei.com ([7.182.85.172]) with mapi id 15.01.2507.039; Thu, 18 Jul 2024 12:01:53 +0200 From: Konstantin Ananyev To: Gagandeep Singh , "dev@dpdk.org" , Konstantin Ananyev , Sean Morrissey CC: "stable@dpdk.org" Subject: RE: [PATCH 3/3] examples/l3fwd: fix maximum acceptable port ID in routes Thread-Topic: [PATCH 3/3] examples/l3fwd: fix maximum acceptable port ID in routes Thread-Index: AQHa1qAIJ72CVVlLaEGsAap4GVnOybH6r7LQgAE5hgCAAFTpQA== Date: Thu, 18 Jul 2024 10:01:53 +0000 Message-ID: References: <20240715101458.645014-1-g.singh@nxp.com> <20240715101458.645014-3-g.singh@nxp.com> <370cf325ad02427cbca5a37756da4c35@huawei.com> In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.195.245.116] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 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 > > > Application is accepting routes for port ID up to UINT8_MAX for LPM > > > amd EM routes on parsing the given rule file, but only up to 32 ports > > > can be enabled as per the variable enabled_port_mask which is defined > > > as uint32_t. > > > > > > This patch restricts the rules parsing code to accept routes for port > > > ID up to 31 only to avoid any unnecessary maintenance of rules which > > > will never be used. > > > > If we want to add this extra check, probably better to do it in setup_l= pm(). > > Where we already check that port is enabled, and If not, then this rout= e rule will > > be skipped: > > > > /* populate the LPM table */ > > for (i =3D 0; i < route_num_v4; i++) { > > struct in_addr in; > > > > /* skip unused ports */ > > if ((1 << route_base_v4[i].if_out & > > enabled_port_mask) =3D=3D 0) > > continue; > > > > Same for EM. > I am trying to update the check for MAX if_out value in rules config file= parsing which will be before setup_lpm(). > The reason is, restricting and adding only those rules which can be used = by the application > while populating the route_base_v4/v6 at first step and avoid unnecessary= memory allocation > for local variables to store more not required rules. Hmm... but why it is a problem? =20 >=20 > > ((1 << route_base_v4[i].if_out & > > enabled_port_mask) > By looking into this check, it seems restriction to maximum 31 port ID wh= ile parsing rule file becomes > more valid as this check can pass due to overflow in case value of route_= base_v4[i].if_out > Is 31+. Agree, I think we need both, and it probably need to be in setup_lpm(). Something like: if (route_base_v4[i].if_out >=3D sizeof(enabled_port_mask) * CHAR_BIT || ((1 << route_base_v4[i].if_out & enabled_port_mask) =3D=3D 0) { /* print some error message here*/ rte_exiit(...); /* or return an error */ }=20 =20 >=20 > > Another question here - why we just silently skip the rule with invalid= port? > In read_config_files_lpm() we are calling the rte_exit in case port ID is= 31+. > In setup_lpm, skipping the rules for the ports which are not enabled and = not giving error, > I guess probably because of ease of use. > e.g. user has only single ipv4_routes config file with route rules for po= rt ID 0,1,2,3,4 > and want to use same file for multiple test cases like > 1. when only port 0 enabled > 2. when only port 0 and 1 enabled and so on. > In this case, user can avoid to have separate route files for each of the= test case. The problem as I see it - we are not consistent here. In some cases we just silently skip rules with invalid (or disabled) port n= umbers, in other cases we generate an error and exit. For me it would be better, if we follow one simple policy (abort with error= ) here for all cases. =20 >=20 > > Probably need to fail with error... that what ACL code-path does. > > > > > Fixes: e7e6dd643092 ("examples/l3fwd: support config file for EM") > > > Fixes: 52def963fc1c ("examples/l3fwd: support config file for > > > LPM/FIB") > > > Cc: sean.morrissey@intel.com > > > Cc: stable@dpdk.org > > > > > > Signed-off-by: Gagandeep Singh > > > --- > > > examples/l3fwd/em_route_parse.c | 6 ++++-- > > > examples/l3fwd/lpm_route_parse.c | 6 ++++-- > > > 2 files changed, 8 insertions(+), 4 deletions(-) > > > > > > diff --git a/examples/l3fwd/em_route_parse.c > > > b/examples/l3fwd/em_route_parse.c index 8b534de5f1..65c71cd1ba 100644 > > > --- a/examples/l3fwd/em_route_parse.c > > > +++ b/examples/l3fwd/em_route_parse.c > > > @@ -65,7 +65,8 @@ em_parse_v6_rule(char *str, struct em_rule *v) > > > /* protocol. */ > > > GET_CB_FIELD(in[CB_FLD_PROTO], v->v6_key.proto, 0, UINT8_MAX, 0); > > > /* out interface. */ > > > - GET_CB_FIELD(in[CB_FLD_IF_OUT], v->if_out, 0, UINT8_MAX, 0); > > > + GET_CB_FIELD(in[CB_FLD_IF_OUT], v->if_out, 0, > > > + (sizeof(enabled_port_mask) * CHAR_BIT) - 1, 0); > > > > > > return 0; > > > } > > > @@ -102,7 +103,8 @@ em_parse_v4_rule(char *str, struct em_rule *v) > > > /* protocol. */ > > > GET_CB_FIELD(in[CB_FLD_PROTO], v->v4_key.proto, 0, UINT8_MAX, 0); > > > /* out interface. */ > > > - GET_CB_FIELD(in[CB_FLD_IF_OUT], v->if_out, 0, UINT8_MAX, 0); > > > + GET_CB_FIELD(in[CB_FLD_IF_OUT], v->if_out, 0, > > > + (sizeof(enabled_port_mask) * CHAR_BIT) - 1, 0); > > > > > > return 0; > > > } > > > diff --git a/examples/l3fwd/lpm_route_parse.c > > > b/examples/l3fwd/lpm_route_parse.c > > > index f27b66e838..357c12d9fe 100644 > > > --- a/examples/l3fwd/lpm_route_parse.c > > > +++ b/examples/l3fwd/lpm_route_parse.c > > > @@ -110,7 +110,8 @@ lpm_parse_v6_rule(char *str, struct lpm_route_rul= e > > > *v) > > > > > > rc =3D lpm_parse_v6_net(in[CB_FLD_DST_ADDR], v->ip_32, &v->depth); > > > > > > - GET_CB_FIELD(in[CB_FLD_IF_OUT], v->if_out, 0, UINT8_MAX, 0); > > > + GET_CB_FIELD(in[CB_FLD_IF_OUT], v->if_out, 0, > > > + (sizeof(enabled_port_mask) * CHAR_BIT) - 1, 0); > > > > > > return rc; > > > } > > > @@ -132,7 +133,8 @@ lpm_parse_v4_rule(char *str, struct lpm_route_rul= e > > > *v) > > > > > > rc =3D parse_ipv4_addr_mask(in[CB_FLD_DST_ADDR], &v->ip, &v->depth)= ; > > > > > > - GET_CB_FIELD(in[CB_FLD_IF_OUT], v->if_out, 0, UINT8_MAX, 0); > > > + GET_CB_FIELD(in[CB_FLD_IF_OUT], v->if_out, 0, > > > + (sizeof(enabled_port_mask) * CHAR_BIT) - 1, 0); > > > > > > return rc; > > > } > > > -- > > > 2.25.1 >=20 > Gagan