app/testpmd: set packet dump based on verbosity level
[dpdk.git] / app / test-pmd / config.c
index 0fa5a39..1696623 100644 (file)
@@ -50,6 +50,7 @@
 #endif
 #include <rte_gro.h>
 #include <cmdline_parse_etheraddr.h>
+#include <rte_config.h>
 
 #include "testpmd.h"
 
@@ -519,6 +520,43 @@ port_infos_display(portid_t port_id)
        }
 }
 
+void
+port_summary_header_display(void)
+{
+       uint16_t port_number;
+
+       port_number = rte_eth_dev_count_avail();
+       printf("Number of available ports: %i\n", port_number);
+       printf("%-4s %-17s %-12s %-14s %-8s %s\n", "Port", "MAC Address", "Name",
+                       "Driver", "Status", "Link");
+}
+
+void
+port_summary_display(portid_t port_id)
+{
+       struct ether_addr mac_addr;
+       struct rte_eth_link link;
+       struct rte_eth_dev_info dev_info;
+       char name[RTE_ETH_NAME_MAX_LEN];
+
+       if (port_id_is_invalid(port_id, ENABLED_WARN)) {
+               print_valid_ports();
+               return;
+       }
+
+       rte_eth_link_get_nowait(port_id, &link);
+       rte_eth_dev_info_get(port_id, &dev_info);
+       rte_eth_dev_get_name_by_port(port_id, name);
+       rte_eth_macaddr_get(port_id, &mac_addr);
+
+       printf("%-4d %02X:%02X:%02X:%02X:%02X:%02X %-12s %-14s %-8s %uMbps\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);
+}
+
 void
 port_offload_cap_display(portid_t port_id)
 {
@@ -1442,8 +1480,8 @@ ring_dma_zone_lookup(const char *ring_name, portid_t port_id, uint16_t q_id)
        char mz_name[RTE_MEMZONE_NAMESIZE];
        const struct rte_memzone *mz;
 
-       snprintf(mz_name, sizeof(mz_name), "%s_%s_%d_%d",
-                ports[port_id].dev_info.driver_name, ring_name, port_id, q_id);
+       snprintf(mz_name, sizeof(mz_name), "eth_p%d_q%d_%s",
+                       port_id, q_id, ring_name);
        mz = rte_memzone_lookup(mz_name);
        if (mz == NULL)
                printf("%s ring memory zoneof (port %d, queue %d) not"
@@ -2668,12 +2706,103 @@ set_pkt_forwarding_mode(const char *fwd_mode_name)
        printf("Invalid %s packet forwarding mode\n", fwd_mode_name);
 }
 
+void
+add_rx_dump_callbacks(portid_t portid)
+{
+       struct rte_eth_dev_info dev_info;
+       uint16_t queue;
+
+       if (port_id_is_invalid(portid, ENABLED_WARN))
+               return;
+
+       rte_eth_dev_info_get(portid, &dev_info);
+       for (queue = 0; queue < dev_info.nb_rx_queues; queue++)
+               if (!ports[portid].rx_dump_cb[queue])
+                       ports[portid].rx_dump_cb[queue] =
+                               rte_eth_add_rx_callback(portid, queue,
+                                       dump_rx_pkts, NULL);
+}
+
+void
+add_tx_dump_callbacks(portid_t portid)
+{
+       struct rte_eth_dev_info dev_info;
+       uint16_t queue;
+
+       if (port_id_is_invalid(portid, ENABLED_WARN))
+               return;
+       rte_eth_dev_info_get(portid, &dev_info);
+       for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
+               if (!ports[portid].tx_dump_cb[queue])
+                       ports[portid].tx_dump_cb[queue] =
+                               rte_eth_add_tx_callback(portid, queue,
+                                                       dump_tx_pkts, NULL);
+}
+
+void
+remove_rx_dump_callbacks(portid_t portid)
+{
+       struct rte_eth_dev_info dev_info;
+       uint16_t queue;
+
+       if (port_id_is_invalid(portid, ENABLED_WARN))
+               return;
+       rte_eth_dev_info_get(portid, &dev_info);
+       for (queue = 0; queue < dev_info.nb_rx_queues; queue++)
+               if (ports[portid].rx_dump_cb[queue]) {
+                       rte_eth_remove_rx_callback(portid, queue,
+                               ports[portid].rx_dump_cb[queue]);
+                       ports[portid].rx_dump_cb[queue] = NULL;
+               }
+}
+
+void
+remove_tx_dump_callbacks(portid_t portid)
+{
+       struct rte_eth_dev_info dev_info;
+       uint16_t queue;
+
+       if (port_id_is_invalid(portid, ENABLED_WARN))
+               return;
+       rte_eth_dev_info_get(portid, &dev_info);
+       for (queue = 0; queue < dev_info.nb_tx_queues; queue++)
+               if (ports[portid].tx_dump_cb[queue]) {
+                       rte_eth_remove_tx_callback(portid, queue,
+                               ports[portid].tx_dump_cb[queue]);
+                       ports[portid].tx_dump_cb[queue] = NULL;
+               }
+}
+
+void
+configure_rxtx_dump_callbacks(uint16_t verbose)
+{
+       portid_t portid;
+
+#ifndef RTE_ETHDEV_RXTX_CALLBACKS
+               TESTPMD_LOG(ERR, "setting rxtx callbacks is not enabled\n");
+               return;
+#endif
+
+       RTE_ETH_FOREACH_DEV(portid)
+       {
+               if (verbose == 1 || verbose > 2)
+                       add_rx_dump_callbacks(portid);
+               else
+                       remove_rx_dump_callbacks(portid);
+               if (verbose >= 2)
+                       add_tx_dump_callbacks(portid);
+               else
+                       remove_tx_dump_callbacks(portid);
+       }
+}
+
 void
 set_verbose_level(uint16_t vb_level)
 {
        printf("Change verbose level from %u to %u\n",
               (unsigned int) verbose_level, (unsigned int) vb_level);
        verbose_level = vb_level;
+       configure_rxtx_dump_callbacks(verbose_level);
 }
 
 void