app/testpmd: fix VLAN configuration on failure
[dpdk.git] / app / test-pmd / config.c
index fcbe6b6..0bec547 100644 (file)
@@ -49,6 +49,7 @@
 #include <rte_pmd_bnxt.h>
 #endif
 #include <rte_gro.h>
+#include <rte_hexdump.h>
 
 #include "testpmd.h"
 
@@ -452,6 +453,8 @@ rx_queue_infos_display(portid_t port_id, uint16_t queue_id)
                (qinfo.conf.rx_deferred_start != 0) ? "on" : "off");
        printf("\nRX scattered packets: %s",
                (qinfo.scattered_rx != 0) ? "on" : "off");
+       if (qinfo.rx_buf_size != 0)
+               printf("\nRX buffer size: %hu", qinfo.rx_buf_size);
        printf("\nNumber of RXDs: %hu", qinfo.nb_desc);
 
        if (rte_eth_rx_burst_mode_get(port_id, queue_id, &mode) == 0)
@@ -630,7 +633,7 @@ port_infos_display(portid_t port_id)
                printf("\nmemory allocation on the socket: %u",port->socket_id);
 
        printf("\nLink status: %s\n", (link.link_status) ? ("up") : ("down"));
-       printf("Link speed: %u Mbps\n", (unsigned) link.link_speed);
+       printf("Link speed: %s\n", rte_eth_link_speed_to_str(link.link_speed));
        printf("Link duplex: %s\n", (link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
               ("full-duplex") : ("half-duplex"));
 
@@ -775,12 +778,128 @@ port_summary_display(portid_t port_id)
        if (ret != 0)
                return;
 
-       printf("%-4d %02X:%02X:%02X:%02X:%02X:%02X %-12s %-14s %-8s %uMbps\n",
+       printf("%-4d %02X:%02X:%02X:%02X:%02X:%02X %-12s %-14s %-8s %s\n",
                port_id, mac_addr.addr_bytes[0], mac_addr.addr_bytes[1],
                mac_addr.addr_bytes[2], mac_addr.addr_bytes[3],
                mac_addr.addr_bytes[4], mac_addr.addr_bytes[5], name,
                dev_info.driver_name, (link.link_status) ? ("up") : ("down"),
-               (unsigned int) link.link_speed);
+               rte_eth_link_speed_to_str(link.link_speed));
+}
+
+void
+port_eeprom_display(portid_t port_id)
+{
+       struct rte_dev_eeprom_info einfo;
+       int ret;
+       if (port_id_is_invalid(port_id, ENABLED_WARN)) {
+               print_valid_ports();
+               return;
+       }
+
+       int len_eeprom = rte_eth_dev_get_eeprom_length(port_id);
+       if (len_eeprom < 0) {
+               switch (len_eeprom) {
+               case -ENODEV:
+                       printf("port index %d invalid\n", port_id);
+                       break;
+               case -ENOTSUP:
+                       printf("operation not supported by device\n");
+                       break;
+               case -EIO:
+                       printf("device is removed\n");
+                       break;
+               default:
+                       printf("Unable to get EEPROM: %d\n", len_eeprom);
+                       break;
+               }
+               return;
+       }
+
+       char buf[len_eeprom];
+       einfo.offset = 0;
+       einfo.length = len_eeprom;
+       einfo.data = buf;
+
+       ret = rte_eth_dev_get_eeprom(port_id, &einfo);
+       if (ret != 0) {
+               switch (ret) {
+               case -ENODEV:
+                       printf("port index %d invalid\n", port_id);
+                       break;
+               case -ENOTSUP:
+                       printf("operation not supported by device\n");
+                       break;
+               case -EIO:
+                       printf("device is removed\n");
+                       break;
+               default:
+                       printf("Unable to get EEPROM: %d\n", ret);
+                       break;
+               }
+               return;
+       }
+       rte_hexdump(stdout, "hexdump", einfo.data, einfo.length);
+       printf("Finish -- Port: %d EEPROM length: %d bytes\n", port_id, len_eeprom);
+}
+
+void
+port_module_eeprom_display(portid_t port_id)
+{
+       struct rte_eth_dev_module_info minfo;
+       struct rte_dev_eeprom_info einfo;
+       int ret;
+
+       if (port_id_is_invalid(port_id, ENABLED_WARN)) {
+               print_valid_ports();
+               return;
+       }
+
+
+       ret = rte_eth_dev_get_module_info(port_id, &minfo);
+       if (ret != 0) {
+               switch (ret) {
+               case -ENODEV:
+                       printf("port index %d invalid\n", port_id);
+                       break;
+               case -ENOTSUP:
+                       printf("operation not supported by device\n");
+                       break;
+               case -EIO:
+                       printf("device is removed\n");
+                       break;
+               default:
+                       printf("Unable to get module EEPROM: %d\n", ret);
+                       break;
+               }
+               return;
+       }
+
+       char buf[minfo.eeprom_len];
+       einfo.offset = 0;
+       einfo.length = minfo.eeprom_len;
+       einfo.data = buf;
+
+       ret = rte_eth_dev_get_module_eeprom(port_id, &einfo);
+       if (ret != 0) {
+               switch (ret) {
+               case -ENODEV:
+                       printf("port index %d invalid\n", port_id);
+                       break;
+               case -ENOTSUP:
+                       printf("operation not supported by device\n");
+                       break;
+               case -EIO:
+                       printf("device is removed\n");
+                       break;
+               default:
+                       printf("Unable to get module EEPROM: %d\n", ret);
+                       break;
+               }
+               return;
+       }
+
+       rte_hexdump(stdout, "hexdump", einfo.data, einfo.length);
+       printf("Finish -- Port: %d MODULE EEPROM length: %d bytes\n", port_id, einfo.length);
 }
 
 void
