diff --git a/src/cntlr_commands_impl.c b/src/cntlr_commands_impl.c index 4738fc3c8d586e008f364e3dc5cdfee1ff989d76..5877ac7f6b58a07a382897a3673a9ba7de69bb7f 100644 --- a/src/cntlr_commands_impl.c +++ b/src/cntlr_commands_impl.c @@ -2077,7 +2077,6 @@ static void add_array_steer_sta(struct blob_buf *bb, struct sta *s) uint8_t num_attempts; struct tm *info; time_t tmp_t; - int size; int i; t = blobmsg_open_table(bb, ""); @@ -2085,10 +2084,10 @@ static void add_array_steer_sta(struct blob_buf *bb, struct sta *s) blobmsg_add_string(bb, "macaddr", macstr); ttt = blobmsg_open_array(bb, "history"); num_attempts = s->de_sta->mapsta.num_steer_hist; - size = num_attempts < MAX_STEER_HISTORY ? num_attempts : MAX_STEER_HISTORY; - for (i = 0; i < size; i++) { + for (i = 0; i < num_attempts; i++) { + int idx = (s->de_sta->mapsta.first + i) % MAX_STEER_HISTORY; struct wifi_steer_history *attempt = - &s->de_sta->mapsta.steer_history[i]; + &s->de_sta->mapsta.steer_history[idx]; tttt = blobmsg_open_table(bb, ""); diff --git a/src/sta.c b/src/sta.c index a4577be66776930fe03f880974b8183b2f477bd3..9c396afa83e8b537b1e861c319dd708d8fb70f7e 100644 --- a/src/sta.c +++ b/src/sta.c @@ -64,8 +64,9 @@ static struct sta *sta_alloc(uint8_t *macaddr) wse->mapsta.steer_summary.blacklist_attempt_cnt = STEER_STATS_NO_DATA; wse->mapsta.steer_summary.blacklist_success_cnt = STEER_STATS_NO_DATA; wse->mapsta.steer_summary.blacklist_failure_cnt = STEER_STATS_NO_DATA; - wse->mapsta.first = -1; - wse->mapsta.next = -1; + wse->mapsta.first = 0; + wse->mapsta.next = 0; + wse->mapsta.num_steer_hist = 0; s->steer_data = (struct steer_sta *)(wse + 1); ss = s->steer_data; diff --git a/src/steer.c b/src/steer.c index 022ab47c49eb0a99f50bb5c2e3c2930867813267..abf6895f46a20b2737a5acb9cd267e1580c9680a 100644 --- a/src/steer.c +++ b/src/steer.c @@ -118,48 +118,28 @@ struct wifi_steer_history *sta_lookup_steer_attempt(struct sta *s, uint8_t *dst_bssid) { struct wifi_multiap_sta *mapsta = &s->de_sta->mapsta; - bool found = false; int i; - dbg("%s: sta = " MACFMT", src-ap = "MACFMT"\n", __func__, - MAC2STR(s->macaddr), MAC2STR(src_bssid)); + cntlr_dbg(LOG_STEER, "%s: sta = " MACFMT", src-ap = "MACFMT"\n", __func__, + MAC2STR(s->macaddr), MAC2STR(src_bssid)); - /* lookup latest steering attempt */ - for (i = mapsta->next; i >= 0; ) { - if (mapsta->steer_history[i].complete) - continue; - - if (!memcmp(mapsta->steer_history[i].src_bssid, src_bssid, 6)) { - if (!dst_bssid || !memcmp(mapsta->steer_history[i].dst_bssid, dst_bssid, 6)) { - found = true; - break; - } - } + /* find imcomplete steering attempt */ + for (i = 0; i < mapsta->num_steer_hist; i++) { + int idx = (mapsta->first + i) % MAX_STEER_HISTORY; - i--; - if (i == -1) - i = MAX_STEER_HISTORY - 1; - - if (i == mapsta->first) { - if (mapsta->steer_history[i].complete) - break; - - if (!memcmp(mapsta->steer_history[i].src_bssid, src_bssid, 6)) { - if (!dst_bssid || !memcmp(mapsta->steer_history[i].dst_bssid, dst_bssid, 6)) { - found = true; - break; - } + if (!memcmp(mapsta->steer_history[idx].src_bssid, src_bssid, 6) && + !mapsta->steer_history[idx].complete) { + if (!dst_bssid || + !memcmp(mapsta->steer_history[idx].dst_bssid, dst_bssid, 6)) { + return &mapsta->steer_history[idx]; } - break; } } - if (!found) { - dbg("%s: Steer attempt for sta = " MACFMT" not found\n", - __func__, MAC2STR(s->macaddr)); - } + cntlr_dbg(LOG_STEER, "%s: Steer attempt for sta = " MACFMT" not found\n", + __func__, MAC2STR(s->macaddr)); - return found ? &mapsta->steer_history[i] : NULL; + return NULL; } void cntlr_update_sta_steer_counters(struct controller *c, @@ -184,9 +164,7 @@ void cntlr_update_sta_steer_counters(struct controller *c, mapsta = &s->de_sta->mapsta; /* update history entry */ - mapsta->next = (mapsta->next + 1) % MAX_STEER_HISTORY; a = &mapsta->steer_history[mapsta->next]; - memset(a, 0, sizeof(struct wifi_steer_history)); timestamp_update(&a->time); time(&a->steer_time); @@ -202,14 +180,12 @@ void cntlr_update_sta_steer_counters(struct controller *c, a->dst_rcpi = dst_rcpi; } - mapsta->num_steer_hist = (mapsta->num_steer_hist + 1) % MAX_STEER_HISTORY; - - if (mapsta->next == mapsta->first) + mapsta->next = (mapsta->next + 1) % MAX_STEER_HISTORY; + if (mapsta->num_steer_hist < MAX_STEER_HISTORY) { + mapsta->num_steer_hist++; + } else { mapsta->first = (mapsta->next + 1) % MAX_STEER_HISTORY; - - if (mapsta->first == -1) - mapsta->first = 0; - + } //FIXME: mode mappings