Commit ca41bfe3 authored by Johannes Berg's avatar Johannes Berg

wifi: mac80211: refactor channel checks

To later introduce an override for VLP APs being allowed despite
NO-IR flags, which is somewhat similar in construction to being
allowed to monitor on disabled channels, refactor the code that
checks channel flags to have not a 'monitor' argument but a set
of 'permitting' flags that permit the operation without checking
for 'prohibited' flags.
Reviewed-by: default avatarMiriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
Reviewed-by: default avatarIlan Peer <ilan.peer@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Link: https://msgid.link/20240523120945.3da28ded4a50.I90cffc633d0510293d511f60097dc75e719b55f0@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 0a9314ad
...@@ -1145,7 +1145,8 @@ EXPORT_SYMBOL(cfg80211_chandef_dfs_cac_time); ...@@ -1145,7 +1145,8 @@ EXPORT_SYMBOL(cfg80211_chandef_dfs_cac_time);
static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy, static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy,
u32 center_freq, u32 bandwidth, u32 center_freq, u32 bandwidth,
u32 prohibited_flags, bool monitor) u32 prohibited_flags,
u32 permitting_flags)
{ {
struct ieee80211_channel *c; struct ieee80211_channel *c;
u32 freq, start_freq, end_freq; u32 freq, start_freq, end_freq;
...@@ -1157,7 +1158,7 @@ static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy, ...@@ -1157,7 +1158,7 @@ static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy,
c = ieee80211_get_channel_khz(wiphy, freq); c = ieee80211_get_channel_khz(wiphy, freq);
if (!c) if (!c)
return false; return false;
if (monitor && c->flags & IEEE80211_CHAN_CAN_MONITOR) if (c->flags & permitting_flags)
continue; continue;
if (c->flags & prohibited_flags) if (c->flags & prohibited_flags)
return false; return false;
...@@ -1221,7 +1222,8 @@ static bool cfg80211_edmg_usable(struct wiphy *wiphy, u8 edmg_channels, ...@@ -1221,7 +1222,8 @@ static bool cfg80211_edmg_usable(struct wiphy *wiphy, u8 edmg_channels,
bool _cfg80211_chandef_usable(struct wiphy *wiphy, bool _cfg80211_chandef_usable(struct wiphy *wiphy,
const struct cfg80211_chan_def *chandef, const struct cfg80211_chan_def *chandef,
u32 prohibited_flags, bool monitor) u32 prohibited_flags,
u32 permitting_flags)
{ {
struct ieee80211_sta_ht_cap *ht_cap; struct ieee80211_sta_ht_cap *ht_cap;
struct ieee80211_sta_vht_cap *vht_cap; struct ieee80211_sta_vht_cap *vht_cap;
...@@ -1383,22 +1385,23 @@ bool _cfg80211_chandef_usable(struct wiphy *wiphy, ...@@ -1383,22 +1385,23 @@ bool _cfg80211_chandef_usable(struct wiphy *wiphy,
if (!cfg80211_secondary_chans_ok(wiphy, if (!cfg80211_secondary_chans_ok(wiphy,
ieee80211_chandef_to_khz(chandef), ieee80211_chandef_to_khz(chandef),
width, prohibited_flags, monitor)) width, prohibited_flags,
permitting_flags))
return false; return false;
if (!chandef->center_freq2) if (!chandef->center_freq2)
return true; return true;
return cfg80211_secondary_chans_ok(wiphy, return cfg80211_secondary_chans_ok(wiphy,
MHZ_TO_KHZ(chandef->center_freq2), MHZ_TO_KHZ(chandef->center_freq2),
width, prohibited_flags, monitor); width, prohibited_flags,
permitting_flags);
} }
bool cfg80211_chandef_usable(struct wiphy *wiphy, bool cfg80211_chandef_usable(struct wiphy *wiphy,
const struct cfg80211_chan_def *chandef, const struct cfg80211_chan_def *chandef,
u32 prohibited_flags) u32 prohibited_flags)
{ {
return _cfg80211_chandef_usable(wiphy, chandef, prohibited_flags, return _cfg80211_chandef_usable(wiphy, chandef, prohibited_flags, 0);
false);
} }
EXPORT_SYMBOL(cfg80211_chandef_usable); EXPORT_SYMBOL(cfg80211_chandef_usable);
...@@ -1541,7 +1544,7 @@ static bool _cfg80211_reg_can_beacon(struct wiphy *wiphy, ...@@ -1541,7 +1544,7 @@ static bool _cfg80211_reg_can_beacon(struct wiphy *wiphy,
prohibited_flags = IEEE80211_CHAN_DISABLED; prohibited_flags = IEEE80211_CHAN_DISABLED;
} }
res = cfg80211_chandef_usable(wiphy, chandef, prohibited_flags); res = _cfg80211_chandef_usable(wiphy, chandef, prohibited_flags, 0);
trace_cfg80211_return_bool(res); trace_cfg80211_return_bool(res);
return res; return res;
......
...@@ -494,7 +494,8 @@ bool cfg80211_wdev_on_sub_chan(struct wireless_dev *wdev, ...@@ -494,7 +494,8 @@ bool cfg80211_wdev_on_sub_chan(struct wireless_dev *wdev,
bool primary_only); bool primary_only);
bool _cfg80211_chandef_usable(struct wiphy *wiphy, bool _cfg80211_chandef_usable(struct wiphy *wiphy,
const struct cfg80211_chan_def *chandef, const struct cfg80211_chan_def *chandef,
u32 prohibited_flags, bool monitor); u32 prohibited_flags,
u32 permitting_flags);
static inline unsigned int elapsed_jiffies_msecs(unsigned long start) static inline unsigned int elapsed_jiffies_msecs(unsigned long start)
{ {
......
...@@ -3347,7 +3347,7 @@ static int _nl80211_parse_chandef(struct cfg80211_registered_device *rdev, ...@@ -3347,7 +3347,7 @@ static int _nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
if (!_cfg80211_chandef_usable(&rdev->wiphy, chandef, if (!_cfg80211_chandef_usable(&rdev->wiphy, chandef,
IEEE80211_CHAN_DISABLED, IEEE80211_CHAN_DISABLED,
monitor)) { monitor ? IEEE80211_CHAN_CAN_MONITOR : 0)) {
NL_SET_ERR_MSG(extack, "(extension) channel is disabled"); NL_SET_ERR_MSG(extack, "(extension) channel is disabled");
return -EINVAL; return -EINVAL;
} }
......
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