From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id A95F1A0093 for ; Fri, 11 Mar 2022 09:06:37 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7BF5940042; Fri, 11 Mar 2022 09:06:37 +0100 (CET) Received: from NAM11-BN8-obe.outbound.protection.outlook.com (mail-bn8nam11on2054.outbound.protection.outlook.com [40.107.236.54]) by mails.dpdk.org (Postfix) with ESMTP id 234BE40042 for ; Fri, 11 Mar 2022 09:06:36 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=YFXdeMcTiuTjA8BmtqyZHUjW121/1xm29N3Wv08PEPxilI+RxQWMNsqkllO+Lcom5nlFAJAkq8PC+e6IRpKHX4GAC82WriQbvcJ5JmB0RuYFOOIdEEFlWwpdJceyAq+GxM8ojZJYj2DgTki4dm2oXobyVzHFENfKPn/kkRZMaeHQEGd0t6nVJZM73C48dwthu10X+k+ruIqMzm2DMXfa56Ty1WwgQG1sIjwfT0oodfjh9mBRBh4zxgJFK/Q3LBIVNG8CH+DrF9hlb+y0vPeqhB/sQvqOXV9fR7w+qZ0rWvIE8oU7B7ugmISrSJmaNFWydmTd/zfGOBO8lANFJphwDA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=OJ/e6YFWNIX8N8ByiYhh9d5Qj1GRaMaCSWI6r77ZRQA=; b=nA8Kv0+9q68Ro3Et/clP/OoJx4/vmCujJmaDDDvuqKKIWGmJfGwUOmVPxIPTCqwD7Xp3JyFFpIBs+pDW5wlexOzzrZZ8v1D6tRjl4cKQl9WQUXVwFAkcmFQh1KNAu+0qllPlitpucmgToB4CpLPQosfDL/MSzvPCpfs/8pFLzu2/dT8sZBlDzgQpzpShQkYqk+4ymfrzMb1ghm+LE80o0hJOXPOw4xewLjfE+iOKNgRcTiZ5tkAiYxaHP6EytKFdSCiJR3jZwom8CKKbGG5/gELl0LjHTVRyhbg70/8oEvOtbBSS7S6vgpmUzTy3hw8YkjifLN12bqGYhrpOEdNG7g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 12.22.5.238) smtp.rcpttodomain=canonical.com smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=OJ/e6YFWNIX8N8ByiYhh9d5Qj1GRaMaCSWI6r77ZRQA=; b=KKANnzkl4N7jhZlWJLzUoEtMBVSuLaOcS2hfdggY4Wx6AV3Lv4/cLXsfPZqYaU4gwy56VSMISVhG2L5Q+cynzQgKD+XiZplXT+8TEExaD3/DjnKyCVOoCkZ+apliSwOm8FAGos7meTC9OSgRO2RqX/FfW9IYTN7BA3xeB8FKhyDUqeRWgpbX+77/LkCXRirEQXLQundtAz3E8INvGf8qwuvDLPkepeQcMwk4zeWBFWXm4ULbcgHli055jWz4ESC+5zsnKIV3lIyQmAxpBFN9iCBEUldZIQr0jwmOyLH5U4t6cSj7/C3M/DuQ6DdSvgeFgsEfBIY+kZidsntk5JnKhA== Received: from MWHPR19CA0012.namprd19.prod.outlook.com (2603:10b6:300:d4::22) by SN6PR12MB4622.namprd12.prod.outlook.com (2603:10b6:805:e2::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5061.21; Fri, 11 Mar 2022 08:06:34 +0000 Received: from CO1NAM11FT009.eop-nam11.prod.protection.outlook.com (2603:10b6:300:d4:cafe::26) by MWHPR19CA0012.outlook.office365.com (2603:10b6:300:d4::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5061.23 via Frontend Transport; Fri, 11 Mar 2022 08:06:33 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 12.22.5.238) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 12.22.5.238 as permitted sender) receiver=protection.outlook.com; client-ip=12.22.5.238; helo=mail.nvidia.com; Received: from mail.nvidia.com (12.22.5.238) by CO1NAM11FT009.mail.protection.outlook.com (10.13.175.61) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.5061.22 via Frontend Transport; Fri, 11 Mar 2022 08:06:33 +0000 Received: from rnnvmail202.nvidia.com (10.129.68.7) by DRHQMAIL105.nvidia.com (10.27.9.14) with Microsoft SMTP Server (TLS) id 15.0.1497.32; Fri, 11 Mar 2022 08:06:33 +0000 Received: from rnnvmail202.nvidia.com (10.129.68.7) by rnnvmail202.nvidia.com (10.129.68.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.22; Fri, 11 Mar 2022 00:06:32 -0800 Received: from nvidia.com (10.127.8.11) by mail.nvidia.com (10.129.68.7) with Microsoft SMTP Server id 15.2.986.22 via Frontend Transport; Fri, 11 Mar 2022 00:06:30 -0800 From: Dmitry Kozlyuk To: CC: Christian Ehrhardt , "Viacheslav Ovsiienko" Subject: [PATCH 19.11 1/3] common/mlx5: add Netlink event helpers Date: Fri, 11 Mar 2022 10:06:25 +0200 Message-ID: <20220311080627.1195847-2-dkozlyuk@nvidia.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220311080627.1195847-1-dkozlyuk@nvidia.com> References: <20220311080627.1195847-1-dkozlyuk@nvidia.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 065a04fe-3488-4359-6193-08da03360eb4 X-MS-TrafficTypeDiagnostic: SN6PR12MB4622:EE_ X-Microsoft-Antispam-PRVS: X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: NvHN7D8gYuy2x3UsalT00Ih1fXfAEU037tzjDxYXdRvlR/CSY61TUt7S8E6tGZRiqFTnWYktnBIOnv3K+PGambCckGE4do80VttTktLstpQAlUoSLRn5LOjdckfT3A2t/hYAPLXBEVNBFKZrPr64E/HF4MxMiRGddlilKfYt9swCczd4YtiGrzqJ3z3nQlzSdXZiYrbAgzFBumO358MonzsrNtA3xJbAPcP6vr3eVosX1iyDPms58fGGAfYOJ/vE8DDqWPP9CxUhcMNrbhqxoQTaCfRgZ39yrJxwXpOBia4DiIv4BFhZNIFFaA55Tzncpf9EA/kPmvkK2yLePzzewZM8vZ4nboULwDct25dyGw2rzHcHE9EUuxrwl0JJZCMm61EdATaU/gUfUMCCJ/LUdaaNeKS/MQfIGpYLnexM1ciA8TwapuspHFFNFobyqzLvsE8NGG0+SxJh+zzA6O8AVAIBhsl6bAag8QHj3KpcTw9hJPk8l+aJoseTIXU8ctvZG3250ECss2Ib119pOd3XI3wgLYzhc7WJY7Q87zvAha9PJvhX3ChNVEvrJwka74sEJ/1Hgd2JdQy69+zQw4v4lUHo1L1oFaBWByvwWIhwqrZSpmgmUKgyfPCpNOn1vwrEUcQSEnWJDrdoxZI2O/nRB4zT5MX+rV2/ZgnwRhE78PickLwCd3ujiiz0dAg1rCY/LrvjbHVz0jqDduhZpjhaFtjmY6/+dkCYacdZ+jZ1UVEk5LUFwdilFpJJdqas3zlM X-Forefront-Antispam-Report: CIP:12.22.5.238; CTRY:US; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:mail.nvidia.com; PTR:InfoNoRecords; CAT:NONE; SFS:(13230001)(4636009)(46966006)(40470700004)(36840700001)(508600001)(7696005)(54906003)(55016003)(6666004)(5660300002)(86362001)(2906002)(6916009)(316002)(36756003)(82310400004)(4326008)(70206006)(8936002)(36860700001)(8676002)(47076005)(81166007)(6286002)(356005)(40460700003)(186003)(2616005)(83380400001)(1076003)(107886003)(26005)(336012)(426003)(70586007)(36900700001)(309714004); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Mar 2022 08:06:33.5072 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 065a04fe-3488-4359-6193-08da03360eb4 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[12.22.5.238]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT009.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN6PR12MB4622 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: stable-bounces@dpdk.org [ upstream commit be66461cba371c3138ce942eb9fe5657f9e9a446 ] Introduce mlx5_nl_read_events() to read Netlink events (technically, messages) from a socket that was configured to listen for them via a new mlx5_nl_init() parameter. Add mlx5_nl_parse_link_status_update() helper to extract information from link-related events. This patch is a shared base for later fixes. Signed-off-by: Dmitry Kozlyuk Reviewed-by: Viacheslav Ovsiienko --- drivers/net/mlx5/mlx5.c | 8 +-- drivers/net/mlx5/mlx5.h | 7 ++- drivers/net/mlx5/mlx5_nl.c | 107 ++++++++++++++++++++++++++++++++++++- 3 files changed, 115 insertions(+), 7 deletions(-) diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index d9db6aa398..27e04b5d9e 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -2433,8 +2433,8 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, priv->pci_dev = spawn->pci_dev; priv->mtu = RTE_ETHER_MTU; /* Some internal functions rely on Netlink sockets, open them now. */ - priv->nl_socket_rdma = mlx5_nl_init(NETLINK_RDMA); - priv->nl_socket_route = mlx5_nl_init(NETLINK_ROUTE); + priv->nl_socket_rdma = mlx5_nl_init(NETLINK_RDMA, 0); + priv->nl_socket_route = mlx5_nl_init(NETLINK_ROUTE, 0); priv->nl_sn = 0; priv->representor = !!switch_info->representor; priv->master = !!switch_info->master; @@ -3105,8 +3105,8 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, * matching ones, gathering into the list. */ struct ibv_device *ibv_match[ret + 1]; - int nl_route = mlx5_nl_init(NETLINK_ROUTE); - int nl_rdma = mlx5_nl_init(NETLINK_RDMA); + int nl_route = mlx5_nl_init(NETLINK_ROUTE, 0); + int nl_rdma = mlx5_nl_init(NETLINK_RDMA, 0); unsigned int i; while (ret-- > 0) { diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index b2dc9e291b..b74f1bbc83 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -12,6 +12,7 @@ #include #include #include +#include #include /* Verbs header. */ @@ -991,7 +992,9 @@ void mlx5_mp_uninit_secondary(void); /* mlx5_nl.c */ -int mlx5_nl_init(int protocol); +typedef void (mlx5_nl_event_cb)(struct nlmsghdr *hdr, void *user_data); + +int mlx5_nl_init(int protocol, int groups); int mlx5_nl_mac_addr_add(struct rte_eth_dev *dev, struct rte_ether_addr *mac, uint32_t index); int mlx5_nl_mac_addr_remove(struct rte_eth_dev *dev, struct rte_ether_addr *mac, @@ -1006,6 +1009,8 @@ int mlx5_nl_vf_mac_addr_modify(struct rte_eth_dev *dev, struct rte_ether_addr *mac, int vf_index); int mlx5_nl_switch_info(int nl, unsigned int ifindex, struct mlx5_switch_info *info); +int mlx5_nl_read_events(int nlsk_fd, mlx5_nl_event_cb *cb, void *cb_arg); +int mlx5_nl_parse_link_status_update(struct nlmsghdr *hdr, uint32_t *ifindex); struct mlx5_vlan_vmwa_context *mlx5_vlan_vmwa_init(struct rte_eth_dev *dev, uint32_t ifindex); diff --git a/drivers/net/mlx5/mlx5_nl.c b/drivers/net/mlx5/mlx5_nl.c index 668affb0b1..2564e8779b 100644 --- a/drivers/net/mlx5/mlx5_nl.c +++ b/drivers/net/mlx5/mlx5_nl.c @@ -119,19 +119,22 @@ struct mlx5_nl_ifindex_data { * * @param protocol * Netlink protocol (e.g. NETLINK_ROUTE, NETLINK_RDMA). + * @param groups + * Groups to listen (e.g. RTMGRP_LINK), can be 0. * * @return * A file descriptor on success, a negative errno value otherwise and * rte_errno is set. */ int -mlx5_nl_init(int protocol) +mlx5_nl_init(int protocol, int groups) { int fd; int sndbuf_size = MLX5_SEND_BUF_SIZE; int rcvbuf_size = MLX5_RECV_BUF_SIZE; struct sockaddr_nl local = { .nl_family = AF_NETLINK, + .nl_groups = groups, }; int ret; @@ -1400,7 +1403,7 @@ mlx5_vlan_vmwa_init(struct rte_eth_dev *dev, " for VLAN workaround context"); return NULL; } - vmwa->nl_socket = mlx5_nl_init(NETLINK_ROUTE); + vmwa->nl_socket = mlx5_nl_init(NETLINK_ROUTE, 0); if (vmwa->nl_socket < 0) { DRV_LOG(WARNING, "Can not create Netlink socket" @@ -1431,3 +1434,103 @@ void mlx5_vlan_vmwa_exit(struct mlx5_vlan_vmwa_context *vmwa) close(vmwa->nl_socket); rte_free(vmwa); } + +/** + * Try to parse a Netlink message as a link status update. + * + * @param hdr + * Netlink message header. + * @param[out] ifindex + * Index of the updated interface. + * @param[out] flags + * New interface flags. + * + * @return + * 0 on success, negative on failure. + */ +int +mlx5_nl_parse_link_status_update(struct nlmsghdr *hdr, uint32_t *ifindex) +{ + struct ifinfomsg *info; + + switch (hdr->nlmsg_type) { + case RTM_NEWLINK: + case RTM_DELLINK: + case RTM_GETLINK: + case RTM_SETLINK: + info = NLMSG_DATA(hdr); + *ifindex = info->ifi_index; + return 0; + } + return -1; +} + +/** + * Read pending events from a Netlink socket. + * + * @param nlsk_fd + * Netlink socket. + * @param cb + * Callback invoked for each of the events. + * @param cb_arg + * User data for the callback. + * + * @return + * 0 on success, including the case when there are no events. + * Negative on failure and rte_errno is set. + */ +int +mlx5_nl_read_events(int nlsk_fd, mlx5_nl_event_cb *cb, void *cb_arg) +{ + char buf[8192]; + struct sockaddr_nl addr; + struct iovec iov = { + .iov_base = buf, + .iov_len = sizeof(buf), + }; + struct msghdr msg = { + .msg_name = &addr, + .msg_namelen = sizeof(addr), + .msg_iov = &iov, + .msg_iovlen = 1, + }; + struct nlmsghdr *hdr; + ssize_t size; + + while (1) { + size = recvmsg(nlsk_fd, &msg, MSG_DONTWAIT); + if (size < 0) { + if (errno == EAGAIN) + return 0; + if (errno == EINTR) + continue; + DRV_LOG(DEBUG, "Failed to receive netlink message: %s", + strerror(errno)); + rte_errno = errno; + return -rte_errno; + + } + hdr = (struct nlmsghdr *)buf; + while (size >= (ssize_t)sizeof(*hdr)) { + ssize_t msg_len = hdr->nlmsg_len; + ssize_t data_len = msg_len - sizeof(*hdr); + ssize_t aligned_len; + + if (data_len < 0) { + DRV_LOG(DEBUG, "Netlink message too short"); + rte_errno = EINVAL; + return -rte_errno; + } + aligned_len = NLMSG_ALIGN(msg_len); + if (aligned_len > size) { + DRV_LOG(DEBUG, "Netlink message too long"); + rte_errno = EINVAL; + return -rte_errno; + } + cb(hdr, cb_arg); + hdr = RTE_PTR_ADD(hdr, aligned_len); + size -= aligned_len; + } + } + return 0; +} -- 2.25.1