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 6723EA0093; Thu, 23 Jun 2022 15:07:43 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 086AC40146; Thu, 23 Jun 2022 15:07:43 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by mails.dpdk.org (Postfix) with ESMTP id C30AA40042 for ; Thu, 23 Jun 2022 15:07:41 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 25N9wYK4025916; Thu, 23 Jun 2022 06:07:40 -0700 Received: from nam10-dm6-obe.outbound.protection.outlook.com (mail-dm6nam10lp2105.outbound.protection.outlook.com [104.47.58.105]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 3gvp0urrvv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 23 Jun 2022 06:07:40 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=GInfgOkW1g26wjoHN9iVscoNJQDRIKTmnRVTjcpZDwN2+jXuATcQrvPMGdjR8Em9LalTL9Nqo7IwPFTDVJfhmnK9IMGSOFThqLwyfT3OfTXaLUsQLSIXYVoG0x57GPv5duX7LFuE67WldM51wW5j3B40asmbxDCQz4zQNKufGMzwKM7gyvgErVHmB0K6/OHkyfpnRnFmXMtyjEPTDk0HG5kmuJlTeuoEq2H6P5lsdG4pWqHtwYmin4ewNQQQnjlw6KFOotQhtljaEORDNBNNg1Zg5euVeyP7aDsPm9yV3QpYNt3qxXEISNBlHruta+uwUBJXX1R2TU19A09UBKSBUg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=k3gepjvAmU5vovb25qXWghDbwCW/0X6CjioXwAzZzYw=; b=IsDZdUsNzY9OnaEH0jl/q6iFjeL9ZqTDXArePmWJf0eE9hPqiIQMCfKd3bPHGCuLEGJ2wojCuXe8TXWRN72HEZI6kwhzmgWGPwv2tjDmijAUYDInMTw/MJS4CTUkV5fYUf8WLJqwBca7hYzAtHxVQU4914rPoDfnN7b9yqlEOC6LWtnW6JaCdzQnG+nr37qrCPww9VjOivqB6IG9Mpl+7iGWxEmoSszbEyjD4G0k9aEId5m4sYPEOfMb77sbsLSC6xYiPnSL+/91NvtiGyU9oJalbt87ksOiiZvkfO3WXiq9x73Oo40SELDPKbjYnBNJQigF3nskTWEks1/+/FUFfA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=marvell.com; dmarc=pass action=none header.from=marvell.com; dkim=pass header.d=marvell.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.onmicrosoft.com; s=selector1-marvell-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=k3gepjvAmU5vovb25qXWghDbwCW/0X6CjioXwAzZzYw=; b=N21ejiKRIg73ri/Hc8hRpbmCEteYrRGnqHKxq8pq19+cNcaPFXjaAkncBRuX6fvKAkHciYuyHCjPJPPIgoGHjb7Ac6Ff/MCZ4Mt5lJ183wXcYqRWIiADksY1NSmjlrjiApn7+BR3ChZu1G9G2XEd1OIMWopIHPDKL2LvJM/xNQA= Received: from CO6PR18MB3860.namprd18.prod.outlook.com (2603:10b6:5:34d::12) by MWHPR1801MB1885.namprd18.prod.outlook.com (2603:10b6:301:66::26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.22; Thu, 23 Jun 2022 13:07:37 +0000 Received: from CO6PR18MB3860.namprd18.prod.outlook.com ([fe80::7091:ccbe:928c:1ce0]) by CO6PR18MB3860.namprd18.prod.outlook.com ([fe80::7091:ccbe:928c:1ce0%9]) with mapi id 15.20.5373.015; Thu, 23 Jun 2022 13:07:37 +0000 From: Sunil Kumar Kori To: Sunil Kumar Kori , Xiaoyun Li , Aman Singh , Yuying Zhang , Cristian Dumitrescu , Andrew Rybchenko CC: "dev@dpdk.org" Subject: RE: [PATCH v5 1/1] app/testpmd: support different input color method Thread-Topic: [PATCH v5 1/1] app/testpmd: support different input color method Thread-Index: AQHYhwDE+CxWi7uiEUGpJwu/Ecg/G61c9i/A Date: Thu, 23 Jun 2022 13:07:37 +0000 Message-ID: References: <20220614100518.533931-1-skori@marvell.com> <20220623125701.1136065-1-skori@marvell.com> In-Reply-To: <20220623125701.1136065-1-skori@marvell.com> Accept-Language: en-US Content-Language: en-US X-Mentions: andrew.rybchenko@oktetlabs.ru X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 22ed26d6-bae5-4ca3-0d30-08da551958ca x-ms-traffictypediagnostic: MWHPR1801MB1885:EE_ x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: dKWTJhbSh6b+OqQTihjTScbEfr/lwDtwKjIjkwKvubWshFClUX/w8FzeWS0l6QT1Iq4Beon2+W3ux0g+W8iHqjqxrDEji1A16v9POcjejkMJay/lFYiHagY2/XlHEumXTAuIyJgEPpd0EiW4ixe5YEJUVG+lXsLEPdxQOnS0JpCb+BxSLxo2hp0TMovRTzFjos9ff7KahozP3izBKIFdEfGdjyY201diEyCcfFR9+Cd+D57kxzUI0EWQSB22o5xwtKWN60VzmEf/AOJTXoFiUupljnPHqm1t+quk2bo/s/xwBB7B8/TS7Qvdvz0XM2gAVq5DqqUNtB9tHUL5oR57ddSBu/TFe9aG08AkWaTE03WOlkpAcnraAo1202Y8RzssxDyi4/QGkV2hs4hXPCEol//L433Ca5ZGp9DKzDVIE5zU/n32n2P6B9bhVIouVvVAt/cABlzg5poapm1Gna5Lp4fg2+F+n9afFiBV5LkImr1N0upDR0nBBXUO9b1NM5PFLADrfxc6tG4VzrV384g62sw6OaHhbv3KH8VuVugzv0QXf+FG2bnjwkgubNld9TD+djssBqptcHlDR3PcPxu8YFISOG1WxV9LO2BpP8UQG2h8EGHJ0uK7C1UIRLyjpf7MVOZ8MQxPYFmxFwhBZw96Up54Gl3Gz7EMJOGsL1Ojf3QxNRTK545Ji3upM8Wi21bJ1RVXcYpcmSJ4FWa+ZfcH2bquoNaQ4g3qd2DR5gopGb/HYiV8oTwdz83spz6wu6t4GmqQ26yvbyoJpdlOkaPrmg== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:CO6PR18MB3860.namprd18.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230016)(4636009)(136003)(346002)(376002)(39860400002)(396003)(366004)(52536014)(41300700001)(33656002)(64756008)(66556008)(8676002)(186003)(478600001)(8936002)(66946007)(66476007)(4326008)(66446008)(5660300002)(30864003)(2906002)(26005)(76116006)(6506007)(9686003)(53546011)(86362001)(71200400001)(83380400001)(7696005)(110136005)(55016003)(316002)(122000001)(38100700002)(38070700005)(579004)(559001); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?SQpY7TmCPIEAVSKtPtqoIOgyt3GeXWsLjD3/9gBo7WBCypcZgXip/PI//Qc8?= =?us-ascii?Q?rwj5pTsc6a2kplGoTDpDDKx/Tao+s8HQJxB3kgMQQVe0H5pmB0YPrcx0QoVS?= =?us-ascii?Q?dA5B0F7+rWhZyBaUhjuj3p8wjP5MMPVlFcjfKPAngHl8ZF8XR93bDVeH3Ike?= =?us-ascii?Q?ErQOWRQX+za13lDmYLJ9FNBFg/pYzqxLqt8jlKQmgbO0rxfy4JxmrfJGCsMl?= =?us-ascii?Q?Rmf3gK4XjPCiNK64hZEDs0JjSx/RtQN3sbbqcbRyeVhrxnJb5XRdaxBP/PGh?= =?us-ascii?Q?UbUPStGwSaCwcQwWcWBzAHBAbKapdx7iNG89VxAcvTk0p6yn1OpTaQWR8Vci?= =?us-ascii?Q?s5c3nqY9mGv2GapYn0fRRniIL7CpDGXI3SfocWQPoT7FxpEkb4lrlyW0rKfD?= =?us-ascii?Q?BQjGO5pYax3fqegeK6qoCE5A66bkVeWXVudRIGQoIiqJ0VqybqybMtptSwJx?= =?us-ascii?Q?L5sYE8XQ8B+cvPzxTMWYfNhKNQmyy0gIspu557yZHByEQU6mkqM7WZhtKyKG?= =?us-ascii?Q?Cm4CJcdjKAv7iwkqgK2yCiNRsDFO5W9KnhMoxxj4CSQocgKjuYRJ5099rrLq?= =?us-ascii?Q?p8BaN4QTJZmqW023KqMWhOZWK2ZRYhRCUaa40ujM2wVdF3UXQI8TtoFTtouh?= =?us-ascii?Q?yWRWFPUhkgIzbVKkXF/SM/7P2AvsEFuxGPZ3lskU96oh3QIOroKW34MS3RgO?= =?us-ascii?Q?8wlW9wYn/sDEmUH7QfZEGKcTzPJzoALks516vui3VRcl+NI46Q9qnDV9uyx3?= =?us-ascii?Q?qbZH0qWLAJ9mLPp3Hsju/FXFbMx4vO0ZyWWqIqGWYXu7HN0qi/KxFtiTOgcu?= =?us-ascii?Q?69P5AQQBlXIMs9SzelZPu/m43f7IX+UGaEJWdzZRs1yOvVwqcDEtJvb9xqcQ?= =?us-ascii?Q?y/BQKfPMcsDYQlsdIlHBrwhO0pHMyudzib7Igs8ohxEDiB57jd7agyp2zifZ?= =?us-ascii?Q?lOJOWDzg1IYFdtK7VZp/C3kTcPsi8nzxRTQyrsNmo17r9abH5YY2RIdX8avw?= =?us-ascii?Q?02wo7c+KP41yJI1bW6U0jVc1iWvlsd14hWBRW9CxrsapwNSF6OSdetXM4Zhb?= =?us-ascii?Q?+ZdfoIf0L2eTTnMC78tnk5F+Peq+P4GlEs8CHYfpuCrPa2rwz+8ptwzCufEA?= =?us-ascii?Q?ER4L4nGybga0Ifv27icbtdB9D9eV4cRnMhl0EbOAXx233WmJMuz83aqUGAO8?= =?us-ascii?Q?FRh1gnGrETiv+PPxs3lpygMcB+SK0AlArLp2mGf3wbiK91SKn1ZCzTNsTW+S?= =?us-ascii?Q?XIr3vudhtAGVXPHARVFAiCTRoq5O33lOimnYnp2kYvVfQ5a6eVFhxxqOvipk?= =?us-ascii?Q?ST6CwO7yHbqsqDB+p0vYesZEtbcFeTWH0Fa3OO/4PGZ/Yp9K4ZRmGg9vtGmn?= =?us-ascii?Q?0UVG2O6JYEfB5rEwbPC6S+F/VZqbj+MlDeN0BOuUpWSL1yVyF9N+DvXcAhd2?= =?us-ascii?Q?hJ3wZpuvqQB9sgtX4Oq214BAlET/TJISRSP4hfL+QvcuNTWb4drlMuilTMXe?= =?us-ascii?Q?HpSrOnwgRENds0eydbFuYfsFvA9UsGESuzf6tW3AmBW602p8PbMViO0oe6+5?= =?us-ascii?Q?M2Kbrtq/aKcduU8n934q3S5WRvye0q5gFlEnVk5+UoLzlWeoD3m0YZDrXf5p?= =?us-ascii?Q?3RoBK02VihONzNBvCxi+OWee6Y8WYt0teNXnUvDaf9nQU0DTgU05qkdJXErD?= =?us-ascii?Q?ZYFqn0b4EkMQnx6Pn/WCpbhLrtjPuN96BGC7at//W1sjO+WHTEuupRAJZzEe?= =?us-ascii?Q?7lu3DIRM0Q=3D=3D?= Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: marvell.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: CO6PR18MB3860.namprd18.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 22ed26d6-bae5-4ca3-0d30-08da551958ca X-MS-Exchange-CrossTenant-originalarrivaltime: 23 Jun 2022 13:07:37.8214 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 70e1fb47-1155-421d-87fc-2e58f638b6e0 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: SsOBExwDvoU4/hcVjrHJCH3dY2AjqjTIuPpmTdsq4LBEIdiQ4DywdJx0fBX3wpHf1Py4Lt/P9/9LwGQfAnrttg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR1801MB1885 X-Proofpoint-GUID: fiU9a2ynTPVLVN4E8sdVpRcTM_GXDqL1 X-Proofpoint-ORIG-GUID: fiU9a2ynTPVLVN4E8sdVpRcTM_GXDqL1 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.883,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-06-23_05,2022-06-23_01,2022-06-22_01 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 @Andrew Rybchenko Please look into it. Updated user guide as suggested. Regards Sunil Kumar Kori > -----Original Message----- > From: skori@marvell.com > Sent: Thursday, June 23, 2022 6:27 PM > To: Xiaoyun Li ; Aman Singh > ; Yuying Zhang ; > Cristian Dumitrescu > Cc: dev@dpdk.org; Sunil Kumar Kori > Subject: [PATCH v5 1/1] app/testpmd: support different input color method >=20 > From: Sunil Kumar Kori >=20 > To enable input coloring, based on VLAN or DSCP, patch adds command line > interface to configure the following: >=20 > - configuring input coloring using VLAN or DSCP while creating > meter i.e. during rte_mtr_create() >=20 > - Update VLAN input coloring table at runtime. >=20 > - configures protocol priorities. >=20 > - retrieve protocol and priority information >=20 > Depends-on: patch-22751 ("ethdev: mtr: support protocol based input color > selection") >=20 > Signed-off-by: Sunil Kumar Kori > Acked-by: Cristian Dumitrescu > --- > v4..v5: > - Update testpmd user guide. >=20 > v3..v4: > - Replace strcmp with strcasecmp whereever is needed. >=20 > v2..v3: > - Rebased to branch ToT dpdk-next-net/main > - Fix static keyword for newly added token parsing symbols >=20 > v1..v2: > - Rebased to branch dpdk-next-net > - add CLIs for input coloring mechanism >=20 > app/test-pmd/cmdline.c | 4 + > app/test-pmd/cmdline_mtr.c | 552 +++++++++++++++++++- > app/test-pmd/cmdline_mtr.h | 4 + > doc/guides/testpmd_app_ug/testpmd_funcs.rst | 35 +- > 4 files changed, 587 insertions(+), 8 deletions(-) >=20 > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index > 9a7fd5fc35..ded7dfe656 100644 > --- a/app/test-pmd/cmdline.c > +++ b/app/test-pmd/cmdline.c > @@ -14345,6 +14345,10 @@ static cmdline_parse_ctx_t builtin_ctx[] =3D { > (cmdline_parse_inst_t *)&cmd_del_port_meter_policy, > (cmdline_parse_inst_t *)&cmd_set_port_meter_profile, > (cmdline_parse_inst_t *)&cmd_set_port_meter_dscp_table, > + (cmdline_parse_inst_t *)&cmd_set_port_meter_vlan_table, > + (cmdline_parse_inst_t *)&cmd_set_port_meter_in_proto, > + (cmdline_parse_inst_t *)&cmd_get_port_meter_in_proto, > + (cmdline_parse_inst_t *)&cmd_get_port_meter_in_proto_prio, > (cmdline_parse_inst_t *)&cmd_set_port_meter_stats_mask, > (cmdline_parse_inst_t *)&cmd_show_port_meter_stats, > (cmdline_parse_inst_t *)&cmd_mcast_addr, diff --git a/app/test- > pmd/cmdline_mtr.c b/app/test-pmd/cmdline_mtr.c index > 57050ec9af..b92e66cedb 100644 > --- a/app/test-pmd/cmdline_mtr.c > +++ b/app/test-pmd/cmdline_mtr.c > @@ -14,6 +14,7 @@ > #include "cmdline_mtr.h" >=20 > #define PARSE_DELIMITER " \f\n\r\t\v" > +#define MAX_VLAN_TABLE_ENTRIES 16 > #define MAX_DSCP_TABLE_ENTRIES 64 >=20 > /** Display Meter Error Message */ > @@ -82,6 +83,122 @@ parse_uint(uint64_t *value, const char *str) > return 0; > } >=20 > +static int > +parse_input_color_table_entries(char *str, enum rte_color **dscp_table, > + enum rte_color **vlan_table) > +{ > + enum rte_color *vlan, *dscp; > + char *token; > + int i =3D 0; > + > + token =3D strtok_r(str, PARSE_DELIMITER, &str); > + if (token =3D=3D NULL) > + return 0; > + > + /* Allocate memory for dscp table */ > + dscp =3D (enum rte_color *)malloc(MAX_DSCP_TABLE_ENTRIES * > + sizeof(enum rte_color)); > + if (dscp =3D=3D NULL) > + return -1; > + > + while (1) { > + if (strcasecmp(token, "G") =3D=3D 0) > + dscp[i++] =3D RTE_COLOR_GREEN; > + else if (strcasecmp(token, "Y") =3D=3D 0) > + dscp[i++] =3D RTE_COLOR_YELLOW; > + else if (strcasecmp(token, "R") =3D=3D 0) > + dscp[i++] =3D RTE_COLOR_RED; > + else { > + free(dscp); > + return -1; > + } > + if (i =3D=3D MAX_DSCP_TABLE_ENTRIES) > + break; > + > + token =3D strtok_r(str, PARSE_DELIMITER, &str); > + if (token =3D=3D NULL) { > + free(dscp); > + return -1; > + } > + } > + > + *dscp_table =3D dscp; > + > + token =3D strtok_r(str, PARSE_DELIMITER, &str); > + if (token =3D=3D NULL) > + return 0; > + > + /* Allocate memory for vlan table */ > + vlan =3D (enum rte_color *)malloc(MAX_VLAN_TABLE_ENTRIES * > + sizeof(enum rte_color)); > + if (vlan =3D=3D NULL) > + return -1; > + > + i =3D 0; > + while (1) { > + if (strcasecmp(token, "G") =3D=3D 0) > + vlan[i++] =3D RTE_COLOR_GREEN; > + else if (strcasecmp(token, "Y") =3D=3D 0) > + vlan[i++] =3D RTE_COLOR_YELLOW; > + else if (strcasecmp(token, "R") =3D=3D 0) > + vlan[i++] =3D RTE_COLOR_RED; > + else { > + free(vlan); > + return -1; > + } > + if (i =3D=3D MAX_VLAN_TABLE_ENTRIES) > + break; > + > + token =3D strtok_r(str, PARSE_DELIMITER, &str); > + if (token =3D=3D NULL) { > + free(vlan); > + return -1; > + } > + } > + > + *vlan_table =3D vlan; > + return 0; > +} > + > +static int > +parse_vlan_table_entries(char *str, enum rte_color **vlan_table) { > + char *token; > + int i =3D 0; > + > + token =3D strtok_r(str, PARSE_DELIMITER, &str); > + if (token =3D=3D NULL) > + return 0; > + > + /* Allocate memory for vlan table */ > + *vlan_table =3D (enum rte_color *)malloc(MAX_VLAN_TABLE_ENTRIES > * > + sizeof(enum rte_color)); > + if (*vlan_table =3D=3D NULL) > + return -1; > + > + while (1) { > + if (strcasecmp(token, "G") =3D=3D 0) > + (*vlan_table)[i++] =3D RTE_COLOR_GREEN; > + else if (strcasecmp(token, "Y") =3D=3D 0) > + (*vlan_table)[i++] =3D RTE_COLOR_YELLOW; > + else if (strcasecmp(token, "R") =3D=3D 0) > + (*vlan_table)[i++] =3D RTE_COLOR_RED; > + else { > + free(*vlan_table); > + return -1; > + } > + if (i =3D=3D MAX_VLAN_TABLE_ENTRIES) > + break; > + > + token =3D strtok_r(str, PARSE_DELIMITER, &str); > + if (token =3D=3D NULL) { > + free(*vlan_table); > + return -1; > + } > + } > + return 0; > +} > + > static int > parse_dscp_table_entries(char *str, enum rte_color **dscp_table) { @@ - > 124,9 +241,30 @@ parse_dscp_table_entries(char *str, enum rte_color > **dscp_table) > return 0; > } >=20 > +static int > +parse_default_input_color_str(char *str, uint64_t *def_inp_color) { > + char *token; > + > + token =3D strtok_r(str, PARSE_DELIMITER, &str); > + if (token =3D=3D NULL) > + return 0; > + > + if (strcasecmp(token, "G") =3D=3D 0) > + *def_inp_color =3D RTE_COLOR_GREEN; > + else if (strcasecmp(token, "Y") =3D=3D 0) > + *def_inp_color =3D RTE_COLOR_YELLOW; > + else if (strcasecmp(token, "R") =3D=3D 0) > + *def_inp_color =3D RTE_COLOR_RED; > + else > + return -1; > + > + return 0; > +} > + > static int > parse_meter_color_str(char *c_str, uint32_t *use_prev_meter_color, > - enum rte_color **dscp_table) > + enum rte_color **vlan_table, enum rte_color **dscp_table) > { > char *token; > uint64_t previous_mtr_color =3D 0; > @@ -147,8 +285,7 @@ parse_meter_color_str(char *c_str, uint32_t > *use_prev_meter_color, > return 0; > } >=20 > - /* Parse dscp table entries */ > - ret =3D parse_dscp_table_entries(c_str, dscp_table); > + ret =3D parse_input_color_table_entries(c_str, dscp_table, vlan_table); > if (ret !=3D 0) > return -1; >=20 > @@ -192,6 +329,43 @@ parse_multi_token_string(char *t_str, uint16_t > *port_id, > return 0; > } >=20 > +static int > +parse_multi_token_vlan_str(char *t_str, uint16_t *port_id, uint32_t > *mtr_id, > + enum rte_color **vlan_table) > +{ > + uint64_t val; > + char *token; > + int ret; > + > + /* First token: port id */ > + token =3D strtok_r(t_str, PARSE_DELIMITER, &t_str); > + if (token =3D=3D NULL) > + return -1; > + > + ret =3D parse_uint(&val, token); > + if (ret !=3D 0 || val > UINT16_MAX) > + return -1; > + > + *port_id =3D val; > + > + /* Second token: meter id */ > + token =3D strtok_r(t_str, PARSE_DELIMITER, &t_str); > + if (token =3D=3D NULL) > + return 0; > + > + ret =3D parse_uint(&val, token); > + if (ret !=3D 0 || val > UINT32_MAX) > + return -1; > + > + *mtr_id =3D val; > + > + ret =3D parse_vlan_table_entries(t_str, vlan_table); > + if (ret !=3D 0) > + return -1; > + > + return 0; > +} > + > /* *** Show Port Meter Capabilities *** */ struct > cmd_show_port_meter_cap_result { > cmdline_fixed_string_t show; > @@ -277,6 +451,10 @@ static void cmd_show_port_meter_cap_parsed(void > *parsed_result, > printf("cap.trtcm_rfc4115_packet_mode_supported %" PRId32 "\n", > cap.trtcm_rfc4115_packet_mode_supported); > printf("cap.stats_mask %" PRIx64 "\n", cap.stats_mask); > + printf("cap.input_color_proto_mask 0x%" PRIx64 "\n", > + cap.input_color_proto_mask); > + printf("cap.separate_input_color_table_per_port %" PRId32 "\n", > + cap.separate_input_color_table_per_port); > } >=20 > cmdline_parse_inst_t cmd_show_port_meter_cap =3D { @@ -721,6 +899,7 > @@ struct cmd_create_port_meter_result { > cmdline_fixed_string_t r_action; > uint64_t statistics_mask; > uint32_t shared; > + cmdline_fixed_string_t default_input_color; > cmdline_multi_string_t meter_input_color; }; >=20 > @@ -754,6 +933,9 @@ static cmdline_parse_token_num_t > cmd_create_port_meter_statistics_mask =3D static > cmdline_parse_token_num_t cmd_create_port_meter_shared =3D > TOKEN_NUM_INITIALIZER(struct cmd_create_port_meter_result, > shared, RTE_UINT32); > +static cmdline_parse_token_string_t > cmd_create_port_meter_default_input_color =3D > + TOKEN_STRING_INITIALIZER(struct cmd_create_port_meter_result, > + default_input_color, "R#Y#G#r#y#g"); > static cmdline_parse_token_string_t cmd_create_port_meter_input_color = =3D > TOKEN_STRING_INITIALIZER(struct cmd_create_port_meter_result, > meter_input_color, TOKEN_STRING_MULTI); @@ -769,7 > +951,10 @@ static void cmd_create_port_meter_parsed(void > *parsed_result, > uint32_t shared =3D res->shared; > uint32_t use_prev_meter_color =3D 0; > uint16_t port_id =3D res->port_id; > + uint64_t def_inp_color =3D 0; > enum rte_color *dscp_table =3D NULL; > + enum rte_color *vlan_table =3D NULL; > + char *def_color_str =3D res->default_input_color; > char *c_str =3D res->meter_input_color; > int ret; >=20 > @@ -780,8 +965,18 @@ static void cmd_create_port_meter_parsed(void > *parsed_result, > memset(¶ms, 0, sizeof(struct rte_mtr_params)); > params.meter_profile_id =3D res->profile_id; > params.meter_policy_id =3D res->policy_id; > + > + /* Parse meter default input color string params */ > + ret =3D parse_default_input_color_str(def_color_str, &def_inp_color); > + if (ret) { > + fprintf(stderr, > + " Meter default input color is invalid\n"); > + return; > + } > + > /* Parse meter input color string params */ > - ret =3D parse_meter_color_str(c_str, &use_prev_meter_color, > &dscp_table); > + ret =3D parse_meter_color_str(c_str, &use_prev_meter_color, > &vlan_table, > + &dscp_table); > if (ret) { > fprintf(stderr, > " Meter input color params string parse error\n"); > @@ -789,16 +984,20 @@ static void cmd_create_port_meter_parsed(void > *parsed_result, > } >=20 > params.use_prev_mtr_color =3D use_prev_meter_color; > + params.vlan_table =3D vlan_table; > params.dscp_table =3D dscp_table; > + params.default_input_color =3D def_inp_color; >=20 > if (strcmp(res->meter_enable, "yes") =3D=3D 0) > params.meter_enable =3D 1; > else > params.meter_enable =3D 0; > + > params.stats_mask =3D res->statistics_mask; >=20 > ret =3D rte_mtr_create(port_id, mtr_id, ¶ms, shared, &error); > if (ret !=3D 0) { > + free(vlan_table); > free(dscp_table); > print_err_msg(&error); > return; > @@ -809,8 +1008,10 @@ cmdline_parse_inst_t cmd_create_port_meter =3D { > .f =3D cmd_create_port_meter_parsed, > .data =3D NULL, > .help_str =3D "create port meter > " > - "(yes|no) > " > - "[ > ...]", > + "(yes|no) " > + "(g|y|r) " > + "[ > ...] " > + "[ ... > ]", > .tokens =3D { > (void *)&cmd_create_port_meter_create, > (void *)&cmd_create_port_meter_port, > @@ -822,6 +1023,7 @@ cmdline_parse_inst_t cmd_create_port_meter =3D { > (void *)&cmd_create_port_meter_meter_enable, > (void *)&cmd_create_port_meter_statistics_mask, > (void *)&cmd_create_port_meter_shared, > + (void *)&cmd_create_port_meter_default_input_color, > (void *)&cmd_create_port_meter_input_color, > NULL, > }, > @@ -1224,6 +1426,344 @@ cmdline_parse_inst_t > cmd_set_port_meter_dscp_table =3D { > }, > }; >=20 > +/* *** Set Port Meter VLAN Table *** */ struct > +cmd_set_port_meter_vlan_table_result { > + cmdline_fixed_string_t set; > + cmdline_fixed_string_t port; > + cmdline_fixed_string_t meter; > + cmdline_fixed_string_t vlan_table; > + cmdline_multi_string_t token_string; > +}; > + > +static cmdline_parse_token_string_t cmd_set_port_meter_vlan_table_set = =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_set_port_meter_vlan_table_result, set, "set"); > static > +cmdline_parse_token_string_t cmd_set_port_meter_vlan_table_port =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_set_port_meter_vlan_table_result, port, "port"); > static > +cmdline_parse_token_string_t cmd_set_port_meter_vlan_table_meter =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_set_port_meter_vlan_table_result, meter, > "meter"); static > +cmdline_parse_token_string_t cmd_set_port_meter_vlan_table_vlan_table > =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_set_port_meter_vlan_table_result, > + vlan_table, "vlan table"); > +static cmdline_parse_token_string_t > cmd_set_port_meter_vlan_table_token_string =3D > + TOKEN_STRING_INITIALIZER(struct > cmd_set_port_meter_vlan_table_result, > + token_string, TOKEN_STRING_MULTI); > + > +static void cmd_set_port_meter_vlan_table_parsed(void *parsed_result, > + __rte_unused struct cmdline *cl, > + __rte_unused void *data) > +{ > + struct cmd_set_port_meter_vlan_table_result *res =3D parsed_result; > + struct rte_mtr_error error; > + enum rte_color *vlan_table =3D NULL; > + char *t_str =3D res->token_string; > + uint32_t mtr_id =3D 0; > + uint16_t port_id; > + int ret; > + > + /* Parse string */ > + ret =3D parse_multi_token_vlan_str(t_str, &port_id, &mtr_id, > &vlan_table); > + if (ret) { > + fprintf(stderr, " Multi token string parse error\n"); > + return; > + } > + > + if (port_id_is_invalid(port_id, ENABLED_WARN)) > + goto free_table; > + > + /* Update Meter VLAN Table*/ > + ret =3D rte_mtr_meter_vlan_table_update(port_id, mtr_id, > + vlan_table, &error); > + if (ret !=3D 0) > + print_err_msg(&error); > + > +free_table: > + free(vlan_table); > +} > + > +cmdline_parse_inst_t cmd_set_port_meter_vlan_table =3D { > + .f =3D cmd_set_port_meter_vlan_table_parsed, > + .data =3D NULL, > + .help_str =3D "set port meter vlan table " > + "[ ... > ]", > + .tokens =3D { > + (void *)&cmd_set_port_meter_vlan_table_set, > + (void *)&cmd_set_port_meter_vlan_table_port, > + (void *)&cmd_set_port_meter_vlan_table_meter, > + (void *)&cmd_set_port_meter_vlan_table_vlan_table, > + (void *)&cmd_set_port_meter_vlan_table_token_string, > + NULL, > + }, > +}; > + > +/* *** Set Port Meter input protocol *** */ struct > +cmd_set_port_meter_in_proto_result { > + cmdline_fixed_string_t set; > + cmdline_fixed_string_t port; > + cmdline_fixed_string_t meter; > + cmdline_fixed_string_t protocol; > + cmdline_fixed_string_t proto; > + uint32_t prio; > + uint32_t mtr_id; > + uint16_t port_id; > +}; > + > +static cmdline_parse_token_string_t cmd_set_port_meter_in_proto_set =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_set_port_meter_in_proto_result, set, "set"); > + > +static cmdline_parse_token_string_t cmd_set_port_meter_in_proto_port =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_set_port_meter_in_proto_result, port, "port"); > + > +static cmdline_parse_token_string_t cmd_set_port_meter_in_proto_meter > =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_set_port_meter_in_proto_result, meter, > "meter"); > + > +static cmdline_parse_token_string_t > cmd_set_port_meter_in_proto_protocol =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_set_port_meter_in_proto_result, protocol, > "proto"); > + > +static cmdline_parse_token_string_t cmd_set_port_meter_in_proto_proto > =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_set_port_meter_in_proto_result, proto, > + "outer_vlan#inner_vlan#outer_ip#inner_ip"); > + > +static cmdline_parse_token_num_t cmd_set_port_meter_in_proto_prio =3D > + TOKEN_NUM_INITIALIZER( > + struct cmd_set_port_meter_in_proto_result, prio, > RTE_UINT32); > + > +static cmdline_parse_token_num_t cmd_set_port_meter_in_proto_port_id > =3D > + TOKEN_NUM_INITIALIZER( > + struct cmd_set_port_meter_in_proto_result, port_id, > RTE_UINT16); > + > +static cmdline_parse_token_num_t cmd_set_port_meter_in_proto_mtr_id > =3D > + TOKEN_NUM_INITIALIZER( > + struct cmd_set_port_meter_in_proto_result, mtr_id, > RTE_UINT32); > + > +static void cmd_set_port_meter_in_proto_parsed(void *parsed_result, > + __rte_unused struct cmdline *cl, > + __rte_unused void *data) > +{ > + struct cmd_set_port_meter_in_proto_result *res =3D parsed_result; > + enum rte_mtr_color_in_protocol proto; > + struct rte_mtr_error error; > + int ret; > + > + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) > + return; > + > + if (strcmp(res->proto, "outer_vlan") =3D=3D 0) > + proto =3D RTE_MTR_COLOR_IN_PROTO_OUTER_VLAN; > + else if (strcmp(res->proto, "inner_vlan") =3D=3D 0) > + proto =3D RTE_MTR_COLOR_IN_PROTO_INNER_VLAN; > + else if (strcmp(res->proto, "outer_ip") =3D=3D 0) > + proto =3D RTE_MTR_COLOR_IN_PROTO_OUTER_IP; > + else if (strcmp(res->proto, "inner_ip") =3D=3D 0) > + proto =3D RTE_MTR_COLOR_IN_PROTO_INNER_IP; > + else { > + printf("Invalid protocol\n"); > + return; > + } > + > + /* Update Meter input proto and priority */ > + ret =3D rte_mtr_color_in_protocol_set(res->port_id, res->mtr_id, > + proto, res->prio, &error); > + if (ret !=3D 0) > + print_err_msg(&error); > +} > + > +cmdline_parse_inst_t cmd_set_port_meter_in_proto =3D { > + .f =3D cmd_set_port_meter_in_proto_parsed, > + .data =3D NULL, > + .help_str =3D "set port meter proto " > + "", > + .tokens =3D { > + (void *)&cmd_set_port_meter_in_proto_set, > + (void *)&cmd_set_port_meter_in_proto_port, > + (void *)&cmd_set_port_meter_in_proto_meter, > + (void *)&cmd_set_port_meter_in_proto_protocol, > + (void *)&cmd_set_port_meter_in_proto_port_id, > + (void *)&cmd_set_port_meter_in_proto_mtr_id, > + (void *)&cmd_set_port_meter_in_proto_proto, > + (void *)&cmd_set_port_meter_in_proto_prio, > + NULL, > + }, > +}; > + > +/* *** Get Port Meter input protocol *** */ struct > +cmd_get_port_meter_in_proto_result { > + cmdline_fixed_string_t get; > + cmdline_fixed_string_t port; > + cmdline_fixed_string_t meter; > + cmdline_fixed_string_t protocol; > + uint32_t mtr_id; > + uint16_t port_id; > +}; > + > +static cmdline_parse_token_string_t cmd_get_port_meter_in_proto_get =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_get_port_meter_in_proto_result, get, "get"); > + > +static cmdline_parse_token_string_t cmd_get_port_meter_in_proto_port =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_get_port_meter_in_proto_result, port, "port"); > + > +static cmdline_parse_token_string_t cmd_get_port_meter_in_proto_meter > =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_get_port_meter_in_proto_result, meter, > "meter"); > + > +static cmdline_parse_token_string_t > cmd_get_port_meter_in_proto_protocol =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_get_port_meter_in_proto_result, protocol, > "proto"); > + > +static cmdline_parse_token_num_t cmd_get_port_meter_in_proto_port_id > =3D > + TOKEN_NUM_INITIALIZER( > + struct cmd_get_port_meter_in_proto_result, port_id, > RTE_UINT16); > + > +static cmdline_parse_token_num_t cmd_get_port_meter_in_proto_mtr_id > =3D > + TOKEN_NUM_INITIALIZER( > + struct cmd_get_port_meter_in_proto_result, mtr_id, > RTE_UINT32); > + > +static void cmd_get_port_meter_in_proto_parsed(void *parsed_result, > + __rte_unused struct cmdline *cl, > + __rte_unused void *data) > +{ > + struct cmd_set_port_meter_in_proto_result *res =3D parsed_result; > + struct rte_mtr_error error; > + uint64_t proto_mask =3D 0; > + int ret; > + > + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) > + return; > + > + /* Update Meter input proto and priority */ > + ret =3D rte_mtr_color_in_protocol_get(res->port_id, res->mtr_id, > + &proto_mask, &error); > + if (ret !=3D 0) > + print_err_msg(&error); > + > + printf("Enabled protocols:\n"); > + if (proto_mask & RTE_MTR_COLOR_IN_PROTO_OUTER_VLAN) > + printf("\touter_vlan\n"); > + if (proto_mask & RTE_MTR_COLOR_IN_PROTO_INNER_VLAN) > + printf("\tinner_vlan\n"); > + if (proto_mask & RTE_MTR_COLOR_IN_PROTO_OUTER_IP) > + printf("\touter_ip\n"); > + if (proto_mask & RTE_MTR_COLOR_IN_PROTO_INNER_IP) > + printf("\tinner_ip\n"); > +} > + > +cmdline_parse_inst_t cmd_get_port_meter_in_proto =3D { > + .f =3D cmd_get_port_meter_in_proto_parsed, > + .data =3D NULL, > + .help_str =3D "get port meter proto ", > + .tokens =3D { > + (void *)&cmd_get_port_meter_in_proto_get, > + (void *)&cmd_get_port_meter_in_proto_port, > + (void *)&cmd_get_port_meter_in_proto_meter, > + (void *)&cmd_get_port_meter_in_proto_protocol, > + (void *)&cmd_get_port_meter_in_proto_port_id, > + (void *)&cmd_get_port_meter_in_proto_mtr_id, > + NULL, > + }, > +}; > + > +/* *** Get Port Meter input protocol priority *** */ struct > +cmd_get_port_meter_in_proto_prio_result { > + cmdline_fixed_string_t get; > + cmdline_fixed_string_t port; > + cmdline_fixed_string_t meter; > + cmdline_fixed_string_t protocol; > + cmdline_fixed_string_t proto; > + uint32_t mtr_id; > + uint16_t port_id; > +}; > + > +static cmdline_parse_token_string_t > cmd_get_port_meter_in_proto_prio_get =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_get_port_meter_in_proto_prio_result, get, "get"); > + > +static cmdline_parse_token_string_t > cmd_get_port_meter_in_proto_prio_port =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_get_port_meter_in_proto_prio_result, port, > "port"); > + > +static cmdline_parse_token_string_t > cmd_get_port_meter_in_proto_prio_meter =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_get_port_meter_in_proto_prio_result, meter, > "meter"); > + > +static cmdline_parse_token_string_t > cmd_get_port_meter_in_proto_prio_protocol =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_get_port_meter_in_proto_prio_result, protocol, > + "proto_prio"); > + > +static cmdline_parse_token_string_t > cmd_get_port_meter_in_proto_prio_proto =3D > + TOKEN_STRING_INITIALIZER( > + struct cmd_get_port_meter_in_proto_prio_result, proto, > + "outer_vlan#inner_vlan#outer_ip#inner_ip"); > + > +static cmdline_parse_token_num_t > cmd_get_port_meter_in_proto_prio_port_id =3D > + TOKEN_NUM_INITIALIZER( > + struct cmd_get_port_meter_in_proto_prio_result, port_id, > + RTE_UINT16); > + > +static cmdline_parse_token_num_t > cmd_get_port_meter_in_proto_prio_mtr_id =3D > + TOKEN_NUM_INITIALIZER( > + struct cmd_get_port_meter_in_proto_prio_result, mtr_id, > + RTE_UINT32); > + > +static void cmd_get_port_meter_in_proto_prio_parsed(void > *parsed_result, > + __rte_unused struct cmdline *cl, > + __rte_unused void *data) > +{ > + struct cmd_get_port_meter_in_proto_prio_result *res =3D > parsed_result; > + enum rte_mtr_color_in_protocol proto; > + struct rte_mtr_error error; > + uint32_t prio =3D 0; > + int ret; > + > + if (port_id_is_invalid(res->port_id, ENABLED_WARN)) > + return; > + > + if (strcmp(res->proto, "outer_vlan") =3D=3D 0) > + proto =3D RTE_MTR_COLOR_IN_PROTO_OUTER_VLAN; > + else if (strcmp(res->proto, "inner_vlan") =3D=3D 0) > + proto =3D RTE_MTR_COLOR_IN_PROTO_INNER_VLAN; > + else if (strcmp(res->proto, "outer_ip") =3D=3D 0) > + proto =3D RTE_MTR_COLOR_IN_PROTO_OUTER_IP; > + else if (strcmp(res->proto, "inner_ip") =3D=3D 0) > + proto =3D RTE_MTR_COLOR_IN_PROTO_INNER_IP; > + else { > + printf("Invalid protocol\n"); > + return; > + } > + > + /* Get Meter input proto and priority */ > + ret =3D rte_mtr_color_in_protocol_priority_get(res->port_id, res- > >mtr_id, > + proto, &prio, &error); > + if (ret !=3D 0) > + print_err_msg(&error); > +} > + > +cmdline_parse_inst_t cmd_get_port_meter_in_proto_prio =3D { > + .f =3D cmd_get_port_meter_in_proto_prio_parsed, > + .data =3D NULL, > + .help_str =3D "get port meter proto_prio ", > + .tokens =3D { > + (void *)&cmd_get_port_meter_in_proto_prio_get, > + (void *)&cmd_get_port_meter_in_proto_prio_port, > + (void *)&cmd_get_port_meter_in_proto_prio_meter, > + (void *)&cmd_get_port_meter_in_proto_prio_protocol, > + (void *)&cmd_get_port_meter_in_proto_prio_port_id, > + (void *)&cmd_get_port_meter_in_proto_prio_mtr_id, > + (void *)&cmd_get_port_meter_in_proto_prio_proto, > + NULL, > + }, > +}; > + > /* *** Set Port Meter Stats Mask *** */ struct > cmd_set_port_meter_stats_mask_result { > cmdline_fixed_string_t set; > diff --git a/app/test-pmd/cmdline_mtr.h b/app/test-pmd/cmdline_mtr.h > index 2415fc16c3..23eaa5bc03 100644 > --- a/app/test-pmd/cmdline_mtr.h > +++ b/app/test-pmd/cmdline_mtr.h > @@ -19,6 +19,10 @@ extern cmdline_parse_inst_t cmd_del_port_meter; > extern cmdline_parse_inst_t cmd_del_port_meter_policy; extern > cmdline_parse_inst_t cmd_set_port_meter_profile; extern > cmdline_parse_inst_t cmd_set_port_meter_dscp_table; > +extern cmdline_parse_inst_t cmd_set_port_meter_vlan_table; extern > +cmdline_parse_inst_t cmd_set_port_meter_in_proto; extern > +cmdline_parse_inst_t cmd_get_port_meter_in_proto; extern > +cmdline_parse_inst_t cmd_get_port_meter_in_proto_prio; > extern cmdline_parse_inst_t cmd_set_port_meter_stats_mask; extern > cmdline_parse_inst_t cmd_show_port_meter_stats; void > print_mtr_err_msg(struct rte_mtr_error *error); diff --git > a/doc/guides/testpmd_app_ug/testpmd_funcs.rst > b/doc/guides/testpmd_app_ug/testpmd_funcs.rst > index 0b7a53fdf1..4509a47ed4 100644 > --- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst > +++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst > @@ -2527,9 +2527,10 @@ create port meter Create new meter object for > the ethernet device:: >=20 > testpmd> create port meter (port_id) (mtr_id) (profile_id) \ > - (policy_id) (meter_enable) (stats_mask) (shared) \ > + (policy_id) (meter_enable) (stats_mask) (shared) > + (default_input_color) \ > (use_pre_meter_color) [(dscp_tbl_entry0) (dscp_tbl_entry1)...\ > - (dscp_tbl_entry63)] > + (dscp_tbl_entry63)] [(vlan_tbl_entry0) (vlan_tbl_entry1) ... \ > + (vlan_tbl_entry15)] >=20 > where: >=20 > @@ -2542,12 +2543,17 @@ where: > meter object. > * ``shared``: When this parameter has a non-zero value, the meter objec= t is > shared by multiple flows. Otherwise, meter object is used by single fl= ow. > +* ``default_input_color``: Default input color for incoming packets. > + If incoming packet misses DSCP or VLAN input color table then it will > +be used > + as input color. > * ``use_pre_meter_color``: When this parameter has a non-zero value, the > input color for the current meter object is determined by the latest m= eter > object in the same flow. Otherwise, the current meter object uses the > *dscp_table* to determine the input color. > * ``dscp_tbl_entryx``: DSCP table entry x providing meter providing inpu= t > color, 0 <=3D x <=3D 63. > +* ``vlan_tbl_entryx``: VLAN table entry x providing meter input color, > + 0 <=3D x <=3D 15. >=20 > enable port meter > ~~~~~~~~~~~~~~~~~ > @@ -2585,6 +2591,31 @@ Set meter dscp table for the ethernet device:: > testpmd> set port meter dscp table (port_id) (mtr_id) [(dscp_tbl_entr= y0) \ > (dscp_tbl_entry1)...(dscp_tbl_entry63)] >=20 > +set port meter vlan table > +~~~~~~~~~~~~~~~~~~~~~~~~~ > +Set meter vlan table for the ethernet device:: > + > + testpmd> set port meter vlan table (port_id) (mtr_id) [(vlan_tbl_entr= y0) \ > + (vlan_tbl_entry1)...(vlan_tbl_entry15)] > + > +set port meter protocol > +~~~~~~~~~~~~~~~~~~~~~~~ > +Set meter protocol and corresponding priority:: > + > + testpmd> set port meter proto (port_id) (mtr_id) (proto) (prio) > + > +get port meter protocol > +~~~~~~~~~~~~~~~~~~~~~~~ > +Get meter protocol:: > + > + testpmd> get port meter proto (port_id) (mtr_id) > + > +get port meter protocol priority > +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > +Get priority associated to meter protocol:: > + > + testpmd> get port meter proto_prio (port_id) (mtr_id) (proto) > + > set port meter stats mask > ~~~~~~~~~~~~~~~~~~~~~~~~~ >=20 > -- > 2.25.1