Commit edbb8ae9 authored by Subodh Iyengar's avatar Subodh Iyengar Committed by Facebook Github Bot

Add tfo functions for apple

Summary:
Adds TFO functions for apple devices
Also allows android as well by removing that
restriction. Newer versions of android support
TFO, so this allows us to experiment with them

Reviewed By: yfeldblum

Differential Revision: D3942664

fbshipit-source-id: faf439783b018cf7c987a2e3ade5ea6c0c02bf48
parent d6c0ba01
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
namespace folly { namespace folly {
namespace detail { namespace detail {
#if FOLLY_ALLOW_TFO #if FOLLY_ALLOW_TFO && defined(__linux__)
#include <netinet/tcp.h> #include <netinet/tcp.h>
#include <stdio.h> #include <stdio.h>
...@@ -62,6 +62,49 @@ bool tfo_succeeded(int sockfd) { ...@@ -62,6 +62,49 @@ bool tfo_succeeded(int sockfd) {
return info.tcpi_options & TCPI_OPT_SYN_DATA; return info.tcpi_options & TCPI_OPT_SYN_DATA;
} }
#elif FOLLY_ALLOW_TFO && defined(__APPLE__)
#include <netinet/tcp.h>
#include <sys/socket.h>
ssize_t tfo_sendmsg(int sockfd, const struct msghdr* msg, int flags) {
sa_endpoints_t endpoints;
endpoints.sae_srcif = 0;
endpoints.sae_srcaddr = nullptr;
endpoints.sae_srcaddrlen = 0;
endpoints.sae_dstaddr = (struct sockaddr*)msg->msg_name;
endpoints.sae_dstaddrlen = msg->msg_namelen;
int ret = connectx(
sockfd,
&endpoints,
SAE_ASSOCID_ANY,
CONNECT_RESUME_ON_READ_WRITE | CONNECT_DATA_IDEMPOTENT,
nullptr,
0,
nullptr,
nullptr);
if (ret != 0) {
return ret;
}
ret = sendmsg(sockfd, msg, flags);
return ret;
}
int tfo_enable(int sockfd, size_t max_queue_size) {
return setsockopt(
sockfd,
IPPROTO_TCP,
TCP_FASTOPEN,
&max_queue_size,
sizeof(max_queue_size));
}
bool tfo_succeeded(int sockfd) {
errno = EOPNOTSUPP;
return false;
}
#else #else
ssize_t tfo_sendmsg(int sockfd, const struct msghdr* msg, int flags) { ssize_t tfo_sendmsg(int sockfd, const struct msghdr* msg, int flags) {
......
...@@ -19,10 +19,12 @@ ...@@ -19,10 +19,12 @@
#include <folly/portability/Sockets.h> #include <folly/portability/Sockets.h>
#include <sys/types.h> #include <sys/types.h>
#if !defined(FOLLY_ALLOW_TFO) && defined(__linux__) && !defined(__ANDROID__) #if !defined(FOLLY_ALLOW_TFO)
#if defined(__linux__) || defined(__APPLE__)
// only allow for linux right now // only allow for linux right now
#define FOLLY_ALLOW_TFO 1 #define FOLLY_ALLOW_TFO 1
#endif #endif
#endif
namespace folly { namespace folly {
namespace detail { namespace detail {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment