mac80211: insert AP sta entry after filling it
authorJohannes Berg <johannes@sipsolutions.net>
Wed, 22 Oct 2008 09:41:38 +0000 (11:41 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 31 Oct 2008 23:00:46 +0000 (19:00 -0400)
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: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/mlme.c

index 4cfbb9f09ac93edacd97321fd24ba706dc0bb354..026f07a173b640422cdb634445e20cd4d74c9ef2 100644 (file)
@@ -1182,7 +1182,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
        u8 *pos;
        u32 changed = 0;
        int i, j;
-       bool have_higher_than_11mbit = false;
+       bool have_higher_than_11mbit = false, newsta = false;
        u16 ap_ht_cap_flags;
 
        /* 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,
        sta = sta_info_get(local, ifsta->bssid);
        if (!sta) {
                struct ieee80211_bss *bss;
-               int err;
+
+               newsta = true;
 
                sta = sta_info_alloc(sdata, ifsta->bssid, GFP_ATOMIC);
                if (!sta) {
@@ -1265,13 +1266,6 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
                        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 */
                sta->last_rx = jiffies;
        }
@@ -1339,13 +1333,24 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
 
        rate_control_rate_init(sta);
 
-       if (elems.wmm_param) {
+       if (elems.wmm_param)
                set_sta_flags(sta, WLAN_STA_WME);
-               rcu_read_unlock();
+
+       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();
+                       return;
+               }
+       }
+
+       rcu_read_unlock();
+
+       if (elems.wmm_param)
                ieee80211_sta_wmm_params(local, ifsta, elems.wmm_param,
                                         elems.wmm_param_len);
-       } else
-               rcu_read_unlock();
 
        if (elems.ht_info_elem && elems.wmm_param &&
            (ifsta->flags & IEEE80211_STA_WMM_ENABLED))