app/testpmd: add 5-tuple swap forwarding engine
[dpdk.git] / app / test-pmd / testpmd.c
index 2e1493d..7842c3b 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. */
 
@@ -1561,19 +1565,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
-
 }
 
 
@@ -1692,57 +1683,68 @@ init_fwd_streams(void)
 static void
 pkt_burst_stats_display(const char *rx_tx, struct pkt_burst_stats *pbs)
 {
-       uint64_t total_burst;
+       uint64_t total_burst, sburst;
        uint64_t nb_burst;
-       uint64_t burst_stats[3];
-       uint16_t pktnb_stats[3];
+       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] = (double)burst_stats[0] / total_burst * 100;
-       printf("  %s-bursts : %"PRIu64" [%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] = (double)burst_stats[1] / total_burst * 100;
-       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 */
 
@@ -1961,13 +1963,21 @@ fwd_stats_display(void)
               acc_stats_border, acc_stats_border);
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 #define CYC_PER_MHZ 1E6
-       if (total_recv > 0)
+       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 RX packets=%"PRIu64") at %"PRIu64
+                      "%"PRIu64" / total %s packets=%"PRIu64") at %"PRIu64
                       " MHz Clock\n",
-                      (double) fwd_cycles / total_recv,
-                      fwd_cycles, total_recv,
+                      (double) fwd_cycles / total_pkts,
+                      fwd_cycles, cur_fwd_eng->fwd_mode_name, total_pkts,
                       (uint64_t)(rte_get_tsc_hz() / CYC_PER_MHZ));
+       }
 #endif
 }