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