break;
}
}
+ else
+ {
+ sprintf(desc, "None");
+ }
}
else
{
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;
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 */
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)
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
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)
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
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)
LUA_WRAP_LIST(nl80211,countrylist)
LUA_WRAP_LIST(nl80211,hwmodelist)
LUA_WRAP_LIST(nl80211,encryption)
+LUA_WRAP_LIST(nl80211,mbssid_support)
#endif
/* Wext */
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)
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 */
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]);
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 )
{
int fd, pid = 0;
char buf[32];
- char *phy = strncmp(ifname, "phy", 3) ? nl80211_ifname2phy(ifname) : ifname;
+ char *phy = nl80211_ifname2phy(ifname);
if( phy )
{
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,
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;
}