cfg80211: refuse authenticating to same BSSID twice
authorJohannes Berg <johannes@sipsolutions.net>
Thu, 2 Jul 2009 16:26:18 +0000 (18:26 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 10 Jul 2009 19:01:54 +0000 (15:01 -0400)
It is possible that there are different BSS structs with
the same BSSID, but we cannot authenticate with multiple
of them them because we need the BSSID to be unique for
deauthenticating/disassociating.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/wireless/mlme.c

index 1a92bf7597bf6234742ef053f7a7012d644d25e5..020f33b38467ac8ee570a61bd76b634c3fda17f9 100644 (file)
@@ -278,6 +278,21 @@ int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
        struct cfg80211_internal_bss *bss;
        int i, err, slot = -1, nfree = 0;
 
+       if (wdev->current_bss &&
+           memcmp(bssid, wdev->current_bss->pub.bssid, ETH_ALEN) == 0)
+               return -EALREADY;
+
+       for (i = 0; i < MAX_AUTH_BSSES; i++) {
+               if (wdev->authtry_bsses[i] &&
+                   memcmp(bssid, wdev->authtry_bsses[i]->pub.bssid,
+                                               ETH_ALEN) == 0)
+                       return -EALREADY;
+               if (wdev->auth_bsses[i] &&
+                   memcmp(bssid, wdev->auth_bsses[i]->pub.bssid,
+                                               ETH_ALEN) == 0)
+                       return -EALREADY;
+       }
+
        memset(&req, 0, sizeof(req));
 
        req.ie = ie;
@@ -290,13 +305,6 @@ int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
 
        bss = bss_from_pub(req.bss);
 
-       for (i = 0; i < MAX_AUTH_BSSES; i++) {
-               if (bss == wdev->auth_bsses[i]) {
-                       err = -EALREADY;
-                       goto out;
-               }
-       }
-
        for (i = 0; i < MAX_AUTH_BSSES; i++) {
                if (!wdev->auth_bsses[i] && !wdev->authtry_bsses[i]) {
                        slot = i;