]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: mac80211: Support parsing EPCS ML element
authorIlan Peer <ilan.peer@intel.com>
Thu, 2 Jan 2025 14:20:01 +0000 (16:20 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 13 Jan 2025 14:34:09 +0000 (15:34 +0100)
Add support for parsing an ML element of type EPCS priority
access, which can optionally be included in EHT protected action
frames used to configure EPCS.

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250102161730.5afdf65cff46.I0ffa30b40fbad47bc5b608b5fd46047a8c44e904@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/ieee80211_i.h
net/mac80211/parse.c

index e78dd8b8004259bbcc97b9b5b2b178e7b58d7479..e7dc3f0cfc9a9aa8e5ba228515f13342b8d90118 100644 (file)
@@ -1762,6 +1762,7 @@ struct ieee802_11_elems {
        const struct ieee80211_eht_operation *eht_operation;
        const struct ieee80211_multi_link_elem *ml_basic;
        const struct ieee80211_multi_link_elem *ml_reconf;
+       const struct ieee80211_multi_link_elem *ml_epcs;
        const struct ieee80211_bandwidth_indication *bandwidth_indication;
        const struct ieee80211_ttlm_elem *ttlm[IEEE80211_TTLM_MAX_CNT];
 
@@ -1792,6 +1793,7 @@ 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;
+       size_t ml_epcs_len;
 
        u8 ttlm_num;
 
index 279c5143b3356dcc03011f25d1de276d7876b766..cd318c1c67bec657f09eca4345476e431382e92a 100644 (file)
@@ -44,6 +44,9 @@ struct ieee80211_elems_parse {
        /* The reconfiguration Multi-Link element in the original elements */
        const struct element *ml_reconf_elem;
 
+       /* The EPCS Multi-Link element in the original elements */
+       const struct element *ml_epcs_elem;
+
        /*
         * scratch buffer that can be used for various element parsing related
         * tasks, e.g., element de-fragmentation etc.
@@ -159,6 +162,9 @@ ieee80211_parse_extension_element(u32 *crc,
                        case IEEE80211_ML_CONTROL_TYPE_RECONF:
                                elems_parse->ml_reconf_elem = elem;
                                break;
+                       case IEEE80211_ML_CONTROL_TYPE_PRIO_ACCESS:
+                               elems_parse->ml_epcs_elem = elem;
+                               break;
                        default:
                                break;
                        }
@@ -943,6 +949,27 @@ ieee80211_mle_defrag_reconf(struct ieee80211_elems_parse *elems_parse)
        elems_parse->scratch_pos += ml_len;
 }
 
+static void
+ieee80211_mle_defrag_epcs(struct ieee80211_elems_parse *elems_parse)
+{
+       struct ieee802_11_elems *elems = &elems_parse->elems;
+       ssize_t ml_len;
+
+       ml_len = cfg80211_defragment_element(elems_parse->ml_epcs_elem,
+                                            elems->ie_start,
+                                            elems->total_len,
+                                            elems_parse->scratch_pos,
+                                            elems_parse->scratch +
+                                               elems_parse->scratch_len -
+                                               elems_parse->scratch_pos,
+                                            WLAN_EID_FRAGMENT);
+       if (ml_len < 0)
+               return;
+       elems->ml_epcs = (void *)elems_parse->scratch_pos;
+       elems->ml_epcs_len = ml_len;
+       elems_parse->scratch_pos += ml_len;
+}
+
 struct ieee802_11_elems *
 ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params)
 {
@@ -1001,6 +1028,8 @@ ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params)
 
        ieee80211_mle_defrag_reconf(elems_parse);
 
+       ieee80211_mle_defrag_epcs(elems_parse);
+
        if (elems->tim && !elems->parse_error) {
                const struct ieee80211_tim_ie *tim_ie = elems->tim;