namespace folly {
namespace detail {
-#if FOLLY_ALLOW_TFO
+#if FOLLY_ALLOW_TFO && defined(__linux__)
#include <netinet/tcp.h>
#include <stdio.h>
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
ssize_t tfo_sendmsg(int sockfd, const struct msghdr* msg, int flags) {
#include <folly/portability/Sockets.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
#define FOLLY_ALLOW_TFO 1
#endif
+#endif
namespace folly {
namespace detail {