diff options
author | Felix Fietkau <nbd@openwrt.org> | 2012-12-31 17:43:07 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2012-12-31 17:43:07 +0100 |
commit | 4f73862b48183465adfd30a2f7fc2b5a7dab12a3 (patch) | |
tree | 173b0b36f40532b77069c08632f343bb10522fc9 /listen.c | |
parent | b6d9114baa1f8323084001fd4bc44fb08f7f1b35 (diff) |
set keepalive option after all command line parameters have been processed
Diffstat (limited to 'listen.c')
-rw-r--r-- | listen.c | 39 |
1 files changed, 20 insertions, 19 deletions
@@ -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) { |