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