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])