Module Name: src Committed By: roy Date: Wed Jan 20 17:03:35 UTC 2016
Modified Files: src/external/bsd/wpa/dist/hostapd: hostapd_cli.c main.c src/external/bsd/wpa/dist/src/utils: eloop.c eloop.h src/external/bsd/wpa/dist/wpa_supplicant: wpa_cli.c wpa_supplicant.c Log Message: Re-queue kqueue events after forking. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/external/bsd/wpa/dist/hostapd/hostapd_cli.c cvs rdiff -u -r1.1.1.5 -r1.2 src/external/bsd/wpa/dist/hostapd/main.c cvs rdiff -u -r1.8 -r1.9 src/external/bsd/wpa/dist/src/utils/eloop.c cvs rdiff -u -r1.1.1.4 -r1.2 src/external/bsd/wpa/dist/src/utils/eloop.h cvs rdiff -u -r1.7 -r1.8 src/external/bsd/wpa/dist/wpa_supplicant/wpa_cli.c cvs rdiff -u -r1.3 -r1.4 \ src/external/bsd/wpa/dist/wpa_supplicant/wpa_supplicant.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/bsd/wpa/dist/hostapd/hostapd_cli.c diff -u src/external/bsd/wpa/dist/hostapd/hostapd_cli.c:1.7 src/external/bsd/wpa/dist/hostapd/hostapd_cli.c:1.8 --- src/external/bsd/wpa/dist/hostapd/hostapd_cli.c:1.7 Wed Apr 1 19:45:14 2015 +++ src/external/bsd/wpa/dist/hostapd/hostapd_cli.c Wed Jan 20 17:03:35 2016 @@ -1375,7 +1375,7 @@ int main(int argc, char *argv[]) } } - if (daemonize && os_daemonize(pid_file)) + if (daemonize && os_daemonize(pid_file) && eloop_sock_requeue()) return -1; if (interactive) Index: src/external/bsd/wpa/dist/hostapd/main.c diff -u src/external/bsd/wpa/dist/hostapd/main.c:1.1.1.5 src/external/bsd/wpa/dist/hostapd/main.c:1.2 --- src/external/bsd/wpa/dist/hostapd/main.c:1.1.1.5 Wed Apr 1 19:24:48 2015 +++ src/external/bsd/wpa/dist/hostapd/main.c Wed Jan 20 17:03:35 2016 @@ -407,9 +407,16 @@ static int hostapd_global_run(struct hap } #endif /* EAP_SERVER_TNC */ - if (daemonize && os_daemonize(pid_file)) { - wpa_printf(MSG_ERROR, "daemon: %s", strerror(errno)); - return -1; + if (daemonize) { + if (os_daemonize(pid_file)) { + wpa_printf(MSG_ERROR, "daemon: %s", strerror(errno)); + return -1; + } + if (eloop_sock_requeue()) { + wpa_printf(MSG_ERROR, "eloop_sock_requeue: %s", + strerror(errno)); + return -1; + } } eloop_run(); Index: src/external/bsd/wpa/dist/src/utils/eloop.c diff -u src/external/bsd/wpa/dist/src/utils/eloop.c:1.8 src/external/bsd/wpa/dist/src/utils/eloop.c:1.9 --- src/external/bsd/wpa/dist/src/utils/eloop.c:1.8 Wed Jan 20 15:26:13 2016 +++ src/external/bsd/wpa/dist/src/utils/eloop.c Wed Jan 20 17:03:35 2016 @@ -169,9 +169,6 @@ int eloop_init(void) __func__, strerror(errno)); return -1; } - eloop.readers.type = EVENT_TYPE_READ; - eloop.writers.type = EVENT_TYPE_WRITE; - eloop.exceptions.type = EVENT_TYPE_EXCEPTION; #endif /* CONFIG_ELOOP_EPOLL */ #ifdef CONFIG_ELOOP_KQUEUE eloop.kqueuefd = kqueue(); @@ -181,26 +178,85 @@ int eloop_init(void) return -1; } #endif /* CONFIG_ELOOP_KQUEUE */ +#if defined(CONFIG_ELOOP_EPOLL) || defined(CONFIG_ELOOP_KQUEUE) + eloop.readers.type = EVENT_TYPE_READ; + eloop.writers.type = EVENT_TYPE_WRITE; + eloop.exceptions.type = EVENT_TYPE_EXCEPTION; +#endif #ifdef WPA_TRACE signal(SIGSEGV, eloop_sigsegv_handler); #endif /* WPA_TRACE */ return 0; } +#ifdef CONFIG_ELOOP_EPOLL +static int eloop_sock_queue(int sock, eloop_event_type type) +{ + struct epoll_event ev; + + os_memset(&ev, 0, sizeof(ev)); + switch (type) { + case EVENT_TYPE_READ: + ev.events = EPOLLIN; + break; + case EVENT_TYPE_WRITE: + ev.events = EPOLLOUT; + break; + /* + * Exceptions are always checked when using epoll, but I suppose it's + * possible that someone registered a socket *only* for exception + * handling. + */ + case EVENT_TYPE_EXCEPTION: + ev.events = EPOLLERR | EPOLLHUP; + break; + } + ev.data.fd = sock; + if (epoll_ctl(eloop.epollfd, EPOLL_CTL_ADD, sock, &ev) < 0) { + wpa_printf(MSG_ERROR, "%s: epoll_ctl(ADD) for fd=%d " + "failed. %s\n", __func__, sock, strerror(errno)); + return -1; + } + return 0; +} +#endif /* CONFIG_ELOOP_EPOLL */ + +#ifdef CONFIG_ELOOP_KQUEUE +static int eloop_sock_queue(int sock, eloop_event_type type) +{ + int filter; + struct kevent ke; + + switch (type) { + case EVENT_TYPE_READ: + filter = EVFILT_READ; + break; + case EVENT_TYPE_WRITE: + filter = EVFILT_WRITE; + break; + default: + filter = 0; + } + EV_SET(&ke, sock, filter, EV_ADD, 0, 0, NULL); + if (kevent(eloop.kqueuefd, &ke, 1, NULL, 0, NULL) == -1) { + wpa_printf(MSG_ERROR, "%s: kevent(ADD) for fd=%d " + "failed. %s\n", __func__, sock, strerror(errno)); + return -1; + } + return 0; +} +#endif /* CONFIG_ELOOP_KQUEUE */ static int eloop_sock_table_add_sock(struct eloop_sock_table *table, int sock, eloop_sock_handler handler, void *eloop_data, void *user_data) { #ifdef CONFIG_ELOOP_EPOLL - struct eloop_sock *temp_table; - struct epoll_event ev, *temp_events; - int next; + struct epoll_event *temp_events; #endif /* CONFIG_ELOOP_EPOLL */ -#ifdef CONFIG_ELOOP_KQUEUE +#if defined(CONFIG_ELOOP_EPOLL) || defined(CONFIG_ELOOP_KQUEUE) struct eloop_sock *temp_table; - int next, filter; - struct kevent ke; + int next; #endif struct eloop_sock *tmp; int new_max_sock; @@ -302,53 +358,12 @@ static int eloop_sock_table_add_sock(str table->changed = 1; eloop_trace_sock_add_ref(table); -#ifdef CONFIG_ELOOP_EPOLL - os_memset(&ev, 0, sizeof(ev)); - switch (table->type) { - case EVENT_TYPE_READ: - ev.events = EPOLLIN; - break; - case EVENT_TYPE_WRITE: - ev.events = EPOLLOUT; - break; - /* - * Exceptions are always checked when using epoll, but I suppose it's - * possible that someone registered a socket *only* for exception - * handling. - */ - case EVENT_TYPE_EXCEPTION: - ev.events = EPOLLERR | EPOLLHUP; - break; - } - ev.data.fd = sock; - if (epoll_ctl(eloop.epollfd, EPOLL_CTL_ADD, sock, &ev) < 0) { - wpa_printf(MSG_ERROR, "%s: epoll_ctl(ADD) for fd=%d " - "failed. %s\n", __func__, sock, strerror(errno)); - return -1; - } - os_memcpy(&eloop.fd_table[sock], &table->table[table->count - 1], - sizeof(struct eloop_sock)); -#endif /* CONFIG_ELOOP_EPOLL */ -#ifdef CONFIG_ELOOP_KQUEUE - switch (table->type) { - case EVENT_TYPE_READ: - filter = EVFILT_READ; - break; - case EVENT_TYPE_WRITE: - filter = EVFILT_WRITE; - break; - default: - filter = 0; - } - EV_SET(&ke, sock, filter, EV_ADD, 0, 0, NULL); - if (kevent(eloop.kqueuefd, &ke, 1, NULL, 0, NULL) == -1) { - wpa_printf(MSG_ERROR, "%s: kevent(ADD) for fd=%d " - "failed. %s\n", __func__, sock, strerror(errno)); +#if defined(CONFIG_ELOOP_EPOLL) || defined(CONFIG_ELOOP_KQUEUE) + if (eloop_sock_queue(sock, table->type) == -1) return -1; - } os_memcpy(&eloop.fd_table[sock], &table->table[table->count - 1], sizeof(struct eloop_sock)); -#endif /* CONFIG_ELOOP_KQUEUE */ +#endif return 0; } @@ -621,7 +636,48 @@ static void eloop_sock_table_dispatch(st break; } } -#endif /* CONFIG_ELOOP_KQUEUE */ + +static int eloop_sock_table_requeue(struct eloop_sock_table *table) +{ + int i, r; + struct kevent ke; + + r = 0; + for (i = 0; i < table->count && table->table; i++) { + if (eloop_sock_queue(table->table[i].sock, table->type) == -1) + r = -1; + } + return r; +} + +int eloop_sock_requeue(void) +{ + int r = 0; + + close(eloop.kqueuefd); + eloop.kqueuefd = kqueue(); + if (eloop.kqueuefd < 0) { + wpa_printf(MSG_ERROR, "%s: kqueue failed. %s\n", + __func__, strerror(errno)); + return -1; + } + + if (eloop_sock_table_requeue(&eloop.readers) == -1) + r = -1; + if (eloop_sock_table_requeue(&eloop.writers) == -1) + r = -1; + if (eloop_sock_table_requeue(&eloop.exceptions) == -1) + r = -1; + + return r; +} +#else /* CONFIG_ELOOP_KQUEUE */ +int eloop_sock_requeue(void) +{ + + return 0; +} +#endif /* !CONFIG_ELOOP_KQUEUE */ static void eloop_sock_table_destroy(struct eloop_sock_table *table) { Index: src/external/bsd/wpa/dist/src/utils/eloop.h diff -u src/external/bsd/wpa/dist/src/utils/eloop.h:1.1.1.4 src/external/bsd/wpa/dist/src/utils/eloop.h:1.2 --- src/external/bsd/wpa/dist/src/utils/eloop.h:1.1.1.4 Thu Oct 16 19:16:08 2014 +++ src/external/bsd/wpa/dist/src/utils/eloop.h Wed Jan 20 17:03:35 2016 @@ -313,6 +313,14 @@ int eloop_register_signal_reconfig(eloop void *user_data); /** + * eloop_sock_requeue - Requeue sockets + * + * Requeue sockets after forking because some implementations require this, + * such as epoll and kqueue. + */ +int eloop_sock_requeue(void); + +/** * eloop_run - Start the event loop * * Start the event loop and continue running as long as there are any Index: src/external/bsd/wpa/dist/wpa_supplicant/wpa_cli.c diff -u src/external/bsd/wpa/dist/wpa_supplicant/wpa_cli.c:1.7 src/external/bsd/wpa/dist/wpa_supplicant/wpa_cli.c:1.8 --- src/external/bsd/wpa/dist/wpa_supplicant/wpa_cli.c:1.7 Fri Aug 28 13:05:13 2015 +++ src/external/bsd/wpa/dist/wpa_supplicant/wpa_cli.c Wed Jan 20 17:03:35 2016 @@ -4085,7 +4085,7 @@ int main(int argc, char *argv[]) } } - if (daemonize && os_daemonize(pid_file)) + if (daemonize && os_daemonize(pid_file) && eloop_sock_requeue()) return -1; if (action_file) Index: src/external/bsd/wpa/dist/wpa_supplicant/wpa_supplicant.c diff -u src/external/bsd/wpa/dist/wpa_supplicant/wpa_supplicant.c:1.3 src/external/bsd/wpa/dist/wpa_supplicant/wpa_supplicant.c:1.4 --- src/external/bsd/wpa/dist/wpa_supplicant/wpa_supplicant.c:1.3 Wed Apr 1 19:45:15 2015 +++ src/external/bsd/wpa/dist/wpa_supplicant/wpa_supplicant.c Wed Jan 20 17:03:35 2016 @@ -4630,7 +4630,8 @@ int wpa_supplicant_run(struct wpa_global struct wpa_supplicant *wpa_s; if (global->params.daemonize && - wpa_supplicant_daemon(global->params.pid_file)) + (wpa_supplicant_daemon(global->params.pid_file) || + eloop_sock_requeue())) return -1; if (global->params.wait_for_monitor) {