Commit 8bc65d38 authored by Aloka Dixit's avatar Aloka Dixit Committed by Johannes Berg

wifi: nl80211: retrieve EHT related elements in AP mode

Add support to retrieve EHT capabilities and EHT operation elements
passed by the userspace in the beacon template and store the pointers
in struct cfg80211_ap_settings to be used by the drivers.
Co-developed-by: default avatarVikram Kandukuri <quic_vikram@quicinc.com>
Signed-off-by: default avatarVikram Kandukuri <quic_vikram@quicinc.com>
Co-developed-by: default avatarVeerendranath Jakkam <quic_vjakkam@quicinc.com>
Signed-off-by: default avatarVeerendranath Jakkam <quic_vjakkam@quicinc.com>
Signed-off-by: default avatarAloka Dixit <quic_alokad@quicinc.com>
Link: https://lore.kernel.org/r/20220523064904.28523-1-quic_alokad@quicinc.comSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent ecad3b0b
...@@ -1296,6 +1296,8 @@ struct cfg80211_unsol_bcast_probe_resp { ...@@ -1296,6 +1296,8 @@ struct cfg80211_unsol_bcast_probe_resp {
* @ht_cap: HT capabilities (or %NULL if HT isn't enabled) * @ht_cap: HT capabilities (or %NULL if HT isn't enabled)
* @vht_cap: VHT capabilities (or %NULL if VHT isn't enabled) * @vht_cap: VHT capabilities (or %NULL if VHT isn't enabled)
* @he_cap: HE capabilities (or %NULL if HE isn't enabled) * @he_cap: HE capabilities (or %NULL if HE isn't enabled)
* @eht_cap: EHT capabilities (or %NULL if EHT isn't enabled)
* @eht_oper: EHT operation IE (or %NULL if EHT isn't enabled)
* @ht_required: stations must support HT * @ht_required: stations must support HT
* @vht_required: stations must support VHT * @vht_required: stations must support VHT
* @twt_responder: Enable Target Wait Time * @twt_responder: Enable Target Wait Time
...@@ -1332,6 +1334,8 @@ struct cfg80211_ap_settings { ...@@ -1332,6 +1334,8 @@ struct cfg80211_ap_settings {
const struct ieee80211_vht_cap *vht_cap; const struct ieee80211_vht_cap *vht_cap;
const struct ieee80211_he_cap_elem *he_cap; const struct ieee80211_he_cap_elem *he_cap;
const struct ieee80211_he_operation *he_oper; const struct ieee80211_he_operation *he_oper;
const struct ieee80211_eht_cap_elem *eht_cap;
const struct ieee80211_eht_operation *eht_oper;
bool ht_required, vht_required, he_required, sae_h2e_required; bool ht_required, vht_required, he_required, sae_h2e_required;
bool twt_responder; bool twt_responder;
u32 flags; u32 flags;
......
...@@ -5522,7 +5522,7 @@ static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params, ...@@ -5522,7 +5522,7 @@ static void nl80211_check_ap_rate_selectors(struct cfg80211_ap_settings *params,
* HT/VHT requirements/capabilities, we parse them out of the IEs for the * HT/VHT requirements/capabilities, we parse them out of the IEs for the
* benefit of drivers that rebuild IEs in the firmware. * benefit of drivers that rebuild IEs in the firmware.
*/ */
static void nl80211_calculate_ap_params(struct cfg80211_ap_settings *params) static int nl80211_calculate_ap_params(struct cfg80211_ap_settings *params)
{ {
const struct cfg80211_beacon_data *bcn = &params->beacon; const struct cfg80211_beacon_data *bcn = &params->beacon;
size_t ies_len = bcn->tail_len; size_t ies_len = bcn->tail_len;
...@@ -5548,6 +5548,26 @@ static void nl80211_calculate_ap_params(struct cfg80211_ap_settings *params) ...@@ -5548,6 +5548,26 @@ static void nl80211_calculate_ap_params(struct cfg80211_ap_settings *params)
cap = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ies, ies_len); cap = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ies, ies_len);
if (cap && cap->datalen >= sizeof(*params->he_oper) + 1) if (cap && cap->datalen >= sizeof(*params->he_oper) + 1)
params->he_oper = (void *)(cap->data + 1); params->he_oper = (void *)(cap->data + 1);
cap = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_CAPABILITY, ies, ies_len);
if (cap) {
if (!cap->datalen)
return -EINVAL;
params->eht_cap = (void *)(cap->data + 1);
if (!ieee80211_eht_capa_size_ok((const u8 *)params->he_cap,
(const u8 *)params->eht_cap,
cap->datalen - 1))
return -EINVAL;
}
cap = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_OPERATION, ies, ies_len);
if (cap) {
if (!cap->datalen)
return -EINVAL;
params->eht_oper = (void *)(cap->data + 1);
if (!ieee80211_eht_oper_size_ok((const u8 *)params->eht_oper,
cap->datalen - 1))
return -EINVAL;
}
return 0;
} }
static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev, static bool nl80211_get_ap_channel(struct cfg80211_registered_device *rdev,
...@@ -5873,7 +5893,9 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) ...@@ -5873,7 +5893,9 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
goto out_unlock; goto out_unlock;
} }
nl80211_calculate_ap_params(params); err = nl80211_calculate_ap_params(params);
if (err)
goto out_unlock;
if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]) if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS])
params->flags = nla_get_u32( params->flags = nla_get_u32(
......
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