From patchwork Sun Feb 14 02:16:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Kozlyuk X-Patchwork-Id: 87902 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 2483CA0546; Sun, 14 Feb 2021 03:16:34 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E161B1CC4FA; Sun, 14 Feb 2021 03:16:29 +0100 (CET) Received: from mail-lj1-f179.google.com (mail-lj1-f179.google.com [209.85.208.179]) by mails.dpdk.org (Postfix) with ESMTP id 240921CC4DA for ; Sun, 14 Feb 2021 03:16:28 +0100 (CET) Received: by mail-lj1-f179.google.com with SMTP id k22so3058896ljg.3 for ; Sat, 13 Feb 2021 18:16:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=lqHnc/gk+WRoUiAhgV7JNfW0MR5h6LzcLQ4WRFpUXBA=; b=jYsuPonK3CRNsdMmm03UvxJ/2LHo96w4GqEHYaqKDQCAzbqgiwBlJvDBFUaX4xWAvW ez0XSmFBv440+1m1479nW9rnbjowBpugZMKtxPC+yVV0o9EbRSPsa2CYZlnnQ0ZKSf+k b69AUYnqx1ZwEE3d0qwcdpw9G+8+epUqq9rRbDCaKNG3PsmLr/N+uMJf33UvkMBCCdjV 6FuAHdmfq2f8kjgmG/1QLU57R3otbUSCIZ6/MJTimh30NB9ix2x5KMbgocnf+RPeOGXM K9/BfF4vvcdczOD7JqSgqAEMronCCq1D81jNtHZeiL9iLBLXg7sQ0RgHNKX1FcQpFhYH /Lcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=lqHnc/gk+WRoUiAhgV7JNfW0MR5h6LzcLQ4WRFpUXBA=; b=SN4x4knjCZQm6eRch3vCyKQCib5WgWJv70zhV/AyZxKTVxYDaL379YV/kNtawnCzTl 0eQNZ2TyaARt0cQYcoOWgDdIUvp5VZ5Z+RDQ3+XnD95Ajx22xbSRe5E5XtwmCljxV3iK kyF06Kswweb3rZtLe/N9tIPp2Pd4I4RAmU8oqwGm813HTFJzxfOSxUYiFsiMa1HzaIjS gfIlc3v6YX2WITlYdjf2DKnBlwbQvVpbF2ysoj3eTXzxEs7PD6F8Fl1LkOa1BKh+Xzg/ nVkwxGrBZHdcD5G0I7UeIqROp7iJpZhHLz5qTE3fRJmzIeQIR0ERD6h2PYyNbOTNWf6A 546g== X-Gm-Message-State: AOAM532SuSo9a7mLxa4M45qOKb9AwjfXP3w6U6BBGHadQ7qqRnxs+wlf 8kfxaJHhtrEwd65J/HyhbPJyE1SM70sNtg== X-Google-Smtp-Source: ABdhPJwRTuRvK7SzauoCN1o6qTL30P2GDIDRVm23t8YbCvjEKau7wz9bkOT8BFA2VBLYU5LzCwDidA== X-Received: by 2002:a2e:8005:: with SMTP id j5mr5666453ljg.34.1613268987424; Sat, 13 Feb 2021 18:16:27 -0800 (PST) Received: from localhost.localdomain (broadband-37-110-65-23.ip.moscow.rt.ru. [37.110.65.23]) by smtp.gmail.com with ESMTPSA id l19sm3017158lji.53.2021.02.13.18.16.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Feb 2021 18:16:27 -0800 (PST) From: Dmitry Kozlyuk To: dev@dpdk.org Cc: Tyler Retzlaff , Mike Wells , Dmitry Kozlyuk , Narcisa Ana Maria Vasile , Dmitry Malloy , Pallavi Kadam , Ray Kinsella , Neil Horman Date: Sun, 14 Feb 2021 05:16:11 +0300 Message-Id: <20210214021616.26970-2-dmitry.kozliuk@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210214021616.26970-1-dmitry.kozliuk@gmail.com> References: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> <20210214021616.26970-1-dmitry.kozliuk@gmail.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 1/6] eal: add internal API for current time 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 Sender: "dev" Many PMDs use POSIX gettimeofday(). Add rte_time_get_us() function to obtain current time with microsecond precision on all platforms. Signed-off-by: Dmitry Kozlyuk Acked-by: Nick Connolly Acked-by: Jie Zhou --- lib/librte_eal/include/rte_time.h | 17 +++++++++++++++++ lib/librte_eal/rte_eal_exports.def | 1 + lib/librte_eal/unix/eal_unix_timer.c | 13 +++++++++++++ lib/librte_eal/version.map | 1 + lib/librte_eal/windows/eal_timer.c | 21 ++++++++++++++++++++- 5 files changed, 52 insertions(+), 1 deletion(-) diff --git a/lib/librte_eal/include/rte_time.h b/lib/librte_eal/include/rte_time.h index 5ad7c8841..50fa4f889 100644 --- a/lib/librte_eal/include/rte_time.h +++ b/lib/librte_eal/include/rte_time.h @@ -8,6 +8,8 @@ #include #include +#include + #define NSEC_PER_SEC 1000000000L /** @@ -98,4 +100,19 @@ rte_ns_to_timespec(uint64_t nsec) return ts; } +/* Point of time with microsecond precision. */ +struct rte_time_us { + int64_t sec; /**< Number of whole seconds. */ + int64_t usec; /**< Fractional part of second in [0, 999999]. */ +}; + +/** + * Get current system time. + * + * @param now + * Receives current system time. + */ +__rte_internal +void rte_time_get_us(struct rte_time_us *now); + #endif /* _RTE_TIME_H_ */ diff --git a/lib/librte_eal/rte_eal_exports.def b/lib/librte_eal/rte_eal_exports.def index 474cf123f..cb691f7bc 100644 --- a/lib/librte_eal/rte_eal_exports.def +++ b/lib/librte_eal/rte_eal_exports.def @@ -334,3 +334,4 @@ EXPORTS rte_mem_map rte_mem_page_size rte_mem_unmap + rte_time_get_us diff --git a/lib/librte_eal/unix/eal_unix_timer.c b/lib/librte_eal/unix/eal_unix_timer.c index cc5015910..5612fdebe 100644 --- a/lib/librte_eal/unix/eal_unix_timer.c +++ b/lib/librte_eal/unix/eal_unix_timer.c @@ -4,7 +4,10 @@ #include +#include + #include +#include void rte_delay_us_sleep(unsigned int us) @@ -27,3 +30,13 @@ rte_delay_us_sleep(unsigned int us) ind = 1 - ind; } } + +void +rte_time_get_us(struct rte_time_us *now) +{ + struct timeval sys; + + gettimeofday(&sys, NULL); + now->sec = sys.tv_sec; + now->usec = sys.tv_usec; +} diff --git a/lib/librte_eal/version.map b/lib/librte_eal/version.map index fce90a112..405bed766 100644 --- a/lib/librte_eal/version.map +++ b/lib/librte_eal/version.map @@ -421,4 +421,5 @@ INTERNAL { rte_mem_map; rte_mem_page_size; rte_mem_unmap; + rte_time_get_us; }; diff --git a/lib/librte_eal/windows/eal_timer.c b/lib/librte_eal/windows/eal_timer.c index b070cb775..a5c42106a 100644 --- a/lib/librte_eal/windows/eal_timer.c +++ b/lib/librte_eal/windows/eal_timer.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "eal_private.h" #define US_PER_SEC 1E6 @@ -85,10 +86,28 @@ get_tsc_freq(void) return RTE_ALIGN_MUL_NEAR(tsc_hz, CYC_PER_10MHZ); } - int rte_eal_timer_init(void) { set_tsc_freq(); return 0; } + +void +rte_time_get_us(struct rte_time_us *now) +{ + /* 100ns ticks from 1601-01-01 to 1970-01-01 */ + static const uint64_t EPOCH = 116444736000000000ULL; + static const uint64_t TICKS_PER_USEC = 10; + static const uint64_t USEC_PER_SEC = 1000000; + + FILETIME ft; + uint64_t ticks, sec; + + GetSystemTimePreciseAsFileTime(&ft); + ticks = ((uint64_t)ft.dwHighDateTime << 32) | ft.dwLowDateTime; + ticks -= EPOCH; + sec = ticks / (TICKS_PER_USEC * USEC_PER_SEC); + now->sec = sec; + now->usec = ticks / TICKS_PER_USEC - sec * USEC_PER_SEC; +} From patchwork Sun Feb 14 02:16:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Kozlyuk X-Patchwork-Id: 87903 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 6E673A0546; Sun, 14 Feb 2021 03:16:41 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 494B322A23B; Sun, 14 Feb 2021 03:16:31 +0100 (CET) Received: from mail-lj1-f169.google.com (mail-lj1-f169.google.com [209.85.208.169]) by mails.dpdk.org (Postfix) with ESMTP id DE1531CC4DA; Sun, 14 Feb 2021 03:16:28 +0100 (CET) Received: by mail-lj1-f169.google.com with SMTP id b16so3659563lji.13; Sat, 13 Feb 2021 18:16:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=A/ont9nC0eW4sOkIs2Tqf2yI/p1zWGMzmMgsmqnbb5E=; b=n1aTBnuApFUDzoGzmBMoxpCgq5vxnjlKOMkb9Uoz0YAxoYr9AQs5CWN+iql/WkBbST 2sj3bndhRhiRjex+bdzYvTSU3jKs9csWQDz+cEp6f5YWgoMyA/2ULPt5GBODMVdWSiYo oArxRwX2jjV0M2EsfI3zY/RVDJzEglXL7mUnFrdt8s9RMPUpSGA7Y/0wtWEKx/2zn0ir U3+5T1RLkBilS7Fi+f9caEZau6dxgNrvuSVzg+07v1tcuxok9BZCBPK195cdNWVBMQUv 8Z6pikBNGarQ01p89nBtbM47eccqN1LEMpFswDmvTEATid4L7uVVerB3BtFVTVz0UWZL f8zA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=A/ont9nC0eW4sOkIs2Tqf2yI/p1zWGMzmMgsmqnbb5E=; b=aUh15hrjFBO1xsDeCkwlQPRVTcnppdGM7XaFrfGlsELkpy0U9kSpFALOsbwkQiP4Ww RiD9iWiy8OkRtQNdc9oB+yVHMyGM9CNBnPN9uZlJqG/pK9bFwonj5Qe8KXXse4Sa3ThD ztteeV3IvzFQeTsbZW52npr6oxJJwTqMFC5pW9v77U76tlHiAf7RCyPH22PHcV5Ag6Q6 rEaOGedtj3Xz2/dmQxm5MGMACGACSKX9MXnlBJAvZs5kMcFqFOKu+l5zaOefT/P5h/CX 1aFfOvntg4frkF5M2LuQcvrn3uGUzX6/RQ97eKpFE1kW0iuTqn111d9pZIt+6J8dr55e R22A== X-Gm-Message-State: AOAM531xeS5TeQPX2TYOYHURDSEPyeWD/gaKhgblV+kjam5fZuKDz37O EbbabQb5mVoW/fjxgMSzNB0uvkHnrl4gzg== X-Google-Smtp-Source: ABdhPJz0xXG8xBNX4l/m9f8Pv6smPLJTPLOIwDU2rBjByxgeuD/GpazkEMS+WQwFI4mxwPUjdbyFPg== X-Received: by 2002:a2e:141d:: with SMTP id u29mr3269732ljd.90.1613268988336; Sat, 13 Feb 2021 18:16:28 -0800 (PST) Received: from localhost.localdomain (broadband-37-110-65-23.ip.moscow.rt.ru. [37.110.65.23]) by smtp.gmail.com with ESMTPSA id l19sm3017158lji.53.2021.02.13.18.16.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Feb 2021 18:16:27 -0800 (PST) From: Dmitry Kozlyuk To: dev@dpdk.org Cc: Tyler Retzlaff , Mike Wells , Dmitry Kozlyuk , stable@dpdk.org, Ferruh Yigit Date: Sun, 14 Feb 2021 05:16:12 +0300 Message-Id: <20210214021616.26970-3-dmitry.kozliuk@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210214021616.26970-1-dmitry.kozliuk@gmail.com> References: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> <20210214021616.26970-1-dmitry.kozliuk@gmail.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 2/6] net/pcap: fix format string 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 Sender: "dev" Use PRIu32 for uint32_t (found by -Wformat with Clang on Windows). Fixes: a3f5252e5cbd ("net/pcap: enable infinitely Rx a pcap file") Cc: stable@dpdk.org Signed-off-by: Dmitry Kozlyuk Acked-by: Ferruh Yigit --- drivers/net/pcap/rte_eth_pcap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c index 90f5d75ea..176928da3 100644 --- a/drivers/net/pcap/rte_eth_pcap.c +++ b/drivers/net/pcap/rte_eth_pcap.c @@ -827,7 +827,7 @@ eth_rx_queue_setup(struct rte_eth_dev *dev, pcap_pkt_count = count_packets_in_pcap(pcap, pcap_q); - snprintf(ring_name, sizeof(ring_name), "PCAP_RING%" PRIu16, + snprintf(ring_name, sizeof(ring_name), "PCAP_RING%" PRIu32, ring_number); pcap_q->pkts = rte_ring_create(ring_name, From patchwork Sun Feb 14 02:16:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Kozlyuk X-Patchwork-Id: 87904 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 61C2FA0546; Sun, 14 Feb 2021 03:16:53 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2409322A238; Sun, 14 Feb 2021 03:16:33 +0100 (CET) Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) by mails.dpdk.org (Postfix) with ESMTP id E92A51CC502 for ; Sun, 14 Feb 2021 03:16:29 +0100 (CET) Received: by mail-lf1-f46.google.com with SMTP id z11so5160491lfb.9 for ; Sat, 13 Feb 2021 18:16:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=INuMMPX7mPyXPcRHrhvrdRfHk3dCHnteBdjEwxYTTeQ=; b=Pv6MXs3Onp3tLZQ7lOGUDgdicAHsi3yzWRN1nXu2vKBGcEFLykvC++Ozemm1HmqMX6 PuqdpRbGBdNN5Zh1ADGrjA1EOI2fMbNW5X3QtHh8gfSGB1N7Smyo3pZh0DevK8cHhJnj rY3yb0x5/8rLrMg37ua467WMuLze2yvJl59rZ4JdZ0efOB8bM2hvMT+VEDt5ZMb8iq3g a/USTszMlfvDdAoF2BBezAa5FcWA6iUT9UkPHU4bktoPJIyDcdVgUP/WpKKkD7Q7lHIg COU8dO7+QLPXvbhwcWVjWiJ74+VFXzBXMmTtm/rUqzr6m/iRl4Oha766UhlqLnZ412C7 MZ7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=INuMMPX7mPyXPcRHrhvrdRfHk3dCHnteBdjEwxYTTeQ=; b=GVdnxMFVriaACNN/oRC8kgvfGYfhGcycdAQL6JR/iOKvbuMC1pjvRlfzblAqeJ5EE0 pVFOUi0Q9uTO+V0RpP+Qst3r9RHLF8yGCYyYUzCuEUOznmc1MZfChEuW7bNBeauq53ky K4yYrHBb8jT1LeQSJHil68WcDvZtU01azFmPOGBXbm+i0IAxP0OAlmtj5A7NOUpzOtsQ Zkzh78YdYgYsI6Fa7ComXeHFktrXa4Nskkan9dzgu1Cwc9w2N9nhQ9kvF+CkW584WmQj A60C2YUBmeVhY8VumY3X5wyHvoMRy5osoTcXKIRd5I6TqzfmQnV27ooH8NPfkx9p5GZJ 2PzA== X-Gm-Message-State: AOAM5325vIjkAEDO4BC5kEJdlhX/EZ/KM37Gbqwm9WQ7KwD5Ki6trBZt 2zbu1WHyXlwTkKB5JtJEenx+9rLqa47hHg== X-Google-Smtp-Source: ABdhPJxEpLhRokK8E6vmCCB1JddfTaPbTrBfznuWqGHikDRaedbZGGtSLOuDbQ4ua89eQsphfr+ynQ== X-Received: by 2002:a05:6512:33c2:: with SMTP id d2mr4350984lfg.429.1613268989245; Sat, 13 Feb 2021 18:16:29 -0800 (PST) Received: from localhost.localdomain (broadband-37-110-65-23.ip.moscow.rt.ru. [37.110.65.23]) by smtp.gmail.com with ESMTPSA id l19sm3017158lji.53.2021.02.13.18.16.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Feb 2021 18:16:28 -0800 (PST) From: Dmitry Kozlyuk To: dev@dpdk.org Cc: Tyler Retzlaff , Mike Wells , Dmitry Kozlyuk , Ferruh Yigit Date: Sun, 14 Feb 2021 05:16:13 +0300 Message-Id: <20210214021616.26970-4-dmitry.kozliuk@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210214021616.26970-1-dmitry.kozliuk@gmail.com> References: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> <20210214021616.26970-1-dmitry.kozliuk@gmail.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 3/6] net/pcap: move OS-dependent code to separate files 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 Sender: "dev" PCAP PMD queries interface information differently for Linux and FreeBSD, OS-specific code is guarded by #ifdef. In preparation to add Windows-specific part and libpcap wrapper, extract OS-independent interface and move implementations to separate files. Rename rte_eth_pcap.c to pcap_ethdev.c for consistency with the rest of DPDK. Signed-off-by: Dmitry Kozlyuk Reviewed-by: Ferruh Yigit --- drivers/net/pcap/meson.build | 5 +- .../pcap/{rte_eth_pcap.c => pcap_ethdev.c} | 88 ++----------------- drivers/net/pcap/pcap_osdep.h | 17 ++++ drivers/net/pcap/pcap_osdep_freebsd.c | 59 +++++++++++++ drivers/net/pcap/pcap_osdep_linux.c | 42 +++++++++ 5 files changed, 130 insertions(+), 81 deletions(-) rename drivers/net/pcap/{rte_eth_pcap.c => pcap_ethdev.c} (95%) create mode 100644 drivers/net/pcap/pcap_osdep.h create mode 100644 drivers/net/pcap/pcap_osdep_freebsd.c create mode 100644 drivers/net/pcap/pcap_osdep_linux.c diff --git a/drivers/net/pcap/meson.build b/drivers/net/pcap/meson.build index b65d91e70..26b606699 100644 --- a/drivers/net/pcap/meson.build +++ b/drivers/net/pcap/meson.build @@ -11,5 +11,8 @@ if not dpdk_conf.has('RTE_PORT_PCAP') build = false reason = 'missing dependency, "libpcap"' endif -sources = files('rte_eth_pcap.c') +sources = files( + 'pcap_ethdev.c', + 'pcap_osdep_@0@.c'.format(exec_env), +) ext_deps += pcap_dep diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/pcap_ethdev.c similarity index 95% rename from drivers/net/pcap/rte_eth_pcap.c rename to drivers/net/pcap/pcap_ethdev.c index 176928da3..a102897e9 100644 --- a/drivers/net/pcap/rte_eth_pcap.c +++ b/drivers/net/pcap/pcap_ethdev.c @@ -6,16 +6,6 @@ #include -#include -#include -#include -#include - -#if defined(RTE_EXEC_ENV_FREEBSD) -#include -#include -#endif - #include #include @@ -25,7 +15,8 @@ #include #include #include -#include + +#include "pcap_osdep.h" #define RTE_ETH_PCAP_SNAPSHOT_LEN 65535 #define RTE_ETH_PCAP_SNAPLEN RTE_ETHER_MAX_JUMBO_FRAME_LEN @@ -1191,84 +1182,20 @@ static int eth_pcap_update_mac(const char *if_name, struct rte_eth_dev *eth_dev, const unsigned int numa_node) { -#if defined(RTE_EXEC_ENV_LINUX) void *mac_addrs; - struct ifreq ifr; - int if_fd = socket(AF_INET, SOCK_DGRAM, 0); - - if (if_fd == -1) - return -1; + struct rte_ether_addr mac; - rte_strscpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name)); - if (ioctl(if_fd, SIOCGIFHWADDR, &ifr)) { - close(if_fd); + if (osdep_iface_mac_get(if_name, &mac) < 0) return -1; - } mac_addrs = rte_zmalloc_socket(NULL, RTE_ETHER_ADDR_LEN, 0, numa_node); - if (!mac_addrs) { - close(if_fd); + if (mac_addrs == NULL) return -1; - } PMD_LOG(INFO, "Setting phy MAC for %s", if_name); + rte_memcpy(mac_addrs, mac.addr_bytes, RTE_ETHER_ADDR_LEN); eth_dev->data->mac_addrs = mac_addrs; - rte_memcpy(eth_dev->data->mac_addrs[0].addr_bytes, - ifr.ifr_hwaddr.sa_data, RTE_ETHER_ADDR_LEN); - - close(if_fd); - - return 0; - -#elif defined(RTE_EXEC_ENV_FREEBSD) - void *mac_addrs; - struct if_msghdr *ifm; - struct sockaddr_dl *sdl; - int mib[6]; - size_t len = 0; - char *buf; - - mib[0] = CTL_NET; - mib[1] = AF_ROUTE; - mib[2] = 0; - mib[3] = AF_LINK; - mib[4] = NET_RT_IFLIST; - mib[5] = if_nametoindex(if_name); - - if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) - return -1; - - if (len == 0) - return -1; - - buf = rte_malloc(NULL, len, 0); - if (!buf) - return -1; - - if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) { - rte_free(buf); - return -1; - } - ifm = (struct if_msghdr *)buf; - sdl = (struct sockaddr_dl *)(ifm + 1); - - mac_addrs = rte_zmalloc_socket(NULL, RTE_ETHER_ADDR_LEN, 0, numa_node); - if (!mac_addrs) { - rte_free(buf); - return -1; - } - - PMD_LOG(INFO, "Setting phy MAC for %s", if_name); - eth_dev->data->mac_addrs = mac_addrs; - rte_memcpy(eth_dev->data->mac_addrs[0].addr_bytes, - LLADDR(sdl), RTE_ETHER_ADDR_LEN); - - rte_free(buf); - return 0; -#else - return -1; -#endif } static int @@ -1330,7 +1257,8 @@ eth_from_pcaps(struct rte_vdev_device *vdev, internals->single_iface = single_iface; if (single_iface) { - internals->if_index = if_nametoindex(rx_queues->queue[0].name); + internals->if_index = + osdep_iface_index_get(rx_queues->queue[0].name); /* phy_mac arg is applied only only if "iface" devarg is provided */ if (rx_queues->phy_mac) { diff --git a/drivers/net/pcap/pcap_osdep.h b/drivers/net/pcap/pcap_osdep.h new file mode 100644 index 000000000..46810d86f --- /dev/null +++ b/drivers/net/pcap/pcap_osdep.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2021 Dmitry Kozlyuk + */ + +#ifndef _RTE_PCAP_OSDEP_ +#define _RTE_PCAP_OSDEP_ + +#include + +/* + * Interface manipulation is always OS-specific. + */ + +int osdep_iface_index_get(const char *name); +int osdep_iface_mac_get(const char *name, struct rte_ether_addr *mac); + +#endif diff --git a/drivers/net/pcap/pcap_osdep_freebsd.c b/drivers/net/pcap/pcap_osdep_freebsd.c new file mode 100644 index 000000000..20556b3e9 --- /dev/null +++ b/drivers/net/pcap/pcap_osdep_freebsd.c @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2016 Intel Corporation. + * Copyright(c) 2014 6WIND S.A. + * All rights reserved. + */ + +#include +#include +#include + +#include +#include + +#include "pcap_osdep.h" + +int +osdep_iface_index_get(const char *name) +{ + return if_nametoindex(name); +} + +int +osdep_iface_mac_get(const char *if_name, struct rte_ether_addr *mac) +{ + struct if_msghdr *ifm; + struct sockaddr_dl *sdl; + int mib[6]; + size_t len = 0; + char *buf; + + mib[0] = CTL_NET; + mib[1] = AF_ROUTE; + mib[2] = 0; + mib[3] = AF_LINK; + mib[4] = NET_RT_IFLIST; + mib[5] = if_nametoindex(if_name); + + if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) + return -1; + + if (len == 0) + return -1; + + buf = rte_malloc(NULL, len, 0); + if (!buf) + return -1; + + if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) { + rte_free(buf); + return -1; + } + ifm = (struct if_msghdr *)buf; + sdl = (struct sockaddr_dl *)(ifm + 1); + + rte_memcpy(mac->addr_bytes, LLADDR(sdl), RTE_ETHER_ADDR_LEN); + + rte_free(buf); + return 0; +} diff --git a/drivers/net/pcap/pcap_osdep_linux.c b/drivers/net/pcap/pcap_osdep_linux.c new file mode 100644 index 000000000..97033f57c --- /dev/null +++ b/drivers/net/pcap/pcap_osdep_linux.c @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2016 Intel Corporation. + * Copyright(c) 2014 6WIND S.A. + * All rights reserved. + */ + +#include +#include +#include +#include + +#include +#include + +#include "pcap_osdep.h" + +int +osdep_iface_index_get(const char *name) +{ + return if_nametoindex(name); +} + +int +osdep_iface_mac_get(const char *if_name, struct rte_ether_addr *mac) +{ + struct ifreq ifr; + int if_fd = socket(AF_INET, SOCK_DGRAM, 0); + + if (if_fd == -1) + return -1; + + rte_strscpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name)); + if (ioctl(if_fd, SIOCGIFHWADDR, &ifr)) { + close(if_fd); + return -1; + } + + rte_memcpy(mac->addr_bytes, ifr.ifr_hwaddr.sa_data, RTE_ETHER_ADDR_LEN); + + close(if_fd); + return 0; +} From patchwork Sun Feb 14 02:16:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Kozlyuk X-Patchwork-Id: 87905 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 61E8EA0546; Sun, 14 Feb 2021 03:17:02 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7121D22A247; Sun, 14 Feb 2021 03:16:34 +0100 (CET) Received: from mail-lj1-f175.google.com (mail-lj1-f175.google.com [209.85.208.175]) by mails.dpdk.org (Postfix) with ESMTP id 29BF422A1FA for ; Sun, 14 Feb 2021 03:16:31 +0100 (CET) Received: by mail-lj1-f175.google.com with SMTP id e17so3695945ljl.8 for ; Sat, 13 Feb 2021 18:16:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=yomGuCJWW0fAlEWEyNq4xm4hvoYWH7DBpIyrckA/Xdc=; b=q/sqgxc3uElmF56qxFEPFA6HfnQGjlvgmsCBYCtXXdgkWWHPZfx1hpsAuSSPAuNFSM pd/w028qyFJ9uq8WRAzDLeE93cs4Ade825mZlcq6FIeeAc8/IzvywbaiROZRil7LxLNB AX4mRUgVhc8fFVQOXANXFUAtkD24m0bnc8ZZ7GCY8E34G/nV971uTuGSAPDjv9O0tOQc 1F6ttKTbZOmdgkdj3kjU4ccA8S0jA7jeGzStlZORioljOR/jHzaQWaquTDpG3oJawlHF iukRyfRugSut5HaUbhy4ILVg+nZuutLucw8TDaKn42PdQicOlXxH2uiEXo0KpgM6kpqa wYug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=yomGuCJWW0fAlEWEyNq4xm4hvoYWH7DBpIyrckA/Xdc=; b=VzuNTGfoD97qBOQIn0StR/vmLpRQ7ThlN+Uk5FRO2aM+77Qg7z7miAHGiqv2Kvlgy5 bBV6Q5XfprIY142lN7KWMWu88GP40lSfNmUTMjbtrXV+EKl7nFQT/GzFpTKYfC/Lz80f bi0agKbaksuAS9LbJp4wKMpchZBZgqAZUeNSwM33SMPA9T7pAdRFC+9tBdcOhJcBaVEC 7KtNYR6aJHwbI8Ii52tpF78wy/kBAJo1e8sa0s10RYgByflOVi9EfU8uqbxWSMDa45C+ zwFxnzSd51h0Al2QiUYPwQQVwAmfRRymn00IxDJF04FZL30woRsyeRJ75SkcKq9QPsE7 vtRQ== X-Gm-Message-State: AOAM5311HTEyTyO2qN8zcAxgdGNAB9uKKpTRcp8GMjZxX6oFkBfIuFfo RMi6C2QW+7RtGSBRekARvkJgEPKNJmKU+w== X-Google-Smtp-Source: ABdhPJwaihpByt45JE0gRJ6xtm/nnp6iUkGX1M5KMaLbu0xm+mjquuCepyiqCstQRCnE3KysX+z6Ng== X-Received: by 2002:a05:651c:1352:: with SMTP id j18mr5686284ljb.175.1613268990294; Sat, 13 Feb 2021 18:16:30 -0800 (PST) Received: from localhost.localdomain (broadband-37-110-65-23.ip.moscow.rt.ru. [37.110.65.23]) by smtp.gmail.com with ESMTPSA id l19sm3017158lji.53.2021.02.13.18.16.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Feb 2021 18:16:29 -0800 (PST) From: Dmitry Kozlyuk To: dev@dpdk.org Cc: Tyler Retzlaff , Mike Wells , Dmitry Kozlyuk , Ferruh Yigit Date: Sun, 14 Feb 2021 05:16:14 +0300 Message-Id: <20210214021616.26970-5-dmitry.kozliuk@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210214021616.26970-1-dmitry.kozliuk@gmail.com> References: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> <20210214021616.26970-1-dmitry.kozliuk@gmail.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 4/6] net/pcap: add libpcap wrappers 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 Sender: "dev" libpcap headers can expose OS headers. On Windows, system networking headers are incompatible with DPDK ones, causing multiple name clashes. API of libpcap itself involves a non-standard u_char type. Add a limited set of trivial libpcap wrappers, so that libpcap headers are not included directly by OS-independent PMD code. Use EAL types and functions for time instead of POSIX ones. Signed-off-by: Dmitry Kozlyuk --- drivers/net/pcap/meson.build | 1 + drivers/net/pcap/pcap_ethdev.c | 157 +++++++++++++++++---------------- drivers/net/pcap/pcap_osdep.c | 122 +++++++++++++++++++++++++ drivers/net/pcap/pcap_osdep.h | 50 +++++++++++ 4 files changed, 252 insertions(+), 78 deletions(-) create mode 100644 drivers/net/pcap/pcap_osdep.c diff --git a/drivers/net/pcap/meson.build b/drivers/net/pcap/meson.build index 26b606699..9ab95ec3e 100644 --- a/drivers/net/pcap/meson.build +++ b/drivers/net/pcap/meson.build @@ -13,6 +13,7 @@ if not dpdk_conf.has('RTE_PORT_PCAP') endif sources = files( 'pcap_ethdev.c', + 'pcap_osdep.c', 'pcap_osdep_@0@.c'.format(exec_env), ) ext_deps += pcap_dep diff --git a/drivers/net/pcap/pcap_ethdev.c b/drivers/net/pcap/pcap_ethdev.c index a102897e9..6461213e0 100644 --- a/drivers/net/pcap/pcap_ethdev.c +++ b/drivers/net/pcap/pcap_ethdev.c @@ -4,17 +4,13 @@ * All rights reserved. */ -#include - -#include - -#include #include #include +#include +#include #include #include #include -#include #include "pcap_osdep.h" @@ -36,8 +32,8 @@ #define RTE_PMD_PCAP_MAX_QUEUES 16 -static char errbuf[PCAP_ERRBUF_SIZE]; -static struct timeval start_time; +static char errbuf[OSDEP_PCAP_ERRBUF_SIZE]; +static struct rte_time_us start_time; static uint64_t start_cycles; static uint64_t hz; static uint8_t iface_idx; @@ -83,16 +79,16 @@ struct pmd_internals { }; struct pmd_process_private { - pcap_t *rx_pcap[RTE_PMD_PCAP_MAX_QUEUES]; - pcap_t *tx_pcap[RTE_PMD_PCAP_MAX_QUEUES]; - pcap_dumper_t *tx_dumper[RTE_PMD_PCAP_MAX_QUEUES]; + osdep_pcap * rx_pcap[RTE_PMD_PCAP_MAX_QUEUES]; + osdep_pcap * tx_pcap[RTE_PMD_PCAP_MAX_QUEUES]; + osdep_pcap_dumper * tx_dumper[RTE_PMD_PCAP_MAX_QUEUES]; }; struct pmd_devargs { unsigned int num_of_queue; struct devargs_queue { - pcap_dumper_t *dumper; - pcap_t *pcap; + osdep_pcap_dumper *dumper; + osdep_pcap *pcap; const char *name; const char *type; } queue[RTE_PMD_PCAP_MAX_QUEUES]; @@ -137,7 +133,7 @@ RTE_LOG_REGISTER(eth_pcap_logtype, pmd.net.pcap, NOTICE); static int eth_pcap_rx_jumbo(struct rte_mempool *mb_pool, struct rte_mbuf *mbuf, - const u_char *data, uint16_t data_len) + const uint8_t *data, uint16_t data_len) { /* Copy the first segment. */ uint16_t len = rte_pktmbuf_tailroom(mbuf); @@ -214,14 +210,14 @@ static uint16_t eth_pcap_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) { unsigned int i; - struct pcap_pkthdr header; + struct osdep_pcap_pkthdr header; struct pmd_process_private *pp; - const u_char *packet; + const uint8_t *packet; struct rte_mbuf *mbuf; struct pcap_rx_queue *pcap_q = queue; uint16_t num_rx = 0; uint32_t rx_bytes = 0; - pcap_t *pcap; + osdep_pcap *pcap; pp = rte_eth_devices[pcap_q->port_id].process_private; pcap = pp->rx_pcap[pcap_q->queue_id]; @@ -234,7 +230,7 @@ eth_pcap_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) */ for (i = 0; i < nb_pkts; i++) { /* Get the next PCAP packet */ - packet = pcap_next(pcap, &header); + packet = osdep_pcap_next(pcap, &header); if (unlikely(packet == NULL)) break; @@ -261,8 +257,8 @@ eth_pcap_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) mbuf->pkt_len = (uint16_t)header.caplen; *RTE_MBUF_DYNFIELD(mbuf, timestamp_dynfield_offset, rte_mbuf_timestamp_t *) = - (uint64_t)header.ts.tv_sec * 1000000 + - header.ts.tv_usec; + (uint64_t)header.ts.sec * 1000000 + + header.ts.usec; mbuf->ol_flags |= timestamp_rx_dynflag; mbuf->port = pcap_q->port_id; bufs[num_rx] = mbuf; @@ -285,20 +281,24 @@ eth_null_rx(void *queue __rte_unused, #define NSEC_PER_SEC 1000000000L +/* + * This function stores nanoseconds in "usec" field of struct rte_time_us, + * because "ts" goes directly to nanosecond-precision dump. + */ static inline void -calculate_timestamp(struct timeval *ts) { +calculate_timestamp(struct rte_time_us *ts) { uint64_t cycles; - struct timeval cur_time; + struct rte_time_us cur_time; cycles = rte_get_timer_cycles() - start_cycles; - cur_time.tv_sec = cycles / hz; - cur_time.tv_usec = (cycles % hz) * NSEC_PER_SEC / hz; - - ts->tv_sec = start_time.tv_sec + cur_time.tv_sec; - ts->tv_usec = start_time.tv_usec + cur_time.tv_usec; - if (ts->tv_usec >= NSEC_PER_SEC) { - ts->tv_usec -= NSEC_PER_SEC; - ts->tv_sec += 1; + cur_time.sec = cycles / hz; + cur_time.usec = (cycles % hz) * NSEC_PER_SEC / hz; + + ts->sec = start_time.sec + cur_time.sec; + ts->usec = start_time.usec + cur_time.usec; + if (ts->usec >= NSEC_PER_SEC) { + ts->usec -= NSEC_PER_SEC; + ts->sec += 1; } } @@ -314,8 +314,8 @@ eth_pcap_tx_dumper(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) struct pcap_tx_queue *dumper_q = queue; uint16_t num_tx = 0; uint32_t tx_bytes = 0; - struct pcap_pkthdr header; - pcap_dumper_t *dumper; + struct osdep_pcap_pkthdr header; + osdep_pcap_dumper *dumper; unsigned char temp_data[RTE_ETH_PCAP_SNAPLEN]; size_t len, caplen; @@ -342,7 +342,7 @@ eth_pcap_tx_dumper(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) * in the mbuf (when the mbuf is contiguous) or, otherwise, * a pointer to temp_data after copying into it. */ - pcap_dump((u_char *)dumper, &header, + osdep_pcap_dump((uint8_t *)dumper, &header, rte_pktmbuf_read(mbuf, 0, caplen, temp_data)); num_tx++; @@ -355,7 +355,7 @@ eth_pcap_tx_dumper(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) * process stops and to make sure the pcap file is actually written, * we flush the pcap dumper within each burst. */ - pcap_dump_flush(dumper); + osdep_pcap_dump_flush(dumper); dumper_q->tx_stat.pkts += num_tx; dumper_q->tx_stat.bytes += tx_bytes; dumper_q->tx_stat.err_pkts += nb_pkts - num_tx; @@ -400,7 +400,7 @@ eth_pcap_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) struct pcap_tx_queue *tx_queue = queue; uint16_t num_tx = 0; uint32_t tx_bytes = 0; - pcap_t *pcap; + osdep_pcap *pcap; unsigned char temp_data[RTE_ETH_PCAP_SNAPLEN]; size_t len; @@ -426,7 +426,7 @@ eth_pcap_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) * in the mbuf (when the mbuf is contiguous) or, otherwise, * a pointer to temp_data after copying into it. */ - ret = pcap_sendpacket(pcap, + ret = osdep_pcap_sendpacket(pcap, rte_pktmbuf_read(mbuf, 0, len, temp_data), len); if (unlikely(ret != 0)) break; @@ -443,11 +443,11 @@ eth_pcap_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) } /* - * pcap_open_live wrapper function + * osdep_pcap_open_live wrapper function */ static inline int -open_iface_live(const char *iface, pcap_t **pcap) { - *pcap = pcap_open_live(iface, RTE_ETH_PCAP_SNAPLEN, +open_iface_live(const char *iface, osdep_pcap **pcap) { + *pcap = osdep_pcap_open_live(iface, RTE_ETH_PCAP_SNAPLEN, RTE_ETH_PCAP_PROMISC, RTE_ETH_PCAP_TIMEOUT, errbuf); if (*pcap == NULL) { @@ -459,7 +459,7 @@ open_iface_live(const char *iface, pcap_t **pcap) { } static int -open_single_iface(const char *iface, pcap_t **pcap) +open_single_iface(const char *iface, osdep_pcap **pcap) { if (open_iface_live(iface, pcap) < 0) { PMD_LOG(ERR, "Couldn't open interface %s", iface); @@ -470,39 +470,39 @@ open_single_iface(const char *iface, pcap_t **pcap) } static int -open_single_tx_pcap(const char *pcap_filename, pcap_dumper_t **dumper) +open_single_tx_pcap(const char *pcap_filename, osdep_pcap_dumper **dumper) { - pcap_t *tx_pcap; + osdep_pcap *tx_pcap; /* - * We need to create a dummy empty pcap_t to use it - * with pcap_dump_open(). We create big enough an Ethernet + * We need to create a dummy empty osdep_pcap to use it + * with osdep_pcap_dump_open(). We create big enough an Ethernet * pcap holder. */ - tx_pcap = pcap_open_dead_with_tstamp_precision(DLT_EN10MB, - RTE_ETH_PCAP_SNAPSHOT_LEN, PCAP_TSTAMP_PRECISION_NANO); + tx_pcap = osdep_pcap_open_dead_with_tstamp_precision(OSDEP_DLT_EN10MB, + RTE_ETH_PCAP_SNAPSHOT_LEN, OSDEP_PCAP_TSTAMP_PRECISION_NANO); if (tx_pcap == NULL) { PMD_LOG(ERR, "Couldn't create dead pcap"); return -1; } - /* The dumper is created using the previous pcap_t reference */ - *dumper = pcap_dump_open(tx_pcap, pcap_filename); + /* The dumper is created using the previous osdep_pcap reference */ + *dumper = osdep_pcap_dump_open(tx_pcap, pcap_filename); if (*dumper == NULL) { - pcap_close(tx_pcap); + osdep_pcap_close(tx_pcap); PMD_LOG(ERR, "Couldn't open %s for writing.", pcap_filename); return -1; } - pcap_close(tx_pcap); + osdep_pcap_close(tx_pcap); return 0; } static int -open_single_rx_pcap(const char *pcap_filename, pcap_t **pcap) +open_single_rx_pcap(const char *pcap_filename, osdep_pcap **pcap) { - *pcap = pcap_open_offline(pcap_filename, errbuf); + *pcap = osdep_pcap_open_offline(pcap_filename, errbuf); if (*pcap == NULL) { PMD_LOG(ERR, "Couldn't open %s: %s", pcap_filename, errbuf); @@ -513,17 +513,17 @@ open_single_rx_pcap(const char *pcap_filename, pcap_t **pcap) } static uint64_t -count_packets_in_pcap(pcap_t **pcap, struct pcap_rx_queue *pcap_q) +count_packets_in_pcap(osdep_pcap **pcap, struct pcap_rx_queue *pcap_q) { - const u_char *packet; - struct pcap_pkthdr header; + const uint8_t *packet; + struct osdep_pcap_pkthdr header; uint64_t pcap_pkt_count = 0; - while ((packet = pcap_next(*pcap, &header))) + while ((packet = osdep_pcap_next(*pcap, &header))) pcap_pkt_count++; /* The pcap is reopened so it can be used as normal later. */ - pcap_close(*pcap); + osdep_pcap_close(*pcap); *pcap = NULL; open_single_rx_pcap(pcap_q->name, pcap); @@ -612,7 +612,7 @@ eth_dev_stop(struct rte_eth_dev *dev) /* Special iface case. Single pcap is open and shared between tx/rx. */ if (internals->single_iface) { - pcap_close(pp->tx_pcap[0]); + osdep_pcap_close(pp->tx_pcap[0]); pp->tx_pcap[0] = NULL; pp->rx_pcap[0] = NULL; goto status_down; @@ -620,19 +620,19 @@ eth_dev_stop(struct rte_eth_dev *dev) for (i = 0; i < dev->data->nb_tx_queues; i++) { if (pp->tx_dumper[i] != NULL) { - pcap_dump_close(pp->tx_dumper[i]); + osdep_pcap_dump_close(pp->tx_dumper[i]); pp->tx_dumper[i] = NULL; } if (pp->tx_pcap[i] != NULL) { - pcap_close(pp->tx_pcap[i]); + osdep_pcap_close(pp->tx_pcap[i]); pp->tx_pcap[i] = NULL; } } for (i = 0; i < dev->data->nb_rx_queues; i++) { if (pp->rx_pcap[i] != NULL) { - pcap_close(pp->rx_pcap[i]); + osdep_pcap_close(pp->rx_pcap[i]); pp->rx_pcap[i] = NULL; } } @@ -804,11 +804,11 @@ eth_rx_queue_setup(struct rte_eth_dev *dev, if (internals->infinite_rx) { struct pmd_process_private *pp; - char ring_name[NAME_MAX]; + char ring_name[RTE_RING_NAMESIZE]; static uint32_t ring_number; uint64_t pcap_pkt_count = 0; struct rte_mbuf *bufs[1]; - pcap_t **pcap; + osdep_pcap **pcap; pp = rte_eth_devices[pcap_q->port_id].process_private; pcap = &pp->rx_pcap[pcap_q->queue_id]; @@ -932,7 +932,7 @@ static const struct eth_dev_ops ops = { static int add_queue(struct pmd_devargs *pmd, const char *name, const char *type, - pcap_t *pcap, pcap_dumper_t *dumper) + osdep_pcap *pcap, osdep_pcap_dumper *dumper) { if (pmd->num_of_queue >= RTE_PMD_PCAP_MAX_QUEUES) return -1; @@ -955,13 +955,13 @@ open_rx_pcap(const char *key, const char *value, void *extra_args) { const char *pcap_filename = value; struct pmd_devargs *rx = extra_args; - pcap_t *pcap = NULL; + osdep_pcap *pcap = NULL; if (open_single_rx_pcap(pcap_filename, &pcap) < 0) return -1; if (add_queue(rx, pcap_filename, key, pcap, NULL) < 0) { - pcap_close(pcap); + osdep_pcap_close(pcap); return -1; } @@ -977,13 +977,13 @@ open_tx_pcap(const char *key, const char *value, void *extra_args) { const char *pcap_filename = value; struct pmd_devargs *dumpers = extra_args; - pcap_dumper_t *dumper; + osdep_pcap_dumper *dumper; if (open_single_tx_pcap(pcap_filename, &dumper) < 0) return -1; if (add_queue(dumpers, pcap_filename, key, NULL, dumper) < 0) { - pcap_dump_close(dumper); + osdep_pcap_dump_close(dumper); return -1; } @@ -998,7 +998,7 @@ open_rx_tx_iface(const char *key, const char *value, void *extra_args) { const char *iface = value; struct pmd_devargs *tx = extra_args; - pcap_t *pcap = NULL; + osdep_pcap *pcap = NULL; if (open_single_iface(iface, &pcap) < 0) return -1; @@ -1011,13 +1011,14 @@ open_rx_tx_iface(const char *key, const char *value, void *extra_args) } static inline int -set_iface_direction(const char *iface, pcap_t *pcap, - pcap_direction_t direction) +set_iface_direction(const char *iface, osdep_pcap *pcap, + enum osdep_pcap_direction direction) { - const char *direction_str = (direction == PCAP_D_IN) ? "IN" : "OUT"; - if (pcap_setdirection(pcap, direction) < 0) { + const char *direction_str = + (direction == OSDEP_PCAP_D_IN) ? "IN" : "OUT"; + if (osdep_pcap_setdirection(pcap, direction) < 0) { PMD_LOG(ERR, "Setting %s pcap direction %s failed - %s\n", - iface, direction_str, pcap_geterr(pcap)); + iface, direction_str, osdep_pcap_geterr(pcap)); return -1; } PMD_LOG(INFO, "Setting %s pcap direction %s\n", @@ -1030,12 +1031,12 @@ open_iface(const char *key, const char *value, void *extra_args) { const char *iface = value; struct pmd_devargs *pmd = extra_args; - pcap_t *pcap = NULL; + osdep_pcap *pcap = NULL; if (open_single_iface(iface, &pcap) < 0) return -1; if (add_queue(pmd, iface, key, pcap, NULL) < 0) { - pcap_close(pcap); + osdep_pcap_close(pcap); return -1; } @@ -1057,7 +1058,7 @@ open_rx_iface(const char *key, const char *value, void *extra_args) set_iface_direction(pmd->queue[qid].name, pmd->queue[qid].pcap, - PCAP_D_IN); + OSDEP_PCAP_D_IN); } return 0; @@ -1311,7 +1312,7 @@ pmd_pcap_probe(struct rte_vdev_device *dev) name = rte_vdev_device_name(dev); PMD_LOG(INFO, "Initializing pmd_pcap for %s", name); - gettimeofday(&start_time, NULL); + rte_time_get_us(&start_time); start_cycles = rte_get_timer_cycles(); hz = rte_get_timer_hz(); diff --git a/drivers/net/pcap/pcap_osdep.c b/drivers/net/pcap/pcap_osdep.c new file mode 100644 index 000000000..5cac9bb89 --- /dev/null +++ b/drivers/net/pcap/pcap_osdep.c @@ -0,0 +1,122 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2021 Dmitry Kozlyuk + */ + +#include + +#include + +#include "pcap_osdep.h" + +static inline void +to_osdep_header(const struct pcap_pkthdr *in, struct osdep_pcap_pkthdr *out) +{ + out->ts.sec = in->ts.tv_sec; + out->ts.usec = in->ts.tv_usec; + out->caplen = in->caplen; + out->len = in->len; +} + +static inline void +to_pcap_header(const struct osdep_pcap_pkthdr *in, struct pcap_pkthdr *out) +{ + out->ts.tv_sec = in->ts.sec; + out->ts.tv_usec = in->ts.usec; + out->caplen = in->caplen; + out->len = in->len; +} + +osdep_pcap * +osdep_pcap_open_live(const char *device, int snaplen, + int promisc, int to_ms, char *errbuf) +{ + RTE_BUILD_BUG_ON(OSDEP_PCAP_ERRBUF_SIZE != PCAP_ERRBUF_SIZE); + + return (osdep_pcap *)pcap_open_live(device, snaplen, promisc, to_ms, + errbuf); +} + +osdep_pcap * +osdep_pcap_open_offline(const char *fname, char *errbuf) +{ + return (osdep_pcap *)pcap_open_offline(fname, errbuf); +} + +osdep_pcap * +osdep_pcap_open_dead_with_tstamp_precision(int linktype, int snaplen, + unsigned int precision) +{ + RTE_BUILD_BUG_ON(OSDEP_DLT_EN10MB != DLT_EN10MB); + RTE_BUILD_BUG_ON(OSDEP_PCAP_TSTAMP_PRECISION_NANO != + PCAP_TSTAMP_PRECISION_NANO); + + return (osdep_pcap *)pcap_open_dead_with_tstamp_precision(linktype, + snaplen, precision); +} + +const uint8_t * +osdep_pcap_next(osdep_pcap *pcap, struct osdep_pcap_pkthdr *header) +{ + const uint8_t *data; + struct pcap_pkthdr pkthdr; + + data = pcap_next((pcap_t *)pcap, &pkthdr); + to_osdep_header(&pkthdr, header); + return data; +} + +int +osdep_pcap_sendpacket(osdep_pcap *pcap, const uint8_t *buf, int size) +{ + return pcap_sendpacket((pcap_t *)pcap, buf, size); +} + +void +osdep_pcap_close(osdep_pcap *pcap) +{ + pcap_close((pcap_t *)pcap); +} + +osdep_pcap_dumper * +osdep_pcap_dump_open(osdep_pcap *pcap, const char *fname) +{ + return (osdep_pcap_dumper *)pcap_dump_open((pcap_t *)pcap, fname); +} + +void +osdep_pcap_dump(uint8_t *user, const struct osdep_pcap_pkthdr *header, + const uint8_t *sp) +{ + struct pcap_pkthdr pkthdr; + + to_pcap_header(header, &pkthdr); + pcap_dump(user, &pkthdr, sp); +} + +int +osdep_pcap_dump_flush(osdep_pcap_dumper *p) +{ + return pcap_dump_flush((pcap_dumper_t *)p); +} + +void +osdep_pcap_dump_close(osdep_pcap_dumper *p) +{ + pcap_dump_close((pcap_dumper_t *)p); +} + +int +osdep_pcap_setdirection(osdep_pcap *pcap, enum osdep_pcap_direction dir) +{ + RTE_BUILD_BUG_ON((int)OSDEP_PCAP_D_INOUT != (int)PCAP_D_INOUT); + RTE_BUILD_BUG_ON((int)OSDEP_PCAP_D_IN != (int)PCAP_D_IN); + RTE_BUILD_BUG_ON((int)OSDEP_PCAP_D_OUT != (int)PCAP_D_OUT); + + return pcap_setdirection((pcap_t *)pcap, (pcap_direction_t)dir); +} + +const char * +osdep_pcap_geterr(osdep_pcap *pcap) +{ + return pcap_geterr((pcap_t *)pcap); +} diff --git a/drivers/net/pcap/pcap_osdep.h b/drivers/net/pcap/pcap_osdep.h index 46810d86f..bd00b728a 100644 --- a/drivers/net/pcap/pcap_osdep.h +++ b/drivers/net/pcap/pcap_osdep.h @@ -6,6 +6,7 @@ #define _RTE_PCAP_OSDEP_ #include +#include /* * Interface manipulation is always OS-specific. @@ -14,4 +15,53 @@ int osdep_iface_index_get(const char *name); int osdep_iface_mac_get(const char *name, struct rte_ether_addr *mac); +/* + * On Windows, libpcap (npcap or WinPcap) exposes Win32 API which clashes + * with some DPDK constructs. Trivial libpcap wrappers with "osdep_" prefix + * are provided to isolate PMD code from Win32 API. + */ + +#define OSDEP_DLT_EN10MB 1 + +#define OSDEP_PCAP_ERRBUF_SIZE 256 + +#define OSDEP_PCAP_TSTAMP_PRECISION_NANO 1 + +/** Handle for an open packet capture. */ +typedef struct osdep_pcap_type osdep_pcap; + +/** Handle for an open packet dump. */ +typedef struct osdep_pcap_dumper_type osdep_pcap_dumper; + +struct osdep_pcap_pkthdr { + struct rte_time_us ts; + uint32_t caplen; + uint32_t len; +}; + +enum osdep_pcap_direction { + OSDEP_PCAP_D_INOUT = 0, + OSDEP_PCAP_D_IN, + OSDEP_PCAP_D_OUT +}; + +osdep_pcap *osdep_pcap_open_live(const char *device, int snaplen, + int promisc, int to_ms, char *errbuf); +osdep_pcap *osdep_pcap_open_offline(const char *fname, char *errbuf); +osdep_pcap *osdep_pcap_open_dead_with_tstamp_precision(int linktype, + int snaplen, unsigned int precision); +const uint8_t *osdep_pcap_next(osdep_pcap *pcap, + struct osdep_pcap_pkthdr *header); +int osdep_pcap_sendpacket(osdep_pcap *pcap, const uint8_t *buf, int size); +void osdep_pcap_close(osdep_pcap *pcap); + +osdep_pcap_dumper *osdep_pcap_dump_open(osdep_pcap *pcap, const char *fname); +void osdep_pcap_dump(uint8_t *user, const struct osdep_pcap_pkthdr *header, + const uint8_t *sp); +int osdep_pcap_dump_flush(osdep_pcap_dumper *p); +void osdep_pcap_dump_close(osdep_pcap_dumper *p); + +int osdep_pcap_setdirection(osdep_pcap *pcap, enum osdep_pcap_direction dir); +const char *osdep_pcap_geterr(osdep_pcap *pcap); + #endif From patchwork Sun Feb 14 02:16:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Kozlyuk X-Patchwork-Id: 87906 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 AC799A0546; Sun, 14 Feb 2021 03:17:12 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9DD0A22A24E; Sun, 14 Feb 2021 03:16:35 +0100 (CET) Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) by mails.dpdk.org (Postfix) with ESMTP id DE36D22A1FA for ; Sun, 14 Feb 2021 03:16:31 +0100 (CET) Received: by mail-lf1-f50.google.com with SMTP id v24so5186827lfr.7 for ; Sat, 13 Feb 2021 18:16:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Whr/pMS4CpIAeA7lnJmuhxngW4VKQ3qReJqGWS8gbbg=; b=s8PuvtpBArwF7/fq6Qc20DtErKfxIucrH76q8EaTAGU5Sm63yNcY4ZA5pbV+DvrdnH 7isxw78SVJCX+2pgX0pFISIb+3JrQD8ogkHkAsXJ/WXJ5z2qtoypRUuL4RsQ6G6LAd9/ OKQ2QUDtOXop3PkVFmQwjHioXBLs4JFshN1PK8tHG6padTAJtVrtDVE2ifyqm+qzBRsL AkpeTYYyivm7Z7ywBymPKD9dcJl0a+OeeoWUnbDgoO6ryF3exIF3ST/ZaZltGSmo19ip /5BSHWPWJfcck8X4hNnEy4Z3037lFPR90nxnd0tL3IPLf18wbwU74hCEIdftJPpquPJQ xW/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Whr/pMS4CpIAeA7lnJmuhxngW4VKQ3qReJqGWS8gbbg=; b=q3jLGi7OSwm+BQfo1yhqf/NgCO835VtIbjAIQWCMP9KwoOFiwOuXKGrifTHgm2OUYa x0jNYQjCizz5B9UePfNMBMvYJDgaZGRautfiHeWt0auDxBhT6nN0hhwpRQHPRH7SYuab m6lxXoilhXEepKXLsvlJIOM33L3gGUqBNC2FFDxh28Yb55sem4SvKUHwiJD9yfNhPCmP qtpTf81DiJOsVvECyXlGFbn/5uRqm7uFNzu+E9eXo1TqaXQPjZvtMdohulUJmZOyGi8D x1YishiUx/gKUAJMDNhpDlr4mseeKlUq7kcftlqBxbhQ90bcMqVx/EgxmBHK32wtatCU V0Vw== X-Gm-Message-State: AOAM5312wdb5wSvZSHfFUmFjV4jf8RqP5C8nlwc55/fyTTxbol7/lGGE qsg88YVF+PB7hpEdXRwWaVXZXsdFJy7PKw== X-Google-Smtp-Source: ABdhPJyT5IGVPfhPSbyiUur1R4D4WIoSS1QcrtpjewOc4AgIkaWwHr7ZE70f+5Ek5ILjLReUsAnxrg== X-Received: by 2002:a05:6512:10c5:: with SMTP id k5mr5119758lfg.583.1613268991323; Sat, 13 Feb 2021 18:16:31 -0800 (PST) Received: from localhost.localdomain (broadband-37-110-65-23.ip.moscow.rt.ru. [37.110.65.23]) by smtp.gmail.com with ESMTPSA id l19sm3017158lji.53.2021.02.13.18.16.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Feb 2021 18:16:30 -0800 (PST) From: Dmitry Kozlyuk To: dev@dpdk.org Cc: Tyler Retzlaff , Mike Wells , Dmitry Kozlyuk , Bruce Richardson Date: Sun, 14 Feb 2021 05:16:15 +0300 Message-Id: <20210214021616.26970-6-dmitry.kozliuk@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210214021616.26970-1-dmitry.kozliuk@gmail.com> References: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> <20210214021616.26970-1-dmitry.kozliuk@gmail.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 5/6] config: discover libpcap on Windows 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 Sender: "dev" WinPcap or Npcap, can be installed anywhere. Add a Meson option to specify SDK path. Signed-off-by: Dmitry Kozlyuk --- config/meson.build | 21 ++++++++++++++++++--- meson_options.txt | 6 ++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/config/meson.build b/config/meson.build index 3cf560b8a..6aae8276c 100644 --- a/config/meson.build +++ b/config/meson.build @@ -178,9 +178,24 @@ if not pcap_dep.found() # pcap got a pkg-config file only in 1.9.0 pcap_dep = cc.find_library('pcap', required: false) endif -if pcap_dep.found() and cc.has_header('pcap.h', dependencies: pcap_dep) - dpdk_conf.set('RTE_PORT_PCAP', 1) - dpdk_extra_ldflags += '-lpcap' +if is_windows + # npcap SDK can be installed anywhere + pcap_sdk = get_option('pcap_sdk') + if pcap_sdk != '' + pcap_ldflags = ['-L@0@/Lib/x64'.format(pcap_sdk), '-lwpcap'] + pcap_dep = declare_dependency( + compile_args: ['-I@0@/Include'.format(pcap_sdk)], + link_args: pcap_ldflags) + endif + if pcap_dep.found() + dpdk_conf.set('RTE_PORT_PCAP', 1) + dpdk_extra_ldflags += pcap_ldflags + endif +else + if pcap_dep.found() and cc.has_header('pcap.h', dependencies: pcap_dep) + dpdk_conf.set('RTE_PORT_PCAP', 1) + dpdk_extra_ldflags += '-lpcap' + endif endif # for clang 32-bit compiles we need libatomic for 64-bit atomic ops diff --git a/meson_options.txt b/meson_options.txt index 6eff62e47..d74146d3a 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -10,6 +10,8 @@ option('enable_docs', type: 'boolean', value: false, description: 'build documentation') option('enable_kmods', type: 'boolean', value: false, description: 'build kernel modules') +option('enable_trace_fp', type: 'boolean', value: false, + description: 'enable fast path trace points.') option('examples', type: 'string', value: '', description: 'Comma-separated list of examples to build by default') option('flexran_sdk', type: 'string', value: '', @@ -28,8 +30,8 @@ option('max_lcores', type: 'integer', value: 128, description: 'maximum number of cores/threads supported by EAL') option('max_numa_nodes', type: 'integer', value: 32, description: 'maximum number of NUMA nodes supported by EAL') -option('enable_trace_fp', type: 'boolean', value: false, - description: 'enable fast path trace points.') +option('pcap_sdk', type: 'string', value: '', + description: 'Path to libpcap SDK used on Windows') option('tests', type: 'boolean', value: true, description: 'build unit tests') option('use_hpet', type: 'boolean', value: false, From patchwork Sun Feb 14 02:16:16 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Kozlyuk X-Patchwork-Id: 87907 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 12A4BA0546; Sun, 14 Feb 2021 03:17:24 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 791DF22A259; Sun, 14 Feb 2021 03:16:37 +0100 (CET) Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) by mails.dpdk.org (Postfix) with ESMTP id 0068422A247 for ; Sun, 14 Feb 2021 03:16:32 +0100 (CET) Received: by mail-lf1-f48.google.com with SMTP id m22so5207186lfg.5 for ; Sat, 13 Feb 2021 18:16:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=uildSmbz6KhYXk/qQX0T/5BOxbXRmjh+ijouvFYzO/w=; b=enDDsvZiGxgcUIiMUfEW+fh/LjRAmuSLQtKCF+m9cZUuiNTY7W6+fY05pqSaCWwQlx wlPhgccY+ymBAxbnUAiFZwQZgC6USUjYnOfWGzXx7q4qyik9lUwHsA1siJroAKeOgMiS SSM543cLxCJgweL21HwQTZPs//JATt1QTpGWnLhicvgI/4a9x/cyucv1rgYQMwPVCUsI HjPsZH/BN1awkNILhiWIz3HUSu0tOGHEU9QVEKJZr6VpYzcY6Un9NstrXl148PytOyAN j3HsQPcU2KgL5thIC/wWS12XqPykoUJ7Hhnozb74lffSQz5xW8yeGUpV4WH7HvbzN+My LB3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=uildSmbz6KhYXk/qQX0T/5BOxbXRmjh+ijouvFYzO/w=; b=mfamTOHULodGc60PNK/h/0j6KKv/nzm2h8etKy4hkCxe3phEGexJR3vdRm873mS7Zl uFwuH2hotZdNZmlu/ZiBIV9Zuyibk/M183OaH/kdFiaR67yKL/fRcutDCIrcQIpcALBw 2ivaKhz0XB70d+gbUatk7jf38dEMXf3QQEDiawENze9I7V8FTseI+ZjAl5mXiTbiD0+I s+i7MPK96UGSaNSA5d/LnIPEnJqIETmoa1lfZm5hVmA4w+BecL5EFqJ5FKJT9x/q5okl gmUqA+6omooP/uFAc4M+dgxAhJiktgmpfWFLrOkXEjaTzcpEQwL7JhQS/YWNM0G/AbA0 +xzA== X-Gm-Message-State: AOAM533YFCvxdY5+qL/S79M+pZW9f47HWZ0nuL5qpVQu/p8mtTaeVjWN 0rDeolTEGABAnU1QWuuXQdiVIFzbT6Z9GA== X-Google-Smtp-Source: ABdhPJzcbtzD1NY4U4mrfBQvo+B9aWdolgc2g9JrPrEeF6170zE7vmZ3aaVEFuu2co90gjCXQjcwbQ== X-Received: by 2002:ac2:51a1:: with SMTP id f1mr5367310lfk.659.1613268992356; Sat, 13 Feb 2021 18:16:32 -0800 (PST) Received: from localhost.localdomain (broadband-37-110-65-23.ip.moscow.rt.ru. [37.110.65.23]) by smtp.gmail.com with ESMTPSA id l19sm3017158lji.53.2021.02.13.18.16.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Feb 2021 18:16:31 -0800 (PST) From: Dmitry Kozlyuk To: dev@dpdk.org Cc: Tyler Retzlaff , Mike Wells , Dmitry Kozlyuk , Ferruh Yigit Date: Sun, 14 Feb 2021 05:16:16 +0300 Message-Id: <20210214021616.26970-7-dmitry.kozliuk@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210214021616.26970-1-dmitry.kozliuk@gmail.com> References: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> <20210214021616.26970-1-dmitry.kozliuk@gmail.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH v2 6/6] net/pcap: build on Windows 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 Sender: "dev" Implement OS-dependent functions and enable PMD build on Windows. Signed-off-by: Dmitry Kozlyuk --- drivers/net/pcap/meson.build | 11 ++- drivers/net/pcap/pcap_ethdev.c | 4 - drivers/net/pcap/pcap_osdep.h | 5 ++ drivers/net/pcap/pcap_osdep_windows.c | 118 ++++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 10 deletions(-) create mode 100644 drivers/net/pcap/pcap_osdep_windows.c diff --git a/drivers/net/pcap/meson.build b/drivers/net/pcap/meson.build index 9ab95ec3e..614a4e340 100644 --- a/drivers/net/pcap/meson.build +++ b/drivers/net/pcap/meson.build @@ -1,19 +1,18 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright(c) 2017 Intel Corporation -if is_windows - build = false - reason = 'not supported on Windows' - subdir_done() -endif - if not dpdk_conf.has('RTE_PORT_PCAP') build = false reason = 'missing dependency, "libpcap"' endif + sources = files( 'pcap_ethdev.c', 'pcap_osdep.c', 'pcap_osdep_@0@.c'.format(exec_env), ) + ext_deps += pcap_dep +if is_windows + ext_deps += cc.find_library('iphlpapi', required: true) +endif diff --git a/drivers/net/pcap/pcap_ethdev.c b/drivers/net/pcap/pcap_ethdev.c index 6461213e0..142533c6e 100644 --- a/drivers/net/pcap/pcap_ethdev.c +++ b/drivers/net/pcap/pcap_ethdev.c @@ -127,10 +127,6 @@ static struct rte_eth_link pmd_link = { RTE_LOG_REGISTER(eth_pcap_logtype, pmd.net.pcap, NOTICE); -#define PMD_LOG(level, fmt, args...) \ - rte_log(RTE_LOG_ ## level, eth_pcap_logtype, \ - "%s(): " fmt "\n", __func__, ##args) - static int eth_pcap_rx_jumbo(struct rte_mempool *mb_pool, struct rte_mbuf *mbuf, const uint8_t *data, uint16_t data_len) diff --git a/drivers/net/pcap/pcap_osdep.h b/drivers/net/pcap/pcap_osdep.h index bd00b728a..f7c311ef8 100644 --- a/drivers/net/pcap/pcap_osdep.h +++ b/drivers/net/pcap/pcap_osdep.h @@ -8,6 +8,11 @@ #include #include +#define PMD_LOG(level, fmt, args...) \ + rte_log(RTE_LOG_ ## level, eth_pcap_logtype, \ + "%s(): " fmt "\n", __func__, ##args) +extern int eth_pcap_logtype; + /* * Interface manipulation is always OS-specific. */ diff --git a/drivers/net/pcap/pcap_osdep_windows.c b/drivers/net/pcap/pcap_osdep_windows.c new file mode 100644 index 000000000..d6557ff73 --- /dev/null +++ b/drivers/net/pcap/pcap_osdep_windows.c @@ -0,0 +1,118 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2021 Dmitry Kozlyuk + */ + +#include +#include +#include + +#include "pcap_osdep.h" + +/* + * Given a device name like "\Device\NPF_{GUID}" extract the "{GUID}" part. + * Return NULL if "{GUID}" part is not found. + */ +static const char * +iface_guid(const char *name) +{ + static const size_t GUID_LENGTH = 32 + 4; /* 16 hex bytes + 4 dashes */ + + const char *ob, *cb; + + ob = strchr(name, '{'); + if (ob == NULL) + return NULL; + + cb = strchr(ob, '}'); + if (cb == NULL || cb - ob != GUID_LENGTH + 1) /* + 1 opening '{' */ + return NULL; + + return ob; +} + +/* + * libpcap takes device names like "\Device\NPF_{GUID}", + * GetAdapterIndex() takes interface names like "\DEVICE\TCPIP_{GUID}". + * Try to convert, fall back to original device name. + */ +int +osdep_iface_index_get(const char *device_name) +{ + WCHAR adapter_name[MAX_ADAPTER_NAME_LENGTH]; + const char *guid; + ULONG index; + DWORD ret; + + guid = iface_guid(device_name); + if (guid != NULL) + StringCbPrintfW(adapter_name, sizeof(adapter_name), + L"\\DEVICE\\TCPIP_%s", guid); + else + StringCbPrintfW(adapter_name, sizeof(adapter_name), + L"%s", device_name); + + ret = GetAdapterIndex(adapter_name, &index); + if (ret != NO_ERROR) { + PMD_LOG(ERR, "GetAdapterIndex() = %lu\n", ret); + return -1; + } + + return index; +} + +/* + * libpcap takes device names like "\Device\NPF_{GUID}", + * GetAdaptersAddresses() returns names in "{GUID}" form. + * Try to extract GUID from device name, fall back to original device name. + */ +int +osdep_iface_mac_get(const char *device_name, struct rte_ether_addr *mac) +{ + IP_ADAPTER_ADDRESSES *info = NULL, *cur = NULL; + ULONG size, sys_ret; + const char *adapter_name; + int ret = -1; + + sys_ret = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, &size); + if (sys_ret != ERROR_BUFFER_OVERFLOW) { + PMD_LOG(ERR, "GetAdapterAddresses() = %lu, expected %lu\n", + sys_ret, ERROR_BUFFER_OVERFLOW); + return -1; + } + + info = (IP_ADAPTER_ADDRESSES *)malloc(size); + if (info == NULL) { + PMD_LOG(ERR, "Cannot allocate adapter address info\n"); + return -1; + } + + sys_ret = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, info, &size); + if (sys_ret != ERROR_SUCCESS) { + PMD_LOG(ERR, "GetAdapterAddresses() = %lu\n", sys_ret); + free(info); + return -1; + } + + adapter_name = iface_guid(device_name); + if (adapter_name == NULL) + adapter_name = device_name; + + for (cur = info; cur != NULL; cur = cur->Next) { + if (strcmp(cur->AdapterName, adapter_name) == 0) { + if (cur->PhysicalAddressLength != RTE_ETHER_ADDR_LEN) { + PMD_LOG(ERR, "Physical address length: want %u, got %lu", + RTE_ETHER_ADDR_LEN, + cur->PhysicalAddressLength); + return -1; + } + + memcpy(mac->addr_bytes, cur->PhysicalAddress, + RTE_ETHER_ADDR_LEN); + ret = 0; + break; + } + } + + free(info); + return ret; +}