|
|
|
@ -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; |
|
|
|
|
|
|
|
|
|