> > > > > 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. Yes, I saw that it was removed/rewritten in 3.11. However, that is quite a jump in kernel versions for us at this point, so we will probably prefer to patch the 3.4 series. > > > > > > 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... So I guess the conclusion is that there isn't currently a "correct" way to do roaming (until CMD_ROAM gets implemented)? In that case we will go with patching the check to only fail with -EALREADY in the case where sme_state is CFG80211_SME_CONNECTING, since that means roaming works with libertas. -- 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