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