]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
hw_feature: Correctly select mode in case of the 6 GHz band
authorIlan Peer <ilan.peer@intel.com>
Thu, 22 Oct 2020 11:00:25 +0000 (14:00 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 7 Feb 2021 22:54:10 +0000 (00:54 +0200)
There are 2 HW modes with IEEE80211_MODE_A: one for the 5 GHz channels
and one for 6 GHz channels. Since hw_get_chan() checks all the
compatible hw modes, eventually, an incorrect hw mode is selected.

To fix this, add a function that checks if a specific mode supports
the requested frequency and if so use it as the current mode.

Signed-off-by: Ilan Peer <ilan.peer@intel.com>
Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
src/ap/hw_features.c
src/common/hw_features_common.c
src/common/hw_features_common.h

index 40b7b38c32431f7167f13a96df2b10b6fc6f7994..aef59ffb1e058875cf820a88f08a9c42ef2d561d 100644 (file)
@@ -1074,12 +1074,13 @@ int hostapd_select_hw_mode(struct hostapd_iface *iface)
        iface->current_mode = NULL;
        for (i = 0; i < iface->num_hw_features; i++) {
                struct hostapd_hw_modes *mode = &iface->hw_features[i];
+               int chan;
+
                if (mode->mode == iface->conf->hw_mode) {
                        if (iface->freq > 0 &&
-                           !hw_get_chan(mode->mode, iface->freq,
-                                        iface->hw_features,
-                                        iface->num_hw_features))
+                           !hw_mode_get_channel(mode, iface->freq, &chan))
                                continue;
+
                        iface->current_mode = mode;
                        break;
                }
index b62c37aea98387690a23a59175d1b4e410f69f1d..b8b886fa14750449ffebb0a512b3a39a925d6163 100644 (file)
@@ -40,11 +40,31 @@ struct hostapd_channel_data * hw_get_channel_chan(struct hostapd_hw_modes *mode,
 }
 
 
+struct hostapd_channel_data *
+hw_mode_get_channel(struct hostapd_hw_modes *mode, int freq, int *chan)
+{
+       int i;
+
+       for (i = 0; i < mode->num_channels; i++) {
+               struct hostapd_channel_data *ch = &mode->channels[i];
+
+               if (ch->freq == freq) {
+                       if (chan)
+                               *chan = ch->chan;
+                       return ch;
+               }
+       }
+
+       return NULL;
+}
+
+
 struct hostapd_channel_data *
 hw_get_channel_freq(enum hostapd_hw_mode mode, int freq, int *chan,
                    struct hostapd_hw_modes *hw_features, int num_hw_features)
 {
-       int i, j;
+       struct hostapd_channel_data *chan_data;
+       int i;
 
        if (chan)
                *chan = 0;
@@ -52,21 +72,15 @@ hw_get_channel_freq(enum hostapd_hw_mode mode, int freq, int *chan,
        if (!hw_features)
                return NULL;
 
-       for (j = 0; j < num_hw_features; j++) {
-               struct hostapd_hw_modes *curr_mode = &hw_features[j];
+       for (i = 0; i < num_hw_features; i++) {
+               struct hostapd_hw_modes *curr_mode = &hw_features[i];
 
                if (curr_mode->mode != mode)
                        continue;
-               for (i = 0; i < curr_mode->num_channels; i++) {
-                       struct hostapd_channel_data *ch =
-                               &curr_mode->channels[i];
-
-                       if (ch->freq == freq) {
-                               if (chan)
-                                       *chan = ch->chan;
-                               return ch;
-                       }
-               }
+
+               chan_data = hw_mode_get_channel(curr_mode, freq, chan);
+               if (chan_data)
+                       return chan_data;
        }
 
        return NULL;
index e57a8d65cc4866f618560e0a038441bb72a539a5..ddde36b9926327c368e781081d04a145aac7379e 100644 (file)
@@ -14,6 +14,9 @@
 
 struct hostapd_channel_data * hw_get_channel_chan(struct hostapd_hw_modes *mode,
                                                  int chan, int *freq);
+struct hostapd_channel_data *
+hw_mode_get_channel(struct hostapd_hw_modes *mode, int freq, int *chan);
+
 struct hostapd_channel_data *
 hw_get_channel_freq(enum hostapd_hw_mode mode, int freq, int *chan,
                    struct hostapd_hw_modes *hw_features, int num_hw_features);