]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mac80211: parse all TTLM entries
authorBenjamin Berg <benjamin.berg@intel.com>
Sun, 18 Jan 2026 07:51:13 +0000 (09:51 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 20 Jan 2026 09:02:01 +0000 (10:02 +0100)
For the follow up patch, we need to properly parse TTLM entries that do
not have a switch time. Change the logic so that ieee80211_parse_adv_t2l
returns usable values in all non-error cases. Before the values filled
in were technically incorrect but enough for ieee80211_process_adv_ttlm.

Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Reviewed-by: Ilan Peer <ilan.peer@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20260118093904.ccd324e2dd59.I69f0bee0a22e9b11bb95beef313e305dab17c051@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/mlme.c

index ad53dedd929c2c577cd95de74d7a51e0e229e04b..3f6bbe4e0175405c8c581bbbe53b277a8e3e50bc 100644 (file)
@@ -7015,10 +7015,6 @@ ieee80211_parse_adv_t2l(struct ieee80211_sub_if_data *sdata,
        pos = (void *)ttlm->optional;
        control = ttlm->control;
 
-       if ((control & IEEE80211_TTLM_CONTROL_DEF_LINK_MAP) ||
-           !(control & IEEE80211_TTLM_CONTROL_SWITCH_TIME_PRESENT))
-               return 0;
-
        if ((control & IEEE80211_TTLM_CONTROL_DIRECTION) !=
            IEEE80211_TTLM_DIRECTION_BOTH) {
                sdata_info(sdata, "Invalid advertised T2L map direction\n");
@@ -7028,21 +7024,28 @@ ieee80211_parse_adv_t2l(struct ieee80211_sub_if_data *sdata,
        link_map_presence = *pos;
        pos++;
 
-       ttlm_info->switch_time = get_unaligned_le16(pos);
+       if (control & IEEE80211_TTLM_CONTROL_SWITCH_TIME_PRESENT) {
+               ttlm_info->switch_time = get_unaligned_le16(pos);
 
-       /* Since ttlm_info->switch_time == 0 means no switch time, bump it
-        * by 1.
-        */
-       if (!ttlm_info->switch_time)
-               ttlm_info->switch_time = 1;
+               /* Since ttlm_info->switch_time == 0 means no switch time, bump
+                * it by 1.
+                */
+               if (!ttlm_info->switch_time)
+                       ttlm_info->switch_time = 1;
 
-       pos += 2;
+               pos += 2;
+       }
 
        if (control & IEEE80211_TTLM_CONTROL_EXPECTED_DUR_PRESENT) {
                ttlm_info->duration = pos[0] | pos[1] << 8 | pos[2] << 16;
                pos += 3;
        }
 
+       if (control & IEEE80211_TTLM_CONTROL_DEF_LINK_MAP) {
+               ttlm_info->map = 0xffff;
+               return 0;
+       }
+
        if (control & IEEE80211_TTLM_CONTROL_LINK_MAP_SIZE)
                map_size = 1;
        else