From: Hemant Agrawal <[email protected]>

A shared MAC interface needs the kernel netdev name to read the MTU,
and that name is only the DPDK port name for fmX-macY style netdevs.

Look it up in sysfs under the platform device of the dpa-ethernet node
the port was created from, and fall back to the port name.

Signed-off-by: Hemant Agrawal <[email protected]>
---
 doc/guides/nics/dpaa.rst       |  6 ++-
 drivers/net/dpaa/dpaa_ethdev.c | 68 +++++++++++++++++++++++++++++++++-
 2 files changed, 72 insertions(+), 2 deletions(-)

diff --git a/doc/guides/nics/dpaa.rst b/doc/guides/nics/dpaa.rst
index 21f54bcd36..2094abf417 100644
--- a/doc/guides/nics/dpaa.rst
+++ b/doc/guides/nics/dpaa.rst
@@ -276,6 +276,11 @@ Refer to the document :doc:`build_and_test` for details.
   and thus disabling hardware based packet handling at driver level,
   e.g. ``dpaa:fm1-mac3,recv_err_pkts=1``.
 
+* For a shared MAC interface the kernel network interface name is looked up
+  in sysfs from the device tree node the port was created from,
+  so a kernel interface that does not follow
+  the ``fmX-macY`` naming style is handled without extra configuration.
+
 ``drv_bh_port``
    Name of the back-half port associated with an offline (O/H) port device.
    It is passed on the offline port device itself, which is named
@@ -306,7 +311,6 @@ control device can be programmed by the application via the 
experimental
 ``rte_pmd_dpaa_ol_set_lgw_info()`` and ``rte_pmd_dpaa_ol_reset_lgw_info()``
 APIs declared in ``rte_pmd_dpaa_oldev.h``.
 
-
 FMAN Config
 -----------
 
diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c
index fe49c7b961..a821e68807 100644
--- a/drivers/net/dpaa/dpaa_ethdev.c
+++ b/drivers/net/dpaa/dpaa_ethdev.c
@@ -9,12 +9,14 @@
 #include <inttypes.h>
 #include <unistd.h>
 #include <limits.h>
+#include <stdlib.h>
 #include <sched.h>
 #include <signal.h>
 #include <pthread.h>
 #include <sys/types.h>
 #include <sys/syscall.h>
 #include <sys/ioctl.h>
+#include <dirent.h>
 
 #include <eal_export.h>
 #include <rte_string_fns.h>
@@ -57,6 +59,61 @@
 #define DRIVER_RECV_ERR_PKTS      "recv_err_pkts"
 #define RTE_PRIORITY_103 103
 
+#define DPAA_OF_BASE_PATH "/sys/firmware/devicetree/base"
+
+/*
+ * Get the kernel netdev name bound to the same device tree node as this
+ * port, by matching each /sys/class/net/<ifname>/device/of_node against
+ * node_path. Returns 1 on success, 0 if none was found, negative on error.
+ */
+static int
+dpaa_get_kernel_ifname(const char *node_path, char *name, size_t size)
+{
+       char path[PATH_MAX], resolved[PATH_MAX];
+       struct dirent *entry;
+       DIR *dir;
+       int ret;
+
+       if (!node_path || node_path[0] == '\0')
+               return 0;
+
+       dir = opendir("/sys/class/net");
+       if (!dir)
+               return 0;
+
+       ret = 0;
+       while ((entry = readdir(dir)) != NULL) {
+               if (entry->d_name[0] == '.')
+                       continue;
+
+               if (snprintf(path, sizeof(path),
+                            "/sys/class/net/%s/device/of_node",
+                            entry->d_name) >= (int)sizeof(path))
+                       continue;
+
+               if (realpath(path, resolved) == NULL)
+                       continue;
+
+               if (strncmp(resolved, DPAA_OF_BASE_PATH,
+                           strlen(DPAA_OF_BASE_PATH)) != 0)
+                       continue;
+
+               if (strcmp(resolved + strlen(DPAA_OF_BASE_PATH),
+                          node_path) != 0)
+                       continue;
+
+               if (rte_strscpy(name, entry->d_name, size) < 0) {
+                       ret = -ENAMETOOLONG;
+                       break;
+               }
+               ret = 1;
+               break;
+       }
+
+       closedir(dir);
+       return ret;
+}
+
 /* Supported Rx offloads */
 static uint64_t dev_rx_offloads_sup =
                RTE_ETH_RX_OFFLOAD_SCATTER;
@@ -251,6 +308,7 @@ dpaa_eth_dev_configure(struct rte_eth_dev *dev)
        int speed, duplex;
        int ret, rx_status, socket_fd;
        struct ifreq ifr;
+       char sh_if_name[IFNAMSIZ];
 
        PMD_INIT_FUNC_TRACE();
 
@@ -272,7 +330,15 @@ dpaa_eth_dev_configure(struct rte_eth_dev *dev)
                        DPAA_PMD_ERR("Cannot open IF socket");
                        return -errno;
                }
-               strlcpy(ifr.ifr_name, dpaa_intf->name, IFNAMSIZ);
+
+               /* The DPDK port name matches the netdev only for fmX-macY. */
+               sh_if_name[0] = '\0';
+               ret = dpaa_get_kernel_ifname(__fif->node_path, sh_if_name,
+                                            sizeof(sh_if_name));
+               if (ret <= 0 || sh_if_name[0] == '\0')
+                       strlcpy(ifr.ifr_name, dpaa_intf->name, IFNAMSIZ);
+               else
+                       strlcpy(ifr.ifr_name, sh_if_name, IFNAMSIZ);
 
                if (ioctl(socket_fd, SIOCGIFMTU, &ifr) < 0) {
                        DPAA_PMD_ERR("Cannot get interface mtu");
-- 
2.25.1

Reply via email to