WPS: Reconnect for a failed data connection when STA_AUTOCONNECT is 0

If "STA_AUTOCONNECT 0" has been used to disable automatic connection on
disconnection event and the driver indicates a failure for the data
connection after successful WPS handshake, it is possible to hit a case
where wpa_s->disconnected is set to 1 and further attempts to connect
shall stop.

While "STA_AUTOCONNECT 0" is used to disable automatic reconnection
attempts in general, this specific WPS case can benefit from trying
again even with that configuration for a short period of time. Extend
the wpa_supplicant re-enable-networks-after-WPS 10 second timeout to
apply for ignoring disabled STA_AUTOCONNECT immediately after a WPS
provisioning step.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Sunil Dutt 2015-11-16 20:32:56 +05:30 committed by Jouni Malinen
parent 1992af115a
commit 5e238cc682
3 changed files with 16 additions and 1 deletions

View file

@ -2376,7 +2376,8 @@ static void wpa_supplicant_event_disassoc_finish(struct wpa_supplicant *wpa_s,
if (!wpa_s->disconnected && if (!wpa_s->disconnected &&
(!wpa_s->auto_reconnect_disabled || (!wpa_s->auto_reconnect_disabled ||
wpa_s->key_mgmt == WPA_KEY_MGMT_WPS || wpa_s->key_mgmt == WPA_KEY_MGMT_WPS ||
wpas_wps_searching(wpa_s))) { wpas_wps_searching(wpa_s) ||
wpas_wps_reenable_networks_pending(wpa_s))) {
wpa_dbg(wpa_s, MSG_DEBUG, "Auto connect enabled: try to " wpa_dbg(wpa_s, MSG_DEBUG, "Auto connect enabled: try to "
"reconnect (wps=%d/%d wpa_state=%d)", "reconnect (wps=%d/%d wpa_state=%d)",
wpa_s->key_mgmt == WPA_KEY_MGMT_WPS, wpa_s->key_mgmt == WPA_KEY_MGMT_WPS,

View file

@ -683,6 +683,13 @@ static void wpas_wps_reenable_networks_cb(void *eloop_ctx, void *timeout_ctx)
} }
int wpas_wps_reenable_networks_pending(struct wpa_supplicant *wpa_s)
{
return eloop_is_timeout_registered(wpas_wps_reenable_networks_cb,
wpa_s, NULL);
}
static void wpa_supplicant_wps_event_success(struct wpa_supplicant *wpa_s) static void wpa_supplicant_wps_event_success(struct wpa_supplicant *wpa_s)
{ {
wpa_msg(wpa_s, MSG_INFO, WPS_EVENT_SUCCESS); wpa_msg(wpa_s, MSG_INFO, WPS_EVENT_SUCCESS);

View file

@ -85,6 +85,7 @@ int wpas_er_wps_nfc_report_handover(struct wpa_supplicant *wpa_s,
void wpas_wps_update_ap_info(struct wpa_supplicant *wpa_s, void wpas_wps_update_ap_info(struct wpa_supplicant *wpa_s,
struct wpa_scan_results *scan_res); struct wpa_scan_results *scan_res);
void wpas_wps_notify_assoc(struct wpa_supplicant *wpa_s, const u8 *bssid); void wpas_wps_notify_assoc(struct wpa_supplicant *wpa_s, const u8 *bssid);
int wpas_wps_reenable_networks_pending(struct wpa_supplicant *wpa_s);
#else /* CONFIG_WPS */ #else /* CONFIG_WPS */
@ -147,6 +148,12 @@ static inline void wpas_wps_notify_assoc(struct wpa_supplicant *wpa_s,
{ {
} }
static inline int
wpas_wps_reenable_networks_pending(struct wpa_supplicant *wpa_s)
{
return 0;
}
#endif /* CONFIG_WPS */ #endif /* CONFIG_WPS */
#endif /* WPS_SUPPLICANT_H */ #endif /* WPS_SUPPLICANT_H */