New upstream version 17.08
[deb_dpdk.git] / app / test-pmd / cmdline.c
index 0afac68..cd8c358 100644 (file)
@@ -36,7 +36,6 @@
 #include <errno.h>
 #include <stdio.h>
 #include <stdint.h>
-#include <stdarg.h>
 #include <string.h>
 #include <termios.h>
 #include <unistd.h>
@@ -76,6 +75,7 @@
 #include <rte_devargs.h>
 #include <rte_eth_ctrl.h>
 #include <rte_flow.h>
+#include <rte_gro.h>
 
 #include <cmdline_rdline.h>
 #include <cmdline_parse.h>
@@ -87,6 +87,7 @@
 #include <cmdline.h>
 #ifdef RTE_LIBRTE_PMD_BOND
 #include <rte_eth_bond.h>
+#include <rte_eth_bond_8023ad.h>
 #endif
 #ifdef RTE_LIBRTE_IXGBE_PMD
 #include <rte_pmd_ixgbe.h>
@@ -94,6 +95,9 @@
 #ifdef RTE_LIBRTE_I40E_PMD
 #include <rte_pmd_i40e.h>
 #endif
+#ifdef RTE_LIBRTE_BNXT_PMD
+#include <rte_pmd_bnxt.h>
+#endif
 #include "testpmd.h"
 
 static struct cmdline *testpmd_cl;
@@ -218,6 +222,9 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "ddp get list (port_id)\n"
                        "    Get ddp profile info list\n\n"
 
+                       "ddp get info (profile_path)\n"
+                       "    Get ddp profile information.\n\n"
+
                        "show vf stats (port_id) (vf_id)\n"
                        "    Display a VF's statistics.\n\n"
 
@@ -278,18 +285,15 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "set tx loopback (port_id) (on|off)\n"
                        "    Enable or disable tx loopback.\n\n"
 
-#ifdef RTE_LIBRTE_IXGBE_PMD
                        "set all queues drop (port_id) (on|off)\n"
                        "    Set drop enable bit for all queues.\n\n"
 
                        "set vf split drop (port_id) (vf_id) (on|off)\n"
                        "    Set split drop enable bit for a VF from the PF.\n\n"
-#endif
 
                        "set vf mac antispoof (port_id) (vf_id) (on|off).\n"
                        "    Set MAC antispoof for a VF from the PF.\n\n"
 
-#ifdef RTE_LIBRTE_IXGBE_PMD
                        "set macsec offload (port_id) on encrypt (on|off) replay-protect (on|off)\n"
                        "    Enable MACsec offload.\n\n"
 
@@ -301,7 +305,6 @@ static void cmd_help_long_parsed(void *parsed_result,
 
                        "set macsec sa (tx|rx) (port_id) (idx) (an) (pn) (key)\n"
                        "    Configure MACsec secure association (SA).\n\n"
-#endif
 
                        "set vf broadcast (port_id) (vf_id) (on|off)\n"
                        "    Set VF broadcast for a VF from the PF.\n\n"
@@ -420,6 +423,14 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "tso show (portid)"
                        "    Display the status of TCP Segmentation Offload.\n\n"
 
+                       "gro (on|off) (port_id)"
+                       "    Enable or disable Generic Receive Offload in"
+                       " csum forwarding engine.\n\n"
+
+                       "gro set (max_flow_num) (max_item_num_per_flow) (port_id)\n"
+                       "    Set max flow number and max packet number per-flow"
+                       " for GRO.\n\n"
+
                        "set fwd (%s)\n"
                        "    Set packet forwarding mode.\n\n"
 
@@ -523,7 +534,6 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "   Flush (default) or don't flush RX streams before"
                        " forwarding. Mainly used with PCAP drivers.\n\n"
 
-                       #ifdef RTE_NIC_BYPASS
                        "set bypass mode (normal|bypass|isolate) (port_id)\n"
                        "   Set the bypass mode for the lowest port on bypass enabled"
                        " NIC.\n\n"
@@ -546,7 +556,7 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "show bypass config (port_id)\n"
                        "   Show the bypass configuration for a bypass enabled NIC"
                        " using the lowest port on the NIC.\n\n"
-#endif
+
 #ifdef RTE_LIBRTE_PMD_BOND
                        "create bonded device (mode) (socket)\n"
                        "       Create a new bonded device with specific bonding mode and socket.\n\n"
@@ -569,11 +579,18 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "set bonding mac_addr (port_id) (address)\n"
                        "       Set the MAC address of a bonded device.\n\n"
 
+                       "set bonding mode IEEE802.3AD aggregator policy (port_id) (agg_name)"
+                       "       Set Aggregation mode for IEEE802.3AD (mode 4)"
+
                        "set bonding xmit_balance_policy (port_id) (l2|l23|l34)\n"
                        "       Set the transmit balance policy for bonded device running in balance mode.\n\n"
 
                        "set bonding mon_period (port_id) (value)\n"
                        "       Set the bonding link status monitoring polling period in ms.\n\n"
+
+                       "set bonding lacp dedicated_queues <port_id> (enable|disable)\n"
+                       "       Enable/disable dedicated queues for LACP control traffic.\n\n"
+
 #endif
                        "set link-up port (port_id)\n"
                        "       Set link up for a port.\n\n"
@@ -602,9 +619,12 @@ 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"
 
-                       "ddp add (port_id) (profile_path)\n"
+                       "ddp add (port_id) (profile_path[,output_path])\n"
                        "    Load a profile package on a port\n\n"
 
+                       "ddp del (port_id) (profile_path)\n"
+                       "    Delete a profile package from a port\n\n"
+
                        "ptype mapping get (port_id) (valid_only)\n"
                        "    Get ptype mapping on a port\n\n"
 
@@ -904,6 +924,10 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "flow list {port_id} [group {group_id}] [...]\n"
                        "    List existing flow rules sorted by priority,"
                        " filtered by group identifiers.\n\n"
+
+                       "flow isolate {port_id} {boolean}\n"
+                       "    Restrict ingress traffic to the defined"
+                       " flow rules\n\n"
                );
        }
 }
@@ -3825,6 +3849,120 @@ cmdline_parse_inst_t cmd_tunnel_tso_show = {
        },
 };
 
