net/axgbe: support IEEE 1588 PTP
[dpdk.git] / app / test-pmd / testpmd.c
index 99bacdd..fb286b8 100644 (file)
@@ -179,9 +179,7 @@ struct fwd_engine * fwd_engines[] = {
        &csum_fwd_engine,
        &icmp_echo_engine,
        &noisy_vnf_engine,
-#if defined RTE_LIBRTE_PMD_SOFTNIC
-       &softnic_fwd_engine,
-#endif
+       &five_tuple_swap_fwd_engine,
 #ifdef RTE_LIBRTE_IEEE1588
        &ieee1588_fwd_engine,
 #endif
@@ -223,6 +221,12 @@ enum tx_pkt_split tx_pkt_split = TX_PKT_SPLIT_OFF;
 uint8_t txonly_multi_flow;
 /**< Whether multiple flows are generated in TXONLY mode. */
 
+uint32_t tx_pkt_times_inter;
+/**< Timings for send scheduling in TXONLY mode, time between bursts. */
+
+uint32_t tx_pkt_times_intra;
+/**< Timings for send scheduling in TXONLY mode, time between packets. */
+
 uint16_t nb_pkt_per_burst = DEF_PKT_BURST; /**< Number of packets per burst. */
 uint16_t mb_mempool_cache = DEF_MBUF_CACHE; /**< Size of mbuf mempool cache. */
 
@@ -375,6 +379,7 @@ static const char * const eth_event_desc[] = {
        [RTE_ETH_EVENT_INTR_RMV] = "device removal",
        [RTE_ETH_EVENT_NEW] = "device probed",
        [RTE_ETH_EVENT_DESTROY] = "device released",
+       [RTE_ETH_EVENT_FLOW_AGED] = "flow aged",
        [RTE_ETH_EVENT_MAX] = NULL,
 };
 
@@ -388,7 +393,8 @@ uint32_t event_print_mask = (UINT32_C(1) << RTE_ETH_EVENT_UNKNOWN) |
                            (UINT32_C(1) << RTE_ETH_EVENT_INTR_RESET) |
                            (UINT32_C(1) << RTE_ETH_EVENT_IPSEC) |
                            (UINT32_C(1) << RTE_ETH_EVENT_MACSEC) |
-                           (UINT32_C(1) << RTE_ETH_EVENT_INTR_RMV);
+                           (UINT32_C(1) << RTE_ETH_EVENT_INTR_RMV) |
+                           (UINT32_C(1) << RTE_ETH_EVENT_FLOW_AGED);
 /*
  * Decide if all memory are locked for performance.
  */
@@ -469,6 +475,16 @@ uint16_t nb_rx_queue_stats_mappings = 0;
  */
 uint8_t xstats_hide_zero;
 
+/*
+ * Measure of CPU cycles disabled by default
+ */
+uint8_t record_core_cycles;
+
+/*
+ * Display of RX and TX bursts disabled by default
+ */
+uint8_t record_burst_stats;
+
 unsigned int num_sockets = 0;
 unsigned int socket_ids[RTE_MAX_NUMA_NODES];
 
@@ -482,6 +498,11 @@ uint8_t bitrate_enabled;
 struct gro_status gro_ports[RTE_MAX_ETHPORTS];
 uint8_t gro_flush_cycles = GRO_DEFAULT_FLUSH_CYCLES;
 
+/*
+ * hexadecimal bitmask of RX mq mode can be enabled.
+ */
+enum rte_eth_rx_mq_mode rx_mq_mode = ETH_MQ_RX_VMDQ_DCB_RSS;
+
 /* Forward function declarations */
 static void setup_attached_port(portid_t pi);
 static void map_port_queue_stats_mapping_registers(portid_t pi,
@@ -1554,19 +1575,6 @@ init_config(void)
                                        "rte_gro_ctx_create() failed\n");
                }
        }
