ethdev: move egress metadata to dynamic field
[dpdk.git] / app / test-pmd / cmdline.c
index e350c38..85fdb4c 100644 (file)
 #include <termios.h>
 #include <unistd.h>
 #include <inttypes.h>
-#ifndef __linux__
-#ifndef __FreeBSD__
-#include <net/socket.h>
-#else
+#ifdef RTE_EXEC_ENV_FREEBSD
 #include <sys/socket.h>
 #endif
-#endif
 #include <netinet/in.h>
 
 #include <sys/queue.h>
@@ -44,7 +40,6 @@
 #include <rte_ethdev.h>
 #include <rte_string_fns.h>
 #include <rte_devargs.h>
-#include <rte_eth_ctrl.h>
 #include <rte_flow.h>
 #include <rte_gro.h>
 
@@ -94,14 +89,16 @@ static void cmd_help_brief_parsed(__attribute__((unused)) void *parsed_result,
                cl,
                "\n"
                "Help is available for the following sections:\n\n"
-               "    help control    : Start and stop forwarding.\n"
-               "    help display    : Displaying port, stats and config "
+               "    help control                    : Start and stop forwarding.\n"
+               "    help display                    : Displaying port, stats and config "
                "information.\n"
-               "    help config     : Configuration information.\n"
-               "    help ports      : Configuring ports.\n"
-               "    help registers  : Reading and setting port registers.\n"
-               "    help filters    : Filters configuration help.\n"
-               "    help all        : All of the above sections.\n\n"
+               "    help config                     : Configuration information.\n"
+               "    help ports                      : Configuring ports.\n"
+               "    help registers                  : Reading and setting port registers.\n"
+               "    help filters                    : Filters configuration help.\n"
+               "    help traffic_management         : Traffic Management commmands.\n"
+               "    help devices                    : Device related cmds.\n"
+               "    help all                        : All of the above sections.\n\n"
        );
 
 }
@@ -210,21 +207,39 @@ static void cmd_help_long_parsed(void *parsed_result,
 
                        "show port meter stats (port_id) (meter_id) (clear)\n"
                        "    Get meter stats on a port\n\n"
-                        "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 fwd stats all\n"
+                       "    Display statistics for all fwd engines.\n\n"
+
+                       "clear fwd stats all\n"
+                       "    Clear statistics for all fwd engines.\n\n"
+
+                       "show port (port_id) rx_offload capabilities\n"
+                       "    List all per queue and per port Rx offloading"
+                       " capabilities of a port\n\n"
+
+                       "show port (port_id) rx_offload configuration\n"
+                       "    List port level and all queue level"
+                       " Rx offloading configuration\n\n"
 
-                        "show port tm node cap (port_id) (node_id)\n"
-                        "       Display the port TM node capability.\n\n"
+                       "show port (port_id) tx_offload capabilities\n"
+                       "    List all per queue and per port"
+                       " Tx offloading capabilities of a port\n\n"
 
-                        "show port tm node type (port_id) (node_id)\n"
-                        "       Display the port TM node type.\n\n"
+                       "show port (port_id) tx_offload configuration\n"
+                       "    List port level and all queue level"
+                       " Tx offloading configuration\n\n"
 
-                        "show port tm node stats (port_id) (node_id) (clear)\n"
-                        "       Display the port TM node stats.\n\n"
+                       "show port (port_id) tx_metadata\n"
+                       "    Show Tx metadata value set"
+                       " for a specific port\n\n"
 
+                       "show port (port_id) ptypes\n"
+                       "    Show port supported ptypes"
+                       " for a specific port\n\n"
+
+                       "show device info (<identifier>|all)"
+                       "       Show general information about devices probed.\n\n"
                );
        }
 
@@ -280,6 +295,9 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "set portlist (x[,y]*)\n"
                        "    Set the list of forwarding ports.\n\n"
 
+                       "set port setup on (iterator|event)\n"
+                       "    Select how attached port is retrieved for setup.\n\n"
+
                        "set tx loopback (port_id) (on|off)\n"
                        "    Enable or disable tx loopback.\n\n"
 
@@ -307,9 +325,6 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "set vf broadcast (port_id) (vf_id) (on|off)\n"
                        "    Set VF broadcast for a VF from the PF.\n\n"
 
-                       "vlan set strip (on|off) (port_id)\n"
-                       "    Set the VLAN strip on a port.\n\n"
-
                        "vlan set stripq (on|off) (port_id,queue_id)\n"
                        "    Set the VLAN strip for a queue on a port.\n\n"
 
@@ -340,12 +355,8 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "set tc tx min-bandwidth (port_id) (bw1, bw2, ...)\n"
                        "    Set all TCs' min bandwidth(%%) for all PF and VFs.\n\n"
 
-                       "vlan set filter (on|off) (port_id)\n"
-                       "    Set the VLAN filter on a port.\n\n"
-
-                       "vlan set qinq (on|off) (port_id)\n"
-                       "    Set the VLAN QinQ (extended queue in queue)"
-                       " on a port.\n\n"
+                       "vlan set (strip|filter|qinq_strip|extend) (on|off) (port_id)\n"
+                       "    Set the VLAN strip or filter or qinq strip or extend\n\n"
 
                        "vlan set (inner|outer) tpid (value) (port_id)\n"
                        "    Set the VLAN TPID for Packet Filtering on"
@@ -368,12 +379,12 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "filtered for VF(s) from port_id.\n\n"
 
                        "tunnel_filter add (port_id) (outer_mac) (inner_mac) (ip_addr) "
-                       "(inner_vlan) (vxlan|nvgre|ipingre) (imac-ivlan|imac-ivlan-tenid|"
+                       "(inner_vlan) (vxlan|nvgre|ipingre|vxlan-gpe) (imac-ivlan|imac-ivlan-tenid|"
                        "imac-tenid|imac|omac-imac-tenid|oip|iip) (tenant_id) (queue_id)\n"
                        "   add a tunnel filter of a port.\n\n"
 
                        "tunnel_filter rm (port_id) (outer_mac) (inner_mac) (ip_addr) "
-                       "(inner_vlan) (vxlan|nvgre|ipingre) (imac-ivlan|imac-ivlan-tenid|"
+                       "(inner_vlan) (vxlan|nvgre|ipingre|vxlan-gpe) (imac-ivlan|imac-ivlan-tenid|"
                        "imac-tenid|imac|omac-imac-tenid|oip|iip) (tenant_id) (queue_id)\n"
                        "   remove a tunnel filter of a port.\n\n"
 
@@ -639,11 +650,6 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "E-tag set filter del e-tag-id (value) port (port_id)\n"
                        "    Delete an E-tag forwarding filter on a port\n\n"
 
-#if defined RTE_LIBRTE_PMD_SOFTNIC && defined RTE_LIBRTE_SCHED
-                       "set port tm hierarchy default (port_id)\n"
-                       "       Set default traffic Management hierarchy on a port\n\n"
-
-#endif
                        "ddp add (port_id) (profile_path[,backup_profile_path])\n"
                        "    Load a profile package on a port\n\n"
 
@@ -724,82 +730,6 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "show port (port_id) queue-region\n"
                        "    show all queue region related configuration info\n\n"
 
-                       "add port tm node shaper profile (port_id) (shaper_profile_id)"
-                       " (tb_rate) (tb_size) (packet_length_adjust)\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"
-
-                       "set port tm node shaper profile (port_id) (node_id)"
-                       " (shaper_profile_id)\n"
-                       "       Set port tm node shaper profile.\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 (port_id) (node_id) (parent_node_id)"
-                       " (priority) (weight) (level_id) (shaper_profile_id)"
-                       " (n_sp_priorities) (stats_mask) (n_shared_shapers)"
-                       " [(shared_shaper_id_0) (shared_shaper_id_1)...]\n"
-                       "       Add port tm nonleaf node.\n\n"
-
-                       "add port tm leaf node (port_id) (node_id) (parent_node_id)"
-                       " (priority) (weight) (level_id) (shaper_profile_id)"
-                       " (cman_mode) (wred_profile_id) (stats_mask) (n_shared_shapers)"
-                       " [(shared_shaper_id_0) (shared_shaper_id_1)...]\n"
-                       "       Add port tm leaf node.\n\n"
-
-                       "del port tm node (port_id) (node_id)\n"
-                       "       Delete port tm node.\n\n"
-
-                       "set port tm node parent (port_id) (node_id) (parent_node_id)"
-                       " (priority) (weight)\n"
-                       "       Set port tm node parent.\n\n"
-
-                       "suspend port tm node (port_id) (node_id)"
-                       "       Suspend tm node.\n\n"
-
-                       "resume port tm node (port_id) (node_id)"
-                       "       Resume tm node.\n\n"
-
-                       "port tm hierarchy commit (port_id) (clean_on_fail)\n"
-                       "       Commit tm hierarchy.\n\n"
-
-                       "vxlan ip-version (ipv4|ipv6) vni (vni) udp-src"
-                       " (udp-src) udp-dst (udp-dst) ip-src (ip-src) ip-dst"
-                       " (ip-dst) eth-src (eth-src) eth-dst (eth-dst)\n"
-                       "       Configure the VXLAN encapsulation for flows.\n\n"
-
-                       "vxlan-with-vlan ip-version (ipv4|ipv6) vni (vni)"
-                       " udp-src (udp-src) udp-dst (udp-dst) ip-src (ip-src)"
-                       " ip-dst (ip-dst) vlan-tci (vlan-tci) eth-src (eth-src)"
-                       " eth-dst (eth-dst)\n"
-                       "       Configure the VXLAN encapsulation for flows.\n\n"
-
-                       "nvgre ip-version (ipv4|ipv6) tni (tni) ip-src"
-                       " (ip-src) ip-dst (ip-dst) eth-src (eth-src) eth-dst"
-                       " (eth-dst)\n"
-                       "       Configure the NVGRE encapsulation for flows.\n\n"
-
-                       "nvgre-with-vlan ip-version (ipv4|ipv6) tni (tni)"
-                       " ip-src (ip-src) ip-dst (ip-dst) vlan-tci (vlan-tci)"
-                       " eth-src (eth-src) eth-dst (eth-dst)\n"
-                       "       Configure the NVGRE encapsulation for flows.\n\n"
-
                        , list_pkt_forwarding_modes()
                );
        }
@@ -821,6 +751,9 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "port close (port_id|all)\n"
                        "    Close all ports or port_id.\n\n"
 
+                       "port reset (port_id|all)\n"
+                       "    Reset all ports or port_id.\n\n"
+
                        "port attach (ident)\n"
                        "    Attach physical or virtual dev by pci address or virtual device name\n\n"
 
@@ -841,14 +774,12 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "port config all max-pkt-len (value)\n"
                        "    Set the max packet length.\n\n"
 
-                       "port config all (crc-strip|scatter|rx-cksum|rx-timestamp|hw-vlan|hw-vlan-filter|"
-                       "hw-vlan-strip|hw-vlan-extend|drop-en)"
-                       " (on|off)\n"
-                       "    Set crc-strip/scatter/rx-checksum/hardware-vlan/drop_en"
-                       " for ports.\n\n"
+                       "port config all drop-en (on|off)\n"
+                       "    Enable or disable packet drop on all RX queues of all ports when no "
+                       "receive buffers available.\n\n"
 
                        "port config all rss (all|default|ip|tcp|udp|sctp|"
-                       "ether|port|vxlan|geneve|nvgre|none|<flowtype_id>)\n"
+                       "ether|port|vxlan|geneve|nvgre|vxlan-gpe|none|<flowtype_id>)\n"
                        "    Set the RSS mode.\n\n"
 
                        "port config port-id rss reta (hash,queue)[,(hash,queue)]\n"
