lua: support reporting VHT rates
[project/iwinfo.git] / iwinfo_lua.c
index 21d6bbc..94913ac 100644 (file)
@@ -190,7 +190,7 @@ static void iwinfo_L_cryptotable(lua_State *L, struct iwinfo_crypto_entry *c)
        lua_setfield(L, -2, "wpa");
 
        lua_newtable(L);
-       for (i = 0, j = 1; i < 8; i++)
+       for (i = 0, j = 1; i < ARRAY_SIZE(IWINFO_CIPHER_NAMES); i++)
        {
                if (c->pair_ciphers & (1 << i))
                {
@@ -201,7 +201,7 @@ static void iwinfo_L_cryptotable(lua_State *L, struct iwinfo_crypto_entry *c)
        lua_setfield(L, -2, "pair_ciphers");
 
        lua_newtable(L);
-       for (i = 0, j = 1; i < 8; i++)
+       for (i = 0, j = 1; i < ARRAY_SIZE(IWINFO_CIPHER_NAMES); i++)
        {
                if (c->group_ciphers & (1 << i))
                {
@@ -212,7 +212,7 @@ static void iwinfo_L_cryptotable(lua_State *L, struct iwinfo_crypto_entry *c)
        lua_setfield(L, -2, "group_ciphers");
 
        lua_newtable(L);
-       for (i = 0, j = 1; i < 8; i++)
+       for (i = 0, j = 1; i < ARRAY_SIZE(IWINFO_KMGMT_NAMES); i++)
        {
                if (c->auth_suites & (1 << i))
                {
@@ -223,7 +223,7 @@ static void iwinfo_L_cryptotable(lua_State *L, struct iwinfo_crypto_entry *c)
        lua_setfield(L, -2, "auth_suites");
 
        lua_newtable(L);
-       for (i = 0, j = 1; i < 8; i++)
+       for (i = 0, j = 1; i < ARRAY_SIZE(IWINFO_AUTH_NAMES); i++)
        {
                if (c->auth_algs & (1 << i))
                {
@@ -248,6 +248,44 @@ static int iwinfo_L_mode(lua_State *L, int (*func)(const char *, int *))
        return 1;
 }
 
+static void set_rateinfo(lua_State *L, struct iwinfo_rate_entry *r, bool rx)
+{
+       lua_pushnumber(L, r->rate);
+       lua_setfield(L, -2, rx ? "rx_rate" : "tx_rate");
+
+       lua_pushboolean(L, r->is_ht);
+       lua_setfield(L, -2, rx ? "rx_ht" : "tx_ht");
+
+       lua_pushboolean(L, r->is_vht);
+       lua_setfield(L, -2, rx ? "rx_vht" : "tx_vht");
+
+       lua_pushnumber(L, r->mhz);
+       lua_setfield(L, -2, rx ? "rx_mhz" : "tx_mhz");
+
+       if (r->is_ht)
+       {
+               lua_pushboolean(L, r->is_40mhz);
+               lua_setfield(L, -2, rx ? "rx_40mhz" : "tx_40mhz");
+
+               lua_pushnumber(L, r->mcs);
+               lua_setfield(L, -2, rx ? "rx_mcs" : "tx_mcs");
+
+               lua_pushboolean(L, r->is_short_gi);
+               lua_setfield(L, -2, rx ? "rx_short_gi" : "tx_short_gi");
+       }
+       else if (r->is_vht)
+       {
+               lua_pushnumber(L, r->mcs);
+               lua_setfield(L, -2, rx ? "rx_mcs" : "tx_mcs");
+
+               lua_pushnumber(L, r->nss);
+               lua_setfield(L, -2, rx ? "rx_nss" : "tx_nss");
+
+               lua_pushboolean(L, r->is_short_gi);
+               lua_setfield(L, -2, rx ? "rx_short_gi" : "tx_short_gi");
+       }
+}
+
 /* Wrapper for assoclist */
 static int iwinfo_L_assoclist(lua_State *L, int (*func)(const char *, char *, int *))
 {
@@ -287,35 +325,8 @@ static int iwinfo_L_assoclist(lua_State *L, int (*func)(const char *, char *, in
                        lua_pushnumber(L, e->tx_packets);
                        lua_setfield(L, -2, "tx_packets");
 
-                       lua_pushnumber(L, e->rx_rate.rate);
-                       lua_setfield(L, -2, "rx_rate");
-
-                       lua_pushnumber(L, e->tx_rate.rate);
-                       lua_setfield(L, -2, "tx_rate");
-
-                       if (e->rx_rate.mcs >= 0)
-                       {
-                               lua_pushnumber(L, e->rx_rate.mcs);
-                               lua_setfield(L, -2, "rx_mcs");
-
-                               lua_pushboolean(L, e->rx_rate.is_40mhz);
-                               lua_setfield(L, -2, "rx_40mhz");
-
-                               lua_pushboolean(L, e->rx_rate.is_short_gi);
-                               lua_setfield(L, -2, "rx_short_gi");
-                       }
-
-                       if (e->tx_rate.mcs >= 0)
-                       {
-                               lua_pushnumber(L, e->tx_rate.mcs);
-                               lua_setfield(L, -2, "tx_mcs");
-
-                               lua_pushboolean(L, e->tx_rate.is_40mhz);
-                               lua_setfield(L, -2, "tx_40mhz");
-
-                               lua_pushboolean(L, e->tx_rate.is_short_gi);
-                               lua_setfield(L, -2, "tx_short_gi");
-                       }
+                       set_rateinfo(L, &e->rx_rate, true);
+                       set_rateinfo(L, &e->tx_rate, false);
 
                        lua_setfield(L, -2, macstr);
                }
@@ -597,7 +608,7 @@ static char * iwinfo_L_country_lookup(char *buf, int len, int iso3166)
 
 static int iwinfo_L_countrylist(lua_State *L, int (*func)(const char *, char *, int *))
 {
-       int len, i, j;
+       int len, i;
        char rv[IWINFO_BUFSIZE], alpha2[3];
        char *ccode;
        const char *ifname = luaL_checkstring(L, 1);
@@ -608,7 +619,7 @@ static int iwinfo_L_countrylist(lua_State *L, int (*func)(const char *, char *,
 
        if (!(*func)(ifname, rv, &len))
        {
-               for (l = IWINFO_ISO3166_NAMES, j = 1; l->iso3166; l++)
+               for (l = IWINFO_ISO3166_NAMES, i = 1; l->iso3166; l++)
                {
                        if ((ccode = iwinfo_L_country_lookup(rv, len, l->iso3166)) != NULL)
                        {
@@ -626,7 +637,7 @@ static int iwinfo_L_countrylist(lua_State *L, int (*func)(const char *, char *,
                                lua_pushstring(L, l->name);
                                lua_setfield(L, -2, "name");
 
-                               lua_rawseti(L, -2, j++);
+                               lua_rawseti(L, -2, i++);
                        }
                }
        }