summaryrefslogtreecommitdiff
path: root/listen.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2012-12-31 17:43:07 +0100
committerFelix Fietkau <nbd@openwrt.org>2012-12-31 17:43:07 +0100
commit4f73862b48183465adfd30a2f7fc2b5a7dab12a3 (patch)
tree173b0b36f40532b77069c08632f343bb10522fc9 /listen.c
parentb6d9114baa1f8323084001fd4bc44fb08f7f1b35 (diff)
set keepalive option after all command line parameters have been processed
Diffstat (limited to 'listen.c')
-rw-r--r--listen.c39
1 files changed, 20 insertions, 19 deletions
diff --git a/listen.c b/listen.c
index 13054fb..55d7143 100644
--- a/listen.c
+++ b/listen.c
@@ -75,8 +75,28 @@ static void listener_cb(struct uloop_fd *fd, unsigned int events)
void uh_setup_listeners(void)
{
struct listener *l;
+ int yes = 1;
list_for_each_entry(l, &listeners, list) {
+ int sock = l->fd.fd;
+
+ /* TCP keep-alive */
+ if (conf.tcp_keepalive > 0) {
+#ifdef linux
+ int tcp_ka_idl, tcp_ka_int, tcp_ka_cnt;
+
+ tcp_ka_idl = 1;
+ tcp_ka_cnt = 3;
+ tcp_ka_int = conf.tcp_keepalive;
+
+ setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, &tcp_ka_idl, sizeof(tcp_ka_idl));
+ setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, &tcp_ka_int, sizeof(tcp_ka_int));
+ setsockopt(sock, SOL_TCP, TCP_KEEPCNT, &tcp_ka_cnt, sizeof(tcp_ka_cnt));
+#endif
+
+ setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &yes, sizeof(yes));
+ }
+
l->fd.cb = listener_cb;
uloop_fd_add(&l->fd, ULOOP_READ);
}
@@ -116,25 +136,6 @@ int uh_socket_bind(const char *host, const char *port, bool tls)
goto error;
}
- /* TCP keep-alive */
- if (conf.tcp_keepalive > 0) {
- int ret = 0;
-#ifdef linux
- int tcp_ka_idl, tcp_ka_int, tcp_ka_cnt;
-
- tcp_ka_idl = 1;
- tcp_ka_cnt = 3;
- tcp_ka_int = conf.tcp_keepalive;
- ret = setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, &tcp_ka_idl, sizeof(tcp_ka_idl)) ||
- setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, &tcp_ka_int, sizeof(tcp_ka_int)) ||
- setsockopt(sock, SOL_TCP, TCP_KEEPCNT, &tcp_ka_cnt, sizeof(tcp_ka_cnt));
-#endif
-
- if (ret || setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &yes, sizeof(yes)))
- fprintf(stderr, "Notice: Unable to enable TCP keep-alive: %s\n",
- strerror(errno));
- }
-
/* required to get parallel v4 + v6 working */
if (p->ai_family == AF_INET6 &&
setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof(yes)) < 0) {