diff options
author | Andre Heider <a.heider@gmail.com> | 2022-11-15 14:12:41 +0100 |
---|---|---|
committer | Jo-Philipp Wich <jo@mein.io> | 2022-12-15 21:22:18 +0100 |
commit | a77d915568a3cf5011eb9b0ff20f7f1e507090ae (patch) | |
tree | 0fcdba45a4587971d2e19079e32ae6d313aefacb | |
parent | c27ce7113e5226c8a0689c30b34e0e547dd43d25 (diff) | |
download | iwinfo-a77d915568a3cf5011eb9b0ff20f7f1e507090ae.tar.gz |
nl80211: don't guess if a name is an ifname
It's too slow to do it all over again and again, especially with e.g.
luci constantly polling.
Before:
$ time iwinfo phy0 info
real 0m 0.54s
$ time iwinfo radio0 info
real 0m 0.70s
$ time ubus call luci-rpc getWirelessDevices
real 0m 0.67s
After:
$ time iwinfo phy0 info
real 0m 0.04s
$ time iwinfo radio0 info
real 0m 0.09s
$ time ubus call luci-rpc getWirelessDevices
real 0m 0.17s
Signed-off-by: Andre Heider <a.heider@gmail.com>
-rw-r--r-- | iwinfo_nl80211.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/iwinfo_nl80211.c b/iwinfo_nl80211.c index 50b1ab4..545c56c 100644 --- a/iwinfo_nl80211.c +++ b/iwinfo_nl80211.c @@ -22,6 +22,7 @@ * Parts of this code are derived from the Linux iw utility. */ +#include <sys/stat.h> #include <limits.h> #include <glob.h> #include <fnmatch.h> @@ -411,6 +412,15 @@ out: return idx; } +static bool nl80211_is_ifname(const char *name) +{ + struct stat st; + char buffer[PATH_MAX]; + + snprintf(buffer, sizeof(buffer), "/sys/class/net/%s", name); + return !lstat(buffer, &st); +} + static struct nl80211_msg_conveyor * nl80211_msg(const char *ifname, int cmd, int flags) { @@ -426,10 +436,10 @@ static struct nl80211_msg_conveyor * nl80211_msg(const char *ifname, if (!strncmp(ifname, "mon.", 4)) ifidx = if_nametoindex(&ifname[4]); - else + else if (nl80211_is_ifname(ifname)) ifidx = if_nametoindex(ifname); - - if (!ifidx) { + else + { phyidx = nl80211_phy_idx_from_phy(ifname); if (phyidx < 0) phyidx = nl80211_phy_idx_from_uci(ifname); |