Commit 55ebd6e6 authored by Emmanuel Grumbach's avatar Emmanuel Grumbach Committed by Johannes Berg

mac80211: propagate the support for TWT to the driver

TWT is a feature that was added in 11ah and enhanced in
11ax. There are two bits that need to be set if we want
to use the feature in 11ax: one in the HE Capability IE
and one in the Extended Capability IE. This is because
of backward compatibility between 11ah and 11ax.

In order to simplify the flow for the low level driver
in managed mode, aggregate the two bits and add a boolean
that tells whether TWT is supported or not, but only if
11ax is supported.
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent fdb313e3
...@@ -496,6 +496,8 @@ struct ieee80211_ftm_responder_params { ...@@ -496,6 +496,8 @@ struct ieee80211_ftm_responder_params {
* @uora_ocw_range: UORA element's OCW Range field * @uora_ocw_range: UORA element's OCW Range field
* @frame_time_rts_th: HE duration RTS threshold, in units of 32us * @frame_time_rts_th: HE duration RTS threshold, in units of 32us
* @he_support: does this BSS support HE * @he_support: does this BSS support HE
* @twt_requester: does this BSS support TWT requester (relevant for managed
* mode only, set if the AP advertises TWT responder role)
* @assoc: association status * @assoc: association status
* @ibss_joined: indicates whether this station is part of an IBSS * @ibss_joined: indicates whether this station is part of an IBSS
* or not * or not
...@@ -594,6 +596,7 @@ struct ieee80211_bss_conf { ...@@ -594,6 +596,7 @@ struct ieee80211_bss_conf {
u8 uora_ocw_range; u8 uora_ocw_range;
u16 frame_time_rts_th; u16 frame_time_rts_th;
bool he_support; bool he_support;
bool twt_requester;
/* association related data */ /* association related data */
bool assoc, ibss_joined; bool assoc, ibss_joined;
bool ibss_creator; bool ibss_creator;
......
...@@ -3058,6 +3058,19 @@ static void ieee80211_get_rates(struct ieee80211_supported_band *sband, ...@@ -3058,6 +3058,19 @@ static void ieee80211_get_rates(struct ieee80211_supported_band *sband,
} }
} }
static bool ieee80211_twt_req_supported(const struct sta_info *sta,
const struct ieee802_11_elems *elems)
{
if (elems->ext_capab_len < 10)
return false;
if (!(elems->ext_capab[9] & WLAN_EXT_CAPA10_TWT_RESPONDER_SUPPORT))
return false;
return sta->sta.he_cap.he_cap_elem.mac_cap_info[0] &
IEEE80211_HE_MAC_CAP0_TWT_RES;
}
static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
struct cfg80211_bss *cbss, struct cfg80211_bss *cbss,
struct ieee80211_mgmt *mgmt, size_t len) struct ieee80211_mgmt *mgmt, size_t len)
...@@ -3247,8 +3260,11 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, ...@@ -3247,8 +3260,11 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
sta); sta);
bss_conf->he_support = sta->sta.he_cap.has_he; bss_conf->he_support = sta->sta.he_cap.has_he;
bss_conf->twt_requester =
ieee80211_twt_req_supported(sta, &elems);
} else { } else {
bss_conf->he_support = false; bss_conf->he_support = false;
bss_conf->twt_requester = false;
} }
if (bss_conf->he_support) { if (bss_conf->he_support) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment