proxygen
NetOps.h
Go to the documentation of this file.
1 /*
2  * Copyright 2013-present Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <cstdint>
20 
25 
26 #ifndef _WIN32
27 #include <netdb.h>
28 #include <poll.h>
29 
30 #include <arpa/inet.h>
31 #include <netinet/in.h>
32 #include <netinet/tcp.h>
33 #include <sys/socket.h>
34 #include <sys/un.h>
35 
36 #ifdef MSG_ERRQUEUE
37 #define FOLLY_HAVE_MSG_ERRQUEUE 1
38 /* for struct sock_extended_err*/
39 #include <linux/errqueue.h>
40 #endif
41 
42 #ifndef SO_EE_ORIGIN_ZEROCOPY
43 #define SO_EE_ORIGIN_ZEROCOPY 5
44 #endif
45 
46 #ifndef SO_EE_CODE_ZEROCOPY_COPIED
47 #define SO_EE_CODE_ZEROCOPY_COPIED 1
48 #endif
49 
50 #ifndef SO_ZEROCOPY
51 #define SO_ZEROCOPY 60
52 #endif
53 
54 #ifndef MSG_ZEROCOPY
55 #define MSG_ZEROCOPY 0x4000000
56 #endif
57 
58 #ifndef SOL_UDP
59 #define SOL_UDP 17
60 #endif
61 
62 #ifndef ETH_MAX_MTU
63 #define ETH_MAX_MTU 0xFFFFU
64 #endif
65 
66 #ifndef UDP_SEGMENT
67 #define UDP_SEGMENT 103
68 #endif
69 
70 #ifndef UDP_MAX_SEGMENTS
71 #define UDP_MAX_SEGMENTS (1 << 6UL)
72 #endif
73 
74 #else
75 #include <WS2tcpip.h> // @manual
76 
77 using nfds_t = int;
78 using sa_family_t = ADDRESS_FAMILY;
79 
80 // these are not supported
81 #define SO_EE_ORIGIN_ZEROCOPY 0
82 #define SO_ZEROCOPY 0
83 #define MSG_ZEROCOPY 0x0
84 #define SOL_UDP 0x0
85 #define UDP_SEGMENT 0x0
86 
87 // We don't actually support either of these flags
88 // currently.
89 #define MSG_DONTWAIT 0x1000
90 #define MSG_EOR 0
91 struct msghdr {
92  void* msg_name;
93  socklen_t msg_namelen;
94  struct iovec* msg_iov;
95  size_t msg_iovlen;
96  void* msg_control;
97  size_t msg_controllen;
98  int msg_flags;
99 };
100 
101 struct sockaddr_un {
102  sa_family_t sun_family;
103  char sun_path[108];
104 };
105 
106 #define SHUT_RD SD_RECEIVE
107 #define SHUT_WR SD_SEND
108 #define SHUT_RDWR SD_BOTH
109 
110 // These are the same, but PF_LOCAL
111 // isn't defined by WinSock.
112 #define AF_LOCAL PF_UNIX
113 #define PF_LOCAL PF_UNIX
114 
115 // This isn't defined by Windows, and we need to
116 // distinguish it from SO_REUSEADDR
117 #define SO_REUSEPORT 0x7001
118 
119 // Someone thought it would be a good idea
120 // to define a field via a macro...
121 #undef s_host
122 #endif
123 
124 namespace folly {
125 namespace netops {
126 // Poll descriptor is intended to be byte-for-byte identical to pollfd,
127 // except that it is typed as containing a NetworkSocket for sane interactions.
132 };
133 
134 NetworkSocket accept(NetworkSocket s, sockaddr* addr, socklen_t* addrlen);
135 int bind(NetworkSocket s, const sockaddr* name, socklen_t namelen);
136 int close(NetworkSocket s);
137 int connect(NetworkSocket s, const sockaddr* name, socklen_t namelen);
138 int getpeername(NetworkSocket s, sockaddr* name, socklen_t* namelen);
139 int getsockname(NetworkSocket s, sockaddr* name, socklen_t* namelen);
140 int getsockopt(
142  int level,
143  int optname,
144  void* optval,
145  socklen_t* optlen);
146 int inet_aton(const char* cp, in_addr* inp);
147 int listen(NetworkSocket s, int backlog);
148 int poll(PollDescriptor fds[], nfds_t nfds, int timeout);
149 ssize_t recv(NetworkSocket s, void* buf, size_t len, int flags);
150 ssize_t recvfrom(
152  void* buf,
153  size_t len,
154  int flags,
155  sockaddr* from,
156  socklen_t* fromlen);
157 ssize_t recvmsg(NetworkSocket s, msghdr* message, int flags);
158 ssize_t send(NetworkSocket s, const void* buf, size_t len, int flags);
159 ssize_t sendto(
161  const void* buf,
162  size_t len,
163  int flags,
164  const sockaddr* to,
165  socklen_t tolen);
166 ssize_t sendmsg(NetworkSocket socket, const msghdr* message, int flags);
167 int setsockopt(
169  int level,
170  int optname,
171  const void* optval,
172  socklen_t optlen);
173 int shutdown(NetworkSocket s, int how);
174 NetworkSocket socket(int af, int type, int protocol);
175 int socketpair(int domain, int type, int protocol, NetworkSocket sv[2]);
176 
177 // And now we diverge from the Posix way of doing things and just do things
178 // our own way.
181 } // namespace netops
182 } // namespace folly
ssize_t recvfrom(NetworkSocket s, void *buf, size_t len, int flags, sockaddr *from, socklen_t *fromlen)
Definition: NetOps.cpp:207
Definition: test.c:42
flags
Definition: http_parser.h:127
int connect(NetworkSocket s, const sockaddr *name, socklen_t namelen)
Definition: NetOps.cpp:94
ssize_t sendmsg(NetworkSocket socket, const msghdr *message, int flags)
Definition: NetOps.cpp:328
int inet_aton(const char *cp, in_addr *inp)
Definition: NetOps.cpp:132
int setsockopt(NetworkSocket s, int level, int optname, const void *optval, socklen_t optlen)
Definition: NetOps.cpp:384
PskType type
—— Concurrent Priority Queue Implementation ——
Definition: AtomicBitSet.h:29
const char * name
Definition: http_parser.c:437
int getsockname(NetworkSocket s, sockaddr *name, socklen_t *namelen)
Definition: NetOps.cpp:108
ssize_t sendto(NetworkSocket s, const void *buf, size_t len, int flags, const sockaddr *to, socklen_t tolen)
Definition: NetOps.cpp:369
std::enable_if< detail::is_chrono_conversion< Tgt, Src >::value, Tgt >::type to(const Src &value)
Definition: Conv.h:677
int getsockopt(NetworkSocket s, int level, int optname, void *optval, socklen_t *optlen)
Definition: NetOps.cpp:112
void shutdown(Counter &)
ssize_t send(NetworkSocket s, const void *buf, size_t len, int flags)
Definition: NetOps.cpp:319
NetworkSocket socket(int af, int type, int protocol)
Definition: NetOps.cpp:412
int listen(NetworkSocket s, int backlog)
Definition: NetOps.cpp:137
PUSHMI_INLINE_VAR constexpr struct folly::pushmi::operators::from_fn from
ssize_t recvmsg(NetworkSocket s, msghdr *message, int flags)
Definition: NetOps.cpp:268
int set_socket_non_blocking(NetworkSocket s)
Definition: NetOps.cpp:441
int poll(PollDescriptor fds[], nfds_t nfds, int timeout)
Definition: NetOps.cpp:141
int bind(NetworkSocket s, const sockaddr *name, socklen_t namelen)
Definition: NetOps.cpp:76
static set< string > s
int getpeername(NetworkSocket s, sockaddr *name, socklen_t *namelen)
Definition: NetOps.cpp:104
int set_socket_close_on_exec(NetworkSocket s)
Definition: NetOps.cpp:454
ssize_t recv(NetworkSocket s, void *buf, size_t len, int flags)
Definition: NetOps.cpp:180
int close(NetworkSocket s)
Definition: NetOps.cpp:90
ThreadPoolListHook * addr
int socketpair(int domain, int type, int protocol, NetworkSocket sv[2])
Definition: NetOps.cpp:416
NetworkSocket accept(NetworkSocket s, sockaddr *addr, socklen_t *addrlen)
Definition: NetOps.cpp:71