On Mon, 2013-11-25 at 19:36 +0100, Johannes Berg wrote: > On Mon, 2013-11-25 at 11:16 -0600, Dan Williams wrote: > > On Mon, 2013-11-25 at 17:16 +0100, Johannes Berg wrote: > > > On Mon, 2013-11-18 at 13:50 +0000, Troels Nilsson wrote: > > > > Hi, > > > > > > > > We are having a problem with a custom device which uses the libertas wifi > > > > driver (on kernel 3.4.24) together with wpa_supplicant (0.7.3). More > > > > specifically, whenever wpa_supplicant attempts to roam to a different access > > > > point it gets a EALREADY error. > > > > > > > > I have tracked down the problem to this check in sme.c: > > > > > > > > if (wdev->sme_state != CFG80211_SME_IDLE) > > > > return -EALREADY; > > > > > > This no longer exists - please try a newer kernel. > > > > Yeah, though the code there hasn't changed much in cfg80211 in the > > "connect" case from what he's using. It seems that > > supplicant-controlled roaming simply won't work with "connect" devices > > unless a disconnect is done first? Libertas is kinda different here > > since it does allow userspace roaming control. > > I believe the code *does* in fact allow connect() while connected right > now, though arguably that's a bug and shouldn't be done. It would make > some more sense to allow NL80211_CMD_ROAM to be used for something like > that, but ... I think you're right in the libertas case; neither nl80211_connect() or cfg80211_connect() care about whether the device is associated or not. I was looking at cfg80211_sme_connect(), which gets run for drivers that do not implement connect() themselves, and that function *doesn't* appear to allow roaming. So if the driver does implement connect() it can allow roaming from connect() if it wants, but if the driver does not implement connect() then the stack will not allow roaming from connect(). Seems a bit inconsistent, so what's the best-practice for drivers here? Disallow roaming from connect() and CMD_ROAM instead? We'd have to actually implement CMD_ROAM then, I guess... Dan -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html