get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 119899,
    "url": "http://patches.dpdk.org/api/patches/119899/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/c079ae42cce57a45@cs.arizona.edu/",
    "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": "<c079ae42cce57a45@cs.arizona.edu>",
    "list_archive_url": "https://inbox.dpdk.org/dev/c079ae42cce57a45@cs.arizona.edu",
    "date": "2022-11-16T13:09:20",
    "name": "[RFC,v2] net/memif: change socket listener owner uid/gid",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "1a5fd5a9f740f690d98a2cc0e17b73b2f6210e2c",
    "submitter": {
        "id": 1141,
        "url": "http://patches.dpdk.org/api/people/1141/?format=api",
        "name": "Junxiao Shi",
        "email": "git@mail1.yoursunny.com"
    },
    "delegate": {
        "id": 3961,
        "url": "http://patches.dpdk.org/api/users/3961/?format=api",
        "username": "arybchenko",
        "first_name": "Andrew",
        "last_name": "Rybchenko",
        "email": "andrew.rybchenko@oktetlabs.ru"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/c079ae42cce57a45@cs.arizona.edu/mbox/",
    "series": [
        {
            "id": 25785,
            "url": "http://patches.dpdk.org/api/series/25785/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=25785",
            "date": "2022-11-16T13:09:20",
            "name": "[RFC,v2] net/memif: change socket listener owner uid/gid",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/25785/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/119899/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/119899/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 47728A055F;\n\tWed, 16 Nov 2022 14:13:51 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id D30B640E03;\n\tWed, 16 Nov 2022 14:13:50 +0100 (CET)",
            "from mail-il1-f225.google.com (mail-il1-f225.google.com\n [209.85.166.225])\n by mails.dpdk.org (Postfix) with ESMTP id F367440DFB\n for <dev@dpdk.org>; Wed, 16 Nov 2022 14:13:48 +0100 (CET)",
            "by mail-il1-f225.google.com with SMTP id m15so9095448ilq.2\n for <dev@dpdk.org>; Wed, 16 Nov 2022 05:13:48 -0800 (PST)",
            "from enviro1.cs.arizona.edu (enviro1.cs.arizona.edu.\n [192.12.69.240])\n by smtp-relay.gmail.com with ESMTPS id\n j20-20020a056638053400b0035b2fc44585sm766648jar.59.2022.11.16.05.13.47\n for <dev@dpdk.org>\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Wed, 16 Nov 2022 05:13:48 -0800 (PST)",
            "from cs.arizona.edu (lectura.cs.arizona.edu [192.12.69.186])\n by enviro1.cs.arizona.edu (Postfix) with ESMTPS id 61E6B80008\n for <dev@dpdk.org>; Wed, 16 Nov 2022 06:13:47 -0700 (MST)",
            "from localhost (cs.arizona.edu [local])\n by cs.arizona.edu (OpenSMTPD) with ESMTPA id 391559c9\n for <dev@dpdk.org>; Wed, 16 Nov 2022 13:13:47 +0000 (UTC)"
        ],
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20210112;\n h=message-id:to:subject:date:from:references:in-reply-to\n :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n bh=Kh3O+ajz7lxlFU/yDS3HNh2mmqGNtMRfhsmAAQKzdFg=;\n b=P9jYODiuY9Jkb3Fobfl6Q2Qwd9IotW+ZSCMRJ74X4Ow1qLCf99m3hhdH14JnsSQs2C\n ERyhB3DegnLK/jdl6/ofUDuXoGRXVQ92UluYJYxSHtI/+QGYKmXQNJMa2ehZTc/6Gy2x\n hYWf9dNCWZMVwwvfp6XoUzDJ+3f7dnfGSlxgH6benou5Jf5HlQfxIgNOa4cmtNOxNBha\n vc/n2BJAohVfYZ51k2qsxq5RI5anqTunGZjHpTzZmJ9d/6ObnP49aEYyxPL/rNdlhC6w\n vy5ZUOyScxL2DXtTqxPyFD3VIV1vVLO7ZLDtbg/E6rEACSH2JA6Pz9LoEhwP1sSInnHJ\n uy/w==",
        "X-Gm-Message-State": "ANoB5pkbihCo3kZLmFzlFN7oEf10zVlAGvlOUxrGJ2VUuJJSXx79RZwf\n eHgUarlgsdhXbdr32FJDXCk7+t2e/e9xftCiN7LlEnIOqiT0IQ==",
        "X-Google-Smtp-Source": "\n AA0mqf4nuysKv8A1lO6qG2klJ+HmjiZ+NoEHJyWszFkwbBXGF2av813xlc4YIHwxVzXT8yQ9P7vKnpU2WstX",
        "X-Received": "by 2002:a05:6e02:1a01:b0:2ff:b60e:565f with SMTP id\n s1-20020a056e021a0100b002ffb60e565fmr10684309ild.102.1668604428055;\n Wed, 16 Nov 2022 05:13:48 -0800 (PST)",
        "X-Relaying-Domain": "cs.arizona.edu",
        "In-Reply-To": "<c079a935de8f9101@cs.arizona.edu>",
        "References": "<c079a935de8f9101@cs.arizona.edu>",
        "From": "Junxiao Shi <git@mail1.yoursunny.com>",
        "Date": "Wed, 16 Nov 2022 13:09:20 +0000",
        "Subject": "[RFC PATCH v2] net/memif: change socket listener owner uid/gid",
        "To": "dev@dpdk.org",
        "Message-ID": "<c079ae42cce57a45@cs.arizona.edu>",
        "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": "This allows a DPDK application running with root privilege to create a\nmemif socket listener with non-root owner uid and gid, which can be\nconnected from client applications running without root privilege.\n\nSigned-off-by: Junxiao Shi <git@mail1.yoursunny.com>\n---\n doc/guides/nics/memif.rst         |  2 ++\n drivers/net/memif/memif_socket.c  | 13 +++++++--\n drivers/net/memif/rte_eth_memif.c | 46 +++++++++++++++++++++++++++++--\n drivers/net/memif/rte_eth_memif.h |  2 ++\n 4 files changed, 58 insertions(+), 5 deletions(-)",
    "diff": "diff --git a/doc/guides/nics/memif.rst b/doc/guides/nics/memif.rst\nindex aca843640b..8a8141aa72 100644\n--- a/doc/guides/nics/memif.rst\n+++ b/doc/guides/nics/memif.rst\n@@ -44,6 +44,8 @@ client.\n    \"rsize=11\", \"Log2 of ring size. If rsize is 10, actual ring size is 1024\", \"10\", \"1-14\"\n    \"socket=/tmp/memif.sock\", \"Socket filename\", \"/tmp/memif.sock\", \"string len 108\"\n    \"socket-abstract=no\", \"Set usage of abstract socket address\", \"yes\", \"yes|no\"\n+   \"uid=1000\", \"Set socket listener owner uid. Only relevant to server with socket-abstract=no\", \"unchanged\", \"uid_t\"\n+   \"gid=1000\", \"Set socket listener owner gid. Only relevant to server with socket-abstract=no\", \"unchanged\", \"gid_t\"\n    \"mac=01:23:45:ab:cd:ef\", \"Mac address\", \"01:ab:23:cd:45:ef\", \"\"\n    \"secret=abc123\", \"Secret is an optional security option, which if specified, must be matched by peer\", \"\", \"string len 24\"\n    \"zero-copy=yes\", \"Enable/disable zero-copy client mode. Only relevant to client, requires '--single-file-segments' eal argument\", \"no\", \"yes|no\"\ndiff --git a/drivers/net/memif/memif_socket.c b/drivers/net/memif/memif_socket.c\nindex 7886644412..c2b038d01a 100644\n--- a/drivers/net/memif/memif_socket.c\n+++ b/drivers/net/memif/memif_socket.c\n@@ -889,7 +889,7 @@ memif_listener_handler(void *arg)\n }\n \n static struct memif_socket *\n-memif_socket_create(char *key, uint8_t listener, bool is_abstract)\n+memif_socket_create(char *key, uint8_t listener, bool is_abstract, uid_t owner_uid, gid_t owner_gid)\n {\n \tstruct memif_socket *sock;\n \tstruct sockaddr_un un = { 0 };\n@@ -941,6 +941,14 @@ memif_socket_create(char *key, uint8_t listener, bool is_abstract)\n \n \t\tMIF_LOG(DEBUG, \"Memif listener socket %s created.\", sock->filename);\n \n+\t\tif (!is_abstract && (owner_uid != (uid_t)-1 || owner_gid != (gid_t)-1)) {\n+\t\t\tret = chown(sock->filename, owner_uid, owner_gid);\n+\t\t\tif (ret < 0) {\n+\t\t\t\tMIF_LOG(ERR, \"Failed to change listener socket owner %d\", errno);\n+\t\t\t\tgoto error;\n+\t\t\t}\n+\t\t}\n+\n \t\t/* Allocate interrupt instance */\n \t\tsock->intr_handle =\n \t\t\trte_intr_instance_alloc(RTE_INTR_INSTANCE_F_SHARED);\n@@ -1017,7 +1025,8 @@ memif_socket_init(struct rte_eth_dev *dev, const char *socket_filename)\n \tif (ret < 0) {\n \t\tsocket = memif_socket_create(key,\n \t\t\t(pmd->role == MEMIF_ROLE_CLIENT) ? 0 : 1,\n-\t\t\tpmd->flags & ETH_MEMIF_FLAG_SOCKET_ABSTRACT);\n+\t\t\tpmd->flags & ETH_MEMIF_FLAG_SOCKET_ABSTRACT,\n+\t\t\tpmd->owner_uid, pmd->owner_gid);\n \t\tif (socket == NULL)\n \t\t\treturn -1;\n \t\tret = rte_hash_add_key_data(hash, key, socket);\ndiff --git a/drivers/net/memif/rte_eth_memif.c b/drivers/net/memif/rte_eth_memif.c\nindex dd951b8296..d69f0e823f 100644\n--- a/drivers/net/memif/rte_eth_memif.c\n+++ b/drivers/net/memif/rte_eth_memif.c\n@@ -37,6 +37,8 @@\n #define ETH_MEMIF_RING_SIZE_ARG\t\t\"rsize\"\n #define ETH_MEMIF_SOCKET_ARG\t\t\"socket\"\n #define ETH_MEMIF_SOCKET_ABSTRACT_ARG\t\"socket-abstract\"\n+#define ETH_MEMIF_OWNER_UID_ARG\t\t\"owner-uid\"\n+#define ETH_MEMIF_OWNER_GID_ARG\t\t\"owner-gid\"\n #define ETH_MEMIF_MAC_ARG\t\t\"mac\"\n #define ETH_MEMIF_ZC_ARG\t\t\"zero-copy\"\n #define ETH_MEMIF_SECRET_ARG\t\t\"secret\"\n@@ -48,6 +50,8 @@ static const char * const valid_arguments[] = {\n \tETH_MEMIF_RING_SIZE_ARG,\n \tETH_MEMIF_SOCKET_ARG,\n \tETH_MEMIF_SOCKET_ABSTRACT_ARG,\n+\tETH_MEMIF_OWNER_UID_ARG,\n+\tETH_MEMIF_OWNER_GID_ARG,\n \tETH_MEMIF_MAC_ARG,\n \tETH_MEMIF_ZC_ARG,\n \tETH_MEMIF_SECRET_ARG,\n@@ -1515,7 +1519,7 @@ static const struct eth_dev_ops ops = {\n static int\n memif_create(struct rte_vdev_device *vdev, enum memif_role_t role,\n \t     memif_interface_id_t id, uint32_t flags,\n-\t     const char *socket_filename,\n+\t     const char *socket_filename, uid_t owner_uid, gid_t owner_gid,\n \t     memif_log2_ring_size_t log2_ring_size,\n \t     uint16_t pkt_buffer_size, const char *secret,\n \t     struct rte_ether_addr *ether_addr)\n@@ -1554,6 +1558,8 @@ memif_create(struct rte_vdev_device *vdev, enum memif_role_t role,\n \t/* Zero-copy flag irelevant to server. */\n \tif (pmd->role == MEMIF_ROLE_SERVER)\n \t\tpmd->flags &= ~ETH_MEMIF_FLAG_ZERO_COPY;\n+\tpmd->owner_uid = owner_uid;\n+\tpmd->owner_gid = owner_gid;\n \n \tret = memif_socket_init(eth_dev, socket_filename);\n \tif (ret < 0)\n@@ -1740,6 +1746,28 @@ memif_set_is_socket_abstract(const char *key __rte_unused, const char *value, vo\n \treturn 0;\n }\n \n+static int\n+memif_set_owner(const char *key, const char *value, void *extra_args)\n+{\n+\tstatic_assert(sizeof(uid_t) == sizeof(uint32_t), \"\");\n+\tstatic_assert(sizeof(gid_t) == sizeof(uint32_t), \"\");\n+\tuint32_t *id = (uint32_t *)extra_args;\n+\n+\tchar *end = NULL;\n+\tunsigned long val = strtoul(value, &end, 10);\n+\tif (*value == '\\0' || *end != '\\0') {\n+\t\tMIF_LOG(ERR, \"Failed to parse %s: %s.\", key, value);\n+\t\treturn -EINVAL;\n+\t}\n+\tif (val >= UINT32_MAX) {\n+\t\tMIF_LOG(ERR, \"Invalid %s: %s.\", key, value);\n+\t\treturn -ERANGE;\n+\t}\n+\n+\t*id = val;\n+\treturn 0;\n+}\n+\n static int\n memif_set_mac(const char *key __rte_unused, const char *value, void *extra_args)\n {\n@@ -1772,6 +1800,8 @@ rte_pmd_memif_probe(struct rte_vdev_device *vdev)\n \tuint16_t pkt_buffer_size = ETH_MEMIF_DEFAULT_PKT_BUFFER_SIZE;\n \tmemif_log2_ring_size_t log2_ring_size = ETH_MEMIF_DEFAULT_RING_SIZE;\n \tconst char *socket_filename = ETH_MEMIF_DEFAULT_SOCKET_FILENAME;\n+\tuid_t owner_uid = -1;\n+\tgid_t owner_gid = -1;\n \tuint32_t flags = 0;\n \tconst char *secret = NULL;\n \tstruct rte_ether_addr *ether_addr = rte_zmalloc(\"\",\n@@ -1859,6 +1889,14 @@ rte_pmd_memif_probe(struct rte_vdev_device *vdev)\n \t\t\t\t\t &memif_set_mac, ether_addr);\n \t\tif (ret < 0)\n \t\t\tgoto exit;\n+\t\tret = rte_kvargs_process(kvlist, ETH_MEMIF_OWNER_UID_ARG,\n+\t\t\t\t\t &memif_set_owner, &owner_uid);\n+\t\tif (ret < 0)\n+\t\t\tgoto exit;\n+\t\tret = rte_kvargs_process(kvlist, ETH_MEMIF_OWNER_GID_ARG,\n+\t\t\t\t\t &memif_set_owner, &owner_gid);\n+\t\tif (ret < 0)\n+\t\t\tgoto exit;\n \t\tret = rte_kvargs_process(kvlist, ETH_MEMIF_ZC_ARG,\n \t\t\t\t\t &memif_set_zc, &flags);\n \t\tif (ret < 0)\n@@ -1876,7 +1914,7 @@ rte_pmd_memif_probe(struct rte_vdev_device *vdev)\n \t}\n \n \t/* create interface */\n-\tret = memif_create(vdev, role, id, flags, socket_filename,\n+\tret = memif_create(vdev, role, id, flags, socket_filename, owner_uid, owner_gid,\n \t\t\t   log2_ring_size, pkt_buffer_size, secret, ether_addr);\n \n exit:\n@@ -1909,7 +1947,9 @@ RTE_PMD_REGISTER_PARAM_STRING(net_memif,\n \t\t\t      ETH_MEMIF_PKT_BUFFER_SIZE_ARG \"=<int>\"\n \t\t\t      ETH_MEMIF_RING_SIZE_ARG \"=<int>\"\n \t\t\t      ETH_MEMIF_SOCKET_ARG \"=<string>\"\n-\t\t\t\t  ETH_MEMIF_SOCKET_ABSTRACT_ARG \"=yes|no\"\n+\t\t\t      ETH_MEMIF_SOCKET_ABSTRACT_ARG \"=yes|no\"\n+\t\t\t      ETH_MEMIF_OWNER_UID_ARG \"=<int>\"\n+\t\t\t      ETH_MEMIF_OWNER_GID_ARG \"=<int>\"\n \t\t\t      ETH_MEMIF_MAC_ARG \"=xx:xx:xx:xx:xx:xx\"\n \t\t\t      ETH_MEMIF_ZC_ARG \"=yes|no\"\n \t\t\t      ETH_MEMIF_SECRET_ARG \"=<string>\");\ndiff --git a/drivers/net/memif/rte_eth_memif.h b/drivers/net/memif/rte_eth_memif.h\nindex 81e7dceae0..b43895a55f 100644\n--- a/drivers/net/memif/rte_eth_memif.h\n+++ b/drivers/net/memif/rte_eth_memif.h\n@@ -89,6 +89,8 @@ struct pmd_internals {\n /**< use abstract socket address */\n \n \tchar *socket_filename;\t\t\t/**< pointer to socket filename */\n+\tuid_t owner_uid;\t\t\t/**< socket owner uid */\n+\tgid_t owner_gid;\t\t\t/**< socket owner gid */\n \tchar secret[ETH_MEMIF_SECRET_SIZE]; /**< secret (optional security parameter) */\n \n \tstruct memif_control_channel *cc;\t/**< control channel */\n",
    "prefixes": [
        "RFC",
        "v2"
    ]
}