mac80211: update driver when MU EDCA params change
authorShaul Triebitz <shaul.triebitz@intel.com>
Sat, 15 Dec 2018 09:03:15 +0000 (11:03 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 18 Dec 2018 13:19:10 +0000 (14:19 +0100)
Similar to WMM IE, if MU_EDCA IE parameters changed (or ceased to exist)
tell the Driver about it.

Signed-off-by: Shaul Triebitz <shaul.triebitz@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/ieee80211_i.h
net/mac80211/mlme.c
net/mac80211/util.c

index 10a0506..7dfb4e2 100644 (file)
@@ -500,6 +500,7 @@ struct ieee80211_if_managed {
        unsigned int uapsd_max_sp_len;
 
        int wmm_last_param_set;
+       int mu_edca_last_param_set;
 
        u8 use_4addr;
 
index 3d1334a..975315b 100644 (file)
@@ -1869,7 +1869,7 @@ ieee80211_sta_wmm_params(struct ieee80211_local *local,
        struct ieee80211_tx_queue_params params[IEEE80211_NUM_ACS];
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
        size_t left;
-       int count, ac;
+       int count, mu_edca_count, ac;
        const u8 *pos;
        u8 uapsd_queues = 0;
 
@@ -1889,9 +1889,16 @@ ieee80211_sta_wmm_params(struct ieee80211_local *local,
                uapsd_queues = ifmgd->uapsd_queues;
 
        count = wmm_param[6] & 0x0f;
-       if (count == ifmgd->wmm_last_param_set)
+       /* -1 is the initial value of ifmgd->mu_edca_last_param_set.
+        * if mu_edca was preset before and now it disappeared tell
+        * the driver about it.
+        */
+       mu_edca_count = mu_edca ? mu_edca->mu_qos_info & 0x0f : -1;
+       if (count == ifmgd->wmm_last_param_set &&
+           mu_edca_count == ifmgd->mu_edca_last_param_set)
                return false;
        ifmgd->wmm_last_param_set = count;
+       ifmgd->mu_edca_last_param_set = mu_edca_count;
 
        pos = wmm_param + 8;
        left = wmm_param_len - 8;
@@ -3349,6 +3356,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
         * 4-bit value.
         */
        ifmgd->wmm_last_param_set = -1;
+       ifmgd->mu_edca_last_param_set = -1;
 
        if (ifmgd->flags & IEEE80211_STA_DISABLE_WMM) {
                ieee80211_set_wmm_default(sdata, false, false);
index dddfff7..d0eb38b 100644 (file)
@@ -1223,6 +1223,8 @@ u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
                        if (pos[0] == WLAN_EID_EXT_HE_MU_EDCA &&
                            elen >= (sizeof(*elems->mu_edca_param_set) + 1)) {
                                elems->mu_edca_param_set = (void *)&pos[1];
+                               if (calc_crc)
+                                       crc = crc32_be(crc, pos - 2, elen + 2);
                        } else if (pos[0] == WLAN_EID_EXT_HE_CAPABILITY) {
                                elems->he_cap = (void *)&pos[1];
                                elems->he_cap_len = elen - 1;