DFS: Add support for multi-BSS
If radar was detected single BSS is notified about it. This caused only that single BSS to be stopped and restarted. However, due to nl80211 interface combinations the BSS was not started on a new channel and other BSSes remained operating on the old channel. The downside is that hostapd_disable_iface() causes deauth frames to be sent. This is undesired but on the other hand it doesn't make sense to create workarounds that imitate CSA's 'block tx'. For proper Tx quiescing CSA should be properly implemented. Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
This commit is contained in:
parent
954e71d270
commit
813d4bac5a
2 changed files with 18 additions and 9 deletions
23
src/ap/dfs.c
23
src/ap/dfs.c
|
@ -615,6 +615,10 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_data *hapd)
|
|||
&vht_oper_centr_freq_seg0_idx,
|
||||
&vht_oper_centr_freq_seg1_idx);
|
||||
if (channel) {
|
||||
wpa_printf(MSG_DEBUG, "DFS will switch to a new channel %d",
|
||||
channel->chan);
|
||||
|
||||
hapd->iface->freq = channel->freq;
|
||||
hapd->iconf->channel = channel->chan;
|
||||
hapd->iconf->secondary_channel = secondary_channel;
|
||||
hapd->iconf->vht_oper_centr_freq_seg0_idx =
|
||||
|
@ -626,15 +630,24 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_data *hapd)
|
|||
wpa_printf(MSG_ERROR, "No valid channel available");
|
||||
}
|
||||
|
||||
if (!hapd->cac_started) {
|
||||
wpa_printf(MSG_DEBUG, "DFS radar detected");
|
||||
hapd->driver->stop_ap(hapd->drv_priv);
|
||||
} else {
|
||||
if (hapd->cac_started) {
|
||||
wpa_printf(MSG_DEBUG, "DFS radar detected during CAC");
|
||||
hapd->cac_started = 0;
|
||||
/* FIXME: Wait for channel(s) to become available if no channel
|
||||
* has been found */
|
||||
hostapd_setup_interface_complete(hapd->iface, err);
|
||||
return err;
|
||||
}
|
||||
|
||||
hostapd_setup_interface_complete(hapd->iface, err);
|
||||
if (err) {
|
||||
/* FIXME: Wait for channel(s) to become available */
|
||||
hostapd_disable_iface(hapd->iface);
|
||||
return err;
|
||||
}
|
||||
|
||||
wpa_printf(MSG_DEBUG, "DFS radar detected");
|
||||
hostapd_disable_iface(hapd->iface);
|
||||
hostapd_enable_iface(hapd->iface);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1153,8 +1153,6 @@ void hostapd_interface_free(struct hostapd_iface *iface)
|
|||
}
|
||||
|
||||
|
||||
#ifdef HOSTAPD
|
||||
|
||||
void hostapd_interface_deinit_free(struct hostapd_iface *iface)
|
||||
{
|
||||
const struct wpa_driver_ops *driver;
|
||||
|
@ -1440,8 +1438,6 @@ int hostapd_remove_iface(struct hapd_interfaces *interfaces, char *buf)
|
|||
return -1;
|
||||
}
|
||||
|
||||
#endif /* HOSTAPD */
|
||||
|
||||
|
||||
/**
|
||||
* hostapd_new_assoc_sta - Notify that a new station associated with the AP
|
||||
|
|
Loading…
Reference in a new issue