iwinfo: constify string map arg for rpc_iwinfo_call_int()
[project/rpcd.git] / iwinfo.c
index 1e172ee5ae79c0421567af56db223cade15884ea..a4d8ec666a8a0e7a3a4652a84b301babceaaf88c 100644 (file)
--- a/iwinfo.c
+++ b/iwinfo.c
@@ -96,7 +96,7 @@ rpc_iwinfo_close(void)
 
 static void
 rpc_iwinfo_call_int(const char *name, int (*func)(const char *, int *),
-                    const char **map)
+                    const char * const *map)
 {
        int rv;
 
@@ -199,6 +199,9 @@ rpc_iwinfo_add_encryption(const char *name, struct iwinfo_crypto_entry *e)
                if (ciph & IWINFO_CIPHER_CCMP)
                        blobmsg_add_string(&buf, NULL, "ccmp");
 
+               if (ciph & IWINFO_CIPHER_GCMP)
+                       blobmsg_add_string(&buf, NULL, "gcmp");
+
                if (ciph & IWINFO_CIPHER_WRAP)
                        blobmsg_add_string(&buf, NULL, "wrap");
 
@@ -257,6 +260,21 @@ rpc_iwinfo_call_htmodes(const char *name)
                if (modes & IWINFO_HTMODE_VHT160)
                        blobmsg_add_string(&buf, NULL, "VHT160");
 
+               if (modes & IWINFO_HTMODE_HE20)
+                       blobmsg_add_string(&buf, NULL, "HE20");
+
+               if (modes & IWINFO_HTMODE_HE40)
+                       blobmsg_add_string(&buf, NULL, "HE40");
+
+               if (modes & IWINFO_HTMODE_HE80)
+                       blobmsg_add_string(&buf, NULL, "HE80");
+
+               if (modes & IWINFO_HTMODE_HE80_80)
+                       blobmsg_add_string(&buf, NULL, "HE80+80");
+
+               if (modes & IWINFO_HTMODE_HE160)
+                       blobmsg_add_string(&buf, NULL, "HE160");
+
                blobmsg_close_array(&buf, c);
        }
 }
