]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
hostapd: Fix opclass during CSA with DFS channels
authormarek@mazekey.pl <marek@mazekey.pl>
Tue, 23 Apr 2024 09:08:08 +0000 (11:08 +0200)
committerJouni Malinen <j@w1.fi>
Sat, 13 Jul 2024 15:09:32 +0000 (18:09 +0300)
During CSA with DFS channels, disable, enable interface is a part of the
algorithm. When interface was enabled old operating class before switch
and new channel were used causing mismatch in
configured_fixed_chan_to_freq() function.

Example of log when switch from channel 157 to 108 was triggered:
"Could not convert op_class 124 channel 108 to operating frequency"

Fixes: bb781c763 ("AP: Populate iface->freq before starting AP")
Signed-off-by: Marek Kwaczynski <marek@mazekey.pl>
src/ap/hostapd.c

index a0c57b081a95dd41004df0532535367e22729b6a..84a943ef52f7361795c19dd0ea36d09eff9d7fe8 100644 (file)
@@ -4507,6 +4507,7 @@ hostapd_switch_channel_fallback(struct hostapd_iface *iface,
 {
        u8 seg0_idx = 0, seg1_idx = 0;
        enum oper_chan_width bw = CONF_OPER_CHWIDTH_USE_HT;
+       u8 op_class, chan = 0;
 
        wpa_printf(MSG_DEBUG, "Restarting all CSA-related BSSes");
 
@@ -4546,6 +4547,15 @@ hostapd_switch_channel_fallback(struct hostapd_iface *iface,
        iface->freq = freq_params->freq;
        iface->conf->channel = freq_params->channel;
        iface->conf->secondary_channel = freq_params->sec_channel_offset;
+       if (ieee80211_freq_to_channel_ext(freq_params->freq,
+                                         freq_params->sec_channel_offset, bw,
+                                         &op_class, &chan) ==
+           NUM_HOSTAPD_MODES ||
+           chan != freq_params->channel)
+               wpa_printf(MSG_INFO, "CSA: Channel mismatch: %d -> %d",
+                          freq_params->channel, chan);
+
+       iface->conf->op_class = op_class;
        hostapd_set_oper_centr_freq_seg0_idx(iface->conf, seg0_idx);
        hostapd_set_oper_centr_freq_seg1_idx(iface->conf, seg1_idx);
        hostapd_set_oper_chwidth(iface->conf, bw);