app/testpmd: new parameter for port config all RSS command
[dpdk.git] / app / test-pmd / cmdline.c
index 6b42702..2a10278 100644 (file)
@@ -1,35 +1,6 @@
-/*-
- *   BSD LICENSE
- *
- *   Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
- *   Copyright(c) 2014 6WIND S.A.
- *   All rights reserved.
- *
- *   Redistribution and use in source and binary forms, with or without
- *   modification, are permitted provided that the following conditions
- *   are met:
- *
- *     * Redistributions of source code must retain the above copyright
- *       notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above copyright
- *       notice, this list of conditions and the following disclaimer in
- *       the documentation and/or other materials provided with the
- *       distribution.
- *     * Neither the name of Intel Corporation nor the names of its
- *       contributors may be used to endorse or promote products derived
- *       from this software without specific prior written permission.
- *
- *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2016 Intel Corporation.
+ * Copyright(c) 2014 6WIND S.A.
  */
 
 #include <stdarg.h>
@@ -89,7 +60,7 @@
 #include <rte_eth_bond.h>
 #include <rte_eth_bond_8023ad.h>
 #endif
-#ifdef RTE_LIBRTE_DPAA_PMD
+#if defined RTE_LIBRTE_DPAA_BUS && defined RTE_LIBRTE_DPAA_PMD
 #include <rte_pmd_dpaa.h>
 #endif
 #ifdef RTE_LIBRTE_IXGBE_PMD
@@ -274,6 +245,9 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "set verbose (level)\n"
                        "    Set the debug verbosity level X.\n\n"
 
+                       "set log global|(type) (level)\n"
+                       "    Set the log level.\n\n"
+
                        "set nbport (num)\n"
                        "    Set number of ports.\n\n"
 
@@ -671,10 +645,10 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "       Set default traffic Management hierarchy on a port\n\n"
 
 #endif
-                       "ddp add (port_id) (profile_path[,output_path])\n"
+                       "ddp add (port_id) (profile_path[,backup_profile_path])\n"
                        "    Load a profile package on a port\n\n"
 
-                       "ddp del (port_id) (profile_path)\n"
+                       "ddp del (port_id) (backup_profile_path)\n"
                        "    Delete a profile package from a port\n\n"
 
                        "ptype mapping get (port_id) (valid_only)\n"
@@ -832,6 +806,9 @@ static void cmd_help_long_parsed(void *parsed_result,
                        " duplex (half|full|auto)\n"
                        "    Set speed and duplex for all ports or port_id\n\n"
 
+                       "port config (port_id|all) loopback (mode)\n"
+                       "    Set loopback mode for all ports or port_id\n\n"
+
                        "port config all (rxq|txq|rxd|txd) (value)\n"
                        "    Set number for rxq/txq/rxd/txd.\n\n"
 
@@ -844,8 +821,8 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "    Set crc-strip/scatter/rx-checksum/hardware-vlan/drop_en"
                        " for ports.\n\n"
 
-                       "port config all rss (all|ip|tcp|udp|sctp|ether|port|vxlan|"
-                       "geneve|nvgre|none|<flowtype_id>)\n"
+                       "port config all rss (all|default|ip|tcp|udp|sctp|"
+                       "ether|port|vxlan|geneve|nvgre|none|<flowtype_id>)\n"
                        "    Set the RSS mode.\n\n"
 
                        "port config port-id rss reta (hash,queue)[,(hash,queue)]\n"
@@ -1513,6 +1490,122 @@ cmdline_parse_inst_t cmd_config_speed_specific = {
        },
 };
 
