aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJouni Malinen <j@w1.fi>2010-02-28 05:13:46 -0500
committerJohn W. Linville <linville@tuxdriver.com>2010-03-02 14:28:50 -0500
commit9c87ba6734422034fccb938da1039ed63da1395c (patch)
tree998b679ddfe7ab2f104808a7f3627a4b4ccf23d7
parenta9f042cbe5284f34ccff15f3084477e11b39b17b (diff)
mac80211: Fix reassociation processing (within ESS roaming)
Commit e1dd33f60ced091114e4aacf141e0d03b88d3e13 changed cfg80211 to allow association commands while in associated state to enable support for roaming within an ESS. However, this was not enough to resolve all cases with mac80211 which needs some additional handling of the reassociation case to clear internal state with the BSS that was in use previously. This patch makes ieee80211_mgd_assoc() accept a valid reassociation command and clean the association state with the previous BSS. This fixes roaming between BSSes in an ESS when using wpa_supplicant with -Dnl80211. Signed-off-by: Jouni Malinen <j@w1.fi> Cc: stable@kernel.org Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--net/mac80211/mlme.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 41812a15eea0..5a268761e4c5 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -1893,8 +1893,20 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
1893 1893
1894 mutex_lock(&ifmgd->mtx); 1894 mutex_lock(&ifmgd->mtx);
1895 if (ifmgd->associated) { 1895 if (ifmgd->associated) {
1896 mutex_unlock(&ifmgd->mtx); 1896 if (!req->prev_bssid ||
1897 return -EALREADY; 1897 memcmp(req->prev_bssid, ifmgd->associated->bssid,
1898 ETH_ALEN)) {
1899 /*
1900 * We are already associated and the request was not a
1901 * reassociation request from the current BSS, so
1902 * reject it.
1903 */
1904 mutex_unlock(&ifmgd->mtx);
1905 return -EALREADY;
1906 }
1907
1908 /* Trying to reassociate - clear previous association state */
1909 ieee80211_set_disassoc(sdata);
1898 } 1910 }
1899 mutex_unlock(&ifmgd->mtx); 1911 mutex_unlock(&ifmgd->mtx);
1900 1912