From: David Bauer Date: Fri, 18 Feb 2022 23:03:51 +0000 (+0100) Subject: local-node: fetch bss-transition-management support X-Git-Url: http://git.openwrt.org/?a=commitdiff_plain;h=f462de04e476d8d2ef5a53f5d5013dd86cfcfdba;p=project%2Fusteer.git local-node: fetch bss-transition-management support Signed-off-by: David Bauer --- diff --git a/local_node.c b/local_node.c index b12f7fd..0e476c7 100644 --- a/local_node.c +++ b/local_node.c @@ -344,14 +344,20 @@ usteer_local_node_assoc_update(struct sta_info *si, struct blob_attr *data) } 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; @@ -361,11 +367,29 @@ usteer_local_node_update_sta_rrm(const uint8_t *addr, struct blob_attr *client_a 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 @@ -408,7 +432,7 @@ usteer_local_node_set_assoc(struct usteer_local_node *ln, struct blob_attr *cl) } /* 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; diff --git a/usteer.h b/usteer.h index a7d0bf4..911ee69 100644 --- a/usteer.h +++ b/usteer.h @@ -269,6 +269,7 @@ struct sta { uint8_t addr[6]; uint8_t rrm; + bool bss_transition; }; struct usteer_beacon_report {