]> git.baikalelectronics.ru Git - kernel.git/commitdiff
wifi: mac80211: add API to parse multi-link element
authorJohannes Berg <johannes.berg@intel.com>
Thu, 30 Jun 2022 11:48:22 +0000 (13:48 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 15 Jul 2022 09:43:24 +0000 (11:43 +0200)
Add the necessary API to parse the multi-link element in
the future. For now, link only to the element when found
so we can use it in the client-side code later.

Later, we'll need to fill this in to deal with element
fragmentation, parse the STA profile, etc.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/ieee80211_i.h
net/mac80211/util.c

index baaff4c7a79c3bdd3dfae32c87a005f3ef5dcd75..cb5b3f9a7d065760adbc832525cb9c669b642ac2 100644 (file)
@@ -1658,6 +1658,7 @@ struct ieee802_11_elems {
        const struct ieee80211_aid_response_ie *aid_resp;
        const struct ieee80211_eht_cap_elem *eht_cap;
        const struct ieee80211_eht_operation *eht_operation;
+       const struct ieee80211_multi_link_elem *multi_link;
 
        /* length of them, respectively */
        u8 ext_capab_len;
@@ -2161,6 +2162,8 @@ static inline void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata,
  * @bss: the BSS to parse this as, for multi-BSSID cases this can
  *     represent a non-transmitting BSS in which case the data
  *     for that non-transmitting BSS is returned
+ * @link_id: the link ID to parse elements for, if a STA profile
+ *     is present in the multi-link element, or -1 to ignore
  */
 struct ieee80211_elems_parse_params {
        const u8 *start;
@@ -2169,6 +2172,7 @@ struct ieee80211_elems_parse_params {
        u64 filter;
        u32 crc;
        struct cfg80211_bss *bss;
+       int link_id;
 };
 
 struct ieee802_11_elems *
@@ -2186,6 +2190,7 @@ ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
                .filter = filter,
                .crc = crc,
                .bss = bss,
+               .link_id = -1,
        };
 
        return ieee802_11_parse_elems_full(&params);
index fc66b292b1c0a9a0a8107e72cf992478fba6357b..53826c66372320fd8580f1f689c9ea56d6ac792a 100644 (file)
@@ -1022,6 +1022,10 @@ static void ieee80211_parse_extension_element(u32 *crc,
                if (ieee80211_eht_oper_size_ok(data, len))
                        elems->eht_operation = data;
                break;
+       case WLAN_EID_EXT_EHT_MULTI_LINK:
+               if (ieee80211_mle_size_ok(data, len))
+                       elems->multi_link = (void *)data;
+               break;
        }
 }
 
@@ -1524,6 +1528,7 @@ ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params)
                        .start = nontransmitted_profile,
                        .len = nontransmitted_profile_len,
                        .action = params->action,
+                       .link_id = params->link_id,
                };
 
                _ieee802_11_parse_elems_full(&sub, elems, NULL);