cfg80211: parse S1G Operation element for BSS channel
authorThomas Pedersen <thomas@adapt-ip.com>
Tue, 22 Sep 2020 02:28:07 +0000 (19:28 -0700)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 28 Sep 2020 11:53:05 +0000 (13:53 +0200)
Extract the BSS primary channel from the S1G Operation
element.

Signed-off-by: Thomas Pedersen <thomas@adapt-ip.com>
Link: https://lore.kernel.org/r/20200922022818.15855-7-thomas@adapt-ip.com
[remove the goto bits]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/wireless/scan.c

index 777df575128510a5bf4b0ec3fd94061d973f83d3..8d0e49c46db37cf4e9e83716dd15caf7fe206425 100644 (file)
@@ -1802,15 +1802,24 @@ cfg80211_get_bss_channel(struct wiphy *wiphy, const u8 *ie, size_t ielen,
        int channel_number = -1;
        struct ieee80211_channel *alt_channel;
 
-       tmp = cfg80211_find_ie(WLAN_EID_DS_PARAMS, ie, ielen);
-       if (tmp && tmp[1] == 1) {
-               channel_number = tmp[2];
+       if (channel->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);
+
+                       channel_number = s1gop->primary_ch;
+               }
        } else {
-               tmp = cfg80211_find_ie(WLAN_EID_HT_OPERATION, ie, ielen);
-               if (tmp && tmp[1] >= sizeof(struct ieee80211_ht_operation)) {
-                       struct ieee80211_ht_operation *htop = (void *)(tmp + 2);
+               tmp = cfg80211_find_ie(WLAN_EID_DS_PARAMS, ie, ielen);
+               if (tmp && tmp[1] == 1) {
+                       channel_number = tmp[2];
+               } else {
+                       tmp = cfg80211_find_ie(WLAN_EID_HT_OPERATION, ie, ielen);
+                       if (tmp && tmp[1] >= sizeof(struct ieee80211_ht_operation)) {
+                               struct ieee80211_ht_operation *htop = (void *)(tmp + 2);
 
-                       channel_number = htop->primary_chan;
+                               channel_number = htop->primary_chan;
+                       }
                }
        }