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 5A02E45697; Tue, 23 Jul 2024 18:23:02 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7752A42E4D; Tue, 23 Jul 2024 18:23:01 +0200 (CEST) Received: from frasgout.his.huawei.com (frasgout.his.huawei.com [185.176.79.56]) by mails.dpdk.org (Postfix) with ESMTP id 2A1AA40DDB; Tue, 23 Jul 2024 18:22:58 +0200 (CEST) Received: from mail.maildlp.com (unknown [172.18.186.216]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4WT2SL5C0Pz6H735; Wed, 24 Jul 2024 00:20:34 +0800 (CST) Received: from frapeml100008.china.huawei.com (unknown [7.182.85.131]) by mail.maildlp.com (Postfix) with ESMTPS id 10B20140B18; Wed, 24 Jul 2024 00:22:58 +0800 (CST) Received: from frapeml500007.china.huawei.com (7.182.85.172) by frapeml100008.china.huawei.com (7.182.85.131) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.39; Tue, 23 Jul 2024 18:22:57 +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; Tue, 23 Jul 2024 18:22:57 +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: AQHa1qAIJ72CVVlLaEGsAap4GVnOybH6t9YAgAFKzOCAAEMlgIAF2LrQgAARmwCAAlj0gA== Date: Tue, 23 Jul 2024 16:22:57 +0000 Message-ID: <2d2ec732b68b4faba1af4777bd486893@huawei.com> 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.126.170.120] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-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 t= o > > > > > > 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 fo= r > > > > > > 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 s= etup_lpm(). > > > > > Where we already check that port is enabled, and If not, then thi= s > > > > > route 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 confi= g > > > > 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? > > Not really a problem, Just trying to optimize wherever it Is possible. > > > > > > > > > > > > > > ((1 << route_base_v4[i].if_out & > > > > > enabled_port_mask) > > > > By looking into this check, it seems restriction to maximum 31 port > > > > ID while parsing rule file becomes more valid as this check can pas= s > > > > 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 */ } > > > > > Yes, I can change it to this. >=20 > I re-checked the code, IMO we should restrict the rules in " read_config_= files" > May be we can move this check to read_config_files. > As having this check in the setup can result in rte_exit() call when no u= ser rule file > Is given and application is using the default rules. In that case route_b= ase_v4 will > Have 16 rules for 16 ports (default rules). > So this check will fails always unless user enable all the 16 ports with = -p option. Ah yes, you are right. That's why probably right now we probably just do 'continue;' here... Yeh, probably the easiest way is to put this check before setup_lpm() - in parsing code, or straight after that. Can I ask you for one more thing: can we add a new function that would do this check and use it everywhere (lpm/em/acl). > > > > > > > > > > > Another question here - why we just silently skip the rule with i= nvalid 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 enable= d > > > > 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 port 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 numbers, 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. > > Ok, I will add the rte_exit if route port is invalid or not enabled. > > With this change onwards It will be assumed user will add only those ro= utes With > > port IDs which are valid and enabled in the application. > > > > > > > > > > > > > > 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_rule > > > > > > *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_rule > > > > > > *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 > > > > > > > > Gagan >=20