Add SO_ZEROCOPY support
[folly.git] / folly / portability / Sockets.h
index 83e1b92e5c24a712dc9d1ebcf22bf0b174b8c339..99f1424dd7dc26b2569262edccb2429e9db91e27 100755 (executable)
@@ -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.
 #include <netinet/tcp.h>
 #include <sys/socket.h>
 #include <sys/un.h>
+
+#ifdef MSG_ERRQUEUE
+/* for struct sock_extended_err*/
+#include <linux/errqueue.h>
+#endif
+
+#ifndef SO_EE_ORIGIN_ZEROCOPY
+#define SO_EE_ORIGIN_ZEROCOPY 5
+#endif
+
+#ifndef SO_ZEROCOPY
+#define SO_ZEROCOPY 60
+#endif
+
+#ifndef MSG_ZEROCOPY
+#define MSG_ZEROCOPY 0x4000000
+#endif
+
 #else
 #include <folly/portability/IOVec.h>
 #include <folly/portability/SysTypes.h>
 #include <folly/portability/Windows.h>
 
-#include <WS2tcpip.h>
+#include <WS2tcpip.h> // @manual
 
 using nfds_t = int;
 using sa_family_t = ADDRESS_FAMILY;
 
+// these are not supported
+#define SO_EE_ORIGIN_ZEROCOPY 0
+#define SO_ZEROCOPY 0
+#define MSG_ZEROCOPY 0x0
+
 // We don't actually support either of these flags
 // currently.
-#define MSG_DONTWAIT 0
+#define MSG_DONTWAIT 0x1000
 #define MSG_EOR 0
 struct msghdr {
   void* msg_name;
@@ -60,8 +83,12 @@ struct sockaddr_un {
 
 // These are the same, but PF_LOCAL
 // isn't defined by WinSock.
+#define AF_LOCAL PF_UNIX
 #define PF_LOCAL PF_UNIX
-#define SO_REUSEPORT SO_REUSEADDR
+
+// This isn't defined by Windows, and we need to
+// distinguish it from SO_REUSEADDR
+#define SO_REUSEPORT 0x7001
 
 // Someone thought it would be a good idea
 // to define a field via a macro...
@@ -94,6 +121,7 @@ using ::socket;
 bool is_fh_socket(int fh);
 SOCKET fd_to_socket(int fd);
 int socket_to_fd(SOCKET s);
+int translate_wsa_error(int wsaErr);
 
 // These aren't additional overloads, but rather other functions that
 // are referenced that we need to wrap, or, in the case of inet_aton,
@@ -193,5 +221,6 @@ int setsockopt(
 
 #ifdef _WIN32
 // Add our helpers to the overload set.
-/* using override */ using namespace folly::portability::sockets;
+/* using override */
+using namespace folly::portability::sockets;
 #endif