OpenVPN
socket.c
Go to the documentation of this file.
1/*
2 * OpenVPN -- An application to securely tunnel IP networks
3 * over a single TCP/UDP port, with support for SSL/TLS-based
4 * session authentication and key exchange,
5 * packet encryption, packet authentication, and
6 * packet compression.
7 *
8 * Copyright (C) 2002-2025 OpenVPN Inc <sales@openvpn.net>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2
12 * as published by the Free Software Foundation.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, see <https://www.gnu.org/licenses/>.
21 */
22
23#ifdef HAVE_CONFIG_H
24#include "config.h"
25#endif
26
27#include "syshead.h"
28
29#include "socket.h"
30#include "fdmisc.h"
31#include "misc.h"
32#include "gremlin.h"
33#include "plugin.h"
34#include "ps.h"
35#include "run_command.h"
36#include "manage.h"
37#include "misc.h"
38#include "manage.h"
39#include "openvpn.h"
40#include "forward.h"
41
42#include "memdbg.h"
43
44bool
46{
47 int i;
48
49 for (i = 0; i < c->c1.link_sockets_num; i++)
50 {
52 {
53 return true;
54 }
55 }
56 return false;
57}
58
59/*
60 * Convert sockflags/getaddr_flags into getaddr_flags
61 */
62static unsigned int
63sf2gaf(const unsigned int getaddr_flags, const unsigned int sockflags)
64{
65 if (sockflags & SF_HOST_RANDOMIZE)
66 {
67 return getaddr_flags | GETADDR_RANDOMIZE;
68 }
69 else
70 {
71 return getaddr_flags;
72 }
73}
74
75#if defined(__GNUC__) || defined(__clang__)
76#pragma GCC diagnostic push
77#pragma GCC diagnostic ignored "-Wconversion"
78#endif
79
80/*
81 * Functions related to the translation of DNS names to IP addresses.
82 */
83static int
84get_addr_generic(sa_family_t af, unsigned int flags, const char *hostname, void *network,
85 unsigned int *netbits, int resolve_retry_seconds, struct signal_info *sig_info,
86 msglvl_t msglevel)
87{
88 char *endp, *sep, *var_host = NULL;
89 struct addrinfo *ai = NULL;
90 unsigned long bits;
91 uint8_t max_bits;
92 int ret = -1;
93
94 if (!hostname)
95 {
96 msg(M_NONFATAL, "Can't resolve null hostname!");
97 goto out;
98 }
99
100 /* assign family specific default values */
101 switch (af)
102 {
103 case AF_INET:
104 bits = 0;
105 max_bits = sizeof(in_addr_t) * 8;
106 break;
107
108 case AF_INET6:
109 bits = 64;
110 max_bits = sizeof(struct in6_addr) * 8;
111 break;
112
113 default:
114 msg(M_WARN, "Unsupported AF family passed to getaddrinfo for %s (%d)", hostname, af);
115 goto out;
116 }
117
118 /* we need to modify the hostname received as input, but we don't want to
119 * touch it directly as it might be a constant string.
120 *
121 * Therefore, we clone the string here and free it at the end of the
122 * function */
123 var_host = strdup(hostname);
124 if (!var_host)
125 {
126 msg(M_NONFATAL | M_ERRNO, "Can't allocate hostname buffer for getaddrinfo");
127 goto out;
128 }
129
130 /* check if this hostname has a /bits suffix */
131 sep = strchr(var_host, '/');
132 if (sep)
133 {
134 bits = strtoul(sep + 1, &endp, 10);
135 if ((*endp != '\0') || (bits > max_bits))
136 {
137 msg(msglevel, "IP prefix '%s': invalid '/bits' spec (%s)", hostname, sep + 1);
138 goto out;
139 }
140 *sep = '\0';
141 }
142
143 ret = openvpn_getaddrinfo(flags & ~GETADDR_HOST_ORDER, var_host, NULL, resolve_retry_seconds,
144 sig_info, af, &ai);
145 if ((ret == 0) && network)
146 {
147 struct in6_addr *ip6;
148 in_addr_t *ip4;
149
150 switch (af)
151 {
152 case AF_INET:
153 ip4 = network;
154 *ip4 = ((struct sockaddr_in *)ai->ai_addr)->sin_addr.s_addr;
155
156 if (flags & GETADDR_HOST_ORDER)
157 {
158 *ip4 = ntohl(*ip4);
159 }
160 break;
161
162 case AF_INET6:
163 ip6 = network;
164 *ip6 = ((struct sockaddr_in6 *)ai->ai_addr)->sin6_addr;
165 break;
166
167 default:
168 /* can't get here because 'af' was previously checked */
169 msg(M_WARN, "Unsupported AF family for %s (%d)", var_host, af);
170 goto out;
171 }
172 }
173
174 if (netbits)
175 {
176 *netbits = bits;
177 }
178
179 /* restore '/' separator, if any */
180 if (sep)
181 {
182 *sep = '/';
183 }
184out:
185 freeaddrinfo(ai);
186 free(var_host);
187
188 return ret;
189}
190
191in_addr_t
192getaddr(unsigned int flags, const char *hostname, int resolve_retry_seconds, bool *succeeded,
193 struct signal_info *sig_info)
194{
195 in_addr_t addr;
196 int status;
197
198 status = get_addr_generic(AF_INET, flags, hostname, &addr, NULL, resolve_retry_seconds,
199 sig_info, M_WARN);
200 if (status == 0)
201 {
202 if (succeeded)
203 {
204 *succeeded = true;
205 }
206 return addr;
207 }
208 else
209 {
210 if (succeeded)
211 {
212 *succeeded = false;
213 }
214 return 0;
215 }
216}
217
218bool
219get_ipv6_addr(const char *hostname, struct in6_addr *network, unsigned int *netbits,
220 msglvl_t msglevel)
221{
222 if (get_addr_generic(AF_INET6, GETADDR_RESOLVE, hostname, network, netbits, 0, NULL, msglevel)
223 < 0)
224 {
225 return false;
226 }
227
228 return true; /* parsing OK, values set */
229}
230
231static inline bool
232streqnull(const char *a, const char *b)
233{
234 if (a == NULL && b == NULL)
235 {
236 return true;
237 }
238 else if (a == NULL || b == NULL)
239 {
240 return false;
241 }
242 else
243 {
244 return streq(a, b);
245 }
246}
247
248/*
249 * get_cached_dns_entry return 0 on success and -1
250 * otherwise. (like getaddrinfo)
251 */
252static int
253get_cached_dns_entry(struct cached_dns_entry *dns_cache, const char *hostname, const char *servname,
254 int ai_family, unsigned int resolve_flags, struct addrinfo **ai)
255{
256 struct cached_dns_entry *ph;
257 unsigned int flags;
258
259 /* Only use flags that are relevant for the structure */
260 flags = resolve_flags & GETADDR_CACHE_MASK;
261
262 for (ph = dns_cache; ph; ph = ph->next)
263 {
265 && ph->ai_family == ai_family && ph->flags == flags)
266 {
267 *ai = ph->ai;
268 return 0;
269 }
270 }
271 return -1;
272}
273
274
275static int
276do_preresolve_host(struct context *c, const char *hostname, const char *servname, const int af,
277 const unsigned int flags)
278{
279 struct addrinfo *ai;
280 int status;
281
282 if (get_cached_dns_entry(c->c1.dns_cache, hostname, servname, af, flags, &ai) == 0)
283 {
284 /* entry already cached, return success */
285 return 0;
286 }
287
288 status = openvpn_getaddrinfo(flags, hostname, servname, c->options.resolve_retry_seconds, NULL,
289 af, &ai);
290 if (status == 0)
291 {
292 struct cached_dns_entry *ph;
293
294 ALLOC_OBJ_CLEAR_GC(ph, struct cached_dns_entry, &c->gc);
295 ph->ai = ai;
296 ph->hostname = hostname;
297 ph->servname = servname;
299
300 if (!c->c1.dns_cache)
301 {
302 c->c1.dns_cache = ph;
303 }
304 else
305 {
306 struct cached_dns_entry *prev = c->c1.dns_cache;
307 while (prev->next)
308 {
309 prev = prev->next;
310 }
311 prev->next = ph;
312 }
313
315 }
316 return status;
317}
318
319void
321{
322 struct connection_list *l = c->options.connection_list;
325
326
327 for (int i = 0; i < l->len; ++i)
328 {
329 int status;
330 const char *remote;
331 unsigned int flags = preresolve_flags;
332
333 struct connection_entry *ce = l->array[i];
334
335 if (proto_is_dgram(ce->proto))
336 {
338 }
339
341 {
343 }
344
345 if (c->options.ip_remote_hint)
346 {
348 }
349 else
350 {
351 remote = ce->remote;
352 }
353
354 /* HTTP remote hostname does not need to be resolved */
355 if (!ce->http_proxy_options)
356 {
358 if (status != 0)
359 {
360 goto err;
361 }
362 }
363
364 /* Preresolve proxy */
365 if (ce->http_proxy_options)
366 {
368 ce->http_proxy_options->port, ce->af, preresolve_flags);
369
370 if (status != 0)
371 {
372 goto err;
373 }
374 }
375
376 if (ce->socks_proxy_server)
377 {
378 status =
380 if (status != 0)
381 {
382 goto err;
383 }
384 }
385
386 if (ce->bind_local)
387 {
389 flags &= ~GETADDR_RANDOMIZE;
390
391 for (int j = 0; j < ce->local_list->len; j++)
392 {
393 struct local_entry *le = ce->local_list->array[j];
394
395 if (!le->local)
396 {
397 continue;
398 }
399
400 status = do_preresolve_host(c, le->local, le->port, ce->af, flags);
401 if (status != 0)
402 {
403 goto err;
404 }
405 }
406 }
407 }
408 return;
409
410err:
411 throw_signal_soft(SIGHUP, "Preresolving failed");
412}
413
414static int
416{
417#if defined(SOL_SOCKET) && defined(SO_SNDBUF)
418 int val;
419 socklen_t len;
420
421 len = sizeof(val);
422 if (getsockopt(sd, SOL_SOCKET, SO_SNDBUF, (void *)&val, &len) == 0 && len == sizeof(val))
423 {
424 return val;
425 }
426#endif
427 return 0;
428}
429
430static void
432{
433#if defined(SOL_SOCKET) && defined(SO_SNDBUF)
434 if (setsockopt(sd, SOL_SOCKET, SO_SNDBUF, (void *)&size, sizeof(size)) != 0)
435 {
436 msg(M_WARN, "NOTE: setsockopt SO_SNDBUF=%d failed", size);
437 }
438#endif
439}
440
441static int
443{
444#if defined(SOL_SOCKET) && defined(SO_RCVBUF)
445 int val;
446 socklen_t len;
447
448 len = sizeof(val);
449 if (getsockopt(sd, SOL_SOCKET, SO_RCVBUF, (void *)&val, &len) == 0 && len == sizeof(val))
450 {
451 return val;
452 }
453#endif
454 return 0;
455}
456
457static bool
459{
460#if defined(SOL_SOCKET) && defined(SO_RCVBUF)
461 if (setsockopt(sd, SOL_SOCKET, SO_RCVBUF, (void *)&size, sizeof(size)) != 0)
462 {
463 msg(M_WARN, "NOTE: setsockopt SO_RCVBUF=%d failed", size);
464 return false;
465 }
466 return true;
467#endif
468}
469
470void
471socket_set_buffers(socket_descriptor_t fd, const struct socket_buffer_size *sbs, bool reduce_size)
472{
473 if (sbs)
474 {
475 const int sndbuf_old = socket_get_sndbuf(fd);
476 const int rcvbuf_old = socket_get_rcvbuf(fd);
477
478 if (sbs->sndbuf && (reduce_size || sndbuf_old < sbs->sndbuf))
479 {
480 socket_set_sndbuf(fd, sbs->sndbuf);
481 }
482
483 if (sbs->rcvbuf && (reduce_size || rcvbuf_old < sbs->rcvbuf))
484 {
485 socket_set_rcvbuf(fd, sbs->rcvbuf);
486 }
487
488 msg(D_OSBUF, "Socket Buffers: R=[%d->%d] S=[%d->%d]", rcvbuf_old, socket_get_rcvbuf(fd),
489 sndbuf_old, socket_get_sndbuf(fd));
490 }
491}
492
493/*
494 * Set other socket options
495 */
496
497static bool
499{
500#if defined(_WIN32) || (defined(IPPROTO_TCP) && defined(TCP_NODELAY))
501 if (setsockopt(sd, IPPROTO_TCP, TCP_NODELAY, (void *)&state, sizeof(state)) != 0)
502 {
503 msg(M_WARN, "NOTE: setsockopt TCP_NODELAY=%d failed", state);
504 return false;
505 }
506 else
507 {
508 dmsg(D_OSBUF, "Socket flags: TCP_NODELAY=%d succeeded", state);
509 return true;
510 }
511#else /* if defined(_WIN32) || (defined(IPPROTO_TCP) && defined(TCP_NODELAY)) */
512 msg(M_WARN, "NOTE: setsockopt TCP_NODELAY=%d failed (No kernel support)", state);
513 return false;
514#endif
515}
516
517static inline void
519{
520#if defined(TARGET_LINUX) && HAVE_DECL_SO_MARK
521 if (mark && setsockopt(sd, SOL_SOCKET, SO_MARK, (void *)&mark, sizeof(mark)) != 0)
522 {
523 msg(M_WARN, "NOTE: setsockopt SO_MARK=%d failed", mark);
524 }
525#endif
526}
527
528static bool
529socket_set_flags(socket_descriptor_t sd, unsigned int sockflags)
530{
531 /* SF_TCP_NODELAY doesn't make sense for dco-win */
532 if ((sockflags & SF_TCP_NODELAY) && (!(sockflags & SF_DCO_WIN)))
533 {
534 return socket_set_tcp_nodelay(sd, 1);
535 }
536 else
537 {
538 return true;
539 }
540}
541
542bool
543link_socket_update_flags(struct link_socket *sock, unsigned int sockflags)
544{
545 if (sock && socket_defined(sock->sd))
546 {
547 sock->sockflags |= sockflags;
548 return socket_set_flags(sock->sd, sock->sockflags);
549 }
550 else
551 {
552 return false;
553 }
554}
555
556void
557link_socket_update_buffer_sizes(struct link_socket *sock, int rcvbuf, int sndbuf)
558{
559 if (sock && socket_defined(sock->sd))
560 {
561 sock->socket_buffer_sizes.sndbuf = sndbuf;
562 sock->socket_buffer_sizes.rcvbuf = rcvbuf;
563 socket_set_buffers(sock->sd, &sock->socket_buffer_sizes, true);
564 }
565}
566
567/*
568 * SOCKET INITIALIZATION CODE.
569 * Create a TCP/UDP socket
570 */
571
573create_socket_tcp(struct addrinfo *addrinfo)
574{
576
577 ASSERT(addrinfo);
578 ASSERT(addrinfo->ai_socktype == SOCK_STREAM);
579
580 if ((sd = socket(addrinfo->ai_family, addrinfo->ai_socktype, addrinfo->ai_protocol)) < 0)
581 {
582 msg(M_ERR, "Cannot create TCP socket");
583 }
584
585#ifndef _WIN32 /* using SO_REUSEADDR on Windows will cause bind to succeed on port conflicts! */
586 /* set SO_REUSEADDR on socket */
587 {
588 int on = 1;
589 if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (void *)&on, sizeof(on)) < 0)
590 {
591 msg(M_ERR, "TCP: Cannot setsockopt SO_REUSEADDR on TCP socket");
592 }
593 }
594#endif
595
596 /* set socket file descriptor to not pass across execs, so that
597 * scripts don't have access to it */
598 set_cloexec(sd);
599
600 return sd;
601}
602
604create_socket_udp(struct addrinfo *addrinfo, const unsigned int flags)
605{
607
608 ASSERT(addrinfo);
609 ASSERT(addrinfo->ai_socktype == SOCK_DGRAM);
610
611 if ((sd = socket(addrinfo->ai_family, addrinfo->ai_socktype, addrinfo->ai_protocol)) < 0)
612 {
613 msg(M_ERR, "UDP: Cannot create UDP/UDP6 socket");
614 }
615#if ENABLE_IP_PKTINFO
616 else if (flags & SF_USE_IP_PKTINFO)
617 {
618 int pad = 1;
619 if (addrinfo->ai_family == AF_INET)
620 {
621#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
622 if (setsockopt(sd, SOL_IP, IP_PKTINFO, (void *)&pad, sizeof(pad)) < 0)
623 {
624 msg(M_ERR, "UDP: failed setsockopt for IP_PKTINFO");
625 }
626#elif defined(IP_RECVDSTADDR)
627 if (setsockopt(sd, IPPROTO_IP, IP_RECVDSTADDR, (void *)&pad, sizeof(pad)) < 0)
628 {
629 msg(M_ERR, "UDP: failed setsockopt for IP_RECVDSTADDR");
630 }
631#else /* if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST) */
632#error ENABLE_IP_PKTINFO is set without IP_PKTINFO xor IP_RECVDSTADDR (fix syshead.h)
633#endif
634 }
635 else if (addrinfo->ai_family == AF_INET6)
636 {
637#ifndef IPV6_RECVPKTINFO /* Some older Darwin platforms require this */
638 if (setsockopt(sd, IPPROTO_IPV6, IPV6_PKTINFO, (void *)&pad, sizeof(pad)) < 0)
639#else
640 if (setsockopt(sd, IPPROTO_IPV6, IPV6_RECVPKTINFO, (void *)&pad, sizeof(pad)) < 0)
641#endif
642 {
643 msg(M_ERR, "UDP: failed setsockopt for IPV6_RECVPKTINFO");
644 }
645 }
646 }
647#endif /* if ENABLE_IP_PKTINFO */
648
649 /* set socket file descriptor to not pass across execs, so that
650 * scripts don't have access to it */
651 set_cloexec(sd);
652
653 return sd;
654}
655
656static void
657bind_local(struct link_socket *sock, const sa_family_t ai_family)
658{
659 /* bind to local address/port */
660 if (sock->bind_local)
661 {
662 if (sock->socks_proxy && sock->info.proto == PROTO_UDP)
663 {
664 socket_bind(sock->ctrl_sd, sock->info.lsa->bind_local, ai_family, "SOCKS", false);
665 }
666 else
667 {
668 socket_bind(sock->sd, sock->info.lsa->bind_local, ai_family, "TCP/UDP",
669 sock->info.bind_ipv6_only);
670 }
671 }
672}
673
674static void
675create_socket(struct link_socket *sock, struct addrinfo *addr)
676{
677 if (addr->ai_protocol == IPPROTO_UDP || addr->ai_socktype == SOCK_DGRAM)
678 {
679 sock->sd = create_socket_udp(addr, sock->sockflags);
681
682 /* Assume that control socket and data socket to the socks proxy
683 * are using the same IP family */
684 if (sock->socks_proxy)
685 {
686 /* Construct a temporary addrinfo to create the socket,
687 * currently resolve two remote addresses is not supported,
688 * TODO: Rewrite the whole resolve_remote */
689 struct addrinfo addrinfo_tmp = *addr;
690 addrinfo_tmp.ai_socktype = SOCK_STREAM;
691 addrinfo_tmp.ai_protocol = IPPROTO_TCP;
692 sock->ctrl_sd = create_socket_tcp(&addrinfo_tmp);
693 }
694 }
695 else if (addr->ai_protocol == IPPROTO_TCP || addr->ai_socktype == SOCK_STREAM)
696 {
697 sock->sd = create_socket_tcp(addr);
698 }
699 else
700 {
701 ASSERT(0);
702 }
703 /* Set af field of sock->info, so it always reflects the address family
704 * of the created socket */
705 sock->info.af = addr->ai_family;
706
707 /* set socket buffers based on --sndbuf and --rcvbuf options */
708 socket_set_buffers(sock->sd, &sock->socket_buffer_sizes, true);
709
710 /* set socket to --mark packets with given value */
711 socket_set_mark(sock->sd, sock->mark);
712
713#if defined(TARGET_LINUX)
714 if (sock->bind_dev)
715 {
716 msg(M_INFO, "Using bind-dev %s", sock->bind_dev);
717 if (setsockopt(sock->sd, SOL_SOCKET, SO_BINDTODEVICE, sock->bind_dev,
718 strlen(sock->bind_dev) + 1)
719 != 0)
720 {
721 msg(M_WARN | M_ERRNO, "WARN: setsockopt SO_BINDTODEVICE=%s failed", sock->bind_dev);
722 }
723 }
724#endif
725
726 bind_local(sock, addr->ai_family);
727}
728
729#ifdef TARGET_ANDROID
730static void
731protect_fd_nonlocal(int fd, const struct sockaddr *addr)
732{
733 if (!management)
734 {
735 msg(M_FATAL, "Required management interface not available.");
736 }
737
738 /* pass socket FD to management interface to pass on to VPNService API
739 * as "protected socket" (exempt from being routed into tunnel)
740 */
741 if (addr_local(addr))
742 {
743 msg(D_SOCKET_DEBUG, "Address is local, not protecting socket fd %d", fd);
744 return;
745 }
746
747 msg(D_SOCKET_DEBUG, "Protecting socket fd %d", fd);
748 management->connection.fdtosend = fd;
749 management_android_control(management, "PROTECTFD", __func__);
750}
751#endif
752
753/*
754 * Functions used for establishing a TCP stream connection.
755 */
756static void
757socket_do_listen(socket_descriptor_t sd, const struct addrinfo *local, bool do_listen,
758 bool do_set_nonblock)
759{
760 struct gc_arena gc = gc_new();
761 if (do_listen)
762 {
763 ASSERT(local);
764 msg(M_INFO, "Listening for incoming TCP connection on %s",
765 print_sockaddr(local->ai_addr, &gc));
766 if (listen(sd, 32))
767 {
768 msg(M_ERR, "TCP: listen() failed");
769 }
770 }
771
772 /* set socket to non-blocking mode */
773 if (do_set_nonblock)
774 {
775 set_nonblock(sd);
776 }
777
778 gc_free(&gc);
779}
780
782socket_do_accept(socket_descriptor_t sd, struct link_socket_actual *act, const bool nowait)
783{
784 /* af_addr_size WILL return 0 in this case if AFs other than AF_INET
785 * are compiled because act is empty here.
786 * could use getsockname() to support later remote_len check
787 */
788 socklen_t remote_len_af = af_addr_size(act->dest.addr.sa.sa_family);
789 socklen_t remote_len = sizeof(act->dest.addr);
791
792 CLEAR(*act);
793
794 if (nowait)
795 {
796 new_sd = getpeername(sd, &act->dest.addr.sa, &remote_len);
797
798 if (!socket_defined(new_sd))
799 {
800 msg(D_LINK_ERRORS | M_ERRNO, "TCP: getpeername() failed");
801 }
802 else
803 {
804 new_sd = sd;
805 }
806 }
807 else
808 {
809 new_sd = accept(sd, &act->dest.addr.sa, &remote_len);
810 }
811
812#if 0 /* For debugging only, test the effect of accept() failures */
813 {
814 static int foo = 0;
815 ++foo;
816 if (foo & 1)
817 {
818 new_sd = -1;
819 }
820 }
821#endif
822
823 if (!socket_defined(new_sd))
824 {
825 msg(D_LINK_ERRORS | M_ERRNO, "TCP: accept(%d) failed", (int)sd);
826 }
827 /* only valid if we have remote_len_af!=0 */
828 else if (remote_len_af && remote_len != remote_len_af)
829 {
831 "TCP: Received strange incoming connection with unknown address length=%d", remote_len);
832 openvpn_close_socket(new_sd);
833 new_sd = SOCKET_UNDEFINED;
834 }
835 else
836 {
837 /* set socket file descriptor to not pass across execs, so that
838 * scripts don't have access to it */
839 set_cloexec(sd);
840 }
841 return new_sd;
842}
843
844static void
846{
847 struct gc_arena gc = gc_new();
848 msg(M_INFO, "TCP connection established with %s", print_link_socket_actual(act, &gc));
849 gc_free(&gc);
850}
851
852#if defined(__GNUC__) || defined(__clang__)
853#pragma GCC diagnostic pop
854#endif
855
858 const char *remote_dynamic, const struct addrinfo *local, bool do_listen,
859 bool nowait, volatile int *signal_received)
860{
861 struct gc_arena gc = gc_new();
862 /* struct openvpn_sockaddr *remote = &act->dest; */
863 struct openvpn_sockaddr remote_verify = act->dest;
865
866 CLEAR(*act);
867 socket_do_listen(sd, local, do_listen, true);
868
869 while (true)
870 {
871 int status;
872 fd_set reads;
873 struct timeval tv;
874
875 FD_ZERO(&reads);
876 openvpn_fd_set(sd, &reads);
877 tv.tv_sec = 0;
878 tv.tv_usec = 0;
879
880 status = openvpn_select(sd + 1, &reads, NULL, NULL, &tv);
881
882 get_signal(signal_received);
883 if (*signal_received)
884 {
885 gc_free(&gc);
886 return sd;
887 }
888
889 if (status < 0)
890 {
891 msg(D_LINK_ERRORS | M_ERRNO, "TCP: select() failed");
892 }
893
894 if (status <= 0)
895 {
897 continue;
898 }
899
900 new_sd = socket_do_accept(sd, act, nowait);
901
902 if (socket_defined(new_sd))
903 {
904 struct addrinfo *ai = NULL;
905 if (remote_dynamic)
906 {
907 openvpn_getaddrinfo(0, remote_dynamic, NULL, 1, NULL,
908 remote_verify.addr.sa.sa_family, &ai);
909 }
910
911 if (ai && !addrlist_match(&remote_verify, ai))
912 {
913 msg(M_WARN, "TCP NOTE: Rejected connection attempt from %s due to --remote setting",
915 if (openvpn_close_socket(new_sd))
916 {
917 msg(M_ERR, "TCP: close socket failed (new_sd)");
918 }
919 freeaddrinfo(ai);
920 }
921 else
922 {
923 if (ai)
924 {
925 freeaddrinfo(ai);
926 }
927 break;
928 }
929 }
931 }
932
933 if (!nowait && openvpn_close_socket(sd))
934 {
935 msg(M_ERR, "TCP: close socket failed (sd)");
936 }
937
939
940 gc_free(&gc);
941 return new_sd;
942}
943
944void
945socket_bind(socket_descriptor_t sd, struct addrinfo *local, int ai_family, const char *prefix,
946 bool ipv6only)
947{
948 struct gc_arena gc = gc_new();
949
950 /* FIXME (schwabe)
951 * getaddrinfo for the bind address might return multiple AF_INET/AF_INET6
952 * entries for the requested protocol.
953 * For example if an address has multiple A records
954 * What is the correct way to deal with it?
955 */
956
957 struct addrinfo *cur;
958
959 ASSERT(local);
960
961
962 /* find the first addrinfo with correct ai_family */
963 for (cur = local; cur; cur = cur->ai_next)
964 {
965 if (cur->ai_family == ai_family)
966 {
967 break;
968 }
969 }
970 if (!cur)
971 {
972 msg(M_FATAL, "%s: Socket bind failed: Addr to bind has no %s record", prefix,
973 addr_family_name(ai_family));
974 }
975
976 if (ai_family == AF_INET6)
977 {
978 int v6only = ipv6only ? 1 : 0; /* setsockopt must have an "int" */
979
980 msg(M_INFO, "setsockopt(IPV6_V6ONLY=%d)", v6only);
981 if (setsockopt(sd, IPPROTO_IPV6, IPV6_V6ONLY, (void *)&v6only, sizeof(v6only)))
982 {
983 msg(M_NONFATAL | M_ERRNO, "Setting IPV6_V6ONLY=%d failed", v6only);
984 }
985 }
986 if (openvpn_bind(sd, cur->ai_addr, cur->ai_addrlen))
987 {
988 msg(M_FATAL | M_ERRNO, "%s: Socket bind failed on local address %s", prefix,
989 print_sockaddr_ex(local->ai_addr, ":", PS_SHOW_PORT, &gc));
990 }
991 gc_free(&gc);
992}
993
994int
995openvpn_connect(socket_descriptor_t sd, const struct sockaddr *remote, int connect_timeout,
996 volatile int *signal_received)
997{
998 int status = 0;
999
1000#ifdef TARGET_ANDROID
1001 protect_fd_nonlocal(sd, remote);
1002#endif
1003 set_nonblock(sd);
1004 status = connect(sd, remote, af_addr_size(remote->sa_family));
1005 if (status)
1006 {
1008 }
1009 if (
1010#ifdef _WIN32
1011 status == WSAEWOULDBLOCK
1012#else
1013 status == EINPROGRESS
1014#endif
1015 )
1016 {
1017 while (true)
1018 {
1019#if POLL
1020 struct pollfd fds[1];
1021 fds[0].fd = sd;
1022 fds[0].events = POLLOUT;
1023 status = poll(fds, 1, (connect_timeout > 0) ? 1000 : 0);
1024#else
1025 fd_set writes;
1026 struct timeval tv;
1027
1028 FD_ZERO(&writes);
1029 openvpn_fd_set(sd, &writes);
1030 tv.tv_sec = (connect_timeout > 0) ? 1 : 0;
1031 tv.tv_usec = 0;
1032
1033 status = openvpn_select(sd + 1, NULL, &writes, NULL, &tv);
1034#endif
1035 if (signal_received)
1036 {
1037 get_signal(signal_received);
1038 if (*signal_received)
1039 {
1040 status = 0;
1041 break;
1042 }
1043 }
1044 if (status < 0)
1045 {
1047 break;
1048 }
1049 if (status <= 0)
1050 {
1051 if (--connect_timeout < 0)
1052 {
1053#ifdef _WIN32
1054 status = WSAETIMEDOUT;
1055#else
1056 status = ETIMEDOUT;
1057#endif
1058 break;
1059 }
1061 continue;
1062 }
1063
1064 /* got it */
1065 {
1066 int val = 0;
1067 socklen_t len;
1068
1069 len = sizeof(val);
1070 if (getsockopt(sd, SOL_SOCKET, SO_ERROR, (void *)&val, &len) == 0
1071 && len == sizeof(val))
1072 {
1073 status = val;
1074 }
1075 else
1076 {
1078 }
1079 break;
1080 }
1081 }
1082 }
1083
1084 return status;
1085}
1086
1087void
1088set_actual_address(struct link_socket_actual *actual, struct addrinfo *ai)
1089{
1090 CLEAR(*actual);
1091 ASSERT(ai);
1092
1093 if (ai->ai_family == AF_INET)
1094 {
1095 actual->dest.addr.in4 = *((struct sockaddr_in *)ai->ai_addr);
1096 }
1097 else if (ai->ai_family == AF_INET6)
1098 {
1099 actual->dest.addr.in6 = *((struct sockaddr_in6 *)ai->ai_addr);
1100 }
1101 else
1102 {
1103 ASSERT(0);
1104 }
1105}
1106
1107static void
1108socket_connect(socket_descriptor_t *sd, const struct sockaddr *dest, const int connect_timeout,
1109 struct signal_info *sig_info)
1110{
1111 struct gc_arena gc = gc_new();
1112 int status;
1113
1114 msg(M_INFO, "Attempting to establish TCP connection with %s", print_sockaddr(dest, &gc));
1115
1116#ifdef ENABLE_MANAGEMENT
1117 if (management)
1118 {
1119 management_set_state(management, OPENVPN_STATE_TCP_CONNECT, NULL, NULL, NULL, NULL, NULL);
1120 }
1121#endif
1122
1123 /* Set the actual address */
1124 status = openvpn_connect(*sd, dest, connect_timeout, &sig_info->signal_received);
1125
1126 get_signal(&sig_info->signal_received);
1127 if (sig_info->signal_received)
1128 {
1129 goto done;
1130 }
1131
1132 if (status)
1133 {
1134 msg(D_LINK_ERRORS, "TCP: connect to %s failed: %s", print_sockaddr(dest, &gc),
1135 strerror(status));
1136
1138 *sd = SOCKET_UNDEFINED;
1139 register_signal(sig_info, SIGUSR1, "connection-failed");
1140 }
1141 else
1142 {
1143 msg(M_INFO, "TCP connection established with %s", print_sockaddr(dest, &gc));
1144 }
1145
1146done:
1147 gc_free(&gc);
1148}
1149
1150/*
1151 * Stream buffer handling prototypes -- stream_buf is a helper class
1152 * to assist in the packetization of stream transport protocols
1153 * such as TCP.
1154 */
1155
1156static void stream_buf_init(struct stream_buf *sb, struct buffer *buf, const unsigned int sockflags,
1157 const int proto);
1158
1159static void stream_buf_close(struct stream_buf *sb);
1160
1161static bool stream_buf_added(struct stream_buf *sb, int length_added);
1162
1163/* For stream protocols, allocate a buffer to build up packet.
1164 * Called after frame has been finalized. */
1165
1166static void
1167socket_frame_init(const struct frame *frame, struct link_socket *sock)
1168{
1169#ifdef _WIN32
1170 overlapped_io_init(&sock->reads, frame, FALSE);
1171 overlapped_io_init(&sock->writes, frame, TRUE);
1172 sock->rw_handle.read = sock->reads.overlapped.hEvent;
1173 sock->rw_handle.write = sock->writes.overlapped.hEvent;
1174#endif
1175
1177 {
1178#ifdef _WIN32
1179 stream_buf_init(&sock->stream_buf, &sock->reads.buf_init, sock->sockflags,
1180 sock->info.proto);
1181#else
1183
1185 sock->info.proto);
1186#endif
1187 }
1188}
1189
1190#if defined(__GNUC__) || defined(__clang__)
1191#pragma GCC diagnostic push
1192#pragma GCC diagnostic ignored "-Wconversion"
1193#endif
1194
1195static void
1197{
1198 struct gc_arena gc = gc_new();
1199
1200 /* resolve local address if undefined */
1201 if (!sock->info.lsa->bind_local)
1202 {
1204 int status;
1205
1206 if (proto_is_dgram(sock->info.proto))
1207 {
1208 flags |= GETADDR_DATAGRAM;
1209 }
1210
1211 /* will return AF_{INET|INET6}from local_host */
1212 status = get_cached_dns_entry(sock->dns_cache, sock->local_host, sock->local_port, af,
1213 flags, &sock->info.lsa->bind_local);
1214
1215 if (status)
1216 {
1217 status = openvpn_getaddrinfo(flags, sock->local_host, sock->local_port, 0, NULL, af,
1218 &sock->info.lsa->bind_local);
1219 }
1220
1221 if (status != 0)
1222 {
1223 msg(M_FATAL, "getaddrinfo() failed for local \"%s:%s\": %s", sock->local_host,
1224 sock->local_port, gai_strerror(status));
1225 }
1226
1227 /* the address family returned by openvpn_getaddrinfo() should be
1228 * taken into consideration only if we really passed an hostname
1229 * to resolve. Otherwise its value is not useful to us and may
1230 * actually break our socket, i.e. when it returns AF_INET
1231 * but our remote is v6 only.
1232 */
1233 if (sock->local_host)
1234 {
1235 /* the resolved 'local entry' might have a different family than
1236 * what was globally configured
1237 */
1238 sock->info.af = sock->info.lsa->bind_local->ai_family;
1239 }
1240 }
1241
1242 gc_free(&gc);
1243}
1244
1245static void
1246resolve_remote(struct link_socket *sock, int phase, const char **remote_dynamic,
1247 struct signal_info *sig_info)
1248{
1249 volatile int *signal_received = sig_info ? &sig_info->signal_received : NULL;
1250 struct gc_arena gc = gc_new();
1251
1252 /* resolve remote address if undefined */
1253 if (!sock->info.lsa->remote_list)
1254 {
1255 if (sock->remote_host)
1256 {
1257 unsigned int flags =
1259 int retry = 0;
1260 int status = -1;
1261 struct addrinfo *ai;
1262 if (proto_is_dgram(sock->info.proto))
1263 {
1264 flags |= GETADDR_DATAGRAM;
1265 }
1266
1268 {
1269 if (phase == 2)
1270 {
1271 flags |= (GETADDR_TRY_ONCE | GETADDR_FATAL);
1272 }
1273 retry = 0;
1274 }
1275 else if (phase == 1)
1276 {
1277 if (sock->resolve_retry_seconds)
1278 {
1279 retry = 0;
1280 }
1281 else
1282 {
1284 retry = 0;
1285 }
1286 }
1287 else if (phase == 2)
1288 {
1289 if (sock->resolve_retry_seconds)
1290 {
1291 flags |= GETADDR_FATAL;
1292 retry = sock->resolve_retry_seconds;
1293 }
1294 else
1295 {
1296 ASSERT(0);
1297 }
1298 }
1299 else
1300 {
1301 ASSERT(0);
1302 }
1303
1304
1306 sock->info.af, flags, &ai);
1307 if (status)
1308 {
1309 status = openvpn_getaddrinfo(flags, sock->remote_host, sock->remote_port, retry,
1310 sig_info, sock->info.af, &ai);
1311 }
1312
1313 if (status == 0)
1314 {
1315 sock->info.lsa->remote_list = ai;
1316 sock->info.lsa->current_remote = ai;
1317
1318 dmsg(D_SOCKET_DEBUG, "RESOLVE_REMOTE flags=0x%04x phase=%d rrs=%d sig=%d status=%d",
1319 flags, phase, retry, signal_received ? *signal_received : -1, status);
1320 }
1321 if (signal_received && *signal_received)
1322 {
1323 goto done;
1324 }
1325 if (status != 0)
1326 {
1327 if (signal_received)
1328 {
1329 /* potential overwrite of signal */
1330 register_signal(sig_info, SIGUSR1, "socks-resolve-failure");
1331 }
1332 goto done;
1333 }
1334 }
1335 }
1336
1337 /* should we re-use previous active remote address? */
1339 {
1340 msg(M_INFO, "TCP/UDP: Preserving recently used remote address: %s",
1342 if (remote_dynamic)
1343 {
1344 *remote_dynamic = NULL;
1345 }
1346 }
1347 else
1348 {
1349 CLEAR(sock->info.lsa->actual);
1350 if (sock->info.lsa->current_remote)
1351 {
1353 }
1354 }
1355
1356done:
1357 gc_free(&gc);
1358}
1359
1360
1361struct link_socket *
1363{
1364 struct link_socket *sock;
1365
1366 ALLOC_OBJ_CLEAR(sock, struct link_socket);
1367 sock->sd = SOCKET_UNDEFINED;
1368 sock->ctrl_sd = SOCKET_UNDEFINED;
1370 sock->ev_arg.u.sock = sock;
1371
1372 return sock;
1373}
1374
1375void
1376link_socket_init_phase1(struct context *c, int sock_index, int mode)
1377{
1378 struct link_socket *sock = c->c2.link_sockets[sock_index];
1379 struct options *o = &c->options;
1380 ASSERT(sock);
1381
1382 const char *host = o->ce.local_list->array[sock_index]->local;
1383 const char *port = o->ce.local_list->array[sock_index]->port;
1384 int proto = o->ce.local_list->array[sock_index]->proto;
1385 const char *remote_host = o->ce.remote;
1386 const char *remote_port = o->ce.remote_port;
1387
1388 if (remote_host)
1389 {
1390 proto = o->ce.proto;
1391 }
1392
1393 if (c->mode == CM_CHILD_TCP || c->mode == CM_CHILD_UDP)
1394 {
1395 struct link_socket *tmp_sock = NULL;
1396 if (c->mode == CM_CHILD_TCP)
1397 {
1398 tmp_sock = (struct link_socket *)c->c2.accept_from;
1399 }
1400 else if (c->mode == CM_CHILD_UDP)
1401 {
1402 tmp_sock = c->c2.link_sockets[0];
1403 }
1404
1405 host = tmp_sock->local_host;
1406 port = tmp_sock->local_port;
1407 proto = tmp_sock->info.proto;
1408 }
1409
1410 sock->local_host = host;
1411 sock->local_port = port;
1412 sock->remote_host = remote_host;
1413 sock->remote_port = remote_port;
1414 sock->dns_cache = c->c1.dns_cache;
1415 sock->http_proxy = c->c1.http_proxy;
1416 sock->socks_proxy = c->c1.socks_proxy;
1417 sock->bind_local = o->ce.bind_local;
1420
1421#ifdef ENABLE_DEBUG
1422 sock->gremlin = o->gremlin;
1423#endif
1424
1427
1428 sock->sockflags = o->sockflags;
1429
1430#if PORT_SHARE
1431 if (o->port_share_host && o->port_share_port)
1432 {
1433 sock->sockflags |= SF_PORT_SHARE;
1434 }
1435#endif
1436
1437 sock->mark = o->mark;
1438 sock->bind_dev = o->bind_dev;
1439 sock->info.proto = proto;
1440 sock->info.af = o->ce.af;
1441 sock->info.remote_float = o->ce.remote_float;
1442 sock->info.lsa = &c->c1.link_socket_addrs[sock_index];
1444 sock->info.ipchange_command = o->ipchange;
1445 sock->info.plugins = c->plugins;
1447
1448 sock->mode = mode;
1450 {
1451 ASSERT(c->c2.accept_from);
1453 sock->sd = c->c2.accept_from->sd;
1454 /* inherit (possibly guessed) info AF from parent context */
1455 sock->info.af = c->c2.accept_from->info.af;
1456 }
1457
1458 /* are we running in HTTP proxy mode? */
1459 if (sock->http_proxy)
1460 {
1462
1463 /* the proxy server */
1465 sock->remote_port = c->c1.http_proxy->options.port;
1466
1467 /* the OpenVPN server we will use the proxy to connect to */
1470 }
1471 /* or in Socks proxy mode? */
1472 else if (sock->socks_proxy)
1473 {
1474 /* the proxy server */
1475 sock->remote_host = c->c1.socks_proxy->server;
1476 sock->remote_port = c->c1.socks_proxy->port;
1477
1478 /* the OpenVPN server we will use the proxy to connect to */
1481 }
1482 else
1483 {
1484 sock->remote_host = remote_host;
1485 sock->remote_port = remote_port;
1486 }
1487
1488 /* bind behavior for TCP server vs. client */
1489 if (sock->info.proto == PROTO_TCP_SERVER)
1490 {
1491 if (sock->mode == LS_MODE_TCP_ACCEPT_FROM)
1492 {
1493 sock->bind_local = false;
1494 }
1495 else
1496 {
1497 sock->bind_local = true;
1498 }
1499 }
1500
1502 {
1503 if (sock->bind_local)
1504 {
1505 resolve_bind_local(sock, sock->info.af);
1506 }
1507 resolve_remote(sock, 1, NULL, NULL);
1508 }
1509}
1510
1511static void
1513{
1514 /* set misc socket parameters */
1515 socket_set_flags(sock->sd, sock->sockflags);
1516
1517 /* set socket to non-blocking mode */
1518 set_nonblock(sock->sd);
1519
1520 /* set Path MTU discovery options on the socket */
1521 set_mtu_discover_type(sock->sd, sock->mtu_discover_type, sock->info.af);
1522
1523#if EXTENDED_SOCKET_ERROR_CAPABILITY
1524 /* if the OS supports it, enable extended error passing on the socket */
1525 set_sock_extended_error_passing(sock->sd, sock->info.af);
1526#endif
1527}
1528
1529
1530static void
1532{
1533 struct gc_arena gc = gc_new();
1534 const msglvl_t msglevel = (sock->mode == LS_MODE_TCP_ACCEPT_FROM) ? D_INIT_MEDIUM : M_INFO;
1535
1536 /* print local address */
1537 if (sock->bind_local)
1538 {
1539 sa_family_t ai_family = sock->info.lsa->actual.dest.addr.sa.sa_family;
1540 /* Socket is always bound on the first matching address,
1541 * For bound sockets with no remote addr this is the element of
1542 * the list */
1543 struct addrinfo *cur;
1544 for (cur = sock->info.lsa->bind_local; cur; cur = cur->ai_next)
1545 {
1546 if (!ai_family || ai_family == cur->ai_family)
1547 {
1548 break;
1549 }
1550 }
1551 ASSERT(cur);
1552 msg(msglevel, "%s link local (bound): %s",
1553 proto2ascii(sock->info.proto, sock->info.af, true), print_sockaddr(cur->ai_addr, &gc));
1554 }
1555 else
1556 {
1557 msg(msglevel, "%s link local: (not bound)",
1558 proto2ascii(sock->info.proto, sock->info.af, true));
1559 }
1560
1561 /* print active remote address */
1562 msg(msglevel, "%s link remote: %s", proto2ascii(sock->info.proto, sock->info.af, true),
1564 gc_free(&gc);
1565}
1566
1567static void
1568phase2_tcp_server(struct link_socket *sock, const char *remote_dynamic,
1569 struct signal_info *sig_info)
1570{
1571 ASSERT(sig_info);
1572 volatile int *signal_received = &sig_info->signal_received;
1573 switch (sock->mode)
1574 {
1575 case LS_MODE_DEFAULT:
1576 sock->sd =
1577 socket_listen_accept(sock->sd, &sock->info.lsa->actual, remote_dynamic,
1578 sock->info.lsa->bind_local, true, false, signal_received);
1579 break;
1580
1581 case LS_MODE_TCP_LISTEN:
1582 socket_do_listen(sock->sd, sock->info.lsa->bind_local, true, false);
1583 break;
1584
1586 sock->sd = socket_do_accept(sock->sd, &sock->info.lsa->actual, false);
1587 if (!socket_defined(sock->sd))
1588 {
1589 register_signal(sig_info, SIGTERM, "socket-undefined");
1590 return;
1591 }
1593 break;
1594
1595 default:
1596 ASSERT(0);
1597 }
1598}
1599
1600
1601static void
1602phase2_tcp_client(struct link_socket *sock, struct signal_info *sig_info)
1603{
1604 bool proxy_retry = false;
1605 do
1606 {
1607 socket_connect(&sock->sd, sock->info.lsa->current_remote->ai_addr,
1609
1610 if (sig_info->signal_received)
1611 {
1612 return;
1613 }
1614
1615 if (sock->http_proxy)
1616 {
1617 proxy_retry = establish_http_proxy_passthru(
1618 sock->http_proxy, sock->sd, sock->proxy_dest_host, sock->proxy_dest_port,
1619 sock->server_poll_timeout, &sock->stream_buf.residual, sig_info);
1620 }
1621 else if (sock->socks_proxy)
1622 {
1625 sig_info);
1626 }
1627 if (proxy_retry)
1628 {
1629 openvpn_close_socket(sock->sd);
1630 sock->sd = create_socket_tcp(sock->info.lsa->current_remote);
1631 }
1632
1633 } while (proxy_retry);
1634}
1635
1636static void
1637phase2_socks_client(struct link_socket *sock, struct signal_info *sig_info)
1638{
1639 socket_connect(&sock->ctrl_sd, sock->info.lsa->current_remote->ai_addr,
1641
1642 if (sig_info->signal_received)
1643 {
1644 return;
1645 }
1646
1648 sock->server_poll_timeout, sig_info);
1649
1650 if (sig_info->signal_received)
1651 {
1652 return;
1653 }
1654
1655 sock->remote_host = sock->proxy_dest_host;
1656 sock->remote_port = sock->proxy_dest_port;
1657
1659 if (sock->info.lsa->remote_list)
1660 {
1661 freeaddrinfo(sock->info.lsa->remote_list);
1662 sock->info.lsa->current_remote = NULL;
1663 sock->info.lsa->remote_list = NULL;
1664 }
1665
1666 resolve_remote(sock, 1, NULL, sig_info);
1667}
1668
1669#if defined(_WIN32)
1670static void
1671create_socket_dco_win(struct context *c, struct link_socket *sock, struct signal_info *sig_info)
1672{
1673 /* in P2P mode we must have remote resolved at this point */
1674 struct addrinfo *remoteaddr = sock->info.lsa->current_remote;
1675 if ((c->options.mode == MODE_POINT_TO_POINT) && (!remoteaddr))
1676 {
1677 return;
1678 }
1679
1680 if (!c->c1.tuntap)
1681 {
1682 struct tuntap *tt;
1683 ALLOC_OBJ_CLEAR(tt, struct tuntap);
1684
1687
1688 const char *device_guid = NULL; /* not used */
1689 tun_open_device(tt, c->options.dev_node, &device_guid, &c->gc);
1690
1691 /* Ensure we can "safely" cast the handle to a socket */
1692 static_assert(sizeof(sock->sd) == sizeof(tt->hand), "HANDLE and SOCKET size differs");
1693
1694 c->c1.tuntap = tt;
1695 }
1696
1697 if (c->options.mode == MODE_SERVER)
1698 {
1699 dco_mp_start_vpn(c->c1.tuntap->hand, sock);
1700 }
1701 else
1702 {
1703 dco_p2p_new_peer(c->c1.tuntap->hand, &c->c1.tuntap->dco_new_peer_ov, sock, sig_info);
1704 }
1705 sock->sockflags |= SF_DCO_WIN;
1706
1707 if (sig_info->signal_received)
1708 {
1709 return;
1710 }
1711
1712 sock->sd = (SOCKET)c->c1.tuntap->hand;
1713 linksock_print_addr(sock);
1714}
1715#endif /* if defined(_WIN32) */
1716
1717/* finalize socket initialization */
1718void
1720{
1721 const struct frame *frame = &c->c2.frame;
1722 struct signal_info *sig_info = c->sig;
1723
1724 const char *remote_dynamic = NULL;
1725 struct signal_info sig_save = { 0 };
1726
1727 ASSERT(sock);
1728 ASSERT(sig_info);
1729
1730 if (sig_info->signal_received)
1731 {
1732 sig_save = *sig_info;
1733 sig_save.signal_received = signal_reset(sig_info, 0);
1734 }
1735
1736 /* initialize buffers */
1737 socket_frame_init(frame, sock);
1738
1739 /*
1740 * Pass a remote name to connect/accept so that
1741 * they can test for dynamic IP address changes
1742 * and throw a SIGUSR1 if appropriate.
1743 */
1744 if (sock->resolve_retry_seconds)
1745 {
1746 remote_dynamic = sock->remote_host;
1747 }
1748
1749 /* Second chance to resolv/create socket */
1750 resolve_remote(sock, 2, &remote_dynamic, sig_info);
1751
1752 /* If a valid remote has been found, create the socket with its addrinfo */
1753#if defined(_WIN32)
1754 if (dco_enabled(&c->options))
1755 {
1756 create_socket_dco_win(c, sock, sig_info);
1757 goto done;
1758 }
1759#endif
1760 if (sock->info.lsa->current_remote)
1761 {
1762 create_socket(sock, sock->info.lsa->current_remote);
1763 }
1764
1765 /* If socket has not already been created create it now */
1766 if (sock->sd == SOCKET_UNDEFINED)
1767 {
1768 /* If we have no --remote and have still not figured out the
1769 * protocol family to use we will use the first of the bind */
1770
1771 if (sock->bind_local && !sock->remote_host && sock->info.lsa->bind_local)
1772 {
1773 /* Warn if this is because neither v4 or v6 was specified
1774 * and we should not connect a remote */
1775 if (sock->info.af == AF_UNSPEC)
1776 {
1777 msg(M_WARN, "Could not determine IPv4/IPv6 protocol. Using %s",
1778 addr_family_name(sock->info.lsa->bind_local->ai_family));
1779 sock->info.af = sock->info.lsa->bind_local->ai_family;
1780 }
1781 create_socket(sock, sock->info.lsa->bind_local);
1782 }
1783 }
1784
1785 /* Socket still undefined, give a warning and abort connection */
1786 if (sock->sd == SOCKET_UNDEFINED)
1787 {
1788 msg(M_WARN, "Could not determine IPv4/IPv6 protocol");
1789 register_signal(sig_info, SIGUSR1, "Could not determine IPv4/IPv6 protocol");
1790 goto done;
1791 }
1792
1793 if (sig_info->signal_received)
1794 {
1795 goto done;
1796 }
1797
1798 if (sock->info.proto == PROTO_TCP_SERVER)
1799 {
1800 phase2_tcp_server(sock, remote_dynamic, sig_info);
1801 }
1802 else if (sock->info.proto == PROTO_TCP_CLIENT)
1803 {
1804 phase2_tcp_client(sock, sig_info);
1805 }
1806 else if (sock->info.proto == PROTO_UDP && sock->socks_proxy)
1807 {
1808 phase2_socks_client(sock, sig_info);
1809 }
1810#ifdef TARGET_ANDROID
1811 if (sock->sd != -1)
1812 {
1813 protect_fd_nonlocal(sock->sd, &sock->info.lsa->actual.dest.addr.sa);
1814 }
1815#endif
1816 if (sig_info->signal_received)
1817 {
1818 goto done;
1819 }
1820
1822 linksock_print_addr(sock);
1823
1824done:
1825 if (sig_save.signal_received)
1826 {
1827 /* Always restore the saved signal -- register/throw_signal will handle priority */
1828 if (sig_save.source == SIG_SOURCE_HARD && sig_info == &siginfo_static)
1829 {
1830 throw_signal(sig_save.signal_received);
1831 }
1832 else
1833 {
1834 register_signal(sig_info, sig_save.signal_received, sig_save.signal_text);
1835 }
1836 }
1837}
1838
1839void
1841{
1842 if (sock)
1843 {
1844#ifdef ENABLE_DEBUG
1845 const int gremlin = GREMLIN_CONNECTION_FLOOD_LEVEL(sock->gremlin);
1846#else
1847 const int gremlin = 0;
1848#endif
1849
1850 if (socket_defined(sock->sd))
1851 {
1852#ifdef _WIN32
1853 close_net_event_win32(&sock->listen_handle, sock->sd, 0);
1854#endif
1855 if (!gremlin)
1856 {
1857 msg(D_LOW, "TCP/UDP: Closing socket");
1858 if (openvpn_close_socket(sock->sd))
1859 {
1860 msg(M_WARN | M_ERRNO, "TCP/UDP: Close Socket failed");
1861 }
1862 }
1863 sock->sd = SOCKET_UNDEFINED;
1864#ifdef _WIN32
1865 if (!gremlin)
1866 {
1867 overlapped_io_close(&sock->reads);
1869 }
1870#endif
1871 }
1872
1873 if (socket_defined(sock->ctrl_sd))
1874 {
1875 if (openvpn_close_socket(sock->ctrl_sd))
1876 {
1877 msg(M_WARN | M_ERRNO, "TCP/UDP: Close Socket (ctrl_sd) failed");
1878 }
1879 sock->ctrl_sd = SOCKET_UNDEFINED;
1880 }
1881
1883 free_buf(&sock->stream_buf_data);
1884 if (!gremlin)
1885 {
1886 free(sock);
1887 }
1888 }
1889}
1890
1891void
1892setenv_trusted(struct env_set *es, const struct link_socket_info *info)
1893{
1894 setenv_link_socket_actual(es, "trusted", &info->lsa->actual, SA_IP_PORT);
1895}
1896
1897static void
1898ipchange_fmt(const bool include_cmd, struct argv *argv, const struct link_socket_info *info,
1899 struct gc_arena *gc)
1900{
1901 const char *host = print_sockaddr_ex(&info->lsa->actual.dest.addr.sa, " ", PS_SHOW_PORT, gc);
1902 if (include_cmd)
1903 {
1905 argv_printf_cat(argv, "%s", host);
1906 }
1907 else
1908 {
1909 argv_printf(argv, "%s", host);
1910 }
1911}
1912
1913void
1915 const struct link_socket_actual *act, const char *common_name,
1916 struct env_set *es)
1917{
1918 struct gc_arena gc = gc_new();
1919
1920 info->lsa->actual = *act; /* Note: skip this line for --force-dest */
1921 setenv_trusted(es, info);
1922 info->connection_established = true;
1923
1924 /* Print connection initiated message, with common name if available */
1925 {
1926 struct buffer out = alloc_buf_gc(256, &gc);
1927 if (common_name)
1928 {
1929 buf_printf(&out, "[%s] ", common_name);
1930 }
1931 buf_printf(&out, "Peer Connection Initiated with %s",
1933 msg(M_INFO, "%s", BSTR(&out));
1934 }
1935
1936 /* set environmental vars */
1937 setenv_str(es, "common_name", common_name);
1938
1939 /* Process --ipchange plugin */
1941 {
1942 struct argv argv = argv_new();
1943 ipchange_fmt(false, &argv, info, &gc);
1944 if (plugin_call(info->plugins, OPENVPN_PLUGIN_IPCHANGE, &argv, NULL, es)
1945 != OPENVPN_PLUGIN_FUNC_SUCCESS)
1946 {
1947 msg(M_WARN, "WARNING: ipchange plugin call failed");
1948 }
1949 argv_free(&argv);
1950 }
1951
1952 /* Process --ipchange option */
1953 if (info->ipchange_command)
1954 {
1955 struct argv argv = argv_new();
1956 setenv_str(es, "script_type", "ipchange");
1957 ipchange_fmt(true, &argv, info, &gc);
1958 openvpn_run_script(&argv, es, 0, "--ipchange");
1959 argv_free(&argv);
1960 }
1961
1962 gc_free(&gc);
1963}
1964
1965void
1967 const struct link_socket_actual *from_addr)
1968{
1969 struct gc_arena gc = gc_new();
1970 struct addrinfo *ai;
1971
1972 switch (from_addr->dest.addr.sa.sa_family)
1973 {
1974 case AF_INET:
1975 case AF_INET6:
1977 "TCP/UDP: Incoming packet rejected from %s[%d], expected peer address: %s (allow this incoming source address/port by removing --remote or adding --float)",
1978 print_link_socket_actual(from_addr, &gc), (int)from_addr->dest.addr.sa.sa_family,
1979 print_sockaddr_ex(info->lsa->remote_list->ai_addr, ":", PS_SHOW_PORT, &gc));
1980 /* print additional remote addresses */
1981 for (ai = info->lsa->remote_list->ai_next; ai; ai = ai->ai_next)
1982 {
1983 msg(D_LINK_ERRORS, "or from peer address: %s",
1984 print_sockaddr_ex(ai->ai_addr, ":", PS_SHOW_PORT, &gc));
1985 }
1986 break;
1987 }
1988 buf->len = 0;
1989 gc_free(&gc);
1990}
1991
1992void
1994{
1995 dmsg(D_READ_WRITE, "TCP/UDP: No outgoing address to send packet");
1996}
1997
1998in_addr_t
2000{
2001 const struct link_socket_addr *lsa = info->lsa;
2002
2003 /*
2004 * This logic supports "redirect-gateway" semantic, which
2005 * makes sense only for PF_INET routes over PF_INET endpoints
2006 *
2007 * Maybe in the future consider PF_INET6 endpoints also ...
2008 * by now just ignore it
2009 *
2010 * For --remote entries with multiple addresses this
2011 * only return the actual endpoint we have successfully connected to
2012 */
2013 if (lsa->actual.dest.addr.sa.sa_family != AF_INET)
2014 {
2015 return IPV4_INVALID_ADDR;
2016 }
2017
2019 {
2020 return ntohl(lsa->actual.dest.addr.in4.sin_addr.s_addr);
2021 }
2022 else if (lsa->current_remote)
2023 {
2024 return ntohl(((struct sockaddr_in *)lsa->current_remote->ai_addr)->sin_addr.s_addr);
2025 }
2026 else
2027 {
2028 return 0;
2029 }
2030}
2031
2032const struct in6_addr *
2034{
2035 const struct link_socket_addr *lsa = info->lsa;
2036
2037 /* This logic supports "redirect-gateway" semantic,
2038 * for PF_INET6 routes over PF_INET6 endpoints
2039 *
2040 * For --remote entries with multiple addresses this
2041 * only return the actual endpoint we have successfully connected to
2042 */
2043 if (lsa->actual.dest.addr.sa.sa_family != AF_INET6)
2044 {
2045 return NULL;
2046 }
2047
2049 {
2050 return &(lsa->actual.dest.addr.in6.sin6_addr);
2051 }
2052 else if (lsa->current_remote)
2053 {
2054 return &(((struct sockaddr_in6 *)lsa->current_remote->ai_addr)->sin6_addr);
2055 }
2056 else
2057 {
2058 return NULL;
2059 }
2060}
2061
2062/*
2063 * Return a status string describing socket state.
2064 */
2065const char *
2066socket_stat(const struct link_socket *s, unsigned int rwflags, struct gc_arena *gc)
2067{
2068 struct buffer out = alloc_buf_gc(64, gc);
2069 if (s)
2070 {
2071 if (rwflags & EVENT_READ)
2072 {
2073 buf_printf(&out, "S%s", (s->rwflags_debug & EVENT_READ) ? "R" : "r");
2074#ifdef _WIN32
2075 buf_printf(&out, "%s", overlapped_io_state_ascii(&s->reads));
2076#endif
2077 }
2078 if (rwflags & EVENT_WRITE)
2079 {
2080 buf_printf(&out, "S%s", (s->rwflags_debug & EVENT_WRITE) ? "W" : "w");
2081#ifdef _WIN32
2083#endif
2084 }
2085 }
2086 else
2087 {
2088 buf_printf(&out, "S?");
2089 }
2090 return BSTR(&out);
2091}
2092
2093/*
2094 * Stream buffer functions, used to packetize a TCP
2095 * stream connection.
2096 */
2097
2098static inline void
2100{
2101 dmsg(D_STREAM_DEBUG, "STREAM: RESET");
2102 sb->residual_fully_formed = false;
2103 sb->buf = sb->buf_init;
2104 buf_reset(&sb->next);
2105 sb->len = -1;
2106}
2107
2108static void
2109stream_buf_init(struct stream_buf *sb, struct buffer *buf, const unsigned int sockflags,
2110 const int proto)
2111{
2112 sb->buf_init = *buf;
2113 sb->maxlen = sb->buf_init.len;
2114 sb->buf_init.len = 0;
2115 sb->residual = alloc_buf(sb->maxlen);
2116 sb->error = false;
2117#if PORT_SHARE
2118 sb->port_share_state =
2119 ((sockflags & SF_PORT_SHARE) && (proto == PROTO_TCP_SERVER)) ? PS_ENABLED : PS_DISABLED;
2120#endif
2122
2123 dmsg(D_STREAM_DEBUG, "STREAM: INIT maxlen=%d", sb->maxlen);
2124}
2125
2126static inline void
2128{
2129 /* set up 'next' for next i/o read */
2130 sb->next = sb->buf;
2131 sb->next.offset = sb->buf.offset + sb->buf.len;
2132 sb->next.len = (sb->len >= 0 ? sb->len : sb->maxlen) - sb->buf.len;
2133 dmsg(D_STREAM_DEBUG, "STREAM: SET NEXT, buf=[%d,%d] next=[%d,%d] len=%d maxlen=%d",
2134 sb->buf.offset, sb->buf.len, sb->next.offset, sb->next.len, sb->len, sb->maxlen);
2135 ASSERT(sb->next.len > 0);
2136 ASSERT(buf_safe(&sb->buf, sb->next.len));
2137}
2138
2139static inline void
2141{
2142 dmsg(D_STREAM_DEBUG, "STREAM: GET FINAL len=%d", buf_defined(&sb->buf) ? sb->buf.len : -1);
2143 ASSERT(buf_defined(&sb->buf));
2144 *buf = sb->buf;
2145}
2146
2147static inline void
2149{
2150 dmsg(D_STREAM_DEBUG, "STREAM: GET NEXT len=%d", buf_defined(&sb->next) ? sb->next.len : -1);
2151 ASSERT(buf_defined(&sb->next));
2152 *buf = sb->next;
2153}
2154
2155bool
2157{
2159 {
2161 ASSERT(buf_init(&sock->stream_buf.residual, 0));
2163 dmsg(D_STREAM_DEBUG, "STREAM: RESIDUAL FULLY FORMED [%s], len=%d",
2164 sock->stream_buf.residual_fully_formed ? "YES" : "NO", sock->stream_buf.residual.len);
2165 }
2166
2168 {
2170 }
2171 return !sock->stream_buf.residual_fully_formed;
2172}
2173
2174static bool
2176{
2177 dmsg(D_STREAM_DEBUG, "STREAM: ADD length_added=%d", length_added);
2178 if (length_added > 0)
2179 {
2180 sb->buf.len += length_added;
2181 }
2182
2183 /* if length unknown, see if we can get the length prefix from
2184 * the head of the buffer */
2185 if (sb->len < 0 && sb->buf.len >= (int)sizeof(packet_size_type))
2186 {
2188
2189#if PORT_SHARE
2190 if (sb->port_share_state == PS_ENABLED)
2191 {
2192 if (!is_openvpn_protocol(&sb->buf))
2193 {
2194 msg(D_STREAM_ERRORS, "Non-OpenVPN client protocol detected");
2195 sb->port_share_state = PS_FOREIGN;
2196 sb->error = true;
2197 return false;
2198 }
2199 else
2200 {
2201 sb->port_share_state = PS_DISABLED;
2202 }
2203 }
2204#endif
2205
2206 ASSERT(buf_read(&sb->buf, &net_size, sizeof(net_size)));
2207 sb->len = ntohps(net_size);
2208
2209 if (sb->len < 1 || sb->len > sb->maxlen)
2210 {
2211 msg(M_WARN,
2212 "WARNING: Bad encapsulated packet length from peer (%d), which must be > 0 and <= %d -- please ensure that --tun-mtu or --link-mtu is equal on both peers -- this condition could also indicate a possible active attack on the TCP link -- [Attempting restart...]",
2213 sb->len, sb->maxlen);
2215 sb->error = true;
2216 return false;
2217 }
2218 }
2219
2220 /* is our incoming packet fully read? */
2221 if (sb->len > 0 && sb->buf.len >= sb->len)
2222 {
2223 /* save any residual data that's part of the next packet */
2224 ASSERT(buf_init(&sb->residual, 0));
2225 if (sb->buf.len > sb->len)
2226 {
2227 ASSERT(buf_copy_excess(&sb->residual, &sb->buf, sb->len));
2228 }
2229 dmsg(D_STREAM_DEBUG, "STREAM: ADD returned TRUE, buf_len=%d, residual_len=%d",
2230 BLEN(&sb->buf), BLEN(&sb->residual));
2231 return true;
2232 }
2233 else
2234 {
2235 dmsg(D_STREAM_DEBUG, "STREAM: ADD returned FALSE (have=%d need=%d)", sb->buf.len, sb->len);
2237 return false;
2238 }
2239}
2240
2241static void
2243{
2244 free_buf(&sb->residual);
2245}
2246
2247/*
2248 * The listen event is a special event whose sole purpose is
2249 * to tell us that there's a new incoming connection on a
2250 * TCP socket, for use in server mode.
2251 */
2252event_t
2254{
2255#ifdef _WIN32
2257 {
2259 }
2260 return &s->listen_handle;
2261#else /* ifdef _WIN32 */
2262 return s->sd;
2263#endif
2264}
2265
2266
2267/*
2268 * Bad incoming address lengths that differ from what
2269 * we expect are considered to be fatal errors.
2270 */
2271void
2273{
2274 msg(M_FATAL,
2275 "ERROR: received strange incoming packet with an address length of %d -- we only accept address lengths of %d.",
2276 actual, expected);
2277}
2278
2279/*
2280 * Socket Read Routines
2281 */
2282
2283int
2284link_socket_read_tcp(struct link_socket *sock, struct buffer *buf)
2285{
2286 int len = 0;
2287
2289 {
2290 /* with Linux-DCO, we sometimes try to access a socket that is
2291 * already installed in the kernel and has no valid file descriptor
2292 * anymore. This is a bug.
2293 * Handle by resetting client instance instead of crashing.
2294 */
2295 if (sock->sd == SOCKET_UNDEFINED)
2296 {
2297 msg(M_INFO, "BUG: link_socket_read_tcp(): sock->sd==-1, reset client instance");
2298 sock->stream_reset = true; /* reset client instance */
2299 return buf->len = 0; /* nothing to read */
2300 }
2301
2302#ifdef _WIN32
2303 sockethandle_t sh = { .s = sock->sd };
2304 len = sockethandle_finalize(sh, &sock->reads, buf, NULL);
2305#else
2306 struct buffer frag;
2308 len = recv(sock->sd, BPTR(&frag), BLEN(&frag), MSG_NOSIGNAL);
2309#endif
2310
2311 if (!len)
2312 {
2313 sock->stream_reset = true;
2314 }
2315 if (len <= 0)
2316 {
2317 return buf->len = len;
2318 }
2319 }
2320
2322 || stream_buf_added(&sock->stream_buf, len)) /* packet complete? */
2323 {
2324 stream_buf_get_final(&sock->stream_buf, buf);
2326 return buf->len;
2327 }
2328 else
2329 {
2330 return buf->len = 0; /* no error, but packet is still incomplete */
2331 }
2332}
2333
2334#ifndef _WIN32
2335
2336#if ENABLE_IP_PKTINFO
2337
2338/* make the buffer large enough to handle ancillary socket data for
2339 * both IPv4 and IPv6 destination addresses, plus padding (see RFC 2292)
2340 */
2341#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
2342#define PKTINFO_BUF_SIZE \
2343 max_int(CMSG_SPACE(sizeof(struct in6_pktinfo)), CMSG_SPACE(sizeof(struct in_pktinfo)))
2344#else
2345#define PKTINFO_BUF_SIZE \
2346 max_int(CMSG_SPACE(sizeof(struct in6_pktinfo)), CMSG_SPACE(sizeof(struct in_addr)))
2347#endif
2348
2349static socklen_t
2350link_socket_read_udp_posix_recvmsg(struct link_socket *sock, struct buffer *buf,
2351 struct link_socket_actual *from)
2352{
2353 struct iovec iov;
2354 uint8_t pktinfo_buf[PKTINFO_BUF_SIZE];
2355 struct msghdr mesg = { 0 };
2356 socklen_t fromlen = sizeof(from->dest.addr);
2357
2358 ASSERT(sock->sd >= 0); /* can't happen */
2359
2360 iov.iov_base = BPTR(buf);
2361 iov.iov_len = buf_forward_capacity_total(buf);
2362 mesg.msg_iov = &iov;
2363 mesg.msg_iovlen = 1;
2364 mesg.msg_name = &from->dest.addr;
2365 mesg.msg_namelen = fromlen;
2366 mesg.msg_control = pktinfo_buf;
2367 mesg.msg_controllen = sizeof pktinfo_buf;
2368 buf->len = recvmsg(sock->sd, &mesg, 0);
2369 if (buf->len >= 0)
2370 {
2371 struct cmsghdr *cmsg;
2372 fromlen = mesg.msg_namelen;
2373 cmsg = CMSG_FIRSTHDR(&mesg);
2374 if (cmsg != NULL && CMSG_NXTHDR(&mesg, cmsg) == NULL
2375#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
2376 && cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_PKTINFO
2377 && cmsg->cmsg_len >= CMSG_LEN(sizeof(struct in_pktinfo)))
2378#elif defined(IP_RECVDSTADDR)
2379 && cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_RECVDSTADDR
2380 && cmsg->cmsg_len >= CMSG_LEN(sizeof(struct in_addr)))
2381#else /* if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST) */
2382#error ENABLE_IP_PKTINFO is set without IP_PKTINFO xor IP_RECVDSTADDR (fix syshead.h)
2383#endif
2384 {
2385#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
2386 struct in_pktinfo *pkti = (struct in_pktinfo *)CMSG_DATA(cmsg);
2387 from->pi.in4.ipi_ifindex = pkti->ipi_ifindex;
2388 from->pi.in4.ipi_spec_dst = pkti->ipi_spec_dst;
2389#elif defined(IP_RECVDSTADDR)
2390 from->pi.in4 = *(struct in_addr *)CMSG_DATA(cmsg);
2391#else /* if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST) */
2392#error ENABLE_IP_PKTINFO is set without IP_PKTINFO xor IP_RECVDSTADDR (fix syshead.h)
2393#endif
2394 }
2395 else if (cmsg != NULL && CMSG_NXTHDR(&mesg, cmsg) == NULL
2396 && cmsg->cmsg_level == IPPROTO_IPV6 && cmsg->cmsg_type == IPV6_PKTINFO
2397 && cmsg->cmsg_len >= CMSG_LEN(sizeof(struct in6_pktinfo)))
2398 {
2399 struct in6_pktinfo *pkti6 = (struct in6_pktinfo *)CMSG_DATA(cmsg);
2400 from->pi.in6.ipi6_ifindex = pkti6->ipi6_ifindex;
2401 from->pi.in6.ipi6_addr = pkti6->ipi6_addr;
2402 }
2403 else if (cmsg != NULL)
2404 {
2405 msg(M_WARN,
2406 "CMSG received that cannot be parsed (cmsg_level=%d, cmsg_type=%d, cmsg=len=%d)",
2407 (int)cmsg->cmsg_level, (int)cmsg->cmsg_type, (int)cmsg->cmsg_len);
2408 }
2409 }
2410
2411 return fromlen;
2412}
2413#endif /* if ENABLE_IP_PKTINFO */
2414
2415int
2416link_socket_read_udp_posix(struct link_socket *sock, struct buffer *buf,
2417 struct link_socket_actual *from)
2418{
2419 socklen_t fromlen = sizeof(from->dest.addr);
2420 socklen_t expectedlen = af_addr_size(sock->info.af);
2421 addr_zero_host(&from->dest);
2422
2423 ASSERT(sock->sd >= 0); /* can't happen */
2424
2425#if ENABLE_IP_PKTINFO
2426 /* Both PROTO_UDPv4 and PROTO_UDPv6 */
2427 if (sock->info.proto == PROTO_UDP && sock->sockflags & SF_USE_IP_PKTINFO)
2428 {
2429 fromlen = link_socket_read_udp_posix_recvmsg(sock, buf, from);
2430 }
2431 else
2432#endif
2433 {
2434 buf->len = recvfrom(sock->sd, BPTR(buf), buf_forward_capacity(buf), 0, &from->dest.addr.sa,
2435 &fromlen);
2436 }
2437 /* FIXME: won't do anything when sock->info.af == AF_UNSPEC */
2438 if (buf->len >= 0 && expectedlen && fromlen != expectedlen)
2439 {
2440 bad_address_length(fromlen, expectedlen);
2441 }
2442 return buf->len;
2443}
2444
2445#endif /* ifndef _WIN32 */
2446
2447/*
2448 * Socket Write Routines
2449 */
2450
2451ssize_t
2452link_socket_write_tcp(struct link_socket *sock, struct buffer *buf, struct link_socket_actual *to)
2453{
2454 packet_size_type len = BLEN(buf);
2455 dmsg(D_STREAM_DEBUG, "STREAM: WRITE %d offset=%d", (int)len, buf->offset);
2456 ASSERT(len <= sock->stream_buf.maxlen);
2457 len = htonps(len);
2458 ASSERT(buf_write_prepend(buf, &len, sizeof(len)));
2459#ifdef _WIN32
2460 return link_socket_write_win32(sock, buf, to);
2461#else
2462 return link_socket_write_tcp_posix(sock, buf);
2463#endif
2464}
2465
2466#if defined(__GNUC__) || defined(__clang__)
2467#pragma GCC diagnostic pop
2468#endif
2469
2470#if ENABLE_IP_PKTINFO
2471
2472ssize_t
2473link_socket_write_udp_posix_sendmsg(struct link_socket *sock, struct buffer *buf,
2474 struct link_socket_actual *to)
2475{
2476 struct iovec iov;
2477 struct msghdr mesg;
2478 struct cmsghdr *cmsg;
2479 uint8_t pktinfo_buf[PKTINFO_BUF_SIZE];
2480
2481 iov.iov_base = BPTR(buf);
2482 iov.iov_len = BLEN(buf);
2483 mesg.msg_iov = &iov;
2484 mesg.msg_iovlen = 1;
2485 switch (to->dest.addr.sa.sa_family)
2486 {
2487 case AF_INET:
2488 {
2489 mesg.msg_name = &to->dest.addr.sa;
2490 mesg.msg_namelen = sizeof(struct sockaddr_in);
2491 mesg.msg_control = pktinfo_buf;
2492 mesg.msg_flags = 0;
2493#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
2494 mesg.msg_controllen = CMSG_SPACE(sizeof(struct in_pktinfo));
2495 cmsg = CMSG_FIRSTHDR(&mesg);
2496 cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
2497 cmsg->cmsg_level = SOL_IP;
2498 cmsg->cmsg_type = IP_PKTINFO;
2499 {
2500 struct in_pktinfo *pkti;
2501 pkti = (struct in_pktinfo *)CMSG_DATA(cmsg);
2502 pkti->ipi_ifindex = to->pi.in4.ipi_ifindex;
2503 pkti->ipi_spec_dst = to->pi.in4.ipi_spec_dst;
2504 pkti->ipi_addr.s_addr = 0;
2505 }
2506#elif defined(IP_RECVDSTADDR)
2507 ASSERT(CMSG_SPACE(sizeof(struct in_addr)) <= sizeof(pktinfo_buf));
2508 mesg.msg_controllen = CMSG_SPACE(sizeof(struct in_addr));
2509 cmsg = CMSG_FIRSTHDR(&mesg);
2510 cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr));
2511 cmsg->cmsg_level = IPPROTO_IP;
2512 cmsg->cmsg_type = IP_RECVDSTADDR;
2513 *(struct in_addr *)CMSG_DATA(cmsg) = to->pi.in4;
2514#else /* if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST) */
2515#error ENABLE_IP_PKTINFO is set without IP_PKTINFO xor IP_RECVDSTADDR (fix syshead.h)
2516#endif /* if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST) */
2517 break;
2518 }
2519
2520 case AF_INET6:
2521 {
2522 struct in6_pktinfo *pkti6;
2523 mesg.msg_name = &to->dest.addr.sa;
2524 mesg.msg_namelen = sizeof(struct sockaddr_in6);
2525
2526 ASSERT(CMSG_SPACE(sizeof(struct in6_pktinfo)) <= sizeof(pktinfo_buf));
2527 mesg.msg_control = pktinfo_buf;
2528 mesg.msg_controllen = CMSG_SPACE(sizeof(struct in6_pktinfo));
2529 mesg.msg_flags = 0;
2530 cmsg = CMSG_FIRSTHDR(&mesg);
2531 cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
2532 cmsg->cmsg_level = IPPROTO_IPV6;
2533 cmsg->cmsg_type = IPV6_PKTINFO;
2534
2535 pkti6 = (struct in6_pktinfo *)CMSG_DATA(cmsg);
2536 pkti6->ipi6_ifindex = to->pi.in6.ipi6_ifindex;
2537 pkti6->ipi6_addr = to->pi.in6.ipi6_addr;
2538 break;
2539 }
2540
2541 default:
2542 ASSERT(0);
2543 }
2544 return sendmsg(sock->sd, &mesg, 0);
2545}
2546
2547#endif /* if ENABLE_IP_PKTINFO */
2548
2549/*
2550 * Win32 overlapped socket I/O functions.
2551 */
2552
2553#ifdef _WIN32
2554
2555static int
2557{
2558 if (socket_is_dco_win(sock))
2559 {
2560 return GetLastError();
2561 }
2562
2563 return WSAGetLastError();
2564}
2565
2566int
2567socket_recv_queue(struct link_socket *sock, int maxsize)
2568{
2569 if (sock->reads.iostate == IOSTATE_INITIAL)
2570 {
2571 WSABUF wsabuf[1];
2572 int status;
2573
2574 /* reset buf to its initial state */
2575 if (proto_is_udp(sock->info.proto))
2576 {
2577 sock->reads.buf = sock->reads.buf_init;
2578 }
2579 else if (proto_is_tcp(sock->info.proto))
2580 {
2581 stream_buf_get_next(&sock->stream_buf, &sock->reads.buf);
2582 }
2583 else
2584 {
2585 ASSERT(0);
2586 }
2587
2588 /* Win32 docs say it's okay to allocate the wsabuf on the stack */
2589 wsabuf[0].buf = BSTR(&sock->reads.buf);
2590 wsabuf[0].len = maxsize ? maxsize : BLEN(&sock->reads.buf);
2591
2592 /* check for buffer overflow */
2593 ASSERT(wsabuf[0].len <= BLEN(&sock->reads.buf));
2594
2595 /* the overlapped read will signal this event on I/O completion */
2596 ASSERT(ResetEvent(sock->reads.overlapped.hEvent));
2597 sock->reads.flags = 0;
2598
2599 if (socket_is_dco_win(sock))
2600 {
2601 status = ReadFile((HANDLE)sock->sd, wsabuf[0].buf, wsabuf[0].len, &sock->reads.size,
2602 &sock->reads.overlapped);
2603 /* Readfile status is inverted from WSARecv */
2604 status = !status;
2605 }
2606 else if (proto_is_udp(sock->info.proto))
2607 {
2608 sock->reads.addr_defined = true;
2609 sock->reads.addrlen = sizeof(sock->reads.addr6);
2610 status = WSARecvFrom(sock->sd, wsabuf, 1, &sock->reads.size, &sock->reads.flags,
2611 (struct sockaddr *)&sock->reads.addr, &sock->reads.addrlen,
2612 &sock->reads.overlapped, NULL);
2613 }
2614 else if (proto_is_tcp(sock->info.proto))
2615 {
2616 sock->reads.addr_defined = false;
2617 status = WSARecv(sock->sd, wsabuf, 1, &sock->reads.size, &sock->reads.flags,
2618 &sock->reads.overlapped, NULL);
2619 }
2620 else
2621 {
2622 status = 0;
2623 ASSERT(0);
2624 }
2625
2626 if (!status) /* operation completed immediately? */
2627 {
2628 /* FIXME: won't do anything when sock->info.af == AF_UNSPEC */
2629 int af_len = af_addr_size(sock->info.af);
2630 if (sock->reads.addr_defined && af_len && sock->reads.addrlen != af_len)
2631 {
2632 bad_address_length(sock->reads.addrlen, af_len);
2633 }
2635
2636 /* since we got an immediate return, we must signal the event object ourselves */
2637 ASSERT(SetEvent(sock->reads.overlapped.hEvent));
2638 sock->reads.status = 0;
2639
2640 dmsg(D_WIN32_IO, "WIN32 I/O: Socket Receive immediate return [%d,%d]",
2641 (int)wsabuf[0].len, (int)sock->reads.size);
2642 }
2643 else
2644 {
2646 if (status == WSA_IO_PENDING) /* operation queued? */
2647 {
2649 sock->reads.status = status;
2650 dmsg(D_WIN32_IO, "WIN32 I/O: Socket Receive queued [%d]", (int)wsabuf[0].len);
2651 }
2652 else /* error occurred */
2653 {
2654 struct gc_arena gc = gc_new();
2655 ASSERT(SetEvent(sock->reads.overlapped.hEvent));
2657 sock->reads.status = status;
2658 dmsg(D_WIN32_IO, "WIN32 I/O: Socket Receive error [%d]: %s", (int)wsabuf[0].len,
2660 gc_free(&gc);
2661 }
2662 }
2663 }
2664 return sock->reads.iostate;
2665}
2666
2667int
2668socket_send_queue(struct link_socket *sock, struct buffer *buf, const struct link_socket_actual *to)
2669{
2670 if (sock->writes.iostate == IOSTATE_INITIAL)
2671 {
2672 WSABUF wsabuf[1];
2673 int status;
2674
2675 /* make a private copy of buf */
2676 sock->writes.buf = sock->writes.buf_init;
2677 sock->writes.buf.len = 0;
2678 ASSERT(buf_copy(&sock->writes.buf, buf));
2679
2680 /* Win32 docs say it's okay to allocate the wsabuf on the stack */
2681 wsabuf[0].buf = BSTR(&sock->writes.buf);
2682 wsabuf[0].len = BLEN(&sock->writes.buf);
2683
2684 /* the overlapped write will signal this event on I/O completion */
2685 ASSERT(ResetEvent(sock->writes.overlapped.hEvent));
2686 sock->writes.flags = 0;
2687
2688 if (socket_is_dco_win(sock))
2689 {
2690 status = WriteFile((HANDLE)sock->sd, wsabuf[0].buf, wsabuf[0].len, &sock->writes.size,
2691 &sock->writes.overlapped);
2692
2693 /* WriteFile status is inverted from WSASendTo */
2694 status = !status;
2695 }
2696 else if (proto_is_udp(sock->info.proto))
2697 {
2698 /* set destination address for UDP writes */
2699 sock->writes.addr_defined = true;
2700 if (to->dest.addr.sa.sa_family == AF_INET6)
2701 {
2702 sock->writes.addr6 = to->dest.addr.in6;
2703 sock->writes.addrlen = sizeof(sock->writes.addr6);
2704 }
2705 else
2706 {
2707 sock->writes.addr = to->dest.addr.in4;
2708 sock->writes.addrlen = sizeof(sock->writes.addr);
2709 }
2710
2711 status = WSASendTo(sock->sd, wsabuf, 1, &sock->writes.size, sock->writes.flags,
2712 (struct sockaddr *)&sock->writes.addr, sock->writes.addrlen,
2713 &sock->writes.overlapped, NULL);
2714 }
2715 else if (proto_is_tcp(sock->info.proto))
2716 {
2717 /* destination address for TCP writes was established on connection initiation */
2718 sock->writes.addr_defined = false;
2719
2720 status = WSASend(sock->sd, wsabuf, 1, &sock->writes.size, sock->writes.flags,
2721 &sock->writes.overlapped, NULL);
2722 }
2723 else
2724 {
2725 status = 0;
2726 ASSERT(0);
2727 }
2728
2729 if (!status) /* operation completed immediately? */
2730 {
2732
2733 /* since we got an immediate return, we must signal the event object ourselves */
2734 ASSERT(SetEvent(sock->writes.overlapped.hEvent));
2735
2736 sock->writes.status = 0;
2737
2738 dmsg(D_WIN32_IO, "WIN32 I/O: Socket Send immediate return [%d,%d]", (int)wsabuf[0].len,
2739 (int)sock->writes.size);
2740 }
2741 else
2742 {
2744 /* both status code have the identical value */
2745 if (status == WSA_IO_PENDING || status == ERROR_IO_PENDING) /* operation queued? */
2746 {
2748 sock->writes.status = status;
2749 dmsg(D_WIN32_IO, "WIN32 I/O: Socket Send queued [%d]", (int)wsabuf[0].len);
2750 }
2751 else /* error occurred */
2752 {
2753 struct gc_arena gc = gc_new();
2754 ASSERT(SetEvent(sock->writes.overlapped.hEvent));
2756 sock->writes.status = status;
2757
2758 dmsg(D_WIN32_IO, "WIN32 I/O: Socket Send error [%d]: %s", (int)wsabuf[0].len,
2760
2761 gc_free(&gc);
2762 }
2763 }
2764 }
2765 return sock->writes.iostate;
2766}
2767
2768void
2769read_sockaddr_from_overlapped(struct overlapped_io *io, struct sockaddr *dst, int overlapped_ret)
2770{
2771 if (overlapped_ret >= 0 && io->addr_defined)
2772 {
2773 /* TODO(jjo): streamline this mess */
2774 /* in this func we don't have relevant info about the PF_ of this
2775 * endpoint, as link_socket_actual will be zero for the 1st received packet
2776 *
2777 * Test for inets PF_ possible sizes
2778 */
2779 switch (io->addrlen)
2780 {
2781 case sizeof(struct sockaddr_in):
2782 case sizeof(struct sockaddr_in6):
2783 /* TODO(jjo): for some reason (?) I'm getting 24,28 for AF_INET6
2784 * under _WIN32*/
2785 case sizeof(struct sockaddr_in6) - 4:
2786 break;
2787
2788 default:
2789 bad_address_length(io->addrlen, af_addr_size(io->addr.sin_family));
2790 }
2791
2792 switch (io->addr.sin_family)
2793 {
2794 case AF_INET:
2795 memcpy(dst, &io->addr, sizeof(struct sockaddr_in));
2796 break;
2797
2798 case AF_INET6:
2799 memcpy(dst, &io->addr6, sizeof(struct sockaddr_in6));
2800 break;
2801 }
2802 }
2803 else
2804 {
2805 CLEAR(*dst);
2806 }
2807}
2808
2818static int
2819read_sockaddr_from_packet(struct buffer *buf, struct sockaddr *dst)
2820{
2821 int sa_len = 0;
2822
2823 const struct sockaddr *sa = (const struct sockaddr *)BPTR(buf);
2824 switch (sa->sa_family)
2825 {
2826 case AF_INET:
2827 sa_len = sizeof(struct sockaddr_in);
2828 if (buf_len(buf) < sa_len)
2829 {
2830 msg(M_FATAL,
2831 "ERROR: received incoming packet with too short length of %d -- must be at least %d.",
2832 buf_len(buf), sa_len);
2833 }
2834 memcpy(dst, sa, sa_len);
2835 buf_advance(buf, sa_len);
2836 break;
2837
2838 case AF_INET6:
2839 sa_len = sizeof(struct sockaddr_in6);
2840 if (buf_len(buf) < sa_len)
2841 {
2842 msg(M_FATAL,
2843 "ERROR: received incoming packet with too short length of %d -- must be at least %d.",
2844 buf_len(buf), sa_len);
2845 }
2846 memcpy(dst, sa, sa_len);
2847 buf_advance(buf, sa_len);
2848 break;
2849
2850 default:
2851 msg(M_FATAL, "ERROR: received incoming packet with invalid address family %d.",
2852 sa->sa_family);
2853 }
2854
2855 return sa_len;
2856}
2857
2858/* Returns the number of bytes successfully read */
2859int
2861 struct link_socket_actual *from)
2862{
2863 int ret = -1;
2864 BOOL status;
2865
2866 switch (io->iostate)
2867 {
2868 case IOSTATE_QUEUED:
2870 if (status)
2871 {
2872 /* successful return for a queued operation */
2873 if (buf)
2874 {
2875 *buf = io->buf;
2876 }
2877 ret = io->size;
2879 ASSERT(ResetEvent(io->overlapped.hEvent));
2880
2881 dmsg(D_WIN32_IO, "WIN32 I/O: Completion success [%d]", ret);
2882 }
2883 else
2884 {
2885 /* error during a queued operation */
2886 ret = -1;
2887 if (SocketHandleGetLastError(sh) != ERROR_IO_INCOMPLETE)
2888 {
2889 /* if no error (i.e. just not finished yet), then DON'T execute this code */
2891 ASSERT(ResetEvent(io->overlapped.hEvent));
2892 msg(D_WIN32_IO | M_ERRNO, "WIN32 I/O: Completion error");
2893 }
2894 }
2895 break;
2896
2899 ASSERT(ResetEvent(io->overlapped.hEvent));
2900 if (io->status)
2901 {
2902 /* error return for a non-queued operation */
2904 ret = -1;
2905 msg(D_WIN32_IO | M_ERRNO, "WIN32 I/O: Completion non-queued error");
2906 }
2907 else
2908 {
2909 /* successful return for a non-queued operation */
2910 if (buf)
2911 {
2912 *buf = io->buf;
2913 }
2914 ret = io->size;
2915 dmsg(D_WIN32_IO, "WIN32 I/O: Completion non-queued success [%d]", ret);
2916 }
2917 break;
2918
2919 case IOSTATE_INITIAL: /* were we called without proper queueing? */
2921 ret = -1;
2922 dmsg(D_WIN32_IO, "WIN32 I/O: Completion BAD STATE");
2923 break;
2924
2925 default:
2926 ASSERT(0);
2927 }
2928
2929 if (from && ret > 0 && sh.is_handle && sh.prepend_sa)
2930 {
2931 ret -= read_sockaddr_from_packet(buf, &from->dest.addr.sa);
2932 }
2933
2934 if (!sh.is_handle && from)
2935 {
2936 read_sockaddr_from_overlapped(io, &from->dest.addr.sa, ret);
2937 }
2938
2939 if (buf)
2940 {
2941 buf->len = ret;
2942 }
2943 return ret;
2944}
2945
2946#endif /* _WIN32 */
2947
2948/*
2949 * Socket event notification
2950 */
2951
2952unsigned int
2953socket_set(struct link_socket *s, struct event_set *es, unsigned int rwflags, void *arg,
2954 unsigned int *persistent)
2955{
2956 if (s)
2957 {
2958 if ((rwflags & EVENT_READ) && !stream_buf_read_setup(s))
2959 {
2960 ASSERT(!persistent);
2961 rwflags &= ~EVENT_READ;
2962 }
2963
2964#ifdef _WIN32
2965 if (rwflags & EVENT_READ)
2966 {
2967 socket_recv_queue(s, 0);
2968 }
2969#endif
2970
2971 /* if persistent is defined, call event_ctl only if rwflags has changed since last call */
2972 if (!persistent || *persistent != rwflags)
2973 {
2974 event_ctl(es, socket_event_handle(s), rwflags, arg);
2975 if (persistent)
2976 {
2977 *persistent = rwflags;
2978 }
2979 }
2980
2981 s->rwflags_debug = rwflags;
2982 }
2983 return rwflags;
2984}
2985
2986void
2988{
2989 if (sd && socket_defined(*sd))
2990 {
2992 *sd = SOCKET_UNDEFINED;
2993 }
2994}
2995
2996#if UNIX_SOCK_SUPPORT
2997
2998/*
2999 * code for unix domain sockets
3000 */
3001
3002const char *
3003sockaddr_unix_name(const struct sockaddr_un *local, const char *null)
3004{
3005 if (local && local->sun_family == PF_UNIX)
3006 {
3007 return local->sun_path;
3008 }
3009 else
3010 {
3011 return null;
3012 }
3013}
3014
3016create_socket_unix(void)
3017{
3019
3020 if ((sd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
3021 {
3022 msg(M_ERR, "Cannot create unix domain socket");
3023 }
3024
3025 /* set socket file descriptor to not pass across execs, so that
3026 * scripts don't have access to it */
3027 set_cloexec(sd);
3028
3029 return sd;
3030}
3031
3032void
3033socket_bind_unix(socket_descriptor_t sd, struct sockaddr_un *local, const char *prefix)
3034{
3035 struct gc_arena gc = gc_new();
3036 const mode_t orig_umask = umask(0);
3037
3038 if (bind(sd, (struct sockaddr *)local, sizeof(struct sockaddr_un)))
3039 {
3040 msg(M_FATAL | M_ERRNO, "%s: Socket bind[%d] failed on unix domain socket %s", prefix,
3041 (int)sd, sockaddr_unix_name(local, "NULL"));
3042 }
3043
3044 umask(orig_umask);
3045 gc_free(&gc);
3046}
3047
3049socket_accept_unix(socket_descriptor_t sd, struct sockaddr_un *remote)
3050{
3051 socklen_t remote_len = sizeof(struct sockaddr_un);
3053
3054 CLEAR(*remote);
3055 ret = accept(sd, (struct sockaddr *)remote, &remote_len);
3056 if (ret >= 0)
3057 {
3058 /* set socket file descriptor to not pass across execs, so that
3059 * scripts don't have access to it */
3060 set_cloexec(ret);
3061 }
3062 return ret;
3063}
3064
3065int
3066socket_connect_unix(socket_descriptor_t sd, struct sockaddr_un *remote)
3067{
3068 int status = connect(sd, (struct sockaddr *)remote, sizeof(struct sockaddr_un));
3069 if (status)
3070 {
3072 }
3073 return status;
3074}
3075
3076void
3077sockaddr_unix_init(struct sockaddr_un *local, const char *path)
3078{
3079 local->sun_family = PF_UNIX;
3080 strncpynt(local->sun_path, path, sizeof(local->sun_path));
3081}
3082
3083void
3084socket_delete_unix(const struct sockaddr_un *local)
3085{
3086 const char *name = sockaddr_unix_name(local, NULL);
3087 if (name && strlen(name))
3088 {
3089 unlink(name);
3090 }
3091}
3092
3093bool
3094unix_socket_get_peer_uid_gid(const socket_descriptor_t sd, uid_t *uid, gid_t *gid)
3095{
3096#ifdef HAVE_GETPEEREID
3097 uid_t u;
3098 gid_t g;
3099 if (getpeereid(sd, &u, &g) == -1)
3100 {
3101 return false;
3102 }
3103 if (uid)
3104 {
3105 *uid = u;
3106 }
3107 if (gid)
3108 {
3109 *gid = g;
3110 }
3111 return true;
3112#elif defined(SO_PEERCRED)
3113 struct ucred peercred;
3114 socklen_t so_len = sizeof(peercred);
3115 if (getsockopt(sd, SOL_SOCKET, SO_PEERCRED, &peercred, &so_len) == -1)
3116 {
3117 return false;
3118 }
3119 if (uid)
3120 {
3121 *uid = peercred.uid;
3122 }
3123 if (gid)
3124 {
3125 *gid = peercred.gid;
3126 }
3127 return true;
3128#else /* ifdef HAVE_GETPEEREID */
3129 return false;
3130#endif /* ifdef HAVE_GETPEEREID */
3131}
3132
3133#endif /* if UNIX_SOCK_SUPPORT */
void argv_parse_cmd(struct argv *argres, const char *cmdstr)
Parses a command string, tokenizes it and puts each element into a separate struct argv argument slot...
Definition argv.c:481
void argv_free(struct argv *a)
Frees all memory allocations allocated by the struct argv related functions.
Definition argv.c:101
bool argv_printf(struct argv *argres, const char *format,...)
printf() variant which populates a struct argv.
Definition argv.c:438
bool argv_printf_cat(struct argv *argres, const char *format,...)
printf() inspired argv concatenation.
Definition argv.c:462
struct argv argv_new(void)
Allocates a new struct argv and ensures it is initialised.
Definition argv.c:87
void free_buf(struct buffer *buf)
Definition buffer.c:184
bool buf_printf(struct buffer *buf, const char *format,...)
Definition buffer.c:241
struct buffer alloc_buf_gc(size_t size, struct gc_arena *gc)
Definition buffer.c:89
struct buffer alloc_buf(size_t size)
Definition buffer.c:63
void gc_addspecial(void *addr, void(*free_function)(void *), struct gc_arena *a)
Definition buffer.c:438
#define BSTR(buf)
Definition buffer.h:128
static bool buf_copy(struct buffer *dest, const struct buffer *src)
Definition buffer.h:704
#define BPTR(buf)
Definition buffer.h:123
static bool buf_copy_excess(struct buffer *dest, struct buffer *src, int len)
Definition buffer.h:739
static bool buf_write_prepend(struct buffer *dest, const void *src, int size)
Definition buffer.h:672
static void buf_reset(struct buffer *buf)
Definition buffer.h:303
static bool buf_safe(const struct buffer *buf, size_t len)
Definition buffer.h:518
static bool buf_read(struct buffer *src, void *dest, int size)
Definition buffer.h:762
static bool buf_advance(struct buffer *buf, int size)
Definition buffer.h:616
static int buf_len(const struct buffer *buf)
Definition buffer.h:253
static int buf_forward_capacity(const struct buffer *buf)
Definition buffer.h:539
#define ALLOC_OBJ_CLEAR_GC(dptr, type, gc)
Definition buffer.h:1089
#define BLEN(buf)
Definition buffer.h:126
static void strncpynt(char *dest, const char *src, size_t maxlen)
Definition buffer.h:361
static void gc_free(struct gc_arena *a)
Definition buffer.h:1025
#define ALLOC_OBJ_CLEAR(dptr, type)
Definition buffer.h:1052
static bool buf_defined(const struct buffer *buf)
Definition buffer.h:228
#define buf_init(buf, offset)
Definition buffer.h:209
static void gc_freeaddrinfo_callback(void *addr)
Definition buffer.h:215
static struct gc_arena gc_new(void)
Definition buffer.h:1017
static int buf_forward_capacity_total(const struct buffer *buf)
Definition buffer.h:557
void dco_mp_start_vpn(HANDLE handle, struct link_socket *sock)
Initializes and binds the kernel UDP transport socket for multipeer mode.
Definition dco_win.c:283
void dco_p2p_new_peer(HANDLE handle, OVERLAPPED *ov, struct link_socket *sock, struct signal_info *sig_info)
Definition dco_win.c:327
void setenv_str(struct env_set *es, const char *name, const char *value)
Definition env_set.c:307
#define D_WIN32_IO
Definition errlevel.h:172
#define D_STREAM_ERRORS
Definition errlevel.h:62
#define D_SOCKET_DEBUG
Definition errlevel.h:139
#define D_STREAM_DEBUG
Definition errlevel.h:171
#define D_INIT_MEDIUM
Definition errlevel.h:103
#define D_READ_WRITE
Definition errlevel.h:166
#define D_OSBUF
Definition errlevel.h:90
#define D_LOW
Definition errlevel.h:96
#define M_INFO
Definition errlevel.h:54
#define D_LINK_ERRORS
Definition errlevel.h:56
#define EVENT_WRITE
Definition event.h:39
#define EVENT_READ
Definition event.h:38
@ EVENT_ARG_LINK_SOCKET
Definition event.h:138
static void event_ctl(struct event_set *es, event_t event, unsigned int rwflags, void *arg)
Definition event.h:183
void set_nonblock(socket_descriptor_t fd)
Definition fdmisc.c:68
void set_cloexec(socket_descriptor_t fd)
Definition fdmisc.c:78
static void openvpn_fd_set(socket_descriptor_t fd, fd_set *setp)
Definition fdmisc.h:39
int get_server_poll_remaining_time(struct event_timeout *server_poll_timeout)
Definition forward.c:503
Interface functions to the internal and external multiplexers.
static SERVICE_STATUS status
Definition interactive.c:51
void management_set_state(struct management *man, const int state, const char *detail, const in_addr_t *tun_local_ip, const struct in6_addr *tun_local_ip6, const struct openvpn_sockaddr *local, const struct openvpn_sockaddr *remote)
Definition manage.c:2789
void management_sleep(const int n)
A sleep function that services the management layer for n seconds rather than doing nothing.
Definition manage.c:4140
#define OPENVPN_STATE_TCP_CONNECT
Definition manage.h:461
void alloc_buf_sock_tun(struct buffer *buf, const struct frame *frame)
Definition mtu.c:41
void set_mtu_discover_type(socket_descriptor_t sd, int mtu_type, sa_family_t proto_af)
Definition mtu.c:218
#define CLEAR(x)
Definition basic.h:32
const char * strerror_win32(DWORD errnum, struct gc_arena *gc)
Definition error.c:780
#define M_FATAL
Definition error.h:90
#define M_NONFATAL
Definition error.h:91
#define dmsg(flags,...)
Definition error.h:172
#define M_ERR
Definition error.h:106
#define openvpn_errno()
Definition error.h:71
#define msg(flags,...)
Definition error.h:152
unsigned int msglvl_t
Definition error.h:77
#define ASSERT(x)
Definition error.h:219
#define M_WARN
Definition error.h:92
#define M_ERRNO
Definition error.h:95
#define CM_CHILD_TCP
Definition openvpn.h:486
#define CM_CHILD_UDP
Definition openvpn.h:485
#define MODE_POINT_TO_POINT
Definition options.h:263
#define MODE_SERVER
Definition options.h:264
#define streq(x, y)
Definition options.h:730
static bool dco_enabled(const struct options *o)
Returns whether the current configuration has dco enabled.
Definition options.h:1008
bool plugin_defined(const struct plugin_list *pl, const int type)
Definition plugin.c:904
static int plugin_call(const struct plugin_list *pl, const int type, const struct argv *av, struct plugin_return *pr, struct env_set *es)
Definition plugin.h:195
bool establish_http_proxy_passthru(struct http_proxy_info *p, socket_descriptor_t sd, const char *host, const char *port, struct event_timeout *server_poll_timeout, struct buffer *lookahead, struct signal_info *sig_info)
Definition proxy.c:625
static int openvpn_run_script(const struct argv *a, const struct env_set *es, const unsigned int flags, const char *hook)
Will run a script and return the exit code of the script if between 0 and 255, -1 otherwise.
Definition run_command.h:89
void throw_signal_soft(const int signum, const char *signal_text)
Throw a soft global signal.
Definition sig.c:204
int signal_reset(struct signal_info *si, int signum)
Clear the signal if its current value equals signum.
Definition sig.c:262
void throw_signal(const int signum)
Throw a hard signal.
Definition sig.c:175
struct signal_info siginfo_static
Definition sig.c:44
void register_signal(struct signal_info *si, int signum, const char *signal_text)
Register a soft signal in the signal_info struct si respecting priority.
Definition sig.c:228
#define SIG_SOURCE_HARD
Definition sig.h:30
static void get_signal(volatile int *sig)
Copy the global signal_received (if non-zero) to the passed-in argument sig.
Definition sig.h:109
void link_socket_init_phase1(struct context *c, int sock_index, int mode)
Definition socket.c:1376
static int get_cached_dns_entry(struct cached_dns_entry *dns_cache, const char *hostname, const char *servname, int ai_family, unsigned int resolve_flags, struct addrinfo **ai)
Definition socket.c:253
static void resolve_bind_local(struct link_socket *sock, const sa_family_t af)
Definition socket.c:1196
static int socket_get_sndbuf(socket_descriptor_t sd)
Definition socket.c:415
static void socket_set_sndbuf(socket_descriptor_t sd, int size)
Definition socket.c:431
static socket_descriptor_t socket_listen_accept(socket_descriptor_t sd, struct link_socket_actual *act, const char *remote_dynamic, const struct addrinfo *local, bool do_listen, bool nowait, volatile int *signal_received)
Definition socket.c:857
void link_socket_init_phase2(struct context *c, struct link_socket *sock)
Definition socket.c:1719
int socket_send_queue(struct link_socket *sock, struct buffer *buf, const struct link_socket_actual *to)
Definition socket.c:2668
static void ipchange_fmt(const bool include_cmd, struct argv *argv, const struct link_socket_info *info, struct gc_arena *gc)
Definition socket.c:1898
static int socket_get_last_error(const struct link_socket *sock)
Definition socket.c:2556
ssize_t link_socket_write_tcp(struct link_socket *sock, struct buffer *buf, struct link_socket_actual *to)
Definition socket.c:2452
void link_socket_update_buffer_sizes(struct link_socket *sock, int rcvbuf, int sndbuf)
Definition socket.c:557
static socket_descriptor_t create_socket_udp(struct addrinfo *addrinfo, const unsigned int flags)
Definition socket.c:604
static void phase2_tcp_server(struct link_socket *sock, const char *remote_dynamic, struct signal_info *sig_info)
Definition socket.c:1568
static void create_socket(struct link_socket *sock, struct addrinfo *addr)
Definition socket.c:675
const struct in6_addr * link_socket_current_remote_ipv6(const struct link_socket_info *info)
Definition socket.c:2033
void set_actual_address(struct link_socket_actual *actual, struct addrinfo *ai)
Definition socket.c:1088
static bool socket_set_rcvbuf(socket_descriptor_t sd, int size)
Definition socket.c:458
static void stream_buf_set_next(struct stream_buf *sb)
Definition socket.c:2127
const char * socket_stat(const struct link_socket *s, unsigned int rwflags, struct gc_arena *gc)
Definition socket.c:2066
static int do_preresolve_host(struct context *c, const char *hostname, const char *servname, const int af, const unsigned int flags)
Definition socket.c:276
void bad_address_length(int actual, int expected)
Definition socket.c:2272
static bool stream_buf_added(struct stream_buf *sb, int length_added)
Definition socket.c:2175
event_t socket_listen_event_handle(struct link_socket *s)
Definition socket.c:2253
void sd_close(socket_descriptor_t *sd)
Definition socket.c:2987
static void linksock_print_addr(struct link_socket *sock)
Definition socket.c:1531
static void socket_set_mark(socket_descriptor_t sd, int mark)
Definition socket.c:518
static void stream_buf_close(struct stream_buf *sb)
Definition socket.c:2242
static void stream_buf_get_final(struct stream_buf *sb, struct buffer *buf)
Definition socket.c:2140
static void socket_connect(socket_descriptor_t *sd, const struct sockaddr *dest, const int connect_timeout, struct signal_info *sig_info)
Definition socket.c:1108
static void bind_local(struct link_socket *sock, const sa_family_t ai_family)
Definition socket.c:657
bool stream_buf_read_setup_dowork(struct link_socket *sock)
Definition socket.c:2156
static void phase2_socks_client(struct link_socket *sock, struct signal_info *sig_info)
Definition socket.c:1637
static bool socket_set_tcp_nodelay(socket_descriptor_t sd, int state)
Definition socket.c:498
static int get_addr_generic(sa_family_t af, unsigned int flags, const char *hostname, void *network, unsigned int *netbits, int resolve_retry_seconds, struct signal_info *sig_info, msglvl_t msglevel)
Definition socket.c:84
socket_descriptor_t socket_do_accept(socket_descriptor_t sd, struct link_socket_actual *act, const bool nowait)
Definition socket.c:782
static void socket_do_listen(socket_descriptor_t sd, const struct addrinfo *local, bool do_listen, bool do_set_nonblock)
Definition socket.c:757
int socket_recv_queue(struct link_socket *sock, int maxsize)
Definition socket.c:2567
void link_socket_close(struct link_socket *sock)
Definition socket.c:1840
bool get_ipv6_addr(const char *hostname, struct in6_addr *network, unsigned int *netbits, msglvl_t msglevel)
Translate an IPv6 addr or hostname from string form to in6_addr.
Definition socket.c:219
void link_socket_connection_initiated(struct link_socket_info *info, const struct link_socket_actual *act, const char *common_name, struct env_set *es)
Definition socket.c:1914
void socket_set_buffers(socket_descriptor_t fd, const struct socket_buffer_size *sbs, bool reduce_size)
Sets the receive and send buffer sizes of a socket descriptor.
Definition socket.c:471
static bool streqnull(const char *a, const char *b)
Definition socket.c:232
static void phase2_set_socket_flags(struct link_socket *sock)
Definition socket.c:1512
static void resolve_remote(struct link_socket *sock, int phase, const char **remote_dynamic, struct signal_info *sig_info)
Definition socket.c:1246
void link_socket_bad_outgoing_addr(void)
Definition socket.c:1993
int sockethandle_finalize(sockethandle_t sh, struct overlapped_io *io, struct buffer *buf, struct link_socket_actual *from)
Definition socket.c:2860
in_addr_t link_socket_current_remote(const struct link_socket_info *info)
Definition socket.c:1999
static int socket_get_rcvbuf(socket_descriptor_t sd)
Definition socket.c:442
int link_socket_read_tcp(struct link_socket *sock, struct buffer *buf)
Definition socket.c:2284
int openvpn_connect(socket_descriptor_t sd, const struct sockaddr *remote, int connect_timeout, volatile int *signal_received)
Definition socket.c:995
unsigned int socket_set(struct link_socket *s, struct event_set *es, unsigned int rwflags, void *arg, unsigned int *persistent)
Definition socket.c:2953
static unsigned int sf2gaf(const unsigned int getaddr_flags, const unsigned int sockflags)
Definition socket.c:63
void do_preresolve(struct context *c)
Definition socket.c:320
void link_socket_bad_incoming_addr(struct buffer *buf, const struct link_socket_info *info, const struct link_socket_actual *from_addr)
Definition socket.c:1966
static void phase2_tcp_client(struct link_socket *sock, struct signal_info *sig_info)
Definition socket.c:1602
void socket_bind(socket_descriptor_t sd, struct addrinfo *local, int ai_family, const char *prefix, bool ipv6only)
Definition socket.c:945
socket_descriptor_t create_socket_tcp(struct addrinfo *addrinfo)
Definition socket.c:573
static void socket_frame_init(const struct frame *frame, struct link_socket *sock)
Definition socket.c:1167
static void stream_buf_reset(struct stream_buf *sb)
Definition socket.c:2099
static void stream_buf_get_next(struct stream_buf *sb, struct buffer *buf)
Definition socket.c:2148
static void create_socket_dco_win(struct context *c, struct link_socket *sock, struct signal_info *sig_info)
Definition socket.c:1671
static void tcp_connection_established(const struct link_socket_actual *act)
Definition socket.c:845
static bool socket_set_flags(socket_descriptor_t sd, unsigned int sockflags)
Definition socket.c:529
struct link_socket * link_socket_new(void)
Definition socket.c:1362
static int read_sockaddr_from_packet(struct buffer *buf, struct sockaddr *dst)
Extracts a sockaddr from a packet payload.
Definition socket.c:2819
bool sockets_read_residual(const struct context *c)
Definition socket.c:45
in_addr_t getaddr(unsigned int flags, const char *hostname, int resolve_retry_seconds, bool *succeeded, struct signal_info *sig_info)
Translate an IPv4 addr or hostname from string form to in_addr_t.
Definition socket.c:192
void setenv_trusted(struct env_set *es, const struct link_socket_info *info)
Definition socket.c:1892
void read_sockaddr_from_overlapped(struct overlapped_io *io, struct sockaddr *dst, int overlapped_ret)
Definition socket.c:2769
bool link_socket_update_flags(struct link_socket *sock, unsigned int sockflags)
Definition socket.c:543
static void stream_buf_init(struct stream_buf *sb, struct buffer *buf, const unsigned int sockflags, const int proto)
Definition socket.c:2109
static event_t socket_event_handle(const struct link_socket *sock)
Definition socket.h:767
#define IPV4_INVALID_ADDR
Definition socket.h:356
static BOOL SocketHandleGetOverlappedResult(sockethandle_t sh, struct overlapped_io *io)
Definition socket.h:269
#define LS_MODE_TCP_ACCEPT_FROM
Definition socket.h:181
#define SF_DCO_WIN
Definition socket.h:196
static bool link_socket_connection_oriented(const struct link_socket *sock)
Definition socket.h:408
static bool stream_buf_read_setup(struct link_socket *sock)
Definition socket.h:533
static void SocketHandleSetLastError(sockethandle_t sh, DWORD err)
Definition socket.h:283
static int SocketHandleGetLastError(sockethandle_t sh)
Definition socket.h:277
static void SocketHandleSetInvalError(sockethandle_t sh)
Definition socket.h:289
#define SF_TCP_NODELAY
Definition socket.h:192
#define RESOLV_RETRY_INFINITE
Definition socket.h:48
#define SF_USE_IP_PKTINFO
Definition socket.h:191
#define LS_MODE_DEFAULT
Definition socket.h:179
#define MSG_NOSIGNAL
Definition socket.h:242
uint16_t packet_size_type
Definition socket.h:56
static bool socket_is_dco_win(const struct link_socket *s)
Returns true if we are on Windows and this link is running on DCO-WIN.
Definition socket.h:551
#define SF_HOST_RANDOMIZE
Definition socket.h:194
#define SF_GETADDRINFO_DGRAM
Definition socket.h:195
#define LS_MODE_TCP_LISTEN
Definition socket.h:180
#define SF_PORT_SHARE
Definition socket.h:193
#define ntohps(x)
Definition socket.h:62
static int openvpn_select(socket_descriptor_t nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
Definition socket.h:298
static int link_socket_write_win32(struct link_socket *sock, struct buffer *buf, struct link_socket_actual *to)
Definition socket.h:625
#define openvpn_close_socket(s)
Definition socket.h:247
#define htonps(x)
Definition socket.h:59
static int openvpn_bind(socket_descriptor_t sockfd, const struct sockaddr *addr, size_t addrlen)
Definition socket.h:313
const char * proto2ascii(int proto, sa_family_t af, bool display_form)
int openvpn_getaddrinfo(unsigned int flags, const char *hostname, const char *servname, int resolve_retry_seconds, struct signal_info *sig_info, int ai_family, struct addrinfo **res)
const char * print_sockaddr_ex(const struct sockaddr *sa, const char *separator, const unsigned int flags, struct gc_arena *gc)
Definition socket_util.c:38
void setenv_link_socket_actual(struct env_set *es, const char *name_prefix, const struct link_socket_actual *act, const unsigned int flags)
const char * print_link_socket_actual(const struct link_socket_actual *act, struct gc_arena *gc)
const char * print_link_socket_actual_ex(const struct link_socket_actual *act, const char *separator, const unsigned int flags, struct gc_arena *gc)
const char * addr_family_name(int af)
static const char * print_sockaddr(const struct sockaddr *addr, struct gc_arena *gc)
Definition socket_util.h:77
#define GETADDR_CACHE_MASK
static bool link_socket_actual_defined(const struct link_socket_actual *act)
#define GETADDR_TRY_ONCE
#define SA_IP_PORT
Definition socket_util.h:99
#define GETADDR_PASSIVE
static bool proto_is_udp(int proto)
Returns if the protocol being used is UDP.
#define GETADDR_FATAL
#define GETADDR_UPDATE_MANAGEMENT_STATE
static bool addr_local(const struct sockaddr *addr)
#define PS_SHOW_PORT
Definition socket_util.h:31
@ PROTO_UDP
@ PROTO_TCP_CLIENT
@ PROTO_TCP_SERVER
#define GETADDR_HOST_ORDER
#define PS_SHOW_PORT_IF_DEFINED
Definition socket_util.h:30
#define GETADDR_RANDOMIZE
#define GETADDR_DATAGRAM
static bool proto_is_tcp(int proto)
returns if the proto is a TCP variant (tcp-server, tcp-client or tcp)
static void addr_zero_host(struct openvpn_sockaddr *addr)
static bool proto_is_dgram(int proto)
Return if the protocol is datagram (UDP)
static int af_addr_size(sa_family_t af)
#define GETADDR_RESOLVE
#define GETADDR_MENTION_RESOLVE_RETRY
#define GETADDR_WARN_ON_SIGNAL
static bool addrlist_match(const struct openvpn_sockaddr *a1, const struct addrinfo *addrlist)
void establish_socks_proxy_passthru(struct socks_proxy_info *p, socket_descriptor_t sd, const char *host, const char *servname, struct event_timeout *server_poll_timeout, struct signal_info *sig_info)
Definition socks.c:338
void establish_socks_proxy_udpassoc(struct socks_proxy_info *p, socket_descriptor_t ctrl_sd, struct openvpn_sockaddr *relay_addr, struct event_timeout *server_poll_timeout, struct signal_info *sig_info)
Definition socks.c:396
Definition argv.h:35
Wrapper structure for dynamically allocated memory.
Definition buffer.h:60
int len
Length in bytes of the actual content within the allocated memory.
Definition buffer.h:65
int offset
Offset in bytes of the actual content within the allocated memory.
Definition buffer.h:63
Definition socket.h:66
const char * hostname
Definition socket.h:67
int ai_family
Definition socket.h:69
const char * servname
Definition socket.h:68
unsigned int flags
Definition socket.h:70
struct addrinfo * ai
Definition socket.h:71
struct cached_dns_entry * next
Definition socket.h:72
Definition options.h:107
struct local_list * local_list
Definition options.h:108
bool bind_local
Definition options.h:118
const char * remote
Definition options.h:114
const char * socks_proxy_port
Definition options.h:124
struct http_proxy_options * http_proxy_options
Definition options.h:122
bool bind_ipv6_only
Definition options.h:117
bool remote_float
Definition options.h:115
const char * remote_port
Definition options.h:113
const char * socks_proxy_server
Definition options.h:123
int mtu_discover_type
Definition options.h:139
int proto
Definition options.h:109
sa_family_t af
Definition options.h:110
unsigned int flags
Definition options.h:162
struct connection_entry ** array
Definition options.h:204
struct link_socket_addr * link_socket_addrs
Local and remote addresses on the external network.
Definition openvpn.h:159
int link_sockets_num
Definition openvpn.h:158
struct http_proxy_info * http_proxy
Definition openvpn.h:189
struct socks_proxy_info * socks_proxy
Definition openvpn.h:193
struct cached_dns_entry * dns_cache
Definition openvpn.h:167
struct tuntap * tuntap
Tun/tap virtual network interface.
Definition openvpn.h:172
struct event_timeout server_poll_interval
Definition openvpn.h:408
const struct link_socket * accept_from
Definition openvpn.h:242
struct frame frame
Definition openvpn.h:248
struct link_socket ** link_sockets
Definition openvpn.h:237
Contains all state information for one tunnel.
Definition openvpn.h:474
int mode
Role of this context within the OpenVPN process.
Definition openvpn.h:487
struct signal_info * sig
Internal error signaling object.
Definition openvpn.h:503
struct plugin_list * plugins
List of plug-ins.
Definition openvpn.h:505
struct context_2 c2
Level 2 context.
Definition openvpn.h:517
struct options options
Options loaded from command line or configuration file.
Definition openvpn.h:475
struct gc_arena gc
Garbage collection arena for allocations done in the scope of this context structure.
Definition openvpn.h:495
struct context_1 c1
Level 1 context.
Definition openvpn.h:516
struct link_socket * sock
Definition event.h:148
union event_arg::@1 u
event_arg_t type
Definition event.h:144
Packet geometry parameters.
Definition mtu.h:103
Garbage collection arena used to keep track of dynamically allocated memory.
Definition buffer.h:116
struct http_proxy_options options
Definition proxy.h:70
const char * port
Definition proxy.h:47
const char * server
Definition proxy.h:46
Definition options.h:100
const char * port
Definition options.h:102
int proto
Definition options.h:103
const char * local
Definition options.h:101
struct local_entry ** array
Definition options.h:196
struct man_connection connection
Definition manage.h:335
union openvpn_sockaddr::@27 addr
struct sockaddr sa
Definition socket_util.h:42
struct sockaddr_in in4
Definition socket_util.h:43
struct sockaddr_in6 in6
Definition socket_util.h:44
int resolve_retry_seconds
Definition options.h:370
int rcvbuf
Definition options.h:419
const char * ip_remote_hint
Definition options.h:372
HANDLE msg_channel
Definition options.h:698
struct connection_entry ce
Definition options.h:293
const char * ipchange
Definition options.h:320
int mode
Definition options.h:265
char * bind_dev
Definition options.h:424
int sndbuf
Definition options.h:420
int mark
Definition options.h:423
unsigned int sockflags
Definition options.h:427
const char * dev_node
Definition options.h:323
DWORD flags
Definition win32.h:211
struct buffer buf
Definition win32.h:221
DWORD size
Definition win32.h:210
OVERLAPPED overlapped
Definition win32.h:209
struct buffer buf_init
Definition win32.h:220
int addrlen
Definition win32.h:219
bool addr_defined
Definition win32.h:213
int iostate
Definition win32.h:208
struct sockaddr_in6 addr6
Definition win32.h:217
struct sockaddr_in addr
Definition win32.h:216
HANDLE write
Definition win32.h:82
HANDLE read
Definition win32.h:81
const char * signal_text
Definition sig.h:44
volatile int signal_received
Definition sig.h:42
volatile int source
Definition sig.h:43
bool is_handle
Definition socket.h:261
bool prepend_sa
Definition socket.h:262
char server[128]
Definition socks.h:40
const char * port
Definition socks.h:41
struct buffer buf
Definition socket.h:109
struct buffer residual
Definition socket.h:105
bool residual_fully_formed
Definition socket.h:107
int maxlen
Definition socket.h:106
HANDLE msg_channel
Definition tun.h:88
Definition tun.h:183
enum tun_driver_type backend_driver
The backend driver that used for this tun/tap device.
Definition tun.h:193
OVERLAPPED dco_new_peer_ov
Definition tun.h:220
struct tuntap_options options
Definition tun.h:205
HANDLE hand
Definition tun.h:218
unsigned short sa_family_t
Definition syshead.h:396
#define SOCKET_UNDEFINED
Definition syshead.h:438
#define SOL_IP
Definition syshead.h:389
SOCKET socket_descriptor_t
Definition syshead.h:440
static int socket_defined(const socket_descriptor_t sd)
Definition syshead.h:448
#define ENABLE_IP_PKTINFO
Definition syshead.h:381
struct env_set * es
struct gc_arena gc
Definition test_ssl.c:131
void tun_open_device(struct tuntap *tt, const char *dev_node, const char **device_guid, struct gc_arena *gc)
Definition tun.c:6044
@ DRIVER_DCO
Definition tun.h:53
void init_net_event_win32(struct rw_handle *event, long network_events, socket_descriptor_t sd, unsigned int flags)
Definition win32.c:219
void overlapped_io_init(struct overlapped_io *o, const struct frame *frame, BOOL event_state)
Definition win32.c:169
void close_net_event_win32(struct rw_handle *event, socket_descriptor_t sd, unsigned int flags)
Definition win32.c:274
char * overlapped_io_state_ascii(const struct overlapped_io *o)
Definition win32.c:198
void overlapped_io_close(struct overlapped_io *o)
Definition win32.c:185
static bool defined_net_event_win32(const struct rw_handle *event)
Definition win32.h:93
#define IOSTATE_IMMEDIATE_RETURN
Definition win32.h:207
#define IOSTATE_INITIAL
Definition win32.h:205
#define IOSTATE_QUEUED
Definition win32.h:206