hostapd: Do not terminate process on dynamic interface add failure
authorJouni Malinen <jouni@qca.qualcomm.com>
Tue, 5 Nov 2013 11:39:21 +0000 (13:39 +0200)
committerJouni Malinen <j@w1.fi>
Tue, 5 Nov 2013 15:35:11 +0000 (17:35 +0200)
Limit the calls to eloop_terminate() to happen only for the
initialization failure from the interfaces that we specified on the
command line. This allows hostapd process to continue operating even if
a dynamically added interface fails to start up. This allows the upper
layer software to fix a configuration error and retry.

Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>

hostapd/main.c
src/ap/hostapd.c
src/ap/hostapd.h

index bc61db1..4e9fe40 100644 (file)
@@ -693,6 +693,7 @@ int main(int argc, char *argv[])
         * In such case, the interface will be enabled from eloop context within
         * hostapd_global_run().
         */
+       interfaces.terminate_on_error = interfaces.count;
        for (i = 0; i < interfaces.count; i++) {
                if (hostapd_driver_init(interfaces.iface[i]) ||
                    hostapd_setup_interface(interfaces.iface[i]))
index 5d51c77..52be311 100644 (file)
@@ -1082,7 +1082,8 @@ int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err)
        if (err) {
                wpa_printf(MSG_ERROR, "Interface initialization failed");
                hostapd_set_state(iface, HAPD_IFACE_DISABLED);
-               eloop_terminate();
+               if (iface->interfaces && iface->interfaces->terminate_on_error)
+                       eloop_terminate();
                return -1;
        }
 
@@ -1187,6 +1188,8 @@ int hostapd_setup_interface_complete(struct hostapd_iface *iface, int err)
 
        wpa_printf(MSG_DEBUG, "%s: Setup of interface done.",
                   iface->bss[0]->conf->iface);
+       if (iface->interfaces && iface->interfaces->terminate_on_error > 0)
+               iface->interfaces->terminate_on_error--;
 
        return 0;
 }
index 05bcb62..adb3728 100644 (file)
@@ -45,6 +45,8 @@ struct hapd_interfaces {
        gid_t ctrl_iface_group;
        struct hostapd_iface **iface;
        struct hostapd_dynamic_iface **dynamic_iface;
+
+       size_t terminate_on_error;
 };
 
 enum hostapd_chan_status {