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 573D7A034E; Fri, 21 Jan 2022 11:31:55 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 8C29D42759; Fri, 21 Jan 2022 11:31:37 +0100 (CET) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mails.dpdk.org (Postfix) with ESMTP id AA68742754 for ; Fri, 21 Jan 2022 11:31:35 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1642761095; x=1674297095; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=WAsB5mXVwWeKQGOlTBvfEyGz03MD12da3+NZ+S40ePA=; b=dH5be0HRqcqMHl2oZXdmelT6hk55XW+kCueDftxLQxSZmXkGMwFkiMnX 68xdqgmpSxsiuC1qp67FZ2ixPt/NWcUVK4O8RYHEeS+qbidq7RXAognaY JsAXU6cV02t1jPXKpVXxMQX1OqIZsLBHhcUlphVSbiEv+fVb5PBI0MN+U sC94doex9MQ1G2P3pokH2fszN0AcggvvOGoqmpGDmb9i4JpbMRQ1/ATN4 VgR0DIbN8G02OyTNzNOvLWk28Q2Ih/u1HDtoNh4SsMFqd0+/n/itYs1li jf5BVxcBwD0J86/43/BbZNZZwLi5Ii12zLemNd9zeB/4T2OH4f1+MRGvC A==; X-IronPort-AV: E=McAfee;i="6200,9189,10233"; a="270045085" X-IronPort-AV: E=Sophos;i="5.88,304,1635231600"; d="scan'208";a="270045085" 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:34 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.88,304,1635231600"; d="scan'208";a="533222739" Received: from silpixa00401120.ir.intel.com ([10.55.128.255]) by orsmga008.jf.intel.com with ESMTP; 21 Jan 2022 02:31:33 -0800 From: Ronan Randles To: dev@dpdk.org Cc: Harry van Haaren , Ronan Randles Subject: [PATCH v2 04/15] gen: add basic Rx and Tx routines and tests Date: Fri, 21 Jan 2022 10:31:11 +0000 Message-Id: <20220121103122.2926856-5-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 This commit introduces functions for basic mbuf rx and tx. This commit also contains a unit test that calls rte_gen_rx_burst and rte_gen_tx_burst to send bursts of 32 packets repeatedly in order to verify their functionality Signed-off-by: Harry van Haaren Signed-off-by: Ronan Randles --- app/test/test_gen.c | 46 ++++++++++++++++++++++++++++++++++++++++++ lib/gen/meson.build | 1 + lib/gen/rte_gen.c | 43 +++++++++++++++++++++++++++++++++++++++ lib/gen/rte_gen.h | 49 +++++++++++++++++++++++++++++++++++++++++++++ lib/gen/version.map | 2 ++ 5 files changed, 141 insertions(+) diff --git a/app/test/test_gen.c b/app/test/test_gen.c index f53f4a6608..ceacd8c7c4 100644 --- a/app/test/test_gen.c +++ b/app/test/test_gen.c @@ -8,6 +8,8 @@ #include "test.h" +#define BURST_MAX 32 + static struct rte_mempool *mp; static int @@ -36,12 +38,56 @@ test_gen_create(void) return 0; } +static int +test_gen_basic_rxtx(void) +{ + struct rte_gen *gen = rte_gen_create(mp); + TEST_ASSERT_FAIL(gen, "Expected valid pointer after create()"); + + struct rte_mbuf *bufs[BURST_MAX]; + uint16_t nb_rx = rte_gen_rx_burst(gen, bufs, BURST_MAX); + TEST_ASSERT_EQUAL(nb_rx, BURST_MAX, "Expected rx packet burst."); + + uint64_t latency[BURST_MAX]; + uint16_t nb_tx = rte_gen_tx_burst(gen, bufs, latency, BURST_MAX); + TEST_ASSERT_EQUAL(nb_tx, BURST_MAX, "Expected tx packet burst."); + + rte_gen_destroy(gen); + return 0; +} + +static int +test_gen_loop_rxtx(void) +{ + struct rte_gen *gen = rte_gen_create(mp); + TEST_ASSERT_FAIL(gen, "Expected valid pointer after create()"); + + uint32_t total_sent = 0; + + while (total_sent < 1000000) { + struct rte_mbuf *bufs[BURST_MAX]; + uint16_t nb_rx = rte_gen_rx_burst(gen, bufs, BURST_MAX); + TEST_ASSERT_EQUAL(nb_rx, BURST_MAX, "Expected rx packet burst."); + + uint64_t latency[BURST_MAX]; + uint16_t nb_tx = rte_gen_tx_burst(gen, bufs, latency, nb_rx); + TEST_ASSERT_EQUAL(nb_tx, BURST_MAX, "Expected tx packet burst."); + + total_sent += nb_tx; + } + + rte_gen_destroy(gen); + return 0; +} + static struct unit_test_suite gen_suite = { .suite_name = "gen: packet generator unit test suite", .setup = testsuite_setup, .teardown = testsuite_teardown, .unit_test_cases = { TEST_CASE_ST(NULL, NULL, test_gen_create), + TEST_CASE_ST(NULL, NULL, test_gen_basic_rxtx), + TEST_CASE_ST(NULL, NULL, test_gen_loop_rxtx), TEST_CASES_END() /**< NULL terminate unit test array */ } }; diff --git a/lib/gen/meson.build b/lib/gen/meson.build index 3c5d854645..753984cbba 100644 --- a/lib/gen/meson.build +++ b/lib/gen/meson.build @@ -3,3 +3,4 @@ sources = files('rte_gen.c') headers = files('rte_gen.h') +deps += ['mempool', 'mbuf'] diff --git a/lib/gen/rte_gen.c b/lib/gen/rte_gen.c index d993772422..f0ad57fa81 100644 --- a/lib/gen/rte_gen.c +++ b/lib/gen/rte_gen.c @@ -4,8 +4,11 @@ #include "rte_gen.h" +#include #include +#define GEN_MAX_BURST 32 + /** Structure that represents a traffic generator. */ struct rte_gen { /* Mempool that buffers are retrieved from. */ @@ -31,3 +34,43 @@ rte_gen_destroy(struct rte_gen *gen) { rte_free(gen); } + +uint16_t +rte_gen_rx_burst(struct rte_gen *gen, + struct rte_mbuf **rx_pkts, + const uint16_t nb_pkts) +{ + /* Get a bulk of nb_pkts from the mempool. */ + int err = rte_mempool_get_bulk(gen->mp, (void **)rx_pkts, nb_pkts); + if (err) + return 0; + + const uint32_t pkt_len = 64; + + uint32_t i; + for (i = 0; i < nb_pkts; i++) { + struct rte_mbuf *m = rx_pkts[i]; + uint8_t *pkt_data = rte_pktmbuf_mtod(m, uint8_t *); + + memset(pkt_data, 0, pkt_len); + + m->pkt_len = pkt_len; + m->data_len = pkt_len; + } + + return nb_pkts; +} + +uint16_t +rte_gen_tx_burst(struct rte_gen *gen, + struct rte_mbuf **tx_pkts, + uint64_t *pkt_latencies, + const uint16_t nb_pkts) +{ + RTE_SET_USED(gen); + RTE_SET_USED(pkt_latencies); + + rte_pktmbuf_free_bulk(tx_pkts, nb_pkts); + + return nb_pkts; +} diff --git a/lib/gen/rte_gen.h b/lib/gen/rte_gen.h index 5b30430f9e..09ee1e8872 100644 --- a/lib/gen/rte_gen.h +++ b/lib/gen/rte_gen.h @@ -25,6 +25,7 @@ extern "C" { struct rte_gen; /* Forward declarations for DPDK componeents. */ +struct rte_mbuf; struct rte_mempool; /* Allocate and initialize a traffic generator instance. */ @@ -37,6 +38,54 @@ __rte_experimental void rte_gen_destroy(struct rte_gen *gen); +/** + * Call to receive a burst of generated packets + * + * @param gen + * Gen instance to be used. + * @param rx_pkts + * mbuf where packets will be generated. + * @param nb_pkts + * number of packets to be generated + * + * @retval nb_pkts + * On success the number of rx'ed packets will be returned + * @retval 0 + * Failure. + */ +__rte_experimental +uint16_t +rte_gen_rx_burst(struct rte_gen *gen, + struct rte_mbuf **rx_pkts, + const uint16_t nb_pkts); + +/** Call to transmit a burst of traffic back to the generator. + * This allows the generator to calculate stats/properties of the stream. + * + * If the pkt_latencies parameter is not NULL, it is expected to be a pointer + * to an array of uint64_t values that has nb_pkts in length. Each individual + * packet latency will be stored to the array. + * + * @param gen + * Gen instance to be used. + * @param tx_pkts + * mbuf to be used to tx packets + * @param pkt_latencies + * Array to store latencies of sent packets + * @param nb_pkts + * The number of packets to be tx'ed + * + * @retval nb_pkts + * On success the number of packets tx'ed is returned + */ +__rte_experimental +uint16_t +rte_gen_tx_burst(struct rte_gen *gen, + struct rte_mbuf **tx_pkts, + uint64_t *pkt_latencies, + const uint16_t nb_pkts); + + #ifdef __cplusplus } #endif diff --git a/lib/gen/version.map b/lib/gen/version.map index d8a26eb53a..bdd25add6f 100644 --- a/lib/gen/version.map +++ b/lib/gen/version.map @@ -3,4 +3,6 @@ EXPERIMENTAL { rte_gen_create; rte_gen_destroy; + rte_gen_rx_burst; + rte_gen_tx_burst; }; -- 2.25.1