From 2b6623ab134fff6d96114f5fe329a2f87d5e893a Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Tue, 5 Nov 2013 13:39:21 +0200 Subject: [PATCH] hostapd: Do not terminate process on dynamic interface add failure 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 --- hostapd/main.c | 1 + src/ap/hostapd.c | 5 ++++- src/ap/hostapd.h | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/hostapd/main.c b/hostapd/main.c index bc61db180..4e9fe404d 100644 --- a/hostapd/main.c +++ b/hostapd/main.c @@ -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])) diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c index 5d51c7771..52be3110d 100644 --- a/src/ap/hostapd.c +++ b/src/ap/hostapd.c @@ -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; } diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h index 05bcb6202..adb3728d7 100644 --- a/src/ap/hostapd.h +++ b/src/ap/hostapd.h @@ -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 {