DPDK patches and discussions
 help / color / mirror / Atom feed
From: longli@linuxonhyperv.com
To: Ferruh Yigit <ferruh.yigit@amd.com>,
	Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
Cc: dev@dpdk.org, Ajay Sharma <sharmaajay@microsoft.com>,
	Long Li <longli@microsoft.com>
Subject: [PATCH] net/mana: add support to update MTU
Date: Tue, 25 Jul 2023 14:16:54 -0700	[thread overview]
Message-ID: <1690319815-28594-1-git-send-email-longli@linuxonhyperv.com> (raw)

From: Long Li <longli@microsoft.com>

Add support for updating MTU for MANA. MTU is updated in kernel through
socket interface.

Signed-off-by: Long Li <longli@microsoft.com>
---
 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 <dirent.h>
 #include <fcntl.h>
 #include <sys/mman.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
 
 #include <ethdev_driver.h>
 #include <ethdev_pci.h>
@@ -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 ( \
-- 
2.34.1


             reply	other threads:[~2023-07-25 21:17 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-25 21:16 longli [this message]
2023-07-25 21:16 ` [PATCH] net/mana: use %m for fscanf to read mac address longli
2023-09-28 18:46   ` Ferruh Yigit
2023-09-28 19:14 ` [PATCH] net/mana: add support to update MTU Ferruh Yigit

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1690319815-28594-1-git-send-email-longli@linuxonhyperv.com \
    --to=longli@linuxonhyperv.com \
    --cc=andrew.rybchenko@oktetlabs.ru \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@amd.com \
    --cc=longli@microsoft.com \
    --cc=sharmaajay@microsoft.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).