From patchwork Tue Dec 14 14:12:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ronan Randles X-Patchwork-Id: 105131 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id A8967A00C3; Tue, 14 Dec 2021 15:12:57 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 436384114A; Tue, 14 Dec 2021 15:12:51 +0100 (CET) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id D1ADD4003C for ; Tue, 14 Dec 2021 15:12:48 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639491169; x=1671027169; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=sXddrN5qu5q5oylC1x8jKFCSM0mTtRG7Zn1BKIFH4uo=; b=NlHdy7IXGV/vTXhTNEytnZpMyA3NFtTkuSRN6aerEEZzzb2W6vLFAcx+ VIQyngyjY6WoD6NoJyQJLv/z12hBVVNo4r33AZclpWOsQ8/NGXsHSACMS 1mCiiQDYoSlHBPSX2G4m1RBxT2noPUaQ243R+UI+WPnoOe0QaW0kuRBsR jnc5Sy/Ons/1/8J2+9ErbfuTqJSiXi8s1iZ0p/9au3zJLjOqS9WC2zgVo onQJKsWNCfGGNIWG3pM6ANv4UdF+9TpyqKAE7/tcgNHSt5WJuwxWNgfrc ja1G/IkkNLBhjCyqE/uAiDI+iKYUE+hEEWDGeufSs4TcJM0ehiIv6DEb4 Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10197"; a="302362300" X-IronPort-AV: E=Sophos;i="5.88,205,1635231600"; d="scan'208";a="302362300" 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:47 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.88,205,1635231600"; d="scan'208";a="465104081" Received: from silpixa00401120.ir.intel.com ([10.55.129.95]) by orsmga006.jf.intel.com with ESMTP; 14 Dec 2021 06:12:46 -0800 From: Ronan Randles To: dev@dpdk.org Cc: harry.van.haaren@intel.com, Ronan Randles Subject: [PATCH 01/12] net: add string to IPv4 parse function Date: Tue, 14 Dec 2021 14:12:31 +0000 Message-Id: <20211214141242.3383831-2-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 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 Added function that accepts ip string as a parameter and returns an ip address represented by a uint32_t. Relevant unit test for this function is also included. Signed-off-by: Harry van Haaren Signed-off-by: Ronan Randles --- app/test/meson.build | 2 ++ app/test/test_net.c | 61 ++++++++++++++++++++++++++++++++++++++++++++ lib/net/meson.build | 1 + lib/net/rte_ip.c | 43 +++++++++++++++++++++++++++++++ lib/net/rte_ip.h | 18 +++++++++++++ lib/net/version.map | 8 ++++++ 6 files changed, 133 insertions(+) create mode 100644 app/test/test_net.c create mode 100644 lib/net/rte_ip.c diff --git a/app/test/meson.build b/app/test/meson.build index 2b480adfba..4cf540fc74 100644 --- a/app/test/meson.build +++ b/app/test/meson.build @@ -100,6 +100,7 @@ test_sources = files( 'test_meter.c', 'test_mcslock.c', 'test_mp_secondary.c', + 'test_net.c', 'test_per_lcore.c', 'test_pflock.c', 'test_pmd_perf.c', @@ -177,6 +178,7 @@ test_deps = [ 'ipsec', 'lpm', 'member', + 'net', 'node', 'pipeline', 'port', diff --git a/app/test/test_net.c b/app/test/test_net.c new file mode 100644 index 0000000000..2cb7d3e1c9 --- /dev/null +++ b/app/test/test_net.c @@ -0,0 +1,61 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2021 Intel Corporation + */ + +#include +#include + +#include +#include +#include "test.h" + +static int +test_rte_ip_parse_addr(void) +{ + printf("Running IP parsing tests...\n"); + + struct str_ip_t { + const char *str; + uint32_t exp_output; + uint32_t expected_to_fail; + } str_ip_tests[] = { + { .str = "1.2.3.4", .exp_output = RTE_IPV4(1, 2, 3, 4)}, + { .str = "192.168.255.255", .exp_output = + RTE_IPV4(192, 168, 255, 255)}, + { .str = "172.16.0.9", .exp_output = + RTE_IPV4(172, 16, 0, 9)}, + { .str = "1.2.3", .expected_to_fail = 1}, + { .str = "1.2.3.4.5", .expected_to_fail = 1}, + { .str = "fail.1.2.3", .expected_to_fail = 1}, + { .str = "", .expected_to_fail = 1}, + { .str = "1.2.3.fail", .expected_to_fail = 1} + }; + + uint32_t i; + for (i = 0; i < RTE_DIM(str_ip_tests); i++) { + uint32_t test_addr; + int32_t err = rte_ip_parse_addr(str_ip_tests[i].str, + &test_addr); + if (!test_addr) { + if (str_ip_tests[i].expected_to_fail != 1) + return -1; + } + + if (err || test_addr != str_ip_tests[i].exp_output) { + if (str_ip_tests[i].expected_to_fail != 1) + return -1; + } + } + + + return 0; +} + +static int +test_net_tests(void) +{ + int ret = test_rte_ip_parse_addr(); + return ret; +} + +REGISTER_TEST_COMMAND(net_autotest, test_net_tests); diff --git a/lib/net/meson.build b/lib/net/meson.build index e899846578..b2577a7592 100644 --- a/lib/net/meson.build +++ b/lib/net/meson.build @@ -26,6 +26,7 @@ headers = files( sources = files( 'rte_arp.c', 'rte_ether.c', + 'rte_ip.c', 'rte_net.c', 'rte_net_crc.c', ) diff --git a/lib/net/rte_ip.c b/lib/net/rte_ip.c new file mode 100644 index 0000000000..b859dfb640 --- /dev/null +++ b/lib/net/rte_ip.c @@ -0,0 +1,43 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2021 Intel Corporation + */ + +#include +#include + +int32_t +rte_ip_parse_addr(const char *src_ip, uint32_t *output_addr) +{ + int32_t ret = 0; + char *current_position; + + if (src_ip == NULL) + return -1; + + char *tok = strdup(src_ip); + if (tok == NULL) + return -1; + + char *current_digit = strtok_r(tok, ".", ¤t_position); + + *output_addr = 0; + uint32_t i = 0; + while (current_digit) { + uint32_t shift = ((3 - i) * 8); + unsigned long parsed_value = strtoul(current_digit, NULL, 0) + << shift; + + if (parsed_value == 0 && strcmp(current_digit, "0")) + break; + + *output_addr |= parsed_value; + current_digit = strtok_r(NULL, ".", ¤t_position); + i++; + + } + if (i != 4) + return -1; + + free(tok); + return ret; +} diff --git a/lib/net/rte_ip.h b/lib/net/rte_ip.h index c575250852..188054fda4 100644 --- a/lib/net/rte_ip.h +++ b/lib/net/rte_ip.h @@ -426,6 +426,24 @@ rte_ipv4_udptcp_cksum_verify(const struct rte_ipv4_hdr *ipv4_hdr, return 0; } +/** + * IP address parser. + * + * @param src_ip + * The IP address to be parsed. + * @param output_addr + * The array in which the parsed digits will be saved. + * + * @retval 0 + * Success. + * @retval -1 + * Failure due to invalid input arguments. + */ + +__rte_experimental +int32_t +rte_ip_parse_addr(const char *src_ip, uint32_t *output_addr); + /** * IPv6 Header */ diff --git a/lib/net/version.map b/lib/net/version.map index 4f4330d1c4..3e5a307e48 100644 --- a/lib/net/version.map +++ b/lib/net/version.map @@ -12,3 +12,11 @@ DPDK_22 { local: *; }; + +EXPERIMENTAL { + global: + + rte_net_skip_ip6_ext; + rte_ether_unformat_addr; + rte_ip_parse_addr; +};