wifi: mac80211: add support for parsing TID to Link mapping element
authorAyala Beker <ayala.beker@intel.com>
Wed, 20 Sep 2023 18:25:24 +0000 (21:25 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 25 Sep 2023 07:12:34 +0000 (09:12 +0200)
Add the relevant definitions for TID to Link mapping element
according to the P802.11be_D4.0.

Signed-off-by: Ayala Beker <ayala.beker@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230920211508.9ea9b0b4412a.I2281ab2c70e8b43a39032dc115db6a80f1f0b3f4@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/linux/ieee80211.h
net/mac80211/ieee80211_i.h
net/mac80211/util.c

index f11b7022d9ebc47860c3f171695517fb2d5a928c..f2965ff3d7c156c7fb79a26453720bd9cb981792 100644 (file)
@@ -1246,6 +1246,30 @@ struct ieee80211_twt_setup {
        u8 params[];
 } __packed;
 
+#define IEEE80211_TTLM_MAX_CNT                         2
+#define IEEE80211_TTLM_CONTROL_DIRECTION               0x03
+#define IEEE80211_TTLM_CONTROL_DEF_LINK_MAP            0x04
+#define IEEE80211_TTLM_CONTROL_SWITCH_TIME_PRESENT     0x08
+#define IEEE80211_TTLM_CONTROL_EXPECTED_DUR_PRESENT    0x10
+#define IEEE80211_TTLM_CONTROL_LINK_MAP_SIZE           0x20
+
+#define IEEE80211_TTLM_DIRECTION_DOWN          0
+#define IEEE80211_TTLM_DIRECTION_UP            1
+#define IEEE80211_TTLM_DIRECTION_BOTH          2
+
+/**
+ * struct ieee80211_ttlm_elem - TID-To-Link Mapping element
+ *
+ * Defined in section 9.4.2.314 in P802.11be_D4
+ *
+ * @control: the first part of control field
+ * @optional: the second part of control field
+ */
+struct ieee80211_ttlm_elem {
+       u8 control;
+       u8 optional[];
+} __packed;
+
 struct ieee80211_mgmt {
        __le16 frame_control;
        __le16 duration;
@@ -3618,6 +3642,7 @@ enum ieee80211_eid_ext {
        WLAN_EID_EXT_EHT_OPERATION = 106,
        WLAN_EID_EXT_EHT_MULTI_LINK = 107,
        WLAN_EID_EXT_EHT_CAPABILITY = 108,
+       WLAN_EID_EXT_TID_TO_LINK_MAPPING = 109,
        WLAN_EID_EXT_BANDWIDTH_INDICATION = 135,
 };
 
@@ -5155,6 +5180,39 @@ static inline bool ieee80211_mle_reconf_sta_prof_size_ok(const u8 *data,
               fixed + prof->sta_info_len - 1 <= len;
 }
 
+static inline bool ieee80211_tid_to_link_map_size_ok(const u8 *data, size_t len)
+{
+       const struct ieee80211_ttlm_elem *t2l = (const void *)data;
+       u8 control, fixed = sizeof(*t2l), elem_len = 0;
+
+       if (len < fixed)
+               return false;
+
+       control = t2l->control;
+
+       if (control & IEEE80211_TTLM_CONTROL_SWITCH_TIME_PRESENT)
+               elem_len += 2;
+       if (control & IEEE80211_TTLM_CONTROL_EXPECTED_DUR_PRESENT)
+               elem_len += 3;
+
+       if (!(control & IEEE80211_TTLM_CONTROL_DEF_LINK_MAP)) {
+               u8 bm_size;
+
+               elem_len += 1;
+               if (len < fixed + elem_len)
+                       return false;
+
+               if (control & IEEE80211_TTLM_CONTROL_LINK_MAP_SIZE)
+                       bm_size = 1;
+               else
+                       bm_size = 2;
+
+               elem_len += hweight8(t2l->optional[0]) * bm_size;
+       }
+
+       return len >= fixed + elem_len;
+}
+
 #define for_each_mle_subelement(_elem, _data, _len)                    \
        if (ieee80211_mle_size_ok(_data, _len))                         \
                for_each_element(_elem,                                 \
index e7856336b5c6c8fece5a9457ce8a24d66fa93274..d1a73095c914af9c03c79f27fd2b086e4a052138 100644 (file)
@@ -1678,6 +1678,7 @@ struct ieee802_11_elems {
        const struct ieee80211_multi_link_elem *ml_basic;
        const struct ieee80211_multi_link_elem *ml_reconf;
        const struct ieee80211_bandwidth_indication *bandwidth_indication;
+       const struct ieee80211_ttlm_elem *ttlm[IEEE80211_TTLM_MAX_CNT];
 
        /* length of them, respectively */
        u8 ext_capab_len;
@@ -1711,6 +1712,8 @@ struct ieee802_11_elems {
        /* The reconfiguration Multi-Link element in the original IEs */
        const struct element *ml_reconf_elem;
 
+       u8 ttlm_num;
+
        /*
         * store the per station profile pointer and length in case that the
         * parsing also handled Multi-Link element parsing for a specific link
index 97c5823da0ebd5d34b5b990c9163c3373cc28121..98a3bffc6991e3f7bacb40105bab66c75ac2d59f 100644 (file)
@@ -995,6 +995,14 @@ ieee80211_parse_extension_element(u32 *crc,
                        elems->bandwidth_indication = data;
                calc_crc = true;
                break;
+       case WLAN_EID_EXT_TID_TO_LINK_MAPPING:
+               calc_crc = true;
+               if (ieee80211_tid_to_link_map_size_ok(data, len) &&
+                   elems->ttlm_num < ARRAY_SIZE(elems->ttlm)) {
+                       elems->ttlm[elems->ttlm_num] = (void *)data;
+                       elems->ttlm_num++;
+               }
+               break;
        }
 
        if (crc && calc_crc)