nl80211: Allow association to change channels during reassociation
authorJouni Malinen <j@w1.fi>
Tue, 19 Jan 2010 18:53:30 +0000 (10:53 -0800)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 19 Jan 2010 21:49:35 +0000 (16:49 -0500)
nl80211_associate() was rejecting (re)association attempts with EBUSY
in some cases where we are currently associated with an AP that uses
different channel from the destination AP. Fix this by passing the
current wdev to rdev_fixed_channel() in the same way that was already
done for join-IBSS and connect commands. This allows the fixedchan
check to skipped for the current wdev and allows the reassociation to
proceed.

Signed-off-by: Jouni Malinen <j@w1.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/wireless/nl80211.c

index 4af7991a9ec8745bc0adc42ec5357d76c1f38d86..5b79ecf17bea47a102a57187d04cf4ce2af0589d 100644 (file)
@@ -3571,6 +3571,7 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
 {
        struct cfg80211_registered_device *rdev;
        struct net_device *dev;
+       struct wireless_dev *wdev;
        struct cfg80211_crypto_settings crypto;
        struct ieee80211_channel *chan, *fixedchan;
        const u8 *bssid, *ssid, *ie = NULL, *prev_bssid = NULL;
@@ -3616,7 +3617,8 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
        }
 
        mutex_lock(&rdev->devlist_mtx);
-       fixedchan = rdev_fixed_channel(rdev, NULL);
+       wdev = dev->ieee80211_ptr;
+       fixedchan = rdev_fixed_channel(rdev, wdev);
        if (fixedchan && chan != fixedchan) {
                err = -EBUSY;
                mutex_unlock(&rdev->devlist_mtx);