[v3] ethdev: add tm support for shaper config in pkt mode

Message ID 20200422075948.10051-1-nithind1988@gmail.com (mailing list archive)
State Superseded, archived
Headers
Series [v3] ethdev: add tm support for shaper config in pkt mode |

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation fail Compilation issues

Commit Message

Nithin Dabilpuram April 22, 2020, 7:59 a.m. UTC
  From: Nithin Dabilpuram <ndabilpuram@marvell.com>

Some NIC hardware support shaper to work in packet mode i.e
shaping or ratelimiting traffic is in packets per second (PPS) as
opposed to default bytes per second (BPS). Hence this patch
adds support to configure shared or private shaper in packet mode,
provide rate in PPS and add related tm capabilities in port/level/node
capability structures.

This patch also updates tm port/level/node capability structures with
exiting features of scheduler wfq packet mode, scheduler wfq byte mode
and private/shared shaper byte mode.

SoftNIC PMD is also updated with new capabilities.

Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
---

v2..v3:
- Fix typo's
- Add shaper_shared_(packet, byte)_mode_supported in level and node cap
- Fix comment in pkt_length_adjust.
- Move rte_eth_softnic_tm.c capability update to patch 1/4 to 
  avoid compilations issues in node and level cap array in softnicpmd.
  ../drivers/net/softnic/rte_eth_softnic_tm.c:782:3: warning: braces around scalar initializer
   {.nonleaf = {
  ../drivers/net/softnic/rte_eth_softnic_tm.c:782:3: note: (near initialization for ‘tm_node_cap[0].shaper_shared_byte_mode_supported’)
  ../drivers/net/softnic/rte_eth_softnic_tm.c:782:4: error: field name not in record or union initializer
   {.nonleaf = {

v1..v2:
- Add seperate capability for shaper and scheduler pktmode and bytemode.
- Add packet_mode field in struct rte_tm_shaper_params to indicate
packet mode shaper profile.


 drivers/net/softnic/rte_eth_softnic_tm.c |  65 ++++++++++
 lib/librte_ethdev/rte_tm.h               | 196 ++++++++++++++++++++++++++++++-
 2 files changed, 259 insertions(+), 2 deletions(-)
  

Comments

Nithin Dabilpuram April 22, 2020, 8:09 a.m. UTC | #1
Please ignore this patch. Had issue with subject line.
Consider patch "[v3,1/4] ethdev: add tm support for shaper config in pkt mode "
instead.

On Wed, Apr 22, 2020 at 01:29:44PM +0530, Nithin Dabilpuram wrote:
> From: Nithin Dabilpuram <ndabilpuram@marvell.com>
> 
> Some NIC hardware support shaper to work in packet mode i.e
> shaping or ratelimiting traffic is in packets per second (PPS) as
> opposed to default bytes per second (BPS). Hence this patch
> adds support to configure shared or private shaper in packet mode,
> provide rate in PPS and add related tm capabilities in port/level/node
> capability structures.
> 
> This patch also updates tm port/level/node capability structures with
> exiting features of scheduler wfq packet mode, scheduler wfq byte mode
> and private/shared shaper byte mode.
> 
> SoftNIC PMD is also updated with new capabilities.
> 
> Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
> ---
> 
> v2..v3:
> - Fix typo's
> - Add shaper_shared_(packet, byte)_mode_supported in level and node cap
> - Fix comment in pkt_length_adjust.
> - Move rte_eth_softnic_tm.c capability update to patch 1/4 to 
>   avoid compilations issues in node and level cap array in softnicpmd.
>   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:3: warning: braces around scalar initializer
>    {.nonleaf = {
>   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:3: note: (near initialization for ‘tm_node_cap[0].shaper_shared_byte_mode_supported’)
>   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:4: error: field name not in record or union initializer
>    {.nonleaf = {
> 
> v1..v2:
> - Add seperate capability for shaper and scheduler pktmode and bytemode.
> - Add packet_mode field in struct rte_tm_shaper_params to indicate
> packet mode shaper profile.
> 
> 
>  drivers/net/softnic/rte_eth_softnic_tm.c |  65 ++++++++++
>  lib/librte_ethdev/rte_tm.h               | 196 ++++++++++++++++++++++++++++++-
>  2 files changed, 259 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/softnic/rte_eth_softnic_tm.c b/drivers/net/softnic/rte_eth_softnic_tm.c
> index 80a470c..344819f 100644
> --- a/drivers/net/softnic/rte_eth_softnic_tm.c
> +++ b/drivers/net/softnic/rte_eth_softnic_tm.c
> @@ -447,6 +447,8 @@ static const struct rte_tm_capabilities tm_cap = {
>  	.shaper_private_dual_rate_n_max = 0,
>  	.shaper_private_rate_min = 1,
>  	.shaper_private_rate_max = UINT32_MAX,
> +	.shaper_private_packet_mode_supported = 0,
> +	.shaper_private_byte_mode_supported = 1,
>  
>  	.shaper_shared_n_max = UINT32_MAX,
>  	.shaper_shared_n_nodes_per_shaper_max = UINT32_MAX,
> @@ -454,6 +456,8 @@ static const struct rte_tm_capabilities tm_cap = {
>  	.shaper_shared_dual_rate_n_max = 0,
>  	.shaper_shared_rate_min = 1,
>  	.shaper_shared_rate_max = UINT32_MAX,
> +	.shaper_shared_packet_mode_supported = 0,
> +	.shaper_shared_byte_mode_supported = 1,
>  
>  	.shaper_pkt_length_adjust_min = RTE_TM_ETH_FRAMING_OVERHEAD_FCS,
>  	.shaper_pkt_length_adjust_max = RTE_TM_ETH_FRAMING_OVERHEAD_FCS,
> @@ -463,6 +467,8 @@ static const struct rte_tm_capabilities tm_cap = {
>  	.sched_wfq_n_children_per_group_max = UINT32_MAX,
>  	.sched_wfq_n_groups_max = 1,
>  	.sched_wfq_weight_max = UINT32_MAX,
> +	.sched_wfq_packet_mode_supported = 0,
> +	.sched_wfq_byte_mode_supported = 1,
>  
>  	.cman_wred_packet_mode_supported = WRED_SUPPORTED,
>  	.cman_wred_byte_mode_supported = 0,
> @@ -548,13 +554,19 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = {
>  			.shaper_private_dual_rate_supported = 0,
>  			.shaper_private_rate_min = 1,
>  			.shaper_private_rate_max = UINT32_MAX,
> +			.shaper_private_packet_mode_supported = 0,
> +			.shaper_private_byte_mode_supported = 1,
>  			.shaper_shared_n_max = 0,
> +			.shaper_shared_packet_mode_supported = 0,
> +			.shaper_shared_byte_mode_supported = 0,
>  
>  			.sched_n_children_max = UINT32_MAX,
>  			.sched_sp_n_priorities_max = 1,
>  			.sched_wfq_n_children_per_group_max = UINT32_MAX,
>  			.sched_wfq_n_groups_max = 1,
>  			.sched_wfq_weight_max = 1,
> +			.sched_wfq_packet_mode_supported = 0,
> +			.sched_wfq_byte_mode_supported = 0,
>  
>  			.stats_mask = STATS_MASK_DEFAULT,
>  		} },
> @@ -572,7 +584,11 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = {
>  			.shaper_private_dual_rate_supported = 0,
>  			.shaper_private_rate_min = 1,
>  			.shaper_private_rate_max = UINT32_MAX,
> +			.shaper_private_packet_mode_supported = 0,
> +			.shaper_private_byte_mode_supported = 1,
>  			.shaper_shared_n_max = 0,
> +			.shaper_shared_packet_mode_supported = 0,
> +			.shaper_shared_byte_mode_supported = 0,
>  
>  			.sched_n_children_max = UINT32_MAX,
>  			.sched_sp_n_priorities_max = 1,
> @@ -580,9 +596,14 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = {
>  			.sched_wfq_n_groups_max = 1,
>  #ifdef RTE_SCHED_SUBPORT_TC_OV
>  			.sched_wfq_weight_max = UINT32_MAX,
> +			.sched_wfq_packet_mode_supported = 0,
> +			.sched_wfq_byte_mode_supported = 1,
>  #else
>  			.sched_wfq_weight_max = 1,
> +			.sched_wfq_packet_mode_supported = 0,
> +			.sched_wfq_byte_mode_supported = 0,
>  #endif
> +
>  			.stats_mask = STATS_MASK_DEFAULT,
>  		} },
>  	},
> @@ -599,7 +620,11 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = {
>  			.shaper_private_dual_rate_supported = 0,
>  			.shaper_private_rate_min = 1,
>  			.shaper_private_rate_max = UINT32_MAX,
> +			.shaper_private_packet_mode_supported = 0,
> +			.shaper_private_byte_mode_supported = 1,
>  			.shaper_shared_n_max = 0,
> +			.shaper_shared_packet_mode_supported = 0,
> +			.shaper_shared_byte_mode_supported = 0,
>  
>  			.sched_n_children_max =
>  				RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE,
> @@ -608,6 +633,8 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = {
>  			.sched_wfq_n_children_per_group_max = 1,
>  			.sched_wfq_n_groups_max = 0,
>  			.sched_wfq_weight_max = 1,
> +			.sched_wfq_packet_mode_supported = 0,
> +			.sched_wfq_byte_mode_supported = 0,
>  
>  			.stats_mask = STATS_MASK_DEFAULT,
>  		} },
> @@ -625,7 +652,11 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = {
>  			.shaper_private_dual_rate_supported = 0,
>  			.shaper_private_rate_min = 1,
>  			.shaper_private_rate_max = UINT32_MAX,
> +			.shaper_private_packet_mode_supported = 0,
> +			.shaper_private_byte_mode_supported = 1,
>  			.shaper_shared_n_max = 1,
> +			.shaper_shared_packet_mode_supported = 0,
> +			.shaper_shared_byte_mode_supported = 1,
>  
>  			.sched_n_children_max =
>  				RTE_SCHED_BE_QUEUES_PER_PIPE,
> @@ -634,6 +665,8 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = {
>  				RTE_SCHED_BE_QUEUES_PER_PIPE,
>  			.sched_wfq_n_groups_max = 1,
>  			.sched_wfq_weight_max = UINT32_MAX,
> +			.sched_wfq_packet_mode_supported = 0,
> +			.sched_wfq_byte_mode_supported = 1,
>  
>  			.stats_mask = STATS_MASK_DEFAULT,
>  		} },
> @@ -651,7 +684,11 @@ static const struct rte_tm_level_capabilities tm_level_cap[] = {
>  			.shaper_private_dual_rate_supported = 0,
>  			.shaper_private_rate_min = 0,
>  			.shaper_private_rate_max = 0,
> +			.shaper_private_packet_mode_supported = 0,
> +			.shaper_private_byte_mode_supported = 0,
>  			.shaper_shared_n_max = 0,
> +			.shaper_shared_packet_mode_supported = 0,
> +			.shaper_shared_byte_mode_supported = 0,
>  
>  			.cman_head_drop_supported = 0,
>  			.cman_wred_packet_mode_supported = WRED_SUPPORTED,
> @@ -736,7 +773,11 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = {
>  		.shaper_private_dual_rate_supported = 0,
>  		.shaper_private_rate_min = 1,
>  		.shaper_private_rate_max = UINT32_MAX,
> +		.shaper_private_packet_mode_supported = 0,
> +		.shaper_private_byte_mode_supported = 1,
>  		.shaper_shared_n_max = 0,
> +		.shaper_shared_packet_mode_supported = 0,
> +		.shaper_shared_byte_mode_supported = 0,
>  
>  		{.nonleaf = {
>  			.sched_n_children_max = UINT32_MAX,
> @@ -744,6 +785,8 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = {
>  			.sched_wfq_n_children_per_group_max = UINT32_MAX,
>  			.sched_wfq_n_groups_max = 1,
>  			.sched_wfq_weight_max = 1,
> +			.sched_wfq_packet_mode_supported = 0,
> +			.sched_wfq_byte_mode_supported = 0,
>  		} },
>  
>  		.stats_mask = STATS_MASK_DEFAULT,
> @@ -754,7 +797,11 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = {
>  		.shaper_private_dual_rate_supported = 0,
>  		.shaper_private_rate_min = 1,
>  		.shaper_private_rate_max = UINT32_MAX,
> +		.shaper_private_packet_mode_supported = 0,
> +		.shaper_private_byte_mode_supported = 1,
>  		.shaper_shared_n_max = 0,
> +		.shaper_shared_packet_mode_supported = 0,
> +		.shaper_shared_byte_mode_supported = 0,
>  
>  		{.nonleaf = {
>  			.sched_n_children_max = UINT32_MAX,
> @@ -762,6 +809,8 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = {
>  			.sched_wfq_n_children_per_group_max = UINT32_MAX,
>  			.sched_wfq_n_groups_max = 1,
>  			.sched_wfq_weight_max = UINT32_MAX,
> +			.sched_wfq_packet_mode_supported = 0,
> +			.sched_wfq_byte_mode_supported = 0,
>  		} },
>  
>  		.stats_mask = STATS_MASK_DEFAULT,
> @@ -772,7 +821,11 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = {
>  		.shaper_private_dual_rate_supported = 0,
>  		.shaper_private_rate_min = 1,
>  		.shaper_private_rate_max = UINT32_MAX,
> +		.shaper_private_packet_mode_supported = 0,
> +		.shaper_private_byte_mode_supported = 1,
>  		.shaper_shared_n_max = 0,
> +		.shaper_shared_packet_mode_supported = 0,
> +		.shaper_shared_byte_mode_supported = 0,
>  
>  		{.nonleaf = {
>  			.sched_n_children_max =
> @@ -782,6 +835,8 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = {
>  			.sched_wfq_n_children_per_group_max = 1,
>  			.sched_wfq_n_groups_max = 0,
>  			.sched_wfq_weight_max = 1,
> +			.sched_wfq_packet_mode_supported = 0,
> +			.sched_wfq_byte_mode_supported = 0,
>  		} },
>  
>  		.stats_mask = STATS_MASK_DEFAULT,
> @@ -792,7 +847,11 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = {
>  		.shaper_private_dual_rate_supported = 0,
>  		.shaper_private_rate_min = 1,
>  		.shaper_private_rate_max = UINT32_MAX,
> +		.shaper_private_packet_mode_supported = 0,
> +		.shaper_private_byte_mode_supported = 1,
>  		.shaper_shared_n_max = 1,
> +		.shaper_shared_packet_mode_supported = 0,
> +		.shaper_shared_byte_mode_supported = 1,
>  
>  		{.nonleaf = {
>  			.sched_n_children_max =
> @@ -802,6 +861,8 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = {
>  				RTE_SCHED_BE_QUEUES_PER_PIPE,
>  			.sched_wfq_n_groups_max = 1,
>  			.sched_wfq_weight_max = UINT32_MAX,
> +			.sched_wfq_packet_mode_supported = 0,
> +			.sched_wfq_byte_mode_supported = 1,
>  		} },
>  
>  		.stats_mask = STATS_MASK_DEFAULT,
> @@ -812,7 +873,11 @@ static const struct rte_tm_node_capabilities tm_node_cap[] = {
>  		.shaper_private_dual_rate_supported = 0,
>  		.shaper_private_rate_min = 0,
>  		.shaper_private_rate_max = 0,
> +		.shaper_private_packet_mode_supported = 0,
> +		.shaper_private_byte_mode_supported = 0,
>  		.shaper_shared_n_max = 0,
> +		.shaper_shared_packet_mode_supported = 0,
> +		.shaper_shared_byte_mode_supported = 0,
>  
>  
>  		{.leaf = {
> diff --git a/lib/librte_ethdev/rte_tm.h b/lib/librte_ethdev/rte_tm.h
> index f9c0cf3..b3865af 100644
> --- a/lib/librte_ethdev/rte_tm.h
> +++ b/lib/librte_ethdev/rte_tm.h
> @@ -250,6 +250,23 @@ struct rte_tm_capabilities {
>  	 */
>  	uint64_t shaper_private_rate_max;
>  
> +	/** Shaper private packet mode supported. When non-zero, this parameter
> +	 * indicates that there is at least one node that can be configured
> +	 * with packet mode in it's private shaper. When shaper is configured
> +	 * in packet mode, committed/peak rate provided is interpreted
> +	 * in packets per second.
> +	 */
> +	int shaper_private_packet_mode_supported;
> +
> +	/** Shaper private byte mode supported. When non-zero, this parameter
> +	 * indicates that there is at least one node that can be configured
> +	 * with byte mode in it's private shaper. When shaper is configured
> +	 * in byte mode, committed/peak rate provided is interpreted in
> +	 * bytes per second.
> +	 */
> +	int shaper_private_byte_mode_supported;
> +
> +
>  	/** Maximum number of shared shapers. The value of zero indicates that
>  	 * shared shapers are not supported.
>  	 */
> @@ -284,6 +301,21 @@ struct rte_tm_capabilities {
>  	 */
>  	uint64_t shaper_shared_rate_max;
>  
> +	/** Shaper shared packet mode supported. When non-zero, this parameter
> +	 * indicates a shared shaper can be configured with packet mode.
> +	 * When shared shaper is configured in packet mode, committed/peak rate
> +	 * provided is interpreted in packets per second.
> +	 */
> +	int shaper_shared_packet_mode_supported;
> +
> +	/** Shaper shared byte mode supported. When non-zero, this parameter
> +	 * indicates that a shared shaper can be configured with byte mode.
> +	 * When shared shaper is configured in byte mode, committed/peak rate
> +	 * provided is interpreted in bytes per second.
> +	 */
> +	int shaper_shared_byte_mode_supported;
> +
> +
>  	/** Minimum value allowed for packet length adjustment for any private
>  	 * or shared shaper.
>  	 */
> @@ -339,6 +371,22 @@ struct rte_tm_capabilities {
>  	 */
>  	uint32_t sched_wfq_weight_max;
>  
> +	/** WFQ packet mode supported. When non-zero, this parameter indicates
> +	 * that there is at least one non-leaf node that supports packet mode
> +	 * for WFQ among it's children. WFQ weights will be applied against
> +	 * packet count for scheduling children when a non-leaf node
> +	 * is configured appropriately.
> +	 */
> +	int sched_wfq_packet_mode_supported;
> +
> +	/** WFQ byte mode supported. When non-zero, this parameter indicates
> +	 * that there is at least one non-leaf node that supports byte mode
> +	 * for WFQ among it's children. WFQ weights will be applied against
> +	 * bytes for scheduling children when a non-leaf node is configured
> +	 * appropriately.
> +	 */
> +	int sched_wfq_byte_mode_supported;
> +
>  	/** WRED packet mode support. When non-zero, this parameter indicates
>  	 * that there is at least one leaf node that supports the WRED packet
>  	 * mode, which might not be true for all the leaf nodes. In packet
> @@ -485,6 +533,24 @@ struct rte_tm_level_capabilities {
>  			 */
>  			uint64_t shaper_private_rate_max;
>  
> +			/** Shaper private packet mode supported. When non-zero,
> +			 * this parameter indicates there is at least one
> +			 * non-leaf node at this level that can be configured
> +			 * with packet mode in it's private shaper. When private
> +			 * shaper is configured in packet mode, committed/peak
> +			 * rate provided is interpreted in packets per second.
> +			 */
> +			int shaper_private_packet_mode_supported;
> +
> +			/** Shaper private byte mode supported. When non-zero,
> +			 * this parameter indicates there is at least one
> +			 * non-leaf node at this level that can be configured
> +			 * with byte mode in it's private shaper. When private
> +			 * shaper is configured in byte mode, committed/peak
> +			 * rate provided is interpreted in bytes per second.
> +			 */
> +			int shaper_private_byte_mode_supported;
> +
>  			/** Maximum number of shared shapers that any non-leaf
>  			 * node on this level can be part of. The value of zero
>  			 * indicates that shared shapers are not supported by
> @@ -495,6 +561,20 @@ struct rte_tm_level_capabilities {
>  			 */
>  			uint32_t shaper_shared_n_max;
>  
> +			/** Shaper shared packet mode supported. When non-zero,
> +			 * this parameter indicates that there is at least one
> +			 * non-leaf node on this level that can be part of
> +			 * shared shapers which work in packet mode.
> +			 */
> +			int shaper_shared_packet_mode_supported;
> +
> +			/** Shaper shared byte mode supported. When non-zero,
> +			 * this parameter indicates that there is at least one
> +			 * non-leaf node on this level that can be part of
> +			 * shared shapers which work in byte mode.
> +			 */
> +			int shaper_shared_byte_mode_supported;
> +
>  			/** Maximum number of children nodes. This parameter
>  			 * indicates that there is at least one non-leaf node on
>  			 * this level that can be configured with this many
> @@ -554,6 +634,25 @@ struct rte_tm_level_capabilities {
>  			 */
>  			uint32_t sched_wfq_weight_max;
>  
> +			/** WFQ packet mode supported. When non-zero, this
> +			 * parameter indicates that there is at least one
> +			 * non-leaf node at this level that supports packet
> +			 * mode for WFQ among it's children. WFQ weights will
> +			 * be applied against packet count for scheduling
> +			 * children when a non-leaf node is configured
> +			 * appropriately.
> +			 */
> +			int sched_wfq_packet_mode_supported;
> +
> +			/** WFQ byte mode supported. When non-zero, this
> +			 * parameter indicates that there is at least one
> +			 * non-leaf node at this level that supports byte
> +			 * mode for WFQ among it's children. WFQ weights will
> +			 * be applied against bytes for scheduling children
> +			 * when a non-leaf node is configured appropriately.
> +			 */
> +			int sched_wfq_byte_mode_supported;
> +
>  			/** Mask of statistics counter types supported by the
>  			 * non-leaf nodes on this level. Every supported
>  			 * statistics counter type is supported by at least one
> @@ -596,6 +695,24 @@ struct rte_tm_level_capabilities {
>  			 */
>  			uint64_t shaper_private_rate_max;
>  
> +			/** Shaper private packet mode supported. When non-zero,
> +			 * this parameter indicates there is at least one leaf
> +			 * node at this level that can be configured with
> +			 * packet mode in it's private shaper. When private
> +			 * shaper is configured in packet mode, committed/peak
> +			 * rate provided is interpreted in packets per second.
> +			 */
> +			int shaper_private_packet_mode_supported;
> +
> +			/** Shaper private byte mode supported. When non-zero,
> +			 * this parameter indicates there is at least one leaf
> +			 * node at this level that can be configured with
> +			 * byte mode in it's private shaper. When private shaper
> +			 * is configured in byte mode, committed/peak rate
> +			 * provided is interpreted in bytes per second.
> +			 */
> +			int shaper_private_byte_mode_supported;
> +
>  			/** Maximum number of shared shapers that any leaf node
>  			 * on this level can be part of. The value of zero
>  			 * indicates that shared shapers are not supported by
> @@ -606,6 +723,20 @@ struct rte_tm_level_capabilities {
>  			 */
>  			uint32_t shaper_shared_n_max;
>  
> +			/** Shaper shared packet mode supported. When non-zero,
> +			 * this parameter indicates that there is at least one
> +			 * leaf node on this level that can be part of
> +			 * shared shapers which work in packet mode.
> +			 */
> +			int shaper_shared_packet_mode_supported;
> +
> +			/** Shaper shared byte mode supported. When non-zero,
> +			 * this parameter indicates that there is at least one
> +			 * leaf node on this level that can be part of
> +			 * shared shapers which work in byte mode.
> +			 */
> +			int shaper_shared_byte_mode_supported;
> +
>  			/** WRED packet mode support. When non-zero, this
>  			 * parameter indicates that there is at least one leaf
>  			 * node on this level that supports the WRED packet
> @@ -686,12 +817,38 @@ struct rte_tm_node_capabilities {
>  	 */
>  	uint64_t shaper_private_rate_max;
>  
> +	/** Shaper private packet mode supported. When non-zero, this parameter
> +	 * indicates private shaper of current node can be configured with
> +	 * packet mode. When configured in packet mode, committed/peak rate
> +	 * provided is interpreted in packets per second.
> +	 */
> +	int shaper_private_packet_mode_supported;
> +
> +	/** Shaper private byte mode supported. When non-zero, this parameter
> +	 * indicates private shaper of current node can be configured with
> +	 * byte mode. When configured in byte mode, committed/peak rate
> +	 * provided is interpreted in bytes per second.
> +	 */
> +	int shaper_private_byte_mode_supported;
> +
>  	/** Maximum number of shared shapers the current node can be part of.
>  	 * The value of zero indicates that shared shapers are not supported by
>  	 * the current node.
>  	 */
>  	uint32_t shaper_shared_n_max;
>  
> +	/** Shaper shared packet mode supported. When non-zero,
> +	 * this parameter indicates that current node can be part of
> +	 * shared shapers which work in packet mode.
> +	 */
> +	int shaper_shared_packet_mode_supported;
> +
> +	/** Shaper shared byte mode supported. When non-zero,
> +	 * this parameter indicates that current node can be part of
> +	 * shared shapers which work in byte mode.
> +	 */
> +	int shaper_shared_byte_mode_supported;
> +
>  	RTE_STD_C11
>  	union {
>  		/** Items valid only for non-leaf nodes. */
> @@ -735,6 +892,23 @@ struct rte_tm_node_capabilities {
>  			 * WFQ weight, so WFQ is reduced to FQ.
>  			 */
>  			uint32_t sched_wfq_weight_max;
> +
> +			/** WFQ packet mode supported. When non-zero, this
> +			 * parameter indicates that current node supports packet
> +			 * mode for WFQ among it's children. WFQ weights will be
> +			 * applied against packet count for scheduling children
> +			 * when configured appropriately.
> +			 */
> +			int sched_wfq_packet_mode_supported;
> +
> +			/** WFQ byte mode supported. When non-zero, this
> +			 * parameter indicates that current node supports byte
> +			 * mode for WFQ among it's children. WFQ weights will be
> +			 * applied against  bytes for scheduling children when
> +			 * configured appropriately.
> +			 */
> +			int sched_wfq_byte_mode_supported;
> +
>  		} nonleaf;
>  
>  		/** Items valid only for leaf nodes. */
> @@ -836,10 +1010,10 @@ struct rte_tm_wred_params {
>   * Token bucket
>   */
>  struct rte_tm_token_bucket {
> -	/** Token bucket rate (bytes per second) */
> +	/** Token bucket rate (bytes per second or packets per second) */
>  	uint64_t rate;
>  
> -	/** Token bucket size (bytes), a.k.a. max burst size */
> +	/** Token bucket size (bytes or packets), a.k.a. max burst size */
>  	uint64_t size;
>  };
>  
> @@ -860,6 +1034,11 @@ struct rte_tm_token_bucket {
>   * Dual rate shapers use both the committed and the peak token buckets. The
>   * rate of the peak bucket has to be bigger than zero, as well as greater than
>   * or equal to the rate of the committed bucket.
> + *
> + * @see struct rte_tm_capabilities::shaper_private_packet_mode_supported
> + * @see struct rte_tm_capabilities::shaper_private_byte_mode_supported
> + * @see struct rte_tm_capabilities::shaper_shared_packet_mode_supported
> + * @see struct rte_tm_capabilities::shaper_shared_byte_mode_supported
>   */
>  struct rte_tm_shaper_params {
>  	/** Committed token bucket */
> @@ -872,8 +1051,19 @@ struct rte_tm_shaper_params {
>  	 * purpose of shaping. Can be used to correct the packet length with
>  	 * the framing overhead bytes that are also consumed on the wire (e.g.
>  	 * RTE_TM_ETH_FRAMING_OVERHEAD_FCS).
> +	 * This field is ignored when the profile enables packet mode.
>  	 */
>  	int32_t pkt_length_adjust;
> +
> +	/** When zero, the private or shared shaper that is associated to this
> +	 * profile works in byte mode and hence *rate* and *size* fields in
> +	 * both token bucket configurations are specified in bytes per second
> +	 * and bytes respectively.
> +	 * When non-zero, that private or shared shaper works in packet mode and
> +	 * hence *rate* and *size* fields in both token bucket configurations
> +	 * are specified in packets per second and packets respectively.
> +	 */
> +	int packet_mode;
>  };
>  
>  /**
> @@ -925,6 +1115,8 @@ struct rte_tm_node_params {
>  			 * When non-NULL, it points to a pre-allocated array of
>  			 * *n_sp_priorities* values, with non-zero value for
>  			 * byte-mode and zero for packet-mode.
> +			 * @see struct rte_tm_node_capabilities::sched_wfq_packet_mode_supported
> +			 * @see struct rte_tm_node_capabilities::sched_wfq_byte_mode_supported
>  			 */
>  			int *wfq_weight_mode;
>  
> -- 
> 2.8.4
>
  
Cristian Dumitrescu April 22, 2020, 10:10 a.m. UTC | #2
Hi Nithin,

> -----Original Message-----
> From: Nithin Dabilpuram <nithind1988@gmail.com>
> Sent: Wednesday, April 22, 2020 9:00 AM
> To: Singh, Jasvinder <jasvinder.singh@intel.com>; Dumitrescu, Cristian
> <cristian.dumitrescu@intel.com>; Thomas Monjalon
> <thomas@monjalon.net>; Yigit, Ferruh <ferruh.yigit@intel.com>; Andrew
> Rybchenko <arybchenko@solarflare.com>
> Cc: dev@dpdk.org; jerinj@marvell.com; kkanas@marvell.com; Nithin
> Dabilpuram <ndabilpuram@marvell.com>
> Subject: [PATCH v3] ethdev: add tm support for shaper config in pkt mode
> 
> From: Nithin Dabilpuram <ndabilpuram@marvell.com>
> 
> Some NIC hardware support shaper to work in packet mode i.e
> shaping or ratelimiting traffic is in packets per second (PPS) as
> opposed to default bytes per second (BPS). Hence this patch
> adds support to configure shared or private shaper in packet mode,
> provide rate in PPS and add related tm capabilities in port/level/node
> capability structures.
> 
> This patch also updates tm port/level/node capability structures with
> exiting features of scheduler wfq packet mode, scheduler wfq byte mode
> and private/shared shaper byte mode.
> 
> SoftNIC PMD is also updated with new capabilities.
> 
> Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
> ---
> 
> v2..v3:
> - Fix typo's
> - Add shaper_shared_(packet, byte)_mode_supported in level and node cap
> - Fix comment in pkt_length_adjust.
> - Move rte_eth_softnic_tm.c capability update to patch 1/4 to
>   avoid compilations issues in node and level cap array in softnicpmd.
>   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:3: warning: braces around
> scalar initializer
>    {.nonleaf = {
>   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:3: note: (near initialization
> for ‘tm_node_cap[0].shaper_shared_byte_mode_supported’)
>   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:4: error: field name not in
> record or union initializer
>    {.nonleaf = {
> 
> v1..v2:
> - Add seperate capability for shaper and scheduler pktmode and bytemode.
> - Add packet_mode field in struct rte_tm_shaper_params to indicate
> packet mode shaper profile.
> 
> 
>  drivers/net/softnic/rte_eth_softnic_tm.c |  65 ++++++++++
>  lib/librte_ethdev/rte_tm.h               | 196
> ++++++++++++++++++++++++++++++-
>  2 files changed, 259 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/softnic/rte_eth_softnic_tm.c
> b/drivers/net/softnic/rte_eth_softnic_tm.c
> index 80a470c..344819f 100644
> --- a/drivers/net/softnic/rte_eth_softnic_tm.c
> +++ b/drivers/net/softnic/rte_eth_softnic_tm.c

<snip>...

The softnic changes logically belong to a separate patch. I understand you are getting some build warnings, but it does not make sense to me. Are you sure there is no other way to avoid them?

You are not checking that packet_mode is set to 0. Please add a check in function shaper_profile_check() (file rte_eth_softnic_tm.c) to verify that packet_mode is always set to 0.

Jasvinder, any other changes we need in Soft NIC?

> diff --git a/lib/librte_ethdev/rte_tm.h b/lib/librte_ethdev/rte_tm.h
> index f9c0cf3..b3865af 100644
> --- a/lib/librte_ethdev/rte_tm.h
> +++ b/lib/librte_ethdev/rte_tm.h

I am now fine with your additions to this file, with some minor exceptions listed below. Thank you!

> @@ -250,6 +250,23 @@ struct rte_tm_capabilities {
>  	 */
>  	uint64_t shaper_private_rate_max;
> 
> +	/** Shaper private packet mode supported. When non-zero, this
> parameter
> +	 * indicates that there is at least one node that can be configured
> +	 * with packet mode in it's private shaper. When shaper is configured

Recurring typo: it's -> its

Please search for all occurrences of "it's", all should be replaced with either "its" or "it is", we should have absolutely no occurrence of "it's".

<snip>...

> 
> @@ -860,6 +1034,11 @@ struct rte_tm_token_bucket {
>   * Dual rate shapers use both the committed and the peak token buckets.
> The
>   * rate of the peak bucket has to be bigger than zero, as well as greater than
>   * or equal to the rate of the committed bucket.
> + *
> + * @see struct
> rte_tm_capabilities::shaper_private_packet_mode_supported
> + * @see struct rte_tm_capabilities::shaper_private_byte_mode_supported
> + * @see struct
> rte_tm_capabilities::shaper_shared_packet_mode_supported
> + * @see struct rte_tm_capabilities::shaper_shared_byte_mode_supported
>   */
>  struct rte_tm_shaper_params {
>  	/** Committed token bucket */
> @@ -872,8 +1051,19 @@ struct rte_tm_shaper_params {
>  	 * purpose of shaping. Can be used to correct the packet length with
>  	 * the framing overhead bytes that are also consumed on the wire
> (e.g.
>  	 * RTE_TM_ETH_FRAMING_OVERHEAD_FCS).
> +	 * This field is ignored when the profile enables packet mode.
>  	 */
>  	int32_t pkt_length_adjust;
> +
> +	/** When zero, the private or shared shaper that is associated to this
> +	 * profile works in byte mode and hence *rate* and *size* fields in
> +	 * both token bucket configurations are specified in bytes per second
> +	 * and bytes respectively.
> +	 * When non-zero, that private or shared shaper works in packet
> mode and
> +	 * hence *rate* and *size* fields in both token bucket configurations
> +	 * are specified in packets per second and packets respectively.
> +	 */
> +	int packet_mode;
>  };

I would like to simplify this comment a bit. The reference to a shaper being associated with a profile might be confusing, as some people might incorrectly read there is a 1:1 association between shaper and profile, etc; this is described in mode details in the comment at the top of this structure. I would avoid any mentions of objects outside of the current structure.

I would phrase it like: "When zero, the byte mode is enabled for the current profile, so the *rate* and *size* fields in both the committed and peak token buckets are specified in bytes per second and bytes, respectively. When non-zero, the packet mode is enabled for the current profile, so the *rate* and *size* fields in both the committed and peak token buckets are specified in packets per second and packets, respectively. ". Is this OK with you?

Please also add the links to the relevant capabilities: @see struct rte_tm_node_capabilities::XYZ.


Regards,
Cristian
  
Nithin Dabilpuram April 22, 2020, 11:31 a.m. UTC | #3
On Wed, Apr 22, 2020 at 10:10:47AM +0000, Dumitrescu, Cristian wrote:
> External Email
> 
> ----------------------------------------------------------------------
> Hi Nithin,
> 
> > -----Original Message-----
> > From: Nithin Dabilpuram <nithind1988@gmail.com>
> > Sent: Wednesday, April 22, 2020 9:00 AM
> > To: Singh, Jasvinder <jasvinder.singh@intel.com>; Dumitrescu, Cristian
> > <cristian.dumitrescu@intel.com>; Thomas Monjalon
> > <thomas@monjalon.net>; Yigit, Ferruh <ferruh.yigit@intel.com>; Andrew
> > Rybchenko <arybchenko@solarflare.com>
> > Cc: dev@dpdk.org; jerinj@marvell.com; kkanas@marvell.com; Nithin
> > Dabilpuram <ndabilpuram@marvell.com>
> > Subject: [PATCH v3] ethdev: add tm support for shaper config in pkt mode
> > 
> > From: Nithin Dabilpuram <ndabilpuram@marvell.com>
> > 
> > Some NIC hardware support shaper to work in packet mode i.e
> > shaping or ratelimiting traffic is in packets per second (PPS) as
> > opposed to default bytes per second (BPS). Hence this patch
> > adds support to configure shared or private shaper in packet mode,
> > provide rate in PPS and add related tm capabilities in port/level/node
> > capability structures.
> > 
> > This patch also updates tm port/level/node capability structures with
> > exiting features of scheduler wfq packet mode, scheduler wfq byte mode
> > and private/shared shaper byte mode.
> > 
> > SoftNIC PMD is also updated with new capabilities.
> > 
> > Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
> > ---
> > 
> > v2..v3:
> > - Fix typo's
> > - Add shaper_shared_(packet, byte)_mode_supported in level and node cap
> > - Fix comment in pkt_length_adjust.
> > - Move rte_eth_softnic_tm.c capability update to patch 1/4 to
> >   avoid compilations issues in node and level cap array in softnicpmd.
> >   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:3: warning: braces around
> > scalar initializer
> >    {.nonleaf = {
> >   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:3: note: (near initialization
> > for ‘tm_node_cap[0].shaper_shared_byte_mode_supported’)
> >   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:4: error: field name not in
> > record or union initializer
> >    {.nonleaf = {
> > 
> > v1..v2:
> > - Add seperate capability for shaper and scheduler pktmode and bytemode.
> > - Add packet_mode field in struct rte_tm_shaper_params to indicate
> > packet mode shaper profile.
> > 
> > 
> >  drivers/net/softnic/rte_eth_softnic_tm.c |  65 ++++++++++
> >  lib/librte_ethdev/rte_tm.h               | 196
> > ++++++++++++++++++++++++++++++-
> >  2 files changed, 259 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/net/softnic/rte_eth_softnic_tm.c
> > b/drivers/net/softnic/rte_eth_softnic_tm.c
> > index 80a470c..344819f 100644
> > --- a/drivers/net/softnic/rte_eth_softnic_tm.c
> > +++ b/drivers/net/softnic/rte_eth_softnic_tm.c
> 
> <snip>...
> 
> The softnic changes logically belong to a separate patch. I understand you are getting some build warnings, but it does not make sense to me. Are you sure there is no other way to avoid them?
I see error only because of v3 changes in node cap. There seems to be some gcc
issue with order of initializations only when next field is union. I tried both
gcc 4.8.5 and 7.3.1

struct test {                                            
        int a;                                           
        char b;                                          
        int c;                                           
        union {                                          
                int d;                                   
        };                                               

};                                                       

struct test ds1 = {                                      
        .a = 10,                                         
        .b = 20,                                         
        {                                                
                .d = 40,                                 
        }                                                
};                                                       

int main(void)                                           
{                                                        
        printf("ds1.a %d\n", ds1.a);                     
}                                                        
[root@hyd1588t430 dpdk]# make a                          
cc     a.c   -o a                                        
a.c:20:2: warning: braces around scalar initializer [enabled by default] 
  {                                                      
  ^
a.c:20:2: warning: (near initialization for ‘ds1.c’) [enabled by default]
a.c:21:3: error: field name not in record or union initializer           
   .d = 40,                                              
   ^
a.c:21:3: error: (near initialization for ‘ds1.c’)       
make: *** [a] Error 1                                    

I don't see any issue if 'd' is not inside a union.

Similar issue is reported in kernel and similar fix was applied of initializing all the fields.
https://patchwork.kernel.org/patch/3033041/

> 
> You are not checking that packet_mode is set to 0. Please add a check in function shaper_profile_check() (file rte_eth_softnic_tm.c) to verify that packet_mode is always set to 0.
Ack.
> 
> Jasvinder, any other changes we need in Soft NIC?
> 
> > diff --git a/lib/librte_ethdev/rte_tm.h b/lib/librte_ethdev/rte_tm.h
> > index f9c0cf3..b3865af 100644
> > --- a/lib/librte_ethdev/rte_tm.h
> > +++ b/lib/librte_ethdev/rte_tm.h
> 
> I am now fine with your additions to this file, with some minor exceptions listed below. Thank you!
> 
> > @@ -250,6 +250,23 @@ struct rte_tm_capabilities {
> >  	 */
> >  	uint64_t shaper_private_rate_max;
> > 
> > +	/** Shaper private packet mode supported. When non-zero, this
> > parameter
> > +	 * indicates that there is at least one node that can be configured
> > +	 * with packet mode in it's private shaper. When shaper is configured
> 
> Recurring typo: it's -> its
> 
> Please search for all occurrences of "it's", all should be replaced with either "its" or "it is", we should have absolutely no occurrence of "it's".
Ack. My bad, I misunderstood earlier comment. Will fix in v4.
> 
> <snip>...
> 
> > 
> > @@ -860,6 +1034,11 @@ struct rte_tm_token_bucket {
> >   * Dual rate shapers use both the committed and the peak token buckets.
> > The
> >   * rate of the peak bucket has to be bigger than zero, as well as greater than
> >   * or equal to the rate of the committed bucket.
> > + *
> > + * @see struct
> > rte_tm_capabilities::shaper_private_packet_mode_supported
> > + * @see struct rte_tm_capabilities::shaper_private_byte_mode_supported
> > + * @see struct
> > rte_tm_capabilities::shaper_shared_packet_mode_supported
> > + * @see struct rte_tm_capabilities::shaper_shared_byte_mode_supported
> >   */
> >  struct rte_tm_shaper_params {
> >  	/** Committed token bucket */
> > @@ -872,8 +1051,19 @@ struct rte_tm_shaper_params {
> >  	 * purpose of shaping. Can be used to correct the packet length with
> >  	 * the framing overhead bytes that are also consumed on the wire
> > (e.g.
> >  	 * RTE_TM_ETH_FRAMING_OVERHEAD_FCS).
> > +	 * This field is ignored when the profile enables packet mode.
> >  	 */
> >  	int32_t pkt_length_adjust;
> > +
> > +	/** When zero, the private or shared shaper that is associated to this
> > +	 * profile works in byte mode and hence *rate* and *size* fields in
> > +	 * both token bucket configurations are specified in bytes per second
> > +	 * and bytes respectively.
> > +	 * When non-zero, that private or shared shaper works in packet
> > mode and
> > +	 * hence *rate* and *size* fields in both token bucket configurations
> > +	 * are specified in packets per second and packets respectively.
> > +	 */
> > +	int packet_mode;
> >  };
> 
> I would like to simplify this comment a bit. The reference to a shaper being associated with a profile might be confusing, as some people might incorrectly read there is a 1:1 association between shaper and profile, etc; this is described in mode details in the comment at the top of this structure. I would avoid any mentions of objects outside of the current structure.
> 
> I would phrase it like: "When zero, the byte mode is enabled for the current profile, so the *rate* and *size* fields in both the committed and peak token buckets are specified in bytes per second and bytes, respectively. When non-zero, the packet mode is enabled for the current profile, so the *rate* and *size* fields in both the committed and peak token buckets are specified in packets per second and packets, respectively. ". Is this OK with you?
Ack.
> 
> Please also add the links to the relevant capabilities: @see struct rte_tm_node_capabilities::XYZ.
Ack.
> 
> 
> Regards,
> Cristian
  
Nithin Dabilpuram April 22, 2020, 11:49 a.m. UTC | #4
> Please also add the links to the relevant capabilities: @see struct
> rte_tm_node_capabilities::XYZ.

This is already added for packet_mode field in descrption of struct
rte_tm_shaper_params similar to struct rte_tm_wred_params.
Do you see anything missing ?

On Wed, Apr 22, 2020 at 05:01:46PM +0530, Nithin Dabilpuram wrote:
> On Wed, Apr 22, 2020 at 10:10:47AM +0000, Dumitrescu, Cristian wrote:
> > External Email
> > 
> > ----------------------------------------------------------------------
> > Hi Nithin,
> > 
> > > -----Original Message-----
> > > From: Nithin Dabilpuram <nithind1988@gmail.com>
> > > Sent: Wednesday, April 22, 2020 9:00 AM
> > > To: Singh, Jasvinder <jasvinder.singh@intel.com>; Dumitrescu, Cristian
> > > <cristian.dumitrescu@intel.com>; Thomas Monjalon
> > > <thomas@monjalon.net>; Yigit, Ferruh <ferruh.yigit@intel.com>; Andrew
> > > Rybchenko <arybchenko@solarflare.com>
> > > Cc: dev@dpdk.org; jerinj@marvell.com; kkanas@marvell.com; Nithin
> > > Dabilpuram <ndabilpuram@marvell.com>
> > > Subject: [PATCH v3] ethdev: add tm support for shaper config in pkt mode
> > > 
> > > From: Nithin Dabilpuram <ndabilpuram@marvell.com>
> > > 
> > > Some NIC hardware support shaper to work in packet mode i.e
> > > shaping or ratelimiting traffic is in packets per second (PPS) as
> > > opposed to default bytes per second (BPS). Hence this patch
> > > adds support to configure shared or private shaper in packet mode,
> > > provide rate in PPS and add related tm capabilities in port/level/node
> > > capability structures.
> > > 
> > > This patch also updates tm port/level/node capability structures with
> > > exiting features of scheduler wfq packet mode, scheduler wfq byte mode
> > > and private/shared shaper byte mode.
> > > 
> > > SoftNIC PMD is also updated with new capabilities.
> > > 
> > > Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
> > > ---
> > > 
> > > v2..v3:
> > > - Fix typo's
> > > - Add shaper_shared_(packet, byte)_mode_supported in level and node cap
> > > - Fix comment in pkt_length_adjust.
> > > - Move rte_eth_softnic_tm.c capability update to patch 1/4 to
> > >   avoid compilations issues in node and level cap array in softnicpmd.
> > >   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:3: warning: braces around
> > > scalar initializer
> > >    {.nonleaf = {
> > >   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:3: note: (near initialization
> > > for ‘tm_node_cap[0].shaper_shared_byte_mode_supported’)
> > >   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:4: error: field name not in
> > > record or union initializer
> > >    {.nonleaf = {
> > > 
> > > v1..v2:
> > > - Add seperate capability for shaper and scheduler pktmode and bytemode.
> > > - Add packet_mode field in struct rte_tm_shaper_params to indicate
> > > packet mode shaper profile.
> > > 
> > > 
> > >  drivers/net/softnic/rte_eth_softnic_tm.c |  65 ++++++++++
> > >  lib/librte_ethdev/rte_tm.h               | 196
> > > ++++++++++++++++++++++++++++++-
> > >  2 files changed, 259 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/drivers/net/softnic/rte_eth_softnic_tm.c
> > > b/drivers/net/softnic/rte_eth_softnic_tm.c
> > > index 80a470c..344819f 100644
> > > --- a/drivers/net/softnic/rte_eth_softnic_tm.c
> > > +++ b/drivers/net/softnic/rte_eth_softnic_tm.c
> > 
> > <snip>...
> > 
> > The softnic changes logically belong to a separate patch. I understand you are getting some build warnings, but it does not make sense to me. Are you sure there is no other way to avoid them?
> I see error only because of v3 changes in node cap. There seems to be some gcc
> issue with order of initializations only when next field is union. I tried both
> gcc 4.8.5 and 7.3.1
> 
> struct test {                                            
>         int a;                                           
>         char b;                                          
>         int c;                                           
>         union {                                          
>                 int d;                                   
>         };                                               
> 
> };                                                       
> 
> struct test ds1 = {                                      
>         .a = 10,                                         
>         .b = 20,                                         
>         {                                                
>                 .d = 40,                                 
>         }                                                
> };                                                       
> 
> int main(void)                                           
> {                                                        
>         printf("ds1.a %d\n", ds1.a);                     
> }                                                        
> [root@hyd1588t430 dpdk]# make a                          
> cc     a.c   -o a                                        
> a.c:20:2: warning: braces around scalar initializer [enabled by default] 
>   {                                                      
>   ^
> a.c:20:2: warning: (near initialization for ‘ds1.c’) [enabled by default]
> a.c:21:3: error: field name not in record or union initializer           
>    .d = 40,                                              
>    ^
> a.c:21:3: error: (near initialization for ‘ds1.c’)       
> make: *** [a] Error 1                                    
> 
> I don't see any issue if 'd' is not inside a union.
> 
> Similar issue is reported in kernel and similar fix was applied of initializing all the fields.
> https://urldefense.proofpoint.com/v2/url?u=https-3A__patchwork.kernel.org_patch_3033041_&d=DwIDaQ&c=nKjWec2b6R0mOyPaz7xtfQ&r=FZ_tPCbgFOh18zwRPO9H0yDx8VW38vuapifdDfc8SFQ&m=Ygf72TMZqO2D2qgWdhga8M61LRznr54ORYKCZ5iQG7w&s=n6pWrzBSgTCaznkjfH4UXjJS_CvBpX2_uY-CJ-LZcd4&e= 
> 
> > 
> > You are not checking that packet_mode is set to 0. Please add a check in function shaper_profile_check() (file rte_eth_softnic_tm.c) to verify that packet_mode is always set to 0.
> Ack.
> > 
> > Jasvinder, any other changes we need in Soft NIC?
> > 
> > > diff --git a/lib/librte_ethdev/rte_tm.h b/lib/librte_ethdev/rte_tm.h
> > > index f9c0cf3..b3865af 100644
> > > --- a/lib/librte_ethdev/rte_tm.h
> > > +++ b/lib/librte_ethdev/rte_tm.h
> > 
> > I am now fine with your additions to this file, with some minor exceptions listed below. Thank you!
> > 
> > > @@ -250,6 +250,23 @@ struct rte_tm_capabilities {
> > >  	 */
> > >  	uint64_t shaper_private_rate_max;
> > > 
> > > +	/** Shaper private packet mode supported. When non-zero, this
> > > parameter
> > > +	 * indicates that there is at least one node that can be configured
> > > +	 * with packet mode in it's private shaper. When shaper is configured
> > 
> > Recurring typo: it's -> its
> > 
> > Please search for all occurrences of "it's", all should be replaced with either "its" or "it is", we should have absolutely no occurrence of "it's".
> Ack. My bad, I misunderstood earlier comment. Will fix in v4.
> > 
> > <snip>...
> > 
> > > 
> > > @@ -860,6 +1034,11 @@ struct rte_tm_token_bucket {
> > >   * Dual rate shapers use both the committed and the peak token buckets.
> > > The
> > >   * rate of the peak bucket has to be bigger than zero, as well as greater than
> > >   * or equal to the rate of the committed bucket.
> > > + *
> > > + * @see struct
> > > rte_tm_capabilities::shaper_private_packet_mode_supported
> > > + * @see struct rte_tm_capabilities::shaper_private_byte_mode_supported
> > > + * @see struct
> > > rte_tm_capabilities::shaper_shared_packet_mode_supported
> > > + * @see struct rte_tm_capabilities::shaper_shared_byte_mode_supported
> > >   */
> > >  struct rte_tm_shaper_params {
> > >  	/** Committed token bucket */
> > > @@ -872,8 +1051,19 @@ struct rte_tm_shaper_params {
> > >  	 * purpose of shaping. Can be used to correct the packet length with
> > >  	 * the framing overhead bytes that are also consumed on the wire
> > > (e.g.
> > >  	 * RTE_TM_ETH_FRAMING_OVERHEAD_FCS).
> > > +	 * This field is ignored when the profile enables packet mode.
> > >  	 */
> > >  	int32_t pkt_length_adjust;
> > > +
> > > +	/** When zero, the private or shared shaper that is associated to this
> > > +	 * profile works in byte mode and hence *rate* and *size* fields in
> > > +	 * both token bucket configurations are specified in bytes per second
> > > +	 * and bytes respectively.
> > > +	 * When non-zero, that private or shared shaper works in packet
> > > mode and
> > > +	 * hence *rate* and *size* fields in both token bucket configurations
> > > +	 * are specified in packets per second and packets respectively.
> > > +	 */
> > > +	int packet_mode;
> > >  };
> > 
> > I would like to simplify this comment a bit. The reference to a shaper being associated with a profile might be confusing, as some people might incorrectly read there is a 1:1 association between shaper and profile, etc; this is described in mode details in the comment at the top of this structure. I would avoid any mentions of objects outside of the current structure.
> > 
> > I would phrase it like: "When zero, the byte mode is enabled for the current profile, so the *rate* and *size* fields in both the committed and peak token buckets are specified in bytes per second and bytes, respectively. When non-zero, the packet mode is enabled for the current profile, so the *rate* and *size* fields in both the committed and peak token buckets are specified in packets per second and packets, respectively. ". Is this OK with you?
> Ack.
> > 
> > Please also add the links to the relevant capabilities: @see struct rte_tm_node_capabilities::XYZ.
> Ack.
> > 
> > 
> > Regards,
> > Cristian
  
Cristian Dumitrescu April 22, 2020, 11:59 a.m. UTC | #5
> -----Original Message-----
> From: Nithin Dabilpuram <ndabilpuram@marvell.com>
> Sent: Wednesday, April 22, 2020 12:49 PM
> To: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>
> Cc: Nithin Dabilpuram <nithind1988@gmail.com>; Singh, Jasvinder
> <jasvinder.singh@intel.com>; Thomas Monjalon <thomas@monjalon.net>;
> Yigit, Ferruh <ferruh.yigit@intel.com>; Andrew Rybchenko
> <arybchenko@solarflare.com>; dev@dpdk.org; jerinj@marvell.com;
> kkanas@marvell.com
> Subject: Re: [dpdk-dev] [EXT] RE: [PATCH v3] ethdev: add tm support for
> shaper config in pkt mode
> 
> > Please also add the links to the relevant capabilities: @see struct
> > rte_tm_node_capabilities::XYZ.
> 
> This is already added for packet_mode field in descrption of struct
> rte_tm_shaper_params similar to struct rte_tm_wred_params.
> Do you see anything missing ?
> 

You're right, sorry.
  
Cristian Dumitrescu April 22, 2020, 12:01 p.m. UTC | #6
> > The softnic changes logically belong to a separate patch. I understand you
> are getting some build warnings, but it does not make sense to me. Are you
> sure there is no other way to avoid them?
> I see error only because of v3 changes in node cap. There seems to be some
> gcc
> issue with order of initializations only when next field is union. I tried both
> gcc 4.8.5 and 7.3.1
> 
> struct test {
>         int a;
>         char b;
>         int c;
>         union {
>                 int d;
>         };
> 
> };
> 
> struct test ds1 = {
>         .a = 10,
>         .b = 20,
>         {
>                 .d = 40,
>         }
> };
> 
> int main(void)
> {
>         printf("ds1.a %d\n", ds1.a);
> }
> [root@hyd1588t430 dpdk]# make a
> cc     a.c   -o a
> a.c:20:2: warning: braces around scalar initializer [enabled by default]
>   {
>   ^
> a.c:20:2: warning: (near initialization for ‘ds1.c’) [enabled by default]
> a.c:21:3: error: field name not in record or union initializer
>    .d = 40,
>    ^
> a.c:21:3: error: (near initialization for ‘ds1.c’)
> make: *** [a] Error 1
> 
> I don't see any issue if 'd' is not inside a union.
> 
> Similar issue is reported in kernel and similar fix was applied of initializing all
> the fields.
> https://patchwork.kernel.org/patch/3033041/
> 
>

Sure, I can live with softnic changes in the same patch if no other option is identified.
  
Jasvinder Singh April 22, 2020, 12:18 p.m. UTC | #7
> -----Original Message-----
> From: Nithin Dabilpuram <ndabilpuram@marvell.com>
> Sent: Wednesday, April 22, 2020 9:09 AM
> To: Nithin Dabilpuram <nithind1988@gmail.com>
> Cc: Singh, Jasvinder <jasvinder.singh@intel.com>; Dumitrescu, Cristian
> <cristian.dumitrescu@intel.com>; Thomas Monjalon
> <thomas@monjalon.net>; Yigit, Ferruh <ferruh.yigit@intel.com>; Andrew
> Rybchenko <arybchenko@solarflare.com>; dev@dpdk.org;
> jerinj@marvell.com; kkanas@marvell.com
> Subject: Re: [dpdk-dev] [PATCH v3] ethdev: add tm support for shaper config
> in pkt mode
> 
> Please ignore this patch. Had issue with subject line.
> Consider patch "[v3,1/4] ethdev: add tm support for shaper config in pkt
> mode "
> instead.
> 
> On Wed, Apr 22, 2020 at 01:29:44PM +0530, Nithin Dabilpuram wrote:
> > From: Nithin Dabilpuram <ndabilpuram@marvell.com>
> >
> > Some NIC hardware support shaper to work in packet mode i.e shaping or
> > ratelimiting traffic is in packets per second (PPS) as opposed to
> > default bytes per second (BPS). Hence this patch adds support to
> > configure shared or private shaper in packet mode, provide rate in PPS
> > and add related tm capabilities in port/level/node capability
> > structures.
> >
> > This patch also updates tm port/level/node capability structures with
> > exiting features of scheduler wfq packet mode, scheduler wfq byte mode
> > and private/shared shaper byte mode.
> >
> > SoftNIC PMD is also updated with new capabilities.
> >
> > Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
> > ---
> >
> > v2..v3:
> > - Fix typo's
> > - Add shaper_shared_(packet, byte)_mode_supported in level and node
> > cap
> > - Fix comment in pkt_length_adjust.
> > - Move rte_eth_softnic_tm.c capability update to patch 1/4 to
> >   avoid compilations issues in node and level cap array in softnicpmd.
> >   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:3: warning: braces around
> scalar initializer
> >    {.nonleaf = {
> >   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:3: note: (near initialization
> for ‘tm_node_cap[0].shaper_shared_byte_mode_supported’)
> >   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:4: error: field name not in
> record or union initializer
> >    {.nonleaf = {
> >
> > v1..v2:
> > - Add seperate capability for shaper and scheduler pktmode and
> bytemode.
> > - Add packet_mode field in struct rte_tm_shaper_params to indicate
> > packet mode shaper profile.
> >
> >
> >  drivers/net/softnic/rte_eth_softnic_tm.c |  65 ++++++++++
<snip>

> > @@ -548,13 +554,19 @@ static const struct rte_tm_level_capabilities
> tm_level_cap[] = {
> >  			.shaper_private_dual_rate_supported = 0,
> >  			.shaper_private_rate_min = 1,
> >  			.shaper_private_rate_max = UINT32_MAX,
> > +			.shaper_private_packet_mode_supported = 0,
> > +			.shaper_private_byte_mode_supported = 1,
> >  			.shaper_shared_n_max = 0,
> > +			.shaper_shared_packet_mode_supported = 0,
> > +			.shaper_shared_byte_mode_supported = 0,
> >
> >  			.sched_n_children_max = UINT32_MAX,
> >  			.sched_sp_n_priorities_max = 1,
> >  			.sched_wfq_n_children_per_group_max =
> UINT32_MAX,
> >  			.sched_wfq_n_groups_max = 1,
> >  			.sched_wfq_weight_max = 1,
> > +			.sched_wfq_packet_mode_supported = 0,
> > +			.sched_wfq_byte_mode_supported = 0,

[Jasvinder] -  byte mode needs to be set here.



> >  			.stats_mask = STATS_MASK_DEFAULT,
> >  		} },
> > @@ -572,7 +584,11 @@ static const struct rte_tm_level_capabilities
> tm_level_cap[] = {
> >  			.shaper_private_dual_rate_supported = 0,
> >  			.shaper_private_rate_min = 1,
> >  			.shaper_private_rate_max = UINT32_MAX,
> > +			.shaper_private_packet_mode_supported = 0,
> > +			.shaper_private_byte_mode_supported = 1,
> >  			.shaper_shared_n_max = 0,
> > +			.shaper_shared_packet_mode_supported = 0,
> > +			.shaper_shared_byte_mode_supported = 0,
> >
> >  			.sched_n_children_max = UINT32_MAX,
> >  			.sched_sp_n_priorities_max = 1,
> > @@ -580,9 +596,14 @@ static const struct rte_tm_level_capabilities
> tm_level_cap[] = {
> >  			.sched_wfq_n_groups_max = 1,
> >  #ifdef RTE_SCHED_SUBPORT_TC_OV
> >  			.sched_wfq_weight_max = UINT32_MAX,
> > +			.sched_wfq_packet_mode_supported = 0,
> > +			.sched_wfq_byte_mode_supported = 1,
> >  #else
> >  			.sched_wfq_weight_max = 1,
> > +			.sched_wfq_packet_mode_supported = 0,
> > +			.sched_wfq_byte_mode_supported = 0,

[jasvinder] - byte mode should be set here as well. 


> >  #endif
> > +
> >  			.stats_mask = STATS_MASK_DEFAULT,
> >  		} },
> >  	},
> > @@ -599,7 +620,11 @@ static const struct rte_tm_level_capabilities
> tm_level_cap[] = {
> >  			.shaper_private_dual_rate_supported = 0,
> >  			.shaper_private_rate_min = 1,
> >  			.shaper_private_rate_max = UINT32_MAX,
> > +			.shaper_private_packet_mode_supported = 0,
> > +			.shaper_private_byte_mode_supported = 1,
> >  			.shaper_shared_n_max = 0,
> > +			.shaper_shared_packet_mode_supported = 0,
> > +			.shaper_shared_byte_mode_supported = 0,
> >
> >  			.sched_n_children_max =
> >  				RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE,
> > @@ -608,6 +633,8 @@ static const struct rte_tm_level_capabilities
> tm_level_cap[] = {
> >  			.sched_wfq_n_children_per_group_max = 1,
> >  			.sched_wfq_n_groups_max = 0,
> >  			.sched_wfq_weight_max = 1,
> > +			.sched_wfq_packet_mode_supported = 0,
> > +			.sched_wfq_byte_mode_supported = 0,
> >
> >  			.stats_mask = STATS_MASK_DEFAULT,
> >  		} },
> > @@ -625,7 +652,11 @@ static const struct rte_tm_level_capabilities
> tm_level_cap[] = {
> >  			.shaper_private_dual_rate_supported = 0,
> >  			.shaper_private_rate_min = 1,
> >  			.shaper_private_rate_max = UINT32_MAX,
> > +			.shaper_private_packet_mode_supported = 0,
> > +			.shaper_private_byte_mode_supported = 1,
> >  			.shaper_shared_n_max = 1,
> > +			.shaper_shared_packet_mode_supported = 0,
> > +			.shaper_shared_byte_mode_supported = 1,
> >
> >  			.sched_n_children_max =
> >  				RTE_SCHED_BE_QUEUES_PER_PIPE,
> > @@ -634,6 +665,8 @@ static const struct rte_tm_level_capabilities
> tm_level_cap[] = {
> >  				RTE_SCHED_BE_QUEUES_PER_PIPE,
> >  			.sched_wfq_n_groups_max = 1,
> >  			.sched_wfq_weight_max = UINT32_MAX,
> > +			.sched_wfq_packet_mode_supported = 0,
> > +			.sched_wfq_byte_mode_supported = 1,
> >
> >  			.stats_mask = STATS_MASK_DEFAULT,
> >  		} },
> > @@ -651,7 +684,11 @@ static const struct rte_tm_level_capabilities
> tm_level_cap[] = {
> >  			.shaper_private_dual_rate_supported = 0,
> >  			.shaper_private_rate_min = 0,
> >  			.shaper_private_rate_max = 0,
> > +			.shaper_private_packet_mode_supported = 0,
> > +			.shaper_private_byte_mode_supported = 0,
> >  			.shaper_shared_n_max = 0,
> > +			.shaper_shared_packet_mode_supported = 0,
> > +			.shaper_shared_byte_mode_supported = 0,
> >
> >  			.cman_head_drop_supported = 0,
> >  			.cman_wred_packet_mode_supported =
> WRED_SUPPORTED, @@ -736,7
> > +773,11 @@ static const struct rte_tm_node_capabilities tm_node_cap[] =
> {
> >  		.shaper_private_dual_rate_supported = 0,
> >  		.shaper_private_rate_min = 1,
> >  		.shaper_private_rate_max = UINT32_MAX,
> > +		.shaper_private_packet_mode_supported = 0,
> > +		.shaper_private_byte_mode_supported = 1,
> >  		.shaper_shared_n_max = 0,
> > +		.shaper_shared_packet_mode_supported = 0,
> > +		.shaper_shared_byte_mode_supported = 0,
> >
> >  		{.nonleaf = {
> >  			.sched_n_children_max = UINT32_MAX, @@ -744,6
> +785,8 @@ static
> > const struct rte_tm_node_capabilities tm_node_cap[] = {
> >  			.sched_wfq_n_children_per_group_max =
> UINT32_MAX,
> >  			.sched_wfq_n_groups_max = 1,
> >  			.sched_wfq_weight_max = 1,
> > +			.sched_wfq_packet_mode_supported = 0,
> > +			.sched_wfq_byte_mode_supported = 0,
> >  		} },

[Jasvinder] - byte mode to be set.


> >  		.stats_mask = STATS_MASK_DEFAULT,
> > @@ -754,7 +797,11 @@ static const struct rte_tm_node_capabilities
> tm_node_cap[] = {
> >  		.shaper_private_dual_rate_supported = 0,
> >  		.shaper_private_rate_min = 1,
> >  		.shaper_private_rate_max = UINT32_MAX,
> > +		.shaper_private_packet_mode_supported = 0,
> > +		.shaper_private_byte_mode_supported = 1,
> >  		.shaper_shared_n_max = 0,
> > +		.shaper_shared_packet_mode_supported = 0,
> > +		.shaper_shared_byte_mode_supported = 0,
> >
> >  		{.nonleaf = {
> >  			.sched_n_children_max = UINT32_MAX, @@ -762,6
> +809,8 @@ static
> > const struct rte_tm_node_capabilities tm_node_cap[] = {
> >  			.sched_wfq_n_children_per_group_max =
> UINT32_MAX,
> >  			.sched_wfq_n_groups_max = 1,
> >  			.sched_wfq_weight_max = UINT32_MAX,
> > +			.sched_wfq_packet_mode_supported = 0,
> > +			.sched_wfq_byte_mode_supported = 0,
> >  		} },

[Jasvinder] - byte mode to be set here.



> >  		.stats_mask = STATS_MASK_DEFAULT,
> > @@ -772,7 +821,11 @@ static const struct rte_tm_node_capabilities
> tm_node_cap[] = {
> >  		.shaper_private_dual_rate_supported = 0,
> >  		.shaper_private_rate_min = 1,
> >  		.shaper_private_rate_max = UINT32_MAX,
> > +		.shaper_private_packet_mode_supported = 0,
> > +		.shaper_private_byte_mode_supported = 1,
> >  		.shaper_shared_n_max = 0,
> > +		.shaper_shared_packet_mode_supported = 0,
> > +		.shaper_shared_byte_mode_supported = 0,
> >
> >  		{.nonleaf = {
> >  			.sched_n_children_max =
> > @@ -782,6 +835,8 @@ static const struct rte_tm_node_capabilities
> tm_node_cap[] = {
> >  			.sched_wfq_n_children_per_group_max = 1,
> >  			.sched_wfq_n_groups_max = 0,
> >  			.sched_wfq_weight_max = 1,
> > +			.sched_wfq_packet_mode_supported = 0,
> > +			.sched_wfq_byte_mode_supported = 0,
> >  		} },
> >
> >  		.stats_mask = STATS_MASK_DEFAULT,
> > @@ -792,7 +847,11 @@ static const struct rte_tm_node_capabilities
> tm_node_cap[] = {
> >  		.shaper_private_dual_rate_supported = 0,
> >  		.shaper_private_rate_min = 1,
> >  		.shaper_private_rate_max = UINT32_MAX,
> > +		.shaper_private_packet_mode_supported = 0,
> > +		.shaper_private_byte_mode_supported = 1,
> >  		.shaper_shared_n_max = 1,
> > +		.shaper_shared_packet_mode_supported = 0,
> > +		.shaper_shared_byte_mode_supported = 1,
> >
> >  		{.nonleaf = {
> >  			.sched_n_children_max =
> > @@ -802,6 +861,8 @@ static const struct rte_tm_node_capabilities
> tm_node_cap[] = {
> >  				RTE_SCHED_BE_QUEUES_PER_PIPE,
> >  			.sched_wfq_n_groups_max = 1,
> >  			.sched_wfq_weight_max = UINT32_MAX,
> > +			.sched_wfq_packet_mode_supported = 0,
> > +			.sched_wfq_byte_mode_supported = 1,
> >  		} },
> >
> >  		.stats_mask = STATS_MASK_DEFAULT,
> > @@ -812,7 +873,11 @@ static const struct rte_tm_node_capabilities
> tm_node_cap[] = {
> >  		.shaper_private_dual_rate_supported = 0,
> >  		.shaper_private_rate_min = 0,
> >  		.shaper_private_rate_max = 0,
> > +		.shaper_private_packet_mode_supported = 0,
> > +		.shaper_private_byte_mode_supported = 0,
> >  		.shaper_shared_n_max = 0,
> > +		.shaper_shared_packet_mode_supported = 0,
> > +		.shaper_shared_byte_mode_supported = 0,
> >
> >
> >  		{.leaf = {
  
Nithin Dabilpuram April 22, 2020, 5:21 p.m. UTC | #8
Fixed in v4.
On Wed, Apr 22, 2020 at 12:18:14PM +0000, Singh, Jasvinder wrote:
> External Email
> 
> ----------------------------------------------------------------------
> 
> 
> > -----Original Message-----
> > From: Nithin Dabilpuram <ndabilpuram@marvell.com>
> > Sent: Wednesday, April 22, 2020 9:09 AM
> > To: Nithin Dabilpuram <nithind1988@gmail.com>
> > Cc: Singh, Jasvinder <jasvinder.singh@intel.com>; Dumitrescu, Cristian
> > <cristian.dumitrescu@intel.com>; Thomas Monjalon
> > <thomas@monjalon.net>; Yigit, Ferruh <ferruh.yigit@intel.com>; Andrew
> > Rybchenko <arybchenko@solarflare.com>; dev@dpdk.org;
> > jerinj@marvell.com; kkanas@marvell.com
> > Subject: Re: [dpdk-dev] [PATCH v3] ethdev: add tm support for shaper config
> > in pkt mode
> > 
> > Please ignore this patch. Had issue with subject line.
> > Consider patch "[v3,1/4] ethdev: add tm support for shaper config in pkt
> > mode "
> > instead.
> > 
> > On Wed, Apr 22, 2020 at 01:29:44PM +0530, Nithin Dabilpuram wrote:
> > > From: Nithin Dabilpuram <ndabilpuram@marvell.com>
> > >
> > > Some NIC hardware support shaper to work in packet mode i.e shaping or
> > > ratelimiting traffic is in packets per second (PPS) as opposed to
> > > default bytes per second (BPS). Hence this patch adds support to
> > > configure shared or private shaper in packet mode, provide rate in PPS
> > > and add related tm capabilities in port/level/node capability
> > > structures.
> > >
> > > This patch also updates tm port/level/node capability structures with
> > > exiting features of scheduler wfq packet mode, scheduler wfq byte mode
> > > and private/shared shaper byte mode.
> > >
> > > SoftNIC PMD is also updated with new capabilities.
> > >
> > > Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>
> > > ---
> > >
> > > v2..v3:
> > > - Fix typo's
> > > - Add shaper_shared_(packet, byte)_mode_supported in level and node
> > > cap
> > > - Fix comment in pkt_length_adjust.
> > > - Move rte_eth_softnic_tm.c capability update to patch 1/4 to
> > >   avoid compilations issues in node and level cap array in softnicpmd.
> > >   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:3: warning: braces around
> > scalar initializer
> > >    {.nonleaf = {
> > >   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:3: note: (near initialization
> > for ‘tm_node_cap[0].shaper_shared_byte_mode_supported’)
> > >   ../drivers/net/softnic/rte_eth_softnic_tm.c:782:4: error: field name not in
> > record or union initializer
> > >    {.nonleaf = {
> > >
> > > v1..v2:
> > > - Add seperate capability for shaper and scheduler pktmode and
> > bytemode.
> > > - Add packet_mode field in struct rte_tm_shaper_params to indicate
> > > packet mode shaper profile.
> > >
> > >
> > >  drivers/net/softnic/rte_eth_softnic_tm.c |  65 ++++++++++
> <snip>
> 
> > > @@ -548,13 +554,19 @@ static const struct rte_tm_level_capabilities
> > tm_level_cap[] = {
> > >  			.shaper_private_dual_rate_supported = 0,
> > >  			.shaper_private_rate_min = 1,
> > >  			.shaper_private_rate_max = UINT32_MAX,
> > > +			.shaper_private_packet_mode_supported = 0,
> > > +			.shaper_private_byte_mode_supported = 1,
> > >  			.shaper_shared_n_max = 0,
> > > +			.shaper_shared_packet_mode_supported = 0,
> > > +			.shaper_shared_byte_mode_supported = 0,
> > >
> > >  			.sched_n_children_max = UINT32_MAX,
> > >  			.sched_sp_n_priorities_max = 1,
> > >  			.sched_wfq_n_children_per_group_max =
> > UINT32_MAX,
> > >  			.sched_wfq_n_groups_max = 1,
> > >  			.sched_wfq_weight_max = 1,
> > > +			.sched_wfq_packet_mode_supported = 0,
> > > +			.sched_wfq_byte_mode_supported = 0,
> 
> [Jasvinder] -  byte mode needs to be set here.
> 
> 
> 
> > >  			.stats_mask = STATS_MASK_DEFAULT,
> > >  		} },
> > > @@ -572,7 +584,11 @@ static const struct rte_tm_level_capabilities
> > tm_level_cap[] = {
> > >  			.shaper_private_dual_rate_supported = 0,
> > >  			.shaper_private_rate_min = 1,
> > >  			.shaper_private_rate_max = UINT32_MAX,
> > > +			.shaper_private_packet_mode_supported = 0,
> > > +			.shaper_private_byte_mode_supported = 1,
> > >  			.shaper_shared_n_max = 0,
> > > +			.shaper_shared_packet_mode_supported = 0,
> > > +			.shaper_shared_byte_mode_supported = 0,
> > >
> > >  			.sched_n_children_max = UINT32_MAX,
> > >  			.sched_sp_n_priorities_max = 1,
> > > @@ -580,9 +596,14 @@ static const struct rte_tm_level_capabilities
> > tm_level_cap[] = {
> > >  			.sched_wfq_n_groups_max = 1,
> > >  #ifdef RTE_SCHED_SUBPORT_TC_OV
> > >  			.sched_wfq_weight_max = UINT32_MAX,
> > > +			.sched_wfq_packet_mode_supported = 0,
> > > +			.sched_wfq_byte_mode_supported = 1,
> > >  #else
> > >  			.sched_wfq_weight_max = 1,
> > > +			.sched_wfq_packet_mode_supported = 0,
> > > +			.sched_wfq_byte_mode_supported = 0,
> 
> [jasvinder] - byte mode should be set here as well. 
> 
> 
> > >  #endif
> > > +
> > >  			.stats_mask = STATS_MASK_DEFAULT,
> > >  		} },
> > >  	},
> > > @@ -599,7 +620,11 @@ static const struct rte_tm_level_capabilities
> > tm_level_cap[] = {
> > >  			.shaper_private_dual_rate_supported = 0,
> > >  			.shaper_private_rate_min = 1,
> > >  			.shaper_private_rate_max = UINT32_MAX,
> > > +			.shaper_private_packet_mode_supported = 0,
> > > +			.shaper_private_byte_mode_supported = 1,
> > >  			.shaper_shared_n_max = 0,
> > > +			.shaper_shared_packet_mode_supported = 0,
> > > +			.shaper_shared_byte_mode_supported = 0,
> > >
> > >  			.sched_n_children_max =
> > >  				RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE,
> > > @@ -608,6 +633,8 @@ static const struct rte_tm_level_capabilities
> > tm_level_cap[] = {
> > >  			.sched_wfq_n_children_per_group_max = 1,
> > >  			.sched_wfq_n_groups_max = 0,
> > >  			.sched_wfq_weight_max = 1,
> > > +			.sched_wfq_packet_mode_supported = 0,
> > > +			.sched_wfq_byte_mode_supported = 0,
> > >
> > >  			.stats_mask = STATS_MASK_DEFAULT,
> > >  		} },
> > > @@ -625,7 +652,11 @@ static const struct rte_tm_level_capabilities
> > tm_level_cap[] = {
> > >  			.shaper_private_dual_rate_supported = 0,
> > >  			.shaper_private_rate_min = 1,
> > >  			.shaper_private_rate_max = UINT32_MAX,
> > > +			.shaper_private_packet_mode_supported = 0,
> > > +			.shaper_private_byte_mode_supported = 1,
> > >  			.shaper_shared_n_max = 1,
> > > +			.shaper_shared_packet_mode_supported = 0,
> > > +			.shaper_shared_byte_mode_supported = 1,
> > >
> > >  			.sched_n_children_max =
> > >  				RTE_SCHED_BE_QUEUES_PER_PIPE,
> > > @@ -634,6 +665,8 @@ static const struct rte_tm_level_capabilities
> > tm_level_cap[] = {
> > >  				RTE_SCHED_BE_QUEUES_PER_PIPE,
> > >  			.sched_wfq_n_groups_max = 1,
> > >  			.sched_wfq_weight_max = UINT32_MAX,
> > > +			.sched_wfq_packet_mode_supported = 0,
> > > +			.sched_wfq_byte_mode_supported = 1,
> > >
> > >  			.stats_mask = STATS_MASK_DEFAULT,
> > >  		} },
> > > @@ -651,7 +684,11 @@ static const struct rte_tm_level_capabilities
> > tm_level_cap[] = {
> > >  			.shaper_private_dual_rate_supported = 0,
> > >  			.shaper_private_rate_min = 0,
> > >  			.shaper_private_rate_max = 0,
> > > +			.shaper_private_packet_mode_supported = 0,
> > > +			.shaper_private_byte_mode_supported = 0,
> > >  			.shaper_shared_n_max = 0,
> > > +			.shaper_shared_packet_mode_supported = 0,
> > > +			.shaper_shared_byte_mode_supported = 0,
> > >
> > >  			.cman_head_drop_supported = 0,
> > >  			.cman_wred_packet_mode_supported =
> > WRED_SUPPORTED, @@ -736,7
> > > +773,11 @@ static const struct rte_tm_node_capabilities tm_node_cap[] =
> > {
> > >  		.shaper_private_dual_rate_supported = 0,
> > >  		.shaper_private_rate_min = 1,
> > >  		.shaper_private_rate_max = UINT32_MAX,
> > > +		.shaper_private_packet_mode_supported = 0,
> > > +		.shaper_private_byte_mode_supported = 1,
> > >  		.shaper_shared_n_max = 0,
> > > +		.shaper_shared_packet_mode_supported = 0,
> > > +		.shaper_shared_byte_mode_supported = 0,
> > >
> > >  		{.nonleaf = {
> > >  			.sched_n_children_max = UINT32_MAX, @@ -744,6
> > +785,8 @@ static
> > > const struct rte_tm_node_capabilities tm_node_cap[] = {
> > >  			.sched_wfq_n_children_per_group_max =
> > UINT32_MAX,
> > >  			.sched_wfq_n_groups_max = 1,
> > >  			.sched_wfq_weight_max = 1,
> > > +			.sched_wfq_packet_mode_supported = 0,
> > > +			.sched_wfq_byte_mode_supported = 0,
> > >  		} },
> 
> [Jasvinder] - byte mode to be set.
> 
> 
> > >  		.stats_mask = STATS_MASK_DEFAULT,
> > > @@ -754,7 +797,11 @@ static const struct rte_tm_node_capabilities
> > tm_node_cap[] = {
> > >  		.shaper_private_dual_rate_supported = 0,
> > >  		.shaper_private_rate_min = 1,
> > >  		.shaper_private_rate_max = UINT32_MAX,
> > > +		.shaper_private_packet_mode_supported = 0,
> > > +		.shaper_private_byte_mode_supported = 1,
> > >  		.shaper_shared_n_max = 0,
> > > +		.shaper_shared_packet_mode_supported = 0,
> > > +		.shaper_shared_byte_mode_supported = 0,
> > >
> > >  		{.nonleaf = {
> > >  			.sched_n_children_max = UINT32_MAX, @@ -762,6
> > +809,8 @@ static
> > > const struct rte_tm_node_capabilities tm_node_cap[] = {
> > >  			.sched_wfq_n_children_per_group_max =
> > UINT32_MAX,
> > >  			.sched_wfq_n_groups_max = 1,
> > >  			.sched_wfq_weight_max = UINT32_MAX,
> > > +			.sched_wfq_packet_mode_supported = 0,
> > > +			.sched_wfq_byte_mode_supported = 0,
> > >  		} },
> 
> [Jasvinder] - byte mode to be set here.
> 
> 
> 
> > >  		.stats_mask = STATS_MASK_DEFAULT,
> > > @@ -772,7 +821,11 @@ static const struct rte_tm_node_capabilities
> > tm_node_cap[] = {
> > >  		.shaper_private_dual_rate_supported = 0,
> > >  		.shaper_private_rate_min = 1,
> > >  		.shaper_private_rate_max = UINT32_MAX,
> > > +		.shaper_private_packet_mode_supported = 0,
> > > +		.shaper_private_byte_mode_supported = 1,
> > >  		.shaper_shared_n_max = 0,
> > > +		.shaper_shared_packet_mode_supported = 0,
> > > +		.shaper_shared_byte_mode_supported = 0,
> > >
> > >  		{.nonleaf = {
> > >  			.sched_n_children_max =
> > > @@ -782,6 +835,8 @@ static const struct rte_tm_node_capabilities
> > tm_node_cap[] = {
> > >  			.sched_wfq_n_children_per_group_max = 1,
> > >  			.sched_wfq_n_groups_max = 0,
> > >  			.sched_wfq_weight_max = 1,
> > > +			.sched_wfq_packet_mode_supported = 0,
> > > +			.sched_wfq_byte_mode_supported = 0,
> > >  		} },
> > >
> > >  		.stats_mask = STATS_MASK_DEFAULT,
> > > @@ -792,7 +847,11 @@ static const struct rte_tm_node_capabilities
> > tm_node_cap[] = {
> > >  		.shaper_private_dual_rate_supported = 0,
> > >  		.shaper_private_rate_min = 1,
> > >  		.shaper_private_rate_max = UINT32_MAX,
> > > +		.shaper_private_packet_mode_supported = 0,
> > > +		.shaper_private_byte_mode_supported = 1,
> > >  		.shaper_shared_n_max = 1,
> > > +		.shaper_shared_packet_mode_supported = 0,
> > > +		.shaper_shared_byte_mode_supported = 1,
> > >
> > >  		{.nonleaf = {
> > >  			.sched_n_children_max =
> > > @@ -802,6 +861,8 @@ static const struct rte_tm_node_capabilities
> > tm_node_cap[] = {
> > >  				RTE_SCHED_BE_QUEUES_PER_PIPE,
> > >  			.sched_wfq_n_groups_max = 1,
> > >  			.sched_wfq_weight_max = UINT32_MAX,
> > > +			.sched_wfq_packet_mode_supported = 0,
> > > +			.sched_wfq_byte_mode_supported = 1,
> > >  		} },
> > >
> > >  		.stats_mask = STATS_MASK_DEFAULT,
> > > @@ -812,7 +873,11 @@ static const struct rte_tm_node_capabilities
> > tm_node_cap[] = {
> > >  		.shaper_private_dual_rate_supported = 0,
> > >  		.shaper_private_rate_min = 0,
> > >  		.shaper_private_rate_max = 0,
> > > +		.shaper_private_packet_mode_supported = 0,
> > > +		.shaper_private_byte_mode_supported = 0,
> > >  		.shaper_shared_n_max = 0,
> > > +		.shaper_shared_packet_mode_supported = 0,
> > > +		.shaper_shared_byte_mode_supported = 0,
> > >
> > >
> > >  		{.leaf = {
> 
> 
>
  

Patch

diff --git a/drivers/net/softnic/rte_eth_softnic_tm.c b/drivers/net/softnic/rte_eth_softnic_tm.c
index 80a470c..344819f 100644
--- a/drivers/net/softnic/rte_eth_softnic_tm.c
+++ b/drivers/net/softnic/rte_eth_softnic_tm.c
@@ -447,6 +447,8 @@  static const struct rte_tm_capabilities tm_cap = {
 	.shaper_private_dual_rate_n_max = 0,
 	.shaper_private_rate_min = 1,
 	.shaper_private_rate_max = UINT32_MAX,
+	.shaper_private_packet_mode_supported = 0,
+	.shaper_private_byte_mode_supported = 1,
 
 	.shaper_shared_n_max = UINT32_MAX,
 	.shaper_shared_n_nodes_per_shaper_max = UINT32_MAX,
@@ -454,6 +456,8 @@  static const struct rte_tm_capabilities tm_cap = {
 	.shaper_shared_dual_rate_n_max = 0,
 	.shaper_shared_rate_min = 1,
 	.shaper_shared_rate_max = UINT32_MAX,
+	.shaper_shared_packet_mode_supported = 0,
+	.shaper_shared_byte_mode_supported = 1,
 
 	.shaper_pkt_length_adjust_min = RTE_TM_ETH_FRAMING_OVERHEAD_FCS,
 	.shaper_pkt_length_adjust_max = RTE_TM_ETH_FRAMING_OVERHEAD_FCS,
@@ -463,6 +467,8 @@  static const struct rte_tm_capabilities tm_cap = {
 	.sched_wfq_n_children_per_group_max = UINT32_MAX,
 	.sched_wfq_n_groups_max = 1,
 	.sched_wfq_weight_max = UINT32_MAX,
+	.sched_wfq_packet_mode_supported = 0,
+	.sched_wfq_byte_mode_supported = 1,
 
 	.cman_wred_packet_mode_supported = WRED_SUPPORTED,
 	.cman_wred_byte_mode_supported = 0,
@@ -548,13 +554,19 @@  static const struct rte_tm_level_capabilities tm_level_cap[] = {
 			.shaper_private_dual_rate_supported = 0,
 			.shaper_private_rate_min = 1,
 			.shaper_private_rate_max = UINT32_MAX,
+			.shaper_private_packet_mode_supported = 0,
+			.shaper_private_byte_mode_supported = 1,
 			.shaper_shared_n_max = 0,
+			.shaper_shared_packet_mode_supported = 0,
+			.shaper_shared_byte_mode_supported = 0,
 
 			.sched_n_children_max = UINT32_MAX,
 			.sched_sp_n_priorities_max = 1,
 			.sched_wfq_n_children_per_group_max = UINT32_MAX,
 			.sched_wfq_n_groups_max = 1,
 			.sched_wfq_weight_max = 1,
+			.sched_wfq_packet_mode_supported = 0,
+			.sched_wfq_byte_mode_supported = 0,
 
 			.stats_mask = STATS_MASK_DEFAULT,
 		} },
@@ -572,7 +584,11 @@  static const struct rte_tm_level_capabilities tm_level_cap[] = {
 			.shaper_private_dual_rate_supported = 0,
 			.shaper_private_rate_min = 1,
 			.shaper_private_rate_max = UINT32_MAX,
+			.shaper_private_packet_mode_supported = 0,
+			.shaper_private_byte_mode_supported = 1,
 			.shaper_shared_n_max = 0,
+			.shaper_shared_packet_mode_supported = 0,
+			.shaper_shared_byte_mode_supported = 0,
 
 			.sched_n_children_max = UINT32_MAX,
 			.sched_sp_n_priorities_max = 1,
@@ -580,9 +596,14 @@  static const struct rte_tm_level_capabilities tm_level_cap[] = {
 			.sched_wfq_n_groups_max = 1,
 #ifdef RTE_SCHED_SUBPORT_TC_OV
 			.sched_wfq_weight_max = UINT32_MAX,
+			.sched_wfq_packet_mode_supported = 0,
+			.sched_wfq_byte_mode_supported = 1,
 #else
 			.sched_wfq_weight_max = 1,
+			.sched_wfq_packet_mode_supported = 0,
+			.sched_wfq_byte_mode_supported = 0,
 #endif
+
 			.stats_mask = STATS_MASK_DEFAULT,
 		} },
 	},
@@ -599,7 +620,11 @@  static const struct rte_tm_level_capabilities tm_level_cap[] = {
 			.shaper_private_dual_rate_supported = 0,
 			.shaper_private_rate_min = 1,
 			.shaper_private_rate_max = UINT32_MAX,
+			.shaper_private_packet_mode_supported = 0,
+			.shaper_private_byte_mode_supported = 1,
 			.shaper_shared_n_max = 0,
+			.shaper_shared_packet_mode_supported = 0,
+			.shaper_shared_byte_mode_supported = 0,
 
 			.sched_n_children_max =
 				RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE,
@@ -608,6 +633,8 @@  static const struct rte_tm_level_capabilities tm_level_cap[] = {
 			.sched_wfq_n_children_per_group_max = 1,
 			.sched_wfq_n_groups_max = 0,
 			.sched_wfq_weight_max = 1,
+			.sched_wfq_packet_mode_supported = 0,
+			.sched_wfq_byte_mode_supported = 0,
 
 			.stats_mask = STATS_MASK_DEFAULT,
 		} },
@@ -625,7 +652,11 @@  static const struct rte_tm_level_capabilities tm_level_cap[] = {
 			.shaper_private_dual_rate_supported = 0,
 			.shaper_private_rate_min = 1,
 			.shaper_private_rate_max = UINT32_MAX,
+			.shaper_private_packet_mode_supported = 0,
+			.shaper_private_byte_mode_supported = 1,
 			.shaper_shared_n_max = 1,
+			.shaper_shared_packet_mode_supported = 0,
+			.shaper_shared_byte_mode_supported = 1,
 
 			.sched_n_children_max =
 				RTE_SCHED_BE_QUEUES_PER_PIPE,
@@ -634,6 +665,8 @@  static const struct rte_tm_level_capabilities tm_level_cap[] = {
 				RTE_SCHED_BE_QUEUES_PER_PIPE,
 			.sched_wfq_n_groups_max = 1,
 			.sched_wfq_weight_max = UINT32_MAX,
+			.sched_wfq_packet_mode_supported = 0,
+			.sched_wfq_byte_mode_supported = 1,
 
 			.stats_mask = STATS_MASK_DEFAULT,
 		} },
@@ -651,7 +684,11 @@  static const struct rte_tm_level_capabilities tm_level_cap[] = {
 			.shaper_private_dual_rate_supported = 0,
 			.shaper_private_rate_min = 0,
 			.shaper_private_rate_max = 0,
+			.shaper_private_packet_mode_supported = 0,
+			.shaper_private_byte_mode_supported = 0,
 			.shaper_shared_n_max = 0,
+			.shaper_shared_packet_mode_supported = 0,
+			.shaper_shared_byte_mode_supported = 0,
 
 			.cman_head_drop_supported = 0,
 			.cman_wred_packet_mode_supported = WRED_SUPPORTED,
@@ -736,7 +773,11 @@  static const struct rte_tm_node_capabilities tm_node_cap[] = {
 		.shaper_private_dual_rate_supported = 0,
 		.shaper_private_rate_min = 1,
 		.shaper_private_rate_max = UINT32_MAX,
+		.shaper_private_packet_mode_supported = 0,
+		.shaper_private_byte_mode_supported = 1,
 		.shaper_shared_n_max = 0,
+		.shaper_shared_packet_mode_supported = 0,
+		.shaper_shared_byte_mode_supported = 0,
 
 		{.nonleaf = {
 			.sched_n_children_max = UINT32_MAX,
@@ -744,6 +785,8 @@  static const struct rte_tm_node_capabilities tm_node_cap[] = {
 			.sched_wfq_n_children_per_group_max = UINT32_MAX,
 			.sched_wfq_n_groups_max = 1,
 			.sched_wfq_weight_max = 1,
+			.sched_wfq_packet_mode_supported = 0,
+			.sched_wfq_byte_mode_supported = 0,
 		} },
 
 		.stats_mask = STATS_MASK_DEFAULT,
@@ -754,7 +797,11 @@  static const struct rte_tm_node_capabilities tm_node_cap[] = {
 		.shaper_private_dual_rate_supported = 0,
 		.shaper_private_rate_min = 1,
 		.shaper_private_rate_max = UINT32_MAX,
+		.shaper_private_packet_mode_supported = 0,
+		.shaper_private_byte_mode_supported = 1,
 		.shaper_shared_n_max = 0,
+		.shaper_shared_packet_mode_supported = 0,
+		.shaper_shared_byte_mode_supported = 0,
 
 		{.nonleaf = {
 			.sched_n_children_max = UINT32_MAX,
@@ -762,6 +809,8 @@  static const struct rte_tm_node_capabilities tm_node_cap[] = {
 			.sched_wfq_n_children_per_group_max = UINT32_MAX,
 			.sched_wfq_n_groups_max = 1,
 			.sched_wfq_weight_max = UINT32_MAX,
+			.sched_wfq_packet_mode_supported = 0,
+			.sched_wfq_byte_mode_supported = 0,
 		} },
 
 		.stats_mask = STATS_MASK_DEFAULT,
@@ -772,7 +821,11 @@  static const struct rte_tm_node_capabilities tm_node_cap[] = {
 		.shaper_private_dual_rate_supported = 0,
 		.shaper_private_rate_min = 1,
 		.shaper_private_rate_max = UINT32_MAX,
+		.shaper_private_packet_mode_supported = 0,
+		.shaper_private_byte_mode_supported = 1,
 		.shaper_shared_n_max = 0,
+		.shaper_shared_packet_mode_supported = 0,
+		.shaper_shared_byte_mode_supported = 0,
 
 		{.nonleaf = {
 			.sched_n_children_max =
@@ -782,6 +835,8 @@  static const struct rte_tm_node_capabilities tm_node_cap[] = {
 			.sched_wfq_n_children_per_group_max = 1,
 			.sched_wfq_n_groups_max = 0,
 			.sched_wfq_weight_max = 1,
+			.sched_wfq_packet_mode_supported = 0,
+			.sched_wfq_byte_mode_supported = 0,
 		} },
 
 		.stats_mask = STATS_MASK_DEFAULT,
@@ -792,7 +847,11 @@  static const struct rte_tm_node_capabilities tm_node_cap[] = {
 		.shaper_private_dual_rate_supported = 0,
 		.shaper_private_rate_min = 1,
 		.shaper_private_rate_max = UINT32_MAX,
+		.shaper_private_packet_mode_supported = 0,
+		.shaper_private_byte_mode_supported = 1,
 		.shaper_shared_n_max = 1,
+		.shaper_shared_packet_mode_supported = 0,
+		.shaper_shared_byte_mode_supported = 1,
 
 		{.nonleaf = {
 			.sched_n_children_max =
@@ -802,6 +861,8 @@  static const struct rte_tm_node_capabilities tm_node_cap[] = {
 				RTE_SCHED_BE_QUEUES_PER_PIPE,
 			.sched_wfq_n_groups_max = 1,
 			.sched_wfq_weight_max = UINT32_MAX,
+			.sched_wfq_packet_mode_supported = 0,
+			.sched_wfq_byte_mode_supported = 1,
 		} },
 
 		.stats_mask = STATS_MASK_DEFAULT,
@@ -812,7 +873,11 @@  static const struct rte_tm_node_capabilities tm_node_cap[] = {
 		.shaper_private_dual_rate_supported = 0,
 		.shaper_private_rate_min = 0,
 		.shaper_private_rate_max = 0,
+		.shaper_private_packet_mode_supported = 0,
+		.shaper_private_byte_mode_supported = 0,
 		.shaper_shared_n_max = 0,
+		.shaper_shared_packet_mode_supported = 0,
+		.shaper_shared_byte_mode_supported = 0,
 
 
 		{.leaf = {
diff --git a/lib/librte_ethdev/rte_tm.h b/lib/librte_ethdev/rte_tm.h
index f9c0cf3..b3865af 100644
--- a/lib/librte_ethdev/rte_tm.h
+++ b/lib/librte_ethdev/rte_tm.h
@@ -250,6 +250,23 @@  struct rte_tm_capabilities {
 	 */
 	uint64_t shaper_private_rate_max;
 
+	/** Shaper private packet mode supported. When non-zero, this parameter
+	 * indicates that there is at least one node that can be configured
+	 * with packet mode in it's private shaper. When shaper is configured
+	 * in packet mode, committed/peak rate provided is interpreted
+	 * in packets per second.
+	 */
+	int shaper_private_packet_mode_supported;
+
+	/** Shaper private byte mode supported. When non-zero, this parameter
+	 * indicates that there is at least one node that can be configured
+	 * with byte mode in it's private shaper. When shaper is configured
+	 * in byte mode, committed/peak rate provided is interpreted in
+	 * bytes per second.
+	 */
+	int shaper_private_byte_mode_supported;
+
+
 	/** Maximum number of shared shapers. The value of zero indicates that
 	 * shared shapers are not supported.
 	 */
@@ -284,6 +301,21 @@  struct rte_tm_capabilities {
 	 */
 	uint64_t shaper_shared_rate_max;
 
+	/** Shaper shared packet mode supported. When non-zero, this parameter
+	 * indicates a shared shaper can be configured with packet mode.
+	 * When shared shaper is configured in packet mode, committed/peak rate
+	 * provided is interpreted in packets per second.
+	 */
+	int shaper_shared_packet_mode_supported;
+
+	/** Shaper shared byte mode supported. When non-zero, this parameter
+	 * indicates that a shared shaper can be configured with byte mode.
+	 * When shared shaper is configured in byte mode, committed/peak rate
+	 * provided is interpreted in bytes per second.
+	 */
+	int shaper_shared_byte_mode_supported;
+
+
 	/** Minimum value allowed for packet length adjustment for any private
 	 * or shared shaper.
 	 */
@@ -339,6 +371,22 @@  struct rte_tm_capabilities {
 	 */
 	uint32_t sched_wfq_weight_max;
 
+	/** WFQ packet mode supported. When non-zero, this parameter indicates
+	 * that there is at least one non-leaf node that supports packet mode
+	 * for WFQ among it's children. WFQ weights will be applied against
+	 * packet count for scheduling children when a non-leaf node
+	 * is configured appropriately.
+	 */
+	int sched_wfq_packet_mode_supported;
+
+	/** WFQ byte mode supported. When non-zero, this parameter indicates
+	 * that there is at least one non-leaf node that supports byte mode
+	 * for WFQ among it's children. WFQ weights will be applied against
+	 * bytes for scheduling children when a non-leaf node is configured
+	 * appropriately.
+	 */
+	int sched_wfq_byte_mode_supported;
+
 	/** WRED packet mode support. When non-zero, this parameter indicates
 	 * that there is at least one leaf node that supports the WRED packet
 	 * mode, which might not be true for all the leaf nodes. In packet
@@ -485,6 +533,24 @@  struct rte_tm_level_capabilities {
 			 */
 			uint64_t shaper_private_rate_max;
 
+			/** Shaper private packet mode supported. When non-zero,
+			 * this parameter indicates there is at least one
+			 * non-leaf node at this level that can be configured
+			 * with packet mode in it's private shaper. When private
+			 * shaper is configured in packet mode, committed/peak
+			 * rate provided is interpreted in packets per second.
+			 */
+			int shaper_private_packet_mode_supported;
+
+			/** Shaper private byte mode supported. When non-zero,
+			 * this parameter indicates there is at least one
+			 * non-leaf node at this level that can be configured
+			 * with byte mode in it's private shaper. When private
+			 * shaper is configured in byte mode, committed/peak
+			 * rate provided is interpreted in bytes per second.
+			 */
+			int shaper_private_byte_mode_supported;
+
 			/** Maximum number of shared shapers that any non-leaf
 			 * node on this level can be part of. The value of zero
 			 * indicates that shared shapers are not supported by
@@ -495,6 +561,20 @@  struct rte_tm_level_capabilities {
 			 */
 			uint32_t shaper_shared_n_max;
 
+			/** Shaper shared packet mode supported. When non-zero,
+			 * this parameter indicates that there is at least one
+			 * non-leaf node on this level that can be part of
+			 * shared shapers which work in packet mode.
+			 */
+			int shaper_shared_packet_mode_supported;
+
+			/** Shaper shared byte mode supported. When non-zero,
+			 * this parameter indicates that there is at least one
+			 * non-leaf node on this level that can be part of
+			 * shared shapers which work in byte mode.
+			 */
+			int shaper_shared_byte_mode_supported;
+
 			/** Maximum number of children nodes. This parameter
 			 * indicates that there is at least one non-leaf node on
 			 * this level that can be configured with this many
@@ -554,6 +634,25 @@  struct rte_tm_level_capabilities {
 			 */
 			uint32_t sched_wfq_weight_max;
 
+			/** WFQ packet mode supported. When non-zero, this
+			 * parameter indicates that there is at least one
+			 * non-leaf node at this level that supports packet
+			 * mode for WFQ among it's children. WFQ weights will
+			 * be applied against packet count for scheduling
+			 * children when a non-leaf node is configured
+			 * appropriately.
+			 */
+			int sched_wfq_packet_mode_supported;
+
+			/** WFQ byte mode supported. When non-zero, this
+			 * parameter indicates that there is at least one
+			 * non-leaf node at this level that supports byte
+			 * mode for WFQ among it's children. WFQ weights will
+			 * be applied against bytes for scheduling children
+			 * when a non-leaf node is configured appropriately.
+			 */
+			int sched_wfq_byte_mode_supported;
+
 			/** Mask of statistics counter types supported by the
 			 * non-leaf nodes on this level. Every supported
 			 * statistics counter type is supported by at least one
@@ -596,6 +695,24 @@  struct rte_tm_level_capabilities {
 			 */
 			uint64_t shaper_private_rate_max;
 
+			/** Shaper private packet mode supported. When non-zero,
+			 * this parameter indicates there is at least one leaf
+			 * node at this level that can be configured with
+			 * packet mode in it's private shaper. When private
+			 * shaper is configured in packet mode, committed/peak
+			 * rate provided is interpreted in packets per second.
+			 */
+			int shaper_private_packet_mode_supported;
+
+			/** Shaper private byte mode supported. When non-zero,
+			 * this parameter indicates there is at least one leaf
+			 * node at this level that can be configured with
+			 * byte mode in it's private shaper. When private shaper
+			 * is configured in byte mode, committed/peak rate
+			 * provided is interpreted in bytes per second.
+			 */
+			int shaper_private_byte_mode_supported;
+
 			/** Maximum number of shared shapers that any leaf node
 			 * on this level can be part of. The value of zero
 			 * indicates that shared shapers are not supported by
@@ -606,6 +723,20 @@  struct rte_tm_level_capabilities {
 			 */
 			uint32_t shaper_shared_n_max;
 
+			/** Shaper shared packet mode supported. When non-zero,
+			 * this parameter indicates that there is at least one
+			 * leaf node on this level that can be part of
+			 * shared shapers which work in packet mode.
+			 */
+			int shaper_shared_packet_mode_supported;
+
+			/** Shaper shared byte mode supported. When non-zero,
+			 * this parameter indicates that there is at least one
+			 * leaf node on this level that can be part of
+			 * shared shapers which work in byte mode.
+			 */
+			int shaper_shared_byte_mode_supported;
+
 			/** WRED packet mode support. When non-zero, this
 			 * parameter indicates that there is at least one leaf
 			 * node on this level that supports the WRED packet
@@ -686,12 +817,38 @@  struct rte_tm_node_capabilities {
 	 */
 	uint64_t shaper_private_rate_max;
 
+	/** Shaper private packet mode supported. When non-zero, this parameter
+	 * indicates private shaper of current node can be configured with
+	 * packet mode. When configured in packet mode, committed/peak rate
+	 * provided is interpreted in packets per second.
+	 */
+	int shaper_private_packet_mode_supported;
+
+	/** Shaper private byte mode supported. When non-zero, this parameter
+	 * indicates private shaper of current node can be configured with
+	 * byte mode. When configured in byte mode, committed/peak rate
+	 * provided is interpreted in bytes per second.
+	 */
+	int shaper_private_byte_mode_supported;
+
 	/** Maximum number of shared shapers the current node can be part of.
 	 * The value of zero indicates that shared shapers are not supported by
 	 * the current node.
 	 */
 	uint32_t shaper_shared_n_max;
 
+	/** Shaper shared packet mode supported. When non-zero,
+	 * this parameter indicates that current node can be part of
+	 * shared shapers which work in packet mode.
+	 */
+	int shaper_shared_packet_mode_supported;
+
+	/** Shaper shared byte mode supported. When non-zero,
+	 * this parameter indicates that current node can be part of
+	 * shared shapers which work in byte mode.
+	 */
+	int shaper_shared_byte_mode_supported;
+
 	RTE_STD_C11
 	union {
 		/** Items valid only for non-leaf nodes. */
@@ -735,6 +892,23 @@  struct rte_tm_node_capabilities {
 			 * WFQ weight, so WFQ is reduced to FQ.
 			 */
 			uint32_t sched_wfq_weight_max;
+
+			/** WFQ packet mode supported. When non-zero, this
+			 * parameter indicates that current node supports packet
+			 * mode for WFQ among it's children. WFQ weights will be
+			 * applied against packet count for scheduling children
+			 * when configured appropriately.
+			 */
+			int sched_wfq_packet_mode_supported;
+
+			/** WFQ byte mode supported. When non-zero, this
+			 * parameter indicates that current node supports byte
+			 * mode for WFQ among it's children. WFQ weights will be
+			 * applied against  bytes for scheduling children when
+			 * configured appropriately.
+			 */
+			int sched_wfq_byte_mode_supported;
+
 		} nonleaf;
 
 		/** Items valid only for leaf nodes. */
@@ -836,10 +1010,10 @@  struct rte_tm_wred_params {
  * Token bucket
  */
 struct rte_tm_token_bucket {
-	/** Token bucket rate (bytes per second) */
+	/** Token bucket rate (bytes per second or packets per second) */
 	uint64_t rate;
 
-	/** Token bucket size (bytes), a.k.a. max burst size */
+	/** Token bucket size (bytes or packets), a.k.a. max burst size */
 	uint64_t size;
 };
 
@@ -860,6 +1034,11 @@  struct rte_tm_token_bucket {
  * Dual rate shapers use both the committed and the peak token buckets. The
  * rate of the peak bucket has to be bigger than zero, as well as greater than
  * or equal to the rate of the committed bucket.
+ *
+ * @see struct rte_tm_capabilities::shaper_private_packet_mode_supported
+ * @see struct rte_tm_capabilities::shaper_private_byte_mode_supported
+ * @see struct rte_tm_capabilities::shaper_shared_packet_mode_supported
+ * @see struct rte_tm_capabilities::shaper_shared_byte_mode_supported
  */
 struct rte_tm_shaper_params {
 	/** Committed token bucket */
@@ -872,8 +1051,19 @@  struct rte_tm_shaper_params {
 	 * purpose of shaping. Can be used to correct the packet length with
 	 * the framing overhead bytes that are also consumed on the wire (e.g.
 	 * RTE_TM_ETH_FRAMING_OVERHEAD_FCS).
+	 * This field is ignored when the profile enables packet mode.
 	 */
 	int32_t pkt_length_adjust;
+
+	/** When zero, the private or shared shaper that is associated to this
+	 * profile works in byte mode and hence *rate* and *size* fields in
+	 * both token bucket configurations are specified in bytes per second
+	 * and bytes respectively.
+	 * When non-zero, that private or shared shaper works in packet mode and
+	 * hence *rate* and *size* fields in both token bucket configurations
+	 * are specified in packets per second and packets respectively.
+	 */
+	int packet_mode;
 };
 
 /**
@@ -925,6 +1115,8 @@  struct rte_tm_node_params {
 			 * When non-NULL, it points to a pre-allocated array of
 			 * *n_sp_priorities* values, with non-zero value for
 			 * byte-mode and zero for packet-mode.
+			 * @see struct rte_tm_node_capabilities::sched_wfq_packet_mode_supported
+			 * @see struct rte_tm_node_capabilities::sched_wfq_byte_mode_supported
 			 */
 			int *wfq_weight_mode;