cfg80211: keep track of BSSes
[safe/jmp/linux-2.6] / net / mac80211 / cfg.c
index 3c9774e..0f29cd0 100644 (file)
@@ -1173,6 +1173,7 @@ static int ieee80211_auth(struct wiphy *wiphy, struct net_device *dev,
                          struct cfg80211_auth_request *req)
 {
        struct ieee80211_sub_if_data *sdata;
+       const u8 *ssid;
 
        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 
@@ -1193,19 +1194,16 @@ static int ieee80211_auth(struct wiphy *wiphy, struct net_device *dev,
                return -EOPNOTSUPP;
        }
 
-       memcpy(sdata->u.mgd.bssid, req->peer_addr, ETH_ALEN);
-       sdata->u.mgd.flags &= ~IEEE80211_STA_AUTO_BSSID_SEL;
-       sdata->u.mgd.flags |= IEEE80211_STA_BSSID_SET;
+       memcpy(sdata->u.mgd.bssid, req->bss->bssid, ETH_ALEN);
 
-       /* TODO: req->chan */
-       sdata->u.mgd.flags |= IEEE80211_STA_AUTO_CHANNEL_SEL;
+       sdata->local->oper_channel = req->bss->channel;
+       ieee80211_hw_config(sdata->local, 0);
 
-       if (req->ssid) {
-               sdata->u.mgd.flags |= IEEE80211_STA_SSID_SET;
-               memcpy(sdata->u.mgd.ssid, req->ssid, req->ssid_len);
-               sdata->u.mgd.ssid_len = req->ssid_len;
-               sdata->u.mgd.flags &= ~IEEE80211_STA_AUTO_SSID_SEL;
-       }
+       ssid = ieee80211_bss_get_ie(req->bss, WLAN_EID_SSID);
+       if (!ssid)
+               return -EINVAL;
+       sdata->u.mgd.ssid_len = *(ssid + 1);
+       memcpy(sdata->u.mgd.ssid, ssid + 2, sdata->u.mgd.ssid_len);
 
        kfree(sdata->u.mgd.sme_auth_ie);
        sdata->u.mgd.sme_auth_ie = NULL;
@@ -1218,7 +1216,6 @@ static int ieee80211_auth(struct wiphy *wiphy, struct net_device *dev,
                sdata->u.mgd.sme_auth_ie_len = req->ie_len;
        }
 
-       sdata->u.mgd.flags |= IEEE80211_STA_EXT_SME;
        sdata->u.mgd.state = IEEE80211_STA_MLME_DIRECT_PROBE;
        ieee80211_sta_req_auth(sdata);
        return 0;
@@ -1232,31 +1229,20 @@ static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev,
 
        sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 
-       if (memcmp(sdata->u.mgd.bssid, req->peer_addr, ETH_ALEN) != 0 ||
+       if (memcmp(sdata->u.mgd.bssid, req->bss->bssid, ETH_ALEN) != 0 ||
            !(sdata->u.mgd.flags & IEEE80211_STA_AUTHENTICATED))
                return -ENOLINK; /* not authenticated */
 
-       sdata->u.mgd.flags &= ~IEEE80211_STA_TKIP_WEP_USED;
+       sdata->u.mgd.flags &= ~IEEE80211_STA_DISABLE_11N;
 
        for (i = 0; i < req->crypto.n_ciphers_pairwise; i++)
                if (req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_WEP40 ||
                    req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_TKIP ||
                    req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_WEP104)
-                       sdata->u.mgd.flags |= IEEE80211_STA_TKIP_WEP_USED;
-
-       sdata->u.mgd.flags &= ~IEEE80211_STA_AUTO_BSSID_SEL;
-       sdata->u.mgd.flags |= IEEE80211_STA_BSSID_SET;
+                       sdata->u.mgd.flags |= IEEE80211_STA_DISABLE_11N;
 
-       /* TODO: req->chan */
-       sdata->u.mgd.flags |= IEEE80211_STA_AUTO_CHANNEL_SEL;
-
-       if (req->ssid) {
-               sdata->u.mgd.flags |= IEEE80211_STA_SSID_SET;
-               memcpy(sdata->u.mgd.ssid, req->ssid, req->ssid_len);
-               sdata->u.mgd.ssid_len = req->ssid_len;
-               sdata->u.mgd.flags &= ~IEEE80211_STA_AUTO_SSID_SEL;
-       } else
-               sdata->u.mgd.flags |= IEEE80211_STA_AUTO_SSID_SEL;
+       sdata->local->oper_channel = req->bss->channel;
+       ieee80211_hw_config(sdata->local, 0);
 
        ret = ieee80211_sta_set_extra_ie(sdata, req->ie, req->ie_len);
        if (ret && ret != -EALREADY)
@@ -1275,7 +1261,6 @@ static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev,
        else
                sdata->u.mgd.flags &= ~IEEE80211_STA_CONTROL_PORT;
 
-       sdata->u.mgd.flags |= IEEE80211_STA_EXT_SME;
        sdata->u.mgd.state = IEEE80211_STA_MLME_ASSOCIATE;
        ieee80211_sta_req_auth(sdata);
        return 0;