diff --git a/src/wifi_ubus.c b/src/wifi_ubus.c index 74130cbb9f3113cc20943ad0f5bc5680246fa288..890b356c23f340c9230d9fec46397e75eb8c7a34 100644 --- a/src/wifi_ubus.c +++ b/src/wifi_ubus.c @@ -1813,9 +1813,29 @@ struct get_stas_ctx { }; static int wifi_ubus_get_sta_caps(struct blob_attr *msg, - struct wifi_caps *caps) + struct wifi_caps *caps, uint8_t *cbitmap) { - /* TODO fill caps */ + static const struct blobmsg_policy caps_policy[] = { + [0] = { .name = "bitmap", .type = BLOBMSG_TYPE_STRING }, + }; + struct blob_attr *caps_tb[ARRAY_SIZE(caps_policy)]; + int len; + + /* TODO: only updating cbitmap here, update caps (may be redundant) */ + + blobmsg_parse(caps_policy, ARRAY_SIZE(caps_policy), caps_tb, + blobmsg_data(msg), blobmsg_data_len(msg)); + + caps->valid &= ~WIFI_CAP_RM_VALID; + + if (!caps_tb[0]) + return -1; + + len = strlen(blobmsg_get_string(caps_tb[0])); + if (!strtob(blobmsg_get_string(caps_tb[0]), len / 2, cbitmap)) + return -1; + + caps->valid |= WIFI_CAP_RM_VALID; return 0; } @@ -1963,7 +1983,7 @@ static int wifi_ubus_parse_sta(struct blob_attr *cur, sta->est_tx_thput = blobmsg_get_u32(sta_tb[14]); wifi_ubus_get_sta_rssi(sta_tb[12], sta->rssi, sizeof(sta->rssi)); - wifi_ubus_get_sta_caps(sta_tb[10], &sta->caps); + wifi_ubus_get_sta_caps(sta_tb[10], &sta->caps, sta->cbitmap); wifi_ubus_get_sta_stats(sta_tb[4], sta, &sta->stats); if (sta_tb[16]) wifi_ubus_get_sta_rate(sta_tb[16], &sta->tx_rate); @@ -2170,7 +2190,7 @@ static void wifi_sta_parse_mlo_links(struct ubus_request *req, sta->est_tx_thput = blobmsg_get_u32(sta_tb[15]); wifi_ubus_get_sta_rssi(sta_tb[13], sta->rssi, sizeof(sta->rssi)); - wifi_ubus_get_sta_caps(sta_tb[11], &sta->caps); + wifi_ubus_get_sta_caps(sta_tb[11], &sta->caps, sta->cbitmap); if (sta_tb[16]) wifi_ubus_get_sta_rate(sta_tb[16], &sta->tx_rate); if (sta_tb[17])