Commit 24711d60 authored by Ilan Peer's avatar Ilan Peer Committed by Johannes Berg
Browse files

wifi: mac80211: Support parsing EPCS ML element



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: default avatarIlan Peer <ilan.peer@intel.com>
Reviewed-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarMiri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250102161730.5afdf65cff46.I0ffa30b40fbad47bc5b608b5fd46047a8c44e904@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 19aa842d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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;

+29 −0
Original line number Diff line number Diff line
@@ -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;