@@ -914,6 +845,52 @@ static void cmd_help_long_parsed(void *parsed_result,
 
                        "port config (port_id) udp_tunnel_port add|rm vxlan|geneve (udp_port)\n\n"
                        "    Add/remove UDP tunnel port for tunneling offload\n\n"
+
+                       "port config <port_id> rx_offload vlan_strip|"
+                       "ipv4_cksum|udp_cksum|tcp_cksum|tcp_lro|qinq_strip|"
+                       "outer_ipv4_cksum|macsec_strip|header_split|"
+                       "vlan_filter|vlan_extend|jumbo_frame|"
+                       "scatter|timestamp|security|keep_crc on|off\n"
+                       "     Enable or disable a per port Rx offloading"
+                       " on all Rx queues of a port\n\n"
+
+                       "port (port_id) rxq (queue_id) rx_offload vlan_strip|"
+                       "ipv4_cksum|udp_cksum|tcp_cksum|tcp_lro|qinq_strip|"
+                       "outer_ipv4_cksum|macsec_strip|header_split|"
+                       "vlan_filter|vlan_extend|jumbo_frame|"
+                       "scatter|timestamp|security|keep_crc on|off\n"
+                       "    Enable or disable a per queue Rx offloading"
+                       " only on a specific Rx queue\n\n"
+
+                       "port config (port_id) tx_offload vlan_insert|"
+                       "ipv4_cksum|udp_cksum|tcp_cksum|sctp_cksum|tcp_tso|"
+                       "udp_tso|outer_ipv4_cksum|qinq_insert|vxlan_tnl_tso|"
+                       "gre_tnl_tso|ipip_tnl_tso|geneve_tnl_tso|"
+                       "macsec_insert|mt_lockfree|multi_segs|mbuf_fast_free|"
+                       "security|match_metadata on|off\n"
+                       "    Enable or disable a per port Tx offloading"
+                       " on all Tx queues of a port\n\n"
+
+                       "port (port_id) txq (queue_id) tx_offload vlan_insert|"
+                       "ipv4_cksum|udp_cksum|tcp_cksum|sctp_cksum|tcp_tso|"
+                       "udp_tso|outer_ipv4_cksum|qinq_insert|vxlan_tnl_tso|"
+                       "gre_tnl_tso|ipip_tnl_tso|geneve_tnl_tso|macsec_insert"
+                       "|mt_lockfree|multi_segs|mbuf_fast_free|security"
+                       " on|off\n"
+                       "    Enable or disable a per queue Tx offloading"
+                       " only on a specific Tx queue\n\n"
+
+                       "bpf-load rx|tx (port) (queue) (J|M|B) (file_name)\n"
+                       "    Load an eBPF program as a callback"
+                       " for particular RX/TX queue\n\n"
+
+                       "bpf-unload rx|tx (port) (queue)\n"
+                       "    Unload previously loaded eBPF program"
+                       " for particular RX/TX queue\n\n"
+
+                       "port config (port_id) tx_metadata (value)\n"
+                       "    Set Tx metadata value per port. Testpmd will add this value"
+                       " to any Tx packet sent from this port\n\n"
                );
        }
 
@@ -1072,7 +1049,7 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "get_hash_global_config (port_id)\n"
                        "    Get the global configurations of hash filters.\n\n"
 
-                       "set_hash_global_config (port_id) (toeplitz|simple_xor|default)"
+                       "set_hash_global_config (port_id) (toeplitz|simple_xor|symmetric_toeplitz|default)"
                        " (ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|ipv6|"
                        "ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|l2_payload)"
                        " (enable|disable)\n"
@@ -1131,8 +1108,154 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "flow isolate {port_id} {boolean}\n"
                        "    Restrict ingress traffic to the defined"
                        " flow rules\n\n"
+
+                       "set vxlan ip-version (ipv4|ipv6) vni (vni) udp-src"
+                       " (udp-src) udp-dst (udp-dst) ip-src (ip-src) ip-dst"
+                       " (ip-dst) eth-src (eth-src) eth-dst (eth-dst)\n"
+                       "       Configure the VXLAN encapsulation for flows.\n\n"
+
+                       "set vxlan-with-vlan ip-version (ipv4|ipv6) vni (vni)"
+                       " udp-src (udp-src) udp-dst (udp-dst) ip-src (ip-src)"
+                       " ip-dst (ip-dst) vlan-tci (vlan-tci) eth-src (eth-src)"
+                       " eth-dst (eth-dst)\n"
+                       "       Configure the VXLAN encapsulation for flows.\n\n"
+
+                       "set vxlan-tos-ttl ip-version (ipv4|ipv6) vni (vni) udp-src"
+                       " (udp-src) udp-dst (udp-dst) ip-tos (ip-tos) ip-ttl (ip-ttl)"
+                       " ip-src (ip-src) ip-dst (ip-dst) eth-src (eth-src)"
+                       " eth-dst (eth-dst)\n"
+                       "       Configure the VXLAN encapsulation for flows.\n\n"
+
+                       "set nvgre ip-version (ipv4|ipv6) tni (tni) ip-src"
+                       " (ip-src) ip-dst (ip-dst) eth-src (eth-src) eth-dst"
+                       " (eth-dst)\n"
+                       "       Configure the NVGRE encapsulation for flows.\n\n"
+
+                       "set nvgre-with-vlan ip-version (ipv4|ipv6) tni (tni)"
+                       " ip-src (ip-src) ip-dst (ip-dst) vlan-tci (vlan-tci)"
+                       " eth-src (eth-src) eth-dst (eth-dst)\n"
+                       "       Configure the NVGRE encapsulation for flows.\n\n"
+
+                       "set raw_encap {flow items}\n"
+                       "       Configure the encapsulation with raw data.\n\n"
+
+                       "set raw_decap {flow items}\n"
+                       "       Configure the decapsulation with raw data.\n\n"
+
                );
        }
+
+       if (show_all || !strcmp(res->section, "traffic_management")) {
+               cmdline_printf(
+                       cl,
+                       "\n"
+                       "Traffic Management:\n"
+                       "--------------\n"
+                       "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"
+
+#if defined RTE_LIBRTE_PMD_SOFTNIC && defined RTE_LIBRTE_SCHED
+                       "set port tm hierarchy default (port_id)\n"
+                       "       Set default traffic Management hierarchy on a port\n\n"
+#endif
+
+                       "add port tm node shaper profile (port_id) (shaper_profile_id)"
+                       " (cmit_tb_rate) (cmit_tb_size) (peak_tb_rate) (peak_tb_size)"
+                       " (packet_length_adjust)\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"
+
+                       "set port tm node shaper profile (port_id) (node_id)"
+                       " (shaper_profile_id)\n"
+                       "       Set port tm node shaper profile.\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 (port_id) (node_id) (parent_node_id)"
+                       " (priority) (weight) (level_id) (shaper_profile_id)"
+                       " (n_sp_priorities) (stats_mask) (n_shared_shapers)"
+                       " [(shared_shaper_id_0) (shared_shaper_id_1)...]\n"
+                       "       Add port tm nonleaf node.\n\n"
+
+                       "add port tm leaf node (port_id) (node_id) (parent_node_id)"
+                       " (priority) (weight) (level_id) (shaper_profile_id)"
+                       " (cman_mode) (wred_profile_id) (stats_mask) (n_shared_shapers)"
+                       " [(shared_shaper_id_0) (shared_shaper_id_1)...]\n"
+                       "       Add port tm leaf node.\n\n"
+
+                       "del port tm node (port_id) (node_id)\n"
+                       "       Delete port tm node.\n\n"
+
+                       "set port tm node parent (port_id) (node_id) (parent_node_id)"
+                       " (priority) (weight)\n"
+                       "       Set port tm node parent.\n\n"
+
+                       "suspend port tm node (port_id) (node_id)"
+                       "       Suspend tm node.\n\n"
+
+                       "resume port tm node (port_id) (node_id)"
+                       "       Resume tm node.\n\n"
+
+                       "port tm hierarchy commit (port_id) (clean_on_fail)\n"
+                       "       Commit tm hierarchy.\n\n"
+
+                       "set port tm mark ip_ecn (port) (green) (yellow)"
+                       " (red)\n"
+                       "    Enables/Disables the traffic management marking"
+                       " for IP ECN (Explicit Congestion Notification)"
+                       " packets on a given port\n\n"
+
+                       "set port tm mark ip_dscp (port) (green) (yellow)"
+                       " (red)\n"
+                       "    Enables/Disables the traffic management marking"
+                       " on the port for IP dscp packets\n\n"
+
+                       "set port tm mark vlan_dei (port) (green) (yellow)"
+                       " (red)\n"
+                       "    Enables/Disables the traffic management marking"
+                       " on the port for VLAN packets with DEI enabled\n\n"
+               );
+       }
+
+       if (show_all || !strcmp(res->section, "devices")) {
+               cmdline_printf(
+                       cl,
+                       "\n"
+                       "Device Operations:\n"
+                       "--------------\n"
+                       "device detach (identifier)\n"
+                       "       Detach device by identifier.\n\n"
+               );
+       }
+
 }
 
 cmdline_parse_token_string_t cmd_help_long_help =
@@ -1141,12 +1264,13 @@ cmdline_parse_token_string_t cmd_help_long_help =
 cmdline_parse_token_string_t cmd_help_long_section =
        TOKEN_STRING_INITIALIZER(struct cmd_help_long_result, section,
                        "all#control#display#config#"
-                       "ports#registers#filters");
+                       "ports#registers#filters#traffic_management#devices");
 
 cmdline_parse_inst_t cmd_help_long = {
        .f = cmd_help_long_parsed,
        .data = NULL,
-       .help_str = "help all|control|display|config|ports|register|filters: "
+       .help_str = "help all|control|display|config|ports|register|"
+               "filters|traffic_management|devices: "
                "Show help",
        .tokens = {
                (void *)&cmd_help_long_help,
@@ -1249,6 +1373,59 @@ cmdline_parse_inst_t cmd_operate_specific_port = {
        },
 };
 
+/* *** enable port setup (after attach) via iterator or event *** */
+struct cmd_set_port_setup_on_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t port;
+       cmdline_fixed_string_t setup;
+       cmdline_fixed_string_t on;
+       cmdline_fixed_string_t mode;
+};
+
+static void cmd_set_port_setup_on_parsed(void *parsed_result,
+                               __attribute__((unused)) struct cmdline *cl,
+                               __attribute__((unused)) void *data)
+{
+       struct cmd_set_port_setup_on_result *res = parsed_result;
+
+       if (strcmp(res->mode, "event") == 0)
+               setup_on_probe_event = true;
+       else if (strcmp(res->mode, "iterator") == 0)
+               setup_on_probe_event = false;
+       else
+               printf("Unknown mode\n");
+}
+
+cmdline_parse_token_string_t cmd_set_port_setup_on_set =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result,
+                       set, "set");
+cmdline_parse_token_string_t cmd_set_port_setup_on_port =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result,
+                       port, "port");
+cmdline_parse_token_string_t cmd_set_port_setup_on_setup =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result,
+                       setup, "setup");
+cmdline_parse_token_string_t cmd_set_port_setup_on_on =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result,
+                       on, "on");
+cmdline_parse_token_string_t cmd_set_port_setup_on_mode =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_port_setup_on_result,
+                       mode, "iterator#event");
+
+cmdline_parse_inst_t cmd_set_port_setup_on = {
+       .f = cmd_set_port_setup_on_parsed,
+       .data = NULL,
+       .help_str = "set port setup on iterator|event",
+       .tokens = {
+               (void *)&cmd_set_port_setup_on_set,
+               (void *)&cmd_set_port_setup_on_port,
+               (void *)&cmd_set_port_setup_on_setup,
+               (void *)&cmd_set_port_setup_on_on,
+               (void *)&cmd_set_port_setup_on_mode,
+               NULL,
+       },
+};
+
 /* *** attach a specified port *** */
 struct cmd_operate_attach_port_result {
        cmdline_fixed_string_t port;
@@ -1332,6 +1509,47 @@ cmdline_parse_inst_t cmd_operate_detach_port = {
        },
 };
 
