diff options
Diffstat (limited to 'wpa_supplicant.c')
-rw-r--r-- | wpa_supplicant.c | 54 |
1 files changed, 36 insertions, 18 deletions
diff --git a/wpa_supplicant.c b/wpa_supplicant.c index b7d3066d63fc..94a5c8adeec9 100644 --- a/wpa_supplicant.c +++ b/wpa_supplicant.c @@ -362,7 +362,6 @@ static void wpa_supplicant_notify_eapol_done(void *ctx) if (wpa_s->key_mgmt == WPA_KEY_MGMT_IEEE8021X) { wpa_supplicant_set_state(wpa_s, WPA_4WAY_HANDSHAKE); } else { - eloop_cancel_timeout(wpa_supplicant_scan, wpa_s, NULL); wpa_supplicant_cancel_auth_timeout(wpa_s); wpa_supplicant_set_state(wpa_s, WPA_COMPLETED); } @@ -490,6 +489,28 @@ void wpa_blacklist_clear(struct wpa_supplicant *wpa_s) */ void wpa_supplicant_req_scan(struct wpa_supplicant *wpa_s, int sec, int usec) { + /* If there's at least one network that should be specifically scanned + * then don't cancel the scan and reschedule. Some drivers do + * background scanning which generates frequent scan results, and that + * causes the specific SSID scan to get continually pushed back and + * never happen, which causes hidden APs to never get probe-scanned. + */ + if (eloop_is_timeout_registered(wpa_supplicant_scan, wpa_s, NULL) && + wpa_s->conf->ap_scan == 1) { + struct wpa_ssid *ssid = wpa_s->conf->ssid; + + while (ssid) { + if (!ssid->disabled && ssid->scan_ssid) + break; + ssid = ssid->next; + } + if (ssid) { + wpa_msg(wpa_s, MSG_DEBUG, "Not rescheduling scan to " + "ensure that specific SSID scans occur"); + return; + } + } + wpa_msg(wpa_s, MSG_DEBUG, "Setting scan request: %d sec %d usec", sec, usec); eloop_cancel_timeout(wpa_supplicant_scan, wpa_s, NULL); @@ -1049,6 +1070,7 @@ static void wpa_supplicant_scan(void *eloop_ctx, void *timeout_ctx) if (wpa_s->scan_res_tried == 0 && wpa_s->conf->ap_scan == 1) { wpa_s->scan_res_tried++; + wpa_s->scan_req = scan_req; wpa_printf(MSG_DEBUG, "Trying to get current scan results " "first without requesting a new scan to speed up " "initial association"); @@ -1519,13 +1541,15 @@ void wpa_supplicant_associate(struct wpa_supplicant *wpa_s, wpa_supplicant_set_state(wpa_s, WPA_COMPLETED); } else { /* Timeout for IEEE 802.11 authentication and association */ - int timeout; - if (assoc_failed) - timeout = 5; - else if (wpa_s->conf->ap_scan == 1) - timeout = 10; - else - timeout = 60; + int timeout = 60; + + if (assoc_failed) { + /* give IBSS a bit more time */ + timeout = ssid->mode ? 10 : 5; + } else if (wpa_s->conf->ap_scan == 1) { + /* give IBSS a bit more time */ + timeout = ssid->mode ? 20 : 10; + } wpa_supplicant_req_auth_timeout(wpa_s, timeout, 0); } @@ -1795,12 +1819,6 @@ static int _wpa_ether_send(void *wpa_s, const u8 *dest, u16 proto, } -static void _wpa_supplicant_req_scan(void *wpa_s, int sec, int usec) -{ - wpa_supplicant_req_scan(wpa_s, sec, usec); -} - - static void _wpa_supplicant_cancel_auth_timeout(void *wpa_s) { wpa_supplicant_cancel_auth_timeout(wpa_s); @@ -1822,12 +1840,16 @@ static wpa_states _wpa_supplicant_get_state(void *wpa_s) static void _wpa_supplicant_disassociate(void *wpa_s, int reason_code) { wpa_supplicant_disassociate(wpa_s, reason_code); + /* Schedule a scan to make sure we continue looking for networks */ + wpa_supplicant_req_scan(wpa_s, 0, 0); } static void _wpa_supplicant_deauthenticate(void *wpa_s, int reason_code) { wpa_supplicant_deauthenticate(wpa_s, reason_code); + /* Schedule a scan to make sure we continue looking for networks */ + wpa_supplicant_req_scan(wpa_s, 0, 0); } @@ -2205,7 +2227,6 @@ static int wpa_supplicant_init_wpa(struct wpa_supplicant *wpa_s) ctx->ctx = wpa_s; ctx->set_state = _wpa_supplicant_set_state; ctx->get_state = _wpa_supplicant_get_state; - ctx->req_scan = _wpa_supplicant_req_scan; ctx->deauthenticate = _wpa_supplicant_deauthenticate; ctx->disassociate = _wpa_supplicant_disassociate; ctx->set_key = wpa_supplicant_set_key; @@ -2488,8 +2509,6 @@ struct wpa_global * wpa_supplicant_init(struct wpa_params *params) return NULL; wpa_debug_open_file(params->wpa_debug_file_path); - if (params->wpa_debug_syslog) - wpa_debug_open_syslog(); ret = eap_peer_register_methods(); if (ret) { @@ -2614,6 +2633,5 @@ void wpa_supplicant_deinit(struct wpa_global *global) os_free(global->params.ctrl_interface); os_free(global); - wpa_debug_close_syslog(); wpa_debug_close_file(); } |