+/* *** configure loopback for all ports *** */
+struct cmd_config_loopback_all {
+       cmdline_fixed_string_t port;
+       cmdline_fixed_string_t keyword;
+       cmdline_fixed_string_t all;
+       cmdline_fixed_string_t item;
+       uint32_t mode;
+};
+
+static void
+cmd_config_loopback_all_parsed(void *parsed_result,
+                       __attribute__((unused)) struct cmdline *cl,
+                       __attribute__((unused)) void *data)
+{
+       struct cmd_config_loopback_all *res = parsed_result;
+       portid_t pid;
+
+       if (!all_ports_stopped()) {
+               printf("Please stop all ports first\n");
+               return;
+       }
+
+       RTE_ETH_FOREACH_DEV(pid) {
+               ports[pid].dev_conf.lpbk_mode = res->mode;
+       }
+
+       cmd_reconfig_device_queue(RTE_PORT_ALL, 1, 1);
+}
+
+cmdline_parse_token_string_t cmd_config_loopback_all_port =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_all, port, "port");
+cmdline_parse_token_string_t cmd_config_loopback_all_keyword =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_all, keyword,
+                                                       "config");
+cmdline_parse_token_string_t cmd_config_loopback_all_all =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_all, all, "all");
+cmdline_parse_token_string_t cmd_config_loopback_all_item =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_all, item,
+                                                       "loopback");
+cmdline_parse_token_num_t cmd_config_loopback_all_mode =
+       TOKEN_NUM_INITIALIZER(struct cmd_config_loopback_all, mode, UINT32);
+
+cmdline_parse_inst_t cmd_config_loopback_all = {
+       .f = cmd_config_loopback_all_parsed,
+       .data = NULL,
+       .help_str = "port config all loopback <mode>",
+       .tokens = {
+               (void *)&cmd_config_loopback_all_port,
+               (void *)&cmd_config_loopback_all_keyword,
+               (void *)&cmd_config_loopback_all_all,
+               (void *)&cmd_config_loopback_all_item,
+               (void *)&cmd_config_loopback_all_mode,
+               NULL,
+       },
+};
+
+/* *** configure loopback for specific port *** */
+struct cmd_config_loopback_specific {
+       cmdline_fixed_string_t port;
+       cmdline_fixed_string_t keyword;
+       uint16_t port_id;
+       cmdline_fixed_string_t item;
+       uint32_t mode;
+};
+
+static void
+cmd_config_loopback_specific_parsed(void *parsed_result,
+                               __attribute__((unused)) struct cmdline *cl,
+                               __attribute__((unused)) void *data)
+{
+       struct cmd_config_loopback_specific *res = parsed_result;
+
+       if (port_id_is_invalid(res->port_id, ENABLED_WARN))
+               return;
+
+       if (!port_is_stopped(res->port_id)) {
+               printf("Please stop port %u first\n", res->port_id);
+               return;
+       }
+
+       ports[res->port_id].dev_conf.lpbk_mode = res->mode;
+
+       cmd_reconfig_device_queue(res->port_id, 1, 1);
+}
+
+
+cmdline_parse_token_string_t cmd_config_loopback_specific_port =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_specific, port,
+                                                               "port");
+cmdline_parse_token_string_t cmd_config_loopback_specific_keyword =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_specific, keyword,
+                                                               "config");
+cmdline_parse_token_num_t cmd_config_loopback_specific_id =
+       TOKEN_NUM_INITIALIZER(struct cmd_config_loopback_specific, port_id,
+                                                               UINT16);
+cmdline_parse_token_string_t cmd_config_loopback_specific_item =
+       TOKEN_STRING_INITIALIZER(struct cmd_config_loopback_specific, item,
+                                                               "loopback");
+cmdline_parse_token_num_t cmd_config_loopback_specific_mode =
+       TOKEN_NUM_INITIALIZER(struct cmd_config_loopback_specific, mode,
+                             UINT32);
+
+cmdline_parse_inst_t cmd_config_loopback_specific = {
+       .f = cmd_config_loopback_specific_parsed,
+       .data = NULL,
+       .help_str = "port config <port_id> loopback <mode>",
+       .tokens = {
+               (void *)&cmd_config_loopback_specific_port,
+               (void *)&cmd_config_loopback_specific_keyword,
+               (void *)&cmd_config_loopback_specific_id,
+               (void *)&cmd_config_loopback_specific_item,
+               (void *)&cmd_config_loopback_specific_mode,
+               NULL,
+       },
+};
+
 /* *** configure txq/rxq, txd/rxd *** */
 struct cmd_config_rx_tx {
        cmdline_fixed_string_t port;
@@ -1905,8 +1998,9 @@ cmd_config_rss_parsed(void *parsed_result,
 {
        struct cmd_config_rss *res = parsed_result;
        struct rte_eth_rss_conf rss_conf = { .rss_key_len = 0, };
+       struct rte_eth_dev_info dev_info = { .flow_type_rss_offloads = 0, };
        int diag;
-       uint8_t i;
+       uint16_t i;
 
        if (!strcmp(res->value, "all"))
                rss_conf.rss_hf = ETH_RSS_IP | ETH_RSS_TCP |
@@ -1930,7 +2024,7 @@ 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, "none"))
+       else if (!strcmp(res->value, "none") || !strcmp(res->value, "default"))
                rss_conf.rss_hf = 0;
        else if (isdigit(res->value[0]) && atoi(res->value) > 0 &&
                                                atoi(res->value) < 64)
@@ -1940,7 +2034,13 @@ cmd_config_rss_parsed(void *parsed_result,
                return;
        }
        rss_conf.rss_key = NULL;
-       for (i = 0; i < rte_eth_dev_count(); i++) {
+       /* Update global configuration for RSS types. */
+       rss_hf = rss_conf.rss_hf;
+       RTE_ETH_FOREACH_DEV(i) {
+               if (!strcmp(res->value, "default")) {
+                       rte_eth_dev_info_get(i, &dev_info);
+                       rss_conf.rss_hf = dev_info.flow_type_rss_offloads;
+               }
                diag = rte_eth_dev_rss_hash_update(i, &rss_conf);
                if (diag < 0)
                        printf("Configuration of RSS hash at ethernet port %d "
@@ -1964,7 +2064,7 @@ cmdline_parse_inst_t cmd_config_rss = {
        .f = cmd_config_rss_parsed,
        .data = NULL,
        .help_str = "port config all rss "
-               "all|ip|tcp|udp|sctp|ether|port|vxlan|geneve|nvgre|none|<flowtype_id>",
+               "all|default|ip|tcp|udp|sctp|ether|port|vxlan|geneve|nvgre|none|<flowtype_id>",
        .tokens = {
                (void *)&cmd_config_rss_port,
                (void *)&cmd_config_rss_keyword,
@@ -2625,6 +2725,8 @@ cmd_config_burst_parsed(void *parsed_result,
                        __attribute__((unused)) void *data)
 {
        struct cmd_config_burst *res = parsed_result;
+       struct rte_eth_dev_info dev_info;
+       uint16_t rec_nb_pkts;
 
        if (!all_ports_stopped()) {
                printf("Please stop all ports first\n");
@@ -2632,11 +2734,34 @@ cmd_config_burst_parsed(void *parsed_result,
        }
 
        if (!strcmp(res->name, "burst")) {
-               if (res->value < 1 || res->value > MAX_PKT_BURST) {
+               if (res->value == 0) {
+                       /* If user gives a value of zero, query the PMD for
+                        * its recommended Rx burst size. Testpmd uses a single
+                        * 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);
+                       rec_nb_pkts = dev_info.default_rxportconf.burst_size;
+
+                       if (rec_nb_pkts == 0) {
+                               printf("PMD does not recommend a burst size.\n"
+                                       "User provided value must be between"
+                                       " 1 and %d\n", MAX_PKT_BURST);
+                               return;
+                       } else if (rec_nb_pkts > MAX_PKT_BURST) {
+                               printf("PMD recommended burst size of %d"
+                                       " exceeds maximum value of %d\n",
+                                       rec_nb_pkts, MAX_PKT_BURST);
+                               return;
+                       }
+                       printf("Using PMD-provided burst value of %d\n",
+                               rec_nb_pkts);
+                       nb_pkt_per_burst = rec_nb_pkts;
+               } else if (res->value > MAX_PKT_BURST) {
                        printf("burst must be >= 1 && <= %d\n", MAX_PKT_BURST);
                        return;
-               }
-               nb_pkt_per_burst = res->value;
+               } else
+                       nb_pkt_per_burst = res->value;
        } else {
                printf("Unknown parameter\n");
                return;
@@ -3055,6 +3180,55 @@ cmdline_parse_inst_t cmd_set_numbers = {
        },
 };
 
+/* *** SET LOG LEVEL CONFIGURATION *** */
+
+struct cmd_set_log_result {
+       cmdline_fixed_string_t set;
+       cmdline_fixed_string_t log;
+       cmdline_fixed_string_t type;
+       uint32_t level;
+};
+
+static void
+cmd_set_log_parsed(void *parsed_result,
+                  __attribute__((unused)) struct cmdline *cl,
+                  __attribute__((unused)) void *data)
+{
+       struct cmd_set_log_result *res;
+       int ret;
+
+       res = parsed_result;
+       if (!strcmp(res->type, "global"))
+               rte_log_set_global_level(res->level);
+       else {
+               ret = rte_log_set_level_regexp(res->type, res->level);
+               if (ret < 0)
+                       printf("Unable to set log level\n");
+       }
+}
+
+cmdline_parse_token_string_t cmd_set_log_set =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_log_result, set, "set");
+cmdline_parse_token_string_t cmd_set_log_log =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_log_result, log, "log");
+cmdline_parse_token_string_t cmd_set_log_type =
+       TOKEN_STRING_INITIALIZER(struct cmd_set_log_result, type, NULL);
+cmdline_parse_token_num_t cmd_set_log_level =
+       TOKEN_NUM_INITIALIZER(struct cmd_set_log_result, level, UINT32);
+
+cmdline_parse_inst_t cmd_set_log = {
+       .f = cmd_set_log_parsed,
+       .data = NULL,
+       .help_str = "set log global|<type> <level>",
+       .tokens = {
+               (void *)&cmd_set_log_set,
+               (void *)&cmd_set_log_log,
+               (void *)&cmd_set_log_type,
+               (void *)&cmd_set_log_level,
+               NULL,
+       },
+};
+
 /* *** SET SEGMENT LENGTHS OF TXONLY PACKETS *** */
 
 struct cmd_set_txpkts_result {
@@ -5379,7 +5553,7 @@ static void cmd_create_bonded_device_parsed(void *parsed_result,
                                port_id);
 
                /* Update number of ports */
-               nb_ports = rte_eth_dev_count();
+               nb_ports = rte_eth_dev_count_avail();
                reconfig(port_id, res->socket);
                rte_eth_promiscuous_enable(port_id);
        }
@@ -5488,11 +5662,6 @@ static void cmd_set_bond_mon_period_parsed(void *parsed_result,
        struct cmd_set_bond_mon_period_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_link_monitoring_set(res->port_num, res->period_ms);
 
        /* check the return value and print it if is < 0 */
@@ -5549,12 +5718,6 @@ cmd_set_bonding_agg_mode(void *parsed_result,
        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"))
@@ -8598,7 +8761,7 @@ static void cmd_dump_parsed(void *parsed_result,
        else if (!strcmp(res->dump, "dump_mempool"))
                rte_mempool_list_dump(stdout);
        else if (!strcmp(res->dump, "dump_devargs"))
-               rte_eal_devargs_dump(stdout);
+               rte_devargs_dump(stdout);
        else if (!strcmp(res->dump, "dump_log_types"))
                rte_log_dump(stdout);
 }
@@ -9877,11 +10040,11 @@ struct cmd_flow_director_result {
        uint16_t port_dst;
        cmdline_fixed_string_t verify_tag;
        uint32_t verify_tag_value;
-       cmdline_ipaddr_t tos;
+       cmdline_fixed_string_t tos;
        uint8_t tos_value;
-       cmdline_ipaddr_t proto;
+       cmdline_fixed_string_t proto;
        uint8_t proto_value;
-       cmdline_ipaddr_t ttl;
+       cmdline_fixed_string_t ttl;
        uint8_t ttl_value;
        cmdline_fixed_string_t vlan;
        uint16_t vlan_value;
@@ -10492,7 +10655,7 @@ cmdline_parse_inst_t cmd_add_del_sctp_flow_director = {
                (void *)&cmd_flow_director_flow_type,
                (void *)&cmd_flow_director_src,
                (void *)&cmd_flow_director_ip_src,
-               (void *)&cmd_flow_director_port_dst,
+               (void *)&cmd_flow_director_port_src,
                (void *)&cmd_flow_director_dst,
                (void *)&cmd_flow_director_ip_dst,
                (void *)&cmd_flow_director_port_dst,
@@ -10702,11 +10865,6 @@ cmd_flow_director_mask_parsed(void *parsed_result,
        struct rte_eth_fdir_masks *mask;
        struct rte_port *port;
 
-       if (res->port_id > nb_ports) {
-               printf("Invalid port, range is [0, %d]\n", nb_ports - 1);
-               return;
-       }
-
        port = &ports[res->port_id];
        /** Check if the port is not started **/
        if (port->port_status != RTE_PORT_STOPPED) {
@@ -10903,11 +11061,6 @@ cmd_flow_director_flex_mask_parsed(void *parsed_result,
        uint16_t i;
        int ret;
 
-       if (res->port_id > nb_ports) {
-               printf("Invalid port, range is [0, %d]\n", nb_ports - 1);
-               return;
-       }
-
        port = &ports[res->port_id];
        /** Check if the port is not started **/
        if (port->port_status != RTE_PORT_STOPPED) {
@@ -11059,11 +11212,6 @@ cmd_flow_director_flxpld_parsed(void *parsed_result,
        struct rte_port *port;
        int ret = 0;
 
-       if (res->port_id > nb_ports) {
-               printf("Invalid port, range is [0, %d]\n", nb_ports - 1);
-               return;
-       }
-
        port = &ports[res->port_id];
        /** Check if the port is not started **/
        if (port->port_status != RTE_PORT_STOPPED) {
@@ -12838,7 +12986,7 @@ cmd_set_tx_loopback_parsed(
        if (ret == -ENOTSUP)
                ret = rte_pmd_bnxt_set_tx_loopback(res->port_id, is_on);
 #endif
-#ifdef RTE_LIBRTE_DPAA_PMD
+#if defined RTE_LIBRTE_DPAA_BUS && defined RTE_LIBRTE_DPAA_PMD
        if (ret == -ENOTSUP)
                ret = rte_pmd_dpaa_set_tx_loopback(res->port_id, is_on);
 #endif
@@ -14444,11 +14592,6 @@ cmd_ddp_add_parsed(
        int file_num;
        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;
@@ -14488,7 +14631,7 @@ cmd_ddp_add_parsed(
 cmdline_parse_inst_t cmd_ddp_add = {
        .f = cmd_ddp_add_parsed,
        .data = NULL,
-       .help_str = "ddp add <port_id> <profile_path[,output_path]>",
+       .help_str = "ddp add <port_id> <profile_path[,backup_profile_path]>",
        .tokens = {
                (void *)&cmd_ddp_add_ddp,
                (void *)&cmd_ddp_add_add,
@@ -14526,11 +14669,6 @@ cmd_ddp_del_parsed(
        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;
@@ -14558,7 +14696,7 @@ cmd_ddp_del_parsed(
 cmdline_parse_inst_t cmd_ddp_del = {
        .f = cmd_ddp_del_parsed,
        .data = NULL,
-       .help_str = "ddp del <port_id> <profile_path>",
+       .help_str = "ddp del <port_id> <backup_profile_path>",
        .tokens = {
                (void *)&cmd_ddp_del_ddp,
                (void *)&cmd_ddp_del_del,
@@ -14827,12 +14965,12 @@ cmdline_parse_token_num_t cmd_ddp_get_list_port_id =
 
 static void
 cmd_ddp_get_list_parsed(
-       void *parsed_result,
+       __attribute__((unused)) void *parsed_result,
        __attribute__((unused)) struct cmdline *cl,
        __attribute__((unused)) void *data)
 {
-       struct cmd_ddp_get_list_result *res = parsed_result;
 #ifdef RTE_LIBRTE_I40E_PMD
+       struct cmd_ddp_get_list_result *res = parsed_result;
        struct rte_pmd_i40e_profile_list *p_list;
        struct rte_pmd_i40e_profile_info *p_info;
        uint32_t p_num;
@@ -14841,11 +14979,6 @@ cmd_ddp_get_list_parsed(
 #endif
        int ret = -ENOTSUP;
 
-       if (res->port_id > nb_ports) {
-               printf("Invalid port, range is [0, %d]\n", nb_ports - 1);
-               return;
-       }
-
 #ifdef RTE_LIBRTE_I40E_PMD
        size = PROFILE_INFO_SIZE * MAX_PROFILE_NUM + 4;
        p_list = (struct rte_pmd_i40e_profile_list *)malloc(size);
@@ -14908,22 +15041,17 @@ struct cmd_cfg_input_set_result {
 
 static void
 cmd_cfg_input_set_parsed(
-       void *parsed_result,
+       __attribute__((unused)) void *parsed_result,
        __attribute__((unused)) struct cmdline *cl,
        __attribute__((unused)) void *data)
 {
-       struct cmd_cfg_input_set_result *res = parsed_result;
 #ifdef RTE_LIBRTE_I40E_PMD
+       struct cmd_cfg_input_set_result *res = parsed_result;
        enum rte_pmd_i40e_inset_type inset_type = INSET_NONE;
        struct rte_pmd_i40e_inset inset;
 #endif
        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;
@@ -15036,22 +15164,17 @@ struct cmd_clear_input_set_result {
 
 static void
 cmd_clear_input_set_parsed(
-       void *parsed_result,
+       __attribute__((unused)) void *parsed_result,
        __attribute__((unused)) struct cmdline *cl,
        __attribute__((unused)) void *data)
 {
-       struct cmd_clear_input_set_result *res = parsed_result;
 #ifdef RTE_LIBRTE_I40E_PMD
+       struct cmd_clear_input_set_result *res = parsed_result;
        enum rte_pmd_i40e_inset_type inset_type = INSET_NONE;
        struct rte_pmd_i40e_inset inset;
 #endif
        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;
@@ -16026,6 +16149,7 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_set_link_down,
        (cmdline_parse_inst_t *)&cmd_reset,
        (cmdline_parse_inst_t *)&cmd_set_numbers,
+       (cmdline_parse_inst_t *)&cmd_set_log,
        (cmdline_parse_inst_t *)&cmd_set_txpkts,
        (cmdline_parse_inst_t *)&cmd_set_txsplit,
        (cmdline_parse_inst_t *)&cmd_set_fwd_list,
@@ -16106,6 +16230,8 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_operate_detach_port,
        (cmdline_parse_inst_t *)&cmd_config_speed_all,
        (cmdline_parse_inst_t *)&cmd_config_speed_specific,
+       (cmdline_parse_inst_t *)&cmd_config_loopback_all,
+       (cmdline_parse_inst_t *)&cmd_config_loopback_specific,
        (cmdline_parse_inst_t *)&cmd_config_rx_tx,
        (cmdline_parse_inst_t *)&cmd_config_mtu,
        (cmdline_parse_inst_t *)&cmd_config_max_pkt_len,