+/* *** SET GRO FOR A PORT *** */
+struct cmd_gro_result {
+       cmdline_fixed_string_t cmd_keyword;
+       cmdline_fixed_string_t mode;
+       uint8_t port_id;
+};
+
+static void
+cmd_enable_gro_parsed(void *parsed_result,
+               __attribute__((unused)) struct cmdline *cl,
+               __attribute__((unused)) void *data)
+{
+       struct cmd_gro_result *res;
+
+       res = parsed_result;
+       setup_gro(res->mode, res->port_id);
+}
+
+cmdline_parse_token_string_t cmd_gro_keyword =
+       TOKEN_STRING_INITIALIZER(struct cmd_gro_result,
+                       cmd_keyword, "gro");
+cmdline_parse_token_string_t cmd_gro_mode =
+       TOKEN_STRING_INITIALIZER(struct cmd_gro_result,
+                       mode, "on#off");
+cmdline_parse_token_num_t cmd_gro_pid =
+       TOKEN_NUM_INITIALIZER(struct cmd_gro_result,
+                       port_id, UINT8);
+
+cmdline_parse_inst_t cmd_enable_gro = {
+       .f = cmd_enable_gro_parsed,
+       .data = NULL,
+       .help_str = "gro (on|off) (port_id)",
+       .tokens = {
+               (void *)&cmd_gro_keyword,
+               (void *)&cmd_gro_mode,
+               (void *)&cmd_gro_pid,
+               NULL,
+       },
+};
+
+/* *** SET MAX FLOW NUMBER AND ITEM NUM PER FLOW FOR GRO *** */
+struct cmd_gro_set_result {
+       cmdline_fixed_string_t gro;
+       cmdline_fixed_string_t mode;
+       uint16_t flow_num;
+       uint16_t item_num_per_flow;
+       uint8_t port_id;
+};
+
+static void
+cmd_gro_set_parsed(void *parsed_result,
+                      __attribute__((unused)) struct cmdline *cl,
+                      __attribute__((unused)) void *data)
+{
+       struct cmd_gro_set_result *res = parsed_result;
+
+       if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+               return;
+       if (test_done == 0) {
+               printf("Before set GRO flow_num and item_num_per_flow,"
+                               " please stop forwarding first\n");
+               return;
+       }
+
+       if (!strcmp(res->mode, "set")) {
+               if (res->flow_num == 0)
+                       printf("Invalid flow number. Revert to default value:"
+                                       " %u.\n", GRO_DEFAULT_FLOW_NUM);
+               else
+                       gro_ports[res->port_id].param.max_flow_num =
+                               res->flow_num;
+
+               if (res->item_num_per_flow == 0)
+                       printf("Invalid item number per-flow. Revert"
+                                       " to default value:%u.\n",
+                                       GRO_DEFAULT_ITEM_NUM_PER_FLOW);
+               else
+                       gro_ports[res->port_id].param.max_item_per_flow =
+                               res->item_num_per_flow;
+       }
+}
+
+cmdline_parse_token_string_t cmd_gro_set_gro =
+       TOKEN_STRING_INITIALIZER(struct cmd_gro_set_result,
+                               gro, "gro");
+cmdline_parse_token_string_t cmd_gro_set_mode =
+       TOKEN_STRING_INITIALIZER(struct cmd_gro_set_result,
+                               mode, "set");
+cmdline_parse_token_num_t cmd_gro_set_flow_num =
+       TOKEN_NUM_INITIALIZER(struct cmd_gro_set_result,
+                               flow_num, UINT16);
+cmdline_parse_token_num_t cmd_gro_set_item_num_per_flow =
+       TOKEN_NUM_INITIALIZER(struct cmd_gro_set_result,
+                               item_num_per_flow, UINT16);
+cmdline_parse_token_num_t cmd_gro_set_portid =
+       TOKEN_NUM_INITIALIZER(struct cmd_gro_set_result,
+                               port_id, UINT8);
+
+cmdline_parse_inst_t cmd_gro_set = {
+       .f = cmd_gro_set_parsed,
+       .data = NULL,
+       .help_str = "gro set <max_flow_num> <max_item_num_per_flow> "
+               "<port_id>: set max flow number and max packet number per-flow "
+               "for GRO",
+       .tokens = {
+               (void *)&cmd_gro_set_gro,
+               (void *)&cmd_gro_set_mode,
+               (void *)&cmd_gro_set_flow_num,
+               (void *)&cmd_gro_set_item_num_per_flow,
+               (void *)&cmd_gro_set_portid,
+               NULL,
+       },
+};
+
 /* *** ENABLE/DISABLE FLUSH ON RX STREAMS *** */
 struct cmd_set_flush_rx {
        cmdline_fixed_string_t set;
@@ -3904,7 +4042,6 @@ cmdline_parse_inst_t cmd_set_link_check = {
        },
 };
 
