|
@@ -23,6 +23,7 @@
|
|
|
*/
|
|
|
|
|
|
#include <limits.h>
|
|
|
+#include <glob.h>
|
|
|
#include "iwinfo_nl80211.h"
|
|
|
|
|
|
#define min(x, y) ((x) < (y)) ? (x) : (y)
|
|
@@ -209,6 +210,51 @@ static struct nl80211_msg_conveyor * nl80211_ctl(int cmd, int flags)
|
|
|
return nl80211_new(nls->nlctrl, cmd, flags);
|
|
|
}
|
|
|
|
|
|
+static int nl80211_phy_idx_from_uci(const char *name)
|
|
|
+{
|
|
|
+ struct uci_section *s;
|
|
|
+ const char *opt;
|
|
|
+ char buf[128];
|
|
|
+ glob_t gl;
|
|
|
+ FILE *f = NULL;
|
|
|
+ int idx = -1;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ s = iwinfo_uci_get_radio(name, "mac80211");
|
|
|
+ if (!s)
|
|
|
+ goto free;
|
|
|
+
|
|
|
+ opt = uci_lookup_option_string(uci_ctx, s, "path");
|
|
|
+ if (!opt)
|
|
|
+ goto free;
|
|
|
+
|
|
|
+ snprintf(buf, sizeof(buf), "/sys/devices/%s/ieee80211/*/index", opt);
|
|
|
+ err = glob(buf, 0, NULL, &gl);
|
|
|
+ if (err)
|
|
|
+ goto free;
|
|
|
+
|
|
|
+ if (gl.gl_pathc)
|
|
|
+ f = fopen(gl.gl_pathv[0], "r");
|
|
|
+
|
|
|
+ globfree(&gl);
|
|
|
+
|
|
|
+ if (!f)
|
|
|
+ goto free;
|
|
|
+
|
|
|
+ err = fread(buf, 1, sizeof(buf) - 1, f);
|
|
|
+ fclose(f);
|
|
|
+
|
|
|
+ if (err <= 0)
|
|
|
+ goto free;
|
|
|
+
|
|
|
+ buf[err] = 0;
|
|
|
+ idx = atoi(buf);
|
|
|
+
|
|
|
+free:
|
|
|
+ iwinfo_uci_free();
|
|
|
+ return idx;
|
|
|
+}
|
|
|
+
|
|
|
static struct nl80211_msg_conveyor * nl80211_msg(const char *ifname,
|
|
|
int cmd, int flags)
|
|
|
{
|
|
@@ -224,7 +270,7 @@ static struct nl80211_msg_conveyor * nl80211_msg(const char *ifname,
|
|
|
if (!strncmp(ifname, "phy", 3))
|
|
|
phyidx = atoi(&ifname[3]);
|
|
|
else if (!strncmp(ifname, "radio", 5))
|
|
|
- phyidx = atoi(&ifname[5]);
|
|
|
+ phyidx = nl80211_phy_idx_from_uci(ifname);
|
|
|
else if (!strncmp(ifname, "mon.", 4))
|
|
|
ifidx = if_nametoindex(&ifname[4]);
|
|
|
else
|
|
@@ -510,7 +556,7 @@ static char * nl80211_phy2ifname(const char *ifname)
|
|
|
else if (!strncmp(ifname, "phy", 3))
|
|
|
phyidx = atoi(&ifname[3]);
|
|
|
else if (!strncmp(ifname, "radio", 5))
|
|
|
- phyidx = atoi(&ifname[5]);
|
|
|
+ phyidx = nl80211_phy_idx_from_uci(ifname);
|
|
|
else
|
|
|
return NULL;
|
|
|
|