From d00f3ccde2b963dff7328f5572ba7ce1f2423fe3 Mon Sep 17 00:00:00 2001 From: Vitalii Popov Date: Thu, 15 Oct 2026 01:33:08 +0300 Subject: [PATCH] workaround to get lower device name --- src/kerneldevice/mm-kernel-device-helpers.c | 54 ++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/src/kerneldevice/mm-kernel-device-helpers.c b/src/kerneldevice/mm-kernel-device-helpers.c index 4ee9dd88..fbf2b880 100644 --- a/src/kerneldevice/mm-kernel-device-helpers.c +++ b/src/kerneldevice/mm-kernel-device-helpers.c @@ -24,6 +24,58 @@ /******************************************************************************/ +static gboolean +read_sysfs_int (const gchar *path, + gint *value) +{ + g_autofree gchar *contents = NULL; + gchar *end = NULL; + gint64 parsed; + + if (!g_file_get_contents (path, &contents, NULL, NULL)) + return FALSE; + parsed = g_ascii_strtoll (contents, &end, 10); + if (end == contents) + return FALSE; + *value = (gint) parsed; + return TRUE; +} + +/* Net devices stacked by drivers that create no lower_* adjacency links (e.g. rmnet on Android vendor + * kernels) still report the parent's interface index in 'iflink'. */ +static gchar * +get_lower_device_name_by_iflink (const gchar *sysfs_path) +{ + g_autofree gchar *ifindex_path = NULL; + g_autofree gchar *iflink_path = NULL; + g_autoptr(GDir) dir = NULL; + const gchar *name; + gint ifindex; + gint iflink; + + ifindex_path = g_build_filename (sysfs_path, "ifindex", NULL); + iflink_path = g_build_filename (sysfs_path, "iflink", NULL); + if (!read_sysfs_int (ifindex_path, &ifindex) || + !read_sysfs_int (iflink_path, &iflink) || + iflink == ifindex || iflink <= 0) + return NULL; + + dir = g_dir_open ("/sys/class/net", 0, NULL); + if (!dir) + return NULL; + + while ((name = g_dir_read_name (dir)) != NULL) { + g_autofree gchar *path = NULL; + gint index; + + path = g_build_filename ("/sys/class/net", name, "ifindex", NULL); + if (read_sysfs_int (path, &index) && index == iflink) + return g_strdup (name); + } + + return NULL; +} + gchar * mm_kernel_device_get_lower_device_name (const gchar *sysfs_path) { @@ -60,7 +112,7 @@ mm_kernel_device_get_lower_device_name (const gchar *sysfs_path) return g_path_get_basename (real_path); } - return NULL; + return get_lower_device_name_by_iflink (sysfs_path); } /******************************************************************************/