set keepalive option after all command line parameters have been processed
authorFelix Fietkau <nbd@openwrt.org>
Mon, 31 Dec 2012 16:43:07 +0000 (17:43 +0100)
committerFelix Fietkau <nbd@openwrt.org>
Mon, 31 Dec 2012 16:43:07 +0000 (17:43 +0100)
listen.c

index 13054fb9c3f055c11752c22f442259e9c5db63a7..55d71435b7007a3cc5b5ca2764176c2bfc64cca5 100644 (file)
--- 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) {