diff options
Diffstat (limited to 'lib/system/fastopen.c')
-rw-r--r-- | lib/system/fastopen.c | 107 |
1 files changed, 52 insertions, 55 deletions
diff --git a/lib/system/fastopen.c b/lib/system/fastopen.c index e60abf4aa5..4369223144 100644 --- a/lib/system/fastopen.c +++ b/lib/system/fastopen.c @@ -26,23 +26,25 @@ #include "errors.h" #include <sys/socket.h> -#include <netinet/in.h> /* IPPROTO_TCP */ +#include <netinet/in.h> /* IPPROTO_TCP */ #include <errno.h> #include <sys/stat.h> #include <sys/types.h> /* Get TCP_FASTOPEN */ #ifdef HAVE_NETINET_TCP_H -# include <netinet/tcp.h> +#include <netinet/tcp.h> #endif /* TCP Fast Open on OSX behaves differently from Linux, so define these helpers */ -#if defined __APPLE__ && defined __MACH__ && defined CONNECT_DATA_IDEMPOTENT && defined CONNECT_RESUME_ON_READ_WRITE -# if defined __has_builtin && __has_builtin(__builtin_available) -# define TCP_FASTOPEN_OSX -# endif +#if defined __APPLE__ && defined __MACH__ && \ + defined CONNECT_DATA_IDEMPOTENT && \ + defined CONNECT_RESUME_ON_READ_WRITE +#if defined __has_builtin && __has_builtin(__builtin_available) +#define TCP_FASTOPEN_OSX +#endif #elif defined TCP_FASTOPEN && defined MSG_FASTOPEN -# define TCP_FASTOPEN_LINUX +#define TCP_FASTOPEN_LINUX #endif /* Do not use the gnulib functions for sending and receiving data. @@ -54,8 +56,8 @@ #undef connect #ifdef _WIN32 -static ssize_t -tfo_writev(gnutls_transport_ptr_t ptr, const giovec_t * iovec, int iovec_cnt) +static ssize_t tfo_writev(gnutls_transport_ptr_t ptr, const giovec_t *iovec, + int iovec_cnt) { tfo_st *p = ptr; int fd = p->fd; @@ -80,9 +82,9 @@ tfo_writev(gnutls_transport_ptr_t ptr, const giovec_t * iovec, int iovec_cnt) return system_writev(GNUTLS_INT_TO_POINTER(fd), iovec, iovec_cnt); } -#else /* sendmsg */ -static ssize_t -tfo_writev(gnutls_transport_ptr_t ptr, const giovec_t * iovec, int iovec_cnt) +#else /* sendmsg */ +static ssize_t tfo_writev(gnutls_transport_ptr_t ptr, const giovec_t *iovec, + int iovec_cnt) { tfo_st *p = ptr; int fd = p->fd; @@ -96,14 +98,14 @@ tfo_writev(gnutls_transport_ptr_t ptr, const giovec_t * iovec, int iovec_cnt) if (likely(!p->connect_addrlen)) return sendmsg(fd, &hdr, p->flags); -# if defined(TCP_FASTOPEN_LINUX) +#if defined(TCP_FASTOPEN_LINUX) if (!p->connect_only) { int on = 1; - if (setsockopt(fd, IPPROTO_TCP, TCP_FASTOPEN, &on, sizeof(on)) - == -1) - _gnutls_debug_log - ("Failed to set socket option FASTOPEN\n"); + if (setsockopt(fd, IPPROTO_TCP, TCP_FASTOPEN, &on, + sizeof(on)) == -1) + _gnutls_debug_log( + "Failed to set socket option FASTOPEN\n"); hdr.msg_name = &p->connect_addr; hdr.msg_namelen = p->connect_addrlen; @@ -113,20 +115,19 @@ tfo_writev(gnutls_transport_ptr_t ptr, const giovec_t * iovec, int iovec_cnt) if (ret < 0) { if (errno == EINPROGRESS) { gnutls_assert(); - errno = EAGAIN; // GnuTLS does not handle EINPROGRESS + errno = EAGAIN; // GnuTLS does not handle EINPROGRESS } else if (errno == EOPNOTSUPP) { // fallback from fastopen, e.g. when fastopen is disabled in system - _gnutls_debug_log - ("Fallback from TCP Fast Open... TFO is not enabled at system level\n"); + _gnutls_debug_log( + "Fallback from TCP Fast Open... TFO is not enabled at system level\n"); p->connect_only = 1; goto connect_only; } } } else { - connect_only: - ret = - connect(fd, (struct sockaddr *)&p->connect_addr, - p->connect_addrlen); + connect_only: + ret = connect(fd, (struct sockaddr *)&p->connect_addr, + p->connect_addrlen); if (errno == ENOTCONN || errno == EINPROGRESS) { gnutls_assert(); errno = EAGAIN; @@ -135,40 +136,37 @@ tfo_writev(gnutls_transport_ptr_t ptr, const giovec_t * iovec, int iovec_cnt) if (ret == 0) p->connect_only = 0; } -# elif defined(TCP_FASTOPEN_OSX) +#elif defined(TCP_FASTOPEN_OSX) { - if (__builtin_available - (macOS 10.11, iOS 9.0, tvOS 9.0, watchOS 2.0, *)) { - sa_endpoints_t endpoints = {.sae_dstaddr = - (struct sockaddr *)&p-> - connect_addr,.sae_dstaddrlen = - p->connect_addrlen + if (__builtin_available(macOS 10.11, iOS 9.0, tvOS 9.0, + watchOS 2.0, *)) { + sa_endpoints_t endpoints = { + .sae_dstaddr = + (struct sockaddr *)&p->connect_addr, + .sae_dstaddrlen = p->connect_addrlen }; - ret = - connectx(fd, &endpoints, SAE_ASSOCID_ANY, - CONNECT_RESUME_ON_READ_WRITE | - CONNECT_DATA_IDEMPOTENT, NULL, 0, NULL, - NULL); + ret = connectx(fd, &endpoints, SAE_ASSOCID_ANY, + CONNECT_RESUME_ON_READ_WRITE | + CONNECT_DATA_IDEMPOTENT, + NULL, 0, NULL, NULL); } else { - ret = - connect(fd, (struct sockaddr *)&p->connect_addr, - p->connect_addrlen); + ret = connect(fd, (struct sockaddr *)&p->connect_addr, + p->connect_addrlen); } if (errno == ENOTCONN || errno == EINPROGRESS) { gnutls_assert(); errno = EAGAIN; } } -# else - ret = - connect(fd, (struct sockaddr *)&p->connect_addr, - p->connect_addrlen); +#else + ret = connect(fd, (struct sockaddr *)&p->connect_addr, + p->connect_addrlen); if (errno == ENOTCONN || errno == EINPROGRESS) { gnutls_assert(); errno = EAGAIN; } -# endif +#endif if (ret == 0 || errno != EAGAIN) { /* This has to be called just once, connect info not needed any more */ @@ -177,19 +175,18 @@ tfo_writev(gnutls_transport_ptr_t ptr, const giovec_t * iovec, int iovec_cnt) return ret; } -#endif /* sendmsg */ +#endif /* sendmsg */ -static -int tfo_recv_timeout(gnutls_transport_ptr_t ptr, unsigned int ms) +static int tfo_recv_timeout(gnutls_transport_ptr_t ptr, unsigned int ms) { tfo_st *p = ptr; - return gnutls_system_recv_timeout((gnutls_transport_ptr_t) (long)p->fd, + return gnutls_system_recv_timeout((gnutls_transport_ptr_t)(long)p->fd, ms); } -static ssize_t -tfo_read(gnutls_transport_ptr_t ptr, void *data, size_t data_size) +static ssize_t tfo_read(gnutls_transport_ptr_t ptr, void *data, + size_t data_size) { tfo_st *p = ptr; @@ -228,13 +225,13 @@ tfo_read(gnutls_transport_ptr_t ptr, void *data, size_t data_size) * * Since: 3.5.3 **/ -void -gnutls_transport_set_fastopen(gnutls_session_t session, - int fd, struct sockaddr *connect_addr, - socklen_t connect_addrlen, unsigned int flags) +void gnutls_transport_set_fastopen(gnutls_session_t session, int fd, + struct sockaddr *connect_addr, + socklen_t connect_addrlen, + unsigned int flags) { if (connect_addrlen > - (socklen_t) sizeof(session->internals.tfo.connect_addr)) { + (socklen_t)sizeof(session->internals.tfo.connect_addr)) { gnutls_assert(); return; } |