Commit 459662e8 authored by Johannes Berg's avatar Johannes Berg

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: default avatarMiriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Link: https://msgid.link/20240523120945.84cdffd94085.I76f434ee12552e8be91273f3b2d776179eaa62f1@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent ca41bfe3
...@@ -533,6 +533,10 @@ struct cfg80211_internal_bss * ...@@ -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 { ...@@ -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
const u32 flags) cfg80211_get_6ghz_power_type(const u8 *elems, size_t elems_len)
{ {
const struct element *tmp; const struct ieee80211_he_6ghz_oper *he_6ghz_oper;
struct ieee80211_he_operation *he_oper; struct ieee80211_he_operation *he_oper;
const struct element *tmp;
tmp = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION, ie, ielen); tmp = cfg80211_find_ext_elem(WLAN_EID_EXT_HE_OPERATION,
if (tmp && tmp->datalen >= sizeof(*he_oper) + 1 && elems, elems_len);
tmp->datalen >= ieee80211_he_oper_size(tmp->data + 1)) { if (!tmp || tmp->datalen < sizeof(*he_oper) + 1 ||
const struct ieee80211_he_6ghz_oper *he_6ghz_oper; 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); he_oper = (void *)&tmp->data[1];
he_6ghz_oper = ieee80211_he_6ghz_oper(he_oper);
if (!he_6ghz_oper)
return false; 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;
}
}
switch (u8_get_bits(he_6ghz_oper->control, static bool cfg80211_6ghz_power_type_valid(const u8 *elems, size_t elems_len,
IEEE80211_HE_6GHZ_OPER_CTRL_REG_INFO)) { const u32 flags)
case IEEE80211_6GHZ_CTRL_REG_LPI_AP: {
case IEEE80211_6GHZ_CTRL_REG_INDOOR_LPI_AP: switch (cfg80211_get_6ghz_power_type(elems, elems_len)) {
return true; case IEEE80211_REG_LPI_AP:
case IEEE80211_6GHZ_CTRL_REG_SP_AP: return true;
case IEEE80211_6GHZ_CTRL_REG_INDOOR_SP_AP: case IEEE80211_REG_SP_AP:
return !(flags & IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT); return !(flags & IEEE80211_CHAN_NO_6GHZ_AFC_CLIENT);
case IEEE80211_6GHZ_CTRL_REG_VLP_AP: case IEEE80211_REG_VLP_AP:
return !(flags & IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT); return !(flags & IEEE80211_CHAN_NO_6GHZ_VLP_CLIENT);
default: default:
return false; 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. */
......
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