-
-#if defined RTE_LIBRTE_PMD_SOFTNIC
-       if (strcmp(cur_fwd_eng->fwd_mode_name, "softnic") == 0) {
-               RTE_ETH_FOREACH_DEV(pid) {
-                       port = &ports[pid];
-                       const char *driver = port->dev_info.driver_name;
-
-                       if (strcmp(driver, "net_softnic") == 0)
-                               port->softport.fwd_lcore_arg = fwd_lcores;
-               }
-       }
-#endif
-
 }
 
 
@@ -1681,63 +1689,72 @@ init_fwd_streams(void)
        return 0;
 }
 
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
 static void
 pkt_burst_stats_display(const char *rx_tx, struct pkt_burst_stats *pbs)
 {
-       unsigned int total_burst;
-       unsigned int nb_burst;
-       unsigned int burst_stats[3];
-       uint16_t pktnb_stats[3];
+       uint64_t total_burst, sburst;
+       uint64_t nb_burst;
+       uint64_t burst_stats[4];
+       uint16_t pktnb_stats[4];
        uint16_t nb_pkt;
-       int burst_percent[3];
+       int burst_percent[4], sburstp;
+       int i;
 
        /*
         * First compute the total number of packet bursts and the
         * two highest numbers of bursts of the same number of packets.
         */
-       total_burst = 0;
-       burst_stats[0] = burst_stats[1] = burst_stats[2] = 0;
-       pktnb_stats[0] = pktnb_stats[1] = pktnb_stats[2] = 0;
-       for (nb_pkt = 0; nb_pkt < MAX_PKT_BURST; nb_pkt++) {
+       memset(&burst_stats, 0x0, sizeof(burst_stats));
+       memset(&pktnb_stats, 0x0, sizeof(pktnb_stats));
+
+       /* Show stats for 0 burst size always */
+       total_burst = pbs->pkt_burst_spread[0];
+       burst_stats[0] = pbs->pkt_burst_spread[0];
+       pktnb_stats[0] = 0;
+
+       /* Find the next 2 burst sizes with highest occurrences. */
+       for (nb_pkt = 1; nb_pkt < MAX_PKT_BURST; nb_pkt++) {
                nb_burst = pbs->pkt_burst_spread[nb_pkt];
+
                if (nb_burst == 0)
                        continue;
+
                total_burst += nb_burst;
-               if (nb_burst > burst_stats[0]) {
-                       burst_stats[1] = burst_stats[0];
-                       pktnb_stats[1] = pktnb_stats[0];
-                       burst_stats[0] = nb_burst;
-                       pktnb_stats[0] = nb_pkt;
-               } else if (nb_burst > burst_stats[1]) {
+
+               if (nb_burst > burst_stats[1]) {
+                       burst_stats[2] = burst_stats[1];
+                       pktnb_stats[2] = pktnb_stats[1];
                        burst_stats[1] = nb_burst;
                        pktnb_stats[1] = nb_pkt;
+               } else if (nb_burst > burst_stats[2]) {
+                       burst_stats[2] = nb_burst;
+                       pktnb_stats[2] = nb_pkt;
                }
        }
        if (total_burst == 0)
                return;
-       burst_percent[0] = (burst_stats[0] * 100) / total_burst;
-       printf("  %s-bursts : %u [%d%% of %d pkts", rx_tx, total_burst,
-              burst_percent[0], (int) pktnb_stats[0]);
-       if (burst_stats[0] == total_burst) {
-               printf("]\n");
-               return;
-       }
-       if (burst_stats[0] + burst_stats[1] == total_burst) {
-               printf(" + %d%% of %d pkts]\n",
-                      100 - burst_percent[0], pktnb_stats[1]);
-               return;
-       }
-       burst_percent[1] = (burst_stats[1] * 100) / total_burst;
-       burst_percent[2] = 100 - (burst_percent[0] + burst_percent[1]);
-       if ((burst_percent[1] == 0) || (burst_percent[2] == 0)) {
-               printf(" + %d%% of others]\n", 100 - burst_percent[0]);
-               return;
+
+       printf("  %s-bursts : %"PRIu64" [", rx_tx, total_burst);
+       for (i = 0, sburst = 0, sburstp = 0; i < 4; i++) {
+               if (i == 3) {
+                       printf("%d%% of other]\n", 100 - sburstp);
+                       return;
+               }
+
+               sburst += burst_stats[i];
+               if (sburst == total_burst) {
+                       printf("%d%% of %d pkts]\n",
+                               100 - sburstp, (int) pktnb_stats[i]);
+                       return;
+               }
+
+               burst_percent[i] =
+                       (double)burst_stats[i] / total_burst * 100;
+               printf("%d%% of %d pkts + ",
+                       burst_percent[i], (int) pktnb_stats[i]);
+               sburstp += burst_percent[i];
        }
-       printf(" + %d%% of %d pkts + %d%% of others]\n",
-              burst_percent[1], (int) pktnb_stats[1], burst_percent[2]);
 }
-#endif /* RTE_TEST_PMD_RECORD_BURST_STATS */
 
 static void
 fwd_stream_stats_display(streamid_t stream_id)
@@ -1768,10 +1785,10 @@ fwd_stream_stats_display(streamid_t stream_id)
                printf("\n");
        }
 
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-       pkt_burst_stats_display("RX", &fs->rx_burst_stats);
-       pkt_burst_stats_display("TX", &fs->tx_burst_stats);
-#endif
+       if (record_burst_stats) {
+               pkt_burst_stats_display("RX", &fs->rx_burst_stats);
+               pkt_burst_stats_display("TX", &fs->tx_burst_stats);
+       }
 }
 
 void
@@ -1791,9 +1808,7 @@ fwd_stats_display(void)
        uint64_t total_tx_dropped = 0;
        uint64_t total_rx_nombuf = 0;
        struct rte_eth_stats stats;
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
        uint64_t fwd_cycles = 0;
-#endif
        uint64_t total_recv = 0;
        uint64_t total_xmit = 0;
        struct rte_port *port;
@@ -1821,9 +1836,8 @@ fwd_stats_display(void)
                ports_stats[fs->rx_port].rx_bad_outer_l4_csum +=
                                fs->rx_bad_outer_l4_csum;
 
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-               fwd_cycles += fs->core_cycles;
-#endif
+               if (record_core_cycles)
+                       fwd_cycles += fs->core_cycles;
        }
        for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
                uint8_t j;
