TFO: remember setsockopt results, to condition non-transport client use. Bug 2027
authorJeremy Harris <jgh146exb@wizmail.org>
Thu, 26 Jan 2017 20:21:57 +0000 (20:21 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Sun, 29 Jan 2017 15:10:53 +0000 (15:10 +0000)
src/src/daemon.c
src/src/globals.c
src/src/globals.h
src/src/ip.c

index d799ea4..67ee6cb 100644 (file)
@@ -1423,6 +1423,9 @@ if (daemon_listen && !inetd_wait_mode)
     necessary for (some release of) USAGI Linux; other IP stacks fail at the
     listen() stage instead. */
 
+#ifdef TCP_FASTOPEN
+    tcp_fastopen_ok = TRUE;
+#endif
     for(;;)
       {
       uschar *msg, *addr;
@@ -1459,7 +1462,10 @@ if (daemon_listen && !inetd_wait_mode)
 #ifdef TCP_FASTOPEN
     if (setsockopt(listen_sockets[sk], IPPROTO_TCP, TCP_FASTOPEN,
                    &smtp_connect_backlog, sizeof(smtp_connect_backlog)))
+      {
       DEBUG(D_any) debug_printf("setsockopt FASTOPEN: %s\n", strerror(errno));
+      tcp_fastopen_ok = FALSE;
+      }
 #endif
 
     /* Start listening on the bound socket, establishing the maximum backlog of
index bb5acb6..86f7f5b 100644 (file)
@@ -1400,6 +1400,7 @@ uid_t   system_filter_uid      = (uid_t)-1;
 BOOL    system_filter_uid_set  = FALSE;
 BOOL    system_filtering       = FALSE;
 
+BOOL    tcp_fastopen_ok        = FALSE;
 BOOL    tcp_nodelay            = TRUE;
 #ifdef USE_TCP_WRAPPERS
 uschar *tcp_wrappers_daemon_name = US TCP_WRAPPERS_DAEMON_NAME;
index 62bcb7a..5adad7b 100644 (file)
@@ -906,6 +906,7 @@ extern uid_t   system_filter_uid;      /* Uid for running system filter */
 extern BOOL    system_filter_uid_set;  /* TRUE if uid set */
 extern BOOL    system_filtering;       /* TRUE when running system filter */
 
+extern BOOL    tcp_fastopen_ok;               /* appears to be supported by kernel */
 extern BOOL    tcp_nodelay;            /* Controls TCP_NODELAY on daemon */
 #ifdef USE_TCP_WRAPPERS
 extern uschar *tcp_wrappers_daemon_name; /* tcpwrappers daemon lookup name */
index 8bb6bed..51bd74b 100644 (file)
@@ -303,6 +303,7 @@ int namelen, port;
 host_item shost;
 host_item *h;
 int af = 0, fd, fd4 = -1, fd6 = -1;
+BOOL fastopen = tcp_fastopen_ok && type == SOCK_STREAM;
 
 shost.next = NULL;
 shost.address = NULL;
@@ -358,7 +359,7 @@ for (h = &shost; h; h = h->next)
     }
 
   for(port = portlo; port <= porthi; port++)
-    if (ip_connect(fd, af, h->address, port, timeout, type == SOCK_STREAM) == 0)
+    if (ip_connect(fd, af, h->address, port, timeout, fastopen) == 0)
       {
       if (fd != fd6) close(fd6);
       if (fd != fd4) close(fd4);