]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Set channel and operating class in hostapd_fill_csa_settings()
authorLuciano Coelho <luciano.coelho@intel.com>
Tue, 8 Sep 2015 09:46:30 +0000 (12:46 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 3 Oct 2015 18:26:23 +0000 (21:26 +0300)
The CSA channel and operating class values need to be set for all types
of channel switch (i.e., either if it's triggered by the control
interfaces or due to the GO-follows-STA flow). To do so, move the code
that sets them from the GO-follows-STA flow to the more generic
hostapd_fill_csa_settings() function.

Signed-off-by: Luciano Coelho <luciano.coelho@intel.com>
src/ap/hostapd.c
wpa_supplicant/p2p_supplicant.c

index 36adf3eb8e6bcc4e4e0d0705c39383c2081517e3..706e48f567d6b0d440d950f0cc88fbce3911a36a 100644 (file)
@@ -2828,11 +2828,28 @@ static int hostapd_fill_csa_settings(struct hostapd_data *hapd,
        struct hostapd_iface *iface = hapd->iface;
        struct hostapd_freq_params old_freq;
        int ret;
+       u8 chan;
 
        os_memset(&old_freq, 0, sizeof(old_freq));
        if (!iface || !iface->freq || hapd->csa_in_progress)
                return -1;
 
+       if (ieee80211_freq_to_channel_ext(
+                   settings->freq_params.freq,
+                   settings->freq_params.sec_channel_offset,
+                   settings->freq_params.vht_enabled,
+                   &hapd->iface->cs_oper_class,
+                   &chan) == NUM_HOSTAPD_MODES) {
+               wpa_printf(MSG_DEBUG,
+                          "invalid frequency for channel switch (freq=%d, sec_channel_offset=%d, vht_enabled=%d)",
+                          settings->freq_params.freq,
+                          settings->freq_params.sec_channel_offset,
+                          settings->freq_params.vht_enabled);
+               return -1;
+       }
+
+       settings->freq_params.channel = chan;
+
        ret = hostapd_change_config_freq(iface->bss[0], iface->conf,
                                         &settings->freq_params,
                                         &old_freq);
index 8bcbc12021bb6f8d1ab2fc3fdc043160d96d335e..d264cb84ce8ff0d5c9126413d6b298ee1ef6c411 100644 (file)
@@ -8529,7 +8529,6 @@ static int wpas_p2p_move_go_csa(struct wpa_supplicant *wpa_s)
        struct wpa_ssid *current_ssid = wpa_s->current_ssid;
        int old_freq = current_ssid->frequency;
        int ret;
-       u8 chan;
 
        if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP_CSA)) {
                wpa_dbg(wpa_s, MSG_DEBUG, "CSA is not enabled");
@@ -8578,33 +8577,32 @@ static int wpas_p2p_move_go_csa(struct wpa_supplicant *wpa_s)
        csa_settings.cs_count = P2P_GO_CSA_COUNT;
        csa_settings.block_tx = P2P_GO_CSA_BLOCK_TX;
        csa_settings.freq_params.freq = params.freq;
-
-       if (ieee80211_freq_to_channel_ext(params.freq, conf->secondary_channel,
-                                         conf->ieee80211ac,
-                                         &wpa_s->ap_iface->cs_oper_class,
-                                         &chan) == NUM_HOSTAPD_MODES) {
-               wpa_dbg(wpa_s, MSG_DEBUG,
-                       "P2P CSA: Selected invalid frequency");
-               ret = -1;
-               goto out;
-       }
-
-       csa_settings.freq_params.channel = chan;
        csa_settings.freq_params.sec_channel_offset = conf->secondary_channel;
        csa_settings.freq_params.ht_enabled = conf->ieee80211n;
        csa_settings.freq_params.bandwidth = conf->secondary_channel ? 40 : 20;
 
        if (conf->ieee80211ac) {
                int freq1 = 0, freq2 = 0;
+               u8 chan, opclass;
+
+               if (ieee80211_freq_to_channel_ext(params.freq,
+                                                 conf->secondary_channel,
+                                                 conf->vht_oper_chwidth,
+                                                 &opclass, &chan) ==
+                   NUM_HOSTAPD_MODES) {
+                       wpa_printf(MSG_ERROR, "P2P CSA: Bad freq");
+                       ret = -1;
+                       goto out;
+               }
 
                if (conf->vht_oper_centr_freq_seg0_idx)
                        freq1 = ieee80211_chan_to_freq(
-                               NULL, wpa_s->ap_iface->cs_oper_class,
+                               NULL, opclass,
                                conf->vht_oper_centr_freq_seg0_idx);
 
                if (conf->vht_oper_centr_freq_seg1_idx)
                        freq2 = ieee80211_chan_to_freq(
-                               NULL, wpa_s->ap_iface->cs_oper_class,
+                               NULL, opclass,
                                conf->vht_oper_centr_freq_seg1_idx);
 
                if (freq1 < 0 || freq2 < 0) {