@@ -1904,14 +1918,14 @@ fwd_stats_display(void)
                               stats.opackets + ports_stats[pt_id].tx_dropped);
                }
 
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
-               if (ports_stats[pt_id].rx_stream)
-                       pkt_burst_stats_display("RX",
-                               &ports_stats[pt_id].rx_stream->rx_burst_stats);
-               if (ports_stats[pt_id].tx_stream)
-                       pkt_burst_stats_display("TX",
-                               &ports_stats[pt_id].tx_stream->tx_burst_stats);
-#endif
+               if (record_burst_stats) {
+                       if (ports_stats[pt_id].rx_stream)
+                               pkt_burst_stats_display("RX",
+                                       &ports_stats[pt_id].rx_stream->rx_burst_stats);
+                       if (ports_stats[pt_id].tx_stream)
+                               pkt_burst_stats_display("TX",
+                                       &ports_stats[pt_id].tx_stream->tx_burst_stats);
+               }
 
                if (port->rx_queue_stats_mapping_enabled) {
                        printf("\n");
@@ -1952,13 +1966,24 @@ fwd_stats_display(void)
        printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
               "%s\n",
               acc_stats_border, acc_stats_border);
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
-       if (total_recv > 0)
-               printf("\n  CPU cycles/packet=%u (total cycles="
-                      "%"PRIu64" / total RX packets=%"PRIu64")\n",
-                      (unsigned int)(fwd_cycles / total_recv),
-                      fwd_cycles, total_recv);
-#endif
+       if (record_core_cycles) {
+#define CYC_PER_MHZ 1E6
+               if (total_recv > 0 || total_xmit > 0) {
+                       uint64_t total_pkts = 0;
+                       if (strcmp(cur_fwd_eng->fwd_mode_name, "txonly") == 0 ||
+                           strcmp(cur_fwd_eng->fwd_mode_name, "flowgen") == 0)
+                               total_pkts = total_xmit;
+                       else
+                               total_pkts = total_recv;
+
+                       printf("\n  CPU cycles/packet=%.2F (total cycles="
+                              "%"PRIu64" / total %s packets=%"PRIu64") at %"PRIu64
+                              " MHz Clock\n",
+                              (double) fwd_cycles / total_pkts,
+                              fwd_cycles, cur_fwd_eng->fwd_mode_name, total_pkts,
+                              (uint64_t)(rte_get_tsc_hz() / CYC_PER_MHZ));
+               }
+       }
 }
 
 void
