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 11D6948AB2 for ; Tue, 4 Nov 2025 18:29:05 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 05BD8402DD; Tue, 4 Nov 2025 18:29:05 +0100 (CET) Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013003.outbound.protection.outlook.com [40.93.196.3]) by mails.dpdk.org (Postfix) with ESMTP id 5FDF7402DD for ; Tue, 4 Nov 2025 18:29:03 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=FNGUrlxjR/76Go5GcU+YP2xnHVhm80jzYKaC9XP7tUC6akgITOlrcDll02vh2A8H/+pQUi9hYI2cJDVf0vBhIN5hY+7947nYxcozYdRE6z6390NQsjhSsl7Id5L+ifLF6i3Ruk3o6nSmILwcWTYsDCqYJ1d2AnGb5H+rEDv+EfGdeSS7tlFlfc0zu/VBXQI8RIUsWOKn5TLZo4vzXiQ9Hv75O/k1q9x8SRC40V2yj27cY4jb12ia6anOxQ2m+1aXajMwBxUKJULbBmIIIu7UuMu4TXSLw/Mtv9FJOESZVAskZftsaDwJBWVuU2WVvXIOgW7bB78JEYsPANn/yGJX4w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=Zi5AJ3LBS1sF4MW5w5sCj7PpNn34IJOzZPm/4Xxzj2I=; b=iEn/nvWSJ2nZ0II3B0S4KxuhWuwKYjW2lZEQIwdPiPzOg6KIRu5XRvozyDAJ8B/2lhkm37lMZMZ3DOBs7w3Ec0m/nD2tKoLR05PzTzYs9xJyuZRcqu6G33e6v2Ugf5qrkYsCctLlXF+oMF0AqCIRKfRitJ1hNUI928MtnXFJ2kr1u62eC5ILf2FHX3qixYSKgQkfXPS5px8TJEBmBcjrBrpojwVALdldLNReqfs/dYj88AzoX4rvfrt3ECCb+cMHfahaFs9worTfqTh2GBvjJWndP6gUWXpuQPlasDeex94Hyv0aAQrsdGUMgbVrTmQmsunU//fyq7tf2BSDQilcPQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=dpdk.org 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 (0) 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=Zi5AJ3LBS1sF4MW5w5sCj7PpNn34IJOzZPm/4Xxzj2I=; b=EWcsP6ls+LC3uubinDptGJhH65JEXWkPj36nBi/83dY0X5hw+cSbd+aD97OtYao7Vc/beO0FrbYdlgu7LoNGQJZESr6UFiHBEFt/Iy32c/QKD/JKFsz5k3EUzaN8PcG9e3Gb6gCkYU9jY8Z9njlVBDbwK8ltUNZnlqwvPiwJstGr+Ar4+Q7i2qZkCCiFwn4trS5UnF9lopm+8f457evBm7VbuG0pLYRhaivUS5LlKbfe0XK6mwAD0lp8wWH+xsnjZAMXHMkM8j7se0xXGPS1VlfETspgA1HCyv7vc0KSvuUXAvo/urcbTcMTwX6G9N+g3HDzjZprO2PhlIT/malj0Q== Received: from SJ0PR05CA0051.namprd05.prod.outlook.com (2603:10b6:a03:33f::26) by IA1PR12MB6531.namprd12.prod.outlook.com (2603:10b6:208:3a4::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9275.16; Tue, 4 Nov 2025 17:28:55 +0000 Received: from SJ1PEPF00001CE1.namprd05.prod.outlook.com (2603:10b6:a03:33f:cafe::a7) by SJ0PR05CA0051.outlook.office365.com (2603:10b6:a03:33f::26) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9298.7 via Frontend Transport; Tue, 4 Nov 2025 17:28:51 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) 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 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by SJ1PEPF00001CE1.mail.protection.outlook.com (10.167.242.9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9298.6 via Frontend Transport; Tue, 4 Nov 2025 17:28:54 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 4 Nov 2025 09:28:34 -0800 Received: from nvidia.com (10.126.230.35) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 4 Nov 2025 09:28:31 -0800 From: Dariusz Sosnowski To: , Kevin Traynor CC: Viacheslav Ovsiienko , Bing Zhao , Ori Kam , Suanming Mou , Matan Azrad , Adrien Mazarguil , Didier Pallard , Nelio Laranjeiro , Francesco Santoro Subject: [PATCH 24.11] net/mlx5: fix min and max MTU reporting Date: Tue, 4 Nov 2025 18:27:15 +0100 Message-ID: <20251104172715.1328088-1-dsosnowski@nvidia.com> X-Mailer: git-send-email 2.39.5 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.126.230.35] X-ClientProxiedBy: rnnvmail203.nvidia.com (10.129.68.9) To rnnvmail201.nvidia.com (10.129.68.8) X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ1PEPF00001CE1:EE_|IA1PR12MB6531:EE_ X-MS-Office365-Filtering-Correlation-Id: 1d3f4008-f2a0-46f6-52c8-08de1bc7a11d X-LD-Processed: 43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; ARA:13230040|1800799024|82310400026|376014|36860700013|7053199007; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?BiNLVPmTdcUg+iomH9tdQxYMFgpSsVF3gMeF3LO9bOyR28GoY3MgOeRjXWAo?= =?us-ascii?Q?KnqVJ7gRMnfDcQJ9J3e5dPYuHIg0yYr6yifZn2tbVRdotAmGLpVZefh0vbSW?= =?us-ascii?Q?9xl/NlO05RIr+EzGbZVHmWtfsyqNUmdw6Lhnc5dX19VL+PuG+ZuP4m+nNuW9?= =?us-ascii?Q?2H8bOXwaBpTJd2JOc/bB8A490FnznCF5RjWy5En5Tpf/ol8CzhVQNN5lHOSp?= =?us-ascii?Q?mg6Ujp/Ul9Ltexo95geeTw4Se4UNn6w+CgSasdSIrMqi47gQCkWZ/+pR/F3C?= =?us-ascii?Q?xgQm+EDSoSnPqThqcvzzyZNxjOQOV0F2y8CZXQUX2N0fL/e1fhXrD29gYOtk?= =?us-ascii?Q?ARGAT1acQlN3JgoYjJ9nRoGsRtD2eG+PcMxIXp7eFq6l+OyyUtN9iX/qqLmC?= =?us-ascii?Q?YFhuc2ff/JXdCYUhCmEO95m/wzNp6mZ8NinlDfK3MT3XxyMQiY6eLzBUKK8H?= =?us-ascii?Q?2cOM95sGgblo2LpBg34+qU0k9D02SYyxr9U2FtB2LaPBl6/vna2/hiywyy2L?= =?us-ascii?Q?dFVVPN01PyG7N5FScekcljP6ENHY5QjzQjvlZ7ekXesnLDYdM7BaOlNIMQyZ?= =?us-ascii?Q?zyMI6KT5ap0bUxpCjffaFGsk7wC9YHOjbFjjOQK/hjx82/z6E7nhzYuFjz0T?= =?us-ascii?Q?FrtuF05PmJeb5Mq7rZU6Xfk6Q6lUiglZh9pQjIKEMGScvhs2ze8ukJS95XET?= =?us-ascii?Q?4mwMVnJX4JJ55hq0YdUvX0P790WG1EMkAa02Vd+iNeL0xWkhJ3FeyRyMWVKY?= =?us-ascii?Q?00R1XtsgOXEAJGLrxv4fMCMCh4Ov2Xtu5B3Ds9i0lOt/SY7vd+mMwRw+eo7r?= =?us-ascii?Q?UR42iXZrhJiPCuCZPGIuSRwQIMFtuv9y21T54Y0yJ+HywB4M6c+4isZuq3xz?= =?us-ascii?Q?OyJ1UVBTFSeAHPUDoikkU2cY+ezKg4RttxW2yibIGM0PBihyvW0MPEvwI2h2?= =?us-ascii?Q?QZr0DAnMF7/8v2BzTp4+6QsHr1ZDK1TPHILqMv5RWH7zdw8PG+7inGpHYycD?= =?us-ascii?Q?WEHKBd6ZOsFtfD45aVS/VMTBWGLPf/mXRdI7UoWuzHdWVPwG9O205kWi0dou?= =?us-ascii?Q?YDVf0NH4Mtkee8haYdG6pjZJcah0I6X3n3DxtIYx5P221i5xkKVJT7JYrXGP?= =?us-ascii?Q?qf6cCkMBFO5zf/zWrAo2Y3TYWy4KA//3Cv/ijD1aN5B7GOAbiGXxzaop8jNm?= =?us-ascii?Q?lmPLlCRNTQGrWusJ9+oBsiPPm9/JWekDhQmFoUQn605Qte9USXolFLEjnHPU?= =?us-ascii?Q?2Vk8gNcaCd3o8NGVwbj7aHLRb3etep8o2cttQBBwaZMl3dk2S3sDwY6fqNOt?= =?us-ascii?Q?lmaCg+jfEfQ6BOM9rJj1MlgPTnGIlPNB4rJtGbnbmlQ7ztoH0wjpqtyuR+b8?= =?us-ascii?Q?utRUcICZTFqBTwNpnOAbvR6TTWazC76ajpq9XmSI7AVI5vdroPYRL7ArLLGL?= =?us-ascii?Q?USWkJNLI27vnOUQBXyvOpW1JAmCyAj+9+BMyMlITbJR12iMfke8b1CogTrfV?= =?us-ascii?Q?oTfDtNwyUyZoTapFtrNNL+edmSf37Lbnygy05VD8Jbi0b1J57j2f0AL6Ux0g?= =?us-ascii?Q?YMrHRBn1yE7KwgvL+TI=3D?= X-Forefront-Antispam-Report: CIP:216.228.117.160; CTRY:US; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge1.nvidia.com; CAT:NONE; SFS:(13230040)(1800799024)(82310400026)(376014)(36860700013)(7053199007); DIR:OUT; SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Nov 2025 17:28:54.8291 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1d3f4008-f2a0-46f6-52c8-08de1bc7a11d X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.117.160]; Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: SJ1PEPF00001CE1.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB6531 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 44d657109216a32e8718446f20f91272e10575dd ] mlx5 PMD used hardcoded and incorrect values when reporting maximum MTU and maximum Rx packet length through rte_eth_dev_info_get(). This patch adds support for querying OS for minimum and maximum allowed MTU values. Maximum Rx packet length is then calculated based on these values. On Linux, these values are queried through netlink, using IFLA_MIN_MTU and IFLA_MAX_MTU attributes added in Linux 4.18. Windows API unfortunately does not expose minimum and maximum allowed MTU values. In this case, fallback hardcoded values (working on currently supported HW) will be used. Bugzilla ID: 1719 Fixes: e60fbd5b24fc ("mlx5: add device configure/start/stop") Cc: stable@dpdk.org Signed-off-by: Dariusz Sosnowski Acked-by: Viacheslav Ovsiienko --- drivers/common/mlx5/linux/mlx5_nl.c | 108 ++++++++++++++++++++++ drivers/common/mlx5/linux/mlx5_nl.h | 3 + drivers/common/mlx5/version.map | 1 + drivers/net/mlx5/linux/mlx5_ethdev_os.c | 30 ++++++ drivers/net/mlx5/linux/mlx5_os.c | 2 + drivers/net/mlx5/mlx5.h | 13 +++ drivers/net/mlx5/mlx5_ethdev.c | 42 ++++++++- drivers/net/mlx5/windows/mlx5_ethdev_os.c | 28 ++++++ drivers/net/mlx5/windows/mlx5_os.c | 2 + 9 files changed, 228 insertions(+), 1 deletion(-) diff --git a/drivers/common/mlx5/linux/mlx5_nl.c b/drivers/common/mlx5/linux/mlx5_nl.c index a5ac4dc543..6824ea322d 100644 --- a/drivers/common/mlx5/linux/mlx5_nl.c +++ b/drivers/common/mlx5/linux/mlx5_nl.c @@ -2033,3 +2033,111 @@ mlx5_nl_devlink_esw_multiport_get(int nlsk_fd, int family_id, const char *pci_ad *enable ? "en" : "dis", pci_addr); return ret; } + +struct mlx5_mtu { + uint32_t min_mtu; + bool min_mtu_set; + uint32_t max_mtu; + bool max_mtu_set; +}; + +static int +mlx5_nl_get_mtu_bounds_cb(struct nlmsghdr *nh, void *arg) +{ + size_t off = NLMSG_LENGTH(sizeof(struct ifinfomsg)); + struct mlx5_mtu *out = arg; + + while (off < nh->nlmsg_len) { + struct rtattr *ra = RTE_PTR_ADD(nh, off); + uint32_t *payload; + + switch (ra->rta_type) { + case IFLA_MIN_MTU: + payload = RTA_DATA(ra); + out->min_mtu = *payload; + out->min_mtu_set = true; + break; + case IFLA_MAX_MTU: + payload = RTA_DATA(ra); + out->max_mtu = *payload; + out->max_mtu_set = true; + break; + default: + /* Nothing to do for other attributes. */ + break; + } + off += RTA_ALIGN(ra->rta_len); + } + + return 0; +} + +/** + * Query minimum and maximum allowed MTU values for given Linux network interface. + * + * This function queries the following interface attributes exposed in netlink since Linux 4.18: + * + * - IFLA_MIN_MTU - minimum allowed MTU + * - IFLA_MAX_MTU - maximum allowed MTU + * + * @param[in] nl + * Netlink socket of the ROUTE kind (NETLINK_ROUTE). + * @param[in] ifindex + * Linux network device index. + * @param[out] min_mtu + * Pointer to minimum allowed MTU. Populated only if both minimum and maximum MTU was queried. + * @param[out] max_mtu + * Pointer to maximum allowed MTU. Populated only if both minimum and maximum MTU was queried. + * + * @return + * 0 on success, negative on error and rte_errno is set. + * + * Known errors: + * + * - (-EINVAL) - either @p min_mtu or @p max_mtu is NULL. + * - (-ENOENT) - either minimum or maximum allowed MTU was not found in interface attributes. + */ +int +mlx5_nl_get_mtu_bounds(int nl, unsigned int ifindex, uint16_t *min_mtu, uint16_t *max_mtu) +{ + struct mlx5_mtu out = { 0 }; + struct { + struct nlmsghdr nh; + struct ifinfomsg info; + } req = { + .nh = { + .nlmsg_len = NLMSG_LENGTH(sizeof(req.info)), + .nlmsg_type = RTM_GETLINK, + .nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK, + }, + .info = { + .ifi_family = AF_UNSPEC, + .ifi_index = ifindex, + }, + }; + uint32_t sn = MLX5_NL_SN_GENERATE; + int ret; + + if (min_mtu == NULL || max_mtu == NULL) { + rte_errno = EINVAL; + return -rte_errno; + } + + ret = mlx5_nl_send(nl, &req.nh, sn); + if (ret < 0) + return ret; + + ret = mlx5_nl_recv(nl, sn, mlx5_nl_get_mtu_bounds_cb, &out); + if (ret < 0) + return ret; + + if (!out.min_mtu_set || !out.max_mtu_set) { + rte_errno = ENOENT; + return -rte_errno; + } + + *min_mtu = out.min_mtu; + *max_mtu = out.max_mtu; + + return ret; +} diff --git a/drivers/common/mlx5/linux/mlx5_nl.h b/drivers/common/mlx5/linux/mlx5_nl.h index 580de3b769..34306258ec 100644 --- a/drivers/common/mlx5/linux/mlx5_nl.h +++ b/drivers/common/mlx5/linux/mlx5_nl.h @@ -87,4 +87,7 @@ __rte_internal int mlx5_nl_devlink_esw_multiport_get(int nlsk_fd, int family_id, const char *pci_addr, int *enable); +__rte_internal +int mlx5_nl_get_mtu_bounds(int nl, unsigned int ifindex, uint16_t *min_mtu, uint16_t *max_mtu); + #endif /* RTE_PMD_MLX5_NL_H_ */ diff --git a/drivers/common/mlx5/version.map b/drivers/common/mlx5/version.map index 6311b27c8a..ccd04d65e0 100644 --- a/drivers/common/mlx5/version.map +++ b/drivers/common/mlx5/version.map @@ -146,6 +146,7 @@ INTERNAL { mlx5_nl_vf_mac_addr_modify; # WINDOWS_NO_EXPORT mlx5_nl_vlan_vmwa_create; # WINDOWS_NO_EXPORT mlx5_nl_vlan_vmwa_delete; # WINDOWS_NO_EXPORT + mlx5_nl_get_mtu_bounds; # WINDOWS_NO_EXPORT mlx5_os_get_physical_device_ctx; mlx5_os_umem_dereg; diff --git a/drivers/net/mlx5/linux/mlx5_ethdev_os.c b/drivers/net/mlx5/linux/mlx5_ethdev_os.c index f78d602098..a5dda1e5f1 100644 --- a/drivers/net/mlx5/linux/mlx5_ethdev_os.c +++ b/drivers/net/mlx5/linux/mlx5_ethdev_os.c @@ -157,6 +157,36 @@ mlx5_ifreq(const struct rte_eth_dev *dev, int req, struct ifreq *ifr) return mlx5_ifreq_by_ifname(ifname, req, ifr); } +/** + * Get device minimum and maximum allowed MTU values. + * + * @param dev + * Pointer to Ethernet device. + * @param[out] min_mtu + * Minimum MTU value output buffer. + * @param[out] max_mtu + * Maximum MTU value output buffer. + * + * @return + * 0 on success, a negative errno value otherwise and rte_errno is set. + */ +int +mlx5_os_get_mtu_bounds(struct rte_eth_dev *dev, uint16_t *min_mtu, uint16_t *max_mtu) +{ + struct mlx5_priv *priv = dev->data->dev_private; + int nl_route; + int ret; + + nl_route = mlx5_nl_init(NETLINK_ROUTE, 0); + if (nl_route < 0) + return nl_route; + + ret = mlx5_nl_get_mtu_bounds(nl_route, priv->if_index, min_mtu, max_mtu); + + close(nl_route); + return ret; +} + /** * Get device MTU. * diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c index 4bd5c8da7d..b23ee265b6 100644 --- a/drivers/net/mlx5/linux/mlx5_os.c +++ b/drivers/net/mlx5/linux/mlx5_os.c @@ -1570,6 +1570,8 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, eth_dev->data->mac_addrs = priv->mac; eth_dev->device = dpdk_dev; eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; + /* Fetch minimum and maximum allowed MTU from the device. */ + mlx5_get_mtu_bounds(eth_dev, &priv->min_mtu, &priv->max_mtu); /* Configure the first MAC address by default. */ if (mlx5_get_mac(eth_dev, &mac.addr_bytes)) { DRV_LOG(ERR, diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 296276c7ca..7966b65bae 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -74,6 +74,15 @@ /* Maximal number of field/field parts to map into sample registers .*/ #define MLX5_FLEX_ITEM_MAPPING_NUM 32 +/* Number of bytes not included in MTU. */ +#define MLX5_ETH_OVERHEAD (RTE_ETHER_HDR_LEN + RTE_VLAN_HLEN + RTE_ETHER_CRC_LEN) + +/* Minimum allowed MTU to be reported whenever PMD cannot query it from OS. */ +#define MLX5_ETH_MIN_MTU (RTE_ETHER_MIN_MTU) + +/* Maximum allowed MTU to be reported whenever PMD cannot query it from OS. */ +#define MLX5_ETH_MAX_MTU (9978) + enum mlx5_ipool_index { #if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H) MLX5_IPOOL_DECAP_ENCAP = 0, /* Pool for encap/decap resource. */ @@ -1957,6 +1966,8 @@ struct mlx5_priv { unsigned int vlan_filter_n; /* Number of configured VLAN filters. */ /* Device properties. */ uint16_t mtu; /* Configured MTU. */ + uint16_t min_mtu; /* Minimum MTU allowed on the NIC. */ + uint16_t max_mtu; /* Maximum MTU allowed on the NIC. */ unsigned int isolated:1; /* Whether isolated mode is enabled. */ unsigned int representor:1; /* Device is a port representor. */ unsigned int master:1; /* Device is a E-Switch master. */ @@ -2286,6 +2297,7 @@ struct mlx5_priv *mlx5_dev_to_eswitch_info(struct rte_eth_dev *dev); int mlx5_dev_configure_rss_reta(struct rte_eth_dev *dev); uint64_t mlx5_get_restore_flags(struct rte_eth_dev *dev, enum rte_eth_dev_operation op); +void mlx5_get_mtu_bounds(struct rte_eth_dev *dev, uint16_t *min_mtu, uint16_t *max_mtu); /* mlx5_ethdev_os.c */ @@ -2323,6 +2335,7 @@ int mlx5_os_get_stats_n(struct rte_eth_dev *dev, bool bond_master, uint16_t *n_stats, uint16_t *n_stats_sec); void mlx5_os_stats_init(struct rte_eth_dev *dev); int mlx5_get_flag_dropless_rq(struct rte_eth_dev *dev); +int mlx5_os_get_mtu_bounds(struct rte_eth_dev *dev, uint16_t *min_mtu, uint16_t *max_mtu); /* mlx5_mac.c */ diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c index 68d1c1bfa7..7747b0c869 100644 --- a/drivers/net/mlx5/mlx5_ethdev.c +++ b/drivers/net/mlx5/mlx5_ethdev.c @@ -360,9 +360,11 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info) unsigned int max; uint16_t max_wqe; + info->min_mtu = priv->min_mtu; + info->max_mtu = priv->max_mtu; + info->max_rx_pktlen = info->max_mtu + MLX5_ETH_OVERHEAD; /* FIXME: we should ask the device for these values. */ info->min_rx_bufsize = 32; - info->max_rx_pktlen = 65536; info->max_lro_pkt_size = MLX5_MAX_LRO_SIZE; /* * Since we need one CQ per QP, the limit is the minimum number @@ -863,3 +865,41 @@ mlx5_get_restore_flags(__rte_unused struct rte_eth_dev *dev, /* mlx5 PMD does not require any configuration restore. */ return 0; } + +/** + * Query minimum and maximum allowed MTU value on the device. + * + * This functions will always return valid MTU bounds. + * In case platform-specific implementation fails or current platform does not support it, + * the fallback default values will be used. + * + * @param[in] dev + * Pointer to Ethernet device + * @param[out] min_mtu + * Minimum MTU value output buffer. + * @param[out] max_mtu + * Maximum MTU value output buffer. + */ +void +mlx5_get_mtu_bounds(struct rte_eth_dev *dev, uint16_t *min_mtu, uint16_t *max_mtu) +{ + int ret; + + MLX5_ASSERT(min_mtu != NULL); + MLX5_ASSERT(max_mtu != NULL); + + ret = mlx5_os_get_mtu_bounds(dev, min_mtu, max_mtu); + if (ret < 0) { + if (ret != -ENOTSUP) + DRV_LOG(INFO, "port %u failed to query MTU bounds, using fallback values", + dev->data->port_id); + *min_mtu = MLX5_ETH_MIN_MTU; + *max_mtu = MLX5_ETH_MAX_MTU; + + /* This function does not fail. Clear rte_errno. */ + rte_errno = 0; + } + + DRV_LOG(INFO, "port %u minimum MTU is %u", dev->data->port_id, *min_mtu); + DRV_LOG(INFO, "port %u maximum MTU is %u", dev->data->port_id, *max_mtu); +} diff --git a/drivers/net/mlx5/windows/mlx5_ethdev_os.c b/drivers/net/mlx5/windows/mlx5_ethdev_os.c index ec08bfef6d..e24ff367af 100644 --- a/drivers/net/mlx5/windows/mlx5_ethdev_os.c +++ b/drivers/net/mlx5/windows/mlx5_ethdev_os.c @@ -71,6 +71,34 @@ mlx5_get_ifname(const struct rte_eth_dev *dev, char ifname[MLX5_NAMESIZE]) return 0; } +/** + * Get device minimum and maximum allowed MTU. + * + * Windows API does not expose minimum and maximum allowed MTU. + * In this case, this just returns (-ENOTSUP) to allow platform-independent code + * to fallback to default values. + * + * @param dev + * Pointer to Ethernet device. + * @param[out] min_mtu + * Minimum MTU value output buffer. + * @param[out] max_mtu + * Maximum MTU value output buffer. + * + * @return + * (-ENOTSUP) - not supported on Windows + */ +int +mlx5_os_get_mtu_bounds(struct rte_eth_dev *dev, uint16_t *min_mtu, uint16_t *max_mtu) +{ + RTE_SET_USED(dev); + RTE_SET_USED(min_mtu); + RTE_SET_USED(max_mtu); + + rte_errno = ENOTSUP; + return -rte_errno; +} + /** * Get device MTU. * diff --git a/drivers/net/mlx5/windows/mlx5_os.c b/drivers/net/mlx5/windows/mlx5_os.c index 7bd001950e..5c7e76383f 100644 --- a/drivers/net/mlx5/windows/mlx5_os.c +++ b/drivers/net/mlx5/windows/mlx5_os.c @@ -478,6 +478,8 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, eth_dev->data->mac_addrs = priv->mac; eth_dev->device = dpdk_dev; eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; + /* Fetch minimum and maximum allowed MTU from the device. */ + mlx5_get_mtu_bounds(eth_dev, &priv->min_mtu, &priv->max_mtu); /* Configure the first MAC address by default. */ if (mlx5_get_mac(eth_dev, &mac.addr_bytes)) { DRV_LOG(ERR, -- 2.39.5