diff --git a/configure.ac b/configure.ac index c15ff4e4c..a72a612fb 100755 --- a/configure.ac +++ b/configure.ac @@ -3275,6 +3275,7 @@ AC_CHECK_HEADERS( net/if.h \ netinet/in.h \ sys/un.h \ + linux/tcp.h \ netinet/tcp.h \ netdb.h \ sys/sockio.h \ diff --git a/lib/connect.c b/lib/connect.c index 45e18bc07..3edb71eb7 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -28,8 +28,10 @@ #ifdef HAVE_SYS_UN_H #include /* for sockaddr_un */ #endif -#ifdef HAVE_NETINET_TCP_H -#include /* for TCP_NODELAY */ +#ifdef HAVE_LINUX_TCP_H +#include +#elif defined(HAVE_NETINET_TCP_H) +#include #endif #ifdef HAVE_SYS_IOCTL_H #include @@ -989,6 +991,9 @@ static CURLcode singleipconnect(struct connectdata *conn, char ipaddress[MAX_IPADR_LEN]; long port; bool is_tcp; +#ifdef TCP_FASTOPEN_CONNECT + int optval = 1; +#endif *sockp = CURL_SOCKET_BAD; @@ -1092,7 +1097,15 @@ static CURLcode singleipconnect(struct connectdata *conn, # else rc = connect(sockfd, &addr.sa_addr, addr.addrlen); # endif /* HAVE_BUILTIN_AVAILABLE */ -#elif defined(MSG_FASTOPEN) /* Linux */ +#elif defined(TCP_FASTOPEN_CONNECT) /* Linux >= 4.11 */ + if(setsockopt(sockfd, IPPROTO_TCP, TCP_FASTOPEN_CONNECT, + (void *)&optval, sizeof(optval)) < 0) + infof(data, "Failed to enable TCP Fast Open on fd %d\n", sockfd); + else + infof(data, "TCP_FASTOPEN_CONNECT set\n"); + + rc = connect(sockfd, &addr.sa_addr, addr.addrlen); +#elif defined(MSG_FASTOPEN) /* old Linux */ if(conn->given->flags & PROTOPT_SSL) rc = connect(sockfd, &addr.sa_addr, addr.addrlen); else diff --git a/lib/sendf.c b/lib/sendf.c index cbdb233fd..a1cb8e478 100644 --- a/lib/sendf.c +++ b/lib/sendf.c @@ -22,6 +22,10 @@ #include "curl_setup.h" +#ifdef HAVE_LINUX_TCP_H +#include +#endif + #include #include "urldata.h" @@ -360,7 +364,7 @@ ssize_t Curl_send_plain(struct connectdata *conn, int num, available. */ pre_receive_plain(conn, num); -#ifdef MSG_FASTOPEN /* Linux */ +#if defined(MSG_FASTOPEN) && !defined(TCP_FASTOPEN_CONNECT) /* Linux */ if(conn->bits.tcp_fastopen) { bytes_written = sendto(sockfd, mem, len, MSG_FASTOPEN, conn->ip_addr->ai_addr, conn->ip_addr->ai_addrlen); diff --git a/lib/setopt.c b/lib/setopt.c index 200bfc5ab..70466bffb 100644 --- a/lib/setopt.c +++ b/lib/setopt.c @@ -26,6 +26,10 @@ #include #endif +#ifdef HAVE_LINUX_TCP_H +#include +#endif + #include "urldata.h" #include "url.h" #include "progress.h" @@ -2450,7 +2454,8 @@ static CURLcode setopt(struct Curl_easy *data, CURLoption option, data->set.tcp_keepintvl = arg; break; case CURLOPT_TCP_FASTOPEN: -#if defined(CONNECT_DATA_IDEMPOTENT) || defined(MSG_FASTOPEN) +#if defined(CONNECT_DATA_IDEMPOTENT) || defined(MSG_FASTOPEN) || \ + defined(TCP_FASTOPEN_CONNECT) data->set.tcp_fastopen = (0 != va_arg(param, long))?TRUE:FALSE; #else result = CURLE_NOT_BUILT_IN;