diff --git a/src/ap/dfs.c b/src/ap/dfs.c index 40b3de56f..d6c09a000 100644 --- a/src/ap/dfs.c +++ b/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; } diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c index 17bdeb2fc..26b3e89cd 100644 --- a/src/ap/hostapd.c +++ b/src/ap/hostapd.c @@ -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