From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 90FC4A034E; Fri, 21 Jan 2022 11:32:23 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CEC3542778; Fri, 21 Jan 2022 11:31:42 +0100 (CET) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mails.dpdk.org (Postfix) with ESMTP id CBC734276B for ; Fri, 21 Jan 2022 11:31:40 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1642761101; x=1674297101; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=IIKYW+Z+43Ib9qY+rOCVzyISxAjcRPtzp3o2kDYSWf4=; b=gEF4M3jtHydWktW4FVEFVvuZE40nHMqiUuYqZ907H9FNogfDdxPDb2D6 /gF3FO5f4Ovo717RaG+OklXuRXUhiSUU37lJz0rHPIGGg4b4Nd9c/drPb LiljmhifjV9EhylDNi2TTvGviWh0yuBzWMsCXYFvQmRbvYeoksETbPdI9 Y1BPfC9oOJ55TKBX6FzNxHG+KAtDQYa1Jw2YPqYMb5isa2DKicdzp/YFn GBaZAaoWD1hwbmYVn28Y7pXNnfyacwK8tw0mNwHHm5wWab1KQWGJRixxv yXybOp+EIm0ymQq97qxWJH6dVnezy3YpoLiFgdrjp/D83R+69JbjbnXY0 g==; X-IronPort-AV: E=McAfee;i="6200,9189,10233"; a="270045115" X-IronPort-AV: E=Sophos;i="5.88,304,1635231600"; d="scan'208";a="270045115" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Jan 2022 02:31:40 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.88,304,1635231600"; d="scan'208";a="533222763" Received: from silpixa00401120.ir.intel.com ([10.55.128.255]) by orsmga008.jf.intel.com with ESMTP; 21 Jan 2022 02:31:38 -0800 From: Ronan Randles To: dev@dpdk.org Cc: Harry van Haaren , Ronan Randles Subject: [PATCH v2 08/15] examples/generator: import code from basicfwd.c Date: Fri, 21 Jan 2022 10:31:15 +0000 Message-Id: <20220121103122.2926856-9-ronan.randles@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220121103122.2926856-1-ronan.randles@intel.com> References: <20211214141242.3383831-1-ronan.randles@intel.com> <20220121103122.2926856-1-ronan.randles@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Harry van Haaren Import files from basicfwd.c to act as starting point for gen library sample app Signed-off-by: Harry van Haaren Signed-off-by: Ronan Randles --- examples/generator/main.c | 226 +++++++++++++++++++++++++++++++++ examples/generator/meson.build | 12 ++ 2 files changed, 238 insertions(+) create mode 100644 examples/generator/main.c create mode 100644 examples/generator/meson.build diff --git a/examples/generator/main.c b/examples/generator/main.c new file mode 100644 index 0000000000..0082f588b4 --- /dev/null +++ b/examples/generator/main.c @@ -0,0 +1,226 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2015 Intel Corporation + */ + +#include +#include +#include +#include +#include +#include +#include + +#define RX_RING_SIZE 1024 +#define TX_RING_SIZE 1024 + +#define NUM_MBUFS 8191 +#define MBUF_CACHE_SIZE 256 +#define BURST_SIZE 32 + +/* Configuration of ethernet ports. 8< */ +static const struct rte_eth_conf port_conf_default = { + .rxmode = { + .max_lro_pkt_size = RTE_ETHER_MAX_LEN, + }, +}; +/* >8 End of configuration of ethernet ports. */ + +/* basicfwd.c: Basic DPDK skeleton forwarding example. */ + +/* + * Initializes a given port using global settings and with the RX buffers + * coming from the mbuf_pool passed as a parameter. + */ + +/* Main functional part of port initialization. 8< */ +static inline int +port_init(uint16_t port, struct rte_mempool *mbuf_pool) +{ + struct rte_eth_conf port_conf = port_conf_default; + const uint16_t rx_rings = 1, tx_rings = 1; + uint16_t nb_rxd = RX_RING_SIZE; + uint16_t nb_txd = TX_RING_SIZE; + int retval; + uint16_t q; + struct rte_eth_dev_info dev_info; + struct rte_eth_txconf txconf; + + if (!rte_eth_dev_is_valid_port(port)) + return -1; + + retval = rte_eth_dev_info_get(port, &dev_info); + if (retval != 0) { + printf("Error during getting device (port %u) info: %s\n", + port, strerror(-retval)); + return retval; + } + + if (dev_info.tx_offload_capa & DEV_TX_OFFLOAD_MBUF_FAST_FREE) + port_conf.txmode.offloads |= + DEV_TX_OFFLOAD_MBUF_FAST_FREE; + + /* Configure the Ethernet device. */ + retval = rte_eth_dev_configure(port, rx_rings, tx_rings, &port_conf); + if (retval != 0) + return retval; + + retval = rte_eth_dev_adjust_nb_rx_tx_desc(port, &nb_rxd, &nb_txd); + if (retval != 0) + return retval; + + /* Allocate and set up 1 RX queue per Ethernet port. */ + for (q = 0; q < rx_rings; q++) { + retval = rte_eth_rx_queue_setup(port, q, nb_rxd, + rte_eth_dev_socket_id(port), NULL, mbuf_pool); + if (retval < 0) + return retval; + } + + txconf = dev_info.default_txconf; + txconf.offloads = port_conf.txmode.offloads; + /* Allocate and set up 1 TX queue per Ethernet port. */ + for (q = 0; q < tx_rings; q++) { + retval = rte_eth_tx_queue_setup(port, q, nb_txd, + rte_eth_dev_socket_id(port), &txconf); + if (retval < 0) + return retval; + } + + /* Starting Ethernet port. 8< */ + retval = rte_eth_dev_start(port); + /* >8 End of starting of ethernet port. */ + if (retval < 0) + return retval; + + /* Display the port MAC address. */ + struct rte_ether_addr addr; + retval = rte_eth_macaddr_get(port, &addr); + if (retval != 0) + return retval; + + printf("Port %u MAC: %02" PRIx8 " %02" PRIx8 " %02" PRIx8 + " %02" PRIx8 " %02" PRIx8 " %02" PRIx8 "\n", + port, RTE_ETHER_ADDR_BYTES(&addr)); + + /* Enable RX in promiscuous mode for the Ethernet device. */ + retval = rte_eth_promiscuous_enable(port); + /* End of setting RX port in promiscuous mode. */ + if (retval != 0) + return retval; + + return 0; +} +/* >8 End of main functional part of port initialization. */ + +/* + * The lcore main. This is the main thread that does the work, reading from + * an input port and writing to an output port. + */ + + /* Basic forwarding application lcore. 8< */ +static __rte_noreturn void +lcore_main(void) +{ + uint16_t port; + + /* + * Check that the port is on the same NUMA node as the polling thread + * for best performance. + */ + RTE_ETH_FOREACH_DEV(port) + if (rte_eth_dev_socket_id(port) >= 0 && + rte_eth_dev_socket_id(port) != + (int)rte_socket_id()) + printf("WARNING, port %u is on remote NUMA node to " + "polling thread.\n\tPerformance will " + "not be optimal.\n", port); + + printf("\nCore %u forwarding packets. [Ctrl+C to quit]\n", + rte_lcore_id()); + + /* Main work of application loop. 8< */ + for (;;) { + /* + * Receive packets on a port and forward them on the paired + * port. The mapping is 0 -> 1, 1 -> 0, 2 -> 3, 3 -> 2, etc. + */ + RTE_ETH_FOREACH_DEV(port) { + + /* Get burst of RX packets, from first port of pair. */ + struct rte_mbuf *bufs[BURST_SIZE]; + const uint16_t nb_rx = rte_eth_rx_burst(port, 0, + bufs, BURST_SIZE); + + if (unlikely(nb_rx == 0)) + continue; + + /* Send burst of TX packets, to second port of pair. */ + const uint16_t nb_tx = rte_eth_tx_burst(port ^ 1, 0, + bufs, nb_rx); + + /* Free any unsent packets. */ + if (unlikely(nb_tx < nb_rx)) { + uint16_t buf; + for (buf = nb_tx; buf < nb_rx; buf++) + rte_pktmbuf_free(bufs[buf]); + } + } + } + /* >8 End of loop. */ +} +/* >8 End Basic forwarding application lcore. */ + +/* + * The main function, which does initialization and calls the per-lcore + * functions. + */ +int +main(int argc, char *argv[]) +{ + struct rte_mempool *mbuf_pool; + unsigned int nb_ports; + uint16_t portid; + + /* Initializion the Environment Abstraction Layer (EAL). 8< */ + int ret = rte_eal_init(argc, argv); + if (ret < 0) + rte_exit(EXIT_FAILURE, "Error with EAL initialization\n"); + /* >8 End of initializion the Environment Abstraction Layer (EAL). */ + + argc -= ret; + argv += ret; + + /* Check that there is an even number of ports to send/receive on. */ + nb_ports = rte_eth_dev_count_avail(); + if (nb_ports < 2 || (nb_ports & 1)) + rte_exit(EXIT_FAILURE, "Error: number of ports must be even\n"); + + /* Creates a new mempool in memory to hold the mbufs. */ + + /* Allocates mempool to hold the mbufs. 8< */ + mbuf_pool = rte_pktmbuf_pool_create("MBUF_POOL", NUM_MBUFS * nb_ports, + MBUF_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id()); + /* >8 End of allocating mempool to hold mbuf. */ + + if (mbuf_pool == NULL) + rte_exit(EXIT_FAILURE, "Cannot create mbuf pool\n"); + + /* Initializing all ports. 8< */ + RTE_ETH_FOREACH_DEV(portid) + if (port_init(portid, mbuf_pool) != 0) + rte_exit(EXIT_FAILURE, "Cannot init port %"PRIu16 "\n", + portid); + /* >8 End of initializing all ports. */ + + if (rte_lcore_count() > 1) + printf("\nWARNING: Too many lcores enabled. Only 1 used.\n"); + + /* Call lcore_main on the main core only. Called on single lcore. 8< */ + lcore_main(); + /* >8 End of called on single lcore. */ + + /* clean up the EAL */ + rte_eal_cleanup(); + + return 0; +} diff --git a/examples/generator/meson.build b/examples/generator/meson.build new file mode 100644 index 0000000000..441678bbe5 --- /dev/null +++ b/examples/generator/meson.build @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2017 Intel Corporation + +# meson file, for building this example as part of a main DPDK build. +# +# To build this example as a standalone application with an already-installed +# DPDK instance, use 'make' + +allow_experimental_apis = true +sources = files( + 'main.c', +) -- 2.25.1