OpenVPN
init.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#ifdef ENABLE_SYSTEMD
30#include <systemd/sd-daemon.h>
31#endif
32
33#include "win32.h"
34#include "init.h"
35#include "run_command.h"
36#include "sig.h"
37#include "occ.h"
38#include "list.h"
39#include "otime.h"
40#include "pool.h"
41#include "gremlin.h"
42#include "occ.h"
43#include "pkcs11.h"
44#include "ps.h"
45#include "lladdr.h"
46#include "ping.h"
47#include "ssl_verify.h"
48#include "ssl_ncp.h"
49#include "tls_crypt.h"
50#include "forward.h"
51#include "auth_token.h"
52#include "mss.h"
53#include "mudp.h"
54#include "dco.h"
55#include "tun_afunix.h"
56#include "schedule.h"
57#include "options_string.h"
58#include "resolve.h"
59#include "acc.h"
60
61#include "memdbg.h"
62
63
64static struct context *static_context; /* GLOBAL */
65static const char *saved_pid_file_name; /* GLOBAL */
66
67/*
68 * Crypto initialization flags
69 */
70#define CF_LOAD_PERSISTED_PACKET_ID (1 << 0)
71#define CF_INIT_TLS_MULTI (1 << 1)
72#define CF_INIT_TLS_AUTH_STANDALONE (1 << 2)
73
74static void do_init_first_time(struct context *c);
75
76static bool do_deferred_p2p_ncp(struct context *c);
77
78static void
80{
81 CLEAR(*c);
82}
83
84static void
86{
87 CLEAR(c->c1);
88}
89
90void
92{
93 CLEAR(c->c2);
94}
95
96void
98{
99 const bool first_time_save = c->first_time;
100 const struct context_persist cpsave = c->persist;
101 context_clear(c);
102 c->first_time = first_time_save;
103 c->persist = cpsave;
104}
105
106/*
107 * Pass tunnel endpoint and MTU parms to a user-supplied script.
108 * Used to execute the up/down script/plugins.
109 */
110static void
111run_up_down(const char *command, const struct plugin_list *plugins, int plugin_type,
112 const char *arg,
113#ifdef _WIN32
114 DWORD adapter_index,
115#endif
116 const char *dev_type, int tun_mtu, const char *ifconfig_local,
117 const char *ifconfig_remote, const char *context, const char *signal_text,
118 const char *script_type, struct env_set *es)
119{
120 struct gc_arena gc = gc_new();
121
122 if (signal_text)
123 {
124 setenv_str(es, "signal", signal_text);
125 }
126 setenv_str(es, "script_context", context);
127 setenv_int(es, "tun_mtu", tun_mtu);
128 setenv_str(es, "dev", arg);
129 if (dev_type)
130 {
131 setenv_str(es, "dev_type", dev_type);
132 }
133#ifdef _WIN32
134 setenv_int(es, "dev_idx", adapter_index);
135#endif
136
137 if (!ifconfig_local)
138 {
139 ifconfig_local = "";
140 }
141 if (!ifconfig_remote)
142 {
143 ifconfig_remote = "";
144 }
145 if (!context)
146 {
147 context = "";
148 }
149
150 if (plugin_defined(plugins, plugin_type))
151 {
152 struct argv argv = argv_new();
153 ASSERT(arg);
154 argv_printf(&argv, "%s %d 0 %s %s %s", arg, tun_mtu, ifconfig_local, ifconfig_remote,
155 context);
156
157 if (plugin_call(plugins, plugin_type, &argv, NULL, es) != OPENVPN_PLUGIN_FUNC_SUCCESS)
158 {
159 msg(M_FATAL, "ERROR: up/down plugin call failed");
160 }
161
162 argv_free(&argv);
163 }
164
165 if (command)
166 {
167 struct argv argv = argv_new();
168 ASSERT(arg);
169 setenv_str(es, "script_type", script_type);
170 argv_parse_cmd(&argv, command);
171 argv_printf_cat(&argv, "%s %d 0 %s %s %s", arg, tun_mtu, ifconfig_local, ifconfig_remote,
172 context);
174 openvpn_run_script(&argv, es, S_FATAL, "--up/--down");
175 argv_free(&argv);
176 }
177
178 gc_free(&gc);
179}
180
181/*
182 * Should be called after options->ce is modified at the top
183 * of a SIGUSR1 restart.
184 */
185static void
187{
188 /*
189 * In pull mode, we usually import --ping/--ping-restart parameters from
190 * the server. However we should also set an initial default --ping-restart
191 * for the period of time before we pull the --ping-restart parameter
192 * from the server.
193 */
196 {
199 }
200}
201
202#ifdef ENABLE_MANAGEMENT
203static bool
204management_callback_proxy_cmd(void *arg, const char **p)
205{
206 struct context *c = arg;
207 struct connection_entry *ce = &c->options.ce;
208 struct gc_arena *gc = &c->c2.gc;
209 bool ret = false;
210
211 update_time();
212 if (streq(p[1], "NONE"))
213 {
214 ret = true;
215 }
216 else if (p[2] && p[3])
217 {
218 if (streq(p[1], "HTTP"))
219 {
220 struct http_proxy_options *ho;
221 if (ce->proto != PROTO_TCP && ce->proto != PROTO_TCP_CLIENT)
222 {
223 msg(M_WARN, "HTTP proxy support only works for TCP based connections");
224 return false;
225 }
227 ho->server = string_alloc(p[2], gc);
228 ho->port = string_alloc(p[3], gc);
229 ho->auth_retry = (p[4] && streq(p[4], "nct") ? PAR_NCT : PAR_ALL);
230 ret = true;
231 }
232 else if (streq(p[1], "SOCKS"))
233 {
235 ce->socks_proxy_port = string_alloc(p[3], gc);
236 ret = true;
237 }
238 }
239 else
240 {
241 msg(M_WARN, "Bad proxy command");
242 }
243
245
246 return ret;
247}
248
249static bool
251{
252 const struct connection_list *l = c->options.connection_list;
253 struct connection_entry *ce = &c->options.ce;
254 struct gc_arena gc;
255 bool ret = true;
256
257 update_time();
258 if (management)
259 {
260 gc = gc_new();
261 {
262 struct buffer out = alloc_buf_gc(256, &gc);
263 buf_printf(&out, ">PROXY:%d,%s,%s", (l ? l->current : 0) + 1,
264 (proto_is_udp(ce->proto) ? "UDP" : "TCP"), np(ce->remote));
267 }
269 while (ce->flags & CE_MAN_QUERY_PROXY)
270 {
272 if (IS_SIG(c))
273 {
274 ret = false;
275 break;
276 }
277 }
279 gc_free(&gc);
280 }
281
282 return ret;
283}
284
299static bool
300management_callback_send_cc_message(void *arg, const char *command, const char *parameters)
301{
302 struct context *c = (struct context *)arg;
303 size_t len = strlen(command) + 1;
304 if (parameters)
305 {
306 len += 1 + strlen(parameters);
307 }
308 if (len > PUSH_BUNDLE_SIZE)
309 {
310 return false;
311 }
312
313 struct gc_arena gc = gc_new();
314 struct buffer buf = alloc_buf_gc(len, &gc);
315 ASSERT(buf_printf(&buf, "%s", command));
316 if (parameters)
317 {
318 ASSERT(buf_printf(&buf, ",%s", parameters));
319 }
321
322 gc_free(&gc);
323 return status;
324}
325
326static unsigned int
328{
329 ASSERT(arg);
330 const struct context *c = (struct context *)arg;
331 const struct connection_list *l = c->options.connection_list;
332
333 return l->len;
334}
335
336static bool
337management_callback_remote_entry_get(void *arg, unsigned int index, char **remote)
338{
339 ASSERT(arg);
340 ASSERT(remote);
341
342 struct context *c = (struct context *)arg;
344 bool ret = true;
345
346 if (l->len > 0 && index < (unsigned int)l->len)
347 {
348 const struct connection_entry *ce = l->array[index];
349 const char *proto = proto2ascii(ce->proto, ce->af, false);
350 const char *status = (ce->flags & CE_DISABLED) ? "disabled" : "enabled";
351
352 /* space for output including 3 commas and a nul */
353 size_t len =
354 strlen(ce->remote) + strlen(ce->remote_port) + strlen(proto) + strlen(status) + 3 + 1;
355 char *out = malloc(len);
357
358 snprintf(out, len, "%s,%s,%s,%s", ce->remote, ce->remote_port, proto, status);
359 *remote = out;
360 }
361 else
362 {
363 ret = false;
364 msg(M_WARN, "Out of bounds index in management query for remote entry: index = %u", index);
365 }
366
367 return ret;
368}
369
370static bool
371management_callback_remote_cmd(void *arg, const char **p)
372{
373 struct context *c = (struct context *)arg;
374 struct connection_entry *ce = &c->options.ce;
375 int ret = false;
376 if (p[1]
379 {
380 unsigned int flags = 0;
381 if (!strcmp(p[1], "ACCEPT"))
382 {
384 ret = true;
385 }
386 else if (!strcmp(p[1], "SKIP"))
387 {
389 ret = true;
390 c->options.ce_advance_count = (p[2]) ? atoi(p[2]) : 1;
391 }
392 else if (!strcmp(p[1], "MOD") && p[2] && p[3])
393 {
394 if (strlen(p[2]) < RH_HOST_LEN && strlen(p[3]) < RH_PORT_LEN)
395 {
396 struct remote_host_store *rhs = c->options.rh_store;
397 if (!rhs)
398 {
400 c->options.rh_store = rhs;
401 }
402 strlcpy(rhs->host, p[2], RH_HOST_LEN);
403 strlcpy(rhs->port, p[3], RH_PORT_LEN);
404
405 ce->remote = rhs->host;
406 ce->remote_port = rhs->port;
408 ret = true;
409 }
410 }
411 if (ret)
412 {
415 }
416 }
417 return ret;
418}
419
420static bool
422{
423 struct gc_arena gc = gc_new();
424 volatile struct connection_entry *ce = &c->options.ce;
425 int ce_changed = true; /* presume the connection entry will be changed */
426
427 update_time();
428 if (management)
429 {
430 struct buffer out = alloc_buf_gc(256, &gc);
431
432 buf_printf(&out, ">REMOTE:%s,%s,%s", np(ce->remote), ce->remote_port,
433 proto2ascii(ce->proto, ce->af, false));
436
441 {
443 if (IS_SIG(c))
444 {
445 ce_changed = false; /* connection entry have not been set */
446 break;
447 }
448 }
450 }
451 gc_free(&gc);
452
453 if (ce_changed)
454 {
455 /* If it is likely a connection entry was modified,
456 * check what changed in the flags and that it was not skipped
457 */
458 const int flags = ((ce->flags >> CE_MAN_QUERY_REMOTE_SHIFT) & CE_MAN_QUERY_REMOTE_MASK);
459 ce_changed = (flags != CE_MAN_QUERY_REMOTE_SKIP);
460 }
461 return ce_changed;
462}
463#endif /* ENABLE_MANAGEMENT */
464
476static void
478{
480
481 l->current = -1;
482 if (c->options.remote_random)
483 {
484 for (int i = l->len - 1; i > 0; --i)
485 {
486 const int64_t j = get_random() % (i + 1);
487 if (i != j)
488 {
489 struct connection_entry *tmp;
490 tmp = l->array[i];
491 l->array[i] = l->array[j];
492 l->array[j] = tmp;
493 }
494 }
495 }
496}
497
498/*
499 * Clear the remote address list
500 */
501static void
503{
504 if (lsa->remote_list && free)
505 {
506 freeaddrinfo(lsa->remote_list);
507 }
508 lsa->remote_list = NULL;
509 lsa->current_remote = NULL;
510}
511
512/*
513 * Increment to next connection entry
514 */
515static void
517{
519 bool ce_defined;
520 const struct connection_entry *ce;
521 int n_cycles = 0;
522
523 do
524 {
525 ce_defined = true;
526 if (c->options.no_advance && l->current >= 0)
527 {
528 c->options.no_advance = false;
529 }
530 else
531 {
532 /* Check if there is another resolved address to try for
533 * the current connection */
535 && c->c1.link_socket_addrs[0].current_remote->ai_next
537 {
539 c->c1.link_socket_addrs[0].current_remote->ai_next;
540 }
541 else
542 {
543 c->options.advance_next_remote = false;
544 /* FIXME (schwabe) fix the persist-remote-ip option for real,
545 * this is broken probably ever since connection lists and multiple
546 * remote existed
547 */
549 {
550 /* Connection entry addrinfo objects might have been
551 * resolved earlier but the entry itself might have been
552 * skipped by management on the previous loop.
553 * If so, clear the addrinfo objects as close_instance does
554 */
556 {
559 }
560
561 /* close_instance should have cleared the addrinfo objects */
563 ASSERT(c->c1.link_socket_addrs[0].remote_list == NULL);
564 }
565 else
566 {
569 }
570
571 int advance_count = 1;
572
573 /* If previous connection entry was skipped by management client
574 * with a count to advance by, apply it.
575 */
576 if (c->options.ce_advance_count > 0)
577 {
578 advance_count = c->options.ce_advance_count;
579 }
580
581 /*
582 * Increase the number of connection attempts
583 * If this is connect-retry-max * size(l)
584 * OpenVPN will quit
585 */
586
587 c->options.unsuccessful_attempts += advance_count;
588 l->current += advance_count;
589
590 if (l->current >= l->len)
591 {
592 l->current %= l->len;
593 if (++n_cycles >= 2)
594 {
595 msg(M_FATAL, "No usable connection profiles are present");
596 }
597 }
598 }
599 }
600
602 ce = l->array[l->current];
603
604 if (ce->flags & CE_DISABLED)
605 {
606 ce_defined = false;
607 }
608
609 c->options.ce = *ce;
610
611#ifdef ENABLE_MANAGEMENT
613 {
614 /* allow management interface to override connection entry details */
615 ce_defined = ce_management_query_remote(c);
616 if (IS_SIG(c))
617 {
618 break;
619 }
620 }
621 else if (ce_defined && management && management_query_proxy_enabled(management))
622 {
623 ce_defined = ce_management_query_proxy(c);
624 if (IS_SIG(c))
625 {
626 break;
627 }
628 }
629#endif
630 } while (!ce_defined);
631
632 /* Check if this connection attempt would bring us over the limit */
633 int max_attempts = l->len * c->options.connect_retry_max;
634 if (max_attempts > 0 && c->options.unsuccessful_attempts > (unsigned int)max_attempts)
635 {
636 msg(M_FATAL, "All connections have been connect-retry-max (%d) times unsuccessful, exiting",
638 }
640}
641
642/*
643 * Query for private key and auth-user-pass username/passwords
644 */
645void
647{
648 /* Certificate password input */
649 if (c->options.key_pass_file)
650 {
652 }
653
654 /* Auth user/pass input */
656 {
658#ifdef ENABLE_MANAGEMENT
661#else
664#endif
665 }
666}
667
668/*
669 * Initialize/Uninitialize HTTP or SOCKS proxy
670 */
671
672static void
674{
675 if (c->c1.http_proxy_owned && c->c1.http_proxy)
676 {
678 c->c1.http_proxy = NULL;
679 c->c1.http_proxy_owned = false;
680 }
681 if (c->c1.socks_proxy_owned && c->c1.socks_proxy)
682 {
684 c->c1.socks_proxy = NULL;
685 c->c1.socks_proxy_owned = false;
686 }
687}
688
689static void
691{
692 bool did_http = false;
693
695
697 {
699
700 /* Possible HTTP proxy user/pass input */
702 if (c->c1.http_proxy)
703 {
704 did_http = true;
705 c->c1.http_proxy_owned = true;
706 }
707 }
708
709 if (!did_http && c->options.ce.socks_proxy_server)
710 {
711 c->c1.socks_proxy =
714 if (c->c1.socks_proxy)
715 {
716 c->c1.socks_proxy_owned = true;
717 }
718 }
719}
720
721static void
723{
725}
726
727static void
729{
731}
732
733static void
739
740void
742{
744
746
748
750
752
753#if defined(ENABLE_PKCS11)
754 if (c->first_time)
755 {
756 int i;
757 pkcs11_initialize(true, c->options.pkcs11_pin_cache_period);
758 for (i = 0; i < MAX_PARMS && c->options.pkcs11_providers[i] != NULL; i++)
759 {
760 pkcs11_addProvider(
761 c->options.pkcs11_providers[i], c->options.pkcs11_protected_authentication[i],
762 c->options.pkcs11_private_mode[i], c->options.pkcs11_cert_private[i]);
763 }
764 }
765#endif
766
767#if 0 /* test get_user_pass with GET_USER_PASS_NEED_OK flag */
768 {
769 /*
770 * In the management interface, you can okay the request by entering "needok token-insertion-request ok"
771 */
772 struct user_pass up;
773 CLEAR(up);
774 strcpy(up.username, "Please insert your cryptographic token"); /* put the high-level message in up.username */
775 get_user_pass(&up, NULL, "token-insertion-request", GET_USER_PASS_MANAGEMENT|GET_USER_PASS_NEED_OK);
776 msg(M_INFO, "RET:%s", up.password); /* will return the third argument to management interface
777 * 'needok' command, usually 'ok' or 'cancel'. */
778 }
779#endif
780
781#ifdef ENABLE_SYSTEMD
782 /* We can report the PID via getpid() to systemd here as OpenVPN will not
783 * do any fork due to daemon() a future call.
784 * See possibly_become_daemon() [init.c] for more details.
785 */
786 sd_notifyf(0, "READY=1\nSTATUS=Pre-connection initialization successful\nMAINPID=%lu",
787 (unsigned long)getpid());
788#endif
789}
790
791void
793{
794 gc_free(&c->c2.gc);
795 gc_free(&c->options.gc);
796 gc_free(&c->gc);
797}
798
799#if PORT_SHARE
800
801static void
802close_port_share(void)
803{
804 if (port_share)
805 {
806 port_share_close(port_share);
807 port_share = NULL;
808 }
809}
810
811static void
812init_port_share(const struct context *c)
813{
814 if (!port_share && (c->options.port_share_host && c->options.port_share_port))
815 {
816 port_share =
817 port_share_open(c->options.port_share_host, c->options.port_share_port,
818 c->c2.frame.buf.payload_size, c->options.port_share_journal_dir);
819 if (port_share == NULL)
820 {
821 msg(M_FATAL, "Fatal error: Port sharing failed");
822 }
823 }
824}
825
826#endif /* if PORT_SHARE */
827
828
829bool
831{
832 /*
833 * Initialize random number seed. random() is only used
834 * when "weak" random numbers are acceptable.
835 * SSL library routines are always used when cryptographically
836 * strong random numbers are required.
837 */
838 struct timeval tv;
839 if (!gettimeofday(&tv, NULL))
840 {
841 const unsigned int seed = (unsigned int)(tv.tv_sec ^ tv.tv_usec);
842 srandom(seed);
843 }
844
845 error_reset(); /* initialize error.c */
846 reset_check_status(); /* initialize status check code in socket.c */
847
848#ifdef _WIN32
849 init_win32();
850#endif
851
852#ifdef OPENVPN_DEBUG_COMMAND_LINE
853 {
854 int i;
855 for (i = 0; i < argc; ++i)
856 {
857 msg(M_INFO, "argv[%d] = '%s'", i, argv[i]);
858 }
859 }
860#endif
861
862 update_time();
863
864 init_ssl_lib();
865
866#ifdef IFCONFIG_POOL_TEST
867 ifconfig_pool_test(0x0A010004, 0x0A0100FF);
868 return false;
869#endif
870
871#ifdef TIME_TEST
872 time_test();
873 return false;
874#endif
875
876#ifdef GEN_PATH_TEST
877 {
878 struct gc_arena gc = gc_new();
879 const char *fn = gen_path("foo", "bar", &gc);
880 printf("%s\n", fn);
881 gc_free(&gc);
882 }
883 return false;
884#endif
885
886#ifdef STATUS_PRINTF_TEST
887 {
888 struct gc_arena gc = gc_new();
889 const char *tmp_file = platform_create_temp_file("/tmp", "foo", &gc);
890 struct status_output *so = status_open(tmp_file, 0, -1, NULL, STATUS_OUTPUT_WRITE);
891 status_printf(so, "%s", "foo");
892 status_printf(so, "%s", "bar");
893 if (!status_close(so))
894 {
895 msg(M_WARN, "STATUS_PRINTF_TEST: %s: write error", tmp_file);
896 }
897 gc_free(&gc);
898 }
899 return false;
900#endif
901
902 return true;
903}
904
905void
907{
908 free_ssl_lib();
909
910#ifdef ENABLE_PKCS11
911 pkcs11_terminate();
912#endif
913
914#if PORT_SHARE
915 close_port_share();
916#endif
917
918#if defined(MEASURE_TLS_HANDSHAKE_STATS)
919 show_tls_performance_stats();
920#endif
921}
922
923void
924init_verb_mute(struct context *c, unsigned int flags)
925{
926 if (flags & IVM_LEVEL_1)
927 {
928 /* set verbosity and mute levels */
932 }
933
934 /* special D_LOG_RW mode */
935 if (flags & IVM_LEVEL_2)
936 {
938 }
939}
940
941/*
942 * Possibly set --dev based on --dev-node.
943 * For example, if --dev-node /tmp/foo/tun, and --dev undefined,
944 * set --dev to tun.
945 */
946void
948{
949 if (!options->dev && options->dev_node)
950 {
951 /* POSIX basename() implementations may modify its arguments */
952 char *dev_node = string_alloc(options->dev_node, NULL);
953 options->dev = basename(dev_node);
954 }
955}
956
957bool
959{
960 /*
961 * OpenSSL info print mode?
962 */
965 {
967 {
969 }
971 {
973 }
975 {
977 }
979 {
982 }
983 if (options->show_curves)
984 {
986 }
987 return true;
988 }
989 return false;
990}
991
992/*
993 * Static pre-shared key generation mode?
994 */
995bool
997{
998 /* should we disable paging? */
999 if (options->mlock && (options->genkey))
1000 {
1001 platform_mlockall(true);
1002 }
1003
1004 /*
1005 * We do not want user to use --genkey with --secret. In the transistion
1006 * phase we for secret.
1007 */
1009 {
1010 msg(M_USAGE, "Using --genkey type with --secret filename is "
1011 "not supported. Use --genkey type filename instead.");
1012 }
1014 {
1015 int nbits_written;
1016 const char *genkey_filename = options->genkey_filename;
1018 {
1019 msg(M_USAGE, "You must provide a filename to either --genkey "
1020 "or --secret, not both");
1021 }
1022
1023 /*
1024 * Copy filename from shared_secret_file to genkey_filename to support
1025 * the old --genkey --secret foo.file syntax.
1026 */
1028 {
1029 msg(M_WARN, "WARNING: Using --genkey --secret filename is "
1030 "DEPRECATED. Use --genkey secret filename instead.");
1031 genkey_filename = options->shared_secret_file;
1032 }
1033
1034 nbits_written = write_key_file(2, genkey_filename);
1035 if (nbits_written < 0)
1036 {
1037 msg(M_FATAL, "Failed to write key file");
1038 }
1039
1040 msg(D_GENKEY | M_NOPREFIX, "Randomly generated %d bit key written to %s", nbits_written,
1042 return true;
1043 }
1045 {
1047 return true;
1048 }
1050 {
1052 {
1053 msg(M_USAGE,
1054 "--genkey tls-crypt-v2-client requires a server key to be set via --tls-crypt-v2 to create a client key");
1055 }
1056
1060 return true;
1061 }
1063 {
1065 return true;
1066 }
1067 else
1068 {
1069 return false;
1070 }
1071}
1072
1073/*
1074 * Persistent TUN/TAP device management mode?
1075 */
1076bool
1078{
1079 if (!options->persist_config)
1080 {
1081 return false;
1082 }
1083
1084 /* sanity check on options for --mktun or --rmtun */
1085 notnull(options->dev, "TUN/TAP device (--dev)");
1088 {
1090 "options --mktun or --rmtun should only be used together with --dev");
1091 }
1092
1093#if defined(ENABLE_DCO)
1094 if (dco_enabled(options))
1095 {
1096 /* creating a DCO interface via --mktun is not supported as it does not
1097 * make much sense. Since DCO is enabled by default, people may run into
1098 * this without knowing, therefore this case should be properly handled.
1099 *
1100 * Disable DCO if --mktun was provided and print a message to let
1101 * user know.
1102 */
1104 {
1105 msg(M_WARN, "Note: --mktun does not support DCO. Creating TUN interface.");
1106 }
1107
1108 options->disable_dco = true;
1109 }
1110#endif
1111
1112#ifdef ENABLE_FEATURE_TUN_PERSIST
1116 {
1117 set_lladdr(ctx, options->dev, options->lladdr, NULL);
1118 }
1119 return true;
1120#else /* ifdef ENABLE_FEATURE_TUN_PERSIST */
1122 "options --mktun and --rmtun are not available on your operating "
1123 "system. Please check 'man tun' (or 'tap'), whether your system "
1124 "supports using 'ifconfig %s create' / 'destroy' to create/remove "
1125 "persistent tunnel interfaces.",
1126 options->dev);
1127#endif
1128 return false;
1129}
1130
1131/*
1132 * Should we become a daemon?
1133 * Return true if we did it.
1134 */
1135bool
1137{
1138 bool ret = false;
1139
1140#ifdef ENABLE_SYSTEMD
1141 /* return without forking if we are running from systemd */
1142 if (sd_notify(0, "READY=0") > 0)
1143 {
1144 return ret;
1145 }
1146#endif
1147
1148 if (options->daemon)
1149 {
1150 /* Don't chdir immediately, but the end of the init sequence, if needed */
1151
1152#if defined(__APPLE__) && defined(__clang__)
1153#pragma clang diagnostic push
1154#pragma clang diagnostic ignored "-Wdeprecated-declarations"
1155#endif
1156 if (daemon(1, options->log) < 0)
1157 {
1158 msg(M_ERR, "daemon() failed or unsupported");
1159 }
1160#if defined(__APPLE__) && defined(__clang__)
1161#pragma clang diagnostic pop
1162#endif
1164 if (options->log)
1165 {
1167 }
1168
1169 ret = true;
1170 }
1171 return ret;
1172}
1173
1174/*
1175 * Actually do UID/GID downgrade, chroot and SELinux context switching, if requested.
1176 */
1177static void
1178do_uid_gid_chroot(struct context *c, bool no_delay)
1179{
1180 static const char why_not[] = "will be delayed because of --client, --pull, or --up-delay";
1181 struct context_0 *c0 = c->c0;
1182
1183 if (c0 && !c0->uid_gid_chroot_set)
1184 {
1185 /* chroot if requested */
1186 if (c->options.chroot_dir)
1187 {
1188 if (no_delay)
1189 {
1191 }
1192 else if (c->first_time)
1193 {
1194 msg(M_INFO, "NOTE: chroot %s", why_not);
1195 }
1196 }
1197
1198 /* set user and/or group if we want to setuid/setgid */
1199 if (c0->uid_gid_specified)
1200 {
1201 if (no_delay)
1202 {
1204 }
1205 else if (c->first_time)
1206 {
1207 msg(M_INFO, "NOTE: UID/GID downgrade %s", why_not);
1208 }
1209 }
1210
1211#ifdef ENABLE_SELINUX
1212 /* Apply a SELinux context in order to restrict what OpenVPN can do
1213 * to _only_ what it is supposed to do after initialization is complete
1214 * (basically just network I/O operations). Doing it after chroot
1215 * requires /proc to be mounted in the chroot (which is annoying indeed
1216 * but doing it before requires more complex SELinux policies.
1217 */
1218 if (c->options.selinux_context)
1219 {
1220 if (no_delay)
1221 {
1222 if (-1 == setcon(c->options.selinux_context))
1223 {
1224 msg(M_ERR, "setcon to '%s' failed; is /proc accessible?",
1225 c->options.selinux_context);
1226 }
1227 else
1228 {
1229 msg(M_INFO, "setcon to '%s' succeeded", c->options.selinux_context);
1230 }
1231 }
1232 else if (c->first_time)
1233 {
1234 msg(M_INFO, "NOTE: setcon %s", why_not);
1235 }
1236 }
1237#endif
1238
1239 /* Privileges are going to be dropped by now (if requested), be sure
1240 * to prevent any future privilege dropping attempts from now on.
1241 */
1242 if (no_delay)
1243 {
1244 c0->uid_gid_chroot_set = true;
1245 }
1246 }
1247}
1248
1249/*
1250 * Return common name in a way that is formatted for
1251 * prepending to msg() output.
1252 */
1253const char *
1254format_common_name(const struct context *c, struct gc_arena *gc)
1255{
1256 struct buffer out = alloc_buf_gc(256, gc);
1257 if (c->c2.tls_multi)
1258 {
1259 buf_printf(&out, "[%s] ", tls_common_name(c->c2.tls_multi, false));
1260 }
1261 return BSTR(&out);
1262}
1263
1264void
1266{
1267#ifdef _WIN32
1269 {
1272 }
1273 else
1274 {
1276
1277 /* put a title on the top window bar */
1279 {
1282 }
1283 }
1284#endif /* ifdef _WIN32 */
1285}
1286
1287void
1289{
1290 c->c2.coarse_timer_wakeup = 0;
1291}
1292
1293/*
1294 * Initialise the server poll timeout timer
1295 * This timer is used in the http/socks proxy setup so it needs to be setup
1296 * before
1297 */
1298static void
1307
1308/*
1309 * Initialize timers
1310 */
1311static void
1312do_init_timers(struct context *c, bool deferred)
1313{
1314 update_time();
1316
1317 /* initialize inactivity timeout */
1319 {
1321 }
1322
1323 /* initialize inactivity timeout */
1324 if (c->options.session_timeout)
1325 {
1327 }
1328
1329 /* initialize pings */
1330 if (dco_enabled(&c->options))
1331 {
1332 /* The DCO kernel module will send the pings instead of user space */
1335 }
1336 else
1337 {
1339 {
1341 }
1342
1344 {
1346 }
1347 }
1348
1349 /* If the auth-token renewal interval is shorter than reneg-sec, arm
1350 * "auth-token renewal" timer to send additional auth-token to update the
1351 * token on the client more often. If not, this happens automatically
1352 * at renegotiation time, without needing an extra event.
1353 */
1356 {
1358 }
1359
1360 if (!deferred)
1361 {
1362 /* initialize connection establishment timer */
1364
1365 /* initialize occ timers */
1366
1367 if (c->options.occ && !TLS_MODE(c) && c->c2.options_string_local
1369 {
1371 }
1372
1373 if (c->options.mtu_test)
1374 {
1376 now);
1377 }
1378
1379 /* initialize packet_id persistence timer */
1380 if (c->options.packet_id_file)
1381 {
1383 }
1384
1385 /* initialize tmp_int optimization that limits the number of times we call
1386 * tls_multi_process in the main event loop */
1388 }
1389}
1390
1391/*
1392 * Initialize traffic shaper.
1393 */
1394static void
1396{
1397 /* initialize traffic shaper (i.e. transmit bandwidth limiter) */
1398 if (c->options.shaper)
1399 {
1401 shaper_msg(&c->c2.shaper);
1402 }
1403}
1404
1405/*
1406 * Allocate route list structures for IPv4 and IPv6
1407 * (we do this for IPv4 even if no --route option has been seen, as other
1408 * parts of OpenVPN might want to fill the route-list with info, e.g. DHCP)
1409 */
1410static void
1412{
1413 if (!c->c1.route_list)
1414 {
1415 ALLOC_OBJ_CLEAR_GC(c->c1.route_list, struct route_list, &c->gc);
1416 }
1417 if (c->options.routes_ipv6 && !c->c1.route_ipv6_list)
1418 {
1420 }
1421}
1422
1423
1424/*
1425 * Initialize the route list, resolving any DNS names in route
1426 * options and saving routes in the environment.
1427 */
1428static void
1430 const struct link_socket_info *link_socket_info, struct env_set *es,
1431 openvpn_net_ctx_t *ctx)
1432{
1433 const char *gw = NULL;
1435 int metric = 0;
1436
1437 /* if DCO is enabled we have both regular routes and iroutes in the system
1438 * routing table, and normal routes must have a higher metric for that to
1439 * work so that iroutes are always matched first
1440 */
1441 if (dco_enabled(options))
1442 {
1443 metric = DCO_DEFAULT_METRIC;
1444 }
1445
1446 if (dev == DEV_TYPE_TUN && (options->topology == TOP_NET30 || options->topology == TOP_P2P))
1447 {
1449 }
1451 {
1453 }
1455 {
1456 metric = options->route_default_metric;
1457 }
1458
1459 if (init_route_list(route_list, options->routes, gw, metric,
1461 {
1462 /* copy routes to environment */
1464 }
1465}
1466
1467static void
1469 const struct link_socket_info *link_socket_info, struct env_set *es,
1470 openvpn_net_ctx_t *ctx)
1471{
1472 const char *gw = NULL;
1473 int metric = -1; /* no metric set */
1474
1475 /* see explanation in do_init_route_list() */
1476 if (dco_enabled(options))
1477 {
1478 metric = DCO_DEFAULT_METRIC;
1479 }
1480
1481 gw = options->ifconfig_ipv6_remote; /* default GW = remote end */
1483 {
1485 }
1486
1488 {
1489 metric = options->route_default_metric;
1490 }
1491
1492 /* redirect (IPv6) gateway to VPN? if yes, add a few more specifics
1493 */
1495 {
1496 char *opt_list[] = { "::/3", "2000::/4", "3000::/4", "fc00::/7", NULL };
1497 int i;
1498
1499 for (i = 0; opt_list[i]; i++)
1500 {
1502 string_alloc(opt_list[i], options->routes_ipv6->gc), NULL,
1504 }
1505 }
1506
1509 {
1510 /* copy routes to environment */
1512 }
1513}
1514
1515
1516/*
1517 * Called after all initialization has been completed.
1518 */
1519void
1520initialization_sequence_completed(struct context *c, const unsigned int flags)
1521{
1522 static const char message[] = "Initialization Sequence Completed";
1523
1524 /* Reset the unsuccessful connection counter on complete initialisation */
1526
1527 /* If we delayed UID/GID downgrade or chroot, do it now */
1528 do_uid_gid_chroot(c, true);
1529
1530 /* Test if errors */
1531 if (flags & ISC_ERRORS)
1532 {
1533#ifdef _WIN32
1536 msg(M_INFO, "%s With Errors ( see http://openvpn.net/faq.html#dhcpclientserv )", message);
1537#else
1538#ifdef ENABLE_SYSTEMD
1539 sd_notifyf(0, "STATUS=Failed to start up: %s With Errors\nERRNO=1", message);
1540#endif
1541 msg(M_INFO, "%s With Errors", message);
1542#endif
1543 }
1544 else
1545 {
1546#ifdef ENABLE_SYSTEMD
1547 sd_notifyf(0, "STATUS=%s", message);
1548#endif
1549 msg(M_INFO, "%s", message);
1550 }
1551
1552 /* Flag that we initialized */
1553 if ((flags & (ISC_ERRORS | ISC_SERVER)) == 0)
1554 {
1555 c->options.no_advance = true;
1556 }
1557
1558#ifdef _WIN32
1560#endif
1561
1562#ifdef ENABLE_MANAGEMENT
1563 /* Tell management interface that we initialized */
1564 if (management)
1565 {
1566 const in_addr_t *tun_local = NULL;
1567 const struct in6_addr *tun_local6 = NULL;
1568 struct openvpn_sockaddr local, remote;
1569 const struct link_socket_actual *actual;
1570 socklen_t sa_len = sizeof(local);
1571 const char *detail = "SUCCESS";
1572 if (flags & ISC_ERRORS)
1573 {
1574 detail = "ERROR";
1575 }
1576 /* Flag route error only on platforms where trivial "already exists" errors
1577 * are filtered out. Currently this is the case on Windows or if usng netlink.
1578 */
1579#if defined(_WIN32) || defined(ENABLE_SITNL)
1580 else if (flags & ISC_ROUTE_ERRORS)
1581 {
1582 detail = "ROUTE_ERROR";
1583 }
1584#endif
1585
1586 CLEAR(local);
1587 actual = &get_link_socket_info(c)->lsa->actual;
1588 remote = actual->dest;
1589 getsockname(c->c2.link_sockets[0]->sd, &local.addr.sa, &sa_len);
1590#if ENABLE_IP_PKTINFO
1591 if (!addr_defined(&local))
1592 {
1593 switch (local.addr.sa.sa_family)
1594 {
1595 case AF_INET:
1596#if defined(HAVE_IN_PKTINFO) && defined(HAVE_IPI_SPEC_DST)
1597 local.addr.in4.sin_addr = actual->pi.in4.ipi_spec_dst;
1598#else
1599 local.addr.in4.sin_addr = actual->pi.in4;
1600#endif
1601 break;
1602
1603 case AF_INET6:
1604 local.addr.in6.sin6_addr = actual->pi.in6.ipi6_addr;
1605 break;
1606 }
1607 }
1608#endif
1609
1610 if (c->c1.tuntap)
1611 {
1612 tun_local = &c->c1.tuntap->local;
1613 tun_local6 = &c->c1.tuntap->local_ipv6;
1614 }
1615 management_set_state(management, OPENVPN_STATE_CONNECTED, detail, tun_local, tun_local6,
1616 &local, &remote);
1617 if (tun_local)
1618 {
1620 }
1621 }
1622#endif /* ifdef ENABLE_MANAGEMENT */
1623}
1624
1629static bool
1630route_noexec_enabled(const struct options *o, const struct tuntap *tt)
1631{
1632 return o->route_noexec || (tt && tt->backend_driver == DRIVER_AFUNIX)
1633 || (tt && tt->backend_driver == DRIVER_NULL);
1634}
1635
1636/*
1637 * Possibly add routes and/or call route-up script
1638 * based on options.
1639 */
1640bool
1642 struct route_ipv6_list *route_ipv6_list, const struct tuntap *tt,
1643 const struct plugin_list *plugins, struct env_set *es, openvpn_net_ctx_t *ctx)
1644{
1645 bool ret = true;
1647 {
1650 }
1651#ifdef ENABLE_MANAGEMENT
1652 if (management)
1653 {
1654 management_up_down(management, "UP", es);
1655 }
1656#endif
1657
1658 if (plugin_defined(plugins, OPENVPN_PLUGIN_ROUTE_UP))
1659 {
1660 if (plugin_call(plugins, OPENVPN_PLUGIN_ROUTE_UP, NULL, NULL, es)
1661 != OPENVPN_PLUGIN_FUNC_SUCCESS)
1662 {
1663 msg(M_WARN, "WARNING: route-up plugin call failed");
1664 }
1665 }
1666
1667 if (options->route_script)
1668 {
1669 struct argv argv = argv_new();
1670 setenv_str(es, "script_type", "route-up");
1672 openvpn_run_script(&argv, es, 0, "--route-up");
1673 argv_free(&argv);
1674 }
1675
1676#ifdef _WIN32
1677 if (options->show_net_up)
1678 {
1681 }
1682 else if (check_debug_level(D_SHOW_NET))
1683 {
1686 }
1687#endif
1688 return ret;
1689}
1690
1691/*
1692 * initialize tun/tap device object
1693 */
1694static void
1696{
1702 c->c2.es, &c->net_ctx, c->c1.tuntap);
1703
1705 {
1706 /* Using AF_UNIX trumps using DCO */
1708 }
1709 else if (is_dev_type(c->options.dev, c->options.dev_type, "null"))
1710 {
1712 }
1713#ifdef _WIN32
1714 else
1715 {
1717 }
1718#else
1719 else if (dco_enabled(&c->options))
1720 {
1722 }
1723 else
1724 {
1726 }
1727#endif
1728
1730
1731 c->c1.tuntap_owned = true;
1732}
1733
1734/*
1735 * Open tun/tap device, ifconfig, call up script, etc.
1736 */
1737
1738
1739static bool
1740can_preserve_tun(const struct tuntap *tt)
1741{
1742 if (tt && tt->backend_driver == DRIVER_AFUNIX)
1743 {
1744 return false;
1745 }
1746#ifdef TARGET_ANDROID
1747 return false;
1748#else
1749 return is_tun_type_set(tt);
1750#endif
1751}
1752
1761static void
1762add_wfp_block(const struct context *c)
1763{
1764#if defined(_WIN32)
1765 /* Fortify 'redirect-gateway block-local' with firewall rules? */
1766 bool block_local = block_local_needed(c->c1.route_list);
1767
1768 if (c->options.block_outside_dns || block_local)
1769 {
1770 BOOL dns_only = !block_local;
1771 if (!win_wfp_block(c->c1.tuntap->adapter_index, c->options.msg_channel, dns_only))
1772 {
1773 msg(M_FATAL, "WFP: initialization failed");
1774 }
1775 }
1776#endif
1777}
1778
1787static void
1788del_wfp_block(const struct context *c, unsigned long adapter_index)
1789{
1790#if defined(_WIN32)
1792 {
1793 if (!win_wfp_uninit(adapter_index, c->options.msg_channel))
1794 {
1795 msg(M_FATAL, "WFP: deinitialization failed");
1796 }
1797 }
1798#endif
1799}
1800
1806static bool
1808{
1809 return c->options.ifconfig_noexec
1810 || (c->c1.tuntap && c->c1.tuntap->backend_driver == DRIVER_AFUNIX)
1811 || (c->c1.tuntap && c->c1.tuntap->backend_driver == DRIVER_NULL);
1812}
1813
1814static void
1816{
1817 struct tuntap *tt = c->c1.tuntap;
1818
1819 if (tt->backend_driver == DRIVER_NULL)
1820 {
1822 }
1823 else if (tt->backend_driver == DRIVER_AFUNIX)
1824 {
1825 open_tun_afunix(&c->options, c->c2.frame.tun_mtu, tt, c->c2.es);
1826 }
1827 else
1828 {
1830 }
1831 msg(M_INFO, "%s device [%s] opened", print_tun_backend_driver(tt->backend_driver),
1832 tt->actual_name);
1833}
1834
1835
1836static bool
1837do_open_tun(struct context *c, int *error_flags)
1838{
1839 struct gc_arena gc = gc_new();
1840 bool ret = false;
1841 *error_flags = 0;
1842
1843 if (!can_preserve_tun(c->c1.tuntap))
1844 {
1845#ifdef TARGET_ANDROID
1846 /* If we emulate persist-tun on android we still have to open a new tun and
1847 * then close the old */
1848 int oldtunfd = -1;
1849 if (c->c1.tuntap)
1850 {
1851 oldtunfd = c->c1.tuntap->fd;
1852 free(c->c1.tuntap);
1853 c->c1.tuntap = NULL;
1854 c->c1.tuntap_owned = false;
1855 }
1856#endif
1857
1858 /* initialize (but do not open) tun/tap object, this also sets
1859 * the backend driver type */
1860 do_init_tun(c);
1861
1862 /* inherit the dco context from the tuntap object */
1863 if (c->c2.tls_multi)
1864 {
1865 c->c2.tls_multi->dco = &c->c1.tuntap->dco;
1866 }
1867
1868#ifdef _WIN32
1869 /* store (hide) interactive service handle in tuntap_options */
1871 msg(D_ROUTE, "interactive service msg_channel=%" PRIuPTR, (intptr_t)c->options.msg_channel);
1872#endif
1873
1874 /* allocate route list structure */
1876
1877 /* parse and resolve the route option list */
1878 ASSERT(c->c2.link_sockets[0]);
1879 if (c->options.routes && c->c1.route_list)
1880 {
1882 c->c2.es, &c->net_ctx);
1883 }
1885 {
1887 &c->c2.link_sockets[0]->info, c->c2.es, &c->net_ctx);
1888 }
1889
1890 /* do ifconfig */
1892 {
1893 /* guess actual tun/tap unit number that will be returned
1894 * by open_tun */
1895 const char *guess =
1897 do_ifconfig(c->c1.tuntap, guess, c->c2.frame.tun_mtu, c->c2.es, &c->net_ctx);
1898 }
1899
1900 /* possibly add routes */
1902 {
1903 /* Ignore route_delay, would cause ROUTE_BEFORE_TUN to be ignored */
1905 c->c1.tuntap, c->plugins, c->c2.es, &c->net_ctx);
1906 *error_flags |= (status ? 0 : ISC_ROUTE_ERRORS);
1907 }
1908#ifdef TARGET_ANDROID
1909 /* Store the old fd inside the fd so open_tun can use it */
1910 c->c1.tuntap->fd = oldtunfd;
1911#endif
1912
1913 if (dco_enabled(&c->options))
1914 {
1915 ovpn_dco_init(c);
1916 }
1917
1918 /* open the tun device */
1920
1921 /* set the hardware address */
1922 if (c->options.lladdr)
1923 {
1925 }
1926
1927 /* do ifconfig */
1929 {
1931 &c->net_ctx);
1932 }
1933
1934 run_dns_up_down(true, &c->options, c->c1.tuntap, &c->persist.duri);
1935
1936 /* run the up script */
1937 run_up_down(c->options.up_script, c->plugins, OPENVPN_PLUGIN_UP, c->c1.tuntap->actual_name,
1938#ifdef _WIN32
1940#endif
1944 NULL, "up", c->c2.es);
1945
1946 add_wfp_block(c);
1947
1948 /* possibly add routes */
1950 {
1952 c->c1.tuntap, c->plugins, c->c2.es, &c->net_ctx);
1953 *error_flags |= (status ? 0 : ISC_ROUTE_ERRORS);
1954 }
1955
1956 ret = true;
1957 static_context = c;
1958 }
1959 else
1960 {
1961 msg(M_INFO, "Preserving previous TUN/TAP instance: %s", c->c1.tuntap->actual_name);
1962
1963 /* explicitly set the ifconfig_* env vars */
1965
1966 run_dns_up_down(true, &c->options, c->c1.tuntap, &c->persist.duri);
1967
1968 /* run the up script if user specified --up-restart */
1969 if (c->options.up_restart)
1970 {
1971 run_up_down(c->options.up_script, c->plugins, OPENVPN_PLUGIN_UP,
1972 c->c1.tuntap->actual_name,
1973#ifdef _WIN32
1975#endif
1979 "restart", NULL, "up", c->c2.es);
1980 }
1981
1982 add_wfp_block(c);
1983 }
1984 gc_free(&gc);
1985 return ret;
1986}
1987
1988/*
1989 * Close TUN/TAP device
1990 */
1991
1992static void
1994{
1995 msg(D_CLOSE, "Closing %s interface", print_tun_backend_driver(c->c1.tuntap->backend_driver));
1996
1997 if (c->c1.tuntap)
1998 {
2000 {
2001 undo_ifconfig(c->c1.tuntap, &c->net_ctx);
2002 }
2004 {
2006 }
2007 else if (c->c1.tuntap->backend_driver == DRIVER_NULL)
2008 {
2009 free(c->c1.tuntap->actual_name);
2010 free(c->c1.tuntap);
2011 }
2012 else
2013 {
2014 close_tun(c->c1.tuntap, &c->net_ctx);
2015 }
2016 c->c1.tuntap = NULL;
2017 }
2018 c->c1.tuntap_owned = false;
2020}
2021
2022static void
2023do_close_tun(struct context *c, bool force)
2024{
2025 /* With dco-win we open tun handle in the very beginning.
2026 * In case when tun wasn't opened - like we haven't connected,
2027 * we still need to close tun handle
2028 */
2030 {
2032 return;
2033 }
2034
2035 if (!c->c1.tuntap || !c->c1.tuntap_owned)
2036 {
2037 return;
2038 }
2039
2040 struct gc_arena gc = gc_new();
2041 const char *tuntap_actual = string_alloc(c->c1.tuntap->actual_name, &gc);
2042 const in_addr_t local = c->c1.tuntap->local;
2043 const in_addr_t remote_netmask = c->c1.tuntap->remote_netmask;
2044 unsigned long adapter_index = 0;
2045#ifdef _WIN32
2046 adapter_index = c->c1.tuntap->adapter_index;
2047#endif
2048
2049 run_dns_up_down(false, &c->options, c->c1.tuntap, &c->persist.duri);
2050
2051 if (force || !(c->sig->signal_received == SIGUSR1 && c->options.persist_tun))
2052 {
2053 static_context = NULL;
2054
2055#ifdef ENABLE_MANAGEMENT
2056 /* tell management layer we are about to close the TUN/TAP device */
2057 if (management)
2058 {
2060 management_up_down(management, "DOWN", c->c2.es);
2061 }
2062#endif
2063
2064 /* delete any routes we added */
2065 if (c->c1.route_list || c->c1.route_ipv6_list)
2066 {
2067 run_up_down(c->options.route_predown_script, c->plugins, OPENVPN_PLUGIN_ROUTE_PREDOWN,
2068 tuntap_actual,
2069#ifdef _WIN32
2070 adapter_index,
2071#endif
2072 NULL, c->c2.frame.tun_mtu, print_in_addr_t(local, IA_EMPTY_IF_UNDEF, &gc),
2073 print_in_addr_t(remote_netmask, IA_EMPTY_IF_UNDEF, &gc), "init",
2075 "route-pre-down", c->c2.es);
2076
2078 ROUTE_OPTION_FLAGS(&c->options), c->c2.es, &c->net_ctx);
2079 }
2080
2081 /* actually close tun/tap device based on --down-pre flag */
2082 if (!c->options.down_pre)
2083 {
2085 }
2086
2087 /* Run the down script -- note that it will run at reduced
2088 * privilege if, for example, "--user" was used. */
2089 run_up_down(c->options.down_script, c->plugins, OPENVPN_PLUGIN_DOWN, tuntap_actual,
2090#ifdef _WIN32
2091 adapter_index,
2092#endif
2093 NULL, c->c2.frame.tun_mtu, print_in_addr_t(local, IA_EMPTY_IF_UNDEF, &gc),
2094 print_in_addr_t(remote_netmask, IA_EMPTY_IF_UNDEF, &gc), "init",
2096 c->c2.es);
2097
2098 del_wfp_block(c, adapter_index);
2099
2100 /* actually close tun/tap device based on --down-pre flag */
2101 if (c->options.down_pre)
2102 {
2104 }
2105 }
2106 else
2107 {
2108 /* run the down script on this restart if --up-restart was specified */
2109 if (c->options.up_restart)
2110 {
2111 run_up_down(c->options.down_script, c->plugins, OPENVPN_PLUGIN_DOWN, tuntap_actual,
2112#ifdef _WIN32
2113 adapter_index,
2114#endif
2115 NULL, c->c2.frame.tun_mtu, print_in_addr_t(local, IA_EMPTY_IF_UNDEF, &gc),
2116 print_in_addr_t(remote_netmask, IA_EMPTY_IF_UNDEF, &gc), "restart",
2118 c->c2.es);
2119 }
2120
2121 del_wfp_block(c, adapter_index);
2122 }
2123 gc_free(&gc);
2124}
2125
2126void
2128{
2129 struct context *c = static_context;
2130 if (c)
2131 {
2132 static_context = NULL;
2133 do_close_tun(c, true);
2134 }
2135}
2136
2137/*
2138 * Handle delayed tun/tap interface bringup due to --up-delay or --pull
2139 */
2140
2145static bool
2147{
2148 const struct sha256_digest zero = { { 0 } };
2149 return memcmp(a, b, sizeof(struct sha256_digest))
2150 || !memcmp(a, &zero, sizeof(struct sha256_digest));
2151}
2152
2158static void
2159add_delim_if_non_empty(struct buffer *buf, const char *header)
2160{
2161 if (BLENZ(buf) > strlen(header))
2162 {
2163 buf_printf(buf, ", ");
2164 }
2165}
2166
2167
2172static void
2174{
2175 struct options *o = &c->options;
2176
2177 struct buffer out;
2178 uint8_t line[1024] = { 0 };
2179 buf_set_write(&out, line, sizeof(line));
2180
2181
2183 {
2184 buf_printf(&out, "Data Channel: cipher '%s'", cipher_kt_name(o->ciphername));
2185 }
2186 else
2187 {
2188 buf_printf(&out, "Data Channel: cipher '%s', auth '%s'", cipher_kt_name(o->ciphername),
2189 md_kt_name(o->authname));
2190 }
2191
2192 if (c->c2.tls_multi && c->c2.tls_multi->use_peer_id)
2193 {
2194 buf_printf(&out, ", rx-peer-id: %u, tx-peer-id: %u", c->c2.tls_multi->rx_peer_id,
2195 c->c2.tls_multi->tx_peer_id);
2196 }
2197
2198#ifdef USE_COMP
2199 if (c->c2.comp_context)
2200 {
2201 buf_printf(&out, ", compression: '%s'", c->c2.comp_context->alg.name);
2202 }
2203#endif
2204
2205 msg(D_HANDSHAKE, "%s", BSTR(&out));
2206
2207 buf_clear(&out);
2208
2209 const char *header = "Timers: ";
2210
2211 buf_printf(&out, "%s", header);
2212
2213 if (o->ping_send_timeout)
2214 {
2215 buf_printf(&out, "ping %d", o->ping_send_timeout);
2216 }
2217
2219 {
2220 /* yes unidirectional ping is possible .... */
2221 add_delim_if_non_empty(&out, header);
2222
2224 {
2225 buf_printf(&out, "ping-exit %d", o->ping_rec_timeout);
2226 }
2227 else
2228 {
2229 buf_printf(&out, "ping-restart %d", o->ping_rec_timeout);
2230 }
2231 }
2232
2233 if (o->inactivity_timeout)
2234 {
2235 add_delim_if_non_empty(&out, header);
2236
2237 buf_printf(&out, "inactive %d", o->inactivity_timeout);
2239 {
2240 buf_printf(&out, " %" PRIu64, o->inactivity_minimum_bytes);
2241 }
2242 }
2243
2244 if (o->session_timeout)
2245 {
2246 add_delim_if_non_empty(&out, header);
2247 buf_printf(&out, "session-timeout %d", o->session_timeout);
2248 }
2249
2250 if (BLENZ(&out) > strlen(header))
2251 {
2252 msg(D_HANDSHAKE, "%s", BSTR(&out));
2253 }
2254
2255 buf_clear(&out);
2256 header = "Protocol options: ";
2257 buf_printf(&out, "%s", header);
2258
2260 {
2261 buf_printf(&out, "explicit-exit-notify %d", c->options.ce.explicit_exit_notification);
2262 }
2264 {
2265 add_delim_if_non_empty(&out, header);
2266
2267 buf_printf(&out, "protocol-flags");
2268
2270 {
2271 buf_printf(&out, " cc-exit");
2272 }
2274 {
2275 buf_printf(&out, " tls-ekm");
2276 }
2278 {
2279 buf_printf(&out, " dyn-tls-crypt");
2280 }
2282 {
2283 buf_printf(&out, " aead-epoch");
2284 }
2285 }
2286
2287 struct tls_multi *multi = c->c2.tls_multi;
2288 if (multi && multi->acc_negotiated_protocols)
2289 {
2290 buf_printf(&out, " custom-control %d A:6 %s",
2292 }
2293
2294 if (BLENZ(&out) > strlen(header))
2295 {
2296 msg(D_HANDSHAKE, "%s", BSTR(&out));
2297 }
2298}
2299
2300
2308static bool
2310{
2311 struct frame *frame_fragment = NULL;
2312#ifdef ENABLE_FRAGMENT
2313 if (c->options.ce.fragment)
2314 {
2315 frame_fragment = &c->c2.frame_fragment;
2316 }
2317#endif
2318
2319 /* The peer-id can also be negotiated without being pushed, so sync the
2320 * option before the frame is recalculated: it decides whether the
2321 * DATA_V2 header is accounted for */
2323
2326 frame_fragment, get_link_socket_info(c),
2327 &c->c1.tuntap->dco))
2328 {
2329 msg(D_TLS_ERRORS, "OPTIONS ERROR: failed to import crypto options");
2330 return false;
2331 }
2332
2333 return true;
2334}
2335
2336bool
2337do_up(struct context *c, bool pulled_options, uint64_t option_types_found)
2338{
2339 int error_flags = 0;
2340 if (!c->c2.do_up_ran)
2341 {
2343
2344 if (pulled_options)
2345 {
2346 if (!do_deferred_options(c, option_types_found, false))
2347 {
2348 msg(D_PUSH_ERRORS, "ERROR: Failed to apply push options");
2349 return false;
2350 }
2351 }
2352
2353 /* if --up-delay specified, open tun, do ifconfig, and run up script now */
2354 if (c->options.up_delay || PULL_DEFINED(&c->options))
2355 {
2356 c->c2.did_open_tun = do_open_tun(c, &error_flags);
2357 update_time();
2358
2359 /*
2360 * Was tun interface object persisted from previous restart iteration,
2361 * and if so did pulled options string change from previous iteration?
2362 */
2363 if (!c->c2.did_open_tun && PULL_DEFINED(&c->options) && c->c1.tuntap
2366 {
2367 /* if so, close tun, delete routes, then reinitialize tun and add routes */
2368 msg(M_INFO,
2369 "NOTE: Pulled options changed on restart, will need to close and reopen TUN/TAP device.");
2370
2371 bool tt_dco_win = tuntap_is_dco_win(c->c1.tuntap);
2372 do_close_tun(c, true);
2373
2374 if (tt_dco_win)
2375 {
2376 msg(M_NONFATAL, "dco-win doesn't yet support reopening TUN device");
2377 /* prevent link_socket_close() from closing handle with WinSock API */
2379 return false;
2380 }
2381 else
2382 {
2384 c->c2.did_open_tun = do_open_tun(c, &error_flags);
2385 update_time();
2386 }
2387 }
2388 }
2389 }
2390
2391 /* This part needs to be run in p2p mode (without pull) when the client
2392 * reconnects to setup various things (like DCO and NCP cipher) that
2393 * might have changed from the previous connection.
2394 */
2395 if (!c->c2.do_up_ran
2397 {
2398 if (c->mode == MODE_POINT_TO_POINT)
2399 {
2400 /* ovpn-dco requires adding the peer now, before any option can be set,
2401 * but *after* having parsed the pushed peer-id in do_deferred_options()
2402 */
2403 int ret = dco_p2p_add_new_peer(c);
2404 if (ret < 0)
2405 {
2406 msg(D_DCO, "Cannot add peer to DCO: %s (%d)", strerror(-ret), ret);
2407 return false;
2408 }
2409 }
2410
2411 /* do_deferred_options_part2() and do_deferred_p2p_ncp() *must* be
2412 * invoked after open_tun().
2413 * This is required by DCO because we must have created the interface
2414 * and added the peer before we can fiddle with the keys or any other
2415 * data channel per-peer setting.
2416 */
2417 if (pulled_options)
2418 {
2420 {
2421 return false;
2422 }
2423 }
2424 else
2425 {
2426 if (c->mode == MODE_POINT_TO_POINT)
2427 {
2428 if (!do_deferred_p2p_ncp(c))
2429 {
2430 msg(D_TLS_ERRORS, "ERROR: Failed to apply P2P negotiated protocol options");
2431 return false;
2432 }
2433 }
2434 }
2435
2436 if (c->c2.did_open_tun)
2437 {
2439
2440 /* if --route-delay was specified, start timer */
2442 {
2447 }
2448 else
2449 {
2450 /* client/p2p --route-delay undefined */
2451 initialization_sequence_completed(c, error_flags);
2452 }
2453 }
2454 else if (c->options.mode == MODE_POINT_TO_POINT)
2455 {
2456 /* client/p2p restart with --persist-tun */
2457 initialization_sequence_completed(c, error_flags);
2458 }
2459
2461
2462 c->c2.do_up_ran = true;
2463 if (c->c2.tls_multi)
2464 {
2466 }
2467 }
2468 return true;
2469}
2470
2471bool
2472do_update(struct context *c, uint64_t option_types_found)
2473{
2474 /* Not necessary since to receive the update the openvpn
2475 * instance must be up and running but just in case
2476 */
2477 if (!c->c2.do_up_ran)
2478 {
2479 return false;
2480 }
2481
2482 bool tt_dco_win = tuntap_is_dco_win(c->c1.tuntap);
2483 if (tt_dco_win)
2484 {
2485 msg(M_NONFATAL, "dco-win doesn't yet support reopening TUN device");
2486 return false;
2487 }
2488
2489 if (!do_deferred_options(c, option_types_found, true))
2490 {
2491 msg(D_PUSH_ERRORS, "ERROR: Failed to apply push options");
2492 return false;
2493 }
2494
2495 do_close_tun(c, true);
2496
2498 int error_flags = 0;
2499 c->c2.did_open_tun = do_open_tun(c, &error_flags);
2500 update_time();
2501
2502 if (c->c2.did_open_tun)
2503 {
2504 /* if --route-delay was specified, start timer */
2506 {
2511 }
2512
2513 initialization_sequence_completed(c, error_flags);
2514 }
2515
2517
2518 return true;
2519}
2520
2521/*
2522 * These are the option categories which will be accepted by pull.
2523 */
2524uint64_t
2526{
2531
2532 if (!c->options.route_nopull)
2533 {
2534 flags |= (OPT_P_ROUTE | OPT_P_DHCPDNS);
2535 }
2536
2537 if (c->options.acc_protocols)
2538 {
2539 flags |= OPT_P_ACC;
2540 }
2541
2542 return flags;
2543}
2544
2545static bool
2547{
2548 if (!c->c2.tls_multi)
2549 {
2550 return true;
2551 }
2552
2554
2556
2557 const char *ncp_cipher =
2559
2560 if (ncp_cipher)
2561 {
2562 c->options.ciphername = ncp_cipher;
2563 }
2564 else if (!c->options.enable_ncp_fallback)
2565 {
2566 msg(D_TLS_ERRORS, "ERROR: failed to negotiate cipher with peer and "
2567 "--data-ciphers-fallback not enabled. No usable "
2568 "data channel cipher");
2569 return false;
2570 }
2571
2572 struct frame *frame_fragment = NULL;
2573#ifdef ENABLE_FRAGMENT
2574 if (c->options.ce.fragment)
2575 {
2576 frame_fragment = &c->c2.frame_fragment;
2577 }
2578#endif
2579
2581 frame_fragment, get_link_socket_info(c),
2582 &c->c1.tuntap->dco))
2583 {
2584 msg(D_TLS_ERRORS, "ERROR: failed to set crypto cipher");
2585 return false;
2586 }
2587 return true;
2588}
2589
2590bool
2591do_deferred_options(struct context *c, const uint64_t found, const bool is_update)
2592{
2593 if (found & OPT_P_MESSAGES)
2594 {
2596 msg(D_PUSH, "OPTIONS IMPORT: --verb and/or --mute level changed");
2597 }
2598 if (found & OPT_P_TIMER)
2599 {
2600 do_init_timers(c, true);
2601 msg(D_PUSH_DEBUG, "OPTIONS IMPORT: timers and/or timeouts modified");
2602 }
2603
2604 if (found & OPT_P_EXPLICIT_NOTIFY)
2605 {
2606 /* Client side, so just check the first link_socket */
2609 {
2610 msg(D_PUSH, "OPTIONS IMPORT: --explicit-exit-notify can only be used with --proto udp");
2612 }
2613 else
2614 {
2615 msg(D_PUSH_DEBUG, "OPTIONS IMPORT: explicit notify parm(s) modified");
2616 }
2617 }
2618
2619 if (found & OPT_P_COMP)
2620 {
2622 {
2623 msg(D_PUSH_ERRORS, "OPTIONS ERROR: server pushed compression "
2624 "settings that are not allowed and will result "
2625 "in a non-working connection. "
2626 "See also allow-compression in the manual.");
2627 return false;
2628 }
2629#ifdef USE_COMP
2630 msg(D_PUSH_DEBUG, "OPTIONS IMPORT: compression parms modified");
2631 comp_uninit(c->c2.comp_context);
2632 c->c2.comp_context = comp_init(&c->options.comp);
2633#endif
2634 }
2635
2636 if (found & OPT_P_SHAPER)
2637 {
2638 msg(D_PUSH, "OPTIONS IMPORT: traffic shaper enabled");
2640 }
2641
2642 if (found & OPT_P_SOCKBUF)
2643 {
2644 msg(D_PUSH, "OPTIONS IMPORT: --sndbuf/--rcvbuf options modified");
2645
2646 for (int i = 0; i < c->c1.link_sockets_num; i++)
2647 {
2649 c->options.sndbuf);
2650 }
2651 }
2652
2653 if (found & OPT_P_PERSIST)
2654 {
2655 msg(D_PUSH, "OPTIONS IMPORT: --persist options modified");
2656 }
2657 if (found & OPT_P_UP)
2658 {
2659 msg(D_PUSH, "OPTIONS IMPORT: --ifconfig/up options modified");
2660 }
2661 if (found & OPT_P_ROUTE)
2662 {
2663 msg(D_PUSH, "OPTIONS IMPORT: route options modified");
2664 }
2665 if (found & OPT_P_ROUTE_EXTRAS)
2666 {
2667 msg(D_PUSH, "OPTIONS IMPORT: route-related options modified");
2668 }
2669 if (found & OPT_P_DHCPDNS)
2670 {
2671 msg(D_PUSH, "OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified");
2672 }
2673 if (found & OPT_P_SETENV)
2674 {
2675 msg(D_PUSH, "OPTIONS IMPORT: environment modified");
2676 }
2677
2678 if (found & OPT_P_PEER_ID)
2679 {
2680 msg(D_PUSH_DEBUG, "OPTIONS IMPORT: peer-id set");
2681 c->c2.tls_multi->use_peer_id = true;
2684 }
2685
2686 /* process (potentially) pushed options */
2687 if (c->options.pull)
2688 {
2689 /* On PUSH_UPDATE, NCP related flags are never updated, and so the code
2690 * would assume "no cipher pushed = NCP failed" - so, don't call it on
2691 * updates */
2692 if (!is_update && !check_pull_client_ncp(c, found))
2693 {
2694 return false;
2695 }
2696
2697 /* Check if pushed options are compatible with DCO, if enabled */
2699 {
2700 msg(D_PUSH_ERRORS, "OPTIONS ERROR: pushed options are incompatible "
2701 "with data channel offload. Use --disable-dco to connect to "
2702 "this server");
2703 return false;
2704 }
2705 }
2706
2707 /* Ensure that for epoch data format is only enabled if also data v2
2708 * is enabled */
2710 bool datav2_enabled = c->c2.tls_multi->use_peer_id && c->c2.tls_multi->tx_peer_id < MAX_PEER_ID;
2711
2712 if (epoch_data && !datav2_enabled)
2713 {
2714 msg(D_PUSH_ERRORS, "OPTIONS ERROR: Epoch key data format tag requires "
2715 "data v2 (peer-id) to be enabled.");
2716 return false;
2717 }
2718
2719 /* The epoch data format is defined for AEAD ciphers only. A peer may push
2720 * the tag along with a non-AEAD cipher, so this has to be checked here
2721 * rather than trusted */
2722 if (epoch_data && !cipher_kt_mode_aead(c->options.ciphername))
2723 {
2725 "OPTIONS ERROR: Epoch key data format tag requires an AEAD "
2726 "cipher, but '%s' was negotiated.",
2727 c->options.ciphername);
2728 return false;
2729 }
2730
2731
2732 if (found & OPT_P_PUSH_MTU)
2733 {
2734 /* MTU has changed, check that the pushed MTU is small enough to
2735 * be able to change it */
2736 msg(D_PUSH, "OPTIONS IMPORT: tun-mtu set to %d", c->options.ce.tun_mtu);
2737
2738 struct frame *frame = &c->c2.frame;
2739
2741 {
2743 "Server-pushed tun-mtu is too large, please add "
2744 "tun-mtu-max %d in the client configuration",
2745 c->options.ce.tun_mtu);
2746 }
2748 }
2749
2751 {
2752 struct tls_multi *multi = c->c2.tls_multi;
2753 free(multi->acc_negotiated_protocols);
2756
2757 msg(D_PUSH, "OPTIONS IMPORT: ACC protocols: %s, msg len: %d",
2760 }
2761
2762 return true;
2763}
2764
2765/*
2766 * Possible hold on initialization, holdtime is the
2767 * time OpenVPN would wait without management
2768 */
2769static bool
2770do_hold(int holdtime)
2771{
2772#ifdef ENABLE_MANAGEMENT
2773 if (management)
2774 {
2775 /* block until management hold is released */
2776 if (management_hold(management, holdtime))
2777 {
2778 return true;
2779 }
2780 }
2781#endif
2782 return false;
2783}
2784
2785/*
2786 * Sleep before restart.
2787 */
2788static void
2790{
2791 int sec = 2;
2792 int backoff = 0;
2793
2794 switch (c->mode)
2795 {
2796 case CM_TOP:
2797 sec = 1;
2798 break;
2799
2800 case CM_CHILD_UDP:
2801 case CM_CHILD_TCP:
2803 break;
2804 }
2805
2806#ifdef ENABLE_DEBUG
2807 if (GREMLIN_CONNECTION_FLOOD_LEVEL(c->options.gremlin))
2808 {
2809 sec = 0;
2810 }
2811#endif
2812
2814 {
2815 sec = 10;
2816 }
2817
2818 /* Slow down reconnection after 5 retries per remote -- for TCP client or UDP tls-client only */
2819 if (c->mode == CM_CHILD_TCP || (c->options.ce.proto == PROTO_UDP && c->options.tls_client))
2820 {
2821 backoff = (c->options.unsuccessful_attempts / c->options.connection_list->len) - 4;
2822 if (backoff > 0)
2823 {
2824 /* sec is less than 2^16; we can left shift it by up to 15 bits without overflow */
2825 sec = max_int(sec, 1) << min_int(backoff, 15);
2826 }
2828 {
2829 sec = max_int(sec, c->options.server_backoff_time);
2831 }
2832
2834 {
2836 }
2837 }
2838
2840 {
2842 }
2843 else if (c->persist.restart_sleep_seconds == -1)
2844 {
2845 sec = 0;
2846 }
2848
2849 /* do management hold on context restart, i.e. second, third, fourth, etc. initialization */
2850 if (do_hold(sec))
2851 {
2852 sec = 0;
2853 }
2854
2855 if (sec)
2856 {
2857 msg(D_RESTART, "Restart pause, %d second(s)", sec);
2858 management_sleep(sec);
2859 }
2860}
2861
2862/*
2863 * Do a possible pause on context_2 initialization.
2864 */
2865static void
2867{
2868 if (!c->first_time)
2869 {
2871 }
2872 else
2873 {
2874 do_hold(0); /* do management hold on first context initialization */
2875 }
2876}
2877
2878static int
2879get_frame_mtu(struct context *c, const struct options *o)
2880{
2881 size_t mtu;
2882
2883 if (o->ce.link_mtu_defined)
2884 {
2886 /* if we have a link mtu defined we calculate what the old code
2887 * would have come up with as tun-mtu */
2888 size_t overhead = frame_calculate_protocol_header_size(&c->c1.ks.key_type, o, true);
2889 mtu = o->ce.link_mtu - overhead;
2890 }
2891 else
2892 {
2894 mtu = o->ce.tun_mtu;
2895 }
2896
2897 if (mtu < TUN_MTU_MIN)
2898 {
2899 msg(M_WARN, "TUN MTU value (%zu) must be at least %d", mtu, TUN_MTU_MIN);
2900 frame_print(&c->c2.frame, M_FATAL, "MTU is too small");
2901 }
2902 if (mtu > TUN_MTU_MAX)
2903 {
2904 msg(M_WARN, "TUN MTU value (%zu) clamped to %d", mtu, TUN_MTU_MAX);
2905 mtu = TUN_MTU_MAX;
2906 }
2907 return (int)mtu;
2908}
2909
2910/*
2911 * Finalize MTU parameters based on command line or config file options.
2912 */
2913static void
2914frame_finalize_options(struct context *c, const struct options *o)
2915{
2916 if (!o)
2917 {
2918 o = &c->options;
2919 }
2920
2921 struct frame *frame = &c->c2.frame;
2922
2923 frame->tun_mtu = get_frame_mtu(c, o);
2925
2926 /* max mtu needs to be at least as large as the tun mtu */
2928
2929 /* We always allow at least 1600 MTU packets to be received in our buffer
2930 * space to allow server to push "baby giant" MTU sizes */
2932
2933 unsigned int payload_size = frame->tun_max_mtu;
2934
2935 /* we need to be also large enough to hold larger control channel packets
2936 * if configured */
2938
2939 /* The extra tun needs to be added to the payload size */
2940 if (o->ce.tun_mtu_defined)
2941 {
2943 }
2944
2945 /* Add 32 byte of extra space in the buffer to account for small errors
2946 * in the calculation */
2947 payload_size += 32;
2948
2949
2950 /* the space that is reserved before the payload to add extra headers to it
2951 * we always reserve the space for the worst case */
2952 unsigned int headroom = 0;
2953
2954 /* includes IV and packet ID */
2956
2957 /* peer id + opcode */
2958 headroom += 4;
2959
2960 /* socks proxy header */
2962
2963 /* compression header and fragment header (part of the encrypted payload) */
2964 headroom += 1 + 1;
2965
2966 /* Round up headroom to the next multiple of 4 to ensure alignment */
2967 headroom = (headroom + 3) & ~3;
2968
2969 /* Add the headroom to the payloadsize as a received (IP) packet can have
2970 * all the extra headers in it */
2972
2973 /* the space after the payload, this needs some extra buffer space for
2974 * encryption so headroom is probably too much but we do not really care
2975 * the few extra bytes */
2976 unsigned int tailroom = headroom;
2977
2978#ifdef USE_COMP
2980 "MTU: adding %u buffer tailroom for compression for %u "
2981 "bytes of payload",
2982 COMP_EXTRA_BUFFER(payload_size), payload_size);
2983 tailroom += COMP_EXTRA_BUFFER(payload_size);
2984#endif
2985
2989}
2990
2991/*
2992 * Free a key schedule, including OpenSSL components.
2993 */
2994static void
2995key_schedule_free(struct key_schedule *ks, bool free_ssl_ctx)
2996{
2998 if (tls_ctx_initialised(ks->ssl_ctx) && free_ssl_ctx)
2999 {
3000 tls_ctx_free(ks->ssl_ctx);
3001 free(ks->ssl_ctx);
3003 }
3004 CLEAR(*ks);
3005}
3006
3007static void
3008init_crypto_pre(struct context *c, const unsigned int flags)
3009{
3010 if (c->options.engine)
3011 {
3013 }
3014
3015 if (flags & CF_LOAD_PERSISTED_PACKET_ID)
3016 {
3017 /* load a persisted packet-id for cross-session replay-protection */
3018 if (c->options.packet_id_file)
3019 {
3021 }
3022 }
3023}
3024
3025
3026static void
3028{
3029 const struct options *options = &c->options;
3031
3032 init_crypto_pre(c, 0);
3033
3035
3036 /* Initialize packet ID tracking */
3038 "STATIC", 0);
3039
3041
3042 /* Init cipher and hash algorithm */
3044 options->test_crypto, true);
3045
3047 "test crypto key");
3048
3049 /* Get key schedule */
3051}
3052
3053/*
3054 * Static Key Mode (using a pre-shared key)
3055 */
3056static void
3057do_init_crypto_static(struct context *c, const unsigned int flags)
3058{
3059 const struct options *options = &c->options;
3061
3062 init_crypto_pre(c, flags);
3063
3064 /* Initialize flags */
3066 {
3068 }
3069
3070 /* Initialize packet ID tracking */
3072 "STATIC", 0);
3076
3078 {
3079 /* Get cipher & hash algorithms */
3081 options->test_crypto, true);
3082
3083 /* Read cipher and hmac keys from shared secret file */
3086 options->key_direction, "Static Key Encryption", "secret", NULL);
3087 }
3088 else
3089 {
3090 msg(M_INFO, "Re-using pre-shared static key");
3091 }
3092
3093 /* Get key schedule */
3095}
3096
3097/*
3098 * Initialize the tls-auth/crypt key context
3099 */
3100static void
3102{
3103 const struct options *options = &c->options;
3104
3105 /* TLS handshake authentication (--tls-auth) */
3107 {
3108 /* Initialize key_type for tls-auth with auth only */
3110 c->c1.ks.tls_auth_key_type.cipher = "none";
3112 if (!md_valid(options->authname))
3113 {
3114 msg(M_FATAL,
3115 "ERROR: tls-auth enabled, but no valid --auth "
3116 "algorithm specified ('%s')",
3117 options->authname);
3118 }
3119
3122 options->ce.key_direction, "Control Channel Authentication",
3123 "tls-auth", &c->c1.ks.original_wrap_keydata);
3124 }
3125
3126 /* TLS handshake encryption+authentication (--tls-crypt) */
3128 {
3132 }
3133
3134 /* tls-crypt with client-specific keys (--tls-crypt-v2) */
3136 {
3137 if (options->tls_server)
3138 {
3142 }
3143 else
3144 {
3148 }
3149 /* We have to ensure that the loaded tls-crypt key is small enough
3150 * to fit into the initial hard reset v3 packet */
3151 int wkc_len = buf_len(&c->c1.ks.tls_crypt_v2_wkc);
3152
3153 /* empty ACK/message id, tls-crypt, Opcode, UDP, ipv6 */
3154 int required_size = 5 + wkc_len + tls_crypt_buf_overhead() + 1 + 8 + 40;
3155
3156 if (required_size > c->options.ce.tls_mtu)
3157 {
3158 msg(M_WARN,
3159 "ERROR: tls-crypt-v2 client key too large to work with "
3160 "requested --max-packet-size %d, requires at least "
3161 "--max-packet-size %d. Packets will ignore requested "
3162 "maximum packet size",
3163 c->options.ce.tls_mtu, required_size);
3164 }
3165 }
3166}
3167
3168/*
3169 * Initialize the persistent component of OpenVPN's TLS mode,
3170 * which is preserved across SIGUSR1 resets.
3171 */
3172static void
3174{
3175 const struct options *options = &c->options;
3176
3178 {
3179 /*
3180 * Initialize the OpenSSL library's global
3181 * SSL context.
3182 */
3183 ASSERT(NULL == c->c1.ks.ssl_ctx);
3186 {
3187 switch (auth_retry_get())
3188 {
3189 case AR_NONE:
3190 msg(M_FATAL, "Error: private key password verification failed");
3191 break;
3192
3193 case AR_INTERACT:
3194 ssl_purge_auth(false);
3195 /* Intentional [[fallthrough]]; */
3196
3197 case AR_NOINTERACT:
3198 /* SOFT-SIGUSR1 -- Password failure error */
3199 register_signal(c->sig, SIGUSR1, "private-key-password-failure");
3200 break;
3201
3202 default:
3203 ASSERT(0);
3204 }
3205 return;
3206 }
3207
3208 /*
3209 * BF-CBC is allowed to be used only when explicitly configured
3210 * as NCP-fallback or when NCP has been disabled or explicitly
3211 * allowed in the in ncp_ciphers list.
3212 * In all other cases do not attempt to initialize BF-CBC as it
3213 * may not even be supported by the underlying SSL library.
3214 *
3215 * Therefore, the key structure has to be initialized when:
3216 * - any non-BF-CBC cipher was selected; or
3217 * - BF-CBC is selected, NCP is enabled and fallback is enabled
3218 * (BF-CBC will be the fallback).
3219 * - BF-CBC is in data-ciphers and we negotiate to use BF-CBC:
3220 * If the negotiated cipher and options->ciphername are the
3221 * same we do not reinit the cipher
3222 *
3223 * Note that BF-CBC will still be part of the OCC string to retain
3224 * backwards compatibility with older clients.
3225 */
3226 const char *ciphername = options->ciphername;
3227 if (streq(options->ciphername, "BF-CBC")
3230 {
3231 ciphername = "none";
3232 }
3233
3234 /* Do not warn if the cipher is used only in OCC */
3235 bool warn = options->enable_ncp_fallback;
3237
3238 /* initialize tls-auth/crypt/crypt-v2 key */
3240
3241 /* initialise auth-token crypto support */
3243 {
3246 }
3247
3248#if 0 /* was: #if ENABLE_INLINE_FILES -- Note that enabling this code will break restarts */
3250 {
3252 c->options.priv_key_file_inline = NULL;
3253 }
3254#endif
3255 }
3256 else
3257 {
3258 msg(D_INIT_MEDIUM, "Re-using SSL/TLS context");
3259
3260 /*
3261 * tls-auth/crypt key can be configured per connection block, therefore
3262 * we must reload it as it may have changed
3263 */
3265 }
3266}
3267
3268static void
3269do_init_crypto_tls(struct context *c, const unsigned int flags)
3270{
3271 const struct options *options = &c->options;
3272 struct tls_options to;
3273 bool packet_id_long_form;
3274
3277
3278 init_crypto_pre(c, flags);
3279
3280 /* Make sure we are either a TLS client or server but not both */
3282
3283 /* initialize persistent component */
3285 if (IS_SIG(c))
3286 {
3287 return;
3288 }
3289
3290 /* In short form, unique datagram identifier is 32 bits, in long form 64 bits */
3291 packet_id_long_form = cipher_kt_mode_ofb_cfb(c->c1.ks.key_type.cipher);
3292
3293 /* Set all command-line TLS-related options */
3294 CLEAR(to);
3295
3297 {
3299 }
3300
3302 if (packet_id_long_form)
3303 {
3305 }
3306
3307 to.ssl_ctx = c->c1.ks.ssl_ctx;
3308 to.key_type = c->c1.ks.key_type;
3321 {
3322 /* Add 10% jitter to reneg-sec by default (server side only) */
3323 int jitter_max = max_int(options->renegotiate_seconds / 10, 1);
3324 int auto_jitter = options->mode != MODE_SERVER ? 0 : (int)(get_random() % jitter_max);
3326 }
3327 else
3328 {
3329 /* Add user-specified jitter to reneg-sec */
3331 to.renegotiate_seconds = options->renegotiate_seconds - (int)(get_random() % jitter_max);
3332 }
3334 to.mode = options->mode;
3335 to.pull = options->pull;
3336 if (options->push_peer_info) /* all there is */
3337 {
3338 to.push_peer_info_detail = 3;
3339 }
3340 else if (options->pull) /* pull clients send some details */
3341 {
3342 to.push_peer_info_detail = 2;
3343 }
3344 else if (options->mode == MODE_SERVER) /* server: no peer info at all */
3345 {
3346 to.push_peer_info_detail = 0;
3347 }
3348 else /* default: minimal info to allow NCP in P2P mode */
3349 {
3350 to.push_peer_info_detail = 1;
3351 }
3352
3353 /* Check if the DCO drivers support the epoch data format */
3354 if (dco_enabled(options))
3355 {
3357 }
3358 else
3359 {
3360 to.data_epoch_supported = true;
3361 }
3362
3363 /* should we not xmit any packets until we get an initial
3364 * response from client? */
3365 if (to.server && (c->mode == CM_CHILD_TCP || (c->mode == CM_P2P && options->ce.proto == PROTO_TCP_SERVER)))
3366 {
3367 to.xmit_hold = true;
3368 }
3369
3377 memcpy(to.remote_cert_ku, options->remote_cert_ku, sizeof(to.remote_cert_ku));
3385 to.es = c->c2.es;
3386 to.net_ctx = &c->net_ctx;
3387
3388#ifdef ENABLE_DEBUG
3389 to.gremlin = c->options.gremlin;
3390#endif
3391
3392 to.plugins = c->plugins;
3393
3394#ifdef ENABLE_MANAGEMENT
3395 to.mda_context = &c->c2.mda_context;
3396#endif
3397
3401 to.tmp_dir = options->tmp_dir;
3404 {
3406 }
3415
3417
3418#ifdef ENABLE_MANAGEMENT
3419 to.sci = &options->sc_info;
3420#endif
3421
3422#ifdef USE_COMP
3423 to.comp_options = options->comp;
3424#endif
3425
3427 {
3429 if (to.ekm_size < 16 || to.ekm_size > 4095)
3430 {
3431 to.ekm_size = 0;
3432 }
3433
3435 to.ekm_label_size = strlen(to.ekm_label);
3436 }
3437 else
3438 {
3439 to.ekm_size = 0;
3440 }
3441
3442 /* TLS handshake authentication (--tls-auth) */
3444 {
3445 to.tls_wrap.mode = TLS_WRAP_AUTH;
3446 }
3447
3448 /* TLS handshake encryption (--tls-crypt) */
3450 {
3451 to.tls_wrap.mode = TLS_WRAP_CRYPT;
3452 }
3453
3454 if (to.tls_wrap.mode == TLS_WRAP_AUTH || to.tls_wrap.mode == TLS_WRAP_CRYPT)
3455 {
3460 }
3461
3463 {
3464 to.tls_crypt_v2 = true;
3466
3467 if (options->tls_server)
3468 {
3473 {
3475 }
3476 }
3477 }
3478
3479 /* let the TLS engine know if keys have to be installed in DCO or not */
3481
3482 /*
3483 * Initialize OpenVPN's master TLS-mode object.
3484 */
3485 if (flags & CF_INIT_TLS_MULTI)
3486 {
3487 c->c2.tls_multi = tls_multi_init(&to);
3488 /* inherit the dco context from the tuntap object */
3489 if (c->c1.tuntap)
3490 {
3491 c->c2.tls_multi->dco = &c->c1.tuntap->dco;
3492 }
3493 }
3494
3495 if (flags & CF_INIT_TLS_AUTH_STANDALONE)
3496 {
3499 }
3500}
3501
3502static void
3504{
3505 if (c->c2.tls_multi)
3506 {
3509 frame_print(&c->c2.tls_multi->opt.frame, D_MTU_INFO, "Control Channel MTU parms");
3510
3511 /* Keep the max mtu also in the frame of tls multi so it can access
3512 * it in push_peer_info */
3514 }
3515 if (c->c2.tls_auth_standalone)
3516 {
3518 c->options.ce.tls_mtu);
3519 frame_print(&c->c2.tls_auth_standalone->frame, D_MTU_INFO, "TLS-Auth MTU parms");
3522 }
3523}
3524
3525/*
3526 * No encryption or authentication.
3527 */
3528static void
3530{
3532
3533 /* Initialise key_type with auth/cipher "none", so the key_type struct is
3534 * valid */
3535 init_key_type(&c->c1.ks.key_type, "none", "none", c->options.test_crypto, true);
3536
3537 msg(M_WARN, "******* WARNING *******: All encryption and authentication features "
3538 "disabled -- All data will be tunnelled as clear text and will not be "
3539 "protected against man-in-the-middle changes. "
3540 "PLEASE DO RECONSIDER THIS CONFIGURATION!");
3541}
3542
3543static void
3544do_init_crypto(struct context *c, const unsigned int flags)
3545{
3547 {
3548 do_init_crypto_static(c, flags);
3549 }
3550 else if (c->options.tls_server || c->options.tls_client)
3551 {
3552 do_init_crypto_tls(c, flags);
3553 }
3554 else /* no encryption or authentication. */
3555 {
3557 }
3558}
3559
3560static void
3562{
3563 /*
3564 * Adjust frame size based on the --tun-mtu-extra parameter.
3565 */
3567 {
3569 }
3570
3571 /*
3572 * Fill in the blanks in the frame parameters structure,
3573 * make sure values are rational, etc.
3574 */
3575 frame_finalize_options(c, NULL);
3576
3577
3578#if defined(ENABLE_FRAGMENT)
3579 /*
3580 * MTU advisories
3581 */
3582 if (c->options.ce.fragment && c->options.mtu_test)
3583 {
3584 msg(M_WARN,
3585 "WARNING: using --fragment and --mtu-test together may produce an inaccurate MTU test result");
3586 }
3587#endif
3588
3589#ifdef ENABLE_FRAGMENT
3590 if (c->options.ce.fragment > 0 && c->options.ce.mssfix > c->options.ce.fragment)
3591 {
3592 msg(M_WARN,
3593 "WARNING: if you use --mssfix and --fragment, you should "
3594 "set --fragment (%d) larger or equal than --mssfix (%d)",
3596 }
3597 if (c->options.ce.fragment > 0 && c->options.ce.mssfix > 0
3599 {
3600 msg(M_WARN, "WARNING: if you use --mssfix and --fragment, you should "
3601 "use the \"mtu\" flag for both or none of of them.");
3602 }
3603#endif
3604}
3605
3606static void
3608{
3609 const struct options *o = &c->options;
3610
3611 if (o->ping_send_timeout && !o->ping_rec_timeout)
3612 {
3613 msg(M_WARN, "WARNING: --ping should normally be used with --ping-restart or --ping-exit");
3614 }
3615
3616 if (o->username || o->groupname || o->chroot_dir
3617#ifdef ENABLE_SELINUX
3618 || o->selinux_context
3619#endif
3620 )
3621 {
3622 if (!o->persist_tun)
3623 {
3624 msg(M_WARN,
3625 "WARNING: you are using user/group/chroot/setcon without persist-tun -- this may cause restarts to fail");
3626 }
3627 }
3628
3629 if (o->chroot_dir && !(o->username && o->groupname))
3630 {
3631 msg(M_WARN,
3632 "WARNING: you are using chroot without specifying user and group -- this may cause the chroot jail to be insecure");
3633 }
3634
3635 if (o->pull && o->ifconfig_local && c->first_time)
3636 {
3637 msg(M_WARN,
3638 "WARNING: using --pull/--client and --ifconfig together is probably not what you want");
3639 }
3640
3642 {
3643 msg(M_WARN,
3644 "NOTE: when bridging your LAN adapter with the TAP adapter, note that the new bridge adapter will often take on its own IP address that is different from what the LAN adapter was previously set to");
3645 }
3646
3647 if (o->mode == MODE_SERVER)
3648 {
3649 if (o->duplicate_cn && o->client_config_dir)
3650 {
3651 msg(M_WARN,
3652 "WARNING: using --duplicate-cn and --client-config-dir together is probably not what you want");
3653 }
3655 {
3656 msg(M_WARN, "WARNING: --ifconfig-pool-persist will not work with --duplicate-cn");
3657 }
3658 if (!o->keepalive_ping || !o->keepalive_timeout)
3659 {
3660 msg(M_WARN, "WARNING: --keepalive option is missing from server config");
3661 }
3662 }
3663
3664 if (o->tls_server)
3665 {
3667 }
3670 && !(o->verify_hash_depth == 0 && o->verify_hash))
3671 {
3672 msg(M_WARN,
3673 "WARNING: No server certificate verification method has been enabled. See http://openvpn.net/howto.html#mitm for more info.");
3674 }
3675 if (o->ns_cert_type)
3676 {
3677 msg(M_WARN, "WARNING: --ns-cert-type is DEPRECATED. Use --remote-cert-tls instead.");
3678 }
3679
3680 /* If a script is used, print appropriate warnings */
3681 if (o->user_script_used)
3682 {
3684 {
3685 msg(M_WARN,
3686 "NOTE: the current --script-security setting may allow this configuration to call user-defined scripts");
3687 }
3688 else if (script_security() >= SSEC_PW_ENV)
3689 {
3690 msg(M_WARN,
3691 "WARNING: the current --script-security setting may allow passwords to be passed to scripts via environmental variables");
3692 }
3693 else
3694 {
3695 msg(M_WARN,
3696 "NOTE: starting with " PACKAGE_NAME
3697 " 2.1, '--script-security 2' or higher is required to call user-defined scripts or executables");
3698 }
3699 }
3700}
3701
3702struct context_buffers *
3704{
3705 struct context_buffers *b;
3706
3708
3709 size_t buf_size = BUF_SIZE(frame);
3710
3711 b->read_link_buf = alloc_buf(buf_size);
3712 b->read_tun_buf = alloc_buf(buf_size);
3713
3714 b->aux_buf = alloc_buf(buf_size);
3715
3716 b->encrypt_buf = alloc_buf(buf_size);
3717 b->decrypt_buf = alloc_buf(buf_size);
3718
3719#ifdef USE_COMP
3720 b->compress_buf = alloc_buf(buf_size);
3721 b->decompress_buf = alloc_buf(buf_size);
3722#endif
3723
3724 return b;
3725}
3726
3727void
3729{
3730 if (b)
3731 {
3734 free_buf(&b->aux_buf);
3735
3736#ifdef USE_COMP
3737 free_buf(&b->compress_buf);
3738 free_buf(&b->decompress_buf);
3739#endif
3740
3741 free_buf(&b->encrypt_buf);
3742 free_buf(&b->decrypt_buf);
3743
3744 free(b);
3745 }
3746}
3747
3748/*
3749 * Now that we know all frame parameters, initialize
3750 * our buffers.
3751 */
3752static void
3754{
3756 c->c2.buffers_owned = true;
3757}
3758
3759#ifdef ENABLE_FRAGMENT
3760/*
3761 * Fragmenting code has buffers to initialize
3762 * once frame parameters are known.
3763 */
3764static void
3766{
3768
3769 /*
3770 * Set frame parameter for fragment code. This is necessary because
3771 * the fragmentation code deals with payloads which have already been
3772 * passed through the compression code.
3773 */
3774 c->c2.frame_fragment = c->c2.frame;
3775
3779}
3780#endif
3781
3782/*
3783 * Allocate our socket object.
3784 */
3785static void
3787{
3788 ASSERT(!c->c2.link_sockets);
3789
3791
3792 for (int i = 0; i < c->c1.link_sockets_num; i++)
3793 {
3795 }
3796 c->c2.link_socket_owned = true;
3797}
3798
3799/*
3800 * bind TCP/UDP sockets
3801 */
3802static void
3804{
3805 for (int i = 0; i < c->c1.link_sockets_num; i++)
3806 {
3807 int mode = LS_MODE_DEFAULT;
3808
3809 /* mode allows CM_CHILD_TCP
3810 * instances to inherit acceptable fds
3811 * from a top-level parent */
3812 if (c->options.mode == MODE_SERVER)
3813 {
3814 /* initializing listening socket */
3815 if (c->mode == CM_TOP)
3816 {
3817 mode = LS_MODE_TCP_LISTEN;
3818 }
3819 /* initializing socket to client */
3820 else if (c->mode == CM_CHILD_TCP)
3821 {
3823 }
3824 }
3825
3826 /* init each socket with its specific args */
3827 link_socket_init_phase1(c, i, mode);
3828 }
3829}
3830
3831/*
3832 * finalize TCP/UDP sockets
3833 */
3834static void
3836{
3837 for (int i = 0; i < c->c1.link_sockets_num; i++)
3838 {
3840 }
3841}
3842
3843/*
3844 * Print MTU INFO
3845 */
3846static void
3848{
3849 frame_print(&c->c2.frame, D_MTU_INFO, "Data Channel MTU parms");
3850#ifdef ENABLE_FRAGMENT
3851 if (c->c2.fragment)
3852 {
3853 frame_print(&c->c2.frame_fragment, D_MTU_INFO, "Fragmentation MTU parms");
3854 }
3855#endif
3856}
3857
3858/*
3859 * Get local and remote options compatibility strings.
3860 */
3861static void
3863{
3864 struct gc_arena gc = gc_new();
3865
3867 options_string(&c->options, &c->c2.frame, c->c1.tuntap, &c->net_ctx, false, &gc);
3869 options_string(&c->options, &c->c2.frame, c->c1.tuntap, &c->net_ctx, true, &gc);
3870
3871 msg(D_SHOW_OCC, "Local Options String (VER=%s): '%s'",
3873 msg(D_SHOW_OCC, "Expected Remote Options String (VER=%s): '%s'",
3875
3876 if (c->c2.tls_multi)
3877 {
3880 }
3881
3882 gc_free(&gc);
3883}
3884
3885/*
3886 * These things can only be executed once per program instantiation.
3887 * Set up for possible UID/GID downgrade, but don't do it yet.
3888 * Daemonize if requested.
3889 */
3890static void
3892{
3893 if (c->first_time && !c->c0)
3894 {
3895 struct context_0 *c0;
3896
3897 ALLOC_OBJ_CLEAR_GC(c->c0, struct context_0, &c->gc);
3898 c0 = c->c0;
3899
3900 /* get user and/or group that we want to setuid/setgid to,
3901 * sets also platform_x_state */
3902 bool group_defined = platform_group_get(c->options.groupname, &c0->platform_state_group);
3903 bool user_defined = platform_user_get(c->options.username, &c0->platform_state_user);
3904
3905 c0->uid_gid_specified = user_defined || group_defined;
3906
3907 /* fork the dns script runner to preserve root? */
3908 c->persist.duri.required = user_defined;
3909
3910 /* perform postponed chdir if --daemon */
3911 if (c->did_we_daemonize && c->options.cd_dir == NULL)
3912 {
3913 platform_chdir("/");
3914 }
3915
3916 /* should we change scheduling priority? */
3918 }
3919}
3920
3921/*
3922 * free buffers
3923 */
3924static void
3926{
3927 if (c->c2.buffers_owned)
3928 {
3930 c->c2.buffers = NULL;
3931 c->c2.buffers_owned = false;
3932 }
3933}
3934
3935/*
3936 * close TLS
3937 */
3938static void
3940{
3941 if (c->c2.tls_multi)
3942 {
3943 tls_multi_free(c->c2.tls_multi, true);
3944 c->c2.tls_multi = NULL;
3945 }
3946
3947 /* free options compatibility strings */
3948 free(c->c2.options_string_local);
3949 free(c->c2.options_string_remote);
3950
3952
3953 if (c->c2.pulled_options_state)
3954 {
3957 }
3958
3960}
3961
3962/*
3963 * Free key schedules
3964 */
3965static void
3966do_close_free_key_schedule(struct context *c, bool free_ssl_ctx)
3967{
3968 /*
3969 * always free the tls_auth/crypt key. The key will
3970 * be reloaded from memory (pre-cached)
3971 */
3974 CLEAR(c->c1.ks.tls_wrap_key);
3977
3978 if (!(c->sig->signal_received == SIGUSR1))
3979 {
3980 key_schedule_free(&c->c1.ks, free_ssl_ctx);
3981 }
3982}
3983
3984/*
3985 * Close TCP/UDP connection
3986 */
3987static void
3989{
3990 if (c->c2.link_sockets && c->c2.link_socket_owned)
3991 {
3992 for (int i = 0; i < c->c1.link_sockets_num; i++)
3993 {
3994 /* in dco-win case, link socket is a tun handle which is
3995 * closed in do_close_tun(). Set it to UNDEFINED so
3996 * we won't use WinSock API to close it. */
3997 if (tuntap_is_dco_win(c->c1.tuntap))
3998 {
4000 }
4001
4003 }
4004 c->c2.link_sockets = NULL;
4005 }
4006
4007
4008 /* Preserve the resolved list of remote if the user request to or if we want
4009 * reconnect to the same host again or there are still addresses that need
4010 * to be tried */
4011 if (!(c->sig->signal_received == SIGUSR1
4012 && ((c->options.persist_remote_ip)
4013 || (c->sig->source != SIG_SOURCE_HARD
4015 && c->c1.link_socket_addrs[0].current_remote->ai_next)
4016 || c->options.no_advance)))))
4017 {
4019 }
4020
4021 /* Clear the remote actual address when persist_remote_ip is not in use */
4023 {
4024 for (int i = 0; i < c->c1.link_sockets_num; i++)
4025 {
4027 }
4028 }
4029
4031 {
4032 for (int i = 0; i < c->c1.link_sockets_num; i++)
4033 {
4035 {
4036 freeaddrinfo(c->c1.link_socket_addrs[i].bind_local);
4037 }
4038
4039 c->c1.link_socket_addrs[i].bind_local = NULL;
4040 }
4041 }
4042}
4043
4044/*
4045 * Close packet-id persistence file
4046 */
4047static void
4057
4058#ifdef ENABLE_FRAGMENT
4059/*
4060 * Close fragmentation handler.
4061 */
4062static void
4064{
4065 if (c->c2.fragment)
4066 {
4068 c->c2.fragment = NULL;
4069 }
4070}
4071#endif
4072
4073/*
4074 * Open and close our event objects.
4075 */
4076
4077static void
4078do_event_set_init(struct context *c, bool need_us_timeout)
4079{
4080 unsigned int flags = 0;
4081
4083
4084 flags |= EVENT_METHOD_FAST;
4085
4086 if (need_us_timeout)
4087 {
4088 flags |= EVENT_METHOD_US_TIMEOUT;
4089 }
4090
4091 c->c2.event_set = event_set_init(&c->c2.event_set_max, flags);
4092 c->c2.event_set_owned = true;
4093}
4094
4095static void
4097{
4098 if (c->c2.event_set && c->c2.event_set_owned)
4099 {
4101 c->c2.event_set = NULL;
4102 c->c2.event_set_owned = false;
4103 }
4104}
4105
4106/*
4107 * Open and close --status file
4108 */
4109
4110static void
4112{
4113 if (!c->c1.status_output)
4114 {
4115 c->c1.status_output =
4118 c->c1.status_output_owned = true;
4119 }
4120}
4121
4122static void
4124{
4125 if (!(c->sig->signal_received == SIGUSR1))
4126 {
4128 {
4130 c->c1.status_output = NULL;
4131 c->c1.status_output_owned = false;
4132 }
4133 }
4134}
4135
4136/*
4137 * Handle ifconfig-pool persistence object.
4138 */
4139static void
4150
4151static void
4153{
4154 if (!(c->sig->signal_received == SIGUSR1))
4155 {
4157 {
4159 c->c1.ifconfig_pool_persist = NULL;
4161 }
4162 }
4163}
4164
4165/*
4166 * Inherit environmental variables
4167 */
4168
4169static void
4170do_inherit_env(struct context *c, const struct env_set *src)
4171{
4172 c->c2.es = env_set_create(NULL);
4173 c->c2.es_owned = true;
4174 env_set_inherit(c->c2.es, src);
4175}
4176
4177static void
4179{
4180 if (c->c2.es && c->c2.es_owned)
4181 {
4182 env_set_destroy(c->c2.es);
4183 c->c2.es = NULL;
4184 c->c2.es_owned = false;
4185 }
4186}
4187
4188static void
4190{
4191 if (c->options.tls_exit)
4192 {
4194 }
4195 else
4196 {
4198 }
4199}
4200
4201#ifdef ENABLE_PLUGIN
4202
4203void
4205{
4206 if (c->options.plugin_list && !c->plugins)
4207 {
4209 c->plugins_owned = true;
4210 }
4211}
4212
4213void
4214open_plugins(struct context *c, const bool import_options, int init_point)
4215{
4216 if (c->plugins && c->plugins_owned)
4217 {
4218 if (import_options)
4219 {
4220 struct plugin_return pr, config;
4221 plugin_return_init(&pr);
4222 plugin_list_open(c->plugins, c->options.plugin_list, &pr, c->c2.es, init_point);
4223 plugin_return_get_column(&pr, &config, "config");
4224 if (plugin_return_defined(&config))
4225 {
4226 int i;
4227 for (i = 0; i < config.n; ++i)
4228 {
4229 uint64_t option_types_found = 0;
4230 if (config.list[i] && config.list[i]->value)
4231 {
4233 &c->options, config.list[i]->value, D_IMPORT_ERRORS | M_OPTERR,
4234 OPT_P_DEFAULT & ~OPT_P_PLUGIN, &option_types_found, c->es);
4235 }
4236 }
4237 }
4238 plugin_return_free(&pr);
4239 }
4240 else
4241 {
4242 plugin_list_open(c->plugins, c->options.plugin_list, NULL, c->c2.es, init_point);
4243 }
4244 }
4245}
4246
4247static void
4249{
4250 if (c->plugins && c->plugins_owned && !(c->sig->signal_received == SIGUSR1))
4251 {
4253 c->plugins = NULL;
4254 c->plugins_owned = false;
4255 }
4256}
4257
4258static void
4259do_inherit_plugins(struct context *c, const struct context *src)
4260{
4261 if (!c->plugins && src->plugins)
4262 {
4264 c->plugins_owned = true;
4265 }
4266}
4267
4268#endif /* ifdef ENABLE_PLUGIN */
4269
4270#ifdef ENABLE_MANAGEMENT
4271
4272static void
4273management_callback_status_p2p(void *arg, const int version, struct status_output *so)
4274{
4275 struct context *c = (struct context *)arg;
4276 print_status(c, so);
4277}
4278
4279void
4280management_show_net_callback(void *arg, const msglvl_t msglevel)
4281{
4282#ifdef _WIN32
4283 show_routes(msglevel);
4284 show_adapters(msglevel);
4285 msg(msglevel, "END");
4286#else
4287 msg(msglevel, "ERROR: Sorry, this command is currently only implemented on Windows");
4288#endif
4289}
4290
4291#ifdef TARGET_ANDROID
4292int
4293management_callback_network_change(void *arg, bool samenetwork)
4294{
4295 /* Check if the client should translate the network change to a SIGUSR1 to
4296 * reestablish the connection or just reprotect the socket
4297 *
4298 * At the moment just assume that, for all settings that use pull (not
4299 * --static) and are not using peer-id reestablishing the connection is
4300 * required (unless the network is the same)
4301 *
4302 * The function returns -1 on invalid fd and -2 if the socket cannot be
4303 * reused. On the -2 return value the man_network_change function triggers
4304 * a SIGUSR1 to force a reconnect.
4305 */
4306
4307 int socketfd = -1;
4308 struct context *c = (struct context *)arg;
4309 if (!c->c2.link_sockets || !c->c2.link_sockets[0])
4310 {
4311 return -1;
4312 }
4313 if (c->c2.link_sockets[0]->sd == SOCKET_UNDEFINED)
4314 {
4315 return -1;
4316 }
4317
4318 /* On some newer Android handsets, changing to a different network
4319 * often does not trigger a TCP reset but continue using the old
4320 * connection (e.g. using mobile connection when WiFi becomes available */
4321 const struct link_socket_info *lsi = get_link_socket_info(c);
4322 if (lsi && proto_is_tcp(lsi->proto) && !samenetwork)
4323 {
4324 return -2;
4325 }
4326
4327 socketfd = c->c2.link_sockets[0]->sd;
4328 if (!c->options.pull || c->c2.tls_multi->use_peer_id || samenetwork)
4329 {
4330 return socketfd;
4331 }
4332 else
4333 {
4334 return -2;
4335 }
4336}
4337#endif /* ifdef TARGET_ANDROID */
4338
4339static bool
4341 struct buffer_list *input) /* ownership transferred */
4342{
4343 struct context *c = arg;
4344
4345 bool ret = false;
4346 if (buffer_list_defined(input) && c->c2.tls_multi)
4347 {
4348 struct tls_multi *multi = c->c2.tls_multi;
4349 struct tls_session *session = &multi->session[TM_ACTIVE];
4350
4351 ret = management_send_acc_message(c, multi, session, input);
4352 }
4353
4354 buffer_list_free(input);
4355 return ret;
4356}
4357#endif /* ifdef ENABLE_MANAGEMENT */
4358
4359void
4361{
4362#ifdef ENABLE_MANAGEMENT
4363 if (management)
4364 {
4365 struct management_callback cb;
4366 CLEAR(cb);
4367 cb.arg = c;
4374#ifdef TARGET_ANDROID
4375 cb.network_change = management_callback_network_change;
4376#endif
4380 }
4381#endif
4382}
4383
4384#ifdef ENABLE_MANAGEMENT
4385
4386void
4388{
4389 if (!management)
4390 {
4392 }
4393}
4394
4395bool
4397{
4398 /* initialize management layer */
4399 if (management)
4400 {
4401 if (c->options.management_addr)
4402 {
4403 unsigned int flags = c->options.management_flags;
4404 if (c->options.mode == MODE_SERVER)
4405 {
4406 flags |= MF_SERVER;
4407 }
4408 if (management_open(
4414 {
4416 NULL);
4417 }
4418
4419 /* initial management hold, called early, before first context initialization */
4420 do_hold(0);
4421 if (IS_SIG(c))
4422 {
4423 msg(M_WARN, "Signal received from management interface, exiting");
4424 return false;
4425 }
4426 }
4427 else
4428 {
4430 }
4431 }
4432 return true;
4433}
4434
4435void
4437{
4438 if (management)
4439 {
4441 management = NULL;
4442 }
4443}
4444
4445#endif /* ifdef ENABLE_MANAGEMENT */
4446
4447
4448void
4450{
4451#ifdef ENABLE_MANAGEMENT
4452 if (management)
4453 {
4455 }
4456#endif
4457}
4458
4459void
4461{
4462#ifdef ENABLE_MANAGEMENT
4463 if (management)
4464 {
4466 }
4467#endif
4468}
4469
4470/*
4471 * Initialize a tunnel instance.
4472 */
4473static void
4474init_instance(struct context *c, const struct env_set *env, const unsigned int flags)
4475{
4476 const struct options *options = &c->options;
4477 const bool child = (c->mode == CM_CHILD_TCP || c->mode == CM_CHILD_UDP);
4478
4479 /* init garbage collection level */
4480 gc_init(&c->c2.gc);
4481
4482 /* inherit environmental variables */
4483 if (env)
4484 {
4485 do_inherit_env(c, env);
4486 }
4487
4488 if (c->mode == CM_P2P)
4489 {
4491 }
4492
4493 /* possible sleep or management hold if restart */
4494 if (c->mode == CM_P2P || c->mode == CM_TOP)
4495 {
4497 if (IS_SIG(c))
4498 {
4499 goto sig;
4500 }
4501 }
4502
4504 {
4505 do_preresolve(c);
4506 if (IS_SIG(c))
4507 {
4508 goto sig;
4509 }
4510 }
4511
4512 /* Resets all values to the initial values from the config where needed */
4513 pre_connect_restore(&c->options, &c->c2.gc);
4514
4515 /* map in current connection entry */
4517
4518 /* should we disable paging? */
4519 if (c->first_time && options->mlock)
4520 {
4521 platform_mlockall(true);
4522 }
4523
4524 /* get passwords if undefined */
4525 if (auth_retry_get() == AR_INTERACT)
4526 {
4528 }
4529
4530 /* initialize context level 2 --verb/--mute parms */
4532
4533 /* set error message delay for non-server modes */
4534 if (c->mode == CM_P2P)
4535 {
4537 }
4538
4539 /* warn about inconsistent options */
4540 if (c->mode == CM_P2P || c->mode == CM_TOP)
4541 {
4543 }
4544
4545#ifdef ENABLE_PLUGIN
4546 /* initialize plugins */
4547 if (c->mode == CM_P2P || c->mode == CM_TOP)
4548 {
4549 open_plugins(c, false, OPENVPN_PLUGIN_INIT_PRE_DAEMON);
4550 }
4551#endif
4552
4553 /* should we throw a signal on TLS errors? */
4555
4556 /* open --status file */
4557 if (c->mode == CM_P2P || c->mode == CM_TOP)
4558 {
4560 }
4561
4562 /* open --ifconfig-pool-persist file */
4563 if (c->mode == CM_TOP)
4564 {
4566 }
4567
4568 /* reset OCC state */
4569 if (c->mode == CM_P2P || child)
4570 {
4571 c->c2.occ_op = occ_reset_op();
4572 }
4573
4574 /* our wait-for-i/o objects, different for posix vs. win32 */
4575 if (c->mode == CM_P2P || c->mode == CM_TOP)
4576 {
4578 }
4579 else if (c->mode == CM_CHILD_TCP)
4580 {
4581 do_event_set_init(c, false);
4582 }
4583
4584 /* initialize HTTP or SOCKS proxy object at scope level 2 */
4585 init_proxy(c);
4586
4587 /* allocate our socket object */
4588 if (c->mode == CM_P2P || c->mode == CM_TOP || c->mode == CM_CHILD_TCP)
4589 {
4591 }
4592
4593#ifdef ENABLE_FRAGMENT
4594 /* initialize internal fragmentation object */
4595 if (options->ce.fragment && (c->mode == CM_P2P || child))
4596 {
4597 c->c2.fragment = fragment_init(&c->c2.frame);
4598 }
4599#endif
4600
4601 /* init crypto layer */
4602 {
4603 unsigned int crypto_flags = 0;
4604 if (c->mode == CM_TOP)
4605 {
4606 crypto_flags = CF_INIT_TLS_AUTH_STANDALONE;
4607 }
4608 else if (c->mode == CM_P2P)
4609 {
4611 }
4612 else if (child)
4613 {
4614 crypto_flags = CF_INIT_TLS_MULTI;
4615 }
4616 do_init_crypto(c, crypto_flags);
4617 if (IS_SIG(c) && !child)
4618 {
4619 goto sig;
4620 }
4621 }
4622
4623#ifdef USE_COMP
4624 /* initialize compression library. */
4625 if (comp_enabled(&options->comp) && (c->mode == CM_P2P || child))
4626 {
4627 c->c2.comp_context = comp_init(&options->comp);
4628 }
4629#endif
4630
4631 /* initialize MTU variables */
4632 do_init_frame(c);
4633
4634 /* initialize TLS MTU variables */
4636
4637 /* init workspace buffers whose size is derived from frame size */
4638 if (c->mode == CM_P2P || c->mode == CM_CHILD_TCP)
4639 {
4640 do_init_buffers(c);
4641 }
4642
4643#ifdef ENABLE_FRAGMENT
4644 /* initialize internal fragmentation capability with known frame size */
4645 if (options->ce.fragment && (c->mode == CM_P2P || child))
4646 {
4648 }
4649#endif
4650
4651 /* bind the TCP/UDP socket */
4652 if (c->mode == CM_P2P || c->mode == CM_TOP || c->mode == CM_CHILD_TCP)
4653 {
4655 }
4656
4657 /* initialize tun/tap device object,
4658 * open tun/tap device, ifconfig, run up script, etc. */
4659 if (!(options->up_delay || PULL_DEFINED(options)) && (c->mode == CM_P2P || c->mode == CM_TOP))
4660 {
4661 int error_flags = 0;
4662 c->c2.did_open_tun = do_open_tun(c, &error_flags);
4663 }
4664
4665 /* print MTU info */
4667
4668 /* get local and remote options compatibility strings */
4669 if (c->mode == CM_P2P || child)
4670 {
4672 }
4673
4674 /* initialize output speed limiter */
4675 if (c->mode == CM_P2P)
4676 {
4678 }
4679
4680 /* do one-time inits, and possibly become a daemon here */
4682
4683#ifdef ENABLE_PLUGIN
4684 /* initialize plugins */
4685 if (c->mode == CM_P2P || c->mode == CM_TOP)
4686 {
4687 open_plugins(c, false, OPENVPN_PLUGIN_INIT_POST_DAEMON);
4688 }
4689#endif
4690
4691 /* initialise connect timeout timer */
4693
4694 /* finalize the TCP/UDP socket */
4695 if (c->mode == CM_P2P || c->mode == CM_TOP || c->mode == CM_CHILD_TCP)
4696 {
4698
4699
4700 /* Update dynamic frame calculation as exact transport socket information
4701 * (IP vs IPv6) may be only available after socket phase2 has finished.
4702 * This is only needed for --static or no crypto, NCP will recalculate this
4703 * in tls_session_update_crypto_params (P2MP) */
4704 for (int i = 0; i < c->c1.link_sockets_num; i++)
4705 {
4707 &c->c2.link_sockets[i]->info);
4708 }
4709 }
4710
4711 /*
4712 * Actually do UID/GID downgrade, and chroot, if requested.
4713 * May be delayed by --client, --pull, or --up-delay.
4714 */
4716
4717 /* initialize timers */
4718 if (c->mode == CM_P2P || child)
4719 {
4720 do_init_timers(c, false);
4721 }
4722
4723#ifdef ENABLE_PLUGIN
4724 /* initialize plugins */
4725 if (c->mode == CM_P2P || c->mode == CM_TOP)
4726 {
4727 open_plugins(c, false, OPENVPN_PLUGIN_INIT_POST_UID_CHANGE);
4728 }
4729#endif
4730
4731#if PORT_SHARE
4732 /* share OpenVPN port with foreign (such as HTTPS) server */
4733 if (c->first_time && (c->mode == CM_P2P || c->mode == CM_TOP))
4734 {
4735 init_port_share(c);
4736 }
4737#endif
4738
4739 /* Check for signals */
4740 if (IS_SIG(c))
4741 {
4742 goto sig;
4743 }
4744
4745 return;
4746
4747sig:
4748 if (!c->sig->signal_text)
4749 {
4750 c->sig->signal_text = "init_instance";
4751 }
4752 close_context(c, -1, flags);
4753 return;
4754}
4755
4756/*
4757 * Initialize a tunnel instance, handle pre and post-init
4758 * signal settings.
4759 */
4760void
4761init_instance_handle_signals(struct context *c, const struct env_set *env, const unsigned int flags)
4762{
4764 init_instance(c, env, flags);
4766
4767 /*
4768 * This is done so that signals thrown during
4769 * initialization can bring us back to
4770 * a management hold.
4771 */
4772 if (IS_SIG(c))
4773 {
4774 remap_signal(c);
4776 }
4777}
4778
4779/*
4780 * Close a tunnel instance.
4781 */
4782void
4784{
4785 /* close event objects */
4787
4788 if (c->mode == CM_P2P || c->mode == CM_CHILD_TCP || c->mode == CM_CHILD_UDP
4789 || c->mode == CM_TOP)
4790 {
4791#ifdef USE_COMP
4792 if (c->c2.comp_context)
4793 {
4794 comp_uninit(c->c2.comp_context);
4795 c->c2.comp_context = NULL;
4796 }
4797#endif
4798
4799 /* free buffers */
4801
4802 /* close peer for DCO if enabled, needs peer-id so must be done before
4803 * closing TLS contexts */
4804 dco_remove_peer(c);
4805
4806 /* close TLS */
4807 do_close_tls(c);
4808
4809 /* free key schedules */
4810 do_close_free_key_schedule(c, (c->mode == CM_P2P || c->mode == CM_TOP));
4811
4812 /* close TCP/UDP connection */
4814
4815 /* close TUN/TAP device */
4816 do_close_tun(c, false);
4817
4818#ifdef ENABLE_MANAGEMENT
4819 if (management)
4820 {
4822 }
4823#endif
4824
4825#ifdef ENABLE_PLUGIN
4826 /* call plugin close functions and unload */
4828#endif
4829
4830 /* close packet-id persistence file */
4832
4833 /* close --status file */
4835
4836#ifdef ENABLE_FRAGMENT
4837 /* close fragmentation handler */
4839#endif
4840
4841 /* close --ifconfig-pool-persist obj */
4843
4844 /* free up environmental variable store */
4846
4847 /* close HTTP or SOCKS proxy */
4848 uninit_proxy(c);
4849
4850 /* garbage collect */
4851 gc_free(&c->c2.gc);
4852 }
4853}
4854
4855void
4856inherit_context_child(struct context *dest, const struct context *src, struct link_socket *sock)
4857{
4858 CLEAR(*dest);
4859
4860 /* proto_is_dgram will ASSERT(0) if proto is invalid */
4862
4863 dest->gc = gc_new();
4864
4865 ALLOC_OBJ_CLEAR_GC(dest->sig, struct signal_info, &dest->gc);
4866
4867 /* c1 init */
4869 dest->c1.link_sockets_num = 1;
4871
4872 dest->c1.ks.key_type = src->c1.ks.key_type;
4873 /* inherit SSL context */
4874 dest->c1.ks.ssl_ctx = src->c1.ks.ssl_ctx;
4875 dest->c1.ks.tls_wrap_key = src->c1.ks.tls_wrap_key;
4878 /* inherit pre-NCP ciphers */
4879 dest->options.ciphername = src->options.ciphername;
4880 dest->options.authname = src->options.authname;
4881
4882 /* inherit auth-token */
4883 dest->c1.ks.auth_token_key = src->c1.ks.auth_token_key;
4884
4885 /* options */
4886 dest->options = src->options;
4887 dest->options.ce.proto = sock->info.proto;
4888 options_detach(&dest->options);
4889
4890 dest->c2.event_set = src->c2.event_set;
4891
4892 if (dest->mode == CM_CHILD_TCP)
4893 {
4894 /*
4895 * The CM_TOP context does the socket listen(),
4896 * and the CM_CHILD_TCP context does the accept().
4897 */
4898 dest->c2.accept_from = sock;
4899 }
4900
4901#ifdef ENABLE_PLUGIN
4902 /* inherit plugins */
4903 do_inherit_plugins(dest, src);
4904#endif
4905
4906 /* context init */
4907
4908 /* inherit tun/tap interface object now as it may be required
4909 * to initialize the DCO context in init_instance()
4910 */
4911 dest->c1.tuntap = src->c1.tuntap;
4912
4913 /* UDP inherits some extra things which TCP does not */
4914 if (dest->mode == CM_CHILD_UDP)
4915 {
4916 ASSERT(!dest->c2.link_sockets);
4917 ASSERT(dest->options.ce.local_list);
4918
4919 /* inherit buffers */
4920 dest->c2.buffers = src->c2.buffers;
4921
4922 ALLOC_ARRAY_GC(dest->c2.link_sockets, struct link_socket *, 1, &dest->gc);
4923
4924 /* inherit parent link_socket and tuntap */
4925 dest->c2.link_sockets[0] = sock;
4926
4927 ALLOC_ARRAY_GC(dest->c2.link_socket_infos, struct link_socket_info *, 1, &dest->gc);
4928 ALLOC_OBJ_GC(dest->c2.link_socket_infos[0], struct link_socket_info, &dest->gc);
4929 *dest->c2.link_socket_infos[0] = sock->info;
4930
4931 /* locally override some link_socket_info fields */
4932 dest->c2.link_socket_infos[0]->lsa = &dest->c1.link_socket_addrs[0];
4934 }
4935
4937 if (IS_SIG(dest))
4938 {
4939 return;
4940 }
4941}
4942
4943void
4944inherit_context_top(struct context *dest, const struct context *src)
4945{
4946 /* copy parent */
4947 *dest = *src;
4948
4949 /*
4950 * CM_TOP_CLONE will prevent close_instance from freeing or closing
4951 * resources owned by the parent.
4952 *
4953 * Also note that CM_TOP_CLONE context objects are
4954 * closed by multi_top_free in multi.c.
4955 */
4956 dest->mode = CM_TOP_CLONE;
4957
4958 dest->first_time = false;
4959 dest->c0 = NULL;
4960
4961 options_detach(&dest->options);
4962 gc_detach(&dest->gc);
4963 gc_detach(&dest->c2.gc);
4964
4965 /* detach plugins */
4966 dest->plugins_owned = false;
4967
4968 dest->c2.tls_multi = NULL;
4969
4970 /* detach c1 ownership */
4971 dest->c1.tuntap_owned = false;
4972 dest->c1.status_output_owned = false;
4973 dest->c1.ifconfig_pool_persist_owned = false;
4974
4975 /* detach c2 ownership */
4976 dest->c2.event_set_owned = false;
4977 dest->c2.link_socket_owned = false;
4978 dest->c2.buffers_owned = false;
4979 dest->c2.es_owned = false;
4980
4981 dest->c2.event_set = NULL;
4982 do_event_set_init(dest, false);
4983
4984#ifdef USE_COMP
4985 dest->c2.comp_context = NULL;
4986#endif
4987}
4988
4989void
4990close_context(struct context *c, int sig, unsigned int flags)
4991{
4992 ASSERT(c);
4993 ASSERT(c->sig);
4994
4995 if (sig >= 0)
4996 {
4997 register_signal(c->sig, sig, "close_context");
4998 }
4999
5000 if (c->sig->signal_received == SIGUSR1)
5001 {
5002 if ((flags & CC_USR1_TO_HUP)
5003 || (c->sig->source == SIG_SOURCE_HARD && (flags & CC_HARD_USR1_TO_HUP)))
5004 {
5005 register_signal(c->sig, SIGHUP, "close_context usr1 to hup");
5006 }
5007 }
5008
5009 if (!(flags & CC_NO_CLOSE))
5010 {
5011 close_instance(c);
5012 }
5013
5014 if (flags & CC_GC_FREE)
5015 {
5016 context_gc_free(c);
5017 }
5018}
5019
5020/* Write our PID to a file */
5021void
5022write_pid_file(const char *filename, const char *chroot_dir)
5023{
5024 if (filename)
5025 {
5026 unsigned int pid = 0;
5027 FILE *fp = platform_fopen(filename, "w");
5028 if (!fp)
5029 {
5030 msg(M_ERR, "Open error on pid file %s", filename);
5031 return;
5032 }
5033
5034 pid = platform_getpid();
5035 fprintf(fp, "%u\n", pid);
5036 if (fclose(fp))
5037 {
5038 msg(M_ERR, "Close error on pid file %s", filename);
5039 }
5040
5041 /* remember file name so it can be deleted "out of context" later */
5042 /* (the chroot case is more complex and not handled today) */
5043 if (!chroot_dir)
5044 {
5045 saved_pid_file_name = strdup(filename);
5047 {
5048 msg(M_FATAL, "Failed allocate memory saved_pid_file_name");
5049 }
5050 }
5051 }
5052}
5053
5054/* remove PID file on exit, called from openvpn_exit() */
5055void
5057{
5059 {
5061 }
5062}
5063
5064
5065/*
5066 * Do a loopback test
5067 * on the crypto subsystem.
5068 */
5069void
5071{
5072 /* print version number */
5073 msg(M_INFO, "%s", title_string);
5074 const struct options *options = &c->options;
5075
5078 context_init_1(c);
5081
5083
5085
5086 key_schedule_free(&c->c1.ks, true);
5088
5089 context_gc_free(c);
5090}
void notify_client_acc_protocols(struct tls_multi *multi)
Notifies a client via management interface of the negotiated app custom protocols.
Definition acc.c:436
void argv_msg(const msglvl_t msglevel, const struct argv *a)
Write the arguments stored in a struct argv via the msg() command.
Definition argv.c:242
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 auth_token_write_server_key_file(const char *filename)
Generate a auth-token server secret key, and write to file.
Definition auth_token.c:136
void auth_token_init_secret(struct key_ctx *key_ctx, const char *key_file, bool key_inline)
Loads an HMAC secret from a file or if no file is present generates a epheremal secret for the run ti...
Definition auth_token.c:142
bool buffer_list_defined(const struct buffer_list *ol)
Checks if the list is valid and non-empty.
Definition buffer.c:1169
void free_buf(struct buffer *buf)
Free the memory allocated for a buffer.
Definition buffer.c:169
void buf_clear(struct buffer *buf)
Zeroise and reset a buffer.
Definition buffer.c:148
bool buf_printf(struct buffer *buf, const char *format,...)
printf-style append to a buffer with overflow check.
Definition buffer.c:226
void string_clear(char *str)
Securely clear a null-terminated string.
Definition buffer.c:634
void buffer_list_free(struct buffer_list *ol)
Frees a buffer list and all the buffers in it.
Definition buffer.c:1159
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
char * string_alloc(const char *str, struct gc_arena *gc)
Duplicate a string, allocating memory under garbage collection.
Definition buffer.c:601
static void gc_detach(struct gc_arena *a)
Detach all allocations from an arena without freeing them.
Definition buffer.h:1938
#define BSTR(buf)
Return the buffer content pointer cast to char *.
Definition buffer.h:157
#define ALLOC_ARRAY_GC(dptr, type, n, gc)
Allocate a garbage-collected array of n elements of the given type.
Definition buffer.h:2056
#define streq(x, y)
helper to work around the semantics of the strcmp() return value
Definition buffer.h:1813
#define ALLOC_ARRAY_CLEAR_GC(dptr, type, n, gc)
Allocate and zero-initialise a garbage-collected array of n elements.
Definition buffer.h:2082
static void gc_init(struct gc_arena *a)
Initialise a garbage collection arena to an empty state.
Definition buffer.h:1923
static void buf_set_write(struct buffer *buf, uint8_t *data, int size)
Initialise a buffer with an externally provided writable memory region.
Definition buffer.h:658
static int buf_len(const struct buffer *buf)
Return the length of the buffer content.
Definition buffer.h:462
#define ALLOC_OBJ_CLEAR_GC(dptr, type, gc)
Allocate and zero-initialise a garbage-collected object of the given type.
Definition buffer.h:2123
#define ALLOC_OBJ_GC(dptr, type, gc)
Allocate a garbage-collected object of the given type (uninitialised).
Definition buffer.h:2111
#define BLENZ(buf)
Return the length of the buffer content as a size_t.
Definition buffer.h:153
static void check_malloc_return(void *p)
Abort if a memory allocation returned NULL.
Definition buffer.h:2135
static void gc_free(struct gc_arena *a)
Free all allocations in a garbage collection arena.
Definition buffer.h:1965
#define ALLOC_OBJ_CLEAR(dptr, type)
Allocate and zero-initialise memory for a single object of the given type.
Definition buffer.h:2027
static struct gc_arena gc_new(void)
Allocate and return a new, empty garbage collection arena.
Definition buffer.h:1949
#define PUSH_BUNDLE_SIZE
Definition common.h:89
bool check_compression_settings_valid(const struct compress_options *info, msglvl_t msglevel)
Checks if the compression settings are valid.
Definition comp.c:162
char * basename(char *filename)
int daemon(int nochdir, int noclose)
size_t strlcpy(char *dest, const char *src, size_t maxlen)
void free_key_ctx_bi(struct key_ctx_bi *ctx)
Definition crypto.c:1100
void init_key_type(struct key_type *kt, const char *ciphername, const char *authname, bool tls_mode, bool warn)
Initialize a key_type structure with.
Definition crypto.c:875
void test_crypto(struct crypto_options *co, const struct frame *frame)
Definition crypto.c:1165
int write_key_file(const int nkeys, const char *filename)
Write nkeys 1024-bits keys to file.
Definition crypto.c:1520
unsigned int crypto_max_overhead(void)
Return the worst-case OpenVPN crypto overhead (in bytes).
Definition crypto.c:850
int64_t get_random(void)
an analogue to the random() function, but use prng_bytes and also int64_t instead of long to avoid LL...
Definition crypto.c:1702
void generate_test_crypto_random_key(const struct key_type *key_type, struct key_ctx_bi *ctx, const char *key_name)
Generate a random key and initialise ctx to be used the in the crypto random test.
Definition crypto.c:1293
void crypto_read_openvpn_key(const struct key_type *key_type, struct key_ctx_bi *ctx, const char *key_file, bool key_inline, const int key_direction, const char *key_name, const char *opt_name, struct key2 *keydata)
Definition crypto.c:1254
void free_key_ctx(struct key_ctx *ctx)
Definition crypto.c:1081
#define CO_PACKET_ID_LONG_FORM
Bit-flag indicating whether to use OpenVPN's long packet ID format.
Definition crypto.h:347
#define CO_USE_TLS_KEY_MATERIAL_EXPORT
Bit-flag indicating that data channel key derivation is done using TLS keying material export [RFC570...
Definition crypto.h:359
#define CO_USE_DYNAMIC_TLS_CRYPT
Bit-flag indicating that renegotiations are using tls-crypt with a TLS-EKM derived key.
Definition crypto.h:375
#define CO_EPOCH_DATA_KEY_FORMAT
Bit-flag indicating the epoch the data format.
Definition crypto.h:379
#define CO_MUTE_REPLAY_WARNINGS
Bit-flag indicating not to display replay warnings.
Definition crypto.h:356
#define CO_FORCE_TLSCRYPTV2_COOKIE
Bit-flag indicating that we do not allow clients that do not support resending the wrapped client key...
Definition crypto.h:367
#define CO_USE_CC_EXIT_NOTIFY
Bit-flag indicating that explicit exit notifies should be sent via the control channel instead of usi...
Definition crypto.h:371
static bool key_ctx_bi_defined(const struct key_ctx_bi *key)
Definition crypto.h:656
void show_available_engines(void)
bool cipher_kt_mode_aead(const char *ciphername)
Check if the supplied cipher is a supported AEAD mode cipher.
void show_available_ciphers(void)
bool md_valid(const char *digest)
Return if a message digest parameters is valid given the name of the digest.
bool cipher_kt_mode_ofb_cfb(const char *ciphername)
Check if the supplied cipher is a supported OFB or CFB mode cipher.
const char * md_kt_name(const char *mdname)
Retrieve a string describing the digest digest (e.g.
const char * cipher_kt_name(const char *ciphername)
Retrieve a normalised string describing the cipher (e.g.
void crypto_init_lib_engine(const char *engine_name)
void md_ctx_cleanup(md_ctx_t *ctx)
void show_available_digests(void)
void md_ctx_free(md_ctx_t *ctx)
#define DCO_DEFAULT_METRIC
Definition dco.h:47
static void dco_remove_peer(struct context *c)
Definition dco.h:348
static bool dco_supports_epoch_data(const struct context *c)
Definition dco.h:387
static bool dco_check_pull_options(msglvl_t msglevel, const struct options *o)
Definition dco.h:286
static bool ovpn_dco_init(struct context *c)
Definition dco.h:292
static int dco_p2p_add_new_peer(struct context *c)
Definition dco.h:335
void run_dns_up_down(bool up, struct options *o, const struct tuntap *tt, struct dns_updown_runner_info *duri)
Invokes the action associated with bringing DNS up or down.
Definition dns.c:865
void env_set_destroy(struct env_set *es)
Definition env_set.c:165
void setenv_int(struct env_set *es, const char *name, int value)
Definition env_set.c:289
void setenv_str(struct env_set *es, const char *name, const char *value)
Definition env_set.c:305
void env_set_inherit(struct env_set *es, const struct env_set *src)
Definition env_set.c:260
struct env_set * env_set_create(struct gc_arena *gc)
Definition env_set.c:155
#define D_MTU_DEBUG
Definition errlevel.h:125
#define D_SHOW_OCC
Definition errlevel.h:150
#define D_PUSH
Definition errlevel.h:82
#define D_SHOW_NET
Definition errlevel.h:131
#define P2P_ERROR_DELAY_MS
Definition errlevel.h:40
#define D_RESTART
Definition errlevel.h:81
#define D_IMPORT_ERRORS
Definition errlevel.h:63
#define D_CLOSE
Definition errlevel.h:72
#define D_PUSH_DEBUG
Definition errlevel.h:149
#define D_DCO
Definition errlevel.h:93
#define D_HANDSHAKE
Definition errlevel.h:71
#define D_GENKEY
Definition errlevel.h:78
#define D_MTU_INFO
Definition errlevel.h:104
#define D_PUSH_ERRORS
Definition errlevel.h:66
#define D_INIT_MEDIUM
Definition errlevel.h:103
#define D_TLS_ERRORS
Definition errlevel.h:58
#define D_READ_WRITE
Definition errlevel.h:166
#define M_INFO
Definition errlevel.h:54
#define D_LOG_RW
Definition errlevel.h:109
#define D_ROUTE
Definition errlevel.h:79
#define D_LINK_ERRORS
Definition errlevel.h:56
struct event_set * event_set_init(int *maxevents, unsigned int flags)
Definition event.c:1187
#define EVENT_METHOD_FAST
Definition event.h:79
#define EVENT_METHOD_US_TIMEOUT
Definition event.h:78
static void event_free(struct event_set *es)
Definition event.h:159
bool send_control_channel_string(struct context *c, const char *str, msglvl_t msglevel)
Definition forward.c:409
Interface functions to the internal and external multiplexers.
static struct link_socket_info * get_link_socket_info(struct context *c)
Definition forward.h:351
struct tls_multi * tls_multi_init(const struct tls_options *tls_options)
Allocate and initialize a tls_multi structure.
Definition ssl.c:1180
void tls_init_control_channel_frame_parameters(struct frame *frame, int tls_mtu)
Definition ssl.c:156
void tls_multi_free(struct tls_multi *multi, bool clear)
Cleanup a tls_multi structure and free associated memory allocations.
Definition ssl.c:1273
void tls_multi_init_finalize(struct tls_multi *multi, int tls_mtu)
Finalize initialization of a tls_multi structure.
Definition ssl.c:1198
struct tls_auth_standalone * tls_auth_standalone_init(const struct tls_options *tls_options, struct gc_arena *gc)
Definition ssl.c:1221
void tls_auth_standalone_free(struct tls_auth_standalone *tas)
Frees a standalone tls-auth verification object.
Definition ssl.c:1246
#define TM_ACTIVE
Active tls_session.
Definition ssl_common.h:552
void tls_multi_init_set_options(struct tls_multi *multi, const char *local, const char *remote)
Definition ssl.c:1262
void fragment_frame_init(struct fragment_master *f, const struct frame *frame)
Allocate internal packet buffers for a fragment_master structure.
Definition fragment.c:125
struct fragment_master * fragment_init(struct frame *frame)
Allocate and initialize a fragment_master structure.
Definition fragment.c:92
void fragment_free(struct fragment_master *f)
Free a fragment_master structure and its internal packet buffers.
Definition fragment.c:116
void tls_crypt_init_key(struct key_ctx_bi *key, struct key2 *keydata, const char *key_file, bool key_inline, bool tls_server)
Initialize a key_ctx_bi structure for use with --tls-crypt.
Definition tls_crypt.c:62
void tls_crypt_v2_init_server_key(struct key_ctx *key_ctx, bool encrypt, const char *key_file, bool key_inline)
Initialize a tls-crypt-v2 server key (used to encrypt/decrypt client keys).
Definition tls_crypt.c:336
void tls_crypt_v2_write_client_key_file(const char *filename, const char *b64_metadata, const char *server_key_file, bool server_key_inline)
Generate a tls-crypt-v2 client key, and write to file.
Definition tls_crypt.c:701
void tls_crypt_v2_write_server_key_file(const char *filename)
Generate a tls-crypt-v2 server key, and write to file.
Definition tls_crypt.c:695
int tls_crypt_buf_overhead(void)
Returns the maximum overhead (in bytes) added to the destination buffer by tls_crypt_wrap().
Definition tls_crypt.c:56
void tls_crypt_v2_init_client_key(struct key_ctx_bi *key, struct key2 *original_key, struct buffer *wkc_buf, const char *key_file, bool key_inline)
Initialize a tls-crypt-v2 client key.
Definition tls_crypt.c:313
void uninit_management_callback(void)
Definition init.c:4449
static bool can_preserve_tun(const struct tuntap *tt)
Definition init.c:1740
static void uninit_proxy(struct context *c)
Definition init.c:728
bool open_management(struct context *c)
Definition init.c:4396
static void do_init_first_time(struct context *c)
Definition init.c:3891
static void do_init_route_list(const struct options *options, struct route_list *route_list, const struct link_socket_info *link_socket_info, struct env_set *es, openvpn_net_ctx_t *ctx)
Definition init.c:1429
static void do_init_tls_wrap_key(struct context *c)
Definition init.c:3101
static bool management_callback_remote_cmd(void *arg, const char **p)
Definition init.c:371
bool do_genkey(const struct options *options)
Definition init.c:996
static void next_connection_entry(struct context *c)
Definition init.c:516
static void do_init_crypto_test(struct context *c)
Definition init.c:3027
void initialization_sequence_completed(struct context *c, const unsigned int flags)
Definition init.c:1520
void open_plugins(struct context *c, const bool import_options, int init_point)
Definition init.c:4214
bool do_update(struct context *c, uint64_t option_types_found)
A simplified version of the do_up() function.
Definition init.c:2472
static void tls_print_deferred_options_results(struct context *c)
Prints the results of options imported for the data channel.
Definition init.c:2173
static const char * saved_pid_file_name
Definition init.c:65
void init_verb_mute(struct context *c, unsigned int flags)
Definition init.c:924
static void do_uid_gid_chroot(struct context *c, bool no_delay)
Definition init.c:1178
static bool management_acc_msg(void *arg, struct buffer_list *input)
Definition init.c:4340
static void do_close_link_socket(struct context *c)
Definition init.c:3988
static unsigned int management_callback_remote_entry_count(void *arg)
Definition init.c:327
static void do_signal_on_tls_errors(struct context *c)
Definition init.c:4189
static void do_init_crypto_static(struct context *c, const unsigned int flags)
Definition init.c:3057
static void key_schedule_free(struct key_schedule *ks, bool free_ssl_ctx)
Definition init.c:2995
static void do_init_tun(struct context *c)
Definition init.c:1695
static void do_option_warnings(struct context *c)
Definition init.c:3607
static void do_link_socket_addr_new(struct context *c)
Definition init.c:734
void close_instance(struct context *c)
Definition init.c:4783
static void do_init_route_ipv6_list(const struct options *options, struct route_ipv6_list *route_ipv6_list, const struct link_socket_info *link_socket_info, struct env_set *es, openvpn_net_ctx_t *ctx)
Definition init.c:1468
static void do_init_frame(struct context *c)
Definition init.c:3561
void persist_client_stats(struct context *c)
Definition init.c:4460
void inherit_context_top(struct context *dest, const struct context *src)
Definition init.c:4944
static bool ce_management_query_proxy(struct context *c)
Definition init.c:250
static void do_init_crypto(struct context *c, const unsigned int flags)
Definition init.c:3544
static void do_init_frame_tls(struct context *c)
Definition init.c:3503
static void do_init_traffic_shaper(struct context *c)
Definition init.c:1395
static bool route_noexec_enabled(const struct options *o, const struct tuntap *tt)
Determine if external route commands should be executed based on configured options and backend drive...
Definition init.c:1630
static bool ifconfig_noexec_enabled(const struct context *c)
Determines if ifconfig execution should be disabled because of a.
Definition init.c:1807
static void clear_remote_addrlist(struct link_socket_addr *lsa, bool free)
Definition init.c:502
static void do_print_data_channel_mtu_parms(struct context *c)
Definition init.c:3847
void init_plugins(struct context *c)
Definition init.c:4204
void free_context_buffers(struct context_buffers *b)
Definition init.c:3728
static void init_crypto_pre(struct context *c, const unsigned int flags)
Definition init.c:3008
static void do_init_timers(struct context *c, bool deferred)
Definition init.c:1312
static void context_clear(struct context *c)
Definition init.c:79
static void context_clear_1(struct context *c)
Definition init.c:85
#define CF_LOAD_PERSISTED_PACKET_ID
Definition init.c:70
static void do_alloc_route_list(struct context *c)
Definition init.c:1411
static void do_close_status_output(struct context *c)
Definition init.c:4123
static void do_event_set_init(struct context *c, bool need_us_timeout)
Definition init.c:4078
static struct context * static_context
Definition init.c:64
static void do_init_fragment(struct context *c)
Definition init.c:3765
#define CF_INIT_TLS_MULTI
Definition init.c:71
void context_init_1(struct context *c)
Definition init.c:741
void do_test_crypto(struct context *c)
Definition init.c:5070
void pre_setup(const struct options *options)
Definition init.c:1265
static void do_link_socket_new(struct context *c)
Definition init.c:3786
static void do_close_free_key_schedule(struct context *c, bool free_ssl_ctx)
Definition init.c:3966
static bool management_callback_proxy_cmd(void *arg, const char **p)
Definition init.c:204
void reset_coarse_timers(struct context *c)
Definition init.c:1288
static void do_open_ifconfig_pool_persist(struct context *c)
Definition init.c:4140
static void do_close_ifconfig_pool_persist(struct context *c)
Definition init.c:4152
static void do_close_tun(struct context *c, bool force)
Definition init.c:2023
void init_management(void)
Definition init.c:4387
void uninit_static(void)
Definition init.c:906
void init_instance_handle_signals(struct context *c, const struct env_set *env, const unsigned int flags)
Definition init.c:4761
static void do_init_crypto_tls(struct context *c, const unsigned int flags)
Definition init.c:3269
void write_pid_file(const char *filename, const char *chroot_dir)
Definition init.c:5022
void context_gc_free(struct context *c)
Definition init.c:792
static void socket_restart_pause(struct context *c)
Definition init.c:2789
static void do_open_status_output(struct context *c)
Definition init.c:4111
const char * format_common_name(const struct context *c, struct gc_arena *gc)
Definition init.c:1254
void init_options_dev(struct options *options)
Definition init.c:947
static void do_close_free_buf(struct context *c)
Definition init.c:3925
void init_query_passwords(const struct context *c)
Query for private key and auth-user-pass username/passwords.
Definition init.c:646
void inherit_context_child(struct context *dest, const struct context *src, struct link_socket *sock)
Definition init.c:4856
static void do_compute_occ_strings(struct context *c)
Definition init.c:3862
void context_clear_2(struct context *c)
Definition init.c:91
static void do_close_fragment(struct context *c)
Definition init.c:4063
static void update_options_ce_post(struct options *options)
Definition init.c:186
static void do_init_crypto_none(struct context *c)
Definition init.c:3529
static void management_callback_status_p2p(void *arg, const int version, struct status_output *so)
Definition init.c:4273
uint64_t pull_permission_mask(const struct context *c)
Definition init.c:2525
void remove_pid_file(void)
Definition init.c:5056
static void add_delim_if_non_empty(struct buffer *buf, const char *header)
Helper function for tls_print_deferred_options_results Adds the ", " delimitor if there already some ...
Definition init.c:2159
bool print_openssl_info(const struct options *options)
Definition init.c:958
void close_context(struct context *c, int sig, unsigned int flags)
Definition init.c:4990
static bool ce_management_query_remote(struct context *c)
Definition init.c:421
static void open_tun_backend(struct context *c)
Definition init.c:1815
static void do_close_event_set(struct context *c)
Definition init.c:4096
bool do_persist_tuntap(struct options *options, openvpn_net_ctx_t *ctx)
Definition init.c:1077
static bool do_hold(int holdtime)
Definition init.c:2770
void tun_abort(void)
Definition init.c:2127
static void do_init_server_poll_timeout(struct context *c)
Definition init.c:1299
static void do_close_plugins(struct context *c)
Definition init.c:4248
static void do_init_socket_phase1(struct context *c)
Definition init.c:3803
bool do_deferred_options(struct context *c, const uint64_t found, const bool is_update)
Definition init.c:2591
static int get_frame_mtu(struct context *c, const struct options *o)
Definition init.c:2879
static void init_instance(struct context *c, const struct env_set *env, const unsigned int flags)
Definition init.c:4474
bool init_static(void)
Definition init.c:830
static void do_init_crypto_tls_c1(struct context *c)
Definition init.c:3173
static void frame_finalize_options(struct context *c, const struct options *o)
Definition init.c:2914
static void uninit_proxy_dowork(struct context *c)
Definition init.c:673
static bool options_hash_changed_or_zero(const struct sha256_digest *a, const struct sha256_digest *b)
Helper for do_up().
Definition init.c:2146
static void do_close_tun_simple(struct context *c)
Definition init.c:1993
static void do_inherit_plugins(struct context *c, const struct context *src)
Definition init.c:4259
static void run_up_down(const char *command, const struct plugin_list *plugins, int plugin_type, const char *arg, DWORD adapter_index, const char *dev_type, int tun_mtu, const char *ifconfig_local, const char *ifconfig_remote, const char *context, const char *signal_text, const char *script_type, struct env_set *es)
Definition init.c:111
static void do_init_socket_phase2(struct context *c)
Definition init.c:3835
bool possibly_become_daemon(const struct options *options)
Definition init.c:1136
static bool management_callback_remote_entry_get(void *arg, unsigned int index, char **remote)
Definition init.c:337
static void init_connection_list(struct context *c)
Initialize and possibly randomize the connection list.
Definition init.c:477
static void init_proxy_dowork(struct context *c)
Definition init.c:690
static void do_close_packet_id(struct context *c)
Definition init.c:4048
static void do_startup_pause(struct context *c)
Definition init.c:2866
static bool do_deferred_p2p_ncp(struct context *c)
Definition init.c:2546
#define CF_INIT_TLS_AUTH_STANDALONE
Definition init.c:72
static void del_wfp_block(const struct context *c, unsigned long adapter_index)
Remove any WFP block filters previously added.
Definition init.c:1788
static bool do_deferred_options_part2(struct context *c)
This function is expected to be invoked after open_tun() was performed.
Definition init.c:2309
bool do_up(struct context *c, bool pulled_options, uint64_t option_types_found)
Definition init.c:2337
static void do_env_set_destroy(struct context *c)
Definition init.c:4178
static void do_init_buffers(struct context *c)
Definition init.c:3753
static void init_proxy(struct context *c)
Definition init.c:722
void init_management_callback_p2p(struct context *c)
Definition init.c:4360
static bool management_callback_send_cc_message(void *arg, const char *command, const char *parameters)
This method sends a custom control channel message.
Definition init.c:300
bool do_route(const struct options *options, struct route_list *route_list, struct route_ipv6_list *route_ipv6_list, const struct tuntap *tt, const struct plugin_list *plugins, struct env_set *es, openvpn_net_ctx_t *ctx)
Definition init.c:1641
static void do_inherit_env(struct context *c, const struct env_set *src)
Definition init.c:4170
void context_clear_all_except_first_time(struct context *c)
Definition init.c:97
struct context_buffers * init_context_buffers(const struct frame *frame)
Definition init.c:3703
static bool do_open_tun(struct context *c, int *error_flags)
Definition init.c:1837
static void do_close_tls(struct context *c)
Definition init.c:3939
void close_management(void)
Definition init.c:4436
static void add_wfp_block(const struct context *c)
Add WFP filters to block traffic to local networks.
Definition init.c:1762
void management_show_net_callback(void *arg, const msglvl_t msglevel)
Definition init.c:4280
#define ISC_ERRORS
Definition init.h:120
#define CC_GC_FREE
Definition init.h:109
#define IVM_LEVEL_2
Definition init.h:45
#define ISC_ROUTE_ERRORS
Definition init.h:122
#define IVM_LEVEL_1
Definition init.h:44
#define CC_USR1_TO_HUP
Definition init.h:110
#define BASE_N_EVENTS
Definition init.h:32
#define CC_HARD_USR1_TO_HUP
Definition init.h:111
#define ISC_SERVER
Definition init.h:121
#define CC_NO_CLOSE
Definition init.h:112
static int min_int(int x, int y)
Definition integer.h:105
static int max_int(int x, int y)
Definition integer.h:92
static unsigned int max_uint(unsigned int x, unsigned int y)
Definition integer.h:53
static SERVICE_STATUS status
Definition interactive.c:52
void interval_init(struct interval *top, int horizon, int refresh)
Definition interval.c:34
static void event_timeout_init(struct event_timeout *et, interval_t n, const time_t last)
Initialises a timer struct.
Definition interval.h:172
static void event_timeout_clear(struct event_timeout *et)
Clears the timeout and reset all values to 0.
Definition interval.h:153
int set_lladdr(openvpn_net_ctx_t *ctx, const char *ifname, const char *lladdr, const struct env_set *es)
Definition lladdr.c:51
void management_pre_tunnel_close(struct management *man)
Definition manage.c:3265
void management_clear_callback(struct management *man)
Definition manage.c:2932
bool management_send_acc_message(struct context *c, struct tls_multi *multi, struct tls_session *session, struct buffer_list *input)
Definition manage.c:4429
bool management_hold(struct management *man, int holdtime)
Definition manage.c:4021
struct management * management_init(void)
Definition manage.c:2862
void management_notify_client_close(const struct management *man, struct man_def_auth_context *mdac, const struct env_set *es)
Definition manage.c:3182
void management_notify_generic(const char *str)
Definition manage.c:3094
void management_event_loop_n_seconds(struct management *man, int sec)
Definition manage.c:3619
void management_close(struct management *man)
Definition manage.c:2915
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:2941
bool management_open(struct management *man, const char *addr, const char *port, const char *pass_file, const char *client_user, const char *client_group, const int log_history_cache, const int echo_buffer_size, const int state_buffer_size, const int remap_sigusr1, const unsigned int flags)
Definition manage.c:2876
void man_persist_client_stats(struct management *man, struct context *c)
Definition manage.c:4415
void management_set_callback(struct management *man, const struct management_callback *cb)
Definition manage.c:2925
void management_sleep(const int n)
A sleep function that services the management layer for n seconds rather than doing nothing.
Definition manage.c:4327
void management_post_tunnel_open(struct management *man, const in_addr_t tun_local_ip)
Definition manage.c:3242
void management_up_down(const struct management *man, const char *updown, const struct env_set *es)
Definition manage.c:3078
static bool management_query_remote_enabled(const struct management *man)
Definition manage.h:436
#define OPENVPN_STATE_CONNECTING
Definition manage.h:460
static bool management_query_proxy_enabled(const struct management *man)
Definition manage.h:442
#define OPENVPN_STATE_CONNECTED
Definition manage.h:463
#define MF_SERVER
Definition manage.h:27
void set_std_files_to_null(bool stdin_only)
Definition misc.c:55
#define GET_USER_PASS_MANAGEMENT
Definition misc.h:113
#define GET_USER_PASS_NEED_OK
Definition misc.h:116
static bool get_user_pass(struct user_pass *up, const char *auth_file, const char *prefix, const unsigned int flags)
Retrieves the user credentials from various sources depending on the flags.
Definition misc.h:155
void frame_calculate_dynamic(struct frame *frame, const struct key_type *kt, const struct options *options, const struct link_socket_info *lsi)
Set the –mssfix option.
Definition mss.c:317
size_t frame_calculate_protocol_header_size(const struct key_type *kt, const struct options *options, bool occ)
Calculates the size of the OpenVPN protocol header.
Definition mtu.c:69
void frame_print(const struct frame *frame, msglvl_t msglevel, const char *prefix)
Definition mtu.c:198
#define TUN_MTU_MAX_MIN
Definition mtu.h:79
#define BUF_SIZE(f)
Definition mtu.h:188
#define TUN_MTU_MAX
Maximum MTU we accept for MTU related options.
Definition mtu.h:74
#define TUN_MTU_MIN
Definition mtu.h:59
#define SOCKS_UDPv4_HEADROOM
Definition mtu.h:106
static const char * np(const char *str)
Definition multi-auth.c:146
void * openvpn_net_ctx_t
Definition networking.h:38
#define OCC_MTU_LOAD_INTERVAL_SECONDS
Definition occ.h:61
static int occ_reset_op(void)
Definition occ.h:101
#define OCC_INTERVAL_SECONDS
Definition occ.h:45
#define CLEAR(x)
Definition basic.h:32
void error_reset(void)
Definition error.c:157
bool set_mute_cutoff(const int cutoff)
Definition error.c:119
void set_check_status(unsigned int info_level, unsigned int verbose_level)
Definition error.c:611
void reset_check_status(void)
Definition error.c:604
bool set_debug_level(const int level, const unsigned int flags)
Definition error.c:103
#define M_OPTERR
Definition error.h:101
static bool check_debug_level(msglvl_t level)
Definition error.h:253
#define SDL_CONSTRAIN
Definition error.h:203
#define M_NOPREFIX
Definition error.h:98
#define M_USAGE
Definition error.h:107
#define M_FATAL
Definition error.h:90
static void set_check_status_error_delay(unsigned int milliseconds)
Definition error.h:319
#define M_NONFATAL
Definition error.h:91
#define M_ERR
Definition error.h:106
#define msg(flags,...)
Definition error.h:152
unsigned int msglvl_t
Definition error.h:77
#define ASSERT(x)
Definition error.h:221
#define M_WARN
Definition error.h:92
#define TLS_MODE(c)
Definition openvpn.h:541
static void packet_id_persist_init(struct packet_id_persist *p)
Definition openvpn.h:87
#define CM_P2P
Definition openvpn.h:479
#define CM_TOP_CLONE
Definition openvpn.h:481
#define CM_CHILD_TCP
Definition openvpn.h:483
#define CM_CHILD_UDP
Definition openvpn.h:482
#define MAX_PEER_ID
Definition openvpn.h:552
#define CM_TOP
Definition openvpn.h:480
void options_detach(struct options *o)
Definition options.c:1258
void pre_connect_restore(struct options *o, struct gc_arena *gc)
Definition options.c:2486
const char title_string[]
Definition options.c:75
int auth_retry_get(void)
Definition options.c:3388
void notnull(const char *arg, const char *description)
Definition options.c:3531
#define MODE_POINT_TO_POINT
Definition options.h:264
#define OPT_P_UP
Definition options.h:746
#define CE_MAN_QUERY_REMOTE_QUERY
Definition options.h:158
#define OPT_P_NCP
Negotiable crypto parameters.
Definition options.h:757
#define OPT_P_ECHO
Definition options.h:765
#define MODE_SERVER
Definition options.h:265
#define OPT_P_EXPLICIT_NOTIFY
Definition options.h:764
#define CE_MAN_QUERY_REMOTE_SKIP
Definition options.h:161
#define AR_INTERACT
Definition options.h:966
#define OPT_P_SHAPER
Definition options.h:751
static bool dco_enabled(const struct options *o)
Returns whether the current configuration has dco enabled.
Definition options.h:987
void options_string_import(struct options *options, const char *config, const msglvl_t msglevel, const uint64_t permission_mask, uint64_t *option_types_found, struct env_set *es)
#define OPT_P_SOCKFLAGS
Definition options.h:771
#define SHAPER_DEFINED(opt)
Definition options.h:790
#define CE_MAN_QUERY_REMOTE_MOD
Definition options.h:160
#define CE_MAN_QUERY_PROXY
Definition options.h:156
#define OPT_P_MESSAGES
Definition options.h:756
#define OPT_P_SETENV
Definition options.h:750
#define OPT_P_SOCKBUF
Definition options.h:770
#define CE_MAN_QUERY_REMOTE_MASK
Definition options.h:162
#define OPT_P_PLUGIN
Definition options.h:769
#define OPT_P_TIMER
Definition options.h:752
#define PING_RESTART
Definition options.h:356
#define RH_PORT_LEN
Definition options.h:235
#define OPT_P_DEFAULT
Definition options.h:780
#define CE_MAN_QUERY_REMOTE_SHIFT
Definition options.h:163
#define OPT_P_DHCPDNS
Definition options.h:748
#define OPT_P_PULL_MODE
Definition options.h:768
@ GENKEY_AUTH_TOKEN
Definition options.h:244
@ GENKEY_SECRET
Definition options.h:241
@ GENKEY_TLS_CRYPTV2_SERVER
Definition options.h:243
@ GENKEY_TLS_CRYPTV2_CLIENT
Definition options.h:242
#define OPT_P_PUSH_MTU
Definition options.h:775
#define AR_NONE
Definition options.h:965
#define AR_NOINTERACT
Definition options.h:967
#define RH_HOST_LEN
Definition options.h:233
#define OPT_P_PERSIST
Definition options.h:753
#define MAX_PARMS
Definition options.h:51
#define PING_UNDEF
Definition options.h:354
#define CE_MAN_QUERY_REMOTE_ACCEPT
Definition options.h:159
#define PULL_DEFINED(opt)
Definition options.h:782
#define ROUTE_OPTION_FLAGS(o)
Definition options.h:785
#define PING_EXIT
Definition options.h:355
#define OPT_P_COMP
Definition options.h:755
#define OPT_P_ROUTE_EXTRAS
Definition options.h:767
#define OPT_P_PEER_ID
Definition options.h:773
#define OPT_P_ACC
Definition options.h:777
#define OPT_P_ROUTE
Definition options.h:747
#define CE_DISABLED
Definition options.h:155
const char * options_string_version(const char *s, struct gc_arena *gc)
char * options_string(const struct options *o, const struct frame *frame, struct tuntap *tt, openvpn_net_ctx_t *ctx, bool remote, struct gc_arena *gc)
Build an options string to represent data channel encryption options.
time_t now
Definition otime.c:33
static void update_time(void)
Definition otime.h:84
void time_test(void)
void packet_id_persist_save(struct packet_id_persist *p)
Definition packet_id.c:499
void packet_id_persist_load_obj(const struct packet_id_persist *p, struct packet_id *pid)
Definition packet_id.c:539
void packet_id_init(struct packet_id *p, int seq_backtrack, int time_backtrack, const char *name, int unit)
Definition packet_id.c:91
void packet_id_persist_close(struct packet_id_persist *p)
Definition packet_id.c:441
void packet_id_free(struct packet_id *p)
Definition packet_id.c:121
void packet_id_persist_load(struct packet_id_persist *p, const char *filename)
Definition packet_id.c:455
#define PRE_PULL_INITIAL_PING_RESTART
Definition ping.h:32
unsigned int platform_getpid(void)
Definition platform.c:333
const char * platform_create_temp_file(const char *directory, const char *prefix, struct gc_arena *gc)
Create a temporary file in directory, returns the filename of the created file.
Definition platform.c:540
void platform_user_group_set(const struct platform_state_user *user_state, const struct platform_state_group *group_state, struct context *c)
Definition platform.c:218
void platform_nice(int niceval)
Definition platform.c:311
bool platform_user_get(const char *username, struct platform_state_user *state)
Definition platform.c:80
bool platform_unlink(const char *filename)
Definition platform.c:487
FILE * platform_fopen(const char *path, const char *mode)
Definition platform.c:500
int platform_chdir(const char *dir)
Definition platform.c:392
void platform_mlockall(bool print_msg)
Definition platform.c:344
void platform_chroot(const char *path)
Definition platform.c:54
bool platform_group_get(const char *groupname, struct platform_state_group *state)
Definition platform.c:124
void plugin_list_close(struct plugin_list *pl)
Definition plugin.c:875
void plugin_return_free(struct plugin_return *pr)
Definition plugin.c:992
struct plugin_list * plugin_list_inherit(const struct plugin_list *src)
Definition plugin.c:696
struct plugin_list * plugin_list_init(const struct plugin_option_list *list)
Definition plugin.c:770
void plugin_return_get_column(const struct plugin_return *src, struct plugin_return *dest, const char *colname)
Definition plugin.c:978
bool plugin_defined(const struct plugin_list *pl, const int type)
Definition plugin.c:910
void plugin_list_open(struct plugin_list *pl, const struct plugin_option_list *list, struct plugin_return *pr, const struct env_set *es, const int init_point)
Definition plugin.c:780
static void plugin_return_init(struct plugin_return *pr)
Definition plugin.h:163
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
static bool plugin_return_defined(const struct plugin_return *pr)
Definition plugin.h:157
struct ifconfig_pool_persist * ifconfig_pool_persist_init(const char *filename, int refresh_freq)
Definition pool.c:538
void ifconfig_pool_persist_close(struct ifconfig_pool_persist *persist)
Definition pool.c:560
#define TOP_NET30
Definition proto.h:41
#define DEV_TYPE_TUN
Definition proto.h:35
#define TOP_P2P
Definition proto.h:42
void http_proxy_close(struct http_proxy_info *hp)
Definition proxy.c:524
struct http_proxy_info * http_proxy_new(const struct http_proxy_options *o)
Definition proxy.c:479
struct http_proxy_options * init_http_proxy_options_once(struct http_proxy_options **hpo, struct gc_arena *gc)
Definition proxy.c:44
#define PAR_NCT
Definition proxy.h:51
#define PAR_ALL
Definition proxy.h:50
void do_preresolve(struct context *c)
Definition resolve.c:573
DNS resolution.
bool add_routes(struct route_list *rl, struct route_ipv6_list *rl6, const struct tuntap *tt, unsigned int flags, const struct env_set *es, openvpn_net_ctx_t *ctx)
Definition route.c:1093
void setenv_routes_ipv6(struct env_set *es, const struct route_ipv6_list *rl6)
Definition route.c:1375
bool block_local_needed(const struct route_list *rl)
Get the decision whether to block traffic to local networks while the VPN is connected.
Definition route.c:586
bool init_route_ipv6_list(struct route_ipv6_list *rl6, const struct route_ipv6_option_list *opt6, const char *remote_endpoint, int default_metric, const struct in6_addr *remote_host_ipv6, struct env_set *es, openvpn_net_ctx_t *ctx)
Definition route.c:740
void add_route_ipv6_to_option_list(struct route_ipv6_option_list *l, const char *prefix, const char *gateway, const char *metric, int table_id)
Definition route.c:497
bool init_route_list(struct route_list *rl, const struct route_option_list *opt, const char *remote_endpoint, int default_metric, in_addr_t remote_host, struct env_set *es, openvpn_net_ctx_t *ctx)
Definition route.c:594
void delete_routes(struct route_list *rl, struct route_ipv6_list *rl6, const struct tuntap *tt, unsigned int flags, const struct env_set *es, openvpn_net_ctx_t *ctx)
Definition route.c:1158
void show_routes(msglvl_t msglevel)
Definition route.c:3031
void setenv_routes(struct env_set *es, const struct route_list *rl)
Definition route.c:1338
static int route_did_redirect_default_gateway(const struct route_list *rl)
Definition route.h:411
#define RG_REROUTE_GW
Definition route.h:91
int script_security(void)
Definition run_command.c:42
#define S_FATAL
Definition run_command.h:50
#define SSEC_SCRIPTS
allow calling of built-in programs and user-defined scripts
Definition run_command.h:35
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
#define SSEC_PW_ENV
allow calling of built-in programs and user-defined scripts that may receive a password as an environ...
Definition run_command.h:38
void shaper_msg(struct shaper *s)
Definition shaper.c:87
static void shaper_init(struct shaper *s, int bytes_per_second)
Definition shaper.h:85
void post_init_signal_catch(void)
Definition sig.c:421
void print_status(struct context *c, struct status_output *so)
Definition sig.c:478
void pre_init_signal_catch(void)
Definition sig.c:392
void remap_signal(struct context *c)
Definition sig.c:588
const char * signal_description(const int signum, const char *sigtext)
Definition sig.c:105
void restore_signal_state(void)
Definition sig.c:460
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 IS_SIG(c)
Definition sig.h:47
#define SIG_SOURCE_HARD
Definition sig.h:30
static void siphash_key_init(uint8_t *key)
Initialises a SIPHASH key with a random value.
Definition siphash.h:85
void link_socket_init_phase1(struct context *c, int sock_index, int mode)
Definition socket.c:979
void link_socket_init_phase2(struct context *c, struct link_socket *sock)
Definition socket.c:1334
void link_socket_update_buffer_sizes(struct link_socket *sock, int rcvbuf, int sndbuf)
Definition socket.c:161
const struct in6_addr * link_socket_current_remote_ipv6(const struct link_socket_info *info)
Definition socket.c:1637
void link_socket_close(struct link_socket *sock)
Definition socket.c:1444
in_addr_t link_socket_current_remote(const struct link_socket_info *info)
Definition socket.c:1603
struct link_socket * link_socket_new(void)
Definition socket.c:965
#define LS_MODE_TCP_ACCEPT_FROM
Definition socket.h:189
#define LS_MODE_DEFAULT
Definition socket.h:187
#define LS_MODE_TCP_LISTEN
Definition socket.h:188
const char * proto2ascii(int proto, sa_family_t af, bool display_form)
const char * print_in_addr_t(in_addr_t addr, unsigned int flags, struct gc_arena *gc)
#define IA_EMPTY_IF_UNDEF
Definition socket_util.h:89
static bool proto_is_udp(int proto)
Returns if the protocol being used is UDP.
@ PROTO_UDP
@ PROTO_TCP
@ PROTO_TCP_CLIENT
@ PROTO_TCP_SERVER
static bool proto_is_tcp(int proto)
returns if the proto is a TCP variant (tcp-server, tcp-client or tcp)
static bool proto_is_dgram(int proto)
Return if the protocol is datagram (UDP).
static bool addr_defined(const struct openvpn_sockaddr *addr)
struct socks_proxy_info * socks_proxy_new(const char *server, const char *port, const char *authfile)
Definition socks.c:52
void socks_proxy_close(struct socks_proxy_info *sp)
Definition socks.c:79
void ssl_purge_auth(const bool auth_user_pass_only)
Definition ssl.c:401
struct tls_root_ctx * init_ssl(const struct options *options, bool in_chroot)
Build master SSL context object that serves for the whole of OpenVPN instantiation.
Definition ssl.c:531
bool tls_session_update_crypto_params(struct tls_multi *multi, struct tls_session *session, struct options *options, struct frame *frame, struct frame *frame_fragment, const struct link_socket_info *lsi, dco_context_t *dco)
Update TLS session crypto parameters (cipher and auth) and derive data channel keys based on the supp...
Definition ssl.c:1713
void auth_user_pass_setup(const char *auth_file, bool is_inline, bool username_only, const struct static_challenge_info *sci)
Definition ssl.c:308
void pem_password_setup(const char *auth_file)
Definition ssl.c:263
void init_ssl_lib(void)
Definition ssl.c:240
void free_ssl_lib(void)
Definition ssl.c:248
void enable_auth_user_pass(void)
Definition ssl.c:302
void show_available_tls_ciphers(const char *cipher_list, const char *cipher_list_tls13, const char *tls_cert_profile)
Definition ssl.c:4318
#define TLS_MULTI_HORIZON
Definition ssl.h:61
#define TLS_MULTI_REFRESH
Definition ssl.h:60
void tls_ctx_free(struct tls_root_ctx *ctx)
Frees the library-specific TLSv1 context.
void show_available_curves(void)
Show the available elliptic curves in the crypto library.
bool tls_ctx_initialised(const struct tls_root_ctx *ctx)
Checks whether the given TLS context is initialised.
@ CAS_CONNECT_DONE
Definition ssl_common.h:601
@ CAS_RECONNECT_PENDING
session has already successful established (CAS_CONNECT_DONE) but has a reconnect and needs to redo s...
Definition ssl_common.h:600
bool check_pull_client_ncp(struct context *c, const uint64_t found)
Checks whether the cipher negotiation is in an acceptable state and we continue to connect or should ...
Definition ssl_ncp.c:302
bool tls_item_in_cipher_list(const char *item, const char *list)
Return true iff item is present in the colon-separated zero-terminated cipher list.
Definition ssl_ncp.c:197
const char * get_p2p_ncp_cipher(struct tls_session *session, const char *peer_info, struct gc_arena *gc)
Determines the best common cipher from both peers IV_CIPHER lists.
Definition ssl_ncp.c:347
Control Channel SSL/Data dynamic negotiation Module This file is split from ssl.h to be able to unit ...
const char * tls_common_name(const struct tls_multi *multi, const bool null)
Returns the common name field for the given tunnel.
Definition ssl_verify.c:107
Control Channel Verification Module.
#define VERIFY_X509_NONE
Definition ssl_verify.h:68
#define NS_CERT_CHECK_SERVER
Do not perform Netscape certificate type verification.
Definition ssl_verify.h:252
void status_printf(struct status_output *so, const char *format,...)
Definition status.c:212
struct status_output * status_open(const char *filename, const int refresh_freq, const int msglevel, const struct virtual_output *vout, const unsigned int flags)
Definition status.c:59
bool status_close(struct status_output *so)
Definition status.c:178
#define STATUS_OUTPUT_WRITE
Definition status.h:51
Definition argv.h:35
A singly-linked list of buffers, with head/tail pointers for O(1) push.
Definition buffer.h:2159
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
Definition options.h:109
struct local_list * local_list
Definition options.h:110
int tun_mtu_max
Definition options.h:131
int connect_retry_seconds
Definition options.h:121
bool tls_crypt_v2_force_cookie
Definition options.h:181
int link_mtu
Definition options.h:136
bool link_mtu_defined
Definition options.h:137
int tun_mtu_extra
Definition options.h:134
int connect_retry_seconds_max
Definition options.h:122
int mssfix
Definition options.h:146
const char * tls_crypt_file
Definition options.h:172
const char * tls_crypt_v2_file
Definition options.h:177
bool tun_mtu_extra_defined
Definition options.h:135
const char * remote
Definition options.h:116
int connect_timeout
Definition options.h:123
const char * socks_proxy_port
Definition options.h:126
bool mssfix_encap
Definition options.h:148
struct http_proxy_options * http_proxy_options
Definition options.h:124
bool tls_crypt_file_inline
Definition options.h:173
bool tls_auth_file_inline
Definition options.h:168
bool tun_mtu_defined
Definition options.h:133
int tls_mtu
Definition options.h:138
int explicit_exit_notification
Definition options.h:152
const char * socks_proxy_authfile
Definition options.h:127
const char * remote_port
Definition options.h:115
bool fragment_encap
Definition options.h:144
const char * socks_proxy_server
Definition options.h:125
int fragment
Definition options.h:143
int proto
Definition options.h:111
sa_family_t af
Definition options.h:112
const char * tls_auth_file
Definition options.h:167
int tun_mtu
Definition options.h:129
int key_direction
Definition options.h:169
bool tls_crypt_v2_file_inline
Definition options.h:178
unsigned int flags
Definition options.h:164
struct connection_entry ** array
Definition options.h:206
Level 0 context containing information related to the OpenVPN process.
Definition openvpn.h:138
struct platform_state_group platform_state_group
Definition openvpn.h:144
struct platform_state_user platform_state_user
Definition openvpn.h:143
bool uid_gid_chroot_set
Definition openvpn.h:142
bool uid_gid_specified
Definition openvpn.h:140
struct key_schedule ks
Definition openvpn.h:165
struct ifconfig_pool_persist * ifconfig_pool_persist
Definition openvpn.h:198
bool http_proxy_owned
Definition openvpn.h:191
struct status_output * status_output
Definition openvpn.h:186
struct route_list * route_list
List of routing information.
Definition openvpn.h:178
struct link_socket_addr * link_socket_addrs
Local and remote addresses on the external network.
Definition openvpn.h:160
struct sha256_digest pulled_options_digest_save
Hash of option strings received from the remote OpenVPN server.
Definition openvpn.h:202
int link_sockets_num
Definition openvpn.h:159
bool status_output_owned
Definition openvpn.h:187
struct route_ipv6_list * route_ipv6_list
Definition openvpn.h:183
struct packet_id_persist pid_persist
Definition openvpn.h:171
struct http_proxy_info * http_proxy
Definition openvpn.h:190
bool socks_proxy_owned
Definition openvpn.h:195
bool tuntap_owned
Whether the tun/tap interface should be cleaned up when this context is cleaned up.
Definition openvpn.h:174
bool ifconfig_pool_persist_owned
Definition openvpn.h:199
struct socks_proxy_info * socks_proxy
Definition openvpn.h:194
struct tuntap * tuntap
Tun/tap virtual network interface.
Definition openvpn.h:173
char * options_string_local
Definition openvpn.h:297
struct event_timeout occ_mtu_load_test_interval
Definition openvpn.h:318
struct event_timeout server_poll_interval
Definition openvpn.h:408
struct fragment_master * fragment
Definition openvpn.h:253
bool do_up_ran
Definition openvpn.h:411
char * options_string_remote
Definition openvpn.h:298
struct event_timeout route_wakeup_expire
Definition openvpn.h:384
struct event_timeout ping_send_interval
Definition openvpn.h:284
bool did_open_tun
Definition openvpn.h:387
md_ctx_t * pulled_options_state
Definition openvpn.h:441
bool es_owned
Definition openvpn.h:421
struct man_def_auth_context mda_context
Definition openvpn.h:450
const struct link_socket * accept_from
Definition openvpn.h:243
struct tls_auth_standalone * tls_auth_standalone
TLS state structure required for the initial authentication of a client's connection attempt.
Definition openvpn.h:327
int occ_op
Definition openvpn.h:300
struct env_set * es
Definition openvpn.h:420
struct interval tmp_int
Definition openvpn.h:344
struct event_timeout auth_token_renewal_interval
Definition openvpn.h:294
bool link_socket_owned
Definition openvpn.h:241
struct event_timeout wait_for_connect
Definition openvpn.h:283
struct shaper shaper
Definition openvpn.h:260
struct tls_multi * tls_multi
TLS state structure for this VPN tunnel.
Definition openvpn.h:324
time_t coarse_timer_wakeup
Definition openvpn.h:399
struct frame frame
Definition openvpn.h:249
struct frame frame_fragment
Definition openvpn.h:254
struct crypto_options crypto_options
Security parameters and crypto state used by the Data Channel Crypto module to process data channel p...
Definition openvpn.h:349
bool buffers_owned
Definition openvpn.h:368
struct event_timeout occ_interval
Definition openvpn.h:302
struct link_socket ** link_sockets
Definition openvpn.h:238
struct link_socket_info ** link_socket_infos
Definition openvpn.h:239
uint8_t session_id_key[SIPHASH_KEY_SIZE]
the siphash secret we use to generate and verify our syn cookie like session ids from the server.
Definition openvpn.h:339
struct event_timeout packet_id_persist_interval
Definition openvpn.h:355
struct event_timeout session_interval
Definition openvpn.h:291
bool log_rw
Definition openvpn.h:380
int event_set_max
Definition openvpn.h:232
struct gc_arena gc
Garbage collection arena for allocations done in the level 2 scope of this context_2 structure.
Definition openvpn.h:226
struct sha256_digest pulled_options_digest
Definition openvpn.h:442
struct event_set * event_set
Definition openvpn.h:231
struct context_buffers * buffers
Definition openvpn.h:367
struct event_timeout route_wakeup
Definition openvpn.h:383
int tls_exit_signal
Definition openvpn.h:347
struct event_timeout inactivity_interval
Definition openvpn.h:288
struct event_timeout ping_rec_interval
Definition openvpn.h:285
bool event_set_owned
Definition openvpn.h:233
struct buffer read_link_buf
Definition openvpn.h:114
struct buffer encrypt_buf
Definition openvpn.h:101
struct buffer read_tun_buf
Definition openvpn.h:115
struct buffer decrypt_buf
Definition openvpn.h:102
struct buffer aux_buf
Definition openvpn.h:98
int restart_sleep_seconds
Definition openvpn.h:123
struct dns_updown_runner_info duri
Definition openvpn.h:124
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 context_0 * c0
Level 0 context.
Definition openvpn.h:514
bool did_we_daemonize
Whether demonization has already taken place.
Definition openvpn.h:507
bool first_time
True on the first iteration of OpenVPN's main loop.
Definition openvpn.h:475
struct signal_info * sig
Internal error signaling object.
Definition openvpn.h:500
openvpn_net_ctx_t net_ctx
Networking API opaque context.
Definition openvpn.h:498
struct plugin_list * plugins
List of plug-ins.
Definition openvpn.h:502
struct context_2 c2
Level 2 context.
Definition openvpn.h:516
struct env_set * es
Set of environment variables.
Definition openvpn.h:496
struct options options
Options loaded from command line or configuration file.
Definition openvpn.h:472
bool plugins_owned
Whether the plug-ins should be cleaned up when this context is cleaned up.
Definition openvpn.h:503
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:515
struct context_persist persist
Persistent context.
Definition openvpn.h:512
unsigned int flags
Bit-flags determining behavior of security operation functions.
Definition crypto.h:386
struct packet_id_persist * pid_persist
Persistent packet ID state for keeping state between successive OpenVPN process startups.
Definition crypto.h:342
struct key_ctx_bi key_ctx_bi
OpenSSL cipher and HMAC contexts for both sending and receiving directions.
Definition crypto.h:294
struct packet_id packet_id
Current packet ID state for both sending and receiving directions.
Definition crypto.h:333
Packet geometry parameters.
Definition mtu.h:113
int tun_mtu
the (user) configured tun-mtu.
Definition mtu.h:147
struct frame::@074234134026241341315172337061247271261307273127 buf
int payload_size
the maximum size that a payload that our buffers can hold from either tun device or network link.
Definition mtu.h:118
int tun_max_mtu
the maximum tun-mtu size the buffers are are sized for.
Definition mtu.h:157
int extra_tun
Maximum number of bytes in excess of the tun/tap MTU that might be read from or written to the virtua...
Definition mtu.h:161
int headroom
the headroom in the buffer, this is choosen to allow all potential header to be added before the pack...
Definition mtu.h:124
int tailroom
the tailroom in the buffer.
Definition mtu.h:128
Garbage collection arena used to keep track of dynamically allocated memory.
Definition buffer.h:127
const char * port
Definition proxy.h:47
const char * server
Definition proxy.h:46
struct buffer tls_crypt_v2_wkc
Wrapped client key.
Definition openvpn.h:73
struct key2 original_wrap_keydata
original tls-crypt key preserved to xored into the tls_crypt renegotiation key
Definition openvpn.h:71
struct key_type key_type
Definition openvpn.h:58
struct key_ctx auth_token_key
Definition openvpn.h:74
struct key_type tls_auth_key_type
Definition openvpn.h:67
struct key_ctx_bi tls_wrap_key
Definition openvpn.h:68
struct key_ctx_bi static_key
Definition openvpn.h:61
struct tls_root_ctx * ssl_ctx
Definition openvpn.h:64
struct key_ctx tls_crypt_v2_server_key
Definition openvpn.h:72
const char * cipher
const name of the cipher
Definition crypto.h:142
const char * digest
Message digest static parameters.
Definition crypto.h:143
const char * special_state_msg
Definition manage.h:239
bool(* acc_msg)(void *arg, struct buffer_list *msg)
Definition manage.h:197
void(* status)(void *arg, const int version, struct status_output *so)
Definition manage.h:178
bool(* remote_entry_get)(void *arg, unsigned int index, char **remote)
Definition manage.h:205
unsigned int(* remote_entry_count)(void *arg)
Definition manage.h:204
bool(* send_cc_message)(void *arg, const char *message, const char *parameter)
Definition manage.h:184
bool(* proxy_cmd)(void *arg, const char **p)
Definition manage.h:199
void(* show_net)(void *arg, const msglvl_t msglevel)
Definition manage.h:179
unsigned int flags
Definition manage.h:176
bool(* remote_cmd)(void *arg, const char **p)
Definition manage.h:200
struct man_persist persist
Definition manage.h:344
union openvpn_sockaddr::@051240265251124304325377241125360350250341115171 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 rcvbuf
Definition options.h:413
bool resolve_in_advance
Definition options.h:368
bool route_nopull
Definition options.h:437
const char * genkey_extra_data
Definition options.h:290
struct compress_options comp
Definition options.h:410
const char * acc_protocols
The app custom control protocols we should announce as supported.
Definition options.h:717
bool persist_config
Definition options.h:278
struct connection_list * connection_list
Definition options.h:295
const char * management_port
Definition options.h:447
const char * ifconfig_ipv6_remote
Definition options.h:331
int server_backoff_time
Definition options.h:310
int auth_token_renewal
Definition options.h:546
const char * tmp_dir
Definition options.h:466
bool push_peer_info
Definition options.h:685
bool daemon
Definition options.h:391
int route_default_metric
Definition options.h:429
int renegotiate_seconds_min
Definition options.h:648
const char * auth_token_secret_file
Definition options.h:547
unsigned int imported_protocol_flags
Definition options.h:739
const char * tls_export_peer_cert_dir
Definition options.h:613
bool crl_file_inline
Definition options.h:617
const char * down_script
Definition options.h:386
hash_algo_type verify_hash_algo
Definition options.h:623
int replay_time
Definition options.h:587
int management_state_buffer_size
Definition options.h:451
bool duplicate_cn
Definition options.h:528
int shaper
Definition options.h:334
int management_echo_buffer_size
Definition options.h:450
bool show_net_up
Definition options.h:698
bool verify_hash_no_ca
Definition options.h:625
bool use_peer_id
Whether the data channel uses the DATA_V2 header (peer-id).
Definition options.h:707
unsigned remote_cert_ku[MAX_PARMS]
Definition options.h:620
bool server_bridge_defined
Definition options.h:481
const char * keying_material_exporter_label
Definition options.h:711
const char * status_file
Definition options.h:406
unsigned int ssl_flags
Definition options.h:626
bool route_noexec
Definition options.h:430
bool ifconfig_nowarn
Definition options.h:333
const char * remote_cert_eku
Definition options.h:621
int tls_timeout
Definition options.h:642
bool test_crypto
Definition options.h:589
bool up_delay
Definition options.h:389
bool server_bridge_proxy_dhcp
Definition options.h:479
const char * authname
Definition options.h:582
const char * exit_event_name
Definition options.h:696
const char * ifconfig_ipv6_local
Definition options.h:329
int replay_window
Definition options.h:586
int mute
Definition options.h:400
bool auth_user_pass_verify_script_via_file
Definition options.h:542
const char * dev_type
Definition options.h:323
int persist_mode
Definition options.h:279
int ifconfig_pool_persist_refresh_freq
Definition options.h:493
int pushed_acc_max_message_length
the maximum length of an ACC control channel message via push message
Definition options.h:726
bool show_digests
Definition options.h:283
const char * up_script
Definition options.h:385
int ce_advance_count
Definition options.h:306
bool single_session
Definition options.h:683
struct remote_host_store * rh_store
Definition options.h:316
int verify_hash_depth
Definition options.h:624
bool route_delay_defined
Definition options.h:433
const char * packet_id_file
Definition options.h:588
const char * tls_crypt_v2_file
Definition options.h:673
int management_log_history_cache
Definition options.h:449
uint32_t peer_id
Definition options.h:708
struct route_option_list * routes
Definition options.h:434
int keepalive_timeout
Definition options.h:343
int64_t inactivity_minimum_bytes
Definition options.h:346
bool block_outside_dns
Definition options.h:700
bool tls_exit
Definition options.h:687
bool show_engines
Definition options.h:284
HANDLE msg_channel
Definition options.h:695
const char * key_pass_file
Definition options.h:281
bool mute_replay_warnings
Definition options.h:585
int inactivity_timeout
Definition options.h:345
unsigned int unsuccessful_attempts
Definition options.h:304
int handshake_window
Definition options.h:655
const char * ifconfig_local
Definition options.h:327
char * x509_username_field[MAX_PARMS]
Definition options.h:658
struct connection_entry ce
Definition options.h:294
const char * pushed_acc_negotiated_protocols
the protocols that are negotiated with the peer.
Definition options.h:722
bool user_script_used
Definition options.h:387
bool show_tls_ciphers
Definition options.h:285
struct tuntap_options tuntap_options
Definition options.h:371
struct verify_hash_list * verify_hash
Definition options.h:622
const char * tls_cert_profile
Definition options.h:610
int64_t renegotiate_packets
Definition options.h:646
unsigned int management_flags
Definition options.h:459
const char * route_default_gateway
Definition options.h:426
bool exit_event_initial_state
Definition options.h:697
struct static_challenge_info sc_info
Definition options.h:569
bool auth_token_call_auth
Definition options.h:544
int topology
Definition options.h:326
bool disable_dco
Definition options.h:374
const char * ncp_ciphers
Definition options.h:581
bool genkey
Definition options.h:287
const char * ciphername
Definition options.h:576
const char * auth_user_pass_file
Definition options.h:561
int tls_crypt_v2_max_age
Definition options.h:680
const char * username
Definition options.h:377
struct plugin_option_list * plugin_list
Definition options.h:462
int auth_token_lifetime
Definition options.h:545
int ns_cert_type
Definition options.h:619
const char * tls_crypt_v2_verify_script
Definition options.h:678
int mode
Definition options.h:266
bool tls_server
Definition options.h:592
const char * auth_user_pass_verify_script
Definition options.h:541
int connect_retry_max
Definition options.h:293
bool pull
Definition options.h:557
bool show_curves
Definition options.h:286
const char * route_ipv6_default_gateway
Definition options.h:427
bool tls_client
Definition options.h:593
bool auth_token_generate
Definition options.h:543
bool priv_key_file_inline
Definition options.h:604
const char * tls_verify
Definition options.h:612
const char * crl_file
Definition options.h:616
int ping_rec_timeout_action
Definition options.h:357
bool auth_user_pass_file_inline
Definition options.h:562
bool show_ciphers
Definition options.h:282
bool enable_ncp_fallback
If defined fall back to ciphername if NCP fails.
Definition options.h:577
const char * route_predown_script
Definition options.h:425
int route_delay_window
Definition options.h:432
bool mlock
Definition options.h:340
int64_t aead_usage_limit_override
Debug override to trigger AEAD usage limit early.
Definition options.h:651
int sndbuf
Definition options.h:414
struct gc_arena gc
Definition options.h:258
bool down_pre
Definition options.h:388
bool persist_tun
Definition options.h:359
int route_default_table_id
Definition options.h:428
bool auth_token_secret_file_inline
Definition options.h:548
const char * config
Definition options.h:261
int keying_material_exporter_length
Definition options.h:712
bool mtu_test
Definition options.h:338
int verify_x509_type
Definition options.h:614
const char * cipher_list_tls13
Definition options.h:608
int status_file_update_freq
Definition options.h:408
const char * management_client_user
Definition options.h:453
const char * cipher_list
Definition options.h:607
bool ccd_exclusive
Definition options.h:507
const char * genkey_filename
Definition options.h:289
const struct x509_track * x509_track
Definition options.h:689
const char * chroot_dir
Definition options.h:379
bool auth_user_pass_username_only
Definition options.h:563
bool log
Definition options.h:395
bool shared_secret_file_inline
Definition options.h:573
int renegotiate_seconds
Definition options.h:647
int ping_rec_timeout
Definition options.h:351
const char * engine
Definition options.h:583
const char * management_addr
Definition options.h:446
const char * verify_x509_name
Definition options.h:615
int ping_send_timeout
Definition options.h:350
bool remote_random
Definition options.h:320
int route_delay
Definition options.h:431
const char * dev_node
Definition options.h:324
const char * client_crresponse_script
Definition options.h:505
struct route_ipv6_option_list * routes_ipv6
Definition options.h:435
int key_direction
Definition options.h:575
bool persist_remote_ip
Definition options.h:361
bool up_restart
Definition options.h:390
int keepalive_ping
Definition options.h:342
bool no_advance
Definition options.h:299
bool tls_crypt_v2_file_inline
Definition options.h:674
const char * groupname
Definition options.h:378
const char * cd_dir
Definition options.h:380
int nice
Definition options.h:398
int transition_window
Definition options.h:661
const char * ifconfig_remote_netmask
Definition options.h:328
const char * lladdr
Definition options.h:325
int verbosity
Definition options.h:399
int session_timeout
Definition options.h:348
enum tun_driver_type windows_driver
Definition options.h:701
int remap_sigusr1
Definition options.h:393
int64_t renegotiate_bytes
Definition options.h:645
const char * route_script
Definition options.h:424
const char * management_user_pass
Definition options.h:448
bool occ
Definition options.h:443
const char * shared_secret_file
Definition options.h:572
bool ifconfig_noexec
Definition options.h:332
const char * dev
Definition options.h:322
const char * management_client_group
Definition options.h:454
const char * client_config_dir
Definition options.h:506
enum genkey_type genkey_type
Definition options.h:288
bool advance_next_remote
Definition options.h:302
const char * ifconfig_pool_persist_filename
Definition options.h:492
int ifconfig_ipv6_netbits
Definition options.h:330
bool persist_local_ip
Definition options.h:360
struct openvpn_plugin_string_list * list[MAX_PLUGINS]
Definition plugin.h:106
char port[RH_PORT_LEN]
Definition options.h:236
char host[RH_HOST_LEN]
Definition options.h:234
unsigned int flags
Definition route.h:113
struct gc_arena * gc
Definition route.h:115
Wrapper struct to pass around SHA256 digests.
Definition crypto.h:133
const char * signal_text
Definition sig.h:44
volatile int signal_received
Definition sig.h:42
volatile int source
Definition sig.h:43
unsigned int flags
Definition status.h:52
struct frame frame
Definition ssl_pkt.h:81
struct buffer workbuf
Definition ssl_pkt.h:80
struct tls_wrap_ctx tls_wrap
Definition ssl_pkt.h:79
Security parameter state for a single VPN tunnel.
Definition ssl_common.h:619
dco_context_t * dco
Definition ssl_common.h:735
char * peer_info
A multi-line string of general-purpose info received from peer over control channel.
Definition ssl_common.h:680
enum multi_status multi_state
Definition ssl_common.h:640
int acc_max_message_length
the maximum length of an ACC control channel message
Definition ssl_common.h:741
struct tls_options opt
Definition ssl_common.h:624
struct tls_session session[TM_SIZE]
Array of tls_session objects representing control channel sessions with the remote peer.
Definition ssl_common.h:721
bool use_peer_id
Definition ssl_common.h:709
uint32_t tx_peer_id
Definition ssl_common.h:708
char * acc_negotiated_protocols
the protocols that are negotiated with the peer.
Definition ssl_common.h:738
uint32_t rx_peer_id
Definition ssl_common.h:707
int64_t renegotiate_bytes
Definition ssl_common.h:344
struct key_ctx auth_token_key
Definition ssl_common.h:412
uint64_t aead_usage_limit_override
Debug only option that allows overriding the usage limit This allows testing key rotation by using ve...
Definition ssl_common.h:353
unsigned int auth_token_renewal
Definition ssl_common.h:410
struct env_set * es
Definition ssl_common.h:418
unsigned int auth_token_lifetime
Definition ssl_common.h:409
struct tls_wrap_ctx tls_wrap
TLS handshake wrapping state.
Definition ssl_common.h:391
size_t ekm_label_size
Definition ssl_common.h:456
unsigned int crypto_flags
Definition ssl_common.h:372
unsigned remote_cert_ku[MAX_PARMS]
Definition ssl_common.h:363
interval_t packet_timeout
Definition ssl_common.h:343
const char * auth_user_pass_file
Definition ssl_common.h:401
const char * client_crresponse_script
Definition ssl_common.h:397
const struct static_challenge_info * sci
Definition ssl_common.h:448
openvpn_net_ctx_t * net_ctx
Definition ssl_common.h:419
const char * tmp_dir
Definition ssl_common.h:399
interval_t renegotiate_seconds
Definition ssl_common.h:354
struct frame frame
Definition ssl_common.h:393
int64_t renegotiate_packets
Definition ssl_common.h:345
bool auth_user_pass_file_inline
Definition ssl_common.h:402
int verify_hash_depth
Definition ssl_common.h:366
const struct plugin_list * plugins
Definition ssl_common.h:420
const char * client_config_dir_exclusive
Definition ssl_common.h:415
bool tls_crypt_v2
Definition ssl_common.h:386
const char * export_peer_cert_dir
Definition ssl_common.h:400
char * x509_username_field[MAX_PARMS]
Definition ssl_common.h:369
int tls_crypt_v2_max_age
Definition ssl_common.h:388
const char * verify_command
Definition ssl_common.h:357
struct verify_hash_list * verify_hash
Definition ssl_common.h:365
const char * ekm_label
Definition ssl_common.h:455
size_t ekm_size
Definition ssl_common.h:457
int transition_window
Definition ssl_common.h:341
const char * config_ciphername
Definition ssl_common.h:377
const char * acc_protocols
The app custom control protocols we should announce as supported.
Definition ssl_common.h:462
int verify_x509_type
Definition ssl_common.h:358
bool single_session
Definition ssl_common.h:327
bool data_epoch_supported
whether our underlying data channel supports new data channel features (epoch keys with AEAD tag at t...
Definition ssl_common.h:384
const char * verify_x509_name
Definition ssl_common.h:359
bool crl_file_inline
Definition ssl_common.h:361
const struct x509_track * x509_track
Definition ssl_common.h:445
bool verify_hash_no_ca
Definition ssl_common.h:367
struct man_def_auth_context * mda_context
Definition ssl_common.h:442
const char * tls_crypt_v2_verify_script
Definition ssl_common.h:387
bool auth_user_pass_verify_script_via_file
Definition ssl_common.h:398
const char * config_ncp_ciphers
Definition ssl_common.h:378
unsigned int ssl_flags
Definition ssl_common.h:439
bool auth_token_generate
Generate auth-tokens on successful user/pass auth,seet via options->auth_token_generate.
Definition ssl_common.h:405
struct key_type key_type
Definition ssl_common.h:313
int push_peer_info_detail
The detail of info we push in peer info.
Definition ssl_common.h:340
struct tls_root_ctx * ssl_ctx
Definition ssl_common.h:310
hash_algo_type verify_hash_algo
Definition ssl_common.h:368
bool auth_token_call_auth
always call normal authentication
Definition ssl_common.h:408
const char * crl_file
Definition ssl_common.h:360
int handshake_window
Definition ssl_common.h:342
bool dco_enabled
Whether keys have to be installed in DCO or not.
Definition ssl_common.h:459
const char * auth_user_pass_verify_script
Definition ssl_common.h:396
const char * remote_cert_eku
Definition ssl_common.h:364
bool auth_user_pass_username_only
Definition ssl_common.h:403
int replay_window
Definition ssl_common.h:374
Security parameter state of a single session within a VPN tunnel.
Definition ssl_common.h:497
enum tls_wrap_ctx::@317033145106102005365073042374303036003032271350 mode
Control channel wrapping mode.
struct crypto_options opt
Crypto state.
Definition ssl_common.h:283
struct buffer work
Work buffer (only for –tls-crypt).
Definition ssl_common.h:284
struct key_ctx tls_crypt_v2_server_key
Decrypts client keys.
Definition ssl_common.h:285
const struct buffer * tls_crypt_v2_wkc
Wrapped client key, sent to server.
Definition ssl_common.h:286
struct key2 original_wrap_keydata
original key data to be xored in to the key for dynamic tls-crypt.
Definition ssl_common.h:298
HANDLE msg_channel
Definition tun.h:86
Definition tun.h:181
in_addr_t local
Definition tun.h:208
DWORD adapter_index
Definition tun.h:232
enum tun_driver_type backend_driver
The backend driver that used for this tun/tap device.
Definition tun.h:191
struct tuntap_options options
Definition tun.h:203
struct in6_addr local_ipv6
Definition tun.h:211
dco_context_t dco
Definition tun.h:247
char * actual_name
Definition tun.h:205
in_addr_t remote_netmask
Definition tun.h:209
char password[USER_PASS_LEN]
Definition misc.h:71
char username[USER_PASS_LEN]
Definition misc.h:70
#define SIGHUP
Definition syshead.h:55
#define srandom
Definition syshead.h:44
#define SOCKET_UNDEFINED
Definition syshead.h:443
#define SIGTERM
Definition syshead.h:59
#define SIGUSR1
Definition syshead.h:57
uint32_t in_addr_t
Definition syshead.h:52
struct gc_arena gc
Definition test_ssl.c:138
struct tuntap * init_tun(const char *dev, const char *dev_type, int topology, const char *ifconfig_local_parm, const char *ifconfig_remote_netmask_parm, const char *ifconfig_ipv6_local_parm, int ifconfig_ipv6_netbits_parm, const char *ifconfig_ipv6_remote_parm, const struct addrinfo *local_public, const struct addrinfo *remote_public, const bool strict_warn, struct env_set *es, openvpn_net_ctx_t *ctx, struct tuntap *tt)
Definition tun.c:827
void open_tun(const char *dev, const char *dev_type, const char *dev_node, struct tuntap *tt, openvpn_net_ctx_t *ctx)
Definition tun.c:5985
int dev_type_enum(const char *dev, const char *dev_type)
Definition tun.c:518
void fork_register_dns_action(const struct tuntap *tt)
Definition tun.c:5377
bool is_dev_type(const char *dev, const char *dev_type, const char *match_type)
Definition tun.c:500
void do_ifconfig(struct tuntap *tt, const char *ifname, int tun_mtu, const struct env_set *es, openvpn_net_ctx_t *ctx)
do_ifconfig - configure the tunnel interface
Definition tun.c:1563
const char * dev_type_string(const char *dev, const char *dev_type)
Definition tun.c:537
void close_tun(struct tuntap *tt, openvpn_net_ctx_t *ctx)
Definition tun.c:6136
void show_adapters(msglvl_t msglevel)
Definition tun.c:4642
void warn_on_use_of_common_subnets(openvpn_net_ctx_t *ctx)
Definition tun.c:667
void undo_ifconfig(const struct tuntap *tt, openvpn_net_ctx_t *ctx)
undo_ifconfig - undo configuration of the tunnel interface
Definition tun.c:1652
void init_tun_post(struct tuntap *tt, const struct frame *frame, const struct tuntap_options *options)
Definition tun.c:951
const char * guess_tuntap_dev(const char *dev, const char *dev_type, const char *dev_node, struct gc_arena *gc)
Definition tun.c:557
void do_ifconfig_setenv(const struct tuntap *tt, struct env_set *es)
Definition tun.c:783
void tun_standby_init(struct tuntap *tt)
Definition tun.c:5295
const char * print_tun_backend_driver(enum tun_driver_type driver)
Return a string representation of the tun backed driver type.
Definition tun.c:59
#define IFCONFIG_AFTER_TUN_OPEN
Definition tun.h:349
#define IFCONFIG_BEFORE_TUN_OPEN
Definition tun.h:348
static int ifconfig_order(const struct tuntap *tt)
Definition tun.h:354
static int route_order(const struct tuntap *tt)
Definition tun.h:384
@ DRIVER_NULL
Definition tun.h:52
@ DRIVER_GENERIC_TUNTAP
Definition tun.h:47
@ DRIVER_AFUNIX
using an AF_UNIX socket to pass packets from/to an external program.
Definition tun.h:51
@ DRIVER_DCO
Definition tun.h:53
#define ROUTE_AFTER_TUN
Definition tun.h:380
static bool tuntap_is_dco_win(const struct tuntap *tt)
Definition tun.h:532
static void open_tun_null(struct tuntap *tt)
Definition tun.h:637
#define ROUTE_BEFORE_TUN
Definition tun.h:379
static bool is_tun_type_set(const struct tuntap *tt)
Definition tun.h:631
void open_tun_afunix(const struct options *o, int mtu, struct tuntap *tt, const struct env_set *orig_env)
Opens an AF_UNIX based tun device.
Definition tun_afunix.c:77
void close_tun_afunix(struct tuntap *tt)
Closes the socket used for the AF_UNIX based device.
Definition tun_afunix.c:129
static bool is_tun_afunix(const char *devnode)
Checks whether a –dev-node parameter specifies a AF_UNIX device.
Definition tun_afunix.h:61
void win32_signal_open(struct win32_signal *ws, int force, const char *exit_event_name, bool exit_event_initial_state)
Definition win32.c:549
bool win_wfp_block(const NET_IFINDEX index, const HANDLE msg_channel, BOOL dns_only)
Definition win32.c:1251
void window_title_generate(const char *title)
Definition win32.c:821
void window_title_save(struct window_title *wt)
Definition win32.c:795
bool win_wfp_uninit(const NET_IFINDEX index, const HANDLE msg_channel)
Definition win32.c:1300
void init_win32(void)
Definition win32.c:110
#define WSO_MODE_CONSOLE
Definition win32.h:160
#define WSO_FORCE_SERVICE
Definition win32.h:174
#define WSO_FORCE_CONSOLE
Definition win32.h:175