From patchwork Sun Feb 14 01:20:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Kozlyuk X-Patchwork-Id: 87895 X-Patchwork-Delegate: david.marchand@redhat.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 F0D3CA0546; Sun, 14 Feb 2021 02:20:33 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 469631CC4DD; Sun, 14 Feb 2021 02:20:28 +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 2373A406A2 for ; Sun, 14 Feb 2021 02:20:25 +0100 (CET) Received: by mail-lj1-f179.google.com with SMTP id k22so2988434ljg.3 for ; Sat, 13 Feb 2021 17:20:25 -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=QKFiOkfFl7RVU/2QherG21zwnw2IZzo+sZYpvBQYcqE=; b=HwaT9dulYqYbA2AigDa2PoBFQBZ3E2NwY/8Tf9AR5chgDEm4ixph97etoU94sYj/in SqQHeb+9MK+mbt+K41jZrlOsQjxXvqJ9cqOaUQJNVIGL3nw/urzr0QAATz7qPj7yMXxa OnPHLeOefb6RwaIVcyEYzIUhqKbq5MgMSFKVMJrCVKiH5xK+iBwz7v5G9C3oNW7PqE8j Tx0c7sWIm1AnWQKZZhZf0BoA2JcUGA8P4TpUR0N4BSE0BlYlM1VRbWik2HetI6x0qzbZ LhsCj6aWoVIUgZ0jeo1IE8c3AzMInqx1GGKYrkruJxqGMTgxfGmEdwOHM8F0cjNCsgPS pLgA== 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=QKFiOkfFl7RVU/2QherG21zwnw2IZzo+sZYpvBQYcqE=; b=neaYdDZUeQDDtoZRPnx70qcVChoBTse0KT1fmKjT3xVOU659R/QmFNMxkMpe8o59Xc OOynsTfNcq4CkAg0FWYCpgF7N7WqFr3L3w7Pu0KBdvzgJUFjdMmtyL45GTKW625Siql1 i8SNUBcTeArOgE6HN+AFKRtjX1reGDvuheDBQ7iuMC3D+g8a0CG78Mc/74UBp3Z+zUHi Ue/P8uLGE2zogXyva5qOCEO2YBEqfJhfDwoMZAy3iMTCEtbwETOIFf5xAwnyqYZq5jzk Gl6bszS1cMi1tPi8cX8/Z4S6jG2NlXL0J/7fN8BgWgpYEKis56ejCJPyN9Wiv4tDFbQW or7Q== X-Gm-Message-State: AOAM5314g+mkQ8AAPCwMYSgFWJ/M64EHrEkHAe4fEcVvfpbUMJ+2Wz8Z UjJrRQTK2NdscXIc9mAu8/aric+YyK0vJQ== X-Google-Smtp-Source: ABdhPJzXNbWdPyFB5ds3MU0fdbU0dAXZRoBw+hNVzBJ+NsFAceIukNEuaIEEsbkplqOv3EBeCo6GTA== X-Received: by 2002:a2e:b8d3:: with SMTP id s19mr5738246ljp.97.1613265624528; Sat, 13 Feb 2021 17:20:24 -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 h11sm2237648lfd.243.2021.02.13.17.20.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Feb 2021 17:20:23 -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 04:20:08 +0300 Message-Id: <20210214012013.23165-2-dmitry.kozliuk@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> References: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 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 --- 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 | 20 +++++++++++++++++++- 5 files changed, 51 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..b5c8eaa73 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,27 @@ 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; + sec = (ticks - EPOCH) / (TICKS_PER_USEC * USEC_PER_SEC); + now->sec = sec; + now->usec = (ticks - sec * USEC_PER_SEC) / TICKS_PER_USEC; +} From patchwork Sun Feb 14 01:20:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Kozlyuk X-Patchwork-Id: 87896 X-Patchwork-Delegate: david.marchand@redhat.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 93E58A0546; Sun, 14 Feb 2021 02:20:41 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6988B1CC502; Sun, 14 Feb 2021 02:20:29 +0100 (CET) Received: from mail-lj1-f176.google.com (mail-lj1-f176.google.com [209.85.208.176]) by mails.dpdk.org (Postfix) with ESMTP id 060B2406A2; Sun, 14 Feb 2021 02:20:26 +0100 (CET) Received: by mail-lj1-f176.google.com with SMTP id a22so3619875ljp.10; Sat, 13 Feb 2021 17:20:26 -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=JaXEac06BfRiTfCzJm8/MZf0FUPdE+rPQExWOclF0e7KlPSOX14pyfnSbduCgrMzja LctHPq8fExgmI8dBdsQx7XyJEa3AVKvTUG3EhnXuKljvvaZciCB2M74qQqaSwxBWrRlo VXuduGbk7q4st70M1KvN46tbE9QrOUoNJc11idHGOJQTDMEX7t2ilvLDGHnFDfBEG2Zb WwoKcO7VcGrnANRihH8JA8ERL/nr50uQKli+MqQZ+GpzevmRNBWDv079dZs6i+8agI3P yoN54Po+2xyoDA+r33Z2q/HzwSuyX/IEdpcIyXPPyIkVAA/BZnUIkfdR69GBifa7gVJS sYMg== 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=MflQ/AERCsZ4nLwJSWhhvKaroxpXTRLoOhN3BG5vvGSKUaG+xnERSWSb5+oNqQjwil GAqUlgl1ba3SECu5aAnfk67Mcf3Y17Z76h8nEHKrDY+anD/mW0BwZlfbi4oYv1/jl2X7 wo4m2kJanw/VL4OBYT7XLQKwXuEV2Yeb40A8x+5MEAtZKVMMcwoypEutvxLT134SFT7H EhnEdsTLr/2f3HKTmeYl2UvoXz/5y7Ic9Wb+twjh/UHm/jlZd/2MXWwwrUPI6BEwE1t/ 6jFjxwyENdFcCfOxhWv1mxZh58TsriLDZaeuFVrxPEbqi6TLQIMIYgljwXyB4nDTccXS 3IeQ== X-Gm-Message-State: AOAM531YjFVBZeWBw7IJKXglWkLD1AVgPMX8JdEpjTFne8qoeG5utpEf FRLTZxGuR7EhKi7dtXG2sp9boPxCh/L2gw== X-Google-Smtp-Source: ABdhPJwSz42o8jQkV8RV7cOEjmRUfOZOOWVkJVauDJUWM7JxOTDJQUYvx9MiSqQOX8sSEBTucIY30w== X-Received: by 2002:a2e:81c7:: with SMTP id s7mr5696128ljg.178.1613265625463; Sat, 13 Feb 2021 17:20:25 -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 h11sm2237648lfd.243.2021.02.13.17.20.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Feb 2021 17:20:25 -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 04:20:09 +0300 Message-Id: <20210214012013.23165-3-dmitry.kozliuk@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> References: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 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: Nick Connolly --- 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 01:20:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Kozlyuk X-Patchwork-Id: 87897 X-Patchwork-Delegate: david.marchand@redhat.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 840A3A0546; Sun, 14 Feb 2021 02:20:49 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id B7DCD1CC55F; Sun, 14 Feb 2021 02:20:30 +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 2A3291CC4DA for ; Sun, 14 Feb 2021 02:20:27 +0100 (CET) Received: by mail-lj1-f169.google.com with SMTP id e17so3626185ljl.8 for ; Sat, 13 Feb 2021 17:20:27 -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=oV4Ch1zASoQjMVXI+OjeYTElocXNFfvHBZlNRCSh2L/yfsD072N0Oz4AVYqO7XwTPr cZNNxteezTqXXOeSSYlfqsBy6wMbGuTReo5XiA6BF8PDRqsvAdoxMeho2WCPJkLHfPtD u7u079XaVRIliyVBVLBLIgmsoxzjLOktWtx/Ye069FzgQhrkFno3G2aDlPA9+oyYfX36 qYZfx1sprblXy9nk+pEzx04afQb+gt9PeSTzuUopZpl6urUWYr8nMg8MQpd0EQDwtqZ4 /IYCGwCX4ZqNV126GrrdJORHKJepG/yXTY+RY6ix1cbZ8D6+fdFmBaN7V70HnPcJfEA6 PX8w== 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=maJa3zm3cmL3NSoRCZCjBNbUYOlCtN+rBxAJAXcyOSIbRmM+Xi8MhoQ4FpsOGibB1g CrRRk7zoLTrZw01b+Ix3CsG6fqjiazKRiKOa7ABHBEZ0cegJ63I8h8FLJRndOX5EU/ez sgQ32uUrK6VBi1zaXVE8XA23ulj4fK3c63plvg3Sq1XbrudkKesP/ureK0RfS9dmFIx0 LXuKQvr58+b6TlJ3PS3EE63kEqp4vBCEOm+68cezufo01LsSsDUWo0CXlH+cXWmuF4iE 4wUnU947HviIXgrR/FKjQq2eueKILRja4k62tYkgGOIyK6HPprtFeLdAq44Qq2O8ixPn UODA== X-Gm-Message-State: AOAM530SL9mF0e6H+omENzO3xddr+MNGwp/QCeDEokh+vT5W3SWm6fZU 3i8KKVphRo3GBKFzGu3uuZK1s3Qg8gpQRg== X-Google-Smtp-Source: ABdhPJyIs+zcqwqsVFOnJ8fTzuxO0OhdpupMf6j+2lozjDExyf8A7IJ/dWSnIreLOdxHs7vXKs+qUA== X-Received: by 2002:a2e:984c:: with SMTP id e12mr5515528ljj.69.1613265626368; Sat, 13 Feb 2021 17:20:26 -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 h11sm2237648lfd.243.2021.02.13.17.20.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Feb 2021 17:20:26 -0800 (PST) From: Dmitry Kozlyuk To: dev@dpdk.org Cc: Tyler Retzlaff , Mike Wells , Dmitry Kozlyuk , Ferruh Yigit Date: Sun, 14 Feb 2021 04:20:10 +0300 Message-Id: <20210214012013.23165-4-dmitry.kozliuk@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> References: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 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 --- 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 01:20: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: 87898 X-Patchwork-Delegate: david.marchand@redhat.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 3B4B1A0546; Sun, 14 Feb 2021 02:20:56 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id F1A0F1CC565; Sun, 14 Feb 2021 02:20:31 +0100 (CET) Received: from mail-lj1-f177.google.com (mail-lj1-f177.google.com [209.85.208.177]) by mails.dpdk.org (Postfix) with ESMTP id 658A01CC4FA for ; Sun, 14 Feb 2021 02:20:28 +0100 (CET) Received: by mail-lj1-f177.google.com with SMTP id v6so3624399ljh.9 for ; Sat, 13 Feb 2021 17:20: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=yomGuCJWW0fAlEWEyNq4xm4hvoYWH7DBpIyrckA/Xdc=; b=id+j4zSgCZ2qn9TVyNBT3tiShyPNYQK48iVKO0OY1OWtZ8xuRzlS3v+aMl3jh0AsHI Mjo0xjsfP3+sj2hKze3GQkV6doyD9AoQWfmRm73sW+DhEas/y24XKr3jGP6J783zuV71 4t04HlQ2txkrX5qsRYAerXNB/DlYTcTsZc2mszYaMpf9brTFuZHU38YamrVc7hs/38Lg PIRhjMmW7OoZI1f1p1ClRkYCe5k17XDqq3wtE4KI3fURL6jviUsQc1fGUKCwxS0dh5XB ER/i1xo3tqGojNeHyvpTAiIE0CB4srXqECln8n566EdxDDz4EQc09QaH5slrmtntY6SJ rIxQ== 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=RjdTOr66twle5Evod8uHTaK5aaRHVTrmbcCfR4wuTjUEkO8DuXCvAPHnoIjT93en/Z UXsXydBpe8FSor/J94ubckKzb3fMB/XqkUESjuBQuouV93y+e5+scdBwOCh5ESiZk+Fg 2MOOFt6h/bWmuggHSFKU5TYAJ1I4c3z+Dts8sCPdDKVMEFxR1LVIOGiBE5RC/NsYGgVQ wJ+NriG8Co3NLqW2OGugh1MdKQbAgvs7FrNI2JoDpgiMcIEFe4TxdJeu9fUf2puXlJCF ht6X2mCZLu6ePg2IMAF913NqEIrCZQ5LI3B2PNtH9kdTvUmjGuKRDLnXr+iXKS+vR9LK 1mtQ== X-Gm-Message-State: AOAM533m+jBYAi5986OPP36azHn1y71m9Y3o7NOqS52R+c4ROn+cVq8U woY55BhzR8cGkNP3Ymg3HsVCqLfq8dGqow== X-Google-Smtp-Source: ABdhPJz7yLzfb1iiPXC34Ljt8f+Og+AQ5ORW5vlulWmWGInuwaLOFUWpvFS5esyGiTd5bTXZTntLHg== X-Received: by 2002:a2e:9613:: with SMTP id v19mr5648957ljh.127.1613265627440; Sat, 13 Feb 2021 17:20: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 h11sm2237648lfd.243.2021.02.13.17.20.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Feb 2021 17:20:27 -0800 (PST) From: Dmitry Kozlyuk To: dev@dpdk.org Cc: Tyler Retzlaff , Mike Wells , Dmitry Kozlyuk , Ferruh Yigit Date: Sun, 14 Feb 2021 04:20:11 +0300 Message-Id: <20210214012013.23165-5-dmitry.kozliuk@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> References: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 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 01:20: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: 87899 X-Patchwork-Delegate: david.marchand@redhat.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 70620A0546; Sun, 14 Feb 2021 02:21:07 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id AA96822A1FA; Sun, 14 Feb 2021 02:20:33 +0100 (CET) Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) by mails.dpdk.org (Postfix) with ESMTP id 369FA1CC502 for ; Sun, 14 Feb 2021 02:20:29 +0100 (CET) Received: by mail-lf1-f41.google.com with SMTP id f1so5149416lfu.3 for ; Sat, 13 Feb 2021 17:20: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=Whr/pMS4CpIAeA7lnJmuhxngW4VKQ3qReJqGWS8gbbg=; b=RUTFUCK1YT+5EKK8CEaR4uO2AZuY+UXVzJD2RP6csps5JXiPILDv5fsFRPI/pb3Jyv VjltmC2icrzc/rpbYQpMyd8VljlKAWUMwcaMWJl76dz4kk4lGAKJ5iB4XPihRU+Cg0vs Rm4QEcs7vNNzyZfgf0a3qf3a0l4QVKLkUyPCWoMTtq4jdXg1afQp4gtBSrrzy703mjcE 4H/+sUm4h6GIrh0MMcBm7f+P/tk4Q6yJciz31NTJyiRQdyr/ImoAIwib9BCCCr62ZFPK LgcNn7t2DMe8COZoQHvUtwS3ptWxSY0NDY7IhzghXwN8tm8UITuS+TnrmPdc06QjDX8q wc0Q== 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=kF/MfFTeQ8xc/cdj4lMNhNQGUxZvaPsLIAydtvoCEJOGuSW35Yg8QghiqGxNgA4Y0N ZN5mZDtmDjS9fPDV1678qQ/g02PHRsswNq4f8AjKo3ChhXSbagB+KNdh+Bgj1FcwUvVv xj8EQvS2lEfAy4Sh6jWvCWicr9WlidyyU6sf51KJ3vImCl66n+mqVwbTvce+cO1MRkbO EnB5YatyEPT847/2m67CQrE7nVhF6e3JM9OQIu0BCFgAtlrx5zCY0hQYSuEZigWcIIc9 BKCwi53Ah8hiSChKfGbkFhsA/yFE+wYtOzFol3uAxaFz0z8tYj0GaZPxk0lXk789lutu cHMQ== X-Gm-Message-State: AOAM531dzPee9BZZZLivh/6WbYBP2M55dsGlaX79PRWtpY0YSycYT/1S WH02YYjEbS/DMfTsKw/ksyE/duv/haZhhQ== X-Google-Smtp-Source: ABdhPJxpIH4LMxLmwOlDNF97Liaj+sy4UIV3J1g41Y05KJcPmPBiZxqhDUD1fdnmtUcyLQr070TPCA== X-Received: by 2002:a05:6512:3184:: with SMTP id i4mr5341365lfe.314.1613265628539; Sat, 13 Feb 2021 17:20: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 h11sm2237648lfd.243.2021.02.13.17.20.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Feb 2021 17:20:27 -0800 (PST) From: Dmitry Kozlyuk To: dev@dpdk.org Cc: Tyler Retzlaff , Mike Wells , Dmitry Kozlyuk , Bruce Richardson Date: Sun, 14 Feb 2021 04:20:12 +0300 Message-Id: <20210214012013.23165-6-dmitry.kozliuk@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> References: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 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 01:20: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: 87900 X-Patchwork-Delegate: david.marchand@redhat.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 ABB0AA0546; Sun, 14 Feb 2021 02:21:15 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CBE4D22A238; Sun, 14 Feb 2021 02:20:34 +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 373CE1CC551 for ; Sun, 14 Feb 2021 02:20:30 +0100 (CET) Received: by mail-lf1-f50.google.com with SMTP id m22so5121436lfg.5 for ; Sat, 13 Feb 2021 17:20:30 -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=gWnrz3DkdKiDY6xT9Z7RQc3TofLTiwWEum4vCsq3RcUcmZoTpT7Tids/1eoBthi/9j HqpGSKTJy6EaEJkglBzD3gXRTwwgdOL0zyRguSSerivfI11dLwcMgj5od6TeqzKgrL1O 2T+HjTXKa1Vn2kit4xEKM/sUY5vbaqSbsn9wiVcTGFX84pQ79NYvTNClOIftsA1/qlf3 +oTir05VUL8wMuOaMfjViMFpeZ3qz10e4GrIVBg+GVQDhKurqLUQ+N6p3GJO7+TlHgPO q3VytfQoO413fXtFU3gw9DxKebS+7MJR4DdykxUmOLdad5spXWIfq1Wq3jyY7Spx3tly KNqA== 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=OErN25CKhyCeJaxyqsfJIr6k07zzsaKW4/QCwBYUxzGnw9TcOx9GNTkiEkyKo2YKG9 gUlGFHeSy2vn7EvY58Hkeux8XA51UAUyAqmy2gYudqBgzlWUMLAezHhBvGRt3+xKlitn /cPcOHpbLe6bGvMjC8SvmyjafrkAcDq5b8lgP+qQPd/nzKjtCUIk/DNSJ+xbSn02wLW+ DwN8V17wXh7XEABtARHE72xy7WYdiM4gqIhJ8uwzDm8Wi5GdrQfLjj/VX/ctPD71kMiY EPtGSl71fENyeJgoDi32t9m8ucPXBm/Q0sn/+u+b92yWYltmlFlIAHge6b5dCqOQIT+f MF4Q== X-Gm-Message-State: AOAM530SPEnv1/PY7BsuutCvPfyZPv7iKzLi2iZn1gWIRZxdYXEDeKG6 sx3u1YfCnrRmy9kIHJhO8uEGH3B7a1EO0A== X-Google-Smtp-Source: ABdhPJwjwHzLA4U+LtuctsMyjV7f9ua7MhzIn+sYIUZfX84rOLaxW7kF45eBgTu/MnjQjmuMGyFP/A== X-Received: by 2002:a19:41cd:: with SMTP id o196mr5353549lfa.30.1613265629566; Sat, 13 Feb 2021 17:20: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 h11sm2237648lfd.243.2021.02.13.17.20.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 13 Feb 2021 17:20:29 -0800 (PST) From: Dmitry Kozlyuk To: dev@dpdk.org Cc: Tyler Retzlaff , Mike Wells , Dmitry Kozlyuk , Ferruh Yigit Date: Sun, 14 Feb 2021 04:20:13 +0300 Message-Id: <20210214012013.23165-7-dmitry.kozliuk@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> References: <20210214012013.23165-1-dmitry.kozliuk@gmail.com> MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH 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; +}