Commit ddf4ac53 authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

mac80211: insert AP sta entry after filling it

We never clearly defined the semantics of the sta_notify callback
and it was originally posted for iwlwifi which still doesn't use
it at all. With the recent HT rework ath9k started relying on it,
but I made a mistake there in that I made ath9k assume the HT
information has already been filled in at sta_notify time. This
isn't a hard thing to do, so do it.
Signed-off-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent cfa3fa40
...@@ -1182,7 +1182,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, ...@@ -1182,7 +1182,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
u8 *pos; u8 *pos;
u32 changed = 0; u32 changed = 0;
int i, j; int i, j;
bool have_higher_than_11mbit = false; bool have_higher_than_11mbit = false, newsta = false;
u16 ap_ht_cap_flags; u16 ap_ht_cap_flags;
/* AssocResp and ReassocResp have identical structure, so process both /* 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,7 +1246,8 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
sta = sta_info_get(local, ifsta->bssid); sta = sta_info_get(local, ifsta->bssid);
if (!sta) { if (!sta) {
struct ieee80211_bss *bss; struct ieee80211_bss *bss;
int err;
newsta = true;
sta = sta_info_alloc(sdata, ifsta->bssid, GFP_ATOMIC); sta = sta_info_alloc(sdata, ifsta->bssid, GFP_ATOMIC);
if (!sta) { if (!sta) {
...@@ -1265,13 +1266,6 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, ...@@ -1265,13 +1266,6 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
ieee80211_rx_bss_put(local, bss); ieee80211_rx_bss_put(local, bss);
} }
err = sta_info_insert(sta);
if (err) {
printk(KERN_DEBUG "%s: failed to insert STA entry for"
" the AP (error %d)\n", sdata->dev->name, err);
rcu_read_unlock();
return;
}
/* update new sta with its last rx activity */ /* update new sta with its last rx activity */
sta->last_rx = jiffies; sta->last_rx = jiffies;
} }
...@@ -1339,13 +1333,24 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, ...@@ -1339,13 +1333,24 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
rate_control_rate_init(sta); rate_control_rate_init(sta);
if (elems.wmm_param) { if (elems.wmm_param)
set_sta_flags(sta, WLAN_STA_WME); set_sta_flags(sta, WLAN_STA_WME);
if (newsta) {
int err = sta_info_insert(sta);
if (err) {
printk(KERN_DEBUG "%s: failed to insert STA entry for"
" the AP (error %d)\n", sdata->dev->name, err);
rcu_read_unlock(); rcu_read_unlock();
return;
}
}
rcu_read_unlock();
if (elems.wmm_param)
ieee80211_sta_wmm_params(local, ifsta, elems.wmm_param, ieee80211_sta_wmm_params(local, ifsta, elems.wmm_param,
elems.wmm_param_len); elems.wmm_param_len);
} else
rcu_read_unlock();
if (elems.ht_info_elem && elems.wmm_param && if (elems.ht_info_elem && elems.wmm_param &&
(ifsta->flags & IEEE80211_STA_WMM_ENABLED)) (ifsta->flags & IEEE80211_STA_WMM_ENABLED))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment