mac80211: update BSS info on AC parameters change
authorJohannes Berg <johannes.berg@intel.com>
Fri, 6 Jul 2012 15:37:43 +0000 (17:37 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 9 Jul 2012 12:49:00 +0000 (14:49 +0200)
When the AC parameters change, drivers might rely
on getting a bss_info_changed notification with
BSS_CHANGED_QOS in addition to the conf_tx call.

Always call the function when userspace updates
are made (in AP/GO modes) and also set the change
flag when updates were made by the AP (in managed
mode.)

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/cfg.c
net/mac80211/mlme.c

index ccbe2413142aba954200793a278f68d7e2abfd22..6a171e299b577a9a4ff8380d1fe9f0fe7dd21a93 100644 (file)
@@ -1741,6 +1741,8 @@ static int ieee80211_set_txq_params(struct wiphy *wiphy,
                return -EINVAL;
        }
 
+       ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS);
+
        return 0;
 }
 
index d563f7c5553161161140a5782450ffa207d340c0..6eab63388c649d2253ef4f62c9ab80ab7cf0775c 100644 (file)
@@ -1108,7 +1108,7 @@ void ieee80211_dynamic_ps_timer(unsigned long data)
 }
 
 /* MLME */
-static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
+static bool ieee80211_sta_wmm_params(struct ieee80211_local *local,
                                     struct ieee80211_sub_if_data *sdata,
                                     u8 *wmm_param, size_t wmm_param_len)
 {
@@ -1119,23 +1119,23 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
        u8 *pos, uapsd_queues = 0;
 
        if (!local->ops->conf_tx)
-               return;
+               return false;
 
        if (local->hw.queues < IEEE80211_NUM_ACS)
-               return;
+               return false;
 
        if (!wmm_param)
-               return;
+               return false;
 
        if (wmm_param_len < 8 || wmm_param[5] /* version */ != 1)
-               return;
+               return false;
 
        if (ifmgd->flags & IEEE80211_STA_UAPSD_ENABLED)
                uapsd_queues = ifmgd->uapsd_queues;
 
        count = wmm_param[6] & 0x0f;
        if (count == ifmgd->wmm_last_param_set)
-               return;
+               return false;
        ifmgd->wmm_last_param_set = count;
 
        pos = wmm_param + 8;
@@ -1202,6 +1202,7 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
 
        /* enable WMM or activate new settings */
        sdata->vif.bss_conf.qos = true;
+       return true;
 }
 
 static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata)
@@ -2438,14 +2439,6 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
                directed_tim = ieee80211_check_tim(elems.tim, elems.tim_len,
                                                   ifmgd->aid);
 
-       if (ncrc != ifmgd->beacon_crc || !ifmgd->beacon_crc_valid) {
-               ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems,
-                                     true);
-
-               ieee80211_sta_wmm_params(local, sdata, elems.wmm_param,
-                                        elems.wmm_param_len);
-       }
-
        if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) {
                if (directed_tim) {
                        if (local->hw.conf.dynamic_ps_timeout > 0) {
@@ -2476,6 +2469,13 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
        ifmgd->beacon_crc = ncrc;
        ifmgd->beacon_crc_valid = true;
 
+       ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems,
+                             true);
+
+       if (ieee80211_sta_wmm_params(local, sdata, elems.wmm_param,
+                                    elems.wmm_param_len))
+               changed |= BSS_CHANGED_QOS;
+
        if (elems.erp_info && elems.erp_info_len >= 1) {
                erp_valid = true;
                erp_value = elems.erp_info[0];