socket_utils_common_posix.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2015 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 
20 
22 
23 #ifdef GRPC_POSIX_SOCKET_UTILS_COMMON
24 
25 #include <arpa/inet.h>
26 #include <errno.h>
27 #include <fcntl.h>
28 #include <limits.h>
29 #include <netinet/in.h>
30 
33 #ifdef GRPC_LINUX_TCP_H
34 #include <linux/tcp.h>
35 #else
36 #include <netinet/tcp.h>
37 #endif
38 #include <stdio.h>
39 #include <string.h>
40 #include <sys/socket.h>
41 #include <sys/types.h>
42 #include <unistd.h>
43 
44 #include <string>
45 
46 #include <grpc/support/alloc.h>
47 #include <grpc/support/log.h>
48 #include <grpc/support/sync.h>
49 
54 
55 /* set a socket to use zerocopy */
57 #ifdef GRPC_LINUX_ERRQUEUE
58  const int enable = 1;
59  auto err = setsockopt(fd, SOL_SOCKET, SO_ZEROCOPY, &enable, sizeof(enable));
60  if (err != 0) {
61  return GRPC_OS_ERROR(errno, "setsockopt(SO_ZEROCOPY)");
62  }
63  return GRPC_ERROR_NONE;
64 #else
65  (void)fd;
66  return GRPC_OS_ERROR(ENOSYS, "setsockopt(SO_ZEROCOPY)");
67 #endif
68 }
69 
70 /* set a socket to non blocking mode */
71 grpc_error_handle grpc_set_socket_nonblocking(int fd, int non_blocking) {
72  int oldflags = fcntl(fd, F_GETFL, 0);
73  if (oldflags < 0) {
74  return GRPC_OS_ERROR(errno, "fcntl");
75  }
76 
77  if (non_blocking) {
78  oldflags |= O_NONBLOCK;
79  } else {
80  oldflags &= ~O_NONBLOCK;
81  }
82 
83  if (fcntl(fd, F_SETFL, oldflags) != 0) {
84  return GRPC_OS_ERROR(errno, "fcntl");
85  }
86 
87  return GRPC_ERROR_NONE;
88 }
89 
91 #ifdef GRPC_HAVE_SO_NOSIGPIPE
92  int val = 1;
93  int newval;
94  socklen_t intlen = sizeof(newval);
95  if (0 != setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &val, sizeof(val))) {
96  return GRPC_OS_ERROR(errno, "setsockopt(SO_NOSIGPIPE)");
97  }
98  if (0 != getsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &newval, &intlen)) {
99  return GRPC_OS_ERROR(errno, "getsockopt(SO_NOSIGPIPE)");
100  }
101  if ((newval != 0) != (val != 0)) {
102  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed to set SO_NOSIGPIPE");
103  }
104 #else
105  // Avoid unused parameter warning for conditional parameter
106  (void)fd;
107 #endif
108  return GRPC_ERROR_NONE;
109 }
110 
112  // Use conditionally-important parameter to avoid warning
113  (void)fd;
114 #ifdef GRPC_HAVE_IP_PKTINFO
115  int get_local_ip = 1;
116  if (0 != setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &get_local_ip,
117  sizeof(get_local_ip))) {
118  return GRPC_OS_ERROR(errno, "setsockopt(IP_PKTINFO)");
119  }
120 #endif
121  return GRPC_ERROR_NONE;
122 }
123 
125  // Use conditionally-important parameter to avoid warning
126  (void)fd;
127 #ifdef GRPC_HAVE_IPV6_RECVPKTINFO
128  int get_local_ip = 1;
129  if (0 != setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &get_local_ip,
130  sizeof(get_local_ip))) {
131  return GRPC_OS_ERROR(errno, "setsockopt(IPV6_RECVPKTINFO)");
132  }
133 #endif
134  return GRPC_ERROR_NONE;
135 }
136 
137 grpc_error_handle grpc_set_socket_sndbuf(int fd, int buffer_size_bytes) {
138  return 0 == setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &buffer_size_bytes,
139  sizeof(buffer_size_bytes))
141  : GRPC_OS_ERROR(errno, "setsockopt(SO_SNDBUF)");
142 }
143 
144 grpc_error_handle grpc_set_socket_rcvbuf(int fd, int buffer_size_bytes) {
145  return 0 == setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &buffer_size_bytes,
146  sizeof(buffer_size_bytes))
148  : GRPC_OS_ERROR(errno, "setsockopt(SO_RCVBUF)");
149 }
150 
151 /* set a socket to close on exec */
152 grpc_error_handle grpc_set_socket_cloexec(int fd, int close_on_exec) {
153  int oldflags = fcntl(fd, F_GETFD, 0);
154  if (oldflags < 0) {
155  return GRPC_OS_ERROR(errno, "fcntl");
156  }
157 
158  if (close_on_exec) {
159  oldflags |= FD_CLOEXEC;
160  } else {
161  oldflags &= ~FD_CLOEXEC;
162  }
163 
164  if (fcntl(fd, F_SETFD, oldflags) != 0) {
165  return GRPC_OS_ERROR(errno, "fcntl");
166  }
167 
168  return GRPC_ERROR_NONE;
169 }
170 
171 /* set a socket to reuse old addresses */
173  int val = (reuse != 0);
174  int newval;
175  socklen_t intlen = sizeof(newval);
176  if (0 != setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val))) {
177  return GRPC_OS_ERROR(errno, "setsockopt(SO_REUSEADDR)");
178  }
179  if (0 != getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &newval, &intlen)) {
180  return GRPC_OS_ERROR(errno, "getsockopt(SO_REUSEADDR)");
181  }
182  if ((newval != 0) != val) {
183  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed to set SO_REUSEADDR");
184  }
185 
186  return GRPC_ERROR_NONE;
187 }
188 
189 /* set a socket to reuse old addresses */
191 #ifndef SO_REUSEPORT
193  "SO_REUSEPORT unavailable on compiling system");
194 #else
195  int val = (reuse != 0);
196  int newval;
197  socklen_t intlen = sizeof(newval);
198  if (0 != setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val))) {
199  return GRPC_OS_ERROR(errno, "setsockopt(SO_REUSEPORT)");
200  }
201  if (0 != getsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &newval, &intlen)) {
202  return GRPC_OS_ERROR(errno, "getsockopt(SO_REUSEPORT)");
203  }
204  if ((newval != 0) != val) {
205  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed to set SO_REUSEPORT");
206  }
207 
208  return GRPC_ERROR_NONE;
209 #endif
210 }
211 
212 static gpr_once g_probe_so_reuesport_once = GPR_ONCE_INIT;
213 static int g_support_so_reuseport = false;
214 
215 void probe_so_reuseport_once(void) {
216  int s = socket(AF_INET, SOCK_STREAM, 0);
217  if (s < 0) {
218  /* This might be an ipv6-only environment in which case 'socket(AF_INET,..)'
219  call would fail. Try creating IPv6 socket in that case */
220  s = socket(AF_INET6, SOCK_STREAM, 0);
221  }
222  if (s >= 0) {
223  g_support_so_reuseport = GRPC_LOG_IF_ERROR(
224  "check for SO_REUSEPORT", grpc_set_socket_reuse_port(s, 1));
225  close(s);
226  }
227 }
228 
230  gpr_once_init(&g_probe_so_reuesport_once, probe_so_reuseport_once);
231  return g_support_so_reuseport;
232 }
233 
234 /* disable nagle */
235 grpc_error_handle grpc_set_socket_low_latency(int fd, int low_latency) {
236  int val = (low_latency != 0);
237  int newval;
238  socklen_t intlen = sizeof(newval);
239  if (0 != setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val))) {
240  return GRPC_OS_ERROR(errno, "setsockopt(TCP_NODELAY)");
241  }
242  if (0 != getsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &newval, &intlen)) {
243  return GRPC_OS_ERROR(errno, "getsockopt(TCP_NODELAY)");
244  }
245  if ((newval != 0) != val) {
246  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed to set TCP_NODELAY");
247  }
248  return GRPC_ERROR_NONE;
249 }
250 
251 /* The default values for TCP_USER_TIMEOUT are currently configured to be in
252  * line with the default values of KEEPALIVE_TIMEOUT as proposed in
253  * https://github.com/grpc/proposal/blob/master/A18-tcp-user-timeout.md */
254 #define DEFAULT_CLIENT_TCP_USER_TIMEOUT_MS 20000 /* 20 seconds */
255 #define DEFAULT_SERVER_TCP_USER_TIMEOUT_MS 20000 /* 20 seconds */
256 
257 static int g_default_client_tcp_user_timeout_ms =
258  DEFAULT_CLIENT_TCP_USER_TIMEOUT_MS;
259 static int g_default_server_tcp_user_timeout_ms =
260  DEFAULT_SERVER_TCP_USER_TIMEOUT_MS;
261 static bool g_default_client_tcp_user_timeout_enabled = false;
262 static bool g_default_server_tcp_user_timeout_enabled = true;
263 
264 #if GPR_LINUX == 1
265 // For Linux, it will be detected to support TCP_USER_TIMEOUT
266 #ifndef TCP_USER_TIMEOUT
267 #define TCP_USER_TIMEOUT 18
268 #endif
269 #define SOCKET_SUPPORTS_TCP_USER_TIMEOUT_DEFAULT 0
270 #else
271 // For non-Linux, TCP_USER_TIMEOUT will be used if TCP_USER_TIMEOUT is defined.
272 #ifdef TCP_USER_TIMEOUT
273 #define SOCKET_SUPPORTS_TCP_USER_TIMEOUT_DEFAULT 0
274 #else
275 #define TCP_USER_TIMEOUT 0
276 #define SOCKET_SUPPORTS_TCP_USER_TIMEOUT_DEFAULT -1
277 #endif // TCP_USER_TIMEOUT
278 #endif // GPR_LINUX == 1
279 
280 // Whether the socket supports TCP_USER_TIMEOUT option.
281 // (0: don't know, 1: support, -1: not support)
282 static std::atomic<int> g_socket_supports_tcp_user_timeout(
283  SOCKET_SUPPORTS_TCP_USER_TIMEOUT_DEFAULT);
284 
285 void config_default_tcp_user_timeout(bool enable, int timeout, bool is_client) {
286  if (is_client) {
287  g_default_client_tcp_user_timeout_enabled = enable;
288  if (timeout > 0) {
289  g_default_client_tcp_user_timeout_ms = timeout;
290  }
291  } else {
292  g_default_server_tcp_user_timeout_enabled = enable;
293  if (timeout > 0) {
294  g_default_server_tcp_user_timeout_ms = timeout;
295  }
296  }
297 }
298 
299 /* Set TCP_USER_TIMEOUT */
301  int fd, const grpc_channel_args* channel_args, bool is_client) {
302  // Use conditionally-important parameter to avoid warning
303  (void)fd;
304  (void)channel_args;
305  (void)is_client;
307  if (g_socket_supports_tcp_user_timeout.load() >= 0) {
308  bool enable;
309  int timeout;
310  if (is_client) {
311  enable = g_default_client_tcp_user_timeout_enabled;
312  timeout = g_default_client_tcp_user_timeout_ms;
313  } else {
314  enable = g_default_server_tcp_user_timeout_enabled;
315  timeout = g_default_server_tcp_user_timeout_ms;
316  }
317  if (channel_args) {
318  for (unsigned int i = 0; i < channel_args->num_args; i++) {
319  if (0 ==
320  strcmp(channel_args->args[i].key, GRPC_ARG_KEEPALIVE_TIME_MS)) {
322  &channel_args->args[i], grpc_integer_options{0, 1, INT_MAX});
323  /* Continue using default if value is 0 */
324  if (value == 0) {
325  continue;
326  }
327  /* Disable if value is INT_MAX */
328  enable = value != INT_MAX;
329  } else if (0 == strcmp(channel_args->args[i].key,
332  &channel_args->args[i], grpc_integer_options{0, 1, INT_MAX});
333  /* Continue using default if value is 0 */
334  if (value == 0) {
335  continue;
336  }
337  timeout = value;
338  }
339  }
340  }
341  if (enable) {
342  int newval;
343  socklen_t len = sizeof(newval);
344  // If this is the first time to use TCP_USER_TIMEOUT, try to check
345  // if it is available.
346  if (g_socket_supports_tcp_user_timeout.load() == 0) {
347  if (0 != getsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, &newval, &len)) {
349  "TCP_USER_TIMEOUT is not available. TCP_USER_TIMEOUT won't "
350  "be used thereafter");
351  g_socket_supports_tcp_user_timeout.store(-1);
352  } else {
354  "TCP_USER_TIMEOUT is available. TCP_USER_TIMEOUT will be "
355  "used thereafter");
356  g_socket_supports_tcp_user_timeout.store(1);
357  }
358  }
359  if (g_socket_supports_tcp_user_timeout.load() > 0) {
361  gpr_log(GPR_INFO, "Enabling TCP_USER_TIMEOUT with a timeout of %d ms",
362  timeout);
363  }
364  if (0 != setsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, &timeout,
365  sizeof(timeout))) {
366  gpr_log(GPR_ERROR, "setsockopt(TCP_USER_TIMEOUT) %s",
367  strerror(errno));
368  return GRPC_ERROR_NONE;
369  }
370  if (0 != getsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, &newval, &len)) {
371  gpr_log(GPR_ERROR, "getsockopt(TCP_USER_TIMEOUT) %s",
372  strerror(errno));
373  return GRPC_ERROR_NONE;
374  }
375  if (newval != timeout) {
376  /* Do not fail on failing to set TCP_USER_TIMEOUT for now. */
377  gpr_log(GPR_ERROR, "Failed to set TCP_USER_TIMEOUT");
378  return GRPC_ERROR_NONE;
379  }
380  }
381  }
382  } else {
384  gpr_log(GPR_INFO, "TCP_USER_TIMEOUT not supported for this platform");
385  }
386  }
387  return GRPC_ERROR_NONE;
388 }
389 
390 /* set a socket using a grpc_socket_mutator */
392  grpc_socket_mutator* mutator) {
393  GPR_ASSERT(mutator);
394  if (!grpc_socket_mutator_mutate_fd(mutator, fd, usage)) {
395  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("grpc_socket_mutator failed.");
396  }
397  return GRPC_ERROR_NONE;
398 }
399 
401  int fd, grpc_fd_usage usage, const grpc_channel_args* args) {
402  const grpc_arg* socket_mutator_arg =
404  if (socket_mutator_arg == nullptr) {
405  return GRPC_ERROR_NONE;
406  }
407  GPR_DEBUG_ASSERT(socket_mutator_arg->type == GRPC_ARG_POINTER);
408  grpc_socket_mutator* mutator =
409  static_cast<grpc_socket_mutator*>(socket_mutator_arg->value.pointer.p);
410  return grpc_set_socket_with_mutator(fd, usage, mutator);
411 }
412 
413 static gpr_once g_probe_ipv6_once = GPR_ONCE_INIT;
414 static int g_ipv6_loopback_available;
415 
416 static void probe_ipv6_once(void) {
417  int fd = socket(AF_INET6, SOCK_STREAM, 0);
418  g_ipv6_loopback_available = 0;
419  if (fd < 0) {
420  gpr_log(GPR_INFO, "Disabling AF_INET6 sockets because socket() failed.");
421  } else {
422  grpc_sockaddr_in6 addr;
423  memset(&addr, 0, sizeof(addr));
424  addr.sin6_family = AF_INET6;
425  addr.sin6_addr.s6_addr[15] = 1; /* [::1]:0 */
426  if (bind(fd, reinterpret_cast<grpc_sockaddr*>(&addr), sizeof(addr)) == 0) {
427  g_ipv6_loopback_available = 1;
428  } else {
430  "Disabling AF_INET6 sockets because ::1 is not available.");
431  }
432  close(fd);
433  }
434 }
435 
437  gpr_once_init(&g_probe_ipv6_once, probe_ipv6_once);
438  return g_ipv6_loopback_available;
439 }
440 
441 static grpc_error_handle error_for_fd(int fd,
442  const grpc_resolved_address* addr) {
443  if (fd >= 0) return GRPC_ERROR_NONE;
444  auto addr_str = grpc_sockaddr_to_string(addr, false);
447  addr_str.ok() ? addr_str.value() : addr_str.status().ToString());
448  return err;
449 }
450 
452  const grpc_resolved_address* resolved_addr, int type, int protocol,
453  grpc_dualstack_mode* dsmode, int* newfd) {
455  nullptr, resolved_addr, type, protocol, dsmode, newfd);
456 }
457 
458 static int create_socket(grpc_socket_factory* factory, int domain, int type,
459  int protocol) {
460  return (factory != nullptr)
461  ? grpc_socket_factory_socket(factory, domain, type, protocol)
462  : socket(domain, type, protocol);
463 }
464 
466  grpc_socket_factory* factory, const grpc_resolved_address* resolved_addr,
467  int type, int protocol, grpc_dualstack_mode* dsmode, int* newfd) {
468  const grpc_sockaddr* addr =
469  reinterpret_cast<const grpc_sockaddr*>(resolved_addr->addr);
470  int family = addr->sa_family;
471  if (family == AF_INET6) {
473  *newfd = create_socket(factory, family, type, protocol);
474  } else {
475  *newfd = -1;
476  errno = EAFNOSUPPORT;
477  }
478  /* Check if we've got a valid dualstack socket. */
479  if (*newfd >= 0 && grpc_set_socket_dualstack(*newfd)) {
480  *dsmode = GRPC_DSMODE_DUALSTACK;
481  return GRPC_ERROR_NONE;
482  }
483  /* If this isn't an IPv4 address, then return whatever we've got. */
484  if (!grpc_sockaddr_is_v4mapped(resolved_addr, nullptr)) {
485  *dsmode = GRPC_DSMODE_IPV6;
486  return error_for_fd(*newfd, resolved_addr);
487  }
488  /* Fall back to AF_INET. */
489  if (*newfd >= 0) {
490  close(*newfd);
491  }
492  family = AF_INET;
493  }
494  *dsmode = family == AF_INET ? GRPC_DSMODE_IPV4 : GRPC_DSMODE_NONE;
495  *newfd = create_socket(factory, family, type, protocol);
496  return error_for_fd(*newfd, resolved_addr);
497 }
498 
499 #endif
grpc_set_socket_reuse_addr
grpc_error_handle grpc_set_socket_reuse_addr(int fd, int reuse)
grpc_arg
Definition: grpc_types.h:103
grpc_socket_factory
Definition: socket_factory_posix.h:43
grpc_create_dualstack_socket_using_factory
grpc_error_handle grpc_create_dualstack_socket_using_factory(grpc_socket_factory *factory, const grpc_resolved_address *addr, int type, int protocol, grpc_dualstack_mode *dsmode, int *newfd)
GPR_INFO
#define GPR_INFO
Definition: include/grpc/impl/codegen/log.h:56
GRPC_ERROR_NONE
#define GRPC_ERROR_NONE
Definition: error.h:234
log.h
grpc_set_socket_rcvbuf
grpc_error_handle grpc_set_socket_rcvbuf(int fd, int buffer_size_bytes)
GRPC_DSMODE_NONE
@ GRPC_DSMODE_NONE
Definition: socket_utils_posix.h:118
sockaddr_utils.h
GRPC_DSMODE_IPV6
@ GRPC_DSMODE_IPV6
Definition: socket_utils_posix.h:122
AF_INET6
#define AF_INET6
Definition: ares_setup.h:208
grpc_set_socket_low_latency
grpc_error_handle grpc_set_socket_low_latency(int fd, int low_latency)
grpc_arg::value
union grpc_arg::grpc_arg_value value
memset
return memset(p, 0, total)
GPR_DEBUG_ASSERT
#define GPR_DEBUG_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:103
grpc_arg::grpc_arg_value::pointer
struct grpc_arg::grpc_arg_value::grpc_arg_pointer pointer
gpr_once
pthread_once_t gpr_once
Definition: impl/codegen/sync_posix.h:50
grpc_set_socket_zerocopy
grpc_error_handle grpc_set_socket_zerocopy(int fd)
grpc_channel_arg_get_integer
int grpc_channel_arg_get_integer(const grpc_arg *arg, const grpc_integer_options options)
Definition: channel_args.cc:405
string.h
grpc_set_socket_no_sigpipe_if_possible
grpc_error_handle grpc_set_socket_no_sigpipe_if_possible(int fd)
grpc_integer_options
Definition: channel_args.h:310
error_ref_leak.err
err
Definition: error_ref_leak.py:35
protocol
Protocol protocol
Definition: client_callback_end2end_test.cc:67
grpc_resolved_address
Definition: resolved_address.h:34
GPR_ONCE_INIT
#define GPR_ONCE_INIT
Definition: impl/codegen/sync_posix.h:52
absl::FormatConversionChar::s
@ s
GRPC_LOG_IF_ERROR
#define GRPC_LOG_IF_ERROR(what, error)
Definition: error.h:398
grpc_sockaddr_to_string
absl::StatusOr< std::string > grpc_sockaddr_to_string(const grpc_resolved_address *resolved_addr, bool normalize)
Definition: sockaddr_utils.cc:194
sockaddr.h
grpc_channel_args
Definition: grpc_types.h:132
GRPC_TRACE_FLAG_ENABLED
#define GRPC_TRACE_FLAG_ENABLED(f)
Definition: debug/trace.h:114
grpc_error_set_str
grpc_error_handle grpc_error_set_str(grpc_error_handle src, grpc_error_strs which, absl::string_view str)
Definition: error.cc:650
gpr_once_init
GPRAPI void gpr_once_init(gpr_once *once, void(*init_function)(void))
GRPC_ERROR_STR_TARGET_ADDRESS
@ GRPC_ERROR_STR_TARGET_ADDRESS
peer that we were trying to communicate when this error occurred
Definition: error.h:117
socket_utils.h
grpc_ipv6_loopback_available
int grpc_ipv6_loopback_available(void)
grpc_tcp_trace
grpc_core::TraceFlag grpc_tcp_trace(false, "tcp")
grpc_set_socket_cloexec
grpc_error_handle grpc_set_socket_cloexec(int fd, int close_on_exec)
GRPC_DSMODE_DUALSTACK
@ GRPC_DSMODE_DUALSTACK
Definition: socket_utils_posix.h:124
grpc_is_socket_reuse_port_supported
bool grpc_is_socket_reuse_port_supported()
GRPC_OS_ERROR
#define GRPC_OS_ERROR(err, call_name)
create an error associated with errno!=0 (an 'operating system' error)
Definition: error.h:352
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc_channel_args::num_args
size_t num_args
Definition: grpc_types.h:133
create_socket
int create_socket(const char *socket_type, fd_pair *client_fds, fd_pair *server_fds)
Definition: low_level_ping_pong.cc:560
grpc_arg::grpc_arg_value::grpc_arg_pointer::p
void * p
Definition: grpc_types.h:110
close
#define close
Definition: test-fs.c:48
grpc_set_socket_reuse_port
grpc_error_handle grpc_set_socket_reuse_port(int fd, int reuse)
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
grpc_create_dualstack_socket
grpc_error_handle grpc_create_dualstack_socket(const grpc_resolved_address *addr, int type, int protocol, grpc_dualstack_mode *dsmode, int *newfd)
grpc_socket_mutator
Definition: socket_mutator.h:62
grpc_set_socket_ipv6_recvpktinfo_if_possible
grpc_error_handle grpc_set_socket_ipv6_recvpktinfo_if_possible(int fd)
GRPC_ARG_KEEPALIVE_TIMEOUT_MS
#define GRPC_ARG_KEEPALIVE_TIMEOUT_MS
Definition: grpc_types.h:244
GRPC_ERROR_CREATE_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
Definition: error.h:291
grpc_core::TraceFlag
Definition: debug/trace.h:63
grpc_set_socket_with_mutator
grpc_error_handle grpc_set_socket_with_mutator(int fd, grpc_fd_usage usage, grpc_socket_mutator *mutator)
value
const char * value
Definition: hpack_parser_table.cc:165
bloaty::usage
const char usage[]
Definition: bloaty.cc:1843
grpc_socket_mutator_mutate_fd
bool grpc_socket_mutator_mutate_fd(grpc_socket_mutator *mutator, int fd, grpc_fd_usage usage)
Definition: socket_mutator.cc:41
GRPC_DSMODE_IPV4
@ GRPC_DSMODE_IPV4
Definition: socket_utils_posix.h:120
port.h
grpc_socket_factory_socket
int grpc_socket_factory_socket(grpc_socket_factory *factory, int domain, int type, int protocol)
alloc.h
grpc_fd_usage
grpc_fd_usage
Definition: socket_mutator.h:30
grpc_arg::key
char * key
Definition: grpc_types.h:105
socket_utils_posix.h
grpc_set_socket_dualstack
int grpc_set_socket_dualstack(int fd)
grpc_dualstack_mode
grpc_dualstack_mode
Definition: socket_utils_posix.h:116
config_default_tcp_user_timeout
void config_default_tcp_user_timeout(bool enable, int timeout, bool is_client)
channel_args.h
test_server.socket
socket
Definition: test_server.py:65
GRPC_ARG_POINTER
@ GRPC_ARG_POINTER
Definition: grpc_types.h:82
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
grpc_set_socket_nonblocking
grpc_error_handle grpc_set_socket_nonblocking(int fd, int non_blocking)
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
GRPC_ARG_KEEPALIVE_TIME_MS
#define GRPC_ARG_KEEPALIVE_TIME_MS
Definition: grpc_types.h:240
grpc_error
Definition: error_internal.h:42
grpc_set_socket_tcp_user_timeout
grpc_error_handle grpc_set_socket_tcp_user_timeout(int fd, const grpc_channel_args *channel_args, bool is_client)
grpc_set_socket_sndbuf
grpc_error_handle grpc_set_socket_sndbuf(int fd, int buffer_size_bytes)
GRPC_ARG_SOCKET_MUTATOR
#define GRPC_ARG_SOCKET_MUTATOR
Definition: grpc_types.h:311
grpc_arg::type
grpc_arg_type type
Definition: grpc_types.h:104
grpc_sockaddr_is_v4mapped
int grpc_sockaddr_is_v4mapped(const grpc_resolved_address *resolved_addr, grpc_resolved_address *resolved_addr4_out)
Definition: sockaddr_utils.cc:81
grpc_apply_socket_mutator_in_args
grpc_error_handle grpc_apply_socket_mutator_in_args(int fd, grpc_fd_usage usage, const grpc_channel_args *args)
grpc_channel_args::args
grpc_arg * args
Definition: grpc_types.h:134
sync.h
grpc_channel_args_find
const grpc_arg * grpc_channel_args_find(const grpc_channel_args *args, const char *name)
Definition: channel_args.cc:393
grpc_resolved_address::addr
char addr[GRPC_MAX_SOCKADDR_SIZE]
Definition: resolved_address.h:35
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10
timeout
uv_timer_t timeout
Definition: libuv/docs/code/uvwget/main.c:9
errno.h
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
port_platform.h
grpc_set_socket_ip_pktinfo_if_possible
grpc_error_handle grpc_set_socket_ip_pktinfo_if_possible(int fd)


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:19