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