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 A4BBEA00C4; Tue, 26 Apr 2022 12:19:33 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 45D9C40C35; Tue, 26 Apr 2022 12:19:32 +0200 (CEST) Received: from mail-108-mta84.mxroute.com (mail-108-mta84.mxroute.com [136.175.108.84]) by mails.dpdk.org (Postfix) with ESMTP id 5D76240691 for ; Tue, 26 Apr 2022 12:19:30 +0200 (CEST) Received: from filter006.mxroute.com ([140.82.40.27] 140.82.40.27.vultrusercontent.com) (Authenticated sender: mN4UYu2MZsgR) by mail-108-mta84.mxroute.com (ZoneMTA) with ESMTPSA id 18065620b35000fe85.011 for (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES128-GCM-SHA256); Tue, 26 Apr 2022 10:19:25 +0000 X-Zone-Loop: 124f2ac52a483a67a0b6c1d0771a4b8a75915cdbd3b2 X-Originating-IP: [140.82.40.27] DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=ashroe.eu; s=x; h=Content-Type:MIME-Version:Message-ID:Date:In-reply-to:Subject:Cc:To: From:References:Sender:Reply-To:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=qhOZkQZ8kCQtnE8YSZWgeYGSfL1Sh5LaxWnoUY8y8x8=; b=LLAi9fAyhJVZPxNWfF04u1qadf IZVTwQiGYdol44dAi2iImkrxj3huUXv6QMGLkxOd07RFrboq4/ElaTcnHo6gamqsSbRpE/vWpSEtb ym6OmmQoBN80GeauuJYSEKaWkf+mO7hEjYXydH0T1jHXX4CJk34KYqdzDQsmnIGuDVH4GPlX8Q4cg GKaj+p9OOkg70MzitCBOEslJKFZQsZyADJzmQJu7WU5q7VzuXW1KbpPdQ03vpjAgP7cmcs0uehL7/ jzFcyljpWr/DDfz+oEJoH1FpFARohaljxmb+Zij+rcksXDSpq1pkYvdCsgLsyCwyZcxZ3325cAb3x FQoXtkHQ==; References: <20220301085824.1041009-1-skori@marvell.com> <20220421180241.514767-1-jerinj@marvell.com> User-agent: mu4e 1.4.15; emacs 27.1 From: Ray Kinsella To: jerinj@marvell.com Cc: dev@dpdk.org, Cristian Dumitrescu , Thomas Monjalon , Ferruh Yigit , Andrew Rybchenko , ajit.khaparde@broadcom.com, aboyer@pensando.io, beilei.xing@intel.com, bruce.richardson@intel.com, chas3@att.com, chenbo.xia@intel.com, ciara.loftus@intel.com, dsinghrawat@marvell.com, ed.czeck@atomicrules.com, evgenys@amazon.com, grive@u256.net, g.singh@nxp.com, zhouguoyang@huawei.com, haiyue.wang@intel.com, hkalra@marvell.com, heinrich.kuhn@corigine.com, hemant.agrawal@nxp.com, hyonkim@cisco.com, igorch@amazon.com, irusskikh@marvell.com, jgrajcia@cisco.com, jasvinder.singh@intel.com, jianwang@trustnetic.com, jiawenwu@trustnetic.com, jingjing.wu@intel.com, johndale@cisco.com, john.miller@atomicrules.com, linville@tuxdriver.com, keith.wiles@intel.com, kirankumark@marvell.com, oulijun@huawei.com, lironh@marvell.com, longli@microsoft.com, mw@semihalf.com, spinler@cesnet.cz, matan@nvidia.com, matt.peters@windriver.com, maxime.coquelin@redhat.com, mk@semihalf.com, humin29@huawei.com, pnalla@marvell.com, ndabilpuram@marvell.com, qiming.yang@intel.com, qi.z.zhang@intel.com, radhac@marvell.com, rahul.lakkireddy@chelsio.com, rmody@marvell.com, rosen.xu@intel.com, sachin.saxena@oss.nxp.com, skoteshwar@marvell.com, shshaikh@marvell.com, shaibran@amazon.com, shepard.siegel@atomicrules.com, asomalap@amd.com, somnath.kotur@broadcom.com, sthemmin@microsoft.com, steven.webster@windriver.com, skori@marvell.com, mtetsuyah@gmail.com, vburru@marvell.com, viacheslavo@nvidia.com, xiao.w.wang@intel.com, cloud.wangxiaoyun@huawei.com, yisen.zhuang@huawei.com, yongwang@vmware.com, xuanziyang2@huawei.com Subject: Re: [dpdk-dev] [PATCH v4] ethdev: mtr: support protocol based input color selection In-reply-to: <20220421180241.514767-1-jerinj@marvell.com> Date: Tue, 26 Apr 2022 06:19:17 -0400 Message-ID: <87ilqwm9ju.fsf@mdr78.vserver.site> MIME-Version: 1.0 Content-Type: text/plain X-AuthUser: mdr@ashroe.eu 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 jerinj@marvell.com writes: > From: Jerin Jacob > > Currently, meter object supports only DSCP based on input color table, > The patch enhance that to support VLAN based input color table, > color table based on inner field for the tunnel use case, and > support for fallback color per meter if packet based on a different field. > > All of the above features are exposed through capability and added > additional capability to specify the implementation supports > more than one input color table per ethdev port. > > Suggested-by: Cristian Dumitrescu > Signed-off-by: Jerin Jacob > --- > v4..v3: > > - Aligned with community meeting call which is documented in > https://patches.dpdk.org/project/dpdk/patch/20220301085824.1041009-1-skori@marvell.com/ > as last message. With following exception, > - Used RTE_MTR_COLOR_IN_*_DSCP instead of RTE_MTR_COLOR_IN_*_IP as > there is already dscp_table and rte_mtr_meter_dscp_table_update() API. > Changing above symbols break existing application for no good. > - Updated 22.07 release notes > - Remove testpmd changes from series to finalize the API spec first and > then we can send testpmd changes. > > v3..v2: > > - Fix input color flags as a bitmask > - Add definitions for newly added API > > v2..v1: > - Fix seperate typo > > v1..RFC: > > Address the review comments by Cristian at > https://patches.dpdk.org/project/dpdk/patch/20210820082401.3778736-1-jerinj@marvell.com/ > > - Moved to v22.07 release > - Updated rte_mtr_input_color_method to support all VLAN, DSCP, Inner > cases > - Added input_color_method > - Removed union between vlan_table and dscp_table > - Kept VLAN instead of PCP as HW coloring based on DEI(1bit), PCP(3 > bits) > > .../traffic_metering_and_policing.rst | 33 ++++ > doc/guides/rel_notes/release_22_07.rst | 10 + > lib/ethdev/rte_mtr.c | 23 +++ > lib/ethdev/rte_mtr.h | 186 +++++++++++++++++- > lib/ethdev/rte_mtr_driver.h | 19 ++ > lib/ethdev/version.map | 4 + > 6 files changed, 265 insertions(+), 10 deletions(-) > > diff --git a/doc/guides/prog_guide/traffic_metering_and_policing.rst b/doc/guides/prog_guide/traffic_metering_and_policing.rst > index ceb5a96488..75deabbaf1 100644 > --- a/doc/guides/prog_guide/traffic_metering_and_policing.rst > +++ b/doc/guides/prog_guide/traffic_metering_and_policing.rst > @@ -21,6 +21,7 @@ The main features are: > * Policer actions (per meter output color): recolor, drop > * Statistics (per policer output color) > * Chaining multiple meter objects > +* Protocol based input color selection > > Configuration steps > ------------------- > @@ -105,3 +106,35 @@ traffic meter and policing library. > * Adding one (or multiple) actions of the type ``RTE_FLOW_ACTION_TYPE_METER`` > to the list of meter actions (``struct rte_mtr_meter_policy_params::actions``) > specified per color as show in :numref:`figure_rte_mtr_chaining`. > + > +Protocol based input color selection > +------------------------------------ > + > +The API supports selecting the input color based on the packet content. > +Following is the API usage model for the same. > + > +#. Probe the protocol based input color selection device capabilities using > + following parameter using ``rte_mtr_capabilities_get()`` API. > + > + * ``struct rte_mtr_capabilities::input_color_proto_mask;`` > + * ``struct rte_mtr_capabilities::separate_input_color_table_per_port`` > + > +#. When creating the meter object using ``rte_mtr_create()``, configure > + relevant input color selection parameters such as > + > + * Input color protocols with ``struct rte_mtr_params::input_color_proto_mask`` > + > + * If ``struct rte_mtr_params::input_color_proto_mask`` has multiple bits set then > + ``rte_mtr_color_in_protocol_priority_set()`` shall be used to set the priority, > + in the order, in which protocol to be used to find the input color. > + > + * Fill the tables ``struct rte_mtr_params::dscp_table``, > + ``struct rte_mtr_params::vlan_table`` based on input color selected. > + > + * Update the ``struct rte_mtr_params::default_input_color`` to determine > + the default input color in case the input packet does not match > + the input color method. > + > + * If needed, update the input color table at runtime using > + ``rte_mtr_meter_vlan_table_update()`` and ``rte_mtr_meter_dscp_table_update()`` > + APIs. > diff --git a/doc/guides/rel_notes/release_22_07.rst b/doc/guides/rel_notes/release_22_07.rst > index 42a5f2d990..746622f9b3 100644 > --- a/doc/guides/rel_notes/release_22_07.rst > +++ b/doc/guides/rel_notes/release_22_07.rst > @@ -55,6 +55,13 @@ New Features > Also, make sure to start the actual text at the margin. > ======================================================= > > +* **Added protocol based input color for meter.** > + > + Added new APIs ``rte_mtr_color_in_protocol_priority_set()``, > + ``rte_mtr_meter_vlan_table_update()`` and updated ``struct rte_mtr_params`` > + and ``struct rte_mtr_capabilities`` to support protocol based > + input color for meter. > + > > Removed Items > ------------- > @@ -102,6 +109,9 @@ ABI Changes > > * No ABI change that would break compatibility with 21.11. > > +* Experimental structures ``struct rte_mtr_params`` > + and ``struct rte_mtr_capabilities`` updated to support > + protocol based input color for meter. > > Known Issues > ------------ > diff --git a/lib/ethdev/rte_mtr.c b/lib/ethdev/rte_mtr.c > index e49fcf271c..a112fe65f5 100644 > --- a/lib/ethdev/rte_mtr.c > +++ b/lib/ethdev/rte_mtr.c > @@ -207,6 +207,29 @@ rte_mtr_meter_dscp_table_update(uint16_t port_id, > mtr_id, dscp_table, error); > } > > +/** MTR object meter VLAN table update */ > +int > +rte_mtr_meter_vlan_table_update(uint16_t port_id, uint32_t mtr_id, > + enum rte_color *vlan_table, > + struct rte_mtr_error *error) > +{ > + struct rte_eth_dev *dev = &rte_eth_devices[port_id]; > + return RTE_MTR_FUNC(port_id, meter_vlan_table_update)(dev, > + mtr_id, vlan_table, error); > +} > + > +/** Set the priority for input color protocol on MTR object */ > +int > +rte_mtr_color_in_protocol_priority_set(uint16_t port_id, uint32_t mtr_id, > + enum rte_mtr_color_in_protocol proto, > + uint32_t priority, > + struct rte_mtr_error *error) > +{ > + struct rte_eth_dev *dev = &rte_eth_devices[port_id]; > + return RTE_MTR_FUNC(port_id, in_proto_prio_set)(dev, > + mtr_id, proto, priority, error); > +} > + > /** MTR object enabled stats update */ > int > rte_mtr_stats_update(uint16_t port_id, > diff --git a/lib/ethdev/rte_mtr.h b/lib/ethdev/rte_mtr.h > index 40df0888c8..76ffbcf724 100644 > --- a/lib/ethdev/rte_mtr.h > +++ b/lib/ethdev/rte_mtr.h > @@ -213,6 +213,52 @@ struct rte_mtr_meter_policy_params { > const struct rte_flow_action *actions[RTE_COLORS]; > }; > > +/** > + * Input color protocol method > + */ > +enum rte_mtr_color_in_protocol { > + /** > + * If the input packet has at least one VLAN label, its input color is > + * detected by the outermost VLAN DEI(1bit), PCP(3 bits) > + * indexing into the struct rte_mtr_params::vlan_table. > + * Otherwise, the *default_input_color* is applied. > + * > + * @see struct rte_mtr_params::default_input_color > + * @see struct rte_mtr_params::vlan_table > + */ > + RTE_MTR_COLOR_IN_PROTO_OUTER_VLAN = RTE_BIT64(0), > + /** > + * If the input packet has at least one VLAN label, its input color is > + * detected by the innermost VLAN DEI(1bit), PCP(3 bits) > + * indexing into the struct rte_mtr_params::vlan_table. > + * Otherwise, the *default_input_color* is applied. > + * > + * @see struct rte_mtr_params::default_input_color > + * @see struct rte_mtr_params::vlan_table > + */ > + RTE_MTR_COLOR_IN_PROTO_INNER_VLAN = RTE_BIT64(1), > + /** > + * If the input packet is IPv4 or IPv6, its input color is detected by > + * the outermost DSCP field indexing into the > + * struct rte_mtr_params::dscp_table. > + * Otherwise, the *default_input_color* is applied. > + * > + * @see struct rte_mtr_params::default_input_color > + * @see struct rte_mtr_params::dscp_table > + */ > + RTE_MTR_COLOR_IN_PROTO_OUTER_DSCP = RTE_BIT64(2), > + /** > + * If the input packet is IPv4 or IPv6, its input color is detected by > + * the innermost DSCP field indexing into the > + * struct rte_mtr_params::dscp_table. > + * Otherwise, the *default_input_color* is applied. > + * > + * @see struct rte_mtr_params::default_input_color > + * @see struct rte_mtr_params::dscp_table > + */ > + RTE_MTR_COLOR_IN_PROTO_INNER_DSCP = RTE_BIT64(3), > +}; > + > /** > * Parameters for each traffic metering & policing object > * > @@ -233,20 +279,58 @@ struct rte_mtr_params { > */ > int use_prev_mtr_color; > > - /** Meter input color. When non-NULL: it points to a pre-allocated and > + /** Meter input color based on IP DSCP protocol field. > + * > + * Valid when *input_color_proto_mask* set to any of the following > + * RTE_MTR_COLOR_IN_PROTO_OUTER_DSCP, > + * RTE_MTR_COLOR_IN_PROTO_INNER_DSCP > + * > + * When non-NULL: it points to a pre-allocated and > * pre-populated table with exactly 64 elements providing the input > * color for each value of the IPv4/IPv6 Differentiated Services Code > - * Point (DSCP) input packet field. When NULL: it is equivalent to > - * setting this parameter to an all-green populated table (i.e. table > - * with all the 64 elements set to green color). The color blind mode > - * is configured by setting *use_prev_mtr_color* to 0 and *dscp_table* > - * to either NULL or to an all-green populated table. When > - * *use_prev_mtr_color* is non-zero value or when *dscp_table* contains > - * at least one yellow or red color element, then the color aware mode > - * is configured. > + * Point (DSCP) input packet field. > + * > + * When NULL: it is equivalent to setting this parameter to an all-green > + * populated table (i.e. table with all the 64 elements set to green > + * color). The color blind mode is configured by setting > + * *use_prev_mtr_color* to 0 and *dscp_table* to either NULL or to an > + * all-green populated table. > + * > + * When *use_prev_mtr_color* is non-zero value or when *dscp_table* > + * contains at least one yellow or red color element, then the color > + * aware mode is configured. > + * > + * @see enum rte_mtr_color_in_protocol::RTE_MTR_COLOR_IN_PROTO_OUTER_DSCP > + * @see enum rte_mtr_color_in_protocol::RTE_MTR_COLOR_IN_PROTO_INNER_DSCP > + * @see struct rte_mtr_params::input_color_proto_mask > */ > enum rte_color *dscp_table; > - > + /** Meter input color based on VLAN DEI(1bit), PCP(3 bits) protocol > + * fields. > + * > + * Valid when *input_color_proto_mask* set to any of the following > + * RTE_MTR_COLOR_IN_PROTO_OUTER_VLAN, > + * RTE_MTR_COLOR_IN_PROTO_INNER_VLAN > + * > + * When non-NULL: it points to a pre-allocated and pre-populated > + * table with exactly 16 elements providing the input color for > + * each value of the DEI(1bit), PCP(3 bits) input packet field. > + * > + * When NULL: it is equivalent to setting this parameter to an > + * all-green populated table (i.e. table with > + * all the 16 elements set to green color). The color blind mode > + * is configured by setting *use_prev_mtr_color* to 0 and > + * *vlan_table* to either NULL or to an all-green populated table. > + * > + * When *use_prev_mtr_color* is non-zero value > + * or when *vlan_table* contains at least one yellow or > + * red color element, then the color aware mode is configured. > + * > + * @see enum rte_mtr_color_in_protocol::RTE_MTR_COLOR_IN_PROTO_OUTER_VLAN > + * @see enum rte_mtr_color_in_protocol::RTE_MTR_COLOR_IN_PROTO_INNER_VLAN > + * @see struct rte_mtr_params::input_color_proto_mask > + */ > + enum rte_color *vlan_table; > /** Non-zero to enable the meter, zero to disable the meter at the time > * of MTR object creation. Ignored when the meter profile indicated by > * *meter_profile_id* is set to NONE. > @@ -261,6 +345,25 @@ struct rte_mtr_params { > > /** Meter policy ID. @see rte_mtr_meter_policy_add() */ > uint32_t meter_policy_id; > + > + /** Set of input color protocols to be enabled. > + * > + * Set value to zero to configure as color blind mode. > + * > + * When multiple bits set then rte_mtr_color_in_protocol_priority_set() > + * shall be used to set the priority, in the order, in which protocol > + * to be used to find the inpput color. > + * > + * @see enum rte_mtr_color_in_protocol > + * @see rte_mtr_color_in_protocol_priority_set() > + */ > + uint64_t input_color_proto_mask; > + > + /** Input color to be set for the input packet when none of the > + * enabled input color methods is applicable to the input packet. > + * Ignored when this when *input_color_proto_mask* set to zero. > + */ > + enum rte_color default_input_color; > }; > > /** > @@ -417,6 +520,16 @@ struct rte_mtr_capabilities { > * @see enum rte_mtr_stats_type > */ > uint64_t stats_mask; > + > + /** Set of supported input color protocol. > + * @see enum rte_mtr_color_in_protocol > + */ > + uint64_t input_color_proto_mask; > + > + /** When non-zero, it indicates that driver supports separate > + * input color table for given ethdev port. > + */ > + int separate_input_color_table_per_port; > }; > > /** > @@ -832,6 +945,59 @@ rte_mtr_meter_dscp_table_update(uint16_t port_id, > enum rte_color *dscp_table, > struct rte_mtr_error *error); > > +/** > + * MTR object VLAN table update > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] mtr_id > + * MTR object ID. Needs to be valid. > + * @param[in] vlan_table > + * When non-NULL: it points to a pre-allocated and pre-populated table with > + * exactly 16 elements providing the input color for each value of the > + * each value of the DEI(1bit), PCP(3 bits) input packet field. > + * When NULL: it is equivalent to setting this parameter to an "all-green" > + * populated table (i.e. table with all the 16 elements set to green color). > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + */ > +__rte_experimental > +int > +rte_mtr_meter_vlan_table_update(uint16_t port_id, uint32_t mtr_id, > + enum rte_color *vlan_table, > + struct rte_mtr_error *error); > +/** > + * Set the priority for input color protocol > + * > + * When multiple bits set in struct rte_mtr_params::input_color_proto_mask > + * then this API shall be used to set the priority, in the order, in > + * which protocol to be used to find the input color. > + * > + * @param[in] port_id > + * The port identifier of the Ethernet device. > + * @param[in] mtr_id > + * MTR object ID. Needs to be valid. > + * @param[in] proto > + * Input color protocol to apply priority. > + * MTR object's *input_color_proto_mask* should be configured > + * with proto value. > + * @param[in] priority > + * Input color protocol priority. Value zero indicates > + * the highest priority. > + * @param[out] error > + * Error details. Filled in only on error, when not NULL. > + * @return > + * 0 on success, non-zero error code otherwise. > + * > + * @see rte_mtr_params::input_color_proto_mask > + */ > +__rte_experimental > +int > +rte_mtr_color_in_protocol_priority_set(uint16_t port_id, uint32_t mtr_id, > + enum rte_mtr_color_in_protocol proto, uint32_t priority, > + struct rte_mtr_error *error); > /** > * MTR object enabled statistics counters update > * > diff --git a/lib/ethdev/rte_mtr_driver.h b/lib/ethdev/rte_mtr_driver.h > index ee8c6ef7ad..827952adc6 100644 > --- a/lib/ethdev/rte_mtr_driver.h > +++ b/lib/ethdev/rte_mtr_driver.h > @@ -97,6 +97,19 @@ typedef int (*rte_mtr_meter_dscp_table_update_t)(struct rte_eth_dev *dev, > enum rte_color *dscp_table, > struct rte_mtr_error *error); > > +/** @internal mtr object meter vlan table update. */ > +typedef int (*rte_mtr_meter_vlan_table_update_t)(struct rte_eth_dev *dev, > + uint32_t mtr_id, > + enum rte_color *vlan_table, > + struct rte_mtr_error *error); > + > +/** @internal Set the priority for input color protocol on MTR object. */ > +typedef int (*rte_mtr_meter_color_in_proto_prio_set_t)(struct rte_eth_dev *dev, > + uint32_t mtr_id, > + enum rte_mtr_color_in_protocol proto, > + uint32_t priority, > + struct rte_mtr_error *error); > + > /** @internal MTR object enabled stats update. */ > typedef int (*rte_mtr_stats_update_t)(struct rte_eth_dev *dev, > uint32_t mtr_id, > @@ -139,6 +152,12 @@ struct rte_mtr_ops { > /** MTR object meter DSCP table update */ > rte_mtr_meter_dscp_table_update_t meter_dscp_table_update; > > + /** MTR object meter VLAN table update */ > + rte_mtr_meter_vlan_table_update_t meter_vlan_table_update; > + > + /** Set the priority for input color protocol on MTR object. */ > + rte_mtr_meter_color_in_proto_prio_set_t in_proto_prio_set; > + > /** MTR object enabled stats update */ > rte_mtr_stats_update_t stats_update; > > diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map > index 20391ab29e..cccbf6dee5 100644 > --- a/lib/ethdev/version.map > +++ b/lib/ethdev/version.map > @@ -279,6 +279,10 @@ EXPERIMENTAL { > rte_flow_async_action_handle_create; > rte_flow_async_action_handle_destroy; > rte_flow_async_action_handle_update; > + > + # added in 22.07 Symbols are not in alphabetical order. > + rte_mtr_meter_vlan_table_update; > + rte_mtr_color_in_protocol_priority_set; > }; > > INTERNAL { -- Regards, Ray K