[PATCH 2/3] Added notifications about chenges in BBSIDs list

Witold Sowa witold.sowa
Sat Oct 17 18:56:02 PDT 2009


If scan results introduces new BSSs or discards some previously known,
new wpas_notify_bss_added or wpas_notify_bss_removed notifications are
called
---
 wpa_supplicant/notify.c         |   12 ++++++++++++
 wpa_supplicant/notify.h         |    2 ++
 wpa_supplicant/wpa_supplicant.c |   34 +++++++++++++++++++++++++++++++++-
 3 files changed, 47 insertions(+), 1 deletions(-)

diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c
index 066f5a9..733d251 100644
--- a/wpa_supplicant/notify.c
+++ b/wpa_supplicant/notify.c
@@ -152,6 +152,18 @@ void wpas_notify_network_removed(struct wpa_supplicant *wpa_s,
 }
 
 
+void wpas_notify_bss_added(struct wpa_supplicant *wpa_s,
+				 u8 bssid[])
+{
+}
+
+
+void wpas_notify_bss_removed(struct wpa_supplicant *wpa_s,
+				 u8 bssid[])
+{
+}
+
+
 void wpas_notify_blob_added(struct wpa_supplicant *wpa_s, const char *name)
 {
 }
diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h
index b8231aa..ca212b3 100644
--- a/wpa_supplicant/notify.h
+++ b/wpa_supplicant/notify.h
@@ -46,6 +46,8 @@ void wpas_notify_network_added(struct wpa_supplicant *wpa_s,
 			       struct wpa_ssid *ssid);
 void wpas_notify_network_removed(struct wpa_supplicant *wpa_s,
 				 struct wpa_ssid *ssid);
+void wpas_notify_bss_added(struct wpa_supplicant *wpa_s, u8 bssid[]);
+void wpas_notify_bss_removed(struct wpa_supplicant *wpa_s, u8 bssid[]);
 void wpas_notify_blob_added(struct wpa_supplicant *wpa_s, const char *name);
 void wpas_notify_blob_removed(struct wpa_supplicant *wpa_s, const char *name);
 
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index 681a9d9..0a2b131 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -1549,6 +1549,36 @@ int wpa_supplicant_set_debug_params(struct wpa_global *global, int debug_level,
 }
 
 
+static void notify_about_bssid_chenges(struct wpa_supplicant *wpa_s,
+				    struct wpa_scan_results *prev,
+				    struct wpa_scan_results *new)
+{
+	int prev_num, new_num, i, j;
+
+	prev_num = (prev != NULL ? prev->num : 0);
+	new_num = (new != NULL ? new->num : 0);
+
+	for (i = 0; i < prev_num; i++) {
+		for (j = 0; j < new_num; j++) {
+			if (!os_memcmp(prev->res[i]->bssid, new->res[j]->bssid,
+				       ETH_ALEN))
+				break;
+		}
+		if (j == new_num)
+			wpas_notify_bss_removed(wpa_s, prev->res[i]->bssid);
+	}
+	for (i = 0; i < new_num; i++) {
+		for (j = 0; j < prev_num; j++) {
+			if (!os_memcmp(new->res[i]->bssid, prev->res[j]->bssid,
+				       ETH_ALEN))
+				break;
+		}
+		if (j == prev_num)
+			wpas_notify_bss_added(wpa_s, new->res[i]->bssid);
+	}
+}
+
+
 static struct wpa_scan_results * wpa_supplicant_get_scan_results_old(
 	struct wpa_supplicant *wpa_s)
 {
@@ -1665,8 +1695,8 @@ static struct wpa_scan_results * wpa_supplicant_get_scan_results_old(
 int wpa_supplicant_get_scan_results(struct wpa_supplicant *wpa_s)
 {
 	int ret;
+	struct wpa_scan_results *prev_scan_res = wpa_s->scan_res;
 
-	wpa_scan_results_free(wpa_s->scan_res);
 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_USER_SPACE_MLME)
 		wpa_s->scan_res = ieee80211_sta_get_scan_results(wpa_s);
 	else if (wpa_s->driver->get_scan_results2 == NULL)
@@ -1681,6 +1711,8 @@ int wpa_supplicant_get_scan_results(struct wpa_supplicant *wpa_s)
 		wpa_scan_sort_results(wpa_s->scan_res);
 	}
 
+	notify_about_bssid_chenges(wpa_s, prev_scan_res, wpa_s->scan_res);
+	wpa_scan_results_free(prev_scan_res);
 	return ret;
 }
 
-- 
1.6.0.2



More information about the Hostap mailing list