Add tfo functions for apple
authorSubodh Iyengar <subodh@fb.com>
Thu, 29 Sep 2016 13:42:10 +0000 (06:42 -0700)
committerFacebook Github Bot <facebook-github-bot-bot@fb.com>
Thu, 29 Sep 2016 13:53:38 +0000 (06:53 -0700)
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

folly/detail/SocketFastOpen.cpp
folly/detail/SocketFastOpen.h

index 6ac35f94aa226006a9492f79375703905a456304..fbca6e253033e83719b00942f0642f98e46bc89e 100644 (file)
@@ -21,7 +21,7 @@
 namespace folly {
 namespace detail {
 
-#if FOLLY_ALLOW_TFO
+#if FOLLY_ALLOW_TFO && defined(__linux__)
 
 #include <netinet/tcp.h>
 #include <stdio.h>
@@ -62,6 +62,49 @@ bool tfo_succeeded(int sockfd) {
   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) {
index fcd997b67c2847678e9dd588f59259d7ed2d4b1e..2b288d3d3562acea251cd13173fbcab95b21edce 100644 (file)
 #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 {