mbuf: remove rte_ctrlmbuf
[dpdk.git] / app / test-pmd / cmdline.c
index f61a31c..6de38e6 100644 (file)
@@ -84,6 +84,9 @@
 #include <cmdline_socket.h>
 #include <cmdline.h>
 #include <rte_pci_dev_ids.h>
+#ifdef RTE_LIBRTE_PMD_BOND
+#include <rte_eth_bond.h>
+#endif
 
 #include "testpmd.h"
 
@@ -412,6 +415,31 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "   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"
+
+                       "add bonding slave (slave_id) (port_id)\n"
+                       "       Add a slave device to a bonded device.\n\n"
+
+                       "remove bonding slave (slave_id) (port_id)\n"
+                       "       Remove a slave device from a bonded device.\n\n"
+
+                       "set bonding mode (value) (port_id)\n"
+                       "       Set the bonding mode on a bonded device.\n\n"
+
+                       "set bonding primary (slave_id) (port_id)\n"
+                       "       Set the primary slave for a bonded device.\n\n"
+
+                       "show bonding config (port_id)\n"
+                       "       Show the bonding config for port_id.\n\n"
+
+                       "set bonding mac_addr (port_id) (address)\n"
+                       "       Set the MAC address of a bonded device.\n\n"
+
+                       "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"
+#endif
 
                        , list_pkt_forwarding_modes()
                );
@@ -499,7 +527,8 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "port close (port_id|all)\n"
                        "    Close all ports or port_id.\n\n"
 
-                       "port config (port_id|all) speed (10|100|1000|10000|auto)"
+                       "port config (port_id|all)"
+                       " speed (10|100|1000|10000|40000|auto)"
                        " duplex (half|full|auto)\n"
                        "    Set speed and duplex for all ports or port_id\n\n"
 
@@ -537,6 +566,10 @@ static void cmd_help_long_parsed(void *parsed_result,
                        " tx rs bit threshold.\n\n"
                        "port config mtu X value\n"
                        "    Set the MTU of port X to a given value\n\n"
+
+                       "port (port_id) (rxq|txq) (queue_id) (start|stop)\n"
+                       "    Start/stop a rx/tx queue of port X. Only take effect"
+                       " when port X is started\n"
                );
        }
 
@@ -773,7 +806,9 @@ cmd_config_speed_all_parsed(void *parsed_result,
        else if (!strcmp(res->value1, "1000"))
                link_speed = ETH_LINK_SPEED_1000;
        else if (!strcmp(res->value1, "10000"))
-               link_speed = ETH_LINK_SPEED_10000;
+               link_speed = ETH_LINK_SPEED_10G;
+       else if (!strcmp(res->value1, "40000"))
+               link_speed = ETH_LINK_SPEED_40G;
        else if (!strcmp(res->value1, "auto"))
                link_speed = ETH_LINK_SPEED_AUTONEG;
        else {
@@ -811,7 +846,7 @@ cmdline_parse_token_string_t cmd_config_speed_all_item1 =
        TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, item1, "speed");
 cmdline_parse_token_string_t cmd_config_speed_all_value1 =
        TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, value1,
-                                               "10#100#1000#10000#auto");
+                                               "10#100#1000#10000#40000#auto");
 cmdline_parse_token_string_t cmd_config_speed_all_item2 =
        TOKEN_STRING_INITIALIZER(struct cmd_config_speed_all, item2, "duplex");
 cmdline_parse_token_string_t cmd_config_speed_all_value2 =
