unix/udp.c
Go to the documentation of this file.
1 /* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2  *
3  * Permission is hereby granted, free of charge, to any person obtaining a copy
4  * of this software and associated documentation files (the "Software"), to
5  * deal in the Software without restriction, including without limitation the
6  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7  * sell copies of the Software, and to permit persons to whom the Software is
8  * furnished to do so, subject to the following conditions:
9  *
10  * The above copyright notice and this permission notice shall be included in
11  * all copies or substantial portions of the Software.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19  * IN THE SOFTWARE.
20  */
21 
22 #include "uv.h"
23 #include "internal.h"
24 
25 #include <assert.h>
26 #include <string.h>
27 #include <errno.h>
28 #include <stdlib.h>
29 #include <unistd.h>
30 #if defined(__MVS__)
31 #include <xti.h>
32 #endif
33 #include <sys/un.h>
34 
35 #define UV__UDP_DGRAM_MAXSIZE (64 * 1024)
36 
37 #if defined(IPV6_JOIN_GROUP) && !defined(IPV6_ADD_MEMBERSHIP)
38 # define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
39 #endif
40 
41 #if defined(IPV6_LEAVE_GROUP) && !defined(IPV6_DROP_MEMBERSHIP)
42 # define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
43 #endif
44 
45 
47 static void uv__udp_io(uv_loop_t* loop, uv__io_t* w, unsigned int revents);
48 static void uv__udp_recvmsg(uv_udp_t* handle);
49 static void uv__udp_sendmsg(uv_udp_t* handle);
51  int domain,
52  unsigned int flags);
53 
54 #if HAVE_MMSG
55 
56 #define UV__MMSG_MAXWIDTH 20
57 
58 static int uv__udp_recvmmsg(uv_udp_t* handle, uv_buf_t* buf);
59 static void uv__udp_sendmmsg(uv_udp_t* handle);
60 
61 static int uv__recvmmsg_avail;
62 static int uv__sendmmsg_avail;
63 static uv_once_t once = UV_ONCE_INIT;
64 
65 static void uv__udp_mmsg_init(void) {
66  int ret;
67  int s;
68  s = uv__socket(AF_INET, SOCK_DGRAM, 0);
69  if (s < 0)
70  return;
71  ret = uv__sendmmsg(s, NULL, 0, 0);
72  if (ret == 0 || errno != ENOSYS) {
73  uv__sendmmsg_avail = 1;
74  uv__recvmmsg_avail = 1;
75  } else {
76  ret = uv__recvmmsg(s, NULL, 0, 0, NULL);
77  if (ret == 0 || errno != ENOSYS)
78  uv__recvmmsg_avail = 1;
79  }
80  uv__close(s);
81 }
82 
83 #endif
84 
86  uv__io_close(handle->loop, &handle->io_watcher);
88 
89  if (handle->io_watcher.fd != -1) {
90  uv__close(handle->io_watcher.fd);
91  handle->io_watcher.fd = -1;
92  }
93 }
94 
95 
98  QUEUE* q;
99 
100  assert(!uv__io_active(&handle->io_watcher, POLLIN | POLLOUT));
101  assert(handle->io_watcher.fd == -1);
102 
103  while (!QUEUE_EMPTY(&handle->write_queue)) {
104  q = QUEUE_HEAD(&handle->write_queue);
105  QUEUE_REMOVE(q);
106 
108  req->status = UV_ECANCELED;
109  QUEUE_INSERT_TAIL(&handle->write_completed_queue, &req->queue);
110  }
111 
113 
114  assert(handle->send_queue_size == 0);
115  assert(handle->send_queue_count == 0);
116 
117  /* Now tear down the handle. */
118  handle->recv_cb = NULL;
119  handle->alloc_cb = NULL;
120  /* but _do not_ touch close_cb */
121 }
122 
123 
126  QUEUE* q;
127 
128  assert(!(handle->flags & UV_HANDLE_UDP_PROCESSING));
130 
131  while (!QUEUE_EMPTY(&handle->write_completed_queue)) {
132  q = QUEUE_HEAD(&handle->write_completed_queue);
133  QUEUE_REMOVE(q);
134 
136  uv__req_unregister(handle->loop, req);
137 
138  handle->send_queue_size -= uv__count_bufs(req->bufs, req->nbufs);
139  handle->send_queue_count--;
140 
141  if (req->bufs != req->bufsml)
142  uv__free(req->bufs);
143  req->bufs = NULL;
144 
145  if (req->send_cb == NULL)
146  continue;
147 
148  /* req->status >= 0 == bytes written
149  * req->status < 0 == errno
150  */
151  if (req->status >= 0)
152  req->send_cb(req, 0);
153  else
154  req->send_cb(req, req->status);
155  }
156 
157  if (QUEUE_EMPTY(&handle->write_queue)) {
158  /* Pending queue and completion queue empty, stop watcher. */
159  uv__io_stop(handle->loop, &handle->io_watcher, POLLOUT);
160  if (!uv__io_active(&handle->io_watcher, POLLIN))
162  }
163 
164  handle->flags &= ~UV_HANDLE_UDP_PROCESSING;
165 }
166 
167 
168 static void uv__udp_io(uv_loop_t* loop, uv__io_t* w, unsigned int revents) {
169  uv_udp_t* handle;
170 
171  handle = container_of(w, uv_udp_t, io_watcher);
172  assert(handle->type == UV_UDP);
173 
174  if (revents & POLLIN)
176 
177  if (revents & POLLOUT) {
180  }
181 }
182 
183 #if HAVE_MMSG
184 static int uv__udp_recvmmsg(uv_udp_t* handle, uv_buf_t* buf) {
185  struct sockaddr_in6 peers[UV__MMSG_MAXWIDTH];
186  struct iovec iov[UV__MMSG_MAXWIDTH];
187  struct uv__mmsghdr msgs[UV__MMSG_MAXWIDTH];
188  ssize_t nread;
189  uv_buf_t chunk_buf;
190  size_t chunks;
191  int flags;
192  size_t k;
193 
194  /* prepare structures for recvmmsg */
195  chunks = buf->len / UV__UDP_DGRAM_MAXSIZE;
196  if (chunks > ARRAY_SIZE(iov))
197  chunks = ARRAY_SIZE(iov);
198  for (k = 0; k < chunks; ++k) {
199  iov[k].iov_base = buf->base + k * UV__UDP_DGRAM_MAXSIZE;
200  iov[k].iov_len = UV__UDP_DGRAM_MAXSIZE;
201  msgs[k].msg_hdr.msg_iov = iov + k;
202  msgs[k].msg_hdr.msg_iovlen = 1;
203  msgs[k].msg_hdr.msg_name = peers + k;
204  msgs[k].msg_hdr.msg_namelen = sizeof(peers[0]);
205  }
206 
207  do
208  nread = uv__recvmmsg(handle->io_watcher.fd, msgs, chunks, 0, NULL);
209  while (nread == -1 && errno == EINTR);
210 
211  if (nread < 1) {
212  if (nread == 0 || errno == EAGAIN || errno == EWOULDBLOCK)
213  handle->recv_cb(handle, 0, buf, NULL, 0);
214  else
215  handle->recv_cb(handle, UV__ERR(errno), buf, NULL, 0);
216  } else {
217  /* pass each chunk to the application */
218  for (k = 0; k < (size_t) nread && handle->recv_cb != NULL; k++) {
220  if (msgs[k].msg_hdr.msg_flags & MSG_TRUNC)
222 
223  chunk_buf = uv_buf_init(iov[k].iov_base, iov[k].iov_len);
224  handle->recv_cb(handle,
225  msgs[k].msg_len,
226  &chunk_buf,
227  msgs[k].msg_hdr.msg_name,
228  flags);
229  }
230 
231  /* one last callback so the original buffer is freed */
232  if (handle->recv_cb != NULL)
233  handle->recv_cb(handle, 0, buf, NULL, 0);
234  }
235  return nread;
236 }
237 #endif
238 
240  struct sockaddr_storage peer;
241  struct msghdr h;
242  ssize_t nread;
243  uv_buf_t buf;
244  int flags;
245  int count;
246 
247  assert(handle->recv_cb != NULL);
248  assert(handle->alloc_cb != NULL);
249 
250  /* Prevent loop starvation when the data comes in as fast as (or faster than)
251  * we can read it. XXX Need to rearm fd if we switch to edge-triggered I/O.
252  */
253  count = 32;
254 
255  do {
256  buf = uv_buf_init(NULL, 0);
258  if (buf.base == NULL || buf.len == 0) {
259  handle->recv_cb(handle, UV_ENOBUFS, &buf, NULL, 0);
260  return;
261  }
262  assert(buf.base != NULL);
263 
264 #if HAVE_MMSG
265  if (handle->flags & UV_HANDLE_UDP_RECVMMSG) {
266  uv_once(&once, uv__udp_mmsg_init);
267  if (uv__recvmmsg_avail) {
268  nread = uv__udp_recvmmsg(handle, &buf);
269  if (nread > 0)
270  count -= nread;
271  continue;
272  }
273  }
274 #endif
275 
276  memset(&h, 0, sizeof(h));
277  memset(&peer, 0, sizeof(peer));
278  h.msg_name = &peer;
279  h.msg_namelen = sizeof(peer);
280  h.msg_iov = (void*) &buf;
281  h.msg_iovlen = 1;
282 
283  do {
284  nread = recvmsg(handle->io_watcher.fd, &h, 0);
285  }
286  while (nread == -1 && errno == EINTR);
287 
288  if (nread == -1) {
289  if (errno == EAGAIN || errno == EWOULDBLOCK)
290  handle->recv_cb(handle, 0, &buf, NULL, 0);
291  else
292  handle->recv_cb(handle, UV__ERR(errno), &buf, NULL, 0);
293  }
294  else {
295  flags = 0;
296  if (h.msg_flags & MSG_TRUNC)
298 
299  handle->recv_cb(handle, nread, &buf, (const struct sockaddr*) &peer, flags);
300  }
301  count--;
302  }
303  /* recv_cb callback may decide to pause or close the handle */
304  while (nread != -1
305  && count > 0
306  && handle->io_watcher.fd != -1
307  && handle->recv_cb != NULL);
308 }
309 
310 #if HAVE_MMSG
311 static void uv__udp_sendmmsg(uv_udp_t* handle) {
313  struct uv__mmsghdr h[UV__MMSG_MAXWIDTH];
314  struct uv__mmsghdr *p;
315  QUEUE* q;
316  ssize_t npkts;
317  size_t pkts;
318  size_t i;
319 
320  if (QUEUE_EMPTY(&handle->write_queue))
321  return;
322 
323 write_queue_drain:
324  for (pkts = 0, q = QUEUE_HEAD(&handle->write_queue);
325  pkts < UV__MMSG_MAXWIDTH && q != &handle->write_queue;
326  ++pkts, q = QUEUE_HEAD(q)) {
327  assert(q != NULL);
329  assert(req != NULL);
330 
331  p = &h[pkts];
332  memset(p, 0, sizeof(*p));
333  if (req->addr.ss_family == AF_UNSPEC) {
334  p->msg_hdr.msg_name = NULL;
335  p->msg_hdr.msg_namelen = 0;
336  } else {
337  p->msg_hdr.msg_name = &req->addr;
338  if (req->addr.ss_family == AF_INET6)
339  p->msg_hdr.msg_namelen = sizeof(struct sockaddr_in6);
340  else if (req->addr.ss_family == AF_INET)
341  p->msg_hdr.msg_namelen = sizeof(struct sockaddr_in);
342  else if (req->addr.ss_family == AF_UNIX)
343  p->msg_hdr.msg_namelen = sizeof(struct sockaddr_un);
344  else {
345  assert(0 && "unsupported address family");
346  abort();
347  }
348  }
349  h[pkts].msg_hdr.msg_iov = (struct iovec*) req->bufs;
350  h[pkts].msg_hdr.msg_iovlen = req->nbufs;
351  }
352 
353  do
354  npkts = uv__sendmmsg(handle->io_watcher.fd, h, pkts, 0);
355  while (npkts == -1 && errno == EINTR);
356 
357  if (npkts < 1) {
358  if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS)
359  return;
360  for (i = 0, q = QUEUE_HEAD(&handle->write_queue);
361  i < pkts && q != &handle->write_queue;
362  ++i, q = QUEUE_HEAD(q)) {
363  assert(q != NULL);
365  assert(req != NULL);
366 
367  req->status = UV__ERR(errno);
368  QUEUE_REMOVE(&req->queue);
369  QUEUE_INSERT_TAIL(&handle->write_completed_queue, &req->queue);
370  }
371  uv__io_feed(handle->loop, &handle->io_watcher);
372  return;
373  }
374 
375  for (i = 0, q = QUEUE_HEAD(&handle->write_queue);
376  i < pkts && q != &handle->write_queue;
377  ++i, q = QUEUE_HEAD(&handle->write_queue)) {
378  assert(q != NULL);
380  assert(req != NULL);
381 
382  req->status = req->bufs[0].len;
383 
384  /* Sending a datagram is an atomic operation: either all data
385  * is written or nothing is (and EMSGSIZE is raised). That is
386  * why we don't handle partial writes. Just pop the request
387  * off the write queue and onto the completed queue, done.
388  */
389  QUEUE_REMOVE(&req->queue);
390  QUEUE_INSERT_TAIL(&handle->write_completed_queue, &req->queue);
391  }
392 
393  /* couldn't batch everything, continue sending (jump to avoid stack growth) */
394  if (!QUEUE_EMPTY(&handle->write_queue))
395  goto write_queue_drain;
396  uv__io_feed(handle->loop, &handle->io_watcher);
397  return;
398 }
399 #endif
400 
403  struct msghdr h;
404  QUEUE* q;
405  ssize_t size;
406 
407 #if HAVE_MMSG
408  uv_once(&once, uv__udp_mmsg_init);
409  if (uv__sendmmsg_avail) {
410  uv__udp_sendmmsg(handle);
411  return;
412  }
413 #endif
414 
415  while (!QUEUE_EMPTY(&handle->write_queue)) {
416  q = QUEUE_HEAD(&handle->write_queue);
417  assert(q != NULL);
418 
420  assert(req != NULL);
421 
422  memset(&h, 0, sizeof h);
423  if (req->addr.ss_family == AF_UNSPEC) {
424  h.msg_name = NULL;
425  h.msg_namelen = 0;
426  } else {
427  h.msg_name = &req->addr;
428  if (req->addr.ss_family == AF_INET6)
429  h.msg_namelen = sizeof(struct sockaddr_in6);
430  else if (req->addr.ss_family == AF_INET)
431  h.msg_namelen = sizeof(struct sockaddr_in);
432  else if (req->addr.ss_family == AF_UNIX)
433  h.msg_namelen = sizeof(struct sockaddr_un);
434  else {
435  assert(0 && "unsupported address family");
436  abort();
437  }
438  }
439  h.msg_iov = (struct iovec*) req->bufs;
440  h.msg_iovlen = req->nbufs;
441 
442  do {
443  size = sendmsg(handle->io_watcher.fd, &h, 0);
444  } while (size == -1 && errno == EINTR);
445 
446  if (size == -1) {
447  if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS)
448  break;
449  }
450 
451  req->status = (size == -1 ? UV__ERR(errno) : size);
452 
453  /* Sending a datagram is an atomic operation: either all data
454  * is written or nothing is (and EMSGSIZE is raised). That is
455  * why we don't handle partial writes. Just pop the request
456  * off the write queue and onto the completed queue, done.
457  */
458  QUEUE_REMOVE(&req->queue);
459  QUEUE_INSERT_TAIL(&handle->write_completed_queue, &req->queue);
460  uv__io_feed(handle->loop, &handle->io_watcher);
461  }
462 }
463 
464 /* On the BSDs, SO_REUSEPORT implies SO_REUSEADDR but with some additional
465  * refinements for programs that use multicast.
466  *
467  * Linux as of 3.9 has a SO_REUSEPORT socket option but with semantics that
468  * are different from the BSDs: it _shares_ the port rather than steal it
469  * from the current listener. While useful, it's not something we can emulate
470  * on other platforms so we don't enable it.
471  *
472  * zOS does not support getsockname with SO_REUSEPORT option when using
473  * AF_UNIX.
474  */
475 static int uv__set_reuse(int fd) {
476  int yes;
477  yes = 1;
478 
479 #if defined(SO_REUSEPORT) && defined(__MVS__)
480  struct sockaddr_in sockfd;
481  unsigned int sockfd_len = sizeof(sockfd);
482  if (getsockname(fd, (struct sockaddr*) &sockfd, &sockfd_len) == -1)
483  return UV__ERR(errno);
484  if (sockfd.sin_family == AF_UNIX) {
485  if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)))
486  return UV__ERR(errno);
487  } else {
488  if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(yes)))
489  return UV__ERR(errno);
490  }
491 #elif defined(SO_REUSEPORT) && !defined(__linux__)
492  if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(yes)))
493  return UV__ERR(errno);
494 #else
495  if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)))
496  return UV__ERR(errno);
497 #endif
498 
499  return 0;
500 }
501 
502 
504  const struct sockaddr* addr,
505  unsigned int addrlen,
506  unsigned int flags) {
507  int err;
508  int yes;
509  int fd;
510 
511  /* Check for bad flags. */
513  return UV_EINVAL;
514 
515  /* Cannot set IPv6-only mode on non-IPv6 socket. */
516  if ((flags & UV_UDP_IPV6ONLY) && addr->sa_family != AF_INET6)
517  return UV_EINVAL;
518 
519  fd = handle->io_watcher.fd;
520  if (fd == -1) {
521  err = uv__socket(addr->sa_family, SOCK_DGRAM, 0);
522  if (err < 0)
523  return err;
524  fd = err;
525  handle->io_watcher.fd = fd;
526  }
527 
528  if (flags & UV_UDP_REUSEADDR) {
529  err = uv__set_reuse(fd);
530  if (err)
531  return err;
532  }
533 
534  if (flags & UV_UDP_IPV6ONLY) {
535 #ifdef IPV6_V6ONLY
536  yes = 1;
537  if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof yes) == -1) {
538  err = UV__ERR(errno);
539  return err;
540  }
541 #else
542  err = UV_ENOTSUP;
543  return err;
544 #endif
545  }
546 
547  if (bind(fd, addr, addrlen)) {
548  err = UV__ERR(errno);
549  if (errno == EAFNOSUPPORT)
550  /* OSX, other BSDs and SunoS fail with EAFNOSUPPORT when binding a
551  * socket created with AF_INET to an AF_INET6 address or vice versa. */
552  err = UV_EINVAL;
553  return err;
554  }
555 
556  if (addr->sa_family == AF_INET6)
557  handle->flags |= UV_HANDLE_IPV6;
558 
559  handle->flags |= UV_HANDLE_BOUND;
560  return 0;
561 }
562 
563 
565  int domain,
566  unsigned int flags) {
567  union {
568  struct sockaddr_in6 in6;
569  struct sockaddr_in in;
570  struct sockaddr addr;
571  } taddr;
572  socklen_t addrlen;
573 
574  if (handle->io_watcher.fd != -1)
575  return 0;
576 
577  switch (domain) {
578  case AF_INET:
579  {
580  struct sockaddr_in* addr = &taddr.in;
581  memset(addr, 0, sizeof *addr);
582  addr->sin_family = AF_INET;
583  addr->sin_addr.s_addr = INADDR_ANY;
584  addrlen = sizeof *addr;
585  break;
586  }
587  case AF_INET6:
588  {
589  struct sockaddr_in6* addr = &taddr.in6;
590  memset(addr, 0, sizeof *addr);
591  addr->sin6_family = AF_INET6;
592  addr->sin6_addr = in6addr_any;
593  addrlen = sizeof *addr;
594  break;
595  }
596  default:
597  assert(0 && "unsupported address family");
598  abort();
599  }
600 
601  return uv__udp_bind(handle, &taddr.addr, addrlen, flags);
602 }
603 
604 
606  const struct sockaddr* addr,
607  unsigned int addrlen) {
608  int err;
609 
610  err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0);
611  if (err)
612  return err;
613 
614  do {
615  errno = 0;
616  err = connect(handle->io_watcher.fd, addr, addrlen);
617  } while (err == -1 && errno == EINTR);
618 
619  if (err)
620  return UV__ERR(errno);
621 
623 
624  return 0;
625 }
626 
627 
629  int r;
630  struct sockaddr addr;
631 
632  memset(&addr, 0, sizeof(addr));
633 
634  addr.sa_family = AF_UNSPEC;
635 
636  do {
637  errno = 0;
638  r = connect(handle->io_watcher.fd, &addr, sizeof(addr));
639  } while (r == -1 && errno == EINTR);
640 
641  if (r == -1 && errno != EAFNOSUPPORT)
642  return UV__ERR(errno);
643 
644  handle->flags &= ~UV_HANDLE_UDP_CONNECTED;
645  return 0;
646 }
647 
648 
650  uv_udp_t* handle,
651  const uv_buf_t bufs[],
652  unsigned int nbufs,
653  const struct sockaddr* addr,
654  unsigned int addrlen,
656  int err;
657  int empty_queue;
658 
659  assert(nbufs > 0);
660 
661  if (addr) {
662  err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0);
663  if (err)
664  return err;
665  }
666 
667  /* It's legal for send_queue_count > 0 even when the write_queue is empty;
668  * it means there are error-state requests in the write_completed_queue that
669  * will touch up send_queue_size/count later.
670  */
671  empty_queue = (handle->send_queue_count == 0);
672 
673  uv__req_init(handle->loop, req, UV_UDP_SEND);
674  assert(addrlen <= sizeof(req->addr));
675  if (addr == NULL)
676  req->addr.ss_family = AF_UNSPEC;
677  else
678  memcpy(&req->addr, addr, addrlen);
679  req->send_cb = send_cb;
680  req->handle = handle;
681  req->nbufs = nbufs;
682 
683  req->bufs = req->bufsml;
684  if (nbufs > ARRAY_SIZE(req->bufsml))
685  req->bufs = uv__malloc(nbufs * sizeof(bufs[0]));
686 
687  if (req->bufs == NULL) {
688  uv__req_unregister(handle->loop, req);
689  return UV_ENOMEM;
690  }
691 
692  memcpy(req->bufs, bufs, nbufs * sizeof(bufs[0]));
693  handle->send_queue_size += uv__count_bufs(req->bufs, req->nbufs);
694  handle->send_queue_count++;
695  QUEUE_INSERT_TAIL(&handle->write_queue, &req->queue);
697 
698  if (empty_queue && !(handle->flags & UV_HANDLE_UDP_PROCESSING)) {
700 
701  /* `uv__udp_sendmsg` may not be able to do non-blocking write straight
702  * away. In such cases the `io_watcher` has to be queued for asynchronous
703  * write.
704  */
705  if (!QUEUE_EMPTY(&handle->write_queue))
706  uv__io_start(handle->loop, &handle->io_watcher, POLLOUT);
707  } else {
708  uv__io_start(handle->loop, &handle->io_watcher, POLLOUT);
709  }
710 
711  return 0;
712 }
713 
714 
716  const uv_buf_t bufs[],
717  unsigned int nbufs,
718  const struct sockaddr* addr,
719  unsigned int addrlen) {
720  int err;
721  struct msghdr h;
722  ssize_t size;
723 
724  assert(nbufs > 0);
725 
726  /* already sending a message */
727  if (handle->send_queue_count != 0)
728  return UV_EAGAIN;
729 
730  if (addr) {
731  err = uv__udp_maybe_deferred_bind(handle, addr->sa_family, 0);
732  if (err)
733  return err;
734  } else {
735  assert(handle->flags & UV_HANDLE_UDP_CONNECTED);
736  }
737 
738  memset(&h, 0, sizeof h);
739  h.msg_name = (struct sockaddr*) addr;
740  h.msg_namelen = addrlen;
741  h.msg_iov = (struct iovec*) bufs;
742  h.msg_iovlen = nbufs;
743 
744  do {
745  size = sendmsg(handle->io_watcher.fd, &h, 0);
746  } while (size == -1 && errno == EINTR);
747 
748  if (size == -1) {
749  if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOBUFS)
750  return UV_EAGAIN;
751  else
752  return UV__ERR(errno);
753  }
754 
755  return size;
756 }
757 
758 
760  const struct sockaddr_in* multicast_addr,
761  const char* interface_addr,
762  uv_membership membership) {
763  struct ip_mreq mreq;
764  int optname;
765  int err;
766 
767  memset(&mreq, 0, sizeof mreq);
768 
769  if (interface_addr) {
770  err = uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr);
771  if (err)
772  return err;
773  } else {
774  mreq.imr_interface.s_addr = htonl(INADDR_ANY);
775  }
776 
777  mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr;
778 
779  switch (membership) {
780  case UV_JOIN_GROUP:
781  optname = IP_ADD_MEMBERSHIP;
782  break;
783  case UV_LEAVE_GROUP:
784  optname = IP_DROP_MEMBERSHIP;
785  break;
786  default:
787  return UV_EINVAL;
788  }
789 
790  if (setsockopt(handle->io_watcher.fd,
791  IPPROTO_IP,
792  optname,
793  &mreq,
794  sizeof(mreq))) {
795 #if defined(__MVS__)
796  if (errno == ENXIO)
797  return UV_ENODEV;
798 #endif
799  return UV__ERR(errno);
800  }
801 
802  return 0;
803 }
804 
805 
807  const struct sockaddr_in6* multicast_addr,
808  const char* interface_addr,
809  uv_membership membership) {
810  int optname;
811  struct ipv6_mreq mreq;
812  struct sockaddr_in6 addr6;
813 
814  memset(&mreq, 0, sizeof mreq);
815 
816  if (interface_addr) {
817  if (uv_ip6_addr(interface_addr, 0, &addr6))
818  return UV_EINVAL;
819  mreq.ipv6mr_interface = addr6.sin6_scope_id;
820  } else {
821  mreq.ipv6mr_interface = 0;
822  }
823 
824  mreq.ipv6mr_multiaddr = multicast_addr->sin6_addr;
825 
826  switch (membership) {
827  case UV_JOIN_GROUP:
828  optname = IPV6_ADD_MEMBERSHIP;
829  break;
830  case UV_LEAVE_GROUP:
831  optname = IPV6_DROP_MEMBERSHIP;
832  break;
833  default:
834  return UV_EINVAL;
835  }
836 
837  if (setsockopt(handle->io_watcher.fd,
838  IPPROTO_IPV6,
839  optname,
840  &mreq,
841  sizeof(mreq))) {
842 #if defined(__MVS__)
843  if (errno == ENXIO)
844  return UV_ENODEV;
845 #endif
846  return UV__ERR(errno);
847  }
848 
849  return 0;
850 }
851 
852 
853 #if !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__ANDROID__)
855  const struct sockaddr_in* multicast_addr,
856  const char* interface_addr,
857  const struct sockaddr_in* source_addr,
858  uv_membership membership) {
859  struct ip_mreq_source mreq;
860  int optname;
861  int err;
862 
864  if (err)
865  return err;
866 
867  memset(&mreq, 0, sizeof(mreq));
868 
869  if (interface_addr != NULL) {
870  err = uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr);
871  if (err)
872  return err;
873  } else {
874  mreq.imr_interface.s_addr = htonl(INADDR_ANY);
875  }
876 
877  mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr;
878  mreq.imr_sourceaddr.s_addr = source_addr->sin_addr.s_addr;
879 
880  if (membership == UV_JOIN_GROUP)
881  optname = IP_ADD_SOURCE_MEMBERSHIP;
882  else if (membership == UV_LEAVE_GROUP)
883  optname = IP_DROP_SOURCE_MEMBERSHIP;
884  else
885  return UV_EINVAL;
886 
887  if (setsockopt(handle->io_watcher.fd,
888  IPPROTO_IP,
889  optname,
890  &mreq,
891  sizeof(mreq))) {
892  return UV__ERR(errno);
893  }
894 
895  return 0;
896 }
897 
898 
900  const struct sockaddr_in6* multicast_addr,
901  const char* interface_addr,
902  const struct sockaddr_in6* source_addr,
903  uv_membership membership) {
904  struct group_source_req mreq;
905  struct sockaddr_in6 addr6;
906  int optname;
907  int err;
908 
910  if (err)
911  return err;
912 
913  memset(&mreq, 0, sizeof(mreq));
914 
915  if (interface_addr != NULL) {
916  err = uv_ip6_addr(interface_addr, 0, &addr6);
917  if (err)
918  return err;
919  mreq.gsr_interface = addr6.sin6_scope_id;
920  } else {
921  mreq.gsr_interface = 0;
922  }
923 
924  memcpy(&mreq.gsr_group, multicast_addr, sizeof(mreq.gsr_group));
925  memcpy(&mreq.gsr_source, source_addr, sizeof(mreq.gsr_source));
926 
927  if (membership == UV_JOIN_GROUP)
928  optname = MCAST_JOIN_SOURCE_GROUP;
929  else if (membership == UV_LEAVE_GROUP)
930  optname = MCAST_LEAVE_SOURCE_GROUP;
931  else
932  return UV_EINVAL;
933 
934  if (setsockopt(handle->io_watcher.fd,
935  IPPROTO_IPV6,
936  optname,
937  &mreq,
938  sizeof(mreq))) {
939  return UV__ERR(errno);
940  }
941 
942  return 0;
943 }
944 #endif
945 
946 
948  int domain;
949  int err;
950  int extra_flags;
951  int fd;
952 
953  /* Use the lower 8 bits for the domain */
954  domain = flags & 0xFF;
955  if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC)
956  return UV_EINVAL;
957 
958  /* Use the higher bits for extra flags */
959  extra_flags = flags & ~0xFF;
960  if (extra_flags & ~UV_UDP_RECVMMSG)
961  return UV_EINVAL;
962 
963  if (domain != AF_UNSPEC) {
964  err = uv__socket(domain, SOCK_DGRAM, 0);
965  if (err < 0)
966  return err;
967  fd = err;
968  } else {
969  fd = -1;
970  }
971 
973  handle->alloc_cb = NULL;
974  handle->recv_cb = NULL;
975  handle->send_queue_size = 0;
976  handle->send_queue_count = 0;
977  uv__io_init(&handle->io_watcher, uv__udp_io, fd);
978  QUEUE_INIT(&handle->write_queue);
979  QUEUE_INIT(&handle->write_completed_queue);
980 
981  if (extra_flags & UV_UDP_RECVMMSG)
982  handle->flags |= UV_HANDLE_UDP_RECVMMSG;
983 
984  return 0;
985 }
986 
987 
989  return uv_udp_init_ex(loop, handle, AF_UNSPEC);
990 }
991 
992 
994  int err;
995 
996  /* Check for already active socket. */
997  if (handle->io_watcher.fd != -1)
998  return UV_EBUSY;
999 
1000  if (uv__fd_exists(handle->loop, sock))
1001  return UV_EEXIST;
1002 
1003  err = uv__nonblock(sock, 1);
1004  if (err)
1005  return err;
1006 
1007  err = uv__set_reuse(sock);
1008  if (err)
1009  return err;
1010 
1011  handle->io_watcher.fd = sock;
1013  handle->flags |= UV_HANDLE_UDP_CONNECTED;
1014 
1015  return 0;
1016 }
1017 
1018 
1020  const char* multicast_addr,
1021  const char* interface_addr,
1022  uv_membership membership) {
1023  int err;
1024  struct sockaddr_in addr4;
1025  struct sockaddr_in6 addr6;
1026 
1027  if (uv_ip4_addr(multicast_addr, 0, &addr4) == 0) {
1029  if (err)
1030  return err;
1031  return uv__udp_set_membership4(handle, &addr4, interface_addr, membership);
1032  } else if (uv_ip6_addr(multicast_addr, 0, &addr6) == 0) {
1034  if (err)
1035  return err;
1036  return uv__udp_set_membership6(handle, &addr6, interface_addr, membership);
1037  } else {
1038  return UV_EINVAL;
1039  }
1040 }
1041 
1042 
1044  const char* multicast_addr,
1045  const char* interface_addr,
1046  const char* source_addr,
1047  uv_membership membership) {
1048 #if !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__ANDROID__)
1049  int err;
1050  struct sockaddr_storage mcast_addr;
1051  struct sockaddr_in* mcast_addr4;
1052  struct sockaddr_in6* mcast_addr6;
1053  struct sockaddr_storage src_addr;
1054  struct sockaddr_in* src_addr4;
1055  struct sockaddr_in6* src_addr6;
1056 
1057  mcast_addr4 = (struct sockaddr_in*)&mcast_addr;
1058  mcast_addr6 = (struct sockaddr_in6*)&mcast_addr;
1059  src_addr4 = (struct sockaddr_in*)&src_addr;
1060  src_addr6 = (struct sockaddr_in6*)&src_addr;
1061 
1062  err = uv_ip4_addr(multicast_addr, 0, mcast_addr4);
1063  if (err) {
1064  err = uv_ip6_addr(multicast_addr, 0, mcast_addr6);
1065  if (err)
1066  return err;
1067  err = uv_ip6_addr(source_addr, 0, src_addr6);
1068  if (err)
1069  return err;
1071  mcast_addr6,
1072  interface_addr,
1073  src_addr6,
1074  membership);
1075  }
1076 
1077  err = uv_ip4_addr(source_addr, 0, src_addr4);
1078  if (err)
1079  return err;
1081  mcast_addr4,
1082  interface_addr,
1083  src_addr4,
1084  membership);
1085 #else
1086  return UV_ENOSYS;
1087 #endif
1088 }
1089 
1090 
1092  int option4,
1093  int option6,
1094  const void* val,
1095  socklen_t size) {
1096  int r;
1097 
1098  if (handle->flags & UV_HANDLE_IPV6)
1099  r = setsockopt(handle->io_watcher.fd,
1100  IPPROTO_IPV6,
1101  option6,
1102  val,
1103  size);
1104  else
1105  r = setsockopt(handle->io_watcher.fd,
1106  IPPROTO_IP,
1107  option4,
1108  val,
1109  size);
1110  if (r)
1111  return UV__ERR(errno);
1112 
1113  return 0;
1114 }
1115 
1117  int option4,
1118  int option6,
1119  int val) {
1120 #if defined(__sun) || defined(_AIX) || defined(__MVS__)
1121  char arg = val;
1122 #elif defined(__OpenBSD__)
1123  unsigned char arg = val;
1124 #else
1125  int arg = val;
1126 #endif
1127 
1128  if (val < 0 || val > 255)
1129  return UV_EINVAL;
1130 
1131  return uv__setsockopt(handle, option4, option6, &arg, sizeof(arg));
1132 }
1133 
1134 
1136  if (setsockopt(handle->io_watcher.fd,
1137  SOL_SOCKET,
1138  SO_BROADCAST,
1139  &on,
1140  sizeof(on))) {
1141  return UV__ERR(errno);
1142  }
1143 
1144  return 0;
1145 }
1146 
1147 
1149  if (ttl < 1 || ttl > 255)
1150  return UV_EINVAL;
1151 
1152 #if defined(__MVS__)
1153  if (!(handle->flags & UV_HANDLE_IPV6))
1154  return UV_ENOTSUP; /* zOS does not support setting ttl for IPv4 */
1155 #endif
1156 
1157 /*
1158  * On Solaris and derivatives such as SmartOS, the length of socket options
1159  * is sizeof(int) for IP_TTL and IPV6_UNICAST_HOPS,
1160  * so hardcode the size of these options on this platform,
1161  * and use the general uv__setsockopt_maybe_char call on other platforms.
1162  */
1163 #if defined(__sun) || defined(_AIX) || defined(__OpenBSD__) || \
1164  defined(__MVS__)
1165 
1166  return uv__setsockopt(handle,
1167  IP_TTL,
1168  IPV6_UNICAST_HOPS,
1169  &ttl,
1170  sizeof(ttl));
1171 
1172 #else /* !(defined(__sun) || defined(_AIX) || defined (__OpenBSD__) ||
1173  defined(__MVS__)) */
1174 
1176  IP_TTL,
1177  IPV6_UNICAST_HOPS,
1178  ttl);
1179 
1180 #endif /* defined(__sun) || defined(_AIX) || defined (__OpenBSD__) ||
1181  defined(__MVS__) */
1182 }
1183 
1184 
1186 /*
1187  * On Solaris and derivatives such as SmartOS, the length of socket options
1188  * is sizeof(int) for IPV6_MULTICAST_HOPS and sizeof(char) for
1189  * IP_MULTICAST_TTL, so hardcode the size of the option in the IPv6 case,
1190  * and use the general uv__setsockopt_maybe_char call otherwise.
1191  */
1192 #if defined(__sun) || defined(_AIX) || defined(__OpenBSD__) || \
1193  defined(__MVS__)
1194  if (handle->flags & UV_HANDLE_IPV6)
1195  return uv__setsockopt(handle,
1196  IP_MULTICAST_TTL,
1197  IPV6_MULTICAST_HOPS,
1198  &ttl,
1199  sizeof(ttl));
1200 #endif /* defined(__sun) || defined(_AIX) || defined(__OpenBSD__) || \
1201  defined(__MVS__) */
1202 
1204  IP_MULTICAST_TTL,
1205  IPV6_MULTICAST_HOPS,
1206  ttl);
1207 }
1208 
1209 
1211 /*
1212  * On Solaris and derivatives such as SmartOS, the length of socket options
1213  * is sizeof(int) for IPV6_MULTICAST_LOOP and sizeof(char) for
1214  * IP_MULTICAST_LOOP, so hardcode the size of the option in the IPv6 case,
1215  * and use the general uv__setsockopt_maybe_char call otherwise.
1216  */
1217 #if defined(__sun) || defined(_AIX) || defined(__OpenBSD__) || \
1218  defined(__MVS__)
1219  if (handle->flags & UV_HANDLE_IPV6)
1220  return uv__setsockopt(handle,
1221  IP_MULTICAST_LOOP,
1222  IPV6_MULTICAST_LOOP,
1223  &on,
1224  sizeof(on));
1225 #endif /* defined(__sun) || defined(_AIX) ||defined(__OpenBSD__) ||
1226  defined(__MVS__) */
1227 
1229  IP_MULTICAST_LOOP,
1230  IPV6_MULTICAST_LOOP,
1231  on);
1232 }
1233 
1234 int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr) {
1235  struct sockaddr_storage addr_st;
1236  struct sockaddr_in* addr4;
1237  struct sockaddr_in6* addr6;
1238 
1239  addr4 = (struct sockaddr_in*) &addr_st;
1240  addr6 = (struct sockaddr_in6*) &addr_st;
1241 
1242  if (!interface_addr) {
1243  memset(&addr_st, 0, sizeof addr_st);
1244  if (handle->flags & UV_HANDLE_IPV6) {
1245  addr_st.ss_family = AF_INET6;
1246  addr6->sin6_scope_id = 0;
1247  } else {
1248  addr_st.ss_family = AF_INET;
1249  addr4->sin_addr.s_addr = htonl(INADDR_ANY);
1250  }
1251  } else if (uv_ip4_addr(interface_addr, 0, addr4) == 0) {
1252  /* nothing, address was parsed */
1253  } else if (uv_ip6_addr(interface_addr, 0, addr6) == 0) {
1254  /* nothing, address was parsed */
1255  } else {
1256  return UV_EINVAL;
1257  }
1258 
1259  if (addr_st.ss_family == AF_INET) {
1260  if (setsockopt(handle->io_watcher.fd,
1261  IPPROTO_IP,
1262  IP_MULTICAST_IF,
1263  (void*) &addr4->sin_addr,
1264  sizeof(addr4->sin_addr)) == -1) {
1265  return UV__ERR(errno);
1266  }
1267  } else if (addr_st.ss_family == AF_INET6) {
1268  if (setsockopt(handle->io_watcher.fd,
1269  IPPROTO_IPV6,
1270  IPV6_MULTICAST_IF,
1271  &addr6->sin6_scope_id,
1272  sizeof(addr6->sin6_scope_id)) == -1) {
1273  return UV__ERR(errno);
1274  }
1275  } else {
1276  assert(0 && "unexpected address family");
1277  abort();
1278  }
1279 
1280  return 0;
1281 }
1282 
1284  struct sockaddr* name,
1285  int* namelen) {
1286 
1287  return uv__getsockpeername((const uv_handle_t*) handle,
1288  getpeername,
1289  name,
1290  namelen);
1291 }
1292 
1294  struct sockaddr* name,
1295  int* namelen) {
1296 
1297  return uv__getsockpeername((const uv_handle_t*) handle,
1298  getsockname,
1299  name,
1300  namelen);
1301 }
1302 
1303 
1307  int err;
1308 
1309  if (alloc_cb == NULL || recv_cb == NULL)
1310  return UV_EINVAL;
1311 
1312  if (uv__io_active(&handle->io_watcher, POLLIN))
1313  return UV_EALREADY; /* FIXME(bnoordhuis) Should be UV_EBUSY. */
1314 
1315  err = uv__udp_maybe_deferred_bind(handle, AF_INET, 0);
1316  if (err)
1317  return err;
1318 
1319  handle->alloc_cb = alloc_cb;
1320  handle->recv_cb = recv_cb;
1321 
1322  uv__io_start(handle->loop, &handle->io_watcher, POLLIN);
1324 
1325  return 0;
1326 }
1327 
1328 
1330  uv__io_stop(handle->loop, &handle->io_watcher, POLLIN);
1331 
1332  if (!uv__io_active(&handle->io_watcher, POLLOUT))
1334 
1335  handle->alloc_cb = NULL;
1336  handle->recv_cb = NULL;
1337 
1338  return 0;
1339 }
async_greeter_server_with_graceful_shutdown.loop
loop
Definition: async_greeter_server_with_graceful_shutdown.py:59
uv_udp_set_multicast_interface
int uv_udp_set_multicast_interface(uv_udp_t *handle, const char *interface_addr)
Definition: unix/udp.c:1234
uv_ip6_addr
UV_EXTERN int uv_ip6_addr(const char *ip, int port, struct sockaddr_in6 *addr)
Definition: uv-common.c:232
uv_inet_pton
UV_EXTERN int uv_inet_pton(int af, const char *src, void *dst)
Definition: inet.c:150
uv__setsockopt_maybe_char
static int uv__setsockopt_maybe_char(uv_udp_t *handle, int option4, int option6, int val)
Definition: unix/udp.c:1116
uv_udp_getpeername
int uv_udp_getpeername(const uv_udp_t *handle, struct sockaddr *name, int *namelen)
Definition: unix/udp.c:1283
uv_udp_open
int uv_udp_open(uv_udp_t *handle, uv_os_sock_t sock)
Definition: unix/udp.c:993
ARRAY_SIZE
#define ARRAY_SIZE(array)
Definition: bloaty.cc:101
uv__udp_is_connected
int uv__udp_is_connected(uv_udp_t *handle)
Definition: uv-common.c:363
AF_INET6
#define AF_INET6
Definition: ares_setup.h:208
UV_HANDLE_BOUND
@ UV_HANDLE_BOUND
Definition: uv-common.h:83
memset
return memset(p, 0, total)
uv_udp_set_source_membership
int uv_udp_set_source_membership(uv_udp_t *handle, const char *multicast_addr, const char *interface_addr, const char *source_addr, uv_membership membership)
Definition: unix/udp.c:1043
uv__socket
int uv__socket(int domain, int type, int protocol)
Definition: unix/core.c:424
uv__req_init
#define uv__req_init(loop, req, typ)
Definition: uv-common.h:312
UV_UDP_PARTIAL
@ UV_UDP_PARTIAL
Definition: uv.h:599
uv__udp_finish_close
void uv__udp_finish_close(uv_udp_t *handle)
Definition: unix/udp.c:96
uv__malloc
void * uv__malloc(size_t size)
Definition: uv-common.c:75
uv__setsockopt
static int uv__setsockopt(uv_udp_t *handle, int option4, int option6, const void *val, socklen_t size)
Definition: unix/udp.c:1091
MCAST_LEAVE_SOURCE_GROUP
#define MCAST_LEAVE_SOURCE_GROUP
Definition: winsock.h:62
UV_HANDLE_UDP_CONNECTED
@ UV_HANDLE_UDP_CONNECTED
Definition: uv-common.h:106
string.h
UV__UDP_DGRAM_MAXSIZE
#define UV__UDP_DGRAM_MAXSIZE
Definition: unix/udp.c:35
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
UV_UDP_IPV6ONLY
@ UV_UDP_IPV6ONLY
Definition: uv.h:594
uv_connect_s::handle
uv_stream_t * handle
Definition: uv.h:583
error_ref_leak.err
err
Definition: error_ref_leak.py:35
QUEUE_HEAD
#define QUEUE_HEAD(q)
Definition: queue.h:42
uv_udp_set_ttl
int uv_udp_set_ttl(uv_udp_t *handle, int ttl)
Definition: unix/udp.c:1148
alloc_cb
static void alloc_cb(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf)
Definition: benchmark-pound.c:84
send_cb
static void send_cb(uv_udp_send_t *req, int status)
Definition: benchmark-udp-pummel.c:72
uv__udp_recv_stop
int uv__udp_recv_stop(uv_udp_t *handle)
Definition: unix/udp.c:1329
setup.name
name
Definition: setup.py:542
xds_manager.p
p
Definition: xds_manager.py:60
uv__io_init
void uv__io_init(uv__io_t *w, uv__io_cb cb, int fd)
Definition: unix/core.c:853
QUEUE_DATA
#define QUEUE_DATA(ptr, type, field)
Definition: queue.h:30
container_of
#define container_of(ptr, type, member)
Definition: uv-common.h:57
setup.k
k
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:42
UV_HANDLE_UDP_RECVMMSG
@ UV_HANDLE_UDP_RECVMMSG
Definition: uv-common.h:107
uv__udp_set_source_membership4
static int uv__udp_set_source_membership4(uv_udp_t *handle, const struct sockaddr_in *multicast_addr, const char *interface_addr, const struct sockaddr_in *source_addr, uv_membership membership)
Definition: unix/udp.c:854
uv_alloc_cb
void(* uv_alloc_cb)(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf)
Definition: uv.h:306
uv_os_sock_t
int uv_os_sock_t
Definition: unix.h:127
iov
static uv_buf_t iov
Definition: libuv/docs/code/uvcat/main.c:15
uv_ip4_addr
UV_EXTERN int uv_ip4_addr(const char *ip, int port, struct sockaddr_in *addr)
Definition: uv-common.c:221
QUEUE_INIT
#define QUEUE_INIT(q)
Definition: queue.h:45
uv__udp_recvmsg
static void uv__udp_recvmsg(uv_udp_t *handle)
Definition: unix/udp.c:239
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
in
const char * in
Definition: third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc:391
ssize_t
intptr_t ssize_t
Definition: win.h:27
uv__udp_bind
int uv__udp_bind(uv_udp_t *handle, const struct sockaddr *addr, unsigned int addrlen, unsigned int flags)
Definition: unix/udp.c:503
UV_HANDLE_UDP_PROCESSING
@ UV_HANDLE_UDP_PROCESSING
Definition: uv-common.h:105
sockaddr_in6
Definition: ares_ipv6.h:25
queue
Definition: sync_test.cc:39
UV_UDP_RECVMMSG
@ UV_UDP_RECVMMSG
Definition: uv.h:618
uv_once
UV_EXTERN void uv_once(uv_once_t *guard, void(*callback)(void))
Definition: libuv/src/unix/thread.c:418
uv__udp_disconnect
int uv__udp_disconnect(uv_udp_t *handle)
Definition: unix/udp.c:628
uv_udp_set_broadcast
int uv_udp_set_broadcast(uv_udp_t *handle, int on)
Definition: unix/udp.c:1135
uv__fd_exists
int uv__fd_exists(uv_loop_t *loop, int fd)
Definition: unix/core.c:953
req
static uv_connect_t req
Definition: test-connection-fail.c:30
uv__io_active
int uv__io_active(const uv__io_t *w, unsigned int events)
Definition: unix/core.c:946
UV_UDP_MMSG_CHUNK
@ UV_UDP_MMSG_CHUNK
Definition: uv.h:613
uv__io_start
void uv__io_start(uv_loop_t *loop, uv__io_t *w, unsigned int events)
Definition: unix/core.c:870
uv_udp_s
Definition: uv.h:629
uv__getsockpeername
int uv__getsockpeername(const uv_handle_t *handle, uv__peersockfunc func, struct sockaddr *name, int *namelen)
Definition: unix/core.c:1485
uv__set_reuse
static int uv__set_reuse(int fd)
Definition: unix/udp.c:475
addr6
static struct sockaddr_in6 addr6
Definition: test-getnameinfo.c:34
arg
Definition: cmdline.cc:40
uv__udp_set_source_membership6
static int uv__udp_set_source_membership6(uv_udp_t *handle, const struct sockaddr_in6 *multicast_addr, const char *interface_addr, const struct sockaddr_in6 *source_addr, uv_membership membership)
Definition: unix/udp.c:899
uv_once_t
pthread_once_t uv_once_t
Definition: unix.h:133
uv__udp_connect
int uv__udp_connect(uv_udp_t *handle, const struct sockaddr *addr, unsigned int addrlen)
Definition: unix/udp.c:605
uv_udp_send_cb
void(* uv_udp_send_cb)(uv_udp_send_t *req, int status)
Definition: uv.h:621
uv__free
void uv__free(void *ptr)
Definition: uv-common.c:81
UV__ERR
#define UV__ERR(x)
Definition: errno.h:29
uv_membership
uv_membership
Definition: uv.h:379
uv__udp_set_membership6
static int uv__udp_set_membership6(uv_udp_t *handle, const struct sockaddr_in6 *multicast_addr, const char *interface_addr, uv_membership membership)
Definition: unix/udp.c:806
recv_cb
static void recv_cb(uv_udp_t *handle, ssize_t nread, const uv_buf_t *buf, const struct sockaddr *addr, unsigned flags)
Definition: benchmark-udp-pummel.c:109
uv_udp_recv_cb
void(* uv_udp_recv_cb)(uv_udp_t *handle, ssize_t nread, const uv_buf_t *buf, const struct sockaddr *addr, unsigned flags)
Definition: uv.h:622
uv__udp_send
int uv__udp_send(uv_udp_send_t *req, uv_udp_t *handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr *addr, unsigned int addrlen, uv_udp_send_cb send_cb)
Definition: unix/udp.c:649
UV_HANDLE_IPV6
@ UV_HANDLE_IPV6
Definition: uv-common.h:94
QUEUE_REMOVE
#define QUEUE_REMOVE(q)
Definition: queue.h:101
uv_udp_set_membership
int uv_udp_set_membership(uv_udp_t *handle, const char *multicast_addr, const char *interface_addr, uv_membership membership)
Definition: unix/udp.c:1019
uv__handle_init
#define uv__handle_init(loop_, h, type_)
Definition: uv-common.h:284
QUEUE_EMPTY
#define QUEUE_EMPTY(q)
Definition: queue.h:39
uv_buf_t::base
char * base
Definition: unix.h:122
UV_JOIN_GROUP
@ UV_JOIN_GROUP
Definition: uv.h:381
uv_udp_send_s
Definition: uv.h:645
uv__udp_set_membership4
static int uv__udp_set_membership4(uv_udp_t *handle, const struct sockaddr_in *multicast_addr, const char *interface_addr, uv_membership membership)
Definition: unix/udp.c:759
uv__udp_close
void uv__udp_close(uv_udp_t *handle)
Definition: unix/udp.c:85
addr4
static struct sockaddr_in addr4
Definition: test-getnameinfo.c:33
uv__recvmmsg
int uv__recvmmsg(int fd, struct uv__mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout)
Definition: freebsd.c:305
bufs
static uv_buf_t bufs[5]
Definition: benchmark-udp-pummel.c:51
uv.h
IPV6_V6ONLY
#define IPV6_V6ONLY
Definition: winsock.h:46
uv__nonblock
#define uv__nonblock
Definition: third_party/libuv/src/unix/internal.h:174
uv_buf_t
Definition: unix.h:121
iovec
Definition: gsec.h:33
uv__udp_io
static void uv__udp_io(uv_loop_t *loop, uv__io_t *w, unsigned int revents)
Definition: unix/udp.c:168
once
absl::once_flag once
Definition: bm_opencensus_plugin.cc:38
internal.h
uv__io_feed
void uv__io_feed(uv_loop_t *loop, uv__io_t *w)
Definition: unix/core.c:940
MCAST_JOIN_SOURCE_GROUP
#define MCAST_JOIN_SOURCE_GROUP
Definition: winsock.h:58
uv__udp_recv_start
int uv__udp_recv_start(uv_udp_t *handle, uv_alloc_cb alloc_cb, uv_udp_recv_cb recv_cb)
Definition: unix/udp.c:1304
absl::flags_internal
Definition: abseil-cpp/absl/flags/commandlineflag.h:40
uv__udp_try_send
int uv__udp_try_send(uv_udp_t *handle, const uv_buf_t bufs[], unsigned int nbufs, const struct sockaddr *addr, unsigned int addrlen)
Definition: unix/udp.c:715
count
int * count
Definition: bloaty/third_party/googletest/googlemock/test/gmock_stress_test.cc:96
UV_UDP_REUSEADDR
@ UV_UDP_REUSEADDR
Definition: uv.h:608
uv_udp_init_ex
int uv_udp_init_ex(uv_loop_t *loop, uv_udp_t *handle, unsigned int flags)
Definition: unix/udp.c:947
uv__io_close
void uv__io_close(uv_loop_t *loop, uv__io_t *w)
Definition: unix/core.c:930
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
fix_build_deps.r
r
Definition: fix_build_deps.py:491
UV_LEAVE_GROUP
@ UV_LEAVE_GROUP
Definition: uv.h:380
uv_buf_init
UV_EXTERN uv_buf_t uv_buf_init(char *base, unsigned int len)
Definition: uv-common.c:157
uv__udp_maybe_deferred_bind
static int uv__udp_maybe_deferred_bind(uv_udp_t *handle, int domain, unsigned int flags)
Definition: unix/udp.c:564
uv__io_stop
void uv__io_stop(uv_loop_t *loop, uv__io_t *w, unsigned int events)
Definition: unix/core.c:898
absl::str_format_internal::LengthMod::q
@ q
sockaddr_in6::sin6_addr
struct ares_in6_addr sin6_addr
Definition: ares_ipv6.h:30
UV_ONCE_INIT
#define UV_ONCE_INIT
Definition: unix.h:131
handle
static csh handle
Definition: test_arm_regression.c:16
uv_handle_s
Definition: uv.h:441
uv_udp_getsockname
int uv_udp_getsockname(const uv_udp_t *handle, struct sockaddr *name, int *namelen)
Definition: unix/udp.c:1293
uv_loop_s
Definition: uv.h:1767
flags
uint32_t flags
Definition: retry_filter.cc:632
uv__count_bufs
size_t uv__count_bufs(const uv_buf_t bufs[], unsigned int nbufs)
Definition: uv-common.c:543
uv__handle_start
#define uv__handle_start(h)
Definition: uv-common.h:241
uv__udp_sendmsg
static void uv__udp_sendmsg(uv_udp_t *handle)
Definition: unix/udp.c:401
size
voidpf void uLong size
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
uv__udp_run_completed
static void uv__udp_run_completed(uv_udp_t *handle)
Definition: unix/udp.c:124
uv__io_s
Definition: unix.h:94
absl::str_format_internal::LengthMod::h
@ h
uv__handle_stop
#define uv__handle_stop(h)
Definition: uv-common.h:249
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10
QUEUE_INSERT_TAIL
#define QUEUE_INSERT_TAIL(h, q)
Definition: queue.h:92
uv_udp_init
int uv_udp_init(uv_loop_t *loop, uv_udp_t *handle)
Definition: unix/udp.c:988
uv_udp_set_multicast_loop
int uv_udp_set_multicast_loop(uv_udp_t *handle, int on)
Definition: unix/udp.c:1210
errno.h
sockaddr_in6::sin6_scope_id
unsigned int sin6_scope_id
Definition: ares_ipv6.h:31
uv__req_unregister
#define uv__req_unregister(loop, req)
Definition: uv-common.h:213
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
uv_udp_set_multicast_ttl
int uv_udp_set_multicast_ttl(uv_udp_t *handle, int ttl)
Definition: unix/udp.c:1185
QUEUE
void * QUEUE[2]
Definition: queue.h:21
uv__sendmmsg
int uv__sendmmsg(int fd, struct uv__mmsghdr *mmsg, unsigned int vlen, unsigned int flags)
Definition: freebsd.c:293
uv__close
int uv__close(int fd)
Definition: unix/core.c:557


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