wifi: cfg80211: refactor 6 GHz AP power type parsing
Add cfg80211_get_6ghz_power_type() to parse the 6 GHz power type from a given set of elements, which is now only inside cfg80211_6ghz_power_type_valid(). Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com> Link: https://msgid.link/20240523120945.84cdffd94085.I76f434ee12552e8be91273f3b2d776179eaa62f1@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
ca41bfe367
commit
459662e83d
2 changed files with 48 additions and 29 deletions
|
@ -533,6 +533,10 @@ struct cfg80211_internal_bss *
|
||||||
cfg80211_bss_update(struct cfg80211_registered_device *rdev,
|
cfg80211_bss_update(struct cfg80211_registered_device *rdev,
|
||||||
struct cfg80211_internal_bss *tmp,
|
struct cfg80211_internal_bss *tmp,
|
||||||
bool signal_valid, unsigned long ts);
|
bool signal_valid, unsigned long ts);
|
||||||
|
|
||||||
|
enum ieee80211_ap_reg_power
|
||||||
|
cfg80211_get_6ghz_power_type(const u8 *elems, size_t elems_len);
|
||||||
|
|
||||||
#ifdef CONFIG_CFG80211_DEVELOPER_WARNINGS
|
#ifdef CONFIG_CFG80211_DEVELOPER_WARNINGS
|
||||||
#define CFG80211_DEV_WARN_ON(cond) WARN_ON(cond)
|
#define CFG80211_DEV_WARN_ON(cond) WARN_ON(cond)
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -2163,38 +2163,53 @@ struct cfg80211_inform_single_bss_data {
|
||||||
u64 cannot_use_reasons;
|
u64 cannot_use_reasons;
|
||||||
};
|
};
|
||||||
|
|
||||||
static bool cfg80211_6ghz_power_type_valid(const u8 *ie, size_t ielen,
|
enum ieee80211_ap_reg_power
|
||||||
|
cfg80211_get_6ghz_power_type(const u8 *elems, size_t elems_len)
|
||||||
|
{
|
||||||
|
const struct ieee80211_he_6ghz_oper *he_6ghz_oper;
|
||||||
|
struct ieee80211_he_operation *he_oper;
|
||||||
|
const struct element *tmp;
|
||||||
|
|
||||||
|
tmp = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION,
|
||||||
|
elems, elems_len);
|
||||||
|
if (!tmp || tmp->datalen < sizeof(*he_oper) + 1 ||
|
||||||
|
tmp->datalen < ieee80211_he_oper_size(tmp->data + 1))
|
||||||
|
return IEEE80211_REG_UNSET_AP;
|
||||||
|
|
||||||
|
he_oper = (void *)&tmp->data[1];
|
||||||
|
he_6ghz_oper = ieee80211_he_6ghz_oper(he_oper);
|
||||||
|
|
||||||
|
if (!he_6ghz_oper)
|
||||||
|
return IEEE80211_REG_UNSET_AP;
|
||||||
|
|
||||||
|
switch (u8_get_bits(he_6ghz_oper->control,
|
||||||
|
IEEE80211_HE_6GHZ_OPER_CTRL_REG_INFO)) {
|
||||||
|
case IEEE80211_6GHZ_CTRL_REG_LPI_AP:
|
||||||
|
case IEEE80211_6GHZ_CTRL_REG_INDOOR_LPI_AP:
|
||||||
|
return IEEE80211_REG_LPI_AP;
|
||||||
|
case IEEE80211_6GHZ_CTRL_REG_SP_AP:
|
||||||
|
case IEEE80211_6GHZ_CTRL_REG_INDOOR_SP_AP:
|
||||||
|
return IEEE80211_REG_SP_AP;
|
||||||
|
case IEEE80211_6GHZ_CTRL_REG_VLP_AP:
|
||||||
|
return IEEE80211_REG_VLP_AP;
|
||||||
|
default:
|
||||||
|
return IEEE80211_REG_UNSET_AP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool cfg80211_6ghz_power_type_valid(const u8 *elems, size_t elems_len,
|
||||||
const u32 flags)
|
const u32 flags)
|
||||||
{
|
{
|
||||||
const struct element *tmp;
|
switch (cfg80211_get_6ghz_power_type(elems, elems_len)) {
|
||||||
struct ieee80211_he_operation *he_oper;
|
case IEEE80211_REG_LPI_AP:
|
||||||
|
return true;
|
||||||
tmp = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ie, ielen);
|
case IEEE80211_REG_SP_AP:
|
||||||
if (tmp && tmp->datalen >= sizeof(*he_oper) + 1 &&
|
return !(flags & IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT);
|
||||||
tmp->datalen >= ieee80211_he_oper_size(tmp->data + 1)) {
|
case IEEE80211_REG_VLP_AP:
|
||||||
const struct ieee80211_he_6ghz_oper *he_6ghz_oper;
|
return !(flags & IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT);
|
||||||
|
default:
|
||||||
he_oper = (void *)&tmp->data[1];
|
return false;
|
||||||
he_6ghz_oper = ieee80211_he_6ghz_oper(he_oper);
|
|
||||||
|
|
||||||
if (!he_6ghz_oper)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
switch (u8_get_bits(he_6ghz_oper->control,
|
|
||||||
IEEE80211_HE_6GHZ_OPER_CTRL_REG_INFO)) {
|
|
||||||
case IEEE80211_6GHZ_CTRL_REG_LPI_AP:
|
|
||||||
case IEEE80211_6GHZ_CTRL_REG_INDOOR_LPI_AP:
|
|
||||||
return true;
|
|
||||||
case IEEE80211_6GHZ_CTRL_REG_SP_AP:
|
|
||||||
case IEEE80211_6GHZ_CTRL_REG_INDOOR_SP_AP:
|
|
||||||
return !(flags & IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT);
|
|
||||||
case IEEE80211_6GHZ_CTRL_REG_VLP_AP:
|
|
||||||
return !(flags & IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT);
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returned bss is reference counted and must be cleaned up appropriately. */
|
/* Returned bss is reference counted and must be cleaned up appropriately. */
|
||||||
|
|
Loading…
Reference in a new issue