X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Fdetail%2FSocketFastOpen.cpp;h=a6385496d01d78bae1524ece12c085329f35cc3f;hb=1a1ce79ed7c22c3227c17fe797bd6213e4e4ef11;hp=31917eabbe2c2555902b0e3829d81eb8f912f0a2;hpb=106a2a56bbf2dea08947919539944f582d283a20;p=folly.git diff --git a/folly/detail/SocketFastOpen.cpp b/folly/detail/SocketFastOpen.cpp index 31917eab..a6385496 100644 --- a/folly/detail/SocketFastOpen.cpp +++ b/folly/detail/SocketFastOpen.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2016 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,15 +16,15 @@ #include +#include + #include +#include namespace folly { namespace detail { -#if FOLLY_ALLOW_TFO - -#include -#include +#if FOLLY_ALLOW_TFO && defined(__linux__) // Sometimes these flags are not present in the headers, // so define them if not present. @@ -36,6 +36,10 @@ namespace detail { #define TCP_FASTOPEN 23 #endif +#if !defined(TCPI_OPT_SYN_DATA) +#define TCPI_OPT_SYN_DATA 32 +#endif + ssize_t tfo_sendmsg(int sockfd, const struct msghdr* msg, int flags) { flags |= MSG_FASTOPEN; return sendmsg(sockfd, msg, flags); @@ -58,19 +62,60 @@ bool tfo_succeeded(int sockfd) { return info.tcpi_options & TCPI_OPT_SYN_DATA; } -#else +#elif FOLLY_ALLOW_TFO && defined(__APPLE__) 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 */) { errno = EOPNOTSUPP; return -1; } -int tfo_enable(int sockfd, size_t max_queue_size) { +int tfo_enable(int /* sockfd */, size_t /* max_queue_size */) { errno = ENOPROTOOPT; return -1; } -bool tfo_succeeded(int sockfd) { +bool tfo_succeeded(int /* sockfd */) { errno = EOPNOTSUPP; return false; }