cfg80211: keep track of BSSes

In order to avoid problems with BSS structs going away
while they're in use, I've long wanted to make cfg80211
keep track of them. Without the SME, that wasn't doable
but now that we have the SME we can do this too. It can
keep track of up to four separate authentications and
one association, regardless of whether it's controlled
by the cfg80211 SME or the userspace SME.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
Johannes Berg
2009-07-02 17:20:43 +02:00
committed by John W. Linville
parent 517357c685
commit 19957bb399
11 changed files with 594 additions and 280 deletions

View 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,15 +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);
memcpy(sdata->u.mgd.bssid, req->bss->bssid, ETH_ALEN);
sdata->local->oper_channel = req->chan;
sdata->local->oper_channel = req->bss->channel;
ieee80211_hw_config(sdata->local, 0);
if (!req->ssid)
ssid = ieee80211_bss_get_ie(req->bss, WLAN_EID_SSID);
if (!ssid)
return -EINVAL;
memcpy(sdata->u.mgd.ssid, req->ssid, req->ssid_len);
sdata->u.mgd.ssid_len = req->ssid_len;
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;
@@ -1227,7 +1229,7 @@ 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 */
@@ -1239,15 +1241,9 @@ static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev,
req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_WEP104)
sdata->u.mgd.flags |= IEEE80211_STA_DISABLE_11N;
sdata->local->oper_channel = req->chan;
sdata->local->oper_channel = req->bss->channel;
ieee80211_hw_config(sdata->local, 0);
if (!req->ssid)
return -EINVAL;
memcpy(sdata->u.mgd.ssid, req->ssid, req->ssid_len);
sdata->u.mgd.ssid_len = req->ssid_len;
ret = ieee80211_sta_set_extra_ie(sdata, req->ie, req->ie_len);
if (ret && ret != -EALREADY)
return ret;