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>
This commit is contained in:
Andre Heider 2022-11-15 14:12:41 +01:00 committed by Jo-Philipp Wich
parent c27ce7113e
commit a77d915568

View file

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