net/bnxt: refactor init/uninit
[dpdk.git] / app / test-pmd / testpmd.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2017 Intel Corporation
3  */
4
5 #include <stdarg.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <signal.h>
9 #include <string.h>
10 #include <time.h>
11 #include <fcntl.h>
12 #include <sys/mman.h>
13 #include <sys/types.h>
14 #include <errno.h>
15 #include <stdbool.h>
16
17 #include <sys/queue.h>
18 #include <sys/stat.h>
19
20 #include <stdint.h>
21 #include <unistd.h>
22 #include <inttypes.h>
23
24 #include <rte_common.h>
25 #include <rte_errno.h>
26 #include <rte_byteorder.h>
27 #include <rte_log.h>
28 #include <rte_debug.h>
29 #include <rte_cycles.h>
30 #include <rte_memory.h>
31 #include <rte_memcpy.h>
32 #include <rte_launch.h>
33 #include <rte_eal.h>
34 #include <rte_alarm.h>
35 #include <rte_per_lcore.h>
36 #include <rte_lcore.h>
37 #include <rte_atomic.h>
38 #include <rte_branch_prediction.h>
39 #include <rte_mempool.h>
40 #include <rte_malloc.h>
41 #include <rte_mbuf.h>
42 #include <rte_mbuf_pool_ops.h>
43 #include <rte_interrupts.h>
44 #include <rte_pci.h>
45 #include <rte_ether.h>
46 #include <rte_ethdev.h>
47 #include <rte_dev.h>
48 #include <rte_string_fns.h>
49 #ifdef RTE_NET_IXGBE
50 #include <rte_pmd_ixgbe.h>
51 #endif
52 #ifdef RTE_LIB_PDUMP
53 #include <rte_pdump.h>
54 #endif
55 #include <rte_flow.h>
56 #include <rte_metrics.h>
57 #ifdef RTE_LIB_BITRATESTATS
58 #include <rte_bitrate.h>
59 #endif
60 #ifdef RTE_LIB_LATENCYSTATS
61 #include <rte_latencystats.h>
62 #endif
63
64 #include "testpmd.h"
65
66 #ifndef MAP_HUGETLB
67 /* FreeBSD may not have MAP_HUGETLB (in fact, it probably doesn't) */
68 #define HUGE_FLAG (0x40000)
69 #else
70 #define HUGE_FLAG MAP_HUGETLB
71 #endif
72
73 #ifndef MAP_HUGE_SHIFT
74 /* older kernels (or FreeBSD) will not have this define */
75 #define HUGE_SHIFT (26)
76 #else
77 #define HUGE_SHIFT MAP_HUGE_SHIFT
78 #endif
79
80 #define EXTMEM_HEAP_NAME "extmem"
81 #define EXTBUF_ZONE_SIZE RTE_PGSIZE_2M
82
83 uint16_t verbose_level = 0; /**< Silent by default. */
84 int testpmd_logtype; /**< Log type for testpmd logs */
85
86 /* use main core for command line ? */
87 uint8_t interactive = 0;
88 uint8_t auto_start = 0;
89 uint8_t tx_first;
90 char cmdline_filename[PATH_MAX] = {0};
91
92 /*
93  * NUMA support configuration.
94  * When set, the NUMA support attempts to dispatch the allocation of the
95  * RX and TX memory rings, and of the DMA memory buffers (mbufs) for the
96  * probed ports among the CPU sockets 0 and 1.
97  * Otherwise, all memory is allocated from CPU socket 0.
98  */
99 uint8_t numa_support = 1; /**< numa enabled by default */
100
101 /*
102  * In UMA mode,all memory is allocated from socket 0 if --socket-num is
103  * not configured.
104  */
105 uint8_t socket_num = UMA_NO_CONFIG;
106
107 /*
108  * Select mempool allocation type:
109  * - native: use regular DPDK memory
110  * - anon: use regular DPDK memory to create mempool, but populate using
111  *         anonymous memory (may not be IOVA-contiguous)
112  * - xmem: use externally allocated hugepage memory
113  */
114 uint8_t mp_alloc_type = MP_ALLOC_NATIVE;
115
116 /*
117  * Store specified sockets on which memory pool to be used by ports
118  * is allocated.
119  */
120 uint8_t port_numa[RTE_MAX_ETHPORTS];
121
122 /*
123  * Store specified sockets on which RX ring to be used by ports
124  * is allocated.
125  */
126 uint8_t rxring_numa[RTE_MAX_ETHPORTS];
127
128 /*
129  * Store specified sockets on which TX ring to be used by ports
130  * is allocated.
131  */
132 uint8_t txring_numa[RTE_MAX_ETHPORTS];
133
134 /*
135  * Record the Ethernet address of peer target ports to which packets are
136  * forwarded.
137  * Must be instantiated with the ethernet addresses of peer traffic generator
138  * ports.
139  */
140 struct rte_ether_addr peer_eth_addrs[RTE_MAX_ETHPORTS];
141 portid_t nb_peer_eth_addrs = 0;
142
143 /*
144  * Probed Target Environment.
145  */
146 struct rte_port *ports;        /**< For all probed ethernet ports. */
147 portid_t nb_ports;             /**< Number of probed ethernet ports. */
148 struct fwd_lcore **fwd_lcores; /**< For all probed logical cores. */
149 lcoreid_t nb_lcores;           /**< Number of probed logical cores. */
150
151 portid_t ports_ids[RTE_MAX_ETHPORTS]; /**< Store all port ids. */
152
153 /*
154  * Test Forwarding Configuration.
155  *    nb_fwd_lcores <= nb_cfg_lcores <= nb_lcores
156  *    nb_fwd_ports  <= nb_cfg_ports  <= nb_ports
157  */
158 lcoreid_t nb_cfg_lcores; /**< Number of configured logical cores. */
159 lcoreid_t nb_fwd_lcores; /**< Number of forwarding logical cores. */
160 portid_t  nb_cfg_ports;  /**< Number of configured ports. */
161 portid_t  nb_fwd_ports;  /**< Number of forwarding ports. */
162
163 unsigned int fwd_lcores_cpuids[RTE_MAX_LCORE]; /**< CPU ids configuration. */
164 portid_t fwd_ports_ids[RTE_MAX_ETHPORTS];      /**< Port ids configuration. */
165
166 struct fwd_stream **fwd_streams; /**< For each RX queue of each port. */
167 streamid_t nb_fwd_streams;       /**< Is equal to (nb_ports * nb_rxq). */
168
169 /*
170  * Forwarding engines.
171  */
172 struct fwd_engine * fwd_engines[] = {
173         &io_fwd_engine,
174         &mac_fwd_engine,
175         &mac_swap_engine,
176         &flow_gen_engine,
177         &rx_only_engine,
178         &tx_only_engine,
179         &csum_fwd_engine,
180         &icmp_echo_engine,
181         &noisy_vnf_engine,
182         &five_tuple_swap_fwd_engine,
183 #ifdef RTE_LIBRTE_IEEE1588
184         &ieee1588_fwd_engine,
185 #endif
186         NULL,
187 };
188
189 struct rte_mempool *mempools[RTE_MAX_NUMA_NODES * MAX_SEGS_BUFFER_SPLIT];
190 uint16_t mempool_flags;
191
192 struct fwd_config cur_fwd_config;
193 struct fwd_engine *cur_fwd_eng = &io_fwd_engine; /**< IO mode by default. */
194 uint32_t retry_enabled;
195 uint32_t burst_tx_delay_time = BURST_TX_WAIT_US;
196 uint32_t burst_tx_retry_num = BURST_TX_RETRIES;
197
198 uint32_t mbuf_data_size_n = 1; /* Number of specified mbuf sizes. */
199 uint16_t mbuf_data_size[MAX_SEGS_BUFFER_SPLIT] = {
200         DEFAULT_MBUF_DATA_SIZE
201 }; /**< Mbuf data space size. */
202 uint32_t param_total_num_mbufs = 0;  /**< number of mbufs in all pools - if
203                                       * specified on command-line. */
204 uint16_t stats_period; /**< Period to show statistics (disabled by default) */
205
206 /*
207  * In container, it cannot terminate the process which running with 'stats-period'
208  * option. Set flag to exit stats period loop after received SIGINT/SIGTERM.
209  */
210 uint8_t f_quit;
211
212 /*
213  * Configuration of packet segments used to scatter received packets
214  * if some of split features is configured.
215  */
216 uint16_t rx_pkt_seg_lengths[MAX_SEGS_BUFFER_SPLIT];
217 uint8_t  rx_pkt_nb_segs; /**< Number of segments to split */
218 uint16_t rx_pkt_seg_offsets[MAX_SEGS_BUFFER_SPLIT];
219 uint8_t  rx_pkt_nb_offs; /**< Number of specified offsets */
220
221 /*
222  * Configuration of packet segments used by the "txonly" processing engine.
223  */
224 uint16_t tx_pkt_length = TXONLY_DEF_PACKET_LEN; /**< TXONLY packet length. */
225 uint16_t tx_pkt_seg_lengths[RTE_MAX_SEGS_PER_PKT] = {
226         TXONLY_DEF_PACKET_LEN,
227 };
228 uint8_t  tx_pkt_nb_segs = 1; /**< Number of segments in TXONLY packets */
229
230 enum tx_pkt_split tx_pkt_split = TX_PKT_SPLIT_OFF;
231 /**< Split policy for packets to TX. */
232
233 uint8_t txonly_multi_flow;
234 /**< Whether multiple flows are generated in TXONLY mode. */
235
236 uint32_t tx_pkt_times_inter;
237 /**< Timings for send scheduling in TXONLY mode, time between bursts. */
238
239 uint32_t tx_pkt_times_intra;
240 /**< Timings for send scheduling in TXONLY mode, time between packets. */
241
242 uint16_t nb_pkt_per_burst = DEF_PKT_BURST; /**< Number of packets per burst. */
243 uint16_t mb_mempool_cache = DEF_MBUF_CACHE; /**< Size of mbuf mempool cache. */
244
245 /* current configuration is in DCB or not,0 means it is not in DCB mode */
246 uint8_t dcb_config = 0;
247
248 /* Whether the dcb is in testing status */
249 uint8_t dcb_test = 0;
250
251 /*
252  * Configurable number of RX/TX queues.
253  */
254 queueid_t nb_hairpinq; /**< Number of hairpin queues per port. */
255 queueid_t nb_rxq = 1; /**< Number of RX queues per port. */
256 queueid_t nb_txq = 1; /**< Number of TX queues per port. */
257
258 /*
259  * Configurable number of RX/TX ring descriptors.
260  * Defaults are supplied by drivers via ethdev.
261  */
262 #define RTE_TEST_RX_DESC_DEFAULT 0
263 #define RTE_TEST_TX_DESC_DEFAULT 0
264 uint16_t nb_rxd = RTE_TEST_RX_DESC_DEFAULT; /**< Number of RX descriptors. */
265 uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT; /**< Number of TX descriptors. */
266
267 #define RTE_PMD_PARAM_UNSET -1
268 /*
269  * Configurable values of RX and TX ring threshold registers.
270  */
271
272 int8_t rx_pthresh = RTE_PMD_PARAM_UNSET;
273 int8_t rx_hthresh = RTE_PMD_PARAM_UNSET;
274 int8_t rx_wthresh = RTE_PMD_PARAM_UNSET;
275
276 int8_t tx_pthresh = RTE_PMD_PARAM_UNSET;
277 int8_t tx_hthresh = RTE_PMD_PARAM_UNSET;
278 int8_t tx_wthresh = RTE_PMD_PARAM_UNSET;
279
280 /*
281  * Configurable value of RX free threshold.
282  */
283 int16_t rx_free_thresh = RTE_PMD_PARAM_UNSET;
284
285 /*
286  * Configurable value of RX drop enable.
287  */
288 int8_t rx_drop_en = RTE_PMD_PARAM_UNSET;
289
290 /*
291  * Configurable value of TX free threshold.
292  */
293 int16_t tx_free_thresh = RTE_PMD_PARAM_UNSET;
294
295 /*
296  * Configurable value of TX RS bit threshold.
297  */
298 int16_t tx_rs_thresh = RTE_PMD_PARAM_UNSET;
299
300 /*
301  * Configurable value of buffered packets before sending.
302  */
303 uint16_t noisy_tx_sw_bufsz;
304
305 /*
306  * Configurable value of packet buffer timeout.
307  */
308 uint16_t noisy_tx_sw_buf_flush_time;
309
310 /*
311  * Configurable value for size of VNF internal memory area
312  * used for simulating noisy neighbour behaviour
313  */
314 uint64_t noisy_lkup_mem_sz;
315
316 /*
317  * Configurable value of number of random writes done in
318  * VNF simulation memory area.
319  */
320 uint64_t noisy_lkup_num_writes;
321
322 /*
323  * Configurable value of number of random reads done in
324  * VNF simulation memory area.
325  */
326 uint64_t noisy_lkup_num_reads;
327
328 /*
329  * Configurable value of number of random reads/writes done in
330  * VNF simulation memory area.
331  */
332 uint64_t noisy_lkup_num_reads_writes;
333
334 /*
335  * Receive Side Scaling (RSS) configuration.
336  */
337 uint64_t rss_hf = ETH_RSS_IP; /* RSS IP by default. */
338
339 /*
340  * Port topology configuration
341  */
342 uint16_t port_topology = PORT_TOPOLOGY_PAIRED; /* Ports are paired by default */
343
344 /*
345  * Avoids to flush all the RX streams before starts forwarding.
346  */
347 uint8_t no_flush_rx = 0; /* flush by default */
348
349 /*
350  * Flow API isolated mode.
351  */
352 uint8_t flow_isolate_all;
353
354 /*
355  * Avoids to check link status when starting/stopping a port.
356  */
357 uint8_t no_link_check = 0; /* check by default */
358
359 /*
360  * Don't automatically start all ports in interactive mode.
361  */
362 uint8_t no_device_start = 0;
363
364 /*
365  * Enable link status change notification
366  */
367 uint8_t lsc_interrupt = 1; /* enabled by default */
368
369 /*
370  * Enable device removal notification.
371  */
372 uint8_t rmv_interrupt = 1; /* enabled by default */
373
374 uint8_t hot_plug = 0; /**< hotplug disabled by default. */
375
376 /* After attach, port setup is called on event or by iterator */
377 bool setup_on_probe_event = true;
378
379 /* Clear ptypes on port initialization. */
380 uint8_t clear_ptypes = true;
381
382 /* Hairpin ports configuration mode. */
383 uint16_t hairpin_mode;
384
385 /* Pretty printing of ethdev events */
386 static const char * const eth_event_desc[] = {
387         [RTE_ETH_EVENT_UNKNOWN] = "unknown",
388         [RTE_ETH_EVENT_INTR_LSC] = "link state change",
389         [RTE_ETH_EVENT_QUEUE_STATE] = "queue state",
390         [RTE_ETH_EVENT_INTR_RESET] = "reset",
391         [RTE_ETH_EVENT_VF_MBOX] = "VF mbox",
392         [RTE_ETH_EVENT_IPSEC] = "IPsec",
393         [RTE_ETH_EVENT_MACSEC] = "MACsec",
394         [RTE_ETH_EVENT_INTR_RMV] = "device removal",
395         [RTE_ETH_EVENT_NEW] = "device probed",
396         [RTE_ETH_EVENT_DESTROY] = "device released",
397         [RTE_ETH_EVENT_FLOW_AGED] = "flow aged",
398         [RTE_ETH_EVENT_MAX] = NULL,
399 };
400
401 /*
402  * Display or mask ether events
403  * Default to all events except VF_MBOX
404  */
405 uint32_t event_print_mask = (UINT32_C(1) << RTE_ETH_EVENT_UNKNOWN) |
406                             (UINT32_C(1) << RTE_ETH_EVENT_INTR_LSC) |
407                             (UINT32_C(1) << RTE_ETH_EVENT_QUEUE_STATE) |
408                             (UINT32_C(1) << RTE_ETH_EVENT_INTR_RESET) |
409                             (UINT32_C(1) << RTE_ETH_EVENT_IPSEC) |
410                             (UINT32_C(1) << RTE_ETH_EVENT_MACSEC) |
411                             (UINT32_C(1) << RTE_ETH_EVENT_INTR_RMV) |
412                             (UINT32_C(1) << RTE_ETH_EVENT_FLOW_AGED);
413 /*
414  * Decide if all memory are locked for performance.
415  */
416 int do_mlockall = 0;
417
418 /*
419  * NIC bypass mode configuration options.
420  */
421
422 #if defined RTE_NET_IXGBE && defined RTE_LIBRTE_IXGBE_BYPASS
423 /* The NIC bypass watchdog timeout. */
424 uint32_t bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_OFF;
425 #endif
426
427
428 #ifdef RTE_LIB_LATENCYSTATS
429
430 /*
431  * Set when latency stats is enabled in the commandline
432  */
433 uint8_t latencystats_enabled;
434
435 /*
436  * Lcore ID to serive latency statistics.
437  */
438 lcoreid_t latencystats_lcore_id = -1;
439
440 #endif
441
442 /*
443  * Ethernet device configuration.
444  */
445 struct rte_eth_rxmode rx_mode = {
446         .max_rx_pkt_len = RTE_ETHER_MAX_LEN,
447                 /**< Default maximum frame length. */
448 };
449
450 struct rte_eth_txmode tx_mode = {
451         .offloads = DEV_TX_OFFLOAD_MBUF_FAST_FREE,
452 };
453
454 struct rte_fdir_conf fdir_conf = {
455         .mode = RTE_FDIR_MODE_NONE,
456         .pballoc = RTE_FDIR_PBALLOC_64K,
457         .status = RTE_FDIR_REPORT_STATUS,
458         .mask = {
459                 .vlan_tci_mask = 0xFFEF,
460                 .ipv4_mask     = {
461                         .src_ip = 0xFFFFFFFF,
462                         .dst_ip = 0xFFFFFFFF,
463                 },
464                 .ipv6_mask     = {
465                         .src_ip = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF},
466                         .dst_ip = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF},
467                 },
468                 .src_port_mask = 0xFFFF,
469                 .dst_port_mask = 0xFFFF,
470                 .mac_addr_byte_mask = 0xFF,
471                 .tunnel_type_mask = 1,
472                 .tunnel_id_mask = 0xFFFFFFFF,
473         },
474         .drop_queue = 127,
475 };
476
477 volatile int test_done = 1; /* stop packet forwarding when set to 1. */
478
479 /*
480  * Display zero values by default for xstats
481  */
482 uint8_t xstats_hide_zero;
483
484 /*
485  * Measure of CPU cycles disabled by default
486  */
487 uint8_t record_core_cycles;
488
489 /*
490  * Display of RX and TX bursts disabled by default
491  */
492 uint8_t record_burst_stats;
493
494 unsigned int num_sockets = 0;
495 unsigned int socket_ids[RTE_MAX_NUMA_NODES];
496
497 #ifdef RTE_LIB_BITRATESTATS
498 /* Bitrate statistics */
499 struct rte_stats_bitrates *bitrate_data;
500 lcoreid_t bitrate_lcore_id;
501 uint8_t bitrate_enabled;
502 #endif
503
504 struct gro_status gro_ports[RTE_MAX_ETHPORTS];
505 uint8_t gro_flush_cycles = GRO_DEFAULT_FLUSH_CYCLES;
506
507 /*
508  * hexadecimal bitmask of RX mq mode can be enabled.
509  */
510 enum rte_eth_rx_mq_mode rx_mq_mode = ETH_MQ_RX_VMDQ_DCB_RSS;
511
512 /* Forward function declarations */
513 static void setup_attached_port(portid_t pi);
514 static void check_all_ports_link_status(uint32_t port_mask);
515 static int eth_event_callback(portid_t port_id,
516                               enum rte_eth_event_type type,
517                               void *param, void *ret_param);
518 static void dev_event_callback(const char *device_name,
519                                 enum rte_dev_event_type type,
520                                 void *param);
521
522 /*
523  * Check if all the ports are started.
524  * If yes, return positive value. If not, return zero.
525  */
526 static int all_ports_started(void);
527
528 struct gso_status gso_ports[RTE_MAX_ETHPORTS];
529 uint16_t gso_max_segment_size = RTE_ETHER_MAX_LEN - RTE_ETHER_CRC_LEN;
530
531 /* Holds the registered mbuf dynamic flags names. */
532 char dynf_names[64][RTE_MBUF_DYN_NAMESIZE];
533
534 /*
535  * Helper function to check if socket is already discovered.
536  * If yes, return positive value. If not, return zero.
537  */
538 int
539 new_socket_id(unsigned int socket_id)
540 {
541         unsigned int i;
542
543         for (i = 0; i < num_sockets; i++) {
544                 if (socket_ids[i] == socket_id)
545                         return 0;
546         }
547         return 1;
548 }
549
550 /*
551  * Setup default configuration.
552  */
553 static void
554 set_default_fwd_lcores_config(void)
555 {
556         unsigned int i;
557         unsigned int nb_lc;
558         unsigned int sock_num;
559
560         nb_lc = 0;
561         for (i = 0; i < RTE_MAX_LCORE; i++) {
562                 if (!rte_lcore_is_enabled(i))
563                         continue;
564                 sock_num = rte_lcore_to_socket_id(i);
565                 if (new_socket_id(sock_num)) {
566                         if (num_sockets >= RTE_MAX_NUMA_NODES) {
567                                 rte_exit(EXIT_FAILURE,
568                                          "Total sockets greater than %u\n",
569                                          RTE_MAX_NUMA_NODES);
570                         }
571                         socket_ids[num_sockets++] = sock_num;
572                 }
573                 if (i == rte_get_main_lcore())
574                         continue;
575                 fwd_lcores_cpuids[nb_lc++] = i;
576         }
577         nb_lcores = (lcoreid_t) nb_lc;
578         nb_cfg_lcores = nb_lcores;
579         nb_fwd_lcores = 1;
580 }
581
582 static void
583 set_def_peer_eth_addrs(void)
584 {
585         portid_t i;
586
587         for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
588                 peer_eth_addrs[i].addr_bytes[0] = RTE_ETHER_LOCAL_ADMIN_ADDR;
589                 peer_eth_addrs[i].addr_bytes[5] = i;
590         }
591 }
592
593 static void
594 set_default_fwd_ports_config(void)
595 {
596         portid_t pt_id;
597         int i = 0;
598
599         RTE_ETH_FOREACH_DEV(pt_id) {
600                 fwd_ports_ids[i++] = pt_id;
601
602                 /* Update sockets info according to the attached device */
603                 int socket_id = rte_eth_dev_socket_id(pt_id);
604                 if (socket_id >= 0 && new_socket_id(socket_id)) {
605                         if (num_sockets >= RTE_MAX_NUMA_NODES) {
606                                 rte_exit(EXIT_FAILURE,
607                                          "Total sockets greater than %u\n",
608                                          RTE_MAX_NUMA_NODES);
609                         }
610                         socket_ids[num_sockets++] = socket_id;
611                 }
612         }
613
614         nb_cfg_ports = nb_ports;
615         nb_fwd_ports = nb_ports;
616 }
617
618 void
619 set_def_fwd_config(void)
620 {
621         set_default_fwd_lcores_config();
622         set_def_peer_eth_addrs();
623         set_default_fwd_ports_config();
624 }
625
626 /* extremely pessimistic estimation of memory required to create a mempool */
627 static int
628 calc_mem_size(uint32_t nb_mbufs, uint32_t mbuf_sz, size_t pgsz, size_t *out)
629 {
630         unsigned int n_pages, mbuf_per_pg, leftover;
631         uint64_t total_mem, mbuf_mem, obj_sz;
632
633         /* there is no good way to predict how much space the mempool will
634          * occupy because it will allocate chunks on the fly, and some of those
635          * will come from default DPDK memory while some will come from our
636          * external memory, so just assume 128MB will be enough for everyone.
637          */
638         uint64_t hdr_mem = 128 << 20;
639
640         /* account for possible non-contiguousness */
641         obj_sz = rte_mempool_calc_obj_size(mbuf_sz, 0, NULL);
642         if (obj_sz > pgsz) {
643                 TESTPMD_LOG(ERR, "Object size is bigger than page size\n");
644                 return -1;
645         }
646
647         mbuf_per_pg = pgsz / obj_sz;
648         leftover = (nb_mbufs % mbuf_per_pg) > 0;
649         n_pages = (nb_mbufs / mbuf_per_pg) + leftover;
650
651         mbuf_mem = n_pages * pgsz;
652
653         total_mem = RTE_ALIGN(hdr_mem + mbuf_mem, pgsz);
654
655         if (total_mem > SIZE_MAX) {
656                 TESTPMD_LOG(ERR, "Memory size too big\n");
657                 return -1;
658         }
659         *out = (size_t)total_mem;
660
661         return 0;
662 }
663
664 static int
665 pagesz_flags(uint64_t page_sz)
666 {
667         /* as per mmap() manpage, all page sizes are log2 of page size
668          * shifted by MAP_HUGE_SHIFT
669          */
670         int log2 = rte_log2_u64(page_sz);
671
672         return (log2 << HUGE_SHIFT);
673 }
674
675 static void *
676 alloc_mem(size_t memsz, size_t pgsz, bool huge)
677 {
678         void *addr;
679         int flags;
680
681         /* allocate anonymous hugepages */
682         flags = MAP_ANONYMOUS | MAP_PRIVATE;
683         if (huge)
684                 flags |= HUGE_FLAG | pagesz_flags(pgsz);
685
686         addr = mmap(NULL, memsz, PROT_READ | PROT_WRITE, flags, -1, 0);
687         if (addr == MAP_FAILED)
688                 return NULL;
689
690         return addr;
691 }
692
693 struct extmem_param {
694         void *addr;
695         size_t len;
696         size_t pgsz;
697         rte_iova_t *iova_table;
698         unsigned int iova_table_len;
699 };
700
701 static int
702 create_extmem(uint32_t nb_mbufs, uint32_t mbuf_sz, struct extmem_param *param,
703                 bool huge)
704 {
705         uint64_t pgsizes[] = {RTE_PGSIZE_2M, RTE_PGSIZE_1G, /* x86_64, ARM */
706                         RTE_PGSIZE_16M, RTE_PGSIZE_16G};    /* POWER */
707         unsigned int cur_page, n_pages, pgsz_idx;
708         size_t mem_sz, cur_pgsz;
709         rte_iova_t *iovas = NULL;
710         void *addr;
711         int ret;
712
713         for (pgsz_idx = 0; pgsz_idx < RTE_DIM(pgsizes); pgsz_idx++) {
714                 /* skip anything that is too big */
715                 if (pgsizes[pgsz_idx] > SIZE_MAX)
716                         continue;
717
718                 cur_pgsz = pgsizes[pgsz_idx];
719
720                 /* if we were told not to allocate hugepages, override */
721                 if (!huge)
722                         cur_pgsz = sysconf(_SC_PAGESIZE);
723
724                 ret = calc_mem_size(nb_mbufs, mbuf_sz, cur_pgsz, &mem_sz);
725                 if (ret < 0) {
726                         TESTPMD_LOG(ERR, "Cannot calculate memory size\n");
727                         return -1;
728                 }
729
730                 /* allocate our memory */
731                 addr = alloc_mem(mem_sz, cur_pgsz, huge);
732
733                 /* if we couldn't allocate memory with a specified page size,
734                  * that doesn't mean we can't do it with other page sizes, so
735                  * try another one.
736                  */
737                 if (addr == NULL)
738                         continue;
739
740                 /* store IOVA addresses for every page in this memory area */
741                 n_pages = mem_sz / cur_pgsz;
742
743                 iovas = malloc(sizeof(*iovas) * n_pages);
744
745                 if (iovas == NULL) {
746                         TESTPMD_LOG(ERR, "Cannot allocate memory for iova addresses\n");
747                         goto fail;
748                 }
749                 /* lock memory if it's not huge pages */
750                 if (!huge)
751                         mlock(addr, mem_sz);
752
753                 /* populate IOVA addresses */
754                 for (cur_page = 0; cur_page < n_pages; cur_page++) {
755                         rte_iova_t iova;
756                         size_t offset;
757                         void *cur;
758
759                         offset = cur_pgsz * cur_page;
760                         cur = RTE_PTR_ADD(addr, offset);
761
762                         /* touch the page before getting its IOVA */
763                         *(volatile char *)cur = 0;
764
765                         iova = rte_mem_virt2iova(cur);
766
767                         iovas[cur_page] = iova;
768                 }
769
770                 break;
771         }
772         /* if we couldn't allocate anything */
773         if (iovas == NULL)
774                 return -1;
775
776         param->addr = addr;
777         param->len = mem_sz;
778         param->pgsz = cur_pgsz;
779         param->iova_table = iovas;
780         param->iova_table_len = n_pages;
781
782         return 0;
783 fail:
784         if (iovas)
785                 free(iovas);
786         if (addr)
787                 munmap(addr, mem_sz);
788
789         return -1;
790 }
791
792 static int
793 setup_extmem(uint32_t nb_mbufs, uint32_t mbuf_sz, bool huge)
794 {
795         struct extmem_param param;
796         int socket_id, ret;
797
798         memset(&param, 0, sizeof(param));
799
800         /* check if our heap exists */
801         socket_id = rte_malloc_heap_get_socket(EXTMEM_HEAP_NAME);
802         if (socket_id < 0) {
803                 /* create our heap */
804                 ret = rte_malloc_heap_create(EXTMEM_HEAP_NAME);
805                 if (ret < 0) {
806                         TESTPMD_LOG(ERR, "Cannot create heap\n");
807                         return -1;
808                 }
809         }
810
811         ret = create_extmem(nb_mbufs, mbuf_sz, &param, huge);
812         if (ret < 0) {
813                 TESTPMD_LOG(ERR, "Cannot create memory area\n");
814                 return -1;
815         }
816
817         /* we now have a valid memory area, so add it to heap */
818         ret = rte_malloc_heap_memory_add(EXTMEM_HEAP_NAME,
819                         param.addr, param.len, param.iova_table,
820                         param.iova_table_len, param.pgsz);
821
822         /* when using VFIO, memory is automatically mapped for DMA by EAL */
823
824         /* not needed any more */
825         free(param.iova_table);
826
827         if (ret < 0) {
828                 TESTPMD_LOG(ERR, "Cannot add memory to heap\n");
829                 munmap(param.addr, param.len);
830                 return -1;
831         }
832
833         /* success */
834
835         TESTPMD_LOG(DEBUG, "Allocated %zuMB of external memory\n",
836                         param.len >> 20);
837
838         return 0;
839 }
840 static void
841 dma_unmap_cb(struct rte_mempool *mp __rte_unused, void *opaque __rte_unused,
842              struct rte_mempool_memhdr *memhdr, unsigned mem_idx __rte_unused)
843 {
844         uint16_t pid = 0;
845         int ret;
846
847         RTE_ETH_FOREACH_DEV(pid) {
848                 struct rte_eth_dev *dev =
849                         &rte_eth_devices[pid];
850
851                 ret = rte_dev_dma_unmap(dev->device, memhdr->addr, 0,
852                                         memhdr->len);
853                 if (ret) {
854                         TESTPMD_LOG(DEBUG,
855                                     "unable to DMA unmap addr 0x%p "
856                                     "for device %s\n",
857                                     memhdr->addr, dev->data->name);
858                 }
859         }
860         ret = rte_extmem_unregister(memhdr->addr, memhdr->len);
861         if (ret) {
862                 TESTPMD_LOG(DEBUG,
863                             "unable to un-register addr 0x%p\n", memhdr->addr);
864         }
865 }
866
867 static void
868 dma_map_cb(struct rte_mempool *mp __rte_unused, void *opaque __rte_unused,
869            struct rte_mempool_memhdr *memhdr, unsigned mem_idx __rte_unused)
870 {
871         uint16_t pid = 0;
872         size_t page_size = sysconf(_SC_PAGESIZE);
873         int ret;
874
875         ret = rte_extmem_register(memhdr->addr, memhdr->len, NULL, 0,
876                                   page_size);
877         if (ret) {
878                 TESTPMD_LOG(DEBUG,
879                             "unable to register addr 0x%p\n", memhdr->addr);
880                 return;
881         }
882         RTE_ETH_FOREACH_DEV(pid) {
883                 struct rte_eth_dev *dev =
884                         &rte_eth_devices[pid];
885
886                 ret = rte_dev_dma_map(dev->device, memhdr->addr, 0,
887                                       memhdr->len);
888                 if (ret) {
889                         TESTPMD_LOG(DEBUG,
890                                     "unable to DMA map addr 0x%p "
891                                     "for device %s\n",
892                                     memhdr->addr, dev->data->name);
893                 }
894         }
895 }
896
897 static unsigned int
898 setup_extbuf(uint32_t nb_mbufs, uint16_t mbuf_sz, unsigned int socket_id,
899             char *pool_name, struct rte_pktmbuf_extmem **ext_mem)
900 {
901         struct rte_pktmbuf_extmem *xmem;
902         unsigned int ext_num, zone_num, elt_num;
903         uint16_t elt_size;
904
905         elt_size = RTE_ALIGN_CEIL(mbuf_sz, RTE_CACHE_LINE_SIZE);
906         elt_num = EXTBUF_ZONE_SIZE / elt_size;
907         zone_num = (nb_mbufs + elt_num - 1) / elt_num;
908
909         xmem = malloc(sizeof(struct rte_pktmbuf_extmem) * zone_num);
910         if (xmem == NULL) {
911                 TESTPMD_LOG(ERR, "Cannot allocate memory for "
912                                  "external buffer descriptors\n");
913                 *ext_mem = NULL;
914                 return 0;
915         }
916         for (ext_num = 0; ext_num < zone_num; ext_num++) {
917                 struct rte_pktmbuf_extmem *xseg = xmem + ext_num;
918                 const struct rte_memzone *mz;
919                 char mz_name[RTE_MEMZONE_NAMESIZE];
920                 int ret;
921
922                 ret = snprintf(mz_name, sizeof(mz_name),
923                         RTE_MEMPOOL_MZ_FORMAT "_xb_%u", pool_name, ext_num);
924                 if (ret < 0 || ret >= (int)sizeof(mz_name)) {
925                         errno = ENAMETOOLONG;
926                         ext_num = 0;
927                         break;
928                 }
929                 mz = rte_memzone_reserve_aligned(mz_name, EXTBUF_ZONE_SIZE,
930                                                  socket_id,
931                                                  RTE_MEMZONE_IOVA_CONTIG |
932                                                  RTE_MEMZONE_1GB |
933                                                  RTE_MEMZONE_SIZE_HINT_ONLY,
934                                                  EXTBUF_ZONE_SIZE);
935                 if (mz == NULL) {
936                         /*
937                          * The caller exits on external buffer creation
938                          * error, so there is no need to free memzones.
939                          */
940                         errno = ENOMEM;
941                         ext_num = 0;
942                         break;
943                 }
944                 xseg->buf_ptr = mz->addr;
945                 xseg->buf_iova = mz->iova;
946                 xseg->buf_len = EXTBUF_ZONE_SIZE;
947                 xseg->elt_size = elt_size;
948         }
949         if (ext_num == 0 && xmem != NULL) {
950                 free(xmem);
951                 xmem = NULL;
952         }
953         *ext_mem = xmem;
954         return ext_num;
955 }
956
957 /*
958  * Configuration initialisation done once at init time.
959  */
960 static struct rte_mempool *
961 mbuf_pool_create(uint16_t mbuf_seg_size, unsigned nb_mbuf,
962                  unsigned int socket_id, uint16_t size_idx)
963 {
964         char pool_name[RTE_MEMPOOL_NAMESIZE];
965         struct rte_mempool *rte_mp = NULL;
966         uint32_t mb_size;
967
968         mb_size = sizeof(struct rte_mbuf) + mbuf_seg_size;
969         mbuf_poolname_build(socket_id, pool_name, sizeof(pool_name), size_idx);
970
971         TESTPMD_LOG(INFO,
972                 "create a new mbuf pool <%s>: n=%u, size=%u, socket=%u\n",
973                 pool_name, nb_mbuf, mbuf_seg_size, socket_id);
974
975         switch (mp_alloc_type) {
976         case MP_ALLOC_NATIVE:
977                 {
978                         /* wrapper to rte_mempool_create() */
979                         TESTPMD_LOG(INFO, "preferred mempool ops selected: %s\n",
980                                         rte_mbuf_best_mempool_ops());
981                         rte_mp = rte_pktmbuf_pool_create(pool_name, nb_mbuf,
982                                 mb_mempool_cache, 0, mbuf_seg_size, socket_id);
983                         break;
984                 }
985         case MP_ALLOC_ANON:
986                 {
987                         rte_mp = rte_mempool_create_empty(pool_name, nb_mbuf,
988                                 mb_size, (unsigned int) mb_mempool_cache,
989                                 sizeof(struct rte_pktmbuf_pool_private),
990                                 socket_id, mempool_flags);
991                         if (rte_mp == NULL)
992                                 goto err;
993
994                         if (rte_mempool_populate_anon(rte_mp) == 0) {
995                                 rte_mempool_free(rte_mp);
996                                 rte_mp = NULL;
997                                 goto err;
998                         }
999                         rte_pktmbuf_pool_init(rte_mp, NULL);
1000                         rte_mempool_obj_iter(rte_mp, rte_pktmbuf_init, NULL);
1001                         rte_mempool_mem_iter(rte_mp, dma_map_cb, NULL);
1002                         break;
1003                 }
1004         case MP_ALLOC_XMEM:
1005         case MP_ALLOC_XMEM_HUGE:
1006                 {
1007                         int heap_socket;
1008                         bool huge = mp_alloc_type == MP_ALLOC_XMEM_HUGE;
1009
1010                         if (setup_extmem(nb_mbuf, mbuf_seg_size, huge) < 0)
1011                                 rte_exit(EXIT_FAILURE, "Could not create external memory\n");
1012
1013                         heap_socket =
1014                                 rte_malloc_heap_get_socket(EXTMEM_HEAP_NAME);
1015                         if (heap_socket < 0)
1016                                 rte_exit(EXIT_FAILURE, "Could not get external memory socket ID\n");
1017
1018                         TESTPMD_LOG(INFO, "preferred mempool ops selected: %s\n",
1019                                         rte_mbuf_best_mempool_ops());
1020                         rte_mp = rte_pktmbuf_pool_create(pool_name, nb_mbuf,
1021                                         mb_mempool_cache, 0, mbuf_seg_size,
1022                                         heap_socket);
1023                         break;
1024                 }
1025         case MP_ALLOC_XBUF:
1026                 {
1027                         struct rte_pktmbuf_extmem *ext_mem;
1028                         unsigned int ext_num;
1029
1030                         ext_num = setup_extbuf(nb_mbuf, mbuf_seg_size,
1031                                                socket_id, pool_name, &ext_mem);
1032                         if (ext_num == 0)
1033                                 rte_exit(EXIT_FAILURE,
1034                                          "Can't create pinned data buffers\n");
1035
1036                         TESTPMD_LOG(INFO, "preferred mempool ops selected: %s\n",
1037                                         rte_mbuf_best_mempool_ops());
1038                         rte_mp = rte_pktmbuf_pool_create_extbuf
1039                                         (pool_name, nb_mbuf, mb_mempool_cache,
1040                                          0, mbuf_seg_size, socket_id,
1041                                          ext_mem, ext_num);
1042                         free(ext_mem);
1043                         break;
1044                 }
1045         default:
1046                 {
1047                         rte_exit(EXIT_FAILURE, "Invalid mempool creation mode\n");
1048                 }
1049         }
1050
1051 err:
1052         if (rte_mp == NULL) {
1053                 rte_exit(EXIT_FAILURE,
1054                         "Creation of mbuf pool for socket %u failed: %s\n",
1055                         socket_id, rte_strerror(rte_errno));
1056         } else if (verbose_level > 0) {
1057                 rte_mempool_dump(stdout, rte_mp);
1058         }
1059         return rte_mp;
1060 }
1061
1062 /*
1063  * Check given socket id is valid or not with NUMA mode,
1064  * if valid, return 0, else return -1
1065  */
1066 static int
1067 check_socket_id(const unsigned int socket_id)
1068 {
1069         static int warning_once = 0;
1070
1071         if (new_socket_id(socket_id)) {
1072                 if (!warning_once && numa_support)
1073                         printf("Warning: NUMA should be configured manually by"
1074                                " using --port-numa-config and"
1075                                " --ring-numa-config parameters along with"
1076                                " --numa.\n");
1077                 warning_once = 1;
1078                 return -1;
1079         }
1080         return 0;
1081 }
1082
1083 /*
1084  * Get the allowed maximum number of RX queues.
1085  * *pid return the port id which has minimal value of
1086  * max_rx_queues in all ports.
1087  */
1088 queueid_t
1089 get_allowed_max_nb_rxq(portid_t *pid)
1090 {
1091         queueid_t allowed_max_rxq = RTE_MAX_QUEUES_PER_PORT;
1092         bool max_rxq_valid = false;
1093         portid_t pi;
1094         struct rte_eth_dev_info dev_info;
1095
1096         RTE_ETH_FOREACH_DEV(pi) {
1097                 if (eth_dev_info_get_print_err(pi, &dev_info) != 0)
1098                         continue;
1099
1100                 max_rxq_valid = true;
1101                 if (dev_info.max_rx_queues < allowed_max_rxq) {
1102                         allowed_max_rxq = dev_info.max_rx_queues;
1103                         *pid = pi;
1104                 }
1105         }
1106         return max_rxq_valid ? allowed_max_rxq : 0;
1107 }
1108
1109 /*
1110  * Check input rxq is valid or not.
1111  * If input rxq is not greater than any of maximum number
1112  * of RX queues of all ports, it is valid.
1113  * if valid, return 0, else return -1
1114  */
1115 int
1116 check_nb_rxq(queueid_t rxq)
1117 {
1118         queueid_t allowed_max_rxq;
1119         portid_t pid = 0;
1120
1121         allowed_max_rxq = get_allowed_max_nb_rxq(&pid);
1122         if (rxq > allowed_max_rxq) {
1123                 printf("Fail: input rxq (%u) can't be greater "
1124                        "than max_rx_queues (%u) of port %u\n",
1125                        rxq,
1126                        allowed_max_rxq,
1127                        pid);
1128                 return -1;
1129         }
1130         return 0;
1131 }
1132
1133 /*
1134  * Get the allowed maximum number of TX queues.
1135  * *pid return the port id which has minimal value of
1136  * max_tx_queues in all ports.
1137  */
1138 queueid_t
1139 get_allowed_max_nb_txq(portid_t *pid)
1140 {
1141         queueid_t allowed_max_txq = RTE_MAX_QUEUES_PER_PORT;
1142         bool max_txq_valid = false;
1143         portid_t pi;
1144         struct rte_eth_dev_info dev_info;
1145
1146         RTE_ETH_FOREACH_DEV(pi) {
1147                 if (eth_dev_info_get_print_err(pi, &dev_info) != 0)
1148                         continue;
1149
1150                 max_txq_valid = true;
1151                 if (dev_info.max_tx_queues < allowed_max_txq) {
1152                         allowed_max_txq = dev_info.max_tx_queues;
1153                         *pid = pi;
1154                 }
1155         }
1156         return max_txq_valid ? allowed_max_txq : 0;
1157 }
1158
1159 /*
1160  * Check input txq is valid or not.
1161  * If input txq is not greater than any of maximum number
1162  * of TX queues of all ports, it is valid.
1163  * if valid, return 0, else return -1
1164  */
1165 int
1166 check_nb_txq(queueid_t txq)
1167 {
1168         queueid_t allowed_max_txq;
1169         portid_t pid = 0;
1170
1171         allowed_max_txq = get_allowed_max_nb_txq(&pid);
1172         if (txq > allowed_max_txq) {
1173                 printf("Fail: input txq (%u) can't be greater "
1174                        "than max_tx_queues (%u) of port %u\n",
1175                        txq,
1176                        allowed_max_txq,
1177                        pid);
1178                 return -1;
1179         }
1180         return 0;
1181 }
1182
1183 /*
1184  * Get the allowed maximum number of RXDs of every rx queue.
1185  * *pid return the port id which has minimal value of
1186  * max_rxd in all queues of all ports.
1187  */
1188 static uint16_t
1189 get_allowed_max_nb_rxd(portid_t *pid)
1190 {
1191         uint16_t allowed_max_rxd = UINT16_MAX;
1192         portid_t pi;
1193         struct rte_eth_dev_info dev_info;
1194
1195         RTE_ETH_FOREACH_DEV(pi) {
1196                 if (eth_dev_info_get_print_err(pi, &dev_info) != 0)
1197                         continue;
1198
1199                 if (dev_info.rx_desc_lim.nb_max < allowed_max_rxd) {
1200                         allowed_max_rxd = dev_info.rx_desc_lim.nb_max;
1201                         *pid = pi;
1202                 }
1203         }
1204         return allowed_max_rxd;
1205 }
1206
1207 /*
1208  * Get the allowed minimal number of RXDs of every rx queue.
1209  * *pid return the port id which has minimal value of
1210  * min_rxd in all queues of all ports.
1211  */
1212 static uint16_t
1213 get_allowed_min_nb_rxd(portid_t *pid)
1214 {
1215         uint16_t allowed_min_rxd = 0;
1216         portid_t pi;
1217         struct rte_eth_dev_info dev_info;
1218
1219         RTE_ETH_FOREACH_DEV(pi) {
1220                 if (eth_dev_info_get_print_err(pi, &dev_info) != 0)
1221                         continue;
1222
1223                 if (dev_info.rx_desc_lim.nb_min > allowed_min_rxd) {
1224                         allowed_min_rxd = dev_info.rx_desc_lim.nb_min;
1225                         *pid = pi;
1226                 }
1227         }
1228
1229         return allowed_min_rxd;
1230 }
1231
1232 /*
1233  * Check input rxd is valid or not.
1234  * If input rxd is not greater than any of maximum number
1235  * of RXDs of every Rx queues and is not less than any of
1236  * minimal number of RXDs of every Rx queues, it is valid.
1237  * if valid, return 0, else return -1
1238  */
1239 int
1240 check_nb_rxd(queueid_t rxd)
1241 {
1242         uint16_t allowed_max_rxd;
1243         uint16_t allowed_min_rxd;
1244         portid_t pid = 0;
1245
1246         allowed_max_rxd = get_allowed_max_nb_rxd(&pid);
1247         if (rxd > allowed_max_rxd) {
1248                 printf("Fail: input rxd (%u) can't be greater "
1249                        "than max_rxds (%u) of port %u\n",
1250                        rxd,
1251                        allowed_max_rxd,
1252                        pid);
1253                 return -1;
1254         }
1255
1256         allowed_min_rxd = get_allowed_min_nb_rxd(&pid);
1257         if (rxd < allowed_min_rxd) {
1258                 printf("Fail: input rxd (%u) can't be less "
1259                        "than min_rxds (%u) of port %u\n",
1260                        rxd,
1261                        allowed_min_rxd,
1262                        pid);
1263                 return -1;
1264         }
1265
1266         return 0;
1267 }
1268
1269 /*
1270  * Get the allowed maximum number of TXDs of every rx queues.
1271  * *pid return the port id which has minimal value of
1272  * max_txd in every tx queue.
1273  */
1274 static uint16_t
1275 get_allowed_max_nb_txd(portid_t *pid)
1276 {
1277         uint16_t allowed_max_txd = UINT16_MAX;
1278         portid_t pi;
1279         struct rte_eth_dev_info dev_info;
1280
1281         RTE_ETH_FOREACH_DEV(pi) {
1282                 if (eth_dev_info_get_print_err(pi, &dev_info) != 0)
1283                         continue;
1284
1285                 if (dev_info.tx_desc_lim.nb_max < allowed_max_txd) {
1286                         allowed_max_txd = dev_info.tx_desc_lim.nb_max;
1287                         *pid = pi;
1288                 }
1289         }
1290         return allowed_max_txd;
1291 }
1292
1293 /*
1294  * Get the allowed maximum number of TXDs of every tx queues.
1295  * *pid return the port id which has minimal value of
1296  * min_txd in every tx queue.
1297  */
1298 static uint16_t
1299 get_allowed_min_nb_txd(portid_t *pid)
1300 {
1301         uint16_t allowed_min_txd = 0;
1302         portid_t pi;
1303         struct rte_eth_dev_info dev_info;
1304
1305         RTE_ETH_FOREACH_DEV(pi) {
1306                 if (eth_dev_info_get_print_err(pi, &dev_info) != 0)
1307                         continue;
1308
1309                 if (dev_info.tx_desc_lim.nb_min > allowed_min_txd) {
1310                         allowed_min_txd = dev_info.tx_desc_lim.nb_min;
1311                         *pid = pi;
1312                 }
1313         }
1314
1315         return allowed_min_txd;
1316 }
1317
1318 /*
1319  * Check input txd is valid or not.
1320  * If input txd is not greater than any of maximum number
1321  * of TXDs of every Rx queues, it is valid.
1322  * if valid, return 0, else return -1
1323  */
1324 int
1325 check_nb_txd(queueid_t txd)
1326 {
1327         uint16_t allowed_max_txd;
1328         uint16_t allowed_min_txd;
1329         portid_t pid = 0;
1330
1331         allowed_max_txd = get_allowed_max_nb_txd(&pid);
1332         if (txd > allowed_max_txd) {
1333                 printf("Fail: input txd (%u) can't be greater "
1334                        "than max_txds (%u) of port %u\n",
1335                        txd,
1336                        allowed_max_txd,
1337                        pid);
1338                 return -1;
1339         }
1340
1341         allowed_min_txd = get_allowed_min_nb_txd(&pid);
1342         if (txd < allowed_min_txd) {
1343                 printf("Fail: input txd (%u) can't be less "
1344                        "than min_txds (%u) of port %u\n",
1345                        txd,
1346                        allowed_min_txd,
1347                        pid);
1348                 return -1;
1349         }
1350         return 0;
1351 }
1352
1353
1354 /*
1355  * Get the allowed maximum number of hairpin queues.
1356  * *pid return the port id which has minimal value of
1357  * max_hairpin_queues in all ports.
1358  */
1359 queueid_t
1360 get_allowed_max_nb_hairpinq(portid_t *pid)
1361 {
1362         queueid_t allowed_max_hairpinq = RTE_MAX_QUEUES_PER_PORT;
1363         portid_t pi;
1364         struct rte_eth_hairpin_cap cap;
1365
1366         RTE_ETH_FOREACH_DEV(pi) {
1367                 if (rte_eth_dev_hairpin_capability_get(pi, &cap) != 0) {
1368                         *pid = pi;
1369                         return 0;
1370                 }
1371                 if (cap.max_nb_queues < allowed_max_hairpinq) {
1372                         allowed_max_hairpinq = cap.max_nb_queues;
1373                         *pid = pi;
1374                 }
1375         }
1376         return allowed_max_hairpinq;
1377 }
1378
1379 /*
1380  * Check input hairpin is valid or not.
1381  * If input hairpin is not greater than any of maximum number
1382  * of hairpin queues of all ports, it is valid.
1383  * if valid, return 0, else return -1
1384  */
1385 int
1386 check_nb_hairpinq(queueid_t hairpinq)
1387 {
1388         queueid_t allowed_max_hairpinq;
1389         portid_t pid = 0;
1390
1391         allowed_max_hairpinq = get_allowed_max_nb_hairpinq(&pid);
1392         if (hairpinq > allowed_max_hairpinq) {
1393                 printf("Fail: input hairpin (%u) can't be greater "
1394                        "than max_hairpin_queues (%u) of port %u\n",
1395                        hairpinq, allowed_max_hairpinq, pid);
1396                 return -1;
1397         }
1398         return 0;
1399 }
1400
1401 static void
1402 init_config(void)
1403 {
1404         portid_t pid;
1405         struct rte_port *port;
1406         struct rte_mempool *mbp;
1407         unsigned int nb_mbuf_per_pool;
1408         lcoreid_t  lc_id;
1409         uint8_t port_per_socket[RTE_MAX_NUMA_NODES];
1410         struct rte_gro_param gro_param;
1411         uint32_t gso_types;
1412         uint16_t data_size;
1413         uint16_t eth_overhead;
1414         bool warning = 0;
1415         int k;
1416         int ret;
1417
1418         memset(port_per_socket,0,RTE_MAX_NUMA_NODES);
1419
1420         /* Configuration of logical cores. */
1421         fwd_lcores = rte_zmalloc("testpmd: fwd_lcores",
1422                                 sizeof(struct fwd_lcore *) * nb_lcores,
1423                                 RTE_CACHE_LINE_SIZE);
1424         if (fwd_lcores == NULL) {
1425                 rte_exit(EXIT_FAILURE, "rte_zmalloc(%d (struct fwd_lcore *)) "
1426                                                         "failed\n", nb_lcores);
1427         }
1428         for (lc_id = 0; lc_id < nb_lcores; lc_id++) {
1429                 fwd_lcores[lc_id] = rte_zmalloc("testpmd: struct fwd_lcore",
1430                                                sizeof(struct fwd_lcore),
1431                                                RTE_CACHE_LINE_SIZE);
1432                 if (fwd_lcores[lc_id] == NULL) {
1433                         rte_exit(EXIT_FAILURE, "rte_zmalloc(struct fwd_lcore) "
1434                                                                 "failed\n");
1435                 }
1436                 fwd_lcores[lc_id]->cpuid_idx = lc_id;
1437         }
1438
1439         RTE_ETH_FOREACH_DEV(pid) {
1440                 port = &ports[pid];
1441                 /* Apply default TxRx configuration for all ports */
1442                 port->dev_conf.txmode = tx_mode;
1443                 port->dev_conf.rxmode = rx_mode;
1444
1445                 ret = eth_dev_info_get_print_err(pid, &port->dev_info);
1446                 if (ret != 0)
1447                         rte_exit(EXIT_FAILURE,
1448                                  "rte_eth_dev_info_get() failed\n");
1449
1450                 /* Update the max_rx_pkt_len to have MTU as RTE_ETHER_MTU */
1451                 if (port->dev_info.max_mtu != UINT16_MAX &&
1452                     port->dev_info.max_rx_pktlen > port->dev_info.max_mtu)
1453                         eth_overhead = port->dev_info.max_rx_pktlen -
1454                                 port->dev_info.max_mtu;
1455                 else
1456                         eth_overhead =
1457                                 RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN;
1458
1459                 if (port->dev_conf.rxmode.max_rx_pkt_len <=
1460                         (uint32_t)(RTE_ETHER_MTU + eth_overhead))
1461                         port->dev_conf.rxmode.max_rx_pkt_len =
1462                                         RTE_ETHER_MTU + eth_overhead;
1463                 else
1464                         port->dev_conf.rxmode.offloads |=
1465                                         DEV_RX_OFFLOAD_JUMBO_FRAME;
1466
1467                 if (!(port->dev_info.tx_offload_capa &
1468                       DEV_TX_OFFLOAD_MBUF_FAST_FREE))
1469                         port->dev_conf.txmode.offloads &=
1470                                 ~DEV_TX_OFFLOAD_MBUF_FAST_FREE;
1471                 if (numa_support) {
1472                         if (port_numa[pid] != NUMA_NO_CONFIG)
1473                                 port_per_socket[port_numa[pid]]++;
1474                         else {
1475                                 uint32_t socket_id = rte_eth_dev_socket_id(pid);
1476
1477                                 /*
1478                                  * if socket_id is invalid,
1479                                  * set to the first available socket.
1480                                  */
1481                                 if (check_socket_id(socket_id) < 0)
1482                                         socket_id = socket_ids[0];
1483                                 port_per_socket[socket_id]++;
1484                         }
1485                 }
1486
1487                 /* Apply Rx offloads configuration */
1488                 for (k = 0; k < port->dev_info.max_rx_queues; k++)
1489                         port->rx_conf[k].offloads =
1490                                 port->dev_conf.rxmode.offloads;
1491                 /* Apply Tx offloads configuration */
1492                 for (k = 0; k < port->dev_info.max_tx_queues; k++)
1493                         port->tx_conf[k].offloads =
1494                                 port->dev_conf.txmode.offloads;
1495
1496                 /* set flag to initialize port/queue */
1497                 port->need_reconfig = 1;
1498                 port->need_reconfig_queues = 1;
1499                 port->tx_metadata = 0;
1500
1501                 /* Check for maximum number of segments per MTU. Accordingly
1502                  * update the mbuf data size.
1503                  */
1504                 if (port->dev_info.rx_desc_lim.nb_mtu_seg_max != UINT16_MAX &&
1505                                 port->dev_info.rx_desc_lim.nb_mtu_seg_max != 0) {
1506                         data_size = rx_mode.max_rx_pkt_len /
1507                                 port->dev_info.rx_desc_lim.nb_mtu_seg_max;
1508
1509                         if ((data_size + RTE_PKTMBUF_HEADROOM) >
1510                                                         mbuf_data_size[0]) {
1511                                 mbuf_data_size[0] = data_size +
1512                                                  RTE_PKTMBUF_HEADROOM;
1513                                 warning = 1;
1514                         }
1515                 }
1516         }
1517
1518         if (warning)
1519                 TESTPMD_LOG(WARNING,
1520                             "Configured mbuf size of the first segment %hu\n",
1521                             mbuf_data_size[0]);
1522         /*
1523          * Create pools of mbuf.
1524          * If NUMA support is disabled, create a single pool of mbuf in
1525          * socket 0 memory by default.
1526          * Otherwise, create a pool of mbuf in the memory of sockets 0 and 1.
1527          *
1528          * Use the maximum value of nb_rxd and nb_txd here, then nb_rxd and
1529          * nb_txd can be configured at run time.
1530          */
1531         if (param_total_num_mbufs)
1532                 nb_mbuf_per_pool = param_total_num_mbufs;
1533         else {
1534                 nb_mbuf_per_pool = RTE_TEST_RX_DESC_MAX +
1535                         (nb_lcores * mb_mempool_cache) +
1536                         RTE_TEST_TX_DESC_MAX + MAX_PKT_BURST;
1537                 nb_mbuf_per_pool *= RTE_MAX_ETHPORTS;
1538         }
1539
1540         if (numa_support) {
1541                 uint8_t i, j;
1542
1543                 for (i = 0; i < num_sockets; i++)
1544                         for (j = 0; j < mbuf_data_size_n; j++)
1545                                 mempools[i * MAX_SEGS_BUFFER_SPLIT + j] =
1546                                         mbuf_pool_create(mbuf_data_size[j],
1547                                                           nb_mbuf_per_pool,
1548                                                           socket_ids[i], j);
1549         } else {
1550                 uint8_t i;
1551
1552                 for (i = 0; i < mbuf_data_size_n; i++)
1553                         mempools[i] = mbuf_pool_create
1554                                         (mbuf_data_size[i],
1555                                          nb_mbuf_per_pool,
1556                                          socket_num == UMA_NO_CONFIG ?
1557                                          0 : socket_num, i);
1558         }
1559
1560         init_port_config();
1561
1562         gso_types = DEV_TX_OFFLOAD_TCP_TSO | DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
1563                 DEV_TX_OFFLOAD_GRE_TNL_TSO | DEV_TX_OFFLOAD_UDP_TSO;
1564         /*
1565          * Records which Mbuf pool to use by each logical core, if needed.
1566          */
1567         for (lc_id = 0; lc_id < nb_lcores; lc_id++) {
1568                 mbp = mbuf_pool_find(
1569                         rte_lcore_to_socket_id(fwd_lcores_cpuids[lc_id]), 0);
1570
1571                 if (mbp == NULL)
1572                         mbp = mbuf_pool_find(0, 0);
1573                 fwd_lcores[lc_id]->mbp = mbp;
1574                 /* initialize GSO context */
1575                 fwd_lcores[lc_id]->gso_ctx.direct_pool = mbp;
1576                 fwd_lcores[lc_id]->gso_ctx.indirect_pool = mbp;
1577                 fwd_lcores[lc_id]->gso_ctx.gso_types = gso_types;
1578                 fwd_lcores[lc_id]->gso_ctx.gso_size = RTE_ETHER_MAX_LEN -
1579                         RTE_ETHER_CRC_LEN;
1580                 fwd_lcores[lc_id]->gso_ctx.flag = 0;
1581         }
1582
1583         /* Configuration of packet forwarding streams. */
1584         if (init_fwd_streams() < 0)
1585                 rte_exit(EXIT_FAILURE, "FAIL from init_fwd_streams()\n");
1586
1587         fwd_config_setup();
1588
1589         /* create a gro context for each lcore */
1590         gro_param.gro_types = RTE_GRO_TCP_IPV4;
1591         gro_param.max_flow_num = GRO_MAX_FLUSH_CYCLES;
1592         gro_param.max_item_per_flow = MAX_PKT_BURST;
1593         for (lc_id = 0; lc_id < nb_lcores; lc_id++) {
1594                 gro_param.socket_id = rte_lcore_to_socket_id(
1595                                 fwd_lcores_cpuids[lc_id]);
1596                 fwd_lcores[lc_id]->gro_ctx = rte_gro_ctx_create(&gro_param);
1597                 if (fwd_lcores[lc_id]->gro_ctx == NULL) {
1598                         rte_exit(EXIT_FAILURE,
1599                                         "rte_gro_ctx_create() failed\n");
1600                 }
1601         }
1602 }
1603
1604
1605 void
1606 reconfig(portid_t new_port_id, unsigned socket_id)
1607 {
1608         struct rte_port *port;
1609         int ret;
1610
1611         /* Reconfiguration of Ethernet ports. */
1612         port = &ports[new_port_id];
1613
1614         ret = eth_dev_info_get_print_err(new_port_id, &port->dev_info);
1615         if (ret != 0)
1616                 return;
1617
1618         /* set flag to initialize port/queue */
1619         port->need_reconfig = 1;
1620         port->need_reconfig_queues = 1;
1621         port->socket_id = socket_id;
1622
1623         init_port_config();
1624 }
1625
1626
1627 int
1628 init_fwd_streams(void)
1629 {
1630         portid_t pid;
1631         struct rte_port *port;
1632         streamid_t sm_id, nb_fwd_streams_new;
1633         queueid_t q;
1634
1635         /* set socket id according to numa or not */
1636         RTE_ETH_FOREACH_DEV(pid) {
1637                 port = &ports[pid];
1638                 if (nb_rxq > port->dev_info.max_rx_queues) {
1639                         printf("Fail: nb_rxq(%d) is greater than "
1640                                 "max_rx_queues(%d)\n", nb_rxq,
1641                                 port->dev_info.max_rx_queues);
1642                         return -1;
1643                 }
1644                 if (nb_txq > port->dev_info.max_tx_queues) {
1645                         printf("Fail: nb_txq(%d) is greater than "
1646                                 "max_tx_queues(%d)\n", nb_txq,
1647                                 port->dev_info.max_tx_queues);
1648                         return -1;
1649                 }
1650                 if (numa_support) {
1651                         if (port_numa[pid] != NUMA_NO_CONFIG)
1652                                 port->socket_id = port_numa[pid];
1653                         else {
1654                                 port->socket_id = rte_eth_dev_socket_id(pid);
1655
1656                                 /*
1657                                  * if socket_id is invalid,
1658                                  * set to the first available socket.
1659                                  */
1660                                 if (check_socket_id(port->socket_id) < 0)
1661                                         port->socket_id = socket_ids[0];
1662                         }
1663                 }
1664                 else {
1665                         if (socket_num == UMA_NO_CONFIG)
1666                                 port->socket_id = 0;
1667                         else
1668                                 port->socket_id = socket_num;
1669                 }
1670         }
1671
1672         q = RTE_MAX(nb_rxq, nb_txq);
1673         if (q == 0) {
1674                 printf("Fail: Cannot allocate fwd streams as number of queues is 0\n");
1675                 return -1;
1676         }
1677         nb_fwd_streams_new = (streamid_t)(nb_ports * q);
1678         if (nb_fwd_streams_new == nb_fwd_streams)
1679                 return 0;
1680         /* clear the old */
1681         if (fwd_streams != NULL) {
1682                 for (sm_id = 0; sm_id < nb_fwd_streams; sm_id++) {
1683                         if (fwd_streams[sm_id] == NULL)
1684                                 continue;
1685                         rte_free(fwd_streams[sm_id]);
1686                         fwd_streams[sm_id] = NULL;
1687                 }
1688                 rte_free(fwd_streams);
1689                 fwd_streams = NULL;
1690         }
1691
1692         /* init new */
1693         nb_fwd_streams = nb_fwd_streams_new;
1694         if (nb_fwd_streams) {
1695                 fwd_streams = rte_zmalloc("testpmd: fwd_streams",
1696                         sizeof(struct fwd_stream *) * nb_fwd_streams,
1697                         RTE_CACHE_LINE_SIZE);
1698                 if (fwd_streams == NULL)
1699                         rte_exit(EXIT_FAILURE, "rte_zmalloc(%d"
1700                                  " (struct fwd_stream *)) failed\n",
1701                                  nb_fwd_streams);
1702
1703                 for (sm_id = 0; sm_id < nb_fwd_streams; sm_id++) {
1704                         fwd_streams[sm_id] = rte_zmalloc("testpmd:"
1705                                 " struct fwd_stream", sizeof(struct fwd_stream),
1706                                 RTE_CACHE_LINE_SIZE);
1707                         if (fwd_streams[sm_id] == NULL)
1708                                 rte_exit(EXIT_FAILURE, "rte_zmalloc"
1709                                          "(struct fwd_stream) failed\n");
1710                 }
1711         }
1712
1713         return 0;
1714 }
1715
1716 static void
1717 pkt_burst_stats_display(const char *rx_tx, struct pkt_burst_stats *pbs)
1718 {
1719         uint64_t total_burst, sburst;
1720         uint64_t nb_burst;
1721         uint64_t burst_stats[4];
1722         uint16_t pktnb_stats[4];
1723         uint16_t nb_pkt;
1724         int burst_percent[4], sburstp;
1725         int i;
1726
1727         /*
1728          * First compute the total number of packet bursts and the
1729          * two highest numbers of bursts of the same number of packets.
1730          */
1731         memset(&burst_stats, 0x0, sizeof(burst_stats));
1732         memset(&pktnb_stats, 0x0, sizeof(pktnb_stats));
1733
1734         /* Show stats for 0 burst size always */
1735         total_burst = pbs->pkt_burst_spread[0];
1736         burst_stats[0] = pbs->pkt_burst_spread[0];
1737         pktnb_stats[0] = 0;
1738
1739         /* Find the next 2 burst sizes with highest occurrences. */
1740         for (nb_pkt = 1; nb_pkt < MAX_PKT_BURST; nb_pkt++) {
1741                 nb_burst = pbs->pkt_burst_spread[nb_pkt];
1742
1743                 if (nb_burst == 0)
1744                         continue;
1745
1746                 total_burst += nb_burst;
1747
1748                 if (nb_burst > burst_stats[1]) {
1749                         burst_stats[2] = burst_stats[1];
1750                         pktnb_stats[2] = pktnb_stats[1];
1751                         burst_stats[1] = nb_burst;
1752                         pktnb_stats[1] = nb_pkt;
1753                 } else if (nb_burst > burst_stats[2]) {
1754                         burst_stats[2] = nb_burst;
1755                         pktnb_stats[2] = nb_pkt;
1756                 }
1757         }
1758         if (total_burst == 0)
1759                 return;
1760
1761         printf("  %s-bursts : %"PRIu64" [", rx_tx, total_burst);
1762         for (i = 0, sburst = 0, sburstp = 0; i < 4; i++) {
1763                 if (i == 3) {
1764                         printf("%d%% of other]\n", 100 - sburstp);
1765                         return;
1766                 }
1767
1768                 sburst += burst_stats[i];
1769                 if (sburst == total_burst) {
1770                         printf("%d%% of %d pkts]\n",
1771                                 100 - sburstp, (int) pktnb_stats[i]);
1772                         return;
1773                 }
1774
1775                 burst_percent[i] =
1776                         (double)burst_stats[i] / total_burst * 100;
1777                 printf("%d%% of %d pkts + ",
1778                         burst_percent[i], (int) pktnb_stats[i]);
1779                 sburstp += burst_percent[i];
1780         }
1781 }
1782
1783 static void
1784 fwd_stream_stats_display(streamid_t stream_id)
1785 {
1786         struct fwd_stream *fs;
1787         static const char *fwd_top_stats_border = "-------";
1788
1789         fs = fwd_streams[stream_id];
1790         if ((fs->rx_packets == 0) && (fs->tx_packets == 0) &&
1791             (fs->fwd_dropped == 0))
1792                 return;
1793         printf("\n  %s Forward Stats for RX Port=%2d/Queue=%2d -> "
1794                "TX Port=%2d/Queue=%2d %s\n",
1795                fwd_top_stats_border, fs->rx_port, fs->rx_queue,
1796                fs->tx_port, fs->tx_queue, fwd_top_stats_border);
1797         printf("  RX-packets: %-14"PRIu64" TX-packets: %-14"PRIu64
1798                " TX-dropped: %-14"PRIu64,
1799                fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
1800
1801         /* if checksum mode */
1802         if (cur_fwd_eng == &csum_fwd_engine) {
1803                 printf("  RX- bad IP checksum: %-14"PRIu64
1804                        "  Rx- bad L4 checksum: %-14"PRIu64
1805                        " Rx- bad outer L4 checksum: %-14"PRIu64"\n",
1806                         fs->rx_bad_ip_csum, fs->rx_bad_l4_csum,
1807                         fs->rx_bad_outer_l4_csum);
1808         } else {
1809                 printf("\n");
1810         }
1811
1812         if (record_burst_stats) {
1813                 pkt_burst_stats_display("RX", &fs->rx_burst_stats);
1814                 pkt_burst_stats_display("TX", &fs->tx_burst_stats);
1815         }
1816 }
1817
1818 void
1819 fwd_stats_display(void)
1820 {
1821         static const char *fwd_stats_border = "----------------------";
1822         static const char *acc_stats_border = "+++++++++++++++";
1823         struct {
1824                 struct fwd_stream *rx_stream;
1825                 struct fwd_stream *tx_stream;
1826                 uint64_t tx_dropped;
1827                 uint64_t rx_bad_ip_csum;
1828                 uint64_t rx_bad_l4_csum;
1829                 uint64_t rx_bad_outer_l4_csum;
1830         } ports_stats[RTE_MAX_ETHPORTS];
1831         uint64_t total_rx_dropped = 0;
1832         uint64_t total_tx_dropped = 0;
1833         uint64_t total_rx_nombuf = 0;
1834         struct rte_eth_stats stats;
1835         uint64_t fwd_cycles = 0;
1836         uint64_t total_recv = 0;
1837         uint64_t total_xmit = 0;
1838         struct rte_port *port;
1839         streamid_t sm_id;
1840         portid_t pt_id;
1841         int i;
1842
1843         memset(ports_stats, 0, sizeof(ports_stats));
1844
1845         for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
1846                 struct fwd_stream *fs = fwd_streams[sm_id];
1847
1848                 if (cur_fwd_config.nb_fwd_streams >
1849                     cur_fwd_config.nb_fwd_ports) {
1850                         fwd_stream_stats_display(sm_id);
1851                 } else {
1852                         ports_stats[fs->tx_port].tx_stream = fs;
1853                         ports_stats[fs->rx_port].rx_stream = fs;
1854                 }
1855
1856                 ports_stats[fs->tx_port].tx_dropped += fs->fwd_dropped;
1857
1858                 ports_stats[fs->rx_port].rx_bad_ip_csum += fs->rx_bad_ip_csum;
1859                 ports_stats[fs->rx_port].rx_bad_l4_csum += fs->rx_bad_l4_csum;
1860                 ports_stats[fs->rx_port].rx_bad_outer_l4_csum +=
1861                                 fs->rx_bad_outer_l4_csum;
1862
1863                 if (record_core_cycles)
1864                         fwd_cycles += fs->core_cycles;
1865         }
1866         for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
1867                 pt_id = fwd_ports_ids[i];
1868                 port = &ports[pt_id];
1869
1870                 rte_eth_stats_get(pt_id, &stats);
1871                 stats.ipackets -= port->stats.ipackets;
1872                 stats.opackets -= port->stats.opackets;
1873                 stats.ibytes -= port->stats.ibytes;
1874                 stats.obytes -= port->stats.obytes;
1875                 stats.imissed -= port->stats.imissed;
1876                 stats.oerrors -= port->stats.oerrors;
1877                 stats.rx_nombuf -= port->stats.rx_nombuf;
1878
1879                 total_recv += stats.ipackets;
1880                 total_xmit += stats.opackets;
1881                 total_rx_dropped += stats.imissed;
1882                 total_tx_dropped += ports_stats[pt_id].tx_dropped;
1883                 total_tx_dropped += stats.oerrors;
1884                 total_rx_nombuf  += stats.rx_nombuf;
1885
1886                 printf("\n  %s Forward statistics for port %-2d %s\n",
1887                        fwd_stats_border, pt_id, fwd_stats_border);
1888
1889                 printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64
1890                        "RX-total: %-"PRIu64"\n", stats.ipackets, stats.imissed,
1891                        stats.ipackets + stats.imissed);
1892
1893                 if (cur_fwd_eng == &csum_fwd_engine)
1894                         printf("  Bad-ipcsum: %-14"PRIu64
1895                                " Bad-l4csum: %-14"PRIu64
1896                                "Bad-outer-l4csum: %-14"PRIu64"\n",
1897                                ports_stats[pt_id].rx_bad_ip_csum,
1898                                ports_stats[pt_id].rx_bad_l4_csum,
1899                                ports_stats[pt_id].rx_bad_outer_l4_csum);
1900                 if (stats.ierrors + stats.rx_nombuf > 0) {
1901                         printf("  RX-error: %-"PRIu64"\n", stats.ierrors);
1902                         printf("  RX-nombufs: %-14"PRIu64"\n", stats.rx_nombuf);
1903                 }
1904
1905                 printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64
1906                        "TX-total: %-"PRIu64"\n",
1907                        stats.opackets, ports_stats[pt_id].tx_dropped,
1908                        stats.opackets + ports_stats[pt_id].tx_dropped);
1909
1910                 if (record_burst_stats) {
1911                         if (ports_stats[pt_id].rx_stream)
1912                                 pkt_burst_stats_display("RX",
1913                                         &ports_stats[pt_id].rx_stream->rx_burst_stats);
1914                         if (ports_stats[pt_id].tx_stream)
1915                                 pkt_burst_stats_display("TX",
1916                                 &ports_stats[pt_id].tx_stream->tx_burst_stats);
1917                 }
1918
1919                 printf("  %s--------------------------------%s\n",
1920                        fwd_stats_border, fwd_stats_border);
1921         }
1922
1923         printf("\n  %s Accumulated forward statistics for all ports"
1924                "%s\n",
1925                acc_stats_border, acc_stats_border);
1926         printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
1927                "%-"PRIu64"\n"
1928                "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
1929                "%-"PRIu64"\n",
1930                total_recv, total_rx_dropped, total_recv + total_rx_dropped,
1931                total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
1932         if (total_rx_nombuf > 0)
1933                 printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
1934         printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
1935                "%s\n",
1936                acc_stats_border, acc_stats_border);
1937         if (record_core_cycles) {
1938 #define CYC_PER_MHZ 1E6
1939                 if (total_recv > 0 || total_xmit > 0) {
1940                         uint64_t total_pkts = 0;
1941                         if (strcmp(cur_fwd_eng->fwd_mode_name, "txonly") == 0 ||
1942                             strcmp(cur_fwd_eng->fwd_mode_name, "flowgen") == 0)
1943                                 total_pkts = total_xmit;
1944                         else
1945                                 total_pkts = total_recv;
1946
1947                         printf("\n  CPU cycles/packet=%.2F (total cycles="
1948                                "%"PRIu64" / total %s packets=%"PRIu64") at %"PRIu64
1949                                " MHz Clock\n",
1950                                (double) fwd_cycles / total_pkts,
1951                                fwd_cycles, cur_fwd_eng->fwd_mode_name, total_pkts,
1952                                (uint64_t)(rte_get_tsc_hz() / CYC_PER_MHZ));
1953                 }
1954         }
1955 }
1956
1957 void
1958 fwd_stats_reset(void)
1959 {
1960         streamid_t sm_id;
1961         portid_t pt_id;
1962         int i;
1963
1964         for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
1965                 pt_id = fwd_ports_ids[i];
1966                 rte_eth_stats_get(pt_id, &ports[pt_id].stats);
1967         }
1968         for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
1969                 struct fwd_stream *fs = fwd_streams[sm_id];
1970
1971                 fs->rx_packets = 0;
1972                 fs->tx_packets = 0;
1973                 fs->fwd_dropped = 0;
1974                 fs->rx_bad_ip_csum = 0;
1975                 fs->rx_bad_l4_csum = 0;
1976                 fs->rx_bad_outer_l4_csum = 0;
1977
1978                 memset(&fs->rx_burst_stats, 0, sizeof(fs->rx_burst_stats));
1979                 memset(&fs->tx_burst_stats, 0, sizeof(fs->tx_burst_stats));
1980                 fs->core_cycles = 0;
1981         }
1982 }
1983
1984 static void
1985 flush_fwd_rx_queues(void)
1986 {
1987         struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
1988         portid_t  rxp;
1989         portid_t port_id;
1990         queueid_t rxq;
1991         uint16_t  nb_rx;
1992         uint16_t  i;
1993         uint8_t   j;
1994         uint64_t prev_tsc = 0, diff_tsc, cur_tsc, timer_tsc = 0;
1995         uint64_t timer_period;
1996
1997         /* convert to number of cycles */
1998         timer_period = rte_get_timer_hz(); /* 1 second timeout */
1999
2000         for (j = 0; j < 2; j++) {
2001                 for (rxp = 0; rxp < cur_fwd_config.nb_fwd_ports; rxp++) {
2002                         for (rxq = 0; rxq < nb_rxq; rxq++) {
2003                                 port_id = fwd_ports_ids[rxp];
2004                                 /**
2005                                 * testpmd can stuck in the below do while loop
2006                                 * if rte_eth_rx_burst() always returns nonzero
2007                                 * packets. So timer is added to exit this loop
2008                                 * after 1sec timer expiry.
2009                                 */
2010                                 prev_tsc = rte_rdtsc();
2011                                 do {
2012                                         nb_rx = rte_eth_rx_burst(port_id, rxq,
2013                                                 pkts_burst, MAX_PKT_BURST);
2014                                         for (i = 0; i < nb_rx; i++)
2015                                                 rte_pktmbuf_free(pkts_burst[i]);
2016
2017                                         cur_tsc = rte_rdtsc();
2018                                         diff_tsc = cur_tsc - prev_tsc;
2019                                         timer_tsc += diff_tsc;
2020                                 } while ((nb_rx > 0) &&
2021                                         (timer_tsc < timer_period));
2022                                 timer_tsc = 0;
2023                         }
2024                 }
2025                 rte_delay_ms(10); /* wait 10 milli-seconds before retrying */
2026         }
2027 }
2028
2029 static void
2030 run_pkt_fwd_on_lcore(struct fwd_lcore *fc, packet_fwd_t pkt_fwd)
2031 {
2032         struct fwd_stream **fsm;
2033         streamid_t nb_fs;
2034         streamid_t sm_id;
2035 #ifdef RTE_LIB_BITRATESTATS
2036         uint64_t tics_per_1sec;
2037         uint64_t tics_datum;
2038         uint64_t tics_current;
2039         uint16_t i, cnt_ports;
2040
2041         cnt_ports = nb_ports;
2042         tics_datum = rte_rdtsc();
2043         tics_per_1sec = rte_get_timer_hz();
2044 #endif
2045         fsm = &fwd_streams[fc->stream_idx];
2046         nb_fs = fc->stream_nb;
2047         do {
2048                 for (sm_id = 0; sm_id < nb_fs; sm_id++)
2049                         (*pkt_fwd)(fsm[sm_id]);
2050 #ifdef RTE_LIB_BITRATESTATS
2051                 if (bitrate_enabled != 0 &&
2052                                 bitrate_lcore_id == rte_lcore_id()) {
2053                         tics_current = rte_rdtsc();
2054                         if (tics_current - tics_datum >= tics_per_1sec) {
2055                                 /* Periodic bitrate calculation */
2056                                 for (i = 0; i < cnt_ports; i++)
2057                                         rte_stats_bitrate_calc(bitrate_data,
2058                                                 ports_ids[i]);
2059                                 tics_datum = tics_current;
2060                         }
2061                 }
2062 #endif
2063 #ifdef RTE_LIB_LATENCYSTATS
2064                 if (latencystats_enabled != 0 &&
2065                                 latencystats_lcore_id == rte_lcore_id())
2066                         rte_latencystats_update();
2067 #endif
2068
2069         } while (! fc->stopped);
2070 }
2071
2072 static int
2073 start_pkt_forward_on_core(void *fwd_arg)
2074 {
2075         run_pkt_fwd_on_lcore((struct fwd_lcore *) fwd_arg,
2076                              cur_fwd_config.fwd_eng->packet_fwd);
2077         return 0;
2078 }
2079
2080 /*
2081  * Run the TXONLY packet forwarding engine to send a single burst of packets.
2082  * Used to start communication flows in network loopback test configurations.
2083  */
2084 static int
2085 run_one_txonly_burst_on_core(void *fwd_arg)
2086 {
2087         struct fwd_lcore *fwd_lc;
2088         struct fwd_lcore tmp_lcore;
2089
2090         fwd_lc = (struct fwd_lcore *) fwd_arg;
2091         tmp_lcore = *fwd_lc;
2092         tmp_lcore.stopped = 1;
2093         run_pkt_fwd_on_lcore(&tmp_lcore, tx_only_engine.packet_fwd);
2094         return 0;
2095 }
2096
2097 /*
2098  * Launch packet forwarding:
2099  *     - Setup per-port forwarding context.
2100  *     - launch logical cores with their forwarding configuration.
2101  */
2102 static void
2103 launch_packet_forwarding(lcore_function_t *pkt_fwd_on_lcore)
2104 {
2105         port_fwd_begin_t port_fwd_begin;
2106         unsigned int i;
2107         unsigned int lc_id;
2108         int diag;
2109
2110         port_fwd_begin = cur_fwd_config.fwd_eng->port_fwd_begin;
2111         if (port_fwd_begin != NULL) {
2112                 for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++)
2113                         (*port_fwd_begin)(fwd_ports_ids[i]);
2114         }
2115         for (i = 0; i < cur_fwd_config.nb_fwd_lcores; i++) {
2116                 lc_id = fwd_lcores_cpuids[i];
2117                 if ((interactive == 0) || (lc_id != rte_lcore_id())) {
2118                         fwd_lcores[i]->stopped = 0;
2119                         diag = rte_eal_remote_launch(pkt_fwd_on_lcore,
2120                                                      fwd_lcores[i], lc_id);
2121                         if (diag != 0)
2122                                 printf("launch lcore %u failed - diag=%d\n",
2123                                        lc_id, diag);
2124                 }
2125         }
2126 }
2127
2128 /*
2129  * Launch packet forwarding configuration.
2130  */
2131 void
2132 start_packet_forwarding(int with_tx_first)
2133 {
2134         port_fwd_begin_t port_fwd_begin;
2135         port_fwd_end_t  port_fwd_end;
2136         struct rte_port *port;
2137         unsigned int i;
2138         portid_t   pt_id;
2139
2140         if (strcmp(cur_fwd_eng->fwd_mode_name, "rxonly") == 0 && !nb_rxq)
2141                 rte_exit(EXIT_FAILURE, "rxq are 0, cannot use rxonly fwd mode\n");
2142
2143         if (strcmp(cur_fwd_eng->fwd_mode_name, "txonly") == 0 && !nb_txq)
2144                 rte_exit(EXIT_FAILURE, "txq are 0, cannot use txonly fwd mode\n");
2145
2146         if ((strcmp(cur_fwd_eng->fwd_mode_name, "rxonly") != 0 &&
2147                 strcmp(cur_fwd_eng->fwd_mode_name, "txonly") != 0) &&
2148                 (!nb_rxq || !nb_txq))
2149                 rte_exit(EXIT_FAILURE,
2150                         "Either rxq or txq are 0, cannot use %s fwd mode\n",
2151                         cur_fwd_eng->fwd_mode_name);
2152
2153         if (all_ports_started() == 0) {
2154                 printf("Not all ports were started\n");
2155                 return;
2156         }
2157         if (test_done == 0) {
2158                 printf("Packet forwarding already started\n");
2159                 return;
2160         }
2161
2162
2163         if(dcb_test) {
2164                 for (i = 0; i < nb_fwd_ports; i++) {
2165                         pt_id = fwd_ports_ids[i];
2166                         port = &ports[pt_id];
2167                         if (!port->dcb_flag) {
2168                                 printf("In DCB mode, all forwarding ports must "
2169                                        "be configured in this mode.\n");
2170                                 return;
2171                         }
2172                 }
2173                 if (nb_fwd_lcores == 1) {
2174                         printf("In DCB mode,the nb forwarding cores "
2175                                "should be larger than 1.\n");
2176                         return;
2177                 }
2178         }
2179         test_done = 0;
2180
2181         fwd_config_setup();
2182
2183         if(!no_flush_rx)
2184                 flush_fwd_rx_queues();
2185
2186         pkt_fwd_config_display(&cur_fwd_config);
2187         rxtx_config_display();
2188
2189         fwd_stats_reset();
2190         if (with_tx_first) {
2191                 port_fwd_begin = tx_only_engine.port_fwd_begin;
2192                 if (port_fwd_begin != NULL) {
2193                         for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++)
2194                                 (*port_fwd_begin)(fwd_ports_ids[i]);
2195                 }
2196                 while (with_tx_first--) {
2197                         launch_packet_forwarding(
2198                                         run_one_txonly_burst_on_core);
2199                         rte_eal_mp_wait_lcore();
2200                 }
2201                 port_fwd_end = tx_only_engine.port_fwd_end;
2202                 if (port_fwd_end != NULL) {
2203                         for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++)
2204                                 (*port_fwd_end)(fwd_ports_ids[i]);
2205                 }
2206         }
2207         launch_packet_forwarding(start_pkt_forward_on_core);
2208 }
2209
2210 void
2211 stop_packet_forwarding(void)
2212 {
2213         port_fwd_end_t port_fwd_end;
2214         lcoreid_t lc_id;
2215         portid_t pt_id;
2216         int i;
2217
2218         if (test_done) {
2219                 printf("Packet forwarding not started\n");
2220                 return;
2221         }
2222         printf("Telling cores to stop...");
2223         for (lc_id = 0; lc_id < cur_fwd_config.nb_fwd_lcores; lc_id++)
2224                 fwd_lcores[lc_id]->stopped = 1;
2225         printf("\nWaiting for lcores to finish...\n");
2226         rte_eal_mp_wait_lcore();
2227         port_fwd_end = cur_fwd_config.fwd_eng->port_fwd_end;
2228         if (port_fwd_end != NULL) {
2229                 for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
2230                         pt_id = fwd_ports_ids[i];
2231                         (*port_fwd_end)(pt_id);
2232                 }
2233         }
2234
2235         fwd_stats_display();
2236
2237         printf("\nDone.\n");
2238         test_done = 1;
2239 }
2240
2241 void
2242 dev_set_link_up(portid_t pid)
2243 {
2244         if (rte_eth_dev_set_link_up(pid) < 0)
2245                 printf("\nSet link up fail.\n");
2246 }
2247
2248 void
2249 dev_set_link_down(portid_t pid)
2250 {
2251         if (rte_eth_dev_set_link_down(pid) < 0)
2252                 printf("\nSet link down fail.\n");
2253 }
2254
2255 static int
2256 all_ports_started(void)
2257 {
2258         portid_t pi;
2259         struct rte_port *port;
2260
2261         RTE_ETH_FOREACH_DEV(pi) {
2262                 port = &ports[pi];
2263                 /* Check if there is a port which is not started */
2264                 if ((port->port_status != RTE_PORT_STARTED) &&
2265                         (port->slave_flag == 0))
2266                         return 0;
2267         }
2268
2269         /* No port is not started */
2270         return 1;
2271 }
2272
2273 int
2274 port_is_stopped(portid_t port_id)
2275 {
2276         struct rte_port *port = &ports[port_id];
2277
2278         if ((port->port_status != RTE_PORT_STOPPED) &&
2279             (port->slave_flag == 0))
2280                 return 0;
2281         return 1;
2282 }
2283
2284 int
2285 all_ports_stopped(void)
2286 {
2287         portid_t pi;
2288
2289         RTE_ETH_FOREACH_DEV(pi) {
2290                 if (!port_is_stopped(pi))
2291                         return 0;
2292         }
2293
2294         return 1;
2295 }
2296
2297 int
2298 port_is_started(portid_t port_id)
2299 {
2300         if (port_id_is_invalid(port_id, ENABLED_WARN))
2301                 return 0;
2302
2303         if (ports[port_id].port_status != RTE_PORT_STARTED)
2304                 return 0;
2305
2306         return 1;
2307 }
2308
2309 /* Configure the Rx and Tx hairpin queues for the selected port. */
2310 static int
2311 setup_hairpin_queues(portid_t pi, portid_t p_pi, uint16_t cnt_pi)
2312 {
2313         queueid_t qi;
2314         struct rte_eth_hairpin_conf hairpin_conf = {
2315                 .peer_count = 1,
2316         };
2317         int i;
2318         int diag;
2319         struct rte_port *port = &ports[pi];
2320         uint16_t peer_rx_port = pi;
2321         uint16_t peer_tx_port = pi;
2322         uint32_t manual = 1;
2323         uint32_t tx_exp = hairpin_mode & 0x10;
2324
2325         if (!(hairpin_mode & 0xf)) {
2326                 peer_rx_port = pi;
2327                 peer_tx_port = pi;
2328                 manual = 0;
2329         } else if (hairpin_mode & 0x1) {
2330                 peer_tx_port = rte_eth_find_next_owned_by(pi + 1,
2331                                                        RTE_ETH_DEV_NO_OWNER);
2332                 if (peer_tx_port >= RTE_MAX_ETHPORTS)
2333                         peer_tx_port = rte_eth_find_next_owned_by(0,
2334                                                 RTE_ETH_DEV_NO_OWNER);
2335                 if (p_pi != RTE_MAX_ETHPORTS) {
2336                         peer_rx_port = p_pi;
2337                 } else {
2338                         uint16_t next_pi;
2339
2340                         /* Last port will be the peer RX port of the first. */
2341                         RTE_ETH_FOREACH_DEV(next_pi)
2342                                 peer_rx_port = next_pi;
2343                 }
2344                 manual = 1;
2345         } else if (hairpin_mode & 0x2) {
2346                 if (cnt_pi & 0x1) {
2347                         peer_rx_port = p_pi;
2348                 } else {
2349                         peer_rx_port = rte_eth_find_next_owned_by(pi + 1,
2350                                                 RTE_ETH_DEV_NO_OWNER);
2351                         if (peer_rx_port >= RTE_MAX_ETHPORTS)
2352                                 peer_rx_port = pi;
2353                 }
2354                 peer_tx_port = peer_rx_port;
2355                 manual = 1;
2356         }
2357
2358         for (qi = nb_txq, i = 0; qi < nb_hairpinq + nb_txq; qi++) {
2359                 hairpin_conf.peers[0].port = peer_rx_port;
2360                 hairpin_conf.peers[0].queue = i + nb_rxq;
2361                 hairpin_conf.manual_bind = !!manual;
2362                 hairpin_conf.tx_explicit = !!tx_exp;
2363                 diag = rte_eth_tx_hairpin_queue_setup
2364                         (pi, qi, nb_txd, &hairpin_conf);
2365                 i++;
2366                 if (diag == 0)
2367                         continue;
2368
2369                 /* Fail to setup rx queue, return */
2370                 if (rte_atomic16_cmpset(&(port->port_status),
2371                                         RTE_PORT_HANDLING,
2372                                         RTE_PORT_STOPPED) == 0)
2373                         printf("Port %d can not be set back "
2374                                         "to stopped\n", pi);
2375                 printf("Fail to configure port %d hairpin "
2376                                 "queues\n", pi);
2377                 /* try to reconfigure queues next time */
2378                 port->need_reconfig_queues = 1;
2379                 return -1;
2380         }
2381         for (qi = nb_rxq, i = 0; qi < nb_hairpinq + nb_rxq; qi++) {
2382                 hairpin_conf.peers[0].port = peer_tx_port;
2383                 hairpin_conf.peers[0].queue = i + nb_txq;
2384                 hairpin_conf.manual_bind = !!manual;
2385                 hairpin_conf.tx_explicit = !!tx_exp;
2386                 diag = rte_eth_rx_hairpin_queue_setup
2387                         (pi, qi, nb_rxd, &hairpin_conf);
2388                 i++;
2389                 if (diag == 0)
2390                         continue;
2391
2392                 /* Fail to setup rx queue, return */
2393                 if (rte_atomic16_cmpset(&(port->port_status),
2394                                         RTE_PORT_HANDLING,
2395                                         RTE_PORT_STOPPED) == 0)
2396                         printf("Port %d can not be set back "
2397                                         "to stopped\n", pi);
2398                 printf("Fail to configure port %d hairpin "
2399                                 "queues\n", pi);
2400                 /* try to reconfigure queues next time */
2401                 port->need_reconfig_queues = 1;
2402                 return -1;
2403         }
2404         return 0;
2405 }
2406
2407 /* Configure the Rx with optional split. */
2408 int
2409 rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
2410                uint16_t nb_rx_desc, unsigned int socket_id,
2411                struct rte_eth_rxconf *rx_conf, struct rte_mempool *mp)
2412 {
2413         union rte_eth_rxseg rx_useg[MAX_SEGS_BUFFER_SPLIT] = {};
2414         unsigned int i, mp_n;
2415         int ret;
2416
2417         if (rx_pkt_nb_segs <= 1 ||
2418             (rx_conf->offloads & RTE_ETH_RX_OFFLOAD_BUFFER_SPLIT) == 0) {
2419                 rx_conf->rx_seg = NULL;
2420                 rx_conf->rx_nseg = 0;
2421                 ret = rte_eth_rx_queue_setup(port_id, rx_queue_id,
2422                                              nb_rx_desc, socket_id,
2423                                              rx_conf, mp);
2424                 return ret;
2425         }
2426         for (i = 0; i < rx_pkt_nb_segs; i++) {
2427                 struct rte_eth_rxseg_split *rx_seg = &rx_useg[i].split;
2428                 struct rte_mempool *mpx;
2429                 /*
2430                  * Use last valid pool for the segments with number
2431                  * exceeding the pool index.
2432                  */
2433                 mp_n = (i > mbuf_data_size_n) ? mbuf_data_size_n - 1 : i;
2434                 mpx = mbuf_pool_find(socket_id, mp_n);
2435                 /* Handle zero as mbuf data buffer size. */
2436                 rx_seg->length = rx_pkt_seg_lengths[i] ?
2437                                    rx_pkt_seg_lengths[i] :
2438                                    mbuf_data_size[mp_n];
2439                 rx_seg->offset = i < rx_pkt_nb_offs ?
2440                                    rx_pkt_seg_offsets[i] : 0;
2441                 rx_seg->mp = mpx ? mpx : mp;
2442         }
2443         rx_conf->rx_nseg = rx_pkt_nb_segs;
2444         rx_conf->rx_seg = rx_useg;
2445         ret = rte_eth_rx_queue_setup(port_id, rx_queue_id, nb_rx_desc,
2446                                     socket_id, rx_conf, NULL);
2447         rx_conf->rx_seg = NULL;
2448         rx_conf->rx_nseg = 0;
2449         return ret;
2450 }
2451
2452 int
2453 start_port(portid_t pid)
2454 {
2455         int diag, need_check_link_status = -1;
2456         portid_t pi;
2457         portid_t p_pi = RTE_MAX_ETHPORTS;
2458         portid_t pl[RTE_MAX_ETHPORTS];
2459         portid_t peer_pl[RTE_MAX_ETHPORTS];
2460         uint16_t cnt_pi = 0;
2461         uint16_t cfg_pi = 0;
2462         int peer_pi;
2463         queueid_t qi;
2464         struct rte_port *port;
2465         struct rte_ether_addr mac_addr;
2466         struct rte_eth_hairpin_cap cap;
2467
2468         if (port_id_is_invalid(pid, ENABLED_WARN))
2469                 return 0;
2470
2471         if(dcb_config)
2472                 dcb_test = 1;
2473         RTE_ETH_FOREACH_DEV(pi) {
2474                 if (pid != pi && pid != (portid_t)RTE_PORT_ALL)
2475                         continue;
2476
2477                 need_check_link_status = 0;
2478                 port = &ports[pi];
2479                 if (rte_atomic16_cmpset(&(port->port_status), RTE_PORT_STOPPED,
2480                                                  RTE_PORT_HANDLING) == 0) {
2481                         printf("Port %d is now not stopped\n", pi);
2482                         continue;
2483                 }
2484
2485                 if (port->need_reconfig > 0) {
2486                         port->need_reconfig = 0;
2487
2488                         if (flow_isolate_all) {
2489                                 int ret = port_flow_isolate(pi, 1);
2490                                 if (ret) {
2491                                         printf("Failed to apply isolated"
2492                                                " mode on port %d\n", pi);
2493                                         return -1;
2494                                 }
2495                         }
2496                         configure_rxtx_dump_callbacks(0);
2497                         printf("Configuring Port %d (socket %u)\n", pi,
2498                                         port->socket_id);
2499                         if (nb_hairpinq > 0 &&
2500                             rte_eth_dev_hairpin_capability_get(pi, &cap)) {
2501                                 printf("Port %d doesn't support hairpin "
2502                                        "queues\n", pi);
2503                                 return -1;
2504                         }
2505                         /* configure port */
2506                         diag = rte_eth_dev_configure(pi, nb_rxq + nb_hairpinq,
2507                                                      nb_txq + nb_hairpinq,
2508                                                      &(port->dev_conf));
2509                         if (diag != 0) {
2510                                 if (rte_atomic16_cmpset(&(port->port_status),
2511                                 RTE_PORT_HANDLING, RTE_PORT_STOPPED) == 0)
2512                                         printf("Port %d can not be set back "
2513                                                         "to stopped\n", pi);
2514                                 printf("Fail to configure port %d\n", pi);
2515                                 /* try to reconfigure port next time */
2516                                 port->need_reconfig = 1;
2517                                 return -1;
2518                         }
2519                 }
2520                 if (port->need_reconfig_queues > 0) {
2521                         port->need_reconfig_queues = 0;
2522                         /* setup tx queues */
2523                         for (qi = 0; qi < nb_txq; qi++) {
2524                                 if ((numa_support) &&
2525                                         (txring_numa[pi] != NUMA_NO_CONFIG))
2526                                         diag = rte_eth_tx_queue_setup(pi, qi,
2527                                                 port->nb_tx_desc[qi],
2528                                                 txring_numa[pi],
2529                                                 &(port->tx_conf[qi]));
2530                                 else
2531                                         diag = rte_eth_tx_queue_setup(pi, qi,
2532                                                 port->nb_tx_desc[qi],
2533                                                 port->socket_id,
2534                                                 &(port->tx_conf[qi]));
2535
2536                                 if (diag == 0)
2537                                         continue;
2538
2539                                 /* Fail to setup tx queue, return */
2540                                 if (rte_atomic16_cmpset(&(port->port_status),
2541                                                         RTE_PORT_HANDLING,
2542                                                         RTE_PORT_STOPPED) == 0)
2543                                         printf("Port %d can not be set back "
2544                                                         "to stopped\n", pi);
2545                                 printf("Fail to configure port %d tx queues\n",
2546                                        pi);
2547                                 /* try to reconfigure queues next time */
2548                                 port->need_reconfig_queues = 1;
2549                                 return -1;
2550                         }
2551                         for (qi = 0; qi < nb_rxq; qi++) {
2552                                 /* setup rx queues */
2553                                 if ((numa_support) &&
2554                                         (rxring_numa[pi] != NUMA_NO_CONFIG)) {
2555                                         struct rte_mempool * mp =
2556                                                 mbuf_pool_find
2557                                                         (rxring_numa[pi], 0);
2558                                         if (mp == NULL) {
2559                                                 printf("Failed to setup RX queue:"
2560                                                         "No mempool allocation"
2561                                                         " on the socket %d\n",
2562                                                         rxring_numa[pi]);
2563                                                 return -1;
2564                                         }
2565
2566                                         diag = rx_queue_setup(pi, qi,
2567                                              port->nb_rx_desc[qi],
2568                                              rxring_numa[pi],
2569                                              &(port->rx_conf[qi]),
2570                                              mp);
2571                                 } else {
2572                                         struct rte_mempool *mp =
2573                                                 mbuf_pool_find
2574                                                         (port->socket_id, 0);
2575                                         if (mp == NULL) {
2576                                                 printf("Failed to setup RX queue:"
2577                                                         "No mempool allocation"
2578                                                         " on the socket %d\n",
2579                                                         port->socket_id);
2580                                                 return -1;
2581                                         }
2582                                         diag = rx_queue_setup(pi, qi,
2583                                              port->nb_rx_desc[qi],
2584                                              port->socket_id,
2585                                              &(port->rx_conf[qi]),
2586                                              mp);
2587                                 }
2588                                 if (diag == 0)
2589                                         continue;
2590
2591                                 /* Fail to setup rx queue, return */
2592                                 if (rte_atomic16_cmpset(&(port->port_status),
2593                                                         RTE_PORT_HANDLING,
2594                                                         RTE_PORT_STOPPED) == 0)
2595                                         printf("Port %d can not be set back "
2596                                                         "to stopped\n", pi);
2597                                 printf("Fail to configure port %d rx queues\n",
2598                                        pi);
2599                                 /* try to reconfigure queues next time */
2600                                 port->need_reconfig_queues = 1;
2601                                 return -1;
2602                         }
2603                         /* setup hairpin queues */
2604                         if (setup_hairpin_queues(pi, p_pi, cnt_pi) != 0)
2605                                 return -1;
2606                 }
2607                 configure_rxtx_dump_callbacks(verbose_level);
2608                 if (clear_ptypes) {
2609                         diag = rte_eth_dev_set_ptypes(pi, RTE_PTYPE_UNKNOWN,
2610                                         NULL, 0);
2611                         if (diag < 0)
2612                                 printf(
2613                                 "Port %d: Failed to disable Ptype parsing\n",
2614                                 pi);
2615                 }
2616
2617                 p_pi = pi;
2618                 cnt_pi++;
2619
2620                 /* start port */
2621                 if (rte_eth_dev_start(pi) < 0) {
2622                         printf("Fail to start port %d\n", pi);
2623
2624                         /* Fail to setup rx queue, return */
2625                         if (rte_atomic16_cmpset(&(port->port_status),
2626                                 RTE_PORT_HANDLING, RTE_PORT_STOPPED) == 0)
2627                                 printf("Port %d can not be set back to "
2628                                                         "stopped\n", pi);
2629                         continue;
2630                 }
2631
2632                 if (rte_atomic16_cmpset(&(port->port_status),
2633                         RTE_PORT_HANDLING, RTE_PORT_STARTED) == 0)
2634                         printf("Port %d can not be set into started\n", pi);
2635
2636                 if (eth_macaddr_get_print_err(pi, &mac_addr) == 0)
2637                         printf("Port %d: %02X:%02X:%02X:%02X:%02X:%02X\n", pi,
2638                                 mac_addr.addr_bytes[0], mac_addr.addr_bytes[1],
2639                                 mac_addr.addr_bytes[2], mac_addr.addr_bytes[3],
2640                                 mac_addr.addr_bytes[4], mac_addr.addr_bytes[5]);
2641
2642                 /* at least one port started, need checking link status */
2643                 need_check_link_status = 1;
2644
2645                 pl[cfg_pi++] = pi;
2646         }
2647
2648         if (need_check_link_status == 1 && !no_link_check)
2649                 check_all_ports_link_status(RTE_PORT_ALL);
2650         else if (need_check_link_status == 0)
2651                 printf("Please stop the ports first\n");
2652
2653         if (hairpin_mode & 0xf) {
2654                 uint16_t i;
2655                 int j;
2656
2657                 /* bind all started hairpin ports */
2658                 for (i = 0; i < cfg_pi; i++) {
2659                         pi = pl[i];
2660                         /* bind current Tx to all peer Rx */
2661                         peer_pi = rte_eth_hairpin_get_peer_ports(pi, peer_pl,
2662                                                         RTE_MAX_ETHPORTS, 1);
2663                         if (peer_pi < 0)
2664                                 return peer_pi;
2665                         for (j = 0; j < peer_pi; j++) {
2666                                 if (!port_is_started(peer_pl[j]))
2667                                         continue;
2668                                 diag = rte_eth_hairpin_bind(pi, peer_pl[j]);
2669                                 if (diag < 0) {
2670                                         printf("Error during binding hairpin"
2671                                                " Tx port %u to %u: %s\n",
2672                                                pi, peer_pl[j],
2673                                                rte_strerror(-diag));
2674                                         return -1;
2675                                 }
2676                         }
2677                         /* bind all peer Tx to current Rx */
2678                         peer_pi = rte_eth_hairpin_get_peer_ports(pi, peer_pl,
2679                                                         RTE_MAX_ETHPORTS, 0);
2680                         if (peer_pi < 0)
2681                                 return peer_pi;
2682                         for (j = 0; j < peer_pi; j++) {
2683                                 if (!port_is_started(peer_pl[j]))
2684                                         continue;
2685                                 diag = rte_eth_hairpin_bind(peer_pl[j], pi);
2686                                 if (diag < 0) {
2687                                         printf("Error during binding hairpin"
2688                                                " Tx port %u to %u: %s\n",
2689                                                peer_pl[j], pi,
2690                                                rte_strerror(-diag));
2691                                         return -1;
2692                                 }
2693                         }
2694                 }
2695         }
2696
2697         printf("Done\n");
2698         return 0;
2699 }
2700
2701 void
2702 stop_port(portid_t pid)
2703 {
2704         portid_t pi;
2705         struct rte_port *port;
2706         int need_check_link_status = 0;
2707         portid_t peer_pl[RTE_MAX_ETHPORTS];
2708         int peer_pi;
2709
2710         if (dcb_test) {
2711                 dcb_test = 0;
2712                 dcb_config = 0;
2713         }
2714
2715         if (port_id_is_invalid(pid, ENABLED_WARN))
2716                 return;
2717
2718         printf("Stopping ports...\n");
2719
2720         RTE_ETH_FOREACH_DEV(pi) {
2721                 if (pid != pi && pid != (portid_t)RTE_PORT_ALL)
2722                         continue;
2723
2724                 if (port_is_forwarding(pi) != 0 && test_done == 0) {
2725                         printf("Please remove port %d from forwarding configuration.\n", pi);
2726                         continue;
2727                 }
2728
2729                 if (port_is_bonding_slave(pi)) {
2730                         printf("Please remove port %d from bonded device.\n", pi);
2731                         continue;
2732                 }
2733
2734                 port = &ports[pi];
2735                 if (rte_atomic16_cmpset(&(port->port_status), RTE_PORT_STARTED,
2736                                                 RTE_PORT_HANDLING) == 0)
2737                         continue;
2738
2739                 if (hairpin_mode & 0xf) {
2740                         int j;
2741
2742                         rte_eth_hairpin_unbind(pi, RTE_MAX_ETHPORTS);
2743                         /* unbind all peer Tx from current Rx */
2744                         peer_pi = rte_eth_hairpin_get_peer_ports(pi, peer_pl,
2745                                                         RTE_MAX_ETHPORTS, 0);
2746                         if (peer_pi < 0)
2747                                 continue;
2748                         for (j = 0; j < peer_pi; j++) {
2749                                 if (!port_is_started(peer_pl[j]))
2750                                         continue;
2751                                 rte_eth_hairpin_unbind(peer_pl[j], pi);
2752                         }
2753                 }
2754
2755                 if (port->flow_list)
2756                         port_flow_flush(pi);
2757
2758                 if (rte_eth_dev_stop(pi) != 0)
2759                         RTE_LOG(ERR, EAL, "rte_eth_dev_stop failed for port %u\n",
2760                                 pi);
2761
2762                 if (rte_atomic16_cmpset(&(port->port_status),
2763                         RTE_PORT_HANDLING, RTE_PORT_STOPPED) == 0)
2764                         printf("Port %d can not be set into stopped\n", pi);
2765                 need_check_link_status = 1;
2766         }
2767         if (need_check_link_status && !no_link_check)
2768                 check_all_ports_link_status(RTE_PORT_ALL);
2769
2770         printf("Done\n");
2771 }
2772
2773 static void
2774 remove_invalid_ports_in(portid_t *array, portid_t *total)
2775 {
2776         portid_t i;
2777         portid_t new_total = 0;
2778
2779         for (i = 0; i < *total; i++)
2780                 if (!port_id_is_invalid(array[i], DISABLED_WARN)) {
2781                         array[new_total] = array[i];
2782                         new_total++;
2783                 }
2784         *total = new_total;
2785 }
2786
2787 static void
2788 remove_invalid_ports(void)
2789 {
2790         remove_invalid_ports_in(ports_ids, &nb_ports);
2791         remove_invalid_ports_in(fwd_ports_ids, &nb_fwd_ports);
2792         nb_cfg_ports = nb_fwd_ports;
2793 }
2794
2795 void
2796 close_port(portid_t pid)
2797 {
2798         portid_t pi;
2799         struct rte_port *port;
2800
2801         if (port_id_is_invalid(pid, ENABLED_WARN))
2802                 return;
2803
2804         printf("Closing ports...\n");
2805
2806         RTE_ETH_FOREACH_DEV(pi) {
2807                 if (pid != pi && pid != (portid_t)RTE_PORT_ALL)
2808                         continue;
2809
2810                 if (port_is_forwarding(pi) != 0 && test_done == 0) {
2811                         printf("Please remove port %d from forwarding configuration.\n", pi);
2812                         continue;
2813                 }
2814
2815                 if (port_is_bonding_slave(pi)) {
2816                         printf("Please remove port %d from bonded device.\n", pi);
2817                         continue;
2818                 }
2819
2820                 port = &ports[pi];
2821                 if (rte_atomic16_cmpset(&(port->port_status),
2822                         RTE_PORT_CLOSED, RTE_PORT_CLOSED) == 1) {
2823                         printf("Port %d is already closed\n", pi);
2824                         continue;
2825                 }
2826
2827                 port_flow_flush(pi);
2828                 rte_eth_dev_close(pi);
2829         }
2830
2831         remove_invalid_ports();
2832         printf("Done\n");
2833 }
2834
2835 void
2836 reset_port(portid_t pid)
2837 {
2838         int diag;
2839         portid_t pi;
2840         struct rte_port *port;
2841
2842         if (port_id_is_invalid(pid, ENABLED_WARN))
2843                 return;
2844
2845         if ((pid == (portid_t)RTE_PORT_ALL && !all_ports_stopped()) ||
2846                 (pid != (portid_t)RTE_PORT_ALL && !port_is_stopped(pid))) {
2847                 printf("Can not reset port(s), please stop port(s) first.\n");
2848                 return;
2849         }
2850
2851         printf("Resetting ports...\n");
2852
2853         RTE_ETH_FOREACH_DEV(pi) {
2854                 if (pid != pi && pid != (portid_t)RTE_PORT_ALL)
2855                         continue;
2856
2857                 if (port_is_forwarding(pi) != 0 && test_done == 0) {
2858                         printf("Please remove port %d from forwarding "
2859                                "configuration.\n", pi);
2860                         continue;
2861                 }
2862
2863                 if (port_is_bonding_slave(pi)) {
2864                         printf("Please remove port %d from bonded device.\n",
2865                                pi);
2866                         continue;
2867                 }
2868
2869                 diag = rte_eth_dev_reset(pi);
2870                 if (diag == 0) {
2871                         port = &ports[pi];
2872                         port->need_reconfig = 1;
2873                         port->need_reconfig_queues = 1;
2874                 } else {
2875                         printf("Failed to reset port %d. diag=%d\n", pi, diag);
2876                 }
2877         }
2878
2879         printf("Done\n");
2880 }
2881
2882 void
2883 attach_port(char *identifier)
2884 {
2885         portid_t pi;
2886         struct rte_dev_iterator iterator;
2887
2888         printf("Attaching a new port...\n");
2889
2890         if (identifier == NULL) {
2891                 printf("Invalid parameters are specified\n");
2892                 return;
2893         }
2894
2895         if (rte_dev_probe(identifier) < 0) {
2896                 TESTPMD_LOG(ERR, "Failed to attach port %s\n", identifier);
2897                 return;
2898         }
2899
2900         /* first attach mode: event */
2901         if (setup_on_probe_event) {
2902                 /* new ports are detected on RTE_ETH_EVENT_NEW event */
2903                 for (pi = 0; pi < RTE_MAX_ETHPORTS; pi++)
2904                         if (ports[pi].port_status == RTE_PORT_HANDLING &&
2905                                         ports[pi].need_setup != 0)
2906                                 setup_attached_port(pi);
2907                 return;
2908         }
2909
2910         /* second attach mode: iterator */
2911         RTE_ETH_FOREACH_MATCHING_DEV(pi, identifier, &iterator) {
2912                 /* setup ports matching the devargs used for probing */
2913                 if (port_is_forwarding(pi))
2914                         continue; /* port was already attached before */
2915                 setup_attached_port(pi);
2916         }
2917 }
2918
2919 static void
2920 setup_attached_port(portid_t pi)
2921 {
2922         unsigned int socket_id;
2923         int ret;
2924
2925         socket_id = (unsigned)rte_eth_dev_socket_id(pi);
2926         /* if socket_id is invalid, set to the first available socket. */
2927         if (check_socket_id(socket_id) < 0)
2928                 socket_id = socket_ids[0];
2929         reconfig(pi, socket_id);
2930         ret = rte_eth_promiscuous_enable(pi);
2931         if (ret != 0)
2932                 printf("Error during enabling promiscuous mode for port %u: %s - ignore\n",
2933                         pi, rte_strerror(-ret));
2934
2935         ports_ids[nb_ports++] = pi;
2936         fwd_ports_ids[nb_fwd_ports++] = pi;
2937         nb_cfg_ports = nb_fwd_ports;
2938         ports[pi].need_setup = 0;
2939         ports[pi].port_status = RTE_PORT_STOPPED;
2940
2941         printf("Port %d is attached. Now total ports is %d\n", pi, nb_ports);
2942         printf("Done\n");
2943 }
2944
2945 static void
2946 detach_device(struct rte_device *dev)
2947 {
2948         portid_t sibling;
2949
2950         if (dev == NULL) {
2951                 printf("Device already removed\n");
2952                 return;
2953         }
2954
2955         printf("Removing a device...\n");
2956
2957         RTE_ETH_FOREACH_DEV_OF(sibling, dev) {
2958                 if (ports[sibling].port_status != RTE_PORT_CLOSED) {
2959                         if (ports[sibling].port_status != RTE_PORT_STOPPED) {
2960                                 printf("Port %u not stopped\n", sibling);
2961                                 return;
2962                         }
2963                         port_flow_flush(sibling);
2964                 }
2965         }
2966
2967         if (rte_dev_remove(dev) < 0) {
2968                 TESTPMD_LOG(ERR, "Failed to detach device %s\n", dev->name);
2969                 return;
2970         }
2971         remove_invalid_ports();
2972
2973         printf("Device is detached\n");
2974         printf("Now total ports is %d\n", nb_ports);
2975         printf("Done\n");
2976         return;
2977 }
2978
2979 void
2980 detach_port_device(portid_t port_id)
2981 {
2982         if (port_id_is_invalid(port_id, ENABLED_WARN))
2983                 return;
2984
2985         if (ports[port_id].port_status != RTE_PORT_CLOSED) {
2986                 if (ports[port_id].port_status != RTE_PORT_STOPPED) {
2987                         printf("Port not stopped\n");
2988                         return;
2989                 }
2990                 printf("Port was not closed\n");
2991         }
2992
2993         detach_device(rte_eth_devices[port_id].device);
2994 }
2995
2996 void
2997 detach_devargs(char *identifier)
2998 {
2999         struct rte_dev_iterator iterator;
3000         struct rte_devargs da;
3001         portid_t port_id;
3002
3003         printf("Removing a device...\n");
3004
3005         memset(&da, 0, sizeof(da));
3006         if (rte_devargs_parsef(&da, "%s", identifier)) {
3007                 printf("cannot parse identifier\n");
3008                 if (da.args)
3009                         free(da.args);
3010                 return;
3011         }
3012
3013         RTE_ETH_FOREACH_MATCHING_DEV(port_id, identifier, &iterator) {
3014                 if (ports[port_id].port_status != RTE_PORT_CLOSED) {
3015                         if (ports[port_id].port_status != RTE_PORT_STOPPED) {
3016                                 printf("Port %u not stopped\n", port_id);
3017                                 rte_eth_iterator_cleanup(&iterator);
3018                                 return;
3019                         }
3020                         port_flow_flush(port_id);
3021                 }
3022         }
3023
3024         if (rte_eal_hotplug_remove(da.bus->name, da.name) != 0) {
3025                 TESTPMD_LOG(ERR, "Failed to detach device %s(%s)\n",
3026                             da.name, da.bus->name);
3027                 return;
3028         }
3029
3030         remove_invalid_ports();
3031
3032         printf("Device %s is detached\n", identifier);
3033         printf("Now total ports is %d\n", nb_ports);
3034         printf("Done\n");
3035 }
3036
3037 void
3038 pmd_test_exit(void)
3039 {
3040         portid_t pt_id;
3041         unsigned int i;
3042         int ret;
3043
3044         if (test_done == 0)
3045                 stop_packet_forwarding();
3046
3047         for (i = 0 ; i < RTE_DIM(mempools) ; i++) {
3048                 if (mempools[i]) {
3049                         if (mp_alloc_type == MP_ALLOC_ANON)
3050                                 rte_mempool_mem_iter(mempools[i], dma_unmap_cb,
3051                                                      NULL);
3052                 }
3053         }
3054         if (ports != NULL) {
3055                 no_link_check = 1;
3056                 RTE_ETH_FOREACH_DEV(pt_id) {
3057                         printf("\nStopping port %d...\n", pt_id);
3058                         fflush(stdout);
3059                         stop_port(pt_id);
3060                 }
3061                 RTE_ETH_FOREACH_DEV(pt_id) {
3062                         printf("\nShutting down port %d...\n", pt_id);
3063                         fflush(stdout);
3064                         close_port(pt_id);
3065                 }
3066         }
3067
3068         if (hot_plug) {
3069                 ret = rte_dev_event_monitor_stop();
3070                 if (ret) {
3071                         RTE_LOG(ERR, EAL,
3072                                 "fail to stop device event monitor.");
3073                         return;
3074                 }
3075
3076                 ret = rte_dev_event_callback_unregister(NULL,
3077                         dev_event_callback, NULL);
3078                 if (ret < 0) {
3079                         RTE_LOG(ERR, EAL,
3080                                 "fail to unregister device event callback.\n");
3081                         return;
3082                 }
3083
3084                 ret = rte_dev_hotplug_handle_disable();
3085                 if (ret) {
3086                         RTE_LOG(ERR, EAL,
3087                                 "fail to disable hotplug handling.\n");
3088                         return;
3089                 }
3090         }
3091         for (i = 0 ; i < RTE_DIM(mempools) ; i++) {
3092                 if (mempools[i])
3093                         rte_mempool_free(mempools[i]);
3094         }
3095
3096         printf("\nBye...\n");
3097 }
3098
3099 typedef void (*cmd_func_t)(void);
3100 struct pmd_test_command {
3101         const char *cmd_name;
3102         cmd_func_t cmd_func;
3103 };
3104
3105 /* Check the link status of all ports in up to 9s, and print them finally */
3106 static void
3107 check_all_ports_link_status(uint32_t port_mask)
3108 {
3109 #define CHECK_INTERVAL 100 /* 100ms */
3110 #define MAX_CHECK_TIME 90 /* 9s (90 * 100ms) in total */
3111         portid_t portid;
3112         uint8_t count, all_ports_up, print_flag = 0;
3113         struct rte_eth_link link;
3114         int ret;
3115         char link_status[RTE_ETH_LINK_MAX_STR_LEN];
3116
3117         printf("Checking link statuses...\n");
3118         fflush(stdout);
3119         for (count = 0; count <= MAX_CHECK_TIME; count++) {
3120                 all_ports_up = 1;
3121                 RTE_ETH_FOREACH_DEV(portid) {
3122                         if ((port_mask & (1 << portid)) == 0)
3123                                 continue;
3124                         memset(&link, 0, sizeof(link));
3125                         ret = rte_eth_link_get_nowait(portid, &link);
3126                         if (ret < 0) {
3127                                 all_ports_up = 0;
3128                                 if (print_flag == 1)
3129                                         printf("Port %u link get failed: %s\n",
3130                                                 portid, rte_strerror(-ret));
3131                                 continue;
3132                         }
3133                         /* print link status if flag set */
3134                         if (print_flag == 1) {
3135                                 rte_eth_link_to_str(link_status,
3136                                         sizeof(link_status), &link);
3137                                 printf("Port %d %s\n", portid, link_status);
3138                                 continue;
3139                         }
3140                         /* clear all_ports_up flag if any link down */
3141                         if (link.link_status == ETH_LINK_DOWN) {
3142                                 all_ports_up = 0;
3143                                 break;
3144                         }
3145                 }
3146                 /* after finally printing all link status, get out */
3147                 if (print_flag == 1)
3148                         break;
3149
3150                 if (all_ports_up == 0) {
3151                         fflush(stdout);
3152                         rte_delay_ms(CHECK_INTERVAL);
3153                 }
3154
3155                 /* set the print_flag if all ports up or timeout */
3156                 if (all_ports_up == 1 || count == (MAX_CHECK_TIME - 1)) {
3157                         print_flag = 1;
3158                 }
3159
3160                 if (lsc_interrupt)
3161                         break;
3162         }
3163 }
3164
3165 static void
3166 rmv_port_callback(void *arg)
3167 {
3168         int need_to_start = 0;
3169         int org_no_link_check = no_link_check;
3170         portid_t port_id = (intptr_t)arg;
3171         struct rte_device *dev;
3172
3173         RTE_ETH_VALID_PORTID_OR_RET(port_id);
3174
3175         if (!test_done && port_is_forwarding(port_id)) {
3176                 need_to_start = 1;
3177                 stop_packet_forwarding();
3178         }
3179         no_link_check = 1;
3180         stop_port(port_id);
3181         no_link_check = org_no_link_check;
3182
3183         /* Save rte_device pointer before closing ethdev port */
3184         dev = rte_eth_devices[port_id].device;
3185         close_port(port_id);
3186         detach_device(dev); /* might be already removed or have more ports */
3187
3188         if (need_to_start)
3189                 start_packet_forwarding(0);
3190 }
3191
3192 /* This function is used by the interrupt thread */
3193 static int
3194 eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param,
3195                   void *ret_param)
3196 {
3197         RTE_SET_USED(param);
3198         RTE_SET_USED(ret_param);
3199
3200         if (type >= RTE_ETH_EVENT_MAX) {
3201                 fprintf(stderr, "\nPort %" PRIu16 ": %s called upon invalid event %d\n",
3202                         port_id, __func__, type);
3203                 fflush(stderr);
3204         } else if (event_print_mask & (UINT32_C(1) << type)) {
3205                 printf("\nPort %" PRIu16 ": %s event\n", port_id,
3206                         eth_event_desc[type]);
3207                 fflush(stdout);
3208         }
3209
3210         switch (type) {
3211         case RTE_ETH_EVENT_NEW:
3212                 ports[port_id].need_setup = 1;
3213                 ports[port_id].port_status = RTE_PORT_HANDLING;
3214                 break;
3215         case RTE_ETH_EVENT_INTR_RMV:
3216                 if (port_id_is_invalid(port_id, DISABLED_WARN))
3217                         break;
3218                 if (rte_eal_alarm_set(100000,
3219                                 rmv_port_callback, (void *)(intptr_t)port_id))
3220                         fprintf(stderr, "Could not set up deferred device removal\n");
3221                 break;
3222         case RTE_ETH_EVENT_DESTROY:
3223                 ports[port_id].port_status = RTE_PORT_CLOSED;
3224                 printf("Port %u is closed\n", port_id);
3225                 break;
3226         default:
3227                 break;
3228         }
3229         return 0;
3230 }
3231
3232 static int
3233 register_eth_event_callback(void)
3234 {
3235         int ret;
3236         enum rte_eth_event_type event;
3237
3238         for (event = RTE_ETH_EVENT_UNKNOWN;
3239                         event < RTE_ETH_EVENT_MAX; event++) {
3240                 ret = rte_eth_dev_callback_register(RTE_ETH_ALL,
3241                                 event,
3242                                 eth_event_callback,
3243                                 NULL);
3244                 if (ret != 0) {
3245                         TESTPMD_LOG(ERR, "Failed to register callback for "
3246                                         "%s event\n", eth_event_desc[event]);
3247                         return -1;
3248                 }
3249         }
3250
3251         return 0;
3252 }
3253
3254 /* This function is used by the interrupt thread */
3255 static void
3256 dev_event_callback(const char *device_name, enum rte_dev_event_type type,
3257                              __rte_unused void *arg)
3258 {
3259         uint16_t port_id;
3260         int ret;
3261
3262         if (type >= RTE_DEV_EVENT_MAX) {
3263                 fprintf(stderr, "%s called upon invalid event %d\n",
3264                         __func__, type);
3265                 fflush(stderr);
3266         }
3267
3268         switch (type) {
3269         case RTE_DEV_EVENT_REMOVE:
3270                 RTE_LOG(DEBUG, EAL, "The device: %s has been removed!\n",
3271                         device_name);
3272                 ret = rte_eth_dev_get_port_by_name(device_name, &port_id);
3273                 if (ret) {
3274                         RTE_LOG(ERR, EAL, "can not get port by device %s!\n",
3275                                 device_name);
3276                         return;
3277                 }
3278                 /*
3279                  * Because the user's callback is invoked in eal interrupt
3280                  * callback, the interrupt callback need to be finished before
3281                  * it can be unregistered when detaching device. So finish
3282                  * callback soon and use a deferred removal to detach device
3283                  * is need. It is a workaround, once the device detaching be
3284                  * moved into the eal in the future, the deferred removal could
3285                  * be deleted.
3286                  */
3287                 if (rte_eal_alarm_set(100000,
3288                                 rmv_port_callback, (void *)(intptr_t)port_id))
3289                         RTE_LOG(ERR, EAL,
3290                                 "Could not set up deferred device removal\n");
3291                 break;
3292         case RTE_DEV_EVENT_ADD:
3293                 RTE_LOG(ERR, EAL, "The device: %s has been added!\n",
3294                         device_name);
3295                 /* TODO: After finish kernel driver binding,
3296                  * begin to attach port.
3297                  */
3298                 break;
3299         default:
3300                 break;
3301         }
3302 }
3303
3304 static void
3305 rxtx_port_config(struct rte_port *port)
3306 {
3307         uint16_t qid;
3308         uint64_t offloads;
3309
3310         for (qid = 0; qid < nb_rxq; qid++) {
3311                 offloads = port->rx_conf[qid].offloads;
3312                 port->rx_conf[qid] = port->dev_info.default_rxconf;
3313                 if (offloads != 0)
3314                         port->rx_conf[qid].offloads = offloads;
3315
3316                 /* Check if any Rx parameters have been passed */
3317                 if (rx_pthresh != RTE_PMD_PARAM_UNSET)
3318                         port->rx_conf[qid].rx_thresh.pthresh = rx_pthresh;
3319
3320                 if (rx_hthresh != RTE_PMD_PARAM_UNSET)
3321                         port->rx_conf[qid].rx_thresh.hthresh = rx_hthresh;
3322
3323                 if (rx_wthresh != RTE_PMD_PARAM_UNSET)
3324                         port->rx_conf[qid].rx_thresh.wthresh = rx_wthresh;
3325
3326                 if (rx_free_thresh != RTE_PMD_PARAM_UNSET)
3327                         port->rx_conf[qid].rx_free_thresh = rx_free_thresh;
3328
3329                 if (rx_drop_en != RTE_PMD_PARAM_UNSET)
3330                         port->rx_conf[qid].rx_drop_en = rx_drop_en;
3331
3332                 port->nb_rx_desc[qid] = nb_rxd;
3333         }
3334
3335         for (qid = 0; qid < nb_txq; qid++) {
3336                 offloads = port->tx_conf[qid].offloads;
3337                 port->tx_conf[qid] = port->dev_info.default_txconf;
3338                 if (offloads != 0)
3339                         port->tx_conf[qid].offloads = offloads;
3340
3341                 /* Check if any Tx parameters have been passed */
3342                 if (tx_pthresh != RTE_PMD_PARAM_UNSET)
3343                         port->tx_conf[qid].tx_thresh.pthresh = tx_pthresh;
3344
3345                 if (tx_hthresh != RTE_PMD_PARAM_UNSET)
3346                         port->tx_conf[qid].tx_thresh.hthresh = tx_hthresh;
3347
3348                 if (tx_wthresh != RTE_PMD_PARAM_UNSET)
3349                         port->tx_conf[qid].tx_thresh.wthresh = tx_wthresh;
3350
3351                 if (tx_rs_thresh != RTE_PMD_PARAM_UNSET)
3352                         port->tx_conf[qid].tx_rs_thresh = tx_rs_thresh;
3353
3354                 if (tx_free_thresh != RTE_PMD_PARAM_UNSET)
3355                         port->tx_conf[qid].tx_free_thresh = tx_free_thresh;
3356
3357                 port->nb_tx_desc[qid] = nb_txd;
3358         }
3359 }
3360
3361 void
3362 init_port_config(void)
3363 {
3364         portid_t pid;
3365         struct rte_port *port;
3366         int ret;
3367
3368         RTE_ETH_FOREACH_DEV(pid) {
3369                 port = &ports[pid];
3370                 port->dev_conf.fdir_conf = fdir_conf;
3371
3372                 ret = eth_dev_info_get_print_err(pid, &port->dev_info);
3373                 if (ret != 0)
3374                         return;
3375
3376                 if (nb_rxq > 1) {
3377                         port->dev_conf.rx_adv_conf.rss_conf.rss_key = NULL;
3378                         port->dev_conf.rx_adv_conf.rss_conf.rss_hf =
3379                                 rss_hf & port->dev_info.flow_type_rss_offloads;
3380                 } else {
3381                         port->dev_conf.rx_adv_conf.rss_conf.rss_key = NULL;
3382                         port->dev_conf.rx_adv_conf.rss_conf.rss_hf = 0;
3383                 }
3384
3385                 if (port->dcb_flag == 0) {
3386                         if( port->dev_conf.rx_adv_conf.rss_conf.rss_hf != 0)
3387                                 port->dev_conf.rxmode.mq_mode =
3388                                         (enum rte_eth_rx_mq_mode)
3389                                                 (rx_mq_mode & ETH_MQ_RX_RSS);
3390                         else
3391                                 port->dev_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
3392                 }
3393
3394                 rxtx_port_config(port);
3395
3396                 ret = eth_macaddr_get_print_err(pid, &port->eth_addr);
3397                 if (ret != 0)
3398                         return;
3399
3400 #if defined RTE_NET_IXGBE && defined RTE_LIBRTE_IXGBE_BYPASS
3401                 rte_pmd_ixgbe_bypass_init(pid);
3402 #endif
3403
3404                 if (lsc_interrupt &&
3405                     (rte_eth_devices[pid].data->dev_flags &
3406                      RTE_ETH_DEV_INTR_LSC))
3407                         port->dev_conf.intr_conf.lsc = 1;
3408                 if (rmv_interrupt &&
3409                     (rte_eth_devices[pid].data->dev_flags &
3410                      RTE_ETH_DEV_INTR_RMV))
3411                         port->dev_conf.intr_conf.rmv = 1;
3412         }
3413 }
3414
3415 void set_port_slave_flag(portid_t slave_pid)
3416 {
3417         struct rte_port *port;
3418
3419         port = &ports[slave_pid];
3420         port->slave_flag = 1;
3421 }
3422
3423 void clear_port_slave_flag(portid_t slave_pid)
3424 {
3425         struct rte_port *port;
3426
3427         port = &ports[slave_pid];
3428         port->slave_flag = 0;
3429 }
3430
3431 uint8_t port_is_bonding_slave(portid_t slave_pid)
3432 {
3433         struct rte_port *port;
3434
3435         port = &ports[slave_pid];
3436         if ((rte_eth_devices[slave_pid].data->dev_flags &
3437             RTE_ETH_DEV_BONDED_SLAVE) || (port->slave_flag == 1))
3438                 return 1;
3439         return 0;
3440 }
3441
3442 const uint16_t vlan_tags[] = {
3443                 0,  1,  2,  3,  4,  5,  6,  7,
3444                 8,  9, 10, 11,  12, 13, 14, 15,
3445                 16, 17, 18, 19, 20, 21, 22, 23,
3446                 24, 25, 26, 27, 28, 29, 30, 31
3447 };
3448
3449 static  int
3450 get_eth_dcb_conf(portid_t pid, struct rte_eth_conf *eth_conf,
3451                  enum dcb_mode_enable dcb_mode,
3452                  enum rte_eth_nb_tcs num_tcs,
3453                  uint8_t pfc_en)
3454 {
3455         uint8_t i;
3456         int32_t rc;
3457         struct rte_eth_rss_conf rss_conf;
3458
3459         /*
3460          * Builds up the correct configuration for dcb+vt based on the vlan tags array
3461          * given above, and the number of traffic classes available for use.
3462          */
3463         if (dcb_mode == DCB_VT_ENABLED) {
3464                 struct rte_eth_vmdq_dcb_conf *vmdq_rx_conf =
3465                                 &eth_conf->rx_adv_conf.vmdq_dcb_conf;
3466                 struct rte_eth_vmdq_dcb_tx_conf *vmdq_tx_conf =
3467                                 &eth_conf->tx_adv_conf.vmdq_dcb_tx_conf;
3468
3469                 /* VMDQ+DCB RX and TX configurations */
3470                 vmdq_rx_conf->enable_default_pool = 0;
3471                 vmdq_rx_conf->default_pool = 0;
3472                 vmdq_rx_conf->nb_queue_pools =
3473                         (num_tcs ==  ETH_4_TCS ? ETH_32_POOLS : ETH_16_POOLS);
3474                 vmdq_tx_conf->nb_queue_pools =
3475                         (num_tcs ==  ETH_4_TCS ? ETH_32_POOLS : ETH_16_POOLS);
3476
3477                 vmdq_rx_conf->nb_pool_maps = vmdq_rx_conf->nb_queue_pools;
3478                 for (i = 0; i < vmdq_rx_conf->nb_pool_maps; i++) {
3479                         vmdq_rx_conf->pool_map[i].vlan_id = vlan_tags[i];
3480                         vmdq_rx_conf->pool_map[i].pools =
3481                                 1 << (i % vmdq_rx_conf->nb_queue_pools);
3482                 }
3483                 for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
3484                         vmdq_rx_conf->dcb_tc[i] = i % num_tcs;
3485                         vmdq_tx_conf->dcb_tc[i] = i % num_tcs;
3486                 }
3487
3488                 /* set DCB mode of RX and TX of multiple queues */
3489                 eth_conf->rxmode.mq_mode =
3490                                 (enum rte_eth_rx_mq_mode)
3491                                         (rx_mq_mode & ETH_MQ_RX_VMDQ_DCB);
3492                 eth_conf->txmode.mq_mode = ETH_MQ_TX_VMDQ_DCB;
3493         } else {
3494                 struct rte_eth_dcb_rx_conf *rx_conf =
3495                                 &eth_conf->rx_adv_conf.dcb_rx_conf;
3496                 struct rte_eth_dcb_tx_conf *tx_conf =
3497                                 &eth_conf->tx_adv_conf.dcb_tx_conf;
3498
3499                 memset(&rss_conf, 0, sizeof(struct rte_eth_rss_conf));
3500
3501                 rc = rte_eth_dev_rss_hash_conf_get(pid, &rss_conf);
3502                 if (rc != 0)
3503                         return rc;
3504
3505                 rx_conf->nb_tcs = num_tcs;
3506                 tx_conf->nb_tcs = num_tcs;
3507
3508                 for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
3509                         rx_conf->dcb_tc[i] = i % num_tcs;
3510                         tx_conf->dcb_tc[i] = i % num_tcs;
3511                 }
3512
3513                 eth_conf->rxmode.mq_mode =
3514                                 (enum rte_eth_rx_mq_mode)
3515                                         (rx_mq_mode & ETH_MQ_RX_DCB_RSS);
3516                 eth_conf->rx_adv_conf.rss_conf = rss_conf;
3517                 eth_conf->txmode.mq_mode = ETH_MQ_TX_DCB;
3518         }
3519
3520         if (pfc_en)
3521                 eth_conf->dcb_capability_en =
3522                                 ETH_DCB_PG_SUPPORT | ETH_DCB_PFC_SUPPORT;
3523         else
3524                 eth_conf->dcb_capability_en = ETH_DCB_PG_SUPPORT;
3525
3526         return 0;
3527 }
3528
3529 int
3530 init_port_dcb_config(portid_t pid,
3531                      enum dcb_mode_enable dcb_mode,
3532                      enum rte_eth_nb_tcs num_tcs,
3533                      uint8_t pfc_en)
3534 {
3535         struct rte_eth_conf port_conf;
3536         struct rte_port *rte_port;
3537         int retval;
3538         uint16_t i;
3539
3540         rte_port = &ports[pid];
3541
3542         memset(&port_conf, 0, sizeof(struct rte_eth_conf));
3543         /* Enter DCB configuration status */
3544         dcb_config = 1;
3545
3546         port_conf.rxmode = rte_port->dev_conf.rxmode;
3547         port_conf.txmode = rte_port->dev_conf.txmode;
3548
3549         /*set configuration of DCB in vt mode and DCB in non-vt mode*/
3550         retval = get_eth_dcb_conf(pid, &port_conf, dcb_mode, num_tcs, pfc_en);
3551         if (retval < 0)
3552                 return retval;
3553         port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
3554
3555         /* re-configure the device . */
3556         retval = rte_eth_dev_configure(pid, nb_rxq, nb_rxq, &port_conf);
3557         if (retval < 0)
3558                 return retval;
3559
3560         retval = eth_dev_info_get_print_err(pid, &rte_port->dev_info);
3561         if (retval != 0)
3562                 return retval;
3563
3564         /* If dev_info.vmdq_pool_base is greater than 0,
3565          * the queue id of vmdq pools is started after pf queues.
3566          */
3567         if (dcb_mode == DCB_VT_ENABLED &&
3568             rte_port->dev_info.vmdq_pool_base > 0) {
3569                 printf("VMDQ_DCB multi-queue mode is nonsensical"
3570                         " for port %d.", pid);
3571                 return -1;
3572         }
3573
3574         /* Assume the ports in testpmd have the same dcb capability
3575          * and has the same number of rxq and txq in dcb mode
3576          */
3577         if (dcb_mode == DCB_VT_ENABLED) {
3578                 if (rte_port->dev_info.max_vfs > 0) {
3579                         nb_rxq = rte_port->dev_info.nb_rx_queues;
3580                         nb_txq = rte_port->dev_info.nb_tx_queues;
3581                 } else {
3582                         nb_rxq = rte_port->dev_info.max_rx_queues;
3583                         nb_txq = rte_port->dev_info.max_tx_queues;
3584                 }
3585         } else {
3586                 /*if vt is disabled, use all pf queues */
3587                 if (rte_port->dev_info.vmdq_pool_base == 0) {
3588                         nb_rxq = rte_port->dev_info.max_rx_queues;
3589                         nb_txq = rte_port->dev_info.max_tx_queues;
3590                 } else {
3591                         nb_rxq = (queueid_t)num_tcs;
3592                         nb_txq = (queueid_t)num_tcs;
3593
3594                 }
3595         }
3596         rx_free_thresh = 64;
3597
3598         memcpy(&rte_port->dev_conf, &port_conf, sizeof(struct rte_eth_conf));
3599
3600         rxtx_port_config(rte_port);
3601         /* VLAN filter */
3602         rte_port->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
3603         for (i = 0; i < RTE_DIM(vlan_tags); i++)
3604                 rx_vft_set(pid, vlan_tags[i], 1);
3605
3606         retval = eth_macaddr_get_print_err(pid, &rte_port->eth_addr);
3607         if (retval != 0)
3608                 return retval;
3609
3610         rte_port->dcb_flag = 1;
3611
3612         return 0;
3613 }
3614
3615 static void
3616 init_port(void)
3617 {
3618         int i;
3619
3620         /* Configuration of Ethernet ports. */
3621         ports = rte_zmalloc("testpmd: ports",
3622                             sizeof(struct rte_port) * RTE_MAX_ETHPORTS,
3623                             RTE_CACHE_LINE_SIZE);
3624         if (ports == NULL) {
3625                 rte_exit(EXIT_FAILURE,
3626                                 "rte_zmalloc(%d struct rte_port) failed\n",
3627                                 RTE_MAX_ETHPORTS);
3628         }
3629         for (i = 0; i < RTE_MAX_ETHPORTS; i++)
3630                 LIST_INIT(&ports[i].flow_tunnel_list);
3631         /* Initialize ports NUMA structures */
3632         memset(port_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
3633         memset(rxring_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
3634         memset(txring_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
3635 }
3636
3637 static void
3638 force_quit(void)
3639 {
3640         pmd_test_exit();
3641         prompt_exit();
3642 }
3643
3644 static void
3645 print_stats(void)
3646 {
3647         uint8_t i;
3648         const char clr[] = { 27, '[', '2', 'J', '\0' };
3649         const char top_left[] = { 27, '[', '1', ';', '1', 'H', '\0' };
3650
3651         /* Clear screen and move to top left */
3652         printf("%s%s", clr, top_left);
3653
3654         printf("\nPort statistics ====================================");
3655         for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++)
3656                 nic_stats_display(fwd_ports_ids[i]);
3657
3658         fflush(stdout);
3659 }
3660
3661 static void
3662 signal_handler(int signum)
3663 {
3664         if (signum == SIGINT || signum == SIGTERM) {
3665                 printf("\nSignal %d received, preparing to exit...\n",
3666                                 signum);
3667 #ifdef RTE_LIB_PDUMP
3668                 /* uninitialize packet capture framework */
3669                 rte_pdump_uninit();
3670 #endif
3671 #ifdef RTE_LIB_LATENCYSTATS
3672                 if (latencystats_enabled != 0)
3673                         rte_latencystats_uninit();
3674 #endif
3675                 force_quit();
3676                 /* Set flag to indicate the force termination. */
3677                 f_quit = 1;
3678                 /* exit with the expected status */
3679                 signal(signum, SIG_DFL);
3680                 kill(getpid(), signum);
3681         }
3682 }
3683
3684 int
3685 main(int argc, char** argv)
3686 {
3687         int diag;
3688         portid_t port_id;
3689         uint16_t count;
3690         int ret;
3691
3692         signal(SIGINT, signal_handler);
3693         signal(SIGTERM, signal_handler);
3694
3695         testpmd_logtype = rte_log_register("testpmd");
3696         if (testpmd_logtype < 0)
3697                 rte_exit(EXIT_FAILURE, "Cannot register log type");
3698         rte_log_set_level(testpmd_logtype, RTE_LOG_DEBUG);
3699
3700         diag = rte_eal_init(argc, argv);
3701         if (diag < 0)
3702                 rte_exit(EXIT_FAILURE, "Cannot init EAL: %s\n",
3703                          rte_strerror(rte_errno));
3704
3705         if (rte_eal_process_type() == RTE_PROC_SECONDARY)
3706                 rte_exit(EXIT_FAILURE,
3707                          "Secondary process type not supported.\n");
3708
3709         ret = register_eth_event_callback();
3710         if (ret != 0)
3711                 rte_exit(EXIT_FAILURE, "Cannot register for ethdev events");
3712
3713 #ifdef RTE_LIB_PDUMP
3714         /* initialize packet capture framework */
3715         rte_pdump_init();
3716 #endif
3717
3718         count = 0;
3719         RTE_ETH_FOREACH_DEV(port_id) {
3720                 ports_ids[count] = port_id;
3721                 count++;
3722         }
3723         nb_ports = (portid_t) count;
3724         if (nb_ports == 0)
3725                 TESTPMD_LOG(WARNING, "No probed ethernet devices\n");
3726
3727         /* allocate port structures, and init them */
3728         init_port();
3729
3730         set_def_fwd_config();
3731         if (nb_lcores == 0)
3732                 rte_exit(EXIT_FAILURE, "No cores defined for forwarding\n"
3733                          "Check the core mask argument\n");
3734
3735         /* Bitrate/latency stats disabled by default */
3736 #ifdef RTE_LIB_BITRATESTATS
3737         bitrate_enabled = 0;
3738 #endif
3739 #ifdef RTE_LIB_LATENCYSTATS
3740         latencystats_enabled = 0;
3741 #endif
3742
3743         /* on FreeBSD, mlockall() is disabled by default */
3744 #ifdef RTE_EXEC_ENV_FREEBSD
3745         do_mlockall = 0;
3746 #else
3747         do_mlockall = 1;
3748 #endif
3749
3750         argc -= diag;
3751         argv += diag;
3752         if (argc > 1)
3753                 launch_args_parse(argc, argv);
3754
3755         if (do_mlockall && mlockall(MCL_CURRENT | MCL_FUTURE)) {
3756                 TESTPMD_LOG(NOTICE, "mlockall() failed with error \"%s\"\n",
3757                         strerror(errno));
3758         }
3759
3760         if (tx_first && interactive)
3761                 rte_exit(EXIT_FAILURE, "--tx-first cannot be used on "
3762                                 "interactive mode.\n");
3763
3764         if (tx_first && lsc_interrupt) {
3765                 printf("Warning: lsc_interrupt needs to be off when "
3766                                 " using tx_first. Disabling.\n");
3767                 lsc_interrupt = 0;
3768         }
3769
3770         if (!nb_rxq && !nb_txq)
3771                 printf("Warning: Either rx or tx queues should be non-zero\n");
3772
3773         if (nb_rxq > 1 && nb_rxq > nb_txq)
3774                 printf("Warning: nb_rxq=%d enables RSS configuration, "
3775                        "but nb_txq=%d will prevent to fully test it.\n",
3776                        nb_rxq, nb_txq);
3777
3778         init_config();
3779
3780         if (hot_plug) {
3781                 ret = rte_dev_hotplug_handle_enable();
3782                 if (ret) {
3783                         RTE_LOG(ERR, EAL,
3784                                 "fail to enable hotplug handling.");
3785                         return -1;
3786                 }
3787
3788                 ret = rte_dev_event_monitor_start();
3789                 if (ret) {
3790                         RTE_LOG(ERR, EAL,
3791                                 "fail to start device event monitoring.");
3792                         return -1;
3793                 }
3794
3795                 ret = rte_dev_event_callback_register(NULL,
3796                         dev_event_callback, NULL);
3797                 if (ret) {
3798                         RTE_LOG(ERR, EAL,
3799                                 "fail  to register device event callback\n");
3800                         return -1;
3801                 }
3802         }
3803
3804         if (!no_device_start && start_port(RTE_PORT_ALL) != 0)
3805                 rte_exit(EXIT_FAILURE, "Start ports failed\n");
3806
3807         /* set all ports to promiscuous mode by default */
3808         RTE_ETH_FOREACH_DEV(port_id) {
3809                 ret = rte_eth_promiscuous_enable(port_id);
3810                 if (ret != 0)
3811                         printf("Error during enabling promiscuous mode for port %u: %s - ignore\n",
3812                                 port_id, rte_strerror(-ret));
3813         }
3814
3815         /* Init metrics library */
3816         rte_metrics_init(rte_socket_id());
3817
3818 #ifdef RTE_LIB_LATENCYSTATS
3819         if (latencystats_enabled != 0) {
3820                 int ret = rte_latencystats_init(1, NULL);
3821                 if (ret)
3822                         printf("Warning: latencystats init()"
3823                                 " returned error %d\n", ret);
3824                 printf("Latencystats running on lcore %d\n",
3825                         latencystats_lcore_id);
3826         }
3827 #endif
3828
3829         /* Setup bitrate stats */
3830 #ifdef RTE_LIB_BITRATESTATS
3831         if (bitrate_enabled != 0) {
3832                 bitrate_data = rte_stats_bitrate_create();
3833                 if (bitrate_data == NULL)
3834                         rte_exit(EXIT_FAILURE,
3835                                 "Could not allocate bitrate data.\n");
3836                 rte_stats_bitrate_reg(bitrate_data);
3837         }
3838 #endif
3839
3840 #ifdef RTE_LIB_CMDLINE
3841         if (strlen(cmdline_filename) != 0)
3842                 cmdline_read_from_file(cmdline_filename);
3843
3844         if (interactive == 1) {
3845                 if (auto_start) {
3846                         printf("Start automatic packet forwarding\n");
3847                         start_packet_forwarding(0);
3848                 }
3849                 prompt();
3850                 pmd_test_exit();
3851         } else
3852 #endif
3853         {
3854                 char c;
3855                 int rc;
3856
3857                 f_quit = 0;
3858
3859                 printf("No commandline core given, start packet forwarding\n");
3860                 start_packet_forwarding(tx_first);
3861                 if (stats_period != 0) {
3862                         uint64_t prev_time = 0, cur_time, diff_time = 0;
3863                         uint64_t timer_period;
3864
3865                         /* Convert to number of cycles */
3866                         timer_period = stats_period * rte_get_timer_hz();
3867
3868                         while (f_quit == 0) {
3869                                 cur_time = rte_get_timer_cycles();
3870                                 diff_time += cur_time - prev_time;
3871
3872                                 if (diff_time >= timer_period) {
3873                                         print_stats();
3874                                         /* Reset the timer */
3875                                         diff_time = 0;
3876                                 }
3877                                 /* Sleep to avoid unnecessary checks */
3878                                 prev_time = cur_time;
3879                                 sleep(1);
3880                         }
3881                 }
3882
3883                 printf("Press enter to exit\n");
3884                 rc = read(0, &c, 1);
3885                 pmd_test_exit();
3886                 if (rc < 0)
3887                         return 1;
3888         }
3889
3890         ret = rte_eal_cleanup();
3891         if (ret != 0)
3892                 rte_exit(EXIT_FAILURE,
3893                          "EAL cleanup failed: %s\n", strerror(-ret));
3894
3895         return EXIT_SUCCESS;
3896 }