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