1 // 2 // 3 // Copyright 2016 gRPC authors. 4 // 5 // Licensed under the Apache License, Version 2.0 (the "License"); 6 // you may not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 // 17 // 18 #ifndef GRPC_SRC_CORE_LIB_IOMGR_PORT_H 19 #define GRPC_SRC_CORE_LIB_IOMGR_PORT_H 20 21 #include <grpc/support/port_platform.h> 22 23 // IWYU pragma: no_include <features.h> 24 // IWYU pragma: no_include <linux/version.h> 25 26 // This needs to be separate from the other conditions because it needs to 27 // apply to custom sockets too 28 #ifdef GPR_WINDOWS 29 #define GRPC_ARES_RESOLVE_LOCALHOST_MANUALLY 1 30 #endif 31 #if defined(GPR_WINDOWS) 32 #define GRPC_WINSOCK_SOCKET 1 33 #ifndef __MINGW32__ 34 #define GRPC_HAVE_UNIX_SOCKET 1 35 #endif // __MINGW32__ 36 #define GRPC_WINDOWS_SOCKETUTILS 1 37 #define GRPC_WINDOWS_SOCKET_ARES_EV_DRIVER 1 38 #elif defined(GPR_ANDROID) 39 #define GRPC_HAVE_IPV6_RECVPKTINFO 1 40 #define GRPC_HAVE_IP_PKTINFO 1 41 #define GRPC_HAVE_MSG_NOSIGNAL 1 42 #define GRPC_HAVE_UNIX_SOCKET 1 43 #if defined(LINUX_VERSION_CODE) && defined(__NDK_MAJOR__) 44 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) && __NDK_MAJOR__ >= 14 45 #define GRPC_HAVE_VSOCK 1 46 #endif 47 #endif 48 #define GRPC_LINUX_EVENTFD 1 49 #define GRPC_POSIX_SOCKET 1 50 #define GRPC_POSIX_SOCKETUTILS 1 51 #define GRPC_POSIX_WAKEUP_FD 1 52 #elif defined(GPR_LINUX) 53 #define GRPC_HAVE_ARPA_NAMESER 1 54 #define GRPC_HAVE_IFADDRS 1 55 #define GRPC_HAVE_IPV6_RECVPKTINFO 1 56 #define GRPC_HAVE_IP_PKTINFO 1 57 #define GRPC_HAVE_MSG_NOSIGNAL 1 58 #define GRPC_HAVE_UNIX_SOCKET 1 59 // Linux has TCP_INQ support since 4.18, but it is safe to set 60 // the socket option on older kernels. 61 #define GRPC_HAVE_TCP_INQ 1 62 #ifdef LINUX_VERSION_CODE 63 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0) 64 #define GRPC_LINUX_ERRQUEUE 1 65 #endif // LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0) 66 #endif // LINUX_VERSION_CODE 67 #if defined(LINUX_VERSION_CODE) && defined(__GLIBC_PREREQ) 68 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) && __GLIBC_PREREQ(2, 18) 69 #define GRPC_HAVE_VSOCK 1 70 #endif 71 #endif 72 #define GRPC_LINUX_MULTIPOLL_WITH_EPOLL 1 73 #define GRPC_POSIX_FORK 1 74 #define GRPC_POSIX_HOST_NAME_MAX 1 75 #define GRPC_POSIX_SOCKET 1 76 #define GRPC_POSIX_WAKEUP_FD 1 77 #ifdef __GLIBC_PREREQ 78 #if __GLIBC_PREREQ(2, 4) 79 #define GRPC_LINUX_EPOLL 1 80 #endif 81 #if __GLIBC_PREREQ(2, 9) 82 #define GRPC_LINUX_EPOLL_CREATE1 1 83 #define GRPC_LINUX_EVENTFD 1 84 #endif 85 #if __GLIBC_PREREQ(2, 10) 86 #define GRPC_LINUX_SOCKETUTILS 1 87 #endif 88 #if !(__GLIBC_PREREQ(2, 18)) 89 // 90 // TCP_USER_TIMEOUT wasn't imported to glibc until 2.18. Use Linux system 91 // header instead. 92 // 93 #define GRPC_LINUX_TCP_H 1 94 #endif // __GLIBC_PREREQ(2, 17) 95 #endif 96 #ifndef __GLIBC__ 97 #define GRPC_LINUX_EPOLL 1 98 #define GRPC_LINUX_EPOLL_CREATE1 1 99 #define GRPC_LINUX_EVENTFD 1 100 #define GRPC_MSG_IOVLEN_TYPE int 101 #endif 102 #ifndef GRPC_LINUX_EVENTFD 103 #define GRPC_POSIX_NO_SPECIAL_WAKEUP_FD 1 104 #endif 105 #ifndef GRPC_LINUX_SOCKETUTILS 106 #define GRPC_POSIX_SOCKETUTILS 107 #endif 108 #elif defined(GPR_APPLE) 109 #define GRPC_HAVE_ARPA_NAMESER 1 110 #define GRPC_HAVE_IFADDRS 1 111 #define GRPC_HAVE_SO_NOSIGPIPE 1 112 #define GRPC_HAVE_UNIX_SOCKET 1 113 #define GRPC_MSG_IOVLEN_TYPE int 114 #define GRPC_POSIX_FORK 1 115 #define GRPC_POSIX_NO_SPECIAL_WAKEUP_FD 1 116 #ifdef GRPC_CFSTREAM 117 #define GRPC_CFSTREAM_IOMGR 1 118 #define GRPC_CFSTREAM_CLIENT 1 119 #define GRPC_CFSTREAM_ENDPOINT 1 120 #define GRPC_APPLE_EV 1 121 #define GRPC_POSIX_SOCKET_ARES_EV_DRIVER 1 122 #define GRPC_POSIX_SOCKET_EV 1 123 #define GRPC_POSIX_SOCKET_EV_EPOLL1 1 124 #define GRPC_POSIX_SOCKET_EV_POLL 1 125 #define GRPC_POSIX_SOCKET_IF_NAMETOINDEX 1 126 #define GRPC_POSIX_SOCKET_RESOLVE_ADDRESS 1 127 #define GRPC_POSIX_SOCKET_SOCKADDR 1 128 #define GRPC_POSIX_SOCKET_SOCKET_FACTORY 1 129 #define GRPC_POSIX_SOCKET_TCP 1 130 #define GRPC_POSIX_SOCKET_TCP_CLIENT 1 131 #define GRPC_POSIX_SOCKET_TCP_SERVER 1 132 #define GRPC_POSIX_SOCKET_TCP_SERVER_UTILS_COMMON 1 133 #define GRPC_POSIX_SOCKET_UDP_SERVER 1 134 #define GRPC_POSIX_SOCKET_UTILS_COMMON 1 135 #else 136 #define GRPC_POSIX_SOCKET 1 137 #endif 138 #define GRPC_POSIX_SOCKETUTILS 1 139 #define GRPC_POSIX_SYSCONF 1 140 #define GRPC_POSIX_WAKEUP_FD 1 141 #elif defined(GPR_FREEBSD) 142 #define GRPC_HAVE_ARPA_NAMESER 1 143 #define GRPC_HAVE_IFADDRS 1 144 #define GRPC_HAVE_IPV6_RECVPKTINFO 1 145 #define GRPC_HAVE_SO_NOSIGPIPE 1 146 #define GRPC_HAVE_UNIX_SOCKET 1 147 #define GRPC_POSIX_FORK 1 148 #define GRPC_POSIX_NO_SPECIAL_WAKEUP_FD 1 149 #define GRPC_POSIX_SOCKET 1 150 #define GRPC_POSIX_SOCKETUTILS 1 151 #define GRPC_POSIX_WAKEUP_FD 1 152 #elif defined(GPR_OPENBSD) 153 #define GRPC_HAVE_IFADDRS 1 154 #define GRPC_HAVE_IPV6_RECVPKTINFO 1 155 #define GRPC_HAVE_UNIX_SOCKET 1 156 #define GRPC_POSIX_NO_SPECIAL_WAKEUP_FD 1 157 #define GRPC_POSIX_SOCKET 1 158 #define GRPC_POSIX_SOCKETUTILS 1 159 #define GRPC_POSIX_WAKEUP_FD 1 160 #elif defined(GPR_SOLARIS) 161 #define GRPC_HAVE_UNIX_SOCKET 1 162 #define GRPC_POSIX_NO_SPECIAL_WAKEUP_FD 1 163 #define GRPC_POSIX_SOCKET 1 164 #define GRPC_POSIX_SOCKETUTILS 1 165 #define GRPC_POSIX_WAKEUP_FD 1 166 #elif defined(GPR_AIX) 167 #define GRPC_HAVE_UNIX_SOCKET 1 168 #define GRPC_POSIX_NO_SPECIAL_WAKEUP_FD 1 169 #define GRPC_POSIX_SOCKET 1 170 #define GRPC_POSIX_SOCKETUTILS 1 171 #define GRPC_POSIX_WAKEUP_FD 1 172 #elif defined(GPR_NETBSD) 173 #define GRPC_HAVE_ARPA_NAMESER 1 174 #define GRPC_HAVE_IFADDRS 1 175 #define GRPC_HAVE_IPV6_RECVPKTINFO 1 176 #define GRPC_HAVE_SO_NOSIGPIPE 1 177 #define GRPC_HAVE_UNIX_SOCKET 1 178 #define GRPC_POSIX_FORK 1 179 #define GRPC_POSIX_NO_SPECIAL_WAKEUP_FD 1 180 #define GRPC_POSIX_SOCKET 1 181 #define GRPC_POSIX_SOCKETUTILS 1 182 #define GRPC_POSIX_WAKEUP_FD 1 183 #elif defined(GPR_NACL) 184 #define GRPC_HAVE_ARPA_NAMESER 1 185 #define GRPC_POSIX_NO_SPECIAL_WAKEUP_FD 1 186 #define GRPC_POSIX_SOCKET 1 187 #define GRPC_POSIX_SOCKETUTILS 1 188 #define GRPC_POSIX_WAKEUP_FD 1 189 #elif defined(GPR_FUCHSIA) 190 #define GRPC_HAVE_IFADDRS 1 191 #define GRPC_HAVE_IPV6_RECVPKTINFO 1 192 #define GRPC_HAVE_IP_PKTINFO 1 193 // Zircon does not support the MSG_NOSIGNAL flag since it doesn't support 194 // signals. 195 #undef GRPC_HAVE_MSG_NOSIGNAL 196 #define GRPC_HAVE_UNIX_SOCKET 1 197 #define GRPC_POSIX_WAKEUP_FD 1 198 // TODO(rudominer) Check that this does something we want. 199 #define GRPC_POSIX_NO_SPECIAL_WAKEUP_FD 1 200 #define GRPC_POSIX_SOCKET 1 201 #define GRPC_POSIX_SOCKETADDR 1 202 // TODO(rudominer) Check this does something we want. 203 #define GRPC_POSIX_SOCKETUTILS 1 204 #define GRPC_TIMER_USE_GENERIC 1 205 #elif defined(GPR_HAIKU) 206 #define GRPC_HAVE_ARPA_NAMESER 1 207 #define GRPC_HAVE_IFADDRS 1 208 #define GRPC_HAVE_IPV6_RECVPKTINFO 1 209 #define GRPC_HAVE_UNIX_SOCKET 1 210 #define GRPC_POSIX_FORK 1 211 #define GRPC_POSIX_NO_SPECIAL_WAKEUP_FD 1 212 #define GRPC_POSIX_SOCKET 1 213 #define GRPC_POSIX_SOCKETUTILS 1 214 #define GRPC_POSIX_WAKEUP_FD 1 215 #elif defined(__QNX__) || defined(__QNXNTO__) 216 #define GRPC_HAVE_ARPA_NAMESER 1 217 #define GRPC_HAVE_IFADDRS 1 218 #define GRPC_HAVE_IPV6_RECVPKTINFO 1 219 #define GRPC_HAVE_IP_PKTINFO 1 220 #define GRPC_HAVE_MSG_NOSIGNAL 1 221 #define GRPC_HAVE_UNIX_SOCKET 1 222 // TODO(rbyshliaha): Find a way to understand if VSOCK package is installed in 223 // a toolchain to enable GRPC_HAVE_VSOCK. 224 #define GRPC_POSIX_SOCKET 1 225 #define GRPC_POSIX_WAKEUP_FD 1 226 #define GRPC_POSIX_NO_SPECIAL_WAKEUP_FD 1 227 #define GRPC_POSIX_SOCKETUTILS 1 228 #define GRPC_POSIX_SYSCONF 1 229 #elif !defined(GPR_NO_AUTODETECT_PLATFORM) 230 #error "Platform not recognized" 231 #endif 232 233 #if defined(GRPC_POSIX_SOCKET) + defined(GRPC_WINSOCK_SOCKET) + \ 234 defined(GRPC_CFSTREAM) != \ 235 1 236 #error \ 237 "Must define exactly one of GRPC_POSIX_SOCKET, GRPC_WINSOCK_SOCKET, GRPC_CFSTREAM" 238 #endif 239 240 #ifdef GRPC_POSIX_SOCKET 241 #define GRPC_POSIX_SOCKET_ARES_EV_DRIVER 1 242 #define GRPC_POSIX_SOCKET_EV 1 243 #define GRPC_POSIX_SOCKET_EV_POLL 1 244 #define GRPC_POSIX_SOCKET_EV_EPOLL1 1 245 #define GRPC_POSIX_SOCKET_IF_NAMETOINDEX 1 246 #define GRPC_POSIX_SOCKET_IOMGR 1 247 #define GRPC_POSIX_SOCKET_RESOLVE_ADDRESS 1 248 #define GRPC_POSIX_SOCKET_SOCKADDR 1 249 #define GRPC_POSIX_SOCKET_SOCKET_FACTORY 1 250 #define GRPC_POSIX_SOCKET_TCP 1 251 #define GRPC_POSIX_SOCKET_TCP_CLIENT 1 252 #define GRPC_POSIX_SOCKET_TCP_SERVER 1 253 #define GRPC_POSIX_SOCKET_TCP_SERVER_UTILS_COMMON 1 254 #define GRPC_POSIX_SOCKET_UDP_SERVER 1 255 #define GRPC_POSIX_SOCKET_UTILS_COMMON 1 256 #endif 257 258 #if defined(GRPC_POSIX_HOST_NAME_MAX) && defined(GRPC_POSIX_SYSCONF) 259 #error "Cannot define both GRPC_POSIX_HOST_NAME_MAX and GRPC_POSIX_SYSCONF" 260 #endif 261 #if !defined(GRPC_POSIX_HOST_NAME_MAX) && !defined(GRPC_POSIX_SYSCONF) 262 #define GRPC_GETHOSTNAME_FALLBACK 1 263 #endif 264 265 #endif // GRPC_SRC_CORE_LIB_IOMGR_PORT_H 266