[PATCH 06/18] wpa_supplicant: Continue scanning when sched scan stops

andrei.otcheretianski at intel.com andrei.otcheretianski at intel.com
Mon Sep 5 07:32:59 PDT 2016


From: Avraham Stern <avraham.stern at intel.com>

When scheduled scan stops without the interface request
(for example, driver stopped it unexpectedly), start a regular
scan to continue scanning for networks and avoid being left with
no scan at all.

Signed-off-by: Avraham Stern <avraham.stern at intel.com>
---
 wpa_supplicant/events.c           | 16 ++++++++++++++--
 wpa_supplicant/scan.c             |  6 ++++++
 wpa_supplicant/wpa_supplicant_i.h |  1 +
 3 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index 7ec04fb..779a423 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -4045,8 +4045,20 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
 			break;
 
 		/*
-		 * Start a new sched scan to continue searching for more SSIDs
-		 * either if timed out or PNO schedule scan is pending.
+		 * If the driver stopped scanning without being requested to,
+		 * request a new scan to continue scanning for networks.
+		 */
+		if (!wpa_s->sched_scan_stop_req) {
+			wpa_supplicant_req_scan(wpa_s, 1, 0);
+			break;
+		}
+
+		wpa_s->sched_scan_stop_req = 0;
+
+		/*
+		 * Start a new sched scan to continue searching for more
+		 * SSIDs either if timed out or PNO schedule scan is
+		 * pending.
 		 */
 		if (wpa_s->sched_scan_timed_out) {
 			wpa_supplicant_req_sched_scan(wpa_s);
diff --git a/wpa_supplicant/scan.c b/wpa_supplicant/scan.c
index e1e2421..47629de 100644
--- a/wpa_supplicant/scan.c
+++ b/wpa_supplicant/scan.c
@@ -1256,6 +1256,8 @@ int wpa_supplicant_req_sched_scan(struct wpa_supplicant *wpa_s)
 	if (max_sched_scan_ssids < 1 || wpa_s->conf->disable_scan_offload)
 		return -1;
 
+	wpa_s->sched_scan_stop_req = 0;
+
 	if (wpa_s->sched_scanning) {
 		wpa_dbg(wpa_s, MSG_DEBUG, "Already sched scanning");
 		return 0;
@@ -1554,6 +1556,9 @@ void wpa_supplicant_cancel_sched_scan(struct wpa_supplicant *wpa_s)
 	if (!wpa_s->sched_scanning)
 		return;
 
+	if (wpa_s->sched_scanning)
+		wpa_s->sched_scan_stop_req = 1;
+
 	wpa_dbg(wpa_s, MSG_DEBUG, "Cancelling sched scan");
 	eloop_cancel_timeout(wpa_supplicant_sched_scan_timeout, wpa_s, NULL);
 	wpa_supplicant_stop_sched_scan(wpa_s);
@@ -2530,6 +2535,7 @@ int wpas_stop_pno(struct wpa_supplicant *wpa_s)
 		return 0;
 
 	ret = wpa_supplicant_stop_sched_scan(wpa_s);
+	wpa_s->sched_scan_stop_req = 1;
 
 	wpa_s->pno = 0;
 	wpa_s->pno_sched_pending = 0;
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index f3f96a3..f1f51ee 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -574,6 +574,7 @@ struct wpa_supplicant {
 	struct wpa_radio_work *scan_work;
 	int scanning;
 	int sched_scanning;
+	int sched_scan_stop_req;
 	int new_connection;
 
 	int eapol_received; /* number of EAPOL packets received after the
-- 
1.9.1




More information about the Hostap mailing list