From patchwork Wed Nov 16 13:09:20 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Junxiao Shi X-Patchwork-Id: 119899 X-Patchwork-Delegate: andrew.rybchenko@oktetlabs.ru Return-Path: 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]) by inbox.dpdk.org (Postfix) with ESMTP id 47728A055F; Wed, 16 Nov 2022 14:13:51 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D30B640E03; Wed, 16 Nov 2022 14:13:50 +0100 (CET) Received: from mail-il1-f225.google.com (mail-il1-f225.google.com [209.85.166.225]) by mails.dpdk.org (Postfix) with ESMTP id F367440DFB for ; Wed, 16 Nov 2022 14:13:48 +0100 (CET) Received: by mail-il1-f225.google.com with SMTP id m15so9095448ilq.2 for ; Wed, 16 Nov 2022 05:13:48 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=message-id:to:subject:date:from:references:in-reply-to :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Kh3O+ajz7lxlFU/yDS3HNh2mmqGNtMRfhsmAAQKzdFg=; b=P9jYODiuY9Jkb3Fobfl6Q2Qwd9IotW+ZSCMRJ74X4Ow1qLCf99m3hhdH14JnsSQs2C ERyhB3DegnLK/jdl6/ofUDuXoGRXVQ92UluYJYxSHtI/+QGYKmXQNJMa2ehZTc/6Gy2x hYWf9dNCWZMVwwvfp6XoUzDJ+3f7dnfGSlxgH6benou5Jf5HlQfxIgNOa4cmtNOxNBha vc/n2BJAohVfYZ51k2qsxq5RI5anqTunGZjHpTzZmJ9d/6ObnP49aEYyxPL/rNdlhC6w vy5ZUOyScxL2DXtTqxPyFD3VIV1vVLO7ZLDtbg/E6rEACSH2JA6Pz9LoEhwP1sSInnHJ uy/w== X-Gm-Message-State: ANoB5pkbihCo3kZLmFzlFN7oEf10zVlAGvlOUxrGJ2VUuJJSXx79RZwf eHgUarlgsdhXbdr32FJDXCk7+t2e/e9xftCiN7LlEnIOqiT0IQ== X-Google-Smtp-Source: AA0mqf4nuysKv8A1lO6qG2klJ+HmjiZ+NoEHJyWszFkwbBXGF2av813xlc4YIHwxVzXT8yQ9P7vKnpU2WstX X-Received: by 2002:a05:6e02:1a01:b0:2ff:b60e:565f with SMTP id s1-20020a056e021a0100b002ffb60e565fmr10684309ild.102.1668604428055; Wed, 16 Nov 2022 05:13:48 -0800 (PST) Received: from enviro1.cs.arizona.edu (enviro1.cs.arizona.edu. [192.12.69.240]) by smtp-relay.gmail.com with ESMTPS id j20-20020a056638053400b0035b2fc44585sm766648jar.59.2022.11.16.05.13.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Nov 2022 05:13:48 -0800 (PST) X-Relaying-Domain: cs.arizona.edu Received: from cs.arizona.edu (lectura.cs.arizona.edu [192.12.69.186]) by enviro1.cs.arizona.edu (Postfix) with ESMTPS id 61E6B80008 for ; Wed, 16 Nov 2022 06:13:47 -0700 (MST) Received: from localhost (cs.arizona.edu [local]) by cs.arizona.edu (OpenSMTPD) with ESMTPA id 391559c9 for ; Wed, 16 Nov 2022 13:13:47 +0000 (UTC) In-Reply-To: References: From: Junxiao Shi 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: X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org This allows a DPDK application running with root privilege to create a memif socket listener with non-root owner uid and gid, which can be connected from client applications running without root privilege. Signed-off-by: Junxiao Shi --- doc/guides/nics/memif.rst | 2 ++ drivers/net/memif/memif_socket.c | 13 +++++++-- drivers/net/memif/rte_eth_memif.c | 46 +++++++++++++++++++++++++++++-- drivers/net/memif/rte_eth_memif.h | 2 ++ 4 files changed, 58 insertions(+), 5 deletions(-) diff --git a/doc/guides/nics/memif.rst b/doc/guides/nics/memif.rst index aca843640b..8a8141aa72 100644 --- a/doc/guides/nics/memif.rst +++ b/doc/guides/nics/memif.rst @@ -44,6 +44,8 @@ client. "rsize=11", "Log2 of ring size. If rsize is 10, actual ring size is 1024", "10", "1-14" "socket=/tmp/memif.sock", "Socket filename", "/tmp/memif.sock", "string len 108" "socket-abstract=no", "Set usage of abstract socket address", "yes", "yes|no" + "uid=1000", "Set socket listener owner uid. Only relevant to server with socket-abstract=no", "unchanged", "uid_t" + "gid=1000", "Set socket listener owner gid. Only relevant to server with socket-abstract=no", "unchanged", "gid_t" "mac=01:23:45:ab:cd:ef", "Mac address", "01:ab:23:cd:45:ef", "" "secret=abc123", "Secret is an optional security option, which if specified, must be matched by peer", "", "string len 24" "zero-copy=yes", "Enable/disable zero-copy client mode. Only relevant to client, requires '--single-file-segments' eal argument", "no", "yes|no" diff --git a/drivers/net/memif/memif_socket.c b/drivers/net/memif/memif_socket.c index 7886644412..c2b038d01a 100644 --- a/drivers/net/memif/memif_socket.c +++ b/drivers/net/memif/memif_socket.c @@ -889,7 +889,7 @@ memif_listener_handler(void *arg) } static struct memif_socket * -memif_socket_create(char *key, uint8_t listener, bool is_abstract) +memif_socket_create(char *key, uint8_t listener, bool is_abstract, uid_t owner_uid, gid_t owner_gid) { struct memif_socket *sock; struct sockaddr_un un = { 0 }; @@ -941,6 +941,14 @@ memif_socket_create(char *key, uint8_t listener, bool is_abstract) MIF_LOG(DEBUG, "Memif listener socket %s created.", sock->filename); + if (!is_abstract && (owner_uid != (uid_t)-1 || owner_gid != (gid_t)-1)) { + ret = chown(sock->filename, owner_uid, owner_gid); + if (ret < 0) { + MIF_LOG(ERR, "Failed to change listener socket owner %d", errno); + goto error; + } + } + /* Allocate interrupt instance */ sock->intr_handle = rte_intr_instance_alloc(RTE_INTR_INSTANCE_F_SHARED); @@ -1017,7 +1025,8 @@ memif_socket_init(struct rte_eth_dev *dev, const char *socket_filename) if (ret < 0) { socket = memif_socket_create(key, (pmd->role == MEMIF_ROLE_CLIENT) ? 0 : 1, - pmd->flags & ETH_MEMIF_FLAG_SOCKET_ABSTRACT); + pmd->flags & ETH_MEMIF_FLAG_SOCKET_ABSTRACT, + pmd->owner_uid, pmd->owner_gid); if (socket == NULL) return -1; ret = rte_hash_add_key_data(hash, key, socket); diff --git a/drivers/net/memif/rte_eth_memif.c b/drivers/net/memif/rte_eth_memif.c index dd951b8296..d69f0e823f 100644 --- a/drivers/net/memif/rte_eth_memif.c +++ b/drivers/net/memif/rte_eth_memif.c @@ -37,6 +37,8 @@ #define ETH_MEMIF_RING_SIZE_ARG "rsize" #define ETH_MEMIF_SOCKET_ARG "socket" #define ETH_MEMIF_SOCKET_ABSTRACT_ARG "socket-abstract" +#define ETH_MEMIF_OWNER_UID_ARG "owner-uid" +#define ETH_MEMIF_OWNER_GID_ARG "owner-gid" #define ETH_MEMIF_MAC_ARG "mac" #define ETH_MEMIF_ZC_ARG "zero-copy" #define ETH_MEMIF_SECRET_ARG "secret" @@ -48,6 +50,8 @@ static const char * const valid_arguments[] = { ETH_MEMIF_RING_SIZE_ARG, ETH_MEMIF_SOCKET_ARG, ETH_MEMIF_SOCKET_ABSTRACT_ARG, + ETH_MEMIF_OWNER_UID_ARG, + ETH_MEMIF_OWNER_GID_ARG, ETH_MEMIF_MAC_ARG, ETH_MEMIF_ZC_ARG, ETH_MEMIF_SECRET_ARG, @@ -1515,7 +1519,7 @@ static const struct eth_dev_ops ops = { static int memif_create(struct rte_vdev_device *vdev, enum memif_role_t role, memif_interface_id_t id, uint32_t flags, - const char *socket_filename, + const char *socket_filename, uid_t owner_uid, gid_t owner_gid, memif_log2_ring_size_t log2_ring_size, uint16_t pkt_buffer_size, const char *secret, struct rte_ether_addr *ether_addr) @@ -1554,6 +1558,8 @@ memif_create(struct rte_vdev_device *vdev, enum memif_role_t role, /* Zero-copy flag irelevant to server. */ if (pmd->role == MEMIF_ROLE_SERVER) pmd->flags &= ~ETH_MEMIF_FLAG_ZERO_COPY; + pmd->owner_uid = owner_uid; + pmd->owner_gid = owner_gid; ret = memif_socket_init(eth_dev, socket_filename); if (ret < 0) @@ -1740,6 +1746,28 @@ memif_set_is_socket_abstract(const char *key __rte_unused, const char *value, vo return 0; } +static int +memif_set_owner(const char *key, const char *value, void *extra_args) +{ + static_assert(sizeof(uid_t) == sizeof(uint32_t), ""); + static_assert(sizeof(gid_t) == sizeof(uint32_t), ""); + uint32_t *id = (uint32_t *)extra_args; + + char *end = NULL; + unsigned long val = strtoul(value, &end, 10); + if (*value == '\0' || *end != '\0') { + MIF_LOG(ERR, "Failed to parse %s: %s.", key, value); + return -EINVAL; + } + if (val >= UINT32_MAX) { + MIF_LOG(ERR, "Invalid %s: %s.", key, value); + return -ERANGE; + } + + *id = val; + return 0; +} + static int memif_set_mac(const char *key __rte_unused, const char *value, void *extra_args) { @@ -1772,6 +1800,8 @@ rte_pmd_memif_probe(struct rte_vdev_device *vdev) uint16_t pkt_buffer_size = ETH_MEMIF_DEFAULT_PKT_BUFFER_SIZE; memif_log2_ring_size_t log2_ring_size = ETH_MEMIF_DEFAULT_RING_SIZE; const char *socket_filename = ETH_MEMIF_DEFAULT_SOCKET_FILENAME; + uid_t owner_uid = -1; + gid_t owner_gid = -1; uint32_t flags = 0; const char *secret = NULL; struct rte_ether_addr *ether_addr = rte_zmalloc("", @@ -1859,6 +1889,14 @@ rte_pmd_memif_probe(struct rte_vdev_device *vdev) &memif_set_mac, ether_addr); if (ret < 0) goto exit; + ret = rte_kvargs_process(kvlist, ETH_MEMIF_OWNER_UID_ARG, + &memif_set_owner, &owner_uid); + if (ret < 0) + goto exit; + ret = rte_kvargs_process(kvlist, ETH_MEMIF_OWNER_GID_ARG, + &memif_set_owner, &owner_gid); + if (ret < 0) + goto exit; ret = rte_kvargs_process(kvlist, ETH_MEMIF_ZC_ARG, &memif_set_zc, &flags); if (ret < 0) @@ -1876,7 +1914,7 @@ rte_pmd_memif_probe(struct rte_vdev_device *vdev) } /* create interface */ - ret = memif_create(vdev, role, id, flags, socket_filename, + ret = memif_create(vdev, role, id, flags, socket_filename, owner_uid, owner_gid, log2_ring_size, pkt_buffer_size, secret, ether_addr); exit: @@ -1909,7 +1947,9 @@ RTE_PMD_REGISTER_PARAM_STRING(net_memif, ETH_MEMIF_PKT_BUFFER_SIZE_ARG "=" ETH_MEMIF_RING_SIZE_ARG "=" ETH_MEMIF_SOCKET_ARG "=" - ETH_MEMIF_SOCKET_ABSTRACT_ARG "=yes|no" + ETH_MEMIF_SOCKET_ABSTRACT_ARG "=yes|no" + ETH_MEMIF_OWNER_UID_ARG "=" + ETH_MEMIF_OWNER_GID_ARG "=" ETH_MEMIF_MAC_ARG "=xx:xx:xx:xx:xx:xx" ETH_MEMIF_ZC_ARG "=yes|no" ETH_MEMIF_SECRET_ARG "="); diff --git a/drivers/net/memif/rte_eth_memif.h b/drivers/net/memif/rte_eth_memif.h index 81e7dceae0..b43895a55f 100644 --- a/drivers/net/memif/rte_eth_memif.h +++ b/drivers/net/memif/rte_eth_memif.h @@ -89,6 +89,8 @@ struct pmd_internals { /**< use abstract socket address */ char *socket_filename; /**< pointer to socket filename */ + uid_t owner_uid; /**< socket owner uid */ + gid_t owner_gid; /**< socket owner gid */ char secret[ETH_MEMIF_SECRET_SIZE]; /**< secret (optional security parameter) */ struct memif_control_channel *cc; /**< control channel */