tcp_server_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 
19 /* FIXME: "posix" files shouldn't be depending on _GNU_SOURCE */
20 #ifndef _GNU_SOURCE
21 #define _GNU_SOURCE
22 #endif
23 
25 
27 
28 #ifdef GRPC_POSIX_SOCKET_TCP_SERVER
29 
30 #include <errno.h>
31 #include <fcntl.h>
32 #include <inttypes.h>
33 #include <netinet/in.h>
34 #include <netinet/tcp.h>
35 #include <string.h>
36 #include <sys/socket.h>
37 #include <sys/stat.h>
38 #include <sys/types.h>
39 #include <unistd.h>
40 
41 #include <string>
42 
43 #include "absl/strings/str_cat.h"
44 #include "absl/strings/str_format.h"
45 
46 #include <grpc/support/alloc.h>
47 #include <grpc/support/log.h>
48 #include <grpc/support/sync.h>
49 #include <grpc/support/time.h>
50 
64 
65 static std::atomic<int64_t> num_dropped_connections{0};
66 
67 static grpc_error_handle tcp_server_create(grpc_closure* shutdown_complete,
68  const grpc_channel_args* args,
71  s->so_reuseport = grpc_is_socket_reuse_port_supported();
72  s->expand_wildcard_addrs = false;
73  for (size_t i = 0; i < (args == nullptr ? 0 : args->num_args); i++) {
74  if (0 == strcmp(GRPC_ARG_ALLOW_REUSEPORT, args->args[i].key)) {
75  if (args->args[i].type == GRPC_ARG_INTEGER) {
76  s->so_reuseport = grpc_is_socket_reuse_port_supported() &&
77  (args->args[i].value.integer != 0);
78  } else {
79  gpr_free(s);
81  " must be an integer");
82  }
83  } else if (0 == strcmp(GRPC_ARG_EXPAND_WILDCARD_ADDRS, args->args[i].key)) {
84  if (args->args[i].type == GRPC_ARG_INTEGER) {
85  s->expand_wildcard_addrs = (args->args[i].value.integer != 0);
86  } else {
87  gpr_free(s);
89  GRPC_ARG_EXPAND_WILDCARD_ADDRS " must be an integer");
90  }
91  }
92  }
93  gpr_ref_init(&s->refs, 1);
94  gpr_mu_init(&s->mu);
95  s->active_ports = 0;
96  s->destroyed_ports = 0;
97  s->shutdown = false;
98  s->shutdown_starting.head = nullptr;
99  s->shutdown_starting.tail = nullptr;
100  s->shutdown_complete = shutdown_complete;
101  s->on_accept_cb = nullptr;
102  s->on_accept_cb_arg = nullptr;
103  s->head = nullptr;
104  s->tail = nullptr;
105  s->nports = 0;
106  s->channel_args = grpc_channel_args_copy(args);
107  s->fd_handler = nullptr;
108  s->memory_quota =
110  gpr_atm_no_barrier_store(&s->next_pollset_to_assign, 0);
111  *server = s;
112  return GRPC_ERROR_NONE;
113 }
114 
115 static void finish_shutdown(grpc_tcp_server* s) {
116  gpr_mu_lock(&s->mu);
117  GPR_ASSERT(s->shutdown);
118  gpr_mu_unlock(&s->mu);
119  if (s->shutdown_complete != nullptr) {
120  grpc_core::ExecCtx::Run(DEBUG_LOCATION, s->shutdown_complete,
122  }
123  gpr_mu_destroy(&s->mu);
124  while (s->head) {
125  grpc_tcp_listener* sp = s->head;
126  s->head = sp->next;
127  gpr_free(sp);
128  }
129  grpc_channel_args_destroy(s->channel_args);
130  delete s->fd_handler;
131  delete s;
132 }
133 
134 static void destroyed_port(void* server, grpc_error_handle /*error*/) {
135  grpc_tcp_server* s = static_cast<grpc_tcp_server*>(server);
136  gpr_mu_lock(&s->mu);
137  s->destroyed_ports++;
138  if (s->destroyed_ports == s->nports) {
139  gpr_mu_unlock(&s->mu);
140  finish_shutdown(s);
141  } else {
142  GPR_ASSERT(s->destroyed_ports < s->nports);
143  gpr_mu_unlock(&s->mu);
144  }
145 }
146 
147 /* called when all listening endpoints have been shutdown, so no further
148  events will be received on them - at this point it's safe to destroy
149  things */
150 static void deactivated_all_ports(grpc_tcp_server* s) {
151  /* delete ALL the things */
152  gpr_mu_lock(&s->mu);
153 
154  GPR_ASSERT(s->shutdown);
155 
156  if (s->head) {
157  grpc_tcp_listener* sp;
158  for (sp = s->head; sp; sp = sp->next) {
160  GRPC_CLOSURE_INIT(&sp->destroyed_closure, destroyed_port, s,
161  grpc_schedule_on_exec_ctx);
162  grpc_fd_orphan(sp->emfd, &sp->destroyed_closure, nullptr,
163  "tcp_listener_shutdown");
164  }
165  gpr_mu_unlock(&s->mu);
166  } else {
167  gpr_mu_unlock(&s->mu);
168  finish_shutdown(s);
169  }
170 }
171 
172 static void tcp_server_destroy(grpc_tcp_server* s) {
173  gpr_mu_lock(&s->mu);
174  GPR_ASSERT(!s->shutdown);
175  s->shutdown = true;
176  /* shutdown all fd's */
177  if (s->active_ports) {
178  grpc_tcp_listener* sp;
179  for (sp = s->head; sp; sp = sp->next) {
181  sp->emfd, GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server destroyed"));
182  }
183  gpr_mu_unlock(&s->mu);
184  } else {
185  gpr_mu_unlock(&s->mu);
186  deactivated_all_ports(s);
187  }
188 }
189 
190 /* event manager callback when reads are ready */
191 static void on_read(void* arg, grpc_error_handle err) {
192  grpc_tcp_listener* sp = static_cast<grpc_tcp_listener*>(arg);
193  grpc_pollset* read_notifier_pollset;
194  if (!GRPC_ERROR_IS_NONE(err)) {
195  goto error;
196  }
197 
198  /* loop until accept4 returns EAGAIN, and then re-arm notification */
199  for (;;) {
201  memset(&addr, 0, sizeof(addr));
202  addr.len = static_cast<socklen_t>(sizeof(struct sockaddr_storage));
203  /* Note: If we ever decide to return this address to the user, remember to
204  strip off the ::ffff:0.0.0.0/96 prefix first. */
205  int fd = grpc_accept4(sp->fd, &addr, 1, 1);
206  if (fd < 0) {
207  if (errno == EINTR) {
208  continue;
209  } else if (errno == EAGAIN || errno == ECONNABORTED ||
210  errno == EWOULDBLOCK) {
212  return;
213  } else {
214  gpr_mu_lock(&sp->server->mu);
215  if (!sp->server->shutdown_listeners) {
216  gpr_log(GPR_ERROR, "Failed accept4: %s", strerror(errno));
217  } else {
218  /* if we have shutdown listeners, accept4 could fail, and we
219  needn't notify users */
220  }
221  gpr_mu_unlock(&sp->server->mu);
222  goto error;
223  }
224  }
225 
226  if (sp->server->memory_quota->IsMemoryPressureHigh()) {
227  int64_t dropped_connections_count =
228  num_dropped_connections.fetch_add(1, std::memory_order_relaxed) + 1;
229  if (dropped_connections_count % 1000 == 1) {
231  "Dropped >= %" PRId64
232  " new connection attempts due to high memory pressure",
233  dropped_connections_count);
234  }
235  close(fd);
236  continue;
237  }
238 
239  /* For UNIX sockets, the accept call might not fill up the member sun_path
240  * of sockaddr_un, so explicitly call getsockname to get it. */
241  if (grpc_is_unix_socket(&addr)) {
242  memset(&addr, 0, sizeof(addr));
243  addr.len = static_cast<socklen_t>(sizeof(struct sockaddr_storage));
244  if (getsockname(fd, reinterpret_cast<struct sockaddr*>(addr.addr),
245  &(addr.len)) < 0) {
246  gpr_log(GPR_ERROR, "Failed getsockname: %s", strerror(errno));
247  close(fd);
248  goto error;
249  }
250  }
251 
253 
255  sp->server->channel_args);
256  if (!GRPC_ERROR_IS_NONE(err)) {
257  goto error;
258  }
259 
260  auto addr_uri = grpc_sockaddr_to_uri(&addr);
261  if (!addr_uri.ok()) {
262  gpr_log(GPR_ERROR, "Invalid address: %s",
263  addr_uri.status().ToString().c_str());
264  goto error;
265  }
267  gpr_log(GPR_INFO, "SERVER_CONNECT: incoming connection: %s",
268  addr_uri->c_str());
269  }
270 
271  std::string name = absl::StrCat("tcp-server-connection:", addr_uri.value());
272  grpc_fd* fdobj = grpc_fd_create(fd, name.c_str(), true);
273 
274  read_notifier_pollset = (*(sp->server->pollsets))
275  [static_cast<size_t>(gpr_atm_no_barrier_fetch_add(
276  &sp->server->next_pollset_to_assign, 1)) %
277  sp->server->pollsets->size()];
278 
279  grpc_pollset_add_fd(read_notifier_pollset, fdobj);
280 
281  // Create acceptor.
282  grpc_tcp_server_acceptor* acceptor =
283  static_cast<grpc_tcp_server_acceptor*>(gpr_malloc(sizeof(*acceptor)));
284  acceptor->from_server = sp->server;
285  acceptor->port_index = sp->port_index;
286  acceptor->fd_index = sp->fd_index;
287  acceptor->external_connection = false;
288  sp->server->on_accept_cb(
290  grpc_tcp_create(fdobj, sp->server->channel_args, addr_uri.value()),
291  read_notifier_pollset, acceptor);
292  }
293 
294  GPR_UNREACHABLE_CODE(return );
295 
296 error:
297  gpr_mu_lock(&sp->server->mu);
298  if (0 == --sp->server->active_ports && sp->server->shutdown) {
299  gpr_mu_unlock(&sp->server->mu);
300  deactivated_all_ports(sp->server);
301  } else {
302  gpr_mu_unlock(&sp->server->mu);
303  }
304 }
305 
306 /* Treat :: or 0.0.0.0 as a family-agnostic wildcard. */
307 static grpc_error_handle add_wildcard_addrs_to_server(grpc_tcp_server* s,
308  unsigned port_index,
309  int requested_port,
310  int* out_port) {
311  grpc_resolved_address wild4;
312  grpc_resolved_address wild6;
313  unsigned fd_index = 0;
314  grpc_dualstack_mode dsmode;
315  grpc_tcp_listener* sp = nullptr;
316  grpc_tcp_listener* sp2 = nullptr;
319  *out_port = -1;
320 
321  if (grpc_tcp_server_have_ifaddrs() && s->expand_wildcard_addrs) {
322  return grpc_tcp_server_add_all_local_addrs(s, port_index, requested_port,
323  out_port);
324  }
325 
326  grpc_sockaddr_make_wildcards(requested_port, &wild4, &wild6);
327  /* Try listening on IPv6 first. */
328  if ((v6_err = grpc_tcp_server_add_addr(s, &wild6, port_index, fd_index,
329  &dsmode, &sp)) == GRPC_ERROR_NONE) {
330  ++fd_index;
331  requested_port = *out_port = sp->port;
332  if (dsmode == GRPC_DSMODE_DUALSTACK || dsmode == GRPC_DSMODE_IPV4) {
333  return GRPC_ERROR_NONE;
334  }
335  }
336  /* If we got a v6-only socket or nothing, try adding 0.0.0.0. */
337  grpc_sockaddr_set_port(&wild4, requested_port);
338  if ((v4_err = grpc_tcp_server_add_addr(s, &wild4, port_index, fd_index,
339  &dsmode, &sp2)) == GRPC_ERROR_NONE) {
340  *out_port = sp2->port;
341  if (sp != nullptr) {
342  sp2->is_sibling = 1;
343  sp->sibling = sp2;
344  }
345  }
346  if (*out_port > 0) {
347  if (!GRPC_ERROR_IS_NONE(v6_err)) {
349  "Failed to add :: listener, "
350  "the environment may not support IPv6: %s",
351  grpc_error_std_string(v6_err).c_str());
352  GRPC_ERROR_UNREF(v6_err);
353  }
354  if (!GRPC_ERROR_IS_NONE(v4_err)) {
356  "Failed to add 0.0.0.0 listener, "
357  "the environment may not support IPv4: %s",
358  grpc_error_std_string(v4_err).c_str());
359  GRPC_ERROR_UNREF(v4_err);
360  }
361  return GRPC_ERROR_NONE;
362  } else {
364  "Failed to add any wildcard listeners");
365  GPR_ASSERT(!GRPC_ERROR_IS_NONE(v6_err) && !GRPC_ERROR_IS_NONE(v4_err));
366  root_err = grpc_error_add_child(root_err, v6_err);
367  root_err = grpc_error_add_child(root_err, v4_err);
368  return root_err;
369  }
370 }
371 
372 static grpc_error_handle clone_port(grpc_tcp_listener* listener,
373  unsigned count) {
374  grpc_tcp_listener* sp = nullptr;
377 
378  for (grpc_tcp_listener* l = listener->next; l && l->is_sibling; l = l->next) {
379  l->fd_index += count;
380  }
381 
382  for (unsigned i = 0; i < count; i++) {
383  int fd = -1;
384  int port = -1;
385  grpc_dualstack_mode dsmode;
386  err = grpc_create_dualstack_socket(&listener->addr, SOCK_STREAM, 0, &dsmode,
387  &fd);
388  if (!GRPC_ERROR_IS_NONE(err)) return err;
389  err = grpc_tcp_server_prepare_socket(listener->server, fd, &listener->addr,
390  true, &port);
391  if (!GRPC_ERROR_IS_NONE(err)) return err;
392  listener->server->nports++;
393  addr_str = grpc_sockaddr_to_string(&listener->addr, true);
394  if (!addr_str.ok()) {
396  }
397  sp = static_cast<grpc_tcp_listener*>(gpr_malloc(sizeof(grpc_tcp_listener)));
398  sp->next = listener->next;
399  listener->next = sp;
400  /* sp (the new listener) is a sibling of 'listener' (the original
401  listener). */
402  sp->is_sibling = 1;
403  sp->sibling = listener->sibling;
404  listener->sibling = sp;
405  sp->server = listener->server;
406  sp->fd = fd;
407  sp->emfd = grpc_fd_create(
408  fd,
409  absl::StrFormat("tcp-server-listener:%s/clone-%d", *addr_str, i)
410  .c_str(),
411  true);
412  memcpy(&sp->addr, &listener->addr, sizeof(grpc_resolved_address));
413  sp->port = port;
414  sp->port_index = listener->port_index;
415  sp->fd_index = listener->fd_index + count - i;
416  GPR_ASSERT(sp->emfd);
417  while (listener->server->tail->next != nullptr) {
418  listener->server->tail = listener->server->tail->next;
419  }
420  }
421 
422  return GRPC_ERROR_NONE;
423 }
424 
425 static grpc_error_handle tcp_server_add_port(grpc_tcp_server* s,
427  int* out_port) {
429  grpc_tcp_listener* sp;
430  grpc_resolved_address sockname_temp;
431  grpc_resolved_address addr6_v4mapped;
432  int requested_port = grpc_sockaddr_get_port(addr);
433  unsigned port_index = 0;
434  grpc_dualstack_mode dsmode;
436  *out_port = -1;
437  if (s->tail != nullptr) {
438  port_index = s->tail->port_index + 1;
439  }
441 
442  /* Check if this is a wildcard port, and if so, try to keep the port the same
443  as some previously created listener. */
444  if (requested_port == 0) {
445  for (sp = s->head; sp; sp = sp->next) {
446  sockname_temp.len =
447  static_cast<socklen_t>(sizeof(struct sockaddr_storage));
448  if (0 ==
449  getsockname(sp->fd,
450  reinterpret_cast<grpc_sockaddr*>(&sockname_temp.addr),
451  &sockname_temp.len)) {
452  int used_port = grpc_sockaddr_get_port(&sockname_temp);
453  if (used_port > 0) {
454  memcpy(&sockname_temp, addr, sizeof(grpc_resolved_address));
455  grpc_sockaddr_set_port(&sockname_temp, used_port);
456  requested_port = used_port;
457  addr = &sockname_temp;
458  break;
459  }
460  }
461  }
462  }
463  if (grpc_sockaddr_is_wildcard(addr, &requested_port)) {
464  return add_wildcard_addrs_to_server(s, port_index, requested_port,
465  out_port);
466  }
467  if (grpc_sockaddr_to_v4mapped(addr, &addr6_v4mapped)) {
468  addr = &addr6_v4mapped;
469  }
470  if ((err = grpc_tcp_server_add_addr(s, addr, port_index, 0, &dsmode, &sp)) ==
471  GRPC_ERROR_NONE) {
472  *out_port = sp->port;
473  }
474  return err;
475 }
476 
477 /* Return listener at port_index or NULL. Should only be called with s->mu
478  locked. */
479 static grpc_tcp_listener* get_port_index(grpc_tcp_server* s,
480  unsigned port_index) {
481  unsigned num_ports = 0;
482  grpc_tcp_listener* sp;
483  for (sp = s->head; sp; sp = sp->next) {
484  if (!sp->is_sibling) {
485  if (++num_ports > port_index) {
486  return sp;
487  }
488  }
489  }
490  return nullptr;
491 }
492 
493 unsigned tcp_server_port_fd_count(grpc_tcp_server* s, unsigned port_index) {
494  unsigned num_fds = 0;
495  gpr_mu_lock(&s->mu);
496  grpc_tcp_listener* sp = get_port_index(s, port_index);
497  for (; sp; sp = sp->sibling) {
498  ++num_fds;
499  }
500  gpr_mu_unlock(&s->mu);
501  return num_fds;
502 }
503 
504 static int tcp_server_port_fd(grpc_tcp_server* s, unsigned port_index,
505  unsigned fd_index) {
506  gpr_mu_lock(&s->mu);
507  grpc_tcp_listener* sp = get_port_index(s, port_index);
508  for (; sp; sp = sp->sibling, --fd_index) {
509  if (fd_index == 0) {
510  gpr_mu_unlock(&s->mu);
511  return sp->fd;
512  }
513  }
514  gpr_mu_unlock(&s->mu);
515  return -1;
516 }
517 
518 static void tcp_server_start(grpc_tcp_server* s,
519  const std::vector<grpc_pollset*>* pollsets,
520  grpc_tcp_server_cb on_accept_cb,
521  void* on_accept_cb_arg) {
522  size_t i;
523  grpc_tcp_listener* sp;
524  GPR_ASSERT(on_accept_cb);
525  gpr_mu_lock(&s->mu);
526  GPR_ASSERT(!s->on_accept_cb);
527  GPR_ASSERT(s->active_ports == 0);
528  s->on_accept_cb = on_accept_cb;
529  s->on_accept_cb_arg = on_accept_cb_arg;
530  s->pollsets = pollsets;
531  sp = s->head;
532  while (sp != nullptr) {
533  if (s->so_reuseport && !grpc_is_unix_socket(&sp->addr) &&
534  pollsets->size() > 1) {
536  "clone_port", clone_port(sp, (unsigned)(pollsets->size() - 1))));
537  for (i = 0; i < pollsets->size(); i++) {
538  grpc_pollset_add_fd((*pollsets)[i], sp->emfd);
540  grpc_schedule_on_exec_ctx);
542  s->active_ports++;
543  sp = sp->next;
544  }
545  } else {
546  for (i = 0; i < pollsets->size(); i++) {
547  grpc_pollset_add_fd((*pollsets)[i], sp->emfd);
548  }
550  grpc_schedule_on_exec_ctx);
552  s->active_ports++;
553  sp = sp->next;
554  }
555  }
556  gpr_mu_unlock(&s->mu);
557 }
558 
559 grpc_tcp_server* tcp_server_ref(grpc_tcp_server* s) {
560  gpr_ref_non_zero(&s->refs);
561  return s;
562 }
563 
564 static void tcp_server_shutdown_starting_add(grpc_tcp_server* s,
565  grpc_closure* shutdown_starting) {
566  gpr_mu_lock(&s->mu);
567  grpc_closure_list_append(&s->shutdown_starting, shutdown_starting,
569  gpr_mu_unlock(&s->mu);
570 }
571 
572 static void tcp_server_unref(grpc_tcp_server* s) {
573  if (gpr_unref(&s->refs)) {
575  gpr_mu_lock(&s->mu);
576  grpc_core::ExecCtx::RunList(DEBUG_LOCATION, &s->shutdown_starting);
577  gpr_mu_unlock(&s->mu);
578  tcp_server_destroy(s);
579  }
580 }
581 
582 static void tcp_server_shutdown_listeners(grpc_tcp_server* s) {
583  gpr_mu_lock(&s->mu);
584  s->shutdown_listeners = true;
585  /* shutdown all fd's */
586  if (s->active_ports) {
587  grpc_tcp_listener* sp;
588  for (sp = s->head; sp; sp = sp->next) {
590  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown"));
591  }
592  }
593  gpr_mu_unlock(&s->mu);
594 }
595 
596 namespace {
597 class ExternalConnectionHandler : public grpc_core::TcpServerFdHandler {
598  public:
599  explicit ExternalConnectionHandler(grpc_tcp_server* s) : s_(s) {}
600 
601  // TODO(yangg) resolve duplicate code with on_read
602  void Handle(int listener_fd, int fd, grpc_byte_buffer* buf) override {
603  grpc_pollset* read_notifier_pollset;
605  memset(&addr, 0, sizeof(addr));
606  addr.len = static_cast<socklen_t>(sizeof(struct sockaddr_storage));
608 
609  if (getpeername(fd, reinterpret_cast<struct sockaddr*>(addr.addr),
610  &(addr.len)) < 0) {
611  gpr_log(GPR_ERROR, "Failed getpeername: %s", strerror(errno));
612  close(fd);
613  return;
614  }
616  auto addr_uri = grpc_sockaddr_to_uri(&addr);
617  if (!addr_uri.ok()) {
618  gpr_log(GPR_ERROR, "Invalid address: %s",
619  addr_uri.status().ToString().c_str());
620  return;
621  }
622  if (grpc_tcp_trace.enabled()) {
623  gpr_log(GPR_INFO, "SERVER_CONNECT: incoming external connection: %s",
624  addr_uri->c_str());
625  }
626  std::string name = absl::StrCat("tcp-server-connection:", addr_uri.value());
627  grpc_fd* fdobj = grpc_fd_create(fd, name.c_str(), true);
628  read_notifier_pollset =
629  (*(s_->pollsets))[static_cast<size_t>(gpr_atm_no_barrier_fetch_add(
630  &s_->next_pollset_to_assign, 1)) %
631  s_->pollsets->size()];
632  grpc_pollset_add_fd(read_notifier_pollset, fdobj);
633  grpc_tcp_server_acceptor* acceptor =
634  static_cast<grpc_tcp_server_acceptor*>(gpr_malloc(sizeof(*acceptor)));
635  acceptor->from_server = s_;
636  acceptor->port_index = -1;
637  acceptor->fd_index = -1;
638  acceptor->external_connection = true;
639  acceptor->listener_fd = listener_fd;
640  acceptor->pending_data = buf;
641  s_->on_accept_cb(s_->on_accept_cb_arg,
642  grpc_tcp_create(fdobj, s_->channel_args, addr_uri.value()),
643  read_notifier_pollset, acceptor);
644  }
645 
646  private:
648 };
649 } // namespace
650 
651 static grpc_core::TcpServerFdHandler* tcp_server_create_fd_handler(
652  grpc_tcp_server* s) {
653  s->fd_handler = new ExternalConnectionHandler(s);
654  return s->fd_handler;
655 }
656 
657 grpc_tcp_server_vtable grpc_posix_tcp_server_vtable = {
658  tcp_server_create, tcp_server_start,
659  tcp_server_add_port, tcp_server_create_fd_handler,
660  tcp_server_port_fd_count, tcp_server_port_fd,
661  tcp_server_ref, tcp_server_shutdown_starting_add,
662  tcp_server_unref, tcp_server_shutdown_listeners};
663 
664 #endif /* GRPC_POSIX_SOCKET_TCP_SERVER */
GRPC_CLOSURE_INIT
#define GRPC_CLOSURE_INIT(closure, cb, cb_arg, scheduler)
Definition: closure.h:115
grpc_tcp_server_shutdown_listeners
void grpc_tcp_server_shutdown_listeners(grpc_tcp_server *s)
Definition: tcp_server.cc:71
GPR_INFO
#define GPR_INFO
Definition: include/grpc/impl/codegen/log.h:56
grpc_core::TcpServerFdHandler
Definition: tcp_server.h:57
gpr_mu_unlock
GPRAPI void gpr_mu_unlock(gpr_mu *mu)
GRPC_ERROR_NONE
#define GRPC_ERROR_NONE
Definition: error.h:234
log.h
gpr_atm_no_barrier_store
#define gpr_atm_no_barrier_store(p, value)
Definition: impl/codegen/atm_gcc_atomic.h:56
grpc_tcp_listener::sibling
struct grpc_tcp_listener * sibling
Definition: tcp_server_utils_posix.h:48
sockaddr_utils.h
absl::Status::ToString
std::string ToString(StatusToStringMode mode=StatusToStringMode::kDefault) const
Definition: third_party/abseil-cpp/absl/status/status.h:821
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
GRPC_ARG_INTEGER
@ GRPC_ARG_INTEGER
Definition: grpc_types.h:81
memset
return memset(p, 0, total)
grpc_core::ExecCtx::RunList
static void RunList(const DebugLocation &location, grpc_closure_list *list)
Definition: exec_ctx.cc:129
absl::StrFormat
ABSL_MUST_USE_RESULT std::string StrFormat(const FormatSpec< Args... > &format, const Args &... args)
Definition: abseil-cpp/absl/strings/str_format.h:338
GRPC_ARG_EXPAND_WILDCARD_ADDRS
#define GRPC_ARG_EXPAND_WILDCARD_ADDRS
Definition: grpc_types.h:301
grpc_tcp_server::next_pollset_to_assign
gpr_atm next_pollset_to_assign
Definition: tcp_server_utils_posix.h:91
grpc_fd_shutdown
void grpc_fd_shutdown(grpc_fd *fd, grpc_error_handle why)
grpc_tcp_server::on_accept_cb
grpc_tcp_server_cb on_accept_cb
Definition: tcp_server_utils_posix.h:56
string.h
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
grpc_set_socket_no_sigpipe_if_possible
grpc_error_handle grpc_set_socket_no_sigpipe_if_possible(int fd)
shutdown_complete
static void shutdown_complete(void *arg, int)
Definition: proxy.cc:133
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
resolve_address.h
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
error
grpc_error_handle error
Definition: retry_filter.cc:499
grpc_sockaddr_make_wildcards
void grpc_sockaddr_make_wildcards(int port, grpc_resolved_address *wild4_out, grpc_resolved_address *wild6_out)
Definition: sockaddr_utils.cc:166
error_ref_leak.err
err
Definition: error_ref_leak.py:35
grpc_tcp_server::nports
unsigned nports
Definition: tcp_server_utils_posix.h:78
grpc_resolved_address
Definition: resolved_address.h:34
gpr_malloc
GPRAPI void * gpr_malloc(size_t size)
Definition: alloc.cc:29
grpc_tcp_server_acceptor::fd_index
unsigned fd_index
Definition: tcp_server.h:42
grpc_tcp_server
Definition: tcp_server_utils_posix.h:53
setup.name
name
Definition: setup.py:542
absl::FormatConversionChar::s
@ s
GRPC_LOG_IF_ERROR
#define GRPC_LOG_IF_ERROR(what, error)
Definition: error.h:398
time.h
grpc_tcp_listener::server
grpc_tcp_server * server
Definition: tcp_server_utils_posix.h:34
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_tcp_listener::next
struct grpc_tcp_listener * next
Definition: tcp_server_utils_posix.h:41
grpc_is_unix_socket
int grpc_is_unix_socket(const grpc_resolved_address *resolved_addr)
Definition: unix_sockets_posix_noop.cc:46
gen_build_yaml.struct
def struct(**kwargs)
Definition: test/core/end2end/gen_build_yaml.py:30
GRPC_ARG_ALLOW_REUSEPORT
#define GRPC_ARG_ALLOW_REUSEPORT
Definition: grpc_types.h:295
grpc_tcp_listener::read_closure
grpc_closure read_closure
Definition: tcp_server_utils_posix.h:39
grpc_tcp_server_cb
void(* grpc_tcp_server_cb)(void *arg, grpc_endpoint *ep, grpc_pollset *accepting_pollset, grpc_tcp_server_acceptor *acceptor)
Definition: tcp_server.h:51
grpc_closure_list_append
bool grpc_closure_list_append(grpc_closure_list *closure_list, grpc_closure *closure)
Definition: closure.h:176
grpc_tcp_server::shutdown
bool shutdown
Definition: tcp_server_utils_posix.h:67
grpc_tcp_listener::emfd
grpc_fd * emfd
Definition: tcp_server_utils_posix.h:33
grpc_tcp_server_add_addr
grpc_error_handle grpc_tcp_server_add_addr(grpc_tcp_server *s, const grpc_resolved_address *addr, unsigned port_index, unsigned fd_index, grpc_dualstack_mode *dsmode, grpc_tcp_listener **listener)
memory.h
gpr_mu_destroy
GPRAPI void gpr_mu_destroy(gpr_mu *mu)
grpc_tcp_trace
grpc_core::TraceFlag grpc_tcp_trace(false, "tcp")
DEBUG_LOCATION
#define DEBUG_LOCATION
Definition: debug_location.h:41
server
std::unique_ptr< Server > server
Definition: channelz_service_test.cc:330
grpc_error_add_child
grpc_error_handle grpc_error_add_child(grpc_error_handle src, grpc_error_handle child)
Definition: error.cc:678
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
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()
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
GRPC_MAX_SOCKADDR_SIZE
#define GRPC_MAX_SOCKADDR_SIZE
Definition: resolve_address.h:35
grpc_tcp_server::channel_args
grpc_channel_args * channel_args
Definition: tcp_server_utils_posix.h:94
on_read
static grpc_closure on_read
Definition: bad_server_response_test.cc:88
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
int64_t
signed __int64 int64_t
Definition: stdint-msvc2008.h:89
gen_stats_data.c_str
def c_str(s, encoding='ascii')
Definition: gen_stats_data.py:38
grpc_fd
struct grpc_fd grpc_fd
Definition: ev_posix.h:44
grpc_sockaddr_set_port
int grpc_sockaddr_set_port(grpc_resolved_address *resolved_addr, int port)
Definition: sockaddr_utils.cc:324
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc_tcp_server_add_all_local_addrs
grpc_error_handle grpc_tcp_server_add_all_local_addrs(grpc_tcp_server *s, unsigned port_index, int requested_port, int *out_port)
gpr_mu_init
GPRAPI void gpr_mu_init(gpr_mu *mu)
grpc_fd_create
grpc_fd * grpc_fd_create(int fd, const char *name, bool track_err)
grpc_accept4
int grpc_accept4(int sockfd, grpc_resolved_address *resolved_addr, int nonblock, int cloexec)
tcp_posix.h
grpc_byte_buffer
Definition: grpc_types.h:43
grpc_tcp_listener::addr
grpc_resolved_address addr
Definition: tcp_server_utils_posix.h:35
grpc_tcp_create
grpc_endpoint * grpc_tcp_create(grpc_fd *fd, const grpc_channel_args *args, absl::string_view peer_string)
grpc_core::ResourceQuota::memory_quota
MemoryQuotaRefPtr memory_quota()
Definition: src/core/lib/resource_quota/resource_quota.h:51
grpc_tcp_server::active_ports
size_t active_ports
Definition: tcp_server_utils_posix.h:62
grpc_channel_args_destroy
void grpc_channel_args_destroy(grpc_channel_args *a)
Definition: channel_args.cc:360
arg
Definition: cmdline.cc:40
grpc_tcp_server::mu
gpr_mu mu
Definition: tcp_server_utils_posix.h:59
gpr_atm_no_barrier_fetch_add
#define gpr_atm_no_barrier_fetch_add(p, delta)
Definition: impl/codegen/atm_gcc_atomic.h:59
close
#define close
Definition: test-fs.c:48
grpc_channel_args_copy
grpc_channel_args * grpc_channel_args_copy(const grpc_channel_args *src)
Definition: channel_args.cc:285
grpc_tcp_listener
Definition: tcp_server_utils_posix.h:31
grpc_tcp_server::shutdown_listeners
bool shutdown_listeners
Definition: tcp_server_utils_posix.h:69
gpr_mu_lock
GPRAPI void gpr_mu_lock(gpr_mu *mu)
grpc_resolved_address::len
socklen_t len
Definition: resolved_address.h:36
grpc_tcp_listener::fd
int fd
Definition: tcp_server_utils_posix.h:32
tcp_server_utils_posix.h
grpc_tcp_server_acceptor::from_server
grpc_tcp_server * from_server
Definition: tcp_server.h:39
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
GPR_UNREACHABLE_CODE
#define GPR_UNREACHABLE_CODE(STATEMENT)
Definition: impl/codegen/port_platform.h:652
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_unlink_if_unix_domain_socket
void grpc_unlink_if_unix_domain_socket(const grpc_resolved_address *resolved_addr)
Definition: unix_sockets_posix_noop.cc:50
grpc_sockaddr_to_v4mapped
int grpc_sockaddr_to_v4mapped(const grpc_resolved_address *resolved_addr, grpc_resolved_address *resolved_addr6_out)
Definition: sockaddr_utils.cc:111
grpc_tcp_listener::fd_index
unsigned fd_index
Definition: tcp_server_utils_posix.h:38
grpc_core::ExecCtx
Definition: exec_ctx.h:97
GRPC_ERROR_CREATE_FROM_STATIC_STRING
#define GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc)
Definition: error.h:291
grpc_tcp_server_have_ifaddrs
bool grpc_tcp_server_have_ifaddrs(void)
tests.unit._exit_scenarios.port
port
Definition: _exit_scenarios.py:179
grpc_tcp_listener::port_index
unsigned port_index
Definition: tcp_server_utils_posix.h:37
grpc_core::TraceFlag::enabled
bool enabled()
Definition: debug/trace.h:82
unix_sockets_posix.h
grpc_fd_notify_on_read
void grpc_fd_notify_on_read(grpc_fd *fd, grpc_closure *closure)
grpc_tcp_server_acceptor::port_index
unsigned port_index
Definition: tcp_server.h:41
grpc_sockaddr_get_port
int grpc_sockaddr_get_port(const grpc_resolved_address *resolved_addr)
Definition: sockaddr_utils.cc:303
absl::StatusOr::ok
ABSL_MUST_USE_RESULT bool ok() const
Definition: abseil-cpp/absl/status/statusor.h:491
grpc_tcp_server_acceptor::external_connection
bool external_connection
Definition: tcp_server.h:44
grpc_tcp_server::on_accept_cb_arg
void * on_accept_cb_arg
Definition: tcp_server_utils_posix.h:57
grpc_core::ResourceQuotaFromChannelArgs
ResourceQuotaRefPtr ResourceQuotaFromChannelArgs(const grpc_channel_args *args)
Definition: api.cc:40
gpr_ref_non_zero
GPRAPI void gpr_ref_non_zero(gpr_refcount *r)
Definition: sync.cc:90
grpc_tcp_server
struct grpc_tcp_server grpc_tcp_server
Definition: tcp_server.h:34
server
Definition: examples/python/async_streaming/server.py:1
GRPC_DSMODE_IPV4
@ GRPC_DSMODE_IPV4
Definition: socket_utils_posix.h:120
count
int * count
Definition: bloaty/third_party/googletest/googlemock/test/gmock_stress_test.cc:96
grpc_tcp_server_acceptor::pending_data
grpc_byte_buffer * pending_data
Definition: tcp_server.h:46
grpc_tcp_server_acceptor
Definition: tcp_server.h:36
port.h
exec_ctx
grpc_core::ExecCtx exec_ctx
Definition: end2end_binder_transport_test.cc:75
grpc_error_std_string
std::string grpc_error_std_string(grpc_error_handle error)
Definition: error.cc:944
GRPC_ERROR_CREATE_FROM_CPP_STRING
#define GRPC_ERROR_CREATE_FROM_CPP_STRING(desc)
Definition: error.h:297
alloc.h
grpc_tcp_listener::destroyed_closure
grpc_closure destroyed_closure
Definition: tcp_server_utils_posix.h:40
grpc_tcp_server::tail
grpc_tcp_listener * tail
Definition: tcp_server_utils_posix.h:77
grpc_tcp_server_prepare_socket
grpc_error_handle grpc_tcp_server_prepare_socket(grpc_tcp_server *, int fd, const grpc_resolved_address *addr, bool so_reuseport, int *port)
socket_utils_posix.h
grpc_pollset_add_fd
void grpc_pollset_add_fd(grpc_pollset *pollset, struct grpc_fd *fd)
grpc_tcp_listener::is_sibling
int is_sibling
Definition: tcp_server_utils_posix.h:49
arg
struct arg arg
exec_ctx.h
grpc_tcp_server::memory_quota
grpc_core::MemoryQuotaRefPtr memory_quota
Definition: tcp_server_utils_posix.h:100
GRPC_ERROR_UNREF
#define GRPC_ERROR_UNREF(err)
Definition: error.h:262
grpc_core::ExecCtx::Run
static void Run(const DebugLocation &location, grpc_closure *closure, grpc_error_handle error)
Definition: exec_ctx.cc:98
grpc_dualstack_mode
grpc_dualstack_mode
Definition: socket_utils_posix.h:116
channel_args.h
grpc_fd_orphan
void grpc_fd_orphan(grpc_fd *fd, grpc_closure *on_done, int *release_fd, const char *reason)
GRPC_FD_SERVER_CONNECTION_USAGE
@ GRPC_FD_SERVER_CONNECTION_USAGE
Definition: socket_mutator.h:36
grpc_tcp_server_acceptor::listener_fd
int listener_fd
Definition: tcp_server.h:45
gpr_ref_init
GPRAPI void gpr_ref_init(gpr_refcount *r, int n)
Definition: sync.cc:86
absl::StatusOr< std::string >
grpc_sockaddr_is_wildcard
int grpc_sockaddr_is_wildcard(const grpc_resolved_address *resolved_addr, int *port_out)
Definition: sockaddr_utils.cc:132
gpr_unref
GPRAPI int gpr_unref(gpr_refcount *r)
Definition: sync.cc:103
grpc_error
Definition: error_internal.h:42
grpc_tcp_server::pollsets
const std::vector< grpc_pollset * > * pollsets
Definition: tcp_server_utils_posix.h:88
run_grpclb_interop_tests.l
dictionary l
Definition: run_grpclb_interop_tests.py:410
tcp_server.h
grpc_pollset
Definition: bm_cq_multiple_threads.cc:37
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)
sync.h
grpc_closure
Definition: closure.h:56
grpc_sockaddr_to_uri
absl::StatusOr< std::string > grpc_sockaddr_to_uri(const grpc_resolved_address *resolved_addr)
Definition: sockaddr_utils.cc:260
grpc_tcp_server_vtable
Definition: tcp_server.h:65
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
grpc_tcp_listener::port
int port
Definition: tcp_server_utils_posix.h:36
errno.h
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
s_
std::string s_
Definition: abseil-cpp/absl/container/btree_test.cc:1031
absl::StatusOr::status
const Status & status() const &
Definition: abseil-cpp/absl/status/statusor.h:678
GRPC_ERROR_IS_NONE
#define GRPC_ERROR_IS_NONE(err)
Definition: error.h:241
api.h
port_platform.h


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