get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 91612,
    "url": "https://patches.dpdk.org/api/patches/91612/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210415221055.1575-4-dmitry.kozliuk@gmail.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<20210415221055.1575-4-dmitry.kozliuk@gmail.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210415221055.1575-4-dmitry.kozliuk@gmail.com",
    "date": "2021-04-15T22:10:55",
    "name": "[v4,3/3] net/pcap: build on Windows",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "3d27e49bd23401cdd0702b15768119c2014d22cd",
    "submitter": {
        "id": 1581,
        "url": "https://patches.dpdk.org/api/people/1581/?format=api",
        "name": "Dmitry Kozlyuk",
        "email": "dmitry.kozliuk@gmail.com"
    },
    "delegate": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20210415221055.1575-4-dmitry.kozliuk@gmail.com/mbox/",
    "series": [
        {
            "id": 16427,
            "url": "https://patches.dpdk.org/api/series/16427/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=16427",
            "date": "2021-04-15T22:10:52",
            "name": "net/pcap: build on Windows",
            "version": 4,
            "mbox": "https://patches.dpdk.org/series/16427/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/91612/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/91612/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 C8C69A0C40;\n\tFri, 16 Apr 2021 00:11:21 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id E9D3A1624BB;\n\tFri, 16 Apr 2021 00:11:09 +0200 (CEST)",
            "from mail-lf1-f51.google.com (mail-lf1-f51.google.com\n [209.85.167.51])\n by mails.dpdk.org (Postfix) with ESMTP id 62C2B1624B0\n for <dev@dpdk.org>; Fri, 16 Apr 2021 00:11:07 +0200 (CEST)",
            "by mail-lf1-f51.google.com with SMTP id y4so1460759lfl.10\n for <dev@dpdk.org>; Thu, 15 Apr 2021 15:11:07 -0700 (PDT)",
            "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 d17sm105591lfb.148.2021.04.15.15.11.05\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 15 Apr 2021 15:11:06 -0700 (PDT)"
        ],
        "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=OM6wg9ot2ydg8swqU4ugVXnb3aHHaWMjzSwB4g6HHGg=;\n b=IntIvy2kbUtVvrYqMV7l7TfBCYfH0xJvAMGDL5yHKl4U+33UnidoxwX6AuYSZWsqZE\n EOKoWG2lMCXT3RapVwm3zmI0zA8qh4lDoKpuT6h/jLoecIEzYOpNKuHK22Qp7OfKNYv5\n vcfwJJaGtGKZ9h8cEOGY1rf4jqAvGnSJZKQEIBmA5Gbk9SXsBV3qa/uftx2QAlNd3G6p\n AZt4cYJCe9Xfkm6+O5920JjD3ph+0w7jqnRVCLRfw/mKJ5NbfsAnAsljOIGgIlARP33r\n h+JtoGFMMAczqQXbheD0jJsjOuc0hsvk992lgp0BMJZRu0PYvMbOQWlfJowu+w4egHkE\n gNWg==",
        "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=OM6wg9ot2ydg8swqU4ugVXnb3aHHaWMjzSwB4g6HHGg=;\n b=rV32vC/Gaucz7/Ai668qbIEo7NZbxX2NlsysU9OhhzCrGQQjPvCxX9k7rQFKreSzkq\n a9lmOharQQlcOJ/5EY87LWZFbvqUS9NzI+9HLUQC/jnJEnlrgS9hCegt1i5Kal6th8YU\n 3iPVG2XduMUlyvf/pCdMHGG2HQh14igBZsbiPj5GTDSGqo7bwK/6T9JZFBOoOj9MX4lL\n cW0outDbym93ktLP0wFUkRlfzebaemee9xy8ZUxjQhPqB7Fullu9SgqTty65BdGvBSm3\n r+q0BzD2U0NUgRNLBT6CRlkgMP2cUx9iZ1yYkvfB6MjWRVggqwcSX/bR4Q1oe56BMhOu\n PwqA==",
        "X-Gm-Message-State": "AOAM533qn/aQxawWu67XFb8mohrA2OXJReXGMokYH5LZ9FjVR+j9VINM\n DsE52LhPQCbg7P4euPND0pshuRLoxWcLVh3y",
        "X-Google-Smtp-Source": "\n ABdhPJzSFQR9VfU62jCGWvB7W1k3g/xHcC0hrQ7azD0eCck/QdQWhLi9dU+nqSbEPQJ6MjiaIjFBWw==",
        "X-Received": "by 2002:a05:6512:3046:: with SMTP id\n b6mr851827lfb.5.1618524666673;\n Thu, 15 Apr 2021 15:11:06 -0700 (PDT)",
        "From": "Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>",
        "To": "dev@dpdk.org",
        "Cc": "Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>,\n Tyler Retzlaff <roretzla@linux.microsoft.com>,\n Bruce Richardson <bruce.richardson@intel.com>,\n Ferruh Yigit <ferruh.yigit@intel.com>",
        "Date": "Fri, 16 Apr 2021 01:10:55 +0300",
        "Message-Id": "<20210415221055.1575-4-dmitry.kozliuk@gmail.com>",
        "X-Mailer": "git-send-email 2.29.3",
        "In-Reply-To": "<20210415221055.1575-1-dmitry.kozliuk@gmail.com>",
        "References": "<20210324005008.24705-1-dmitry.kozliuk@gmail.com>\n <20210415221055.1575-1-dmitry.kozliuk@gmail.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v4 3/3] net/pcap: build on Windows",
        "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": "Implement OS-dependent functions and enable build for Windows.\nAccount for different library name in Windows libpcap distributions.\n\nSigned-off-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>\n---\nTyler, IIRC you were reviewing the code?\nThis patch is the most important one but surprisingly has no acks.\n---\n config/meson.build                     |   5 +-\n doc/guides/rel_notes/release_21_05.rst |   4 +\n drivers/net/pcap/meson.build           |  11 ++-\n drivers/net/pcap/pcap_ethdev.c         |   5 +-\n drivers/net/pcap/pcap_osdep.h          |   5 ++\n drivers/net/pcap/pcap_osdep_windows.c  | 118 +++++++++++++++++++++++++\n 6 files changed, 136 insertions(+), 12 deletions(-)\n create mode 100644 drivers/net/pcap/pcap_osdep_windows.c",
    "diff": "diff --git a/config/meson.build b/config/meson.build\nindex 6e6ef8c0e1..6737cc3e26 100644\n--- a/config/meson.build\n+++ b/config/meson.build\n@@ -182,13 +182,14 @@ endif\n \n # check for pcap\n pcap_dep = dependency('libpcap', required: false, method: 'pkg-config')\n+pcap_lib = is_windows ? 'wpcap' : 'pcap'\n if not pcap_dep.found()\n \t# pcap got a pkg-config file only in 1.9.0\n-\tpcap_dep = cc.find_library('pcap', required: false)\n+\tpcap_dep = cc.find_library(pcap_lib, required: false)\n endif\n if pcap_dep.found() and cc.has_header('pcap.h', dependencies: pcap_dep)\n \tdpdk_conf.set('RTE_PORT_PCAP', 1)\n-\tdpdk_extra_ldflags += '-lpcap'\n+\tdpdk_extra_ldflags += '-l@0@'.format(pcap_lib)\n endif\n \n # for clang 32-bit compiles we need libatomic for 64-bit atomic ops\ndiff --git a/doc/guides/rel_notes/release_21_05.rst b/doc/guides/rel_notes/release_21_05.rst\nindex 2e3bf5c95a..ed0e23a47b 100644\n--- a/doc/guides/rel_notes/release_21_05.rst\n+++ b/doc/guides/rel_notes/release_21_05.rst\n@@ -174,6 +174,10 @@ New Features\n   * Added command to display Rx queue used descriptor count.\n     ``show port (port_id) rxq (queue_id) desc used count``\n \n+* **Enabled libpcap-based PMD on Windows.**\n+\n+   A libpcap distribution, such as Npcap or WinPcap, is required to run the PMD.\n+\n \n Removed Items\n -------------\ndiff --git a/drivers/net/pcap/meson.build b/drivers/net/pcap/meson.build\nindex 26b6066990..63ad3f34f0 100644\n--- a/drivers/net/pcap/meson.build\n+++ b/drivers/net/pcap/meson.build\n@@ -1,18 +1,17 @@\n # SPDX-License-Identifier: BSD-3-Clause\n # Copyright(c) 2017 Intel Corporation\n \n-if is_windows\n-\tbuild = false\n-\treason = 'not supported on Windows'\n-\tsubdir_done()\n-endif\n-\n if not dpdk_conf.has('RTE_PORT_PCAP')\n \tbuild = false\n \treason = 'missing dependency, \"libpcap\"'\n endif\n+\n sources = files(\n \t'pcap_ethdev.c',\n \t'pcap_osdep_@0@.c'.format(exec_env),\n )\n+\n ext_deps += pcap_dep\n+if is_windows\n+\text_deps += cc.find_library('iphlpapi', required: true)\n+endif\ndiff --git a/drivers/net/pcap/pcap_ethdev.c b/drivers/net/pcap/pcap_ethdev.c\nindex 4ac594eeca..3961843efc 100644\n--- a/drivers/net/pcap/pcap_ethdev.c\n+++ b/drivers/net/pcap/pcap_ethdev.c\n@@ -15,6 +15,7 @@\n #include <rte_malloc.h>\n #include <rte_mbuf.h>\n #include <rte_bus_vdev.h>\n+#include <rte_os_shim.h>\n \n #include \"pcap_osdep.h\"\n \n@@ -141,10 +142,6 @@ static struct rte_eth_link pmd_link = {\n \n RTE_LOG_REGISTER(eth_pcap_logtype, pmd.net.pcap, NOTICE);\n \n-#define PMD_LOG(level, fmt, args...) \\\n-\trte_log(RTE_LOG_ ## level, eth_pcap_logtype, \\\n-\t\t\"%s(): \" fmt \"\\n\", __func__, ##args)\n-\n static struct queue_missed_stat*\n queue_missed_stat_update(struct rte_eth_dev *dev, unsigned int qid)\n {\ndiff --git a/drivers/net/pcap/pcap_osdep.h b/drivers/net/pcap/pcap_osdep.h\nindex 9de422ab8d..bf41cba982 100644\n--- a/drivers/net/pcap/pcap_osdep.h\n+++ b/drivers/net/pcap/pcap_osdep.h\n@@ -7,6 +7,11 @@\n \n #include <rte_ether.h>\n \n+#define PMD_LOG(level, fmt, args...) \\\n+\trte_log(RTE_LOG_ ## level, eth_pcap_logtype, \\\n+\t\t\"%s(): \" fmt \"\\n\", __func__, ##args)\n+extern int eth_pcap_logtype;\n+\n int osdep_iface_index_get(const char *name);\n int osdep_iface_mac_get(const char *name, struct rte_ether_addr *mac);\n \ndiff --git a/drivers/net/pcap/pcap_osdep_windows.c b/drivers/net/pcap/pcap_osdep_windows.c\nnew file mode 100644\nindex 0000000000..1d398dc7ed\n--- /dev/null\n+++ b/drivers/net/pcap/pcap_osdep_windows.c\n@@ -0,0 +1,118 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2021 Dmitry Kozlyuk\n+ */\n+\n+#include <winsock2.h>\n+#include <iphlpapi.h>\n+#include <strsafe.h>\n+\n+#include \"pcap_osdep.h\"\n+\n+/*\n+ * Given a device name like \"\\Device\\NPF_{GUID}\" extract the \"{GUID}\" part.\n+ * Return NULL if \"{GUID}\" part is not found.\n+ */\n+static const char *\n+iface_guid(const char *name)\n+{\n+\tstatic const size_t GUID_LENGTH = 32 + 4; /* 16 hex bytes + 4 dashes */\n+\n+\tconst char *ob, *cb;\n+\n+\tob = strchr(name, '{');\n+\tif (ob == NULL)\n+\t\treturn NULL;\n+\n+\tcb = strchr(ob, '}');\n+\tif (cb == NULL || cb - ob != GUID_LENGTH + 1) /* + 1 opening '{' */\n+\t\treturn NULL;\n+\n+\treturn ob;\n+}\n+\n+/*\n+ * libpcap takes device names like \"\\Device\\NPF_{GUID}\",\n+ * GetAdapterIndex() takes interface names like \"\\DEVICE\\TCPIP_{GUID}\".\n+ * Try to convert, fall back to original device name.\n+ */\n+int\n+osdep_iface_index_get(const char *device_name)\n+{\n+\tWCHAR adapter_name[MAX_ADAPTER_NAME_LENGTH];\n+\tconst char *guid;\n+\tULONG index;\n+\tDWORD ret;\n+\n+\tguid = iface_guid(device_name);\n+\tif (guid != NULL)\n+\t\tStringCbPrintfW(adapter_name, sizeof(adapter_name),\n+\t\t\tL\"\\\\DEVICE\\\\TCPIP_%S\", guid);\n+\telse\n+\t\tStringCbPrintfW(adapter_name, sizeof(adapter_name),\n+\t\t\tL\"%S\", device_name);\n+\n+\tret = GetAdapterIndex(adapter_name, &index);\n+\tif (ret != NO_ERROR) {\n+\t\tPMD_LOG(ERR, \"GetAdapterIndex(%S) = %lu\\n\", adapter_name, ret);\n+\t\treturn -1;\n+\t}\n+\n+\treturn index;\n+}\n+\n+/*\n+ * libpcap takes device names like \"\\Device\\NPF_{GUID}\",\n+ * GetAdaptersAddresses() returns names in \"{GUID}\" form.\n+ * Try to extract GUID from device name, fall back to original device name.\n+ */\n+int\n+osdep_iface_mac_get(const char *device_name, struct rte_ether_addr *mac)\n+{\n+\tIP_ADAPTER_ADDRESSES *info = NULL, *cur = NULL;\n+\tULONG size, sys_ret;\n+\tconst char *adapter_name;\n+\tint ret = -1;\n+\n+\tsys_ret = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, &size);\n+\tif (sys_ret != ERROR_BUFFER_OVERFLOW) {\n+\t\tPMD_LOG(ERR, \"GetAdapterAddresses() = %lu, expected %lu\\n\",\n+\t\t\tsys_ret, ERROR_BUFFER_OVERFLOW);\n+\t\treturn -1;\n+\t}\n+\n+\tinfo = (IP_ADAPTER_ADDRESSES *)malloc(size);\n+\tif (info == NULL) {\n+\t\tPMD_LOG(ERR, \"Cannot allocate adapter address info\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\tsys_ret = GetAdaptersAddresses(AF_UNSPEC, 0, NULL, info, &size);\n+\tif (sys_ret != ERROR_SUCCESS) {\n+\t\tPMD_LOG(ERR, \"GetAdapterAddresses() = %lu\\n\", sys_ret);\n+\t\tfree(info);\n+\t\treturn -1;\n+\t}\n+\n+\tadapter_name = iface_guid(device_name);\n+\tif (adapter_name == NULL)\n+\t\tadapter_name = device_name;\n+\n+\tfor (cur = info; cur != NULL; cur = cur->Next) {\n+\t\tif (strcmp(cur->AdapterName, adapter_name) == 0) {\n+\t\t\tif (cur->PhysicalAddressLength != RTE_ETHER_ADDR_LEN) {\n+\t\t\t\tPMD_LOG(ERR, \"Physical address length: want %u, got %lu\",\n+\t\t\t\t\tRTE_ETHER_ADDR_LEN,\n+\t\t\t\t\tcur->PhysicalAddressLength);\n+\t\t\t\tbreak;\n+\t\t\t}\n+\n+\t\t\tmemcpy(mac->addr_bytes, cur->PhysicalAddress,\n+\t\t\t\tRTE_ETHER_ADDR_LEN);\n+\t\t\tret = 0;\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\tfree(info);\n+\treturn ret;\n+}\n",
    "prefixes": [
        "v4",
        "3/3"
    ]
}