nl80211: restore iterating over all devices in nl80211_phy2ifname()
authorAndre Heider <a.heider@gmail.com>
Mon, 30 Jan 2023 18:57:57 +0000 (19:57 +0100)
committerChristian Marangi <ansuelsmth@gmail.com>
Mon, 6 Feb 2023 20:31:45 +0000 (21:31 +0100)
This reverts to the earlier behaviour, because:
* phys can be renamed, which breaks hardcoding "phy%d"
* /sys/class/ieee80211/*/device can return networks of other phys,
  since "device" is a symlink which can have multiple phys

The earlier behaviour fixes both points.

Fixes: 6194aaf0 "nl80211: simplify iterating over phy's devices"
Signed-off-by: Andre Heider <a.heider@gmail.com>
Tested-by: Olcay Korkmaz <nuke_mania@hotmail.com>
[ drop extra Fixes tag related to openwrt issue ]
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
iwinfo_nl80211.c

index 5bc2f51df20f12c511369c259283462365eceaef..50bb8f03c2fd263a3ab3fa979eb913d457f55d62 100644 (file)
@@ -825,13 +825,15 @@ static char * nl80211_phy2ifname(const char *ifname)
 
        memset(nif, 0, sizeof(nif));
 
-       snprintf(buffer, sizeof(buffer),
-                "/sys/class/ieee80211/phy%d/device/net", phyidx);
-
-       if ((d = opendir(buffer)) != NULL)
+       if ((d = opendir("/sys/class/net")) != NULL)
        {
                while ((e = readdir(d)) != NULL)
                {
+                       snprintf(buffer, sizeof(buffer),
+                                "/sys/class/net/%s/phy80211/index", e->d_name);
+                       if (nl80211_readint(buffer) != phyidx)
+                               continue;
+
                        snprintf(buffer, sizeof(buffer),
                                 "/sys/class/net/%s/ifindex", e->d_name);
                        cifidx = nl80211_readint(buffer);