win/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 <assert.h>
23 #include <stdlib.h>
24 
25 #include "uv.h"
26 #include "internal.h"
27 #include "handle-inl.h"
28 #include "stream-inl.h"
29 #include "req-inl.h"
30 
31 
32 /*
33  * Threshold of active udp streams for which to preallocate udp read buffers.
34  */
35 const unsigned int uv_active_udp_streams_threshold = 0;
36 
37 /* A zero-size buffer for use by uv_udp_read */
38 static char uv_zero_[] = "";
40  struct sockaddr* name,
41  int* namelen) {
42 
43  return uv__getsockpeername((const uv_handle_t*) handle,
44  getpeername,
45  name,
46  namelen,
47  0);
48 }
49 
50 
52  struct sockaddr* name,
53  int* namelen) {
54 
55  return uv__getsockpeername((const uv_handle_t*) handle,
56  getsockname,
57  name,
58  namelen,
59  0);
60 }
61 
62 
64  int family) {
65  DWORD yes = 1;
66  WSAPROTOCOL_INFOW info;
67  int opt_len;
68 
69  if (handle->socket != INVALID_SOCKET)
70  return UV_EBUSY;
71 
72  /* Set the socket to nonblocking mode */
73  if (ioctlsocket(socket, FIONBIO, &yes) == SOCKET_ERROR) {
74  return WSAGetLastError();
75  }
76 
77  /* Make the socket non-inheritable */
78  if (!SetHandleInformation((HANDLE)socket, HANDLE_FLAG_INHERIT, 0)) {
79  return GetLastError();
80  }
81 
82  /* Associate it with the I/O completion port. Use uv_handle_t pointer as
83  * completion key. */
84  if (CreateIoCompletionPort((HANDLE)socket,
85  loop->iocp,
86  (ULONG_PTR)socket,
87  0) == NULL) {
88  return GetLastError();
89  }
90 
91  /* All known Windows that support SetFileCompletionNotificationModes have a
92  * bug that makes it impossible to use this function in conjunction with
93  * datagram sockets. We can work around that but only if the user is using
94  * the default UDP driver (AFD) and has no other. LSPs stacked on top. Here
95  * we check whether that is the case. */
96  opt_len = (int) sizeof info;
97  if (getsockopt(
98  socket, SOL_SOCKET, SO_PROTOCOL_INFOW, (char*) &info, &opt_len) ==
99  SOCKET_ERROR) {
100  return GetLastError();
101  }
102 
103  if (info.ProtocolChain.ChainLen == 1) {
104  if (SetFileCompletionNotificationModes(
105  (HANDLE) socket,
109  handle->func_wsarecv = uv_wsarecv_workaround;
110  handle->func_wsarecvfrom = uv_wsarecvfrom_workaround;
111  } else if (GetLastError() != ERROR_INVALID_FUNCTION) {
112  return GetLastError();
113  }
114  }
115 
116  handle->socket = socket;
117 
118  if (family == AF_INET6) {
119  handle->flags |= UV_HANDLE_IPV6;
120  } else {
121  assert(!(handle->flags & UV_HANDLE_IPV6));
122  }
123 
124  return 0;
125 }
126 
127 
129  int domain;
130 
131  /* Use the lower 8 bits for the domain */
132  domain = flags & 0xFF;
133  if (domain != AF_INET && domain != AF_INET6 && domain != AF_UNSPEC)
134  return UV_EINVAL;
135 
136  if (flags & ~0xFF)
137  return UV_EINVAL;
138 
139  uv__handle_init(loop, (uv_handle_t*) handle, UV_UDP);
140  handle->socket = INVALID_SOCKET;
141  handle->reqs_pending = 0;
142  handle->activecnt = 0;
143  handle->func_wsarecv = WSARecv;
144  handle->func_wsarecvfrom = WSARecvFrom;
145  handle->send_queue_size = 0;
146  handle->send_queue_count = 0;
147  UV_REQ_INIT(&handle->recv_req, UV_UDP_RECV);
148  handle->recv_req.data = handle;
149 
150  /* If anything fails beyond this point we need to remove the handle from
151  * the handle queue, since it was added by uv__handle_init.
152  */
153 
154  if (domain != AF_UNSPEC) {
155  SOCKET sock;
156  DWORD err;
157 
158  sock = socket(domain, SOCK_DGRAM, 0);
159  if (sock == INVALID_SOCKET) {
160  err = WSAGetLastError();
161  QUEUE_REMOVE(&handle->handle_queue);
162  return uv_translate_sys_error(err);
163  }
164 
165  err = uv_udp_set_socket(handle->loop, handle, sock, domain);
166  if (err) {
167  closesocket(sock);
168  QUEUE_REMOVE(&handle->handle_queue);
169  return uv_translate_sys_error(err);
170  }
171  }
172 
173  return 0;
174 }
175 
176 
178  return uv_udp_init_ex(loop, handle, AF_UNSPEC);
179 }
180 
181 
184  closesocket(handle->socket);
185  handle->socket = INVALID_SOCKET;
186 
188 
189  if (handle->reqs_pending == 0) {
191  }
192 }
193 
194 
196  if (handle->flags & UV_HANDLE_CLOSING &&
197  handle->reqs_pending == 0) {
198  assert(!(handle->flags & UV_HANDLE_CLOSED));
200  }
201 }
202 
203 
205  const struct sockaddr* addr,
206  unsigned int addrlen,
207  unsigned int flags) {
208  int r;
209  int err;
210  DWORD no = 0;
211 
212  if (handle->flags & UV_HANDLE_BOUND)
213  return 0;
214 
215  if ((flags & UV_UDP_IPV6ONLY) && addr->sa_family != AF_INET6) {
216  /* UV_UDP_IPV6ONLY is supported only for IPV6 sockets */
217  return ERROR_INVALID_PARAMETER;
218  }
219 
220  if (handle->socket == INVALID_SOCKET) {
221  SOCKET sock = socket(addr->sa_family, SOCK_DGRAM, 0);
222  if (sock == INVALID_SOCKET) {
223  return WSAGetLastError();
224  }
225 
226  err = uv_udp_set_socket(handle->loop, handle, sock, addr->sa_family);
227  if (err) {
228  closesocket(sock);
229  return err;
230  }
231  }
232 
233  if (flags & UV_UDP_REUSEADDR) {
234  DWORD yes = 1;
235  /* Set SO_REUSEADDR on the socket. */
236  if (setsockopt(handle->socket,
237  SOL_SOCKET,
238  SO_REUSEADDR,
239  (char*) &yes,
240  sizeof yes) == SOCKET_ERROR) {
241  err = WSAGetLastError();
242  return err;
243  }
244  }
245 
246  if (addr->sa_family == AF_INET6)
247  handle->flags |= UV_HANDLE_IPV6;
248 
249  if (addr->sa_family == AF_INET6 && !(flags & UV_UDP_IPV6ONLY)) {
250  /* On windows IPV6ONLY is on by default. If the user doesn't specify it
251  * libuv turns it off. */
252 
253  /* TODO: how to handle errors? This may fail if there is no ipv4 stack
254  * available, or when run on XP/2003 which have no support for dualstack
255  * sockets. For now we're silently ignoring the error. */
256  setsockopt(handle->socket,
257  IPPROTO_IPV6,
258  IPV6_V6ONLY,
259  (char*) &no,
260  sizeof no);
261  }
262 
263  r = bind(handle->socket, addr, addrlen);
264  if (r == SOCKET_ERROR) {
265  return WSAGetLastError();
266  }
267 
268  handle->flags |= UV_HANDLE_BOUND;
269 
270  return 0;
271 }
272 
273 
275  uv_req_t* req;
276  uv_buf_t buf;
277  DWORD bytes, flags;
278  int result;
279 
280  assert(handle->flags & UV_HANDLE_READING);
281  assert(!(handle->flags & UV_HANDLE_READ_PENDING));
282 
283  req = &handle->recv_req;
284  memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped));
285 
286  /*
287  * Preallocate a read buffer if the number of active streams is below
288  * the threshold.
289  */
290  if (loop->active_udp_streams < uv_active_udp_streams_threshold) {
291  handle->flags &= ~UV_HANDLE_ZERO_READ;
292 
293  handle->recv_buffer = uv_buf_init(NULL, 0);
294  handle->alloc_cb((uv_handle_t*) handle, 65536, &handle->recv_buffer);
295  if (handle->recv_buffer.base == NULL || handle->recv_buffer.len == 0) {
296  handle->recv_cb(handle, UV_ENOBUFS, &handle->recv_buffer, NULL, 0);
297  return;
298  }
299  assert(handle->recv_buffer.base != NULL);
300 
301  buf = handle->recv_buffer;
302  memset(&handle->recv_from, 0, sizeof handle->recv_from);
303  handle->recv_from_len = sizeof handle->recv_from;
304  flags = 0;
305 
306  result = handle->func_wsarecvfrom(handle->socket,
307  (WSABUF*) &buf,
308  1,
309  &bytes,
310  &flags,
311  (struct sockaddr*) &handle->recv_from,
312  &handle->recv_from_len,
313  &req->u.io.overlapped,
314  NULL);
315 
316  if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) {
317  /* Process the req without IOCP. */
318  handle->flags |= UV_HANDLE_READ_PENDING;
319  req->u.io.overlapped.InternalHigh = bytes;
320  handle->reqs_pending++;
322  } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) {
323  /* The req will be processed with IOCP. */
324  handle->flags |= UV_HANDLE_READ_PENDING;
325  handle->reqs_pending++;
326  } else {
327  /* Make this req pending reporting an error. */
328  SET_REQ_ERROR(req, WSAGetLastError());
330  handle->reqs_pending++;
331  }
332 
333  } else {
334  handle->flags |= UV_HANDLE_ZERO_READ;
335 
336  buf.base = (char*) uv_zero_;
337  buf.len = 0;
338  flags = MSG_PEEK;
339 
340  result = handle->func_wsarecv(handle->socket,
341  (WSABUF*) &buf,
342  1,
343  &bytes,
344  &flags,
345  &req->u.io.overlapped,
346  NULL);
347 
348  if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) {
349  /* Process the req without IOCP. */
350  handle->flags |= UV_HANDLE_READ_PENDING;
351  req->u.io.overlapped.InternalHigh = bytes;
352  handle->reqs_pending++;
354  } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) {
355  /* The req will be processed with IOCP. */
356  handle->flags |= UV_HANDLE_READ_PENDING;
357  handle->reqs_pending++;
358  } else {
359  /* Make this req pending reporting an error. */
360  SET_REQ_ERROR(req, WSAGetLastError());
362  handle->reqs_pending++;
363  }
364  }
365 }
366 
367 
370  uv_loop_t* loop = handle->loop;
371  int err;
372 
373  if (handle->flags & UV_HANDLE_READING) {
374  return UV_EALREADY;
375  }
376 
378  (const struct sockaddr*) &uv_addr_ip4_any_,
379  sizeof(uv_addr_ip4_any_),
380  0);
381  if (err)
382  return uv_translate_sys_error(err);
383 
384  handle->flags |= UV_HANDLE_READING;
386  loop->active_udp_streams++;
387 
388  handle->recv_cb = recv_cb;
389  handle->alloc_cb = alloc_cb;
390 
391  /* If reading was stopped and then started again, there could still be a recv
392  * request pending. */
393  if (!(handle->flags & UV_HANDLE_READ_PENDING))
395 
396  return 0;
397 }
398 
399 
401  if (handle->flags & UV_HANDLE_READING) {
402  handle->flags &= ~UV_HANDLE_READING;
403  handle->loop->active_udp_streams--;
405  }
406 
407  return 0;
408 }
409 
410 
412  uv_udp_t* handle,
413  const uv_buf_t bufs[],
414  unsigned int nbufs,
415  const struct sockaddr* addr,
416  unsigned int addrlen,
417  uv_udp_send_cb cb) {
418  uv_loop_t* loop = handle->loop;
419  DWORD result, bytes;
420 
421  UV_REQ_INIT(req, UV_UDP_SEND);
422  req->handle = handle;
423  req->cb = cb;
424  memset(&req->u.io.overlapped, 0, sizeof(req->u.io.overlapped));
425 
426  result = WSASendTo(handle->socket,
427  (WSABUF*)bufs,
428  nbufs,
429  &bytes,
430  0,
431  addr,
432  addrlen,
433  &req->u.io.overlapped,
434  NULL);
435 
436  if (UV_SUCCEEDED_WITHOUT_IOCP(result == 0)) {
437  /* Request completed immediately. */
438  req->u.io.queued_bytes = 0;
439  handle->reqs_pending++;
440  handle->send_queue_size += req->u.io.queued_bytes;
441  handle->send_queue_count++;
444  } else if (UV_SUCCEEDED_WITH_IOCP(result == 0)) {
445  /* Request queued by the kernel. */
446  req->u.io.queued_bytes = uv__count_bufs(bufs, nbufs);
447  handle->reqs_pending++;
448  handle->send_queue_size += req->u.io.queued_bytes;
449  handle->send_queue_count++;
451  } else {
452  /* Send failed due to an error. */
453  return WSAGetLastError();
454  }
455 
456  return 0;
457 }
458 
459 
461  uv_req_t* req) {
462  uv_buf_t buf;
463  int partial;
464 
465  assert(handle->type == UV_UDP);
466 
467  handle->flags &= ~UV_HANDLE_READ_PENDING;
468 
469  if (!REQ_SUCCESS(req)) {
470  DWORD err = GET_REQ_SOCK_ERROR(req);
471  if (err == WSAEMSGSIZE) {
472  /* Not a real error, it just indicates that the received packet was
473  * bigger than the receive buffer. */
474  } else if (err == WSAECONNRESET || err == WSAENETRESET) {
475  /* A previous sendto operation failed; ignore this error. If zero-reading
476  * we need to call WSARecv/WSARecvFrom _without_ the. MSG_PEEK flag to
477  * clear out the error queue. For nonzero reads, immediately queue a new
478  * receive. */
479  if (!(handle->flags & UV_HANDLE_ZERO_READ)) {
480  goto done;
481  }
482  } else {
483  /* A real error occurred. Report the error to the user only if we're
484  * currently reading. */
485  if (handle->flags & UV_HANDLE_READING) {
487  buf = (handle->flags & UV_HANDLE_ZERO_READ) ?
488  uv_buf_init(NULL, 0) : handle->recv_buffer;
489  handle->recv_cb(handle, uv_translate_sys_error(err), &buf, NULL, 0);
490  }
491  goto done;
492  }
493  }
494 
495  if (!(handle->flags & UV_HANDLE_ZERO_READ)) {
496  /* Successful read */
497  partial = !REQ_SUCCESS(req);
498  handle->recv_cb(handle,
499  req->u.io.overlapped.InternalHigh,
500  &handle->recv_buffer,
501  (const struct sockaddr*) &handle->recv_from,
502  partial ? UV_UDP_PARTIAL : 0);
503  } else if (handle->flags & UV_HANDLE_READING) {
504  DWORD bytes, err, flags;
505  struct sockaddr_storage from;
506  int from_len;
507 
508  /* Do a nonblocking receive.
509  * TODO: try to read multiple datagrams at once. FIONREAD maybe? */
510  buf = uv_buf_init(NULL, 0);
511  handle->alloc_cb((uv_handle_t*) handle, 65536, &buf);
512  if (buf.base == NULL || buf.len == 0) {
513  handle->recv_cb(handle, UV_ENOBUFS, &buf, NULL, 0);
514  goto done;
515  }
516  assert(buf.base != NULL);
517 
518  memset(&from, 0, sizeof from);
519  from_len = sizeof from;
520 
521  flags = 0;
522 
523  if (WSARecvFrom(handle->socket,
524  (WSABUF*)&buf,
525  1,
526  &bytes,
527  &flags,
528  (struct sockaddr*) &from,
529  &from_len,
530  NULL,
531  NULL) != SOCKET_ERROR) {
532 
533  /* Message received */
534  handle->recv_cb(handle, bytes, &buf, (const struct sockaddr*) &from, 0);
535  } else {
536  err = WSAGetLastError();
537  if (err == WSAEMSGSIZE) {
538  /* Message truncated */
539  handle->recv_cb(handle,
540  bytes,
541  &buf,
542  (const struct sockaddr*) &from,
544  } else if (err == WSAEWOULDBLOCK) {
545  /* Kernel buffer empty */
546  handle->recv_cb(handle, 0, &buf, NULL, 0);
547  } else if (err == WSAECONNRESET || err == WSAENETRESET) {
548  /* WSAECONNRESET/WSANETRESET is ignored because this just indicates
549  * that a previous sendto operation failed.
550  */
551  handle->recv_cb(handle, 0, &buf, NULL, 0);
552  } else {
553  /* Any other error that we want to report back to the user. */
555  handle->recv_cb(handle, uv_translate_sys_error(err), &buf, NULL, 0);
556  }
557  }
558  }
559 
560 done:
561  /* Post another read if still reading and not closing. */
562  if ((handle->flags & UV_HANDLE_READING) &&
563  !(handle->flags & UV_HANDLE_READ_PENDING)) {
565  }
566 
568 }
569 
570 
572  uv_udp_send_t* req) {
573  int err;
574 
575  assert(handle->type == UV_UDP);
576 
577  assert(handle->send_queue_size >= req->u.io.queued_bytes);
578  assert(handle->send_queue_count >= 1);
579  handle->send_queue_size -= req->u.io.queued_bytes;
580  handle->send_queue_count--;
581 
583 
584  if (req->cb) {
585  err = 0;
586  if (!REQ_SUCCESS(req)) {
588  }
590  }
591 
593 }
594 
595 
597  const struct sockaddr_in* multicast_addr,
598  const char* interface_addr,
599  uv_membership membership) {
600  int err;
601  int optname;
602  struct ip_mreq mreq;
603 
604  if (handle->flags & UV_HANDLE_IPV6)
605  return UV_EINVAL;
606 
607  /* If the socket is unbound, bind to inaddr_any. */
609  (const struct sockaddr*) &uv_addr_ip4_any_,
610  sizeof(uv_addr_ip4_any_),
612  if (err)
613  return uv_translate_sys_error(err);
614 
615  memset(&mreq, 0, sizeof mreq);
616 
617  if (interface_addr) {
618  err = uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr);
619  if (err)
620  return err;
621  } else {
622  mreq.imr_interface.s_addr = htonl(INADDR_ANY);
623  }
624 
625  mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr;
626 
627  switch (membership) {
628  case UV_JOIN_GROUP:
629  optname = IP_ADD_MEMBERSHIP;
630  break;
631  case UV_LEAVE_GROUP:
632  optname = IP_DROP_MEMBERSHIP;
633  break;
634  default:
635  return UV_EINVAL;
636  }
637 
638  if (setsockopt(handle->socket,
639  IPPROTO_IP,
640  optname,
641  (char*) &mreq,
642  sizeof mreq) == SOCKET_ERROR) {
643  return uv_translate_sys_error(WSAGetLastError());
644  }
645 
646  return 0;
647 }
648 
649 
651  const struct sockaddr_in6* multicast_addr,
652  const char* interface_addr,
653  uv_membership membership) {
654  int optname;
655  int err;
656  struct ipv6_mreq mreq;
657  struct sockaddr_in6 addr6;
658 
659  if ((handle->flags & UV_HANDLE_BOUND) && !(handle->flags & UV_HANDLE_IPV6))
660  return UV_EINVAL;
661 
663  (const struct sockaddr*) &uv_addr_ip6_any_,
664  sizeof(uv_addr_ip6_any_),
666 
667  if (err)
668  return uv_translate_sys_error(err);
669 
670  memset(&mreq, 0, sizeof(mreq));
671 
672  if (interface_addr) {
673  if (uv_ip6_addr(interface_addr, 0, &addr6))
674  return UV_EINVAL;
675  mreq.ipv6mr_interface = addr6.sin6_scope_id;
676  } else {
677  mreq.ipv6mr_interface = 0;
678  }
679 
680  mreq.ipv6mr_multiaddr = multicast_addr->sin6_addr;
681 
682  switch (membership) {
683  case UV_JOIN_GROUP:
684  optname = IPV6_ADD_MEMBERSHIP;
685  break;
686  case UV_LEAVE_GROUP:
687  optname = IPV6_DROP_MEMBERSHIP;
688  break;
689  default:
690  return UV_EINVAL;
691  }
692 
693  if (setsockopt(handle->socket,
694  IPPROTO_IPV6,
695  optname,
696  (char*) &mreq,
697  sizeof mreq) == SOCKET_ERROR) {
698  return uv_translate_sys_error(WSAGetLastError());
699  }
700 
701  return 0;
702 }
703 
704 
706  const struct sockaddr_in* multicast_addr,
707  const char* interface_addr,
708  const struct sockaddr_in* source_addr,
709  uv_membership membership) {
710  struct ip_mreq_source mreq;
711  int optname;
712  int err;
713 
714  if (handle->flags & UV_HANDLE_IPV6)
715  return UV_EINVAL;
716 
717  /* If the socket is unbound, bind to inaddr_any. */
719  (const struct sockaddr*) &uv_addr_ip4_any_,
720  sizeof(uv_addr_ip4_any_),
722  if (err)
723  return uv_translate_sys_error(err);
724 
725  memset(&mreq, 0, sizeof(mreq));
726 
727  if (interface_addr != NULL) {
728  err = uv_inet_pton(AF_INET, interface_addr, &mreq.imr_interface.s_addr);
729  if (err)
730  return err;
731  } else {
732  mreq.imr_interface.s_addr = htonl(INADDR_ANY);
733  }
734 
735  mreq.imr_multiaddr.s_addr = multicast_addr->sin_addr.s_addr;
736  mreq.imr_sourceaddr.s_addr = source_addr->sin_addr.s_addr;
737 
738  if (membership == UV_JOIN_GROUP)
739  optname = IP_ADD_SOURCE_MEMBERSHIP;
740  else if (membership == UV_LEAVE_GROUP)
741  optname = IP_DROP_SOURCE_MEMBERSHIP;
742  else
743  return UV_EINVAL;
744 
745  if (setsockopt(handle->socket,
746  IPPROTO_IP,
747  optname,
748  (char*) &mreq,
749  sizeof(mreq)) == SOCKET_ERROR) {
750  return uv_translate_sys_error(WSAGetLastError());
751  }
752 
753  return 0;
754 }
755 
756 
758  const struct sockaddr_in6* multicast_addr,
759  const char* interface_addr,
760  const struct sockaddr_in6* source_addr,
761  uv_membership membership) {
762  struct group_source_req mreq;
763  struct sockaddr_in6 addr6;
764  int optname;
765  int err;
766 
767  if ((handle->flags & UV_HANDLE_BOUND) && !(handle->flags & UV_HANDLE_IPV6))
768  return UV_EINVAL;
769 
771  (const struct sockaddr*) &uv_addr_ip6_any_,
772  sizeof(uv_addr_ip6_any_),
774 
775  if (err)
776  return uv_translate_sys_error(err);
777 
778  memset(&mreq, 0, sizeof(mreq));
779 
780  if (interface_addr != NULL) {
781  err = uv_ip6_addr(interface_addr, 0, &addr6);
782  if (err)
783  return err;
784  mreq.gsr_interface = addr6.sin6_scope_id;
785  } else {
786  mreq.gsr_interface = 0;
787  }
788 
789  memcpy(&mreq.gsr_group, multicast_addr, sizeof(mreq.gsr_group));
790  memcpy(&mreq.gsr_source, source_addr, sizeof(mreq.gsr_source));
791 
792  if (membership == UV_JOIN_GROUP)
793  optname = MCAST_JOIN_SOURCE_GROUP;
794  else if (membership == UV_LEAVE_GROUP)
795  optname = MCAST_LEAVE_SOURCE_GROUP;
796  else
797  return UV_EINVAL;
798 
799  if (setsockopt(handle->socket,
800  IPPROTO_IPV6,
801  optname,
802  (char*) &mreq,
803  sizeof(mreq)) == SOCKET_ERROR) {
804  return uv_translate_sys_error(WSAGetLastError());
805  }
806 
807  return 0;
808 }
809 
810 
812  const char* multicast_addr,
813  const char* interface_addr,
814  uv_membership membership) {
815  struct sockaddr_in addr4;
816  struct sockaddr_in6 addr6;
817 
818  if (uv_ip4_addr(multicast_addr, 0, &addr4) == 0)
819  return uv__udp_set_membership4(handle, &addr4, interface_addr, membership);
820  else if (uv_ip6_addr(multicast_addr, 0, &addr6) == 0)
821  return uv__udp_set_membership6(handle, &addr6, interface_addr, membership);
822  else
823  return UV_EINVAL;
824 }
825 
826 
828  const char* multicast_addr,
829  const char* interface_addr,
830  const char* source_addr,
831  uv_membership membership) {
832  int err;
833  struct sockaddr_storage mcast_addr;
834  struct sockaddr_in* mcast_addr4;
835  struct sockaddr_in6* mcast_addr6;
836  struct sockaddr_storage src_addr;
837  struct sockaddr_in* src_addr4;
838  struct sockaddr_in6* src_addr6;
839 
840  mcast_addr4 = (struct sockaddr_in*)&mcast_addr;
841  mcast_addr6 = (struct sockaddr_in6*)&mcast_addr;
842  src_addr4 = (struct sockaddr_in*)&src_addr;
843  src_addr6 = (struct sockaddr_in6*)&src_addr;
844 
845  err = uv_ip4_addr(multicast_addr, 0, mcast_addr4);
846  if (err) {
847  err = uv_ip6_addr(multicast_addr, 0, mcast_addr6);
848  if (err)
849  return err;
850  err = uv_ip6_addr(source_addr, 0, src_addr6);
851  if (err)
852  return err;
854  mcast_addr6,
855  interface_addr,
856  src_addr6,
857  membership);
858  }
859 
860  err = uv_ip4_addr(source_addr, 0, src_addr4);
861  if (err)
862  return err;
864  mcast_addr4,
865  interface_addr,
866  src_addr4,
867  membership);
868 }
869 
870 
871 int uv_udp_set_multicast_interface(uv_udp_t* handle, const char* interface_addr) {
872  struct sockaddr_storage addr_st;
873  struct sockaddr_in* addr4;
874  struct sockaddr_in6* addr6;
875 
876  addr4 = (struct sockaddr_in*) &addr_st;
877  addr6 = (struct sockaddr_in6*) &addr_st;
878 
879  if (!interface_addr) {
880  memset(&addr_st, 0, sizeof addr_st);
881  if (handle->flags & UV_HANDLE_IPV6) {
882  addr_st.ss_family = AF_INET6;
883  addr6->sin6_scope_id = 0;
884  } else {
885  addr_st.ss_family = AF_INET;
886  addr4->sin_addr.s_addr = htonl(INADDR_ANY);
887  }
888  } else if (uv_ip4_addr(interface_addr, 0, addr4) == 0) {
889  /* nothing, address was parsed */
890  } else if (uv_ip6_addr(interface_addr, 0, addr6) == 0) {
891  /* nothing, address was parsed */
892  } else {
893  return UV_EINVAL;
894  }
895 
896  if (handle->socket == INVALID_SOCKET)
897  return UV_EBADF;
898 
899  if (addr_st.ss_family == AF_INET) {
900  if (setsockopt(handle->socket,
901  IPPROTO_IP,
902  IP_MULTICAST_IF,
903  (char*) &addr4->sin_addr,
904  sizeof(addr4->sin_addr)) == SOCKET_ERROR) {
905  return uv_translate_sys_error(WSAGetLastError());
906  }
907  } else if (addr_st.ss_family == AF_INET6) {
908  if (setsockopt(handle->socket,
909  IPPROTO_IPV6,
910  IPV6_MULTICAST_IF,
911  (char*) &addr6->sin6_scope_id,
912  sizeof(addr6->sin6_scope_id)) == SOCKET_ERROR) {
913  return uv_translate_sys_error(WSAGetLastError());
914  }
915  } else {
916  assert(0 && "unexpected address family");
917  abort();
918  }
919 
920  return 0;
921 }
922 
923 
925  BOOL optval = (BOOL) value;
926 
927  if (handle->socket == INVALID_SOCKET)
928  return UV_EBADF;
929 
930  if (setsockopt(handle->socket,
931  SOL_SOCKET,
932  SO_BROADCAST,
933  (char*) &optval,
934  sizeof optval)) {
935  return uv_translate_sys_error(WSAGetLastError());
936  }
937 
938  return 0;
939 }
940 
941 
943  struct sockaddr_storage addr;
944  int addrlen;
945 
946  addrlen = sizeof(addr);
947  if (uv_udp_getsockname(handle, (struct sockaddr*) &addr, &addrlen) != 0)
948  return 0;
949 
950  return addrlen > 0;
951 }
952 
953 
955  WSAPROTOCOL_INFOW protocol_info;
956  int opt_len;
957  int err;
958 
959  /* Detect the address family of the socket. */
960  opt_len = (int) sizeof protocol_info;
961  if (getsockopt(sock,
962  SOL_SOCKET,
963  SO_PROTOCOL_INFOW,
964  (char*) &protocol_info,
965  &opt_len) == SOCKET_ERROR) {
966  return uv_translate_sys_error(GetLastError());
967  }
968 
969  err = uv_udp_set_socket(handle->loop,
970  handle,
971  sock,
972  protocol_info.iAddressFamily);
973  if (err)
974  return uv_translate_sys_error(err);
975 
977  handle->flags |= UV_HANDLE_BOUND;
978 
981 
982  return 0;
983 }
984 
985 
986 #define SOCKOPT_SETTER(name, option4, option6, validate) \
987  int uv_udp_set_##name(uv_udp_t* handle, int value) { \
988  DWORD optval = (DWORD) value; \
989  \
990  if (!(validate(value))) { \
991  return UV_EINVAL; \
992  } \
993  \
994  if (handle->socket == INVALID_SOCKET) \
995  return UV_EBADF; \
996  \
997  if (!(handle->flags & UV_HANDLE_IPV6)) { \
998  /* Set IPv4 socket option */ \
999  if (setsockopt(handle->socket, \
1000  IPPROTO_IP, \
1001  option4, \
1002  (char*) &optval, \
1003  sizeof optval)) { \
1004  return uv_translate_sys_error(WSAGetLastError()); \
1005  } \
1006  } else { \
1007  /* Set IPv6 socket option */ \
1008  if (setsockopt(handle->socket, \
1009  IPPROTO_IPV6, \
1010  option6, \
1011  (char*) &optval, \
1012  sizeof optval)) { \
1013  return uv_translate_sys_error(WSAGetLastError()); \
1014  } \
1015  } \
1016  return 0; \
1017  }
1018 
1019 #define VALIDATE_TTL(value) ((value) >= 1 && (value) <= 255)
1020 #define VALIDATE_MULTICAST_TTL(value) ((value) >= -1 && (value) <= 255)
1021 #define VALIDATE_MULTICAST_LOOP(value) (1)
1022 
1024  IP_TTL,
1025  IPV6_HOPLIMIT,
1026  VALIDATE_TTL)
1027 SOCKOPT_SETTER(multicast_ttl,
1028  IP_MULTICAST_TTL,
1029  IPV6_MULTICAST_HOPS,
1031 SOCKOPT_SETTER(multicast_loop,
1032  IP_MULTICAST_LOOP,
1033  IPV6_MULTICAST_LOOP,
1035 
1036 #undef SOCKOPT_SETTER
1037 #undef VALIDATE_TTL
1038 #undef VALIDATE_MULTICAST_TTL
1039 #undef VALIDATE_MULTICAST_LOOP
1040 
1041 
1042 /* This function is an egress point, i.e. it returns libuv errors rather than
1043  * system errors.
1044  */
1046  const struct sockaddr* addr,
1047  unsigned int addrlen,
1048  unsigned int flags) {
1049  int err;
1050 
1051  err = uv_udp_maybe_bind(handle, addr, addrlen, flags);
1052  if (err)
1053  return uv_translate_sys_error(err);
1054 
1055  return 0;
1056 }
1057 
1058 
1060  const struct sockaddr* addr,
1061  unsigned int addrlen) {
1062  const struct sockaddr* bind_addr;
1063  int err;
1064 
1065  if (!(handle->flags & UV_HANDLE_BOUND)) {
1066  if (addrlen == sizeof(uv_addr_ip4_any_))
1067  bind_addr = (const struct sockaddr*) &uv_addr_ip4_any_;
1068  else if (addrlen == sizeof(uv_addr_ip6_any_))
1069  bind_addr = (const struct sockaddr*) &uv_addr_ip6_any_;
1070  else
1071  return UV_EINVAL;
1072 
1073  err = uv_udp_maybe_bind(handle, bind_addr, addrlen, 0);
1074  if (err)
1075  return uv_translate_sys_error(err);
1076  }
1077 
1078  err = connect(handle->socket, addr, addrlen);
1079  if (err)
1080  return uv_translate_sys_error(err);
1081 
1082  handle->flags |= UV_HANDLE_UDP_CONNECTED;
1083 
1084  return 0;
1085 }
1086 
1087 
1089  int err;
1090  struct sockaddr addr;
1091 
1092  memset(&addr, 0, sizeof(addr));
1093 
1094  err = connect(handle->socket, &addr, sizeof(addr));
1095  if (err)
1096  return uv_translate_sys_error(err);
1097 
1098  handle->flags &= ~UV_HANDLE_UDP_CONNECTED;
1099  return 0;
1100 }
1101 
1102 
1103 /* This function is an egress point, i.e. it returns libuv errors rather than
1104  * system errors.
1105  */
1107  uv_udp_t* handle,
1108  const uv_buf_t bufs[],
1109  unsigned int nbufs,
1110  const struct sockaddr* addr,
1111  unsigned int addrlen,
1113  const struct sockaddr* bind_addr;
1114  int err;
1115 
1116  if (!(handle->flags & UV_HANDLE_BOUND)) {
1117  if (addrlen == sizeof(uv_addr_ip4_any_))
1118  bind_addr = (const struct sockaddr*) &uv_addr_ip4_any_;
1119  else if (addrlen == sizeof(uv_addr_ip6_any_))
1120  bind_addr = (const struct sockaddr*) &uv_addr_ip6_any_;
1121  else
1122  return UV_EINVAL;
1123 
1124  err = uv_udp_maybe_bind(handle, bind_addr, addrlen, 0);
1125  if (err)
1126  return uv_translate_sys_error(err);
1127  }
1128 
1129  err = uv__send(req, handle, bufs, nbufs, addr, addrlen, send_cb);
1130  if (err)
1131  return uv_translate_sys_error(err);
1132 
1133  return 0;
1134 }
1135 
1136 
1138  const uv_buf_t bufs[],
1139  unsigned int nbufs,
1140  const struct sockaddr* addr,
1141  unsigned int addrlen) {
1142  DWORD bytes;
1143  const struct sockaddr* bind_addr;
1144  struct sockaddr_storage converted;
1145  int err;
1146 
1147  assert(nbufs > 0);
1148 
1149  if (addr != NULL) {
1151  if (err)
1152  return err;
1153  }
1154 
1155  /* Already sending a message.*/
1156  if (handle->send_queue_count != 0)
1157  return UV_EAGAIN;
1158 
1159  if (!(handle->flags & UV_HANDLE_BOUND)) {
1160  if (addrlen == sizeof(uv_addr_ip4_any_))
1161  bind_addr = (const struct sockaddr*) &uv_addr_ip4_any_;
1162  else if (addrlen == sizeof(uv_addr_ip6_any_))
1163  bind_addr = (const struct sockaddr*) &uv_addr_ip6_any_;
1164  else
1165  return UV_EINVAL;
1166  err = uv_udp_maybe_bind(handle, bind_addr, addrlen, 0);
1167  if (err)
1168  return uv_translate_sys_error(err);
1169  }
1170 
1171  err = WSASendTo(handle->socket,
1172  (WSABUF*)bufs,
1173  nbufs,
1174  &bytes,
1175  0,
1176  (const struct sockaddr*) &converted,
1177  addrlen,
1178  NULL,
1179  NULL);
1180 
1181  if (err)
1182  return uv_translate_sys_error(WSAGetLastError());
1183 
1184  return bytes;
1185 }
UV_HANDLE_READ_PENDING
@ UV_HANDLE_READ_PENDING
Definition: uv-common.h:86
uv_udp_init
int uv_udp_init(uv_loop_t *loop, uv_udp_t *handle)
Definition: win/udp.c:177
async_greeter_server_with_graceful_shutdown.loop
loop
Definition: async_greeter_server_with_graceful_shutdown.py:59
REQ_SUCCESS
#define REQ_SUCCESS(req)
Definition: req-inl.h:46
uv_process_udp_recv_req
void uv_process_udp_recv_req(uv_loop_t *loop, uv_udp_t *handle, uv_req_t *req)
Definition: win/udp.c:460
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
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_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: win/udp.c:827
UV_HANDLE_CLOSED
@ UV_HANDLE_CLOSED
Definition: uv-common.h:67
uv_wsarecv_workaround
int WSAAPI uv_wsarecv_workaround(SOCKET socket, WSABUF *buffers, DWORD buffer_count, DWORD *bytes, DWORD *flags, WSAOVERLAPPED *overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine)
Definition: winsock.c:270
FILE_SKIP_SET_EVENT_ON_HANDLE
#define FILE_SKIP_SET_EVENT_ON_HANDLE
Definition: winapi.h:4600
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
stream-inl.h
UV_HANDLE_BOUND
@ UV_HANDLE_BOUND
Definition: uv-common.h:83
memset
return memset(p, 0, total)
uv_udp_set_broadcast
int uv_udp_set_broadcast(uv_udp_t *handle, int value)
Definition: win/udp.c:924
UV_UDP_PARTIAL
@ UV_UDP_PARTIAL
Definition: uv.h:599
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
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
IPV6_HOPLIMIT
#define IPV6_HOPLIMIT
Definition: winsock.h:50
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
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__handle_close
#define uv__handle_close(handle)
Definition: handle-inl.h:76
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: win/udp.c:596
setup.name
name
Definition: setup.py:542
uv_udp_queue_recv
static void uv_udp_queue_recv(uv_loop_t *loop, uv_udp_t *handle)
Definition: win/udp.c:274
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: win/udp.c:1106
uv_udp_open
int uv_udp_open(uv_udp_t *handle, uv_os_sock_t sock)
Definition: win/udp.c:954
uv_udp_set_socket
static int uv_udp_set_socket(uv_loop_t *loop, uv_udp_t *handle, SOCKET socket, int family)
Definition: win/udp.c:63
FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
#define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
Definition: winapi.h:4596
uv_udp_init_ex
int uv_udp_init_ex(uv_loop_t *loop, uv_udp_t *handle, unsigned int flags)
Definition: win/udp.c:128
uv_want_endgame
static INLINE void uv_want_endgame(uv_loop_t *loop, uv_handle_t *handle)
Definition: handle-inl.h:88
uv_udp_getpeername
int uv_udp_getpeername(const uv_udp_t *handle, struct sockaddr *name, int *namelen)
Definition: win/udp.c:39
UV_HANDLE_ZERO_READ
@ UV_HANDLE_ZERO_READ
Definition: uv-common.h:88
uv_udp_close
void uv_udp_close(uv_loop_t *loop, uv_udp_t *handle)
Definition: win/udp.c:182
BOOL
int BOOL
Definition: undname.c:46
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: win/udp.c:705
uv__udp_recv_stop
int uv__udp_recv_stop(uv_udp_t *handle)
Definition: win/udp.c:400
uv_connect_s::cb
UV_REQ_FIELDS uv_connect_cb cb
Definition: uv.h:582
uv_alloc_cb
void(* uv_alloc_cb)(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf)
Definition: uv.h:306
uv_zero_
static char uv_zero_[]
Definition: win/udp.c:38
uv_os_sock_t
int uv_os_sock_t
Definition: unix.h:127
uv_udp_maybe_bind
static int uv_udp_maybe_bind(uv_udp_t *handle, const struct sockaddr *addr, unsigned int addrlen, unsigned int flags)
Definition: win/udp.c:204
uv_ip4_addr
UV_EXTERN int uv_ip4_addr(const char *ip, int port, struct sockaddr_in *addr)
Definition: uv-common.c:221
from
size_t from
Definition: abseil-cpp/absl/container/internal/layout_test.cc:1384
req-inl.h
uv__handle_closing
#define uv__handle_closing(handle)
Definition: handle-inl.h:63
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
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
xds_interop_client.int
int
Definition: xds_interop_client.py:113
sockaddr_in6
Definition: ares_ipv6.h:25
UNREGISTER_HANDLE_REQ
#define UNREGISTER_HANDLE_REQ(loop, handle, req)
Definition: req-inl.h:62
req
static uv_connect_t req
Definition: test-connection-fail.c:30
uv_translate_sys_error
UV_EXTERN int uv_translate_sys_error(int sys_errno)
Definition: unix/core.c:1244
DECREASE_ACTIVE_COUNT
#define DECREASE_ACTIVE_COUNT(loop, handle)
Definition: handle-inl.h:32
SET_REQ_ERROR
#define SET_REQ_ERROR(req, error)
Definition: req-inl.h:34
uv__udp_disconnect
int uv__udp_disconnect(uv_udp_t *handle)
Definition: win/udp.c:1088
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
VALIDATE_MULTICAST_TTL
#define VALIDATE_MULTICAST_TTL(value)
Definition: win/udp.c:1020
VALIDATE_TTL
#define VALIDATE_TTL(value)
Definition: win/udp.c:1019
REGISTER_HANDLE_REQ
#define REGISTER_HANDLE_REQ(loop, handle, req)
Definition: req-inl.h:56
done
struct tab * done
Definition: bloaty/third_party/zlib/examples/enough.c:176
addr6
static struct sockaddr_in6 addr6
Definition: test-getnameinfo.c:34
uv_udp_send_cb
void(* uv_udp_send_cb)(uv_udp_send_t *req, int status)
Definition: uv.h:621
uv_membership
uv_membership
Definition: uv.h:379
uv__udp_is_bound
int uv__udp_is_bound(uv_udp_t *handle)
Definition: win/udp.c:942
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_HANDLE_IPV6
@ UV_HANDLE_IPV6
Definition: uv-common.h:94
uv_process_udp_send_req
void uv_process_udp_send_req(uv_loop_t *loop, uv_udp_t *handle, uv_udp_send_t *req)
Definition: win/udp.c:571
uv_addr_ip4_any_
struct sockaddr_in uv_addr_ip4_any_
Definition: winsock.c:34
QUEUE_REMOVE
#define QUEUE_REMOVE(q)
Definition: queue.h:101
uv_udp_getsockname
int uv_udp_getsockname(const uv_udp_t *handle, struct sockaddr *name, int *namelen)
Definition: win/udp.c:51
uv__handle_init
#define uv__handle_init(loop_, h, type_)
Definition: uv-common.h:284
UV_JOIN_GROUP
@ UV_JOIN_GROUP
Definition: uv.h:381
uv_udp_send_s
Definition: uv.h:645
uv_udp_set_multicast_interface
int uv_udp_set_multicast_interface(uv_udp_t *handle, const char *interface_addr)
Definition: win/udp.c:871
uv_insert_pending_req
static INLINE void uv_insert_pending_req(uv_loop_t *loop, uv_req_t *req)
Definition: req-inl.h:90
addr4
static struct sockaddr_in addr4
Definition: test-getnameinfo.c:33
bufs
static uv_buf_t bufs[5]
Definition: benchmark-udp-pummel.c:51
value
const char * value
Definition: hpack_parser_table.cc:165
uv.h
UV_HANDLE_SYNC_BYPASS_IOCP
@ UV_HANDLE_SYNC_BYPASS_IOCP
Definition: uv-common.h:87
IPV6_V6ONLY
#define IPV6_V6ONLY
Definition: winsock.h:46
UV_REQ_INIT
#define UV_REQ_INIT(req, typ)
Definition: uv-common.h:305
UV_HANDLE_CLOSING
@ UV_HANDLE_CLOSING
Definition: uv-common.h:66
uv_wsarecvfrom_workaround
int WSAAPI uv_wsarecvfrom_workaround(SOCKET socket, WSABUF *buffers, DWORD buffer_count, DWORD *bytes, DWORD *flags, struct sockaddr *addr, int *addr_len, WSAOVERLAPPED *overlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine)
Definition: winsock.c:364
INCREASE_ACTIVE_COUNT
#define INCREASE_ACTIVE_COUNT(loop, handle)
Definition: handle-inl.h:42
uv__udp_set_membership6
int uv__udp_set_membership6(uv_udp_t *handle, const struct sockaddr_in6 *multicast_addr, const char *interface_addr, uv_membership membership)
Definition: win/udp.c:650
uv_buf_t
Definition: unix.h:121
VALIDATE_MULTICAST_LOOP
#define VALIDATE_MULTICAST_LOOP(value)
Definition: win/udp.c:1021
bytes
uint8 bytes[10]
Definition: bloaty/third_party/protobuf/src/google/protobuf/io/coded_stream_unittest.cc:153
MCAST_JOIN_SOURCE_GROUP
#define MCAST_JOIN_SOURCE_GROUP
Definition: winsock.h:58
absl::flags_internal
Definition: abseil-cpp/absl/flags/commandlineflag.h:40
UV_UDP_REUSEADDR
@ UV_UDP_REUSEADDR
Definition: uv.h:608
GET_REQ_SOCK_ERROR
#define GET_REQ_SOCK_ERROR(req)
Definition: req-inl.h:52
DECREASE_PENDING_REQ_COUNT
#define DECREASE_PENDING_REQ_COUNT(handle)
Definition: handle-inl.h:51
uv_udp_endgame
void uv_udp_endgame(uv_loop_t *loop, uv_udp_t *handle)
Definition: win/udp.c:195
fix_build_deps.r
r
Definition: fix_build_deps.py:491
SOCKOPT_SETTER
#define SOCKOPT_SETTER(name, option4, option6, validate)
Definition: win/udp.c:986
UV_SUCCEEDED_WITHOUT_IOCP
#define UV_SUCCEEDED_WITHOUT_IOCP(result)
Definition: req-inl.h:69
uv__udp_connect
int uv__udp_connect(uv_udp_t *handle, const struct sockaddr *addr, unsigned int addrlen)
Definition: win/udp.c:1059
UV_SUCCEEDED_WITH_IOCP
#define UV_SUCCEEDED_WITH_IOCP(result)
Definition: req-inl.h:72
uv_addr_ip6_any_
struct sockaddr_in6 uv_addr_ip6_any_
Definition: winsock.c:35
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_set_source_membership6
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: win/udp.c:757
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: win/udp.c:1137
uv_active_udp_streams_threshold
const unsigned int uv_active_udp_streams_threshold
Definition: win/udp.c:35
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: win/udp.c:368
uv__convert_to_localhost_if_unspecified
int uv__convert_to_localhost_if_unspecified(const struct sockaddr *addr, struct sockaddr_storage *storage)
Definition: winsock.c:547
sockaddr_in6::sin6_addr
struct ares_in6_addr sin6_addr
Definition: ares_ipv6.h:30
handle
static csh handle
Definition: test_arm_regression.c:16
UV_HANDLE_READING
@ UV_HANDLE_READING
Definition: uv-common.h:82
uv_handle_s
Definition: uv.h:441
test_server.socket
socket
Definition: test_server.py:65
closesocket
static int closesocket(int sock)
Definition: bio_test.cc:46
uv_loop_s
Definition: uv.h:1767
uv__count_bufs
size_t uv__count_bufs(const uv_buf_t bufs[], unsigned int nbufs)
Definition: uv-common.c:543
flags
uint32_t flags
Definition: retry_filter.cc:632
internal.h
uv_udp_recv_stop
UV_EXTERN int uv_udp_recv_stop(uv_udp_t *handle)
Definition: uv-common.c:448
uv__send
static int uv__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 cb)
Definition: win/udp.c:411
handle-inl.h
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: win/udp.c:811
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10
uv_req_s
Definition: uv.h:404
sockaddr_in6::sin6_scope_id
unsigned int sin6_scope_id
Definition: ares_ipv6.h:31
cb
OPENSSL_EXPORT pem_password_cb * cb
Definition: pem.h:351


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:43