summaryrefslogtreecommitdiff
path: root/net/mac80211/mlme.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2024-01-29 19:34:45 +0100
committerJohannes Berg <johannes.berg@intel.com>2024-02-08 13:07:37 +0100
commitc478db84c8544156b80c5e5d3a8c7840d557707a (patch)
treee9ffa13e0cb0a7c39e306a45add53b6ffec47492 /net/mac80211/mlme.c
parent719036ae06d4bfdb65139e3947a8404dec298bc5 (diff)
wifi: mac80211: refactor puncturing bitmap extraction
Add a new inline helper function to ieee80211.h to extract the disabled subchannels bitmap from an EHT operation element, and use that in mac80211 where we do that. Link: https://msgid.link/20240129194108.d9f50dcec8d0.I8b08cbc2490a734fafcce0fa0fc328211ba6f10b@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/mlme.c')
-rw-r--r--net/mac80211/mlme.c52
1 files changed, 17 insertions, 35 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index da202103faf0..74a15f18e7ee 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -813,36 +813,27 @@ again:
}
if (conn->mode >= IEEE80211_CONN_MODE_EHT) {
- const struct ieee80211_eht_operation *eht_oper;
+ u16 bitmap;
- eht_oper = elems->eht_operation;
-
- if (WARN_ON_ONCE(!eht_oper)) {
+ if (WARN_ON_ONCE(!elems->eht_operation)) {
ret = -EINVAL;
goto free;
}
- if (eht_oper->params & IEEE80211_EHT_OPER_INFO_PRESENT &&
- eht_oper->params & IEEE80211_EHT_OPER_DISABLED_SUBCHANNEL_BITMAP_PRESENT) {
- const struct ieee80211_eht_operation_info *info =
- (void *)eht_oper->optional;
- const u8 *disable_subchannel_bitmap = info->optional;
- u16 bitmap;
-
- bitmap = get_unaligned_le16(disable_subchannel_bitmap);
- if (!cfg80211_valid_disable_subchannel_bitmap(&bitmap,
- &ap_chandef) ||
- (bitmap &&
- ieee80211_hw_check(&local->hw, DISALLOW_PUNCTURING))) {
- conn->mode = IEEE80211_CONN_MODE_HE;
- conn->bw_limit = min_t(enum ieee80211_conn_bw_limit,
- conn->bw_limit,
- IEEE80211_CONN_BW_LIMIT_160);
- sdata_info(sdata,
- "AP has invalid/unsupported puncturing, disabling EHT\n");
- }
- /* FIXME: store puncturing bitmap */
+ bitmap = ieee80211_eht_oper_dis_subchan_bitmap(elems->eht_operation);
+
+ if (!cfg80211_valid_disable_subchannel_bitmap(&bitmap,
+ &ap_chandef) ||
+ (bitmap &&
+ ieee80211_hw_check(&local->hw, DISALLOW_PUNCTURING))) {
+ conn->mode = IEEE80211_CONN_MODE_HE;
+ conn->bw_limit = min_t(enum ieee80211_conn_bw_limit,
+ conn->bw_limit,
+ IEEE80211_CONN_BW_LIMIT_160);
+ sdata_info(sdata,
+ "AP has invalid/unsupported puncturing, disabling EHT\n");
}
+ /* FIXME: store puncturing bitmap */
}
/* the mode can only decrease, so this must terminate */
@@ -5879,18 +5870,9 @@ static bool ieee80211_config_puncturing(struct ieee80211_link_data *link,
u64 *changed)
{
struct ieee80211_local *local = link->sdata->local;
- u16 bitmap = 0, extracted;
-
- if ((eht_oper->params & IEEE80211_EHT_OPER_INFO_PRESENT) &&
- (eht_oper->params &
- IEEE80211_EHT_OPER_DISABLED_SUBCHANNEL_BITMAP_PRESENT)) {
- const struct ieee80211_eht_operation_info *info =
- (void *)eht_oper->optional;
- const u8 *disable_subchannel_bitmap = info->optional;
-
- bitmap = get_unaligned_le16(disable_subchannel_bitmap);
- }
+ u16 bitmap, extracted;
+ bitmap = ieee80211_eht_oper_dis_subchan_bitmap(eht_oper);
extracted = ieee80211_extract_dis_subch_bmap(eht_oper,
&link->conf->chanreq.oper,
bitmap);