From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id BC8E8A04B6; Mon, 12 Oct 2020 10:29:01 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id AF4D81D64C; Mon, 12 Oct 2020 10:28:59 +0200 (CEST) Received: from alln-iport-5.cisco.com (alln-iport-5.cisco.com [173.37.142.92]) by dpdk.org (Postfix) with ESMTP id 0F1691D642 for ; Mon, 12 Oct 2020 10:28:57 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=9272; q=dns/txt; s=iport; t=1602491338; x=1603700938; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=x3iW46BJSyiDOe7BMXsjv7Pe3QkWLzBjN0ybJKKqyJg=; b=ZxW3CMHC/jvJaMK57Glr5V0Mf4hk5v91hAeolJw4ZVuCu7bnV6zxkjp2 rfx49QtREV/wfr0QSDOiv4v+Hcuw7os7ireNGrwNB6YZ4etcUlWd8Xm2G PEl3PbWjDxDoTiBM/GWvd+u+BllZ20MftwtfsZa+1oqUWwn8bx7dFuo5G 4=; X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BjBgDnEoRf/5RdJa1gHgEBCxIMhDm?= =?us-ascii?q?BRgEBMCwKn2ySBgsBAQENAQEvBAEBhEoCghMCJTgTAgMBAQsBAQUBAQECAQY?= =?us-ascii?q?EbYVohXMGJ1IQUVcGDgWDJoJYJaYmgXUzhVSDKYFCgTiIN4R/G4FBP4ERgW6?= =?us-ascii?q?BYIo0BJAajVeZb4JymloPIqE6s0cCERWBayOBV00jFYMkUBcCDY4qAReOJj8?= =?us-ascii?q?BATE3AgYKAQEDCY03AYEQAQE?= X-IronPort-AV: E=Sophos;i="5.77,366,1596499200"; d="scan'208";a="573683998" Received: from rcdn-core-12.cisco.com ([173.37.93.148]) by alln-iport-5.cisco.com with ESMTP/TLS/DHE-RSA-SEED-SHA; 12 Oct 2020 08:28:55 +0000 Received: from XCH-RCD-001.cisco.com (xch-rcd-001.cisco.com [173.37.102.11]) by rcdn-core-12.cisco.com (8.15.2/8.15.2) with ESMTPS id 09C8Sta7017132 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=FAIL) for ; Mon, 12 Oct 2020 08:28:55 GMT Received: from ja-VirtualBox.pantheon.local (10.61.64.140) by XCH-RCD-001.cisco.com (173.37.102.11) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 12 Oct 2020 03:28:54 -0500 From: Jakub Grajciar To: CC: Jakub Grajciar Date: Mon, 12 Oct 2020 10:28:29 +0200 Message-ID: <20201012082829.5965-1-jgrajcia@cisco.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201009165859.5303-1-jgrajcia@cisco.com> References: <20201009165859.5303-1-jgrajcia@cisco.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.61.64.140] X-ClientProxiedBy: xch-aln-002.cisco.com (173.36.7.12) To XCH-RCD-001.cisco.com (173.37.102.11) X-Outbound-SMTP-Client: 173.37.102.11, xch-rcd-001.cisco.com X-Outbound-Node: rcdn-core-12.cisco.com Subject: [dpdk-dev] [PATCH v4] net/memif: use abstract socket address X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Abstract socket address has no connection with filesystem pathnames and the socket disappears once all open references are closed. Memif pmd will use abstract socket address by default. For backwards compatibility use new argument 'socket-abstract=no' Signed-off-by: Jakub Grajciar --- doc/guides/nics/memif.rst | 1 + doc/guides/rel_notes/release_20_11.rst | 5 ++++ drivers/net/memif/memif_socket.c | 28 +++++++++++++++------ drivers/net/memif/rte_eth_memif.c | 34 +++++++++++++++++++++++++- drivers/net/memif/rte_eth_memif.h | 10 +++++--- 5 files changed, 65 insertions(+), 13 deletions(-) v2: - fixed coding style issues v3: - use strlcpy for socket address v4: - updated release notes diff --git a/doc/guides/nics/memif.rst b/doc/guides/nics/memif.rst index ddeebed25..8e80105a4 100644 --- a/doc/guides/nics/memif.rst +++ b/doc/guides/nics/memif.rst @@ -43,6 +43,7 @@ client. "bsize=1024", "Size of single packet buffer", "2048", "uint16_t" "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" "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 slave mode. Only relevant to slave, requires '--single-file-segments' eal argument", "no", "yes|no" diff --git a/doc/guides/rel_notes/release_20_11.rst b/doc/guides/rel_notes/release_20_11.rst index 57e3edcdd..62891bed0 100644 --- a/doc/guides/rel_notes/release_20_11.rst +++ b/doc/guides/rel_notes/release_20_11.rst @@ -92,6 +92,11 @@ New Features * Changed default link speed to unknown. * Added support for 200G link speed. +* **Updated Memif PMD.** + + * Added support for abstract socket address. + * Changed default socket address type to abstract. + * **Added Ice Lake (Gen4) support for Intel NTB.** Added NTB device support (4th generation) for Intel Ice Lake platform. diff --git a/drivers/net/memif/memif_socket.c b/drivers/net/memif/memif_socket.c index 67794cb6f..7a26e3006 100644 --- a/drivers/net/memif/memif_socket.c +++ b/drivers/net/memif/memif_socket.c @@ -862,10 +862,10 @@ memif_listener_handler(void *arg) } static struct memif_socket * -memif_socket_create(char *key, uint8_t listener) +memif_socket_create(char *key, uint8_t listener, bool is_abstract) { struct memif_socket *sock; - struct sockaddr_un un; + struct sockaddr_un un = { 0 }; int sockfd; int ret; int on = 1; @@ -886,7 +886,13 @@ memif_socket_create(char *key, uint8_t listener) goto error; un.sun_family = AF_UNIX; - strlcpy(un.sun_path, sock->filename, MEMIF_SOCKET_UN_SIZE); + if (is_abstract) { + /* abstract address */ + un.sun_path[0] = '\0'; + strlcpy(un.sun_path + 1, sock->filename, MEMIF_SOCKET_UN_SIZE - 1); + } else { + strlcpy(un.sun_path, sock->filename, MEMIF_SOCKET_UN_SIZE); + } ret = setsockopt(sockfd, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)); @@ -963,7 +969,8 @@ memif_socket_init(struct rte_eth_dev *dev, const char *socket_filename) ret = rte_hash_lookup_data(hash, key, (void **)&socket); if (ret < 0) { socket = memif_socket_create(key, - (pmd->role == MEMIF_ROLE_SLAVE) ? 0 : 1); + (pmd->role == MEMIF_ROLE_SLAVE) ? 0 : 1, + pmd->flags & ETH_MEMIF_FLAG_SOCKET_ABSTRACT); if (socket == NULL) return -1; ret = rte_hash_add_key_data(hash, key, socket); @@ -1025,7 +1032,7 @@ memif_socket_remove_device(struct rte_eth_dev *dev) /* remove socket, if this was the last device using it */ if (TAILQ_EMPTY(&socket->dev_queue)) { rte_hash_del_key(hash, socket->filename); - if (socket->listener) { + if (socket->listener && !(pmd->flags & ETH_MEMIF_FLAG_SOCKET_ABSTRACT)) { /* remove listener socket file, * so we can create new one later. */ @@ -1054,7 +1061,7 @@ memif_connect_slave(struct rte_eth_dev *dev) { int sockfd; int ret; - struct sockaddr_un sun; + struct sockaddr_un sun = { 0 }; struct pmd_internals *pmd = dev->data->dev_private; memset(pmd->local_disc_string, 0, ETH_MEMIF_DISC_STRING_SIZE); @@ -1068,8 +1075,13 @@ memif_connect_slave(struct rte_eth_dev *dev) } sun.sun_family = AF_UNIX; - - memcpy(sun.sun_path, pmd->socket_filename, sizeof(sun.sun_path) - 1); + if (pmd->flags & ETH_MEMIF_FLAG_SOCKET_ABSTRACT) { + /* abstract address */ + sun.sun_path[0] = '\0'; + strlcpy(sun.sun_path + 1, pmd->socket_filename, MEMIF_SOCKET_UN_SIZE - 1); + } else { + strlcpy(sun.sun_path, pmd->socket_filename, MEMIF_SOCKET_UN_SIZE); + } ret = connect(sockfd, (struct sockaddr *)&sun, sizeof(struct sockaddr_un)); diff --git a/drivers/net/memif/rte_eth_memif.c b/drivers/net/memif/rte_eth_memif.c index ff8a58081..6f4596667 100644 --- a/drivers/net/memif/rte_eth_memif.c +++ b/drivers/net/memif/rte_eth_memif.c @@ -36,6 +36,7 @@ #define ETH_MEMIF_PKT_BUFFER_SIZE_ARG "bsize" #define ETH_MEMIF_RING_SIZE_ARG "rsize" #define ETH_MEMIF_SOCKET_ARG "socket" +#define ETH_MEMIF_SOCKET_ABSTRACT_ARG "socket-abstract" #define ETH_MEMIF_MAC_ARG "mac" #define ETH_MEMIF_ZC_ARG "zero-copy" #define ETH_MEMIF_SECRET_ARG "secret" @@ -46,6 +47,7 @@ static const char * const valid_arguments[] = { ETH_MEMIF_PKT_BUFFER_SIZE_ARG, ETH_MEMIF_RING_SIZE_ARG, ETH_MEMIF_SOCKET_ARG, + ETH_MEMIF_SOCKET_ABSTRACT_ARG, ETH_MEMIF_MAC_ARG, ETH_MEMIF_ZC_ARG, ETH_MEMIF_SECRET_ARG, @@ -1654,7 +1656,23 @@ memif_set_socket_filename(const char *key __rte_unused, const char *value, const char **socket_filename = (const char **)extra_args; *socket_filename = value; - return memif_check_socket_filename(*socket_filename); + return 0; +} + +static int +memif_set_is_socket_abstract(const char *key __rte_unused, const char *value, void *extra_args) +{ + uint32_t *flags = (uint32_t *)extra_args; + + if (strstr(value, "yes") != NULL) { + *flags |= ETH_MEMIF_FLAG_SOCKET_ABSTRACT; + } else if (strstr(value, "no") != NULL) { + *flags &= ~ETH_MEMIF_FLAG_SOCKET_ABSTRACT; + } else { + MIF_LOG(ERR, "Failed to parse socket-abstract param: %s.", value); + return -EINVAL; + } + return 0; } static int @@ -1740,6 +1758,9 @@ rte_pmd_memif_probe(struct rte_vdev_device *vdev) MIF_LOG(WARNING, "Failed to register mp action callback: %s", strerror(rte_errno)); + /* use abstract address by default */ + flags |= ETH_MEMIF_FLAG_SOCKET_ABSTRACT; + kvlist = rte_kvargs_parse(rte_vdev_device_args(vdev), valid_arguments); /* parse parameters */ @@ -1765,6 +1786,10 @@ rte_pmd_memif_probe(struct rte_vdev_device *vdev) (void *)(&socket_filename)); if (ret < 0) goto exit; + ret = rte_kvargs_process(kvlist, ETH_MEMIF_SOCKET_ABSTRACT_ARG, + &memif_set_is_socket_abstract, &flags); + if (ret < 0) + goto exit; ret = rte_kvargs_process(kvlist, ETH_MEMIF_MAC_ARG, &memif_set_mac, ether_addr); if (ret < 0) @@ -1779,6 +1804,12 @@ rte_pmd_memif_probe(struct rte_vdev_device *vdev) goto exit; } + if (!(flags & ETH_MEMIF_FLAG_SOCKET_ABSTRACT)) { + ret = memif_check_socket_filename(socket_filename); + if (ret < 0) + goto exit; + } + /* create interface */ ret = memif_create(vdev, role, id, flags, socket_filename, log2_ring_size, pkt_buffer_size, secret, ether_addr); @@ -1816,6 +1847,7 @@ 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_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 6f45b7072..ac0a2f2d1 100644 --- a/drivers/net/memif/rte_eth_memif.h +++ b/drivers/net/memif/rte_eth_memif.h @@ -81,14 +81,16 @@ struct pmd_internals { memif_interface_id_t id; /**< unique id */ enum memif_role_t role; /**< device role */ uint32_t flags; /**< device status flags */ -#define ETH_MEMIF_FLAG_CONNECTING (1 << 0) +#define ETH_MEMIF_FLAG_CONNECTING (1 << 0) /**< device is connecting */ -#define ETH_MEMIF_FLAG_CONNECTED (1 << 1) +#define ETH_MEMIF_FLAG_CONNECTED (1 << 1) /**< device is connected */ -#define ETH_MEMIF_FLAG_ZERO_COPY (1 << 2) +#define ETH_MEMIF_FLAG_ZERO_COPY (1 << 2) /**< device is zero-copy enabled */ -#define ETH_MEMIF_FLAG_DISABLED (1 << 3) +#define ETH_MEMIF_FLAG_DISABLED (1 << 3) /**< device has not been configured and can not accept connection requests */ +#define ETH_MEMIF_FLAG_SOCKET_ABSTRACT (1 << 4) +/**< use abstract socket address */ char *socket_filename; /**< pointer to socket filename */ char secret[ETH_MEMIF_SECRET_SIZE]; /**< secret (optional security parameter) */ -- 2.17.1