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 5F27DA00C3; Tue, 14 Dec 2021 15:13:44 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id DD9E04116A; Tue, 14 Dec 2021 15:13:01 +0100 (CET) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id 7380541178 for ; Tue, 14 Dec 2021 15:12:59 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639491179; x=1671027179; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=IIKYW+Z+43Ib9qY+rOCVzyISxAjcRPtzp3o2kDYSWf4=; b=NCxqnqFAas8c/7SdHeyyiWUWmw/3OjYC3Lsit3E1QnxPCodBeEZk+eVP QPP/g7HVTbSoSV40SXw7iXTUTjnrr7aa/t3m1qtX6d30D8CsWTSjLDkK7 rsq3xcRvdSUtK4HyJxvSyB4+FdfBIryQcnmeUMGgOG8PsEeTi17vmyslc am1oYPWDDpQKtE6qk9jv+X99ddNlEum0cXYgxaBwQJoQrOpewI7C8hXIu 8CRqNkUKEUDAj1bQLarGfZ7P8OAxEMfedsSDu4NohwXxhPb4cnxxrpzTr bJkz7gyDxLW2vgB//Qqz/yxUrMmmaMWi37itn24gFOzbcVfmppiGpeRL4 A==; X-IronPort-AV: E=McAfee;i="6200,9189,10197"; a="302362335" X-IronPort-AV: E=Sophos;i="5.88,205,1635231600"; d="scan'208";a="302362335" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Dec 2021 06:12:59 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.88,205,1635231600"; d="scan'208";a="465104155" Received: from silpixa00401120.ir.intel.com ([10.55.129.95]) by orsmga006.jf.intel.com with ESMTP; 14 Dec 2021 06:12:57 -0800 From: Ronan Randles To: dev@dpdk.org Cc: harry.van.haaren@intel.com, Ronan Randles Subject: [PATCH 08/12] examples/generator: import code from basicfwd.c Date: Tue, 14 Dec 2021 14:12:38 +0000 Message-Id: <20211214141242.3383831-9-ronan.randles@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20211214141242.3383831-1-ronan.randles@intel.com> References: <20211214141242.3383831-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