[dpdk-dev,v2,2/2] app/testpmd: add CLI for tm mode

Message ID 20170914115302.33995-2-jasvinder.singh@intel.com (mailing list archive)
State Superseded, archived
Headers

Checks

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

Commit Message

Jasvinder Singh Sept. 14, 2017, 11:53 a.m. UTC
  Add following CLIs in testpmd application;
- commands to build hierarchical tree for the QoS Scheduler.
- commands for runtime update of the hierarchical tree.
- commands to display TM capability information.
  (per port, per hierarchy level and per hierarchy node)
- command to set the packet field mask and offset value for
  classification.
- command to set traffic class translation table entry
- stats collection

Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
---
 app/test-pmd/cmdline.c | 2975 ++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 2785 insertions(+), 190 deletions(-)
  

Comments

De Lara Guarch, Pablo Sept. 18, 2017, 2:03 p.m. UTC | #1
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jasvinder Singh
> Sent: Thursday, September 14, 2017 12:53 PM
> To: dev@dpdk.org
> Cc: Dumitrescu, Cristian <cristian.dumitrescu@intel.com>; Wu, Jingjing
> <jingjing.wu@intel.com>
> Subject: [dpdk-dev] [PATCH v2 2/2] app/testpmd: add CLI for tm mode
> 
> Add following CLIs in testpmd application;
> - commands to build hierarchical tree for the QoS Scheduler.
> - commands for runtime update of the hierarchical tree.
> - commands to display TM capability information.
>   (per port, per hierarchy level and per hierarchy node)
> - command to set the packet field mask and offset value for
>   classification.
> - command to set traffic class translation table entry
> - stats collection

This patch should be split into multiple patches, as it is quite big
and it is adding multiple commands that can be arranged in different
categories, in different patches.

Also, as you are adding several commands about traffic management,
you could separate these in a different file (i.e. cmdline_tm.c).


> 
> Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
> ---
>  app/test-pmd/cmdline.c | 2975
> ++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 2785 insertions(+), 190 deletions(-)
> 
> diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
> index cd8c358..cb837ce 100644
> --- a/app/test-pmd/cmdline.c
> +++ b/app/test-pmd/cmdline.c

...

> +
> +	/* Command type: add */
> +	if (strcmp(res->cmd_type, "add") == 0) {
> +		/* Port link status */
> +		rte_eth_link_get_nowait(port_id, &link);
> +		if (link.link_status == ETH_LINK_UP) {
> +			printf(" Port %u link up (error)\n", port_id);
> +			return;
> +		}

If you are checking if the device is started or stopped,
you should probably use "is_port_started" function.

> +
> +		/* TM hierarchy status */
> +		if (port->softport.tm.hierarchy_frozen == 1)
> +			port->softport.tm.hierarchy_frozen = 0;
> +	}
> +
> +	/* Command type: set (update) */
  
Jasvinder Singh Sept. 19, 2017, 3:06 p.m. UTC | #2
<snip>
> > Add following CLIs in testpmd application;
> > - commands to build hierarchical tree for the QoS Scheduler.
> > - commands for runtime update of the hierarchical tree.
> > - commands to display TM capability information.
> >   (per port, per hierarchy level and per hierarchy node)
> > - command to set the packet field mask and offset value for
> >   classification.
> > - command to set traffic class translation table entry
> > - stats collection
> 
> This patch should be split into multiple patches, as it is quite big and it is
> adding multiple commands that can be arranged in different categories, in
> different patches.
> 
> Also, as you are adding several commands about traffic management, you
> could separate these in a different file (i.e. cmdline_tm.c).

Will split the patch into multiple. Thanks.

> >
> > Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
> > ---
> >  app/test-pmd/cmdline.c | 2975
> > ++++++++++++++++++++++++++++++++++++++++++++----
> >  1 file changed, 2785 insertions(+), 190 deletions(-)
> >
> > diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index
> > cd8c358..cb837ce 100644
> > --- a/app/test-pmd/cmdline.c
> > +++ b/app/test-pmd/cmdline.c
> 
> ...
> 
> > +
> > +	/* Command type: add */
> > +	if (strcmp(res->cmd_type, "add") == 0) {
> > +		/* Port link status */
> > +		rte_eth_link_get_nowait(port_id, &link);
> > +		if (link.link_status == ETH_LINK_UP) {
> > +			printf(" Port %u link up (error)\n", port_id);
> > +			return;
> > +		}
> 
> If you are checking if the device is started or stopped, you should probably
> use "is_port_started" function.

Ok, will change this.
 
> > +
> > +		/* TM hierarchy status */
> > +		if (port->softport.tm.hierarchy_frozen == 1)
> > +			port->softport.tm.hierarchy_frozen = 0;
> > +	}
> > +
> > +	/* Command type: set (update) */
  

Patch

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index cd8c358..cb837ce 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -98,6 +98,19 @@ 
 #ifdef RTE_LIBRTE_BNXT_PMD
 #include <rte_pmd_bnxt.h>
 #endif
+
+#if defined RTE_LIBRTE_PMD_SOFTNIC && defined RTE_LIBRTE_SCHED
+#define TM_MODE			1
+#else
+#define TM_MODE			0
+#endif
+
+#ifdef TM_MODE
+#include <rte_sched.h>
+#include <rte_eth_softnic.h>
+#include <rte_tm.h>
+#endif
+
 #include "testpmd.h"
 
 static struct cmdline *testpmd_cl;
@@ -230,6 +243,23 @@  static void cmd_help_long_parsed(void *parsed_result,
 
 			"clear vf stats (port_id) (vf_id)\n"
 			"    Reset a VF's statistics.\n\n"
+
+#ifdef TM_MODE
+			"show port tm cap (port_id)\n"
+			"	Display the port TM capability.\n\n"
+
+			"show port tm level cap (port_id) (level_id)\n"
+			"	Display the port TM hierarchical level capability.\n\n"
+
+			"show port tm node cap (port_id) (node_id)\n"
+			"	Display the port TM node capability.\n\n"
+
+			"show port tm node type (port_id) (node_id)\n"
+			"	Display the port TM node type.\n\n"
+
+			"show port tm node stats (port_id) (node_id) (clear)\n"
+			"	Display the port TM node stats.\n\n"
+#endif
 		);
 	}
 
@@ -637,6 +667,61 @@  static void cmd_help_long_parsed(void *parsed_result,
 			"ptype mapping update (port_id) (hw_ptype) (sw_ptype)\n"
 			"    Update a ptype mapping item on a port\n\n"
 
+#ifdef TM_MODE
+			"add port tm node shaper profile (port_id) (shaper_profile_id)"
+			" (tb_rate) (tb_size)\n"
+			"	Add port tm node private shaper profile.\n\n"
+
+			"del port tm node shaper profile (port_id) (shaper_profile_id)\n"
+			"	Delete port tm node private shaper profile.\n\n"
+
+			"add port tm node shared shaper (port_id) (shared_shaper_id)"
+			" (shaper_profile_id)\n"
+			"	Add/update port tm node shared shaper.\n\n"
+
+			"del port tm node shared shaper (port_id) (shared_shaper_id)\n"
+			"	Delete port tm node shared shaper.\n\n"
+
+			"add port tm node wred profile (port_id) (wred_profile_id)"
+			" (color_g) (min_th_g) (max_th_g) (maxp_inv_g) (wq_log2_g)"
+			" (color_y) (min_th_y) (max_th_y) (maxp_inv_y) (wq_log2_y)"
+			" (color_r) (min_th_r) (max_th_r) (maxp_inv_r) (wq_log2_r)\n"
+			"	Add port tm node wred profile.\n\n"
+
+			"del port tm node wred profile (port_id) (wred_profile_id)\n"
+			"	Delete port tm node wred profile.\n\n"
+
+			"add port tm nonleaf node shared shaper (port_id) (node_id)"
+			" (parent_node_id) (priority) (weight) (level_id)"
+			" (shaper_profile_id) (shared_shaper_id) (n_shared_shapers)"
+			" (n_sp_priorities)\n"
+			"	Add port tm nonleaf node.\n\n"
+
+			"add port tm leaf node shared shaper (port_id) (node_id)"
+			" (parent_node_id) (priority) (weight) (level_id)"
+			" (cman_mode) (wred_profile_id)\n"
+			"	Add port tm leaf node.\n\n"
+
+			"del port tm node (port_id) (node_id)\n"
+			"	Delete port tm node.\n\n"
+
+#ifdef RTE_SCHED_SUBPORT_TC_OV
+			"set port tm node parent (port_id) (node_id) (parent_node_id)"
+			" (priority) (weight)\n"
+			"	Set port tm node parent.\n\n"
+#endif
+			"set port tm node shaper profile (port_id) (node_id)"
+			" (shaper_profile_id)\n"
+			"	Set port tm node shaper profile.\n\n"
+
+			"set port tm pktfield (subport|pipe|tc) (port_id) offset"
+			" (offset) mask (mask)\n"
+			"	Set port tm packet field.\n\n"
+
+			"set port tm tc table (port_id) index (tb_index) tc (tc_id)"
+			" queue (queue id)\n"
+			"	Set port tm traffic class table entry.\n\n"
+#endif
 			, list_pkt_forwarding_modes()
 		);
 	}
@@ -14185,197 +14270,2707 @@  cmdline_parse_inst_t cmd_load_from_file = {
 	},
 };
 
-/* ******************************************************************************** */
+#ifdef TM_MODE
 
