[RFC] hostapd: DFS - handle running out of DFS channels
Petko Bordjukov
bordjukov at gmail.com
Fri Feb 12 15:11:57 PST 2016
Hello,
Is there a reason why merging this would be a bad idea? I think it is a
neat functionality to have.
Regards,
P.
On Fri Oct 9 05:58:34 PDT 2015 Zefir Kurtisi wrote:
> In scenarios where only DFS channels are available (e.g. outdoor,
> special countrycodes), hostapd must be able to handle situations
> where all are unavailable.
>
> The two possibilities to get there are
> 1) while operating on the last available DFS channel a radar is
> detected
> 2) hostapd is started while all channels are unavailable
>
> In both cases, hostapd instead of terminating should better
> wait for the NOPs to pass and re-try operation after the CAC.
>
> This patch attempts to provide this feature with minimal modifi-
> cation of the existing DFS framework. It uses the condition
> (iface->state == HAPD_IFACE_DFS && !iface->cac_started)
> as NOP mode signature to retry operation from within
> hostapd_dfs_nop_finished().
>
> Signed-off-by: Zefir Kurtisi <zefir.kurtisi at neratec.com>
> ---
> src/ap/dfs.c | 14 ++++++++------
> 1 file changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/src/ap/dfs.c b/src/ap/dfs.c
> index 7273caa..7e9acfd 100644
> --- a/src/ap/dfs.c
> +++ b/src/ap/dfs.c
> @@ -660,13 +660,14 @@ int hostapd_handle_dfs(struct hostapd_iface *iface)
> }
>
> iface->cac_started = 0;
> + hostapd_set_state(iface, HAPD_IFACE_DFS);
>
> do {
> /* Get start (first) channel for current configuration */
> start_chan_idx = dfs_get_start_chan_idx(iface,
> &start_chan_idx1);
> if (start_chan_idx == -1)
> - return -1;
> + return 0;
>
> /* Get number of used channels, depend on width */
> n_chans = dfs_get_used_n_chans(iface, &n_chans1);
> @@ -704,7 +705,7 @@ int hostapd_handle_dfs(struct hostapd_iface *iface)
> skip_radar);
> if (!channel) {
> wpa_printf(MSG_ERROR, "could not get valid channel");
> - return -1;
> + return 0;
> }
>
> iface->freq = channel->freq;
> @@ -716,7 +717,6 @@ int hostapd_handle_dfs(struct hostapd_iface *iface)
> } while (res);
>
> /* Finally start CAC */
> - hostapd_set_state(iface, HAPD_IFACE_DFS);
> wpa_printf(MSG_DEBUG, "DFS start CAC on %d MHz", iface->freq);
> wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, DFS_EVENT_CAC_START
> "freq=%d chan=%d sec_chan=%d, width=%d, seg0=%d, seg1=%d, cac_time=%ds",
> @@ -793,7 +793,6 @@ static int hostapd_dfs_start_channel_switch_cac(struct hostapd_iface *iface)
>
> if (!channel) {
> wpa_printf(MSG_ERROR, "No valid channel available");
> - hostapd_setup_interface_complete(iface, err);
> return err;
> }
>
> @@ -858,8 +857,8 @@ static int hostapd_dfs_start_channel_switch(struct hostapd_iface *iface)
> &vht_oper_centr_freq_seg1_idx,
> skip_radar);
> if (!channel) {
> - /* FIXME: Wait for channel(s) to become available */
> - hostapd_disable_iface(iface);
> + wpa_printf(MSG_INFO, "%s: no DFS channels left, "
> + "waiting for NOP to finish", __func__);
> return err;
> }
>
> @@ -982,6 +981,9 @@ int hostapd_dfs_nop_finished(struct hostapd_iface *iface, int freq,
> /* TODO add correct implementation here */
> set_dfs_state(iface, freq, ht_enabled, chan_offset, chan_width,
> cf1, cf2, HOSTAPD_CHAN_DFS_USABLE);
> +
> + if (iface->state == HAPD_IFACE_DFS && !iface->cac_started)
> + hostapd_handle_dfs(iface);
> return 0;
> }
>
> --
> 2.5.0
More information about the Hostap
mailing list