Commit 7d25745d authored by Johannes Berg's avatar Johannes Berg

mac80211: update BSS info on AC parameters change

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: default avatarJohannes Berg <johannes.berg@intel.com>
parent 56af8f9a
...@@ -1741,6 +1741,8 @@ static int ieee80211_set_txq_params(struct wiphy *wiphy, ...@@ -1741,6 +1741,8 @@ static int ieee80211_set_txq_params(struct wiphy *wiphy,
return -EINVAL; return -EINVAL;
} }
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS);
return 0; return 0;
} }
......
...@@ -1108,7 +1108,7 @@ void ieee80211_dynamic_ps_timer(unsigned long data) ...@@ -1108,7 +1108,7 @@ void ieee80211_dynamic_ps_timer(unsigned long data)
} }
/* MLME */ /* 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, struct ieee80211_sub_if_data *sdata,
u8 *wmm_param, size_t wmm_param_len) u8 *wmm_param, size_t wmm_param_len)
{ {
...@@ -1119,23 +1119,23 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local, ...@@ -1119,23 +1119,23 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
u8 *pos, uapsd_queues = 0; u8 *pos, uapsd_queues = 0;
if (!local->ops->conf_tx) if (!local->ops->conf_tx)
return; return false;
if (local->hw.queues < IEEE80211_NUM_ACS) if (local->hw.queues < IEEE80211_NUM_ACS)
return; return false;
if (!wmm_param) if (!wmm_param)
return; return false;
if (wmm_param_len < 8 || wmm_param[5] /* version */ != 1) if (wmm_param_len < 8 || wmm_param[5] /* version */ != 1)
return; return false;
if (ifmgd->flags & IEEE80211_STA_UAPSD_ENABLED) if (ifmgd->flags & IEEE80211_STA_UAPSD_ENABLED)
uapsd_queues = ifmgd->uapsd_queues; uapsd_queues = ifmgd->uapsd_queues;
count = wmm_param[6] & 0x0f; count = wmm_param[6] & 0x0f;
if (count == ifmgd->wmm_last_param_set) if (count == ifmgd->wmm_last_param_set)
return; return false;
ifmgd->wmm_last_param_set = count; ifmgd->wmm_last_param_set = count;
pos = wmm_param + 8; pos = wmm_param + 8;
...@@ -1202,6 +1202,7 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local, ...@@ -1202,6 +1202,7 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
/* enable WMM or activate new settings */ /* enable WMM or activate new settings */
sdata->vif.bss_conf.qos = true; sdata->vif.bss_conf.qos = true;
return true;
} }
static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata) 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, ...@@ -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, directed_tim = ieee80211_check_tim(elems.tim, elems.tim_len,
ifmgd->aid); 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 (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) {
if (directed_tim) { if (directed_tim) {
if (local->hw.conf.dynamic_ps_timeout > 0) { if (local->hw.conf.dynamic_ps_timeout > 0) {
...@@ -2476,6 +2469,13 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, ...@@ -2476,6 +2469,13 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
ifmgd->beacon_crc = ncrc; ifmgd->beacon_crc = ncrc;
ifmgd->beacon_crc_valid = true; 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) { if (elems.erp_info && elems.erp_info_len >= 1) {
erp_valid = true; erp_valid = true;
erp_value = elems.erp_info[0]; erp_value = elems.erp_info[0];
......
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