app/testpmd: add bitrate statistics calculation
[dpdk.git] / app / test-pmd / testpmd.c
index 6185be6..41c39b1 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
 #ifdef RTE_LIBRTE_PDUMP
 #include <rte_pdump.h>
 #endif
+#include <rte_flow.h>
+#include <rte_metrics.h>
+#ifdef RTE_LIBRTE_BITRATE
+#include <rte_bitrate.h>
+#endif
 
 #include "testpmd.h"
 
@@ -110,7 +115,7 @@ uint8_t mp_anon = 0;
 /*
  * Record the Ethernet address of peer target ports to which packets are
  * forwarded.
- * Must be instanciated with the ethernet addresses of peer traffic generator
+ * Must be instantiated with the ethernet addresses of peer traffic generator
  * ports.
  */
 struct ether_addr peer_eth_addrs[RTE_MAX_ETHPORTS];
@@ -322,6 +327,9 @@ uint16_t nb_rx_queue_stats_mappings = 0;
 
 unsigned max_socket = 0;
 
+/* Bitrate statistics */
+struct rte_stats_bitrates *bitrate_data;
+
 /* Forward function declarations */
 static void map_port_queue_stats_mapping_registers(uint8_t pi, struct rte_port *port);
 static void check_all_ports_link_status(uint32_t port_mask);
@@ -921,12 +929,30 @@ run_pkt_fwd_on_lcore(struct fwd_lcore *fc, packet_fwd_t pkt_fwd)
        struct fwd_stream **fsm;
        streamid_t nb_fs;
        streamid_t sm_id;
-
+#ifdef RTE_LIBRTE_BITRATE
+       uint64_t tics_per_1sec;
+       uint64_t tics_datum;
+       uint64_t tics_current;
+       uint8_t idx_port, cnt_ports;
+
+       cnt_ports = rte_eth_dev_count();
+       tics_datum = rte_rdtsc();
+       tics_per_1sec = rte_get_timer_hz();
+#endif
        fsm = &fwd_streams[fc->stream_idx];
        nb_fs = fc->stream_nb;
        do {
                for (sm_id = 0; sm_id < nb_fs; sm_id++)
                        (*pkt_fwd)(fsm[sm_id]);
+#ifdef RTE_LIBRTE_BITRATE
+               tics_current = rte_rdtsc();
+               if (tics_current - tics_datum >= tics_per_1sec) {
+                       /* Periodic bitrate calculation */
+                       for (idx_port = 0; idx_port < cnt_ports; idx_port++)
+                               rte_stats_bitrate_calc(bitrate_data, idx_port);
+                       tics_datum = tics_current;
+               }
+#endif
        } while (! fc->stopped);
 }
 
@@ -1545,6 +1571,8 @@ close_port(portid_t pid)
                        continue;
                }
 
+               if (port->flow_list)
+                       port_flow_flush(pi);
                rte_eth_dev_close(pi);
 
                if (rte_atomic16_cmpset(&(port->port_status),
@@ -1599,6 +1627,9 @@ detach_port(uint8_t port_id)
                return;
        }
 
+       if (ports[port_id].flow_list)
+               port_flow_flush(port_id);
+
        if (rte_eth_dev_detach(port_id, name))
                return;
 
@@ -1829,24 +1860,13 @@ init_port_config(void)
                        port->dev_conf.rx_adv_conf.rss_conf.rss_hf = 0;
                }
 
-               if (port->dcb_flag == 0 && port->dev_info.max_vfs == 0) {
+               if (port->dcb_flag == 0) {
                        if( port->dev_conf.rx_adv_conf.rss_conf.rss_hf != 0)
                                port->dev_conf.rxmode.mq_mode = ETH_MQ_RX_RSS;
                        else
                                port->dev_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
                }
 
-               if (port->dev_info.max_vfs != 0) {
-                       if (port->dev_conf.rx_adv_conf.rss_conf.rss_hf != 0)
-                               port->dev_conf.rxmode.mq_mode =
-                                       ETH_MQ_RX_VMDQ_RSS;
-                       else
-                               port->dev_conf.rxmode.mq_mode =
-                                       ETH_MQ_RX_NONE;
-
-                       port->dev_conf.txmode.mq_mode = ETH_MQ_TX_NONE;
-               }
-
                rxtx_port_config(port);
 
                rte_eth_macaddr_get(pid, &port->eth_addr);
@@ -1907,7 +1927,7 @@ get_eth_dcb_conf(struct rte_eth_conf *eth_conf,
                struct rte_eth_vmdq_dcb_tx_conf *vmdq_tx_conf =
                                &eth_conf->tx_adv_conf.vmdq_dcb_tx_conf;
 
-               /* VMDQ+DCB RX and TX configrations */
+               /* VMDQ+DCB RX and TX configurations */
                vmdq_rx_conf->enable_default_pool = 0;
                vmdq_rx_conf->default_pool = 0;
                vmdq_rx_conf->nb_queue_pools =
@@ -1938,9 +1958,9 @@ get_eth_dcb_conf(struct rte_eth_conf *eth_conf,
                rx_conf->nb_tcs = num_tcs;
                tx_conf->nb_tcs = num_tcs;
 
-               for (i = 0; i < num_tcs; i++) {
-                       rx_conf->dcb_tc[i] = i;
-                       tx_conf->dcb_tc[i] = i;
+               for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
+                       rx_conf->dcb_tc[i] = i % num_tcs;
+                       tx_conf->dcb_tc[i] = i % num_tcs;
                }
                eth_conf->rxmode.mq_mode = ETH_MQ_RX_DCB_RSS;
                eth_conf->rx_adv_conf.rss_conf.rss_hf = rss_hf;
@@ -2002,8 +2022,13 @@ init_port_dcb_config(portid_t pid,
         * and has the same number of rxq and txq in dcb mode
         */
        if (dcb_mode == DCB_VT_ENABLED) {
-               nb_rxq = rte_port->dev_info.max_rx_queues;
-               nb_txq = rte_port->dev_info.max_tx_queues;
+               if (rte_port->dev_info.max_vfs > 0) {
+                       nb_rxq = rte_port->dev_info.nb_rx_queues;
+                       nb_txq = rte_port->dev_info.nb_tx_queues;
+               } else {
+                       nb_rxq = rte_port->dev_info.max_rx_queues;
+                       nb_txq = rte_port->dev_info.max_tx_queues;
+               }
        } else {
                /*if vt is disabled, use all pf queues */
                if (rte_port->dev_info.vmdq_pool_base == 0) {
@@ -2128,6 +2153,18 @@ main(int argc, char** argv)
        FOREACH_PORT(port_id, ports)
                rte_eth_promiscuous_enable(port_id);
 
+       /* Init metrics library */
+       rte_metrics_init(rte_socket_id());
+
+       /* Setup bitrate stats */
+#ifdef RTE_LIBRTE_BITRATE
+       bitrate_data = rte_stats_bitrate_create();
+       if (bitrate_data == NULL)
+               rte_exit(EXIT_FAILURE, "Could not allocate bitrate data.\n");
+       rte_stats_bitrate_reg(bitrate_data);
+#endif
+
+
 #ifdef RTE_LIBRTE_CMDLINE
        if (interactive == 1) {
                if (auto_start) {