Corresponding driver implementation is available at http://patches.dpdk.org/project/dpdk/patch/20220301090056.1042866-1-sk...@marvell.com/. Also CLI is added to testpmd for below API and available at http://patches.dpdk.org/project/dpdk/patch/20220301090056.1042866-3-sk...@marvell.com/
> -----Original Message----- > From: sk...@marvell.com <sk...@marvell.com> > Sent: Tuesday, March 1, 2022 2:28 PM > To: Cristian Dumitrescu <cristian.dumitre...@intel.com>; Thomas Monjalon > <tho...@monjalon.net>; Ferruh Yigit <ferruh.yi...@intel.com>; Andrew > Rybchenko <andrew.rybche...@oktetlabs.ru>; Ray Kinsella > <m...@ashroe.eu> > Cc: dev@dpdk.org; Jerin Jacob Kollanukkaran <jer...@marvell.com> > Subject: [EXT] [PATCH v3 1/1] ethdev: mtr: support input color selection > > External Email > > ---------------------------------------------------------------------- > From: Jerin Jacob <jer...@marvell.com> > > 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 <cristian.dumitre...@intel.com> > Signed-off-by: Jerin Jacob <jer...@marvell.com> > --- > 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://urldefense.proofpoint.com/v2/url?u=https- > 3A__patches.dpdk.org_project_dpdk_patch_20210820082401.3778736-2D1- > 2Djerinj- > 40marvell.com_&d=DwIDAg&c=nKjWec2b6R0mOyPaz7xtfQ&r=dXeXaAMkP5 > COgn1zxHMyaF1_d9IIuq6vHQO6NrIPjaE&m=bvYbz6aP4xuLPRt2TIk1o99kWXj > u-rRDvz3qXnCVbz_TER0zcRDqjQxJSm3SnLXM&s=mVeBbQWjsvJLRm-dcB4h- > KmAj3tGi4WT0E9IvsuNT2g&e= > > - 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) > > What is missing: > - 22.07 release notes update > > .../traffic_metering_and_policing.rst | 28 +++ > lib/ethdev/rte_mtr.c | 12 ++ > lib/ethdev/rte_mtr.h | 164 +++++++++++++++++- > lib/ethdev/rte_mtr_driver.h | 9 + > lib/ethdev/version.map | 3 + > 5 files changed, 214 insertions(+), 2 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..59ebd361ba 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 > +* Packet content based input color selection > > Configuration steps > ------------------- > @@ -105,3 +106,30 @@ 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`. > + > +Packet content 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 input color selection device capabilities using following > + parameter using ``rte_mtr_capabilities_get()`` API > + ``struct rte_mtr_capabilities::methods_mask`` and > + ``struct rte_mtr_capabilitie::separate_input_color_table_per_port`` > + > +#. When creating the meter object using ``rte_mtr_create()``, configure > + relevant input color selection parameters such as > + > + * Select the input color method ``struct > + rte_mtr_params::input_color_method`` > + > + * Fill the tables ``struct rte_mtr_params::dscp_table``, > + ``struct rte_mtr_params::dscp_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/lib/ethdev/rte_mtr.c b/lib/ethdev/rte_mtr.c index > e49fcf271c..a0cb91e0b1 100644 > --- a/lib/ethdev/rte_mtr.c > +++ b/lib/ethdev/rte_mtr.c > @@ -207,6 +207,18 @@ 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); > +} > + > /** 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..7f9abebb41 100644 > --- a/lib/ethdev/rte_mtr.h > +++ b/lib/ethdev/rte_mtr.h > @@ -213,6 +213,80 @@ struct rte_mtr_meter_policy_params { > const struct rte_flow_action *actions[RTE_COLORS]; }; > > +/** > + * Input color method > + */ > +enum rte_mtr_input_color_method { > + /** > + * The input color is always green. > + * The default_input_color is ignored for this method. > + * @see struct rte_mtr_params::default_input_color > + */ > + RTE_MTR_INPUT_COLOR_METHOD_COLOR_BLIND = RTE_BIT64(0), > + /** > + * 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_INPUT_COLOR_METHOD_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_INPUT_COLOR_METHOD_DSCP = RTE_BIT64(2), > + /** > + * 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. > + * 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::vlan_table > + * @see struct rte_mtr_params::dscp_table > + */ > + RTE_MTR_INPUT_COLOR_METHOD_VLAN_DSCP = RTE_BIT64(3), > + /** > + * 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_INPUT_COLOR_METHOD_INNER_VLAN = RTE_BIT64(4), > + /** > + * 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_INPUT_COLOR_METHOD_INNER_DSCP = RTE_BIT64(5), > + /** > + * 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. > + * 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::vlan_table > + * @see struct rte_mtr_params::dscp_table > + */ > + RTE_MTR_INPUT_COLOR_METHOD_INNER_VLAN_DSCP = > RTE_BIT64(6), }; > + > /** > * Parameters for each traffic metering & policing object > * > @@ -233,7 +307,15 @@ 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 field. > + * > + * Valid when input_color_method set to any of the following > + * RTE_MTR_INPUT_COLOR_METHOD_DSCP, > + * RTE_MTR_INPUT_COLOR_METHOD_VLAN_DSCP, > + * RTE_MTR_INPUT_COLOR_METHOD_INNER_DSCP, > + * RTE_MTR_INPUT_COLOR_METHOD_INNER_VLAN_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 @@ > -244,9 +326,39 @@ struct rte_mtr_params { > * *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_input_color_method::RTE_MTR_INPUT_COLOR_METHOD_DSCP > + * @see enum > rte_mtr_input_color_method::RTE_MTR_INPUT_COLOR_METHOD_VLAN_DS > CP > + * @see enum > rte_mtr_input_color_method::RTE_MTR_INPUT_COLOR_METHOD_INNER_D > SCP > + * @see enum > rte_mtr_input_color_method::RTE_MTR_INPUT_COLOR_METHOD_INNER_VL > AN_DSCP > + * @see struct rte_mtr_params::input_color_method > */ > enum rte_color *dscp_table; > - > + /** Meter input color based on VLAN DEI(1bit), PCP(3 bits) fields. > + * > + * Valid when input_color_method set to any of the following > + * RTE_MTR_INPUT_COLOR_METHOD_VLAN, > + * RTE_MTR_INPUT_COLOR_METHOD_VLAN_DSCP, > + * RTE_MTR_INPUT_COLOR_METHOD_INNER_VLAN, > + * RTE_MTR_INPUT_COLOR_METHOD_INNER_VLAN_DSCP > + * > + * 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_input_color_method::RTE_MTR_INPUT_COLOR_METHOD_VLAN > + * @see enum > rte_mtr_input_color_method::RTE_MTR_INPUT_COLOR_METHOD_VLAN_DS > CP > + * @see enum > rte_mtr_input_color_method::RTE_MTR_INPUT_COLOR_METHOD_INNER_VL > AN > + * @see enum > rte_mtr_input_color_method::RTE_MTR_INPUT_COLOR_METHOD_INNER_VL > AN_DSCP > + * @see struct rte_mtr_params::input_color_method > + */ > + 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 +373,20 @@ struct rte_mtr_params { > > /** Meter policy ID. @see rte_mtr_meter_policy_add() */ > uint32_t meter_policy_id; > + > + /** Input color method to select. > + * @see struct rte_mtr_params::dscp_table > + * @see struct rte_mtr_params::vlan_table > + */ > + enum rte_mtr_input_color_method input_color_method; > + > + /** 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 method is set to the > + * enum > rte_mtr_input_color_method::RTE_MTR_INPUT_COLOR_METHOD_COLOR_B > LIND > + * method. > + */ > + enum rte_color default_input_color; > }; > > /** > @@ -417,6 +543,16 @@ struct rte_mtr_capabilities { > * @see enum rte_mtr_stats_type > */ > uint64_t stats_mask; > + > + /** Set of supported input color methods. > + * @see enum rte_mtr_input_color_method > + */ > + uint64_t methods_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 +968,30 @@ 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); > /** > * MTR object enabled statistics counters update > * > diff --git a/lib/ethdev/rte_mtr_driver.h b/lib/ethdev/rte_mtr_driver.h index > ee8c6ef7ad..37ab79666b 100644 > --- a/lib/ethdev/rte_mtr_driver.h > +++ b/lib/ethdev/rte_mtr_driver.h > @@ -97,6 +97,12 @@ 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 MTR object enabled stats update. */ typedef int > (*rte_mtr_stats_update_t)(struct rte_eth_dev *dev, > uint32_t mtr_id, > @@ -139,6 +145,9 @@ 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; > + > /** 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..77915c0ddc 100644 > --- a/lib/ethdev/version.map > +++ b/lib/ethdev/version.map > @@ -279,6 +279,9 @@ EXPERIMENTAL { > rte_flow_async_action_handle_create; > rte_flow_async_action_handle_destroy; > rte_flow_async_action_handle_update; > + > + # added in 22.07 > + rte_mtr_meter_vlan_table_update; > }; > > INTERNAL { > -- > 2.25.1