@@ -1982,13 +2007,9 @@ fwd_stats_reset(void)
                fs->rx_bad_l4_csum = 0;
                fs->rx_bad_outer_l4_csum = 0;
 
-#ifdef RTE_TEST_PMD_RECORD_BURST_STATS
                memset(&fs->rx_burst_stats, 0, sizeof(fs->rx_burst_stats));
                memset(&fs->tx_burst_stats, 0, sizeof(fs->tx_burst_stats));
-#endif
-#ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
                fs->core_cycles = 0;
-#endif
        }
 }
 
@@ -3005,7 +3026,7 @@ check_all_ports_link_status(uint32_t port_mask)
                                        "Port%d Link Up. speed %u Mbps- %s\n",
                                        portid, link.link_speed,
                                (link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
-                                       ("full-duplex") : ("half-duplex\n"));
+                                       ("full-duplex") : ("half-duplex"));
                                else
                                        printf("Port %d Link Down\n", portid);
                                continue;
@@ -3337,7 +3358,9 @@ init_port_config(void)
 
                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;
+                               port->dev_conf.rxmode.mq_mode =
+                                       (enum rte_eth_rx_mq_mode)
+                                               (rx_mq_mode & ETH_MQ_RX_RSS);
                        else
                                port->dev_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
                }
@@ -3438,7 +3461,9 @@ get_eth_dcb_conf(portid_t pid, struct rte_eth_conf *eth_conf,
                }
 
                /* set DCB mode of RX and TX of multiple queues */
-               eth_conf->rxmode.mq_mode = ETH_MQ_RX_VMDQ_DCB;
+               eth_conf->rxmode.mq_mode =
+                               (enum rte_eth_rx_mq_mode)
+                                       (rx_mq_mode & ETH_MQ_RX_VMDQ_DCB);
                eth_conf->txmode.mq_mode = ETH_MQ_TX_VMDQ_DCB;
        } else {
                struct rte_eth_dcb_rx_conf *rx_conf =
@@ -3446,6 +3471,8 @@ get_eth_dcb_conf(portid_t pid, struct rte_eth_conf *eth_conf,
                struct rte_eth_dcb_tx_conf *tx_conf =
                                &eth_conf->tx_adv_conf.dcb_tx_conf;
 
+               memset(&rss_conf, 0, sizeof(struct rte_eth_rss_conf));
+
                rc = rte_eth_dev_rss_hash_conf_get(pid, &rss_conf);
                if (rc != 0)
                        return rc;
@@ -3458,7 +3485,9 @@ get_eth_dcb_conf(portid_t pid, struct rte_eth_conf *eth_conf,
                        tx_conf->dcb_tc[i] = i % num_tcs;
                }
 
-               eth_conf->rxmode.mq_mode = ETH_MQ_RX_DCB_RSS;
+               eth_conf->rxmode.mq_mode =
+                               (enum rte_eth_rx_mq_mode)
+                                       (rx_mq_mode & ETH_MQ_RX_DCB_RSS);
                eth_conf->rx_adv_conf.rss_conf = rss_conf;
                eth_conf->txmode.mq_mode = ETH_MQ_TX_DCB;
        }