xref: /dpdk/app/test-pmd/testpmd.c (revision 0074d02fca2129ffc417d695aaa1a0fc23bed64a)
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 
16 #include <sys/queue.h>
17 #include <sys/stat.h>
18 
19 #include <stdint.h>
20 #include <unistd.h>
21 #include <inttypes.h>
22 
23 #include <rte_common.h>
24 #include <rte_errno.h>
25 #include <rte_byteorder.h>
26 #include <rte_log.h>
27 #include <rte_debug.h>
28 #include <rte_cycles.h>
29 #include <rte_memory.h>
30 #include <rte_memcpy.h>
31 #include <rte_launch.h>
32 #include <rte_eal.h>
33 #include <rte_alarm.h>
34 #include <rte_per_lcore.h>
35 #include <rte_lcore.h>
36 #include <rte_atomic.h>
37 #include <rte_branch_prediction.h>
38 #include <rte_mempool.h>
39 #include <rte_malloc.h>
40 #include <rte_mbuf.h>
41 #include <rte_interrupts.h>
42 #include <rte_pci.h>
43 #include <rte_ether.h>
44 #include <rte_ethdev.h>
45 #include <rte_dev.h>
46 #include <rte_string_fns.h>
47 #ifdef RTE_LIBRTE_IXGBE_PMD
48 #include <rte_pmd_ixgbe.h>
49 #endif
50 #ifdef RTE_LIBRTE_PDUMP
51 #include <rte_pdump.h>
52 #endif
53 #include <rte_flow.h>
54 #include <rte_metrics.h>
55 #ifdef RTE_LIBRTE_BITRATE
56 #include <rte_bitrate.h>
57 #endif
58 #ifdef RTE_LIBRTE_LATENCY_STATS
59 #include <rte_latencystats.h>
60 #endif
61 
62 #include "testpmd.h"
63 
64 uint16_t verbose_level = 0; /**< Silent by default. */
65 int testpmd_logtype; /**< Log type for testpmd logs */
66 
67 /* use master core for command line ? */
68 uint8_t interactive = 0;
69 uint8_t auto_start = 0;
70 uint8_t tx_first;
71 char cmdline_filename[PATH_MAX] = {0};
72 
73 /*
74  * NUMA support configuration.
75  * When set, the NUMA support attempts to dispatch the allocation of the
76  * RX and TX memory rings, and of the DMA memory buffers (mbufs) for the
77  * probed ports among the CPU sockets 0 and 1.
78  * Otherwise, all memory is allocated from CPU socket 0.
79  */
80 uint8_t numa_support = 1; /**< numa enabled by default */
81 
82 /*
83  * In UMA mode,all memory is allocated from socket 0 if --socket-num is
84  * not configured.
85  */
86 uint8_t socket_num = UMA_NO_CONFIG;
87 
88 /*
89  * Use ANONYMOUS mapped memory (might be not physically continuous) for mbufs.
90  */
91 uint8_t mp_anon = 0;
92 
93 /*
94  * Record the Ethernet address of peer target ports to which packets are
95  * forwarded.
96  * Must be instantiated with the ethernet addresses of peer traffic generator
97  * ports.
98  */
99 struct ether_addr peer_eth_addrs[RTE_MAX_ETHPORTS];
100 portid_t nb_peer_eth_addrs = 0;
101 
102 /*
103  * Probed Target Environment.
104  */
105 struct rte_port *ports;	       /**< For all probed ethernet ports. */
106 portid_t nb_ports;             /**< Number of probed ethernet ports. */
107 struct fwd_lcore **fwd_lcores; /**< For all probed logical cores. */
108 lcoreid_t nb_lcores;           /**< Number of probed logical cores. */
109 
110 /*
111  * Test Forwarding Configuration.
112  *    nb_fwd_lcores <= nb_cfg_lcores <= nb_lcores
113  *    nb_fwd_ports  <= nb_cfg_ports  <= nb_ports
114  */
115 lcoreid_t nb_cfg_lcores; /**< Number of configured logical cores. */
116 lcoreid_t nb_fwd_lcores; /**< Number of forwarding logical cores. */
117 portid_t  nb_cfg_ports;  /**< Number of configured ports. */
118 portid_t  nb_fwd_ports;  /**< Number of forwarding ports. */
119 
120 unsigned int fwd_lcores_cpuids[RTE_MAX_LCORE]; /**< CPU ids configuration. */
121 portid_t fwd_ports_ids[RTE_MAX_ETHPORTS];      /**< Port ids configuration. */
122 
123 struct fwd_stream **fwd_streams; /**< For each RX queue of each port. */
124 streamid_t nb_fwd_streams;       /**< Is equal to (nb_ports * nb_rxq). */
125 
126 /*
127  * Forwarding engines.
128  */
129 struct fwd_engine * fwd_engines[] = {
130 	&io_fwd_engine,
131 	&mac_fwd_engine,
132 	&mac_swap_engine,
133 	&flow_gen_engine,
134 	&rx_only_engine,
135 	&tx_only_engine,
136 	&csum_fwd_engine,
137 	&icmp_echo_engine,
138 #if defined RTE_LIBRTE_PMD_SOFTNIC && defined RTE_LIBRTE_SCHED
139 	&softnic_tm_engine,
140 	&softnic_tm_bypass_engine,
141 #endif
142 #ifdef RTE_LIBRTE_IEEE1588
143 	&ieee1588_fwd_engine,
144 #endif
145 	NULL,
146 };
147 
148 struct fwd_config cur_fwd_config;
149 struct fwd_engine *cur_fwd_eng = &io_fwd_engine; /**< IO mode by default. */
150 uint32_t retry_enabled;
151 uint32_t burst_tx_delay_time = BURST_TX_WAIT_US;
152 uint32_t burst_tx_retry_num = BURST_TX_RETRIES;
153 
154 uint16_t mbuf_data_size = DEFAULT_MBUF_DATA_SIZE; /**< Mbuf data space size. */
155 uint32_t param_total_num_mbufs = 0;  /**< number of mbufs in all pools - if
156                                       * specified on command-line. */
157 uint16_t stats_period; /**< Period to show statistics (disabled by default) */
158 
159 /*
160  * In container, it cannot terminate the process which running with 'stats-period'
161  * option. Set flag to exit stats period loop after received SIGINT/SIGTERM.
162  */
163 uint8_t f_quit;
164 
165 /*
166  * Configuration of packet segments used by the "txonly" processing engine.
167  */
168 uint16_t tx_pkt_length = TXONLY_DEF_PACKET_LEN; /**< TXONLY packet length. */
169 uint16_t tx_pkt_seg_lengths[RTE_MAX_SEGS_PER_PKT] = {
170 	TXONLY_DEF_PACKET_LEN,
171 };
172 uint8_t  tx_pkt_nb_segs = 1; /**< Number of segments in TXONLY packets */
173 
174 enum tx_pkt_split tx_pkt_split = TX_PKT_SPLIT_OFF;
175 /**< Split policy for packets to TX. */
176 
177 uint16_t nb_pkt_per_burst = DEF_PKT_BURST; /**< Number of packets per burst. */
178 uint16_t mb_mempool_cache = DEF_MBUF_CACHE; /**< Size of mbuf mempool cache. */
179 
180 /* current configuration is in DCB or not,0 means it is not in DCB mode */
181 uint8_t dcb_config = 0;
182 
183 /* Whether the dcb is in testing status */
184 uint8_t dcb_test = 0;
185 
186 /*
187  * Configurable number of RX/TX queues.
188  */
189 queueid_t nb_rxq = 1; /**< Number of RX queues per port. */
190 queueid_t nb_txq = 1; /**< Number of TX queues per port. */
191 
192 /*
193  * Configurable number of RX/TX ring descriptors.
194  */
195 #define RTE_TEST_RX_DESC_DEFAULT 128
196 #define RTE_TEST_TX_DESC_DEFAULT 512
197 uint16_t nb_rxd = RTE_TEST_RX_DESC_DEFAULT; /**< Number of RX descriptors. */
198 uint16_t nb_txd = RTE_TEST_TX_DESC_DEFAULT; /**< Number of TX descriptors. */
199 
200 #define RTE_PMD_PARAM_UNSET -1
201 /*
202  * Configurable values of RX and TX ring threshold registers.
203  */
204 
205 int8_t rx_pthresh = RTE_PMD_PARAM_UNSET;
206 int8_t rx_hthresh = RTE_PMD_PARAM_UNSET;
207 int8_t rx_wthresh = RTE_PMD_PARAM_UNSET;
208 
209 int8_t tx_pthresh = RTE_PMD_PARAM_UNSET;
210 int8_t tx_hthresh = RTE_PMD_PARAM_UNSET;
211 int8_t tx_wthresh = RTE_PMD_PARAM_UNSET;
212 
213 /*
214  * Configurable value of RX free threshold.
215  */
216 int16_t rx_free_thresh = RTE_PMD_PARAM_UNSET;
217 
218 /*
219  * Configurable value of RX drop enable.
220  */
221 int8_t rx_drop_en = RTE_PMD_PARAM_UNSET;
222 
223 /*
224  * Configurable value of TX free threshold.
225  */
226 int16_t tx_free_thresh = RTE_PMD_PARAM_UNSET;
227 
228 /*
229  * Configurable value of TX RS bit threshold.
230  */
231 int16_t tx_rs_thresh = RTE_PMD_PARAM_UNSET;
232 
233 /*
234  * Configurable value of TX queue flags.
235  */
236 int32_t txq_flags = RTE_PMD_PARAM_UNSET;
237 
238 /*
239  * Receive Side Scaling (RSS) configuration.
240  */
241 uint64_t rss_hf = ETH_RSS_IP; /* RSS IP by default. */
242 
243 /*
244  * Port topology configuration
245  */
246 uint16_t port_topology = PORT_TOPOLOGY_PAIRED; /* Ports are paired by default */
247 
248 /*
249  * Avoids to flush all the RX streams before starts forwarding.
250  */
251 uint8_t no_flush_rx = 0; /* flush by default */
252 
253 /*
254  * Flow API isolated mode.
255  */
256 uint8_t flow_isolate_all;
257 
258 /*
259  * Avoids to check link status when starting/stopping a port.
260  */
261 uint8_t no_link_check = 0; /* check by default */
262 
263 /*
264  * Enable link status change notification
265  */
266 uint8_t lsc_interrupt = 1; /* enabled by default */
267 
268 /*
269  * Enable device removal notification.
270  */
271 uint8_t rmv_interrupt = 1; /* enabled by default */
272 
273 /*
274  * Display or mask ether events
275  * Default to all events except VF_MBOX
276  */
277 uint32_t event_print_mask = (UINT32_C(1) << RTE_ETH_EVENT_UNKNOWN) |
278 			    (UINT32_C(1) << RTE_ETH_EVENT_INTR_LSC) |
279 			    (UINT32_C(1) << RTE_ETH_EVENT_QUEUE_STATE) |
280 			    (UINT32_C(1) << RTE_ETH_EVENT_INTR_RESET) |
281 			    (UINT32_C(1) << RTE_ETH_EVENT_MACSEC) |
282 			    (UINT32_C(1) << RTE_ETH_EVENT_INTR_RMV);
283 
284 /*
285  * NIC bypass mode configuration options.
286  */
287 
288 #if defined RTE_LIBRTE_IXGBE_PMD && defined RTE_LIBRTE_IXGBE_BYPASS
289 /* The NIC bypass watchdog timeout. */
290 uint32_t bypass_timeout = RTE_PMD_IXGBE_BYPASS_TMT_OFF;
291 #endif
292 
293 
294 #ifdef RTE_LIBRTE_LATENCY_STATS
295 
296 /*
297  * Set when latency stats is enabled in the commandline
298  */
299 uint8_t latencystats_enabled;
300 
301 /*
302  * Lcore ID to serive latency statistics.
303  */
304 lcoreid_t latencystats_lcore_id = -1;
305 
306 #endif
307 
308 /*
309  * Ethernet device configuration.
310  */
311 struct rte_eth_rxmode rx_mode = {
312 	.max_rx_pkt_len = ETHER_MAX_LEN, /**< Default maximum frame length. */
313 	.offloads = (DEV_RX_OFFLOAD_VLAN_FILTER |
314 		     DEV_RX_OFFLOAD_VLAN_STRIP |
315 		     DEV_RX_OFFLOAD_CRC_STRIP),
316 	.ignore_offload_bitfield = 1,
317 };
318 
319 struct rte_fdir_conf fdir_conf = {
320 	.mode = RTE_FDIR_MODE_NONE,
321 	.pballoc = RTE_FDIR_PBALLOC_64K,
322 	.status = RTE_FDIR_REPORT_STATUS,
323 	.mask = {
324 		.vlan_tci_mask = 0x0,
325 		.ipv4_mask     = {
326 			.src_ip = 0xFFFFFFFF,
327 			.dst_ip = 0xFFFFFFFF,
328 		},
329 		.ipv6_mask     = {
330 			.src_ip = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF},
331 			.dst_ip = {0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF},
332 		},
333 		.src_port_mask = 0xFFFF,
334 		.dst_port_mask = 0xFFFF,
335 		.mac_addr_byte_mask = 0xFF,
336 		.tunnel_type_mask = 1,
337 		.tunnel_id_mask = 0xFFFFFFFF,
338 	},
339 	.drop_queue = 127,
340 };
341 
342 volatile int test_done = 1; /* stop packet forwarding when set to 1. */
343 
344 struct queue_stats_mappings tx_queue_stats_mappings_array[MAX_TX_QUEUE_STATS_MAPPINGS];
345 struct queue_stats_mappings rx_queue_stats_mappings_array[MAX_RX_QUEUE_STATS_MAPPINGS];
346 
347 struct queue_stats_mappings *tx_queue_stats_mappings = tx_queue_stats_mappings_array;
348 struct queue_stats_mappings *rx_queue_stats_mappings = rx_queue_stats_mappings_array;
349 
350 uint16_t nb_tx_queue_stats_mappings = 0;
351 uint16_t nb_rx_queue_stats_mappings = 0;
352 
353 /*
354  * Display zero values by default for xstats
355  */
356 uint8_t xstats_hide_zero;
357 
358 unsigned int num_sockets = 0;
359 unsigned int socket_ids[RTE_MAX_NUMA_NODES];
360 
361 #ifdef RTE_LIBRTE_BITRATE
362 /* Bitrate statistics */
363 struct rte_stats_bitrates *bitrate_data;
364 lcoreid_t bitrate_lcore_id;
365 uint8_t bitrate_enabled;
366 #endif
367 
368 struct gro_status gro_ports[RTE_MAX_ETHPORTS];
369 uint8_t gro_flush_cycles = GRO_DEFAULT_FLUSH_CYCLES;
370 
371 /* Forward function declarations */
372 static void map_port_queue_stats_mapping_registers(portid_t pi,
373 						   struct rte_port *port);
374 static void check_all_ports_link_status(uint32_t port_mask);
375 static int eth_event_callback(portid_t port_id,
376 			      enum rte_eth_event_type type,
377 			      void *param, void *ret_param);
378 
379 /*
380  * Check if all the ports are started.
381  * If yes, return positive value. If not, return zero.
382  */
383 static int all_ports_started(void);
384 
385 struct gso_status gso_ports[RTE_MAX_ETHPORTS];
386 uint16_t gso_max_segment_size = ETHER_MAX_LEN - ETHER_CRC_LEN;
387 
388 /*
389  * Helper function to check if socket is already discovered.
390  * If yes, return positive value. If not, return zero.
391  */
392 int
393 new_socket_id(unsigned int socket_id)
394 {
395 	unsigned int i;
396 
397 	for (i = 0; i < num_sockets; i++) {
398 		if (socket_ids[i] == socket_id)
399 			return 0;
400 	}
401 	return 1;
402 }
403 
404 /*
405  * Setup default configuration.
406  */
407 static void
408 set_default_fwd_lcores_config(void)
409 {
410 	unsigned int i;
411 	unsigned int nb_lc;
412 	unsigned int sock_num;
413 
414 	nb_lc = 0;
415 	for (i = 0; i < RTE_MAX_LCORE; i++) {
416 		sock_num = rte_lcore_to_socket_id(i);
417 		if (new_socket_id(sock_num)) {
418 			if (num_sockets >= RTE_MAX_NUMA_NODES) {
419 				rte_exit(EXIT_FAILURE,
420 					 "Total sockets greater than %u\n",
421 					 RTE_MAX_NUMA_NODES);
422 			}
423 			socket_ids[num_sockets++] = sock_num;
424 		}
425 		if (!rte_lcore_is_enabled(i))
426 			continue;
427 		if (i == rte_get_master_lcore())
428 			continue;
429 		fwd_lcores_cpuids[nb_lc++] = i;
430 	}
431 	nb_lcores = (lcoreid_t) nb_lc;
432 	nb_cfg_lcores = nb_lcores;
433 	nb_fwd_lcores = 1;
434 }
435 
436 static void
437 set_def_peer_eth_addrs(void)
438 {
439 	portid_t i;
440 
441 	for (i = 0; i < RTE_MAX_ETHPORTS; i++) {
442 		peer_eth_addrs[i].addr_bytes[0] = ETHER_LOCAL_ADMIN_ADDR;
443 		peer_eth_addrs[i].addr_bytes[5] = i;
444 	}
445 }
446 
447 static void
448 set_default_fwd_ports_config(void)
449 {
450 	portid_t pt_id;
451 	int i = 0;
452 
453 	RTE_ETH_FOREACH_DEV(pt_id)
454 		fwd_ports_ids[i++] = pt_id;
455 
456 	nb_cfg_ports = nb_ports;
457 	nb_fwd_ports = nb_ports;
458 }
459 
460 void
461 set_def_fwd_config(void)
462 {
463 	set_default_fwd_lcores_config();
464 	set_def_peer_eth_addrs();
465 	set_default_fwd_ports_config();
466 }
467 
468 /*
469  * Configuration initialisation done once at init time.
470  */
471 static void
472 mbuf_pool_create(uint16_t mbuf_seg_size, unsigned nb_mbuf,
473 		 unsigned int socket_id)
474 {
475 	char pool_name[RTE_MEMPOOL_NAMESIZE];
476 	struct rte_mempool *rte_mp = NULL;
477 	uint32_t mb_size;
478 
479 	mb_size = sizeof(struct rte_mbuf) + mbuf_seg_size;
480 	mbuf_poolname_build(socket_id, pool_name, sizeof(pool_name));
481 
482 	TESTPMD_LOG(INFO,
483 		"create a new mbuf pool <%s>: n=%u, size=%u, socket=%u\n",
484 		pool_name, nb_mbuf, mbuf_seg_size, socket_id);
485 
486 	if (mp_anon != 0) {
487 		rte_mp = rte_mempool_create_empty(pool_name, nb_mbuf,
488 			mb_size, (unsigned) mb_mempool_cache,
489 			sizeof(struct rte_pktmbuf_pool_private),
490 			socket_id, 0);
491 		if (rte_mp == NULL)
492 			goto err;
493 
494 		if (rte_mempool_populate_anon(rte_mp) == 0) {
495 			rte_mempool_free(rte_mp);
496 			rte_mp = NULL;
497 			goto err;
498 		}
499 		rte_pktmbuf_pool_init(rte_mp, NULL);
500 		rte_mempool_obj_iter(rte_mp, rte_pktmbuf_init, NULL);
501 	} else {
502 		/* wrapper to rte_mempool_create() */
503 		rte_mp = rte_pktmbuf_pool_create(pool_name, nb_mbuf,
504 			mb_mempool_cache, 0, mbuf_seg_size, socket_id);
505 	}
506 
507 err:
508 	if (rte_mp == NULL) {
509 		rte_exit(EXIT_FAILURE,
510 			"Creation of mbuf pool for socket %u failed: %s\n",
511 			socket_id, rte_strerror(rte_errno));
512 	} else if (verbose_level > 0) {
513 		rte_mempool_dump(stdout, rte_mp);
514 	}
515 }
516 
517 /*
518  * Check given socket id is valid or not with NUMA mode,
519  * if valid, return 0, else return -1
520  */
521 static int
522 check_socket_id(const unsigned int socket_id)
523 {
524 	static int warning_once = 0;
525 
526 	if (new_socket_id(socket_id)) {
527 		if (!warning_once && numa_support)
528 			printf("Warning: NUMA should be configured manually by"
529 			       " using --port-numa-config and"
530 			       " --ring-numa-config parameters along with"
531 			       " --numa.\n");
532 		warning_once = 1;
533 		return -1;
534 	}
535 	return 0;
536 }
537 
538 static void
539 init_config(void)
540 {
541 	portid_t pid;
542 	struct rte_port *port;
543 	struct rte_mempool *mbp;
544 	unsigned int nb_mbuf_per_pool;
545 	lcoreid_t  lc_id;
546 	uint8_t port_per_socket[RTE_MAX_NUMA_NODES];
547 	struct rte_gro_param gro_param;
548 	uint32_t gso_types;
549 
550 	memset(port_per_socket,0,RTE_MAX_NUMA_NODES);
551 
552 	if (numa_support) {
553 		memset(port_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
554 		memset(rxring_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
555 		memset(txring_numa, NUMA_NO_CONFIG, RTE_MAX_ETHPORTS);
556 	}
557 
558 	/* Configuration of logical cores. */
559 	fwd_lcores = rte_zmalloc("testpmd: fwd_lcores",
560 				sizeof(struct fwd_lcore *) * nb_lcores,
561 				RTE_CACHE_LINE_SIZE);
562 	if (fwd_lcores == NULL) {
563 		rte_exit(EXIT_FAILURE, "rte_zmalloc(%d (struct fwd_lcore *)) "
564 							"failed\n", nb_lcores);
565 	}
566 	for (lc_id = 0; lc_id < nb_lcores; lc_id++) {
567 		fwd_lcores[lc_id] = rte_zmalloc("testpmd: struct fwd_lcore",
568 					       sizeof(struct fwd_lcore),
569 					       RTE_CACHE_LINE_SIZE);
570 		if (fwd_lcores[lc_id] == NULL) {
571 			rte_exit(EXIT_FAILURE, "rte_zmalloc(struct fwd_lcore) "
572 								"failed\n");
573 		}
574 		fwd_lcores[lc_id]->cpuid_idx = lc_id;
575 	}
576 
577 	RTE_ETH_FOREACH_DEV(pid) {
578 		port = &ports[pid];
579 		rte_eth_dev_info_get(pid, &port->dev_info);
580 
581 		if (numa_support) {
582 			if (port_numa[pid] != NUMA_NO_CONFIG)
583 				port_per_socket[port_numa[pid]]++;
584 			else {
585 				uint32_t socket_id = rte_eth_dev_socket_id(pid);
586 
587 				/* if socket_id is invalid, set to 0 */
588 				if (check_socket_id(socket_id) < 0)
589 					socket_id = 0;
590 				port_per_socket[socket_id]++;
591 			}
592 		}
593 
594 		/* set flag to initialize port/queue */
595 		port->need_reconfig = 1;
596 		port->need_reconfig_queues = 1;
597 	}
598 
599 	/*
600 	 * Create pools of mbuf.
601 	 * If NUMA support is disabled, create a single pool of mbuf in
602 	 * socket 0 memory by default.
603 	 * Otherwise, create a pool of mbuf in the memory of sockets 0 and 1.
604 	 *
605 	 * Use the maximum value of nb_rxd and nb_txd here, then nb_rxd and
606 	 * nb_txd can be configured at run time.
607 	 */
608 	if (param_total_num_mbufs)
609 		nb_mbuf_per_pool = param_total_num_mbufs;
610 	else {
611 		nb_mbuf_per_pool = RTE_TEST_RX_DESC_MAX +
612 			(nb_lcores * mb_mempool_cache) +
613 			RTE_TEST_TX_DESC_MAX + MAX_PKT_BURST;
614 		nb_mbuf_per_pool *= RTE_MAX_ETHPORTS;
615 	}
616 
617 	if (numa_support) {
618 		uint8_t i;
619 
620 		for (i = 0; i < num_sockets; i++)
621 			mbuf_pool_create(mbuf_data_size, nb_mbuf_per_pool,
622 					 socket_ids[i]);
623 	} else {
624 		if (socket_num == UMA_NO_CONFIG)
625 			mbuf_pool_create(mbuf_data_size, nb_mbuf_per_pool, 0);
626 		else
627 			mbuf_pool_create(mbuf_data_size, nb_mbuf_per_pool,
628 						 socket_num);
629 	}
630 
631 	init_port_config();
632 
633 	gso_types = DEV_TX_OFFLOAD_TCP_TSO | DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
634 		DEV_TX_OFFLOAD_GRE_TNL_TSO;
635 	/*
636 	 * Records which Mbuf pool to use by each logical core, if needed.
637 	 */
638 	for (lc_id = 0; lc_id < nb_lcores; lc_id++) {
639 		mbp = mbuf_pool_find(
640 			rte_lcore_to_socket_id(fwd_lcores_cpuids[lc_id]));
641 
642 		if (mbp == NULL)
643 			mbp = mbuf_pool_find(0);
644 		fwd_lcores[lc_id]->mbp = mbp;
645 		/* initialize GSO context */
646 		fwd_lcores[lc_id]->gso_ctx.direct_pool = mbp;
647 		fwd_lcores[lc_id]->gso_ctx.indirect_pool = mbp;
648 		fwd_lcores[lc_id]->gso_ctx.gso_types = gso_types;
649 		fwd_lcores[lc_id]->gso_ctx.gso_size = ETHER_MAX_LEN -
650 			ETHER_CRC_LEN;
651 		fwd_lcores[lc_id]->gso_ctx.flag = 0;
652 	}
653 
654 	/* Configuration of packet forwarding streams. */
655 	if (init_fwd_streams() < 0)
656 		rte_exit(EXIT_FAILURE, "FAIL from init_fwd_streams()\n");
657 
658 	fwd_config_setup();
659 
660 	/* create a gro context for each lcore */
661 	gro_param.gro_types = RTE_GRO_TCP_IPV4;
662 	gro_param.max_flow_num = GRO_MAX_FLUSH_CYCLES;
663 	gro_param.max_item_per_flow = MAX_PKT_BURST;
664 	for (lc_id = 0; lc_id < nb_lcores; lc_id++) {
665 		gro_param.socket_id = rte_lcore_to_socket_id(
666 				fwd_lcores_cpuids[lc_id]);
667 		fwd_lcores[lc_id]->gro_ctx = rte_gro_ctx_create(&gro_param);
668 		if (fwd_lcores[lc_id]->gro_ctx == NULL) {
669 			rte_exit(EXIT_FAILURE,
670 					"rte_gro_ctx_create() failed\n");
671 		}
672 	}
673 }
674 
675 
676 void
677 reconfig(portid_t new_port_id, unsigned socket_id)
678 {
679 	struct rte_port *port;
680 
681 	/* Reconfiguration of Ethernet ports. */
682 	port = &ports[new_port_id];
683 	rte_eth_dev_info_get(new_port_id, &port->dev_info);
684 
685 	/* set flag to initialize port/queue */
686 	port->need_reconfig = 1;
687 	port->need_reconfig_queues = 1;
688 	port->socket_id = socket_id;
689 
690 	init_port_config();
691 }
692 
693 
694 int
695 init_fwd_streams(void)
696 {
697 	portid_t pid;
698 	struct rte_port *port;
699 	streamid_t sm_id, nb_fwd_streams_new;
700 	queueid_t q;
701 
702 	/* set socket id according to numa or not */
703 	RTE_ETH_FOREACH_DEV(pid) {
704 		port = &ports[pid];
705 		if (nb_rxq > port->dev_info.max_rx_queues) {
706 			printf("Fail: nb_rxq(%d) is greater than "
707 				"max_rx_queues(%d)\n", nb_rxq,
708 				port->dev_info.max_rx_queues);
709 			return -1;
710 		}
711 		if (nb_txq > port->dev_info.max_tx_queues) {
712 			printf("Fail: nb_txq(%d) is greater than "
713 				"max_tx_queues(%d)\n", nb_txq,
714 				port->dev_info.max_tx_queues);
715 			return -1;
716 		}
717 		if (numa_support) {
718 			if (port_numa[pid] != NUMA_NO_CONFIG)
719 				port->socket_id = port_numa[pid];
720 			else {
721 				port->socket_id = rte_eth_dev_socket_id(pid);
722 
723 				/* if socket_id is invalid, set to 0 */
724 				if (check_socket_id(port->socket_id) < 0)
725 					port->socket_id = 0;
726 			}
727 		}
728 		else {
729 			if (socket_num == UMA_NO_CONFIG)
730 				port->socket_id = 0;
731 			else
732 				port->socket_id = socket_num;
733 		}
734 	}
735 
736 	q = RTE_MAX(nb_rxq, nb_txq);
737 	if (q == 0) {
738 		printf("Fail: Cannot allocate fwd streams as number of queues is 0\n");
739 		return -1;
740 	}
741 	nb_fwd_streams_new = (streamid_t)(nb_ports * q);
742 	if (nb_fwd_streams_new == nb_fwd_streams)
743 		return 0;
744 	/* clear the old */
745 	if (fwd_streams != NULL) {
746 		for (sm_id = 0; sm_id < nb_fwd_streams; sm_id++) {
747 			if (fwd_streams[sm_id] == NULL)
748 				continue;
749 			rte_free(fwd_streams[sm_id]);
750 			fwd_streams[sm_id] = NULL;
751 		}
752 		rte_free(fwd_streams);
753 		fwd_streams = NULL;
754 	}
755 
756 	/* init new */
757 	nb_fwd_streams = nb_fwd_streams_new;
758 	fwd_streams = rte_zmalloc("testpmd: fwd_streams",
759 		sizeof(struct fwd_stream *) * nb_fwd_streams, RTE_CACHE_LINE_SIZE);
760 	if (fwd_streams == NULL)
761 		rte_exit(EXIT_FAILURE, "rte_zmalloc(%d (struct fwd_stream *)) "
762 						"failed\n", nb_fwd_streams);
763 
764 	for (sm_id = 0; sm_id < nb_fwd_streams; sm_id++) {
765 		fwd_streams[sm_id] = rte_zmalloc("testpmd: struct fwd_stream",
766 				sizeof(struct fwd_stream), RTE_CACHE_LINE_SIZE);
767 		if (fwd_streams[sm_id] == NULL)
768 			rte_exit(EXIT_FAILURE, "rte_zmalloc(struct fwd_stream)"
769 								" failed\n");
770 	}
771 
772 	return 0;
773 }
774 
775 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
776 static void
777 pkt_burst_stats_display(const char *rx_tx, struct pkt_burst_stats *pbs)
778 {
779 	unsigned int total_burst;
780 	unsigned int nb_burst;
781 	unsigned int burst_stats[3];
782 	uint16_t pktnb_stats[3];
783 	uint16_t nb_pkt;
784 	int burst_percent[3];
785 
786 	/*
787 	 * First compute the total number of packet bursts and the
788 	 * two highest numbers of bursts of the same number of packets.
789 	 */
790 	total_burst = 0;
791 	burst_stats[0] = burst_stats[1] = burst_stats[2] = 0;
792 	pktnb_stats[0] = pktnb_stats[1] = pktnb_stats[2] = 0;
793 	for (nb_pkt = 0; nb_pkt < MAX_PKT_BURST; nb_pkt++) {
794 		nb_burst = pbs->pkt_burst_spread[nb_pkt];
795 		if (nb_burst == 0)
796 			continue;
797 		total_burst += nb_burst;
798 		if (nb_burst > burst_stats[0]) {
799 			burst_stats[1] = burst_stats[0];
800 			pktnb_stats[1] = pktnb_stats[0];
801 			burst_stats[0] = nb_burst;
802 			pktnb_stats[0] = nb_pkt;
803 		}
804 	}
805 	if (total_burst == 0)
806 		return;
807 	burst_percent[0] = (burst_stats[0] * 100) / total_burst;
808 	printf("  %s-bursts : %u [%d%% of %d pkts", rx_tx, total_burst,
809 	       burst_percent[0], (int) pktnb_stats[0]);
810 	if (burst_stats[0] == total_burst) {
811 		printf("]\n");
812 		return;
813 	}
814 	if (burst_stats[0] + burst_stats[1] == total_burst) {
815 		printf(" + %d%% of %d pkts]\n",
816 		       100 - burst_percent[0], pktnb_stats[1]);
817 		return;
818 	}
819 	burst_percent[1] = (burst_stats[1] * 100) / total_burst;
820 	burst_percent[2] = 100 - (burst_percent[0] + burst_percent[1]);
821 	if ((burst_percent[1] == 0) || (burst_percent[2] == 0)) {
822 		printf(" + %d%% of others]\n", 100 - burst_percent[0]);
823 		return;
824 	}
825 	printf(" + %d%% of %d pkts + %d%% of others]\n",
826 	       burst_percent[1], (int) pktnb_stats[1], burst_percent[2]);
827 }
828 #endif /* RTE_TEST_PMD_RECORD_BURST_STATS */
829 
830 static void
831 fwd_port_stats_display(portid_t port_id, struct rte_eth_stats *stats)
832 {
833 	struct rte_port *port;
834 	uint8_t i;
835 
836 	static const char *fwd_stats_border = "----------------------";
837 
838 	port = &ports[port_id];
839 	printf("\n  %s Forward statistics for port %-2d %s\n",
840 	       fwd_stats_border, port_id, fwd_stats_border);
841 
842 	if ((!port->rx_queue_stats_mapping_enabled) && (!port->tx_queue_stats_mapping_enabled)) {
843 		printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
844 		       "%-"PRIu64"\n",
845 		       stats->ipackets, stats->imissed,
846 		       (uint64_t) (stats->ipackets + stats->imissed));
847 
848 		if (cur_fwd_eng == &csum_fwd_engine)
849 			printf("  Bad-ipcsum: %-14"PRIu64" Bad-l4csum: %-14"PRIu64" \n",
850 			       port->rx_bad_ip_csum, port->rx_bad_l4_csum);
851 		if ((stats->ierrors + stats->rx_nombuf) > 0) {
852 			printf("  RX-error: %-"PRIu64"\n",  stats->ierrors);
853 			printf("  RX-nombufs: %-14"PRIu64"\n", stats->rx_nombuf);
854 		}
855 
856 		printf("  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
857 		       "%-"PRIu64"\n",
858 		       stats->opackets, port->tx_dropped,
859 		       (uint64_t) (stats->opackets + port->tx_dropped));
860 	}
861 	else {
862 		printf("  RX-packets:             %14"PRIu64"    RX-dropped:%14"PRIu64"    RX-total:"
863 		       "%14"PRIu64"\n",
864 		       stats->ipackets, stats->imissed,
865 		       (uint64_t) (stats->ipackets + stats->imissed));
866 
867 		if (cur_fwd_eng == &csum_fwd_engine)
868 			printf("  Bad-ipcsum:%14"PRIu64"    Bad-l4csum:%14"PRIu64"\n",
869 			       port->rx_bad_ip_csum, port->rx_bad_l4_csum);
870 		if ((stats->ierrors + stats->rx_nombuf) > 0) {
871 			printf("  RX-error:%"PRIu64"\n", stats->ierrors);
872 			printf("  RX-nombufs:             %14"PRIu64"\n",
873 			       stats->rx_nombuf);
874 		}
875 
876 		printf("  TX-packets:             %14"PRIu64"    TX-dropped:%14"PRIu64"    TX-total:"
877 		       "%14"PRIu64"\n",
878 		       stats->opackets, port->tx_dropped,
879 		       (uint64_t) (stats->opackets + port->tx_dropped));
880 	}
881 
882 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
883 	if (port->rx_stream)
884 		pkt_burst_stats_display("RX",
885 			&port->rx_stream->rx_burst_stats);
886 	if (port->tx_stream)
887 		pkt_burst_stats_display("TX",
888 			&port->tx_stream->tx_burst_stats);
889 #endif
890 
891 	if (port->rx_queue_stats_mapping_enabled) {
892 		printf("\n");
893 		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
894 			printf("  Stats reg %2d RX-packets:%14"PRIu64
895 			       "     RX-errors:%14"PRIu64
896 			       "    RX-bytes:%14"PRIu64"\n",
897 			       i, stats->q_ipackets[i], stats->q_errors[i], stats->q_ibytes[i]);
898 		}
899 		printf("\n");
900 	}
901 	if (port->tx_queue_stats_mapping_enabled) {
902 		for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS; i++) {
903 			printf("  Stats reg %2d TX-packets:%14"PRIu64
904 			       "                                 TX-bytes:%14"PRIu64"\n",
905 			       i, stats->q_opackets[i], stats->q_obytes[i]);
906 		}
907 	}
908 
909 	printf("  %s--------------------------------%s\n",
910 	       fwd_stats_border, fwd_stats_border);
911 }
912 
913 static void
914 fwd_stream_stats_display(streamid_t stream_id)
915 {
916 	struct fwd_stream *fs;
917 	static const char *fwd_top_stats_border = "-------";
918 
919 	fs = fwd_streams[stream_id];
920 	if ((fs->rx_packets == 0) && (fs->tx_packets == 0) &&
921 	    (fs->fwd_dropped == 0))
922 		return;
923 	printf("\n  %s Forward Stats for RX Port=%2d/Queue=%2d -> "
924 	       "TX Port=%2d/Queue=%2d %s\n",
925 	       fwd_top_stats_border, fs->rx_port, fs->rx_queue,
926 	       fs->tx_port, fs->tx_queue, fwd_top_stats_border);
927 	printf("  RX-packets: %-14u TX-packets: %-14u TX-dropped: %-14u",
928 	       fs->rx_packets, fs->tx_packets, fs->fwd_dropped);
929 
930 	/* if checksum mode */
931 	if (cur_fwd_eng == &csum_fwd_engine) {
932 	       printf("  RX- bad IP checksum: %-14u  Rx- bad L4 checksum: "
933 			"%-14u\n", fs->rx_bad_ip_csum, fs->rx_bad_l4_csum);
934 	}
935 
936 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
937 	pkt_burst_stats_display("RX", &fs->rx_burst_stats);
938 	pkt_burst_stats_display("TX", &fs->tx_burst_stats);
939 #endif
940 }
941 
942 static void
943 flush_fwd_rx_queues(void)
944 {
945 	struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
946 	portid_t  rxp;
947 	portid_t port_id;
948 	queueid_t rxq;
949 	uint16_t  nb_rx;
950 	uint16_t  i;
951 	uint8_t   j;
952 	uint64_t prev_tsc = 0, diff_tsc, cur_tsc, timer_tsc = 0;
953 	uint64_t timer_period;
954 
955 	/* convert to number of cycles */
956 	timer_period = rte_get_timer_hz(); /* 1 second timeout */
957 
958 	for (j = 0; j < 2; j++) {
959 		for (rxp = 0; rxp < cur_fwd_config.nb_fwd_ports; rxp++) {
960 			for (rxq = 0; rxq < nb_rxq; rxq++) {
961 				port_id = fwd_ports_ids[rxp];
962 				/**
963 				* testpmd can stuck in the below do while loop
964 				* if rte_eth_rx_burst() always returns nonzero
965 				* packets. So timer is added to exit this loop
966 				* after 1sec timer expiry.
967 				*/
968 				prev_tsc = rte_rdtsc();
969 				do {
970 					nb_rx = rte_eth_rx_burst(port_id, rxq,
971 						pkts_burst, MAX_PKT_BURST);
972 					for (i = 0; i < nb_rx; i++)
973 						rte_pktmbuf_free(pkts_burst[i]);
974 
975 					cur_tsc = rte_rdtsc();
976 					diff_tsc = cur_tsc - prev_tsc;
977 					timer_tsc += diff_tsc;
978 				} while ((nb_rx > 0) &&
979 					(timer_tsc < timer_period));
980 				timer_tsc = 0;
981 			}
982 		}
983 		rte_delay_ms(10); /* wait 10 milli-seconds before retrying */
984 	}
985 }
986 
987 static void
988 run_pkt_fwd_on_lcore(struct fwd_lcore *fc, packet_fwd_t pkt_fwd)
989 {
990 	struct fwd_stream **fsm;
991 	streamid_t nb_fs;
992 	streamid_t sm_id;
993 #ifdef RTE_LIBRTE_BITRATE
994 	uint64_t tics_per_1sec;
995 	uint64_t tics_datum;
996 	uint64_t tics_current;
997 	uint8_t idx_port, cnt_ports;
998 
999 	cnt_ports = rte_eth_dev_count();
1000 	tics_datum = rte_rdtsc();
1001 	tics_per_1sec = rte_get_timer_hz();
1002 #endif
1003 	fsm = &fwd_streams[fc->stream_idx];
1004 	nb_fs = fc->stream_nb;
1005 	do {
1006 		for (sm_id = 0; sm_id < nb_fs; sm_id++)
1007 			(*pkt_fwd)(fsm[sm_id]);
1008 #ifdef RTE_LIBRTE_BITRATE
1009 		if (bitrate_enabled != 0 &&
1010 				bitrate_lcore_id == rte_lcore_id()) {
1011 			tics_current = rte_rdtsc();
1012 			if (tics_current - tics_datum >= tics_per_1sec) {
1013 				/* Periodic bitrate calculation */
1014 				for (idx_port = 0;
1015 						idx_port < cnt_ports;
1016 						idx_port++)
1017 					rte_stats_bitrate_calc(bitrate_data,
1018 						idx_port);
1019 				tics_datum = tics_current;
1020 			}
1021 		}
1022 #endif
1023 #ifdef RTE_LIBRTE_LATENCY_STATS
1024 		if (latencystats_enabled != 0 &&
1025 				latencystats_lcore_id == rte_lcore_id())
1026 			rte_latencystats_update();
1027 #endif
1028 
1029 	} while (! fc->stopped);
1030 }
1031 
1032 static int
1033 start_pkt_forward_on_core(void *fwd_arg)
1034 {
1035 	run_pkt_fwd_on_lcore((struct fwd_lcore *) fwd_arg,
1036 			     cur_fwd_config.fwd_eng->packet_fwd);
1037 	return 0;
1038 }
1039 
1040 /*
1041  * Run the TXONLY packet forwarding engine to send a single burst of packets.
1042  * Used to start communication flows in network loopback test configurations.
1043  */
1044 static int
1045 run_one_txonly_burst_on_core(void *fwd_arg)
1046 {
1047 	struct fwd_lcore *fwd_lc;
1048 	struct fwd_lcore tmp_lcore;
1049 
1050 	fwd_lc = (struct fwd_lcore *) fwd_arg;
1051 	tmp_lcore = *fwd_lc;
1052 	tmp_lcore.stopped = 1;
1053 	run_pkt_fwd_on_lcore(&tmp_lcore, tx_only_engine.packet_fwd);
1054 	return 0;
1055 }
1056 
1057 /*
1058  * Launch packet forwarding:
1059  *     - Setup per-port forwarding context.
1060  *     - launch logical cores with their forwarding configuration.
1061  */
1062 static void
1063 launch_packet_forwarding(lcore_function_t *pkt_fwd_on_lcore)
1064 {
1065 	port_fwd_begin_t port_fwd_begin;
1066 	unsigned int i;
1067 	unsigned int lc_id;
1068 	int diag;
1069 
1070 	port_fwd_begin = cur_fwd_config.fwd_eng->port_fwd_begin;
1071 	if (port_fwd_begin != NULL) {
1072 		for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++)
1073 			(*port_fwd_begin)(fwd_ports_ids[i]);
1074 	}
1075 	for (i = 0; i < cur_fwd_config.nb_fwd_lcores; i++) {
1076 		lc_id = fwd_lcores_cpuids[i];
1077 		if ((interactive == 0) || (lc_id != rte_lcore_id())) {
1078 			fwd_lcores[i]->stopped = 0;
1079 			diag = rte_eal_remote_launch(pkt_fwd_on_lcore,
1080 						     fwd_lcores[i], lc_id);
1081 			if (diag != 0)
1082 				printf("launch lcore %u failed - diag=%d\n",
1083 				       lc_id, diag);
1084 		}
1085 	}
1086 }
1087 
1088 /*
1089  * Launch packet forwarding configuration.
1090  */
1091 void
1092 start_packet_forwarding(int with_tx_first)
1093 {
1094 	port_fwd_begin_t port_fwd_begin;
1095 	port_fwd_end_t  port_fwd_end;
1096 	struct rte_port *port;
1097 	unsigned int i;
1098 	portid_t   pt_id;
1099 	streamid_t sm_id;
1100 
1101 	if (strcmp(cur_fwd_eng->fwd_mode_name, "rxonly") == 0 && !nb_rxq)
1102 		rte_exit(EXIT_FAILURE, "rxq are 0, cannot use rxonly fwd mode\n");
1103 
1104 	if (strcmp(cur_fwd_eng->fwd_mode_name, "txonly") == 0 && !nb_txq)
1105 		rte_exit(EXIT_FAILURE, "txq are 0, cannot use txonly fwd mode\n");
1106 
1107 	if ((strcmp(cur_fwd_eng->fwd_mode_name, "rxonly") != 0 &&
1108 		strcmp(cur_fwd_eng->fwd_mode_name, "txonly") != 0) &&
1109 		(!nb_rxq || !nb_txq))
1110 		rte_exit(EXIT_FAILURE,
1111 			"Either rxq or txq are 0, cannot use %s fwd mode\n",
1112 			cur_fwd_eng->fwd_mode_name);
1113 
1114 	if (all_ports_started() == 0) {
1115 		printf("Not all ports were started\n");
1116 		return;
1117 	}
1118 	if (test_done == 0) {
1119 		printf("Packet forwarding already started\n");
1120 		return;
1121 	}
1122 
1123 	if (init_fwd_streams() < 0) {
1124 		printf("Fail from init_fwd_streams()\n");
1125 		return;
1126 	}
1127 
1128 	if(dcb_test) {
1129 		for (i = 0; i < nb_fwd_ports; i++) {
1130 			pt_id = fwd_ports_ids[i];
1131 			port = &ports[pt_id];
1132 			if (!port->dcb_flag) {
1133 				printf("In DCB mode, all forwarding ports must "
1134                                        "be configured in this mode.\n");
1135 				return;
1136 			}
1137 		}
1138 		if (nb_fwd_lcores == 1) {
1139 			printf("In DCB mode,the nb forwarding cores "
1140                                "should be larger than 1.\n");
1141 			return;
1142 		}
1143 	}
1144 	test_done = 0;
1145 
1146 	if(!no_flush_rx)
1147 		flush_fwd_rx_queues();
1148 
1149 	fwd_config_setup();
1150 	pkt_fwd_config_display(&cur_fwd_config);
1151 	rxtx_config_display();
1152 
1153 	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
1154 		pt_id = fwd_ports_ids[i];
1155 		port = &ports[pt_id];
1156 		rte_eth_stats_get(pt_id, &port->stats);
1157 		port->tx_dropped = 0;
1158 
1159 		map_port_queue_stats_mapping_registers(pt_id, port);
1160 	}
1161 	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
1162 		fwd_streams[sm_id]->rx_packets = 0;
1163 		fwd_streams[sm_id]->tx_packets = 0;
1164 		fwd_streams[sm_id]->fwd_dropped = 0;
1165 		fwd_streams[sm_id]->rx_bad_ip_csum = 0;
1166 		fwd_streams[sm_id]->rx_bad_l4_csum = 0;
1167 
1168 #ifdef RTE_TEST_PMD_RECORD_BURST_STATS
1169 		memset(&fwd_streams[sm_id]->rx_burst_stats, 0,
1170 		       sizeof(fwd_streams[sm_id]->rx_burst_stats));
1171 		memset(&fwd_streams[sm_id]->tx_burst_stats, 0,
1172 		       sizeof(fwd_streams[sm_id]->tx_burst_stats));
1173 #endif
1174 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
1175 		fwd_streams[sm_id]->core_cycles = 0;
1176 #endif
1177 	}
1178 	if (with_tx_first) {
1179 		port_fwd_begin = tx_only_engine.port_fwd_begin;
1180 		if (port_fwd_begin != NULL) {
1181 			for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++)
1182 				(*port_fwd_begin)(fwd_ports_ids[i]);
1183 		}
1184 		while (with_tx_first--) {
1185 			launch_packet_forwarding(
1186 					run_one_txonly_burst_on_core);
1187 			rte_eal_mp_wait_lcore();
1188 		}
1189 		port_fwd_end = tx_only_engine.port_fwd_end;
1190 		if (port_fwd_end != NULL) {
1191 			for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++)
1192 				(*port_fwd_end)(fwd_ports_ids[i]);
1193 		}
1194 	}
1195 	launch_packet_forwarding(start_pkt_forward_on_core);
1196 }
1197 
1198 void
1199 stop_packet_forwarding(void)
1200 {
1201 	struct rte_eth_stats stats;
1202 	struct rte_port *port;
1203 	port_fwd_end_t  port_fwd_end;
1204 	int i;
1205 	portid_t   pt_id;
1206 	streamid_t sm_id;
1207 	lcoreid_t  lc_id;
1208 	uint64_t total_recv;
1209 	uint64_t total_xmit;
1210 	uint64_t total_rx_dropped;
1211 	uint64_t total_tx_dropped;
1212 	uint64_t total_rx_nombuf;
1213 	uint64_t tx_dropped;
1214 	uint64_t rx_bad_ip_csum;
1215 	uint64_t rx_bad_l4_csum;
1216 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
1217 	uint64_t fwd_cycles;
1218 #endif
1219 
1220 	static const char *acc_stats_border = "+++++++++++++++";
1221 
1222 	if (test_done) {
1223 		printf("Packet forwarding not started\n");
1224 		return;
1225 	}
1226 	printf("Telling cores to stop...");
1227 	for (lc_id = 0; lc_id < cur_fwd_config.nb_fwd_lcores; lc_id++)
1228 		fwd_lcores[lc_id]->stopped = 1;
1229 	printf("\nWaiting for lcores to finish...\n");
1230 	rte_eal_mp_wait_lcore();
1231 	port_fwd_end = cur_fwd_config.fwd_eng->port_fwd_end;
1232 	if (port_fwd_end != NULL) {
1233 		for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
1234 			pt_id = fwd_ports_ids[i];
1235 			(*port_fwd_end)(pt_id);
1236 		}
1237 	}
1238 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
1239 	fwd_cycles = 0;
1240 #endif
1241 	for (sm_id = 0; sm_id < cur_fwd_config.nb_fwd_streams; sm_id++) {
1242 		if (cur_fwd_config.nb_fwd_streams >
1243 		    cur_fwd_config.nb_fwd_ports) {
1244 			fwd_stream_stats_display(sm_id);
1245 			ports[fwd_streams[sm_id]->tx_port].tx_stream = NULL;
1246 			ports[fwd_streams[sm_id]->rx_port].rx_stream = NULL;
1247 		} else {
1248 			ports[fwd_streams[sm_id]->tx_port].tx_stream =
1249 				fwd_streams[sm_id];
1250 			ports[fwd_streams[sm_id]->rx_port].rx_stream =
1251 				fwd_streams[sm_id];
1252 		}
1253 		tx_dropped = ports[fwd_streams[sm_id]->tx_port].tx_dropped;
1254 		tx_dropped = (uint64_t) (tx_dropped +
1255 					 fwd_streams[sm_id]->fwd_dropped);
1256 		ports[fwd_streams[sm_id]->tx_port].tx_dropped = tx_dropped;
1257 
1258 		rx_bad_ip_csum =
1259 			ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum;
1260 		rx_bad_ip_csum = (uint64_t) (rx_bad_ip_csum +
1261 					 fwd_streams[sm_id]->rx_bad_ip_csum);
1262 		ports[fwd_streams[sm_id]->rx_port].rx_bad_ip_csum =
1263 							rx_bad_ip_csum;
1264 
1265 		rx_bad_l4_csum =
1266 			ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum;
1267 		rx_bad_l4_csum = (uint64_t) (rx_bad_l4_csum +
1268 					 fwd_streams[sm_id]->rx_bad_l4_csum);
1269 		ports[fwd_streams[sm_id]->rx_port].rx_bad_l4_csum =
1270 							rx_bad_l4_csum;
1271 
1272 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
1273 		fwd_cycles = (uint64_t) (fwd_cycles +
1274 					 fwd_streams[sm_id]->core_cycles);
1275 #endif
1276 	}
1277 	total_recv = 0;
1278 	total_xmit = 0;
1279 	total_rx_dropped = 0;
1280 	total_tx_dropped = 0;
1281 	total_rx_nombuf  = 0;
1282 	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++) {
1283 		pt_id = fwd_ports_ids[i];
1284 
1285 		port = &ports[pt_id];
1286 		rte_eth_stats_get(pt_id, &stats);
1287 		stats.ipackets -= port->stats.ipackets;
1288 		port->stats.ipackets = 0;
1289 		stats.opackets -= port->stats.opackets;
1290 		port->stats.opackets = 0;
1291 		stats.ibytes   -= port->stats.ibytes;
1292 		port->stats.ibytes = 0;
1293 		stats.obytes   -= port->stats.obytes;
1294 		port->stats.obytes = 0;
1295 		stats.imissed  -= port->stats.imissed;
1296 		port->stats.imissed = 0;
1297 		stats.oerrors  -= port->stats.oerrors;
1298 		port->stats.oerrors = 0;
1299 		stats.rx_nombuf -= port->stats.rx_nombuf;
1300 		port->stats.rx_nombuf = 0;
1301 
1302 		total_recv += stats.ipackets;
1303 		total_xmit += stats.opackets;
1304 		total_rx_dropped += stats.imissed;
1305 		total_tx_dropped += port->tx_dropped;
1306 		total_rx_nombuf  += stats.rx_nombuf;
1307 
1308 		fwd_port_stats_display(pt_id, &stats);
1309 	}
1310 
1311 	printf("\n  %s Accumulated forward statistics for all ports"
1312 	       "%s\n",
1313 	       acc_stats_border, acc_stats_border);
1314 	printf("  RX-packets: %-14"PRIu64" RX-dropped: %-14"PRIu64"RX-total: "
1315 	       "%-"PRIu64"\n"
1316 	       "  TX-packets: %-14"PRIu64" TX-dropped: %-14"PRIu64"TX-total: "
1317 	       "%-"PRIu64"\n",
1318 	       total_recv, total_rx_dropped, total_recv + total_rx_dropped,
1319 	       total_xmit, total_tx_dropped, total_xmit + total_tx_dropped);
1320 	if (total_rx_nombuf > 0)
1321 		printf("  RX-nombufs: %-14"PRIu64"\n", total_rx_nombuf);
1322 	printf("  %s++++++++++++++++++++++++++++++++++++++++++++++"
1323 	       "%s\n",
1324 	       acc_stats_border, acc_stats_border);
1325 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
1326 	if (total_recv > 0)
1327 		printf("\n  CPU cycles/packet=%u (total cycles="
1328 		       "%"PRIu64" / total RX packets=%"PRIu64")\n",
1329 		       (unsigned int)(fwd_cycles / total_recv),
1330 		       fwd_cycles, total_recv);
1331 #endif
1332 	printf("\nDone.\n");
1333 	test_done = 1;
1334 }
1335 
1336 void
1337 dev_set_link_up(portid_t pid)
1338 {
1339 	if (rte_eth_dev_set_link_up(pid) < 0)
1340 		printf("\nSet link up fail.\n");
1341 }
1342 
1343 void
1344 dev_set_link_down(portid_t pid)
1345 {
1346 	if (rte_eth_dev_set_link_down(pid) < 0)
1347 		printf("\nSet link down fail.\n");
1348 }
1349 
1350 static int
1351 all_ports_started(void)
1352 {
1353 	portid_t pi;
1354 	struct rte_port *port;
1355 
1356 	RTE_ETH_FOREACH_DEV(pi) {
1357 		port = &ports[pi];
1358 		/* Check if there is a port which is not started */
1359 		if ((port->port_status != RTE_PORT_STARTED) &&
1360 			(port->slave_flag == 0))
1361 			return 0;
1362 	}
1363 
1364 	/* No port is not started */
1365 	return 1;
1366 }
1367 
1368 int
1369 all_ports_stopped(void)
1370 {
1371 	portid_t pi;
1372 	struct rte_port *port;
1373 
1374 	RTE_ETH_FOREACH_DEV(pi) {
1375 		port = &ports[pi];
1376 		if ((port->port_status != RTE_PORT_STOPPED) &&
1377 			(port->slave_flag == 0))
1378 			return 0;
1379 	}
1380 
1381 	return 1;
1382 }
1383 
1384 int
1385 port_is_started(portid_t port_id)
1386 {
1387 	if (port_id_is_invalid(port_id, ENABLED_WARN))
1388 		return 0;
1389 
1390 	if (ports[port_id].port_status != RTE_PORT_STARTED)
1391 		return 0;
1392 
1393 	return 1;
1394 }
1395 
1396 static int
1397 port_is_closed(portid_t port_id)
1398 {
1399 	if (port_id_is_invalid(port_id, ENABLED_WARN))
1400 		return 0;
1401 
1402 	if (ports[port_id].port_status != RTE_PORT_CLOSED)
1403 		return 0;
1404 
1405 	return 1;
1406 }
1407 
1408 int
1409 start_port(portid_t pid)
1410 {
1411 	int diag, need_check_link_status = -1;
1412 	portid_t pi;
1413 	queueid_t qi;
1414 	struct rte_port *port;
1415 	struct ether_addr mac_addr;
1416 	enum rte_eth_event_type event_type;
1417 
1418 	if (port_id_is_invalid(pid, ENABLED_WARN))
1419 		return 0;
1420 
1421 	if(dcb_config)
1422 		dcb_test = 1;
1423 	RTE_ETH_FOREACH_DEV(pi) {
1424 		if (pid != pi && pid != (portid_t)RTE_PORT_ALL)
1425 			continue;
1426 
1427 		need_check_link_status = 0;
1428 		port = &ports[pi];
1429 		if (rte_atomic16_cmpset(&(port->port_status), RTE_PORT_STOPPED,
1430 						 RTE_PORT_HANDLING) == 0) {
1431 			printf("Port %d is now not stopped\n", pi);
1432 			continue;
1433 		}
1434 
1435 		if (port->need_reconfig > 0) {
1436 			port->need_reconfig = 0;
1437 
1438 			if (flow_isolate_all) {
1439 				int ret = port_flow_isolate(pi, 1);
1440 				if (ret) {
1441 					printf("Failed to apply isolated"
1442 					       " mode on port %d\n", pi);
1443 					return -1;
1444 				}
1445 			}
1446 
1447 			printf("Configuring Port %d (socket %u)\n", pi,
1448 					port->socket_id);
1449 			/* configure port */
1450 			diag = rte_eth_dev_configure(pi, nb_rxq, nb_txq,
1451 						&(port->dev_conf));
1452 			if (diag != 0) {
1453 				if (rte_atomic16_cmpset(&(port->port_status),
1454 				RTE_PORT_HANDLING, RTE_PORT_STOPPED) == 0)
1455 					printf("Port %d can not be set back "
1456 							"to stopped\n", pi);
1457 				printf("Fail to configure port %d\n", pi);
1458 				/* try to reconfigure port next time */
1459 				port->need_reconfig = 1;
1460 				return -1;
1461 			}
1462 		}
1463 		if (port->need_reconfig_queues > 0) {
1464 			port->need_reconfig_queues = 0;
1465 			/* setup tx queues */
1466 			for (qi = 0; qi < nb_txq; qi++) {
1467 				if ((numa_support) &&
1468 					(txring_numa[pi] != NUMA_NO_CONFIG))
1469 					diag = rte_eth_tx_queue_setup(pi, qi,
1470 						nb_txd,txring_numa[pi],
1471 						&(port->tx_conf));
1472 				else
1473 					diag = rte_eth_tx_queue_setup(pi, qi,
1474 						nb_txd,port->socket_id,
1475 						&(port->tx_conf));
1476 
1477 				if (diag == 0)
1478 					continue;
1479 
1480 				/* Fail to setup tx queue, return */
1481 				if (rte_atomic16_cmpset(&(port->port_status),
1482 							RTE_PORT_HANDLING,
1483 							RTE_PORT_STOPPED) == 0)
1484 					printf("Port %d can not be set back "
1485 							"to stopped\n", pi);
1486 				printf("Fail to configure port %d tx queues\n", pi);
1487 				/* try to reconfigure queues next time */
1488 				port->need_reconfig_queues = 1;
1489 				return -1;
1490 			}
1491 			/* Apply Rx offloads configuration */
1492 			port->rx_conf.offloads = port->dev_conf.rxmode.offloads;
1493 			/* setup rx queues */
1494 			for (qi = 0; qi < nb_rxq; qi++) {
1495 				if ((numa_support) &&
1496 					(rxring_numa[pi] != NUMA_NO_CONFIG)) {
1497 					struct rte_mempool * mp =
1498 						mbuf_pool_find(rxring_numa[pi]);
1499 					if (mp == NULL) {
1500 						printf("Failed to setup RX queue:"
1501 							"No mempool allocation"
1502 							" on the socket %d\n",
1503 							rxring_numa[pi]);
1504 						return -1;
1505 					}
1506 
1507 					diag = rte_eth_rx_queue_setup(pi, qi,
1508 					     nb_rxd,rxring_numa[pi],
1509 					     &(port->rx_conf),mp);
1510 				} else {
1511 					struct rte_mempool *mp =
1512 						mbuf_pool_find(port->socket_id);
1513 					if (mp == NULL) {
1514 						printf("Failed to setup RX queue:"
1515 							"No mempool allocation"
1516 							" on the socket %d\n",
1517 							port->socket_id);
1518 						return -1;
1519 					}
1520 					diag = rte_eth_rx_queue_setup(pi, qi,
1521 					     nb_rxd,port->socket_id,
1522 					     &(port->rx_conf), mp);
1523 				}
1524 				if (diag == 0)
1525 					continue;
1526 
1527 				/* Fail to setup rx queue, return */
1528 				if (rte_atomic16_cmpset(&(port->port_status),
1529 							RTE_PORT_HANDLING,
1530 							RTE_PORT_STOPPED) == 0)
1531 					printf("Port %d can not be set back "
1532 							"to stopped\n", pi);
1533 				printf("Fail to configure port %d rx queues\n", pi);
1534 				/* try to reconfigure queues next time */
1535 				port->need_reconfig_queues = 1;
1536 				return -1;
1537 			}
1538 		}
1539 
1540 		for (event_type = RTE_ETH_EVENT_UNKNOWN;
1541 		     event_type < RTE_ETH_EVENT_MAX;
1542 		     event_type++) {
1543 			diag = rte_eth_dev_callback_register(pi,
1544 							event_type,
1545 							eth_event_callback,
1546 							NULL);
1547 			if (diag) {
1548 				printf("Failed to setup even callback for event %d\n",
1549 					event_type);
1550 				return -1;
1551 			}
1552 		}
1553 
1554 		/* start port */
1555 		if (rte_eth_dev_start(pi) < 0) {
1556 			printf("Fail to start port %d\n", pi);
1557 
1558 			/* Fail to setup rx queue, return */
1559 			if (rte_atomic16_cmpset(&(port->port_status),
1560 				RTE_PORT_HANDLING, RTE_PORT_STOPPED) == 0)
1561 				printf("Port %d can not be set back to "
1562 							"stopped\n", pi);
1563 			continue;
1564 		}
1565 
1566 		if (rte_atomic16_cmpset(&(port->port_status),
1567 			RTE_PORT_HANDLING, RTE_PORT_STARTED) == 0)
1568 			printf("Port %d can not be set into started\n", pi);
1569 
1570 		rte_eth_macaddr_get(pi, &mac_addr);
1571 		printf("Port %d: %02X:%02X:%02X:%02X:%02X:%02X\n", pi,
1572 				mac_addr.addr_bytes[0], mac_addr.addr_bytes[1],
1573 				mac_addr.addr_bytes[2], mac_addr.addr_bytes[3],
1574 				mac_addr.addr_bytes[4], mac_addr.addr_bytes[5]);
1575 
1576 		/* at least one port started, need checking link status */
1577 		need_check_link_status = 1;
1578 	}
1579 
1580 	if (need_check_link_status == 1 && !no_link_check)
1581 		check_all_ports_link_status(RTE_PORT_ALL);
1582 	else if (need_check_link_status == 0)
1583 		printf("Please stop the ports first\n");
1584 
1585 	printf("Done\n");
1586 	return 0;
1587 }
1588 
1589 void
1590 stop_port(portid_t pid)
1591 {
1592 	portid_t pi;
1593 	struct rte_port *port;
1594 	int need_check_link_status = 0;
1595 
1596 	if (dcb_test) {
1597 		dcb_test = 0;
1598 		dcb_config = 0;
1599 	}
1600 
1601 	if (port_id_is_invalid(pid, ENABLED_WARN))
1602 		return;
1603 
1604 	printf("Stopping ports...\n");
1605 
1606 	RTE_ETH_FOREACH_DEV(pi) {
1607 		if (pid != pi && pid != (portid_t)RTE_PORT_ALL)
1608 			continue;
1609 
1610 		if (port_is_forwarding(pi) != 0 && test_done == 0) {
1611 			printf("Please remove port %d from forwarding configuration.\n", pi);
1612 			continue;
1613 		}
1614 
1615 		if (port_is_bonding_slave(pi)) {
1616 			printf("Please remove port %d from bonded device.\n", pi);
1617 			continue;
1618 		}
1619 
1620 		port = &ports[pi];
1621 		if (rte_atomic16_cmpset(&(port->port_status), RTE_PORT_STARTED,
1622 						RTE_PORT_HANDLING) == 0)
1623 			continue;
1624 
1625 		rte_eth_dev_stop(pi);
1626 
1627 		if (rte_atomic16_cmpset(&(port->port_status),
1628 			RTE_PORT_HANDLING, RTE_PORT_STOPPED) == 0)
1629 			printf("Port %d can not be set into stopped\n", pi);
1630 		need_check_link_status = 1;
1631 	}
1632 	if (need_check_link_status && !no_link_check)
1633 		check_all_ports_link_status(RTE_PORT_ALL);
1634 
1635 	printf("Done\n");
1636 }
1637 
1638 void
1639 close_port(portid_t pid)
1640 {
1641 	portid_t pi;
1642 	struct rte_port *port;
1643 
1644 	if (port_id_is_invalid(pid, ENABLED_WARN))
1645 		return;
1646 
1647 	printf("Closing ports...\n");
1648 
1649 	RTE_ETH_FOREACH_DEV(pi) {
1650 		if (pid != pi && pid != (portid_t)RTE_PORT_ALL)
1651 			continue;
1652 
1653 		if (port_is_forwarding(pi) != 0 && test_done == 0) {
1654 			printf("Please remove port %d from forwarding configuration.\n", pi);
1655 			continue;
1656 		}
1657 
1658 		if (port_is_bonding_slave(pi)) {
1659 			printf("Please remove port %d from bonded device.\n", pi);
1660 			continue;
1661 		}
1662 
1663 		port = &ports[pi];
1664 		if (rte_atomic16_cmpset(&(port->port_status),
1665 			RTE_PORT_CLOSED, RTE_PORT_CLOSED) == 1) {
1666 			printf("Port %d is already closed\n", pi);
1667 			continue;
1668 		}
1669 
1670 		if (rte_atomic16_cmpset(&(port->port_status),
1671 			RTE_PORT_STOPPED, RTE_PORT_HANDLING) == 0) {
1672 			printf("Port %d is now not stopped\n", pi);
1673 			continue;
1674 		}
1675 
1676 		if (port->flow_list)
1677 			port_flow_flush(pi);
1678 		rte_eth_dev_close(pi);
1679 
1680 		if (rte_atomic16_cmpset(&(port->port_status),
1681 			RTE_PORT_HANDLING, RTE_PORT_CLOSED) == 0)
1682 			printf("Port %d cannot be set to closed\n", pi);
1683 	}
1684 
1685 	printf("Done\n");
1686 }
1687 
1688 void
1689 reset_port(portid_t pid)
1690 {
1691 	int diag;
1692 	portid_t pi;
1693 	struct rte_port *port;
1694 
1695 	if (port_id_is_invalid(pid, ENABLED_WARN))
1696 		return;
1697 
1698 	printf("Resetting ports...\n");
1699 
1700 	RTE_ETH_FOREACH_DEV(pi) {
1701 		if (pid != pi && pid != (portid_t)RTE_PORT_ALL)
1702 			continue;
1703 
1704 		if (port_is_forwarding(pi) != 0 && test_done == 0) {
1705 			printf("Please remove port %d from forwarding "
1706 			       "configuration.\n", pi);
1707 			continue;
1708 		}
1709 
1710 		if (port_is_bonding_slave(pi)) {
1711 			printf("Please remove port %d from bonded device.\n",
1712 			       pi);
1713 			continue;
1714 		}
1715 
1716 		diag = rte_eth_dev_reset(pi);
1717 		if (diag == 0) {
1718 			port = &ports[pi];
1719 			port->need_reconfig = 1;
1720 			port->need_reconfig_queues = 1;
1721 		} else {
1722 			printf("Failed to reset port %d. diag=%d\n", pi, diag);
1723 		}
1724 	}
1725 
1726 	printf("Done\n");
1727 }
1728 
1729 void
1730 attach_port(char *identifier)
1731 {
1732 	portid_t pi = 0;
1733 	unsigned int socket_id;
1734 
1735 	printf("Attaching a new port...\n");
1736 
1737 	if (identifier == NULL) {
1738 		printf("Invalid parameters are specified\n");
1739 		return;
1740 	}
1741 
1742 	if (rte_eth_dev_attach(identifier, &pi))
1743 		return;
1744 
1745 	socket_id = (unsigned)rte_eth_dev_socket_id(pi);
1746 	/* if socket_id is invalid, set to 0 */
1747 	if (check_socket_id(socket_id) < 0)
1748 		socket_id = 0;
1749 	reconfig(pi, socket_id);
1750 	rte_eth_promiscuous_enable(pi);
1751 
1752 	nb_ports = rte_eth_dev_count();
1753 
1754 	ports[pi].port_status = RTE_PORT_STOPPED;
1755 
1756 	printf("Port %d is attached. Now total ports is %d\n", pi, nb_ports);
1757 	printf("Done\n");
1758 }
1759 
1760 void
1761 detach_port(portid_t port_id)
1762 {
1763 	char name[RTE_ETH_NAME_MAX_LEN];
1764 
1765 	printf("Detaching a port...\n");
1766 
1767 	if (!port_is_closed(port_id)) {
1768 		printf("Please close port first\n");
1769 		return;
1770 	}
1771 
1772 	if (ports[port_id].flow_list)
1773 		port_flow_flush(port_id);
1774 
1775 	if (rte_eth_dev_detach(port_id, name)) {
1776 		TESTPMD_LOG(ERR, "Failed to detach port '%s'\n", name);
1777 		return;
1778 	}
1779 
1780 	nb_ports = rte_eth_dev_count();
1781 
1782 	printf("Port '%s' is detached. Now total ports is %d\n",
1783 			name, nb_ports);
1784 	printf("Done\n");
1785 	return;
1786 }
1787 
1788 void
1789 pmd_test_exit(void)
1790 {
1791 	portid_t pt_id;
1792 
1793 	if (test_done == 0)
1794 		stop_packet_forwarding();
1795 
1796 	if (ports != NULL) {
1797 		no_link_check = 1;
1798 		RTE_ETH_FOREACH_DEV(pt_id) {
1799 			printf("\nShutting down port %d...\n", pt_id);
1800 			fflush(stdout);
1801 			stop_port(pt_id);
1802 			close_port(pt_id);
1803 		}
1804 	}
1805 	printf("\nBye...\n");
1806 }
1807 
1808 typedef void (*cmd_func_t)(void);
1809 struct pmd_test_command {
1810 	const char *cmd_name;
1811 	cmd_func_t cmd_func;
1812 };
1813 
1814 #define PMD_TEST_CMD_NB (sizeof(pmd_test_menu) / sizeof(pmd_test_menu[0]))
1815 
1816 /* Check the link status of all ports in up to 9s, and print them finally */
1817 static void
1818 check_all_ports_link_status(uint32_t port_mask)
1819 {
1820 #define CHECK_INTERVAL 100 /* 100ms */
1821 #define MAX_CHECK_TIME 90 /* 9s (90 * 100ms) in total */
1822 	portid_t portid;
1823 	uint8_t count, all_ports_up, print_flag = 0;
1824 	struct rte_eth_link link;
1825 
1826 	printf("Checking link statuses...\n");
1827 	fflush(stdout);
1828 	for (count = 0; count <= MAX_CHECK_TIME; count++) {
1829 		all_ports_up = 1;
1830 		RTE_ETH_FOREACH_DEV(portid) {
1831 			if ((port_mask & (1 << portid)) == 0)
1832 				continue;
1833 			memset(&link, 0, sizeof(link));
1834 			rte_eth_link_get_nowait(portid, &link);
1835 			/* print link status if flag set */
1836 			if (print_flag == 1) {
1837 				if (link.link_status)
1838 					printf(
1839 					"Port%d Link Up. speed %u Mbps- %s\n",
1840 					portid, link.link_speed,
1841 				(link.link_duplex == ETH_LINK_FULL_DUPLEX) ?
1842 					("full-duplex") : ("half-duplex\n"));
1843 				else
1844 					printf("Port %d Link Down\n", portid);
1845 				continue;
1846 			}
1847 			/* clear all_ports_up flag if any link down */
1848 			if (link.link_status == ETH_LINK_DOWN) {
1849 				all_ports_up = 0;
1850 				break;
1851 			}
1852 		}
1853 		/* after finally printing all link status, get out */
1854 		if (print_flag == 1)
1855 			break;
1856 
1857 		if (all_ports_up == 0) {
1858 			fflush(stdout);
1859 			rte_delay_ms(CHECK_INTERVAL);
1860 		}
1861 
1862 		/* set the print_flag if all ports up or timeout */
1863 		if (all_ports_up == 1 || count == (MAX_CHECK_TIME - 1)) {
1864 			print_flag = 1;
1865 		}
1866 
1867 		if (lsc_interrupt)
1868 			break;
1869 	}
1870 }
1871 
1872 static void
1873 rmv_event_callback(void *arg)
1874 {
1875 	struct rte_eth_dev *dev;
1876 	portid_t port_id = (intptr_t)arg;
1877 
1878 	RTE_ETH_VALID_PORTID_OR_RET(port_id);
1879 	dev = &rte_eth_devices[port_id];
1880 
1881 	stop_port(port_id);
1882 	close_port(port_id);
1883 	printf("removing device %s\n", dev->device->name);
1884 	if (rte_eal_dev_detach(dev->device))
1885 		TESTPMD_LOG(ERR, "Failed to detach device %s\n",
1886 			dev->device->name);
1887 }
1888 
1889 /* This function is used by the interrupt thread */
1890 static int
1891 eth_event_callback(portid_t port_id, enum rte_eth_event_type type, void *param,
1892 		  void *ret_param)
1893 {
1894 	static const char * const event_desc[] = {
1895 		[RTE_ETH_EVENT_UNKNOWN] = "Unknown",
1896 		[RTE_ETH_EVENT_INTR_LSC] = "LSC",
1897 		[RTE_ETH_EVENT_QUEUE_STATE] = "Queue state",
1898 		[RTE_ETH_EVENT_INTR_RESET] = "Interrupt reset",
1899 		[RTE_ETH_EVENT_VF_MBOX] = "VF Mbox",
1900 		[RTE_ETH_EVENT_MACSEC] = "MACsec",
1901 		[RTE_ETH_EVENT_INTR_RMV] = "device removal",
1902 		[RTE_ETH_EVENT_MAX] = NULL,
1903 	};
1904 
1905 	RTE_SET_USED(param);
1906 	RTE_SET_USED(ret_param);
1907 
1908 	if (type >= RTE_ETH_EVENT_MAX) {
1909 		fprintf(stderr, "\nPort %" PRIu8 ": %s called upon invalid event %d\n",
1910 			port_id, __func__, type);
1911 		fflush(stderr);
1912 	} else if (event_print_mask & (UINT32_C(1) << type)) {
1913 		printf("\nPort %" PRIu8 ": %s event\n", port_id,
1914 			event_desc[type]);
1915 		fflush(stdout);
1916 	}
1917 
1918 	switch (type) {
1919 	case RTE_ETH_EVENT_INTR_RMV:
1920 		if (rte_eal_alarm_set(100000,
1921 				rmv_event_callback, (void *)(intptr_t)port_id))
1922 			fprintf(stderr, "Could not set up deferred device removal\n");
1923 		break;
1924 	default:
1925 		break;
1926 	}
1927 	return 0;
1928 }
1929 
1930 static int
1931 set_tx_queue_stats_mapping_registers(portid_t port_id, struct rte_port *port)
1932 {
1933 	uint16_t i;
1934 	int diag;
1935 	uint8_t mapping_found = 0;
1936 
1937 	for (i = 0; i < nb_tx_queue_stats_mappings; i++) {
1938 		if ((tx_queue_stats_mappings[i].port_id == port_id) &&
1939 				(tx_queue_stats_mappings[i].queue_id < nb_txq )) {
1940 			diag = rte_eth_dev_set_tx_queue_stats_mapping(port_id,
1941 					tx_queue_stats_mappings[i].queue_id,
1942 					tx_queue_stats_mappings[i].stats_counter_id);
1943 			if (diag != 0)
1944 				return diag;
1945 			mapping_found = 1;
1946 		}
1947 	}
1948 	if (mapping_found)
1949 		port->tx_queue_stats_mapping_enabled = 1;
1950 	return 0;
1951 }
1952 
1953 static int
1954 set_rx_queue_stats_mapping_registers(portid_t port_id, struct rte_port *port)
1955 {
1956 	uint16_t i;
1957 	int diag;
1958 	uint8_t mapping_found = 0;
1959 
1960 	for (i = 0; i < nb_rx_queue_stats_mappings; i++) {
1961 		if ((rx_queue_stats_mappings[i].port_id == port_id) &&
1962 				(rx_queue_stats_mappings[i].queue_id < nb_rxq )) {
1963 			diag = rte_eth_dev_set_rx_queue_stats_mapping(port_id,
1964 					rx_queue_stats_mappings[i].queue_id,
1965 					rx_queue_stats_mappings[i].stats_counter_id);
1966 			if (diag != 0)
1967 				return diag;
1968 			mapping_found = 1;
1969 		}
1970 	}
1971 	if (mapping_found)
1972 		port->rx_queue_stats_mapping_enabled = 1;
1973 	return 0;
1974 }
1975 
1976 static void
1977 map_port_queue_stats_mapping_registers(portid_t pi, struct rte_port *port)
1978 {
1979 	int diag = 0;
1980 
1981 	diag = set_tx_queue_stats_mapping_registers(pi, port);
1982 	if (diag != 0) {
1983 		if (diag == -ENOTSUP) {
1984 			port->tx_queue_stats_mapping_enabled = 0;
1985 			printf("TX queue stats mapping not supported port id=%d\n", pi);
1986 		}
1987 		else
1988 			rte_exit(EXIT_FAILURE,
1989 					"set_tx_queue_stats_mapping_registers "
1990 					"failed for port id=%d diag=%d\n",
1991 					pi, diag);
1992 	}
1993 
1994 	diag = set_rx_queue_stats_mapping_registers(pi, port);
1995 	if (diag != 0) {
1996 		if (diag == -ENOTSUP) {
1997 			port->rx_queue_stats_mapping_enabled = 0;
1998 			printf("RX queue stats mapping not supported port id=%d\n", pi);
1999 		}
2000 		else
2001 			rte_exit(EXIT_FAILURE,
2002 					"set_rx_queue_stats_mapping_registers "
2003 					"failed for port id=%d diag=%d\n",
2004 					pi, diag);
2005 	}
2006 }
2007 
2008 static void
2009 rxtx_port_config(struct rte_port *port)
2010 {
2011 	port->rx_conf = port->dev_info.default_rxconf;
2012 	port->tx_conf = port->dev_info.default_txconf;
2013 
2014 	/* Check if any RX/TX parameters have been passed */
2015 	if (rx_pthresh != RTE_PMD_PARAM_UNSET)
2016 		port->rx_conf.rx_thresh.pthresh = rx_pthresh;
2017 
2018 	if (rx_hthresh != RTE_PMD_PARAM_UNSET)
2019 		port->rx_conf.rx_thresh.hthresh = rx_hthresh;
2020 
2021 	if (rx_wthresh != RTE_PMD_PARAM_UNSET)
2022 		port->rx_conf.rx_thresh.wthresh = rx_wthresh;
2023 
2024 	if (rx_free_thresh != RTE_PMD_PARAM_UNSET)
2025 		port->rx_conf.rx_free_thresh = rx_free_thresh;
2026 
2027 	if (rx_drop_en != RTE_PMD_PARAM_UNSET)
2028 		port->rx_conf.rx_drop_en = rx_drop_en;
2029 
2030 	if (tx_pthresh != RTE_PMD_PARAM_UNSET)
2031 		port->tx_conf.tx_thresh.pthresh = tx_pthresh;
2032 
2033 	if (tx_hthresh != RTE_PMD_PARAM_UNSET)
2034 		port->tx_conf.tx_thresh.hthresh = tx_hthresh;
2035 
2036 	if (tx_wthresh != RTE_PMD_PARAM_UNSET)
2037 		port->tx_conf.tx_thresh.wthresh = tx_wthresh;
2038 
2039 	if (tx_rs_thresh != RTE_PMD_PARAM_UNSET)
2040 		port->tx_conf.tx_rs_thresh = tx_rs_thresh;
2041 
2042 	if (tx_free_thresh != RTE_PMD_PARAM_UNSET)
2043 		port->tx_conf.tx_free_thresh = tx_free_thresh;
2044 
2045 	if (txq_flags != RTE_PMD_PARAM_UNSET)
2046 		port->tx_conf.txq_flags = txq_flags;
2047 }
2048 
2049 void
2050 init_port_config(void)
2051 {
2052 	portid_t pid;
2053 	struct rte_port *port;
2054 
2055 	RTE_ETH_FOREACH_DEV(pid) {
2056 		port = &ports[pid];
2057 		port->dev_conf.rxmode = rx_mode;
2058 		port->dev_conf.fdir_conf = fdir_conf;
2059 		if (nb_rxq > 1) {
2060 			port->dev_conf.rx_adv_conf.rss_conf.rss_key = NULL;
2061 			port->dev_conf.rx_adv_conf.rss_conf.rss_hf = rss_hf;
2062 		} else {
2063 			port->dev_conf.rx_adv_conf.rss_conf.rss_key = NULL;
2064 			port->dev_conf.rx_adv_conf.rss_conf.rss_hf = 0;
2065 		}
2066 
2067 		if (port->dcb_flag == 0) {
2068 			if( port->dev_conf.rx_adv_conf.rss_conf.rss_hf != 0)
2069 				port->dev_conf.rxmode.mq_mode = ETH_MQ_RX_RSS;
2070 			else
2071 				port->dev_conf.rxmode.mq_mode = ETH_MQ_RX_NONE;
2072 		}
2073 
2074 		rxtx_port_config(port);
2075 
2076 		rte_eth_macaddr_get(pid, &port->eth_addr);
2077 
2078 		map_port_queue_stats_mapping_registers(pid, port);
2079 #if defined RTE_LIBRTE_IXGBE_PMD && defined RTE_LIBRTE_IXGBE_BYPASS
2080 		rte_pmd_ixgbe_bypass_init(pid);
2081 #endif
2082 
2083 		if (lsc_interrupt &&
2084 		    (rte_eth_devices[pid].data->dev_flags &
2085 		     RTE_ETH_DEV_INTR_LSC))
2086 			port->dev_conf.intr_conf.lsc = 1;
2087 		if (rmv_interrupt &&
2088 		    (rte_eth_devices[pid].data->dev_flags &
2089 		     RTE_ETH_DEV_INTR_RMV))
2090 			port->dev_conf.intr_conf.rmv = 1;
2091 
2092 #if defined RTE_LIBRTE_PMD_SOFTNIC && defined RTE_LIBRTE_SCHED
2093 		/* Detect softnic port */
2094 		if (!strcmp(port->dev_info.driver_name, "net_softnic")) {
2095 			port->softnic_enable = 1;
2096 			memset(&port->softport, 0, sizeof(struct softnic_port));
2097 
2098 			if (!strcmp(cur_fwd_eng->fwd_mode_name, "tm"))
2099 				port->softport.tm_flag = 1;
2100 		}
2101 #endif
2102 	}
2103 }
2104 
2105 void set_port_slave_flag(portid_t slave_pid)
2106 {
2107 	struct rte_port *port;
2108 
2109 	port = &ports[slave_pid];
2110 	port->slave_flag = 1;
2111 }
2112 
2113 void clear_port_slave_flag(portid_t slave_pid)
2114 {
2115 	struct rte_port *port;
2116 
2117 	port = &ports[slave_pid];
2118 	port->slave_flag = 0;
2119 }
2120 
2121 uint8_t port_is_bonding_slave(portid_t slave_pid)
2122 {
2123 	struct rte_port *port;
2124 
2125 	port = &ports[slave_pid];
2126 	return port->slave_flag;
2127 }
2128 
2129 const uint16_t vlan_tags[] = {
2130 		0,  1,  2,  3,  4,  5,  6,  7,
2131 		8,  9, 10, 11,  12, 13, 14, 15,
2132 		16, 17, 18, 19, 20, 21, 22, 23,
2133 		24, 25, 26, 27, 28, 29, 30, 31
2134 };
2135 
2136 static  int
2137 get_eth_dcb_conf(struct rte_eth_conf *eth_conf,
2138 		 enum dcb_mode_enable dcb_mode,
2139 		 enum rte_eth_nb_tcs num_tcs,
2140 		 uint8_t pfc_en)
2141 {
2142 	uint8_t i;
2143 
2144 	/*
2145 	 * Builds up the correct configuration for dcb+vt based on the vlan tags array
2146 	 * given above, and the number of traffic classes available for use.
2147 	 */
2148 	if (dcb_mode == DCB_VT_ENABLED) {
2149 		struct rte_eth_vmdq_dcb_conf *vmdq_rx_conf =
2150 				&eth_conf->rx_adv_conf.vmdq_dcb_conf;
2151 		struct rte_eth_vmdq_dcb_tx_conf *vmdq_tx_conf =
2152 				&eth_conf->tx_adv_conf.vmdq_dcb_tx_conf;
2153 
2154 		/* VMDQ+DCB RX and TX configurations */
2155 		vmdq_rx_conf->enable_default_pool = 0;
2156 		vmdq_rx_conf->default_pool = 0;
2157 		vmdq_rx_conf->nb_queue_pools =
2158 			(num_tcs ==  ETH_4_TCS ? ETH_32_POOLS : ETH_16_POOLS);
2159 		vmdq_tx_conf->nb_queue_pools =
2160 			(num_tcs ==  ETH_4_TCS ? ETH_32_POOLS : ETH_16_POOLS);
2161 
2162 		vmdq_rx_conf->nb_pool_maps = vmdq_rx_conf->nb_queue_pools;
2163 		for (i = 0; i < vmdq_rx_conf->nb_pool_maps; i++) {
2164 			vmdq_rx_conf->pool_map[i].vlan_id = vlan_tags[i];
2165 			vmdq_rx_conf->pool_map[i].pools =
2166 				1 << (i % vmdq_rx_conf->nb_queue_pools);
2167 		}
2168 		for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2169 			vmdq_rx_conf->dcb_tc[i] = i % num_tcs;
2170 			vmdq_tx_conf->dcb_tc[i] = i % num_tcs;
2171 		}
2172 
2173 		/* set DCB mode of RX and TX of multiple queues */
2174 		eth_conf->rxmode.mq_mode = ETH_MQ_RX_VMDQ_DCB;
2175 		eth_conf->txmode.mq_mode = ETH_MQ_TX_VMDQ_DCB;
2176 	} else {
2177 		struct rte_eth_dcb_rx_conf *rx_conf =
2178 				&eth_conf->rx_adv_conf.dcb_rx_conf;
2179 		struct rte_eth_dcb_tx_conf *tx_conf =
2180 				&eth_conf->tx_adv_conf.dcb_tx_conf;
2181 
2182 		rx_conf->nb_tcs = num_tcs;
2183 		tx_conf->nb_tcs = num_tcs;
2184 
2185 		for (i = 0; i < ETH_DCB_NUM_USER_PRIORITIES; i++) {
2186 			rx_conf->dcb_tc[i] = i % num_tcs;
2187 			tx_conf->dcb_tc[i] = i % num_tcs;
2188 		}
2189 		eth_conf->rxmode.mq_mode = ETH_MQ_RX_DCB_RSS;
2190 		eth_conf->rx_adv_conf.rss_conf.rss_hf = rss_hf;
2191 		eth_conf->txmode.mq_mode = ETH_MQ_TX_DCB;
2192 	}
2193 
2194 	if (pfc_en)
2195 		eth_conf->dcb_capability_en =
2196 				ETH_DCB_PG_SUPPORT | ETH_DCB_PFC_SUPPORT;
2197 	else
2198 		eth_conf->dcb_capability_en = ETH_DCB_PG_SUPPORT;
2199 
2200 	return 0;
2201 }
2202 
2203 int
2204 init_port_dcb_config(portid_t pid,
2205 		     enum dcb_mode_enable dcb_mode,
2206 		     enum rte_eth_nb_tcs num_tcs,
2207 		     uint8_t pfc_en)
2208 {
2209 	struct rte_eth_conf port_conf;
2210 	struct rte_port *rte_port;
2211 	int retval;
2212 	uint16_t i;
2213 
2214 	rte_port = &ports[pid];
2215 
2216 	memset(&port_conf, 0, sizeof(struct rte_eth_conf));
2217 	/* Enter DCB configuration status */
2218 	dcb_config = 1;
2219 
2220 	/*set configuration of DCB in vt mode and DCB in non-vt mode*/
2221 	retval = get_eth_dcb_conf(&port_conf, dcb_mode, num_tcs, pfc_en);
2222 	if (retval < 0)
2223 		return retval;
2224 	port_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
2225 
2226 	/**
2227 	 * Write the configuration into the device.
2228 	 * Set the numbers of RX & TX queues to 0, so
2229 	 * the RX & TX queues will not be setup.
2230 	 */
2231 	rte_eth_dev_configure(pid, 0, 0, &port_conf);
2232 
2233 	rte_eth_dev_info_get(pid, &rte_port->dev_info);
2234 
2235 	/* If dev_info.vmdq_pool_base is greater than 0,
2236 	 * the queue id of vmdq pools is started after pf queues.
2237 	 */
2238 	if (dcb_mode == DCB_VT_ENABLED &&
2239 	    rte_port->dev_info.vmdq_pool_base > 0) {
2240 		printf("VMDQ_DCB multi-queue mode is nonsensical"
2241 			" for port %d.", pid);
2242 		return -1;
2243 	}
2244 
2245 	/* Assume the ports in testpmd have the same dcb capability
2246 	 * and has the same number of rxq and txq in dcb mode
2247 	 */
2248 	if (dcb_mode == DCB_VT_ENABLED) {
2249 		if (rte_port->dev_info.max_vfs > 0) {
2250 			nb_rxq = rte_port->dev_info.nb_rx_queues;
2251 			nb_txq = rte_port->dev_info.nb_tx_queues;
2252 		} else {
2253 			nb_rxq = rte_port->dev_info.max_rx_queues;
2254 			nb_txq = rte_port->dev_info.max_tx_queues;
2255 		}
2256 	} else {
2257 		/*if vt is disabled, use all pf queues */
2258 		if (rte_port->dev_info.vmdq_pool_base == 0) {
2259 			nb_rxq = rte_port->dev_info.max_rx_queues;
2260 			nb_txq = rte_port->dev_info.max_tx_queues;
2261 		} else {
2262 			nb_rxq = (queueid_t)num_tcs;
2263 			nb_txq = (queueid_t)num_tcs;
2264 
2265 		}
2266 	}
2267 	rx_free_thresh = 64;
2268 
2269 	memcpy(&rte_port->dev_conf, &port_conf, sizeof(struct rte_eth_conf));
2270 
2271 	rxtx_port_config(rte_port);
2272 	/* VLAN filter */
2273 	rte_port->dev_conf.rxmode.offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
2274 	for (i = 0; i < RTE_DIM(vlan_tags); i++)
2275 		rx_vft_set(pid, vlan_tags[i], 1);
2276 
2277 	rte_eth_macaddr_get(pid, &rte_port->eth_addr);
2278 	map_port_queue_stats_mapping_registers(pid, rte_port);
2279 
2280 	rte_port->dcb_flag = 1;
2281 
2282 	return 0;
2283 }
2284 
2285 static void
2286 init_port(void)
2287 {
2288 	/* Configuration of Ethernet ports. */
2289 	ports = rte_zmalloc("testpmd: ports",
2290 			    sizeof(struct rte_port) * RTE_MAX_ETHPORTS,
2291 			    RTE_CACHE_LINE_SIZE);
2292 	if (ports == NULL) {
2293 		rte_exit(EXIT_FAILURE,
2294 				"rte_zmalloc(%d struct rte_port) failed\n",
2295 				RTE_MAX_ETHPORTS);
2296 	}
2297 }
2298 
2299 static void
2300 force_quit(void)
2301 {
2302 	pmd_test_exit();
2303 	prompt_exit();
2304 }
2305 
2306 static void
2307 print_stats(void)
2308 {
2309 	uint8_t i;
2310 	const char clr[] = { 27, '[', '2', 'J', '\0' };
2311 	const char top_left[] = { 27, '[', '1', ';', '1', 'H', '\0' };
2312 
2313 	/* Clear screen and move to top left */
2314 	printf("%s%s", clr, top_left);
2315 
2316 	printf("\nPort statistics ====================================");
2317 	for (i = 0; i < cur_fwd_config.nb_fwd_ports; i++)
2318 		nic_stats_display(fwd_ports_ids[i]);
2319 }
2320 
2321 static void
2322 signal_handler(int signum)
2323 {
2324 	if (signum == SIGINT || signum == SIGTERM) {
2325 		printf("\nSignal %d received, preparing to exit...\n",
2326 				signum);
2327 #ifdef RTE_LIBRTE_PDUMP
2328 		/* uninitialize packet capture framework */
2329 		rte_pdump_uninit();
2330 #endif
2331 #ifdef RTE_LIBRTE_LATENCY_STATS
2332 		rte_latencystats_uninit();
2333 #endif
2334 		force_quit();
2335 		/* Set flag to indicate the force termination. */
2336 		f_quit = 1;
2337 		/* exit with the expected status */
2338 		signal(signum, SIG_DFL);
2339 		kill(getpid(), signum);
2340 	}
2341 }
2342 
2343 int
2344 main(int argc, char** argv)
2345 {
2346 	int  diag;
2347 	portid_t port_id;
2348 
2349 	signal(SIGINT, signal_handler);
2350 	signal(SIGTERM, signal_handler);
2351 
2352 	diag = rte_eal_init(argc, argv);
2353 	if (diag < 0)
2354 		rte_panic("Cannot init EAL\n");
2355 
2356 	testpmd_logtype = rte_log_register("testpmd");
2357 	if (testpmd_logtype < 0)
2358 		rte_panic("Cannot register log type");
2359 	rte_log_set_level(testpmd_logtype, RTE_LOG_DEBUG);
2360 
2361 	if (mlockall(MCL_CURRENT | MCL_FUTURE)) {
2362 		TESTPMD_LOG(NOTICE, "mlockall() failed with error \"%s\"\n",
2363 			strerror(errno));
2364 	}
2365 
2366 #ifdef RTE_LIBRTE_PDUMP
2367 	/* initialize packet capture framework */
2368 	rte_pdump_init(NULL);
2369 #endif
2370 
2371 	nb_ports = (portid_t) rte_eth_dev_count();
2372 	if (nb_ports == 0)
2373 		TESTPMD_LOG(WARNING, "No probed ethernet devices\n");
2374 
2375 	/* allocate port structures, and init them */
2376 	init_port();
2377 
2378 	set_def_fwd_config();
2379 	if (nb_lcores == 0)
2380 		rte_panic("Empty set of forwarding logical cores - check the "
2381 			  "core mask supplied in the command parameters\n");
2382 
2383 	/* Bitrate/latency stats disabled by default */
2384 #ifdef RTE_LIBRTE_BITRATE
2385 	bitrate_enabled = 0;
2386 #endif
2387 #ifdef RTE_LIBRTE_LATENCY_STATS
2388 	latencystats_enabled = 0;
2389 #endif
2390 
2391 	argc -= diag;
2392 	argv += diag;
2393 	if (argc > 1)
2394 		launch_args_parse(argc, argv);
2395 
2396 	if (tx_first && interactive)
2397 		rte_exit(EXIT_FAILURE, "--tx-first cannot be used on "
2398 				"interactive mode.\n");
2399 
2400 	if (tx_first && lsc_interrupt) {
2401 		printf("Warning: lsc_interrupt needs to be off when "
2402 				" using tx_first. Disabling.\n");
2403 		lsc_interrupt = 0;
2404 	}
2405 
2406 	if (!nb_rxq && !nb_txq)
2407 		printf("Warning: Either rx or tx queues should be non-zero\n");
2408 
2409 	if (nb_rxq > 1 && nb_rxq > nb_txq)
2410 		printf("Warning: nb_rxq=%d enables RSS configuration, "
2411 		       "but nb_txq=%d will prevent to fully test it.\n",
2412 		       nb_rxq, nb_txq);
2413 
2414 	init_config();
2415 	if (start_port(RTE_PORT_ALL) != 0)
2416 		rte_exit(EXIT_FAILURE, "Start ports failed\n");
2417 
2418 	/* set all ports to promiscuous mode by default */
2419 	RTE_ETH_FOREACH_DEV(port_id)
2420 		rte_eth_promiscuous_enable(port_id);
2421 
2422 	/* Init metrics library */
2423 	rte_metrics_init(rte_socket_id());
2424 
2425 #ifdef RTE_LIBRTE_LATENCY_STATS
2426 	if (latencystats_enabled != 0) {
2427 		int ret = rte_latencystats_init(1, NULL);
2428 		if (ret)
2429 			printf("Warning: latencystats init()"
2430 				" returned error %d\n",	ret);
2431 		printf("Latencystats running on lcore %d\n",
2432 			latencystats_lcore_id);
2433 	}
2434 #endif
2435 
2436 	/* Setup bitrate stats */
2437 #ifdef RTE_LIBRTE_BITRATE
2438 	if (bitrate_enabled != 0) {
2439 		bitrate_data = rte_stats_bitrate_create();
2440 		if (bitrate_data == NULL)
2441 			rte_exit(EXIT_FAILURE,
2442 				"Could not allocate bitrate data.\n");
2443 		rte_stats_bitrate_reg(bitrate_data);
2444 	}
2445 #endif
2446 
2447 #ifdef RTE_LIBRTE_CMDLINE
2448 	if (strlen(cmdline_filename) != 0)
2449 		cmdline_read_from_file(cmdline_filename);
2450 
2451 	if (interactive == 1) {
2452 		if (auto_start) {
2453 			printf("Start automatic packet forwarding\n");
2454 			start_packet_forwarding(0);
2455 		}
2456 		prompt();
2457 		pmd_test_exit();
2458 	} else
2459 #endif
2460 	{
2461 		char c;
2462 		int rc;
2463 
2464 		f_quit = 0;
2465 
2466 		printf("No commandline core given, start packet forwarding\n");
2467 		start_packet_forwarding(tx_first);
2468 		if (stats_period != 0) {
2469 			uint64_t prev_time = 0, cur_time, diff_time = 0;
2470 			uint64_t timer_period;
2471 
2472 			/* Convert to number of cycles */
2473 			timer_period = stats_period * rte_get_timer_hz();
2474 
2475 			while (f_quit == 0) {
2476 				cur_time = rte_get_timer_cycles();
2477 				diff_time += cur_time - prev_time;
2478 
2479 				if (diff_time >= timer_period) {
2480 					print_stats();
2481 					/* Reset the timer */
2482 					diff_time = 0;
2483 				}
2484 				/* Sleep to avoid unnecessary checks */
2485 				prev_time = cur_time;
2486 				sleep(1);
2487 			}
2488 		}
2489 
2490 		printf("Press enter to exit\n");
2491 		rc = read(0, &c, 1);
2492 		pmd_test_exit();
2493 		if (rc < 0)
2494 			return 1;
2495 	}
2496 
2497 	return 0;
2498 }
2499