summaryrefslogtreecommitdiff
path: root/lib/system/fastopen.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/system/fastopen.c')
-rw-r--r--lib/system/fastopen.c107
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;
}