libs: remove cbi folder
[project/luci.git] / libs / iwinfo / src / iwinfo_lualib.c
index 4663d34..5509f4b 100644 (file)
 #include "iwinfo_lualib.h"
 
 /* Determine type */
-int iwinfo_L_type(lua_State *L)
+static int iwinfo_L_type(lua_State *L)
 {
        const char *ifname = luaL_checkstring(L, 1);
 
+#ifdef USE_MADWIFI
+       if( madwifi_probe(ifname) )
+               lua_pushstring(L, "madwifi");
+       else
+#endif
+
+#ifdef USE_WL
        if( wl_probe(ifname) )
                lua_pushstring(L, "wl");
+       else
+#endif
 
-       else if( madwifi_probe(ifname) )
-               lua_pushstring(L, "madwifi");
-
-       else if( wext_probe(ifname) )
+       if( wext_probe(ifname) )
                lua_pushstring(L, "wext");
 
        else
@@ -39,7 +45,7 @@ int iwinfo_L_type(lua_State *L)
 }
 
 /* Wrapper for assoclist */
-int iwinfo_L_assoclist(lua_State *L, int (*func)(const char *, char *, int *))
+static int iwinfo_L_assoclist(lua_State *L, int (*func)(const char *, char *, int *))
 {
        int i, len;
        char rv[IWINFO_BUFSIZE];
@@ -75,48 +81,238 @@ int iwinfo_L_assoclist(lua_State *L, int (*func)(const char *, char *, int *))
        return 1;
 }
 
