diff --git a/src/cntlr.c b/src/cntlr.c index 7eb8f9cba7590c0824576ad9fe6c1a3d1ae778e2..132500bc1bbbf3f96a726d7a9c6ea8fb74dc5016 100644 --- a/src/cntlr.c +++ b/src/cntlr.c @@ -231,16 +231,16 @@ struct node *cntlr_find_node_with_bssid(struct controller *c, uint8_t *bssid) return NULL; } -/* find node to which given STA is connected */ -struct node *cntlr_find_node_with_sta(struct controller *c, uint8_t *sta_mac) +/* returns first found node with given STA MAC on its stalist */ +struct node *cntlr_find_node_with_sta(struct controller *c, uint8_t *stamacaddr) { struct node *n = NULL; list_for_each_entry(n, &c->nodelist, list) { - struct sta *s = NULL; + struct sta *e = NULL; - list_for_each_entry(s, &n->stalist, list) { - if (!memcmp(s->macaddr, sta_mac, 6)) + list_for_each_entry(e, &n->stalist, list) { + if (!memcmp(e->macaddr, stamacaddr, 6)) return n; } } diff --git a/src/cntlr.h b/src/cntlr.h index f5408489da83edf2397e7c11f53551d7027d5921..9b153ce149ff69572371e60bba0386a33e863388 100644 --- a/src/cntlr.h +++ b/src/cntlr.h @@ -367,7 +367,7 @@ struct node *cntlr_add_node(struct controller *c, uint8_t *almacaddr); struct node *cntlr_alloc_node(struct controller *c, uint8_t *almacaddr); struct node *cntlr_find_node(struct controller *c, uint8_t *almacaddr); struct node *cntlr_find_node_with_bssid(struct controller *c, uint8_t *bssid); -struct node *cntlr_find_node_with_sta(struct controller *c, uint8_t *sta_mac); +struct node *cntlr_find_node_with_sta(struct controller *c, uint8_t *stamacaddr); struct netif_link *cntlr_alloc_link(struct controller *c, uint8_t *upstream, uint8_t *downstream); diff --git a/src/cntlr_map.c b/src/cntlr_map.c index 8d32ae7d330f3dd9dfe7f81920a6971ade5e2014..a96ea2cc7e98db11d7dcf3fe1cf61a13e55869f6 100644 --- a/src/cntlr_map.c +++ b/src/cntlr_map.c @@ -228,75 +228,70 @@ int handle_topology_notification(void *cntlr, struct cmdu_buff *cmdu, return 0; } - bsta_iface = cntlr_find_iface_type(c, ev->macaddr, MAC_ENTRY_BSTA); - s = cntlr_find_sta(c->sta_table, ev->macaddr); - if (associated) { - struct node *old_n = NULL; - - if (s) - timer_del(&s->stale_sta_timer); - else { - s = cntlr_add_sta(c, c->sta_table, ev->macaddr); - if (!s) { - cntlr_dbg(LOG_STA, "%s: failed to add STA " MACFMT "\n", - __func__, MAC2STR(ev->macaddr)); - return -1; - } - + if (s) { + if (associated) { time(&s->assoc_time); - s->state = STA_ASSOCIATED; + timer_del(&s->stale_sta_timer); memcpy(s->bssid, ev->bssid, 6); - node_add_sta(n, s); + s->state = STA_ASSOCIATED; - goto inform_steer_plugins; - } + if (memcmp(s->agent_almacaddr, n->almacaddr, 6)) { + /* associated to a new node - remove from the old one */ + struct node *old_n = NULL; - /* remove sta from old-node and add to new-node */ - old_n = cntlr_find_node(c, s->agent_almacaddr); - if (old_n) { - if (node_find_sta(old_n, s->macaddr)) { + old_n = cntlr_find_node(c, s->agent_almacaddr); + if (old_n) + node_del_sta(old_n, s); + } + + node_add_sta(n, s); + } else { + if (!memcmp(s->agent_almacaddr, n->almacaddr, 6)) { + /* disassociated from current node */ time(&s->disassoc_time); + timer_set(&s->stale_sta_timer, c->cfg.stale_sta_timeout); + //memset(s->bssid, 0, sizeof(s->bssid)); s->state = STA_DISCONNECTED; - node_del_sta(old_n, s); } + + node_del_sta(n, s); } + } else { /* unknown sta */ + if (associated) { + s = cntlr_add_sta(c, c->sta_table, ev->macaddr); + if (!s) { + cntlr_dbg(LOG_STA, "%s: failed to add STA " MACFMT "\n", + __func__, MAC2STR(ev->macaddr)); + return -1; + } - if (!node_find_sta(n, ev->macaddr)) { time(&s->assoc_time); - s->state = STA_ASSOCIATED; memcpy(s->bssid, ev->bssid, 6); + s->state = STA_ASSOCIATED; + node_add_sta(n, s); - } - } else { - if (!s) { + } else { cntlr_dbg(LOG_STA, "Ignore unknown STA " MACFMT " disassoc event\n", MAC2STR(ev->macaddr)); return 0; } - - timer_set(&s->stale_sta_timer, c->cfg.stale_sta_timeout); - - if (node_find_sta(n, ev->macaddr)) { - time(&s->disassoc_time); - s->state = STA_DISCONNECTED; - node_del_sta(n, s); - } } + bsta_iface = cntlr_find_iface_type(c, ev->macaddr, MAC_ENTRY_BSTA); s->is_bsta = bsta_iface || bh ? true : false; cntlr_info(LOG_STA, "%s: STA " MACFMT " %s Node " MACFMT"\n", __func__, MAC2STR(s->macaddr), s->state == STA_ASSOCIATED ? "associated to" : "disconnected from", MAC2STR(s->agent_almacaddr)); - } -inform_steer_plugins: - if (s) { cntlr_update_sta_steer_data(c, s); + } + if (s) { + /* Inform steering plugins */ c->inform_cmdu_type = CMDU_TYPE_TOPOLOGY_NOTIFICATION; c->inform_sta_num = 1; memset(c->inform_stalist, 0, sizeof(c->inform_stalist));