@@ -271,9 +289,15 @@ rpc_iwinfo_call_hwmodes(const char *name)
        {
                c = blobmsg_open_array(&buf, name);
 
+               if (modes & IWINFO_80211_AD)
+                       blobmsg_add_string(&buf, NULL, "ad");
+
                if (modes & IWINFO_80211_AC)
                        blobmsg_add_string(&buf, NULL, "ac");
 
+               if (modes & IWINFO_80211_AX)
+                       blobmsg_add_string(&buf, NULL, "ax");
+
                if (modes & IWINFO_80211_A)
                        blobmsg_add_string(&buf, NULL, "a");
 
@@ -295,6 +319,12 @@ static void rpc_iwinfo_call_hw_ht_mode()
        const char *hwmode_str;
        const char *htmode_str;
        int32_t htmode = 0;
+       int modes;
+
+       if (!iw->hwmodelist(ifname, &modes) && (modes == IWINFO_80211_AD)) {
+               blobmsg_add_string(&buf, "hwmode", "ad");
+               return;
+       }
 
        if (iw->htmode(ifname, &htmode))
                return;
@@ -320,6 +350,26 @@ static void rpc_iwinfo_call_hw_ht_mode()
                        htmode_str = "VHT160";
                        hwmode_str = "ac";
                        break;
+               case IWINFO_HTMODE_HE20:
+                       htmode_str = "HE20";
+                       hwmode_str = "ax";
+                       break;
+               case IWINFO_HTMODE_HE40:
+                       htmode_str = "HE40";
+                       hwmode_str = "ax";
+                       break;
+               case IWINFO_HTMODE_HE80:
+                       htmode_str = "HE80";
+                       hwmode_str = "ax";
+                       break;
+               case IWINFO_HTMODE_HE80_80:
+                       htmode_str = "HE80+80";
+                       hwmode_str = "ax";
+                       break;
+               case IWINFO_HTMODE_HE160:
+                       htmode_str = "HE160";
+                       hwmode_str = "ax";
+                       break;
                case IWINFO_HTMODE_NOHT:
                        htmode_str = "20";
                        hwmode_str = "a/g";
@@ -364,6 +414,8 @@ rpc_iwinfo_info(struct ubus_context *ctx, struct ubus_object *obj,
 
        rpc_iwinfo_call_int("mode", iw->mode, IWINFO_OPMODE_NAMES);
        rpc_iwinfo_call_int("channel", iw->channel, NULL);
+       rpc_iwinfo_call_int("center_chan1", iw->center_chan1, NULL);
+       rpc_iwinfo_call_int("center_chan2", iw->center_chan2, NULL);
 
        rpc_iwinfo_call_int("frequency", iw->frequency, NULL);
        rpc_iwinfo_call_int("frequency_offset", iw->frequency_offset, NULL);
@@ -441,11 +493,13 @@ rpc_iwinfo_scan(struct ubus_context *ctx, struct ubus_object *obj,
                        blobmsg_add_u32(&buf, "quality", e->quality);
                        blobmsg_add_u32(&buf, "quality_max", e->quality_max);
 
-                       t = blobmsg_open_table(&buf, "ht_operation");
-                       blobmsg_add_u32(&buf, "primary_channel", e->ht_chan_info.primary_chan);
-                       blobmsg_add_string(&buf, "secondary_channel_offset", ht_secondary_offset[e->ht_chan_info.secondary_chan_off]);
-                       blobmsg_add_u32(&buf, "channel_width", ht_chan_width[e->ht_chan_info.chan_width]);
-                       blobmsg_close_table(&buf, t);
+                       if (e->ht_chan_info.primary_chan) {
+                               t = blobmsg_open_table(&buf, "ht_operation");
+                               blobmsg_add_u32(&buf, "primary_channel", e->ht_chan_info.primary_chan);
+                               blobmsg_add_string(&buf, "secondary_channel_offset", ht_secondary_offset[e->ht_chan_info.secondary_chan_off]);
+                               blobmsg_add_u32(&buf, "channel_width", ht_chan_width[e->ht_chan_info.chan_width]);
+                               blobmsg_close_table(&buf, t);
+                       }
 
                        if (e->vht_chan_info.center_chan_1) {
                                t = blobmsg_open_table(&buf, "vht_operation");
@@ -475,6 +529,7 @@ rpc_iwinfo_add_rateinfo(struct iwinfo_rate_entry *r)
 {
        blobmsg_add_u8(&buf, "ht", r->is_ht);
        blobmsg_add_u8(&buf, "vht", r->is_vht);
+       blobmsg_add_u8(&buf, "he", r->is_he);
        blobmsg_add_u32(&buf, "mhz", r->mhz);
        blobmsg_add_u32(&buf, "rate", r->rate);
 
@@ -488,6 +543,12 @@ rpc_iwinfo_add_rateinfo(struct iwinfo_rate_entry *r)
                blobmsg_add_u32(&buf, "nss", r->nss);
                blobmsg_add_u8(&buf, "short_gi", r->is_short_gi);
        }
+       else if (r->is_he) {
+               blobmsg_add_u32(&buf, "mcs", r->mcs);
+               blobmsg_add_u32(&buf, "nss", r->nss);
+               blobmsg_add_u32(&buf, "he_gi", r->he_gi);
+               blobmsg_add_u32(&buf, "he_dcm", r->he_dcm);
+       }
 }
 
 static int
@@ -500,7 +561,7 @@ rpc_iwinfo_assoclist(struct ubus_context *ctx, struct ubus_object *obj,
        char res[IWINFO_BUFSIZE];
        struct iwinfo_assoclist_entry *a;
        struct ether_addr *macaddr = NULL;
-       void *c, *d, *e;
+       void *c = NULL, *d, *e;
        struct blob_attr *tb[__RPC_A_MAX];
        bool found = false;
 
@@ -914,7 +975,7 @@ rpc_iwinfo_api_init(const struct rpc_daemon_ops *o, struct ubus_context *ctx)
        };
 
        static struct ubus_object_type iwinfo_type =
-               UBUS_OBJECT_TYPE("luci-rpc-iwinfo", iwinfo_methods);
+               UBUS_OBJECT_TYPE("rpcd-plugin-iwinfo", iwinfo_methods);
 
        static struct ubus_object obj = {
                .name = "iwinfo",