@@ -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\n",
+ 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);
@@ -8527,7 +8527,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");
@@ -8576,35 +8575,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, op_class;
+
+ if (ieee80211_freq_to_channel_ext(params.freq,
+ conf->secondary_channel,
+ conf->vht_oper_chwidth,
+ &op_class, &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,
+ op_class,
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,
+ op_class,
conf->vht_oper_centr_freq_seg1_idx);
if (freq1 < 0 || freq2 < 0) {