-/* list of instructions */
-cmdline_parse_ctx_t main_ctx[] = {
-	(cmdline_parse_inst_t *)&cmd_help_brief,
-	(cmdline_parse_inst_t *)&cmd_help_long,
-	(cmdline_parse_inst_t *)&cmd_quit,
-	(cmdline_parse_inst_t *)&cmd_load_from_file,
-	(cmdline_parse_inst_t *)&cmd_showport,
-	(cmdline_parse_inst_t *)&cmd_showqueue,
-	(cmdline_parse_inst_t *)&cmd_showportall,
-	(cmdline_parse_inst_t *)&cmd_showcfg,
-	(cmdline_parse_inst_t *)&cmd_start,
-	(cmdline_parse_inst_t *)&cmd_start_tx_first,
-	(cmdline_parse_inst_t *)&cmd_start_tx_first_n,
-	(cmdline_parse_inst_t *)&cmd_set_link_up,
-	(cmdline_parse_inst_t *)&cmd_set_link_down,
-	(cmdline_parse_inst_t *)&cmd_reset,
-	(cmdline_parse_inst_t *)&cmd_set_numbers,
-	(cmdline_parse_inst_t *)&cmd_set_txpkts,
-	(cmdline_parse_inst_t *)&cmd_set_txsplit,
-	(cmdline_parse_inst_t *)&cmd_set_fwd_list,
-	(cmdline_parse_inst_t *)&cmd_set_fwd_mask,
-	(cmdline_parse_inst_t *)&cmd_set_fwd_mode,
-	(cmdline_parse_inst_t *)&cmd_set_fwd_retry_mode,
-	(cmdline_parse_inst_t *)&cmd_set_burst_tx_retry,
-	(cmdline_parse_inst_t *)&cmd_set_promisc_mode_one,
-	(cmdline_parse_inst_t *)&cmd_set_promisc_mode_all,
-	(cmdline_parse_inst_t *)&cmd_set_allmulti_mode_one,
-	(cmdline_parse_inst_t *)&cmd_set_allmulti_mode_all,
-	(cmdline_parse_inst_t *)&cmd_set_flush_rx,
-	(cmdline_parse_inst_t *)&cmd_set_link_check,
-	(cmdline_parse_inst_t *)&cmd_set_bypass_mode,
-	(cmdline_parse_inst_t *)&cmd_set_bypass_event,
-	(cmdline_parse_inst_t *)&cmd_set_bypass_timeout,
-	(cmdline_parse_inst_t *)&cmd_show_bypass_config,
-#ifdef RTE_LIBRTE_PMD_BOND
-	(cmdline_parse_inst_t *) &cmd_set_bonding_mode,
-	(cmdline_parse_inst_t *) &cmd_show_bonding_config,
-	(cmdline_parse_inst_t *) &cmd_set_bonding_primary,
-	(cmdline_parse_inst_t *) &cmd_add_bonding_slave,
-	(cmdline_parse_inst_t *) &cmd_remove_bonding_slave,
-	(cmdline_parse_inst_t *) &cmd_create_bonded_device,
-	(cmdline_parse_inst_t *) &cmd_set_bond_mac_addr,
-	(cmdline_parse_inst_t *) &cmd_set_balance_xmit_policy,
-	(cmdline_parse_inst_t *) &cmd_set_bond_mon_period,
-	(cmdline_parse_inst_t *) &cmd_set_lacp_dedicated_queues,
-	(cmdline_parse_inst_t *) &cmd_set_bonding_agg_mode_policy,
-#endif
-	(cmdline_parse_inst_t *)&cmd_vlan_offload,
-	(cmdline_parse_inst_t *)&cmd_vlan_tpid,
-	(cmdline_parse_inst_t *)&cmd_rx_vlan_filter_all,
-	(cmdline_parse_inst_t *)&cmd_rx_vlan_filter,
-	(cmdline_parse_inst_t *)&cmd_tx_vlan_set,
-	(cmdline_parse_inst_t *)&cmd_tx_vlan_set_qinq,
-	(cmdline_parse_inst_t *)&cmd_tx_vlan_reset,
-	(cmdline_parse_inst_t *)&cmd_tx_vlan_set_pvid,
-	(cmdline_parse_inst_t *)&cmd_csum_set,
-	(cmdline_parse_inst_t *)&cmd_csum_show,
-	(cmdline_parse_inst_t *)&cmd_csum_tunnel,
-	(cmdline_parse_inst_t *)&cmd_tso_set,
-	(cmdline_parse_inst_t *)&cmd_tso_show,
-	(cmdline_parse_inst_t *)&cmd_tunnel_tso_set,
-	(cmdline_parse_inst_t *)&cmd_tunnel_tso_show,
-	(cmdline_parse_inst_t *)&cmd_enable_gro,
-	(cmdline_parse_inst_t *)&cmd_gro_set,
-	(cmdline_parse_inst_t *)&cmd_link_flow_control_set,
-	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_rx,
-	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_tx,
-	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_hw,
-	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_lw,
-	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_pt,
-	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_xon,
-	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_macfwd,
-	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_autoneg,
-	(cmdline_parse_inst_t *)&cmd_priority_flow_control_set,
-	(cmdline_parse_inst_t *)&cmd_config_dcb,
-	(cmdline_parse_inst_t *)&cmd_read_reg,
-	(cmdline_parse_inst_t *)&cmd_read_reg_bit_field,
-	(cmdline_parse_inst_t *)&cmd_read_reg_bit,
-	(cmdline_parse_inst_t *)&cmd_write_reg,
-	(cmdline_parse_inst_t *)&cmd_write_reg_bit_field,
-	(cmdline_parse_inst_t *)&cmd_write_reg_bit,
-	(cmdline_parse_inst_t *)&cmd_read_rxd_txd,
-	(cmdline_parse_inst_t *)&cmd_stop,
-	(cmdline_parse_inst_t *)&cmd_mac_addr,
-	(cmdline_parse_inst_t *)&cmd_set_qmap,
-	(cmdline_parse_inst_t *)&cmd_operate_port,
-	(cmdline_parse_inst_t *)&cmd_operate_specific_port,
-	(cmdline_parse_inst_t *)&cmd_operate_attach_port,
-	(cmdline_parse_inst_t *)&cmd_operate_detach_port,
-	(cmdline_parse_inst_t *)&cmd_config_speed_all,
-	(cmdline_parse_inst_t *)&cmd_config_speed_specific,
-	(cmdline_parse_inst_t *)&cmd_config_rx_tx,
-	(cmdline_parse_inst_t *)&cmd_config_mtu,
-	(cmdline_parse_inst_t *)&cmd_config_max_pkt_len,
-	(cmdline_parse_inst_t *)&cmd_config_rx_mode_flag,
-	(cmdline_parse_inst_t *)&cmd_config_rss,
-	(cmdline_parse_inst_t *)&cmd_config_rxtx_queue,
-	(cmdline_parse_inst_t *)&cmd_config_txqflags,
-	(cmdline_parse_inst_t *)&cmd_config_rss_reta,
-	(cmdline_parse_inst_t *)&cmd_showport_reta,
-	(cmdline_parse_inst_t *)&cmd_config_burst,
-	(cmdline_parse_inst_t *)&cmd_config_thresh,
-	(cmdline_parse_inst_t *)&cmd_config_threshold,
-	(cmdline_parse_inst_t *)&cmd_set_uc_hash_filter,
-	(cmdline_parse_inst_t *)&cmd_set_uc_all_hash_filter,
-	(cmdline_parse_inst_t *)&cmd_vf_mac_addr_filter,
-	(cmdline_parse_inst_t *)&cmd_set_vf_macvlan_filter,
-	(cmdline_parse_inst_t *)&cmd_queue_rate_limit,
-	(cmdline_parse_inst_t *)&cmd_tunnel_filter,
-	(cmdline_parse_inst_t *)&cmd_tunnel_udp_config,
-	(cmdline_parse_inst_t *)&cmd_global_config,
-	(cmdline_parse_inst_t *)&cmd_set_mirror_mask,
-	(cmdline_parse_inst_t *)&cmd_set_mirror_link,
-	(cmdline_parse_inst_t *)&cmd_reset_mirror_rule,
-	(cmdline_parse_inst_t *)&cmd_showport_rss_hash,
-	(cmdline_parse_inst_t *)&cmd_showport_rss_hash_key,
-	(cmdline_parse_inst_t *)&cmd_config_rss_hash_key,
-	(cmdline_parse_inst_t *)&cmd_dump,
-	(cmdline_parse_inst_t *)&cmd_dump_one,
-	(cmdline_parse_inst_t *)&cmd_ethertype_filter,
-	(cmdline_parse_inst_t *)&cmd_syn_filter,
-	(cmdline_parse_inst_t *)&cmd_2tuple_filter,
-	(cmdline_parse_inst_t *)&cmd_5tuple_filter,
-	(cmdline_parse_inst_t *)&cmd_flex_filter,
-	(cmdline_parse_inst_t *)&cmd_add_del_ip_flow_director,
-	(cmdline_parse_inst_t *)&cmd_add_del_udp_flow_director,
-	(cmdline_parse_inst_t *)&cmd_add_del_sctp_flow_director,
-	(cmdline_parse_inst_t *)&cmd_add_del_l2_flow_director,
-	(cmdline_parse_inst_t *)&cmd_add_del_mac_vlan_flow_director,
-	(cmdline_parse_inst_t *)&cmd_add_del_tunnel_flow_director,
-	(cmdline_parse_inst_t *)&cmd_flush_flow_director,
-	(cmdline_parse_inst_t *)&cmd_set_flow_director_ip_mask,
-	(cmdline_parse_inst_t *)&cmd_set_flow_director_mac_vlan_mask,
-	(cmdline_parse_inst_t *)&cmd_set_flow_director_tunnel_mask,
-	(cmdline_parse_inst_t *)&cmd_set_flow_director_flex_mask,
-	(cmdline_parse_inst_t *)&cmd_set_flow_director_flex_payload,
-	(cmdline_parse_inst_t *)&cmd_get_sym_hash_ena_per_port,
-	(cmdline_parse_inst_t *)&cmd_set_sym_hash_ena_per_port,
-	(cmdline_parse_inst_t *)&cmd_get_hash_global_config,
-	(cmdline_parse_inst_t *)&cmd_set_hash_global_config,
-	(cmdline_parse_inst_t *)&cmd_set_hash_input_set,
-	(cmdline_parse_inst_t *)&cmd_set_fdir_input_set,
-	(cmdline_parse_inst_t *)&cmd_flow,
-	(cmdline_parse_inst_t *)&cmd_mcast_addr,
-	(cmdline_parse_inst_t *)&cmd_config_l2_tunnel_eth_type_all,
-	(cmdline_parse_inst_t *)&cmd_config_l2_tunnel_eth_type_specific,
-	(cmdline_parse_inst_t *)&cmd_config_l2_tunnel_en_dis_all,
-	(cmdline_parse_inst_t *)&cmd_config_l2_tunnel_en_dis_specific,
-	(cmdline_parse_inst_t *)&cmd_config_e_tag_insertion_en,
-	(cmdline_parse_inst_t *)&cmd_config_e_tag_insertion_dis,
-	(cmdline_parse_inst_t *)&cmd_config_e_tag_stripping_en_dis,
-	(cmdline_parse_inst_t *)&cmd_config_e_tag_forwarding_en_dis,
-	(cmdline_parse_inst_t *)&cmd_config_e_tag_filter_add,
-	(cmdline_parse_inst_t *)&cmd_config_e_tag_filter_del,
-	(cmdline_parse_inst_t *)&cmd_set_vf_vlan_anti_spoof,
-	(cmdline_parse_inst_t *)&cmd_set_vf_mac_anti_spoof,
-	(cmdline_parse_inst_t *)&cmd_set_vf_vlan_stripq,
-	(cmdline_parse_inst_t *)&cmd_set_vf_vlan_insert,
-	(cmdline_parse_inst_t *)&cmd_set_tx_loopback,
-	(cmdline_parse_inst_t *)&cmd_set_all_queues_drop_en,
-	(cmdline_parse_inst_t *)&cmd_set_vf_split_drop_en,
-	(cmdline_parse_inst_t *)&cmd_set_macsec_offload_on,
-	(cmdline_parse_inst_t *)&cmd_set_macsec_offload_off,
-	(cmdline_parse_inst_t *)&cmd_set_macsec_sc,
-	(cmdline_parse_inst_t *)&cmd_set_macsec_sa,
-	(cmdline_parse_inst_t *)&cmd_set_vf_traffic,
-	(cmdline_parse_inst_t *)&cmd_set_vf_rxmode,
-	(cmdline_parse_inst_t *)&cmd_vf_rate_limit,
-	(cmdline_parse_inst_t *)&cmd_vf_rxvlan_filter,
-	(cmdline_parse_inst_t *)&cmd_set_vf_mac_addr,
-	(cmdline_parse_inst_t *)&cmd_set_vf_promisc,
-	(cmdline_parse_inst_t *)&cmd_set_vf_allmulti,
-	(cmdline_parse_inst_t *)&cmd_set_vf_broadcast,
-	(cmdline_parse_inst_t *)&cmd_set_vf_vlan_tag,
-	(cmdline_parse_inst_t *)&cmd_vf_max_bw,
-	(cmdline_parse_inst_t *)&cmd_vf_tc_min_bw,
-	(cmdline_parse_inst_t *)&cmd_vf_tc_max_bw,
-	(cmdline_parse_inst_t *)&cmd_strict_link_prio,
-	(cmdline_parse_inst_t *)&cmd_tc_min_bw,
-	(cmdline_parse_inst_t *)&cmd_ddp_add,
-	(cmdline_parse_inst_t *)&cmd_ddp_del,
-	(cmdline_parse_inst_t *)&cmd_ddp_get_list,
-	(cmdline_parse_inst_t *)&cmd_ddp_get_info,
-	(cmdline_parse_inst_t *)&cmd_show_vf_stats,
-	(cmdline_parse_inst_t *)&cmd_clear_vf_stats,
-	(cmdline_parse_inst_t *)&cmd_ptype_mapping_get,
-	(cmdline_parse_inst_t *)&cmd_ptype_mapping_replace,
-	(cmdline_parse_inst_t *)&cmd_ptype_mapping_reset,
-	(cmdline_parse_inst_t *)&cmd_ptype_mapping_update,
+/** Display TM Error Message */
+static void
+print_err_msg(struct rte_tm_error *error)
+{
+	static const char *const errstrlist[] = {
+		[RTE_TM_ERROR_TYPE_NONE] = "no error",
+		[RTE_TM_ERROR_TYPE_UNSPECIFIED] = "cause unspecified",
+		[RTE_TM_ERROR_TYPE_CAPABILITIES]
+			= "capability parameter null",
+		[RTE_TM_ERROR_TYPE_LEVEL_ID] = "level id",
+		[RTE_TM_ERROR_TYPE_WRED_PROFILE]
+			= "wred profile null",
+		[RTE_TM_ERROR_TYPE_WRED_PROFILE_GREEN] = "wred profile(green)",
+		[RTE_TM_ERROR_TYPE_WRED_PROFILE_YELLOW]
+			= "wred profile(yellow)",
+		[RTE_TM_ERROR_TYPE_WRED_PROFILE_RED] = "wred profile(red)",
+		[RTE_TM_ERROR_TYPE_WRED_PROFILE_ID] = "wred profile id",
+		[RTE_TM_ERROR_TYPE_SHARED_WRED_CONTEXT_ID]
+			= "shared wred context id",
+		[RTE_TM_ERROR_TYPE_SHAPER_PROFILE] = "shaper profile null",
+		[RTE_TM_ERROR_TYPE_SHAPER_PROFILE_COMMITTED_RATE]
+			= "committed rate field (shaper profile)",
+		[RTE_TM_ERROR_TYPE_SHAPER_PROFILE_COMMITTED_SIZE]
+			= "committed size field (shaper profile)",
+		[RTE_TM_ERROR_TYPE_SHAPER_PROFILE_PEAK_RATE]
+			= "peak rate field (shaper profile)",
+		[RTE_TM_ERROR_TYPE_SHAPER_PROFILE_PEAK_SIZE]
+			= "peak size field (shaper profile)",
+		[RTE_TM_ERROR_TYPE_SHAPER_PROFILE_PKT_ADJUST_LEN]
+			= "packet adjust length field (shaper profile)",
+		[RTE_TM_ERROR_TYPE_SHAPER_PROFILE_ID] = "shaper profile id",
+		[RTE_TM_ERROR_TYPE_SHARED_SHAPER_ID] = "shared shaper id",
+		[RTE_TM_ERROR_TYPE_NODE_PARENT_NODE_ID] = "parent node id",
+		[RTE_TM_ERROR_TYPE_NODE_PRIORITY] = "node priority",
+		[RTE_TM_ERROR_TYPE_NODE_WEIGHT] = "node weight",
+		[RTE_TM_ERROR_TYPE_NODE_PARAMS] = "node parameter null",
+		[RTE_TM_ERROR_TYPE_NODE_PARAMS_SHAPER_PROFILE_ID]
+			= "shaper profile id field (node params)",
+		[RTE_TM_ERROR_TYPE_NODE_PARAMS_SHARED_SHAPER_ID]
+			= "shared shaper id field (node params)",
+		[RTE_TM_ERROR_TYPE_NODE_PARAMS_N_SHARED_SHAPERS]
+			= "num shared shapers field (node params)",
+		[RTE_TM_ERROR_TYPE_NODE_PARAMS_WFQ_WEIGHT_MODE]
+			= "wfq weght mode field (node params)",
+		[RTE_TM_ERROR_TYPE_NODE_PARAMS_N_SP_PRIORITIES]
+			= "num strict priorities field (node params)",
+		[RTE_TM_ERROR_TYPE_NODE_PARAMS_CMAN]
+			= "congestion management mode field (node params)",
+		[RTE_TM_ERROR_TYPE_NODE_PARAMS_WRED_PROFILE_ID] =
+			"wred profile id field (node params)",
+		[RTE_TM_ERROR_TYPE_NODE_PARAMS_SHARED_WRED_CONTEXT_ID]
+			= "shared wred context id field (node params)",
+		[RTE_TM_ERROR_TYPE_NODE_PARAMS_N_SHARED_WRED_CONTEXTS]
+			= "num shared wred contexts field (node params)",
+		[RTE_TM_ERROR_TYPE_NODE_PARAMS_STATS]
+			= "stats field (node params)",
+		[RTE_TM_ERROR_TYPE_NODE_ID] = "node id",
+	};
+
+	const char *errstr;
+	char buf[64];
+
+	if ((unsigned int)error->type >= RTE_DIM(errstrlist) ||
+		!errstrlist[error->type])
+		errstr = "unknown type";
+	else
+		errstr = errstrlist[error->type];
+
+	if (error->cause)
+		snprintf(buf, sizeof(buf), "cause: %p, ", error->cause);
+
+	printf("%s: %s%s (error %d)\n", errstr, error->cause ? buf : "",
+		error->message ? error->message : "(no stated reason)",
+		error->type);
+}
+
+/* *** Port TM Capability *** */
+struct cmd_show_port_tm_cap_result {
+	cmdline_fixed_string_t show;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t cap;
+	uint8_t port_id;
+};
+
+cmdline_parse_token_string_t cmd_show_port_tm_cap_show =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_port_tm_cap_result,
+		show, "show");
+cmdline_parse_token_string_t cmd_show_port_tm_cap_port =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_port_tm_cap_result,
+		port, "port");
+cmdline_parse_token_string_t cmd_show_port_tm_cap_tm =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_port_tm_cap_result,
+		tm, "tm");
+cmdline_parse_token_string_t cmd_show_port_tm_cap_cap =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_port_tm_cap_result,
+		cap, "cap");
+cmdline_parse_token_num_t cmd_show_port_tm_cap_port_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_show_port_tm_cap_result,
+		 port_id, UINT8);
+
+static void cmd_show_port_tm_cap_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_show_port_tm_cap_result *res = parsed_result;
+	struct rte_port *port;
+	struct rte_tm_capabilities cap;
+	struct rte_tm_error error;
+	uint8_t port_id = res->port_id;
+	uint32_t i;
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	memset(&cap, 0, sizeof(struct rte_tm_capabilities));
+	ret = rte_tm_capabilities_get(port_id, &cap, &error);
+	if (ret) {
+		print_err_msg(&error);
+		return;
+	}
+
+	printf("\n****   Port TM Capabilities ****\n\n");
+	printf("cap.n_nodes_max %u\n", cap.n_nodes_max);
+	printf("cap.n_levels_max %u\n", cap.n_levels_max);
+	printf("cap.non_leaf_nodes_identical %d\n",
+		cap.non_leaf_nodes_identical);
+	printf("cap.leaf_nodes_identical %d\n", cap.leaf_nodes_identical);
+	printf("cap.shaper_n_max %u\n", cap.shaper_n_max);
+	printf("cap.shaper_private_n_max %u\n", cap.shaper_private_n_max);
+	printf("cap.shaper_private_dual_rate_n_max %d\n",
+		cap.shaper_private_dual_rate_n_max);
+	printf("cap.shaper_private_rate_min %lu\n",
+		cap.shaper_private_rate_min);
+	printf("cap.shaper_private_rate_max %lu\n",
+		cap.shaper_private_rate_max);
+	printf("cap.shaper_shared_n_max %u\n", cap.shaper_shared_n_max);
+	printf("cap.shaper_shared_n_nodes_per_shaper_max %u\n",
+		cap.shaper_shared_n_nodes_per_shaper_max);
+	printf("cap.shaper_shared_n_shapers_per_node_max %u\n",
+		cap.shaper_shared_n_shapers_per_node_max);
+	printf("cap.shaper_shared_dual_rate_n_max %u\n",
+		cap.shaper_shared_dual_rate_n_max);
+	printf("cap.shaper_shared_rate_min %lu\n",
+		cap.shaper_shared_rate_min);
+	printf("cap.shaper_shared_rate_max %lu\n",
+		cap.shaper_shared_rate_max);
+	printf("cap.shaper_pkt_length_adjust_min %d\n",
+		cap.shaper_pkt_length_adjust_min);
+	printf("cap.shaper_pkt_length_adjust_max %d\n",
+		cap.shaper_pkt_length_adjust_max);
+	printf("cap.sched_n_children_max %u\n", cap.sched_n_children_max);
+	printf("cap.sched_sp_n_priorities_max %u\n",
+		cap.sched_sp_n_priorities_max);
+	printf("cap.sched_wfq_n_children_per_group_max %u\n",
+		cap.sched_wfq_n_children_per_group_max);
+	printf("cap.sched_wfq_n_groups_max %u\n", cap.sched_wfq_n_groups_max);
+	printf("cap.sched_wfq_weight_max %u\n", cap.sched_wfq_weight_max);
+	printf("cap.cman_head_drop_supported %d\n",
+		cap.cman_head_drop_supported);
+	printf("cap.cman_wred_context_n_max %u\n", cap.cman_wred_context_n_max);
+	printf("cap.cman_wred_context_private_n_max %u\n",
+		cap.cman_wred_context_private_n_max);
+	printf("cap.cman_wred_context_shared_n_max %u\n",
+		cap.cman_wred_context_shared_n_max);
+	printf("cap.cman_wred_context_shared_n_nodes_per_context_max %u\n",
+		cap.cman_wred_context_shared_n_nodes_per_context_max);
+	printf("cap.cman_wred_context_shared_n_contexts_per_node_max %u\n",
+		cap.cman_wred_context_shared_n_contexts_per_node_max);
+
+	for (i = 0; i < RTE_TM_COLORS; i++) {
+		printf("cap.mark_vlan_dei_supported %d\n",
+			cap.mark_vlan_dei_supported[i]);
+		printf("cap.mark_ip_ecn_tcp_supported %d\n",
+			cap.mark_ip_ecn_tcp_supported[i]);
+		printf("cap.mark_ip_ecn_sctp_supported %d\n",
+			cap.mark_ip_ecn_sctp_supported[i]);
+		printf("cap.mark_ip_dscp_supported %d\n",
+			cap.mark_ip_dscp_supported[i]);
+	}
+
+	printf("cap.dynamic_update_mask %lu\n", cap.dynamic_update_mask);
+	printf("cap.stats_mask %lu\n", cap.stats_mask);
+}
+
+cmdline_parse_inst_t cmd_show_port_tm_cap = {
+	.f = cmd_show_port_tm_cap_parsed,
+	.data = NULL,
+	.help_str = "Show Port TM Capabilities",
+	.tokens = {
+		(void *)&cmd_show_port_tm_cap_show,
+		(void *)&cmd_show_port_tm_cap_port,
+		(void *)&cmd_show_port_tm_cap_tm,
+		(void *)&cmd_show_port_tm_cap_cap,
+		(void *)&cmd_show_port_tm_cap_port_id,
+		NULL,
+	},
+};
+
+/* *** Port TM Hierarchical Level Capability *** */
+struct cmd_show_port_tm_level_cap_result {
+	cmdline_fixed_string_t show;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t level;
+	cmdline_fixed_string_t cap;
+	uint8_t port_id;
+	uint32_t level_id;
+};
+
+cmdline_parse_token_string_t cmd_show_port_tm_level_cap_show =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_port_tm_level_cap_result,
+		show, "show");
+cmdline_parse_token_string_t cmd_show_port_tm_level_cap_port =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_port_tm_level_cap_result,
+		port, "port");
+cmdline_parse_token_string_t cmd_show_port_tm_level_cap_tm =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_port_tm_level_cap_result,
+		tm, "tm");
+cmdline_parse_token_string_t cmd_show_port_tm_level_cap_level =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_port_tm_level_cap_result,
+		level, "level");
+cmdline_parse_token_string_t cmd_show_port_tm_level_cap_cap =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_port_tm_level_cap_result,
+		cap, "cap");
+cmdline_parse_token_num_t cmd_show_port_tm_level_cap_port_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_show_port_tm_level_cap_result,
+		 port_id, UINT8);
+cmdline_parse_token_num_t cmd_show_port_tm_level_cap_level_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_show_port_tm_level_cap_result,
+		 level_id, UINT32);
+
+
+static void cmd_show_port_tm_level_cap_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_show_port_tm_level_cap_result *res = parsed_result;
+	struct rte_port *port;
+	struct rte_tm_level_capabilities lcap;
+	struct rte_tm_error error;
+	uint8_t port_id = res->port_id;
+	int ret, level_id = res->level_id;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	if ((level_id > 4) || (level_id < 0)) {
+		printf("  TM hierarchical level invalid !! ");
+		return;
+	}
+
+	memset(&lcap, 0, sizeof(struct rte_tm_level_capabilities));
+	ret = rte_tm_level_capabilities_get(port_id, level_id, &lcap, &error);
+	if (ret) {
+		print_err_msg(&error);
+		return;
+	}
+	printf("\n****   Port TM Hierarchy level %u Capability ****\n\n",
+		level_id);
+
+	printf("cap.n_nodes_max %u\n", lcap.n_nodes_max);
+	printf("cap.n_nodes_nonleaf_max %u\n", lcap.n_nodes_nonleaf_max);
+	printf("cap.n_nodes_leaf_max %u\n", lcap.n_nodes_leaf_max);
+	printf("cap.non_leaf_nodes_identical %d\n",
+		lcap.non_leaf_nodes_identical);
+	printf("cap.leaf_nodes_identical %d\n", lcap.leaf_nodes_identical);
+	if (level_id <= 3) {
+		printf("cap.nonleaf.shaper_private_supported %d\n",
+			lcap.nonleaf.shaper_private_supported);
+		printf("cap.nonleaf.shaper_private_dual_rate_supported %d\n",
+			lcap.nonleaf.shaper_private_dual_rate_supported);
+		printf("cap.nonleaf.shaper_private_rate_min %lu\n",
+			lcap.nonleaf.shaper_private_rate_min);
+		printf("cap.nonleaf.shaper_private_rate_max %lu\n",
+			lcap.nonleaf.shaper_private_rate_max);
+		printf("cap.nonleaf.shaper_shared_n_max %u\n",
+			lcap.nonleaf.shaper_shared_n_max);
+		printf("cap.nonleaf.sched_n_children_max %u\n",
+			lcap.nonleaf.sched_n_children_max);
+		printf("cap.nonleaf.sched_sp_n_priorities_max %u\n",
+			lcap.nonleaf.sched_sp_n_priorities_max);
+		printf("cap.nonleaf.sched_wfq_n_children_per_group_max %u\n",
+			lcap.nonleaf.sched_wfq_n_children_per_group_max);
+		printf("cap.nonleaf.sched_wfq_n_groups_max %u\n",
+			lcap.nonleaf.sched_wfq_n_groups_max);
+		printf("cap.nonleaf.sched_wfq_weight_max %u\n",
+			lcap.nonleaf.sched_wfq_weight_max);
+		printf("cap.nonleaf.stats_mask %lu\n", lcap.nonleaf.stats_mask);
+	} else {
+		printf("cap.leaf.shaper_private_supported %d\n",
+			lcap.leaf.shaper_private_supported);
+		printf("cap.leaf.shaper_private_dual_rate_supported %d\n",
+			lcap.leaf.shaper_private_dual_rate_supported);
+		printf("cap.leaf.shaper_private_rate_min %lu\n",
+			lcap.leaf.shaper_private_rate_min);
+		printf("cap.leaf.shaper_private_rate_max %lu\n",
+			lcap.leaf.shaper_private_rate_max);
+		printf("cap.leaf.shaper_shared_n_max %u\n",
+			lcap.leaf.shaper_shared_n_max);
+		printf("cap.leaf.cman_head_drop_supported %d\n",
+			lcap.leaf.cman_head_drop_supported);
+		printf("cap.leaf.cman_wred_context_private_supported %d\n",
+			lcap.leaf.cman_wred_context_private_supported);
+		printf("cap.leaf.cman_wred_context_shared_n_max %u\n",
+			lcap.leaf.cman_wred_context_shared_n_max);
+		printf("cap.leaf.stats_mask %lu\n",
+			lcap.leaf.stats_mask);
+	}
+}
+
+cmdline_parse_inst_t cmd_show_port_tm_level_cap = {
+	.f = cmd_show_port_tm_level_cap_parsed,
+	.data = NULL,
+	.help_str = "Show Port TM Hierarhical level Capabilities",
+	.tokens = {
+		(void *)&cmd_show_port_tm_level_cap_show,
+		(void *)&cmd_show_port_tm_level_cap_port,
+		(void *)&cmd_show_port_tm_level_cap_tm,
+		(void *)&cmd_show_port_tm_level_cap_level,
+		(void *)&cmd_show_port_tm_level_cap_cap,
+		(void *)&cmd_show_port_tm_level_cap_port_id,
+		(void *)&cmd_show_port_tm_level_cap_level_id,
+		NULL,
+	},
+};
+
+/* *** Port TM Hierarchy Node Capability *** */
+struct cmd_show_port_tm_node_cap_result {
+	cmdline_fixed_string_t show;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t node;
+	cmdline_fixed_string_t cap;
+	uint8_t port_id;
+	uint32_t node_id;
+};
+
+cmdline_parse_token_string_t cmd_show_port_tm_node_cap_show =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_port_tm_node_cap_result,
+		show, "show");
+cmdline_parse_token_string_t cmd_show_port_tm_node_cap_port =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_port_tm_node_cap_result,
+		port, "port");
+cmdline_parse_token_string_t cmd_show_port_tm_node_cap_tm =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_port_tm_node_cap_result,
+		tm, "tm");
+cmdline_parse_token_string_t cmd_show_port_tm_node_cap_node =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_port_tm_node_cap_result,
+		node, "node");
+cmdline_parse_token_string_t cmd_show_port_tm_node_cap_cap =
+	TOKEN_STRING_INITIALIZER(struct cmd_show_port_tm_node_cap_result,
+		cap, "cap");
+cmdline_parse_token_num_t cmd_show_port_tm_node_cap_port_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_show_port_tm_node_cap_result,
+		 port_id, UINT8);
+cmdline_parse_token_num_t cmd_show_port_tm_node_cap_node_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_show_port_tm_node_cap_result,
+		 node_id, UINT32);
+
+static void cmd_show_port_tm_node_cap_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_show_port_tm_node_cap_result *res = parsed_result;
+	struct rte_port *port;
+	struct rte_tm_node_capabilities ncap;
+	struct rte_tm_error error;
+	uint32_t node_id = res->node_id;
+	uint8_t port_id = res->port_id;
+	int ret, is_leaf = 0;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	/* Node id must be valid */
+	ret = rte_tm_node_type_get(port_id, node_id, &is_leaf, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+
+	memset(&ncap, 0, sizeof(struct rte_tm_node_capabilities));
+	ret = rte_tm_node_capabilities_get(port_id, node_id, &ncap, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+	printf("\n****   Port TM Hierarchy node %u Capability ****\n\n",
+		node_id);
+	printf("cap.shaper_private_supported %d\n",
+		ncap.shaper_private_supported);
+	printf("cap.shaper_private_dual_rate_supported %d\n",
+		ncap.shaper_private_dual_rate_supported);
+	printf("cap.shaper_private_rate_min %lu\n",
+		ncap.shaper_private_rate_min);
+	printf("cap.shaper_private_rate_max %lu\n",
+		ncap.shaper_private_rate_max);
+	printf("cap.shaper_shared_n_max %u\n",
+		ncap.shaper_shared_n_max);
+	if (!is_leaf) {
+		printf("cap.nonleaf.sched_n_children_max %u\n",
+			ncap.nonleaf.sched_n_children_max);
+		printf("cap.nonleaf.sched_sp_n_priorities_max %u\n",
+			ncap.nonleaf.sched_sp_n_priorities_max);
+		printf("cap.nonleaf.sched_wfq_n_children_per_group_max %u\n",
+			ncap.nonleaf.sched_wfq_n_children_per_group_max);
+		printf("cap.nonleaf.sched_wfq_n_groups_max %u\n",
+			ncap.nonleaf.sched_wfq_n_groups_max);
+		printf("cap.nonleaf.sched_wfq_weight_max %u\n",
+			ncap.nonleaf.sched_wfq_weight_max);
+	} else {
+		printf("cap.leaf.cman_head_drop_supported %d\n",
+			ncap.leaf.cman_head_drop_supported);
+		printf("cap.leaf.cman_wred_context_private_supported %d\n",
+			ncap.leaf.cman_wred_context_private_supported);
+		printf("cap.leaf.cman_wred_context_shared_n_max %u\n",
+			ncap.leaf.cman_wred_context_shared_n_max);
+	}
+	printf("cap.stats_mask %lu\n", ncap.stats_mask);
+}
+
+cmdline_parse_inst_t cmd_show_port_tm_node_cap = {
+	.f = cmd_show_port_tm_node_cap_parsed,
+	.data = NULL,
+	.help_str = "Show Port TM Hierarchy node capabilities",
+	.tokens = {
+		(void *)&cmd_show_port_tm_node_cap_show,
+		(void *)&cmd_show_port_tm_node_cap_port,
+		(void *)&cmd_show_port_tm_node_cap_tm,
+		(void *)&cmd_show_port_tm_node_cap_node,
+		(void *)&cmd_show_port_tm_node_cap_cap,
+		(void *)&cmd_show_port_tm_node_cap_port_id,
+		(void *)&cmd_show_port_tm_node_cap_node_id,
+		NULL,
+	},
+};
+
+/* *** Add Port TM Private Shaper Profile *** */
+struct cmd_add_port_tm_node_shaper_profile_result {
+	cmdline_fixed_string_t add;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t node;
+	cmdline_fixed_string_t shaper;
+	cmdline_fixed_string_t profile;
+	uint8_t port_id;
+	uint32_t shaper_id;
+	uint64_t tb_rate;
+	uint64_t tb_size;
+};
+
+cmdline_parse_token_string_t cmd_add_port_tm_node_shaper_profile_add =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_shaper_profile_result, add, "add");
+cmdline_parse_token_string_t cmd_add_port_tm_node_shaper_profile_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_shaper_profile_result,
+			port, "port");
+cmdline_parse_token_string_t cmd_add_port_tm_node_shaper_profile_tm =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_shaper_profile_result,
+			tm, "tm");
+cmdline_parse_token_string_t cmd_add_port_tm_node_shaper_profile_node =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_shaper_profile_result,
+			node, "node");
+cmdline_parse_token_string_t cmd_add_port_tm_node_shaper_profile_shaper =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_shaper_profile_result,
+			shaper, "shaper");
+cmdline_parse_token_string_t cmd_add_port_tm_node_shaper_profile_profile =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_shaper_profile_result,
+			profile, "profile");
+cmdline_parse_token_num_t cmd_add_port_tm_node_shaper_profile_port_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_shaper_profile_result,
+			port_id, UINT8);
+cmdline_parse_token_num_t cmd_add_port_tm_node_shaper_profile_shaper_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_shaper_profile_result,
+			shaper_id, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_node_shaper_profile_tb_rate =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_shaper_profile_result,
+			tb_rate, UINT64);
+cmdline_parse_token_num_t cmd_add_port_tm_node_shaper_profile_tb_size =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_shaper_profile_result,
+			tb_size, UINT64);
+
+static void cmd_add_port_tm_node_shaper_profile_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_add_port_tm_node_shaper_profile_result *res = parsed_result;
+	struct rte_port *port;
+	struct rte_tm_shaper_params sp;
+	struct rte_tm_error error;
+	uint32_t shaper_id = res->shaper_id;
+	uint8_t port_id = res->port_id;
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	/* Private shaper profile params */
+	memset(&sp, 0, sizeof(struct rte_tm_shaper_params));
+	sp.peak.rate = res->tb_rate;
+	sp.peak.size = res->tb_size;
+	sp.pkt_length_adjust = RTE_TM_ETH_FRAMING_OVERHEAD_FCS;
+
+	ret = rte_tm_shaper_profile_add(port_id, shaper_id, &sp, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+}
+
+cmdline_parse_inst_t cmd_add_port_tm_node_shaper_profile = {
+	.f = cmd_add_port_tm_node_shaper_profile_parsed,
+	.data = NULL,
+	.help_str = "Add port tm node private shaper profile",
+	.tokens = {
+		(void *)&cmd_add_port_tm_node_shaper_profile_add,
+		(void *)&cmd_add_port_tm_node_shaper_profile_port,
+		(void *)&cmd_add_port_tm_node_shaper_profile_tm,
+		(void *)&cmd_add_port_tm_node_shaper_profile_node,
+		(void *)&cmd_add_port_tm_node_shaper_profile_shaper,
+		(void *)&cmd_add_port_tm_node_shaper_profile_profile,
+		(void *)&cmd_add_port_tm_node_shaper_profile_port_id,
+		(void *)&cmd_add_port_tm_node_shaper_profile_shaper_id,
+		(void *)&cmd_add_port_tm_node_shaper_profile_tb_rate,
+		(void *)&cmd_add_port_tm_node_shaper_profile_tb_size,
+		NULL,
+	},
+};
+
+/* *** Delete Port TM Private Shaper Profile *** */
+struct cmd_del_port_tm_node_shaper_profile_result {
+	cmdline_fixed_string_t del;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t node;
+	cmdline_fixed_string_t shaper;
+	cmdline_fixed_string_t profile;
+	uint8_t port_id;
+	uint32_t shaper_id;
+};
+
+cmdline_parse_token_string_t cmd_del_port_tm_node_shaper_profile_del =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_shaper_profile_result, del, "del");
+cmdline_parse_token_string_t cmd_del_port_tm_node_shaper_profile_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_shaper_profile_result,
+			port, "port");
+cmdline_parse_token_string_t cmd_del_port_tm_node_shaper_profile_tm =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_shaper_profile_result, tm, "tm");
+cmdline_parse_token_string_t cmd_del_port_tm_node_shaper_profile_node =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_shaper_profile_result,
+			node, "node");
+cmdline_parse_token_string_t cmd_del_port_tm_node_shaper_profile_shaper =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_shaper_profile_result,
+			shaper, "shaper");
+cmdline_parse_token_string_t cmd_del_port_tm_node_shaper_profile_profile =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_shaper_profile_result,
+			profile, "profile");
+cmdline_parse_token_num_t cmd_del_port_tm_node_shaper_profile_port_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_del_port_tm_node_shaper_profile_result,
+			port_id, UINT8);
+cmdline_parse_token_num_t cmd_del_port_tm_node_shaper_profile_shaper_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_del_port_tm_node_shaper_profile_result,
+			shaper_id, UINT32);
+
+static void cmd_del_port_tm_node_shaper_profile_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_del_port_tm_node_shaper_profile_result *res = parsed_result;
+	struct rte_port *port;
+	struct rte_tm_error error;
+	uint32_t shaper_id = res->shaper_id;
+	uint8_t port_id = res->port_id;
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	ret = rte_tm_shaper_profile_delete(port_id, shaper_id, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+}
+
+cmdline_parse_inst_t cmd_del_port_tm_node_shaper_profile = {
+	.f = cmd_del_port_tm_node_shaper_profile_parsed,
+	.data = NULL,
+	.help_str = "Delete port tm node private shaper profile",
+	.tokens = {
+		(void *)&cmd_del_port_tm_node_shaper_profile_del,
+		(void *)&cmd_del_port_tm_node_shaper_profile_port,
+		(void *)&cmd_del_port_tm_node_shaper_profile_tm,
+		(void *)&cmd_del_port_tm_node_shaper_profile_node,
+		(void *)&cmd_del_port_tm_node_shaper_profile_shaper,
+		(void *)&cmd_del_port_tm_node_shaper_profile_profile,
+		(void *)&cmd_del_port_tm_node_shaper_profile_port_id,
+		(void *)&cmd_del_port_tm_node_shaper_profile_shaper_id,
+		NULL,
+	},
+};
+
+/* *** Add/Update Port TM shared Shaper *** */
+struct cmd_add_port_tm_node_shared_shaper_result {
+	cmdline_fixed_string_t cmd_type;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t node;
+	cmdline_fixed_string_t shared;
+	cmdline_fixed_string_t shaper;
+	uint8_t port_id;
+	uint32_t shared_shaper_id;
+	uint32_t shaper_profile_id;
+};
+
+cmdline_parse_token_string_t cmd_add_port_tm_node_shared_shaper_cmd_type =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_shared_shaper_result,
+			cmd_type, "add#set");
+cmdline_parse_token_string_t cmd_add_port_tm_node_shared_shaper_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_shared_shaper_result, port, "port");
+cmdline_parse_token_string_t cmd_add_port_tm_node_shared_shaper_tm =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_shared_shaper_result, tm, "tm");
+cmdline_parse_token_string_t cmd_add_port_tm_node_shared_shaper_node =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_shared_shaper_result, node, "node");
+cmdline_parse_token_string_t cmd_add_port_tm_node_shared_shaper_shared =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_shared_shaper_result,
+			shared, "shared");
+cmdline_parse_token_string_t cmd_add_port_tm_node_shared_shaper_shaper =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_shared_shaper_result,
+			shaper, "shaper");
+cmdline_parse_token_num_t cmd_add_port_tm_node_shared_shaper_port_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_shared_shaper_result,
+			port_id, UINT8);
+cmdline_parse_token_num_t cmd_add_port_tm_node_shared_shaper_shared_shaper_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_shared_shaper_result,
+			shared_shaper_id, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_node_shared_shaper_shaper_profile_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_shared_shaper_result,
+			shaper_profile_id, UINT32);
+
+static void cmd_add_port_tm_node_shared_shaper_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_add_port_tm_node_shared_shaper_result *res = parsed_result;
+	struct rte_port *port;
+	struct rte_tm_error error;
+	struct rte_eth_link link;
+	uint32_t shared_shaper_id = res->shared_shaper_id;
+	uint32_t shaper_profile_id = res->shaper_profile_id;
+	uint8_t port_id = res->port_id;
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+	memset(&link, 0, sizeof(link));
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	/* Command type: add */
+	if (strcmp(res->cmd_type, "add") == 0) {
+		/* Port link status */
+		rte_eth_link_get_nowait(port_id, &link);
+		if (link.link_status == ETH_LINK_UP) {
+			printf(" Port %u link up (error)\n", port_id);
+			return;
+		}
+
+		/* TM hierarchy status */
+		if (port->softport.tm.hierarchy_frozen == 1)
+			port->softport.tm.hierarchy_frozen = 0;
+	}
+
+	/* Command type: set (update) */
+	if (strcmp(res->cmd_type, "set") == 0) {
+		/* TM hierarchy status */
+		if (port->softport.tm.hierarchy_frozen == 0) {
+			printf(" hierarchy not frozen (error)\n");
+			return;
+		}
+
+		rte_eth_link_get_nowait(port_id, &link);
+		if (link.link_status == ETH_LINK_DOWN) {
+			printf(" Port %u link down (error)\n", port_id);
+			return;
+		}
+	}
+
+	ret = rte_tm_shared_shaper_add_update(port_id, shared_shaper_id,
+		shaper_profile_id, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+}
+
+cmdline_parse_inst_t cmd_add_port_tm_node_shared_shaper = {
+	.f = cmd_add_port_tm_node_shared_shaper_parsed,
+	.data = NULL,
+	.help_str = "add/update port tm node shared shaper",
+	.tokens = {
+		(void *)&cmd_add_port_tm_node_shared_shaper_cmd_type,
+		(void *)&cmd_add_port_tm_node_shared_shaper_port,
+		(void *)&cmd_add_port_tm_node_shared_shaper_tm,
+		(void *)&cmd_add_port_tm_node_shared_shaper_node,
+		(void *)&cmd_add_port_tm_node_shared_shaper_shared,
+		(void *)&cmd_add_port_tm_node_shared_shaper_shaper,
+		(void *)&cmd_add_port_tm_node_shared_shaper_port_id,
+		(void *)&cmd_add_port_tm_node_shared_shaper_shared_shaper_id,
+		(void *)&cmd_add_port_tm_node_shared_shaper_shaper_profile_id,
+		NULL,
+	},
+};
+
+/* *** Delete Port TM shared Shaper *** */
+struct cmd_del_port_tm_node_shared_shaper_result {
+	cmdline_fixed_string_t del;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t node;
+	cmdline_fixed_string_t shared;
+	cmdline_fixed_string_t shaper;
+	uint8_t port_id;
+	uint32_t shared_shaper_id;
+};
+
+cmdline_parse_token_string_t cmd_del_port_tm_node_shared_shaper_del =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_shared_shaper_result, del, "del");
+cmdline_parse_token_string_t cmd_del_port_tm_node_shared_shaper_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_shared_shaper_result, port, "port");
+cmdline_parse_token_string_t cmd_del_port_tm_node_shared_shaper_tm =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_shared_shaper_result, tm, "tm");
+cmdline_parse_token_string_t cmd_del_port_tm_node_shared_shaper_node =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_shared_shaper_result, node, "node");
+cmdline_parse_token_string_t cmd_del_port_tm_node_shared_shaper_shared =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_shared_shaper_result,
+			shared, "shared");
+cmdline_parse_token_string_t cmd_del_port_tm_node_shared_shaper_shaper =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_shared_shaper_result,
+			shaper, "shaper");
+cmdline_parse_token_num_t cmd_del_port_tm_node_shared_shaper_port_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_del_port_tm_node_shared_shaper_result,
+			port_id, UINT8);
+cmdline_parse_token_num_t cmd_del_port_tm_node_shared_shaper_shared_shaper_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_del_port_tm_node_shared_shaper_result,
+			shared_shaper_id, UINT32);
+
+static void cmd_del_port_tm_node_shared_shaper_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_del_port_tm_node_shared_shaper_result *res = parsed_result;
+	struct rte_port *port;
+	struct rte_tm_error error;
+	uint32_t shared_shaper_id = res->shared_shaper_id;
+	uint8_t port_id = res->port_id;
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	ret = rte_tm_shared_shaper_delete(port_id, shared_shaper_id, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+}
+
+cmdline_parse_inst_t cmd_del_port_tm_node_shared_shaper = {
+	.f = cmd_del_port_tm_node_shared_shaper_parsed,
+	.data = NULL,
+	.help_str = "delete port tm node shared shaper",
+	.tokens = {
+		(void *)&cmd_del_port_tm_node_shared_shaper_del,
+		(void *)&cmd_del_port_tm_node_shared_shaper_port,
+		(void *)&cmd_del_port_tm_node_shared_shaper_tm,
+		(void *)&cmd_del_port_tm_node_shared_shaper_node,
+		(void *)&cmd_del_port_tm_node_shared_shaper_shared,
+		(void *)&cmd_del_port_tm_node_shared_shaper_shaper,
+		(void *)&cmd_del_port_tm_node_shared_shaper_port_id,
+		(void *)&cmd_del_port_tm_node_shared_shaper_shared_shaper_id,
+		NULL,
+	},
+};
+
+/* *** Add Port TM Node WRED Profile *** */
+struct cmd_add_port_tm_node_wred_profile_result {
+	cmdline_fixed_string_t add;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t node;
+	cmdline_fixed_string_t wred;
+	cmdline_fixed_string_t profile;
+	uint8_t port_id;
+	uint32_t wred_profile_id;
+	cmdline_fixed_string_t color_g;
+	uint16_t min_th_g;
+	uint16_t max_th_g;
+	uint16_t maxp_inv_g;
+	uint16_t wq_log2_g;
+	cmdline_fixed_string_t color_y;
+	uint16_t min_th_y;
+	uint16_t max_th_y;
+	uint16_t maxp_inv_y;
+	uint16_t wq_log2_y;
+	cmdline_fixed_string_t color_r;
+	uint16_t min_th_r;
+	uint16_t max_th_r;
+	uint16_t maxp_inv_r;
+	uint16_t wq_log2_r;
+};
+
+cmdline_parse_token_string_t cmd_add_port_tm_node_wred_profile_add =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result, add, "add");
+cmdline_parse_token_string_t cmd_add_port_tm_node_wred_profile_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result, port, "port");
+cmdline_parse_token_string_t cmd_add_port_tm_node_wred_profile_tm =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result, tm, "tm");
+cmdline_parse_token_string_t cmd_add_port_tm_node_wred_profile_node =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result, node, "node");
+cmdline_parse_token_string_t cmd_add_port_tm_node_wred_profile_wred =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result, wred, "wred");
+cmdline_parse_token_string_t cmd_add_port_tm_node_wred_profile_profile =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			profile, "profile");
+cmdline_parse_token_num_t cmd_add_port_tm_node_wred_profile_port_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			port_id, UINT8);
+cmdline_parse_token_num_t cmd_add_port_tm_node_wred_profile_wred_profile_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			wred_profile_id, UINT32);
+cmdline_parse_token_string_t cmd_add_port_tm_node_wred_profile_color_g =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			color_g, "G#g");
+cmdline_parse_token_num_t cmd_add_port_tm_node_wred_profile_min_th_g =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			min_th_g, UINT16);
+cmdline_parse_token_num_t cmd_add_port_tm_node_wred_profile_max_th_g =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			max_th_g, UINT16);
+cmdline_parse_token_num_t cmd_add_port_tm_node_wred_profile_maxp_inv_g =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			maxp_inv_g, UINT16);
+cmdline_parse_token_num_t cmd_add_port_tm_node_wred_profile_wq_log2_g =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			wq_log2_g, UINT16);
+cmdline_parse_token_string_t cmd_add_port_tm_node_wred_profile_color_y =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			color_y, "Y#y");
+cmdline_parse_token_num_t cmd_add_port_tm_node_wred_profile_min_th_y =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			min_th_y, UINT16);
+cmdline_parse_token_num_t cmd_add_port_tm_node_wred_profile_max_th_y =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			max_th_y, UINT16);
+cmdline_parse_token_num_t cmd_add_port_tm_node_wred_profile_maxp_inv_y =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			maxp_inv_y, UINT16);
+cmdline_parse_token_num_t cmd_add_port_tm_node_wred_profile_wq_log2_y =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			wq_log2_y, UINT16);
+cmdline_parse_token_string_t cmd_add_port_tm_node_wred_profile_color_r =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			color_r, "R#r");
+cmdline_parse_token_num_t cmd_add_port_tm_node_wred_profile_min_th_r =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			min_th_r, UINT16);
+cmdline_parse_token_num_t cmd_add_port_tm_node_wred_profile_max_th_r =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			max_th_r, UINT16);
+cmdline_parse_token_num_t cmd_add_port_tm_node_wred_profile_maxp_inv_r =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			maxp_inv_r, UINT16);
+cmdline_parse_token_num_t cmd_add_port_tm_node_wred_profile_wq_log2_r =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_node_wred_profile_result,
+			wq_log2_r, UINT16);
+
+
+static void cmd_add_port_tm_node_wred_profile_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_add_port_tm_node_wred_profile_result *res = parsed_result;
+	struct rte_tm_wred_params wp;
+	enum rte_tm_color color;
+	struct rte_port *port;
+	struct rte_tm_error error;
+	uint32_t wred_profile_id = res->wred_profile_id;
+	uint8_t port_id = res->port_id;
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	memset(&wp, 0, sizeof(struct rte_tm_wred_params));
+
+	/* WRED Params  (Green Color)*/
+	if ((strcmp(res->color_g, "G") == 0) ||
+		(strcmp(res->color_g, "g") == 0)) {
+		color = RTE_TM_GREEN;
+		wp.red_params[color].min_th = res->min_th_g;
+		wp.red_params[color].max_th = res->max_th_g;
+		wp.red_params[color].maxp_inv = res->maxp_inv_g;
+		wp.red_params[color].wq_log2 = res->wq_log2_g;
+	} else {
+		printf("WRED profile error(G or g for green color)!\n");
+		return;
+	}
+
+	/* WRED Params  (Yellow Color)*/
+	if ((strcmp(res->color_y, "Y") == 0) ||
+		(strcmp(res->color_y, "y") == 0)) {
+		color = RTE_TM_YELLOW;
+		wp.red_params[color].min_th = res->min_th_y;
+		wp.red_params[color].max_th = res->max_th_y;
+		wp.red_params[color].maxp_inv = res->maxp_inv_y;
+		wp.red_params[color].wq_log2 = res->wq_log2_y;
+	} else {
+		printf("WRED profile error(Y or y for yellow color)!\n");
+		return;
+	}
+
+	/* WRED Params  (Red Color)*/
+	if ((strcmp(res->color_r, "R") == 0) ||
+		(strcmp(res->color_r, "r") == 0)) {
+		color = RTE_TM_RED;
+		wp.red_params[color].min_th = res->min_th_r;
+		wp.red_params[color].max_th = res->max_th_r;
+		wp.red_params[color].maxp_inv = res->maxp_inv_r;
+		wp.red_params[color].wq_log2 = res->wq_log2_r;
+	} else {
+		printf("WRED profile error(R or r for red color)!\n");
+		return;
+	}
+
+	ret = rte_tm_wred_profile_add(port_id, wred_profile_id, &wp, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+}
+
+cmdline_parse_inst_t cmd_add_port_tm_node_wred_profile = {
+	.f = cmd_add_port_tm_node_wred_profile_parsed,
+	.data = NULL,
+	.help_str = "Add port tm node wred profile",
+	.tokens = {
+		(void *)&cmd_add_port_tm_node_wred_profile_add,
+		(void *)&cmd_add_port_tm_node_wred_profile_port,
+		(void *)&cmd_add_port_tm_node_wred_profile_tm,
+		(void *)&cmd_add_port_tm_node_wred_profile_node,
+		(void *)&cmd_add_port_tm_node_wred_profile_wred,
+		(void *)&cmd_add_port_tm_node_wred_profile_profile,
+		(void *)&cmd_add_port_tm_node_wred_profile_port_id,
+		(void *)&cmd_add_port_tm_node_wred_profile_wred_profile_id,
+		(void *)&cmd_add_port_tm_node_wred_profile_color_g,
+		(void *)&cmd_add_port_tm_node_wred_profile_min_th_g,
+		(void *)&cmd_add_port_tm_node_wred_profile_max_th_g,
+		(void *)&cmd_add_port_tm_node_wred_profile_maxp_inv_g,
+		(void *)&cmd_add_port_tm_node_wred_profile_wq_log2_g,
+		(void *)&cmd_add_port_tm_node_wred_profile_color_y,
+		(void *)&cmd_add_port_tm_node_wred_profile_min_th_y,
+		(void *)&cmd_add_port_tm_node_wred_profile_max_th_y,
+		(void *)&cmd_add_port_tm_node_wred_profile_maxp_inv_y,
+		(void *)&cmd_add_port_tm_node_wred_profile_wq_log2_y,
+		(void *)&cmd_add_port_tm_node_wred_profile_color_r,
+		(void *)&cmd_add_port_tm_node_wred_profile_min_th_r,
+		(void *)&cmd_add_port_tm_node_wred_profile_max_th_r,
+		(void *)&cmd_add_port_tm_node_wred_profile_maxp_inv_r,
+		(void *)&cmd_add_port_tm_node_wred_profile_wq_log2_r,
+		NULL,
+	},
+};
+
+/* *** Delete Port TM node WRED Profile *** */
+struct cmd_del_port_tm_node_wred_profile_result {
+	cmdline_fixed_string_t del;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t node;
+	cmdline_fixed_string_t wred;
+	cmdline_fixed_string_t profile;
+	uint8_t port_id;
+	uint32_t wred_profile_id;
+};
+
+cmdline_parse_token_string_t cmd_del_port_tm_node_wred_profile_del =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_wred_profile_result, del, "del");
+cmdline_parse_token_string_t cmd_del_port_tm_node_wred_profile_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_wred_profile_result, port, "port");
+cmdline_parse_token_string_t cmd_del_port_tm_node_wred_profile_tm =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_wred_profile_result, tm, "tm");
+cmdline_parse_token_string_t cmd_del_port_tm_node_wred_profile_node =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_wred_profile_result, node, "node");
+cmdline_parse_token_string_t cmd_del_port_tm_node_wred_profile_wred =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_wred_profile_result, wred, "wred");
+cmdline_parse_token_string_t cmd_del_port_tm_node_wred_profile_profile =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_wred_profile_result,
+			profile, "profile");
+cmdline_parse_token_num_t cmd_del_port_tm_node_wred_profile_port_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_del_port_tm_node_wred_profile_result,
+			port_id, UINT8);
+cmdline_parse_token_num_t cmd_del_port_tm_node_wred_profile_wred_profile_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_del_port_tm_node_wred_profile_result,
+			wred_profile_id, UINT32);
+
+static void cmd_del_port_tm_node_wred_profile_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_del_port_tm_node_wred_profile_result *res = parsed_result;
+	struct rte_port *port;
+	struct rte_tm_error error;
+	uint32_t wred_profile_id = res->wred_profile_id;
+	uint8_t port_id = res->port_id;
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	ret = rte_tm_wred_profile_delete(port_id, wred_profile_id, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+}
+
+cmdline_parse_inst_t cmd_del_port_tm_node_wred_profile = {
+	.f = cmd_del_port_tm_node_wred_profile_parsed,
+	.data = NULL,
+	.help_str = "Delete port tm node wred profile",
+	.tokens = {
+		(void *)&cmd_del_port_tm_node_wred_profile_del,
+		(void *)&cmd_del_port_tm_node_wred_profile_port,
+		(void *)&cmd_del_port_tm_node_wred_profile_tm,
+		(void *)&cmd_del_port_tm_node_wred_profile_node,
+		(void *)&cmd_del_port_tm_node_wred_profile_wred,
+		(void *)&cmd_del_port_tm_node_wred_profile_profile,
+		(void *)&cmd_del_port_tm_node_wred_profile_port_id,
+		(void *)&cmd_del_port_tm_node_wred_profile_wred_profile_id,
+		NULL,
+	},
+};
+
+/* *** Add Port TM nonleaf node *** */
+struct cmd_add_port_tm_nonleaf_node_result {
+	cmdline_fixed_string_t add;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t nonleaf;
+	cmdline_fixed_string_t node;
+	uint8_t port_id;
+	uint32_t node_id;
+	int32_t parent_node_id;
+	uint32_t priority;
+	uint32_t weight;
+	uint32_t level_id;
+	uint32_t shaper_profile_id;
+	uint32_t shared_shaper_id;
+	uint32_t n_shared_shapers;
+	uint32_t n_sp_priorities;
+};
+
+cmdline_parse_token_string_t cmd_add_port_tm_nonleaf_node_add =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_nonleaf_node_result, add, "add");
+cmdline_parse_token_string_t cmd_add_port_tm_nonleaf_node_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_nonleaf_node_result, port, "port");
+cmdline_parse_token_string_t cmd_add_port_tm_nonleaf_node_tm =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_nonleaf_node_result, tm, "tm");
+cmdline_parse_token_string_t cmd_add_port_tm_nonleaf_node_nonleaf =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_nonleaf_node_result, nonleaf, "nonleaf");
+cmdline_parse_token_string_t cmd_add_port_tm_nonleaf_node_node =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_nonleaf_node_result, node, "node");
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_port_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_add_port_tm_nonleaf_node_result,
+		 port_id, UINT8);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_node_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+		 node_id, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_parent_node_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+		 parent_node_id, INT32);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_priority =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+		 priority, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_weight =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+		 weight, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_level_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+		 level_id, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_shaper_profile_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+		 shaper_profile_id, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_shared_shaper_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+		 shared_shaper_id, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_n_shared_shapers =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+		 n_shared_shapers, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_nonleaf_node_n_sp_priorities =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_nonleaf_node_result,
+		 n_sp_priorities, UINT32);
+
+static void cmd_add_port_tm_nonleaf_node_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_add_port_tm_nonleaf_node_result *res = parsed_result;
+	struct rte_port *port;
+	struct rte_eth_link link;
+	struct rte_tm_error error;
+	struct rte_tm_node_params np;
+	uint32_t parent_node_id;
+	uint8_t port_id = res->port_id;
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	/* Port link status */
+	memset(&link, 0, sizeof(link));
+	rte_eth_link_get_nowait(port_id, &link);
+	if (link.link_status == ETH_LINK_UP) {
+		printf(" Port %u link up (error)\n", port_id);
+		return;
+	}
+
+	/* TM hierarchy status */
+	if (port->softport.tm.hierarchy_frozen == 1)
+		port->softport.tm.hierarchy_frozen = 0;
+
+	/* Node parameters */
+	if (res->parent_node_id < 0)
+		parent_node_id = UINT32_MAX;
+	else
+		parent_node_id = res->parent_node_id;
+
+	memset(&np, 0, sizeof(struct rte_tm_node_params));
+	np.shaper_profile_id = res->shaper_profile_id;
+	np.n_shared_shapers = res->n_shared_shapers;
+	np.shared_shaper_id = &res->shared_shaper_id;
+	np.nonleaf.n_sp_priorities = res->n_sp_priorities;
+	np.nonleaf.wfq_weight_mode = NULL;
+	np.stats_mask = RTE_TM_STATS_N_PKTS |
+		RTE_TM_STATS_N_BYTES |
+		RTE_TM_STATS_N_PKTS_GREEN_DROPPED |
+		RTE_TM_STATS_N_BYTES_GREEN_DROPPED;
+
+	ret = rte_tm_node_add(port_id, res->node_id, parent_node_id,
+				res->priority, res->weight, res->level_id,
+				&np, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+}
+
+cmdline_parse_inst_t cmd_add_port_tm_nonleaf_node = {
+	.f = cmd_add_port_tm_nonleaf_node_parsed,
+	.data = NULL,
+	.help_str = "Add port tm nonleaf node",
+	.tokens = {
+		(void *)&cmd_add_port_tm_nonleaf_node_add,
+		(void *)&cmd_add_port_tm_nonleaf_node_port,
+		(void *)&cmd_add_port_tm_nonleaf_node_tm,
+		(void *)&cmd_add_port_tm_nonleaf_node_nonleaf,
+		(void *)&cmd_add_port_tm_nonleaf_node_node,
+		(void *)&cmd_add_port_tm_nonleaf_node_port_id,
+		(void *)&cmd_add_port_tm_nonleaf_node_node_id,
+		(void *)&cmd_add_port_tm_nonleaf_node_parent_node_id,
+		(void *)&cmd_add_port_tm_nonleaf_node_priority,
+		(void *)&cmd_add_port_tm_nonleaf_node_weight,
+		(void *)&cmd_add_port_tm_nonleaf_node_level_id,
+		(void *)&cmd_add_port_tm_nonleaf_node_shaper_profile_id,
+		(void *)&cmd_add_port_tm_nonleaf_node_shared_shaper_id,
+		(void *)&cmd_add_port_tm_nonleaf_node_n_shared_shapers,
+		(void *)&cmd_add_port_tm_nonleaf_node_n_sp_priorities,
+		NULL,
+	},
+};
+
+/* *** Add Port TM leaf node *** */
+struct cmd_add_port_tm_leaf_node_result {
+	cmdline_fixed_string_t add;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t leaf;
+	cmdline_fixed_string_t node;
+	uint8_t port_id;
+	uint32_t node_id;
+	int32_t parent_node_id;
+	uint32_t priority;
+	uint32_t weight;
+	uint32_t level_id;
+	uint32_t cman_mode;
+	uint32_t wred_profile_id;
+};
+
+cmdline_parse_token_string_t cmd_add_port_tm_leaf_node_add =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_leaf_node_result, add, "add");
+cmdline_parse_token_string_t cmd_add_port_tm_leaf_node_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_leaf_node_result, port, "port");
+cmdline_parse_token_string_t cmd_add_port_tm_leaf_node_tm =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_leaf_node_result, tm, "tm");
+cmdline_parse_token_string_t cmd_add_port_tm_leaf_node_nonleaf =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_leaf_node_result, leaf, "leaf");
+cmdline_parse_token_string_t cmd_add_port_tm_leaf_node_node =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_add_port_tm_leaf_node_result, node, "node");
+cmdline_parse_token_num_t cmd_add_port_tm_leaf_node_port_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_leaf_node_result,
+		 port_id, UINT8);
+cmdline_parse_token_num_t cmd_add_port_tm_leaf_node_node_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_leaf_node_result,
+		 node_id, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_leaf_node_parent_node_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_leaf_node_result,
+		 parent_node_id, INT32);
+cmdline_parse_token_num_t cmd_add_port_tm_leaf_node_priority =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_leaf_node_result,
+		 priority, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_leaf_node_weight =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_leaf_node_result,
+		 weight, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_leaf_node_level_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_leaf_node_result,
+		 level_id, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_leaf_node_cman_mode =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_leaf_node_result,
+		 cman_mode, UINT32);
+cmdline_parse_token_num_t cmd_add_port_tm_leaf_node_wred_profile_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_add_port_tm_leaf_node_result,
+		 wred_profile_id, UINT32);
+
+static void cmd_add_port_tm_leaf_node_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_add_port_tm_leaf_node_result *res = parsed_result;
+	struct rte_port *port;
+	struct rte_eth_link link;
+	struct rte_tm_error error;
+	struct rte_tm_node_params np;
+	uint32_t parent_node_id;
+	uint8_t port_id = res->port_id;
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	/* Port link status */
+	memset(&link, 0, sizeof(link));
+	rte_eth_link_get_nowait(port_id, &link);
+	if (link.link_status == ETH_LINK_UP) {
+		printf(" Port %u link up (error)\n", port_id);
+		return;
+	}
+
+	/* TM hierarchy status */
+	if (port->softport.tm.hierarchy_frozen == 1)
+		port->softport.tm.hierarchy_frozen = 0;
+
+	/* Node parameters */
+	if (res->parent_node_id < 0)
+		parent_node_id = UINT32_MAX;
+	else
+		parent_node_id = res->parent_node_id;
+
+	memset(&np, 0, sizeof(struct rte_tm_node_params));
+	np.shaper_profile_id = RTE_TM_SHAPER_PROFILE_ID_NONE;
+	np.n_shared_shapers = 0;
+	np.leaf.cman = res->cman_mode;
+	np.leaf.wred.wred_profile_id = res->wred_profile_id;
+	np.stats_mask = RTE_TM_STATS_N_PKTS |
+		RTE_TM_STATS_N_BYTES |
+		RTE_TM_STATS_N_PKTS_GREEN_DROPPED |
+		RTE_TM_STATS_N_BYTES_GREEN_DROPPED |
+		RTE_TM_STATS_N_PKTS_QUEUED;
+
+	ret = rte_tm_node_add(port_id, res->node_id, parent_node_id,
+				res->priority, res->weight, res->level_id,
+				&np, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+}
+
+cmdline_parse_inst_t cmd_add_port_tm_leaf_node = {
+	.f = cmd_add_port_tm_leaf_node_parsed,
+	.data = NULL,
+	.help_str = "Add port tm leaf node",
+	.tokens = {
+		(void *)&cmd_add_port_tm_leaf_node_add,
+		(void *)&cmd_add_port_tm_leaf_node_port,
+		(void *)&cmd_add_port_tm_leaf_node_tm,
+		(void *)&cmd_add_port_tm_leaf_node_nonleaf,
+		(void *)&cmd_add_port_tm_leaf_node_node,
+		(void *)&cmd_add_port_tm_leaf_node_port_id,
+		(void *)&cmd_add_port_tm_leaf_node_node_id,
+		(void *)&cmd_add_port_tm_leaf_node_parent_node_id,
+		(void *)&cmd_add_port_tm_leaf_node_priority,
+		(void *)&cmd_add_port_tm_leaf_node_weight,
+		(void *)&cmd_add_port_tm_leaf_node_level_id,
+		(void *)&cmd_add_port_tm_leaf_node_cman_mode,
+		(void *)&cmd_add_port_tm_leaf_node_wred_profile_id,
+		NULL,
+	},
+};
+
+/* *** Delete Port TM Node *** */
+struct cmd_del_port_tm_node_result {
+	cmdline_fixed_string_t del;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t node;
+	uint8_t port_id;
+	uint32_t node_id;
+};
+
+cmdline_parse_token_string_t cmd_del_port_tm_node_del =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_result, del, "del");
+cmdline_parse_token_string_t cmd_del_port_tm_node_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_result, port, "port");
+cmdline_parse_token_string_t cmd_del_port_tm_node_tm =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_result, tm, "tm");
+cmdline_parse_token_string_t cmd_del_port_tm_node_node =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_del_port_tm_node_result, node, "node");
+cmdline_parse_token_num_t cmd_del_port_tm_node_port_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_del_port_tm_node_result,
+		 port_id, UINT8);
+cmdline_parse_token_num_t cmd_del_port_tm_node_node_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_del_port_tm_node_result,
+		node_id, UINT32);
+
+static void cmd_del_port_tm_node_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_del_port_tm_node_result *res = parsed_result;
+	struct rte_port *port;
+	struct rte_eth_link link;
+	struct rte_tm_error error;
+	uint32_t node_id = res->node_id;
+	uint8_t port_id = res->port_id;
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	/* Port link status */
+	memset(&link, 0, sizeof(link));
+	rte_eth_link_get_nowait(port_id, &link);
+	if (link.link_status == ETH_LINK_UP) {
+		printf(" Port %u link up (error)\n", port_id);
+		return;
+	}
+
+	/* TM hierarchy status */
+	if (port->softport.tm.hierarchy_frozen == 1)
+		port->softport.tm.hierarchy_frozen = 0;
+
+	ret = rte_tm_node_delete(port_id, node_id, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+}
+
+cmdline_parse_inst_t cmd_del_port_tm_node = {
+	.f = cmd_del_port_tm_node_parsed,
+	.data = NULL,
+	.help_str = "Delete port tm node",
+	.tokens = {
+		(void *)&cmd_del_port_tm_node_del,
+		(void *)&cmd_del_port_tm_node_port,
+		(void *)&cmd_del_port_tm_node_tm,
+		(void *)&cmd_del_port_tm_node_node,
+		(void *)&cmd_del_port_tm_node_port_id,
+		(void *)&cmd_del_port_tm_node_node_id,
+		NULL,
+	},
+};
+
+/* *** Show Port TM Node Type *** */
+struct cmd_show_port_tm_node_type_result {
+	cmdline_fixed_string_t show;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t node;
+	cmdline_fixed_string_t type;
+	uint8_t port_id;
+	uint32_t node_id;
+};
+
+cmdline_parse_token_string_t cmd_show_port_tm_node_type_show =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_show_port_tm_node_type_result, show, "show");
+cmdline_parse_token_string_t cmd_show_port_tm_node_type_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_show_port_tm_node_type_result, port, "port");
+cmdline_parse_token_string_t cmd_show_port_tm_node_type_tm =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_show_port_tm_node_type_result, tm, "tm");
+cmdline_parse_token_string_t cmd_show_port_tm_node_type_node =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_show_port_tm_node_type_result, node, "node");
+cmdline_parse_token_string_t cmd_show_port_tm_node_type_type =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_show_port_tm_node_type_result, type, "type");
+cmdline_parse_token_num_t cmd_show_port_tm_node_type_port_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_show_port_tm_node_type_result,
+			port_id, UINT8);
+cmdline_parse_token_num_t cmd_show_port_tm_node_type_node_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_show_port_tm_node_type_result,
+			node_id, UINT32);
+
+static void cmd_show_port_tm_node_type_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_show_port_tm_node_type_result *res = parsed_result;
+	struct rte_port *port;
+	struct rte_tm_error error;
+	uint32_t node_id = res->node_id;
+	uint8_t port_id = res->port_id;
+	int ret, is_leaf = 0;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	ret = rte_tm_node_type_get(port_id, node_id, &is_leaf, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+
+	if (is_leaf == 1)
+		printf("leaf node\n");
+	else
+		printf("nonleaf node\n");
+
+}
+
+cmdline_parse_inst_t cmd_show_port_tm_node_type = {
+	.f = cmd_show_port_tm_node_type_parsed,
+	.data = NULL,
+	.help_str = "Show port tm node type",
+	.tokens = {
+		(void *)&cmd_show_port_tm_node_type_show,
+		(void *)&cmd_show_port_tm_node_type_port,
+		(void *)&cmd_show_port_tm_node_type_tm,
+		(void *)&cmd_show_port_tm_node_type_node,
+		(void *)&cmd_show_port_tm_node_type_type,
+		(void *)&cmd_show_port_tm_node_type_port_id,
+		(void *)&cmd_show_port_tm_node_type_node_id,
+		NULL,
+	},
+};
+
+/* *** Show Port TM Node Statistics *** */
+struct cmd_show_port_tm_node_stats_result {
+	cmdline_fixed_string_t show;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t node;
+	cmdline_fixed_string_t stats;
+	uint8_t port_id;
+	uint32_t node_id;
+	uint32_t clear;
+};
+
+cmdline_parse_token_string_t cmd_show_port_tm_node_stats_show =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_show_port_tm_node_stats_result, show, "show");
+cmdline_parse_token_string_t cmd_show_port_tm_node_stats_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_show_port_tm_node_stats_result, port, "port");
+cmdline_parse_token_string_t cmd_show_port_tm_node_stats_tm =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_show_port_tm_node_stats_result, tm, "tm");
+cmdline_parse_token_string_t cmd_show_port_tm_node_stats_node =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_show_port_tm_node_stats_result, node, "node");
+cmdline_parse_token_string_t cmd_show_port_tm_node_stats_stats =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_show_port_tm_node_stats_result, stats, "stats");
+cmdline_parse_token_num_t cmd_show_port_tm_node_stats_port_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_show_port_tm_node_stats_result,
+			port_id, UINT8);
+cmdline_parse_token_num_t cmd_show_port_tm_node_stats_node_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_show_port_tm_node_stats_result,
+			node_id, UINT32);
+cmdline_parse_token_num_t cmd_show_port_tm_node_stats_clear =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_show_port_tm_node_stats_result, clear, UINT32);
+
+static void cmd_show_port_tm_node_stats_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_show_port_tm_node_stats_result *res = parsed_result;
+	struct rte_port *port;
+	struct rte_eth_link link;
+	struct rte_tm_node_stats stats;
+	struct rte_tm_error error;
+	uint64_t stats_mask = 0, leaf_stats_mask;
+	uint32_t node_id = res->node_id;
+	uint32_t clear = res->clear;
+	uint8_t port_id = res->port_id;
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	/* TM hierarchy status */
+	if (port->softport.tm.hierarchy_frozen == 0) {
+		printf(" hierarchy not frozen(error)\n");
+		return;
+	}
+
+	/* Port link status */
+	memset(&link, 0, sizeof(link));
+	rte_eth_link_get_nowait(port_id, &link);
+	if (link.link_status == ETH_LINK_DOWN) {
+		printf(" Port %u link down (error)\n", port_id);
+		return;
+	}
+
+	memset(&stats, 0, sizeof(struct rte_tm_node_stats));
+	ret = rte_tm_node_stats_read(port_id, node_id, &stats,
+			&stats_mask, clear, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+
+	leaf_stats_mask = RTE_TM_STATS_N_PKTS |
+		RTE_TM_STATS_N_BYTES |
+		RTE_TM_STATS_N_PKTS_GREEN_DROPPED |
+		RTE_TM_STATS_N_BYTES_GREEN_DROPPED |
+		RTE_TM_STATS_N_PKTS_QUEUED;
+
+	printf("pkts scheduled from node %lu\n", stats.n_pkts);
+	printf("bytes scheduled from node %lu\n", stats.n_bytes);
+	printf("pkts dropped %lu\n ", stats.leaf.n_pkts_dropped[RTE_TM_GREEN]);
+	printf("bytes dropped %lu\n ",
+		stats.leaf.n_bytes_dropped[RTE_TM_GREEN]);
+
+	if (stats_mask == leaf_stats_mask)
+		printf("packets enqueued %lu\n", stats.leaf.n_pkts_queued);
+}
+
+cmdline_parse_inst_t cmd_show_port_tm_node_stats = {
+	.f = cmd_show_port_tm_node_stats_parsed,
+	.data = NULL,
+	.help_str = "Show port tm node stats",
+	.tokens = {
+		(void *)&cmd_show_port_tm_node_stats_show,
+		(void *)&cmd_show_port_tm_node_stats_port,
+		(void *)&cmd_show_port_tm_node_stats_tm,
+		(void *)&cmd_show_port_tm_node_stats_node,
+		(void *)&cmd_show_port_tm_node_stats_stats,
+		(void *)&cmd_show_port_tm_node_stats_port_id,
+		(void *)&cmd_show_port_tm_node_stats_node_id,
+		(void *)&cmd_show_port_tm_node_stats_clear,
+		NULL,
+	},
+};
+
+#ifdef RTE_SCHED_SUBPORT_TC_OV
+/* *** Update Port TM Node Parent *** */
+struct cmd_set_port_tm_node_parent_result {
+	cmdline_fixed_string_t set;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t node;
+	cmdline_fixed_string_t parent;
+	uint8_t port_id;
+	uint32_t node_id;
+	uint32_t parent_id;
+	uint32_t priority;
+	uint32_t weight;
+};
+
+cmdline_parse_token_string_t cmd_set_port_tm_node_parent_set =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_node_parent_result, set, "set");
+cmdline_parse_token_string_t cmd_set_port_tm_node_parent_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_node_parent_result, port, "port");
+cmdline_parse_token_string_t cmd_set_port_tm_node_parent_tm =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_node_parent_result, tm, "tm");
+cmdline_parse_token_string_t cmd_set_port_tm_node_parent_node =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_node_parent_result, node, "node");
+cmdline_parse_token_string_t cmd_set_port_tm_node_parent_parent =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_node_parent_result, parent, "parent");
+cmdline_parse_token_num_t cmd_set_port_tm_node_parent_port_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_set_port_tm_node_parent_result, port_id, UINT8);
+cmdline_parse_token_num_t cmd_set_port_tm_node_parent_node_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_set_port_tm_node_parent_result, node_id, UINT32);
+cmdline_parse_token_num_t cmd_set_port_tm_node_parent_parent_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_set_port_tm_node_parent_result,
+		parent_id, UINT32);
+cmdline_parse_token_num_t cmd_set_port_tm_node_parent_priority =
+	TOKEN_NUM_INITIALIZER(struct cmd_set_port_tm_node_parent_result,
+		priority, UINT32);
+cmdline_parse_token_num_t cmd_set_port_tm_node_parent_weight =
+	TOKEN_NUM_INITIALIZER(struct cmd_set_port_tm_node_parent_result,
+		weight, UINT32);
+
+static void cmd_set_port_tm_node_parent_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_set_port_tm_node_parent_result *res = parsed_result;
+	struct rte_port *port;
+	struct rte_eth_link link;
+	struct rte_tm_error error;
+	uint32_t node_id = res->node_id;
+	uint32_t parent_id = res->parent_id;
+	uint32_t priority = res->priority;
+	uint32_t weight = res->weight;
+	uint8_t port_id = res->port_id;
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	/* TM hierarchy status */
+	if (port->softport.tm.hierarchy_frozen == 0) {
+		printf(" hierarchy not frozen(error)\n");
+		return;
+	}
+
+	/* Port link status */
+	memset(&link, 0, sizeof(link));
+	rte_eth_link_get_nowait(port_id, &link);
+	if (link.link_status == ETH_LINK_DOWN) {
+		printf(" Port %u link down (error)\n", port_id);
+		return;
+	}
+
+	ret = rte_tm_node_parent_update(port_id, node_id,
+		parent_id, priority, weight, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+}
+
+cmdline_parse_inst_t cmd_set_port_tm_node_parent = {
+	.f = cmd_set_port_tm_node_parent_parsed,
+	.data = NULL,
+	.help_str = "Set port tm node parent",
+	.tokens = {
+		(void *)&cmd_set_port_tm_node_parent_set,
+		(void *)&cmd_set_port_tm_node_parent_port,
+		(void *)&cmd_set_port_tm_node_parent_tm,
+		(void *)&cmd_set_port_tm_node_parent_node,
+		(void *)&cmd_set_port_tm_node_parent_parent,
+		(void *)&cmd_set_port_tm_node_parent_port_id,
+		(void *)&cmd_set_port_tm_node_parent_node_id,
+		(void *)&cmd_set_port_tm_node_parent_parent_id,
+		(void *)&cmd_set_port_tm_node_parent_priority,
+		(void *)&cmd_set_port_tm_node_parent_weight,
+		NULL,
+	},
+};
+#endif
+
+/* *** Update Port TM Node Shaper profile *** */
+struct cmd_set_port_tm_node_shaper_profile_result {
+	cmdline_fixed_string_t set;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t node;
+	cmdline_fixed_string_t shaper;
+	cmdline_fixed_string_t profile;
+	uint8_t port_id;
+	uint32_t node_id;
+	uint32_t shaper_profile_id;
+};
+
+cmdline_parse_token_string_t cmd_set_port_tm_node_shaper_profile_set =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_node_shaper_profile_result, set, "set");
+cmdline_parse_token_string_t cmd_set_port_tm_node_shaper_profile_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_node_shaper_profile_result,
+			port, "port");
+cmdline_parse_token_string_t cmd_set_port_tm_node_shaper_profile_tm =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_node_shaper_profile_result, tm, "tm");
+cmdline_parse_token_string_t cmd_set_port_tm_node_shaper_profile_node =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_node_shaper_profile_result,
+			node, "node");
+cmdline_parse_token_string_t cmd_set_port_tm_node_shaper_profile_shaper =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_node_shaper_profile_result,
+			shaper, "shaper");
+cmdline_parse_token_string_t cmd_set_port_tm_node_shaper_profile_profile =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_node_shaper_profile_result,
+			profile, "profile");
+cmdline_parse_token_num_t cmd_set_port_tm_node_shaper_profile_port_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_set_port_tm_node_shaper_profile_result,
+			port_id, UINT8);
+cmdline_parse_token_num_t cmd_set_port_tm_node_shaper_profile_node_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_set_port_tm_node_shaper_profile_result,
+		node_id, UINT32);
+cmdline_parse_token_num_t
+	cmd_set_port_tm_node_shaper_shaper_profile_profile_id =
+		TOKEN_NUM_INITIALIZER(
+			struct cmd_set_port_tm_node_shaper_profile_result,
+			shaper_profile_id, UINT32);
+
+static void cmd_set_port_tm_node_shaper_profile_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_set_port_tm_node_shaper_profile_result *res = parsed_result;
+	struct rte_port *port;
+	struct rte_eth_link link;
+	struct rte_tm_error error;
+	uint32_t node_id = res->node_id;
+	uint32_t shaper_profile_id = res->shaper_profile_id;
+	uint8_t port_id = res->port_id;
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	/* TM hierarchy status */
+	if (port->softport.tm.hierarchy_frozen == 0) {
+		printf(" hierarchy not frozen(error)\n");
+		return;
+	}
+
+	/* Port link status */
+	memset(&link, 0, sizeof(link));
+	rte_eth_link_get_nowait(port_id, &link);
+	if (link.link_status == ETH_LINK_DOWN) {
+		printf(" Port %u link down (error)\n", port_id);
+		return;
+	}
+
+	ret = rte_tm_node_shaper_update(port_id, node_id,
+		shaper_profile_id, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+}
+
+cmdline_parse_inst_t cmd_set_port_tm_node_shaper_profile = {
+	.f = cmd_set_port_tm_node_shaper_profile_parsed,
+	.data = NULL,
+	.help_str = "Set port tm node shaper profile",
+	.tokens = {
+		(void *)&cmd_set_port_tm_node_shaper_profile_set,
+		(void *)&cmd_set_port_tm_node_shaper_profile_port,
+		(void *)&cmd_set_port_tm_node_shaper_profile_tm,
+		(void *)&cmd_set_port_tm_node_shaper_profile_node,
+		(void *)&cmd_set_port_tm_node_shaper_profile_shaper,
+		(void *)&cmd_set_port_tm_node_shaper_profile_profile,
+		(void *)&cmd_set_port_tm_node_shaper_profile_port_id,
+		(void *)&cmd_set_port_tm_node_shaper_profile_node_id,
+		(void *)&cmd_set_port_tm_node_shaper_shaper_profile_profile_id,
+		NULL,
+	},
+};
+
+/* *** Port TM Hierarchy Commit *** */
+struct cmd_port_tm_hierarchy_commit_result {
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t hierarchy;
+	cmdline_fixed_string_t commit;
+	uint8_t port_id;
+	uint32_t clean_on_fail;
+};
+
+cmdline_parse_token_string_t cmd_port_tm_hierarchy_commit_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_port_tm_hierarchy_commit_result, port, "port");
+cmdline_parse_token_string_t cmd_port_tm_hierarchy_commit_tm =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_port_tm_hierarchy_commit_result, tm, "tm");
+cmdline_parse_token_string_t cmd_port_tm_hierarchy_commit_hierarchy =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_port_tm_hierarchy_commit_result,
+			hierarchy, "hierarchy");
+cmdline_parse_token_string_t cmd_port_tm_hierarchy_commit_commit =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_port_tm_hierarchy_commit_result, commit, "commit");
+cmdline_parse_token_num_t cmd_port_tm_hierarchy_commit_port_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_port_tm_hierarchy_commit_result,
+			port_id, UINT8);
+cmdline_parse_token_num_t cmd_port_tm_hierarchy_commit_clean_on_fail =
+	TOKEN_NUM_INITIALIZER(struct cmd_port_tm_hierarchy_commit_result,
+		 clean_on_fail, UINT32);
+
+static void cmd_port_tm_hierarchy_commit_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_port_tm_hierarchy_commit_result *res = parsed_result;
+	struct rte_port *port;
+	struct rte_eth_link link;
+	struct rte_tm_error error;
+	uint32_t clean_on_fail = res->clean_on_fail;
+	uint8_t port_id = res->port_id;
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	port = &ports[port_id];
+
+	/* Port tm flag */
+	if (port->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	/* Port link status */
+	memset(&link, 0, sizeof(link));
+	rte_eth_link_get_nowait(port_id, &link);
+	if (link.link_status == ETH_LINK_UP) {
+		printf(" Port %u link up (error)\n", port_id);
+		return;
+	}
+
+	ret = rte_tm_hierarchy_commit(port_id, clean_on_fail, &error);
+	if (ret != 0) {
+		print_err_msg(&error);
+		return;
+	}
+	/* Set TM hierarchy commit flag */
+	port->softport.tm.hierarchy_frozen = 1;
+}
+
+cmdline_parse_inst_t cmd_port_tm_hierarchy_commit = {
+	.f = cmd_port_tm_hierarchy_commit_parsed,
+	.data = NULL,
+	.help_str = "Set port tm node shaper profile",
+	.tokens = {
+		(void *)&cmd_port_tm_hierarchy_commit_port,
+		(void *)&cmd_port_tm_hierarchy_commit_tm,
+		(void *)&cmd_port_tm_hierarchy_commit_hierarchy,
+		(void *)&cmd_port_tm_hierarchy_commit_commit,
+		(void *)&cmd_port_tm_hierarchy_commit_port_id,
+		(void *)&cmd_port_tm_hierarchy_commit_clean_on_fail,
+		NULL,
+	},
+};
+
+static int
+port_tm_pktfield_validate_mask(uint64_t mask, uint64_t n)
+{
+	int count = __builtin_popcountll(mask);
+	int pos_lead = sizeof(uint64_t) * 8 - __builtin_clzll(mask);
+	int pos_trail = __builtin_ctzll(mask);
+	int count_expected = __builtin_popcount(n - 1);
+
+	/* Handle the exceptions */
+	if (n == 0)
+		return -1;			/* Error */
+
+	if ((mask == 0) && (n == 1))
+		return 0;			/* OK */
+
+	if (((mask == 0) && (n != 1)) || ((mask != 0) && (n == 1)))
+		return -2;			/* Error */
+
+	/* Check that mask is contiguous */
+	if ((pos_lead - pos_trail) != count)
+		return -3;			/* Error */
+
+	/* Check that mask contains the expected number of bits set */
+	if (count != count_expected)
+		return -4;			/* Error */
+
+	return 0;			/* OK */
+	}
+
+/* *** Set Port TM Packet Fields *** */
+struct cmd_set_port_tm_pktfield_result {
+	cmdline_fixed_string_t set;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t pktfield;
+	cmdline_fixed_string_t type;
+	uint8_t port_id;
+	cmdline_fixed_string_t offset_string;
+	uint32_t offset;
+	cmdline_fixed_string_t mask_string;
+	uint64_t mask;
+};
+
+cmdline_parse_token_string_t cmd_set_port_tm_pktfield_set =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_pktfield_result, set, "set");
+cmdline_parse_token_string_t cmd_set_port_tm_pktfield_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_pktfield_result, port, "port");
+cmdline_parse_token_string_t cmd_set_port_tm_pktfield_tm =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_pktfield_result,	tm, "tm");
+cmdline_parse_token_string_t cmd_set_port_tm_pktfield_pktfield =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_pktfield_result,
+			pktfield, "pktfield");
+cmdline_parse_token_string_t cmd_set_port_tm_pktfield_type =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_pktfield_result,
+			type, "subport#pipe#tc");
+cmdline_parse_token_num_t cmd_set_port_tm_pktfield_port_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_set_port_tm_pktfield_result,
+			port_id, UINT8);
+cmdline_parse_token_string_t cmd_set_port_tm_pktfield_offset_string =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_pktfield_result,
+			offset_string, "offset");
+cmdline_parse_token_num_t cmd_set_port_tm_pktfield_offset =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_set_port_tm_pktfield_result,
+			offset, UINT32);
+cmdline_parse_token_string_t cmd_set_port_tm_pktfield_mask_string =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_pktfield_result,
+			mask_string, "mask");
+cmdline_parse_token_num_t cmd_set_port_tm_pktfield_mask =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_set_port_tm_pktfield_result,
+			mask, UINT64);
+
+static void cmd_set_port_tm_pktfield_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_set_port_tm_pktfield_result *res = parsed_result;
+	struct rte_port *p;
+	uint32_t offset = res->offset;
+	uint64_t mask = res->mask;
+	uint8_t port_id = res->port_id;
+	int ret;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	p = &ports[port_id];
+
+	/* Port tm flag */
+	if (p->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	/* Subport */
+	if (strcmp(res->type, "subport") == 0) {
+		uint32_t n = p->softport.tm.n_subports_per_port;
+
+		ret = port_tm_pktfield_validate_mask(mask, n);
+		if (ret) {
+			printf(" invalid subport mask(error %d)", ret);
+			return;
+		}
+		/* Set packet field */
+		p->softport.tm.tm_pktfield0_slabpos = offset;
+		p->softport.tm.tm_pktfield0_slabmask = mask;
+		p->softport.tm.tm_pktfield0_slabshr = __builtin_ctzll(mask);
+		return;
+	}
+
+	/* Pipe */
+	if (strcmp(res->type, "pipe") == 0) {
+		uint32_t n = p->softport.tm.n_pipes_per_subport;
+
+		ret = port_tm_pktfield_validate_mask(mask, n);
+		if (ret) {
+			printf(" invalid pipe mask(error %d)", ret);
+			return;
+		}
+		/* Set packet field */
+		p->softport.tm.tm_pktfield1_slabpos = offset;
+		p->softport.tm.tm_pktfield1_slabmask = mask;
+		p->softport.tm.tm_pktfield1_slabshr = __builtin_ctzll(mask);
+		return;
+	}
+
+	/* Traffic class */
+	if (strcmp(res->type, "tc") == 0) {
+		uint32_t n = RTE_DIM(p->softport.tm.tm_tc_table);
+
+		ret = port_tm_pktfield_validate_mask(mask, n);
+		if (ret) {
+			printf(" invalid tc mask(error %d)", ret);
+			return;
+		}
+		/* Set packet field */
+		p->softport.tm.tm_pktfield1_slabpos = offset;
+		p->softport.tm.tm_pktfield1_slabmask = mask;
+		p->softport.tm.tm_pktfield1_slabshr = __builtin_ctzll(mask);
+		return;
+	}
+}
+
+cmdline_parse_inst_t cmd_set_port_tm_pktfield = {
+	.f = cmd_set_port_tm_pktfield_parsed,
+	.data = NULL,
+	.help_str = "Set port tm pktfield",
+	.tokens = {
+		(void *)&cmd_set_port_tm_pktfield_set,
+		(void *)&cmd_set_port_tm_pktfield_port,
+		(void *)&cmd_set_port_tm_pktfield_tm,
+		(void *)&cmd_set_port_tm_pktfield_pktfield,
+		(void *)&cmd_set_port_tm_pktfield_type,
+		(void *)&cmd_set_port_tm_pktfield_port_id,
+		(void *)&cmd_set_port_tm_pktfield_offset_string,
+		(void *)&cmd_set_port_tm_pktfield_offset,
+		(void *)&cmd_set_port_tm_pktfield_mask_string,
+		(void *)&cmd_set_port_tm_pktfield_mask,
+		NULL,
+	},
+};
+
+/* *** Set Port TM Traffic Class Table Entry *** */
+struct cmd_set_port_tm_tc_table_result {
+	cmdline_fixed_string_t set;
+	cmdline_fixed_string_t port;
+	cmdline_fixed_string_t tm;
+	cmdline_fixed_string_t tc_table;
+	uint8_t port_id;
+	cmdline_fixed_string_t index_string;
+	uint32_t index;
+	cmdline_fixed_string_t tc_string;
+	uint32_t tc;
+	cmdline_fixed_string_t queue_string;
+	uint32_t queue;
+};
+
+cmdline_parse_token_string_t cmd_set_port_tm_tc_table_set =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_tc_table_result, set, "set");
+cmdline_parse_token_string_t cmd_set_port_tm_tc_table_port =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_tc_table_result, port, "port");
+cmdline_parse_token_string_t cmd_set_port_tm_tc_table_tm =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_tc_table_result,	tm, "tm");
+cmdline_parse_token_string_t cmd_set_port_tm_tc_table_tc_table =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_tc_table_result,
+			tc_table, "tc table");
+cmdline_parse_token_num_t cmd_set_port_tm_tc_table_port_id =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_set_port_tm_tc_table_result,
+			port_id, UINT8);
+cmdline_parse_token_string_t cmd_set_port_tm_tc_table_index_string =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_tc_table_result,
+			index_string, "index");
+cmdline_parse_token_num_t cmd_set_port_tm_tc_table_index =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_set_port_tm_tc_table_result,
+			index, UINT32);
+cmdline_parse_token_string_t cmd_set_port_tm_tc_table_tc_string =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_tc_table_result,
+			tc_string, "tc");
+cmdline_parse_token_num_t cmd_set_port_tm_tc_table_tc =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_set_port_tm_tc_table_result,
+			tc, UINT32);
+cmdline_parse_token_string_t cmd_set_port_tm_tc_table_queue_string =
+	TOKEN_STRING_INITIALIZER(
+		struct cmd_set_port_tm_tc_table_result,
+			queue_string, "queue");
+cmdline_parse_token_num_t cmd_set_port_tm_tc_table_queue =
+	TOKEN_NUM_INITIALIZER(
+		struct cmd_set_port_tm_tc_table_result,
+			queue, UINT32);
+
+static void cmd_set_port_tm_tc_table_parsed(void *parsed_result,
+	__attribute__((unused)) struct cmdline *cl,
+	__attribute__((unused)) void *data)
+{
+	struct cmd_set_port_tm_tc_table_result *res = parsed_result;
+	struct rte_port *p;
+	uint32_t tc = res->tc;
+	uint32_t index = res->index;
+	uint32_t queue = res->queue;
+	uint32_t val;
+	uint8_t port_id = res->port_id;
+
+	if (port_id_is_invalid(port_id, ENABLED_WARN))
+		return;
+
+	p = &ports[port_id];
+
+	/* Port tm flag */
+	if (p->softport.tm_flag == 0) {
+		printf("  tm not enabled on port %u (error)\n", port_id);
+		return;
+	}
+
+	/* Forward mode: tm */
+	if (strcmp(cur_fwd_config.fwd_eng->fwd_mode_name, "tm")) {
+		printf("  tm mode not enabled(error)\n");
+		return;
+	}
+
+	/* Traffic class table index */
+	if (tc >= RTE_DIM(p->softport.tm.tm_tc_table)) {
+		printf("  invalid traffic class table index(error)\n");
+		return;
+	}
+
+	/* Traffic class id */
+	if (tc >= RTE_SCHED_TRAFFIC_CLASSES_PER_PIPE) {
+		printf("  invalid traffic class id(error)\n");
+		return;
+	}
+
+	/* Traffic class queue */
+	if (queue >= RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS) {
+		printf("  invalid traffic class queue(error)\n");
+		return;
+	}
+
+	val = tc * RTE_SCHED_QUEUES_PER_TRAFFIC_CLASS + queue;
+	p->softport.tm.tm_tc_table[index] = val;
+}
+
+cmdline_parse_inst_t cmd_set_port_tm_tc_table = {
+	.f = cmd_set_port_tm_tc_table_parsed,
+	.data = NULL,
+	.help_str = "Set port tm TC table entry",
+	.tokens = {
+		(void *)&cmd_set_port_tm_tc_table_set,
+		(void *)&cmd_set_port_tm_tc_table_port,
+		(void *)&cmd_set_port_tm_tc_table_tm,
+		(void *)&cmd_set_port_tm_tc_table_tc_table,
+		(void *)&cmd_set_port_tm_tc_table_port_id,
+		(void *)&cmd_set_port_tm_tc_table_index_string,
+		(void *)&cmd_set_port_tm_tc_table_index,
+		(void *)&cmd_set_port_tm_tc_table_tc_string,
+		(void *)&cmd_set_port_tm_tc_table_tc,
+		(void *)&cmd_set_port_tm_tc_table_queue_string,
+		(void *)&cmd_set_port_tm_tc_table_queue,
+		NULL,
+	},
+};
+
+#endif
+/* *********************************************************************** */
+
+/* list of instructions */
+cmdline_parse_ctx_t main_ctx[] = {
+	(cmdline_parse_inst_t *)&cmd_help_brief,
+	(cmdline_parse_inst_t *)&cmd_help_long,
+	(cmdline_parse_inst_t *)&cmd_quit,
+	(cmdline_parse_inst_t *)&cmd_load_from_file,
+	(cmdline_parse_inst_t *)&cmd_showport,
+	(cmdline_parse_inst_t *)&cmd_showqueue,
+	(cmdline_parse_inst_t *)&cmd_showportall,
+	(cmdline_parse_inst_t *)&cmd_showcfg,
+	(cmdline_parse_inst_t *)&cmd_start,
+	(cmdline_parse_inst_t *)&cmd_start_tx_first,
+	(cmdline_parse_inst_t *)&cmd_start_tx_first_n,
+	(cmdline_parse_inst_t *)&cmd_set_link_up,
+	(cmdline_parse_inst_t *)&cmd_set_link_down,
+	(cmdline_parse_inst_t *)&cmd_reset,
+	(cmdline_parse_inst_t *)&cmd_set_numbers,
+	(cmdline_parse_inst_t *)&cmd_set_txpkts,
+	(cmdline_parse_inst_t *)&cmd_set_txsplit,
+	(cmdline_parse_inst_t *)&cmd_set_fwd_list,
+	(cmdline_parse_inst_t *)&cmd_set_fwd_mask,
+	(cmdline_parse_inst_t *)&cmd_set_fwd_mode,
+	(cmdline_parse_inst_t *)&cmd_set_fwd_retry_mode,
+	(cmdline_parse_inst_t *)&cmd_set_burst_tx_retry,
+	(cmdline_parse_inst_t *)&cmd_set_promisc_mode_one,
+	(cmdline_parse_inst_t *)&cmd_set_promisc_mode_all,
+	(cmdline_parse_inst_t *)&cmd_set_allmulti_mode_one,
+	(cmdline_parse_inst_t *)&cmd_set_allmulti_mode_all,
+	(cmdline_parse_inst_t *)&cmd_set_flush_rx,
+	(cmdline_parse_inst_t *)&cmd_set_link_check,
+	(cmdline_parse_inst_t *)&cmd_set_bypass_mode,
+	(cmdline_parse_inst_t *)&cmd_set_bypass_event,
+	(cmdline_parse_inst_t *)&cmd_set_bypass_timeout,
+	(cmdline_parse_inst_t *)&cmd_show_bypass_config,
+#ifdef RTE_LIBRTE_PMD_BOND
+	(cmdline_parse_inst_t *) &cmd_set_bonding_mode,
+	(cmdline_parse_inst_t *) &cmd_show_bonding_config,
+	(cmdline_parse_inst_t *) &cmd_set_bonding_primary,
+	(cmdline_parse_inst_t *) &cmd_add_bonding_slave,
+	(cmdline_parse_inst_t *) &cmd_remove_bonding_slave,
+	(cmdline_parse_inst_t *) &cmd_create_bonded_device,
+	(cmdline_parse_inst_t *) &cmd_set_bond_mac_addr,
+	(cmdline_parse_inst_t *) &cmd_set_balance_xmit_policy,
+	(cmdline_parse_inst_t *) &cmd_set_bond_mon_period,
+	(cmdline_parse_inst_t *) &cmd_set_lacp_dedicated_queues,
+	(cmdline_parse_inst_t *) &cmd_set_bonding_agg_mode_policy,
+#endif
+	(cmdline_parse_inst_t *)&cmd_vlan_offload,
+	(cmdline_parse_inst_t *)&cmd_vlan_tpid,
+	(cmdline_parse_inst_t *)&cmd_rx_vlan_filter_all,
+	(cmdline_parse_inst_t *)&cmd_rx_vlan_filter,
+	(cmdline_parse_inst_t *)&cmd_tx_vlan_set,
+	(cmdline_parse_inst_t *)&cmd_tx_vlan_set_qinq,
+	(cmdline_parse_inst_t *)&cmd_tx_vlan_reset,
+	(cmdline_parse_inst_t *)&cmd_tx_vlan_set_pvid,
+	(cmdline_parse_inst_t *)&cmd_csum_set,
+	(cmdline_parse_inst_t *)&cmd_csum_show,
+	(cmdline_parse_inst_t *)&cmd_csum_tunnel,
+	(cmdline_parse_inst_t *)&cmd_tso_set,
+	(cmdline_parse_inst_t *)&cmd_tso_show,
+	(cmdline_parse_inst_t *)&cmd_tunnel_tso_set,
+	(cmdline_parse_inst_t *)&cmd_tunnel_tso_show,
+	(cmdline_parse_inst_t *)&cmd_enable_gro,
+	(cmdline_parse_inst_t *)&cmd_gro_set,
+	(cmdline_parse_inst_t *)&cmd_link_flow_control_set,
+	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_rx,
+	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_tx,
+	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_hw,
+	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_lw,
+	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_pt,
+	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_xon,
+	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_macfwd,
+	(cmdline_parse_inst_t *)&cmd_link_flow_control_set_autoneg,
+	(cmdline_parse_inst_t *)&cmd_priority_flow_control_set,
+	(cmdline_parse_inst_t *)&cmd_config_dcb,
+	(cmdline_parse_inst_t *)&cmd_read_reg,
+	(cmdline_parse_inst_t *)&cmd_read_reg_bit_field,
+	(cmdline_parse_inst_t *)&cmd_read_reg_bit,
+	(cmdline_parse_inst_t *)&cmd_write_reg,
+	(cmdline_parse_inst_t *)&cmd_write_reg_bit_field,
+	(cmdline_parse_inst_t *)&cmd_write_reg_bit,
+	(cmdline_parse_inst_t *)&cmd_read_rxd_txd,
+	(cmdline_parse_inst_t *)&cmd_stop,
+	(cmdline_parse_inst_t *)&cmd_mac_addr,
+	(cmdline_parse_inst_t *)&cmd_set_qmap,
+	(cmdline_parse_inst_t *)&cmd_operate_port,
+	(cmdline_parse_inst_t *)&cmd_operate_specific_port,
+	(cmdline_parse_inst_t *)&cmd_operate_attach_port,
+	(cmdline_parse_inst_t *)&cmd_operate_detach_port,
+	(cmdline_parse_inst_t *)&cmd_config_speed_all,
+	(cmdline_parse_inst_t *)&cmd_config_speed_specific,
+	(cmdline_parse_inst_t *)&cmd_config_rx_tx,
+	(cmdline_parse_inst_t *)&cmd_config_mtu,
+	(cmdline_parse_inst_t *)&cmd_config_max_pkt_len,
+	(cmdline_parse_inst_t *)&cmd_config_rx_mode_flag,
+	(cmdline_parse_inst_t *)&cmd_config_rss,
+	(cmdline_parse_inst_t *)&cmd_config_rxtx_queue,
+	(cmdline_parse_inst_t *)&cmd_config_txqflags,
+	(cmdline_parse_inst_t *)&cmd_config_rss_reta,
+	(cmdline_parse_inst_t *)&cmd_showport_reta,
+	(cmdline_parse_inst_t *)&cmd_config_burst,
+	(cmdline_parse_inst_t *)&cmd_config_thresh,
+	(cmdline_parse_inst_t *)&cmd_config_threshold,
+	(cmdline_parse_inst_t *)&cmd_set_uc_hash_filter,
+	(cmdline_parse_inst_t *)&cmd_set_uc_all_hash_filter,
+	(cmdline_parse_inst_t *)&cmd_vf_mac_addr_filter,
+	(cmdline_parse_inst_t *)&cmd_set_vf_macvlan_filter,
+	(cmdline_parse_inst_t *)&cmd_queue_rate_limit,
+	(cmdline_parse_inst_t *)&cmd_tunnel_filter,
+	(cmdline_parse_inst_t *)&cmd_tunnel_udp_config,
+	(cmdline_parse_inst_t *)&cmd_global_config,
+	(cmdline_parse_inst_t *)&cmd_set_mirror_mask,
+	(cmdline_parse_inst_t *)&cmd_set_mirror_link,
+	(cmdline_parse_inst_t *)&cmd_reset_mirror_rule,
+	(cmdline_parse_inst_t *)&cmd_showport_rss_hash,
+	(cmdline_parse_inst_t *)&cmd_showport_rss_hash_key,
+	(cmdline_parse_inst_t *)&cmd_config_rss_hash_key,
+	(cmdline_parse_inst_t *)&cmd_dump,
+	(cmdline_parse_inst_t *)&cmd_dump_one,
+	(cmdline_parse_inst_t *)&cmd_ethertype_filter,
+	(cmdline_parse_inst_t *)&cmd_syn_filter,
+	(cmdline_parse_inst_t *)&cmd_2tuple_filter,
+	(cmdline_parse_inst_t *)&cmd_5tuple_filter,
+	(cmdline_parse_inst_t *)&cmd_flex_filter,
+	(cmdline_parse_inst_t *)&cmd_add_del_ip_flow_director,
+	(cmdline_parse_inst_t *)&cmd_add_del_udp_flow_director,
+	(cmdline_parse_inst_t *)&cmd_add_del_sctp_flow_director,
+	(cmdline_parse_inst_t *)&cmd_add_del_l2_flow_director,
+	(cmdline_parse_inst_t *)&cmd_add_del_mac_vlan_flow_director,
+	(cmdline_parse_inst_t *)&cmd_add_del_tunnel_flow_director,
+	(cmdline_parse_inst_t *)&cmd_flush_flow_director,
+	(cmdline_parse_inst_t *)&cmd_set_flow_director_ip_mask,
+	(cmdline_parse_inst_t *)&cmd_set_flow_director_mac_vlan_mask,
+	(cmdline_parse_inst_t *)&cmd_set_flow_director_tunnel_mask,
+	(cmdline_parse_inst_t *)&cmd_set_flow_director_flex_mask,
+	(cmdline_parse_inst_t *)&cmd_set_flow_director_flex_payload,
+	(cmdline_parse_inst_t *)&cmd_get_sym_hash_ena_per_port,
+	(cmdline_parse_inst_t *)&cmd_set_sym_hash_ena_per_port,
+	(cmdline_parse_inst_t *)&cmd_get_hash_global_config,
+	(cmdline_parse_inst_t *)&cmd_set_hash_global_config,
+	(cmdline_parse_inst_t *)&cmd_set_hash_input_set,
+	(cmdline_parse_inst_t *)&cmd_set_fdir_input_set,
+	(cmdline_parse_inst_t *)&cmd_flow,
+	(cmdline_parse_inst_t *)&cmd_mcast_addr,
+	(cmdline_parse_inst_t *)&cmd_config_l2_tunnel_eth_type_all,
+	(cmdline_parse_inst_t *)&cmd_config_l2_tunnel_eth_type_specific,
+	(cmdline_parse_inst_t *)&cmd_config_l2_tunnel_en_dis_all,
+	(cmdline_parse_inst_t *)&cmd_config_l2_tunnel_en_dis_specific,
+	(cmdline_parse_inst_t *)&cmd_config_e_tag_insertion_en,
+	(cmdline_parse_inst_t *)&cmd_config_e_tag_insertion_dis,
+	(cmdline_parse_inst_t *)&cmd_config_e_tag_stripping_en_dis,
+	(cmdline_parse_inst_t *)&cmd_config_e_tag_forwarding_en_dis,
+	(cmdline_parse_inst_t *)&cmd_config_e_tag_filter_add,
+	(cmdline_parse_inst_t *)&cmd_config_e_tag_filter_del,
+	(cmdline_parse_inst_t *)&cmd_set_vf_vlan_anti_spoof,
+	(cmdline_parse_inst_t *)&cmd_set_vf_mac_anti_spoof,
+	(cmdline_parse_inst_t *)&cmd_set_vf_vlan_stripq,
+	(cmdline_parse_inst_t *)&cmd_set_vf_vlan_insert,
+	(cmdline_parse_inst_t *)&cmd_set_tx_loopback,
+	(cmdline_parse_inst_t *)&cmd_set_all_queues_drop_en,
+	(cmdline_parse_inst_t *)&cmd_set_vf_split_drop_en,
+	(cmdline_parse_inst_t *)&cmd_set_macsec_offload_on,
+	(cmdline_parse_inst_t *)&cmd_set_macsec_offload_off,
+	(cmdline_parse_inst_t *)&cmd_set_macsec_sc,
+	(cmdline_parse_inst_t *)&cmd_set_macsec_sa,
+	(cmdline_parse_inst_t *)&cmd_set_vf_traffic,
+	(cmdline_parse_inst_t *)&cmd_set_vf_rxmode,
+	(cmdline_parse_inst_t *)&cmd_vf_rate_limit,
+	(cmdline_parse_inst_t *)&cmd_vf_rxvlan_filter,
+	(cmdline_parse_inst_t *)&cmd_set_vf_mac_addr,
+	(cmdline_parse_inst_t *)&cmd_set_vf_promisc,
+	(cmdline_parse_inst_t *)&cmd_set_vf_allmulti,
+	(cmdline_parse_inst_t *)&cmd_set_vf_broadcast,
+	(cmdline_parse_inst_t *)&cmd_set_vf_vlan_tag,
+	(cmdline_parse_inst_t *)&cmd_vf_max_bw,
+	(cmdline_parse_inst_t *)&cmd_vf_tc_min_bw,
+	(cmdline_parse_inst_t *)&cmd_vf_tc_max_bw,
+	(cmdline_parse_inst_t *)&cmd_strict_link_prio,
+	(cmdline_parse_inst_t *)&cmd_tc_min_bw,
+	(cmdline_parse_inst_t *)&cmd_ddp_add,
+	(cmdline_parse_inst_t *)&cmd_ddp_del,
+	(cmdline_parse_inst_t *)&cmd_ddp_get_list,
+	(cmdline_parse_inst_t *)&cmd_ddp_get_info,
+	(cmdline_parse_inst_t *)&cmd_show_vf_stats,
+	(cmdline_parse_inst_t *)&cmd_clear_vf_stats,
+	(cmdline_parse_inst_t *)&cmd_ptype_mapping_get,
+	(cmdline_parse_inst_t *)&cmd_ptype_mapping_replace,
+	(cmdline_parse_inst_t *)&cmd_ptype_mapping_reset,
+	(cmdline_parse_inst_t *)&cmd_ptype_mapping_update,
+#ifdef TM_MODE
+	(cmdline_parse_inst_t *)&cmd_show_port_tm_cap,
+	(cmdline_parse_inst_t *)&cmd_show_port_tm_level_cap,
+	(cmdline_parse_inst_t *)&cmd_show_port_tm_node_cap,
+	(cmdline_parse_inst_t *)&cmd_add_port_tm_node_shaper_profile,
+	(cmdline_parse_inst_t *)&cmd_del_port_tm_node_shaper_profile,
+	(cmdline_parse_inst_t *)&cmd_add_port_tm_node_shared_shaper,
+	(cmdline_parse_inst_t *)&cmd_del_port_tm_node_shared_shaper,
+	(cmdline_parse_inst_t *)&cmd_add_port_tm_node_wred_profile,
+	(cmdline_parse_inst_t *)&cmd_del_port_tm_node_wred_profile,
+	(cmdline_parse_inst_t *)&cmd_add_port_tm_nonleaf_node,
+	(cmdline_parse_inst_t *)&cmd_add_port_tm_leaf_node,
+	(cmdline_parse_inst_t *)&cmd_del_port_tm_node,
+	(cmdline_parse_inst_t *)&cmd_show_port_tm_node_type,
+	(cmdline_parse_inst_t *)&cmd_show_port_tm_node_stats,
+#ifdef RTE_SCHED_SUBPORT_TC_OV
+	(cmdline_parse_inst_t *)&cmd_set_port_tm_node_parent,
+#endif
+	(cmdline_parse_inst_t *)&cmd_set_port_tm_node_shaper_profile,
+	(cmdline_parse_inst_t *)&cmd_port_tm_hierarchy_commit,
+	(cmdline_parse_inst_t *)&cmd_set_port_tm_pktfield,
+	(cmdline_parse_inst_t *)&cmd_set_port_tm_tc_table,
+#endif
 	NULL,
 };