app/testpmd: fix crash on port reset
[dpdk.git] / app / test-pmd / cmdline.c
index 1fb6099..def471d 100644 (file)
@@ -101,6 +101,7 @@ static void cmd_help_brief_parsed(__attribute__((unused)) void *parsed_result,
                "    help registers                  : Reading and setting port registers.\n"
                "    help filters                    : Filters configuration help.\n"
                "    help traffic_management         : Traffic Management commmands.\n"
+               "    help devices                    : Device related cmds.\n"
                "    help all                        : All of the above sections.\n\n"
        );
 
@@ -236,6 +237,9 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "show port (port_id) tx_metadata\n"
                        "    Show Tx metadata value set"
                        " for a specific port\n\n"
+
+                       "show device info (<identifier>|all)"
+                       "       Show general information about devices probed.\n\n"
                );
        }
 
@@ -733,33 +737,6 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "show port (port_id) queue-region\n"
                        "    show all queue region related configuration info\n\n"
 
-                       "vxlan ip-version (ipv4|ipv6) vni (vni) udp-src"
-                       " (udp-src) udp-dst (udp-dst) ip-src (ip-src) ip-dst"
-                       " (ip-dst) eth-src (eth-src) eth-dst (eth-dst)\n"
-                       "       Configure the VXLAN encapsulation for flows.\n\n"
-
-                       "vxlan-with-vlan ip-version (ipv4|ipv6) vni (vni)"
-                       " udp-src (udp-src) udp-dst (udp-dst) ip-src (ip-src)"
-                       " ip-dst (ip-dst) vlan-tci (vlan-tci) eth-src (eth-src)"
-                       " eth-dst (eth-dst)\n"
-                       "       Configure the VXLAN encapsulation for flows.\n\n"
-
-                       "vxlan-tos-ttl ip-version (ipv4|ipv6) vni (vni) udp-src"
-                       " (udp-src) udp-dst (udp-dst) ip-tos (ip-tos) ip-ttl (ip-ttl)"
-                       " ip-src (ip-src) ip-dst (ip-dst) eth-src (eth-src)"
-                       " eth-dst (eth-dst)\n"
-                       "       Configure the VXLAN encapsulation for flows.\n\n"
-
-                       "nvgre ip-version (ipv4|ipv6) tni (tni) ip-src"
-                       " (ip-src) ip-dst (ip-dst) eth-src (eth-src) eth-dst"
-                       " (eth-dst)\n"
-                       "       Configure the NVGRE encapsulation for flows.\n\n"
-
-                       "nvgre-with-vlan ip-version (ipv4|ipv6) tni (tni)"
-                       " ip-src (ip-src) ip-dst (ip-dst) vlan-tci (vlan-tci)"
-                       " eth-src (eth-src) eth-dst (eth-dst)\n"
-                       "       Configure the NVGRE encapsulation for flows.\n\n"
-
                        , list_pkt_forwarding_modes()
                );
        }
@@ -781,6 +758,9 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "port close (port_id|all)\n"
                        "    Close all ports or port_id.\n\n"
 
+                       "port reset (port_id|all)\n"
+                       "    Reset all ports or port_id.\n\n"
+
                        "port attach (ident)\n"
                        "    Attach physical or virtual dev by pci address or virtual device name\n\n"
 
@@ -801,11 +781,9 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "port config all max-pkt-len (value)\n"
                        "    Set the max packet length.\n\n"
 
-                       "port config all (crc-strip|scatter|rx-cksum|rx-timestamp|hw-vlan|hw-vlan-filter|"
-                       "hw-vlan-strip|hw-vlan-extend|drop-en)"
-                       " (on|off)\n"
-                       "    Set crc-strip/scatter/rx-checksum/hardware-vlan/drop_en"
-                       " for ports.\n\n"
+                       "port config all drop-en (on|off)\n"
+                       "    Enable or disable packet drop on all RX queues of all ports when no "
+                       "receive buffers available.\n\n"
 
                        "port config all rss (all|default|ip|tcp|udp|sctp|"
                        "ether|port|vxlan|geneve|nvgre|vxlan-gpe|none|<flowtype_id>)\n"
@@ -1137,6 +1115,40 @@ static void cmd_help_long_parsed(void *parsed_result,
                        "flow isolate {port_id} {boolean}\n"
                        "    Restrict ingress traffic to the defined"
                        " flow rules\n\n"
+
+                       "set vxlan ip-version (ipv4|ipv6) vni (vni) udp-src"
+                       " (udp-src) udp-dst (udp-dst) ip-src (ip-src) ip-dst"
+                       " (ip-dst) eth-src (eth-src) eth-dst (eth-dst)\n"
+                       "       Configure the VXLAN encapsulation for flows.\n\n"
+
+                       "set vxlan-with-vlan ip-version (ipv4|ipv6) vni (vni)"
+                       " udp-src (udp-src) udp-dst (udp-dst) ip-src (ip-src)"
+                       " ip-dst (ip-dst) vlan-tci (vlan-tci) eth-src (eth-src)"
+                       " eth-dst (eth-dst)\n"
+                       "       Configure the VXLAN encapsulation for flows.\n\n"
+
+                       "set vxlan-tos-ttl ip-version (ipv4|ipv6) vni (vni) udp-src"
+                       " (udp-src) udp-dst (udp-dst) ip-tos (ip-tos) ip-ttl (ip-ttl)"
+                       " ip-src (ip-src) ip-dst (ip-dst) eth-src (eth-src)"
+                       " eth-dst (eth-dst)\n"
+                       "       Configure the VXLAN encapsulation for flows.\n\n"
+
+                       "set nvgre ip-version (ipv4|ipv6) tni (tni) ip-src"
+                       " (ip-src) ip-dst (ip-dst) eth-src (eth-src) eth-dst"
+                       " (eth-dst)\n"
+                       "       Configure the NVGRE encapsulation for flows.\n\n"
+
+                       "set nvgre-with-vlan ip-version (ipv4|ipv6) tni (tni)"
+                       " ip-src (ip-src) ip-dst (ip-dst) vlan-tci (vlan-tci)"
+                       " eth-src (eth-src) eth-dst (eth-dst)\n"
+                       "       Configure the NVGRE encapsulation for flows.\n\n"
+
+                       "set raw_encap {flow items}\n"
+                       "       Configure the encapsulation with raw data.\n\n"
+
+                       "set raw_decap {flow items}\n"
+                       "       Configure the decapsulation with raw data.\n\n"
+
                );
        }
 