@@ -1421,11 +1540,12 @@ rss_config_display(struct rte_flow_action_rss *rss_conf)
        }
 
        printf("RSS:\n"
-              " queues: ");
+              " queues:");
        if (rss_conf->queue_num == 0)
-               printf("none\n");
+               printf(" none");
        for (i = 0; i < rss_conf->queue_num; i++)
-               printf("%d\n", rss_conf->queue[i]);
+               printf(" %d", rss_conf->queue[i]);
+       printf("\n");
 
        printf(" function: ");
        switch (rss_conf->func) {
@@ -3389,9 +3509,11 @@ vlan_extend_set(portid_t port_id, int on)
        }
 
        diag = rte_eth_dev_set_vlan_offload(port_id, vlan_offload);
-       if (diag < 0)
+       if (diag < 0) {
                printf("rx_vlan_extend_set(port_pi=%d, on=%d) failed "
               "diag=%d\n", port_id, on, diag);
+               return;
+       }
        ports[port_id].dev_conf.rxmode.offloads = port_rx_offloads;
 }
 
@@ -3416,9 +3538,11 @@ rx_vlan_strip_set(portid_t port_id, int on)
        }
 
        diag = rte_eth_dev_set_vlan_offload(port_id, vlan_offload);
-       if (diag < 0)
+       if (diag < 0) {
                printf("rx_vlan_strip_set(port_pi=%d, on=%d) failed "
               "diag=%d\n", port_id, on, diag);
+               return;
+       }
        ports[port_id].dev_conf.rxmode.offloads = port_rx_offloads;
 }
 
@@ -3457,9 +3581,11 @@ rx_vlan_filter_set(portid_t port_id, int on)
        }
 
        diag = rte_eth_dev_set_vlan_offload(port_id, vlan_offload);
-       if (diag < 0)
+       if (diag < 0) {
                printf("rx_vlan_filter_set(port_pi=%d, on=%d) failed "
               "diag=%d\n", port_id, on, diag);
+               return;
+       }
        ports[port_id].dev_conf.rxmode.offloads = port_rx_offloads;
 }
 
@@ -3484,9 +3610,11 @@ rx_vlan_qinq_strip_set(portid_t port_id, int on)
        }
 
        diag = rte_eth_dev_set_vlan_offload(port_id, vlan_offload);
-       if (diag < 0)
+       if (diag < 0) {
                printf("%s(port_pi=%d, on=%d) failed "
               "diag=%d\n", __func__, port_id, on, diag);
+               return;
+       }
        ports[port_id].dev_conf.rxmode.offloads = port_rx_offloads;
 }
 
@@ -3544,8 +3672,6 @@ tx_vlan_set(portid_t port_id, uint16_t vlan_id)
        struct rte_eth_dev_info dev_info;
        int ret;
 
-       if (port_id_is_invalid(port_id, ENABLED_WARN))
-               return;
        if (vlan_id_is_invalid(vlan_id))
                return;
 
@@ -3576,8 +3702,6 @@ tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
        struct rte_eth_dev_info dev_info;
        int ret;
 
-       if (port_id_is_invalid(port_id, ENABLED_WARN))
-               return;
        if (vlan_id_is_invalid(vlan_id))
                return;
        if (vlan_id_is_invalid(vlan_id_outer))
@@ -3603,8 +3727,6 @@ tx_qinq_set(portid_t port_id, uint16_t vlan_id, uint16_t vlan_id_outer)
 void
 tx_vlan_reset(portid_t port_id)
 {
-       if (port_id_is_invalid(port_id, ENABLED_WARN))
-               return;
        ports[port_id].dev_conf.txmode.offloads &=
                                ~(DEV_TX_OFFLOAD_VLAN_INSERT |
                                  DEV_TX_OFFLOAD_QINQ_INSERT);
@@ -3679,6 +3801,18 @@ set_xstats_hide_zero(uint8_t on_off)
        xstats_hide_zero = on_off;
 }
 
+void
+set_record_core_cycles(uint8_t on_off)
+{
+       record_core_cycles = on_off;
+}
+
+void
+set_record_burst_stats(uint8_t on_off)
+{
+       record_burst_stats = on_off;
+}
+
 static inline void
 print_fdir_mask(struct rte_eth_fdir_masks *mask)
 {
@@ -4019,7 +4153,8 @@ set_queue_rate_limit(portid_t port_id, uint16_t queue_idx, uint16_t rate)
        ret = eth_link_get_nowait_print_err(port_id, &link);
        if (ret < 0)
                return 1;
-       if (rate > link.link_speed) {
+       if (link.link_speed != ETH_SPEED_NUM_UNKNOWN &&
+           rate > link.link_speed) {
                printf("Invalid rate value:%u bigger than link speed: %u\n",
                        rate, link.link_speed);
                return 1;