]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
hostapd: Propagate ACS errors to iface setup
authorHelmut Schaa <helmut.schaa@googlemail.com>
Tue, 22 Oct 2013 21:18:41 +0000 (00:18 +0300)
committerJouni Malinen <j@w1.fi>
Tue, 22 Oct 2013 21:44:36 +0000 (00:44 +0300)
Otherwise hostapd might hang doing nothing anymore. Propagate ACS
errors so we can fail gracefully.

Signed-hostap: Helmut Schaa <helmut.schaa@googlemail.com>

src/ap/acs.c
src/ap/acs.h
src/ap/hw_features.c

index d5e3f59695e1edc6f619e1a81096d201c6374035..82f5dbf89d096c52e4ac2e8eda99dbd081614cb4 100644 (file)
@@ -655,6 +655,7 @@ static void acs_study(struct hostapd_iface *iface)
        ideal_chan = acs_find_ideal_chan(iface);
        if (!ideal_chan) {
                wpa_printf(MSG_ERROR, "ACS: Failed to compute ideal channel");
+               err = -1;
                goto fail;
        }
 
@@ -663,24 +664,20 @@ static void acs_study(struct hostapd_iface *iface)
        if (iface->conf->ieee80211ac)
                acs_adjust_vht_center_freq(iface);
 
+       err = 0;
+fail:
        /*
         * hostapd_setup_interface_complete() will return -1 on failure,
         * 0 on success and 0 is HOSTAPD_CHAN_VALID :)
         */
-       switch (hostapd_acs_completed(iface)) {
-       case HOSTAPD_CHAN_VALID:
+       if (hostapd_acs_completed(iface, err) == HOSTAPD_CHAN_VALID) {
                acs_cleanup(iface);
                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);
 }
 
index 0d1d0f1a993a0761dae2e36cf2fb7181d9311a93..a41f17f31ca618f8dd512addda771934df19f142 100644 (file)
@@ -13,7 +13,7 @@
 #ifdef CONFIG_ACS
 
 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 */
 
index ce62b83b390b1bb8aa01bd27a4e844450f2af358..609ed535f0eb7cc14ab1c685a50b2b8192ae0e4f 100644 (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;
 
+       if (err)
+               goto out;
+
        switch (hostapd_check_chans(iface)) {
        case HOSTAPD_CHAN_VALID:
                break;