]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
wifi: mac80211: refactor channel checks
authorJohannes Berg <johannes.berg@intel.com>
Thu, 23 May 2024 10:09:46 +0000 (12:09 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 12 Jun 2024 11:04:25 +0000 (13:04 +0200)
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: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
Reviewed-by: Ilan Peer <ilan.peer@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Link: https://msgid.link/20240523120945.3da28ded4a50.I90cffc633d0510293d511f60097dc75e719b55f0@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/wireless/chan.c
net/wireless/core.h
net/wireless/nl80211.c

index 3414b2c3abcc543fdb8c643ac8e46c2bf5208f11..36048060451543dcfcefc7bd73925c43535e066b 100644 (file)
@@ -1145,7 +1145,8 @@ EXPORT_SYMBOL(cfg80211_chandef_dfs_cac_time);
 
 static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy,
                                        u32 center_freq, u32 bandwidth,
-                                       u32 prohibited_flags, bool monitor)
+                                       u32 prohibited_flags,
+                                       u32 permitting_flags)
 {
        struct ieee80211_channel *c;
        u32 freq, start_freq, end_freq;
@@ -1157,7 +1158,7 @@ static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy,
                c = ieee80211_get_channel_khz(wiphy, freq);
                if (!c)
                        return false;
-               if (monitor && c->flags & IEEE80211_CHAN_CAN_MONITOR)
+               if (c->flags & permitting_flags)
                        continue;
                if (c->flags & prohibited_flags)
                        return false;
@@ -1221,7 +1222,8 @@ static bool cfg80211_edmg_usable(struct wiphy *wiphy, u8 edmg_channels,
 
 bool _cfg80211_chandef_usable(struct wiphy *wiphy,
                              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_vht_cap *vht_cap;
@@ -1383,22 +1385,23 @@ bool _cfg80211_chandef_usable(struct wiphy *wiphy,
 
        if (!cfg80211_secondary_chans_ok(wiphy,
                                         ieee80211_chandef_to_khz(chandef),
-                                        width, prohibited_flags, monitor))
+                                        width, prohibited_flags,
+                                        permitting_flags))
                return false;
 
        if (!chandef->center_freq2)
                return true;
        return cfg80211_secondary_chans_ok(wiphy,
                                           MHZ_TO_KHZ(chandef->center_freq2),
-                                          width, prohibited_flags, monitor);
+                                          width, prohibited_flags,
+                                          permitting_flags);
 }
 
 bool cfg80211_chandef_usable(struct wiphy *wiphy,
                             const struct cfg80211_chan_def *chandef,
                             u32 prohibited_flags)
 {
-       return _cfg80211_chandef_usable(wiphy, chandef, prohibited_flags,
-                                       false);
+       return _cfg80211_chandef_usable(wiphy, chandef, prohibited_flags, 0);
 }
 EXPORT_SYMBOL(cfg80211_chandef_usable);
 
@@ -1541,7 +1544,7 @@ static bool _cfg80211_reg_can_beacon(struct wiphy *wiphy,
                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);
        return res;
index 118f2f6198289353241b9caf4f5bea1aa17cb634..470a18dc4cbf06aa159b5fe5f667203207998f61 100644 (file)
@@ -494,7 +494,8 @@ bool cfg80211_wdev_on_sub_chan(struct wireless_dev *wdev,
                               bool primary_only);
 bool _cfg80211_chandef_usable(struct wiphy *wiphy,
                              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)
 {
index fd6e33a1eb2a6a86d5ecf769e8bb48f32a948f14..4628280abf1daaecea93083fa933d1281cd0e624 100644 (file)
@@ -3347,7 +3347,7 @@ static int _nl80211_parse_chandef(struct cfg80211_registered_device *rdev,
 
        if (!_cfg80211_chandef_usable(&rdev->wiphy, chandef,
                                      IEEE80211_CHAN_DISABLED,
-                                     monitor)) {
+                                     monitor ? IEEE80211_CHAN_CAN_MONITOR : 0)) {
                NL_SET_ERR_MSG(extack, "(extension) channel is disabled");
                return -EINVAL;
        }