+/* Wrapper for tx power list */
+static int iwinfo_L_txpwrlist(lua_State *L, int (*func)(const char *, char *, int *))
+{
+       int i, x, len;
+       char rv[IWINFO_BUFSIZE];
+       const char *ifname = luaL_checkstring(L, 1);
+       struct iwinfo_txpwrlist_entry *e;
+
+       lua_newtable(L);
+       memset(rv, 0, sizeof(rv));
+
+       if( !(*func)(ifname, rv, &len) )
+       {
+               for( i = 0, x = 1; i < len; i += sizeof(struct iwinfo_txpwrlist_entry), x++ )
+               {
+                       e = (struct iwinfo_txpwrlist_entry *) &rv[i];
+
+                       lua_newtable(L);
+
+                       lua_pushnumber(L, e->mw);
+                       lua_setfield(L, -2, "mw");
+                       
+                       lua_pushnumber(L, e->dbm);
+                       lua_setfield(L, -2, "dbm");
+
+                       lua_rawseti(L, -2, x);
+               }
+       }
+
+       return 1;
+}
+
+/* Wrapper for scan list */
+static int iwinfo_L_scanlist(lua_State *L, int (*func)(const char *, char *, int *))
+{
+       int i, j, x, y, len;
+       char rv[IWINFO_BUFSIZE];
+       char macstr[18];
+       const char *ifname = luaL_checkstring(L, 1);
+       struct iwinfo_scanlist_entry *e;
+
+       lua_newtable(L);
+       memset(rv, 0, sizeof(rv));
+
+       if( !(*func)(ifname, rv, &len) )
+       {
+               for( i = 0, x = 1; i < len; i += sizeof(struct iwinfo_scanlist_entry), x++ )
+               {
+                       e = (struct iwinfo_scanlist_entry *) &rv[i];
+
+                       lua_newtable(L);
+
+                       /* BSSID */
+                       sprintf(macstr, "%02X:%02X:%02X:%02X:%02X:%02X",
+                               e->mac[0], e->mac[1], e->mac[2],
+                               e->mac[3], e->mac[4], e->mac[5]);
+
+                       lua_pushstring(L, macstr);
+                       lua_setfield(L, -2, "bssid");
+
+                       /* ESSID */
+                       if( e->ssid[0] )
+                       {
+                               lua_pushstring(L, (char *) e->ssid);
+                               lua_setfield(L, -2, "ssid");
+                       }
+
+                       /* Channel */
+                       lua_pushinteger(L, e->channel);
+                       lua_setfield(L, -2, "channel");
+
+                       /* Mode */
+                       lua_pushstring(L, (char *) e->mode);
+                       lua_setfield(L, -2, "mode");
+
+                       /* Quality, Signal */
+                       lua_pushinteger(L, e->quality);
+                       lua_setfield(L, -2, "quality");
+
+                       lua_pushinteger(L, e->quality_max);
+                       lua_setfield(L, -2, "quality_max");
+
+                       lua_pushnumber(L, (e->signal - 0x100));
+                       lua_setfield(L, -2, "signal");
+
+                       /* Crypto */
+                       lua_pushboolean(L, (!e->crypto.wpa_version && e->crypto.enabled));
+                       lua_setfield(L, -2, "wep");
+
+                       if( e->crypto.wpa_version )
+                       {
+                               lua_pushinteger(L, e->crypto.wpa_version);
+                               lua_setfield(L, -2, "wpa");
+
+                               lua_newtable(L);
+                               for( j = 0, y = 1; j < IW_IE_CYPHER_NUM; j++ )
+                               {
+                                       if( e->crypto.group_ciphers & (1<<j) )
+                                       {
+                                               lua_pushstring(L, iw_ie_cypher_name[j]);
+                                               lua_rawseti(L, -2, y++);
+                                       }
+                               }
+                               lua_setfield(L, -2, "group_ciphers");
+
+                               lua_newtable(L);
+                               for( j = 0, y = 1; j < IW_IE_CYPHER_NUM; j++ )
+                               {
+                                       if( e->crypto.pair_ciphers & (1<<j) )
+                                       {
+                                               lua_pushstring(L, iw_ie_cypher_name[j]);
+                                               lua_rawseti(L, -2, y++);
+                                       }
+                               }
+                               lua_setfield(L, -2, "pair_ciphers");
+
+                               lua_newtable(L);
+                               for( j = 0, y = 1; j < IW_IE_KEY_MGMT_NUM; j++ )
+                               {
+                                       if( e->crypto.auth_suites & (1<<j) )
+                                       {
+                                               lua_pushstring(L, iw_ie_key_mgmt_name[j]);
+                                               lua_rawseti(L, -2, y++);
+                                       }
+                               }
+                               lua_setfield(L, -2, "auth_suites");
+                       }
+
+                       lua_rawseti(L, -2, x);
+               }
+       }
+
+       return 1;
+}
+
+/* Wrapper for frequency list */
+static int iwinfo_L_freqlist(lua_State *L, int (*func)(const char *, char *, int *))
+{
+       int i, x, len;
+       char rv[IWINFO_BUFSIZE];
+       const char *ifname = luaL_checkstring(L, 1);
+       struct iwinfo_freqlist_entry *e;
+
+       lua_newtable(L);
+       memset(rv, 0, sizeof(rv));
+
+       if( !(*func)(ifname, rv, &len) )
+       {
+               for( i = 0, x = 1; i < len; i += sizeof(struct iwinfo_freqlist_entry), x++ )
+               {
+                       e = (struct iwinfo_freqlist_entry *) &rv[i];
+
+                       lua_newtable(L);
+
+                       /* MHz */
+                       lua_pushinteger(L, e->mhz);
+                       lua_setfield(L, -2, "mhz");
+
+                       /* Channel */
+                       lua_pushinteger(L, e->channel);
+                       lua_setfield(L, -2, "channel");
+
+                       lua_rawseti(L, -2, x);
+               }
+       }
+
+       return 1;
+}
+
+#ifdef USE_WL
 /* Broadcom */
 LUA_WRAP_INT(wl,channel)
+LUA_WRAP_INT(wl,frequency)
 LUA_WRAP_INT(wl,bitrate)
 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)
 LUA_WRAP_STRING(wl,enctype)
-LUA_WRAP_ASSOCLIST(wl)
+LUA_WRAP_LIST(wl,assoclist)
+LUA_WRAP_LIST(wl,txpwrlist)
+LUA_WRAP_LIST(wl,scanlist)
+LUA_WRAP_LIST(wl,freqlist)
+#endif
 
+#ifdef USE_MADWIFI
 /* Madwifi */
 LUA_WRAP_INT(madwifi,channel)
+LUA_WRAP_INT(madwifi,frequency)
 LUA_WRAP_INT(madwifi,bitrate)
 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)
 LUA_WRAP_STRING(madwifi,enctype)
