Failed to connect an AP vai WPS on kernel >= 3.11

Jouni Malinen j at w1.fi
Wed Aug 26 06:06:04 EDT 2015


On Wed, Aug 26, 2015 at 09:54:54AM +0000, Vinayak Kamath wrote:
> We are facing WPS issue due to NL80211_CMD_DISCONNECT received from cfg80211 when supplicant initiate a disconnect after success WPS handshake. As a result supplicant does not attempt to associate with AP and connection fails. 

Would you be able to share a debug log showing this?

> Could you please review the patch shared below.
> Patch  ignores NL80211_CMD_DISCONNECT from cfg80211 if it is indication for local initiated disconnect.

Locally initiated? The place in which this new code is added is
immediately after "if (locally_generated) { ... return; }" and as such,
it is quite difficult to understand how it would do what you describe
here..

> Subject: [PATCH 1/1] nl80211: Ignore NL80211_CMD_DISCONNECT after WPS
> 
> Linux kernel >= 3.11 expects wlan driver to indicate disconnect event
> to cfg80211 even in case of disconnect initiated by wpa_supplicant
> (i.e locally generated). Hence cfg80211 sends NL80211_CMD_DISCONNECT
> to wpa_supplicant which leads to failure of WPS process and STA avoids
> connect attempt with AP even after successful WPS handshake.

I do not see this in my tests which is why I'd need to see a detailed
wpa_supplicant debug log showing the issue so that I can figure out why
this happens. Please note that wpa_supplicant already has code for
ignoring the local-disconnect event (drv->ignore_next_local_disconnect).

> diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c
> @@ -394,6 +394,11 @@ static void mlme_event_disconnect(struct wpa_driver_nl80211_data *drv,

This is missing the key part in context here:
		  if (locally_generated) {
>                         wpa_printf(MSG_DEBUG, "nl80211: Ignore disconnect "
>                                    "event triggered during reassociation");
>                         return;
> +               } else if ((nla_get_u16(reason) ==  WLAN_REASON_DEAUTH_LEAVING) &&
> +                               !(drv->associated)) {
> +                       wpa_printf(MSG_DEBUG, "nl80211: Ignore disconnect "
> +                               "resulted part of local disconnection");
> +                       return;
>                 }

How would this be "local disconnect" if the only way of getting there is
if !locally_generated... (locally_generated = by_ap == NULL)

This new check would require NL80211_ATTR_DISCONNECT_BY_AP to be present
and that does not sound at all correct.. I guess that !drv->associated
would remove some cases, but this is just way to confusing to be
acceptable without additional comments describing the logic here.

-- 
Jouni Malinen                                            PGP id EFC895FA


More information about the HostAP mailing list