get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 107738,
    "url": "http://patches.dpdk.org/api/patches/107738/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20220217160613.70161-2-srikanth.k@oneconvergence.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": "<20220217160613.70161-2-srikanth.k@oneconvergence.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20220217160613.70161-2-srikanth.k@oneconvergence.com",
    "date": "2022-02-17T16:05:59",
    "name": "[v3,01/15] bus/vmbus: scan and get the network device",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "d7a84da21319d28c78eccdee483f6481123a7578",
    "submitter": {
        "id": 2368,
        "url": "http://patches.dpdk.org/api/people/2368/?format=api",
        "name": "Srikanth Kaka",
        "email": "srikanth.k@oneconvergence.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20220217160613.70161-2-srikanth.k@oneconvergence.com/mbox/",
    "series": [
        {
            "id": 21713,
            "url": "http://patches.dpdk.org/api/series/21713/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=21713",
            "date": "2022-02-17T16:05:58",
            "name": "add FreeBSD support to VMBUS & NetVSC PMDs",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/21713/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/107738/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/107738/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 B58FBA034E;\n\tThu, 17 Feb 2022 17:10:58 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 80B1B41142;\n\tThu, 17 Feb 2022 17:10:53 +0100 (CET)",
            "from mail-pg1-f196.google.com (mail-pg1-f196.google.com\n [209.85.215.196])\n by mails.dpdk.org (Postfix) with ESMTP id E516D40DDD\n for <dev@dpdk.org>; Thu, 17 Feb 2022 17:06:31 +0100 (CET)",
            "by mail-pg1-f196.google.com with SMTP id 132so5421336pga.5\n for <dev@dpdk.org>; Thu, 17 Feb 2022 08:06:31 -0800 (PST)",
            "from srikanth-ThinkPad-T450.. ([49.37.144.122])\n by smtp.gmail.com with ESMTPSA id z14sm47807pfh.173.2022.02.17.08.06.27\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 17 Feb 2022 08:06:29 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=oneconvergence.com; s=google;\n h=from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-transfer-encoding;\n bh=pabkBfFAiBglzRpekwzDcru5QFSsK7IKQbsOTYwYJbs=;\n b=Y/SscJmvteC2NDqaxCD4jRCsdy1BR++FoWrydkluBluY+R1kOA6dC9ecYc5lGAYbHp\n juaumSjwYBxJtWbsyb7jdiWzKElZYj/cARuxcjaS1UYUy8ZRLRsAqXuXJYTz+213mOkY\n HBMQDWviw3qLYJEs6E8gusLxjzcLWPXTaNAQY=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20210112;\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=pabkBfFAiBglzRpekwzDcru5QFSsK7IKQbsOTYwYJbs=;\n b=a2Kms0bC4CmwDqLsY3RKGrrGOSCg7cqHC1pdJdtrP+DqMEc32hUMgijKuj2q5xje6e\n /ocmuzf2qxAys8A7J0mWWP0QGXeix7fsbz2AFTy1JgHPrnSo0lO7kzmV3GAHyJnlHZcg\n ls2BAlPcc1wHNU8V6X0J1dw3Mda280lc4B9JcY4j0i6WdMFirl07XB2cu965VnaZ0cKS\n N8+yoPVOrZ4PtEYSur2oc6tB5L3RNgQ0RKC8sOgRMyWzzlc0Vg+Y/oXfh3QhW2dffLuo\n pwKZhtWpkDTfpBKcWhg2LDOA+25PAonBxDxjj7mUcOdeu/dFw9ooRUKxy3qBL6YqzL2S\n XTPA==",
        "X-Gm-Message-State": "AOAM530yeYnhhb5+WNDAkULb6K9XNkbBCOmY22Y2PUCQj99iSttEZRTG\n 6KIcGdtBTFJ3Ur2AaTGnqr5MAg==",
        "X-Google-Smtp-Source": "\n ABdhPJxjtLmdqv6FAMcX8LjX5eSlM+Kqv3ShgIbcop1GMD2gd4jDHgJgl25m21KhtvxA3XUQ/Qo7+w==",
        "X-Received": "by 2002:a63:5525:0:b0:372:c376:74f1 with SMTP id\n j37-20020a635525000000b00372c37674f1mr2885259pgb.433.1645113989793;\n Thu, 17 Feb 2022 08:06:29 -0800 (PST)",
        "From": "Srikanth Kaka <srikanth.k@oneconvergence.com>",
        "To": "sthemmin@microsoft.com,\n\tlongli@microsoft.com",
        "Cc": "dev@dpdk.org, vag.singh@oneconvergence.com, avelu@juniper.net,\n Srikanth Kaka <srikanth.k@oneconvergence.com>",
        "Subject": "[PATCH v3 01/15] bus/vmbus: scan and get the network device",
        "Date": "Thu, 17 Feb 2022 21:35:59 +0530",
        "Message-Id": "<20220217160613.70161-2-srikanth.k@oneconvergence.com>",
        "X-Mailer": "git-send-email 2.30.2",
        "In-Reply-To": "<20220217160613.70161-1-srikanth.k@oneconvergence.com>",
        "References": "<20210927134231.11177-1-srikanth.k@oneconvergence.com>\n <20220217160613.70161-1-srikanth.k@oneconvergence.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-Mailman-Approved-At": "Thu, 17 Feb 2022 17:10:51 +0100",
        "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"
    },
    "content": "Using sysctl, all the devices on the VMBUS are identified by the PMD.\nOn finding the Network device's device id, it is added to VMBUS dev\nlist.\n\nSigned-off-by: Srikanth Kaka <srikanth.k@oneconvergence.com>\nSigned-off-by: Vag Singh <vag.singh@oneconvergence.com>\nSigned-off-by: Anand Thulasiram <avelu@juniper.net>\n---\n drivers/bus/vmbus/freebsd/vmbus_bus.c | 249 ++++++++++++++++++++++++++\n 1 file changed, 249 insertions(+)\n create mode 100644 drivers/bus/vmbus/freebsd/vmbus_bus.c",
    "diff": "diff --git a/drivers/bus/vmbus/freebsd/vmbus_bus.c b/drivers/bus/vmbus/freebsd/vmbus_bus.c\nnew file mode 100644\nindex 0000000000..c8583aba37\n--- /dev/null\n+++ b/drivers/bus/vmbus/freebsd/vmbus_bus.c\n@@ -0,0 +1,249 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2018, Microsoft Corporation.\n+ * All Rights Reserved.\n+ */\n+\n+#include <rte_eal.h>\n+#include <rte_bus_vmbus.h>\n+\n+#include \"private.h\"\n+\n+#include <sys/bus.h>\n+#include <sys/types.h>\n+#include <sys/sysctl.h>\n+\n+/*\n+ * GUID associated with network devices\n+ * {f8615163-df3e-46c5-913f-f2d2f965ed0e}\n+ */\n+static const rte_uuid_t vmbus_nic_uuid = {\n+\t0xf8, 0x61, 0x51, 0x63,\n+\t0xdf, 0x3e,\n+\t0x46, 0xc5,\n+\t0x91, 0x3f,\n+\t0xf2, 0xd2, 0xf9, 0x65, 0xed, 0xe\n+};\n+\n+extern struct rte_vmbus_bus rte_vmbus_bus;\n+\n+/* Parse UUID. Caller must pass NULL terminated string */\n+static int\n+parse_sysfs_uuid(const char *filename, rte_uuid_t uu)\n+{\n+\tchar in[BUFSIZ];\n+\n+\tmemcpy(in, filename, BUFSIZ);\n+\tif (rte_uuid_parse(in, uu) < 0) {\n+\t\tVMBUS_LOG(ERR, \"%s not a valid UUID\", in);\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/* Scan one vmbus entry, and fill the devices list from it. */\n+static int\n+vmbus_scan_one(const char *name, unsigned int unit_num)\n+{\n+\tstruct rte_vmbus_device *dev, *dev2;\n+\tchar sysctlBuffer[PATH_MAX], sysctlVar[PATH_MAX];\n+\tsize_t guid_len = 36, len = PATH_MAX;\n+\tchar classid[guid_len + 1], deviceid[guid_len + 1];\n+\n+\tdev = calloc(1, sizeof(*dev));\n+\tif (dev == NULL)\n+\t\treturn -1;\n+\n+\t/* get class id and device id */\n+\tsnprintf(sysctlVar, len, \"dev.%s.%u.%%pnpinfo\", name, unit_num);\n+\tif (sysctlbyname(sysctlVar, &sysctlBuffer, &len, NULL, 0) < 0)\n+\t\tgoto error;\n+\n+\t/* pnpinfo: classid=f912ad6d-2b17-48ea-bd65-f927a61c7684\n+\t * deviceid=d34b2567-b9b6-42b9-8778-0a4ec0b955bf\n+\t */\n+\tif (sysctlBuffer[0] == 'c' && sysctlBuffer[1] == 'l' &&\n+\t    sysctlBuffer[7] == '=') {\n+\t\tmemcpy(classid, &sysctlBuffer[8], guid_len);\n+\t\tclassid[guid_len] = '\\0';\n+\t}\n+\tif (parse_sysfs_uuid(classid, dev->class_id) < 0)\n+\t\tgoto error;\n+\n+\t/* skip non-network devices */\n+\tif (rte_uuid_compare(dev->class_id, vmbus_nic_uuid) != 0) {\n+\t\tfree(dev);\n+\t\treturn 0;\n+\t}\n+\n+\tif (sysctlBuffer[45] == 'd' && sysctlBuffer[46] == 'e' &&\n+\t    sysctlBuffer[47] == 'v' && sysctlBuffer[53] == '=') {\n+\t\tmemcpy(deviceid, &sysctlBuffer[54], guid_len);\n+\t\tdeviceid[guid_len] = '\\0';\n+\t}\n+\tif (parse_sysfs_uuid(deviceid, dev->device_id) < 0)\n+\t\tgoto error;\n+\n+\tif (!strcmp(name, \"hv_uio\"))\n+\t\tdev->uio_num = unit_num;\n+\telse\n+\t\tdev->uio_num = -1;\n+\tdev->device.bus = &rte_vmbus_bus.bus;\n+\tdev->device.numa_node = 0;\n+\tdev->device.name = strdup(deviceid);\n+\tif (!dev->device.name)\n+\t\tgoto error;\n+\n+\tdev->device.devargs = vmbus_devargs_lookup(dev);\n+\n+\t/* device is valid, add in list (sorted) */\n+\tVMBUS_LOG(DEBUG, \"Adding vmbus device %s\", name);\n+\n+\tTAILQ_FOREACH(dev2, &rte_vmbus_bus.device_list, next) {\n+\t\tint ret;\n+\n+\t\tret = rte_uuid_compare(dev->device_id, dev2->device_id);\n+\t\tif (ret > 0)\n+\t\t\tcontinue;\n+\n+\t\tif (ret < 0) {\n+\t\t\tvmbus_insert_device(dev2, dev);\n+\t\t} else { /* already registered */\n+\t\t\tVMBUS_LOG(NOTICE,\n+\t\t\t\t\"%s already registered\", name);\n+\t\t\tfree(dev);\n+\t\t}\n+\t\treturn 0;\n+\t}\n+\n+\tvmbus_add_device(dev);\n+\treturn 0;\n+error:\n+\tVMBUS_LOG(DEBUG, \"failed\");\n+\n+\tfree(dev);\n+\treturn -1;\n+}\n+\n+/*\n+ * Scan the content of the vmbus, and the devices in the devices list\n+ */\n+int\n+rte_vmbus_scan(void)\n+{\n+\tstruct u_device udev;\n+\tstruct u_businfo ubus;\n+\tint dev_idx, dev_ptr, name2oid[2], oid[CTL_MAXNAME + 12], error;\n+\tsize_t oidlen, rlen, ub_size;\n+\tuintptr_t vmbus_handle = 0;\n+\tchar *walker, *ep;\n+\tchar name[16] = \"hw.bus.devices\";\n+\tchar *dd_name, *dd_desc, *dd_drivername, *dd_pnpinfo, *dd_location;\n+\n+\t/*\n+\t * devinfo FreeBSD APP logic to fetch all the VMBus devices\n+\t * using SYSCTLs\n+\t */\n+\tname2oid[0] = 0;\n+\tname2oid[1] = 3;\n+\toidlen = sizeof(oid);\n+\terror = sysctl(name2oid, 2, oid, &oidlen, name, strlen(name));\n+\tif (error < 0) {\n+\t\tVMBUS_LOG(DEBUG, \"can't find hw.bus.devices sysctl node\");\n+\t\treturn -ENOENT;\n+\t}\n+\toidlen /= sizeof(int);\n+\tif (oidlen > CTL_MAXNAME) {\n+\t\tVMBUS_LOG(DEBUG, \"hw.bus.devices oid is too large\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tub_size = sizeof(ubus);\n+\tif (sysctlbyname(\"hw.bus.info\", &ubus, &ub_size, NULL, 0) != 0) {\n+\t\tVMBUS_LOG(DEBUG, \"sysctlbyname(\\\"hw.bus.info\\\", ...) failed\");\n+\t\treturn -EINVAL;\n+\t}\n+\tif ((ub_size != sizeof(ubus)) ||\n+\t    (ubus.ub_version != BUS_USER_VERSION)) {\n+\t\tVMBUS_LOG(DEBUG,\n+\t\t\t\"kernel bus interface version mismatch: kernel %d expected %d\",\n+\t\t\tubus.ub_version, BUS_USER_VERSION);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\toid[oidlen++] = ubus.ub_generation;\n+\tdev_ptr = oidlen++;\n+\n+\t/*\n+\t * Scan devices.\n+\t *\n+\t * Stop after a fairly insane number to avoid death in the case\n+\t * of kernel corruption.\n+\t */\n+\n+\tfor (dev_idx = 0; dev_idx < 10000; dev_idx++) {\n+\t\t/*\n+\t\t * Get the device information.\n+\t\t */\n+\t\toid[dev_ptr] = dev_idx;\n+\t\trlen = sizeof(udev);\n+\t\terror = sysctl(oid, oidlen, &udev, &rlen, NULL, 0);\n+\t\tif (error < 0) {\n+\t\t\tif (errno == ENOENT)    /* end of list */\n+\t\t\t\tbreak;\n+\t\t\tif (errno != EINVAL)    /* gen count skip, restart */\n+\t\t\t\tVMBUS_LOG(DEBUG, \"sysctl hw.bus.devices.%d\",\n+\t\t\t\t\tdev_idx);\n+\t\t\treturn errno;\n+\t\t}\n+\t\tif (rlen != sizeof(udev)) {\n+\t\t\tVMBUS_LOG(DEBUG,\n+\t\t\t\t\"sysctl returned wrong data %zd bytes instead of %zd\",\n+\t\t\t\trlen, sizeof(udev));\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\n+\t\twalker = udev.dv_fields;\n+\t\tep = walker + sizeof(udev.dv_fields);\n+\t\tdd_name = NULL;\n+\t\tdd_desc = NULL;\n+\t\tdd_drivername = NULL;\n+\t\tdd_pnpinfo = NULL;\n+\t\tdd_location = NULL;\n+#define UNPACK(x)\t\t\t\t\t\t \\\n+\tdo {\t\t\t\t\t\t\t \\\n+\t\tx = strdup(walker);\t\t\t\t \\\n+\t\tif (x == NULL)\t\t\t\t\t \\\n+\t\t\treturn -ENOMEM;\t\t\t\t \\\n+\t\tif (walker + strnlen(walker, ep - walker) >= ep) \\\n+\t\t\treturn -EINVAL;\t\t\t\t \\\n+\t\twalker += strlen(walker) + 1;\t\t\t \\\n+\t} while (0)\n+\n+\t\tUNPACK(dd_name);\n+\t\tUNPACK(dd_desc);\n+\t\tUNPACK(dd_drivername);\n+\t\tUNPACK(dd_pnpinfo);\n+\t\tUNPACK(dd_location);\n+#undef UNPACK\n+\t\tif (*dd_drivername && !(strcmp(dd_drivername, \"vmbus\")))\n+\t\t\tvmbus_handle = udev.dv_handle;\n+\n+\t\tif (vmbus_handle && (vmbus_handle == udev.dv_parent)\n+\t\t    && *dd_pnpinfo && *dd_name) {\n+\t\t\tunsigned int driver_len = 0, unit_num = 0;\n+\t\t\tchar *endptr;\n+\n+\t\t\tdriver_len = strlen(dd_drivername);\n+\t\t\tunit_num = strtoull(&dd_name[driver_len], &endptr, 10);\n+\t\t\tVMBUS_LOG(DEBUG, \"Device name:%s, pnpinfo:%s\",\n+\t\t\t\tdd_name, dd_pnpinfo);\n+\n+\t\t\tif (vmbus_scan_one(dd_drivername, unit_num) < 0)\n+\t\t\t\tgoto error;\n+\t\t}\n+\t}\n+\treturn 0;\n+error:\n+\treturn -1;\n+}\n",
    "prefixes": [
        "v3",
        "01/15"
    ]
}