From 50bd4a979be2f56e9872f3a4dcd3c17fc4334957 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Sat, 23 Oct 2010 01:37:05 +0000 Subject: [PATCH] libiwinfo: probe for vap availability in mbssid_support(), fix return type, fix description string for no crypto --- contrib/package/iwinfo/src/iwinfo.lua | 7 ++-- contrib/package/iwinfo/src/iwinfo_lualib.c | 36 +++++++++++++++++---- contrib/package/iwinfo/src/iwinfo_nl80211.c | 36 +++++++++++++++------ 3 files changed, 60 insertions(+), 19 deletions(-) diff --git a/contrib/package/iwinfo/src/iwinfo.lua b/contrib/package/iwinfo/src/iwinfo.lua index 1de43faaf..4a982dd99 100755 --- a/contrib/package/iwinfo/src/iwinfo.lua +++ b/contrib/package/iwinfo/src/iwinfo.lua @@ -62,7 +62,10 @@ function print_info(api, dev) n(iw.bitrate(dev)) / 1000) printf(" Encryption: %s", - s(enc and enc.description)) + s(enc and enc.description or "None")) + + printf(" Supports VAPs: %s", + iw.mbssid_support(dev) and "yes" or "no") print("") end @@ -85,7 +88,7 @@ function print_scan(api, dev) s(se.signal), n(se.quality), n(se.quality_max)) printf(" Encryption: %s", - s(se.encryption.description)) + s(se.encryption.description or "None")) print("") end diff --git a/contrib/package/iwinfo/src/iwinfo_lualib.c b/contrib/package/iwinfo/src/iwinfo_lualib.c index c87e55917..4309aa129 100644 --- a/contrib/package/iwinfo/src/iwinfo_lualib.c +++ b/contrib/package/iwinfo/src/iwinfo_lualib.c @@ -432,6 +432,10 @@ static char * iwinfo_crypto_desc(struct iwinfo_crypto_entry *c) break; } } + else + { + sprintf(desc, "None"); + } } else { @@ -694,11 +698,12 @@ static int iwinfo_L_encryption(lua_State *L, int (*func)(const char *, char *)) return 1; } - return 0; + lua_pushnil(L); + return 1; } /* Wrapper for hwmode list */ -static int iwinfo_L_hwmodelist(lua_State *L, int (*func)(const char*, int *)) +static int iwinfo_L_hwmodelist(lua_State *L, int (*func)(const char *, int *)) { const char *ifname = luaL_checkstring(L, 1); int hwmodes = 0; @@ -722,7 +727,24 @@ static int iwinfo_L_hwmodelist(lua_State *L, int (*func)(const char*, int *)) return 1; } - return 0; + lua_pushnil(L); + return 1; +} + +/* Wrapper for mbbsid_support */ +static int iwinfo_L_mbssid_support(lua_State *L, int (*func)(const char *, int *)) +{ + const char *ifname = luaL_checkstring(L, 1); + int support = 0; + + if( !(*func)(ifname, &support) ) + { + lua_pushboolean(L, support); + return 1; + } + + lua_pushnil(L); + return 1; } /* Wrapper for country list */ @@ -792,7 +814,6 @@ LUA_WRAP_INT(wl,signal) LUA_WRAP_INT(wl,noise) LUA_WRAP_INT(wl,quality) LUA_WRAP_INT(wl,quality_max) -LUA_WRAP_INT(wl,mbssid_support) LUA_WRAP_STRING(wl,mode) LUA_WRAP_STRING(wl,ssid) LUA_WRAP_STRING(wl,bssid) @@ -804,6 +825,7 @@ LUA_WRAP_LIST(wl,freqlist) LUA_WRAP_LIST(wl,countrylist) LUA_WRAP_LIST(wl,hwmodelist) LUA_WRAP_LIST(wl,encryption) +LUA_WRAP_LIST(wl,mbssid_support) #endif #ifdef USE_MADWIFI @@ -816,7 +838,6 @@ LUA_WRAP_INT(madwifi,signal) LUA_WRAP_INT(madwifi,noise) LUA_WRAP_INT(madwifi,quality) LUA_WRAP_INT(madwifi,quality_max) -LUA_WRAP_INT(madwifi,mbssid_support) LUA_WRAP_STRING(madwifi,mode) LUA_WRAP_STRING(madwifi,ssid) LUA_WRAP_STRING(madwifi,bssid) @@ -828,6 +849,7 @@ LUA_WRAP_LIST(madwifi,freqlist) LUA_WRAP_LIST(madwifi,countrylist) LUA_WRAP_LIST(madwifi,hwmodelist) LUA_WRAP_LIST(madwifi,encryption) +LUA_WRAP_LIST(madwifi,mbssid_support) #endif #ifdef USE_NL80211 @@ -840,7 +862,6 @@ LUA_WRAP_INT(nl80211,signal) LUA_WRAP_INT(nl80211,noise) LUA_WRAP_INT(nl80211,quality) LUA_WRAP_INT(nl80211,quality_max) -LUA_WRAP_INT(nl80211,mbssid_support) LUA_WRAP_STRING(nl80211,mode) LUA_WRAP_STRING(nl80211,ssid) LUA_WRAP_STRING(nl80211,bssid) @@ -852,6 +873,7 @@ LUA_WRAP_LIST(nl80211,freqlist) LUA_WRAP_LIST(nl80211,countrylist) LUA_WRAP_LIST(nl80211,hwmodelist) LUA_WRAP_LIST(nl80211,encryption) +LUA_WRAP_LIST(nl80211,mbssid_support) #endif /* Wext */ @@ -863,7 +885,6 @@ LUA_WRAP_INT(wext,signal) LUA_WRAP_INT(wext,noise) LUA_WRAP_INT(wext,quality) LUA_WRAP_INT(wext,quality_max) -LUA_WRAP_INT(wext,mbssid_support) LUA_WRAP_STRING(wext,mode) LUA_WRAP_STRING(wext,ssid) LUA_WRAP_STRING(wext,bssid) @@ -875,6 +896,7 @@ LUA_WRAP_LIST(wext,freqlist) LUA_WRAP_LIST(wext,countrylist) LUA_WRAP_LIST(wext,hwmodelist) LUA_WRAP_LIST(wext,encryption) +LUA_WRAP_LIST(wext,mbssid_support) #ifdef USE_WL /* Broadcom table */ diff --git a/contrib/package/iwinfo/src/iwinfo_nl80211.c b/contrib/package/iwinfo/src/iwinfo_nl80211.c index 9cfd21432..adc609f29 100644 --- a/contrib/package/iwinfo/src/iwinfo_nl80211.c +++ b/contrib/package/iwinfo/src/iwinfo_nl80211.c @@ -159,7 +159,9 @@ static struct nl80211_msg_conveyor * nl80211_msg(const char *ifname, int cmd, in if( nl80211_init() < 0 ) goto err; - if( !strncmp(ifname, "radio", 5) ) + if( !strncmp(ifname, "phy", 3) ) + phyidx = atoi(&ifname[3]); + else if( !strncmp(ifname, "radio", 5) ) phyidx = atoi(&ifname[5]); else if( !strncmp(ifname, "mon.", 4) ) ifidx = if_nametoindex(&ifname[4]); @@ -414,17 +416,20 @@ out: static char * nl80211_phy2ifname(const char *ifname) { - int fd, phyidx = 0; + int fd, phyidx = -1; char buffer[64]; static char nif[IFNAMSIZ] = { 0 }; DIR *d; struct dirent *e; - if( !strncmp(ifname, "radio", 5) ) - { + if( !strncmp(ifname, "phy", 3) ) + phyidx = atoi(&ifname[3]); + else if( !strncmp(ifname, "radio", 5) ) phyidx = atoi(&ifname[5]); + if( phyidx > -1 ) + { if( (d = opendir("/sys/class/net")) != NULL ) { while( (e = readdir(d)) != NULL ) @@ -546,7 +551,7 @@ static void nl80211_hostapd_hup(const char *ifname) { int fd, pid = 0; char buf[32]; - char *phy = strncmp(ifname, "phy", 3) ? nl80211_ifname2phy(ifname) : ifname; + char *phy = nl80211_ifname2phy(ifname); if( phy ) { @@ -1508,8 +1513,8 @@ int nl80211_get_hwmodelist(const char *ifname, int *buf) if( bands[NL80211_BAND_ATTR_HT_CAPA] ) caps = nla_get_u16(bands[NL80211_BAND_ATTR_HT_CAPA]); - /* Treat HT20/HT40 as 11n */ - if( caps & (1 << 1) ) + /* Treat any nonzero capability as 11n */ + if( caps > 0 ) *buf |= IWINFO_80211_N; nla_for_each_nested(freq, @@ -1542,7 +1547,18 @@ int nl80211_get_hwmodelist(const char *ifname, int *buf) int nl80211_get_mbssid_support(const char *ifname, int *buf) { - /* We assume that multi bssid is always possible */ - *buf = 1; - return 0; + /* test whether we can create another interface */ + char *nif = nl80211_ifadd(ifname); + + if( nif ) + { + *buf = (nl80211_ifmac(nif) && nl80211_ifup(nif)); + + nl80211_ifdown(nif); + nl80211_ifdel(nif); + + return 0; + } + + return -1; } -- 2.25.1