+/* *** detach device by identifier *** */
+struct cmd_operate_detach_device_result {
+       cmdline_fixed_string_t device;
+       cmdline_fixed_string_t keyword;
+       cmdline_fixed_string_t identifier;
+};
+
+static void cmd_operate_detach_device_parsed(void *parsed_result,
+                               __attribute__((unused)) struct cmdline *cl,
+                               __attribute__((unused)) void *data)
+{
+       struct cmd_operate_detach_device_result *res = parsed_result;
+
+       if (!strcmp(res->keyword, "detach"))
+               detach_device(res->identifier);
+       else
+               printf("Unknown parameter\n");
+}
+
+cmdline_parse_token_string_t cmd_operate_detach_device_device =
+       TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_device_result,
+                       device, "device");
+cmdline_parse_token_string_t cmd_operate_detach_device_keyword =
+       TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_device_result,
+                       keyword, "detach");
+cmdline_parse_token_string_t cmd_operate_detach_device_identifier =
+       TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_device_result,
+                       identifier, NULL);
+
+cmdline_parse_inst_t cmd_operate_detach_device = {
+       .f = cmd_operate_detach_device_parsed,
+       .data = NULL,
+       .help_str = "device detach <identifier>:"
+               "(identifier: pci address or virtual dev name)",
+       .tokens = {
+               (void *)&cmd_operate_detach_device_device,
+               (void *)&cmd_operate_detach_device_keyword,
+               (void *)&cmd_operate_detach_device_identifier,
+               NULL,
+       },
+};
 /* *** configure speed for all ports *** */
 struct cmd_config_speed_all {
        cmdline_fixed_string_t port;
@@ -1764,16 +1982,16 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
                uint64_t rx_offloads = port->dev_conf.rxmode.offloads;
 
                if (!strcmp(res->name, "max-pkt-len")) {
-                       if (res->value < ETHER_MIN_LEN) {
+                       if (res->value < RTE_ETHER_MIN_LEN) {
                                printf("max-pkt-len can not be less than %d\n",
-                                               ETHER_MIN_LEN);
+                                               RTE_ETHER_MIN_LEN);
                                return;
                        }
                        if (res->value == port->dev_conf.rxmode.max_rx_pkt_len)
                                return;
 
                        port->dev_conf.rxmode.max_rx_pkt_len = res->value;
-                       if (res->value > ETHER_MAX_LEN)
+                       if (res->value > RTE_ETHER_MAX_LEN)
                                rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
                        else
                                rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
@@ -1835,8 +2053,8 @@ cmd_config_mtu_parsed(void *parsed_result,
 {
        struct cmd_config_mtu_result *res = parsed_result;
 
-       if (res->value < ETHER_MIN_LEN) {
-               printf("mtu cannot be less than %d\n", ETHER_MIN_LEN);
+       if (res->value < RTE_ETHER_MIN_LEN) {
+               printf("mtu cannot be less than %d\n", RTE_ETHER_MIN_LEN);
                return;
        }
        port_mtu_set(res->port_id, res->value);
@@ -1885,107 +2103,24 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
                                __attribute__((unused)) void *data)
 {
        struct cmd_config_rx_mode_flag *res = parsed_result;
-       portid_t pid;
 
        if (!all_ports_stopped()) {
                printf("Please stop all ports first\n");
                return;
        }
 
-       RTE_ETH_FOREACH_DEV(pid) {
-               struct rte_port *port;
-               uint64_t rx_offloads;
-
-               port = &ports[pid];
-               rx_offloads = port->dev_conf.rxmode.offloads;
-               if (!strcmp(res->name, "crc-strip")) {
-                       if (!strcmp(res->value, "on")) {
-                               rx_offloads &= ~DEV_RX_OFFLOAD_KEEP_CRC;
-                       } else if (!strcmp(res->value, "off")) {
-                               rx_offloads |= DEV_RX_OFFLOAD_KEEP_CRC;
-                       } else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else if (!strcmp(res->name, "scatter")) {
-                       if (!strcmp(res->value, "on")) {
-                               rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
-                       } else if (!strcmp(res->value, "off")) {
-                               rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER;
-                       } else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else if (!strcmp(res->name, "rx-cksum")) {
-                       if (!strcmp(res->value, "on"))
-                               rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
-                       else if (!strcmp(res->value, "off"))
-                               rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM;
-                       else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else if (!strcmp(res->name, "rx-timestamp")) {
-                       if (!strcmp(res->value, "on"))
-                               rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
-                       else if (!strcmp(res->value, "off"))
-                               rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;
-                       else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else if (!strcmp(res->name, "hw-vlan")) {
-                       if (!strcmp(res->value, "on")) {
-                               rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
-                                               DEV_RX_OFFLOAD_VLAN_STRIP);
-                       } else if (!strcmp(res->value, "off")) {
-                               rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER |
-                                               DEV_RX_OFFLOAD_VLAN_STRIP);
-                       } else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else if (!strcmp(res->name, "hw-vlan-filter")) {
-                       if (!strcmp(res->value, "on"))
-                               rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
-                       else if (!strcmp(res->value, "off"))
-                               rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
-                       else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else if (!strcmp(res->name, "hw-vlan-strip")) {
-                       if (!strcmp(res->value, "on"))
-                               rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
-                       else if (!strcmp(res->value, "off"))
-                               rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
-                       else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else if (!strcmp(res->name, "hw-vlan-extend")) {
-                       if (!strcmp(res->value, "on"))
-                               rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
-                       else if (!strcmp(res->value, "off"))
-                               rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
-                       else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else if (!strcmp(res->name, "drop-en")) {
-                       if (!strcmp(res->value, "on"))
-                               rx_drop_en = 1;
-                       else if (!strcmp(res->value, "off"))
-                               rx_drop_en = 0;
-                       else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else {
+       if (!strcmp(res->name, "drop-en")) {
+               if (!strcmp(res->value, "on"))
+                       rx_drop_en = 1;
+               else if (!strcmp(res->value, "off"))
+                       rx_drop_en = 0;
+               else {
                        printf("Unknown parameter\n");
                        return;
                }
-               port->dev_conf.rxmode.offloads = rx_offloads;
+       } else {
+               printf("Unknown parameter\n");
+               return;
        }
 
        init_port_config();
@@ -2002,8 +2137,7 @@ cmdline_parse_token_string_t cmd_config_rx_mode_flag_all =
        TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, all, "all");
 cmdline_parse_token_string_t cmd_config_rx_mode_flag_name =
        TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, name,
-                                       "crc-strip#scatter#rx-cksum#rx-timestamp#hw-vlan#"
-                                       "hw-vlan-filter#hw-vlan-strip#hw-vlan-extend");
+                                       "drop-en");
 cmdline_parse_token_string_t cmd_config_rx_mode_flag_value =
        TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, value,
                                                        "on#off");
@@ -2011,8 +2145,7 @@ cmdline_parse_token_string_t cmd_config_rx_mode_flag_value =
 cmdline_parse_inst_t cmd_config_rx_mode_flag = {
        .f = cmd_config_rx_mode_flag_parsed,
        .data = NULL,
-       .help_str = "port config all crc-strip|scatter|rx-cksum|rx-timestamp|hw-vlan|"
-               "hw-vlan-filter|hw-vlan-strip|hw-vlan-extend on|off",
+       .help_str = "port config all drop-en on|off",
        .tokens = {
                (void *)&cmd_config_rx_mode_flag_port,
                (void *)&cmd_config_rx_mode_flag_keyword,
@@ -2044,6 +2177,7 @@ cmd_config_rss_parsed(void *parsed_result,
        int all_updated = 1;
        int diag;
        uint16_t i;
+       int ret;
 
        if (!strcmp(res->value, "all"))
                rss_conf.rss_hf = ETH_RSS_IP | ETH_RSS_TCP |
@@ -2067,6 +2201,14 @@ cmd_config_rss_parsed(void *parsed_result,
                rss_conf.rss_hf = ETH_RSS_GENEVE;
        else if (!strcmp(res->value, "nvgre"))
                rss_conf.rss_hf = ETH_RSS_NVGRE;
+       else if (!strcmp(res->value, "l3-src-only"))
+               rss_conf.rss_hf = ETH_RSS_L3_SRC_ONLY;
+       else if (!strcmp(res->value, "l3-dst-only"))
+               rss_conf.rss_hf = ETH_RSS_L3_DST_ONLY;
+       else if (!strcmp(res->value, "l4-src-only"))
+               rss_conf.rss_hf = ETH_RSS_L4_SRC_ONLY;
+       else if (!strcmp(res->value, "l4-dst-only"))
+               rss_conf.rss_hf = ETH_RSS_L4_DST_ONLY;
        else if (!strcmp(res->value, "none"))
                rss_conf.rss_hf = 0;
        else if (!strcmp(res->value, "default"))
@@ -2083,7 +2225,10 @@ cmd_config_rss_parsed(void *parsed_result,
        RTE_ETH_FOREACH_DEV(i) {
                struct rte_eth_rss_conf local_rss_conf;
 
-               rte_eth_dev_info_get(i, &dev_info);
+               ret = eth_dev_info_get_print_err(i, &dev_info);
+               if (ret != 0)
+                       return;
+
                if (use_default)
                        rss_conf.rss_hf = dev_info.flow_type_rss_offloads;
 
@@ -2122,7 +2267,7 @@ cmdline_parse_inst_t cmd_config_rss = {
        .f = cmd_config_rss_parsed,
        .data = NULL,
        .help_str = "port config all rss "
-               "all|default|ip|tcp|udp|sctp|ether|port|vxlan|geneve|nvgre|none|<flowtype_id>",
+               "all|default|ip|tcp|udp|sctp|ether|port|vxlan|geneve|nvgre|vxlan-gpe|none|<flowtype_id>",
        .tokens = {
                (void *)&cmd_config_rss_port,
                (void *)&cmd_config_rss_keyword,
@@ -2181,9 +2326,12 @@ cmd_config_rss_hash_key_parsed(void *parsed_result,
        struct rte_eth_dev_info dev_info;
        uint8_t hash_key_size;
        uint32_t key_len;
+       int ret;
+
+       ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+       if (ret != 0)
+               return;
 
-       memset(&dev_info, 0, sizeof(dev_info));
-       rte_eth_dev_info_get(res->port_id, &dev_info);
        if (dev_info.hash_key_size > 0 &&
                        dev_info.hash_key_size <= sizeof(hash_key))
                hash_key_size = dev_info.hash_key_size;
@@ -2228,7 +2376,8 @@ cmdline_parse_token_string_t cmd_config_rss_hash_key_rss_type =
                                 "ipv4#ipv4-frag#ipv4-tcp#ipv4-udp#ipv4-sctp#"
                                 "ipv4-other#ipv6#ipv6-frag#ipv6-tcp#ipv6-udp#"
                                 "ipv6-sctp#ipv6-other#l2-payload#ipv6-ex#"
-                                "ipv6-tcp-ex#ipv6-udp-ex");
+                                "ipv6-tcp-ex#ipv6-udp-ex#"
+                                "l3-src-only#l3-dst-only#l4-src-only#l4-dst-only");
 cmdline_parse_token_string_t cmd_config_rss_hash_key_value =
        TOKEN_STRING_INITIALIZER(struct cmd_config_rss_hash_key, key, NULL);
 
@@ -2238,7 +2387,8 @@ cmdline_parse_inst_t cmd_config_rss_hash_key = {
        .help_str = "port config <port_id> rss-hash-key "
                "ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|"
                "ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|"
-               "l2-payload|ipv6-ex|ipv6-tcp-ex|ipv6-udp-ex "
+               "l2-payload|ipv6-ex|ipv6-tcp-ex|ipv6-udp-ex|"
+               "l3-src-only|l3-dst-only|l4-src-only|l4-dst-only "
                "<string of hex digits (variable length, NIC dependent)>",
        .tokens = {
                (void *)&cmd_config_rss_hash_key_port,
@@ -2715,8 +2865,10 @@ cmd_set_rss_reta_parsed(void *parsed_result,
        struct rte_eth_rss_reta_entry64 reta_conf[8];
        struct cmd_config_rss_reta *res = parsed_result;
 
-       memset(&dev_info, 0, sizeof(dev_info));
-       rte_eth_dev_info_get(res->port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if (dev_info.reta_size == 0) {
                printf("Redirection table size is 0 which is "
                                        "invalid for RSS\n");
@@ -2834,9 +2986,12 @@ cmd_showport_reta_parsed(void *parsed_result,
        struct rte_eth_rss_reta_entry64 reta_conf[8];
        struct rte_eth_dev_info dev_info;
        uint16_t max_reta_size;
+       int ret;
+
+       ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+       if (ret != 0)
+               return;
 
-       memset(&dev_info, 0, sizeof(dev_info));
-       rte_eth_dev_info_get(res->port_id, &dev_info);
        max_reta_size = RTE_MIN(dev_info.reta_size, ETH_RSS_RETA_SIZE_512);
        if (res->size == 0 || res->size > max_reta_size) {
                printf("Invalid redirection table size: %u (1-%u)\n",
@@ -3063,6 +3218,7 @@ cmd_config_burst_parsed(void *parsed_result,
        struct cmd_config_burst *res = parsed_result;
        struct rte_eth_dev_info dev_info;
        uint16_t rec_nb_pkts;
+       int ret;
 
        if (!all_ports_stopped()) {
                printf("Please stop all ports first\n");
@@ -3076,7 +3232,10 @@ cmd_config_burst_parsed(void *parsed_result,
                         * size for all ports, so assume all ports are the same
                         * NIC model and use the values from Port 0.
                         */
-                       rte_eth_dev_info_get(0, &dev_info);
+                       ret = eth_dev_info_get_print_err(0, &dev_info);
+                       if (ret != 0)
+                               return;
+
                        rec_nb_pkts = dev_info.default_rxportconf.burst_size;
 
                        if (rec_nb_pkts == 0) {
@@ -3765,6 +3924,8 @@ cmd_vlan_offload_parsed(void *parsed_result,
        }
        else if (!strcmp(res->what, "filter"))
                rx_vlan_filter_set(port_id, on);
+       else if (!strcmp(res->what, "qinq_strip"))
+               rx_vlan_qinq_strip_set(port_id, on);
        else
                vlan_extend_set(port_id, on);
 
@@ -3779,7 +3940,7 @@ cmdline_parse_token_string_t cmd_vlan_offload_set =
                                 set, "set");
 cmdline_parse_token_string_t cmd_vlan_offload_what =
        TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result,
-                                what, "strip#filter#qinq#stripq");
+                               what, "strip#filter#qinq_strip#extend#stripq");
 cmdline_parse_token_string_t cmd_vlan_offload_on =
        TOKEN_STRING_INITIALIZER(struct cmd_vlan_offload_result,
                              on, "on#off");
@@ -3790,9 +3951,9 @@ cmdline_parse_token_string_t cmd_vlan_offload_portid =
 cmdline_parse_inst_t cmd_vlan_offload = {
        .f = cmd_vlan_offload_parsed,
        .data = NULL,
-       .help_str = "vlan set strip|filter|qinq|stripq on|off "
+       .help_str = "vlan set strip|filter|qinq_strip|extend|stripq on|off "
                "<port_id[,queue_id]>: "
-               "Filter/Strip for rx side qinq(extended) for both rx/tx sides",
+               "Strip/Filter/QinQ for rx side Extend for both rx/tx sides",
        .tokens = {
                (void *)&cmd_vlan_offload_vlan,
                (void *)&cmd_vlan_offload_set,
@@ -4146,6 +4307,7 @@ csum_show(int port_id)
 {
        struct rte_eth_dev_info dev_info;
        uint64_t tx_offloads;
+       int ret;
 
        tx_offloads = ports[port_id].dev_conf.txmode.offloads;
        printf("Parse tunnel is %s\n",
@@ -4164,7 +4326,10 @@ csum_show(int port_id)
                (tx_offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM) ? "hw" : "sw");
 
        /* display warnings if configuration is not supported by the NIC */
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if ((tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) &&
                (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) == 0) {
                printf("Warning: hardware IP checksum enabled but not "
@@ -4198,6 +4363,17 @@ csum_show(int port_id)
        }
 }
 
+static void
+cmd_config_queue_tx_offloads(struct rte_port *port)
+{
+       int k;
+
+       /* Apply queue tx offloads configuration */
+       for (k = 0; k < port->dev_info.max_rx_queues; k++)
+               port->tx_conf[k].offloads =
+                       port->dev_conf.txmode.offloads;
+}
+
 static void
 cmd_csum_parsed(void *parsed_result,
                       __attribute__((unused)) struct cmdline *cl,
@@ -4207,6 +4383,7 @@ cmd_csum_parsed(void *parsed_result,
        int hw = 0;
        uint64_t csum_offloads = 0;
        struct rte_eth_dev_info dev_info;
+       int ret;
 
        if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
                printf("invalid port %d\n", res->port_id);
@@ -4217,7 +4394,10 @@ cmd_csum_parsed(void *parsed_result,
                return;
        }
 
-       rte_eth_dev_info_get(res->port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if (!strcmp(res->mode, "set")) {
 
                if (!strcmp(res->hwsw, "hw"))
@@ -4282,6 +4462,7 @@ cmd_csum_parsed(void *parsed_result,
                        ports[res->port_id].dev_conf.txmode.offloads &=
                                                        (~csum_offloads);
                }
+               cmd_config_queue_tx_offloads(&ports[res->port_id]);
        }
        csum_show(res->port_id);
 
@@ -4404,6 +4585,7 @@ cmd_tso_set_parsed(void *parsed_result,
 {
        struct cmd_tso_set_result *res = parsed_result;
        struct rte_eth_dev_info dev_info;
+       int ret;
 
        if (port_id_is_invalid(res->port_id, ENABLED_WARN))
                return;
@@ -4415,7 +4597,10 @@ cmd_tso_set_parsed(void *parsed_result,
        if (!strcmp(res->mode, "set"))
                ports[res->port_id].tso_segsz = res->tso_segsz;
 
-       rte_eth_dev_info_get(res->port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if ((ports[res->port_id].tso_segsz != 0) &&
                (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
                printf("Error: TSO is not supported by port %d\n",
@@ -4433,9 +4618,13 @@ cmd_tso_set_parsed(void *parsed_result,
                printf("TSO segment size for non-tunneled packets is %d\n",
                        ports[res->port_id].tso_segsz);
        }
+       cmd_config_queue_tx_offloads(&ports[res->port_id]);
 
        /* display warnings if configuration is not supported by the NIC */
-       rte_eth_dev_info_get(res->port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if ((ports[res->port_id].tso_segsz != 0) &&
                (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
                printf("Warning: TSO enabled but not "
@@ -4504,7 +4693,9 @@ check_tunnel_tso_nic_support(portid_t port_id)
 {
        struct rte_eth_dev_info dev_info;
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       if (eth_dev_info_get_print_err(port_id, &dev_info) != 0)
+               return dev_info;
+
        if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO))
                printf("Warning: VXLAN TUNNEL TSO not supported therefore "
                       "not enabled for port %d\n", port_id);
@@ -4588,6 +4779,7 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
                                "if outer L3 is IPv4; not necessary for IPv6\n");
        }
 
+       cmd_config_queue_tx_offloads(&ports[res->port_id]);
        cmd_reconfig_device_queue(res->port_id, 1, 1);
 }
 
@@ -5898,6 +6090,7 @@ static void cmd_create_bonded_device_parsed(void *parsed_result,
        struct cmd_create_bonded_device_result *res = parsed_result;
        char ethdev_name[RTE_ETH_NAME_MAX_LEN];
        int port_id;
+       int ret;
 
        if (test_done == 0) {
                printf("Please stop forwarding first\n");
@@ -5919,7 +6112,13 @@ static void cmd_create_bonded_device_parsed(void *parsed_result,
                /* Update number of ports */
                nb_ports = rte_eth_dev_count_avail();
                reconfig(port_id, res->socket);
-               rte_eth_promiscuous_enable(port_id);
+               ret = rte_eth_promiscuous_enable(port_id);
+               if (ret != 0)
+                       printf("Failed to enable promiscuous mode for port %u: %s - ignore\n",
+                               port_id, rte_strerror(-ret));
+
+               ports[port_id].need_setup = 0;
+               ports[port_id].port_status = RTE_PORT_STOPPED;
        }
 
 }
@@ -5961,7 +6160,7 @@ struct cmd_set_bond_mac_addr_result {
        cmdline_fixed_string_t bonding;
        cmdline_fixed_string_t mac_addr;
        uint16_t port_num;
-       struct ether_addr address;
+       struct rte_ether_addr address;
 };
 
 static void cmd_set_bond_mac_addr_parsed(void *parsed_result,
@@ -6339,18 +6538,10 @@ static void cmd_set_promisc_mode_parsed(void *parsed_result,
 
        /* all ports */
        if (allports) {
-               RTE_ETH_FOREACH_DEV(i) {
-                       if (enable)
-                               rte_eth_promiscuous_enable(i);
-                       else
-                               rte_eth_promiscuous_disable(i);
-               }
-       }
-       else {
-               if (enable)
-                       rte_eth_promiscuous_enable(res->port_num);
-               else
-                       rte_eth_promiscuous_disable(res->port_num);
+               RTE_ETH_FOREACH_DEV(i)
+                       eth_set_promisc_mode(i, enable);
+       } else {
+               eth_set_promisc_mode(res->port_num, enable);
        }
 }
 
@@ -6420,17 +6611,11 @@ static void cmd_set_allmulti_mode_parsed(void *parsed_result,
        /* all ports */
        if (allports) {
                RTE_ETH_FOREACH_DEV(i) {
-                       if (enable)
-                               rte_eth_allmulticast_enable(i);
-                       else
-                               rte_eth_allmulticast_disable(i);
+                       eth_set_allmulticast_mode(i, enable);
                }
        }
        else {
-               if (enable)
-                       rte_eth_allmulticast_enable(res->port_num);
-               else
-                       rte_eth_allmulticast_disable(res->port_num);
+               eth_set_allmulticast_mode(res->port_num, enable);
        }
 }
 
@@ -7274,6 +7459,51 @@ cmdline_parse_inst_t cmd_showport = {
        },
 };
 
+/* *** SHOW DEVICE INFO *** */
+struct cmd_showdevice_result {
+       cmdline_fixed_string_t show;
+       cmdline_fixed_string_t device;
+       cmdline_fixed_string_t what;
+       cmdline_fixed_string_t identifier;
+};
+
+static void cmd_showdevice_parsed(void *parsed_result,
+                               __attribute__((unused)) struct cmdline *cl,
+                               __attribute__((unused)) void *data)
+{
+       struct cmd_showdevice_result *res = parsed_result;
+       if (!strcmp(res->what, "info")) {
+               if (!strcmp(res->identifier, "all"))
+                       device_infos_display(NULL);
+               else
+                       device_infos_display(res->identifier);
+       }
+}
+
+cmdline_parse_token_string_t cmd_showdevice_show =
+       TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result, show,
+                                "show");
+cmdline_parse_token_string_t cmd_showdevice_device =
+       TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result, device, "device");
+cmdline_parse_token_string_t cmd_showdevice_what =
+       TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result, what,
+                                "info");
+cmdline_parse_token_string_t cmd_showdevice_identifier =
+       TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result,
+                       identifier, NULL);
+
+cmdline_parse_inst_t cmd_showdevice = {
+       .f = cmd_showdevice_parsed,
+       .data = NULL,
+       .help_str = "show device info <identifier>|all",
+       .tokens = {
+               (void *)&cmd_showdevice_show,
+               (void *)&cmd_showdevice_device,
+               (void *)&cmd_showdevice_what,
+               (void *)&cmd_showdevice_identifier,
+               NULL,
+       },
+};
 /* *** SHOW QUEUE INFO *** */
 struct cmd_showqueue_result {
        cmdline_fixed_string_t show;
@@ -7321,6 +7551,49 @@ cmdline_parse_inst_t cmd_showqueue = {
        },
 };
 
+/* show/clear fwd engine statistics */
+struct fwd_result {
+       cmdline_fixed_string_t action;
+       cmdline_fixed_string_t fwd;
+       cmdline_fixed_string_t stats;
+       cmdline_fixed_string_t all;
+};
+
+cmdline_parse_token_string_t cmd_fwd_action =
+       TOKEN_STRING_INITIALIZER(struct fwd_result, action, "show#clear");
+cmdline_parse_token_string_t cmd_fwd_fwd =
+       TOKEN_STRING_INITIALIZER(struct fwd_result, fwd, "fwd");
+cmdline_parse_token_string_t cmd_fwd_stats =
+       TOKEN_STRING_INITIALIZER(struct fwd_result, stats, "stats");
+cmdline_parse_token_string_t cmd_fwd_all =
+       TOKEN_STRING_INITIALIZER(struct fwd_result, all, "all");
+
+static void
+cmd_showfwdall_parsed(void *parsed_result,
+                     __rte_unused struct cmdline *cl,
+                     __rte_unused void *data)
+{
+       struct fwd_result *res = parsed_result;
+
+       if (!strcmp(res->action, "show"))
+               fwd_stats_display();
+       else
+               fwd_stats_reset();
+}
+
+static cmdline_parse_inst_t cmd_showfwdall = {
+       .f = cmd_showfwdall_parsed,
+       .data = NULL,
+       .help_str = "show|clear fwd stats all",
+       .tokens = {
+               (void *)&cmd_fwd_action,
+               (void *)&cmd_fwd_fwd,
+               (void *)&cmd_fwd_stats,
+               (void *)&cmd_fwd_all,
+               NULL,
+       },
+};
+
 /* *** READ PORT REGISTER *** */
 struct cmd_read_reg_result {
        cmdline_fixed_string_t read;
@@ -7691,7 +7964,7 @@ struct cmd_mac_addr_result {
        cmdline_fixed_string_t mac_addr_cmd;
        cmdline_fixed_string_t what;
        uint16_t port_num;
-       struct ether_addr address;
+       struct rte_ether_addr address;
 };
 
 static void cmd_mac_addr_parsed(void *parsed_result,
@@ -7890,7 +8163,7 @@ struct cmd_set_uc_hash_table {
        cmdline_fixed_string_t port;
        portid_t port_id;
        cmdline_fixed_string_t what;
-       struct ether_addr address;
+       struct rte_ether_addr address;
        cmdline_fixed_string_t mode;
 };
 
@@ -8014,7 +8287,7 @@ struct cmd_set_vf_macvlan_filter {
        portid_t port_id;
        cmdline_fixed_string_t vf;
        uint8_t vf_id;
-       struct ether_addr address;
+       struct rte_ether_addr address;
        cmdline_fixed_string_t filter_type;
        cmdline_fixed_string_t mode;
 };
@@ -8030,7 +8303,7 @@ cmd_set_vf_macvlan_parsed(void *parsed_result,
 
        memset(&filter, 0, sizeof(struct rte_eth_mac_filter));
 
-       rte_memcpy(&filter.mac_addr, &res->address, ETHER_ADDR_LEN);
+       rte_memcpy(&filter.mac_addr, &res->address, RTE_ETHER_ADDR_LEN);
 
        /* set VF MAC filter */
        filter.is_vf = 1;
@@ -8190,19 +8463,19 @@ cmd_set_vf_rxmode_parsed(void *parsed_result,
                       __attribute__((unused)) void *data)
 {
        int ret = -ENOTSUP;
-       uint16_t rx_mode = 0;
+       uint16_t vf_rxmode = 0;
        struct cmd_set_vf_rxmode *res = parsed_result;
 
        int is_on = (strcmp(res->on, "on") == 0) ? 1 : 0;
        if (!strcmp(res->what,"rxmode")) {
                if (!strcmp(res->mode, "AUPE"))
-                       rx_mode |= ETH_VMDQ_ACCEPT_UNTAG;
+                       vf_rxmode |= ETH_VMDQ_ACCEPT_UNTAG;
                else if (!strcmp(res->mode, "ROPE"))
-                       rx_mode |= ETH_VMDQ_ACCEPT_HASH_UC;
+                       vf_rxmode |= ETH_VMDQ_ACCEPT_HASH_UC;
                else if (!strcmp(res->mode, "BAM"))
-                       rx_mode |= ETH_VMDQ_ACCEPT_BROADCAST;
+                       vf_rxmode |= ETH_VMDQ_ACCEPT_BROADCAST;
                else if (!strncmp(res->mode, "MPE",3))
-                       rx_mode |= ETH_VMDQ_ACCEPT_MULTICAST;
+                       vf_rxmode |= ETH_VMDQ_ACCEPT_MULTICAST;
        }
 
        RTE_SET_USED(is_on);
@@ -8210,12 +8483,12 @@ cmd_set_vf_rxmode_parsed(void *parsed_result,
 #ifdef RTE_LIBRTE_IXGBE_PMD
        if (ret == -ENOTSUP)
                ret = rte_pmd_ixgbe_set_vf_rxmode(res->port_id, res->vf_id,
-                                                 rx_mode, (uint8_t)is_on);
+                                                 vf_rxmode, (uint8_t)is_on);
 #endif
 #ifdef RTE_LIBRTE_BNXT_PMD
        if (ret == -ENOTSUP)
                ret = rte_pmd_bnxt_set_vf_rxmode(res->port_id, res->vf_id,
-                                                rx_mode, (uint8_t)is_on);
+                                                vf_rxmode, (uint8_t)is_on);
 #endif
        if (ret < 0)
                printf("bad VF receive mode parameter, return code = %d \n",
@@ -8273,7 +8546,7 @@ struct cmd_vf_mac_addr_result {
        uint16_t port_num;
        cmdline_fixed_string_t vf;
        uint8_t vf_num;
-       struct ether_addr address;
+       struct rte_ether_addr address;
 };
 
 static void cmd_vf_mac_addr_parsed(void *parsed_result,
@@ -8586,8 +8859,8 @@ struct cmd_tunnel_filter_result {
        cmdline_fixed_string_t cmd;
        cmdline_fixed_string_t what;
        portid_t port_id;
-       struct ether_addr outer_mac;
-       struct ether_addr inner_mac;
+       struct rte_ether_addr outer_mac;
+       struct rte_ether_addr inner_mac;
        cmdline_ipaddr_t ip_value;
        uint16_t inner_vlan;
        cmdline_fixed_string_t tunnel_type;
@@ -8607,8 +8880,8 @@ cmd_tunnel_filter_parsed(void *parsed_result,
 
        memset(&tunnel_filter_conf, 0, sizeof(tunnel_filter_conf));
 
-       ether_addr_copy(&res->outer_mac, &tunnel_filter_conf.outer_mac);
-       ether_addr_copy(&res->inner_mac, &tunnel_filter_conf.inner_mac);
+       rte_ether_addr_copy(&res->outer_mac, &tunnel_filter_conf.outer_mac);
+       rte_ether_addr_copy(&res->inner_mac, &tunnel_filter_conf.inner_mac);
        tunnel_filter_conf.inner_vlan = res->inner_vlan;
 
        if (res->ip_value.family == AF_INET) {
@@ -8645,6 +8918,8 @@ cmd_tunnel_filter_parsed(void *parsed_result,
 
        if (!strcmp(res->tunnel_type, "vxlan"))
                tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_VXLAN;
+       else if (!strcmp(res->tunnel_type, "vxlan-gpe"))
+               tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_VXLAN_GPE;
        else if (!strcmp(res->tunnel_type, "nvgre"))
                tunnel_filter_conf.tunnel_type = RTE_TUNNEL_TYPE_NVGRE;
        else if (!strcmp(res->tunnel_type, "ipingre"))
@@ -8694,7 +8969,7 @@ cmdline_parse_token_ipaddr_t cmd_tunnel_filter_ip_value =
        ip_value);
 cmdline_parse_token_string_t cmd_tunnel_filter_tunnel_type =
        TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result,
-       tunnel_type, "vxlan#nvgre#ipingre");
+       tunnel_type, "vxlan#nvgre#ipingre#vxlan-gpe");
 
 cmdline_parse_token_string_t cmd_tunnel_filter_filter_type =
        TOKEN_STRING_INITIALIZER(struct cmd_tunnel_filter_result,
@@ -8818,6 +9093,8 @@ cmd_cfg_tunnel_udp_port_parsed(void *parsed_result,
                tunnel_udp.prot_type = RTE_TUNNEL_TYPE_VXLAN;
        } else if (!strcmp(res->tunnel_type, "geneve")) {
                tunnel_udp.prot_type = RTE_TUNNEL_TYPE_GENEVE;
+       } else if (!strcmp(res->tunnel_type, "vxlan-gpe")) {
+               tunnel_udp.prot_type = RTE_TUNNEL_TYPE_VXLAN_GPE;
        } else {
                printf("Invalid tunnel type\n");
                return;
@@ -8852,7 +9129,7 @@ cmdline_parse_token_string_t cmd_config_tunnel_udp_port_action =
                                 "add#rm");
 cmdline_parse_token_string_t cmd_config_tunnel_udp_port_tunnel_type =
        TOKEN_STRING_INITIALIZER(struct cmd_config_tunnel_udp_port, tunnel_type,
-                                "vxlan#geneve");
+                                "vxlan#geneve#vxlan-gpe");
 cmdline_parse_token_num_t cmd_config_tunnel_udp_port_value =
        TOKEN_NUM_INITIALIZER(struct cmd_config_tunnel_udp_port, udp_port,
                              UINT16);
@@ -8860,7 +9137,7 @@ cmdline_parse_token_num_t cmd_config_tunnel_udp_port_value =
 cmdline_parse_inst_t cmd_cfg_tunnel_udp_port = {
        .f = cmd_cfg_tunnel_udp_port_parsed,
        .data = NULL,
-       .help_str = "port config <port_id> udp_tunnel_port add|rm vxlan|geneve <udp_port>",
+       .help_str = "port config <port_id> udp_tunnel_port add|rm vxlan|geneve|vxlan-gpe <udp_port>",
        .tokens = {
                (void *)&cmd_config_tunnel_udp_port_port,
                (void *)&cmd_config_tunnel_udp_port_config,
@@ -9000,7 +9277,7 @@ cmd_set_mirror_mask_parsed(void *parsed_result,
                        return;
 
                for (i = 0; i < nb_item; i++) {
-                       if (vlan_list[i] > ETHER_MAX_VLAN_ID) {
+                       if (vlan_list[i] > RTE_ETHER_MAX_VLAN_ID) {
                                printf("Invalid vlan_id: must be < 4096\n");
                                return;
                        }
@@ -9870,7 +10147,7 @@ cmd_2tuple_filter_parsed(void *parsed_result,
                        " when protocol is TCP.\n");
                return;
        }
-       if (res->tcp_flags_value > TCP_FLAG_ALL) {
+       if (res->tcp_flags_value > RTE_NTUPLE_TCP_FLAGS_MASK) {
                printf("invalid TCP flags.\n");
                return;
        }
@@ -10028,7 +10305,7 @@ cmd_5tuple_filter_parsed(void *parsed_result,
                        " when protocol is TCP.\n");
                return;
        }
-       if (res->tcp_flags_value > TCP_FLAG_ALL) {
+       if (res->tcp_flags_value > RTE_NTUPLE_TCP_FLAGS_MASK) {
                printf("invalid TCP flags.\n");
                return;
        }
@@ -10373,7 +10650,7 @@ struct cmd_ethertype_filter_result {
        portid_t port_id;
        cmdline_fixed_string_t ops;
        cmdline_fixed_string_t mac;
-       struct ether_addr mac_addr;
+       struct rte_ether_addr mac_addr;
        cmdline_fixed_string_t ethertype;
        uint16_t ethertype_value;
        cmdline_fixed_string_t drop;
@@ -10433,7 +10710,7 @@ cmd_ethertype_filter_parsed(void *parsed_result,
        if (!strcmp(res->mac, "mac_addr")) {
                filter.flags |= RTE_ETHTYPE_FLAGS_MAC;
                rte_memcpy(&filter.mac_addr, &res->mac_addr,
-                       sizeof(struct ether_addr));
+                       sizeof(struct rte_ether_addr));
        }
        if (!strcmp(res->drop, "drop"))
                filter.flags |= RTE_ETHTYPE_FLAGS_DROP;
@@ -10512,7 +10789,7 @@ struct cmd_flow_director_result {
        cmdline_fixed_string_t fd_id;
        uint32_t  fd_id_value;
        cmdline_fixed_string_t mac;
-       struct ether_addr mac_addr;
+       struct rte_ether_addr mac_addr;
        cmdline_fixed_string_t tunnel;
        cmdline_fixed_string_t tunnel_type;
        cmdline_fixed_string_t tunnel_id;
@@ -10815,12 +11092,12 @@ cmd_flow_director_filter_parsed(void *parsed_result,
        if (fdir_conf.mode ==  RTE_FDIR_MODE_PERFECT_MAC_VLAN)
                rte_memcpy(&entry.input.flow.mac_vlan_flow.mac_addr,
                                 &res->mac_addr,
-                                sizeof(struct ether_addr));
+                                sizeof(struct rte_ether_addr));
 
        if (fdir_conf.mode ==  RTE_FDIR_MODE_PERFECT_TUNNEL) {
                rte_memcpy(&entry.input.flow.tunnel_flow.mac_addr,
                                 &res->mac_addr,
-                                sizeof(struct ether_addr));
+                                sizeof(struct rte_ether_addr));
                entry.input.flow.tunnel_flow.tunnel_type =
                        str2fdir_tunneltype(res->tunnel_type);
                entry.input.flow.tunnel_flow.tunnel_id =
@@ -10846,8 +11123,11 @@ cmd_flow_director_filter_parsed(void *parsed_result,
                else if (!strncmp(res->pf_vf, "vf", 2)) {
                        struct rte_eth_dev_info dev_info;
 
-                       memset(&dev_info, 0, sizeof(dev_info));
-                       rte_eth_dev_info_get(res->port_id, &dev_info);
+                       ret = eth_dev_info_get_print_err(res->port_id,
+                                               &dev_info);
+                       if (ret != 0)
+                               return;
+
                        errno = 0;
                        vf_id = strtoul(res->pf_vf + 2, &end, 10);
                        if (errno != 0 || *end != '\0' ||
@@ -11874,6 +12154,7 @@ flowtype_to_str(uint16_t ftype)
                {"vxlan", RTE_ETH_FLOW_VXLAN},
                {"geneve", RTE_ETH_FLOW_GENEVE},
                {"nvgre", RTE_ETH_FLOW_NVGRE},
+               {"vxlan-gpe", RTE_ETH_FLOW_VXLAN_GPE},
        };
 
        for (i = 0; i < RTE_DIM(ftype_table); i++) {
@@ -11920,6 +12201,9 @@ cmd_get_hash_global_config_parsed(void *parsed_result,
        case RTE_ETH_HASH_FUNCTION_SIMPLE_XOR:
                printf("Hash function is Simple XOR\n");
                break;
+       case RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ:
+               printf("Hash function is Symmetric Toeplitz\n");
+               break;
        default:
                printf("Unknown hash function\n");
                break;
@@ -11993,6 +12277,9 @@ cmd_set_hash_global_config_parsed(void *parsed_result,
        else if (!strcmp(res->hash_func, "simple_xor"))
                info.info.global_conf.hash_func =
                        RTE_ETH_HASH_FUNCTION_SIMPLE_XOR;
+       else if (!strcmp(res->hash_func, "symmetric_toeplitz"))
+               info.info.global_conf.hash_func =
+                       RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ;
        else if (!strcmp(res->hash_func, "default"))
                info.info.global_conf.hash_func =
                        RTE_ETH_HASH_FUNCTION_DEFAULT;
@@ -12011,7 +12298,7 @@ cmd_set_hash_global_config_parsed(void *parsed_result,
                                                        res->port_id);
        else
                printf("Global hash configurations have been set "
-                       "succcessfully by port %d\n", res->port_id);
+                       "successfully by port %d\n", res->port_id);
 }
 
 cmdline_parse_token_string_t cmd_set_hash_global_config_all =
@@ -12022,7 +12309,7 @@ cmdline_parse_token_num_t cmd_set_hash_global_config_port_id =
                port_id, UINT16);
 cmdline_parse_token_string_t cmd_set_hash_global_config_hash_func =
        TOKEN_STRING_INITIALIZER(struct cmd_set_hash_global_config_result,
-               hash_func, "toeplitz#simple_xor#default");
+               hash_func, "toeplitz#simple_xor#symmetric_toeplitz#default");
 cmdline_parse_token_string_t cmd_set_hash_global_config_flow_type =
        TOKEN_STRING_INITIALIZER(struct cmd_set_hash_global_config_result,
                flow_type,
@@ -12036,7 +12323,7 @@ cmdline_parse_inst_t cmd_set_hash_global_config = {
        .f = cmd_set_hash_global_config_parsed,
        .data = NULL,
        .help_str = "set_hash_global_config <port_id> "
-               "toeplitz|simple_xor|default "
+               "toeplitz|simple_xor|symmetric_toeplitz|default "
                "ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|"
                "ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|"
                "l2_payload enable|disable",
@@ -12252,7 +12539,7 @@ struct cmd_mcast_addr_result {
        cmdline_fixed_string_t mcast_addr_cmd;
        cmdline_fixed_string_t what;
        uint16_t port_num;
-       struct ether_addr mc_addr;
+       struct rte_ether_addr mc_addr;
 };
 
 static void cmd_mcast_addr_parsed(void *parsed_result,
@@ -12261,7 +12548,7 @@ static void cmd_mcast_addr_parsed(void *parsed_result,
 {
        struct cmd_mcast_addr_result *res = parsed_result;
 
-       if (!is_multicast_ether_addr(&res->mc_addr)) {
+       if (!rte_is_multicast_ether_addr(&res->mc_addr)) {
                printf("Invalid multicast addr %02X:%02X:%02X:%02X:%02X:%02X\n",
                       res->mc_addr.addr_bytes[0], res->mc_addr.addr_bytes[1],
                       res->mc_addr.addr_bytes[2], res->mc_addr.addr_bytes[3],
@@ -13671,7 +13958,7 @@ struct cmd_set_vf_mac_addr_result {
        cmdline_fixed_string_t addr;
        portid_t port_id;
        uint16_t vf_id;
-       struct ether_addr mac_addr;
+       struct rte_ether_addr mac_addr;
 
 };
 
@@ -13838,7 +14125,10 @@ cmd_set_macsec_offload_on_parsed(
                return;
        }
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
 #ifdef RTE_LIBRTE_IXGBE_PMD
                ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
@@ -13932,7 +14222,10 @@ cmd_set_macsec_offload_off_parsed(
                return;
        }
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
 #ifdef RTE_LIBRTE_IXGBE_PMD
                ret = rte_pmd_ixgbe_macsec_disable(port_id);
@@ -13976,7 +14269,7 @@ struct cmd_macsec_sc_result {
        cmdline_fixed_string_t sc;
        cmdline_fixed_string_t tx_rx;
        portid_t port_id;
-       struct ether_addr mac;
+       struct rte_ether_addr mac;
        uint16_t pi;
 };
 
@@ -14975,14 +15268,19 @@ struct cmd_set_vxlan_result {
        cmdline_ipaddr_t ip_src;
        cmdline_ipaddr_t ip_dst;
        uint16_t tci;
-       struct ether_addr eth_src;
-       struct ether_addr eth_dst;
+       uint8_t tos;
+       uint8_t ttl;
+       struct rte_ether_addr eth_src;
+       struct rte_ether_addr eth_dst;
 };
 
 cmdline_parse_token_string_t cmd_set_vxlan_set =
        TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, set, "set");
 cmdline_parse_token_string_t cmd_set_vxlan_vxlan =
        TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, vxlan, "vxlan");
+cmdline_parse_token_string_t cmd_set_vxlan_vxlan_tos_ttl =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, vxlan,
+                                "vxlan-tos-ttl");
 cmdline_parse_token_string_t cmd_set_vxlan_vxlan_with_vlan =
        TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, vxlan,
                                 "vxlan-with-vlan");
@@ -15007,6 +15305,16 @@ cmdline_parse_token_string_t cmd_set_vxlan_udp_dst =
                                 "udp-dst");
 cmdline_parse_token_num_t cmd_set_vxlan_udp_dst_value =
        TOKEN_NUM_INITIALIZER(struct cmd_set_vxlan_result, udp_dst, UINT16);
+cmdline_parse_token_string_t cmd_set_vxlan_ip_tos =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token,
+                                "ip-tos");
+cmdline_parse_token_num_t cmd_set_vxlan_ip_tos_value =
+       TOKEN_NUM_INITIALIZER(struct cmd_set_vxlan_result, tos, UINT8);
+cmdline_parse_token_string_t cmd_set_vxlan_ip_ttl =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token,
+                                "ip-ttl");
+cmdline_parse_token_num_t cmd_set_vxlan_ip_ttl_value =
+       TOKEN_NUM_INITIALIZER(struct cmd_set_vxlan_result, ttl, UINT8);
 cmdline_parse_token_string_t cmd_set_vxlan_ip_src =
        TOKEN_STRING_INITIALIZER(struct cmd_set_vxlan_result, pos_token,
                                 "ip-src");
@@ -15045,10 +15353,15 @@ static void cmd_set_vxlan_parsed(void *parsed_result,
                .vxlan_id = rte_cpu_to_be_32(res->vni) & RTE_BE32(0x00ffffff),
        };
 
+       vxlan_encap_conf.select_tos_ttl = 0;
        if (strcmp(res->vxlan, "vxlan") == 0)
                vxlan_encap_conf.select_vlan = 0;
        else if (strcmp(res->vxlan, "vxlan-with-vlan") == 0)
                vxlan_encap_conf.select_vlan = 1;
+       else if (strcmp(res->vxlan, "vxlan-tos-ttl") == 0) {
+               vxlan_encap_conf.select_vlan = 0;
+               vxlan_encap_conf.select_tos_ttl = 1;
+       }
        if (strcmp(res->ip_version, "ipv4") == 0)
                vxlan_encap_conf.select_ipv4 = 1;
        else if (strcmp(res->ip_version, "ipv6") == 0)
@@ -15058,6 +15371,8 @@ static void cmd_set_vxlan_parsed(void *parsed_result,
        rte_memcpy(vxlan_encap_conf.vni, &id.vni[1], 3);
        vxlan_encap_conf.udp_src = rte_cpu_to_be_16(res->udp_src);
        vxlan_encap_conf.udp_dst = rte_cpu_to_be_16(res->udp_dst);
+       vxlan_encap_conf.ip_tos = res->tos;
+       vxlan_encap_conf.ip_ttl = res->ttl;
        if (vxlan_encap_conf.select_ipv4) {
                IPV4_ADDR_TO_UINT(res->ip_src, vxlan_encap_conf.ipv4_src);
                IPV4_ADDR_TO_UINT(res->ip_dst, vxlan_encap_conf.ipv4_dst);
@@ -15068,9 +15383,9 @@ static void cmd_set_vxlan_parsed(void *parsed_result,
        if (vxlan_encap_conf.select_vlan)
                vxlan_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci);
        rte_memcpy(vxlan_encap_conf.eth_src, res->eth_src.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
        rte_memcpy(vxlan_encap_conf.eth_dst, res->eth_dst.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
 }
 
 cmdline_parse_inst_t cmd_set_vxlan = {
@@ -15102,6 +15417,40 @@ cmdline_parse_inst_t cmd_set_vxlan = {
        },
 };
 
+cmdline_parse_inst_t cmd_set_vxlan_tos_ttl = {
+       .f = cmd_set_vxlan_parsed,
+       .data = NULL,
+       .help_str = "set vxlan-tos-ttl ip-version ipv4|ipv6 vni <vni> udp-src"
+               " <udp-src> udp-dst <udp-dst> ip-tos <ip-tos> ip-ttl <ip-ttl>"
+               " ip-src <ip-src> ip-dst <ip-dst> eth-src <eth-src>"
+               " eth-dst <eth-dst>",
+       .tokens = {
+               (void *)&cmd_set_vxlan_set,
+               (void *)&cmd_set_vxlan_vxlan_tos_ttl,
+               (void *)&cmd_set_vxlan_ip_version,
+               (void *)&cmd_set_vxlan_ip_version_value,
+               (void *)&cmd_set_vxlan_vni,
+               (void *)&cmd_set_vxlan_vni_value,
+               (void *)&cmd_set_vxlan_udp_src,
+               (void *)&cmd_set_vxlan_udp_src_value,
+               (void *)&cmd_set_vxlan_udp_dst,
+               (void *)&cmd_set_vxlan_udp_dst_value,
+               (void *)&cmd_set_vxlan_ip_tos,
+               (void *)&cmd_set_vxlan_ip_tos_value,
+               (void *)&cmd_set_vxlan_ip_ttl,
+               (void *)&cmd_set_vxlan_ip_ttl_value,
+               (void *)&cmd_set_vxlan_ip_src,
+               (void *)&cmd_set_vxlan_ip_src_value,
+               (void *)&cmd_set_vxlan_ip_dst,
+               (void *)&cmd_set_vxlan_ip_dst_value,
+               (void *)&cmd_set_vxlan_eth_src,
+               (void *)&cmd_set_vxlan_eth_src_value,
+               (void *)&cmd_set_vxlan_eth_dst,
+               (void *)&cmd_set_vxlan_eth_dst_value,
+               NULL,
+       },
+};
+
 cmdline_parse_inst_t cmd_set_vxlan_with_vlan = {
        .f = cmd_set_vxlan_parsed,
        .data = NULL,
@@ -15144,8 +15493,8 @@ struct cmd_set_nvgre_result {
        cmdline_ipaddr_t ip_src;
        cmdline_ipaddr_t ip_dst;
        uint16_t tci;
-       struct ether_addr eth_src;
-       struct ether_addr eth_dst;
+       struct rte_ether_addr eth_src;
+       struct rte_ether_addr eth_dst;
 };
 
 cmdline_parse_token_string_t cmd_set_nvgre_set =
@@ -15225,9 +15574,9 @@ static void cmd_set_nvgre_parsed(void *parsed_result,
        if (nvgre_encap_conf.select_vlan)
                nvgre_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci);
        rte_memcpy(nvgre_encap_conf.eth_src, res->eth_src.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
        rte_memcpy(nvgre_encap_conf.eth_dst, res->eth_dst.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
 }
 
 cmdline_parse_inst_t cmd_set_nvgre = {
@@ -15290,8 +15639,8 @@ struct cmd_set_l2_encap_result {
        cmdline_fixed_string_t ip_version;
        uint32_t vlan_present:1;
        uint16_t tci;
-       struct ether_addr eth_src;
-       struct ether_addr eth_dst;
+       struct rte_ether_addr eth_src;
+       struct rte_ether_addr eth_dst;
 };
 
 cmdline_parse_token_string_t cmd_set_l2_encap_set =
@@ -15342,9 +15691,9 @@ static void cmd_set_l2_encap_parsed(void *parsed_result,
        if (l2_encap_conf.select_vlan)
                l2_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci);
        rte_memcpy(l2_encap_conf.eth_src, res->eth_src.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
        rte_memcpy(l2_encap_conf.eth_dst, res->eth_dst.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
 }
 
 cmdline_parse_inst_t cmd_set_l2_encap = {
@@ -15447,8 +15796,8 @@ struct cmd_set_mplsogre_encap_result {
        cmdline_ipaddr_t ip_src;
        cmdline_ipaddr_t ip_dst;
        uint16_t tci;
-       struct ether_addr eth_src;
-       struct ether_addr eth_dst;
+       struct rte_ether_addr eth_src;
+       struct rte_ether_addr eth_dst;
 };
 
 cmdline_parse_token_string_t cmd_set_mplsogre_encap_set =
@@ -15508,10 +15857,9 @@ static void cmd_set_mplsogre_encap_parsed(void *parsed_result,
        struct cmd_set_mplsogre_encap_result *res = parsed_result;
        union {
                uint32_t mplsogre_label;
-               uint8_t label[3];
+               uint8_t label[4];
        } id = {
-               .mplsogre_label =
-                       rte_cpu_to_be_32(res->label) & RTE_BE32(0x00ffffff),
+               .mplsogre_label = rte_cpu_to_be_32(res->label<<12),
        };
 
        if (strcmp(res->mplsogre, "mplsogre_encap") == 0)
@@ -15524,7 +15872,7 @@ static void cmd_set_mplsogre_encap_parsed(void *parsed_result,
                mplsogre_encap_conf.select_ipv4 = 0;
        else
                return;
-       rte_memcpy(mplsogre_encap_conf.label, &id.label[1], 3);
+       rte_memcpy(mplsogre_encap_conf.label, &id.label, 3);
        if (mplsogre_encap_conf.select_ipv4) {
                IPV4_ADDR_TO_UINT(res->ip_src, mplsogre_encap_conf.ipv4_src);
                IPV4_ADDR_TO_UINT(res->ip_dst, mplsogre_encap_conf.ipv4_dst);
@@ -15535,9 +15883,9 @@ static void cmd_set_mplsogre_encap_parsed(void *parsed_result,
        if (mplsogre_encap_conf.select_vlan)
                mplsogre_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci);
        rte_memcpy(mplsogre_encap_conf.eth_src, res->eth_src.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
        rte_memcpy(mplsogre_encap_conf.eth_dst, res->eth_dst.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
 }
 
 cmdline_parse_inst_t cmd_set_mplsogre_encap = {
@@ -15672,8 +16020,8 @@ struct cmd_set_mplsoudp_encap_result {
        cmdline_ipaddr_t ip_src;
        cmdline_ipaddr_t ip_dst;
        uint16_t tci;
-       struct ether_addr eth_src;
-       struct ether_addr eth_dst;
+       struct rte_ether_addr eth_src;
+       struct rte_ether_addr eth_dst;
 };
 
 cmdline_parse_token_string_t cmd_set_mplsoudp_encap_set =
@@ -15745,10 +16093,9 @@ static void cmd_set_mplsoudp_encap_parsed(void *parsed_result,
        struct cmd_set_mplsoudp_encap_result *res = parsed_result;
        union {
                uint32_t mplsoudp_label;
-               uint8_t label[3];
+               uint8_t label[4];
        } id = {
-               .mplsoudp_label =
-                       rte_cpu_to_be_32(res->label) & RTE_BE32(0x00ffffff),
+               .mplsoudp_label = rte_cpu_to_be_32(res->label<<12),
        };
 
        if (strcmp(res->mplsoudp, "mplsoudp_encap") == 0)
@@ -15761,7 +16108,7 @@ static void cmd_set_mplsoudp_encap_parsed(void *parsed_result,
                mplsoudp_encap_conf.select_ipv4 = 0;
        else
                return;
-       rte_memcpy(mplsoudp_encap_conf.label, &id.label[1], 3);
+       rte_memcpy(mplsoudp_encap_conf.label, &id.label, 3);
        mplsoudp_encap_conf.udp_src = rte_cpu_to_be_16(res->udp_src);
        mplsoudp_encap_conf.udp_dst = rte_cpu_to_be_16(res->udp_dst);
        if (mplsoudp_encap_conf.select_ipv4) {
@@ -15774,9 +16121,9 @@ static void cmd_set_mplsoudp_encap_parsed(void *parsed_result,
        if (mplsoudp_encap_conf.select_vlan)
                mplsoudp_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci);
        rte_memcpy(mplsoudp_encap_conf.eth_src, res->eth_src.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
        rte_memcpy(mplsoudp_encap_conf.eth_dst, res->eth_dst.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
 }
 
 cmdline_parse_inst_t cmd_set_mplsoudp_encap = {
@@ -17568,7 +17915,7 @@ print_rx_offloads(uint64_t offloads)
        begin = __builtin_ctzll(offloads);
        end = sizeof(offloads) * CHAR_BIT - __builtin_clzll(offloads);
 
-       single_offload = 1 << begin;
+       single_offload = 1ULL << begin;
        for (bit = begin; bit < end; bit++) {
                if (offloads & single_offload)
                        printf(" %s",
@@ -17588,8 +17935,12 @@ cmd_rx_offload_get_capa_parsed(
        portid_t port_id = res->port_id;
        uint64_t queue_offloads;
        uint64_t port_offloads;
+       int ret;
+
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
 
-       rte_eth_dev_info_get(port_id, &dev_info);
        queue_offloads = dev_info.rx_queue_offload_capa;
        port_offloads = dev_info.rx_offload_capa ^ queue_offloads;
 
@@ -17661,6 +18012,7 @@ cmd_rx_offload_get_configuration_parsed(
        uint64_t queue_offloads;
        uint16_t nb_rx_queues;
        int q;
+       int ret;
 
        printf("Rx Offloading Configuration of port %d :\n", port_id);
 
@@ -17669,7 +18021,10 @@ cmd_rx_offload_get_configuration_parsed(
        print_rx_offloads(port_offloads);
        printf("\n");
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        nb_rx_queues = dev_info.nb_rx_queues;
        for (q = 0; q < nb_rx_queues; q++) {
                queue_offloads = port->rx_conf[q].offloads;
@@ -17726,7 +18081,7 @@ cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_offload =
                 offload, "vlan_strip#ipv4_cksum#udp_cksum#tcp_cksum#tcp_lro#"
                           "qinq_strip#outer_ipv4_cksum#macsec_strip#"
                           "header_split#vlan_filter#vlan_extend#jumbo_frame#"
-                          "crc_strip#scatter#timestamp#security#keep_crc");
+                          "scatter#timestamp#security#keep_crc");
 cmdline_parse_token_string_t cmd_config_per_port_rx_offload_result_on_off =
        TOKEN_STRING_INITIALIZER
                (struct cmd_config_per_port_rx_offload_result,
@@ -17746,10 +18101,7 @@ search_rx_offload(const char *name)
                if (!strcasecmp(single_name, name)) {
                        found = 1;
                        break;
-               } else if (!strcasecmp(single_name, "UNKNOWN"))
-                       break;
-               else if (single_name == NULL)
-                       break;
+               }
                single_offload <<= 1;
        }
 
@@ -17771,6 +18123,7 @@ cmd_config_per_port_rx_offload_parsed(void *parsed_result,
        uint64_t single_offload;
        uint16_t nb_rx_queues;
        int q;
+       int ret;
 
        if (port->port_status != RTE_PORT_STOPPED) {
                printf("Error: Can't config offload when Port %d "
@@ -17784,7 +18137,10 @@ cmd_config_per_port_rx_offload_parsed(void *parsed_result,
                return;
        }
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        nb_rx_queues = dev_info.nb_rx_queues;
        if (!strcmp(res->on_off, "on")) {
                port->dev_conf.rxmode.offloads |= single_offload;
@@ -17805,7 +18161,7 @@ cmdline_parse_inst_t cmd_config_per_port_rx_offload = {
        .help_str = "port config <port_id> rx_offload vlan_strip|ipv4_cksum|"
                    "udp_cksum|tcp_cksum|tcp_lro|qinq_strip|outer_ipv4_cksum|"
                    "macsec_strip|header_split|vlan_filter|vlan_extend|"
-                   "jumbo_frame|crc_strip|scatter|timestamp|security|keep_crc "
+                   "jumbo_frame|scatter|timestamp|security|keep_crc "
                    "on|off",
        .tokens = {
                (void *)&cmd_config_per_port_rx_offload_result_port,
@@ -17855,7 +18211,7 @@ cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_offload =
                 offload, "vlan_strip#ipv4_cksum#udp_cksum#tcp_cksum#tcp_lro#"
                           "qinq_strip#outer_ipv4_cksum#macsec_strip#"
                           "header_split#vlan_filter#vlan_extend#jumbo_frame#"
-                          "crc_strip#scatter#timestamp#security#keep_crc");
+                          "scatter#timestamp#security#keep_crc");
 cmdline_parse_token_string_t cmd_config_per_queue_rx_offload_result_on_off =
        TOKEN_STRING_INITIALIZER
                (struct cmd_config_per_queue_rx_offload_result,
@@ -17872,6 +18228,7 @@ cmd_config_per_queue_rx_offload_parsed(void *parsed_result,
        uint16_t queue_id = res->queue_id;
        struct rte_port *port = &ports[port_id];
        uint64_t single_offload;
+       int ret;
 
        if (port->port_status != RTE_PORT_STOPPED) {
                printf("Error: Can't config offload when Port %d "
@@ -17879,7 +18236,10 @@ cmd_config_per_queue_rx_offload_parsed(void *parsed_result,
                return;
        }
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if (queue_id >= dev_info.nb_rx_queues) {
                printf("Error: input queue_id should be 0 ... "
                       "%d\n", dev_info.nb_rx_queues - 1);
@@ -17907,7 +18267,7 @@ cmdline_parse_inst_t cmd_config_per_queue_rx_offload = {
                    "vlan_strip|ipv4_cksum|"
                    "udp_cksum|tcp_cksum|tcp_lro|qinq_strip|outer_ipv4_cksum|"
                    "macsec_strip|header_split|vlan_filter|vlan_extend|"
-                   "jumbo_frame|crc_strip|scatter|timestamp|security|keep_crc "
+                   "jumbo_frame|scatter|timestamp|security|keep_crc "
                    "on|off",
        .tokens = {
                (void *)&cmd_config_per_queue_rx_offload_result_port,
@@ -17965,7 +18325,7 @@ print_tx_offloads(uint64_t offloads)
        begin = __builtin_ctzll(offloads);
        end = sizeof(offloads) * CHAR_BIT - __builtin_clzll(offloads);
 
-       single_offload = 1 << begin;
+       single_offload = 1ULL << begin;
        for (bit = begin; bit < end; bit++) {
                if (offloads & single_offload)
                        printf(" %s",
@@ -17985,8 +18345,12 @@ cmd_tx_offload_get_capa_parsed(
        portid_t port_id = res->port_id;
        uint64_t queue_offloads;
        uint64_t port_offloads;
+       int ret;
+
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
 
-       rte_eth_dev_info_get(port_id, &dev_info);
        queue_offloads = dev_info.tx_queue_offload_capa;
        port_offloads = dev_info.tx_offload_capa ^ queue_offloads;
 
@@ -18058,6 +18422,7 @@ cmd_tx_offload_get_configuration_parsed(
        uint64_t queue_offloads;
        uint16_t nb_tx_queues;
        int q;
+       int ret;
 
        printf("Tx Offloading Configuration of port %d :\n", port_id);
 
@@ -18066,7 +18431,10 @@ cmd_tx_offload_get_configuration_parsed(
        print_tx_offloads(port_offloads);
        printf("\n");
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        nb_tx_queues = dev_info.nb_tx_queues;
        for (q = 0; q < nb_tx_queues; q++) {
                queue_offloads = port->tx_conf[q].offloads;
@@ -18142,13 +18510,13 @@ search_tx_offload(const char *name)
        single_offload = 1;
        for (bit = 0; bit < sizeof(single_offload) * CHAR_BIT; bit++) {
                single_name = rte_eth_dev_tx_offload_name(single_offload);
+               if (single_name == NULL)
+                       break;
                if (!strcasecmp(single_name, name)) {
                        found = 1;
                        break;
                } else if (!strcasecmp(single_name, "UNKNOWN"))
                        break;
-               else if (single_name == NULL)
-                       break;
                single_offload <<= 1;
        }
 
@@ -18170,6 +18538,7 @@ cmd_config_per_port_tx_offload_parsed(void *parsed_result,
        uint64_t single_offload;
        uint16_t nb_tx_queues;
        int q;
+       int ret;
 
        if (port->port_status != RTE_PORT_STOPPED) {
                printf("Error: Can't config offload when Port %d "
@@ -18183,7 +18552,10 @@ cmd_config_per_port_tx_offload_parsed(void *parsed_result,
                return;
        }
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        nb_tx_queues = dev_info.nb_tx_queues;
        if (!strcmp(res->on_off, "on")) {
                port->dev_conf.txmode.offloads |= single_offload;
@@ -18274,6 +18646,7 @@ cmd_config_per_queue_tx_offload_parsed(void *parsed_result,
        uint16_t queue_id = res->queue_id;
        struct rte_port *port = &ports[port_id];
        uint64_t single_offload;
+       int ret;
 
        if (port->port_status != RTE_PORT_STOPPED) {
                printf("Error: Can't config offload when Port %d "
@@ -18281,7 +18654,10 @@ cmd_config_per_queue_tx_offload_parsed(void *parsed_result,
                return;
        }
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if (queue_id >= dev_info.nb_tx_queues) {
                printf("Error: input queue_id should be 0 ... "
                       "%d\n", dev_info.nb_tx_queues - 1);
@@ -18342,12 +18718,13 @@ cmd_config_tx_metadata_specific_parsed(void *parsed_result,
 
        if (port_id_is_invalid(res->port_id, ENABLED_WARN))
                return;
-       ports[res->port_id].tx_metadata = rte_cpu_to_be_32(res->value);
+       ports[res->port_id].tx_metadata = res->value;
        /* Add/remove callback to insert valid metadata in every Tx packet. */
        if (ports[res->port_id].tx_metadata)
                add_tx_md_callback(res->port_id);
        else
                remove_tx_md_callback(res->port_id);
+       rte_flow_dynf_metadata_register();
 }
 
 cmdline_parse_token_string_t cmd_config_tx_metadata_specific_port =
@@ -18401,7 +18778,7 @@ cmd_show_tx_metadata_parsed(void *parsed_result,
        }
        if (!strcmp(res->cmd_keyword, "tx_metadata")) {
                printf("Port %u tx_metadata: %u\n", res->cmd_pid,
-                               ports[res->cmd_pid].tx_metadata);
+                       rte_be_to_cpu_32(ports[res->cmd_pid].tx_metadata));
        }
 }
 
@@ -18431,6 +18808,114 @@ cmdline_parse_inst_t cmd_show_tx_metadata = {
        },
 };
 
+/* show port supported ptypes */
+
+/* Common result structure for show port ptypes */
+struct cmd_show_port_supported_ptypes_result {
+       cmdline_fixed_string_t show;
+       cmdline_fixed_string_t port;
+       portid_t port_id;
+       cmdline_fixed_string_t ptypes;
+};
+
+/* Common CLI fields for show port ptypes */
+cmdline_parse_token_string_t cmd_show_port_supported_ptypes_show =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_show_port_supported_ptypes_result,
+                show, "show");
+cmdline_parse_token_string_t cmd_show_port_supported_ptypes_port =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_show_port_supported_ptypes_result,
+                port, "port");
+cmdline_parse_token_num_t cmd_show_port_supported_ptypes_port_id =
+       TOKEN_NUM_INITIALIZER
+               (struct cmd_show_port_supported_ptypes_result,
+                port_id, UINT16);
+cmdline_parse_token_string_t cmd_show_port_supported_ptypes_ptypes =
+       TOKEN_STRING_INITIALIZER
+               (struct cmd_show_port_supported_ptypes_result,
+                ptypes, "ptypes");
+
+static void
+cmd_show_port_supported_ptypes_parsed(
+       void *parsed_result,
+       __attribute__((unused)) struct cmdline *cl,
+       __attribute__((unused)) void *data)
+{
+#define RSVD_PTYPE_MASK       0xf0000000
+#define MAX_PTYPES_PER_LAYER  16
+#define LTYPE_NAMESIZE        32
+#define PTYPE_NAMESIZE        256
+       struct cmd_show_port_supported_ptypes_result *res = parsed_result;
+       char buf[PTYPE_NAMESIZE], ltype[LTYPE_NAMESIZE];
+       uint32_t ptype_mask = RTE_PTYPE_L2_MASK;
+       uint32_t ptypes[MAX_PTYPES_PER_LAYER];
+       uint16_t port_id = res->port_id;
+       int ret, i;
+
+       ret = rte_eth_dev_get_supported_ptypes(port_id, ptype_mask, NULL, 0);
+       if (ret < 0)
+               return;
+
+       while (ptype_mask != RSVD_PTYPE_MASK) {
+
+               switch (ptype_mask) {
+               case RTE_PTYPE_L2_MASK:
+                       strlcpy(ltype, "L2", sizeof(ltype));
+                       break;
+               case RTE_PTYPE_L3_MASK:
+                       strlcpy(ltype, "L3", sizeof(ltype));
+                       break;
+               case RTE_PTYPE_L4_MASK:
+                       strlcpy(ltype, "L4", sizeof(ltype));
+                       break;
+               case RTE_PTYPE_TUNNEL_MASK:
+                       strlcpy(ltype, "Tunnel", sizeof(ltype));
+                       break;
+               case RTE_PTYPE_INNER_L2_MASK:
+                       strlcpy(ltype, "Inner L2", sizeof(ltype));
+                       break;
+               case RTE_PTYPE_INNER_L3_MASK:
+                       strlcpy(ltype, "Inner L3", sizeof(ltype));
+                       break;
+               case RTE_PTYPE_INNER_L4_MASK:
+                       strlcpy(ltype, "Inner L4", sizeof(ltype));
+                       break;
+               default:
+                       return;
+               }
+
+               ret = rte_eth_dev_get_supported_ptypes(res->port_id,
+                                                      ptype_mask, ptypes,
+                                                      MAX_PTYPES_PER_LAYER);
+
+               if (ret > 0)
+                       printf("Supported %s ptypes:\n", ltype);
+               else
+                       printf("%s ptypes unsupported\n", ltype);
+
+               for (i = 0; i < ret; ++i) {
+                       rte_get_ptype_name(ptypes[i], buf, sizeof(buf));
+                       printf("%s\n", buf);
+               }
+
+               ptype_mask <<= 4;
+       }
+}
+
+cmdline_parse_inst_t cmd_show_port_supported_ptypes = {
+       .f = cmd_show_port_supported_ptypes_parsed,
+       .data = NULL,
+       .help_str = "show port <port_id> ptypes",
+       .tokens = {
+               (void *)&cmd_show_port_supported_ptypes_show,
+               (void *)&cmd_show_port_supported_ptypes_port,
+               (void *)&cmd_show_port_supported_ptypes_port_id,
+               (void *)&cmd_show_port_supported_ptypes_ptypes,
+               NULL,
+       },
+};
+
 /* ******************************************************************************** */
 
 /* list of instructions */
@@ -18442,7 +18927,9 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_showport,
        (cmdline_parse_inst_t *)&cmd_showqueue,
        (cmdline_parse_inst_t *)&cmd_showportall,
+       (cmdline_parse_inst_t *)&cmd_showdevice,
        (cmdline_parse_inst_t *)&cmd_showcfg,
+       (cmdline_parse_inst_t *)&cmd_showfwdall,
        (cmdline_parse_inst_t *)&cmd_start,
        (cmdline_parse_inst_t *)&cmd_start_tx_first,
        (cmdline_parse_inst_t *)&cmd_start_tx_first_n,
@@ -18529,6 +19016,8 @@ cmdline_parse_ctx_t main_ctx[] = {
        (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_operate_detach_device,
+       (cmdline_parse_inst_t *)&cmd_set_port_setup_on,
        (cmdline_parse_inst_t *)&cmd_config_speed_all,
        (cmdline_parse_inst_t *)&cmd_config_speed_specific,
        (cmdline_parse_inst_t *)&cmd_config_loopback_all,
@@ -18641,6 +19130,7 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_set_port_tm_hierarchy_default,
 #endif
        (cmdline_parse_inst_t *)&cmd_set_vxlan,
+       (cmdline_parse_inst_t *)&cmd_set_vxlan_tos_ttl,
        (cmdline_parse_inst_t *)&cmd_set_vxlan_with_vlan,
        (cmdline_parse_inst_t *)&cmd_set_nvgre,
        (cmdline_parse_inst_t *)&cmd_set_nvgre_with_vlan,
@@ -18664,6 +19154,7 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_clear_input_set,
        (cmdline_parse_inst_t *)&cmd_show_vf_stats,
        (cmdline_parse_inst_t *)&cmd_clear_vf_stats,
+       (cmdline_parse_inst_t *)&cmd_show_port_supported_ptypes,
        (cmdline_parse_inst_t *)&cmd_ptype_mapping_get,
        (cmdline_parse_inst_t *)&cmd_ptype_mapping_replace,
        (cmdline_parse_inst_t *)&cmd_ptype_mapping_reset,
@@ -18714,6 +19205,9 @@ cmdline_parse_ctx_t main_ctx[] = {
 #endif
        (cmdline_parse_inst_t *)&cmd_config_tx_metadata_specific,
        (cmdline_parse_inst_t *)&cmd_show_tx_metadata,
+       (cmdline_parse_inst_t *)&cmd_set_raw,
+       (cmdline_parse_inst_t *)&cmd_show_set_raw,
+       (cmdline_parse_inst_t *)&cmd_show_set_raw_all,
        NULL,
 };