mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-20 07:09:58 +00:00
wifi: mac80211: add support for parsing TID to Link mapping element
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>
This commit is contained in:
parent
f605d10ad1
commit
62e9c64eed
@ -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, \
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user