@@ -821,7 +856,7 @@ cmdline_parse_token_string_t cmd_config_speed_all_value2 =
 cmdline_parse_inst_t cmd_config_speed_all = {
        .f = cmd_config_speed_all_parsed,
        .data = NULL,
-       .help_str = "port config all speed 10|100|1000|10000|auto duplex "
+       .help_str = "port config all speed 10|100|1000|10000|40000|auto duplex "
                                                        "half|full|auto",
        .tokens = {
                (void *)&cmd_config_speed_all_port,
@@ -873,6 +908,8 @@ cmd_config_speed_specific_parsed(void *parsed_result,
                link_speed = ETH_LINK_SPEED_1000;
        else if (!strcmp(res->value1, "10000"))
                link_speed = ETH_LINK_SPEED_10000;
+       else if (!strcmp(res->value1, "40000"))
+               link_speed = ETH_LINK_SPEED_40G;
        else if (!strcmp(res->value1, "auto"))
                link_speed = ETH_LINK_SPEED_AUTONEG;
        else {
@@ -911,7 +948,7 @@ cmdline_parse_token_string_t cmd_config_speed_specific_item1 =
                                                                "speed");
 cmdline_parse_token_string_t cmd_config_speed_specific_value1 =
        TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, value1,
-                                               "10#100#1000#10000#auto");
+                                               "10#100#1000#10000#40000#auto");
 cmdline_parse_token_string_t cmd_config_speed_specific_item2 =
        TOKEN_STRING_INITIALIZER(struct cmd_config_speed_specific, item2,
                                                                "duplex");
@@ -922,7 +959,7 @@ cmdline_parse_token_string_t cmd_config_speed_specific_value2 =
 cmdline_parse_inst_t cmd_config_speed_specific = {
        .f = cmd_config_speed_specific_parsed,
        .data = NULL,
-       .help_str = "port config X speed 10|100|1000|10000|auto duplex "
+       .help_str = "port config X speed 10|100|1000|10000|40000|auto duplex "
                                                        "half|full|auto",
        .tokens = {
                (void *)&cmd_config_speed_specific_port,
@@ -1397,6 +1434,96 @@ cmdline_parse_inst_t cmd_config_rss_hash_key = {
        },
 };
 
+/* *** configure port rxq/txq start/stop *** */
+struct cmd_config_rxtx_queue {
+       cmdline_fixed_string_t port;
+       uint8_t portid;
+       cmdline_fixed_string_t rxtxq;
+       uint16_t qid;
+       cmdline_fixed_string_t opname;
+};
+
+static void
+cmd_config_rxtx_queue_parsed(void *parsed_result,
+                       __attribute__((unused)) struct cmdline *cl,
+                       __attribute__((unused)) void *data)
+{
+       struct cmd_config_rxtx_queue *res = parsed_result;
+       uint8_t isrx;
+       uint8_t isstart;
+
+       if (test_done == 0) {
+               printf("Please stop forwarding first\n");
+               return;
+       }
+
+       if (port_id_is_invalid(res->portid))
+               return;
+
+       if (port_is_started(res->portid) != 1) {
+               printf("Please start port %u first\n", res->portid);
+               return;
+       }
+
+       if (!strcmp(res->rxtxq, "rxq"))
+               isrx = 1;
+       else if (!strcmp(res->rxtxq, "txq"))
+               isrx = 0;
+       else {
+               printf("Unknown parameter\n");
+               return;
+       }
+
+       if (isrx && rx_queue_id_is_invalid(res->qid))
+               return;
+       else if (!isrx && tx_queue_id_is_invalid(res->qid))
+               return;
+
+       if (!strcmp(res->opname, "start"))
+               isstart = 1;
+       else if (!strcmp(res->opname, "stop"))
+               isstart = 0;
+       else {
+               printf("Unknown parameter\n");
+               return;
+       }
+
+       if (isstart && isrx)
+               rte_eth_dev_rx_queue_start(res->portid, res->qid);
+       else if (!isstart && isrx)
+               rte_eth_dev_rx_queue_stop(res->portid, res->qid);
+       else if (isstart && !isrx)
+               rte_eth_dev_tx_queue_start(res->portid, res->qid);
+       else
+               rte_eth_dev_tx_queue_stop(res->portid, res->qid);
+}
+
+cmdline_parse_token_string_t cmd_config_rxtx_queue_port =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_queue, port, "port");
+cmdline_parse_token_num_t cmd_config_rxtx_queue_portid =
+       TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_queue, portid, UINT8);
+cmdline_parse_token_string_t cmd_config_rxtx_queue_rxtxq =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_queue, rxtxq, "rxq#txq");
+cmdline_parse_token_num_t cmd_config_rxtx_queue_qid =
+       TOKEN_NUM_INITIALIZER(struct cmd_config_rxtx_queue, qid, UINT16);
+cmdline_parse_token_string_t cmd_config_rxtx_queue_opname =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_rxtx_queue, opname,
+                                               "start#stop");
+
+cmdline_parse_inst_t cmd_config_rxtx_queue = {
+       .f = cmd_config_rxtx_queue_parsed,
+       .data = NULL,
+       .help_str = "port X rxq|txq ID start|stop",
+       .tokens = {
+               (void *)&cmd_config_speed_all_port,
+               (void *)&cmd_config_rxtx_queue_portid,
+               (void *)&cmd_config_rxtx_queue_rxtxq,
+               (void *)&cmd_config_rxtx_queue_qid,
+               (void *)&cmd_config_rxtx_queue_opname,
+               NULL,
+       },
+};
+
 /* *** Configure RSS RETA *** */
 struct cmd_config_rss_reta {
        cmdline_fixed_string_t port;
@@ -3039,6 +3166,547 @@ cmdline_parse_inst_t cmd_show_bypass_config = {
 };
 #endif
 
+#ifdef RTE_LIBRTE_PMD_BOND
+/* *** SET BONDING MODE *** */
+struct cmd_set_bonding_mode_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t bonding;
+       cmdline_fixed_string_t mode;
+       uint8_t value;
+       uint8_t port_id;
+};
+
+static void cmd_set_bonding_mode_parsed(void *parsed_result,
+               __attribute__((unused))  struct cmdline *cl,
+               __attribute__((unused)) void *data)
+{
+       struct cmd_set_bonding_mode_result *res = parsed_result;
+       portid_t port_id = res->port_id;
+
+       /* Set the bonding mode for the relevant port. */
+       if (0 != rte_eth_bond_mode_set(port_id, res->value))
+               printf("\t Failed to set bonding mode for port = %d.\n", port_id);
+}
+
+cmdline_parse_token_string_t cmd_setbonding_mode_set =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result,
+               set, "set");
+cmdline_parse_token_string_t cmd_setbonding_mode_bonding =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result,
+               bonding, "bonding");
+cmdline_parse_token_string_t cmd_setbonding_mode_mode =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_mode_result,
+               mode, "mode");
+cmdline_parse_token_num_t cmd_setbonding_mode_value =
+TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_mode_result,
+               value, UINT8);
+cmdline_parse_token_num_t cmd_setbonding_mode_port =
+TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_mode_result,
+               port_id, UINT8);
+
+cmdline_parse_inst_t cmd_set_bonding_mode = {
+               .f = cmd_set_bonding_mode_parsed,
+               .help_str = "set bonding mode (mode_value) (port_id): Set the bonding mode for port_id",
+               .data = NULL,
+               .tokens = {
+                               (void *) &cmd_setbonding_mode_set,
+                               (void *) &cmd_setbonding_mode_bonding,
+                               (void *) &cmd_setbonding_mode_mode,
+                               (void *) &cmd_setbonding_mode_value,
+                               (void *) &cmd_setbonding_mode_port,
+                               NULL
+               }
+};
+
+/* *** SET BALANCE XMIT POLICY *** */
+struct cmd_set_bonding_balance_xmit_policy_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t bonding;
+       cmdline_fixed_string_t balance_xmit_policy;
+       uint8_t port_id;
+       cmdline_fixed_string_t policy;
+};
+
+static void cmd_set_bonding_balance_xmit_policy_parsed(void *parsed_result,
+               __attribute__((unused))  struct cmdline *cl,
+               __attribute__((unused)) void *data)
+{
+       struct cmd_set_bonding_balance_xmit_policy_result *res = parsed_result;
+       portid_t port_id = res->port_id;
+       uint8_t policy;
+
+       if (!strcmp(res->policy, "l2")) {
+               policy = BALANCE_XMIT_POLICY_LAYER2;
+       } else if (!strcmp(res->policy, "l23")) {
+               policy = BALANCE_XMIT_POLICY_LAYER23;
+       } else if (!strcmp(res->policy, "l34")) {
+               policy = BALANCE_XMIT_POLICY_LAYER34;
+       } else {
+               printf("\t Invalid xmit policy selection");
+               return;
+       }
+
+       /* Set the bonding mode for the relevant port. */
+       if (0 != rte_eth_bond_xmit_policy_set(port_id, policy)) {
+               printf("\t Failed to set bonding balance xmit policy for port = %d.\n",
+                               port_id);
+       }
+}
+
+cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_set =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
+               set, "set");
+cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_bonding =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
+               bonding, "bonding");
+cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_balance_xmit_policy =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
+               balance_xmit_policy, "balance_xmit_policy");
+cmdline_parse_token_num_t cmd_setbonding_balance_xmit_policy_port =
+TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
+               port_id, UINT8);
+cmdline_parse_token_string_t cmd_setbonding_balance_xmit_policy_policy =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_balance_xmit_policy_result,
+               policy, "l2#l23#l34");
+
+cmdline_parse_inst_t cmd_set_balance_xmit_policy = {
+               .f = cmd_set_bonding_balance_xmit_policy_parsed,
+               .help_str = "set bonding balance_xmit_policy (port_id) (policy_value): Set the bonding balance_xmit_policy for port_id",
+               .data = NULL,
+               .tokens = {
+                               (void *)&cmd_setbonding_balance_xmit_policy_set,
+                               (void *)&cmd_setbonding_balance_xmit_policy_bonding,
+                               (void *)&cmd_setbonding_balance_xmit_policy_balance_xmit_policy,
+                               (void *)&cmd_setbonding_balance_xmit_policy_port,
+                               (void *)&cmd_setbonding_balance_xmit_policy_policy,
+                               NULL
+               }
+};
+
+/* *** SHOW NIC BONDING CONFIGURATION *** */
+struct cmd_show_bonding_config_result {
+       cmdline_fixed_string_t show;
+       cmdline_fixed_string_t bonding;
+       cmdline_fixed_string_t config;
+       uint8_t port_id;
+};
+
+static void cmd_show_bonding_config_parsed(void *parsed_result,
+               __attribute__((unused))  struct cmdline *cl,
+               __attribute__((unused)) void *data)
+{
+       struct cmd_show_bonding_config_result *res = parsed_result;
+       int bonding_mode;
+       uint8_t slaves[RTE_MAX_ETHPORTS];
+       int num_slaves, num_active_slaves;
+       int primary_id;
+       int i;
+       portid_t port_id = res->port_id;
+
+       /* Display the bonding mode.*/
+       bonding_mode = rte_eth_bond_mode_get(port_id);
+       if (bonding_mode < 0) {
+               printf("\tFailed to get bonding mode for port = %d\n", port_id);
+               return;
+       } else
+               printf("\tBonding mode: %d\n", bonding_mode);
+
+       if (bonding_mode == BONDING_MODE_BALANCE) {
+               int balance_xmit_policy;
+
+               balance_xmit_policy = rte_eth_bond_xmit_policy_get(port_id);
+               if (balance_xmit_policy < 0) {
+                       printf("\tFailed to get balance xmit policy for port = %d\n",
+                                       port_id);
+                       return;
+               } else {
+                       printf("\tBalance Xmit Policy: ");
+
+                       switch (balance_xmit_policy) {
+                       case BALANCE_XMIT_POLICY_LAYER2:
+                               printf("BALANCE_XMIT_POLICY_LAYER2");
+                               break;
+                       case BALANCE_XMIT_POLICY_LAYER23:
+                               printf("BALANCE_XMIT_POLICY_LAYER23");
+                               break;
+                       case BALANCE_XMIT_POLICY_LAYER34:
+                               printf("BALANCE_XMIT_POLICY_LAYER34");
+                               break;
+                       }
+                       printf("\n");
+               }
+       }
+
+       num_slaves = rte_eth_bond_slaves_get(port_id, slaves, RTE_MAX_ETHPORTS);
+
+       if (num_slaves < 0) {
+               printf("\tFailed to get slave list for port = %d\n", port_id);
+               return;
+       }
+       if (num_slaves > 0) {
+               printf("\tSlaves (%d): [", num_slaves);
+               for (i = 0; i < num_slaves - 1; i++)
+                       printf("%d ", slaves[i]);
+
+               printf("%d]\n", slaves[num_slaves - 1]);
+       } else {
+               printf("\tSlaves: []\n");
+
+       }
+
+       num_active_slaves = rte_eth_bond_active_slaves_get(port_id, slaves,
+                       RTE_MAX_ETHPORTS);
+
+       if (num_active_slaves < 0) {
+               printf("\tFailed to get active slave list for port = %d\n", port_id);
+               return;
+       }
+       if (num_active_slaves > 0) {
+               printf("\tActive Slaves (%d): [", num_active_slaves);
+               for (i = 0; i < num_active_slaves - 1; i++)
+                       printf("%d ", slaves[i]);
+
+               printf("%d]\n", slaves[num_active_slaves - 1]);
+
+       } else {
+               printf("\tActive Slaves: []\n");
+
+       }
+
+       primary_id = rte_eth_bond_primary_get(port_id);
+       if (primary_id < 0) {
+               printf("\tFailed to get primary slave for port = %d\n", port_id);
+               return;
+       } else
+               printf("\tPrimary: [%d]\n", primary_id);
+
+}
+
+cmdline_parse_token_string_t cmd_showbonding_config_show =
+TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result,
+               show, "show");
+cmdline_parse_token_string_t cmd_showbonding_config_bonding =
+TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result,
+               bonding, "bonding");
+cmdline_parse_token_string_t cmd_showbonding_config_config =
+TOKEN_STRING_INITIALIZER(struct cmd_show_bonding_config_result,
+               config, "config");
+cmdline_parse_token_num_t cmd_showbonding_config_port =
+TOKEN_NUM_INITIALIZER(struct cmd_show_bonding_config_result,
+               port_id, UINT8);
+
+cmdline_parse_inst_t cmd_show_bonding_config = {
+               .f = cmd_show_bonding_config_parsed,
+               .help_str =     "show bonding config (port_id): Show the bonding config for port_id",
+               .data = NULL,
+               .tokens = {
+                               (void *)&cmd_showbonding_config_show,
+                               (void *)&cmd_showbonding_config_bonding,
+                               (void *)&cmd_showbonding_config_config,
+                               (void *)&cmd_showbonding_config_port,
+                               NULL
+               }
+};
+
+/* *** SET BONDING PRIMARY *** */
+struct cmd_set_bonding_primary_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t bonding;
+       cmdline_fixed_string_t primary;
+       uint8_t slave_id;
+       uint8_t port_id;
+};
+
+static void cmd_set_bonding_primary_parsed(void *parsed_result,
+               __attribute__((unused))  struct cmdline *cl,
+               __attribute__((unused)) void *data)
+{
+       struct cmd_set_bonding_primary_result *res = 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. */
+       if (0 != rte_eth_bond_primary_set(master_port_id, slave_port_id)) {
+               printf("\t Failed to set primary slave for port = %d.\n",
+                               master_port_id);
+               return;
+       }
+       init_port_config();
+}
+
+cmdline_parse_token_string_t cmd_setbonding_primary_set =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result,
+               set, "set");
+cmdline_parse_token_string_t cmd_setbonding_primary_bonding =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result,
+               bonding, "bonding");
+cmdline_parse_token_string_t cmd_setbonding_primary_primary =
+TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_primary_result,
+               primary, "primary");
+cmdline_parse_token_num_t cmd_setbonding_primary_slave =
+TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_primary_result,
+               slave_id, UINT8);
+cmdline_parse_token_num_t cmd_setbonding_primary_port =
+TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_primary_result,
+               port_id, UINT8);
+
+cmdline_parse_inst_t cmd_set_bonding_primary = {
+               .f = cmd_set_bonding_primary_parsed,
+               .help_str = "set bonding primary (slave_id) (port_id): Set the primary slave for port_id",
+               .data = NULL,
+               .tokens = {
+                               (void *)&cmd_setbonding_primary_set,
+                               (void *)&cmd_setbonding_primary_bonding,
+                               (void *)&cmd_setbonding_primary_primary,
+                               (void *)&cmd_setbonding_primary_slave,
+                               (void *)&cmd_setbonding_primary_port,
+                               NULL
+               }
+};
+
+/* *** ADD SLAVE *** */
+struct cmd_add_bonding_slave_result {
+       cmdline_fixed_string_t add;
+       cmdline_fixed_string_t bonding;
+       cmdline_fixed_string_t slave;
+       uint8_t slave_id;
+       uint8_t port_id;
+};
+
+static void cmd_add_bonding_slave_parsed(void *parsed_result,
+               __attribute__((unused))  struct cmdline *cl,
+               __attribute__((unused)) void *data)
+{
+       struct cmd_add_bonding_slave_result *res = 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. */
+       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);
+               return;
+       }
+       init_port_config();
+}
+
+cmdline_parse_token_string_t cmd_addbonding_slave_add =
+TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result,
+               add, "add");
+cmdline_parse_token_string_t cmd_addbonding_slave_bonding =
+TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result,
+               bonding, "bonding");
+cmdline_parse_token_string_t cmd_addbonding_slave_slave =
+TOKEN_STRING_INITIALIZER(struct cmd_add_bonding_slave_result,
+               slave, "slave");
+cmdline_parse_token_num_t cmd_addbonding_slave_slaveid =
+TOKEN_NUM_INITIALIZER(struct cmd_add_bonding_slave_result,
+               slave_id, UINT8);
+cmdline_parse_token_num_t cmd_addbonding_slave_port =
+TOKEN_NUM_INITIALIZER(struct cmd_add_bonding_slave_result,
+               port_id, UINT8);
+
+cmdline_parse_inst_t cmd_add_bonding_slave = {
+               .f = cmd_add_bonding_slave_parsed,
+               .help_str = "add bonding slave (slave_id) (port_id): Add a slave device to a bonded device",
+               .data = NULL,
+               .tokens = {
+                               (void *)&cmd_addbonding_slave_add,
+                               (void *)&cmd_addbonding_slave_bonding,
+                               (void *)&cmd_addbonding_slave_slave,
+                               (void *)&cmd_addbonding_slave_slaveid,
+                               (void *)&cmd_addbonding_slave_port,
+                               NULL
+               }
+};
+
+/* *** REMOVE SLAVE *** */
+struct cmd_remove_bonding_slave_result {
+       cmdline_fixed_string_t remove;
+       cmdline_fixed_string_t bonding;
+       cmdline_fixed_string_t slave;
+       uint8_t slave_id;
+       uint8_t port_id;
+};
+
+static void cmd_remove_bonding_slave_parsed(void *parsed_result,
+               __attribute__((unused))  struct cmdline *cl,
+               __attribute__((unused)) void *data)
+{
+       struct cmd_remove_bonding_slave_result *res = 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. */
+       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);
+               return;
+       }
+       init_port_config();
+}
+
+cmdline_parse_token_string_t cmd_removebonding_slave_remove =
+               TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result,
+                               remove, "remove");
+cmdline_parse_token_string_t cmd_removebonding_slave_bonding =
+               TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result,
+                               bonding, "bonding");
+cmdline_parse_token_string_t cmd_removebonding_slave_slave =
+               TOKEN_STRING_INITIALIZER(struct cmd_remove_bonding_slave_result,
+                               slave, "slave");
+cmdline_parse_token_num_t cmd_removebonding_slave_slaveid =
+               TOKEN_NUM_INITIALIZER(struct cmd_remove_bonding_slave_result,
+                               slave_id, UINT8);
+cmdline_parse_token_num_t cmd_removebonding_slave_port =
+               TOKEN_NUM_INITIALIZER(struct cmd_remove_bonding_slave_result,
+                               port_id, UINT8);
+
+cmdline_parse_inst_t cmd_remove_bonding_slave = {
+               .f = cmd_remove_bonding_slave_parsed,
+               .help_str = "remove bonding slave (slave_id) (port_id): Remove a slave device from a bonded device",
+               .data = NULL,
+               .tokens = {
+                               (void *)&cmd_removebonding_slave_remove,
+                               (void *)&cmd_removebonding_slave_bonding,
+                               (void *)&cmd_removebonding_slave_slave,
+                               (void *)&cmd_removebonding_slave_slaveid,
+                               (void *)&cmd_removebonding_slave_port,
+                               NULL
+               }
+};
+
+/* *** CREATE BONDED DEVICE *** */
+struct cmd_create_bonded_device_result {
+       cmdline_fixed_string_t create;
+       cmdline_fixed_string_t bonded;
+       cmdline_fixed_string_t device;
+       uint8_t mode;
+       uint8_t socket;
+};
+
+static int bond_dev_num = 0;
+
+static void cmd_create_bonded_device_parsed(void *parsed_result,
+               __attribute__((unused))  struct cmdline *cl,
+               __attribute__((unused)) void *data)
+{
+       struct cmd_create_bonded_device_result *res = parsed_result;
+       char ethdev_name[RTE_ETH_NAME_MAX_LEN];
+       int port_id;
+
+       if (test_done == 0) {
+               printf("Please stop forwarding first\n");
+               return;
+       }
+
+       snprintf(ethdev_name, RTE_ETH_NAME_MAX_LEN, "eth_bond_testpmd_%d",
+                       bond_dev_num++);
+
+       /* Create a new bonded device. */
+       port_id = rte_eth_bond_create(ethdev_name, res->mode, res->socket);
+       if (port_id < 0) {
+               printf("\t Failed to create bonded device.\n");
+               return;
+       } else {
+               printf("Created new bonded device %s on (port %d).\n", ethdev_name,
+                               port_id);
+
+               /* Update number of ports */
+               nb_ports = rte_eth_dev_count();
+               reconfig(port_id);
+               rte_eth_promiscuous_enable(port_id);
+       }
+
+}
+
+cmdline_parse_token_string_t cmd_createbonded_device_create =
+               TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result,
+                               create, "create");
+cmdline_parse_token_string_t cmd_createbonded_device_bonded =
+               TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result,
+                               bonded, "bonded");
+cmdline_parse_token_string_t cmd_createbonded_device_device =
+               TOKEN_STRING_INITIALIZER(struct cmd_create_bonded_device_result,
+                               device, "device");
+cmdline_parse_token_num_t cmd_createbonded_device_mode =
+               TOKEN_NUM_INITIALIZER(struct cmd_create_bonded_device_result,
+                               mode, UINT8);
+cmdline_parse_token_num_t cmd_createbonded_device_socket =
+               TOKEN_NUM_INITIALIZER(struct cmd_create_bonded_device_result,
+                               socket, UINT8);
+
+cmdline_parse_inst_t cmd_create_bonded_device = {
+               .f = cmd_create_bonded_device_parsed,
+               .help_str = "create bonded device (mode) (socket): Create a new bonded device with specific bonding mode and socket",
+               .data = NULL,
+               .tokens = {
+                               (void *)&cmd_createbonded_device_create,
+                               (void *)&cmd_createbonded_device_bonded,
+                               (void *)&cmd_createbonded_device_device,
+                               (void *)&cmd_createbonded_device_mode,
+                               (void *)&cmd_createbonded_device_socket,
+                               NULL
+               }
+};
+
+/* *** SET MAC ADDRESS IN BONDED DEVICE *** */
+struct cmd_set_bond_mac_addr_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t bonding;
+       cmdline_fixed_string_t mac_addr;
+       uint8_t port_num;
+       struct ether_addr address;
+};
+
+static void cmd_set_bond_mac_addr_parsed(void *parsed_result,
+               __attribute__((unused))  struct cmdline *cl,
+               __attribute__((unused)) void *data)
+{
+       struct cmd_set_bond_mac_addr_result *res = parsed_result;
+       int ret;
+
+       if (res->port_num >= nb_ports) {
+               printf("Port id %d must be less than %d\n", res->port_num, nb_ports);
+               return;
+       }
+
+       ret = rte_eth_bond_mac_address_set(res->port_num, &res->address);
+
+       /* check the return value and print it if is < 0 */
+       if (ret < 0)
+               printf("set_bond_mac_addr error: (%s)\n", strerror(-ret));
+}
+
+cmdline_parse_token_string_t cmd_set_bond_mac_addr_set =
+               TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, set, "set");
+cmdline_parse_token_string_t cmd_set_bond_mac_addr_bonding =
+               TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, bonding,
+                               "bonding");
+cmdline_parse_token_string_t cmd_set_bond_mac_addr_mac =
+               TOKEN_STRING_INITIALIZER(struct cmd_set_bond_mac_addr_result, mac_addr,
+                               "mac_addr");
+cmdline_parse_token_num_t cmd_set_bond_mac_addr_portnum =
+               TOKEN_NUM_INITIALIZER(struct cmd_set_bond_mac_addr_result, port_num, UINT8);
+cmdline_parse_token_etheraddr_t cmd_set_bond_mac_addr_addr =
+               TOKEN_ETHERADDR_INITIALIZER(struct cmd_set_bond_mac_addr_result, address);
+
+cmdline_parse_inst_t cmd_set_bond_mac_addr = {
+               .f = cmd_set_bond_mac_addr_parsed,
+               .data = (void *) 0,
+               .help_str = "set bonding mac_addr (port_id) (address): ",
+               .tokens = {
+                               (void *)&cmd_set_bond_mac_addr_set,
+                               (void *)&cmd_set_bond_mac_addr_bonding,
+                               (void *)&cmd_set_bond_mac_addr_mac,
+                               (void *)&cmd_set_bond_mac_addr_portnum,
+                               (void *)&cmd_set_bond_mac_addr_addr,
+                               NULL
+               }
+};
+
+#endif /* RTE_LIBRTE_PMD_BOND */
+
 /* *** SET FORWARDING MODE *** */
 struct cmd_set_fwd_mode_result {
        cmdline_fixed_string_t set;
@@ -5808,7 +6476,6 @@ dump_struct_sizes(void)
 #define DUMP_SIZE(t) printf("sizeof(" #t ") = %u\n", (unsigned)sizeof(t));
        DUMP_SIZE(struct rte_mbuf);
        DUMP_SIZE(struct rte_pktmbuf);
-       DUMP_SIZE(struct rte_ctrlmbuf);
        DUMP_SIZE(struct rte_mempool);
        DUMP_SIZE(struct rte_ring);
 #undef DUMP_SIZE
@@ -6767,6 +7434,16 @@ cmdline_parse_ctx_t main_ctx[] = {
        (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,
+       (cmdline_parse_inst_t *) &cmd_set_bonding_primary,
+       (cmdline_parse_inst_t *) &cmd_add_bonding_slave,
+       (cmdline_parse_inst_t *) &cmd_remove_bonding_slave,
+       (cmdline_parse_inst_t *) &cmd_create_bonded_device,
+       (cmdline_parse_inst_t *) &cmd_set_bond_mac_addr,
+       (cmdline_parse_inst_t *) &cmd_set_balance_xmit_policy,
 #endif
        (cmdline_parse_inst_t *)&cmd_vlan_offload,
        (cmdline_parse_inst_t *)&cmd_vlan_tpid,
@@ -6814,6 +7491,7 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_config_max_pkt_len,
        (cmdline_parse_inst_t *)&cmd_config_rx_mode_flag,
        (cmdline_parse_inst_t *)&cmd_config_rss,
+       (cmdline_parse_inst_t *)&cmd_config_rxtx_queue,
        (cmdline_parse_inst_t *)&cmd_config_rss_reta,
        (cmdline_parse_inst_t *)&cmd_showport_reta,
        (cmdline_parse_inst_t *)&cmd_config_burst,