diff --git a/src/cntlr.c b/src/cntlr.c index 4cac2c13402b97b8e87af677076ae718653863b6..d7599429d920fb5b377d0f714836f3225bb7222f 100644 --- a/src/cntlr.c +++ b/src/cntlr.c @@ -1310,16 +1310,27 @@ struct node *cntlr_alloc_node(struct controller *c, uint8_t *almac) return n; } +static void cntlr_remove_sta(struct controller *c, struct sta *s) +{ + uint8_t macaddr[6]; + + memcpy(macaddr, s->de_sta->macaddr, 6); + free_bcn_metrics(c, s); + cntlr_clean_bcnreqlist_sta(c, s); + free(s->de_sta); + list_del(&s->list); + free(s); + + /* remove BSTA MAC addr from hash table if present */ + allmac_clean_entry(&c->mac_table, macaddr, MAC_ENTRY_BSTA); +} + void cntlr_clean_stalist(struct controller *c) { struct sta *s = NULL, *tmp; list_for_each_entry_safe(s, tmp, &c->stalist, list) { - /* FIXME: del s->de_sta->list */ - free_bcn_metrics(c, s); - free(s->de_sta); - list_del(&s->list); - free(s); + cntlr_remove_sta(c, s); } } @@ -1332,6 +1343,22 @@ void cntlr_clean_bcnreqlist(struct controller *c) free(b); } } + +void cntlr_clean_bcnreqlist_sta(struct controller *c, struct sta *s) +{ + dbg("%s: --->\n", __func__); + struct bcnreq *b = NULL, *tmp; + + list_for_each_entry_safe(b, tmp, &c->bcnreqlist, list) { + if (!memcmp(b->sta_mac, s->de_sta->macaddr, 6)) { + dbg("%s found bcnreq for sta:" MACFMT ", remove it\n", + __func__, MAC2STR(b->sta_mac)); + list_del(&b->list); + free(b); + } + } +} + void node_clean_linklist(struct controller *c) { struct netif_link *l = NULL, *tmp; diff --git a/src/cntlr.h b/src/cntlr.h index 97adc8706f9bcd3219cae3bce891abfa03b2a4aa..a1bff5e93e249f6c2c105fb0458e19e8949b3ca4 100644 --- a/src/cntlr.h +++ b/src/cntlr.h @@ -402,6 +402,7 @@ struct bcnreq *cntlr_find_bcnreq(struct controller *c, uint8_t *sta, uint8_t *al bool cntlr_resync_config(struct controller *c, bool reload); int cntlr_radio_clean_scanlist_el(struct wifi_scanres_element *el); +void cntlr_clean_bcnreqlist_sta(struct controller *c, struct sta *s); void free_bcn_metrics(struct controller *c, struct sta *s); void free_usta_metrics(struct controller *c, struct sta *s); diff --git a/src/cntlr_map.c b/src/cntlr_map.c index 4d2d3f3810f41516bd5c989a9497a46b56cf0f04..9db60e5a1573b04ad76af9126f613c5be16cddbb 100644 --- a/src/cntlr_map.c +++ b/src/cntlr_map.c @@ -3411,7 +3411,12 @@ int handle_sta_disassoc_stats(void *cntlr, struct cmdu_buff *cmdu, free(br); } } - free_bcn_metrics(c, s); + + /* Remove all measurements */ + free_bcn_metrics(c, s); + + /* Clean measurement request list */ + cntlr_clean_bcnreqlist_sta(c, s); } return 0; diff --git a/src/wifi_dataelements.h b/src/wifi_dataelements.h index ba1a73f86d0ae1bee7df19888c582c20dd8dd117..720876bf9dcbdd12936882ba249725834c677eef 100644 --- a/src/wifi_dataelements.h +++ b/src/wifi_dataelements.h @@ -256,7 +256,6 @@ struct wifi_multiap_sta { }; struct wifi_sta_element { - struct list_head list; int invalidate; time_t tsp; uint8_t macaddr[6];