get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/87905/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 87905,
    "url": "http://patches.dpdk.org/api/patches/87905/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20210214021616.26970-5-dmitry.kozliuk@gmail.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20210214021616.26970-5-dmitry.kozliuk@gmail.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210214021616.26970-5-dmitry.kozliuk@gmail.com",
    "date": "2021-02-14T02:16:14",
    "name": "[v2,4/6] net/pcap: add libpcap wrappers",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "53a17cdd77d64fafc6211d79004e42506a864d6b",
    "submitter": {
        "id": 1581,
        "url": "http://patches.dpdk.org/api/people/1581/?format=api",
        "name": "Dmitry Kozlyuk",
        "email": "dmitry.kozliuk@gmail.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20210214021616.26970-5-dmitry.kozliuk@gmail.com/mbox/",
    "series": [
        {
            "id": 15257,
            "url": "http://patches.dpdk.org/api/series/15257/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=15257",
            "date": "2021-02-14T02:16:10",
            "name": "net/pcap: build on Windows",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/15257/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/87905/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/87905/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "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])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 61E8EA0546;\n\tSun, 14 Feb 2021 03:17:02 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 7121D22A247;\n\tSun, 14 Feb 2021 03:16:34 +0100 (CET)",
            "from mail-lj1-f175.google.com (mail-lj1-f175.google.com\n [209.85.208.175])\n by mails.dpdk.org (Postfix) with ESMTP id 29BF422A1FA\n for <dev@dpdk.org>; Sun, 14 Feb 2021 03:16:31 +0100 (CET)",
            "by mail-lj1-f175.google.com with SMTP id e17so3695945ljl.8\n for <dev@dpdk.org>; Sat, 13 Feb 2021 18:16:31 -0800 (PST)",
            "from localhost.localdomain (broadband-37-110-65-23.ip.moscow.rt.ru.\n [37.110.65.23])\n by smtp.gmail.com with ESMTPSA id l19sm3017158lji.53.2021.02.13.18.16.29\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Sat, 13 Feb 2021 18:16:29 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;\n h=from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-transfer-encoding;\n bh=yomGuCJWW0fAlEWEyNq4xm4hvoYWH7DBpIyrckA/Xdc=;\n b=q/sqgxc3uElmF56qxFEPFA6HfnQGjlvgmsCBYCtXXdgkWWHPZfx1hpsAuSSPAuNFSM\n pd/w028qyFJ9uq8WRAzDLeE93cs4Ade825mZlcq6FIeeAc8/IzvywbaiROZRil7LxLNB\n AX4mRUgVhc8fFVQOXANXFUAtkD24m0bnc8ZZ7GCY8E34G/nV971uTuGSAPDjv9O0tOQc\n 1F6ttKTbZOmdgkdj3kjU4ccA8S0jA7jeGzStlZORioljOR/jHzaQWaquTDpG3oJawlHF\n iukRyfRugSut5HaUbhy4ILVg+nZuutLucw8TDaKn42PdQicOlXxH2uiEXo0KpgM6kpqa\n wYug==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20161025;\n h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n :references:mime-version:content-transfer-encoding;\n bh=yomGuCJWW0fAlEWEyNq4xm4hvoYWH7DBpIyrckA/Xdc=;\n b=VzuNTGfoD97qBOQIn0StR/vmLpRQ7ThlN+Uk5FRO2aM+77Qg7z7miAHGiqv2Kvlgy5\n bBV6Q5XfprIY142lN7KWMWu88GP40lSfNmUTMjbtrXV+EKl7nFQT/GzFpTKYfC/Lz80f\n bi0agKbaksuAS9LbJp4wKMpchZBZgqAZUeNSwM33SMPA9T7pAdRFC+9tBdcOhJcBaVEC\n 7KtNYR6aJHwbI8Ii52tpF78wy/kBAJo1e8sa0s10RYgByflOVi9EfU8uqbxWSMDa45C+\n zwFxnzSd51h0Al2QiUYPwQQVwAmfRRymn00IxDJF04FZL30woRsyeRJ75SkcKq9QPsE7\n vtRQ==",
        "X-Gm-Message-State": "AOAM5311HTEyTyO2qN8zcAxgdGNAB9uKKpTRcp8GMjZxX6oFkBfIuFfo\n RMi6C2QW+7RtGSBRekARvkJgEPKNJmKU+w==",
        "X-Google-Smtp-Source": "\n ABdhPJwaihpByt45JE0gRJ6xtm/nnp6iUkGX1M5KMaLbu0xm+mjquuCepyiqCstQRCnE3KysX+z6Ng==",
        "X-Received": "by 2002:a05:651c:1352:: with SMTP id\n j18mr5686284ljb.175.1613268990294;\n Sat, 13 Feb 2021 18:16:30 -0800 (PST)",
        "From": "Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>",
        "To": "dev@dpdk.org",
        "Cc": "Tyler Retzlaff <roretzla@microsoft.com>,\n Mike Wells <mike.wells@telchemy.com>,\n Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>,\n Ferruh Yigit <ferruh.yigit@intel.com>",
        "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>\n <20210214021616.26970-1-dmitry.kozliuk@gmail.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "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 <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "libpcap headers can expose OS headers. On Windows, system networking\nheaders are incompatible with DPDK ones, causing multiple name clashes.\nAPI of libpcap itself involves a non-standard u_char type.\n\nAdd a limited set of trivial libpcap wrappers, so that libpcap headers\nare not included directly by OS-independent PMD code. Use EAL types and\nfunctions for time instead of POSIX ones.\n\nSigned-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>\n---\n drivers/net/pcap/meson.build   |   1 +\n drivers/net/pcap/pcap_ethdev.c | 157 +++++++++++++++++----------------\n drivers/net/pcap/pcap_osdep.c  | 122 +++++++++++++++++++++++++\n drivers/net/pcap/pcap_osdep.h  |  50 +++++++++++\n 4 files changed, 252 insertions(+), 78 deletions(-)\n create mode 100644 drivers/net/pcap/pcap_osdep.c",
    "diff": "diff --git a/drivers/net/pcap/meson.build b/drivers/net/pcap/meson.build\nindex 26b606699..9ab95ec3e 100644\n--- a/drivers/net/pcap/meson.build\n+++ b/drivers/net/pcap/meson.build\n@@ -13,6 +13,7 @@ if not dpdk_conf.has('RTE_PORT_PCAP')\n endif\n sources = files(\n \t'pcap_ethdev.c',\n+\t'pcap_osdep.c',\n \t'pcap_osdep_@0@.c'.format(exec_env),\n )\n ext_deps += pcap_dep\ndiff --git a/drivers/net/pcap/pcap_ethdev.c b/drivers/net/pcap/pcap_ethdev.c\nindex a102897e9..6461213e0 100644\n--- a/drivers/net/pcap/pcap_ethdev.c\n+++ b/drivers/net/pcap/pcap_ethdev.c\n@@ -4,17 +4,13 @@\n  * All rights reserved.\n  */\n \n-#include <time.h>\n-\n-#include <pcap.h>\n-\n-#include <rte_cycles.h>\n #include <ethdev_driver.h>\n #include <ethdev_vdev.h>\n+#include <rte_bus_vdev.h>\n+#include <rte_cycles.h>\n #include <rte_kvargs.h>\n #include <rte_malloc.h>\n #include <rte_mbuf.h>\n-#include <rte_bus_vdev.h>\n \n #include \"pcap_osdep.h\"\n \n@@ -36,8 +32,8 @@\n \n #define RTE_PMD_PCAP_MAX_QUEUES 16\n \n-static char errbuf[PCAP_ERRBUF_SIZE];\n-static struct timeval start_time;\n+static char errbuf[OSDEP_PCAP_ERRBUF_SIZE];\n+static struct rte_time_us start_time;\n static uint64_t start_cycles;\n static uint64_t hz;\n static uint8_t iface_idx;\n@@ -83,16 +79,16 @@ struct pmd_internals {\n };\n \n struct pmd_process_private {\n-\tpcap_t *rx_pcap[RTE_PMD_PCAP_MAX_QUEUES];\n-\tpcap_t *tx_pcap[RTE_PMD_PCAP_MAX_QUEUES];\n-\tpcap_dumper_t *tx_dumper[RTE_PMD_PCAP_MAX_QUEUES];\n+\tosdep_pcap * rx_pcap[RTE_PMD_PCAP_MAX_QUEUES];\n+\tosdep_pcap * tx_pcap[RTE_PMD_PCAP_MAX_QUEUES];\n+\tosdep_pcap_dumper * tx_dumper[RTE_PMD_PCAP_MAX_QUEUES];\n };\n \n struct pmd_devargs {\n \tunsigned int num_of_queue;\n \tstruct devargs_queue {\n-\t\tpcap_dumper_t *dumper;\n-\t\tpcap_t *pcap;\n+\t\tosdep_pcap_dumper *dumper;\n+\t\tosdep_pcap *pcap;\n \t\tconst char *name;\n \t\tconst char *type;\n \t} queue[RTE_PMD_PCAP_MAX_QUEUES];\n@@ -137,7 +133,7 @@ RTE_LOG_REGISTER(eth_pcap_logtype, pmd.net.pcap, NOTICE);\n \n static int\n eth_pcap_rx_jumbo(struct rte_mempool *mb_pool, struct rte_mbuf *mbuf,\n-\t\tconst u_char *data, uint16_t data_len)\n+\t\tconst uint8_t *data, uint16_t data_len)\n {\n \t/* Copy the first segment. */\n \tuint16_t len = rte_pktmbuf_tailroom(mbuf);\n@@ -214,14 +210,14 @@ static uint16_t\n eth_pcap_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)\n {\n \tunsigned int i;\n-\tstruct pcap_pkthdr header;\n+\tstruct osdep_pcap_pkthdr header;\n \tstruct pmd_process_private *pp;\n-\tconst u_char *packet;\n+\tconst uint8_t *packet;\n \tstruct rte_mbuf *mbuf;\n \tstruct pcap_rx_queue *pcap_q = queue;\n \tuint16_t num_rx = 0;\n \tuint32_t rx_bytes = 0;\n-\tpcap_t *pcap;\n+\tosdep_pcap *pcap;\n \n \tpp = rte_eth_devices[pcap_q->port_id].process_private;\n \tpcap = pp->rx_pcap[pcap_q->queue_id];\n@@ -234,7 +230,7 @@ eth_pcap_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)\n \t */\n \tfor (i = 0; i < nb_pkts; i++) {\n \t\t/* Get the next PCAP packet */\n-\t\tpacket = pcap_next(pcap, &header);\n+\t\tpacket = osdep_pcap_next(pcap, &header);\n \t\tif (unlikely(packet == NULL))\n \t\t\tbreak;\n \n@@ -261,8 +257,8 @@ eth_pcap_rx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)\n \t\tmbuf->pkt_len = (uint16_t)header.caplen;\n \t\t*RTE_MBUF_DYNFIELD(mbuf, timestamp_dynfield_offset,\n \t\t\trte_mbuf_timestamp_t *) =\n-\t\t\t\t(uint64_t)header.ts.tv_sec * 1000000 +\n-\t\t\t\theader.ts.tv_usec;\n+\t\t\t\t(uint64_t)header.ts.sec * 1000000 +\n+\t\t\t\theader.ts.usec;\n \t\tmbuf->ol_flags |= timestamp_rx_dynflag;\n \t\tmbuf->port = pcap_q->port_id;\n \t\tbufs[num_rx] = mbuf;\n@@ -285,20 +281,24 @@ eth_null_rx(void *queue __rte_unused,\n \n #define NSEC_PER_SEC\t1000000000L\n \n+/*\n+ * This function stores nanoseconds in \"usec\" field of struct rte_time_us,\n+ * because \"ts\" goes directly to nanosecond-precision dump.\n+ */\n static inline void\n-calculate_timestamp(struct timeval *ts) {\n+calculate_timestamp(struct rte_time_us *ts) {\n \tuint64_t cycles;\n-\tstruct timeval cur_time;\n+\tstruct rte_time_us cur_time;\n \n \tcycles = rte_get_timer_cycles() - start_cycles;\n-\tcur_time.tv_sec = cycles / hz;\n-\tcur_time.tv_usec = (cycles % hz) * NSEC_PER_SEC / hz;\n-\n-\tts->tv_sec = start_time.tv_sec + cur_time.tv_sec;\n-\tts->tv_usec = start_time.tv_usec + cur_time.tv_usec;\n-\tif (ts->tv_usec >= NSEC_PER_SEC) {\n-\t\tts->tv_usec -= NSEC_PER_SEC;\n-\t\tts->tv_sec += 1;\n+\tcur_time.sec = cycles / hz;\n+\tcur_time.usec = (cycles % hz) * NSEC_PER_SEC / hz;\n+\n+\tts->sec = start_time.sec + cur_time.sec;\n+\tts->usec = start_time.usec + cur_time.usec;\n+\tif (ts->usec >= NSEC_PER_SEC) {\n+\t\tts->usec -= NSEC_PER_SEC;\n+\t\tts->sec += 1;\n \t}\n }\n \n@@ -314,8 +314,8 @@ eth_pcap_tx_dumper(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)\n \tstruct pcap_tx_queue *dumper_q = queue;\n \tuint16_t num_tx = 0;\n \tuint32_t tx_bytes = 0;\n-\tstruct pcap_pkthdr header;\n-\tpcap_dumper_t *dumper;\n+\tstruct osdep_pcap_pkthdr header;\n+\tosdep_pcap_dumper *dumper;\n \tunsigned char temp_data[RTE_ETH_PCAP_SNAPLEN];\n \tsize_t len, caplen;\n \n@@ -342,7 +342,7 @@ eth_pcap_tx_dumper(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)\n \t\t * in the mbuf (when the mbuf is contiguous) or, otherwise,\n \t\t * a pointer to temp_data after copying into it.\n \t\t */\n-\t\tpcap_dump((u_char *)dumper, &header,\n+\t\tosdep_pcap_dump((uint8_t *)dumper, &header,\n \t\t\trte_pktmbuf_read(mbuf, 0, caplen, temp_data));\n \n \t\tnum_tx++;\n@@ -355,7 +355,7 @@ eth_pcap_tx_dumper(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)\n \t * process stops and to make sure the pcap file is actually written,\n \t * we flush the pcap dumper within each burst.\n \t */\n-\tpcap_dump_flush(dumper);\n+\tosdep_pcap_dump_flush(dumper);\n \tdumper_q->tx_stat.pkts += num_tx;\n \tdumper_q->tx_stat.bytes += tx_bytes;\n \tdumper_q->tx_stat.err_pkts += nb_pkts - num_tx;\n@@ -400,7 +400,7 @@ eth_pcap_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)\n \tstruct pcap_tx_queue *tx_queue = queue;\n \tuint16_t num_tx = 0;\n \tuint32_t tx_bytes = 0;\n-\tpcap_t *pcap;\n+\tosdep_pcap *pcap;\n \tunsigned char temp_data[RTE_ETH_PCAP_SNAPLEN];\n \tsize_t len;\n \n@@ -426,7 +426,7 @@ eth_pcap_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)\n \t\t * in the mbuf (when the mbuf is contiguous) or, otherwise,\n \t\t * a pointer to temp_data after copying into it.\n \t\t */\n-\t\tret = pcap_sendpacket(pcap,\n+\t\tret = osdep_pcap_sendpacket(pcap,\n \t\t\trte_pktmbuf_read(mbuf, 0, len, temp_data), len);\n \t\tif (unlikely(ret != 0))\n \t\t\tbreak;\n@@ -443,11 +443,11 @@ eth_pcap_tx(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts)\n }\n \n /*\n- * pcap_open_live wrapper function\n+ * osdep_pcap_open_live wrapper function\n  */\n static inline int\n-open_iface_live(const char *iface, pcap_t **pcap) {\n-\t*pcap = pcap_open_live(iface, RTE_ETH_PCAP_SNAPLEN,\n+open_iface_live(const char *iface, osdep_pcap **pcap) {\n+\t*pcap = osdep_pcap_open_live(iface, RTE_ETH_PCAP_SNAPLEN,\n \t\t\tRTE_ETH_PCAP_PROMISC, RTE_ETH_PCAP_TIMEOUT, errbuf);\n \n \tif (*pcap == NULL) {\n@@ -459,7 +459,7 @@ open_iface_live(const char *iface, pcap_t **pcap) {\n }\n \n static int\n-open_single_iface(const char *iface, pcap_t **pcap)\n+open_single_iface(const char *iface, osdep_pcap **pcap)\n {\n \tif (open_iface_live(iface, pcap) < 0) {\n \t\tPMD_LOG(ERR, \"Couldn't open interface %s\", iface);\n@@ -470,39 +470,39 @@ open_single_iface(const char *iface, pcap_t **pcap)\n }\n \n static int\n-open_single_tx_pcap(const char *pcap_filename, pcap_dumper_t **dumper)\n+open_single_tx_pcap(const char *pcap_filename, osdep_pcap_dumper **dumper)\n {\n-\tpcap_t *tx_pcap;\n+\tosdep_pcap *tx_pcap;\n \n \t/*\n-\t * We need to create a dummy empty pcap_t to use it\n-\t * with pcap_dump_open(). We create big enough an Ethernet\n+\t * We need to create a dummy empty osdep_pcap to use it\n+\t * with osdep_pcap_dump_open(). We create big enough an Ethernet\n \t * pcap holder.\n \t */\n-\ttx_pcap = pcap_open_dead_with_tstamp_precision(DLT_EN10MB,\n-\t\t\tRTE_ETH_PCAP_SNAPSHOT_LEN, PCAP_TSTAMP_PRECISION_NANO);\n+\ttx_pcap = osdep_pcap_open_dead_with_tstamp_precision(OSDEP_DLT_EN10MB,\n+\t\tRTE_ETH_PCAP_SNAPSHOT_LEN, OSDEP_PCAP_TSTAMP_PRECISION_NANO);\n \tif (tx_pcap == NULL) {\n \t\tPMD_LOG(ERR, \"Couldn't create dead pcap\");\n \t\treturn -1;\n \t}\n \n-\t/* The dumper is created using the previous pcap_t reference */\n-\t*dumper = pcap_dump_open(tx_pcap, pcap_filename);\n+\t/* The dumper is created using the previous osdep_pcap reference */\n+\t*dumper = osdep_pcap_dump_open(tx_pcap, pcap_filename);\n \tif (*dumper == NULL) {\n-\t\tpcap_close(tx_pcap);\n+\t\tosdep_pcap_close(tx_pcap);\n \t\tPMD_LOG(ERR, \"Couldn't open %s for writing.\",\n \t\t\tpcap_filename);\n \t\treturn -1;\n \t}\n \n-\tpcap_close(tx_pcap);\n+\tosdep_pcap_close(tx_pcap);\n \treturn 0;\n }\n \n static int\n-open_single_rx_pcap(const char *pcap_filename, pcap_t **pcap)\n+open_single_rx_pcap(const char *pcap_filename, osdep_pcap **pcap)\n {\n-\t*pcap = pcap_open_offline(pcap_filename, errbuf);\n+\t*pcap = osdep_pcap_open_offline(pcap_filename, errbuf);\n \tif (*pcap == NULL) {\n \t\tPMD_LOG(ERR, \"Couldn't open %s: %s\", pcap_filename,\n \t\t\terrbuf);\n@@ -513,17 +513,17 @@ open_single_rx_pcap(const char *pcap_filename, pcap_t **pcap)\n }\n \n static uint64_t\n-count_packets_in_pcap(pcap_t **pcap, struct pcap_rx_queue *pcap_q)\n+count_packets_in_pcap(osdep_pcap **pcap, struct pcap_rx_queue *pcap_q)\n {\n-\tconst u_char *packet;\n-\tstruct pcap_pkthdr header;\n+\tconst uint8_t *packet;\n+\tstruct osdep_pcap_pkthdr header;\n \tuint64_t pcap_pkt_count = 0;\n \n-\twhile ((packet = pcap_next(*pcap, &header)))\n+\twhile ((packet = osdep_pcap_next(*pcap, &header)))\n \t\tpcap_pkt_count++;\n \n \t/* The pcap is reopened so it can be used as normal later. */\n-\tpcap_close(*pcap);\n+\tosdep_pcap_close(*pcap);\n \t*pcap = NULL;\n \topen_single_rx_pcap(pcap_q->name, pcap);\n \n@@ -612,7 +612,7 @@ eth_dev_stop(struct rte_eth_dev *dev)\n \n \t/* Special iface case. Single pcap is open and shared between tx/rx. */\n \tif (internals->single_iface) {\n-\t\tpcap_close(pp->tx_pcap[0]);\n+\t\tosdep_pcap_close(pp->tx_pcap[0]);\n \t\tpp->tx_pcap[0] = NULL;\n \t\tpp->rx_pcap[0] = NULL;\n \t\tgoto status_down;\n@@ -620,19 +620,19 @@ eth_dev_stop(struct rte_eth_dev *dev)\n \n \tfor (i = 0; i < dev->data->nb_tx_queues; i++) {\n \t\tif (pp->tx_dumper[i] != NULL) {\n-\t\t\tpcap_dump_close(pp->tx_dumper[i]);\n+\t\t\tosdep_pcap_dump_close(pp->tx_dumper[i]);\n \t\t\tpp->tx_dumper[i] = NULL;\n \t\t}\n \n \t\tif (pp->tx_pcap[i] != NULL) {\n-\t\t\tpcap_close(pp->tx_pcap[i]);\n+\t\t\tosdep_pcap_close(pp->tx_pcap[i]);\n \t\t\tpp->tx_pcap[i] = NULL;\n \t\t}\n \t}\n \n \tfor (i = 0; i < dev->data->nb_rx_queues; i++) {\n \t\tif (pp->rx_pcap[i] != NULL) {\n-\t\t\tpcap_close(pp->rx_pcap[i]);\n+\t\t\tosdep_pcap_close(pp->rx_pcap[i]);\n \t\t\tpp->rx_pcap[i] = NULL;\n \t\t}\n \t}\n@@ -804,11 +804,11 @@ eth_rx_queue_setup(struct rte_eth_dev *dev,\n \n \tif (internals->infinite_rx) {\n \t\tstruct pmd_process_private *pp;\n-\t\tchar ring_name[NAME_MAX];\n+\t\tchar ring_name[RTE_RING_NAMESIZE];\n \t\tstatic uint32_t ring_number;\n \t\tuint64_t pcap_pkt_count = 0;\n \t\tstruct rte_mbuf *bufs[1];\n-\t\tpcap_t **pcap;\n+\t\tosdep_pcap **pcap;\n \n \t\tpp = rte_eth_devices[pcap_q->port_id].process_private;\n \t\tpcap = &pp->rx_pcap[pcap_q->queue_id];\n@@ -932,7 +932,7 @@ static const struct eth_dev_ops ops = {\n \n static int\n add_queue(struct pmd_devargs *pmd, const char *name, const char *type,\n-\t\tpcap_t *pcap, pcap_dumper_t *dumper)\n+\t\tosdep_pcap *pcap, osdep_pcap_dumper *dumper)\n {\n \tif (pmd->num_of_queue >= RTE_PMD_PCAP_MAX_QUEUES)\n \t\treturn -1;\n@@ -955,13 +955,13 @@ open_rx_pcap(const char *key, const char *value, void *extra_args)\n {\n \tconst char *pcap_filename = value;\n \tstruct pmd_devargs *rx = extra_args;\n-\tpcap_t *pcap = NULL;\n+\tosdep_pcap *pcap = NULL;\n \n \tif (open_single_rx_pcap(pcap_filename, &pcap) < 0)\n \t\treturn -1;\n \n \tif (add_queue(rx, pcap_filename, key, pcap, NULL) < 0) {\n-\t\tpcap_close(pcap);\n+\t\tosdep_pcap_close(pcap);\n \t\treturn -1;\n \t}\n \n@@ -977,13 +977,13 @@ open_tx_pcap(const char *key, const char *value, void *extra_args)\n {\n \tconst char *pcap_filename = value;\n \tstruct pmd_devargs *dumpers = extra_args;\n-\tpcap_dumper_t *dumper;\n+\tosdep_pcap_dumper *dumper;\n \n \tif (open_single_tx_pcap(pcap_filename, &dumper) < 0)\n \t\treturn -1;\n \n \tif (add_queue(dumpers, pcap_filename, key, NULL, dumper) < 0) {\n-\t\tpcap_dump_close(dumper);\n+\t\tosdep_pcap_dump_close(dumper);\n \t\treturn -1;\n \t}\n \n@@ -998,7 +998,7 @@ open_rx_tx_iface(const char *key, const char *value, void *extra_args)\n {\n \tconst char *iface = value;\n \tstruct pmd_devargs *tx = extra_args;\n-\tpcap_t *pcap = NULL;\n+\tosdep_pcap *pcap = NULL;\n \n \tif (open_single_iface(iface, &pcap) < 0)\n \t\treturn -1;\n@@ -1011,13 +1011,14 @@ open_rx_tx_iface(const char *key, const char *value, void *extra_args)\n }\n \n static inline int\n-set_iface_direction(const char *iface, pcap_t *pcap,\n-\t\tpcap_direction_t direction)\n+set_iface_direction(const char *iface, osdep_pcap *pcap,\n+\t\tenum osdep_pcap_direction direction)\n {\n-\tconst char *direction_str = (direction == PCAP_D_IN) ? \"IN\" : \"OUT\";\n-\tif (pcap_setdirection(pcap, direction) < 0) {\n+\tconst char *direction_str =\n+\t\t(direction == OSDEP_PCAP_D_IN) ? \"IN\" : \"OUT\";\n+\tif (osdep_pcap_setdirection(pcap, direction) < 0) {\n \t\tPMD_LOG(ERR, \"Setting %s pcap direction %s failed - %s\\n\",\n-\t\t\t\tiface, direction_str, pcap_geterr(pcap));\n+\t\t\t\tiface, direction_str, osdep_pcap_geterr(pcap));\n \t\treturn -1;\n \t}\n \tPMD_LOG(INFO, \"Setting %s pcap direction %s\\n\",\n@@ -1030,12 +1031,12 @@ open_iface(const char *key, const char *value, void *extra_args)\n {\n \tconst char *iface = value;\n \tstruct pmd_devargs *pmd = extra_args;\n-\tpcap_t *pcap = NULL;\n+\tosdep_pcap *pcap = NULL;\n \n \tif (open_single_iface(iface, &pcap) < 0)\n \t\treturn -1;\n \tif (add_queue(pmd, iface, key, pcap, NULL) < 0) {\n-\t\tpcap_close(pcap);\n+\t\tosdep_pcap_close(pcap);\n \t\treturn -1;\n \t}\n \n@@ -1057,7 +1058,7 @@ open_rx_iface(const char *key, const char *value, void *extra_args)\n \n \t\tset_iface_direction(pmd->queue[qid].name,\n \t\t\t\tpmd->queue[qid].pcap,\n-\t\t\t\tPCAP_D_IN);\n+\t\t\t\tOSDEP_PCAP_D_IN);\n \t}\n \n \treturn 0;\n@@ -1311,7 +1312,7 @@ pmd_pcap_probe(struct rte_vdev_device *dev)\n \tname = rte_vdev_device_name(dev);\n \tPMD_LOG(INFO, \"Initializing pmd_pcap for %s\", name);\n \n-\tgettimeofday(&start_time, NULL);\n+\trte_time_get_us(&start_time);\n \tstart_cycles = rte_get_timer_cycles();\n \thz = rte_get_timer_hz();\n \ndiff --git a/drivers/net/pcap/pcap_osdep.c b/drivers/net/pcap/pcap_osdep.c\nnew file mode 100644\nindex 000000000..5cac9bb89\n--- /dev/null\n+++ b/drivers/net/pcap/pcap_osdep.c\n@@ -0,0 +1,122 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2021 Dmitry Kozlyuk\n+ */\n+\n+#include <pcap.h>\n+\n+#include <rte_common.h>\n+\n+#include \"pcap_osdep.h\"\n+\n+static inline void\n+to_osdep_header(const struct pcap_pkthdr *in, struct osdep_pcap_pkthdr *out)\n+{\n+\tout->ts.sec = in->ts.tv_sec;\n+\tout->ts.usec = in->ts.tv_usec;\n+\tout->caplen = in->caplen;\n+\tout->len = in->len;\n+}\n+\n+static inline void\n+to_pcap_header(const struct osdep_pcap_pkthdr *in, struct pcap_pkthdr *out)\n+{\n+\tout->ts.tv_sec = in->ts.sec;\n+\tout->ts.tv_usec = in->ts.usec;\n+\tout->caplen = in->caplen;\n+\tout->len = in->len;\n+}\n+\n+osdep_pcap *\n+osdep_pcap_open_live(const char *device, int snaplen,\n+\tint promisc, int to_ms, char *errbuf)\n+{\n+\tRTE_BUILD_BUG_ON(OSDEP_PCAP_ERRBUF_SIZE != PCAP_ERRBUF_SIZE);\n+\n+\treturn (osdep_pcap *)pcap_open_live(device, snaplen, promisc, to_ms,\n+\t\terrbuf);\n+}\n+\n+osdep_pcap *\n+osdep_pcap_open_offline(const char *fname, char *errbuf)\n+{\n+\treturn (osdep_pcap *)pcap_open_offline(fname, errbuf);\n+}\n+\n+osdep_pcap *\n+osdep_pcap_open_dead_with_tstamp_precision(int linktype, int snaplen,\n+\tunsigned int precision)\n+{\n+\tRTE_BUILD_BUG_ON(OSDEP_DLT_EN10MB != DLT_EN10MB);\n+\tRTE_BUILD_BUG_ON(OSDEP_PCAP_TSTAMP_PRECISION_NANO !=\n+\t\t\tPCAP_TSTAMP_PRECISION_NANO);\n+\n+\treturn (osdep_pcap *)pcap_open_dead_with_tstamp_precision(linktype,\n+\t\tsnaplen, precision);\n+}\n+\n+const uint8_t *\n+osdep_pcap_next(osdep_pcap *pcap, struct osdep_pcap_pkthdr *header)\n+{\n+\tconst uint8_t *data;\n+\tstruct pcap_pkthdr pkthdr;\n+\n+\tdata = pcap_next((pcap_t *)pcap, &pkthdr);\n+\tto_osdep_header(&pkthdr, header);\n+\treturn data;\n+}\n+\n+int\n+osdep_pcap_sendpacket(osdep_pcap *pcap, const uint8_t *buf, int size)\n+{\n+\treturn pcap_sendpacket((pcap_t *)pcap, buf, size);\n+}\n+\n+void\n+osdep_pcap_close(osdep_pcap *pcap)\n+{\n+\tpcap_close((pcap_t *)pcap);\n+}\n+\n+osdep_pcap_dumper *\n+osdep_pcap_dump_open(osdep_pcap *pcap, const char *fname)\n+{\n+\treturn (osdep_pcap_dumper *)pcap_dump_open((pcap_t *)pcap, fname);\n+}\n+\n+void\n+osdep_pcap_dump(uint8_t *user, const struct osdep_pcap_pkthdr *header,\n+\tconst uint8_t *sp)\n+{\n+\tstruct pcap_pkthdr pkthdr;\n+\n+\tto_pcap_header(header, &pkthdr);\n+\tpcap_dump(user, &pkthdr, sp);\n+}\n+\n+int\n+osdep_pcap_dump_flush(osdep_pcap_dumper *p)\n+{\n+\treturn pcap_dump_flush((pcap_dumper_t *)p);\n+}\n+\n+void\n+osdep_pcap_dump_close(osdep_pcap_dumper *p)\n+{\n+\tpcap_dump_close((pcap_dumper_t *)p);\n+}\n+\n+int\n+osdep_pcap_setdirection(osdep_pcap *pcap, enum osdep_pcap_direction dir)\n+{\n+\tRTE_BUILD_BUG_ON((int)OSDEP_PCAP_D_INOUT != (int)PCAP_D_INOUT);\n+\tRTE_BUILD_BUG_ON((int)OSDEP_PCAP_D_IN != (int)PCAP_D_IN);\n+\tRTE_BUILD_BUG_ON((int)OSDEP_PCAP_D_OUT != (int)PCAP_D_OUT);\n+\n+\treturn pcap_setdirection((pcap_t *)pcap, (pcap_direction_t)dir);\n+}\n+\n+const char *\n+osdep_pcap_geterr(osdep_pcap *pcap)\n+{\n+\treturn pcap_geterr((pcap_t *)pcap);\n+}\ndiff --git a/drivers/net/pcap/pcap_osdep.h b/drivers/net/pcap/pcap_osdep.h\nindex 46810d86f..bd00b728a 100644\n--- a/drivers/net/pcap/pcap_osdep.h\n+++ b/drivers/net/pcap/pcap_osdep.h\n@@ -6,6 +6,7 @@\n #define _RTE_PCAP_OSDEP_\n \n #include <rte_ether.h>\n+#include <rte_time.h>\n \n /*\n  * Interface manipulation is always OS-specific.\n@@ -14,4 +15,53 @@\n int osdep_iface_index_get(const char *name);\n int osdep_iface_mac_get(const char *name, struct rte_ether_addr *mac);\n \n+/*\n+ * On Windows, libpcap (npcap or WinPcap) exposes Win32 API which clashes\n+ * with some DPDK constructs. Trivial libpcap wrappers with \"osdep_\" prefix\n+ * are provided to isolate PMD code from Win32 API.\n+ */\n+\n+#define OSDEP_DLT_EN10MB 1\n+\n+#define OSDEP_PCAP_ERRBUF_SIZE 256\n+\n+#define OSDEP_PCAP_TSTAMP_PRECISION_NANO 1\n+\n+/** Handle for an open packet capture. */\n+typedef struct osdep_pcap_type osdep_pcap;\n+\n+/** Handle for an open packet dump. */\n+typedef struct osdep_pcap_dumper_type osdep_pcap_dumper;\n+\n+struct osdep_pcap_pkthdr {\n+\tstruct rte_time_us ts;\n+\tuint32_t caplen;\n+\tuint32_t len;\n+};\n+\n+enum osdep_pcap_direction {\n+\tOSDEP_PCAP_D_INOUT = 0,\n+\tOSDEP_PCAP_D_IN,\n+\tOSDEP_PCAP_D_OUT\n+};\n+\n+osdep_pcap *osdep_pcap_open_live(const char *device, int snaplen,\n+\tint promisc, int to_ms, char *errbuf);\n+osdep_pcap *osdep_pcap_open_offline(const char *fname, char *errbuf);\n+osdep_pcap *osdep_pcap_open_dead_with_tstamp_precision(int linktype,\n+\tint snaplen, unsigned int precision);\n+const uint8_t *osdep_pcap_next(osdep_pcap *pcap,\n+\tstruct osdep_pcap_pkthdr *header);\n+int osdep_pcap_sendpacket(osdep_pcap *pcap, const uint8_t *buf, int size);\n+void osdep_pcap_close(osdep_pcap *pcap);\n+\n+osdep_pcap_dumper *osdep_pcap_dump_open(osdep_pcap *pcap, const char *fname);\n+void osdep_pcap_dump(uint8_t *user, const struct osdep_pcap_pkthdr *header,\n+\tconst uint8_t *sp);\n+int osdep_pcap_dump_flush(osdep_pcap_dumper *p);\n+void osdep_pcap_dump_close(osdep_pcap_dumper *p);\n+\n+int osdep_pcap_setdirection(osdep_pcap *pcap, enum osdep_pcap_direction dir);\n+const char *osdep_pcap_geterr(osdep_pcap *pcap);\n+\n #endif\n",
    "prefixes": [
        "v2",
        "4/6"
    ]
}