diff --git a/src/cntlr_map.c b/src/cntlr_map.c index b26ba55cc82d9b3365a6f1ba0667ddce3a639b5f..67d647ccf27ffc677b5e9a02d8198ce79fd359af 100644 --- a/src/cntlr_map.c +++ b/src/cntlr_map.c @@ -2479,17 +2479,18 @@ int handle_sta_link_metrics_response(void *cntlr, struct cmdu_buff *cmdu, return -1; } - /* TODO: use while[0][idx]*/ - if (tv[ASSOC_STA_LINK_METRICS_RESP_ASSOCIATED_STA_LINK_METRICS_IDX][0]) { + while (tv[ASSOC_STA_LINK_METRICS_RESP_ASSOCIATED_STA_LINK_METRICS_IDX][idx]) { uint8_t *tv_data = - (uint8_t *)tv[ASSOC_STA_LINK_METRICS_RESP_ASSOCIATED_STA_LINK_METRICS_IDX][0]->data; + (uint8_t *)tv[ASSOC_STA_LINK_METRICS_RESP_ASSOCIATED_STA_LINK_METRICS_IDX][idx]->data; struct tlv_assoc_sta_link_metrics *p = (struct tlv_assoc_sta_link_metrics *)tv_data; struct sta *s; + idx++; + s = cntlr_find_sta(c->sta_table, p->macaddr); if (!s) - return -1; + continue; offset = sizeof(*p); for (i = 0; i < p->num_bss; i++) { @@ -2501,7 +2502,7 @@ int handle_sta_link_metrics_response(void *cntlr, struct cmdu_buff *cmdu, if (!fh) { offset += sizeof(*b); continue; - } + } if (memcmp(s->bssid, b->bssid, 6)) { cntlr_dbg(LOG_STA, @@ -2524,6 +2525,11 @@ int handle_sta_link_metrics_response(void *cntlr, struct cmdu_buff *cmdu, memcpy(&inform_stalist[6 * iidx++], s->de_sta->macaddr, 6); } + if (iidx == 0) { + cntlr_dbg(LOG_STA, "%s: No STA found in Assoc-Link-Metrics-Resp\n", __func__); + return -1; + } + idx = 0; while (tv[ASSOC_STA_LINK_METRICS_RESP_ASSOCIATED_STA_EXT_LINK_METRICS_IDX][idx]) { uint8_t *tv_data = (uint8_t *)