From patchwork Tue Jul 25 21:16:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Long Li X-Patchwork-Id: 129700 X-Patchwork-Delegate: ferruh.yigit@amd.com 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 BF68D42F47; Tue, 25 Jul 2023 23:17:02 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 97A5740A7F; Tue, 25 Jul 2023 23:17:02 +0200 (CEST) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mails.dpdk.org (Postfix) with ESMTP id 0D169406A2 for ; Tue, 25 Jul 2023 23:17:01 +0200 (CEST) Received: by linux.microsoft.com (Postfix, from userid 1004) id 4E58C2380B11; Tue, 25 Jul 2023 14:17:00 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 4E58C2380B11 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linuxonhyperv.com; s=default; t=1690319820; bh=ZtlwtEtRJalql+2s2bSadLrWrSeqrS11NJ7wCHuPSrw=; h=From:To:Cc:Subject:Date:From; b=h1eCrUHnxo592Mgjhqazxxil4bTq6BHnukVTnoo1zfDhL5eorWBA0SrD9j2iWFnaz 0jzBnX94eZPBFbxTe3R/Vwa39RSbWC+TbQpwbA/gH7C8rrK/XMqsqep+bN85+pIwwb oJXQwWEte2oLL+OnTT7nu1hDj0TCSIcLX1ay9sRI= From: longli@linuxonhyperv.com To: Ferruh Yigit , Andrew Rybchenko Cc: dev@dpdk.org, Ajay Sharma , Long Li Subject: [PATCH] net/mana: add support to update MTU Date: Tue, 25 Jul 2023 14:16:54 -0700 Message-Id: <1690319815-28594-1-git-send-email-longli@linuxonhyperv.com> X-Mailer: git-send-email 1.8.3.1 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 From: Long Li Add support for updating MTU for MANA. MTU is updated in kernel through socket interface. Signed-off-by: Long Li --- doc/guides/nics/features/mana.ini | 1 + drivers/net/mana/mana.c | 96 ++++++++++++++++++++++++++++++- drivers/net/mana/mana.h | 2 +- 3 files changed, 96 insertions(+), 3 deletions(-) diff --git a/doc/guides/nics/features/mana.ini b/doc/guides/nics/features/mana.ini index e69bf4af15..42fd3327d2 100644 --- a/doc/guides/nics/features/mana.ini +++ b/doc/guides/nics/features/mana.ini @@ -13,6 +13,7 @@ RSS hash = Y L3 checksum offload = Y L4 checksum offload = Y Basic stats = Y +MTU update = Y Multiprocess aware = Y Linux = Y x86-64 = Y diff --git a/drivers/net/mana/mana.c b/drivers/net/mana/mana.c index 7630118d4f..f1fdcf426a 100644 --- a/drivers/net/mana/mana.c +++ b/drivers/net/mana/mana.c @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include #include @@ -286,11 +288,12 @@ mana_dev_info_get(struct rte_eth_dev *dev, { struct mana_priv *priv = dev->data->dev_private; - dev_info->max_mtu = RTE_ETHER_MTU; + dev_info->min_mtu = RTE_ETHER_MIN_MTU; + dev_info->max_mtu = MANA_MAX_MTU; /* RX params */ dev_info->min_rx_bufsize = MIN_RX_BUF_SIZE; - dev_info->max_rx_pktlen = MAX_FRAME_SIZE; + dev_info->max_rx_pktlen = MANA_MAX_MTU + RTE_ETHER_HDR_LEN; dev_info->max_rx_queues = priv->max_rx_queues; dev_info->max_tx_queues = priv->max_tx_queues; @@ -700,6 +703,94 @@ mana_dev_stats_reset(struct rte_eth_dev *dev __rte_unused) return 0; } +static int +mana_get_ifname(const struct mana_priv *priv, char (*ifname)[IF_NAMESIZE]) +{ + int ret; + DIR *dir; + struct dirent *dent; + + MANA_MKSTR(dirpath, "%s/device/net", priv->ib_ctx->device->ibdev_path); + + dir = opendir(dirpath); + if (dir == NULL) + return -ENODEV; + + while ((dent = readdir(dir)) != NULL) { + char *name = dent->d_name; + FILE *file; + struct rte_ether_addr addr; + char *mac = NULL; + + if ((name[0] == '.') && + ((name[1] == '\0') || + ((name[1] == '.') && (name[2] == '\0')))) + continue; + + MANA_MKSTR(path, "%s/%s/address", dirpath, name); + + file = fopen(path, "r"); + if (!file) { + ret = -ENODEV; + break; + } + + ret = fscanf(file, "%ms", &mac); + fclose(file); + + if (ret <= 0) { + ret = -EINVAL; + break; + } + + ret = rte_ether_unformat_addr(mac, &addr); + free(mac); + if (ret) + break; + + if (rte_is_same_ether_addr(&addr, priv->dev_data->mac_addrs)) { + strlcpy(*ifname, name, sizeof(*ifname)); + ret = 0; + break; + } + } + + closedir(dir); + return ret; +} + +static int +mana_ifreq(const struct mana_priv *priv, int req, struct ifreq *ifr) +{ + int sock, ret; + + sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); + if (sock == -1) + return -errno; + + ret = mana_get_ifname(priv, &ifr->ifr_name); + if (ret) { + close(sock); + return ret; + } + + if (ioctl(sock, req, ifr) == -1) + ret = -errno; + + close(sock); + + return ret; +} + +static int +mana_mtu_set(struct rte_eth_dev *dev, uint16_t mtu) +{ + struct mana_priv *priv = dev->data->dev_private; + struct ifreq request = { .ifr_mtu = mtu, }; + + return mana_ifreq(priv, SIOCSIFMTU, &request); +} + static const struct eth_dev_ops mana_dev_ops = { .dev_configure = mana_dev_configure, .dev_start = mana_dev_start, @@ -720,6 +811,7 @@ static const struct eth_dev_ops mana_dev_ops = { .link_update = mana_dev_link_update, .stats_get = mana_dev_stats_get, .stats_reset = mana_dev_stats_reset, + .mtu_set = mana_mtu_set, }; static const struct eth_dev_ops mana_dev_secondary_ops = { diff --git a/drivers/net/mana/mana.h b/drivers/net/mana/mana.h index 5801491d75..ee8ea4aee3 100644 --- a/drivers/net/mana/mana.h +++ b/drivers/net/mana/mana.h @@ -16,8 +16,8 @@ struct mana_shared_data { unsigned int secondary_cnt; }; +#define MANA_MAX_MTU 9000 #define MIN_RX_BUF_SIZE 1024 -#define MAX_FRAME_SIZE RTE_ETHER_MAX_LEN #define MANA_MAX_MAC_ADDR 1 #define MANA_DEV_RX_OFFLOAD_SUPPORT ( \