wifi: mac80211: Add support for parsing Reconfiguration Multi Link element
authorIlan Peer <ilan.peer@intel.com>
Fri, 16 Jun 2023 06:54:08 +0000 (09:54 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 19 Jun 2023 10:05:29 +0000 (12:05 +0200)
Parse Reconfiguration Multi Link IE.

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230616094949.6eeb6c9a4a6e.I1cb137da9b3c712fc7c7949a6dec9e314b5d7f63@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/ieee80211_i.h
net/mac80211/util.c

index 554aeb2..be32947 100644 (file)
@@ -1727,6 +1727,7 @@ struct ieee802_11_elems {
        const struct ieee80211_eht_cap_elem *eht_cap;
        const struct ieee80211_eht_operation *eht_operation;
        const struct ieee80211_multi_link_elem *ml_basic;
+       const struct ieee80211_multi_link_elem *ml_reconf;
 
        /* length of them, respectively */
        u8 ext_capab_len;
@@ -1752,10 +1753,14 @@ struct ieee802_11_elems {
 
        /* mult-link element can be de-fragmented and thus u8 is not sufficient */
        size_t ml_basic_len;
+       size_t ml_reconf_len;
 
        /* The basic Multi-Link element in the original IEs */
        const struct element *ml_basic_elem;
 
+       /* The reconfiguration Multi-Link element in the original IEs */
+       const struct element *ml_reconf_elem;
+
        /*
         * store the per station profile pointer and length in case that the
         * parsing also handled Multi-Link element parsing for a specific link
index 8658c28..8da6bc4 100644 (file)
@@ -984,9 +984,24 @@ ieee80211_parse_extension_element(u32 *crc,
                break;
        case WLAN_EID_EXT_EHT_MULTI_LINK:
                if (ieee80211_mle_size_ok(data, len)) {
-                       elems->ml_basic_elem = (void *)elem;
-                       elems->ml_basic = (void *)data;
-                       elems->ml_basic_len = len;
+                       const struct ieee80211_multi_link_elem *mle =
+                               (void *)data;
+
+                       switch (le16_get_bits(mle->control,
+                                             IEEE80211_ML_CONTROL_TYPE)) {
+                       case IEEE80211_ML_CONTROL_TYPE_BASIC:
+                               elems->ml_basic_elem = (void *)elem;
+                               elems->ml_basic = data;
+                               elems->ml_basic_len = len;
+                               break;
+                       case IEEE80211_ML_CONTROL_TYPE_RECONF:
+                               elems->ml_reconf_elem = (void *)elem;
+                               elems->ml_reconf = data;
+                               elems->ml_reconf_len = len;
+                               break;
+                       default:
+                               break;
+                       }
                }
                break;
        }