aboutsummaryrefslogtreecommitdiffstats
path: root/wpa_supplicant/blacklist.c
diff options
context:
space:
mode:
authorKevin Lund <kglund@google.com>2020-06-11 21:11:17 (GMT)
committerJouni Malinen <j@w1.fi>2020-10-10 15:34:59 (GMT)
commit164b8dd8e4be8a563cf18a1cdc2929a552dbfc34 (patch)
tree58d2bd42f224785f1cbb9c41b58a31e47778597b /wpa_supplicant/blacklist.c
parentd530110028f0c343085c1c605d80f5d0da55c274 (diff)
downloadhostap-164b8dd8e4be8a563cf18a1cdc2929a552dbfc34.zip
hostap-164b8dd8e4be8a563cf18a1cdc2929a552dbfc34.tar.gz
hostap-164b8dd8e4be8a563cf18a1cdc2929a552dbfc34.tar.bz2
wpa_supplicant: Add wpa_blacklist_update()
This change adds the function wpa_blacklist_update(), which goes through all blacklist entries and deletes them if their blacklist expired over an hour ago. The purpose of this is to remove stale entries from the blacklist which likely do not reflect the current condition of device's network surroundings. This function is called whenever the blacklist is polled, meaning that the caller always gets an up-to-date reflection of the blacklist. Another solution to clearing the blacklist that was considered was to slowly reduce the counts of blacklist entries over time, and delete them if the counts dropped below 0. We decided to go with the current solution instead because an AP's "problematic" status is really a binary thing: either the AP is no longer problematic, or it's still causing us problems. So if we see any more problems within a reasonable amount of time, it makes sense to just keep the blacklist where it was since the AP is likely still undergoing the same issue. If we go a significant amount of time (semi-arbitrarily chosen as 1 hour) without any issues with an AP, it's reasonable to behave as if the AP is no longer undergoing the same issue. If we see more problems at a later time, we can start the blacklisting process fresh again, treating this as a brand new issue. Signed-off-by: Kevin Lund <kglund@google.com> Signed-off-by: Brian Norris <briannorris@chromium.org>
Diffstat (limited to 'wpa_supplicant/blacklist.c')
-rw-r--r--wpa_supplicant/blacklist.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/wpa_supplicant/blacklist.c b/wpa_supplicant/blacklist.c
index c88a69a..fa2ad11 100644
--- a/wpa_supplicant/blacklist.c
+++ b/wpa_supplicant/blacklist.c
@@ -26,6 +26,8 @@ struct wpa_blacklist * wpa_blacklist_get(struct wpa_supplicant *wpa_s,
if (wpa_s == NULL || bssid == NULL)
return NULL;
+ wpa_blacklist_update(wpa_s);
+
e = wpa_s->blacklist;
while (e) {
if (os_memcmp(e->bssid, bssid, ETH_ALEN) == 0)
@@ -171,3 +173,42 @@ void wpa_blacklist_clear(struct wpa_supplicant *wpa_s)
os_free(prev);
}
}
+
+
+/**
+ * wpa_blacklist_update - Update the entries in the blacklist,
+ * deleting entries that have been expired for over an hour.
+ * @wpa_s: Pointer to wpa_supplicant data
+ */
+void wpa_blacklist_update(struct wpa_supplicant *wpa_s)
+{
+ struct wpa_blacklist *e, *prev = NULL;
+ struct os_reltime now;
+
+ if (!wpa_s)
+ return;
+
+ e = wpa_s->blacklist;
+ os_get_reltime(&now);
+ while (e) {
+ if (os_reltime_expired(&now, &e->blacklist_start,
+ e->timeout_secs + 3600)) {
+ struct wpa_blacklist *to_delete = e;
+
+ if (prev) {
+ prev->next = e->next;
+ e = prev->next;
+ } else {
+ wpa_s->blacklist = e->next;
+ e = wpa_s->blacklist;
+ }
+ wpa_printf(MSG_INFO, "Removed BSSID " MACSTR
+ " from blacklist (expired)",
+ MAC2STR(to_delete->bssid));
+ os_free(to_delete);
+ } else {
+ prev = e;
+ e = e->next;
+ }
+ }
+}