[PATCH] Handle disconnect event while scanning for WPS

Jouni Malinen j
Sat Sep 27 12:33:30 PDT 2014

On Sat, Sep 20, 2014 at 12:15:31PM +0300, Robert Chiras wrote:
> If we are already connected to an AP and we initiate a WPS connection,
> wpa_supplicant will first disconnect from the current AP then initiate a
> scan request. The driver, will send us a disconnect event with
> ReasonCode 3 (WLAN_REASON_DEAUTH_LEAVING), confirming the disconnection
> from te current AP.
> If this happens during a WPS connection, when scan results receive, this
> disconnect will cause the process to stop.
> So, if a disconnect event is received while scanning for WPS connection,
> ignore this event and continue with WPS connection.

> diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
> @@ -1356,8 +1356,16 @@ static int _wpa_supplicant_event_scan_results(struct wpa_supplicant *wpa_s,
>  	if (wpa_s->disconnected) {
> -		wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
> -		goto scan_work_done;
> +		if (wpas_wps_searching(wpa_s)) {
> +			/* Received a disconnect while scanning for WPS; ignore it
> +			 * and continue with WPS process.
> +			 * */
> +			wpa_s->disconnected = 0;
> +			wpa_s->reassociate = 1;

This does not look correct.. Having wpa_s->disconnected getting set to 1
during WPS operation is the issue that would need to be resolved, not
this type of change to hide that case. That said, I'm not sure I
understand how this can happen..

Would you be able to share a debug log showing a case where this is
triggered? I'd assume this is with "STA_AUTOCONNECT 0" since that would
be needed to get wpa_s->disconnected set to 1 on deauthentication event.
However, when I tested trying to force that, I saw wpa_s->disconnected
getting cleared immediately in wpas_wps_reassoc() and the following
disconnection event getting ignored, so wpa_s->disconnected did not get
set to 1 again.

Do you have commit d6a36f3956cc49c77376eceaef2e14548ca0bf30
('nl80211: Mask out deauth even after own deauth request') included in
the version that you are testing with?

The autoconnect disabled case is already trying to skip the part of
setting wpa_s->disconnected through "wpa_s->key_mgmt ==
WPA_KEY_MGMT_WPS", but maybe that has been broken by some of the newer
changes. As such, more appropriate fix would likely be to add this
wpas_wps_searching(wpa_s) as a condition there in
wpa_supplicant_event_disassoc_finish() for setting disconnected=1 rather
than in this scan event handling case.
Jouni Malinen                                            PGP id EFC895FA

More information about the Hostap mailing list