Add SO_ZEROCOPY support
[folly.git] / folly / io / async / AsyncServerSocket.cpp
index 8a70d77cc188701d60875ee0bde36386f8721fe0..c9f391f08640612a7a01972d4dcb4a066c12ea2d 100644 (file)
@@ -39,6 +39,13 @@ namespace fsp = folly::portability::sockets;
 
 namespace folly {
 
 
 namespace folly {
 
+static constexpr bool msgErrQueueSupported =
+#ifdef MSG_ERRQUEUE
+    true;
+#else
+    false;
+#endif // MSG_ERRQUEUE
+
 const uint32_t AsyncServerSocket::kDefaultMaxAcceptAtOnce;
 const uint32_t AsyncServerSocket::kDefaultCallbackAcceptAtOnce;
 const uint32_t AsyncServerSocket::kDefaultMaxMessagesInQueue;
 const uint32_t AsyncServerSocket::kDefaultMaxAcceptAtOnce;
 const uint32_t AsyncServerSocket::kDefaultCallbackAcceptAtOnce;
 const uint32_t AsyncServerSocket::kDefaultMaxMessagesInQueue;
@@ -331,6 +338,18 @@ void AsyncServerSocket::bindSocket(
   }
 }
 
   }
 }
 
+bool AsyncServerSocket::setZeroCopy(bool enable) {
+  if (msgErrQueueSupported) {
+    int fd = getSocket();
+    int val = enable ? 1 : 0;
+    int ret = setsockopt(fd, SOL_SOCKET, SO_ZEROCOPY, &val, sizeof(val));
+
+    return (0 == ret);
+  }
+
+  return false;
+}
+
 void AsyncServerSocket::bind(const SocketAddress& address) {
   if (eventBase_) {
     eventBase_->dcheckIsInEventBaseThread();
 void AsyncServerSocket::bind(const SocketAddress& address) {
   if (eventBase_) {
     eventBase_->dcheckIsInEventBaseThread();