get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 86499,
    "url": "https://patches.dpdk.org/api/patches/86499/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210114061411.39166-2-chenbo.xia@intel.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": "<20210114061411.39166-2-chenbo.xia@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210114061411.39166-2-chenbo.xia@intel.com",
    "date": "2021-01-14T06:14:03",
    "name": "[v2,1/9] lib: introduce vfio-user library",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "3596d762115e5cad3ba0be1a6c28c7641d630ec7",
    "submitter": {
        "id": 1276,
        "url": "https://patches.dpdk.org/api/people/1276/?format=api",
        "name": "Chenbo Xia",
        "email": "chenbo.xia@intel.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/20210114061411.39166-2-chenbo.xia@intel.com/mbox/",
    "series": [
        {
            "id": 14711,
            "url": "https://patches.dpdk.org/api/series/14711/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=14711",
            "date": "2021-01-14T06:14:02",
            "name": "Introduce vfio-user library",
            "version": 2,
            "mbox": "https://patches.dpdk.org/series/14711/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/86499/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/86499/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 C0AB1A0A02;\n\tThu, 14 Jan 2021 07:19:35 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 5F32F140D5F;\n\tThu, 14 Jan 2021 07:19:33 +0100 (CET)",
            "from mga04.intel.com (mga04.intel.com [192.55.52.120])\n by mails.dpdk.org (Postfix) with ESMTP id C139C140D5C\n for <dev@dpdk.org>; Thu, 14 Jan 2021 07:19:31 +0100 (CET)",
            "from orsmga003.jf.intel.com ([10.7.209.27])\n by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 13 Jan 2021 22:19:31 -0800",
            "from npg-dpdk-virtio-xiachenbo-nw.sh.intel.com ([10.67.119.123])\n by orsmga003.jf.intel.com with ESMTP; 13 Jan 2021 22:19:28 -0800"
        ],
        "IronPort-SDR": [
            "\n 5PHYBBWoRSRujyb2ucBq8AkIYToDvzWuEs2HurabaaauyYzkw6MsK2N5yt6lwFjfr6jDIXWKZ7\n ZPgy6T+WwDMw==",
            "\n Z+SQGIfyQt9laUVvxkh/4UqtvRDqTVaf8S9bwNrZah79djzL8Sd3eQY+Fh0N2jW+6auvfbwZNK\n UdUmWDLMGQ4w=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6000,8403,9863\"; a=\"175735621\"",
            "E=Sophos;i=\"5.79,346,1602572400\"; d=\"scan'208\";a=\"175735621\"",
            "E=Sophos;i=\"5.79,346,1602572400\"; d=\"scan'208\";a=\"349068948\""
        ],
        "X-ExtLoop1": "1",
        "From": "Chenbo Xia <chenbo.xia@intel.com>",
        "To": "dev@dpdk.org,\n\tthomas@monjalon.net,\n\tdavid.marchand@redhat.com",
        "Cc": "stephen@networkplumber.org, cunming.liang@intel.com, xiuchun.lu@intel.com,\n miao.li@intel.com, jingjing.wu@intel.com, beilei.xing@intel.com",
        "Date": "Thu, 14 Jan 2021 14:14:03 +0800",
        "Message-Id": "<20210114061411.39166-2-chenbo.xia@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20210114061411.39166-1-chenbo.xia@intel.com>",
        "References": "<20201218073851.93609-1-chenbo.xia@intel.com>\n <20210114061411.39166-1-chenbo.xia@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v2 1/9] lib: introduce vfio-user library",
        "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": "This patch introduces vfio-user library, which follows vfio-user\nprotocol v1.0. As vfio-user has server and client implementation,\nthis patch introduces basic structures and internal functions that\nwill be used by both server and client.\n\nSigned-off-by: Chenbo Xia <chenbo.xia@intel.com>\nSigned-off-by: Xiuchun Lu <xiuchun.lu@intel.com>\n---\n MAINTAINERS                           |   4 +\n lib/librte_vfio_user/meson.build      |   9 ++\n lib/librte_vfio_user/version.map      |   3 +\n lib/librte_vfio_user/vfio_user_base.c | 211 ++++++++++++++++++++++++++\n lib/librte_vfio_user/vfio_user_base.h |  65 ++++++++\n lib/meson.build                       |   1 +\n 6 files changed, 293 insertions(+)\n create mode 100644 lib/librte_vfio_user/meson.build\n create mode 100644 lib/librte_vfio_user/version.map\n create mode 100644 lib/librte_vfio_user/vfio_user_base.c\n create mode 100644 lib/librte_vfio_user/vfio_user_base.h",
    "diff": "diff --git a/MAINTAINERS b/MAINTAINERS\nindex 6787b15dcc..91b8b2ccc1 100644\n--- a/MAINTAINERS\n+++ b/MAINTAINERS\n@@ -1541,6 +1541,10 @@ M: Nithin Dabilpuram <ndabilpuram@marvell.com>\n M: Pavan Nikhilesh <pbhagavatula@marvell.com>\n F: lib/librte_node/\n \n+Vfio-user - EXPERIMENTAL\n+M: Chenbo Xia <chenbo.xia@intel.com>\n+M: Xiuchun Lu <xiuchun.lu@intel.com>\n+F: lib/librte_vfio_user/\n \n Test Applications\n -----------------\ndiff --git a/lib/librte_vfio_user/meson.build b/lib/librte_vfio_user/meson.build\nnew file mode 100644\nindex 0000000000..0f6407b80f\n--- /dev/null\n+++ b/lib/librte_vfio_user/meson.build\n@@ -0,0 +1,9 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright(c) 2020 Intel Corporation\n+\n+if not is_linux\n+\tbuild = false\n+\treason = 'only supported on Linux'\n+endif\n+\n+sources = files('vfio_user_base.c')\ndiff --git a/lib/librte_vfio_user/version.map b/lib/librte_vfio_user/version.map\nnew file mode 100644\nindex 0000000000..33c1b976f1\n--- /dev/null\n+++ b/lib/librte_vfio_user/version.map\n@@ -0,0 +1,3 @@\n+EXPERIMENTAL {\n+\tlocal: *;\n+};\ndiff --git a/lib/librte_vfio_user/vfio_user_base.c b/lib/librte_vfio_user/vfio_user_base.c\nnew file mode 100644\nindex 0000000000..b9fdff5b02\n--- /dev/null\n+++ b/lib/librte_vfio_user/vfio_user_base.c\n@@ -0,0 +1,211 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2020 Intel Corporation\n+ */\n+\n+#include <unistd.h>\n+#include <sys/socket.h>\n+#include <string.h>\n+\n+#include \"vfio_user_base.h\"\n+\n+int vfio_user_log_level;\n+\n+const char *vfio_user_msg_str[VFIO_USER_MAX] = {\n+\t[VFIO_USER_NONE] = \"VFIO_USER_NONE\",\n+\t[VFIO_USER_VERSION] = \"VFIO_USER_VERSION\",\n+};\n+\n+void\n+vfio_user_close_msg_fds(struct vfio_user_msg *msg)\n+{\n+\tint i;\n+\n+\tfor (i = 0; i < msg->fd_num; i++)\n+\t\tclose(msg->fds[i]);\n+}\n+\n+int\n+vfio_user_check_msg_fdnum(struct vfio_user_msg *msg, int expected_fds)\n+{\n+\tif (msg->fd_num == expected_fds)\n+\t\treturn 0;\n+\n+\tVFIO_USER_LOG(ERR, \"Expect %d FDs for request %s, received %d\\n\",\n+\t\texpected_fds, vfio_user_msg_str[msg->cmd], msg->fd_num);\n+\n+\tvfio_user_close_msg_fds(msg);\n+\n+\treturn -1;\n+}\n+\n+static int\n+vfio_user_recv_fd_msg(int sockfd, char *buf, int buflen, int *fds,\n+\tint max_fds, int *fd_num)\n+{\n+\tstruct iovec iov;\n+\tstruct msghdr msgh;\n+\tchar control[CMSG_SPACE(max_fds * sizeof(int))];\n+\tstruct cmsghdr *cmsg;\n+\tint fd_sz, got_fds = 0;\n+\tint ret, i;\n+\n+\t*fd_num = 0;\n+\n+\tmemset(&msgh, 0, sizeof(msgh));\n+\tiov.iov_base = buf;\n+\tiov.iov_len  = buflen;\n+\n+\tmsgh.msg_iov = &iov;\n+\tmsgh.msg_iovlen = 1;\n+\tmsgh.msg_control = control;\n+\tmsgh.msg_controllen = sizeof(control);\n+\n+\tret = recvmsg(sockfd, &msgh, 0);\n+\tif (ret <= 0) {\n+\t\tif (ret)\n+\t\t\tVFIO_USER_LOG(DEBUG, \"recvmsg failed\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\tif (msgh.msg_flags & (MSG_TRUNC | MSG_CTRUNC)) {\n+\t\tVFIO_USER_LOG(ERR, \"Message is truncated\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\tfor (cmsg = CMSG_FIRSTHDR(&msgh); cmsg != NULL;\n+\t\tcmsg = CMSG_NXTHDR(&msgh, cmsg)) {\n+\t\tif ((cmsg->cmsg_level == SOL_SOCKET) &&\n+\t\t\t(cmsg->cmsg_type == SCM_RIGHTS)) {\n+\t\t\tfd_sz = cmsg->cmsg_len - CMSG_LEN(0);\n+\t\t\tgot_fds = fd_sz / sizeof(int);\n+\t\t\tif (got_fds >= max_fds) {\n+\t\t\t\t/* Invalid message, close fds */\n+\t\t\t\tint *close_fd = (int *)CMSG_DATA(cmsg);\n+\t\t\t\tfor (i = 0; i < got_fds; i++) {\n+\t\t\t\t\tclose_fd += i;\n+\t\t\t\t\tclose(*close_fd);\n+\t\t\t\t}\n+\t\t\t\tVFIO_USER_LOG(ERR, \"fd num exceeds max \"\n+\t\t\t\t\t\"in vfio-user msg\\n\");\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t\t*fd_num = got_fds;\n+\t\t\tmemcpy(fds, CMSG_DATA(cmsg), got_fds * sizeof(int));\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\t/* Make unused file descriptors invalid */\n+\twhile (got_fds < max_fds)\n+\t\tfds[got_fds++] = -1;\n+\n+\treturn ret;\n+}\n+\n+int\n+vfio_user_recv_msg(int sockfd, struct vfio_user_msg *msg)\n+{\n+\tint ret;\n+\n+\tret = vfio_user_recv_fd_msg(sockfd, (char *)msg, VFIO_USER_MSG_HDR_SIZE,\n+\t\tmsg->fds, VFIO_USER_MAX_FD, &msg->fd_num);\n+\tif (ret <= 0) {\n+\t\treturn ret;\n+\t} else if (ret != VFIO_USER_MSG_HDR_SIZE) {\n+\t\tVFIO_USER_LOG(ERR, \"Read unexpected header size\\n\");\n+\t\tret = -1;\n+\t\tgoto err;\n+\t}\n+\n+\tif (msg->size > VFIO_USER_MSG_HDR_SIZE) {\n+\t\tif (msg->size > (sizeof(msg->payload) +\n+\t\t\tVFIO_USER_MSG_HDR_SIZE)) {\n+\t\t\tVFIO_USER_LOG(ERR, \"Read invalid msg size: %d\\n\",\n+\t\t\t\tmsg->size);\n+\t\t\tret = -1;\n+\t\t\tgoto err;\n+\t\t}\n+\n+\t\tret = read(sockfd, &msg->payload,\n+\t\t\tmsg->size - VFIO_USER_MSG_HDR_SIZE);\n+\t\tif (ret <= 0)\n+\t\t\tgoto err;\n+\t\tif (ret != (int)(msg->size - VFIO_USER_MSG_HDR_SIZE)) {\n+\t\t\tVFIO_USER_LOG(ERR, \"Read payload failed\\n\");\n+\t\t\tret = -1;\n+\t\t\tgoto err;\n+\t\t}\n+\t}\n+\n+\treturn ret;\n+err:\n+\tvfio_user_close_msg_fds(msg);\n+\treturn ret;\n+}\n+\n+static int\n+vfio_user_send_fd_msg(int sockfd, char *buf, int buflen, int *fds, int fd_num)\n+{\n+\n+\tstruct iovec iov;\n+\tstruct msghdr msgh;\n+\tsize_t fdsize = fd_num * sizeof(int);\n+\tchar control[CMSG_SPACE(fdsize)];\n+\tstruct cmsghdr *cmsg;\n+\tint ret;\n+\n+\tmemset(&msgh, 0, sizeof(msgh));\n+\tiov.iov_base = buf;\n+\tiov.iov_len = buflen;\n+\n+\tmsgh.msg_iov = &iov;\n+\tmsgh.msg_iovlen = 1;\n+\n+\tif (fds && fd_num > 0) {\n+\t\tmsgh.msg_control = control;\n+\t\tmsgh.msg_controllen = sizeof(control);\n+\t\tcmsg = CMSG_FIRSTHDR(&msgh);\n+\t\tcmsg->cmsg_len = CMSG_LEN(fdsize);\n+\t\tcmsg->cmsg_level = SOL_SOCKET;\n+\t\tcmsg->cmsg_type = SCM_RIGHTS;\n+\t\tmemcpy(CMSG_DATA(cmsg), fds, fdsize);\n+\t} else {\n+\t\tmsgh.msg_control = NULL;\n+\t\tmsgh.msg_controllen = 0;\n+\t}\n+\n+\tdo {\n+\t\tret = sendmsg(sockfd, &msgh, MSG_NOSIGNAL);\n+\t} while (ret < 0 && errno == EINTR);\n+\n+\tif (ret < 0) {\n+\t\tVFIO_USER_LOG(ERR, \"sendmsg error\\n\");\n+\t\treturn ret;\n+\t}\n+\n+\treturn ret;\n+}\n+\n+int\n+vfio_user_send_msg(int sockfd, struct vfio_user_msg *msg)\n+{\n+\tif (!msg)\n+\t\treturn 0;\n+\n+\treturn vfio_user_send_fd_msg(sockfd, (char *)msg,\n+\t\tmsg->size, msg->fds, msg->fd_num);\n+}\n+\n+int\n+vfio_user_reply_msg(int sockfd, struct vfio_user_msg *msg)\n+{\n+\tif (!msg)\n+\t\treturn 0;\n+\n+\tmsg->flags |= VFIO_USER_NEED_NO_RP;\n+\tmsg->flags |= VFIO_USER_TYPE_REPLY;\n+\n+\treturn vfio_user_send_msg(sockfd, msg);\n+}\n+\n+RTE_LOG_REGISTER(vfio_user_log_level, lib.vfio, INFO);\ndiff --git a/lib/librte_vfio_user/vfio_user_base.h b/lib/librte_vfio_user/vfio_user_base.h\nnew file mode 100644\nindex 0000000000..34106cc606\n--- /dev/null\n+++ b/lib/librte_vfio_user/vfio_user_base.h\n@@ -0,0 +1,65 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright(c) 2020 Intel Corporation\n+ */\n+\n+#ifndef _VFIO_USER_BASE_H\n+#define _VFIO_USER_BASE_H\n+\n+#include <rte_log.h>\n+\n+#define VFIO_USER_MAX_FD 1024\n+#define VFIO_USER_MAX_VERSION_DATA 512\n+\n+extern int vfio_user_log_level;\n+extern const char *vfio_user_msg_str[];\n+\n+#define VFIO_USER_LOG(level, fmt, args...)\t\t\t\\\n+\trte_log(RTE_LOG_ ## level, vfio_user_log_level,\t\t\\\n+\t\"VFIO_USER: \" fmt, ## args)\n+\n+struct vfio_user_socket {\n+\tchar *sock_addr;\n+\tint sock_fd;\n+\tint dev_id;\n+};\n+\n+typedef enum VFIO_USER_CMD_TYPE {\n+\tVFIO_USER_NONE = 0,\n+\tVFIO_USER_VERSION = 1,\n+\tVFIO_USER_MAX = 2,\n+} VFIO_USER_CMD_TYPE;\n+\n+struct vfio_user_version {\n+\tuint16_t major;\n+\tuint16_t minor;\n+\t/* Version data (JSON), for now not supported */\n+\tuint8_t ver_data[VFIO_USER_MAX_VERSION_DATA];\n+};\n+\n+struct vfio_user_msg {\n+\tuint16_t msg_id;\n+\tuint16_t cmd;\n+\tuint32_t size;\n+#define VFIO_USER_TYPE_CMD\t(0x0)\t\t/* Message type is COMMAND */\n+#define VFIO_USER_TYPE_REPLY\t(0x1 << 0)\t/* Message type is REPLY */\n+#define VFIO_USER_NEED_NO_RP\t(0x1 << 4)\t/* Message needs no reply */\n+#define VFIO_USER_ERROR\t\t(0x1 << 5)\t/* Reply message has error */\n+\tuint32_t flags;\n+\tuint32_t err;\t\t\t\t/* Valid in reply, optional */\n+\tunion {\n+\t\tstruct vfio_user_version ver;\n+\t} payload;\n+\tint fds[VFIO_USER_MAX_FD];\n+\tint fd_num;\n+};\n+\n+#define VFIO_USER_MSG_HDR_SIZE offsetof(struct vfio_user_msg, payload.ver)\n+\n+void vfio_user_close_msg_fds(struct vfio_user_msg *msg);\n+int vfio_user_check_msg_fdnum(struct vfio_user_msg *msg, int expected_fds);\n+void vfio_user_close_msg_fds(struct vfio_user_msg *msg);\n+int vfio_user_recv_msg(int sockfd, struct vfio_user_msg *msg);\n+int vfio_user_send_msg(int sockfd, struct vfio_user_msg *msg);\n+int vfio_user_reply_msg(int sockfd, struct vfio_user_msg *msg);\n+\n+#endif\ndiff --git a/lib/meson.build b/lib/meson.build\nindex ed00f89146..b7fbfcc95b 100644\n--- a/lib/meson.build\n+++ b/lib/meson.build\n@@ -28,6 +28,7 @@ libraries = [\n \t'rib', 'reorder', 'sched', 'security', 'stack', 'vhost',\n \t# ipsec lib depends on net, crypto and security\n \t'ipsec',\n+\t'vfio_user',\n \t#fib lib depends on rib\n \t'fib',\n \t# add pkt framework libs which use other libs from above\n",
    "prefixes": [
        "v2",
        "1/9"
    ]
}