wifi: cfg80211: refactor regulatory beaconing checking
authorJohannes Berg <johannes.berg@intel.com>
Thu, 23 May 2024 10:09:48 +0000 (12:09 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 12 Jun 2024 11:04:25 +0000 (13:04 +0200)
There are two functions exported now, with different settings,
refactor to just export a single function that take a struct
with different settings. This will make it easier to add more
parameters.

Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Link: https://msgid.link/20240523120945.d44c34dadfc2.I59b4403108e0dbf7fc6ae8f7522e1af520cffb1c@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
net/wireless/chan.c

index fb7d76513e1c1538ed2ce961b1bb26ce6f5bafb4..45ffeb110d36275ad51d14a2addf82b8612d1870 100644 (file)
@@ -8800,6 +8800,31 @@ static inline void cfg80211_report_obss_beacon(struct wiphy *wiphy,
                                        sig_dbm);
 }
 
+/**
+ * struct cfg80211_beaconing_check_config - beacon check configuration
+ * @iftype: the interface type to check for
+ * @relax: allow IR-relaxation conditions to apply (e.g. another
+ *     interface connected already on the same channel)
+ *     NOTE: If this is set, wiphy mutex must be held.
+ */
+struct cfg80211_beaconing_check_config {
+       enum nl80211_iftype iftype;
+       bool relax;
+};
+
+/**
+ * cfg80211_reg_check_beaconing - check if beaconing is allowed
+ * @wiphy: the wiphy
+ * @chandef: the channel definition
+ * @cfg: additional parameters for the checking
+ *
+ * Return: %true if there is no secondary channel or the secondary channel(s)
+ * can be used for beaconing (i.e. is not a radar channel etc.)
+ */
+bool cfg80211_reg_check_beaconing(struct wiphy *wiphy,
+                                 struct cfg80211_chan_def *chandef,
+                                 struct cfg80211_beaconing_check_config *cfg);
+
 /**
  * cfg80211_reg_can_beacon - check if beaconing is allowed
  * @wiphy: the wiphy
@@ -8809,9 +8834,17 @@ static inline void cfg80211_report_obss_beacon(struct wiphy *wiphy,
  * Return: %true if there is no secondary channel or the secondary channel(s)
  * can be used for beaconing (i.e. is not a radar channel etc.)
  */
-bool cfg80211_reg_can_beacon(struct wiphy *wiphy,
-                            struct cfg80211_chan_def *chandef,
-                            enum nl80211_iftype iftype);
+static inline bool
+cfg80211_reg_can_beacon(struct wiphy *wiphy,
+                       struct cfg80211_chan_def *chandef,
+                       enum nl80211_iftype iftype)
+{
+       struct cfg80211_beaconing_check_config config = {
+               .iftype = iftype,
+       };
+
+       return cfg80211_reg_check_beaconing(wiphy, chandef, &config);
+}
 
 /**
  * cfg80211_reg_can_beacon_relax - check if beaconing is allowed with relaxation
@@ -8826,9 +8859,18 @@ bool cfg80211_reg_can_beacon(struct wiphy *wiphy,
  *
  * Context: Requires the wiphy mutex to be held.
  */
-bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy,
-                                  struct cfg80211_chan_def *chandef,
-                                  enum nl80211_iftype iftype);
+static inline bool
+cfg80211_reg_can_beacon_relax(struct wiphy *wiphy,
+                             struct cfg80211_chan_def *chandef,
+                             enum nl80211_iftype iftype)
+{
+       struct cfg80211_beaconing_check_config config = {
+               .iftype = iftype,
+               .relax = true,
+       };
+
+       return cfg80211_reg_check_beaconing(wiphy, chandef, &config);
+}
 
 /**
  * cfg80211_ch_switch_notify - update wdev channel and notify userspace
index 36048060451543dcfcefc7bd73925c43535e066b..8b1796130b283d7c2f0349381958e0a1e60956d4 100644 (file)
@@ -1550,22 +1550,12 @@ static bool _cfg80211_reg_can_beacon(struct wiphy *wiphy,
        return res;
 }
 
-bool cfg80211_reg_can_beacon(struct wiphy *wiphy,
-                            struct cfg80211_chan_def *chandef,
-                            enum nl80211_iftype iftype)
-{
-       return _cfg80211_reg_can_beacon(wiphy, chandef, iftype, true);
-}
-EXPORT_SYMBOL(cfg80211_reg_can_beacon);
-
-bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy,
-                                  struct cfg80211_chan_def *chandef,
-                                  enum nl80211_iftype iftype)
+bool cfg80211_reg_check_beaconing(struct wiphy *wiphy,
+                                 struct cfg80211_chan_def *chandef,
+                                 struct cfg80211_beaconing_check_config *cfg)
 {
        struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
-       bool check_no_ir;
-
-       lockdep_assert_held(&rdev->wiphy.mtx);
+       bool check_no_ir = true;
 
        /*
         * Under certain conditions suggested by some regulatory bodies a
@@ -1573,12 +1563,16 @@ bool cfg80211_reg_can_beacon_relax(struct wiphy *wiphy,
         * only if such relaxations are not enabled and the conditions are not
         * met.
         */
-       check_no_ir = !cfg80211_ir_permissive_chan(wiphy, iftype,
-                                                  chandef->chan);
+       if (cfg->relax) {
+               lockdep_assert_held(&rdev->wiphy.mtx);
+               check_no_ir = !cfg80211_ir_permissive_chan(wiphy, cfg->iftype,
+                                                          chandef->chan);
+       }
 
-       return _cfg80211_reg_can_beacon(wiphy, chandef, iftype, check_no_ir);
+       return _cfg80211_reg_can_beacon(wiphy, chandef, cfg->iftype,
+                                       check_no_ir);
 }
-EXPORT_SYMBOL(cfg80211_reg_can_beacon_relax);
+EXPORT_SYMBOL(cfg80211_reg_check_beaconing);
 
 int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev,
                                 struct cfg80211_chan_def *chandef)