]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - net/mac80211/scan.c
mac80211: wait for beacon before enabling powersave
[mirror_ubuntu-bionic-kernel.git] / net / mac80211 / scan.c
index 30cb62bb45b35de35cb2106a009f09dc422998f3..bc061f6296742c27a578c378ca152b0c629b7057 100644 (file)
@@ -54,6 +54,23 @@ void ieee80211_rx_bss_put(struct ieee80211_local *local,
        cfg80211_put_bss(container_of((void *)bss, struct cfg80211_bss, priv));
 }
 
+static bool is_uapsd_supported(struct ieee802_11_elems *elems)
+{
+       u8 qos_info;
+
+       if (elems->wmm_info && elems->wmm_info_len == 7
+           && elems->wmm_info[5] == 1)
+               qos_info = elems->wmm_info[6];
+       else if (elems->wmm_param && elems->wmm_param_len == 24
+                && elems->wmm_param[5] == 1)
+               qos_info = elems->wmm_param[6];
+       else
+               /* no valid wmm information or parameter element found */
+               return false;
+
+       return qos_info & IEEE80211_WMM_IE_AP_QOSINFO_UAPSD;
+}
+
 struct ieee80211_bss *
 ieee80211_bss_info_update(struct ieee80211_local *local,
                          struct ieee80211_rx_status *rx_status,
@@ -94,10 +111,6 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
                bss->dtim_period = tim_ie->dtim_period;
        }
 
-       /* set default value for buggy AP/no TIM element */
-       if (bss->dtim_period == 0)
-               bss->dtim_period = 1;
-
        bss->supp_rates_len = 0;
        if (elems->supp_rates) {
                clen = IEEE80211_MAX_SUPP_RATES - bss->supp_rates_len;
@@ -117,6 +130,7 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
        }
 
        bss->wmm_used = elems->wmm_param || elems->wmm_info;
+       bss->uapsd_supported = is_uapsd_supported(elems);
 
        if (!beacon)
                bss->last_probe_resp = jiffies;