aboutsummaryrefslogtreecommitdiffstats
path: root/package
diff options
context:
space:
mode:
authorDavid Bauer <mail@david-bauer.net>2020-10-12 03:10:20 +0200
committerDavid Bauer <mail@david-bauer.net>2020-11-17 17:04:40 +0100
commit80b531614beab477c642cfdfef8dc6238c58f007 (patch)
treed713fa2e8d64aacbb54a36e923857d8a7b42ce69 /package
parentcd8052da4998b50219573faa80ac4ddc8a4dcebf (diff)
downloadupstream-80b531614beab477c642cfdfef8dc6238c58f007.tar.gz
upstream-80b531614beab477c642cfdfef8dc6238c58f007.tar.bz2
upstream-80b531614beab477c642cfdfef8dc6238c58f007.zip
hostapd: ubus: add VHT capabilities to client list
This adds parsed VHT capability information to the hostapd get_clients method. Signed-off-by: David Bauer <mail@david-bauer.net>
Diffstat (limited to 'package')
-rw-r--r--package/network/services/hostapd/src/src/ap/ubus.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/package/network/services/hostapd/src/src/ap/ubus.c b/package/network/services/hostapd/src/src/ap/ubus.c
index cdbb8076d3..f864d586ab 100644
--- a/package/network/services/hostapd/src/src/ap/ubus.c
+++ b/package/network/services/hostapd/src/src/ap/ubus.c
@@ -206,6 +206,75 @@ hostapd_bss_reload(struct ubus_context *ctx, struct ubus_object *obj,
return ret;
}
+
+static void
+hostapd_parse_vht_map_blobmsg(uint16_t map)
+{
+ char label[4];
+ int16_t val;
+ int i;
+
+ for (i = 0; i < 8; i++) {
+ snprintf(label, 4, "%dss", i + 1);
+
+ val = (map & (BIT(1) | BIT(0))) + 7;
+ blobmsg_add_u16(&b, label, val == 10 ? -1 : val);
+ map = map >> 2;
+ }
+}
+
+static void
+hostapd_parse_vht_capab_blobmsg(struct ieee80211_vht_capabilities *vhtc)
+{
+ void *supported_mcs;
+ void *map;
+ int i;
+
+ static const struct {
+ const char *name;
+ uint32_t flag;
+ } vht_capas[] = {
+ { "su_beamformee", VHT_CAP_SU_BEAMFORMEE_CAPABLE },
+ { "mu_beamformee", VHT_CAP_MU_BEAMFORMEE_CAPABLE },
+ };
+
+ for (i = 0; i < ARRAY_SIZE(vht_capas); i++)
+ blobmsg_add_u8(&b, vht_capas[i].name,
+ !!(vhtc->vht_capabilities_info & vht_capas[i].flag));
+
+ supported_mcs = blobmsg_open_table(&b, "mcs_map");
+
+ /* RX map */
+ map = blobmsg_open_table(&b, "rx");
+ hostapd_parse_vht_map_blobmsg(le_to_host16(vhtc->vht_supported_mcs_set.rx_map));
+ blobmsg_close_table(&b, map);
+
+ /* TX map */
+ map = blobmsg_open_table(&b, "tx");
+ hostapd_parse_vht_map_blobmsg(le_to_host16(vhtc->vht_supported_mcs_set.tx_map));
+ blobmsg_close_table(&b, map);
+
+ blobmsg_close_table(&b, supported_mcs);
+}
+
+static void
+hostapd_parse_capab_blobmsg(struct sta_info *sta)
+{
+ void *r, *v;
+
+ v = blobmsg_open_table(&b, "capabilities");
+
+ if (sta->vht_capabilities) {
+ r = blobmsg_open_table(&b, "vht");
+ hostapd_parse_vht_capab_blobmsg(sta->vht_capabilities);
+ blobmsg_close_table(&b, r);
+ }
+
+ /* ToDo: Add HT / HE capability parsing */
+
+ blobmsg_close_table(&b, v);
+}
+
static int
hostapd_bss_get_clients(struct ubus_context *ctx, struct ubus_object *obj,
struct ubus_request_data *req, const char *method,
@@ -278,6 +347,8 @@ hostapd_bss_get_clients(struct ubus_context *ctx, struct ubus_object *obj,
blobmsg_add_u32(&b, "signal", sta_driver_data.signal);
}
+ hostapd_parse_capab_blobmsg(sta);
+
blobmsg_close_table(&b, c);
}
blobmsg_close_array(&b, list);