diff options
Diffstat (limited to 'net/mac80211/cfg.c')
-rw-r--r-- | net/mac80211/cfg.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 7606571d4581..0f29cd0580c9 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -1173,6 +1173,7 @@ static int ieee80211_auth(struct wiphy *wiphy, struct net_device *dev, | |||
1173 | struct cfg80211_auth_request *req) | 1173 | struct cfg80211_auth_request *req) |
1174 | { | 1174 | { |
1175 | struct ieee80211_sub_if_data *sdata; | 1175 | struct ieee80211_sub_if_data *sdata; |
1176 | const u8 *ssid; | ||
1176 | 1177 | ||
1177 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 1178 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
1178 | 1179 | ||
@@ -1193,15 +1194,16 @@ static int ieee80211_auth(struct wiphy *wiphy, struct net_device *dev, | |||
1193 | return -EOPNOTSUPP; | 1194 | return -EOPNOTSUPP; |
1194 | } | 1195 | } |
1195 | 1196 | ||
1196 | memcpy(sdata->u.mgd.bssid, req->peer_addr, ETH_ALEN); | 1197 | memcpy(sdata->u.mgd.bssid, req->bss->bssid, ETH_ALEN); |
1197 | 1198 | ||
1198 | sdata->local->oper_channel = req->chan; | 1199 | sdata->local->oper_channel = req->bss->channel; |
1199 | ieee80211_hw_config(sdata->local, 0); | 1200 | ieee80211_hw_config(sdata->local, 0); |
1200 | 1201 | ||
1201 | if (!req->ssid) | 1202 | ssid = ieee80211_bss_get_ie(req->bss, WLAN_EID_SSID); |
1203 | if (!ssid) | ||
1202 | return -EINVAL; | 1204 | return -EINVAL; |
1203 | memcpy(sdata->u.mgd.ssid, req->ssid, req->ssid_len); | 1205 | sdata->u.mgd.ssid_len = *(ssid + 1); |
1204 | sdata->u.mgd.ssid_len = req->ssid_len; | 1206 | memcpy(sdata->u.mgd.ssid, ssid + 2, sdata->u.mgd.ssid_len); |
1205 | 1207 | ||
1206 | kfree(sdata->u.mgd.sme_auth_ie); | 1208 | kfree(sdata->u.mgd.sme_auth_ie); |
1207 | sdata->u.mgd.sme_auth_ie = NULL; | 1209 | sdata->u.mgd.sme_auth_ie = NULL; |
@@ -1227,7 +1229,7 @@ static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev, | |||
1227 | 1229 | ||
1228 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 1230 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
1229 | 1231 | ||
1230 | if (memcmp(sdata->u.mgd.bssid, req->peer_addr, ETH_ALEN) != 0 || | 1232 | if (memcmp(sdata->u.mgd.bssid, req->bss->bssid, ETH_ALEN) != 0 || |
1231 | !(sdata->u.mgd.flags & IEEE80211_STA_AUTHENTICATED)) | 1233 | !(sdata->u.mgd.flags & IEEE80211_STA_AUTHENTICATED)) |
1232 | return -ENOLINK; /* not authenticated */ | 1234 | return -ENOLINK; /* not authenticated */ |
1233 | 1235 | ||
@@ -1239,15 +1241,9 @@ static int ieee80211_assoc(struct wiphy *wiphy, struct net_device *dev, | |||
1239 | req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_WEP104) | 1241 | req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_WEP104) |
1240 | sdata->u.mgd.flags |= IEEE80211_STA_DISABLE_11N; | 1242 | sdata->u.mgd.flags |= IEEE80211_STA_DISABLE_11N; |
1241 | 1243 | ||
1242 | sdata->local->oper_channel = req->chan; | 1244 | sdata->local->oper_channel = req->bss->channel; |
1243 | ieee80211_hw_config(sdata->local, 0); | 1245 | ieee80211_hw_config(sdata->local, 0); |
1244 | 1246 | ||
1245 | if (!req->ssid) | ||
1246 | return -EINVAL; | ||
1247 | |||
1248 | memcpy(sdata->u.mgd.ssid, req->ssid, req->ssid_len); | ||
1249 | sdata->u.mgd.ssid_len = req->ssid_len; | ||
1250 | |||
1251 | ret = ieee80211_sta_set_extra_ie(sdata, req->ie, req->ie_len); | 1247 | ret = ieee80211_sta_set_extra_ie(sdata, req->ie, req->ie_len); |
1252 | if (ret && ret != -EALREADY) | 1248 | if (ret && ret != -EALREADY) |
1253 | return ret; | 1249 | return ret; |