mac80211: call rate control only after init
authorJohannes Berg <johannes.berg@intel.com>
Fri, 20 Jan 2012 12:55:23 +0000 (13:55 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 6 Feb 2012 20:35:11 +0000 (15:35 -0500)
There are situations where we don't have the
necessary rate control information yet for
station entries, e.g. when associating. This
currently doesn't really happen due to the
dummy station handling; explicitly disabling
rate control when it's not initialised will
allow us to remove dummy stations.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/debugfs_sta.c
net/mac80211/rate.c
net/mac80211/rate.h
net/mac80211/sta_info.h

index c8383712fdeca6f679944184cea5b42c58c44acb..6d45804d09bc0a26ef9025c8751355ffebd13b8f 100644 (file)
@@ -63,7 +63,7 @@ static ssize_t sta_flags_read(struct file *file, char __user *userbuf,
        test_sta_flag(sta, WLAN_STA_##flg) ? #flg "\n" : ""
 
        int res = scnprintf(buf, sizeof(buf),
-                           "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+                           "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
                            TEST(AUTH), TEST(ASSOC), TEST(PS_STA),
                            TEST(PS_DRIVER), TEST(AUTHORIZED),
                            TEST(SHORT_PREAMBLE),
@@ -71,7 +71,7 @@ static ssize_t sta_flags_read(struct file *file, char __user *userbuf,
                            TEST(MFP), TEST(BLOCK_BA), TEST(PSPOLL),
                            TEST(UAPSD), TEST(SP), TEST(TDLS_PEER),
                            TEST(TDLS_PEER_AUTH), TEST(4ADDR_EVENT),
-                           TEST(INSERTED));
+                           TEST(INSERTED), TEST(RATE_CONTROL));
 #undef TEST
        return simple_read_from_buffer(userbuf, count, ppos, buf, res);
 }
index 22fc28e9026e59d2c9fe6994779313b279dce252..111fba38be82d6095fcd4a72d2610517af4f2ace 100644 (file)
@@ -439,7 +439,7 @@ void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,
        u32 mask;
        u8 mcs_mask[IEEE80211_HT_MCS_MASK_LEN];
 
-       if (sta) {
+       if (sta && test_sta_flag(sta, WLAN_STA_RATE_CONTROL)) {
                ista = &sta->sta;
                priv_sta = sta->rate_ctrl_priv;
        }
index 8268457bd143ea376804c8183df963547fa50327..5fc3135a6b45a54e9e089b1c2ea65e1cf736d238 100644 (file)
@@ -58,6 +58,7 @@ static inline void rate_control_rate_init(struct sta_info *sta)
        sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
 
        ref->ops->rate_init(ref->priv, sband, ista, priv_sta);
+       set_sta_flag(sta, WLAN_STA_RATE_CONTROL);
 }
 
 static inline void rate_control_rate_update(struct ieee80211_local *local,
index 03f249bc27668d62c254d1858963b9b302badb18..23a97c9dc042f9caa284e4536f2deb28f1ce44ab 100644 (file)
@@ -53,6 +53,7 @@
  *     reply to other uAPSD trigger frames or PS-Poll.
  * @WLAN_STA_4ADDR_EVENT: 4-addr event was already sent for this frame.
  * @WLAN_STA_INSERTED: This station is inserted into the hash table.
+ * @WLAN_STA_RATE_CONTROL: rate control was initialized for this station.
  */
 enum ieee80211_sta_info_flags {
        WLAN_STA_AUTH,
@@ -73,6 +74,7 @@ enum ieee80211_sta_info_flags {
        WLAN_STA_SP,
        WLAN_STA_4ADDR_EVENT,
        WLAN_STA_INSERTED,
+       WLAN_STA_RATE_CONTROL,
 };
 
 #define STA_TID_NUM 16