]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
AP: Add op_class config item to specify 6 GHz channels uniquely
authorLiangwei Dong <liangwei@codeaurora.org>
Fri, 9 Aug 2019 04:27:46 +0000 (12:27 +0800)
committerJouni Malinen <j@w1.fi>
Tue, 15 Oct 2019 12:39:22 +0000 (15:39 +0300)
Add hostapd config option "op_class" for fixed channel selection along
with existing "channel" option. "op_class" and "channel" config options
together can specify channels across 2.4 GHz, 5 GHz, and 6 GHz bands
uniquely.

Signed-off-by: Liangwei Dong <liangwei@codeaurora.org>
Signed-off-by: Vamsi Krishna <vamsin@codeaurora.org>
hostapd/config_file.c
hostapd/hostapd.conf
src/ap/ap_config.h
src/ap/hw_features.c

index b187ec7cb9ef046b9d5f5424e7ab0239b5212175..40066add3c47f8d4665824f942acf6a3051636a0 100644 (file)
@@ -3136,6 +3136,8 @@ static int hostapd_config_fill(struct hostapd_config *conf,
                }
        } else if (os_strcmp(buf, "acs_exclude_dfs") == 0) {
                conf->acs_exclude_dfs = atoi(pos);
+       } else if (os_strcmp(buf, "op_class") == 0) {
+               conf->op_class = atoi(pos);
        } else if (os_strcmp(buf, "channel") == 0) {
                if (os_strcmp(pos, "acs_survey") == 0) {
 #ifndef CONFIG_ACS
index 9739c61a4096706cdc60b718344de512b10983bf..b8a54457b0e7cf4eafbdaebbd9f742fe6d724933 100644 (file)
@@ -163,6 +163,12 @@ hw_mode=g
 # which will enable the ACS survey based algorithm.
 channel=1
 
+# Global operating class (IEEE 802.11, Annex E, Table E-4)
+# This option allows hostapd to specify the operating class of the channel
+# configured with the channel parameter. channel and op_class together can
+# uniquely identify channels across different bands, including the 6 GHz band.
+#op_class=131
+
 # ACS tuning - Automatic Channel Selection
 # See: http://wireless.kernel.org/en/users/Documentation/acs
 #
index 0aa8e0d68021b0a3520cac6cc9c8c3b3d44745cc..2a0c984a3e9b2901f86faa22f67c0a404b2c0271 100644 (file)
@@ -875,6 +875,7 @@ struct hostapd_config {
        u16 beacon_int;
        int rts_threshold;
        int fragm_threshold;
+       u8 op_class;
        u8 channel;
        int enable_edmg;
        u8 edmg_channel;
index 2a1fa0ae8971a037f21fb9c9c6d5520f846f9659..2fefaf842dfb367c5f6ed2b01c3adea8ec40421b 100644 (file)
@@ -961,6 +961,7 @@ out:
 int hostapd_select_hw_mode(struct hostapd_iface *iface)
 {
        int i;
+       int freq = -1;
 
        if (iface->num_hw_features < 1)
                return -1;
@@ -977,9 +978,14 @@ int hostapd_select_hw_mode(struct hostapd_iface *iface)
        }
 
        iface->current_mode = NULL;
+       if (iface->conf->channel && iface->conf->op_class)
+               freq = ieee80211_chan_to_freq(NULL, iface->conf->op_class,
+                                             iface->conf->channel);
        for (i = 0; i < iface->num_hw_features; i++) {
                struct hostapd_hw_modes *mode = &iface->hw_features[i];
                if (mode->mode == iface->conf->hw_mode) {
+                       if (freq > 0 && !hw_get_chan(mode, freq))
+                               continue;
                        iface->current_mode = mode;
                        break;
                }