@@ -1240,6 +1252,17 @@ static void cmd_help_long_parsed(void *parsed_result,
                );
        }
 
+       if (show_all || !strcmp(res->section, "devices")) {
+               cmdline_printf(
+                       cl,
+                       "\n"
+                       "Device Operations:\n"
+                       "--------------\n"
+                       "device detach (identifier)\n"
+                       "       Detach device by identifier.\n\n"
+               );
+       }
+
 }
 
 cmdline_parse_token_string_t cmd_help_long_help =
@@ -1248,13 +1271,13 @@ cmdline_parse_token_string_t cmd_help_long_help =
 cmdline_parse_token_string_t cmd_help_long_section =
        TOKEN_STRING_INITIALIZER(struct cmd_help_long_result, section,
                        "all#control#display#config#"
-                       "ports#registers#filters#traffic_management");
+                       "ports#registers#filters#traffic_management#devices");
 
 cmdline_parse_inst_t cmd_help_long = {
        .f = cmd_help_long_parsed,
        .data = NULL,
        .help_str = "help all|control|display|config|ports|register|"
-               "filters|traffic_management: "
+               "filters|traffic_management|devices: "
                "Show help",
        .tokens = {
                (void *)&cmd_help_long_help,
@@ -1493,6 +1516,47 @@ cmdline_parse_inst_t cmd_operate_detach_port = {
        },
 };
 
+/* *** detach device by identifier *** */
+struct cmd_operate_detach_device_result {
+       cmdline_fixed_string_t device;
+       cmdline_fixed_string_t keyword;
+       cmdline_fixed_string_t identifier;
+};
+
+static void cmd_operate_detach_device_parsed(void *parsed_result,
+                               __attribute__((unused)) struct cmdline *cl,
+                               __attribute__((unused)) void *data)
+{
+       struct cmd_operate_detach_device_result *res = parsed_result;
+
+       if (!strcmp(res->keyword, "detach"))
+               detach_device(res->identifier);
+       else
+               printf("Unknown parameter\n");
+}
+
+cmdline_parse_token_string_t cmd_operate_detach_device_device =
+       TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_device_result,
+                       device, "device");
+cmdline_parse_token_string_t cmd_operate_detach_device_keyword =
+       TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_device_result,
+                       keyword, "detach");
+cmdline_parse_token_string_t cmd_operate_detach_device_identifier =
+       TOKEN_STRING_INITIALIZER(struct cmd_operate_detach_device_result,
+                       identifier, NULL);
+
+cmdline_parse_inst_t cmd_operate_detach_device = {
+       .f = cmd_operate_detach_device_parsed,
+       .data = NULL,
+       .help_str = "device detach <identifier>:"
+               "(identifier: pci address or virtual dev name)",
+       .tokens = {
+               (void *)&cmd_operate_detach_device_device,
+               (void *)&cmd_operate_detach_device_keyword,
+               (void *)&cmd_operate_detach_device_identifier,
+               NULL,
+       },
+};
 /* *** configure speed for all ports *** */
 struct cmd_config_speed_all {
        cmdline_fixed_string_t port;
@@ -1925,16 +1989,16 @@ cmd_config_max_pkt_len_parsed(void *parsed_result,
                uint64_t rx_offloads = port->dev_conf.rxmode.offloads;
 
                if (!strcmp(res->name, "max-pkt-len")) {
-                       if (res->value < ETHER_MIN_LEN) {
+                       if (res->value < RTE_ETHER_MIN_LEN) {
                                printf("max-pkt-len can not be less than %d\n",
-                                               ETHER_MIN_LEN);
+                                               RTE_ETHER_MIN_LEN);
                                return;
                        }
                        if (res->value == port->dev_conf.rxmode.max_rx_pkt_len)
                                return;
 
                        port->dev_conf.rxmode.max_rx_pkt_len = res->value;
-                       if (res->value > ETHER_MAX_LEN)
+                       if (res->value > RTE_ETHER_MAX_LEN)
                                rx_offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
                        else
                                rx_offloads &= ~DEV_RX_OFFLOAD_JUMBO_FRAME;
@@ -1996,8 +2060,8 @@ cmd_config_mtu_parsed(void *parsed_result,
 {
        struct cmd_config_mtu_result *res = parsed_result;
 
-       if (res->value < ETHER_MIN_LEN) {
-               printf("mtu cannot be less than %d\n", ETHER_MIN_LEN);
+       if (res->value < RTE_ETHER_MIN_LEN) {
+               printf("mtu cannot be less than %d\n", RTE_ETHER_MIN_LEN);
                return;
        }
        port_mtu_set(res->port_id, res->value);
@@ -2046,107 +2110,24 @@ cmd_config_rx_mode_flag_parsed(void *parsed_result,
                                __attribute__((unused)) void *data)
 {
        struct cmd_config_rx_mode_flag *res = parsed_result;
-       portid_t pid;
 
        if (!all_ports_stopped()) {
                printf("Please stop all ports first\n");
                return;
        }
 
-       RTE_ETH_FOREACH_DEV(pid) {
-               struct rte_port *port;
-               uint64_t rx_offloads;
-
-               port = &ports[pid];
-               rx_offloads = port->dev_conf.rxmode.offloads;
-               if (!strcmp(res->name, "crc-strip")) {
-                       if (!strcmp(res->value, "on")) {
-                               rx_offloads &= ~DEV_RX_OFFLOAD_KEEP_CRC;
-                       } else if (!strcmp(res->value, "off")) {
-                               rx_offloads |= DEV_RX_OFFLOAD_KEEP_CRC;
-                       } else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else if (!strcmp(res->name, "scatter")) {
-                       if (!strcmp(res->value, "on")) {
-                               rx_offloads |= DEV_RX_OFFLOAD_SCATTER;
-                       } else if (!strcmp(res->value, "off")) {
-                               rx_offloads &= ~DEV_RX_OFFLOAD_SCATTER;
-                       } else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else if (!strcmp(res->name, "rx-cksum")) {
-                       if (!strcmp(res->value, "on"))
-                               rx_offloads |= DEV_RX_OFFLOAD_CHECKSUM;
-                       else if (!strcmp(res->value, "off"))
-                               rx_offloads &= ~DEV_RX_OFFLOAD_CHECKSUM;
-                       else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else if (!strcmp(res->name, "rx-timestamp")) {
-                       if (!strcmp(res->value, "on"))
-                               rx_offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
-                       else if (!strcmp(res->value, "off"))
-                               rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;
-                       else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else if (!strcmp(res->name, "hw-vlan")) {
-                       if (!strcmp(res->value, "on")) {
-                               rx_offloads |= (DEV_RX_OFFLOAD_VLAN_FILTER |
-                                               DEV_RX_OFFLOAD_VLAN_STRIP);
-                       } else if (!strcmp(res->value, "off")) {
-                               rx_offloads &= ~(DEV_RX_OFFLOAD_VLAN_FILTER |
-                                               DEV_RX_OFFLOAD_VLAN_STRIP);
-                       } else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else if (!strcmp(res->name, "hw-vlan-filter")) {
-                       if (!strcmp(res->value, "on"))
-                               rx_offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
-                       else if (!strcmp(res->value, "off"))
-                               rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_FILTER;
-                       else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else if (!strcmp(res->name, "hw-vlan-strip")) {
-                       if (!strcmp(res->value, "on"))
-                               rx_offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
-                       else if (!strcmp(res->value, "off"))
-                               rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_STRIP;
-                       else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else if (!strcmp(res->name, "hw-vlan-extend")) {
-                       if (!strcmp(res->value, "on"))
-                               rx_offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
-                       else if (!strcmp(res->value, "off"))
-                               rx_offloads &= ~DEV_RX_OFFLOAD_VLAN_EXTEND;
-                       else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else if (!strcmp(res->name, "drop-en")) {
-                       if (!strcmp(res->value, "on"))
-                               rx_drop_en = 1;
-                       else if (!strcmp(res->value, "off"))
-                               rx_drop_en = 0;
-                       else {
-                               printf("Unknown parameter\n");
-                               return;
-                       }
-               } else {
+       if (!strcmp(res->name, "drop-en")) {
+               if (!strcmp(res->value, "on"))
+                       rx_drop_en = 1;
+               else if (!strcmp(res->value, "off"))
+                       rx_drop_en = 0;
+               else {
                        printf("Unknown parameter\n");
                        return;
                }
-               port->dev_conf.rxmode.offloads = rx_offloads;
+       } else {
+               printf("Unknown parameter\n");
+               return;
        }
 
        init_port_config();
@@ -2163,8 +2144,7 @@ cmdline_parse_token_string_t cmd_config_rx_mode_flag_all =
        TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, all, "all");
 cmdline_parse_token_string_t cmd_config_rx_mode_flag_name =
        TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, name,
-                                       "crc-strip#scatter#rx-cksum#rx-timestamp#hw-vlan#"
-                                       "hw-vlan-filter#hw-vlan-strip#hw-vlan-extend");
+                                       "drop-en");
 cmdline_parse_token_string_t cmd_config_rx_mode_flag_value =
        TOKEN_STRING_INITIALIZER(struct cmd_config_rx_mode_flag, value,
                                                        "on#off");
@@ -2172,8 +2152,7 @@ cmdline_parse_token_string_t cmd_config_rx_mode_flag_value =
 cmdline_parse_inst_t cmd_config_rx_mode_flag = {
        .f = cmd_config_rx_mode_flag_parsed,
        .data = NULL,
-       .help_str = "port config all crc-strip|scatter|rx-cksum|rx-timestamp|hw-vlan|"
-               "hw-vlan-filter|hw-vlan-strip|hw-vlan-extend on|off",
+       .help_str = "port config all drop-en on|off",
        .tokens = {
                (void *)&cmd_config_rx_mode_flag_port,
                (void *)&cmd_config_rx_mode_flag_keyword,
@@ -2205,6 +2184,7 @@ cmd_config_rss_parsed(void *parsed_result,
        int all_updated = 1;
        int diag;
        uint16_t i;
+       int ret;
 
        if (!strcmp(res->value, "all"))
                rss_conf.rss_hf = ETH_RSS_IP | ETH_RSS_TCP |
@@ -2244,7 +2224,10 @@ cmd_config_rss_parsed(void *parsed_result,
        RTE_ETH_FOREACH_DEV(i) {
                struct rte_eth_rss_conf local_rss_conf;
 
-               rte_eth_dev_info_get(i, &dev_info);
+               ret = eth_dev_info_get_print_err(i, &dev_info);
+               if (ret != 0)
+                       return;
+
                if (use_default)
                        rss_conf.rss_hf = dev_info.flow_type_rss_offloads;
 
@@ -2342,9 +2325,12 @@ cmd_config_rss_hash_key_parsed(void *parsed_result,
        struct rte_eth_dev_info dev_info;
        uint8_t hash_key_size;
        uint32_t key_len;
+       int ret;
+
+       ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+       if (ret != 0)
+               return;
 
-       memset(&dev_info, 0, sizeof(dev_info));
-       rte_eth_dev_info_get(res->port_id, &dev_info);
        if (dev_info.hash_key_size > 0 &&
                        dev_info.hash_key_size <= sizeof(hash_key))
                hash_key_size = dev_info.hash_key_size;
@@ -2876,8 +2862,10 @@ cmd_set_rss_reta_parsed(void *parsed_result,
        struct rte_eth_rss_reta_entry64 reta_conf[8];
        struct cmd_config_rss_reta *res = parsed_result;
 
-       memset(&dev_info, 0, sizeof(dev_info));
-       rte_eth_dev_info_get(res->port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if (dev_info.reta_size == 0) {
                printf("Redirection table size is 0 which is "
                                        "invalid for RSS\n");
@@ -2995,9 +2983,12 @@ cmd_showport_reta_parsed(void *parsed_result,
        struct rte_eth_rss_reta_entry64 reta_conf[8];
        struct rte_eth_dev_info dev_info;
        uint16_t max_reta_size;
+       int ret;
+
+       ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+       if (ret != 0)
+               return;
 
-       memset(&dev_info, 0, sizeof(dev_info));
-       rte_eth_dev_info_get(res->port_id, &dev_info);
        max_reta_size = RTE_MIN(dev_info.reta_size, ETH_RSS_RETA_SIZE_512);
        if (res->size == 0 || res->size > max_reta_size) {
                printf("Invalid redirection table size: %u (1-%u)\n",
@@ -3224,6 +3215,7 @@ cmd_config_burst_parsed(void *parsed_result,
        struct cmd_config_burst *res = parsed_result;
        struct rte_eth_dev_info dev_info;
        uint16_t rec_nb_pkts;
+       int ret;
 
        if (!all_ports_stopped()) {
                printf("Please stop all ports first\n");
@@ -3237,7 +3229,10 @@ cmd_config_burst_parsed(void *parsed_result,
                         * size for all ports, so assume all ports are the same
                         * NIC model and use the values from Port 0.
                         */
-                       rte_eth_dev_info_get(0, &dev_info);
+                       ret = eth_dev_info_get_print_err(0, &dev_info);
+                       if (ret != 0)
+                               return;
+
                        rec_nb_pkts = dev_info.default_rxportconf.burst_size;
 
                        if (rec_nb_pkts == 0) {
@@ -4307,6 +4302,7 @@ csum_show(int port_id)
 {
        struct rte_eth_dev_info dev_info;
        uint64_t tx_offloads;
+       int ret;
 
        tx_offloads = ports[port_id].dev_conf.txmode.offloads;
        printf("Parse tunnel is %s\n",
@@ -4325,7 +4321,10 @@ csum_show(int port_id)
                (tx_offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM) ? "hw" : "sw");
 
        /* display warnings if configuration is not supported by the NIC */
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if ((tx_offloads & DEV_TX_OFFLOAD_IPV4_CKSUM) &&
                (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_IPV4_CKSUM) == 0) {
                printf("Warning: hardware IP checksum enabled but not "
@@ -4359,6 +4358,17 @@ csum_show(int port_id)
        }
 }
 
+static void
+cmd_config_queue_tx_offloads(struct rte_port *port)
+{
+       int k;
+
+       /* Apply queue tx offloads configuration */
+       for (k = 0; k < port->dev_info.max_rx_queues; k++)
+               port->tx_conf[k].offloads =
+                       port->dev_conf.txmode.offloads;
+}
+
 static void
 cmd_csum_parsed(void *parsed_result,
                       __attribute__((unused)) struct cmdline *cl,
@@ -4368,6 +4378,7 @@ cmd_csum_parsed(void *parsed_result,
        int hw = 0;
        uint64_t csum_offloads = 0;
        struct rte_eth_dev_info dev_info;
+       int ret;
 
        if (port_id_is_invalid(res->port_id, ENABLED_WARN)) {
                printf("invalid port %d\n", res->port_id);
@@ -4378,7 +4389,10 @@ cmd_csum_parsed(void *parsed_result,
                return;
        }
 
-       rte_eth_dev_info_get(res->port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if (!strcmp(res->mode, "set")) {
 
                if (!strcmp(res->hwsw, "hw"))
@@ -4443,6 +4457,7 @@ cmd_csum_parsed(void *parsed_result,
                        ports[res->port_id].dev_conf.txmode.offloads &=
                                                        (~csum_offloads);
                }
+               cmd_config_queue_tx_offloads(&ports[res->port_id]);
        }
        csum_show(res->port_id);
 
@@ -4565,6 +4580,7 @@ cmd_tso_set_parsed(void *parsed_result,
 {
        struct cmd_tso_set_result *res = parsed_result;
        struct rte_eth_dev_info dev_info;
+       int ret;
 
        if (port_id_is_invalid(res->port_id, ENABLED_WARN))
                return;
@@ -4576,7 +4592,10 @@ cmd_tso_set_parsed(void *parsed_result,
        if (!strcmp(res->mode, "set"))
                ports[res->port_id].tso_segsz = res->tso_segsz;
 
-       rte_eth_dev_info_get(res->port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if ((ports[res->port_id].tso_segsz != 0) &&
                (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
                printf("Error: TSO is not supported by port %d\n",
@@ -4594,9 +4613,13 @@ cmd_tso_set_parsed(void *parsed_result,
                printf("TSO segment size for non-tunneled packets is %d\n",
                        ports[res->port_id].tso_segsz);
        }
+       cmd_config_queue_tx_offloads(&ports[res->port_id]);
 
        /* display warnings if configuration is not supported by the NIC */
-       rte_eth_dev_info_get(res->port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(res->port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if ((ports[res->port_id].tso_segsz != 0) &&
                (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_TCP_TSO) == 0) {
                printf("Warning: TSO enabled but not "
@@ -4665,7 +4688,9 @@ check_tunnel_tso_nic_support(portid_t port_id)
 {
        struct rte_eth_dev_info dev_info;
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       if (eth_dev_info_get_print_err(port_id, &dev_info) != 0)
+               return dev_info;
+
        if (!(dev_info.tx_offload_capa & DEV_TX_OFFLOAD_VXLAN_TNL_TSO))
                printf("Warning: VXLAN TUNNEL TSO not supported therefore "
                       "not enabled for port %d\n", port_id);
@@ -4749,6 +4774,7 @@ cmd_tunnel_tso_set_parsed(void *parsed_result,
                                "if outer L3 is IPv4; not necessary for IPv6\n");
        }
 
+       cmd_config_queue_tx_offloads(&ports[res->port_id]);
        cmd_reconfig_device_queue(res->port_id, 1, 1);
 }
 
@@ -6059,6 +6085,7 @@ static void cmd_create_bonded_device_parsed(void *parsed_result,
        struct cmd_create_bonded_device_result *res = parsed_result;
        char ethdev_name[RTE_ETH_NAME_MAX_LEN];
        int port_id;
+       int ret;
 
        if (test_done == 0) {
                printf("Please stop forwarding first\n");
@@ -6080,7 +6107,11 @@ static void cmd_create_bonded_device_parsed(void *parsed_result,
                /* Update number of ports */
                nb_ports = rte_eth_dev_count_avail();
                reconfig(port_id, res->socket);
-               rte_eth_promiscuous_enable(port_id);
+               ret = rte_eth_promiscuous_enable(port_id);
+               if (ret != 0)
+                       printf("Failed to enable promiscuous mode for port %u: %s - ignore\n",
+                               port_id, rte_strerror(-ret));
+
                ports[port_id].need_setup = 0;
                ports[port_id].port_status = RTE_PORT_STOPPED;
        }
@@ -6502,18 +6533,10 @@ static void cmd_set_promisc_mode_parsed(void *parsed_result,
 
        /* all ports */
        if (allports) {
-               RTE_ETH_FOREACH_DEV(i) {
-                       if (enable)
-                               rte_eth_promiscuous_enable(i);
-                       else
-                               rte_eth_promiscuous_disable(i);
-               }
-       }
-       else {
-               if (enable)
-                       rte_eth_promiscuous_enable(res->port_num);
-               else
-                       rte_eth_promiscuous_disable(res->port_num);
+               RTE_ETH_FOREACH_DEV(i)
+                       eth_set_promisc_mode(i, enable);
+       } else {
+               eth_set_promisc_mode(res->port_num, enable);
        }
 }
 
@@ -6583,17 +6606,11 @@ static void cmd_set_allmulti_mode_parsed(void *parsed_result,
        /* all ports */
        if (allports) {
                RTE_ETH_FOREACH_DEV(i) {
-                       if (enable)
-                               rte_eth_allmulticast_enable(i);
-                       else
-                               rte_eth_allmulticast_disable(i);
+                       eth_set_allmulticast_mode(i, enable);
                }
        }
        else {
-               if (enable)
-                       rte_eth_allmulticast_enable(res->port_num);
-               else
-                       rte_eth_allmulticast_disable(res->port_num);
+               eth_set_allmulticast_mode(res->port_num, enable);
        }
 }
 
@@ -7437,6 +7454,51 @@ cmdline_parse_inst_t cmd_showport = {
        },
 };
 
+/* *** SHOW DEVICE INFO *** */
+struct cmd_showdevice_result {
+       cmdline_fixed_string_t show;
+       cmdline_fixed_string_t device;
+       cmdline_fixed_string_t what;
+       cmdline_fixed_string_t identifier;
+};
+
+static void cmd_showdevice_parsed(void *parsed_result,
+                               __attribute__((unused)) struct cmdline *cl,
+                               __attribute__((unused)) void *data)
+{
+       struct cmd_showdevice_result *res = parsed_result;
+       if (!strcmp(res->what, "info")) {
+               if (!strcmp(res->identifier, "all"))
+                       device_infos_display(NULL);
+               else
+                       device_infos_display(res->identifier);
+       }
+}
+
+cmdline_parse_token_string_t cmd_showdevice_show =
+       TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result, show,
+                                "show");
+cmdline_parse_token_string_t cmd_showdevice_device =
+       TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result, device, "device");
+cmdline_parse_token_string_t cmd_showdevice_what =
+       TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result, what,
+                                "info");
+cmdline_parse_token_string_t cmd_showdevice_identifier =
+       TOKEN_STRING_INITIALIZER(struct cmd_showdevice_result,
+                       identifier, NULL);
+
+cmdline_parse_inst_t cmd_showdevice = {
+       .f = cmd_showdevice_parsed,
+       .data = NULL,
+       .help_str = "show device info <identifier>|all",
+       .tokens = {
+               (void *)&cmd_showdevice_show,
+               (void *)&cmd_showdevice_device,
+               (void *)&cmd_showdevice_what,
+               (void *)&cmd_showdevice_identifier,
+               NULL,
+       },
+};
 /* *** SHOW QUEUE INFO *** */
 struct cmd_showqueue_result {
        cmdline_fixed_string_t show;
@@ -8236,7 +8298,7 @@ cmd_set_vf_macvlan_parsed(void *parsed_result,
 
        memset(&filter, 0, sizeof(struct rte_eth_mac_filter));
 
-       rte_memcpy(&filter.mac_addr, &res->address, ETHER_ADDR_LEN);
+       rte_memcpy(&filter.mac_addr, &res->address, RTE_ETHER_ADDR_LEN);
 
        /* set VF MAC filter */
        filter.is_vf = 1;
@@ -8396,19 +8458,19 @@ cmd_set_vf_rxmode_parsed(void *parsed_result,
                       __attribute__((unused)) void *data)
 {
        int ret = -ENOTSUP;
-       uint16_t rx_mode = 0;
+       uint16_t vf_rxmode = 0;
        struct cmd_set_vf_rxmode *res = parsed_result;
 
        int is_on = (strcmp(res->on, "on") == 0) ? 1 : 0;
        if (!strcmp(res->what,"rxmode")) {
                if (!strcmp(res->mode, "AUPE"))
-                       rx_mode |= ETH_VMDQ_ACCEPT_UNTAG;
+                       vf_rxmode |= ETH_VMDQ_ACCEPT_UNTAG;
                else if (!strcmp(res->mode, "ROPE"))
-                       rx_mode |= ETH_VMDQ_ACCEPT_HASH_UC;
+                       vf_rxmode |= ETH_VMDQ_ACCEPT_HASH_UC;
                else if (!strcmp(res->mode, "BAM"))
-                       rx_mode |= ETH_VMDQ_ACCEPT_BROADCAST;
+                       vf_rxmode |= ETH_VMDQ_ACCEPT_BROADCAST;
                else if (!strncmp(res->mode, "MPE",3))
-                       rx_mode |= ETH_VMDQ_ACCEPT_MULTICAST;
+                       vf_rxmode |= ETH_VMDQ_ACCEPT_MULTICAST;
        }
 
        RTE_SET_USED(is_on);
@@ -8416,12 +8478,12 @@ cmd_set_vf_rxmode_parsed(void *parsed_result,
 #ifdef RTE_LIBRTE_IXGBE_PMD
        if (ret == -ENOTSUP)
                ret = rte_pmd_ixgbe_set_vf_rxmode(res->port_id, res->vf_id,
-                                                 rx_mode, (uint8_t)is_on);
+                                                 vf_rxmode, (uint8_t)is_on);
 #endif
 #ifdef RTE_LIBRTE_BNXT_PMD
        if (ret == -ENOTSUP)
                ret = rte_pmd_bnxt_set_vf_rxmode(res->port_id, res->vf_id,
-                                                rx_mode, (uint8_t)is_on);
+                                                vf_rxmode, (uint8_t)is_on);
 #endif
        if (ret < 0)
                printf("bad VF receive mode parameter, return code = %d \n",
@@ -9210,7 +9272,7 @@ cmd_set_mirror_mask_parsed(void *parsed_result,
                        return;
 
                for (i = 0; i < nb_item; i++) {
-                       if (vlan_list[i] > ETHER_MAX_VLAN_ID) {
+                       if (vlan_list[i] > RTE_ETHER_MAX_VLAN_ID) {
                                printf("Invalid vlan_id: must be < 4096\n");
                                return;
                        }
@@ -10080,7 +10142,7 @@ cmd_2tuple_filter_parsed(void *parsed_result,
                        " when protocol is TCP.\n");
                return;
        }
-       if (res->tcp_flags_value > TCP_FLAG_ALL) {
+       if (res->tcp_flags_value > RTE_NTUPLE_TCP_FLAGS_MASK) {
                printf("invalid TCP flags.\n");
                return;
        }
@@ -10238,7 +10300,7 @@ cmd_5tuple_filter_parsed(void *parsed_result,
                        " when protocol is TCP.\n");
                return;
        }
-       if (res->tcp_flags_value > TCP_FLAG_ALL) {
+       if (res->tcp_flags_value > RTE_NTUPLE_TCP_FLAGS_MASK) {
                printf("invalid TCP flags.\n");
                return;
        }
@@ -11056,8 +11118,11 @@ cmd_flow_director_filter_parsed(void *parsed_result,
                else if (!strncmp(res->pf_vf, "vf", 2)) {
                        struct rte_eth_dev_info dev_info;
 
-                       memset(&dev_info, 0, sizeof(dev_info));
-                       rte_eth_dev_info_get(res->port_id, &dev_info);
+                       ret = eth_dev_info_get_print_err(res->port_id,
+                                               &dev_info);
+                       if (ret != 0)
+                               return;
+
                        errno = 0;
                        vf_id = strtoul(res->pf_vf + 2, &end, 10);
                        if (errno != 0 || *end != '\0' ||
@@ -14049,7 +14114,10 @@ cmd_set_macsec_offload_on_parsed(
                return;
        }
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
 #ifdef RTE_LIBRTE_IXGBE_PMD
                ret = rte_pmd_ixgbe_macsec_enable(port_id, en, rp);
@@ -14143,7 +14211,10 @@ cmd_set_macsec_offload_off_parsed(
                return;
        }
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MACSEC_INSERT) {
 #ifdef RTE_LIBRTE_IXGBE_PMD
                ret = rte_pmd_ixgbe_macsec_disable(port_id);
@@ -15301,9 +15372,9 @@ static void cmd_set_vxlan_parsed(void *parsed_result,
        if (vxlan_encap_conf.select_vlan)
                vxlan_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci);
        rte_memcpy(vxlan_encap_conf.eth_src, res->eth_src.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
        rte_memcpy(vxlan_encap_conf.eth_dst, res->eth_dst.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
 }
 
 cmdline_parse_inst_t cmd_set_vxlan = {
@@ -15492,9 +15563,9 @@ static void cmd_set_nvgre_parsed(void *parsed_result,
        if (nvgre_encap_conf.select_vlan)
                nvgre_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci);
        rte_memcpy(nvgre_encap_conf.eth_src, res->eth_src.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
        rte_memcpy(nvgre_encap_conf.eth_dst, res->eth_dst.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
 }
 
 cmdline_parse_inst_t cmd_set_nvgre = {
@@ -15609,9 +15680,9 @@ static void cmd_set_l2_encap_parsed(void *parsed_result,
        if (l2_encap_conf.select_vlan)
                l2_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci);
        rte_memcpy(l2_encap_conf.eth_src, res->eth_src.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
        rte_memcpy(l2_encap_conf.eth_dst, res->eth_dst.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
 }
 
 cmdline_parse_inst_t cmd_set_l2_encap = {
@@ -15801,9 +15872,9 @@ static void cmd_set_mplsogre_encap_parsed(void *parsed_result,
        if (mplsogre_encap_conf.select_vlan)
                mplsogre_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci);
        rte_memcpy(mplsogre_encap_conf.eth_src, res->eth_src.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
        rte_memcpy(mplsogre_encap_conf.eth_dst, res->eth_dst.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
 }
 
 cmdline_parse_inst_t cmd_set_mplsogre_encap = {
@@ -16039,9 +16110,9 @@ static void cmd_set_mplsoudp_encap_parsed(void *parsed_result,
        if (mplsoudp_encap_conf.select_vlan)
                mplsoudp_encap_conf.vlan_tci = rte_cpu_to_be_16(res->tci);
        rte_memcpy(mplsoudp_encap_conf.eth_src, res->eth_src.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
        rte_memcpy(mplsoudp_encap_conf.eth_dst, res->eth_dst.addr_bytes,
-                  ETHER_ADDR_LEN);
+                  RTE_ETHER_ADDR_LEN);
 }
 
 cmdline_parse_inst_t cmd_set_mplsoudp_encap = {
@@ -17853,8 +17924,12 @@ cmd_rx_offload_get_capa_parsed(
        portid_t port_id = res->port_id;
        uint64_t queue_offloads;
        uint64_t port_offloads;
+       int ret;
+
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
 
-       rte_eth_dev_info_get(port_id, &dev_info);
        queue_offloads = dev_info.rx_queue_offload_capa;
        port_offloads = dev_info.rx_offload_capa ^ queue_offloads;
 
@@ -17926,6 +18001,7 @@ cmd_rx_offload_get_configuration_parsed(
        uint64_t queue_offloads;
        uint16_t nb_rx_queues;
        int q;
+       int ret;
 
        printf("Rx Offloading Configuration of port %d :\n", port_id);
 
@@ -17934,7 +18010,10 @@ cmd_rx_offload_get_configuration_parsed(
        print_rx_offloads(port_offloads);
        printf("\n");
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        nb_rx_queues = dev_info.nb_rx_queues;
        for (q = 0; q < nb_rx_queues; q++) {
                queue_offloads = port->rx_conf[q].offloads;
@@ -18033,6 +18112,7 @@ cmd_config_per_port_rx_offload_parsed(void *parsed_result,
        uint64_t single_offload;
        uint16_t nb_rx_queues;
        int q;
+       int ret;
 
        if (port->port_status != RTE_PORT_STOPPED) {
                printf("Error: Can't config offload when Port %d "
@@ -18046,7 +18126,10 @@ cmd_config_per_port_rx_offload_parsed(void *parsed_result,
                return;
        }
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        nb_rx_queues = dev_info.nb_rx_queues;
        if (!strcmp(res->on_off, "on")) {
                port->dev_conf.rxmode.offloads |= single_offload;
@@ -18134,6 +18217,7 @@ cmd_config_per_queue_rx_offload_parsed(void *parsed_result,
        uint16_t queue_id = res->queue_id;
        struct rte_port *port = &ports[port_id];
        uint64_t single_offload;
+       int ret;
 
        if (port->port_status != RTE_PORT_STOPPED) {
                printf("Error: Can't config offload when Port %d "
@@ -18141,7 +18225,10 @@ cmd_config_per_queue_rx_offload_parsed(void *parsed_result,
                return;
        }
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if (queue_id >= dev_info.nb_rx_queues) {
                printf("Error: input queue_id should be 0 ... "
                       "%d\n", dev_info.nb_rx_queues - 1);
@@ -18247,8 +18334,12 @@ cmd_tx_offload_get_capa_parsed(
        portid_t port_id = res->port_id;
        uint64_t queue_offloads;
        uint64_t port_offloads;
+       int ret;
+
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
 
-       rte_eth_dev_info_get(port_id, &dev_info);
        queue_offloads = dev_info.tx_queue_offload_capa;
        port_offloads = dev_info.tx_offload_capa ^ queue_offloads;
 
@@ -18320,6 +18411,7 @@ cmd_tx_offload_get_configuration_parsed(
        uint64_t queue_offloads;
        uint16_t nb_tx_queues;
        int q;
+       int ret;
 
        printf("Tx Offloading Configuration of port %d :\n", port_id);
 
@@ -18328,7 +18420,10 @@ cmd_tx_offload_get_configuration_parsed(
        print_tx_offloads(port_offloads);
        printf("\n");
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        nb_tx_queues = dev_info.nb_tx_queues;
        for (q = 0; q < nb_tx_queues; q++) {
                queue_offloads = port->tx_conf[q].offloads;
@@ -18432,6 +18527,7 @@ cmd_config_per_port_tx_offload_parsed(void *parsed_result,
        uint64_t single_offload;
        uint16_t nb_tx_queues;
        int q;
+       int ret;
 
        if (port->port_status != RTE_PORT_STOPPED) {
                printf("Error: Can't config offload when Port %d "
@@ -18445,7 +18541,10 @@ cmd_config_per_port_tx_offload_parsed(void *parsed_result,
                return;
        }
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        nb_tx_queues = dev_info.nb_tx_queues;
        if (!strcmp(res->on_off, "on")) {
                port->dev_conf.txmode.offloads |= single_offload;
@@ -18536,6 +18635,7 @@ cmd_config_per_queue_tx_offload_parsed(void *parsed_result,
        uint16_t queue_id = res->queue_id;
        struct rte_port *port = &ports[port_id];
        uint64_t single_offload;
+       int ret;
 
        if (port->port_status != RTE_PORT_STOPPED) {
                printf("Error: Can't config offload when Port %d "
@@ -18543,7 +18643,10 @@ cmd_config_per_queue_tx_offload_parsed(void *parsed_result,
                return;
        }
 
-       rte_eth_dev_info_get(port_id, &dev_info);
+       ret = eth_dev_info_get_print_err(port_id, &dev_info);
+       if (ret != 0)
+               return;
+
        if (queue_id >= dev_info.nb_tx_queues) {
                printf("Error: input queue_id should be 0 ... "
                       "%d\n", dev_info.nb_tx_queues - 1);
@@ -18704,6 +18807,7 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_showport,
        (cmdline_parse_inst_t *)&cmd_showqueue,
        (cmdline_parse_inst_t *)&cmd_showportall,
+       (cmdline_parse_inst_t *)&cmd_showdevice,
        (cmdline_parse_inst_t *)&cmd_showcfg,
        (cmdline_parse_inst_t *)&cmd_showfwdall,
        (cmdline_parse_inst_t *)&cmd_start,
@@ -18792,6 +18896,7 @@ cmdline_parse_ctx_t main_ctx[] = {
        (cmdline_parse_inst_t *)&cmd_operate_specific_port,
        (cmdline_parse_inst_t *)&cmd_operate_attach_port,
        (cmdline_parse_inst_t *)&cmd_operate_detach_port,
+       (cmdline_parse_inst_t *)&cmd_operate_detach_device,
        (cmdline_parse_inst_t *)&cmd_set_port_setup_on,
        (cmdline_parse_inst_t *)&cmd_config_speed_all,
        (cmdline_parse_inst_t *)&cmd_config_speed_specific,
@@ -18979,6 +19084,7 @@ cmdline_parse_ctx_t main_ctx[] = {
 #endif
        (cmdline_parse_inst_t *)&cmd_config_tx_metadata_specific,
        (cmdline_parse_inst_t *)&cmd_show_tx_metadata,
+       (cmdline_parse_inst_t *)&cmd_set_raw,
        NULL,
 };