aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJouni Malinen <j@w1.fi>2013-12-26 17:33:26 +0200
committerSteve Kondik <shade@chemlab.org>2014-06-12 14:07:29 -0700
commit9883d084cd7c3311fc59cd7f7071b4c5bc510206 (patch)
treeafd61a7236ceabcc21768c4fc384f4ecfd556493
parent7ad8428839199986294cc30a645f6d33d2fd15da (diff)
downloadandroid_external_wpa_supplicant_8-9883d084cd7c3311fc59cd7f7071b4c5bc510206.tar.gz
android_external_wpa_supplicant_8-9883d084cd7c3311fc59cd7f7071b4c5bc510206.tar.bz2
android_external_wpa_supplicant_8-9883d084cd7c3311fc59cd7f7071b4c5bc510206.zip
Track whether scan was started by us or an external program
This can be used to improve scan behavior in cases external programs request scans directly from the driver. CRs-Fixed: 570640 Git-commit: a5f40eff189d7f939f6434455ee63554ddb3c3ae Git-repo : git://w1.fi/srv/git/hostap.git Signed-hostap: Jouni Malinen <j@w1.fi> Change-Id: I4af18ace907f4c736cec48b41f925a462d816a56
-rw-r--r--src/common/wpa_ctrl.h2
-rw-r--r--src/drivers/driver.h12
-rw-r--r--src/drivers/driver_common.c1
-rw-r--r--src/drivers/driver_nl80211.c1
-rw-r--r--wpa_supplicant/events.c17
-rw-r--r--wpa_supplicant/p2p_supplicant.c2
-rw-r--r--wpa_supplicant/scan.c1
-rw-r--r--wpa_supplicant/wpa_supplicant_i.h3
8 files changed, 37 insertions, 2 deletions
diff --git a/src/common/wpa_ctrl.h b/src/common/wpa_ctrl.h
index 1156043f..815dce91 100644
--- a/src/common/wpa_ctrl.h
+++ b/src/common/wpa_ctrl.h
@@ -54,6 +54,8 @@ extern "C" {
#define WPA_EVENT_TEMP_DISABLED "CTRL-EVENT-SSID-TEMP-DISABLED "
/** Temporarily disabled network block re-enabled */
#define WPA_EVENT_REENABLED "CTRL-EVENT-SSID-REENABLED "
+/** New scan started */
+#define WPA_EVENT_SCAN_STARTED "CTRL-EVENT-SCAN-STARTED "
/** New scan results available */
#define WPA_EVENT_SCAN_RESULTS "CTRL-EVENT-SCAN-RESULTS "
/** wpa_supplicant state change */
diff --git a/src/drivers/driver.h b/src/drivers/driver.h
index 92db1575..4449db2f 100644
--- a/src/drivers/driver.h
+++ b/src/drivers/driver.h
@@ -3297,7 +3297,17 @@ enum wpa_event_type {
* entry for one frequency. The survey data can be os_malloc()'d and
* then os_free()'d, so the event callback must only copy data.
*/
- EVENT_SURVEY
+ EVENT_SURVEY,
+
+ /**
+ * EVENT_SCAN_STARTED - Scan started
+ *
+ * This indicates that driver has started a scan operation either based
+ * on a request from wpa_supplicant/hostapd or from another application.
+ * EVENT_SCAN_RESULTS is used to indicate when the scan has been
+ * completed (either successfully or by getting cancelled).
+ */
+ EVENT_SCAN_STARTED
};
diff --git a/src/drivers/driver_common.c b/src/drivers/driver_common.c
index 8d1d22eb..8a6b438a 100644
--- a/src/drivers/driver_common.c
+++ b/src/drivers/driver_common.c
@@ -85,6 +85,7 @@ const char * event_to_string(enum wpa_event_type event)
E2S(DFS_CAC_ABORTED);
E2S(DFS_NOP_FINISHED);
E2S(SURVEY);
+ E2S(SCAN_STARTED);
}
return "UNKNOWN";
diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index c51792d4..25d20518 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -2624,6 +2624,7 @@ static void do_process_drv_event(struct i802_bss *bss, int cmd,
switch (cmd) {
case NL80211_CMD_TRIGGER_SCAN:
wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Scan trigger");
+ wpa_supplicant_event(drv->ctx, EVENT_SCAN_STARTED, NULL);
break;
case NL80211_CMD_START_SCHED_SCAN:
wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Sched scan started");
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index e939e36f..573ac22b 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -1241,7 +1241,8 @@ static int _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
return 0;
}
- wpa_dbg(wpa_s, MSG_DEBUG, "New scan results available");
+ wpa_dbg(wpa_s, MSG_DEBUG, "New scan results available (own=%u ext=%u)",
+ wpa_s->own_scan_running, wpa_s->external_scan_running);
wpa_msg_ctrl(wpa_s, MSG_INFO, WPA_EVENT_SCAN_RESULTS);
wpas_notify_scan_results(wpa_s);
@@ -2701,8 +2702,22 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
wpa_supplicant_event_michael_mic_failure(wpa_s, data);
break;
#ifndef CONFIG_NO_SCAN_PROCESSING
+ case EVENT_SCAN_STARTED:
+ if (wpa_s->own_scan_requested) {
+ wpa_dbg(wpa_s, MSG_DEBUG, "Own scan request started a scan");
+ wpa_s->own_scan_requested = 0;
+ wpa_s->own_scan_running = 1;
+ wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_SCAN_STARTED);
+ } else {
+ wpa_dbg(wpa_s, MSG_DEBUG, "External program started a scan");
+ wpa_s->external_scan_running = 1;
+ wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_SCAN_STARTED);
+ }
+ break;
case EVENT_SCAN_RESULTS:
wpa_supplicant_event_scan_results(wpa_s, data);
+ wpa_s->own_scan_running = 0;
+ wpa_s->external_scan_running = 0;
if (wpa_s->wpa_state != WPA_AUTHENTICATING &&
wpa_s->wpa_state != WPA_ASSOCIATING)
wpas_p2p_continue_after_scan(wpa_s);
diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c
index b61b28aa..a066e6c8 100644
--- a/wpa_supplicant/p2p_supplicant.c
+++ b/wpa_supplicant/p2p_supplicant.c
@@ -319,6 +319,7 @@ static int wpas_p2p_scan(void *ctx, enum p2p_scan_type type, int freq,
} else {
os_get_time(&wpa_s->scan_trigger_time);
wpa_s->scan_res_handler = wpas_p2p_scan_res_handler;
+ wpa_s->own_scan_requested = 1;
}
return ret;
@@ -3940,6 +3941,7 @@ static void wpas_p2p_join_scan_req(struct wpa_supplicant *wpa_s, int freq)
if (!ret) {
os_get_time(&wpa_s->scan_trigger_time);
wpa_s->scan_res_handler = wpas_p2p_scan_res_join;
+ wpa_s->own_scan_requested = 1;
}
wpabuf_free(ies);
diff --git a/wpa_supplicant/scan.c b/wpa_supplicant/scan.c
index 7eec4683..3d940376 100644
--- a/wpa_supplicant/scan.c
+++ b/wpa_supplicant/scan.c
@@ -230,6 +230,7 @@ int wpa_supplicant_trigger_scan(struct wpa_supplicant *wpa_s,
os_get_time(&wpa_s->scan_trigger_time);
wpa_s->scan_runs++;
wpa_s->normal_scans++;
+ wpa_s->own_scan_requested = 1;
}
return ret;
diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h
index 353c68e8..66730b98 100644
--- a/wpa_supplicant/wpa_supplicant_i.h
+++ b/wpa_supplicant/wpa_supplicant_i.h
@@ -476,6 +476,9 @@ struct wpa_supplicant {
struct os_time scan_trigger_time;
int scan_runs; /* number of scan runs since WPS was started */
int *next_scan_freqs;
+ unsigned int own_scan_requested:1;
+ unsigned int own_scan_running:1;
+ unsigned int external_scan_running:1;
int scan_interval; /* time in sec between scans to find suitable AP */
int normal_scans; /* normal scans run before sched_scan */
int scan_for_connection; /* whether the scan request was triggered for