-#ifdef RTE_NIC_BYPASS
 /* *** SET NIC BYPASS MODE *** */
 struct cmd_set_bypass_mode_result {
        cmdline_fixed_string_t set;
@@ -3921,19 +4058,23 @@ cmd_set_bypass_mode_parsed(void *parsed_result,
 {
        struct cmd_set_bypass_mode_result *res = parsed_result;
        portid_t port_id = res->port_id;
-       uint32_t bypass_mode = RTE_BYPASS_MODE_NORMAL;
+       int32_t rc = -EINVAL;
+
+#if defined RTE_LIBRTE_IXGBE_PMD && defined RTE_LIBRTE_IXGBE_BYPASS
+       uint32_t bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NORMAL;
 
        if (!strcmp(res->value, "bypass"))
-               bypass_mode = RTE_BYPASS_MODE_BYPASS;
+               bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_BYPASS;
        else if (!strcmp(res->value, "isolate"))
-               bypass_mode = RTE_BYPASS_MODE_ISOLATE;
+               bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_ISOLATE;
        else
-               bypass_mode = RTE_BYPASS_MODE_NORMAL;
+               bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NORMAL;
 
        /* Set the bypass mode for the relevant port. */
-       if (0 != rte_eth_dev_bypass_state_set(port_id, &bypass_mode)) {
+       rc = rte_pmd_ixgbe_bypass_state_set(port_id, &bypass_mode);
+#endif
+       if (rc != 0)
                printf("\t Failed to set bypass mode for port = %d.\n", port_id);
-       }
 }
 
 cmdline_parse_token_string_t cmd_setbypass_mode_set =
@@ -3983,51 +4124,57 @@ cmd_set_bypass_event_parsed(void *parsed_result,
                __attribute__((unused)) struct cmdline *cl,
                __attribute__((unused)) void *data)
 {
-       int32_t rc;
+       int32_t rc = -EINVAL;
        struct cmd_set_bypass_event_result *res = parsed_result;
        portid_t port_id = res->port_id;
-       uint32_t bypass_event = RTE_BYPASS_EVENT_NONE;
-       uint32_t bypass_mode = RTE_BYPASS_MODE_NORMAL;
+
+#if defined RTE_LIBRTE_IXGBE_PMD && defined RTE_LIBRTE_IXGBE_BYPASS
+       uint32_t bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_NONE;
+       uint32_t bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NORMAL;
 
        if (!strcmp(res->event_value, "timeout"))
-               bypass_event = RTE_BYPASS_EVENT_TIMEOUT;
+               bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_TIMEOUT;
        else if (!strcmp(res->event_value, "os_on"))
-               bypass_event = RTE_BYPASS_EVENT_OS_ON;
+               bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_OS_ON;
        else if (!strcmp(res->event_value, "os_off"))
-               bypass_event = RTE_BYPASS_EVENT_OS_OFF;
+               bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_OS_OFF;
        else if (!strcmp(res->event_value, "power_on"))
-               bypass_event = RTE_BYPASS_EVENT_POWER_ON;
+               bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_POWER_ON;
        else if (!strcmp(res->event_value, "power_off"))
-               bypass_event = RTE_BYPASS_EVENT_POWER_OFF;
+               bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_POWER_OFF;
        else
-               bypass_event = RTE_BYPASS_EVENT_NONE;
+               bypass_event = RTE_PMD_IXGBE_BYPASS_EVENT_NONE;
 
        if (!strcmp(res->mode_value, "bypass"))
-               bypass_mode = RTE_BYPASS_MODE_BYPASS;
+               bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_BYPASS;
        else if (!strcmp(res->mode_value, "isolate"))
-               bypass_mode = RTE_BYPASS_MODE_ISOLATE;
+               bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_ISOLATE;
        else
-               bypass_mode = RTE_BYPASS_MODE_NORMAL;
+               bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NORMAL;
 
        /* Set the watchdog timeout. */
-       if (bypass_event == RTE_BYPASS_EVENT_TIMEOUT) {
+       if (bypass_event == RTE_PMD_IXGBE_BYPASS_EVENT_TIMEOUT) {
 
                rc = -EINVAL;
-               if (!RTE_BYPASS_TMT_VALID(bypass_timeout) ||
-                               (rc = rte_eth_dev_wd_timeout_store(port_id,
-                               bypass_timeout)) != 0) {
+               if (RTE_PMD_IXGBE_BYPASS_TMT_VALID(bypass_timeout)) {
+                       rc = rte_pmd_ixgbe_bypass_wd_timeout_store(port_id,
+                                                          bypass_timeout);
+               }
+               if (rc != 0) {
                        printf("Failed to set timeout value %u "
-                               "for port %d, errto code: %d.\n",
-                               bypass_timeout, port_id, rc);
+                       "for port %d, errto code: %d.\n",
+                       bypass_timeout, port_id, rc);
                }
        }
 
        /* Set the bypass event to transition to bypass mode. */
-       if (0 != rte_eth_dev_bypass_event_store(port_id,
-                       bypass_event, bypass_mode)) {
-               printf("\t Failed to set bypass event for port = %d.\n", port_id);
-       }
+       rc = rte_pmd_ixgbe_bypass_event_store(port_id, bypass_event,
+                                             bypass_mode);
+#endif
 
+       if (rc != 0)
+               printf("\t Failed to set bypass event for port = %d.\n",
+                      port_id);
 }
 
 cmdline_parse_token_string_t cmd_setbypass_event_set =
@@ -4084,24 +4231,26 @@ cmd_set_bypass_timeout_parsed(void *parsed_result,
                __attribute__((unused)) struct cmdline *cl,
                __attribute__((unused)) void *data)
 {
-       struct cmd_set_bypass_timeout_result *res = parsed_result;
+       __rte_unused struct cmd_set_bypass_timeout_result *res = parsed_result;
 
+#if defined RTE_LIBRTE_IXGBE_PMD && defined RTE_LIBRTE_IXGBE_BYPASS
        if (!strcmp(res->value, "1.5"))
-               bypass_timeout = RTE_BYPASS_TMT_1_5_SEC;
+               bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_1_5_SEC;
        else if (!strcmp(res->value, "2"))
-               bypass_timeout = RTE_BYPASS_TMT_2_SEC;
+               bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_2_SEC;
        else if (!strcmp(res->value, "3"))
-               bypass_timeout = RTE_BYPASS_TMT_3_SEC;
+               bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_3_SEC;
        else if (!strcmp(res->value, "4"))
-               bypass_timeout = RTE_BYPASS_TMT_4_SEC;
+               bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_4_SEC;
        else if (!strcmp(res->value, "8"))
-               bypass_timeout = RTE_BYPASS_TMT_8_SEC;
+               bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_8_SEC;
        else if (!strcmp(res->value, "16"))
-               bypass_timeout = RTE_BYPASS_TMT_16_SEC;
+               bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_16_SEC;
        else if (!strcmp(res->value, "32"))
-               bypass_timeout = RTE_BYPASS_TMT_32_SEC;
+               bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_32_SEC;
        else
-               bypass_timeout = RTE_BYPASS_TMT_OFF;
+               bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_OFF;
+#endif
 }
 
 cmdline_parse_token_string_t cmd_setbypass_timeout_set =
@@ -4145,17 +4294,19 @@ cmd_show_bypass_config_parsed(void *parsed_result,
                __attribute__((unused)) void *data)
 {
        struct cmd_show_bypass_config_result *res = parsed_result;
+       portid_t port_id = res->port_id;
+       int rc = -EINVAL;
+#if defined RTE_LIBRTE_IXGBE_PMD && defined RTE_LIBRTE_IXGBE_BYPASS
        uint32_t event_mode;
        uint32_t bypass_mode;
-       portid_t port_id = res->port_id;
        uint32_t timeout = bypass_timeout;
        int i;
 
-       static const char * const timeouts[RTE_BYPASS_TMT_NUM] =
+       static const char * const timeouts[RTE_PMD_IXGBE_BYPASS_TMT_NUM] =
                {"off", "1.5", "2", "3", "4", "8", "16", "32"};
-       static const char * const modes[RTE_BYPASS_MODE_NUM] =
+       static const char * const modes[RTE_PMD_IXGBE_BYPASS_MODE_NUM] =
                {"UNKNOWN", "normal", "bypass", "isolate"};
-       static const char * const events[RTE_BYPASS_EVENT_NUM] = {
+       static const char * const events[RTE_PMD_IXGBE_BYPASS_EVENT_NUM] = {
                "NONE",
                "OS/board on",
                "power supply on",
@@ -4165,37 +4316,41 @@ cmd_show_bypass_config_parsed(void *parsed_result,
        int num_events = (sizeof events) / (sizeof events[0]);
 
        /* Display the bypass mode.*/
-       if (0 != rte_eth_dev_bypass_state_show(port_id, &bypass_mode)) {
+       if (rte_pmd_ixgbe_bypass_state_show(port_id, &bypass_mode) != 0) {
                printf("\tFailed to get bypass mode for port = %d\n", port_id);
                return;
        }
        else {
-               if (!RTE_BYPASS_MODE_VALID(bypass_mode))
-                       bypass_mode = RTE_BYPASS_MODE_NONE;
+               if (!RTE_PMD_IXGBE_BYPASS_MODE_VALID(bypass_mode))
+                       bypass_mode = RTE_PMD_IXGBE_BYPASS_MODE_NONE;
 
                printf("\tbypass mode    = %s\n",  modes[bypass_mode]);
        }
 
        /* Display the bypass timeout.*/
-       if (!RTE_BYPASS_TMT_VALID(timeout))
-               timeout = RTE_BYPASS_TMT_OFF;
+       if (!RTE_PMD_IXGBE_BYPASS_TMT_VALID(timeout))
+               timeout = RTE_PMD_IXGBE_BYPASS_TMT_OFF;
 
        printf("\tbypass timeout = %s\n", timeouts[timeout]);
 
        /* Display the bypass events and associated modes. */
-       for (i = RTE_BYPASS_EVENT_START; i < num_events; i++) {
+       for (i = RTE_PMD_IXGBE_BYPASS_EVENT_START; i < num_events; i++) {
 
-               if (0 != rte_eth_dev_bypass_event_show(port_id, i, &event_mode)) {
+               if (rte_pmd_ixgbe_bypass_event_show(port_id, i, &event_mode)) {
                        printf("\tFailed to get bypass mode for event = %s\n",
                                events[i]);
                } else {
-                       if (!RTE_BYPASS_MODE_VALID(event_mode))
-                               event_mode = RTE_BYPASS_MODE_NONE;
+                       if (!RTE_PMD_IXGBE_BYPASS_MODE_VALID(event_mode))
+                               event_mode = RTE_PMD_IXGBE_BYPASS_MODE_NONE;
 
                        printf("\tbypass event: %-16s = %s\n", events[i],
                                modes[event_mode]);
                }
        }
+#endif
+       if (rc != 0)
+               printf("\tFailed to get bypass configuration for port = %d\n",
+                      port_id);
 }
 
 cmdline_parse_token_string_t cmd_showbypass_config_show =
@@ -4224,7 +4379,6 @@ cmdline_parse_inst_t cmd_show_bypass_config = {
                NULL,
        },
 };
-#endif
 
 #ifdef RTE_LIBRTE_PMD_BOND
 /* *** SET BONDING MODE *** */
@@ -4279,6 +4433,85 @@ cmdline_parse_inst_t cmd_set_bonding_mode = {
                }
 };
 
+/* *** SET BONDING SLOW_QUEUE SW/HW *** */
+struct cmd_set_bonding_lacp_dedicated_queues_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t bonding;
+       cmdline_fixed_string_t lacp;
+       cmdline_fixed_string_t dedicated_queues;
+       uint8_t port_id;
+       cmdline_fixed_string_t mode;
+};
+
+static void cmd_set_bonding_lacp_dedicated_queues_parsed(void *parsed_result,
+               __attribute__((unused))  struct cmdline *cl,
+               __attribute__((unused)) void *data)
+{
+       struct cmd_set_bonding_lacp_dedicated_queues_result *res = parsed_result;
+       portid_t port_id = res->port_id;
+       struct rte_port *port;
+
+       port = &ports[port_id];
+
+       /** Check if the port is not started **/
+       if (port->port_status != RTE_PORT_STOPPED) {
+               printf("Please stop port %d first\n", port_id);
+               return;
+       }
+
+       if (!strcmp(res->mode, "enable")) {
+               if (rte_eth_bond_8023ad_dedicated_queues_enable(port_id) == 0)
+                       printf("Dedicate queues for LACP control packets"
+                                       " enabled\n");
+               else
+                       printf("Enabling dedicate queues for LACP control "
+                                       "packets on port %d failed\n", port_id);
+       } else if (!strcmp(res->mode, "disable")) {
+               if (rte_eth_bond_8023ad_dedicated_queues_disable(port_id) == 0)
+                       printf("Dedicated queues for LACP control packets "
+                                       "disabled\n");
+               else
+                       printf("Disabling dedicated queues for LACP control "
+                                       "traffic on port %d failed\n", port_id);
+       }
+}
+
+cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_set =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
+               set, "set");
+cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_bonding =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
+               bonding, "bonding");
+cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_lacp =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
+               lacp, "lacp");
+cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_dedicated_queues =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
+               dedicated_queues, "dedicated_queues");
+cmdline_parse_token_num_t cmd_setbonding_lacp_dedicated_queues_port_id =
+TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
+               port_id, UINT8);
+cmdline_parse_token_string_t cmd_setbonding_lacp_dedicated_queues_mode =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_lacp_dedicated_queues_result,
+               mode, "enable#disable");
+
+cmdline_parse_inst_t cmd_set_lacp_dedicated_queues = {
+               .f = cmd_set_bonding_lacp_dedicated_queues_parsed,
+               .help_str = "set bonding lacp dedicated_queues <port_id> "
+                       "enable|disable: "
+                       "Enable/disable dedicated queues for LACP control traffic for port_id",
+               .data = NULL,
+               .tokens = {
+                       (void *)&cmd_setbonding_lacp_dedicated_queues_set,
+                       (void *)&cmd_setbonding_lacp_dedicated_queues_bonding,
+                       (void *)&cmd_setbonding_lacp_dedicated_queues_lacp,
+                       (void *)&cmd_setbonding_lacp_dedicated_queues_dedicated_queues,
+                       (void *)&cmd_setbonding_lacp_dedicated_queues_port_id,
+                       (void *)&cmd_setbonding_lacp_dedicated_queues_mode,
+                       NULL
+               }
+};
+
 /* *** SET BALANCE XMIT POLICY *** */
 struct cmd_set_bonding_balance_xmit_policy_result {
        cmdline_fixed_string_t set;
@@ -4359,7 +4592,7 @@ static void cmd_show_bonding_config_parsed(void *parsed_result,
                __attribute__((unused)) void *data)
 {
        struct cmd_show_bonding_config_result *res = parsed_result;
-       int bonding_mode;
+       int bonding_mode, agg_mode;
        uint8_t slaves[RTE_MAX_ETHPORTS];
        int num_slaves, num_active_slaves;
        int primary_id;
@@ -4400,6 +4633,23 @@ static void cmd_show_bonding_config_parsed(void *parsed_result,
                }
        }
 
+       if (bonding_mode == BONDING_MODE_8023AD) {
+               agg_mode = rte_eth_bond_8023ad_agg_selection_get(port_id);
+               printf("\tIEEE802.3AD Aggregator Mode: ");
+               switch (agg_mode) {
+               case AGG_BANDWIDTH:
+                       printf("bandwidth");
+                       break;
+               case AGG_STABLE:
+                       printf("stable");
+                       break;
+               case AGG_COUNT:
+                       printf("count");
+                       break;
+               }
+               printf("\n");
+       }
+
        num_slaves = rte_eth_bond_slaves_get(port_id, slaves, RTE_MAX_ETHPORTS);
 
        if (num_slaves < 0) {
@@ -4546,7 +4796,7 @@ static void cmd_add_bonding_slave_parsed(void *parsed_result,
        portid_t master_port_id = res->port_id;
        portid_t slave_port_id = res->slave_id;
 
-       /* Set the primary slave for a bonded device. */
+       /* add the slave for a bonded device. */
        if (0 != rte_eth_bond_slave_add(master_port_id, slave_port_id)) {
                printf("\t Failed to add slave %d to master port = %d.\n",
                                slave_port_id, master_port_id);
@@ -4604,7 +4854,7 @@ static void cmd_remove_bonding_slave_parsed(void *parsed_result,
        portid_t master_port_id = res->port_id;
        portid_t slave_port_id = res->slave_id;
 
-       /* Set the primary slave for a bonded device. */
+       /* remove the slave from a bonded device. */
        if (0 != rte_eth_bond_slave_remove(master_port_id, slave_port_id)) {
                printf("\t Failed to remove slave %d from master port = %d.\n",
                                slave_port_id, master_port_id);
@@ -4669,7 +4919,7 @@ static void cmd_create_bonded_device_parsed(void *parsed_result,
                return;
        }
 
-       snprintf(ethdev_name, RTE_ETH_NAME_MAX_LEN, "net_bond_testpmd_%d",
+       snprintf(ethdev_name, RTE_ETH_NAME_MAX_LEN, "net_bonding_testpmd_%d",
                        bond_dev_num++);
 
        /* Create a new bonded device. */
@@ -4832,6 +5082,77 @@ cmdline_parse_inst_t cmd_set_bond_mon_period = {
                }
 };
 
+
+
+struct cmd_set_bonding_agg_mode_policy_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t bonding;
+       cmdline_fixed_string_t agg_mode;
+       uint8_t port_num;
+       cmdline_fixed_string_t policy;
+};
+
+
+static void
+cmd_set_bonding_agg_mode(void *parsed_result,
+               __attribute__((unused)) struct cmdline *cl,
+               __attribute__((unused)) void *data)
+{
+       struct cmd_set_bonding_agg_mode_policy_result *res = parsed_result;
+       uint8_t policy = AGG_BANDWIDTH;
+
+       if (res->port_num >= nb_ports) {
+               printf("Port id %d must be less than %d\n",
+                               res->port_num, nb_ports);
+               return;
+       }
+
+       if (!strcmp(res->policy, "bandwidth"))
+               policy = AGG_BANDWIDTH;
+       else if (!strcmp(res->policy, "stable"))
+               policy = AGG_STABLE;
+       else if (!strcmp(res->policy, "count"))
+               policy = AGG_COUNT;
+
+       rte_eth_bond_8023ad_agg_selection_set(res->port_num, policy);
+}
+
+
+cmdline_parse_token_string_t cmd_set_bonding_agg_mode_set =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result,
+                               set, "set");
+cmdline_parse_token_string_t cmd_set_bonding_agg_mode_bonding =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result,
+                               bonding, "bonding");
+
+cmdline_parse_token_string_t cmd_set_bonding_agg_mode_agg_mode =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result,
+                               agg_mode, "agg_mode");
+
+cmdline_parse_token_num_t cmd_set_bonding_agg_mode_portnum =
+       TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_agg_mode_policy_result,
+                               port_num, UINT8);
+
+cmdline_parse_token_string_t cmd_set_bonding_agg_mode_policy_string =
+       TOKEN_STRING_INITIALIZER(
+                       struct cmd_set_bonding_balance_xmit_policy_result,
+               policy, "stable#bandwidth#count");
+
+cmdline_parse_inst_t cmd_set_bonding_agg_mode_policy = {
+       .f = cmd_set_bonding_agg_mode,
+       .data = (void *) 0,
+       .help_str = "set bonding mode IEEE802.3AD aggregator policy <port_id> <agg_name>",
+       .tokens = {
+                       (void *)&cmd_set_bonding_agg_mode_set,
+                       (void *)&cmd_set_bonding_agg_mode_bonding,
+                       (void *)&cmd_set_bonding_agg_mode_agg_mode,
+                       (void *)&cmd_set_bonding_agg_mode_portnum,
+                       (void *)&cmd_set_bonding_agg_mode_policy_string,
+                       NULL
+               }
+};
+
+
 #endif /* RTE_LIBRTE_PMD_BOND */
 
 /* *** SET FORWARDING MODE *** */
@@ -6720,7 +7041,6 @@ cmdline_parse_inst_t cmd_set_vf_macvlan_filter = {
        },
 };
 
