Endless assoc/disassoc loop due to wpa_driver_nl80211_authenticate

Ben Greear greearb at candelatech.com
Fri Nov 4 00:55:51 EDT 2011


I think I found the problem with the 128+ stations issue.

The wpa_driver_nl80211_authenticate method has some retry code
that hits when the kernel returns -EALREADY:

	ret = send_and_recv_msgs(drv, msg, NULL, NULL);
	msg = NULL;
	if (ret) {
		wpa_dbg(drv->ctx, MSG_DEBUG,
			"nl80211: MLME command failed (auth): ret=%d (%s)",
			ret, strerror(-ret));
		count++;
		if (ret == -EALREADY && count == 1 && params->bssid &&
		    !params->local_state_change) {

			/*
			 * mac80211 does not currently accept new
			 * authentication if we are already authenticated. As a
			 * workaround, force deauthentication and try again.
			 */
			wpa_printf(MSG_DEBUG, "nl80211: Retry authentication "
				   "after forced deauthentication");
			wpa_driver_nl80211_deauthenticate(
				bss, params->bssid,
				WLAN_REASON_PREV_AUTH_NOT_VALID);
			nlmsg_free(msg);
			goto retry;
		}
		goto nla_put_failure;
	}

The problem is, that deauth call will cause a DEAUTH event shortly after,
which will cause the station to deauth itself again.  This causes an endless loop of
auth/deauth when you have lots of VIFS in non-WPA mode.

If I just #ifdef out that retry code, it works much better.

Any idea why this was put in to begin with?

Thanks,
Ben

-- 
Ben Greear <greearb at candelatech.com>
Candela Technologies Inc  http://www.candelatech.com


More information about the HostAP mailing list