-LUA_WRAP_ASSOCLIST(madwifi)
+LUA_WRAP_LIST(madwifi,assoclist)
+LUA_WRAP_LIST(madwifi,txpwrlist)
+LUA_WRAP_LIST(madwifi,scanlist)
+LUA_WRAP_LIST(madwifi,freqlist)
+#endif
 
 /* Wext */
 LUA_WRAP_INT(wext,channel)
+LUA_WRAP_INT(wext,frequency)
 LUA_WRAP_INT(wext,bitrate)
 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)
 LUA_WRAP_STRING(wext,enctype)
-LUA_WRAP_ASSOCLIST(wext)
+LUA_WRAP_LIST(wext,assoclist)
+LUA_WRAP_LIST(wext,txpwrlist)
+LUA_WRAP_LIST(wext,scanlist)
+LUA_WRAP_LIST(wext,freqlist)
 
+#ifdef USE_WL
 /* Broadcom table */
 static const luaL_reg R_wl[] = {
        LUA_REG(wl,channel),
+       LUA_REG(wl,frequency),
        LUA_REG(wl,bitrate),
        LUA_REG(wl,signal),
        LUA_REG(wl,noise),
@@ -127,12 +323,19 @@ static const luaL_reg R_wl[] = {
        LUA_REG(wl,bssid),
        LUA_REG(wl,enctype),
        LUA_REG(wl,assoclist),
+       LUA_REG(wl,txpwrlist),
+       LUA_REG(wl,scanlist),
+       LUA_REG(wl,freqlist),
+       LUA_REG(wl,mbssid_support),
        { NULL, NULL }
 };
+#endif
 
+#ifdef USE_MADWIFI
 /* Madwifi table */
 static const luaL_reg R_madwifi[] = {
        LUA_REG(madwifi,channel),
+       LUA_REG(madwifi,frequency),
        LUA_REG(madwifi,bitrate),
        LUA_REG(madwifi,signal),
        LUA_REG(madwifi,noise),
@@ -143,12 +346,18 @@ static const luaL_reg R_madwifi[] = {
        LUA_REG(madwifi,bssid),
        LUA_REG(madwifi,enctype),
        LUA_REG(madwifi,assoclist),
+       LUA_REG(madwifi,txpwrlist),
+       LUA_REG(madwifi,scanlist),
+       LUA_REG(madwifi,freqlist),
+       LUA_REG(madwifi,mbssid_support),
        { NULL, NULL }
 };
+#endif
 
 /* Wext table */
 static const luaL_reg R_wext[] = {
        LUA_REG(wext,channel),
+       LUA_REG(wext,frequency),
        LUA_REG(wext,bitrate),
        LUA_REG(wext,signal),
        LUA_REG(wext,noise),
@@ -159,6 +368,10 @@ static const luaL_reg R_wext[] = {
        LUA_REG(wext,bssid),
        LUA_REG(wext,enctype),
        LUA_REG(wext,assoclist),
+       LUA_REG(wext,txpwrlist),
+       LUA_REG(wext,scanlist),
+       LUA_REG(wext,freqlist),
+       LUA_REG(wext,mbssid_support),
        { NULL, NULL }
 };
 
@@ -172,17 +385,21 @@ static const luaL_reg R_common[] = {
 LUALIB_API int luaopen_iwinfo(lua_State *L) {
        luaL_register(L, IWINFO_META, R_common);
 
+#ifdef USE_WL
        luaL_newmetatable(L, IWINFO_WL_META);
        luaL_register(L, NULL, R_wl);
        lua_pushvalue(L, -1);
        lua_setfield(L, -2, "__index");
        lua_setfield(L, -2, "wl");
+#endif
 
+#ifdef USE_MADWIFI
        luaL_newmetatable(L, IWINFO_MADWIFI_META);
        luaL_register(L, NULL, R_madwifi);
        lua_pushvalue(L, -1);
        lua_setfield(L, -2, "__index");
        lua_setfield(L, -2, "madwifi");
+#endif
 
        luaL_newmetatable(L, IWINFO_WEXT_META);
        luaL_register(L, NULL, R_wext);