]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cfg80211: separate get channel number from ies
authorWen Gong <wgong@codeaurora.org>
Thu, 30 Sep 2021 08:15:33 +0000 (04:15 -0400)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 21 Oct 2021 15:25:16 +0000 (17:25 +0200)
Get channel number from ies is a common logic, so separate it to a new
function, which could also be used by lower driver.

Signed-off-by: Wen Gong <wgong@codeaurora.org>
Link: https://lore.kernel.org/r/20210930081533.4898-1-wgong@codeaurora.org
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
net/wireless/scan.c

index 02737dde06d90863fe64edcf381acebd03e6d04e..241b29b0796e525f01a897c56db304e0eeb67198 100644 (file)
@@ -6376,6 +6376,17 @@ static inline void cfg80211_gen_new_bssid(const u8 *bssid, u8 max_bssid,
        u64_to_ether_addr(new_bssid_u64, new_bssid);
 }
 
+/**
+ * cfg80211_get_ies_channel_number - returns the channel number from ies
+ * @ie: IEs
+ * @ielen: length of IEs
+ * @band: enum nl80211_band of the channel
+ *
+ * Returns the channel number, or -1 if none could be determined.
+ */
+int cfg80211_get_ies_channel_number(const u8 *ie, size_t ielen,
+                                   enum nl80211_band band);
+
 /**
  * cfg80211_is_element_inherited - returns if element ID should be inherited
  * @element: element to check
index 0273f20291c41e7ea7a256de3ca9869ae451f6e2..e4f79b23f7f67363f06bca3ed1502c0cb054564d 100644 (file)
@@ -1791,25 +1791,13 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev,
        return NULL;
 }
 
-/*
- * Update RX channel information based on the available frame payload
- * information. This is mainly for the 2.4 GHz band where frames can be received
- * from neighboring channels and the Beacon frames use the DSSS Parameter Set
- * element to indicate the current (transmitting) channel, but this might also
- * be needed on other bands if RX frequency does not match with the actual
- * operating channel of a BSS.
- */
-static struct ieee80211_channel *
-cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen,
-                        struct ieee80211_channel *channel,
-                        enum nl80211_bss_scan_width scan_width)
+int cfg80211_get_ies_channel_number(const u8 *ie, size_t ielen,
+                                   enum nl80211_band band)
 {
        const u8 *tmp;
-       u32 freq;
        int channel_number = -1;
-       struct ieee80211_channel *alt_channel;
 
-       if (channel->band == NL80211_BAND_S1GHZ) {
+       if (band == NL80211_BAND_S1GHZ) {
                tmp = cfg80211_find_ie(WLAN_EID_S1G_OPERATION, ie, ielen);
                if (tmp && tmp[1] >= sizeof(struct ieee80211_s1g_oper_ie)) {
                        struct ieee80211_s1g_oper_ie *s1gop = (void *)(tmp + 2);
@@ -1830,6 +1818,29 @@ cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen,
                }
        }
 
+       return channel_number;
+}
+EXPORT_SYMBOL(cfg80211_get_ies_channel_number);
+
+/*
+ * Update RX channel information based on the available frame payload
+ * information. This is mainly for the 2.4 GHz band where frames can be received
+ * from neighboring channels and the Beacon frames use the DSSS Parameter Set
+ * element to indicate the current (transmitting) channel, but this might also
+ * be needed on other bands if RX frequency does not match with the actual
+ * operating channel of a BSS.
+ */
+static struct ieee80211_channel *
+cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen,
+                        struct ieee80211_channel *channel,
+                        enum nl80211_bss_scan_width scan_width)
+{
+       u32 freq;
+       int channel_number;
+       struct ieee80211_channel *alt_channel;
+
+       channel_number = cfg80211_get_ies_channel_number(ie, ielen, channel->band);
+
        if (channel_number < 0) {
                /* No channel information in frame payload */
                return channel;