mesh: Fix channel switch error during CAC

Mesh interface would have used its channel parameters that were
configured during initialization even after channel switch due to DFS
radar detection during CAC which could result in a channel switch error.
Fix the error by updating the channel parameters when channel has been
changed from the initial one.

Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
This commit is contained in:
Peter Oh 2020-06-30 14:19:00 +02:00 committed by Jouni Malinen
parent 8725909789
commit a27faf2c9a

View File

@ -13,6 +13,7 @@
#include "utils/uuid.h" #include "utils/uuid.h"
#include "common/ieee802_11_defs.h" #include "common/ieee802_11_defs.h"
#include "common/wpa_ctrl.h" #include "common/wpa_ctrl.h"
#include "common/hw_features_common.h"
#include "ap/sta_info.h" #include "ap/sta_info.h"
#include "ap/hostapd.h" #include "ap/hostapd.h"
#include "ap/ieee802_11.h" #include "ap/ieee802_11.h"
@ -207,6 +208,43 @@ static int wpas_mesh_complete(struct wpa_supplicant *wpa_s)
return -1; return -1;
} }
/*
* Update channel configuration if the channel has changed since the
* initial setting, i.e., due to DFS radar detection during CAC.
*/
if (ifmsh->freq != params->freq.freq) {
struct he_capabilities *he_capab = NULL;
wpa_s->assoc_freq = ifmsh->freq;
ssid->frequency = ifmsh->freq;
if (ifmsh->current_mode)
he_capab = &ifmsh->current_mode->he_capab[
IEEE80211_MODE_MESH];
if (hostapd_set_freq_params(
&params->freq,
ifmsh->conf->hw_mode,
ifmsh->freq,
ifmsh->conf->channel,
ifmsh->conf->enable_edmg,
ifmsh->conf->edmg_channel,
ifmsh->conf->ieee80211n,
ifmsh->conf->ieee80211ac,
ifmsh->conf->ieee80211ax,
ifmsh->conf->secondary_channel,
hostapd_get_oper_chwidth(ifmsh->conf),
hostapd_get_oper_centr_freq_seg0_idx(ifmsh->conf),
hostapd_get_oper_centr_freq_seg1_idx(ifmsh->conf),
ifmsh->conf->vht_capab,
he_capab)) {
wpa_printf(MSG_ERROR,
"Error updating mesh frequency params");
wpa_supplicant_mesh_deinit(wpa_s);
return -1;
}
}
if (ifmsh->mconf->security != MESH_CONF_SEC_NONE && if (ifmsh->mconf->security != MESH_CONF_SEC_NONE &&
wpas_mesh_init_rsn(wpa_s)) { wpas_mesh_init_rsn(wpa_s)) {
wpa_printf(MSG_ERROR, wpa_printf(MSG_ERROR,