}
static void
-usteer_local_node_update_sta_rrm(const uint8_t *addr, struct blob_attr *client_attr)
+usteer_local_node_update_sta_rrm_wnm(const uint8_t *addr, struct blob_attr *client_attr)
{
static const struct blobmsg_policy rrm_policy = {
.name = "rrm",
.type = BLOBMSG_TYPE_ARRAY,
};
- struct blob_attr *sta_blob = NULL;
+ static const struct blobmsg_policy ext_capa_policy = {
+ .name = "extended_capabilities",
+ .type = BLOBMSG_TYPE_ARRAY,
+ };
+ struct blob_attr *rrm_blob = NULL, *wnm_blob = NULL, *cur;
struct sta *sta;
+ int rem;
+ int i = 0;
if (!addr)
return;
if (!sta)
return;
- blobmsg_parse(&rrm_policy, 1, &sta_blob, blobmsg_data(client_attr), blobmsg_data_len(client_attr));
- if (!sta_blob)
+ /* RRM */
+ blobmsg_parse(&rrm_policy, 1, &rrm_blob, blobmsg_data(client_attr), blobmsg_data_len(client_attr));
+ if (!rrm_blob)
return;
- sta->rrm = blobmsg_get_u32(blobmsg_data(sta_blob));
+ sta->rrm = blobmsg_get_u32(blobmsg_data(rrm_blob));
+
+ /* Extended Capabilities / WNM */
+ blobmsg_parse(&ext_capa_policy, 1, &wnm_blob, blobmsg_data(client_attr), blobmsg_data_len(client_attr));
+ if (!wnm_blob)
+ return;
+
+ blobmsg_for_each_attr(cur, wnm_blob, rem) {
+ if (blobmsg_type(cur) != BLOBMSG_TYPE_INT32)
+ return;
+
+ if (i == 2) {
+ if (blobmsg_get_u32(cur) & (1 << 3))
+ sta->bss_transition = true;
+ }
+
+ i++;
+ }
}
static void
}
/* Read RRM information */
- usteer_local_node_update_sta_rrm(addr, cur);
+ usteer_local_node_update_sta_rrm_wnm(addr, cur);
}
node->n_assoc = n_assoc;