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