aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/mac80211/mlme.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 4cfbb9f09ac9..026f07a173b6 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -1182,7 +1182,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
1182 u8 *pos; 1182 u8 *pos;
1183 u32 changed = 0; 1183 u32 changed = 0;
1184 int i, j; 1184 int i, j;
1185 bool have_higher_than_11mbit = false; 1185 bool have_higher_than_11mbit = false, newsta = false;
1186 u16 ap_ht_cap_flags; 1186 u16 ap_ht_cap_flags;
1187 1187
1188 /* AssocResp and ReassocResp have identical structure, so process both 1188 /* AssocResp and ReassocResp have identical structure, so process both
@@ -1246,7 +1246,8 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
1246 sta = sta_info_get(local, ifsta->bssid); 1246 sta = sta_info_get(local, ifsta->bssid);
1247 if (!sta) { 1247 if (!sta) {
1248 struct ieee80211_bss *bss; 1248 struct ieee80211_bss *bss;
1249 int err; 1249
1250 newsta = true;
1250 1251
1251 sta = sta_info_alloc(sdata, ifsta->bssid, GFP_ATOMIC); 1252 sta = sta_info_alloc(sdata, ifsta->bssid, GFP_ATOMIC);
1252 if (!sta) { 1253 if (!sta) {
@@ -1265,13 +1266,6 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
1265 ieee80211_rx_bss_put(local, bss); 1266 ieee80211_rx_bss_put(local, bss);
1266 } 1267 }
1267 1268
1268 err = sta_info_insert(sta);
1269 if (err) {
1270 printk(KERN_DEBUG "%s: failed to insert STA entry for"
1271 " the AP (error %d)\n", sdata->dev->name, err);
1272 rcu_read_unlock();
1273 return;
1274 }
1275 /* update new sta with its last rx activity */ 1269 /* update new sta with its last rx activity */
1276 sta->last_rx = jiffies; 1270 sta->last_rx = jiffies;
1277 } 1271 }
@@ -1339,13 +1333,24 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
1339 1333
1340 rate_control_rate_init(sta); 1334 rate_control_rate_init(sta);
1341 1335
1342 if (elems.wmm_param) { 1336 if (elems.wmm_param)
1343 set_sta_flags(sta, WLAN_STA_WME); 1337 set_sta_flags(sta, WLAN_STA_WME);
1344 rcu_read_unlock(); 1338
1339 if (newsta) {
1340 int err = sta_info_insert(sta);
1341 if (err) {
1342 printk(KERN_DEBUG "%s: failed to insert STA entry for"
1343 " the AP (error %d)\n", sdata->dev->name, err);
1344 rcu_read_unlock();
1345 return;
1346 }
1347 }
1348
1349 rcu_read_unlock();
1350
1351 if (elems.wmm_param)
1345 ieee80211_sta_wmm_params(local, ifsta, elems.wmm_param, 1352 ieee80211_sta_wmm_params(local, ifsta, elems.wmm_param,
1346 elems.wmm_param_len); 1353 elems.wmm_param_len);
1347 } else
1348 rcu_read_unlock();
1349 1354
1350 if (elems.ht_info_elem && elems.wmm_param && 1355 if (elems.ht_info_elem && elems.wmm_param &&
1351 (ifsta->flags & IEEE80211_STA_WMM_ENABLED)) 1356 (ifsta->flags & IEEE80211_STA_WMM_ENABLED))