nl80211: fix issues with renamed wiphy and multiple phy per device
authorFelix Fietkau <nbd@nbd.name>
Fri, 14 Oct 2022 08:59:07 +0000 (10:59 +0200)
committerFelix Fietkau <nbd@nbd.name>
Fri, 14 Oct 2022 08:59:08 +0000 (10:59 +0200)
Remove the assumption that phy names follow the format phy%d and instead look
up the phy index from sysfs properly

Signed-off-by: Felix Fietkau <nbd@nbd.name>
iwinfo_nl80211.c

index 5d224b331c8de29cbec372ddd952948a57eb545d..1898373af0ec3a20c235c244be475d9503d86ffe 100644 (file)
@@ -241,11 +241,15 @@ static const char *nl80211_phy_path_str(const char *phyname)
        int buf_len, offset;
        struct dirent *e;
        char buf[128], *link;
-       int phy_id;
+       int phy_idx;
        int seq = 0;
        DIR *d;
 
-       phy_id = atoi(phyname + 3);
+       snprintf(buf, sizeof(buf), "/sys/class/ieee80211/%s/index", phyname);
+       phy_idx = nl80211_readint(buf);
+       if (phy_idx < 0)
+               return NULL;
+
        buf_len = snprintf(buf, sizeof(buf), "/sys/class/ieee80211/%s/device", phyname);
        link = realpath(buf, path);
        if (!link)
@@ -267,13 +271,14 @@ static const char *nl80211_phy_path_str(const char *phyname)
                return link;
 
        while ((e = readdir(d)) != NULL) {
-               int cur_id;
+               int cur_idx;
 
-               if (strncmp(e->d_name, "phy", 3) != 0)
+               snprintf(buf, sizeof(buf), "/sys/class/ieee80211/%s/index", e->d_name);
+               cur_idx = nl80211_readint(buf);
+               if (cur_idx < 0)
                        continue;
 
-               cur_id = atoi(e->d_name + 3);
-               if (cur_id >= phy_id)
+               if (cur_idx >= phy_idx)
                        continue;
 
                seq++;