hostapd: Propagate ACS errors to iface setup

Otherwise hostapd might hang doing nothing anymore. Propagate ACS
errors so we can fail gracefully.

Signed-hostap: Helmut Schaa <helmut.schaa@googlemail.com>
This commit is contained in:
Helmut Schaa 2013-10-23 00:18:41 +03:00 committed by Jouni Malinen
parent 0e1d0b370f
commit 3645fd5aae
3 changed files with 12 additions and 12 deletions

View File

@ -655,6 +655,7 @@ static void acs_study(struct hostapd_iface *iface)
ideal_chan = acs_find_ideal_chan(iface); ideal_chan = acs_find_ideal_chan(iface);
if (!ideal_chan) { if (!ideal_chan) {
wpa_printf(MSG_ERROR, "ACS: Failed to compute ideal channel"); wpa_printf(MSG_ERROR, "ACS: Failed to compute ideal channel");
err = -1;
goto fail; goto fail;
} }
@ -663,24 +664,20 @@ static void acs_study(struct hostapd_iface *iface)
if (iface->conf->ieee80211ac) if (iface->conf->ieee80211ac)
acs_adjust_vht_center_freq(iface); acs_adjust_vht_center_freq(iface);
err = 0;
fail:
/* /*
* hostapd_setup_interface_complete() will return -1 on failure, * hostapd_setup_interface_complete() will return -1 on failure,
* 0 on success and 0 is HOSTAPD_CHAN_VALID :) * 0 on success and 0 is HOSTAPD_CHAN_VALID :)
*/ */
switch (hostapd_acs_completed(iface)) { if (hostapd_acs_completed(iface, err) == HOSTAPD_CHAN_VALID) {
case HOSTAPD_CHAN_VALID:
acs_cleanup(iface); acs_cleanup(iface);
return; return;
case HOSTAPD_CHAN_INVALID:
case HOSTAPD_CHAN_ACS:
default:
/* This can possibly happen if channel parameters (secondary
* channel, center frequencies) are misconfigured */
wpa_printf(MSG_ERROR, "ACS: Possibly channel configuration is invalid, please report this along with your config file.");
goto fail;
} }
fail: /* This can possibly happen if channel parameters (secondary
* channel, center frequencies) are misconfigured */
wpa_printf(MSG_ERROR, "ACS: Possibly channel configuration is invalid, please report this along with your config file.");
acs_fail(iface); acs_fail(iface);
} }

View File

@ -13,7 +13,7 @@
#ifdef CONFIG_ACS #ifdef CONFIG_ACS
enum hostapd_chan_status acs_init(struct hostapd_iface *iface); enum hostapd_chan_status acs_init(struct hostapd_iface *iface);
int hostapd_acs_completed(struct hostapd_iface *iface); int hostapd_acs_completed(struct hostapd_iface *iface, int err);
#else /* CONFIG_ACS */ #else /* CONFIG_ACS */

View File

@ -758,10 +758,13 @@ static void hostapd_notify_bad_chans(struct hostapd_iface *iface)
} }
int hostapd_acs_completed(struct hostapd_iface *iface) int hostapd_acs_completed(struct hostapd_iface *iface, int err)
{ {
int ret = -1; int ret = -1;
if (err)
goto out;
switch (hostapd_check_chans(iface)) { switch (hostapd_check_chans(iface)) {
case HOSTAPD_CHAN_VALID: case HOSTAPD_CHAN_VALID:
break; break;