cfg80211: add cfg80211_any_usable_channels()
authorJohannes Berg <johannes.berg@intel.com>
Fri, 18 Jun 2021 10:41:39 +0000 (13:41 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 23 Jun 2021 11:05:08 +0000 (13:05 +0200)
This helper function checks if there are any usable channels on
any of the given bands with the given properties (as expressed
by disallowed channel flags).

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20210618133832.2b613addaa85.Idaf8b859089490537878a7de5c7453a873a3f638@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
net/wireless/chan.c

index 7b4ef45d49b0101d2914defc3c218f81ec5eb477..481e4e24800fc17deb1394ef46b471097f33fcaa 100644 (file)
@@ -894,6 +894,17 @@ ieee80211_chandef_max_power(struct cfg80211_chan_def *chandef)
        return chandef->chan->max_power;
 }
 
+/**
+ * cfg80211_any_usable_channels - check for usable channels
+ * @wiphy: the wiphy to check for
+ * @band_mask: which bands to check on
+ * @prohibited_flags: which channels to not consider usable,
+ *     %IEEE80211_CHAN_DISABLED is always taken into account
+ */
+bool cfg80211_any_usable_channels(struct wiphy *wiphy,
+                                 unsigned long band_mask,
+                                 u32 prohibited_flags);
+
 /**
  * enum survey_info_flags - survey information flags
  *
index 472c895823a4a87f416409c4ba7476366f406cbf..869c43d4414c58a98a029831e731d2b3d3ed2cd5 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright 2009      Johannes Berg <johannes@sipsolutions.net>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
- * Copyright 2018-2020 Intel Corporation
+ * Copyright 2018-2021 Intel Corporation
  */
 
 #include <linux/export.h>
@@ -1339,3 +1339,34 @@ cfg80211_get_chan_state(struct wireless_dev *wdev,
                WARN_ON(1);
        }
 }
+
+bool cfg80211_any_usable_channels(struct wiphy *wiphy,
+                                 unsigned long sband_mask,
+                                 u32 prohibited_flags)
+{
+       int idx;
+
+       prohibited_flags |= IEEE80211_CHAN_DISABLED;
+
+       for_each_set_bit(idx, &sband_mask, NUM_NL80211_BANDS) {
+               struct ieee80211_supported_band *sband = wiphy->bands[idx];
+               int chanidx;
+
+               if (!sband)
+                       continue;
+
+               for (chanidx = 0; chanidx < sband->n_channels; chanidx++) {
+                       struct ieee80211_channel *chan;
+
+                       chan = &sband->channels[chanidx];
+
+                       if (chan->flags & prohibited_flags)
+                               continue;
+
+                       return true;
+               }
+       }
+
+       return false;
+}
+EXPORT_SYMBOL(cfg80211_any_usable_channels);