-#ifdef RTE_LIBRTE_IXGBE_PMD
 /* *** CONFIGURE VF TRAFFIC CONTROL *** */
 struct cmd_set_vf_traffic {
        cmdline_fixed_string_t set;
@@ -6799,7 +7119,7 @@ cmd_set_vf_rxmode_parsed(void *parsed_result,
                       __attribute__((unused)) struct cmdline *cl,
                       __attribute__((unused)) void *data)
 {
-       int ret;
+       int ret = -ENOTSUP;
        uint16_t rx_mode = 0;
        struct cmd_set_vf_rxmode *res = parsed_result;
 
@@ -6815,7 +7135,16 @@ cmd_set_vf_rxmode_parsed(void *parsed_result,
                        rx_mode |= ETH_VMDQ_ACCEPT_MULTICAST;
        }
 
-       ret = rte_pmd_ixgbe_set_vf_rxmode(res->port_id, res->vf_id, rx_mode, (uint8_t)is_on);
+#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);
+#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);
+#endif
        if (ret < 0)
                printf("bad VF receive mode parameter, return code = %d \n",
                ret);
@@ -6863,7 +7192,6 @@ cmdline_parse_inst_t cmd_set_vf_rxmode = {
                NULL,
        },
 };
-#endif
 
 /* *** ADD MAC ADDRESS FILTER FOR A VF OF A PORT *** */
 struct cmd_vf_mac_addr_result {
@@ -6961,6 +7289,11 @@ cmd_vf_rx_vlan_filter_parsed(void *parsed_result,
                ret = rte_pmd_i40e_set_vf_vlan_filter(res->port_id,
                                res->vlan_id, res->vf_mask, is_add);
 #endif
+#ifdef RTE_LIBRTE_BNXT_PMD
+       if (ret == -ENOTSUP)
+               ret = rte_pmd_bnxt_set_vf_vlan_filter(res->port_id,
+                               res->vlan_id, res->vf_mask, is_add);
+#endif
 
        switch (ret) {
        case 0:
@@ -7086,7 +7419,6 @@ cmdline_parse_inst_t cmd_queue_rate_limit = {
        },
 };
 
-#ifdef RTE_LIBRTE_IXGBE_PMD
 /* *** SET RATE LIMIT FOR A VF OF A PORT *** */
 struct cmd_vf_rate_limit_result {
        cmdline_fixed_string_t set;
@@ -7165,7 +7497,6 @@ cmdline_parse_inst_t cmd_vf_rate_limit = {
                NULL,
        },
 };
-#endif
 
 /* *** ADD TUNNEL FILTER OF A PORT *** */
 struct cmd_tunnel_filter_result {
@@ -11012,6 +11343,11 @@ cmd_set_vf_vlan_anti_spoof_parsed(
                ret = rte_pmd_i40e_set_vf_vlan_anti_spoof(res->port_id,
                                res->vf_id, is_on);
 #endif
+#ifdef RTE_LIBRTE_BNXT_PMD
+       if (ret == -ENOTSUP)
+               ret = rte_pmd_bnxt_set_vf_vlan_anti_spoof(res->port_id,
+                               res->vf_id, is_on);
+#endif
 
        switch (ret) {
        case 0:
@@ -11113,6 +11449,11 @@ cmd_set_vf_mac_anti_spoof_parsed(
                ret = rte_pmd_i40e_set_vf_mac_anti_spoof(res->port_id,
                        res->vf_id, is_on);
 #endif
+#ifdef RTE_LIBRTE_BNXT_PMD
+       if (ret == -ENOTSUP)
+               ret = rte_pmd_bnxt_set_vf_mac_anti_spoof(res->port_id,
+                       res->vf_id, is_on);
+#endif
 
        switch (ret) {
        case 0:
@@ -11214,6 +11555,11 @@ cmd_set_vf_vlan_stripq_parsed(
                ret = rte_pmd_i40e_set_vf_vlan_stripq(res->port_id,
                        res->vf_id, is_on);
 #endif
+#ifdef RTE_LIBRTE_BNXT_PMD
+       if (ret == -ENOTSUP)
+               ret = rte_pmd_bnxt_set_vf_vlan_stripq(res->port_id,
+                       res->vf_id, is_on);
+#endif
 
        switch (ret) {
        case 0:
@@ -11313,6 +11659,11 @@ cmd_set_vf_vlan_insert_parsed(
                ret = rte_pmd_i40e_set_vf_vlan_insert(res->port_id, res->vf_id,
                        res->vlan_id);
 #endif
+#ifdef RTE_LIBRTE_BNXT_PMD
+       if (ret == -ENOTSUP)
+               ret = rte_pmd_bnxt_set_vf_vlan_insert(res->port_id, res->vf_id,
+                       res->vlan_id);
+#endif
 
        switch (ret) {
        case 0:
@@ -11402,6 +11753,10 @@ cmd_set_tx_loopback_parsed(
        if (ret == -ENOTSUP)
                ret = rte_pmd_i40e_set_tx_loopback(res->port_id, is_on);
 #endif
+#ifdef RTE_LIBRTE_BNXT_PMD
+       if (ret == -ENOTSUP)
+               ret = rte_pmd_bnxt_set_tx_loopback(res->port_id, is_on);
+#endif
 
        switch (ret) {
        case 0:
@@ -11434,7 +11789,6 @@ cmdline_parse_inst_t cmd_set_tx_loopback = {
        },
 };
 
-#ifdef RTE_LIBRTE_IXGBE_PMD
 /* all queues drop enable configuration */
 
 /* Common result structure for all queues drop enable */
@@ -11480,13 +11834,20 @@ cmd_set_all_queues_drop_en_parsed(
        __attribute__((unused)) void *data)
 {
        struct cmd_all_queues_drop_en_result *res = parsed_result;
-       int ret = 0;
+       int ret = -ENOTSUP;
        int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
 
        if (port_id_is_invalid(res->port_id, ENABLED_WARN))
                return;
 
-       ret = rte_pmd_ixgbe_set_all_queues_drop_en(res->port_id, is_on);
+#ifdef RTE_LIBRTE_IXGBE_PMD
+       if (ret == -ENOTSUP)
+               ret = rte_pmd_ixgbe_set_all_queues_drop_en(res->port_id, is_on);
+#endif
+#ifdef RTE_LIBRTE_BNXT_PMD
+       if (ret == -ENOTSUP)
+               ret = rte_pmd_bnxt_set_all_queues_drop_en(res->port_id, is_on);
+#endif
        switch (ret) {
        case 0:
                break;
@@ -11569,14 +11930,16 @@ cmd_set_vf_split_drop_en_parsed(
        __attribute__((unused)) void *data)
 {
        struct cmd_vf_split_drop_en_result *res = parsed_result;
-       int ret;
+       int ret = -ENOTSUP;
        int is_on = (strcmp(res->on_off, "on") == 0) ? 1 : 0;
 
        if (port_id_is_invalid(res->port_id, ENABLED_WARN))
                return;
 
+#ifdef RTE_LIBRTE_IXGBE_PMD
        ret = rte_pmd_ixgbe_set_vf_split_drop_en(res->port_id, res->vf_id,
                        is_on);
+#endif
        switch (ret) {
        case 0:
                break;
@@ -11586,6 +11949,9 @@ cmd_set_vf_split_drop_en_parsed(
        case -ENODEV:
                printf("invalid port_id %d\n", res->port_id);
                break;
+       case -ENOTSUP:
+               printf("not supported on port %d\n", res->port_id);
+               break;
        default:
                printf("programming error: (%s)\n", strerror(-ret));
        }
@@ -11606,7 +11972,6 @@ cmdline_parse_inst_t cmd_set_vf_split_drop_en = {
                NULL,
        },
 };
-#endif
 
 /* vf mac address configuration */
 
@@ -11673,6 +12038,11 @@ cmd_set_vf_mac_addr_parsed(
                ret = rte_pmd_i40e_set_vf_mac_addr(res->port_id, res->vf_id,
                                &res->mac_addr);
 #endif
+#ifdef RTE_LIBRTE_BNXT_PMD
+       if (ret == -ENOTSUP)
+               ret = rte_pmd_bnxt_set_vf_mac_addr(res->port_id, res->vf_id,
+                               &res->mac_addr);
+#endif
 
        switch (ret) {
        case 0:
@@ -11707,7 +12077,6 @@ cmdline_parse_inst_t cmd_set_vf_mac_addr = {
        },
 };
 
-#ifdef RTE_LIBRTE_IXGBE_PMD
 /* MACsec configuration */
 
 /* Common result structure for MACsec offload enable */
@@ -11768,7 +12137,7 @@ cmd_set_macsec_offload_on_parsed(
        __attribute__((unused)) void *data)
 {
        struct cmd_macsec_offload_on_result *res = parsed_result;
-       int ret;
+       int ret = -ENOTSUP;
        portid_t port_id = res->port_id;
        int en = (strcmp(res->en_on_off, "on") == 0) ? 1 : 0;
        int rp = (strcmp(res->rp_on_off, "on") == 0) ? 1 : 0;
@@ -11777,7 +12146,11 @@ cmd_set_macsec_offload_on_parsed(
                return;
 
        ports[port_id].tx_ol_flags |= TESTPMD_TX_OFFLOAD_MACSEC;
+#ifdef RTE_LIBRTE_IXGBE_PMD
        ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
+#endif
+       RTE_SET_USED(en);
+       RTE_SET_USED(rp);
 
        switch (ret) {
        case 0:
@@ -11785,6 +12158,9 @@ cmd_set_macsec_offload_on_parsed(
        case -ENODEV:
                printf("invalid port_id %d\n", port_id);
                break;
+       case -ENOTSUP:
+               printf("not supported on port %d\n", port_id);
+               break;
        default:
                printf("programming error: (%s)\n", strerror(-ret));
        }
@@ -11847,14 +12223,16 @@ cmd_set_macsec_offload_off_parsed(
        __attribute__((unused)) void *data)
 {
        struct cmd_macsec_offload_off_result *res = parsed_result;
-       int ret;
+       int ret = -ENOTSUP;
        portid_t port_id = res->port_id;
 
        if (port_id_is_invalid(port_id, ENABLED_WARN))
                return;
 
        ports[port_id].tx_ol_flags &= ~TESTPMD_TX_OFFLOAD_MACSEC;
+#ifdef RTE_LIBRTE_IXGBE_PMD
        ret = rte_pmd_ixgbe_macsec_disable(port_id);
+#endif
 
        switch (ret) {
        case 0:
@@ -11862,6 +12240,9 @@ cmd_set_macsec_offload_off_parsed(
        case -ENODEV:
                printf("invalid port_id %d\n", port_id);
                break;
+       case -ENOTSUP:
+               printf("not supported on port %d\n", port_id);
+               break;
        default:
                printf("programming error: (%s)\n", strerror(-ret));
        }
@@ -11929,20 +12310,27 @@ cmd_set_macsec_sc_parsed(
        __attribute__((unused)) void *data)
 {
        struct cmd_macsec_sc_result *res = parsed_result;
-       int ret;
+       int ret = -ENOTSUP;
        int is_tx = (strcmp(res->tx_rx, "tx") == 0) ? 1 : 0;
 
+#ifdef RTE_LIBRTE_IXGBE_PMD
        ret = is_tx ?
                rte_pmd_ixgbe_macsec_config_txsc(res->port_id,
                                res->mac.addr_bytes) :
                rte_pmd_ixgbe_macsec_config_rxsc(res->port_id,
                                res->mac.addr_bytes, res->pi);
+#endif
+       RTE_SET_USED(is_tx);
+
        switch (ret) {
        case 0:
                break;
        case -ENODEV:
                printf("invalid port_id %d\n", res->port_id);
                break;
+       case -ENOTSUP:
+               printf("not supported on port %d\n", res->port_id);
+               break;
        default:
                printf("programming error: (%s)\n", strerror(-ret));
        }
@@ -12022,7 +12410,7 @@ cmd_set_macsec_sa_parsed(
        __attribute__((unused)) void *data)
 {
        struct cmd_macsec_sa_result *res = parsed_result;
-       int ret;
+       int ret = -ENOTSUP;
        int is_tx = (strcmp(res->tx_rx, "tx") == 0) ? 1 : 0;
        uint8_t key[16] = { 0 };
        uint8_t xdgt0;
@@ -12044,11 +12432,16 @@ cmd_set_macsec_sa_parsed(
                key[i] = (uint8_t) ((xdgt0 * 16) + xdgt1);
        }
 
+#ifdef RTE_LIBRTE_IXGBE_PMD
        ret = is_tx ?
                rte_pmd_ixgbe_macsec_select_txsa(res->port_id,
                        res->idx, res->an, res->pn, key) :
                rte_pmd_ixgbe_macsec_select_rxsa(res->port_id,
                        res->idx, res->an, res->pn, key);
+#endif
+       RTE_SET_USED(is_tx);
+       RTE_SET_USED(key);
+
        switch (ret) {
        case 0:
                break;
@@ -12058,6 +12451,9 @@ cmd_set_macsec_sa_parsed(
        case -ENODEV:
                printf("invalid port_id %d\n", res->port_id);
                break;
+       case -ENOTSUP:
+               printf("not supported on port %d\n", res->port_id);
+               break;
        default:
                printf("programming error: (%s)\n", strerror(-ret));
        }
@@ -12080,7 +12476,6 @@ cmdline_parse_inst_t cmd_set_macsec_sa = {
                NULL,
        },
 };
-#endif
 
 /* VF unicast promiscuous mode configuration */
 
@@ -12860,6 +13255,9 @@ cmd_ddp_add_parsed(
        struct cmd_ddp_add_result *res = parsed_result;
        uint8_t *buff;
        uint32_t size;
+       char *filepath;
+       char *file_fld[2];
+       int file_num;
        int ret = -ENOTSUP;
 
        if (res->port_id > nb_ports) {
@@ -12872,9 +13270,18 @@ cmd_ddp_add_parsed(
                return;
        }
 
-       buff = open_ddp_package_file(res->filepath, &size);
-       if (!buff)
+       filepath = strdup(res->filepath);
+       if (filepath == NULL) {
+               printf("Failed to allocate memory\n");
                return;
+       }
+       file_num = rte_strsplit(filepath, strlen(filepath), file_fld, 2, ',');
+
+       buff = open_ddp_package_file(file_fld[0], &size);
+       if (!buff) {
+               free((void *)filepath);
+               return;
+       }
 
 #ifdef RTE_LIBRTE_I40E_PMD
        if (ret == -ENOTSUP)
@@ -12883,18 +13290,21 @@ cmd_ddp_add_parsed(
                                               RTE_PMD_I40E_PKG_OP_WR_ADD);
 #endif
 
-       if (ret < 0)
-               printf("Failed to load profile.\n");
-       else if (ret > 0)
+       if (ret == -EEXIST)
                printf("Profile has already existed.\n");
+       else if (ret < 0)
+               printf("Failed to load profile.\n");
+       else if (file_num == 2)
+               save_ddp_package_file(file_fld[1], buff, size);
 
        close_ddp_package_file(buff);
+       free((void *)filepath);
 }
 
 cmdline_parse_inst_t cmd_ddp_add = {
        .f = cmd_ddp_add_parsed,
        .data = NULL,
-       .help_str = "ddp add <port_id> <profile_path>",
+       .help_str = "ddp add <port_id> <profile_path[,output_path]>",
        .tokens = {
                (void *)&cmd_ddp_add_ddp,
                (void *)&cmd_ddp_add_add,
@@ -12904,6 +13314,203 @@ cmdline_parse_inst_t cmd_ddp_add = {
        },
 };
 
+/* Delete dynamic device personalization*/
+struct cmd_ddp_del_result {
+       cmdline_fixed_string_t ddp;
+       cmdline_fixed_string_t del;
+       uint8_t port_id;
+       char filepath[];
+};
+
+cmdline_parse_token_string_t cmd_ddp_del_ddp =
+       TOKEN_STRING_INITIALIZER(struct cmd_ddp_del_result, ddp, "ddp");
+cmdline_parse_token_string_t cmd_ddp_del_del =
+       TOKEN_STRING_INITIALIZER(struct cmd_ddp_del_result, del, "del");
+cmdline_parse_token_num_t cmd_ddp_del_port_id =
+       TOKEN_NUM_INITIALIZER(struct cmd_ddp_del_result, port_id, UINT8);
+cmdline_parse_token_string_t cmd_ddp_del_filepath =
+       TOKEN_STRING_INITIALIZER(struct cmd_ddp_del_result, filepath, NULL);
+
+static void
+cmd_ddp_del_parsed(
+       void *parsed_result,
+       __attribute__((unused)) struct cmdline *cl,
+       __attribute__((unused)) void *data)
+{
+       struct cmd_ddp_del_result *res = parsed_result;
+       uint8_t *buff;
+       uint32_t size;
+       int ret = -ENOTSUP;
+
+       if (res->port_id > nb_ports) {
+               printf("Invalid port, range is [0, %d]\n", nb_ports - 1);
+               return;
+       }
+
+       if (!all_ports_stopped()) {
+               printf("Please stop all ports first\n");
+               return;
+       }
+
+       buff = open_ddp_package_file(res->filepath, &size);
+       if (!buff)
+               return;
+
+#ifdef RTE_LIBRTE_I40E_PMD
+       if (ret == -ENOTSUP)
+               ret = rte_pmd_i40e_process_ddp_package(res->port_id,
+                                              buff, size,
+                                              RTE_PMD_I40E_PKG_OP_WR_DEL);
+#endif
+
+       if (ret == -EACCES)
+               printf("Profile does not exist.\n");
+       else if (ret < 0)
+               printf("Failed to delete profile.\n");
+
+       close_ddp_package_file(buff);
+}
+
+cmdline_parse_inst_t cmd_ddp_del = {
+       .f = cmd_ddp_del_parsed,
+       .data = NULL,
+       .help_str = "ddp del <port_id> <profile_path>",
+       .tokens = {
+               (void *)&cmd_ddp_del_ddp,
+               (void *)&cmd_ddp_del_del,
+               (void *)&cmd_ddp_del_port_id,
+               (void *)&cmd_ddp_del_filepath,
+               NULL,
+       },
+};
+
+/* Get dynamic device personalization profile info */
+struct cmd_ddp_info_result {
+       cmdline_fixed_string_t ddp;
+       cmdline_fixed_string_t get;
+       cmdline_fixed_string_t info;
+       char filepath[];
+};
+
+cmdline_parse_token_string_t cmd_ddp_info_ddp =
+       TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, ddp, "ddp");
+cmdline_parse_token_string_t cmd_ddp_info_get =
+       TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, get, "get");
+cmdline_parse_token_string_t cmd_ddp_info_info =
+       TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, info, "info");
+cmdline_parse_token_string_t cmd_ddp_info_filepath =
+       TOKEN_STRING_INITIALIZER(struct cmd_ddp_info_result, filepath, NULL);
+
+static void
+cmd_ddp_info_parsed(
+       void *parsed_result,
+       __attribute__((unused)) struct cmdline *cl,
+       __attribute__((unused)) void *data)
+{
+       struct cmd_ddp_info_result *res = parsed_result;
+       uint8_t *pkg;
+       uint32_t pkg_size;
+       int ret = -ENOTSUP;
+#ifdef RTE_LIBRTE_I40E_PMD
+       uint32_t i;
+       uint8_t *buff;
+       uint32_t buff_size;
+       struct rte_pmd_i40e_profile_info info;
+       uint32_t dev_num;
+       struct rte_pmd_i40e_ddp_device_id *devs;
+#endif
+
+       pkg = open_ddp_package_file(res->filepath, &pkg_size);
+       if (!pkg)
+               return;
+
+#ifdef RTE_LIBRTE_I40E_PMD
+       ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
+                               (uint8_t *)&info, sizeof(info),
+                               RTE_PMD_I40E_PKG_INFO_GLOBAL_HEADER);
+       if (!ret) {
+               printf("Global Track id:       0x%x\n", info.track_id);
+               printf("Global Version:        %d.%d.%d.%d\n",
+                       info.version.major,
+                       info.version.minor,
+                       info.version.update,
+                       info.version.draft);
+               printf("Global Package name:   %s\n\n", info.name);
+       }
+
+       ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
+                               (uint8_t *)&info, sizeof(info),
+                               RTE_PMD_I40E_PKG_INFO_HEADER);
+       if (!ret) {
+               printf("i40e Profile Track id: 0x%x\n", info.track_id);
+               printf("i40e Profile Version:  %d.%d.%d.%d\n",
+                       info.version.major,
+                       info.version.minor,
+                       info.version.update,
+                       info.version.draft);
+               printf("i40e Profile name:     %s\n\n", info.name);
+       }
+
+       ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
+                               (uint8_t *)&buff_size, sizeof(buff_size),
+                               RTE_PMD_I40E_PKG_INFO_GLOBAL_NOTES_SIZE);
+       if (!ret && buff_size) {
+               buff = (uint8_t *)malloc(buff_size);
+               if (buff) {
+                       ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
+                                               buff, buff_size,
+                                               RTE_PMD_I40E_PKG_INFO_GLOBAL_NOTES);
+                       if (!ret)
+                               printf("Package Notes:\n%s\n\n", buff);
+                       free(buff);
+               }
+       }
+
+       ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
+                               (uint8_t *)&dev_num, sizeof(dev_num),
+                               RTE_PMD_I40E_PKG_INFO_DEVID_NUM);
+       if (!ret && dev_num) {
+               devs = (struct rte_pmd_i40e_ddp_device_id *)malloc(dev_num *
+                       sizeof(struct rte_pmd_i40e_ddp_device_id));
+               if (devs) {
+                       ret = rte_pmd_i40e_get_ddp_info(pkg, pkg_size,
+                                               (uint8_t *)devs, dev_num *
+                                               sizeof(struct rte_pmd_i40e_ddp_device_id),
+                                               RTE_PMD_I40E_PKG_INFO_DEVID_LIST);
+                       if (!ret) {
+                               printf("List of supported devices:\n");
+                               for (i = 0; i < dev_num; i++) {
+                                       printf("  %04X:%04X %04X:%04X\n",
+                                               devs[i].vendor_dev_id >> 16,
+                                               devs[i].vendor_dev_id & 0xFFFF,
+                                               devs[i].sub_vendor_dev_id >> 16,
+                                               devs[i].sub_vendor_dev_id & 0xFFFF);
+                               }
+                               printf("\n");
+                       }
+                       free(devs);
+               }
+       }
+       ret = 0;
+#endif
+       if (ret == -ENOTSUP)
+               printf("Function not supported in PMD driver\n");
+       close_ddp_package_file(pkg);
+}
+
+cmdline_parse_inst_t cmd_ddp_get_info = {
+       .f = cmd_ddp_info_parsed,
+       .data = NULL,
+       .help_str = "ddp get info <profile_path>",
+       .tokens = {
+               (void *)&cmd_ddp_info_ddp,
+               (void *)&cmd_ddp_info_get,
+               (void *)&cmd_ddp_info_info,
+               (void *)&cmd_ddp_info_filepath,
+               NULL,
+       },
+};
+
 /* Get dynamic device personalization profile info list*/
 #define PROFILE_INFO_SIZE 48
 #define MAX_PROFILE_NUM 16
@@ -13042,9 +13649,16 @@ cmd_show_vf_stats_parsed(
        memset(&stats, 0, sizeof(stats));
 
 #ifdef RTE_LIBRTE_I40E_PMD
-       ret = rte_pmd_i40e_get_vf_stats(res->port_id,
-                                       res->vf_id,
-                                       &stats);
+       if (ret == -ENOTSUP)
+               ret = rte_pmd_i40e_get_vf_stats(res->port_id,
+                                               res->vf_id,
+                                               &stats);
+#endif
+#ifdef RTE_LIBRTE_BNXT_PMD
+       if (ret == -ENOTSUP)
+               ret = rte_pmd_bnxt_get_vf_stats(res->port_id,
+                                               res->vf_id,
+                                               &stats);
 #endif
 
        switch (ret) {
@@ -13140,8 +13754,14 @@ cmd_clear_vf_stats_parsed(
                return;
 
 #ifdef RTE_LIBRTE_I40E_PMD
-       ret = rte_pmd_i40e_reset_vf_stats(res->port_id,
-                                         res->vf_id);
+       if (ret == -ENOTSUP)
+               ret = rte_pmd_i40e_reset_vf_stats(res->port_id,
+                                                 res->vf_id);
+#endif
+#ifdef RTE_LIBRTE_BNXT_PMD
+       if (ret == -ENOTSUP)
+               ret = rte_pmd_bnxt_reset_vf_stats(res->port_id,
+                                                 res->vf_id);
 #endif
 
        switch (ret) {
@@ -13597,12 +14217,10 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_set_allmulti_mode_all,
        (cmdline_parse_inst_t *)&cmd_set_flush_rx,
        (cmdline_parse_inst_t *)&cmd_set_link_check,
-#ifdef RTE_NIC_BYPASS
        (cmdline_parse_inst_t *)&cmd_set_bypass_mode,
        (cmdline_parse_inst_t *)&cmd_set_bypass_event,
        (cmdline_parse_inst_t *)&cmd_set_bypass_timeout,
        (cmdline_parse_inst_t *)&cmd_show_bypass_config,
-#endif
 #ifdef RTE_LIBRTE_PMD_BOND
        (cmdline_parse_inst_t *) &cmd_set_bonding_mode,
        (cmdline_parse_inst_t *) &cmd_show_bonding_config,
@@ -13613,6 +14231,8 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *) &cmd_set_bond_mac_addr,
        (cmdline_parse_inst_t *) &cmd_set_balance_xmit_policy,
        (cmdline_parse_inst_t *) &cmd_set_bond_mon_period,
+       (cmdline_parse_inst_t *) &cmd_set_lacp_dedicated_queues,
+       (cmdline_parse_inst_t *) &cmd_set_bonding_agg_mode_policy,
 #endif
        (cmdline_parse_inst_t *)&cmd_vlan_offload,
        (cmdline_parse_inst_t *)&cmd_vlan_tpid,
@@ -13629,6 +14249,8 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_tso_show,
        (cmdline_parse_inst_t *)&cmd_tunnel_tso_set,
        (cmdline_parse_inst_t *)&cmd_tunnel_tso_show,
+       (cmdline_parse_inst_t *)&cmd_enable_gro,
+       (cmdline_parse_inst_t *)&cmd_gro_set,
        (cmdline_parse_inst_t *)&cmd_link_flow_control_set,
        (cmdline_parse_inst_t *)&cmd_link_flow_control_set_rx,
        (cmdline_parse_inst_t *)&cmd_link_flow_control_set_tx,
@@ -13724,17 +14346,15 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_set_vf_vlan_stripq,
        (cmdline_parse_inst_t *)&cmd_set_vf_vlan_insert,
        (cmdline_parse_inst_t *)&cmd_set_tx_loopback,
-#ifdef RTE_LIBRTE_IXGBE_PMD
        (cmdline_parse_inst_t *)&cmd_set_all_queues_drop_en,
        (cmdline_parse_inst_t *)&cmd_set_vf_split_drop_en,
        (cmdline_parse_inst_t *)&cmd_set_macsec_offload_on,
        (cmdline_parse_inst_t *)&cmd_set_macsec_offload_off,
        (cmdline_parse_inst_t *)&cmd_set_macsec_sc,
        (cmdline_parse_inst_t *)&cmd_set_macsec_sa,
-       (cmdline_parse_inst_t *)&cmd_set_vf_rxmode,
        (cmdline_parse_inst_t *)&cmd_set_vf_traffic,
+       (cmdline_parse_inst_t *)&cmd_set_vf_rxmode,
        (cmdline_parse_inst_t *)&cmd_vf_rate_limit,
-#endif
        (cmdline_parse_inst_t *)&cmd_vf_rxvlan_filter,
        (cmdline_parse_inst_t *)&cmd_set_vf_mac_addr,
        (cmdline_parse_inst_t *)&cmd_set_vf_promisc,
@@ -13747,7 +14367,9 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_strict_link_prio,
        (cmdline_parse_inst_t *)&cmd_tc_min_bw,
        (cmdline_parse_inst_t *)&cmd_ddp_add,
+       (cmdline_parse_inst_t *)&cmd_ddp_del,
        (cmdline_parse_inst_t *)&cmd_ddp_get_list,
+       (cmdline_parse_inst_t *)&cmd_ddp_get_info,
        (cmdline_parse_inst_t *)&cmd_show_vf_stats,
        (cmdline_parse_inst_t *)&cmd_clear_vf_stats,
        (cmdline_parse_inst_t *)&cmd_ptype_mapping_get,