OpenVPN
multi.c
Go to the documentation of this file.
1/*
2 * OpenVPN -- An application to securely tunnel IP networks
3 * over a single TCP/UDP port, with support for SSL/TLS-based
4 * session authentication and key exchange,
5 * packet encryption, packet authentication, and
6 * packet compression.
7 *
8 * Copyright (C) 2002-2026 OpenVPN Inc <sales@openvpn.net>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2
12 * as published by the Free Software Foundation.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, see <https://www.gnu.org/licenses/>.
21 */
22
23#ifdef HAVE_CONFIG_H
24#include "config.h"
25#endif
26
27#ifdef HAVE_SYS_INOTIFY_H
28#include <sys/inotify.h>
29#define INOTIFY_EVENT_BUFFER_SIZE 16384
30#endif
31
32#include "syshead.h"
33
34#include "forward.h"
35#include "multi.h"
36#include "push.h"
37#include "run_command.h"
38#include "otime.h"
39#include "gremlin.h"
40#include "ssl_verify.h"
41#include "ssl_ncp.h"
42#include "vlan.h"
43#include "auth_token.h"
44#include "route.h"
45#include "sid_hash.h"
46#include <inttypes.h>
47#include <string.h>
48
49#include "memdbg.h"
50
51
52#include "crypto_backend.h"
53#include "ssl_util.h"
54#include "dco.h"
55#include "reflect_filter.h"
56#include "acc.h"
57
58/*#define MULTI_DEBUG_EVENT_LOOP*/
59
60#ifdef MULTI_DEBUG_EVENT_LOOP
61static const char *
62id(const struct multi_instance *mi)
63{
64 if (mi)
65 {
66 return tls_common_name(mi->context.c2.tls_multi, false);
67 }
68 else
69 {
70 return "NULL";
71 }
72}
73#endif
74
75#ifdef ENABLE_MANAGEMENT
76static void
77set_cc_config(struct multi_instance *mi, struct buffer_list *cc_config)
78{
80 mi->cc_config = cc_config;
81}
82#endif
83
84static bool
85learn_address_script(const struct multi_context *m, const struct multi_instance *mi, const char *op,
86 const struct mroute_addr *addr)
87{
88 struct gc_arena gc = gc_new();
89 struct env_set *es;
90 bool ret = true;
91 const struct plugin_list *plugins;
92
93 /* get environmental variable source */
94 if (mi && mi->context.c2.es)
95 {
96 es = mi->context.c2.es;
97 }
98 else
99 {
100 es = env_set_create(&gc);
101 }
102
103 /* get plugin source */
104 if (mi)
105 {
106 plugins = mi->context.plugins;
107 }
108 else
109 {
110 plugins = m->top.plugins;
111 }
112
113 if (plugin_defined(plugins, OPENVPN_PLUGIN_LEARN_ADDRESS))
114 {
115 struct argv argv = argv_new();
116 argv_printf(&argv, "%s %s", op, mroute_addr_print(addr, &gc));
117 if (mi)
118 {
120 }
121 if (plugin_call(plugins, OPENVPN_PLUGIN_LEARN_ADDRESS, &argv, NULL, es)
122 != OPENVPN_PLUGIN_FUNC_SUCCESS)
123 {
124 msg(M_WARN, "WARNING: learn-address plugin call failed");
125 ret = false;
126 }
127 argv_free(&argv);
128 }
129
131 {
132 struct argv argv = argv_new();
133 setenv_str(es, "script_type", "learn-address");
135 argv_printf_cat(&argv, "%s %s", op, mroute_addr_print(addr, &gc));
136 if (mi)
137 {
139 }
140 if (!openvpn_run_script(&argv, es, 0, "--learn-address"))
141 {
142 ret = false;
143 }
144 argv_free(&argv);
145 }
146
147 gc_free(&gc);
148 return ret;
149}
150
151void
153{
154 /* write pool data to file */
157 {
159 }
160}
161
162static void
163multi_reap_range(const struct multi_context *m, uint32_t start_bucket, uint32_t end_bucket)
164{
165 struct gc_arena gc = gc_new();
166 struct hash_iterator hi;
167 struct hash_element *he;
168
169 dmsg(D_MULTI_DEBUG, "MULTI: REAP range %u -> %u", start_bucket, end_bucket);
170 hash_iterator_init_range(m->vhash, &hi, start_bucket, end_bucket);
171 while ((he = hash_iterator_next(&hi)) != NULL)
172 {
173 struct multi_route *r = (struct multi_route *)he->value;
174 if (!multi_route_defined(m, r))
175 {
176 dmsg(D_MULTI_DEBUG, "MULTI: REAP DEL %s", mroute_addr_print(&r->addr, &gc));
177 learn_address_script(m, NULL, "delete", &r->addr);
180 }
181 }
183 gc_free(&gc);
184}
185
186static void
188{
190}
191
192static struct multi_reap *
194{
195 struct multi_reap *mr;
196 ALLOC_OBJ(mr, struct multi_reap);
197 mr->bucket_base = 0;
199 mr->last_call = now;
200 return mr;
201}
202
203void
205{
206 struct multi_reap *mr = m->reaper;
207 if (mr->bucket_base >= hash_n_buckets(m->vhash))
208 {
209 mr->bucket_base = 0;
210 }
212 mr->bucket_base += mr->buckets_per_pass;
213 mr->last_call = now;
214}
215
216static void
218{
219 free(mr);
220}
221
222/*
223 * How many buckets in vhash to reap per pass.
224 */
225static uint32_t
226reap_buckets_per_pass(uint32_t n_buckets)
227{
228 return constrain_uint(n_buckets / REAP_DIVISOR, REAP_MIN, REAP_MAX);
229}
230
231#ifdef ENABLE_MANAGEMENT
232
233static uint64_t
234cid_hash_function(const void *key, const uint8_t hash_key[HASH_KEY_LEN])
235{
236 const unsigned long *k = (const unsigned long *)key;
237 return (uint64_t)*k;
238}
239
240static bool
241cid_compare_function(const void *key1, const void *key2)
242{
243 const unsigned long *k1 = (const unsigned long *)key1;
244 const unsigned long *k2 = (const unsigned long *)key2;
245 return *k1 == *k2;
246}
247
248#endif
249
250#ifdef ENABLE_ASYNC_PUSH
251static uint64_t
252/*
253 * inotify watcher descriptors are used as hash value
254 */
255int_hash_function(const void *key, const uint8_t hash_key[HASH_KEY_LEN])
256{
257 return (uintptr_t)key;
258}
259
260static bool
261int_compare_function(const void *key1, const void *key2)
262{
263 return (uintptr_t)key1 == (uintptr_t)key2;
264}
265#endif
266
267/*
268 * Main initialization function, init multi_context object.
269 */
270static void
272{
273 struct multi_context *m = t->multi;
274 int dev = DEV_TYPE_UNDEF;
275
276 msg(D_MULTI_LOW, "MULTI: multi_init called, r=%" PRIu32 " v=%" PRIu32 " s=%" PRIu32,
278
279 /*
280 * Get tun/tap/null device type
281 */
283
284 /*
285 * Init our multi_context object.
286 */
287 CLEAR(*m);
288
289 /*
290 * Real address hash table (source port number is
291 * considered to be part of the address). Used
292 * to determine which client sent an incoming packet
293 * which is seen on the TCP/UDP socket.
294 */
297
298 /*
299 * Virtual address hash table. Used to determine
300 * which client to route a packet to.
301 */
304
305 /*
306 * Peer session id hash table. Used to lookup a session by the session
307 * id of one of its active sessions */
310
311#ifdef ENABLE_MANAGEMENT
313#endif
314
315#ifdef ENABLE_ASYNC_PUSH
316 /*
317 * Mapping between inotify watch descriptors and
318 * multi_instances.
319 */
320 m->inotify_watchers =
321 hash_init(t->options.real_hash_size, int_hash_function, int_compare_function);
322#endif
323
324 /*
325 * This is our scheduler, for time-based wakeup
326 * events.
327 */
328 m->schedule = schedule_init();
329
330 /*
331 * Limit frequency of incoming connections to control
332 * DoS.
333 */
337
338 /*
339 * Allocate broadcast/multicast buffer list
340 */
342
343 /*
344 * Different status file format options are available
345 */
347
348 /*
349 * Possibly allocate an ifconfig pool, do it
350 * differently based on whether a tun or tap style
351 * tunnel.
352 */
354 {
356
357 if (dev == DEV_TYPE_TUN && t->options.topology == TOP_NET30)
358 {
360 }
361
367
368 /* reload pool data from file */
370 {
372 }
373 }
374
375 /*
376 * Help us keep track of routing table.
377 */
379
380 /*
381 * Initialize route and instance reaper.
382 */
384
385 /*
386 * Get local ifconfig address
387 */
388 CLEAR(m->local);
389 ASSERT(t->c1.tuntap);
391
392 /*
393 * Per-client limits
394 */
396
397 m->instances = calloc(m->max_clients, sizeof(struct multi_instance *));
398
399 m->top.c2.event_set = t->c2.event_set;
400
401 /*
402 * Initialize multi-socket I/O wait object
403 */
406
407 /*
408 * Allow client <-> client communication, without going through
409 * tun/tap interface and network stack?
410 */
412
413 /* initialize stale routes check timer */
415 {
416 msg(M_INFO,
417 "Initializing stale route check timer to run every %i seconds and to removing routes with activity timeout older than %i seconds",
420 }
421
423}
424
425const char *
426multi_instance_string(const struct multi_instance *mi, bool null, struct gc_arena *gc)
427{
428 if (mi)
429 {
431 const char *cn = tls_common_name(mi->context.c2.tls_multi, true);
432
433 if (cn)
434 {
435 buf_printf(&out, "%s/", cn);
436 }
437 buf_printf(&out, "%s", mroute_addr_print(&mi->real, gc));
438
439 bool debug_rx_pid = (check_debug_level(D_DCO_DEBUG) && dco_enabled(&mi->context.options))
441
442 if (mi->context.c2.tls_multi && debug_rx_pid)
443 {
444 buf_printf(&out, " rx-peer-id=%u", mi->context.c2.tls_multi->rx_peer_id);
445 }
446 return BSTR(&out);
447 }
448 else if (null)
449 {
450 return NULL;
451 }
452 else
453 {
454 return "UNDEF";
455 }
456}
457
458static void
460{
461 struct gc_arena gc = gc_new();
462 const char *prefix = multi_instance_string(mi, true, &gc);
463 if (prefix)
464 {
465 strlcpy(mi->msg_prefix, prefix, sizeof(mi->msg_prefix));
466 }
467 else
468 {
469 mi->msg_prefix[0] = '\0';
470 }
471 set_prefix(mi);
472 gc_free(&gc);
473}
474
475void
477{
478 mi->msg_prefix[0] = '\0';
479 set_prefix(mi);
480}
481
482/*
483 * Tell the route helper about deleted iroutes so
484 * that it can update its mask of currently used
485 * CIDR netlengths.
486 */
487static void
489{
490 const struct iroute *ir;
491 const struct iroute_ipv6 *ir6;
492
493 /* check if DCO iroutes were already removed when scheduling a delayed exit */
494 if (mi->context.did_dco_iroutes)
495 {
496 mi->context.did_dco_iroutes = false;
498 }
499
501 {
502 for (ir = mi->context.options.iroutes; ir != NULL; ir = ir->next)
503 {
505 }
506
507 for (ir6 = mi->context.options.iroutes_ipv6; ir6 != NULL; ir6 = ir6->next)
508 {
510 }
511 }
512}
513
514static void
516{
517 setenv_counter(c->c2.es, "bytes_received", c->c2.link_read_bytes + c->c2.dco_read_bytes);
518 setenv_counter(c->c2.es, "bytes_sent", c->c2.link_write_bytes + c->c2.dco_write_bytes);
519}
520
521static void
523{
524 /* setenv client real IP address */
526
527 /* setenv stats */
528 setenv_stats(&mi->context);
529
530 /* setenv connection duration */
531 setenv_long_long(mi->context.c2.es, "time_duration", now - mi->created);
532}
533
534static void
536{
538
539 if (plugin_defined(mi->context.plugins, OPENVPN_PLUGIN_CLIENT_DISCONNECT))
540 {
541 if (plugin_call(mi->context.plugins, OPENVPN_PLUGIN_CLIENT_DISCONNECT, NULL, NULL,
542 mi->context.c2.es)
543 != OPENVPN_PLUGIN_FUNC_SUCCESS)
544 {
545 msg(M_WARN, "WARNING: client-disconnect plugin call failed");
546 }
547 }
548
550 {
551 struct argv argv = argv_new();
552 setenv_str(mi->context.c2.es, "script_type", "client-disconnect");
554 openvpn_run_script(&argv, mi->context.c2.es, 0, "--client-disconnect");
555 argv_free(&argv);
556 }
557#ifdef ENABLE_MANAGEMENT
558 if (management)
559 {
561 }
562#endif
563}
564
565void
566multi_close_instance(struct multi_context *m, struct multi_instance *mi, bool shutdown)
567{
568 ASSERT(!mi->halt);
569 mi->halt = true;
570 bool is_dgram = proto_is_dgram(mi->context.c2.link_sockets[0]->info.proto);
571
572 dmsg(D_MULTI_DEBUG, "MULTI: multi_close_instance called");
573
574 /* adjust current client connection count */
575 m->n_clients += mi->n_clients_delta;
576 mi->n_clients_delta = 0;
577
578 /* prevent dangling pointers */
579 if (m->pending == mi)
580 {
581 multi_set_pending(m, NULL);
582 }
583 if (m->earliest_wakeup == mi)
584 {
585 m->earliest_wakeup = NULL;
586 }
587
588 /* The sid hash holds a reference on the instance: drop it on
589 * instance close, otherwise the instance is never freed */
591 {
593 }
594
595 if (!shutdown)
596 {
597 if (mi->did_real_hash)
598 {
599 ASSERT(hash_remove(m->hash, &mi->real));
600 }
601#ifdef ENABLE_MANAGEMENT
602 if (mi->did_cid_hash)
603 {
605 }
606#endif
607
608#ifdef ENABLE_ASYNC_PUSH
609 if (mi->inotify_watch != -1)
610 {
611 hash_remove(m->inotify_watchers, (void *)(uintptr_t)mi->inotify_watch);
612 mi->inotify_watch = -1;
613 }
614#endif
615
617 {
618 m->instances[mi->context.c2.tls_multi->rx_peer_id] = NULL;
619
620 /* Adjust the max_peerid as this might have been the highest
621 * peer id instance */
622 while (m->max_peerid > 0 && m->instances[m->max_peerid] == NULL)
623 {
624 m->max_peerid--;
625 }
626
628 }
629
631
632 ifconfig_pool_release(m->ifconfig_pool, mi->vaddr_handle, false);
633
634 if (mi->did_iroutes)
635 {
636 multi_del_iroutes(m, mi);
637 mi->did_iroutes = false;
638 }
639
640 if (!is_dgram)
641 {
643 }
644
646 }
647
648#ifdef ENABLE_MANAGEMENT
649 set_cc_config(mi, NULL);
650#endif
651
653 {
655 }
656
658
660
662
663 /*
664 * Don't actually delete the instance memory allocation yet,
665 * because virtual routes may still point to it. Let the
666 * vhash reaper deal with it.
667 */
669}
670
671/*
672 * Called on shutdown or restart.
673 */
674static void
676{
677 if (m->hash)
678 {
679 /* fetch final stats while all peers can still be mapped to their instances */
680 if (dco_enabled(&m->top.options))
681 {
683 }
684
685 for (uint32_t i = 0; i <= m->max_peerid; i++)
686 {
687 struct multi_instance *mi = m->instances[i];
688 if (mi)
689 {
690 multi_close_instance(m, mi, true);
691 }
692 }
693
695
696 hash_free(m->hash);
697 hash_free(m->vhash);
699#ifdef ENABLE_MANAGEMENT
701#endif
702 m->hash = NULL;
703
704 free(m->instances);
705
706#ifdef ENABLE_ASYNC_PUSH
707 hash_free(m->inotify_watchers);
708 m->inotify_watchers = NULL;
709#endif
710
712 mbuf_free(m->mbuf);
719 }
720}
721
722/*
723 * Create a client instance object for a newly connected client.
724 */
725struct multi_instance *
727 struct link_socket *sock)
728{
729 struct gc_arena gc = gc_new();
730 struct multi_instance *mi;
731
732 msg(D_MULTI_MEDIUM, "MULTI: multi_create_instance called");
733
735
736 mi->gc = gc_new();
738 mi->vaddr_handle = -1;
739 mi->created = now;
741
742 if (real)
743 {
744 mi->real = *real;
745 generate_prefix(mi);
746 }
747
748 inherit_context_child(&mi->context, &m->top, sock);
749 if (IS_SIG(&mi->context))
750 {
751 goto err;
752 }
753
755
756 if (m->assigned_peer_ids >= m->max_clients)
757 {
759 "MULTI: new incoming connection would exceed maximum number of clients (%u)",
760 m->max_clients);
761 goto err;
762 }
763
764 if (!real) /* TCP mode? */
765 {
767 {
768 goto err;
769 }
770 generate_prefix(mi);
771 }
772
773#ifdef ENABLE_MANAGEMENT
774 do
775 {
777 } while (!hash_add(m->cid_hash, &mi->context.c2.mda_context.cid, mi, false));
778 mi->did_cid_hash = true;
779#endif
780
781 mi->context.c2.push_request_received = false;
782#ifdef ENABLE_ASYNC_PUSH
783 mi->inotify_watch = -1;
784#endif
785
787 {
788 msg(D_MULTI_ERRORS, "MULTI: signal occurred during client instance initialization");
789 goto err;
790 }
791
793 mi->ev_arg.u.mi = mi;
794
795 gc_free(&gc);
796 return mi;
797
798err:
799 multi_close_instance(m, mi, false);
800 gc_free(&gc);
801 return NULL;
802}
803
804/*
805 * Dump tables -- triggered by SIGUSR2.
806 * If status file is defined, write to file.
807 * If status file is NULL, write to syslog.
808 */
809static void
810multi_print_status(struct multi_context *m, struct status_output *so, const int version)
811{
812 if (m->hash)
813 {
814 struct gc_arena gc_top = gc_new();
815 struct hash_iterator hi;
816 const struct hash_element *he;
817
818 status_reset(so);
819
820 if (dco_enabled(&m->top.options))
821 {
822 if (dco_get_peer_stats_multi(&m->top.c1.tuntap->dco, true) < 0)
823 {
824 return;
825 }
826 }
827
828 if (version == 1)
829 {
830 /*
831 * Status file version 1
832 */
833 status_printf(so, "OpenVPN CLIENT LIST");
834 status_printf(so, "Updated,%s", time_string(0, 0, false, &gc_top));
835 status_printf(so, "Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since");
836 hash_iterator_init(m->hash, &hi);
837 while ((he = hash_iterator_next(&hi)))
838 {
839 struct gc_arena gc = gc_new();
840 const struct multi_instance *mi = (struct multi_instance *)he->value;
841
842 if (!mi->halt)
843 {
844 status_printf(so, "%s,%s," counter_format "," counter_format ",%s",
846 mroute_addr_print(&mi->real, &gc),
849 time_string(mi->created, 0, false, &gc));
850 }
851 gc_free(&gc);
852 }
854
855 status_printf(so, "ROUTING TABLE");
856 status_printf(so, "Virtual Address,Common Name,Real Address,Last Ref");
857 hash_iterator_init(m->vhash, &hi);
858 while ((he = hash_iterator_next(&hi)))
859 {
860 struct gc_arena gc = gc_new();
861 const struct multi_route *route = (struct multi_route *)he->value;
862
864 {
865 const struct multi_instance *mi = route->instance;
866 const struct mroute_addr *ma = &route->addr;
867 char flags[2] = { 0, 0 };
868
869 if (route->flags & MULTI_ROUTE_CACHE)
870 {
871 flags[0] = 'C';
872 }
873 status_printf(so, "%s%s,%s,%s,%s", mroute_addr_print(ma, &gc), flags,
875 mroute_addr_print(&mi->real, &gc),
876 time_string(route->last_reference, 0, false, &gc));
877 }
878 gc_free(&gc);
879 }
881
882 status_printf(so, "GLOBAL STATS");
883 if (m->mbuf)
884 {
885 status_printf(so, "Max bcast/mcast queue length,%d", mbuf_maximum_queued(m->mbuf));
886 }
887
888 status_printf(so, "END");
889 }
890 else if (version == 2 || version == 3)
891 {
892 const char sep = (version == 3) ? '\t' : ',';
893
894 /*
895 * Status file version 2 and 3
896 */
897 status_printf(so, "TITLE%c%s", sep, title_string);
898 status_printf(so, "TIME%c%s%c%u", sep, time_string(now, 0, false, &gc_top), sep,
899 (unsigned int)now);
901 so,
902 "HEADER%cCLIENT_LIST%cCommon Name%cReal Address%cVirtual Address%cVirtual IPv6 Address%cBytes Received%cBytes Sent%cConnected Since%cConnected Since (time_t)%cUsername%cClient ID%cPeer ID%cData Channel Cipher",
903 sep, sep, sep, sep, sep, sep, sep, sep, sep, sep, sep, sep, sep);
904 hash_iterator_init(m->hash, &hi);
905 while ((he = hash_iterator_next(&hi)))
906 {
907 struct gc_arena gc = gc_new();
908 const struct multi_instance *mi = (struct multi_instance *)he->value;
909
910 if (!mi->halt)
911 {
913 so,
914 "CLIENT_LIST%c%s%c%s%c%s%c%s%c" counter_format "%c" counter_format
915 "%c%s%c%u%c%s%c"
916#ifdef ENABLE_MANAGEMENT
917 "%lu"
918#else
919 ""
920#endif
921 "%c%" PRIu32 "%c%s",
922 sep, tls_common_name(mi->context.c2.tls_multi, false), sep,
923 mroute_addr_print(&mi->real, &gc), sep,
928 time_string(mi->created, 0, false, &gc), sep, (unsigned int)mi->created,
929 sep, tls_username(mi->context.c2.tls_multi, false),
930#ifdef ENABLE_MANAGEMENT
931 sep, mi->context.c2.mda_context.cid,
932#else
933 sep,
934#endif
937 }
938 gc_free(&gc);
939 }
941
943 so,
944 "HEADER%cROUTING_TABLE%cVirtual Address%cCommon Name%cReal Address%cLast Ref%cLast Ref (time_t)",
945 sep, sep, sep, sep, sep, sep);
946 hash_iterator_init(m->vhash, &hi);
947 while ((he = hash_iterator_next(&hi)))
948 {
949 struct gc_arena gc = gc_new();
950 const struct multi_route *route = (struct multi_route *)he->value;
951
953 {
954 const struct multi_instance *mi = route->instance;
955 const struct mroute_addr *ma = &route->addr;
956 char flags[2] = { 0, 0 };
957
958 if (route->flags & MULTI_ROUTE_CACHE)
959 {
960 flags[0] = 'C';
961 }
962 status_printf(so, "ROUTING_TABLE%c%s%s%c%s%c%s%c%s%c%u", sep,
963 mroute_addr_print(ma, &gc), flags, sep,
964 tls_common_name(mi->context.c2.tls_multi, false), sep,
965 mroute_addr_print(&mi->real, &gc), sep,
966 time_string(route->last_reference, 0, false, &gc), sep,
967 (unsigned int)route->last_reference);
968 }
969 gc_free(&gc);
970 }
972
973 if (m->mbuf)
974 {
975 status_printf(so, "GLOBAL_STATS%cMax bcast/mcast queue length%c%d", sep, sep,
977 }
978
979 status_printf(so, "GLOBAL_STATS%cdco_enabled%c%d", sep, sep,
980 dco_enabled(&m->top.options));
981 status_printf(so, "END");
982 }
983 else
984 {
985 status_printf(so, "ERROR: bad status format version number");
986 }
987
988#ifdef PACKET_TRUNCATION_CHECK
989 {
990 status_printf(so, "HEADER,ERRORS,Common Name,TUN Read Trunc,TUN Write Trunc,Pre-encrypt Trunc,Post-decrypt Trunc");
991 hash_iterator_init(m->hash, &hi);
992 while ((he = hash_iterator_next(&hi)))
993 {
994 struct gc_arena gc = gc_new();
995 const struct multi_instance *mi = (struct multi_instance *)he->value;
996
997 if (!mi->halt)
998 {
999 status_printf(so,
1000 "ERRORS,%s," counter_format "," counter_format "," counter_format
1001 "," counter_format,
1002 tls_common_name(mi->context.c2.tls_multi, false),
1003 m->top.c2.n_trunc_tun_read, mi->context.c2.n_trunc_tun_write,
1004 mi->context.c2.n_trunc_pre_encrypt,
1005 mi->context.c2.n_trunc_post_decrypt);
1006 }
1007 gc_free(&gc);
1008 }
1009 hash_iterator_free(&hi);
1010 }
1011#endif /* ifdef PACKET_TRUNCATION_CHECK */
1012
1013 status_flush(so);
1014 gc_free(&gc_top);
1015 }
1016
1017#ifdef ENABLE_ASYNC_PUSH
1018 if (m->inotify_watchers)
1019 {
1020 msg(D_MULTI_DEBUG, "inotify watchers count: %u", hash_n_elements(m->inotify_watchers));
1021 }
1022#endif
1023}
1024
1025/*
1026 * Learn a virtual address or route.
1027 * The learn will fail if the learn address
1028 * script/plugin fails. In this case the
1029 * return value may be != mi.
1030 * Return the instance which owns this route,
1031 * or NULL if none.
1032 */
1033static struct multi_instance *
1034multi_learn_addr(struct multi_context *m, struct multi_instance *mi, const struct mroute_addr *addr,
1035 const unsigned int flags)
1036{
1037 struct hash_element *he;
1038 const uint64_t hv = hash_value(m->vhash, addr);
1039 struct hash_bucket *bucket = hash_bucket(m->vhash, hv);
1040 struct multi_route *oldroute = NULL;
1041 struct multi_instance *owner = NULL;
1042 struct gc_arena gc = gc_new();
1043
1044 /* if route currently exists, get the instance which owns it */
1045 he = hash_lookup_fast(m->vhash, bucket, addr, hv);
1046 if (he)
1047 {
1048 oldroute = (struct multi_route *)he->value;
1049 }
1050 if (oldroute && multi_route_defined(m, oldroute))
1051 {
1052 owner = oldroute->instance;
1053 }
1054
1055 /* do we need to add address to hash table? */
1056 if ((!owner || owner != mi) && mroute_learnable_address(addr, &gc)
1057 && !mroute_addr_equal(addr, &m->local))
1058 {
1059 struct multi_route *newroute;
1060 bool learn_succeeded = false;
1061
1062 ALLOC_OBJ(newroute, struct multi_route);
1063 newroute->addr = *addr;
1064 newroute->instance = mi;
1065 newroute->flags = flags;
1066 newroute->last_reference = now;
1067 newroute->cache_generation = 0;
1068
1069 /* The cache is invalidated when cache_generation is incremented */
1071 {
1073 }
1074
1075 if (oldroute) /* route already exists? */
1076 {
1077 if (route_quota_test(mi) && learn_address_script(m, mi, "update", &newroute->addr))
1078 {
1079 learn_succeeded = true;
1080 owner = mi;
1082 route_quota_inc(mi);
1083
1084 /* delete old route */
1085 multi_route_del(oldroute);
1086
1087 /* modify hash table entry, replacing old route */
1088 he->key = &newroute->addr;
1089 he->value = newroute;
1090 }
1091 }
1092 else
1093 {
1094 if (route_quota_test(mi) && learn_address_script(m, mi, "add", &newroute->addr))
1095 {
1096 learn_succeeded = true;
1097 owner = mi;
1099 route_quota_inc(mi);
1100
1101 /* add new route */
1102 hash_add_fast(m->vhash, bucket, &newroute->addr, hv, newroute);
1103 }
1104 }
1105
1106 msg(D_MULTI_LOW, "MULTI: Learn%s: %s -> %s", learn_succeeded ? "" : " FAILED",
1107 mroute_addr_print(&newroute->addr, &gc), multi_instance_string(mi, false, &gc));
1108
1109 if (!learn_succeeded)
1110 {
1111 free(newroute);
1112 }
1113 }
1114 gc_free(&gc);
1115
1116 return owner;
1117}
1118
1119/*
1120 * Get client instance based on virtual address.
1121 */
1122static struct multi_instance *
1124 bool cidr_routing)
1125{
1126 struct multi_route *route;
1127 struct multi_instance *ret = NULL;
1128
1129 /* check for local address */
1130 if (mroute_addr_equal(addr, &m->local))
1131 {
1132 return NULL;
1133 }
1134
1135 route = (struct multi_route *)hash_lookup(m->vhash, addr);
1136
1137 /* does host route (possible cached) exist? */
1138 if (route && multi_route_defined(m, route))
1139 {
1140 struct multi_instance *mi = route->instance;
1141 route->last_reference = now;
1142 ret = mi;
1143 }
1144 else if (cidr_routing) /* do we need to regenerate a host route cache entry? */
1145 {
1146 struct mroute_helper *rh = m->route_helper;
1147 struct mroute_addr tryaddr;
1148 int i;
1149
1150 /* cycle through each CIDR length */
1151 for (i = 0; i < rh->n_net_len; ++i)
1152 {
1153 tryaddr = *addr;
1154 tryaddr.type |= MR_WITH_NETBITS;
1155 tryaddr.netbits = rh->net_len[i];
1157
1158 /* look up a possible route with netbits netmask */
1159 route = (struct multi_route *)hash_lookup(m->vhash, &tryaddr);
1160
1161 if (route && multi_route_defined(m, route))
1162 {
1163 /* found an applicable route, cache host route */
1164 struct multi_instance *mi = route->instance;
1166 ret = mi;
1167 break;
1168 }
1169 }
1170 }
1171
1172#ifndef ENABLE_SMALL
1174 {
1175 struct gc_arena gc = gc_new();
1176 const char *addr_text = mroute_addr_print(addr, &gc);
1177 if (ret)
1178 {
1179 dmsg(D_MULTI_DEBUG, "GET INST BY VIRT: %s -> %s via %s", addr_text,
1180 multi_instance_string(ret, false, &gc), mroute_addr_print(&route->addr, &gc));
1181 }
1182 else
1183 {
1184 dmsg(D_MULTI_DEBUG, "GET INST BY VIRT: %s [failed]", addr_text);
1185 }
1186 gc_free(&gc);
1187 }
1188#endif
1189
1190 ASSERT(!(ret && ret->halt));
1191 return ret;
1192}
1193
1194/*
1195 * Helper function to multi_learn_addr().
1196 */
1197static struct multi_instance *
1199 int netbits, /* -1 if host route, otherwise # of network bits in address */
1200 bool primary)
1201{
1202 struct openvpn_sockaddr remote_si;
1203 struct mroute_addr addr = { 0 };
1204
1205 CLEAR(remote_si);
1206 remote_si.addr.in4.sin_family = AF_INET;
1207 remote_si.addr.in4.sin_addr.s_addr = htonl(a);
1208 addr.proto = 0;
1209 ASSERT(mroute_extract_openvpn_sockaddr(&addr, &remote_si, false));
1210
1211 if (netbits >= 0)
1212 {
1213 addr.type |= MR_WITH_NETBITS;
1214 addr.netbits = (uint8_t)netbits;
1215 }
1216
1217 struct multi_instance *owner = multi_learn_addr(m, mi, &addr, MULTI_ROUTE_PERMANENT);
1218#ifdef ENABLE_MANAGEMENT
1219 if (management && owner)
1220 {
1221 management_learn_addr(&mi->context.c2.mda_context, &addr, primary);
1222 }
1223#endif
1224 if (primary && multi_check_push_ifconfig_extra_route(&mi->context.options, addr.v4.addr))
1225 {
1226 /* "primary" is the VPN ifconfig address of the peer */
1227 /* if it does not fall into the network defined by ifconfig_local
1228 * we install this as extra onscope address on the interface */
1229 addr.netbits = 32;
1230 addr.type |= MR_ONLINK_DCO_ADDR;
1231
1232 dco_install_iroute(m, mi, &addr);
1233 }
1234 else if (!primary)
1235 {
1236 ASSERT(netbits >= 0); /* DCO requires populated netbits */
1237 dco_install_iroute(m, mi, &addr);
1238 }
1239
1240 return owner;
1241}
1242
1243static struct multi_instance *
1244multi_learn_in6_addr(struct multi_context *m, struct multi_instance *mi, struct in6_addr a6,
1245 int netbits, /* -1 if host route, otherwise # of network bits in address */
1246 bool primary)
1247{
1248 struct mroute_addr addr = { 0 };
1249
1250 addr.len = 16;
1251 addr.type = MR_ADDR_IPV6;
1252 addr.netbits = 0;
1253 addr.v6.addr = a6;
1254
1255 if (netbits >= 0)
1256 {
1257 addr.type |= MR_WITH_NETBITS;
1258 addr.netbits = (uint8_t)netbits;
1260 }
1261
1262 struct multi_instance *owner = multi_learn_addr(m, mi, &addr, MULTI_ROUTE_PERMANENT);
1263#ifdef ENABLE_MANAGEMENT
1264 if (management && owner)
1265 {
1266 management_learn_addr(&mi->context.c2.mda_context, &addr, primary);
1267 }
1268#endif
1270 {
1271 /* "primary" is the VPN ifconfig address of the peer */
1272 /* if it does not fall into the network defined by ifconfig_local
1273 * we install this as extra onscope address on the interface */
1274 addr.netbits = 128;
1275 addr.type |= MR_ONLINK_DCO_ADDR;
1276
1277 dco_install_iroute(m, mi, &addr);
1278 }
1279 else if (!primary)
1280 {
1281 /* "primary" is the VPN ifconfig address of the peer and already
1282 * known to DCO, so only install "extra" iroutes (primary = false)
1283 */
1284 ASSERT(netbits >= 0); /* DCO requires populated netbits */
1285 dco_install_iroute(m, mi, &addr);
1286 }
1287
1288 return owner;
1289}
1290
1291/*
1292 * A new client has connected, add routes (server -> client)
1293 * to internal routing table.
1294 */
1295static void
1297{
1298 struct gc_arena gc = gc_new();
1299 const struct iroute *ir;
1300 const struct iroute_ipv6 *ir6;
1302 {
1303 mi->did_iroutes = true;
1304 /* multi_learn_in{6}_addr_t takes care of installing the DCO iroute */
1305 mi->context.did_dco_iroutes = true;
1306 for (ir = mi->context.options.iroutes; ir != NULL; ir = ir->next)
1307 {
1308 if (ir->netbits >= 0)
1309 {
1310 msg(D_MULTI_LOW, "MULTI: internal route %s/%d -> %s",
1311 print_in_addr_t(ir->network, 0, &gc), ir->netbits,
1312 multi_instance_string(mi, false, &gc));
1313 }
1314 else
1315 {
1316 msg(D_MULTI_LOW, "MULTI: internal route %s -> %s",
1317 print_in_addr_t(ir->network, 0, &gc), multi_instance_string(mi, false, &gc));
1318 }
1319
1321
1322 multi_learn_in_addr_t(m, mi, ir->network, ir->netbits, false);
1323 }
1324 for (ir6 = mi->context.options.iroutes_ipv6; ir6 != NULL; ir6 = ir6->next)
1325 {
1326 msg(D_MULTI_LOW, "MULTI: internal route %s/%u -> %s",
1327 print_in6_addr(ir6->network, 0, &gc), ir6->netbits,
1328 multi_instance_string(mi, false, &gc));
1329
1331
1332 multi_learn_in6_addr(m, mi, ir6->network, ir6->netbits, false);
1333 }
1334 }
1335 gc_free(&gc);
1336}
1337
1338/*
1339 * Given an instance (new_mi), delete all other instances which use the
1340 * same common name.
1341 */
1342static void
1343multi_delete_dup(struct multi_context *m, const struct multi_instance *new_mi)
1344{
1345 if (new_mi)
1346 {
1347 const char *new_cn = tls_common_name(new_mi->context.c2.tls_multi, true);
1348 if (new_cn)
1349 {
1350 int count = 0;
1351
1352 for (uint32_t i = 0; i <= m->max_peerid; i++)
1353 {
1354 struct multi_instance *mi = m->instances[i];
1355 if (mi && mi != new_mi && !mi->halt)
1356 {
1357 const char *cn = tls_common_name(mi->context.c2.tls_multi, true);
1358 if (cn && !strcmp(cn, new_cn))
1359 {
1360 multi_close_instance(m, mi, false);
1361 ++count;
1362 }
1363 }
1364 }
1365
1366 if (count)
1367 {
1369 "MULTI: new connection by client '%s' will cause previous active sessions by this client to be dropped. Remember to use the --duplicate-cn option if you want multiple clients using the same certificate or username to concurrently connect.",
1370 new_cn);
1371 }
1372 }
1373 }
1374}
1375
1376static void
1378{
1379 struct gc_arena gc = gc_new();
1380 struct hash_iterator hi;
1381 struct hash_element *he;
1382
1383 dmsg(D_MULTI_DEBUG, "MULTI: Checking stale routes");
1385 while ((he = hash_iterator_next(&hi)) != NULL)
1386 {
1387 struct multi_route *r = (struct multi_route *)he->value;
1389 && difftime(now, r->last_reference) >= m->top.options.stale_routes_ageing_time)
1390 {
1391 dmsg(D_MULTI_DEBUG, "MULTI: Deleting stale route for address '%s'",
1392 mroute_addr_print(&r->addr, &gc));
1393 learn_address_script(m, NULL, "delete", &r->addr);
1394 multi_route_del(r);
1396 }
1397 }
1398 hash_iterator_free(&hi);
1399 gc_free(&gc);
1400}
1401
1402/*
1403 * Ensure that endpoint to be pushed to client
1404 * complies with --ifconfig-push-constraint directive.
1405 */
1406static bool
1408{
1409 const struct options *o = &c->options;
1411 {
1414 }
1415 else
1416 {
1417 return true;
1418 }
1419}
1420
1421/*
1422 * Select a virtual address for a new client instance.
1423 * Use an --ifconfig-push directive, if given (static IP).
1424 * Otherwise use an --ifconfig-pool address (dynamic IP).
1425 */
1426static void
1428{
1429 struct gc_arena gc = gc_new();
1430
1431 /*
1432 * If ifconfig addresses were set by dynamic config file,
1433 * release pool addresses, otherwise keep them.
1434 */
1436 {
1437 /* ifconfig addresses were set statically,
1438 * release dynamic allocation */
1439 if (mi->vaddr_handle >= 0)
1440 {
1442 mi->vaddr_handle = -1;
1443 }
1444
1445 mi->context.c2.push_ifconfig_defined = true;
1450
1451 /* the current implementation does not allow "static IPv4, pool IPv6",
1452 * (see below) so issue a warning if that happens - don't break the
1453 * session, though, as we don't even know if this client WANTS IPv6
1454 */
1457 {
1458 msg(M_INFO,
1459 "MULTI_sva: WARNING: if --ifconfig-push is used for IPv4, automatic IPv6 assignment from --ifconfig-ipv6-pool does not work. Use --ifconfig-ipv6-push for IPv6 then.");
1460 }
1461 }
1462 else if (m->ifconfig_pool && mi->vaddr_handle < 0) /* otherwise, choose a pool address */
1463 {
1464 in_addr_t local = 0, remote = 0;
1465 struct in6_addr remote_ipv6;
1466 const char *cn = NULL;
1467
1468 if (!mi->context.options.duplicate_cn)
1469 {
1470 cn = tls_common_name(mi->context.c2.tls_multi, true);
1471 }
1472
1473 CLEAR(remote_ipv6);
1474 mi->vaddr_handle =
1475 ifconfig_pool_acquire(m->ifconfig_pool, &local, &remote, &remote_ipv6, cn);
1476 if (mi->vaddr_handle >= 0)
1477 {
1478 const int tunnel_type = TUNNEL_TYPE(mi->context.c1.tuntap);
1479 const int tunnel_topology = TUNNEL_TOPOLOGY(mi->context.c1.tuntap);
1480
1481 msg(M_INFO, "MULTI_sva: pool returned IPv4=%s, IPv6=%s",
1483 : "(Not enabled)"),
1485 ? print_in6_addr(remote_ipv6, 0, &gc)
1486 : "(Not enabled)"));
1487
1489 {
1490 /* set push_ifconfig_remote_netmask from pool ifconfig address(es) */
1491 mi->context.c2.push_ifconfig_local = remote;
1492 if (tunnel_type == DEV_TYPE_TAP
1493 || (tunnel_type == DEV_TYPE_TUN && tunnel_topology == TOP_SUBNET))
1494 {
1498 {
1501 }
1502 }
1503 else if (tunnel_type == DEV_TYPE_TUN)
1504 {
1505 if (tunnel_topology == TOP_P2P)
1506 {
1508 }
1509 else if (tunnel_topology == TOP_NET30)
1510 {
1512 }
1513 }
1514
1516 {
1517 mi->context.c2.push_ifconfig_defined = true;
1518 }
1519 else
1520 {
1522 "MULTI: no --ifconfig-pool netmask parameter is available to push to %s",
1523 multi_instance_string(mi, false, &gc));
1524 }
1525 }
1526
1528 {
1529 mi->context.c2.push_ifconfig_ipv6_local = remote_ipv6;
1534 }
1535 }
1536 else
1537 {
1538 msg(D_MULTI_ERRORS, "MULTI: no free --ifconfig-pool addresses are available");
1539 }
1540 }
1541
1542 /* IPv6 push_ifconfig is a bit problematic - since IPv6 shares the
1543 * pool handling with IPv4, the combination "static IPv4, dynamic IPv6"
1544 * will fail (because no pool will be allocated in this case).
1545 * OTOH, this doesn't make too much sense in reality - and the other
1546 * way round ("dynamic IPv4, static IPv6") or "both static" makes sense
1547 * -> and so it's implemented right now
1548 */
1550 {
1555
1556 msg(M_INFO, "MULTI_sva: push_ifconfig_ipv6 %s/%d",
1559 }
1560
1561 gc_free(&gc);
1562}
1563
1564/*
1565 * Set virtual address environmental variables.
1566 */
1567static void
1569{
1570 setenv_del(mi->context.c2.es, "ifconfig_pool_local_ip");
1571 setenv_del(mi->context.c2.es, "ifconfig_pool_remote_ip");
1572 setenv_del(mi->context.c2.es, "ifconfig_pool_netmask");
1573
1575 {
1576 const int tunnel_type = TUNNEL_TYPE(mi->context.c1.tuntap);
1577 const int tunnel_topology = TUNNEL_TOPOLOGY(mi->context.c1.tuntap);
1578
1579 setenv_in_addr_t(mi->context.c2.es, "ifconfig_pool_remote_ip",
1581
1582 if (tunnel_type == DEV_TYPE_TAP
1583 || (tunnel_type == DEV_TYPE_TUN && tunnel_topology == TOP_SUBNET))
1584 {
1585 setenv_in_addr_t(mi->context.c2.es, "ifconfig_pool_netmask",
1587 }
1588 else if (tunnel_type == DEV_TYPE_TUN)
1589 {
1590 setenv_in_addr_t(mi->context.c2.es, "ifconfig_pool_local_ip",
1592 }
1593 }
1594
1595 setenv_del(mi->context.c2.es, "ifconfig_pool_local_ip6");
1596 setenv_del(mi->context.c2.es, "ifconfig_pool_remote_ip6");
1597 setenv_del(mi->context.c2.es, "ifconfig_pool_ip6_netbits");
1598
1600 {
1601 setenv_in6_addr(mi->context.c2.es, "ifconfig_pool_remote",
1603 setenv_in6_addr(mi->context.c2.es, "ifconfig_pool_local",
1605 setenv_int(mi->context.c2.es, "ifconfig_pool_ip6_netbits",
1607 }
1608}
1609
1610/*
1611 * Called after client-connect script is called
1612 */
1613static void
1614multi_client_connect_post(struct multi_context *m, struct multi_instance *mi, const char *dc_file,
1615 uint64_t *option_types_found)
1616{
1617 /* Did script generate a dynamic config file? */
1618 if (platform_test_file(dc_file))
1619 {
1621 CLIENT_CONNECT_OPT_MASK, option_types_found, mi->context.c2.es);
1622
1623 /*
1624 * If the --client-connect script generates a config file
1625 * with an --ifconfig-push directive, it will override any
1626 * --ifconfig-push directive from the --client-config-dir
1627 * directory or any --ifconfig-pool dynamic address.
1628 */
1631 }
1632}
1633
1634#ifdef ENABLE_PLUGIN
1635
1636/*
1637 * Called after client-connect plug-in is called
1638 */
1639static void
1641 const struct plugin_return *pr, uint64_t *option_types_found)
1642{
1643 struct plugin_return config;
1644
1645 plugin_return_get_column(pr, &config, "config");
1646
1647 /* Did script generate a dynamic config file? */
1648 if (plugin_return_defined(&config))
1649 {
1650 int i;
1651 for (i = 0; i < config.n; ++i)
1652 {
1653 if (config.list[i] && config.list[i]->value)
1654 {
1655 options_string_import(&mi->context.options, config.list[i]->value,
1657 option_types_found, mi->context.c2.es);
1658 }
1659 }
1660
1661 /*
1662 * If the --client-connect script generates a config file
1663 * with an --ifconfig-push directive, it will override any
1664 * --ifconfig-push directive from the --client-config-dir
1665 * directory or any --ifconfig-pool dynamic address.
1666 */
1669 }
1670}
1671
1672#endif /* ifdef ENABLE_PLUGIN */
1673
1674
1675/*
1676 * Called to load management-derived client-connect config
1677 */
1679multi_client_connect_mda(struct multi_context *m, struct multi_instance *mi, bool deferred,
1680 uint64_t *option_types_found)
1681{
1682 /* We never return CC_RET_DEFERRED */
1683 ASSERT(!deferred);
1685#ifdef ENABLE_MANAGEMENT
1686 if (mi->cc_config)
1687 {
1688 struct buffer_entry *be;
1689 for (be = mi->cc_config->head; be != NULL; be = be->next)
1690 {
1691 const char *opt = BSTR(&be->buf);
1693 CLIENT_CONNECT_OPT_MASK, option_types_found, mi->context.c2.es);
1694 }
1695
1696 /*
1697 * If the --client-connect script generates a config file
1698 * with an --ifconfig-push directive, it will override any
1699 * --ifconfig-push directive from the --client-config-dir
1700 * directory or any --ifconfig-pool dynamic address.
1701 */
1704
1705 ret = CC_RET_SUCCEEDED;
1706 }
1707#endif /* ifdef ENABLE_MANAGEMENT */
1708 return ret;
1709}
1710
1711static void
1713{
1714 struct gc_arena gc = gc_new();
1715
1716 /* setenv incoming cert common name for script */
1717 setenv_str(mi->context.c2.es, "common_name", tls_common_name(mi->context.c2.tls_multi, true));
1718
1719 /* setenv client real IP address */
1721
1722 /* setenv client virtual IP address */
1724
1725 /* setenv connection time */
1726 {
1727 const char *created_ascii = time_string(mi->created, 0, false, &gc);
1728 setenv_str(mi->context.c2.es, "time_ascii", created_ascii);
1729 setenv_long_long(mi->context.c2.es, "time_unix", mi->created);
1730 }
1731
1732 gc_free(&gc);
1733}
1734
1741static bool
1743{
1744 struct tls_multi *tls_multi = c->c2.tls_multi;
1745 const char *const peer_info = tls_multi->peer_info;
1746 struct options *o = &c->options;
1747
1748
1749 unsigned int proto = extract_iv_proto(peer_info);
1750 if (proto & IV_PROTO_DATA_V2)
1751 {
1752 tls_multi->use_peer_id = true;
1753 o->use_peer_id = true;
1754 }
1755 else if (dco_enabled(o))
1756 {
1757 msg(M_INFO, "Client does not support DATA_V2. Data channel offloading "
1758 "requires DATA_V2. Dropping client.");
1759 auth_set_client_reason(tls_multi, "Data channel negotiation "
1760 "failed (missing DATA_V2)");
1761 return false;
1762 }
1763
1764 /* Print a warning if we detect the client being in P2P mode and will
1765 * not accept our pushed ciphers */
1766 if (proto & IV_PROTO_NCP_P2P)
1767 {
1768 msg(M_WARN, "Note: peer reports running in P2P mode (no --pull/--client "
1769 "option). It will not negotiate ciphers with this server. "
1770 "Expect this connection to fail.");
1771 }
1772
1773 if (proto & IV_PROTO_REQUEST_PUSH)
1774 {
1775 c->c2.push_request_received = true;
1776 }
1777
1778 if (proto & IV_PROTO_TLS_KEY_EXPORT)
1779 {
1781 }
1782 else if (o->force_key_material_export)
1783 {
1784 msg(M_INFO, "PUSH: client does not support TLS Keying Material "
1785 "Exporters but --force-tls-key-material-export is enabled.");
1786 auth_set_client_reason(tls_multi, "Client incompatible with this "
1787 "server. Keying Material Exporters (RFC 5705) "
1788 "support missing. Upgrade to a client that "
1789 "supports this feature (OpenVPN 2.6.0+).");
1790 return false;
1791 }
1792 if (proto & IV_PROTO_DYN_TLS_CRYPT)
1793 {
1795 }
1796
1797 if (proto & IV_PROTO_CC_EXIT_NOTIFY)
1798 {
1800 }
1801
1802 /* Select cipher if client supports Negotiable Crypto Parameters */
1803
1804 /* if we have already created our key, we cannot *change* our own
1805 * cipher -> so log the fact and push the "what we have now" cipher
1806 * (so the client is always told what we expect it to use)
1807 */
1809 {
1810 msg(M_INFO,
1811 "PUSH: client wants to negotiate cipher (NCP), but "
1812 "server has already generated data channel keys, "
1813 "re-sending previously negotiated cipher '%s'",
1814 o->ciphername);
1815 return true;
1816 }
1817
1818 /*
1819 * Push the first cipher from --data-ciphers to the client that
1820 * the client announces to be supporting.
1821 */
1822 const char *push_cipher =
1824 if (push_cipher)
1825 {
1826 /* Enable epoch data key format if supported and AEAD cipher in use */
1828 && cipher_kt_mode_aead(push_cipher))
1829 {
1831 }
1832
1833 o->ciphername = push_cipher;
1834 return true;
1835 }
1836
1837 /* NCP cipher negotiation failed. Try to figure out why exactly it
1838 * failed and give good error messages and potentially do a fallback
1839 * for non NCP clients */
1840 struct gc_arena gc = gc_new();
1841 bool ret = false;
1842
1843 const char *peer_ciphers = tls_peer_ncp_list(peer_info, &gc);
1844 /* If we are in a situation where we know the client ciphers, there is no
1845 * reason to fall back to a cipher that will not be accepted by the other
1846 * side, in this situation we fail the auth*/
1847 if (strlen(peer_ciphers) > 0)
1848 {
1849 msg(M_INFO,
1850 "PUSH: No common cipher between server and client. "
1851 "Server data-ciphers: '%s'%s, client supported ciphers '%s'",
1852 o->ncp_ciphers_conf, ncp_expanded_ciphers(o, &gc), peer_ciphers);
1853 }
1854 else if (tls_multi->remote_ciphername)
1855 {
1856 msg(M_INFO,
1857 "PUSH: No common cipher between server and client. "
1858 "Server data-ciphers: '%s'%s, client supports cipher '%s'",
1860 }
1861 else
1862 {
1863 msg(M_INFO, "PUSH: No NCP or OCC cipher data received from peer.");
1864
1865 if (o->enable_ncp_fallback)
1866 {
1867 msg(M_INFO,
1868 "Using data channel cipher '%s' since "
1869 "--data-ciphers-fallback is set.",
1870 o->ciphername);
1871 ret = true;
1872 }
1873 else
1874 {
1875 msg(M_INFO, "Use --data-ciphers-fallback with the cipher the "
1876 "client is using if you want to allow the client to connect");
1877 }
1878 }
1879 if (!ret)
1880 {
1881 auth_set_client_reason(tls_multi, "Data channel cipher negotiation "
1882 "failed (no shared cipher)");
1883 }
1884
1885 gc_free(&gc);
1886 return ret;
1887}
1888
1893static void
1895{
1897 if (!ccs->deferred_ret_file)
1898 {
1899 return;
1900 }
1901
1902 setenv_del(mi->context.c2.es, "client_connect_deferred_file");
1904 {
1905 msg(D_MULTI_ERRORS, "MULTI: problem deleting temporary file: %s", ccs->deferred_ret_file);
1906 }
1907 free(ccs->deferred_ret_file);
1908 ccs->deferred_ret_file = NULL;
1909}
1910
1918static bool
1920{
1922 struct gc_arena gc = gc_new();
1923 const char *fn;
1924
1925 /* Delete file if it already exists */
1927
1929 if (!fn)
1930 {
1931 gc_free(&gc);
1932 return false;
1933 }
1934 ccs->deferred_ret_file = string_alloc(fn, NULL);
1935
1936 setenv_str(mi->context.c2.es, "client_connect_deferred_file", ccs->deferred_ret_file);
1937
1938 gc_free(&gc);
1939 return true;
1940}
1941
1950static enum client_connect_return
1952{
1953 const struct client_connect_defer_state *ccs = &(mi->client_connect_defer_state);
1954 FILE *fp = fopen(ccs->deferred_ret_file, "r");
1955 if (!fp)
1956 {
1957 return CC_RET_SKIPPED;
1958 }
1959
1961 const int c = fgetc(fp);
1962 switch (c)
1963 {
1964 case '0':
1965 ret = CC_RET_FAILED;
1966 break;
1967
1968 case '1':
1969 ret = CC_RET_SUCCEEDED;
1970 break;
1971
1972 case '2':
1973 ret = CC_RET_DEFERRED;
1974 break;
1975
1976 case EOF:
1977 if (feof(fp))
1978 {
1979 ret = CC_RET_SKIPPED;
1980 break;
1981 }
1982
1983 /* Not EOF but other error -> fall through to error state */
1984 default:
1985 /* We received an unknown/unexpected value. Assume failure. */
1986 msg(M_WARN, "WARNING: Unknown/unexpected value in deferred "
1987 "client-connect resultfile");
1988 ret = CC_RET_FAILED;
1989 }
1990 fclose(fp);
1991
1992 return ret;
1993}
1994
2000static void
2002{
2004 if (ccs->config_file)
2005 {
2006 setenv_del(mi->context.c2.es, "client_connect_config_file");
2007 if (!platform_unlink(ccs->config_file))
2008 {
2009 msg(D_MULTI_ERRORS, "MULTI: problem deleting temporary file: %s", ccs->config_file);
2010 }
2011 free(ccs->config_file);
2012 ccs->config_file = NULL;
2013 }
2014}
2015
2023static bool
2025{
2027 struct gc_arena gc = gc_new();
2028 const char *fn;
2029
2030 if (ccs->config_file)
2031 {
2033 }
2034
2036 if (!fn)
2037 {
2038 gc_free(&gc);
2039 return false;
2040 }
2041 ccs->config_file = string_alloc(fn, NULL);
2042
2043 setenv_str(mi->context.c2.es, "client_connect_config_file", ccs->config_file);
2044
2045 gc_free(&gc);
2046 return true;
2047}
2048
2049static enum client_connect_return
2051 bool deferred, uint64_t *option_types_found)
2052{
2054#ifdef ENABLE_PLUGIN
2055 ASSERT(m);
2056 ASSERT(mi);
2057 ASSERT(option_types_found);
2059
2060 /* deprecated callback, use a file for passing back return info */
2061 if (plugin_defined(mi->context.plugins, OPENVPN_PLUGIN_CLIENT_CONNECT))
2062 {
2063 struct argv argv = argv_new();
2064 int call;
2065
2066 if (!deferred)
2067 {
2068 call = OPENVPN_PLUGIN_CLIENT_CONNECT;
2070 {
2071 ret = CC_RET_FAILED;
2072 goto cleanup;
2073 }
2074 }
2075 else
2076 {
2077 call = OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER;
2078 /* the initial call should have created these files */
2079 ASSERT(ccs->config_file);
2081 }
2082
2083 argv_printf(&argv, "%s", ccs->config_file);
2084 int plug_ret = plugin_call(mi->context.plugins, call, &argv, NULL, mi->context.c2.es);
2085 if (plug_ret == OPENVPN_PLUGIN_FUNC_SUCCESS)
2086 {
2087 ret = CC_RET_SUCCEEDED;
2088 }
2089 else if (plug_ret == OPENVPN_PLUGIN_FUNC_DEFERRED)
2090 {
2091 ret = CC_RET_DEFERRED;
2097 }
2098 else
2099 {
2100 msg(M_WARN, "WARNING: client-connect plugin call failed");
2101 ret = CC_RET_FAILED;
2102 }
2103
2104
2110 int file_ret = ccs_test_deferred_ret_file(mi);
2111
2112 if (file_ret == CC_RET_FAILED)
2113 {
2114 ret = CC_RET_FAILED;
2115 }
2116 else if (ret == CC_RET_SUCCEEDED && file_ret == CC_RET_DEFERRED)
2117 {
2118 ret = CC_RET_DEFERRED;
2119 }
2120
2121 /* if we still think we have succeeded, do postprocessing */
2122 if (ret == CC_RET_SUCCEEDED)
2123 {
2124 multi_client_connect_post(m, mi, ccs->config_file, option_types_found);
2125 }
2126cleanup:
2127 argv_free(&argv);
2128
2129 if (ret != CC_RET_DEFERRED)
2130 {
2133 }
2134 }
2135#endif /* ifdef ENABLE_PLUGIN */
2136 return ret;
2137}
2138
2139static enum client_connect_return
2141 bool deferred, uint64_t *option_types_found)
2142{
2144#ifdef ENABLE_PLUGIN
2145 ASSERT(m);
2146 ASSERT(mi);
2147 ASSERT(option_types_found);
2148
2149 int call = deferred ? OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER_V2 : OPENVPN_PLUGIN_CLIENT_CONNECT_V2;
2150 /* V2 callback, use a plugin_return struct for passing back return info */
2151 if (plugin_defined(mi->context.plugins, call))
2152 {
2153 struct plugin_return pr;
2154
2155 plugin_return_init(&pr);
2156
2157 int plug_ret = plugin_call(mi->context.plugins, call, NULL, &pr, mi->context.c2.es);
2158 if (plug_ret == OPENVPN_PLUGIN_FUNC_SUCCESS)
2159 {
2160 multi_client_connect_post_plugin(m, mi, &pr, option_types_found);
2161 ret = CC_RET_SUCCEEDED;
2162 }
2163 else if (plug_ret == OPENVPN_PLUGIN_FUNC_DEFERRED)
2164 {
2165 ret = CC_RET_DEFERRED;
2166 if (!(plugin_defined(mi->context.plugins, OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER_V2)))
2167 {
2168 msg(M_WARN, "A plugin that defers from the "
2169 "OPENVPN_PLUGIN_CLIENT_CONNECT_V2 call must also "
2170 "declare support for "
2171 "OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER_V2");
2172 ret = CC_RET_FAILED;
2173 }
2174 }
2175 else
2176 {
2177 msg(M_WARN, "WARNING: client-connect-v2 plugin call failed");
2178 ret = CC_RET_FAILED;
2179 }
2180
2181
2182 plugin_return_free(&pr);
2183 }
2184#endif /* ifdef ENABLE_PLUGIN */
2185 return ret;
2186}
2187
2188static enum client_connect_return
2190 uint64_t *option_types_found)
2191{
2192 ASSERT(mi);
2193 ASSERT(option_types_found);
2194 const struct client_connect_defer_state *ccs = &(mi->client_connect_defer_state);
2196
2198
2199 if (ret == CC_RET_SKIPPED)
2200 {
2201 /*
2202 * Skipped and deferred are equivalent in this context.
2203 * skipped means that the called program has not yet
2204 * written a return status implicitly needing more time
2205 * while deferred is the explicit notification that it
2206 * needs more time
2207 */
2208 ret = CC_RET_DEFERRED;
2209 }
2210
2211 if (ret == CC_RET_SUCCEEDED)
2212 {
2216 }
2217 if (ret == CC_RET_FAILED)
2218 {
2219 msg(M_INFO, "MULTI: deferred --client-connect script returned CC_RET_FAILED");
2222 }
2223 return ret;
2224}
2225
2229static enum client_connect_return
2231 uint64_t *option_types_found)
2232{
2233 if (deferred)
2234 {
2236 }
2237 ASSERT(m);
2238 ASSERT(mi);
2239
2242
2244 {
2245 struct argv argv = argv_new();
2246 struct gc_arena gc = gc_new();
2247
2248 setenv_str(mi->context.c2.es, "script_type", "client-connect");
2249
2251 {
2252 ret = CC_RET_FAILED;
2253 goto cleanup;
2254 }
2255
2257 argv_printf_cat(&argv, "%s", ccs->config_file);
2258
2259 if (openvpn_run_script(&argv, mi->context.c2.es, 0, "--client-connect"))
2260 {
2262 {
2263 ret = CC_RET_DEFERRED;
2264 }
2265 else
2266 {
2267 multi_client_connect_post(m, mi, ccs->config_file, option_types_found);
2268 ret = CC_RET_SUCCEEDED;
2269 }
2270 }
2271 else
2272 {
2273 ret = CC_RET_FAILED;
2274 }
2275cleanup:
2276 if (ret != CC_RET_DEFERRED)
2277 {
2280 }
2281 argv_free(&argv);
2282 gc_free(&gc);
2283 }
2284 return ret;
2285}
2286
2287static bool
2289 struct gc_arena *gc)
2290{
2291 if (!dco_enabled(&mi->context.options))
2292 {
2293 /* DCO not enabled, nothing to do, return sucess */
2294 return true;
2295 }
2296 int ret = dco_multi_add_new_peer(m, mi);
2297 if (ret < 0)
2298 {
2299 msg(D_DCO, "Cannot add peer to DCO for %s: %s (%d)", multi_instance_string(mi, false, gc),
2300 strerror(-ret), ret);
2301 return false;
2302 }
2303
2304 return true;
2305}
2306
2310static bool
2312{
2313 struct frame *frame_fragment = NULL;
2314#ifdef ENABLE_FRAGMENT
2315 if (c->options.ce.fragment)
2316 {
2317 frame_fragment = &c->c2.frame_fragment;
2318 }
2319#endif
2322 frame_fragment, get_link_socket_info(c),
2323 &c->c1.tuntap->dco))
2324 {
2325 msg(D_TLS_ERRORS, "TLS Error: initializing data channel failed");
2326 register_signal(c->sig, SIGUSR1, "process-push-msg-failed");
2327 return false;
2328 }
2329
2330 return true;
2331}
2332
2333static void
2335 const uint64_t option_types_found)
2336{
2337 ASSERT(m);
2338 ASSERT(mi);
2339
2340 struct gc_arena gc = gc_new();
2341 /*
2342 * Process sourced options.
2343 */
2344 do_deferred_options(&mi->context, option_types_found, false);
2345
2346 /*
2347 * make sure we got ifconfig settings from somewhere
2348 */
2350 {
2352 "MULTI: no dynamic or static remote "
2353 "--ifconfig address is available for %s",
2354 multi_instance_string(mi, false, &gc));
2355 }
2356
2357 /*
2358 * make sure that ifconfig settings comply with constraints
2359 */
2361 {
2362 const char *ifconfig_constraint_network =
2364 const char *ifconfig_constraint_netmask =
2366
2367 /* JYFIXME -- this should cause the connection to fail */
2369 "MULTI ERROR: primary virtual IP for %s (%s) "
2370 "violates tunnel network/netmask constraint (%s/%s)",
2371 multi_instance_string(mi, false, &gc),
2373 ifconfig_constraint_network, ifconfig_constraint_netmask);
2374 }
2375
2376 /* set our client's VPN endpoint for status reporting purposes */
2379
2380 /* set context-level authentication flag */
2382
2383 /* Since dco-win maintains iroute routing table (subnet -> peer),
2384 * peer must be added before iroutes. For other platforms it doesn't matter. */
2385
2386 /* authentication complete, calculate dynamic client specific options */
2388 {
2390 }
2391 /* only continue if setting protocol options worked */
2392 else if (!multi_client_setup_dco_initial(m, mi, &gc))
2393 {
2395 }
2396 /* Generate data channel keys only if setting protocol options
2397 * and DCO initial setup has not failed */
2399 {
2401 }
2402
2403 /* dco peer has been added, it is now safe for Windows to add iroutes */
2404
2405 /*
2406 * For routed tunnels, set up internal route to endpoint
2407 * plus add all iroute routes.
2408 */
2410 {
2412 {
2414 msg(D_MULTI_LOW, "MULTI: primary virtual IP for %s: %s",
2415 multi_instance_string(mi, false, &gc),
2417 }
2418
2420 {
2422 /* TODO: find out where addresses are "unlearned"!! */
2423 const char *ifconfig_local_ipv6 =
2425 msg(D_MULTI_LOW, "MULTI: primary virtual IPv6 for %s: %s",
2426 multi_instance_string(mi, false, &gc), ifconfig_local_ipv6);
2427 }
2428
2429 /* add routes locally, pointing to new client, if
2430 * --iroute options have been specified */
2431 multi_add_iroutes(m, mi);
2432
2433 /*
2434 * iroutes represent subnets which are "owned" by a particular
2435 * client. Therefore, do not actually push a route to a client
2436 * if it matches one of the client's iroutes.
2437 */
2439 }
2440 else if (mi->context.options.iroutes)
2441 {
2443 "MULTI: --iroute options rejected for %s -- iroute "
2444 "only works with tun-style tunnels",
2445 multi_instance_string(mi, false, &gc));
2446 }
2447
2448 /* send push reply if ready */
2450 {
2452 }
2453 gc_free(&gc);
2454}
2455
2456static void
2458{
2459 ASSERT(mi->context.c1.tuntap);
2460 /*
2461 * lock down the common name and cert hashes so they can't change
2462 * during future TLS renegotiations
2463 */
2466
2467 /* generate a msg() prefix for this client instance */
2468 generate_prefix(mi);
2469
2470 /* delete instances of previous clients with same common-name */
2471 if (!mi->context.options.duplicate_cn)
2472 {
2473 multi_delete_dup(m, mi);
2474 }
2475
2476 /* reset pool handle to null */
2477 mi->vaddr_handle = -1;
2478
2479 /* do --client-connect setenvs */
2481
2483}
2484
2485static bool
2486multi_check_dest_addr_allowed(struct multi_context *m, struct multi_instance *mi, const struct mroute_addr *real);
2487
2493static enum client_connect_return
2495 bool deferred, uint64_t *option_types_found)
2496{
2497 if (proto_is_tcp(mi->real.proto))
2498 {
2499 /* For TCP connection we neither need to be able to map incoming
2500 * DATA_V1 packets to the multi_instance nor do we need to ensure
2501 * that two TCP connections are not using the same address as the
2502 * OS takes care of that. */
2503 return CC_RET_SUCCEEDED;
2504 }
2505
2506 /* If the address is already taken up by another client we fail the new
2507 * connection */
2508 if (!multi_check_dest_addr_allowed(m, mi, &mi->real))
2509 {
2511 "MULTI: client IP address and port already assigned to another "
2512 "client, terminating connection");
2513 return CC_RET_FAILED;
2514 }
2515
2516 ASSERT(!mi->did_real_hash);
2517 ASSERT(hash_add(m->hash, &mi->real, mi, false));
2518 mi->did_real_hash = true;
2519 return CC_RET_SUCCEEDED;
2520}
2521
2528static enum client_connect_return
2530 bool deferred, uint64_t *option_types_found)
2531{
2532#ifdef USE_COMP
2533 struct options *o = &mi->context.options;
2534 const char *const peer_info = mi->context.c2.tls_multi->peer_info;
2535
2537 {
2538 if (peer_info && strstr(peer_info, "IV_COMP_STUBv2=1"))
2539 {
2540 push_option(o, "compress stub-v2", M_USAGE);
2541 }
2542 else
2543 {
2544 /* Client is old and does not support STUBv2 but since it
2545 * announced comp-lzo via OCC we assume it uses comp-lzo, so
2546 * switch to that and push the uncompressed variant. */
2547 push_option(o, "comp-lzo no", M_USAGE);
2548 o->comp.alg = COMP_ALG_STUB;
2549 *option_types_found |= OPT_P_COMP;
2550 }
2551 }
2552#endif
2553 return CC_RET_SUCCEEDED;
2554}
2555
2560static enum client_connect_return
2562 uint64_t *option_types_found)
2563{
2564 /* Since we never return a CC_RET_DEFERRED, this indicates a serious
2565 * problem */
2566 ASSERT(!deferred);
2569 {
2570 struct gc_arena gc = gc_new();
2571 const char *ccd_file = NULL;
2572
2573 const char *ccd_client =
2575 tls_common_name(mi->context.c2.tls_multi, false), &gc);
2576
2577 const char *ccd_default =
2579
2580
2581 /* try common-name file */
2582 if (platform_test_file(ccd_client))
2583 {
2584 ccd_file = ccd_client;
2585 }
2586 /* try default file */
2587 else if (platform_test_file(ccd_default))
2588 {
2589 ccd_file = ccd_default;
2590 }
2591
2592 if (ccd_file)
2593 {
2595 CLIENT_CONNECT_OPT_MASK, option_types_found, mi->context.c2.es);
2596 /*
2597 * Select a virtual address from either --ifconfig-push in
2598 * --client-config-dir file or --ifconfig-pool.
2599 */
2601
2603
2604 ret = CC_RET_SUCCEEDED;
2605 }
2606 gc_free(&gc);
2607 }
2608 return ret;
2609}
2610
2612 struct multi_context *m, struct multi_instance *mi, bool from_deferred,
2613 uint64_t *option_types_found);
2614
2625
2630static bool
2632{
2633 struct tls_multi *multi = mi->context.c2.tls_multi;
2634 const struct options *options = &mi->context.options;
2635 struct tls_session *session = &multi->session[TM_ACTIVE];
2636
2637 if (!multi->locked_username)
2638 {
2639 msg(D_MULTI_ERRORS, "MULTI: Ignoring override-username as no "
2640 "user/password method is enabled. Enable "
2641 "--management-client-auth, --auth-user-pass-verify, or a "
2642 "plugin with user/password verify capability.");
2643 return false;
2644 }
2645
2646 if (!multi->locked_original_username
2647 && strcmp(multi->locked_username, options->override_username) != 0)
2648 {
2649 /* Check if the username length is acceptable */
2651 {
2652 return false;
2653 }
2654
2656 multi->locked_username = strdup(options->override_username);
2657
2658 /* Override also the common name if username should be set as common
2659 * name */
2660 if ((session->opt->ssl_flags & SSLF_USERNAME_AS_COMMON_NAME))
2661 {
2663 free(multi->locked_cn);
2664 multi->locked_cn = NULL;
2665 tls_lock_common_name(multi);
2666 }
2667
2668 /* Regenerate the auth-token if enabled */
2669 if (multi->auth_token_initial)
2670 {
2671 struct user_pass up;
2672 CLEAR(up);
2673 strlcpy(up.username, multi->locked_username, sizeof(up.username));
2674
2675 generate_auth_token(&up, multi);
2676 }
2677
2679 "MULTI: Note, override-username changes username "
2680 "from '%s' to '%s'",
2682 }
2683 return true;
2684}
2685
2686/*
2687 * Called as soon as the SSL/TLS connection is authenticated.
2688 *
2689 * Will collect the client specific configuration from the different
2690 * sources like ccd files, connect plugins and management interface.
2691 *
2692 * This method starts with cas_context CAS_PENDING and will move the
2693 * state machine to either CAS_SUCCEEDED on success or
2694 * CAS_FAILED/CAS_PARTIAL on failure.
2695 *
2696 * Instance-specific directives to be processed (CLIENT_CONNECT_OPT_MASK)
2697 * include:
2698 *
2699 * iroute start-ip end-ip
2700 * ifconfig-push local remote-netmask
2701 * push
2702 *
2703 *
2704 */
2705static void
2707{
2708 /* We are only called for the CAS_PENDING_x states, so we
2709 * can ignore other states here */
2710 bool from_deferred = (mi->context.c2.tls_multi->multi_state != CAS_PENDING);
2711
2712 int *cur_handler_index = &mi->client_connect_defer_state.cur_handler_index;
2713 uint64_t *option_types_found = &mi->client_connect_defer_state.option_types_found;
2714
2715 /* We are called for the first time */
2716 if (!from_deferred)
2717 {
2718 *cur_handler_index = 0;
2719 *option_types_found = 0;
2720 /* Initially we have no handler that has returned a result */
2722
2724 }
2725
2726 bool cc_succeeded = true;
2727
2728 while (cc_succeeded && client_connect_handlers[*cur_handler_index] != NULL)
2729 {
2730 enum client_connect_return ret;
2731 ret = client_connect_handlers[*cur_handler_index](m, mi, from_deferred, option_types_found);
2732
2733 from_deferred = false;
2734
2735 switch (ret)
2736 {
2737 case CC_RET_SUCCEEDED:
2738 /*
2739 * Remember that we already had at least one handler
2740 * returning a result should we go to into deferred state
2741 */
2742 mi->context.c2.tls_multi->multi_state = CAS_PENDING_DEFERRED_PARTIAL;
2743 break;
2744
2745 case CC_RET_SKIPPED:
2746 /*
2747 * Move on with the next handler without modifying any
2748 * other state
2749 */
2750 break;
2751
2752 case CC_RET_DEFERRED:
2753 /*
2754 * we already set multi_status to DEFERRED_RESULT or
2755 * DEFERRED_NO_RESULT. We just return
2756 * from the function as having multi_status
2757 */
2758 return;
2759
2760 case CC_RET_FAILED:
2761 /*
2762 * One handler failed. We abort the chain and set the final
2763 * result to failed
2764 */
2765 cc_succeeded = false;
2766 break;
2767
2768 default:
2769 ASSERT(0);
2770 }
2771
2772 /*
2773 * Check for "disable" directive in client-config-dir file
2774 * or config file generated by --client-connect script.
2775 */
2776 if (mi->context.options.disable)
2777 {
2778 msg(D_MULTI_ERRORS, "MULTI: client has been rejected due to "
2779 "'disable' directive");
2780 cc_succeeded = false;
2781 }
2782
2783 (*cur_handler_index)++;
2784 }
2785
2787 {
2788 if (!override_locked_username(mi))
2789 {
2790 cc_succeeded = false;
2791 }
2792 }
2793
2794 /* Check if we have forbidding options in the current mode */
2795 if (dco_enabled(&mi->context.options)
2797 {
2798 msg(D_MULTI_ERRORS, "MULTI: client has been rejected due to incompatible DCO options");
2799 cc_succeeded = false;
2800 }
2801
2803 {
2804 msg(D_MULTI_ERRORS, "MULTI: client has been rejected due to invalid compression options");
2805 cc_succeeded = false;
2806 }
2807
2808 if (cc_succeeded)
2809 {
2810 multi_client_connect_late_setup(m, mi, *option_types_found);
2811 }
2812 else
2813 {
2814 /* run the disconnect script if we had a connect script that
2815 * did not fail */
2817 {
2819 }
2820
2822 }
2823
2824 /* increment number of current authenticated clients */
2825 ++m->n_clients;
2826 --mi->n_clients_delta;
2827
2828#ifdef ENABLE_MANAGEMENT
2829 if (management)
2830 {
2832 mi->context.c2.es);
2833 }
2834#endif
2835}
2836
2837#ifdef ENABLE_ASYNC_PUSH
2838/*
2839 * Called when inotify event is fired, which happens when acf
2840 * or connect-status file is closed or deleted.
2841 * Continues authentication and sends push_reply
2842 * (or be deferred again by client-connect)
2843 */
2844void
2845multi_process_file_closed(struct multi_context *m, const unsigned int mpp_flags)
2846{
2847 char buffer[INOTIFY_EVENT_BUFFER_SIZE];
2848 ssize_t buffer_i = 0;
2849 ssize_t r = read(m->top.c2.inotify_fd, buffer, INOTIFY_EVENT_BUFFER_SIZE);
2850 if (r < 0)
2851 {
2852 msg(M_WARN | M_ERRNO, "MULTI: multi_process_file_closed error");
2853 return;
2854 }
2855
2856 while (buffer_i < r)
2857 {
2858 /* parse inotify events */
2859 struct inotify_event *pevent = (struct inotify_event *)&buffer[buffer_i];
2860 size_t event_size = sizeof(struct inotify_event) + pevent->len;
2861 buffer_i += event_size;
2862
2863 msg(D_MULTI_DEBUG, "MULTI: modified fd %d, mask %d", pevent->wd, pevent->mask);
2864
2865 struct multi_instance *mi =
2866 hash_lookup(m->inotify_watchers, (void *)(uintptr_t)pevent->wd);
2867
2868 if (pevent->mask & IN_CLOSE_WRITE)
2869 {
2870 if (mi)
2871 {
2872 /* continue authentication, perform NCP negotiation and send push_reply */
2873 multi_process_post(m, mi, mpp_flags);
2874 }
2875 else
2876 {
2877 msg(D_MULTI_ERRORS, "MULTI: multi_instance not found!");
2878 }
2879 }
2880 else if (pevent->mask & IN_IGNORED)
2881 {
2882 /* this event is _always_ fired when watch is removed or file is deleted */
2883 if (mi)
2884 {
2885 hash_remove(m->inotify_watchers, (void *)(uintptr_t)pevent->wd);
2886 mi->inotify_watch = -1;
2887 }
2888 }
2889 else
2890 {
2891 msg(D_MULTI_ERRORS, "MULTI: unknown mask %d", pevent->mask);
2892 }
2893 }
2894}
2895#endif /* ifdef ENABLE_ASYNC_PUSH */
2896
2897/*
2898 * Add a mbuf buffer to a particular
2899 * instance.
2900 */
2901static void
2902multi_add_mbuf(struct multi_context *m, struct multi_instance *mi, struct mbuf_buffer *mb)
2903{
2904 if (multi_output_queue_ready(m, mi))
2905 {
2906 struct mbuf_item item;
2907 item.buffer = mb;
2908 item.instance = mi;
2909 mbuf_add_item(m->mbuf, &item);
2910 }
2911 else
2912 {
2913 msg(D_MULTI_DROPPED, "MULTI: packet dropped due to output saturation (multi_add_mbuf)");
2914 }
2915}
2916
2917/*
2918 * Add a packet to a client instance output queue.
2919 */
2920static inline void
2921multi_unicast(struct multi_context *m, const struct buffer *buf, struct multi_instance *mi)
2922{
2923 struct mbuf_buffer *mb;
2924
2925 if (BLEN(buf) > 0)
2926 {
2927 mb = mbuf_alloc_buf(buf);
2928 mb->flags = MF_UNICAST;
2929 multi_add_mbuf(m, mi, mb);
2930 mbuf_free_buf(mb);
2931 }
2932}
2933
2934/*
2935 * Broadcast a packet to all clients.
2936 */
2937static void
2938multi_bcast(struct multi_context *m, const struct buffer *buf,
2939 const struct multi_instance *sender_instance, uint16_t vid)
2940{
2941 struct mbuf_buffer *mb;
2942
2943 if (BLEN(buf) > 0)
2944 {
2945#ifdef MULTI_DEBUG_EVENT_LOOP
2946 printf("BCAST len=%d\n", BLEN(buf));
2947#endif
2948 mb = mbuf_alloc_buf(buf);
2949
2950 for (uint32_t i = 0; i <= m->max_peerid; i++)
2951 {
2952 struct multi_instance *mi = m->instances[i];
2953
2954 if (mi && mi != sender_instance && !mi->halt)
2955 {
2956 if (vid != 0 && vid != mi->context.options.vlan_pvid)
2957 {
2958 continue;
2959 }
2960 multi_add_mbuf(m, mi, mb);
2961 }
2962 }
2963 mbuf_free_buf(mb);
2964 }
2965}
2966
2967/*
2968 * Given a time delta, indicating that we wish to be
2969 * awoken by the scheduler at time now + delta, figure
2970 * a sigma parameter (in microseconds) that represents
2971 * a sort of fuzz factor around delta, so that we're
2972 * really telling the scheduler to wake us up any time
2973 * between now + delta - sigma and now + delta + sigma.
2974 *
2975 * The sigma parameter helps the scheduler to run more efficiently.
2976 * Sigma should be no larger than TV_WITHIN_SIGMA_MAX_USEC
2977 */
2978static inline unsigned int
2979compute_wakeup_sigma(const struct timeval *delta)
2980{
2981 ASSERT(delta->tv_sec >= 0);
2982 ASSERT(delta->tv_usec >= 0);
2983 if (delta->tv_sec < 1)
2984 {
2985 /* if < 1 sec, fuzz = # of microseconds / 8 */
2986 return (unsigned int)(delta->tv_usec >> 3);
2987 }
2988 else
2989 {
2990 /* if < 10 minutes, fuzz = 13.1% of timeout */
2991 if (delta->tv_sec < 600)
2992 {
2993 return (unsigned int)(delta->tv_sec << 17);
2994 }
2995 else
2996 {
2997 return 120 * 1000000; /* if >= 10 minutes, fuzz = 2 minutes */
2998 }
2999 }
3000}
3001
3002static void
3004{
3005 /* calculate an absolute wakeup time */
3006 ASSERT(!openvpn_gettimeofday(&mi->wakeup, NULL));
3007 tv_add(&mi->wakeup, &mi->context.c2.timeval);
3008
3009 /* tell scheduler to wake us up at some point in the future */
3010 schedule_add_entry(m->schedule, (struct schedule_entry *)mi, &mi->wakeup,
3012}
3013
3014#if defined(ENABLE_ASYNC_PUSH)
3015static void
3016add_inotify_file_watch(struct multi_context *m, struct multi_instance *mi, int inotify_fd,
3017 const char *file)
3018{
3019 /* watch acf file */
3020 int watch_descriptor = inotify_add_watch(inotify_fd, file, IN_CLOSE_WRITE | IN_ONESHOT);
3021 if (watch_descriptor >= 0)
3022 {
3023 if (mi->inotify_watch != -1)
3024 {
3025 hash_remove(m->inotify_watchers, (void *)(uintptr_t)mi->inotify_watch);
3026 }
3027 hash_add(m->inotify_watchers, (void *)(uintptr_t)watch_descriptor, mi, true);
3028 mi->inotify_watch = watch_descriptor;
3029 }
3030 else
3031 {
3032 msg(M_NONFATAL | M_ERRNO, "MULTI: inotify_add_watch error");
3033 }
3034}
3035#endif /* if defined(ENABLE_ASYNC_PUSH) */
3036
3037/*
3038 * Figure instance-specific timers, convert
3039 * earliest to absolute time in mi->wakeup,
3040 * call scheduler with our future wakeup time.
3041 *
3042 * Also close context on signal.
3043 */
3044bool
3045multi_process_post(struct multi_context *m, struct multi_instance *mi, const unsigned int flags)
3046{
3047 bool ret = true;
3048
3049 if (!IS_SIG(&mi->context)
3050 && ((flags & MPP_PRE_SELECT)))
3051 {
3052#if defined(ENABLE_ASYNC_PUSH)
3053 bool was_unauthenticated = true;
3054 const struct key_state *ks = NULL;
3055 if (mi->context.c2.tls_multi)
3056 {
3058 was_unauthenticated = (ks->authenticated == KS_AUTH_FALSE);
3059 }
3060#endif
3061
3062 /* figure timeouts and fetch possible outgoing
3063 * to_link packets (such as ping or TLS control) */
3064 pre_select(&mi->context);
3065
3066#if defined(ENABLE_ASYNC_PUSH)
3067 /*
3068 * if we see the state transition from unauthenticated to deferred
3069 * and an auth_control_file, we assume it got just added and add
3070 * inotify watch to that file
3071 */
3072 if (ks && ks->plugin_auth.auth_control_file && was_unauthenticated
3073 && (ks->authenticated == KS_AUTH_DEFERRED))
3074 {
3075 add_inotify_file_watch(m, mi, m->top.c2.inotify_fd, ks->plugin_auth.auth_control_file);
3076 }
3077 if (ks && ks->script_auth.auth_control_file && was_unauthenticated
3078 && (ks->authenticated == KS_AUTH_DEFERRED))
3079 {
3080 add_inotify_file_watch(m, mi, m->top.c2.inotify_fd, ks->script_auth.auth_control_file);
3081 }
3082#endif
3083
3084 if (!IS_SIG(&mi->context))
3085 {
3086 /* connection is "established" when SSL/TLS key negotiation succeeds
3087 * and (if specified) auth user/pass succeeds */
3088
3090 {
3092 }
3093#if defined(ENABLE_ASYNC_PUSH)
3096 {
3097 add_inotify_file_watch(m, mi, m->top.c2.inotify_fd,
3099 }
3100#endif
3101 /* tell scheduler to wake us up at some point in the future */
3103 }
3104 }
3105
3106 if (IS_SIG(&mi->context))
3107 {
3108 if (flags & MPP_CLOSE_ON_SIGNAL)
3109 {
3111 ret = false;
3112 }
3113 }
3114 else
3115 {
3116 /* continue to pend on output? */
3117 multi_set_pending(m, ANY_OUT(&mi->context) ? mi : NULL);
3118
3119#ifdef MULTI_DEBUG_EVENT_LOOP
3120 printf("POST %s[%d] to=%d lo=%d/%d w=%" PRIi64 "/%ld\n", id(mi), (int)(mi == m->pending),
3122 mi->context.c2.fragment ? mi->context.c2.fragment->outgoing.len : -1,
3123 (int64_t)mi->context.c2.timeval.tv_sec, (long)mi->context.c2.timeval.tv_usec);
3124#endif
3125 }
3126
3127 if ((flags & MPP_RECORD_TOUCH) && m->mpp_touched)
3128 {
3129 *m->mpp_touched = mi;
3130 }
3131
3132 return ret;
3133}
3134
3145static bool
3147 const struct mroute_addr *real)
3148{
3149 struct hash *hash = m->hash;
3150 const uint64_t hv = hash_value(hash, real);
3151 struct hash_bucket *bucket = hash_bucket(hash, hv);
3152
3153 /* make sure that we don't assign the client to an address taken by
3154 * another client */
3155 struct hash_element *he = hash_lookup_fast(hash, bucket, real, hv);
3156 if (!he)
3157 {
3158 /* Address is not taken, everything is fine. */
3159 return true;
3160 }
3161
3162 struct multi_instance *ex_mi = he->value;
3163
3164 const struct tls_multi *m1 = mi->context.c2.tls_multi;
3165 const struct tls_multi *m2 = ex_mi->context.c2.tls_multi;
3166
3167 struct gc_arena gc = gc_new();
3168 int ret = false;
3169
3170 /* do not allow if target address is taken by client with another cert */
3172 {
3173 msg(D_MULTI_LOW, "Disallow float/connect to an address taken by another client %s",
3174 multi_instance_string(ex_mi, false, &gc));
3175
3176 mi->context.c2.buf.len = 0;
3177 goto done;
3178 }
3179
3180 /* do not allow if target address has a different username */
3181 if (m1->locked_username || m2->locked_username)
3182 {
3183 if (!m1->locked_username || !m2->locked_username
3184 || strcmp(m1->locked_username, m2->locked_username) != 0)
3185 {
3186 msg(D_MULTI_LOW, "Disallow float/connect to an address taken by another client %s",
3187 multi_instance_string(ex_mi, false, &gc));
3188 mi->context.c2.buf.len = 0;
3189 goto done;
3190 }
3191 }
3192
3193 /* It doesn't make sense to let a peer float to the address it already
3194 * has, so we disallow it. This can happen if a DCO netlink notification
3195 * gets lost and we miss a floating step.
3196 */
3197 if (m1->rx_peer_id == m2->rx_peer_id)
3198 {
3199 msg(M_WARN,
3200 "disallowing peer %" PRIu32 " (%s) from floating to "
3201 "its own address (%s)",
3203 mroute_addr_print(&mi->real, &gc));
3204 goto done;
3205 }
3206
3208 "closing instance %s due to float collision with %s "
3209 "using the same certificate and username",
3210 multi_instance_string(ex_mi, false, &gc), multi_instance_string(mi, false, &gc));
3211 multi_close_instance(m, ex_mi, false);
3212 ret = true;
3213
3214done:
3215 gc_free(&gc);
3216 return ret;
3217}
3218
3227static void
3229{
3230 struct mroute_addr real = { 0 };
3231
3232 if (mi->real.type & MR_WITH_PROTO)
3233 {
3234 real.type |= MR_WITH_PROTO;
3235 real.proto = sock->info.proto;
3236 }
3237
3238 if (!mroute_extract_openvpn_sockaddr(&real, &m->top.c2.from.dest, true))
3239 {
3240 return;
3241 }
3242
3243 if (!multi_check_dest_addr_allowed(m, mi, &real))
3244 {
3245 return;
3246 }
3247
3248 struct gc_arena gc = gc_new();
3249
3250 msg(D_MULTI_MEDIUM, "peer %" PRIu32 " (%s) floated from %s to %s",
3252 tls_common_name(mi->context.c2.tls_multi, false),
3255
3256 /* remove old address from hash table before changing address */
3257 ASSERT(hash_remove(m->hash, &mi->real));
3258
3259 /* change external network address of the remote peer */
3260 mi->real = real;
3261 generate_prefix(mi);
3262
3263 mi->context.c2.from = m->top.c2.from;
3264 mi->context.c2.to_link_addr = &mi->context.c2.from;
3265
3266 /* inherit parent link_socket and link_socket_info */
3267 mi->context.c2.link_sockets[0] = sock;
3269
3271
3272 ASSERT(hash_add(m->hash, &mi->real, mi, false));
3273
3274#ifdef ENABLE_MANAGEMENT
3275 ASSERT(hash_add(m->cid_hash, &mi->context.c2.mda_context.cid, mi, true));
3276#endif
3277
3278 gc_free(&gc);
3279}
3280
3281/*
3282 * Called when an instance should be closed due to the
3283 * reception of a soft signal.
3284 */
3285void
3287{
3288 remap_signal(&mi->context);
3289 set_prefix(mi);
3290 print_signal(mi->context.sig, "client-instance", D_MULTI_LOW);
3291 clear_prefix();
3292 multi_close_instance(m, mi, false);
3293}
3294
3295#if (defined(ENABLE_DCO) && (defined(TARGET_LINUX) || defined(TARGET_FREEBSD))) \
3296 || defined(ENABLE_MANAGEMENT)
3297static void
3298multi_signal_instance(struct multi_context *m, struct multi_instance *mi, const int sig)
3299{
3300 mi->context.sig->signal_received = sig;
3302}
3303#endif
3304
3305#if defined(ENABLE_DCO)
3306static void
3307process_incoming_del_peer(struct multi_context *m, struct multi_instance *mi, const dco_context_t *dco)
3308{
3309 const char *reason = "ovpn-dco: unknown reason";
3310 switch (dco->dco_del_peer_reason)
3311 {
3313 reason = "ovpn-dco: ping expired";
3314 break;
3315
3317 reason = "ovpn-dco: transport error";
3318 break;
3319
3321 reason = "ovpn-dco: transport disconnected";
3322 break;
3323
3325 /* We assume that is ourselves. Unfortunately, sometimes these
3326 * events happen with enough delay that they can have an order of
3327 *
3328 * dco_del_peer x
3329 * [new client connecting]
3330 * dco_new_peer x
3331 * event from dco_del_peer arrives.
3332 *
3333 * if we do not ignore this we get desynced with the kernel
3334 * since we assume the peer-id is free again. The other way would
3335 * be to send a dco_del_peer again
3336 */
3337 return;
3338 }
3339
3340 /* When kernel already deleted the peer, the socket is no longer
3341 * installed, and we do not need to clean up the state in the kernel */
3342 mi->context.c2.tls_multi->dco_peer_id = -1;
3343 mi->context.sig->signal_text = reason;
3345}
3346
3347void
3349{
3350 ASSERT(dco->c->multi);
3351
3352 struct multi_context *m = dco->c->multi;
3353
3354 int peer_id = dco->dco_message_peer_id;
3355
3356 /* no peer-specific message delivered -> nothing to process.
3357 * bail out right away
3358 */
3359 if (peer_id < 0)
3360 {
3361 return;
3362 }
3363
3364 if (((uint32_t)peer_id < m->max_clients) && m->instances[peer_id])
3365 {
3366 struct multi_instance *mi = m->instances[peer_id];
3367 set_prefix(mi);
3368 if (dco->dco_message_type == OVPN_CMD_DEL_PEER)
3369 {
3370 process_incoming_del_peer(m, mi, dco);
3371 }
3372 else if (dco->dco_message_type == OVPN_CMD_FLOAT_PEER)
3373 {
3374 ASSERT(mi->context.c2.link_sockets[0]);
3376 &m->top.c2.from.dest,
3377 (struct sockaddr *)&dco->dco_float_peer_ss);
3379 CLEAR(dco->dco_float_peer_ss);
3380 }
3381 else if (dco->dco_message_type == OVPN_CMD_SWAP_KEYS)
3382 {
3384 }
3385 clear_prefix();
3386 }
3387 else
3388 {
3389 msglvl_t msglevel = D_DCO;
3390 if (dco->dco_message_type == OVPN_CMD_DEL_PEER
3391 && dco->dco_del_peer_reason == OVPN_DEL_PEER_REASON_USERSPACE)
3392 {
3393 /* we receive OVPN_CMD_DEL_PEER message with reason USERSPACE
3394 * after we kill the peer ourselves. This peer may have already
3395 * been deleted, so we end up here.
3396 * In this case, print the following debug message with DCO_DEBUG
3397 * level only to avoid polluting the standard DCO level with this
3398 * harmless event.
3399 */
3400 msglevel = D_DCO_DEBUG;
3401 }
3402 msg(msglevel,
3403 "Received DCO message for unknown peer-id: %d, "
3404 "type %d, del_peer_reason %d",
3405 peer_id, dco->dco_message_type, dco->dco_del_peer_reason);
3406 }
3407}
3408#endif /* if defined(ENABLE_DCO) */
3409
3416static void
3417multi_process_incoming_link_data(struct multi_context *m, bool floated, struct link_socket *sock)
3418{
3419 struct link_socket_info *lsi = &sock->info;
3420 const uint8_t *orig_buf;
3421
3422 /* decrypt in instance context */
3423 struct context *c = &m->pending->context;
3424
3425 orig_buf = c->c2.buf.data;
3426 if (process_incoming_link_part1(c, lsi, floated))
3427 {
3428 /* nonzero length means that we have a valid, decrypted packed */
3429 if (floated && c->c2.buf.len > 0)
3430 {
3431 multi_process_float(m, m->pending, sock);
3432 }
3433
3434 process_incoming_link_part2(c, lsi, orig_buf);
3435 }
3436
3438 {
3439 struct mroute_addr src, dest;
3440 /* extract packet source and dest addresses */
3441 unsigned int mroute_flags =
3443
3444 /* drop packet if extract failed */
3445 if (!(mroute_flags & MROUTE_EXTRACT_SUCCEEDED))
3446 {
3447 c->c2.to_tun.len = 0;
3448 }
3449 /* make sure that source address is associated with this client */
3450 else if (multi_get_instance_by_virtual_addr(m, &src, true) != m->pending)
3451 {
3452 /* IPv6 link-local address (fe80::xxx)? */
3453 if ((src.type & MR_ADDR_MASK) == MR_ADDR_IPV6
3454 && IN6_IS_ADDR_LINKLOCAL(&src.v6.addr))
3455 {
3456 /* do nothing, for now. TODO: add address learning */
3457 }
3458 else
3459 {
3460 struct gc_arena gc = gc_new();
3462 "MULTI: bad source address from client [%s], packet dropped",
3463 mroute_addr_print(&src, &gc));
3464 gc_free(&gc);
3465 }
3466 c->c2.to_tun.len = 0;
3467 }
3468 /* client-to-client communication enabled? */
3469 else if (m->enable_c2c)
3470 {
3471 /* multicast? */
3472 if (mroute_flags & MROUTE_EXTRACT_MCAST)
3473 {
3474 /* for now, treat multicast as broadcast */
3475 multi_bcast(m, &c->c2.to_tun, m->pending, 0);
3476 }
3477 else /* possible client to client routing */
3478 {
3479 ASSERT(!(mroute_flags & MROUTE_EXTRACT_BCAST));
3480 struct multi_instance *mi = multi_get_instance_by_virtual_addr(m, &dest, true);
3481
3482 /* if dest addr is a known client, route to it */
3483 if (mi)
3484 {
3485 {
3486 multi_unicast(m, &c->c2.to_tun, mi);
3488 }
3489 c->c2.to_tun.len = 0;
3490 }
3491 }
3492 }
3493 }
3494 else if (TUNNEL_TYPE(m->top.c1.tuntap) == DEV_TYPE_TAP)
3495 {
3496 uint16_t vid = 0;
3497
3498 if (m->top.options.vlan_tagging)
3499 {
3500 if (vlan_is_tagged(&c->c2.to_tun))
3501 {
3502 /* Drop VLAN-tagged frame. */
3503 msg(D_VLAN_DEBUG, "dropping incoming VLAN-tagged frame");
3504 c->c2.to_tun.len = 0;
3505 }
3506 else
3507 {
3508 vid = c->options.vlan_pvid;
3509 }
3510 }
3511 /* extract packet source and dest addresses */
3512 struct mroute_addr src, dest;
3513 /* extract packet source and dest addresses */
3514 unsigned int mroute_flags =
3516
3517 if (mroute_flags & MROUTE_EXTRACT_SUCCEEDED)
3518 {
3519 if (multi_learn_addr(m, m->pending, &src, 0) == m->pending)
3520 {
3521 /* check for broadcast */
3522 if (m->enable_c2c)
3523 {
3524 if (mroute_flags & (MROUTE_EXTRACT_BCAST | MROUTE_EXTRACT_MCAST))
3525 {
3526 multi_bcast(m, &c->c2.to_tun, m->pending, vid);
3527 }
3528 else /* try client-to-client routing */
3529 {
3530 struct multi_instance *mi = multi_get_instance_by_virtual_addr(m, &dest, false);
3531
3532 /* if dest addr is a known client, route to it */
3533 if (mi)
3534 {
3535 multi_unicast(m, &c->c2.to_tun, mi);
3537 c->c2.to_tun.len = 0;
3538 }
3539 }
3540 }
3541 }
3542 else
3543 {
3544 struct gc_arena gc = gc_new();
3546 "MULTI: bad source address from client [%s], packet dropped",
3547 mroute_addr_print(&src, &gc));
3548 c->c2.to_tun.len = 0;
3549 gc_free(&gc);
3550 }
3551 }
3552 else
3553 {
3554 c->c2.to_tun.len = 0;
3555 }
3556 }
3557}
3558
3559/*
3560 * Process packets in the TCP/UDP socket -> TUN/TAP interface direction,
3561 * i.e. client -> server direction.
3562 */
3563bool
3565 const unsigned int mpp_flags, struct link_socket *sock)
3566{
3567 struct context *c;
3568 bool ret = true;
3569 bool floated = false;
3570
3571 if (m->pending)
3572 {
3573 return true;
3574 }
3575
3576 if (!instance)
3577 {
3578#ifdef MULTI_DEBUG_EVENT_LOOP
3579 printf("TCP/UDP -> TUN [%d]\n", BLEN(&m->top.c2.buf));
3580#endif
3581 multi_set_pending(m, multi_get_create_instance_udp(m, &floated, sock));
3582 }
3583 else
3584 {
3585 multi_set_pending(m, instance);
3586 }
3587
3588 if (!m->pending)
3589 {
3590 return true;
3591 }
3592 set_prefix(m->pending);
3593
3594 /* get instance context */
3595 c = &m->pending->context;
3596
3597 if (!instance)
3598 {
3599 /* transfer packet pointer from top-level context buffer to instance */
3600 c->c2.buf = m->top.c2.buf;
3601
3602 /* transfer from-addr from top-level context buffer to instance */
3603 if (!floated)
3604 {
3605 c->c2.from = m->top.c2.from;
3606 }
3607 }
3608
3609 if (BLEN(&c->c2.buf) > 0)
3610 {
3611 multi_process_incoming_link_data(m, floated, sock);
3612 }
3613
3614 /* postprocess and set wakeup */
3615 ret = multi_process_post(m, m->pending, mpp_flags);
3616
3617 clear_prefix();
3618
3619 return ret;
3620}
3621
3622/*
3623 * Process packets in the TUN/TAP interface -> TCP/UDP socket direction,
3624 * i.e. server -> client direction.
3625 */
3626bool
3627multi_process_incoming_tun(struct multi_context *m, const unsigned int mpp_flags)
3628{
3629 bool ret = true;
3630
3631 if (BLEN(&m->top.c2.buf) > 0)
3632 {
3633 unsigned int mroute_flags;
3634 struct mroute_addr src = { 0 }, dest = { 0 };
3635 const int dev_type = TUNNEL_TYPE(m->top.c1.tuntap);
3636 int16_t vid = 0;
3637
3638#ifdef MULTI_DEBUG_EVENT_LOOP
3639 printf("TUN -> TCP/UDP [%d]\n", BLEN(&m->top.c2.buf));
3640#endif
3641
3642 if (m->pending)
3643 {
3644 return true;
3645 }
3646
3647 if (dev_type == DEV_TYPE_TAP && m->top.options.vlan_tagging)
3648 {
3649 vid = vlan_decapsulate(&m->top, &m->top.c2.buf);
3650 if (vid < 0)
3651 {
3652 return false;
3653 }
3654 }
3655
3656 /*
3657 * Route an incoming tun/tap packet to
3658 * the appropriate multi_instance object.
3659 */
3660 mroute_flags = mroute_extract_addr_from_packet(&src, &dest, vid, &m->top.c2.buf, dev_type);
3661
3662 if (mroute_flags & MROUTE_EXTRACT_SUCCEEDED)
3663 {
3664 struct context *c;
3665
3666 /* broadcast or multicast dest addr? */
3667 if (mroute_flags & (MROUTE_EXTRACT_BCAST | MROUTE_EXTRACT_MCAST))
3668 {
3669 /* for now, treat multicast as broadcast */
3670 multi_bcast(m, &m->top.c2.buf, NULL, vid);
3671 }
3672 else
3673 {
3675 m, multi_get_instance_by_virtual_addr(m, &dest, dev_type == DEV_TYPE_TUN));
3676
3677 if (m->pending)
3678 {
3679 /* get instance context */
3680 c = &m->pending->context;
3681
3682 set_prefix(m->pending);
3683
3684 {
3686 {
3687 /* transfer packet pointer from top-level context buffer to instance */
3688 c->c2.buf = m->top.c2.buf;
3689 }
3690 else
3691 {
3692 /* drop packet */
3694 "MULTI: packet dropped due to output saturation (multi_process_incoming_tun)");
3695 buf_reset_len(&c->c2.buf);
3696 }
3697 }
3698
3699 /* encrypt in instance context */
3701
3702 /* postprocess and set wakeup */
3703 ret = multi_process_post(m, m->pending, mpp_flags);
3704
3705 clear_prefix();
3706 }
3707 }
3708 }
3709 }
3710 return ret;
3711}
3712
3713/*
3714 * Process a possible client-to-client/bcast/mcast message in the
3715 * queue.
3716 */
3717struct multi_instance *
3719{
3720 struct mbuf_item item;
3721
3722 if (mbuf_extract_item(ms, &item)) /* cleartext IP packet */
3723 {
3724 unsigned int pip_flags = PIPV4_PASSTOS | PIPV6_ICMP_NOHOST_SERVER;
3725
3726 set_prefix(item.instance);
3727 item.instance->context.c2.buf = item.buffer->buf;
3728 if (item.buffer->flags
3729 & MF_UNICAST) /* --mssfix doesn't make sense for broadcast or multicast */
3730 {
3731 pip_flags |= PIP_MSSFIX;
3732 }
3733 process_ip_header(&item.instance->context, pip_flags, &item.instance->context.c2.buf,
3734 item.instance->context.c2.link_sockets[0]);
3735 encrypt_sign(&item.instance->context, true);
3736 mbuf_free_buf(item.buffer);
3737
3738 dmsg(D_MULTI_DEBUG, "MULTI: C2C/MCAST/BCAST");
3739
3740 clear_prefix();
3741 return item.instance;
3742 }
3743 else
3744 {
3745 return NULL;
3746 }
3747}
3748
3749/*
3750 * Called when an I/O wait times out. Usually means that a particular
3751 * client instance object needs timer-based service.
3752 */
3753bool
3754multi_process_timeout(struct multi_context *m, const unsigned int mpp_flags)
3755{
3756 bool ret = true;
3757
3758#ifdef MULTI_DEBUG_EVENT_LOOP
3759 printf("%s -> TIMEOUT\n", id(m->earliest_wakeup));
3760#endif
3761
3762 /* instance marked for wakeup? */
3763 if (m->earliest_wakeup)
3764 {
3766 {
3770 }
3771 else
3772 {
3774 ret = multi_process_post(m, m->earliest_wakeup, mpp_flags);
3775 clear_prefix();
3776 }
3777 m->earliest_wakeup = NULL;
3778 }
3779 return ret;
3780}
3781
3782/*
3783 * Per-client route quota management
3784 */
3785
3786void
3788{
3789 struct gc_arena gc = gc_new();
3791 "MULTI ROUTE: route quota (%d) exceeded for %s (see --max-routes-per-client option)",
3793 gc_free(&gc);
3794}
3795
3796#ifdef ENABLE_DEBUG
3797/*
3798 * Flood clients with random packets
3799 */
3800static void
3801gremlin_flood_clients(struct multi_context *m)
3802{
3803 const int level = GREMLIN_PACKET_FLOOD_LEVEL(m->top.options.gremlin);
3804 if (level)
3805 {
3806 struct gc_arena gc = gc_new();
3807 struct buffer buf = alloc_buf_gc(BUF_SIZE(&m->top.c2.frame), &gc);
3808 struct packet_flood_parms parm = get_packet_flood_parms(level);
3809 int i;
3810
3811 ASSERT(buf_init(&buf, m->top.c2.frame.buf.headroom));
3812 parm.packet_size = min_int(parm.packet_size, m->top.c2.frame.buf.payload_size);
3813
3814 msg(D_GREMLIN, "GREMLIN_FLOOD_CLIENTS: flooding clients with %d packets of size %d",
3815 parm.n_packets, parm.packet_size);
3816
3817 for (i = 0; i < parm.packet_size; ++i)
3818 {
3819 ASSERT(buf_write_u8(&buf, (uint8_t)(get_random() & 0xFF)));
3820 }
3821
3822 for (i = 0; i < parm.n_packets; ++i)
3823 {
3824 multi_bcast(m, &buf, NULL, 0);
3825 }
3826
3827 gc_free(&gc);
3828 }
3829}
3830#endif /* ifdef ENABLE_DEBUG */
3831
3832static bool
3834{
3835 struct timeval null;
3836 CLEAR(null);
3838}
3839
3840/*
3841 * Process timers in the top-level context
3842 */
3843void
3845{
3846 /* possibly reap instances/routes in vhash */
3848
3849 /* possibly print to status log */
3850 if (m->top.c1.status_output)
3851 {
3853 {
3855 }
3856 }
3857
3858 /* possibly flush ifconfig-pool file */
3860
3861#ifdef ENABLE_DEBUG
3862 gremlin_flood_clients(m);
3863#endif
3864
3865 /* Should we check for stale routes? */
3867 {
3869 }
3870}
3871
3872static void
3874{
3875 inherit_context_top(&top->multi->top, top);
3877}
3878
3879static void
3885
3886static bool
3888{
3889 return (sig == SIGUSR1 || sig == SIGTERM || sig == SIGHUP || sig == SIGINT);
3890}
3891
3892static void
3894{
3895 /* tell all clients to restart */
3896 for (uint32_t i = 0; i <= m->max_peerid; i++)
3897 {
3898 struct multi_instance *mi = m->instances[i];
3899 if (mi && !mi->halt && proto_is_dgram(mi->context.c2.link_sockets[0]->info.proto))
3900 {
3901 send_control_channel_string(&mi->context, next_server ? "RESTART,[N]" : "RESTART",
3902 D_PUSH);
3904 }
3905 }
3906
3907 /* reschedule signal */
3909 struct timeval tv = { .tv_sec = 2, .tv_usec = 0 };
3911
3913
3917
3918 signal_reset(m->top.sig, 0);
3919}
3920
3921/*
3922 * Return true if event loop should break,
3923 * false if it should continue.
3924 */
3925bool
3927{
3928 if (signal_reset(m->top.sig, SIGUSR2) == SIGUSR2)
3929 {
3930 struct status_output *so = status_open(NULL, 0, M_INFO, NULL, 0);
3932 status_close(so);
3933 return false;
3934 }
3938 {
3940 return false;
3941 }
3942 return true;
3943}
3944
3945/*
3946 * Management subsystem callbacks
3947 */
3948#ifdef ENABLE_MANAGEMENT
3949
3950static void
3951management_callback_status(void *arg, const int version, struct status_output *so)
3952{
3953 struct multi_context *m = (struct multi_context *)arg;
3954
3955 if (!version)
3956 {
3958 }
3959 else
3960 {
3961 multi_print_status(m, so, version);
3962 }
3963}
3964
3965static int
3967{
3968 const struct multi_context *m = (struct multi_context *)arg;
3969 return m->n_clients;
3970}
3971
3972static int
3973management_callback_kill_by_cn(void *arg, const char *del_cn)
3974{
3975 struct multi_context *m = (struct multi_context *)arg;
3976 int count = 0;
3977
3978 for (uint32_t i = 0; i <= m->max_peerid; i++)
3979 {
3980 struct multi_instance *mi = m->instances[i];
3981 if (mi && !mi->halt)
3982 {
3983 const char *cn = tls_common_name(mi->context.c2.tls_multi, false);
3984 if (cn && !strcmp(cn, del_cn))
3985 {
3987 ++count;
3988 }
3989 }
3990 }
3991 return count;
3992}
3993
3994static int
3995management_callback_kill_by_addr(void *arg, const in_addr_t addr, const uint16_t port, const uint8_t proto)
3996{
3997 struct multi_context *m = (struct multi_context *)arg;
3998 struct openvpn_sockaddr saddr;
3999 struct mroute_addr maddr;
4000 int count = 0;
4001
4002 CLEAR(saddr);
4003 saddr.addr.in4.sin_family = AF_INET;
4004 saddr.addr.in4.sin_addr.s_addr = htonl(addr);
4005 saddr.addr.in4.sin_port = htons(port);
4006 maddr.proto = proto;
4007 if (mroute_extract_openvpn_sockaddr(&maddr, &saddr, true))
4008 {
4009 for (uint32_t i = 0; i <= m->max_peerid; i++)
4010 {
4011 struct multi_instance *mi = m->instances[i];
4012 if (mi && !mi->halt && mroute_addr_equal(&maddr, &mi->real))
4013 {
4015 ++count;
4016 }
4017 }
4018 }
4019 return count;
4020}
4021
4022static void
4024{
4025 struct multi_context *m = (struct multi_context *)arg;
4026 if (m->multi_io)
4027 {
4029 }
4030}
4031
4032struct multi_instance *
4033lookup_by_cid(struct multi_context *m, const unsigned long cid)
4034{
4035 if (m)
4036 {
4037 struct multi_instance *mi = (struct multi_instance *)hash_lookup(m->cid_hash, &cid);
4038 if (mi && !mi->halt)
4039 {
4040 return mi;
4041 }
4042 }
4043 return NULL;
4044}
4045
4046static bool
4047management_kill_by_cid(void *arg, const unsigned long cid, const char *kill_msg)
4048{
4049 struct multi_context *m = (struct multi_context *)arg;
4050 struct multi_instance *mi = lookup_by_cid(m, cid);
4051 if (mi)
4052 {
4053 send_restart(&mi->context, kill_msg); /* was: multi_signal_instance (m, mi, SIGTERM); */
4055 return true;
4056 }
4057 else
4058 {
4059 return false;
4060 }
4061}
4062
4063static struct tls_session *
4065 const unsigned int mda_key_id)
4066{
4067 if (multi->session[TM_INITIAL].key[KS_PRIMARY].mda_key_id == mda_key_id)
4068 {
4069 return &multi->session[TM_INITIAL];
4070 }
4071 else if (multi->session[TM_ACTIVE].key[KS_PRIMARY].mda_key_id == mda_key_id)
4072 {
4073 return &multi->session[TM_ACTIVE];
4074 }
4075 else
4076 {
4077 return NULL;
4078 }
4079}
4080
4081static const char *
4083{
4084 struct context *c = &mi->context;
4085 struct tls_multi *multi = c->c2.tls_multi;
4086
4087 if (!multi->acc_negotiated_protocols)
4088 {
4089 msg(M_CLIENT, "ACC: No negotiated protocols");
4090 return NULL;
4091 }
4092
4093 struct buffer buf = alloc_buf_gc(1024, gc);
4094
4095 buf_printf(&buf, "ACC:%d A:6 %s", multi->acc_max_message_length,
4097 return buf_str(&buf);
4098}
4099
4100
4101static bool
4102management_client_pending_auth(void *arg, const unsigned long cid, const unsigned int mda_key_id,
4103 const char *extra, unsigned int timeout)
4104{
4105 struct multi_context *m = (struct multi_context *)arg;
4106 struct multi_instance *mi = lookup_by_cid(m, cid);
4107
4108 if (mi)
4109 {
4110 struct tls_multi *multi = mi->context.c2.tls_multi;
4111
4112 struct gc_arena gc = gc_new();
4113 if (!strcmp(extra, "ACC"))
4114 {
4115 extra = calculate_app_control_extra(mi, &gc);
4116 if (!extra)
4117 {
4118 gc_free(&gc);
4119 return false;
4120 }
4121 }
4122 struct tls_session *session = lookup_session_by_mda_key_id(multi, mda_key_id);
4123
4124 if (!session)
4125 {
4126 gc_free(&gc);
4127 return false;
4128 }
4129
4130 /* sends INFO_PRE and AUTH_PENDING messages to client */
4131 bool ret = send_auth_pending_messages(multi, session, extra, timeout);
4134 gc_free(&gc);
4135 return ret;
4136 }
4137 return false;
4138}
4139
4140
4141static bool
4142management_client_auth(void *arg, const unsigned long cid, const unsigned int mda_key_id,
4143 const bool auth, const char *reason, const char *client_reason,
4144 struct buffer_list *cc_config) /* ownership transferred */
4145{
4146 struct multi_context *m = (struct multi_context *)arg;
4147 struct multi_instance *mi = lookup_by_cid(m, cid);
4148 bool cc_config_owned = true;
4149 bool ret = false;
4150
4151 if (mi)
4152 {
4153 ret = tls_authenticate_key(mi->context.c2.tls_multi, mda_key_id, auth, client_reason);
4154 if (ret)
4155 {
4156 if (auth)
4157 {
4159 {
4161 cc_config_owned = false;
4162 }
4163 }
4164 else if (reason)
4165 {
4166 msg(D_MULTI_LOW, "MULTI: connection rejected: %s, CLI:%s", reason,
4167 np(client_reason));
4168 }
4169 }
4170 }
4171 if (cc_config_owned && cc_config)
4172 {
4174 }
4175 return ret;
4176}
4177
4178
4179static bool
4181 const unsigned long cid,
4182 const unsigned int mda_key_id,
4183 struct buffer_list *input) /* ownership transferred */
4184{
4185 struct multi_context *m = (struct multi_context *)arg;
4186 struct multi_instance *mi = lookup_by_cid(m, cid);
4187
4188 bool ret = false;
4189 if (mi && buffer_list_defined(input))
4190 {
4191 struct tls_multi *multi = mi->context.c2.tls_multi;
4192 struct tls_session *session = lookup_session_by_mda_key_id(multi, mda_key_id);
4193 if (!session)
4194 {
4195 msg(M_CLIENT, "client session not found");
4196 buffer_list_free(input);
4197 return false;
4198 }
4199
4200 ret = management_send_acc_message(&mi->context, multi, session, input);
4202 }
4203
4204 buffer_list_free(input);
4205 return ret;
4206}
4207
4208
4209static char *
4210management_get_peer_info(void *arg, const unsigned long cid)
4211{
4212 struct multi_context *m = (struct multi_context *)arg;
4213 struct multi_instance *mi = lookup_by_cid(m, cid);
4214 char *ret = NULL;
4215
4216 if (mi)
4217 {
4218 ret = mi->context.c2.tls_multi->peer_info;
4219 }
4220
4221 return ret;
4222}
4223
4224#endif /* ifdef ENABLE_MANAGEMENT */
4225
4226
4227void
4254
4255void
4257{
4258 /* max_clients must be less then max peer-id value */
4260
4261 for (uint32_t i = 0; i < m->max_clients; ++i)
4262 {
4263 if (!m->instances[i])
4264 {
4265 mi->context.c2.tls_multi->rx_peer_id = i;
4266 m->instances[i] = mi;
4267 break;
4268 }
4269 }
4270
4271 /* should not really end up here, since multi_create_instance returns null
4272 * if amount of clients exceeds max_clients and this method would then
4273 * also not have been called */
4275
4277 {
4279 }
4280
4281 m->assigned_peer_ids++;
4282}
4283
4294static void
4295multi_get_timeout(struct multi_context *multi, struct timeval *timeval)
4296{
4297 multi_get_timeout_instance(multi, timeval);
4298
4299#ifdef ENABLE_MANAGEMENT
4300 if (management)
4301 {
4302 management_check_bytecount_server(multi, timeval);
4303 }
4304#endif /* ENABLE_MANAGEMENT */
4305}
4306
4307/**************************************************************************/
4314static void
4316{
4317 while (true)
4318 {
4319 /* wait on tun/socket list */
4320 multi_get_timeout(multi, &multi->top.c2.timeval);
4321 const int status = multi_io_wait(multi);
4322 MULTI_CHECK_SIG(multi);
4323
4324 /* check on status of coarse timers */
4326
4327 /* timeout? */
4328 if (status > 0)
4329 {
4330 /* process the I/O which triggered select */
4331 multi_io_process_io(multi);
4332 }
4333 else if (status == 0)
4334 {
4335 multi_io_action(multi, NULL, TA_TIMEOUT, false);
4336 }
4337
4338 MULTI_CHECK_SIG(multi);
4339 }
4340}
4341
4342/*
4343 * Top level event loop.
4344 */
4345void
4347{
4348 ASSERT(top->options.mode == MODE_SERVER);
4349
4350 struct multi_context multi;
4351
4352 top->mode = CM_TOP;
4353 // cppcheck-suppress autoVariables ; yes, we know this is dangerous
4354 top->multi = &multi;
4356
4357 /* initialize top-tunnel instance */
4359 if (IS_SIG(top))
4360 {
4361 return;
4362 }
4363
4364 /* initialize global multi_context object */
4365 multi_init(top);
4366
4367 /* initialize our cloned top object */
4369
4370 /* initialize management interface */
4372
4373 /* finished with initialization */
4374 initialization_sequence_completed(top, ISC_SERVER); /* --mode server --proto tcp-server */
4375
4376#ifdef ENABLE_ASYNC_PUSH
4377 multi.top.c2.inotify_fd = inotify_init();
4378 if (multi.top.c2.inotify_fd < 0)
4379 {
4380 msg(D_MULTI_ERRORS | M_ERRNO, "MULTI: inotify_init error");
4381 }
4382#endif
4383
4384 tunnel_server_loop(&multi);
4385
4386#ifdef ENABLE_ASYNC_PUSH
4387 msg(D_LOW, "%s: close multi.top.c2.inotify_fd (%d)",
4388 __func__, multi.top.c2.inotify_fd);
4389 close(multi.top.c2.inotify_fd);
4390#endif
4391
4392 /* shut down management interface */
4394
4395 /* save ifconfig-pool */
4396 multi_ifconfig_pool_persist(&multi, true);
4397
4398 /* tear down tunnel instance (unless --persist-tun) */
4399 multi_uninit(&multi);
4400 multi_top_free(&multi);
4402}
4403
4404/* Searches for the address and deletes it if it is owned by the multi_instance */
4405static void
4406multi_unlearn_addr(struct multi_context *m, const struct multi_instance *mi, const struct mroute_addr *addr)
4407{
4408 struct hash_element *he;
4409 const uint64_t hv = hash_value(m->vhash, addr);
4410 struct hash_bucket *bucket = hash_bucket(m->vhash, hv);
4411 struct multi_route *r = NULL;
4412
4413 /* if route currently exists, get the instance which owns it */
4414 he = hash_lookup_fast(m->vhash, bucket, addr, hv);
4415 if (he)
4416 {
4417 r = (struct multi_route *)he->value;
4418 }
4419
4420 /* if the route does not exist or exists but is not owned by the current instance, return */
4421 if (!r || r->instance != mi)
4422 {
4423 return;
4424 }
4425
4426 struct gc_arena gc = gc_new();
4427 msg(D_MULTI_LOW, "MULTI: Unlearn: %s -> %s", mroute_addr_print(&r->addr, &gc), multi_instance_string(mi, false, &gc));
4428 learn_address_script(m, NULL, "delete", &r->addr);
4430 multi_route_del(r);
4431
4432 gc_free(&gc);
4433}
4434
4440static void
4442{
4443 struct mroute_addr addr;
4444 CLEAR(addr);
4445
4446 addr.type = MR_ADDR_IPV4;
4447 addr.len = 4;
4448 addr.v4.addr = a;
4449
4450 multi_unlearn_addr(m, mi, &addr);
4451}
4452
4458static void
4459multi_unlearn_in6_addr(struct multi_context *m, const struct multi_instance *mi, struct in6_addr a6)
4460{
4461 struct mroute_addr addr;
4462 CLEAR(addr);
4463
4464 addr.type = MR_ADDR_IPV6;
4465 addr.len = 16;
4466 addr.v6.addr = a6;
4467
4468 multi_unlearn_addr(m, mi, &addr);
4469}
4470
4471/* Function to unlearn previous ifconfig of a client in the server multi_context after a PUSH_UPDATE */
4472void
4474{
4475 in_addr_t old_addr = 0;
4476 old_addr = htonl(mi->context.c2.push_ifconfig_local);
4477 multi_unlearn_in_addr_t(m, mi, old_addr);
4478 mi->context.c2.push_ifconfig_defined = false;
4480 mi->reporting_addr = 0;
4481}
4482
4483/* Function to unlearn previous ifconfig-ipv6 of a client in the server multi_context after a PUSH_UPDATE */
4484void
4486{
4487 struct in6_addr old_addr6;
4488 CLEAR(old_addr6);
4489 old_addr6 = mi->context.c2.push_ifconfig_ipv6_local;
4490 multi_unlearn_in6_addr(m, mi, old_addr6);
4494}
4495
4506void
4507update_vhash(struct multi_context *m, struct multi_instance *mi, const char *new_ip, const char *new_ipv6)
4508{
4509 if (new_ip)
4510 {
4511 /* Remove old IP */
4513 {
4514 unlearn_ifconfig(m, mi);
4515 }
4516
4517 /* Add new IP */
4518 struct in_addr new_addr;
4519 CLEAR(new_addr);
4520 if (inet_pton(AF_INET, new_ip, &new_addr) == 1
4521 && multi_learn_in_addr_t(m, mi, ntohl(new_addr.s_addr), -1, true))
4522 {
4523 mi->context.c2.push_ifconfig_defined = true;
4524 mi->context.c2.push_ifconfig_local = ntohl(new_addr.s_addr);
4525 /* set our client's VPN endpoint for status reporting purposes */
4527 }
4528 }
4529
4530 if (new_ipv6)
4531 {
4532 /* Remove old IPv6 */
4534 {
4535 unlearn_ifconfig_ipv6(m, mi);
4536 }
4537
4538 /* Add new IPv6 */
4539 struct in6_addr new_addr6;
4540 CLEAR(new_addr6);
4541 if (inet_pton(AF_INET6, new_ipv6, &new_addr6) == 1
4542 && multi_learn_in6_addr(m, mi, new_addr6, -1, true))
4543 {
4545 mi->context.c2.push_ifconfig_ipv6_local = new_addr6;
4546 /* set our client's VPN endpoint for status reporting purposes */
4548 }
4549 }
4550}
4551
4552bool
4554{
4555 in_addr_t local_addr, local_netmask;
4556
4558 {
4559 /* If we do not have a local address, we just return false as
4560 * this check doesn't make sense. */
4561 return false;
4562 }
4563
4564 /* if it falls into the network defined by ifconfig_local we assume
4565 * it is already known to DCO and only install "extra" iroutes */
4566 inet_pton(AF_INET, o->ifconfig_local, &local_addr);
4567 inet_pton(AF_INET, o->ifconfig_remote_netmask, &local_netmask);
4568
4569 return (local_addr & local_netmask) != (dest & local_netmask);
4570}
4571
4572bool
4573multi_check_push_ifconfig_ipv6_extra_route(const struct options *o, const struct in6_addr *dest)
4574{
4576 {
4577 /* If we do not have a local address, we just return false as
4578 * this check doesn't make sense. */
4579 return false;
4580 }
4581
4582 /* if it falls into the network defined by ifconfig_local we assume
4583 * it is already known to DCO and only install "extra" iroutes */
4584 struct in6_addr ifconfig_local;
4585 if (inet_pton(AF_INET6, o->ifconfig_ipv6_local, &ifconfig_local) != 1)
4586 {
4587 return false;
4588 }
4589
4590 return (!ipv6_net_contains_host(&ifconfig_local, o->ifconfig_ipv6_netbits,
4591 dest));
4592}
void argv_parse_cmd(struct argv *argres, const char *cmdstr)
Parses a command string, tokenizes it and puts each element into a separate struct argv argument slot...
Definition argv.c:481
void argv_free(struct argv *a)
Frees all memory allocations allocated by the struct argv related functions.
Definition argv.c:101
bool argv_printf(struct argv *argres, const char *format,...)
printf() variant which populates a struct argv.
Definition argv.c:438
bool argv_printf_cat(struct argv *argres, const char *format,...)
printf() inspired argv concatenation.
Definition argv.c:462
struct argv argv_new(void)
Allocates a new struct argv and ensures it is initialised.
Definition argv.c:87
void generate_auth_token(const struct user_pass *up, struct tls_multi *multi)
Generate an auth token based on username and timestamp.
Definition auth_token.c:182
bool buffer_list_defined(const struct buffer_list *ol)
Checks if the list is valid and non-empty.
Definition buffer.c:1169
bool buf_printf(struct buffer *buf, const char *format,...)
printf-style append to a buffer with overflow check.
Definition buffer.c:226
void buffer_list_free(struct buffer_list *ol)
Frees a buffer list and all the buffers in it.
Definition buffer.c:1159
struct buffer alloc_buf_gc(size_t size, struct gc_arena *gc)
Allocate a buffer of the given size under garbage collection.
Definition buffer.c:77
char * string_alloc(const char *str, struct gc_arena *gc)
Duplicate a string, allocating memory under garbage collection.
Definition buffer.c:601
#define ALLOC_OBJ(dptr, type)
Allocate memory for a single object of the given type.
Definition buffer.h:2016
#define BSTR(buf)
Return the buffer content pointer cast to char *.
Definition buffer.h:157
static bool buf_write_u8(struct buffer *dest, uint8_t data)
Append a uint8_t to a buffer.
Definition buffer.h:1283
#define BLEN(buf)
Return the length of the buffer content in bytes.
Definition buffer.h:151
static void buf_reset_len(struct buffer *buf)
Reset the length and offset of a buffer to zero.
Definition buffer.h:616
static void gc_free(struct gc_arena *a)
Free all allocations in a garbage collection arena.
Definition buffer.h:1965
#define ALLOC_OBJ_CLEAR(dptr, type)
Allocate and zero-initialise memory for a single object of the given type.
Definition buffer.h:2027
#define buf_init(buf, offset)
Definition buffer.h:364
static struct gc_arena gc_new(void)
Allocate and return a new, empty garbage collection arena.
Definition buffer.h:1949
static char * buf_str(struct buffer *buf)
Return the buffer content pointer cast to char *.
Definition buffer.h:572
#define CCD_DEFAULT
Definition common.h:63
#define counter_format
Definition common.h:32
bool check_compression_settings_valid(const struct compress_options *info, msglvl_t msglevel)
Checks if the compression settings are valid.
Definition comp.c:162
#define COMP_ALG_STUB
support compression command byte and framing without actual compression
Definition comp.h:56
#define COMP_F_MIGRATE
push stub-v2 or comp-lzo no when we see a client with comp-lzo in occ
Definition comp.h:47
size_t strlcpy(char *dest, const char *src, size_t maxlen)
const char * translate_cipher_name_to_openvpn(const char *cipher_name)
Translate a crypto library cipher name to an OpenVPN cipher name.
Definition crypto.c:1773
int64_t get_random(void)
an analogue to the random() function, but use prng_bytes and also int64_t instead of long to avoid LL...
Definition crypto.c:1702
#define CO_USE_TLS_KEY_MATERIAL_EXPORT
Bit-flag indicating that data channel key derivation is done using TLS keying material export [RFC570...
Definition crypto.h:359
#define CO_USE_DYNAMIC_TLS_CRYPT
Bit-flag indicating that renegotiations are using tls-crypt with a TLS-EKM derived key.
Definition crypto.h:375
#define CO_EPOCH_DATA_KEY_FORMAT
Bit-flag indicating the epoch the data format.
Definition crypto.h:379
#define CO_USE_CC_EXIT_NOTIFY
Bit-flag indicating that explicit exit notifies should be sent via the control channel instead of usi...
Definition crypto.h:371
Data Channel Cryptography SSL library-specific backend interface.
bool cipher_kt_mode_aead(const char *ciphername)
Check if the supplied cipher is a supported AEAD mode cipher.
static int dco_get_peer_stats_multi(dco_context_t *dco, const bool raise_sigusr1_on_err)
Definition dco.h:369
static void dco_delete_iroutes(openvpn_net_ctx_t *net_ctx, const struct context *c)
Definition dco.h:364
static void dco_install_iroute(struct multi_context *m, struct multi_instance *mi, struct mroute_addr *addr)
Definition dco.h:359
static bool dco_check_option(msglvl_t msglevel, const struct options *o)
Definition dco.h:274
void * dco_context_t
Definition dco.h:259
static int dco_multi_add_new_peer(const struct multi_context *m, struct multi_instance *mi)
Definition dco.h:353
void setenv_counter(struct env_set *es, const char *name, counter_type value)
Definition env_set.c:281
void setenv_int(struct env_set *es, const char *name, int value)
Definition env_set.c:289
void setenv_str(struct env_set *es, const char *name, const char *value)
Definition env_set.c:305
struct env_set * env_set_create(struct gc_arena *gc)
Definition env_set.c:155
void setenv_long_long(struct env_set *es, const char *name, long long value)
Definition env_set.c:297
void setenv_del(struct env_set *es, const char *name)
Definition env_set.c:350
#define D_PUSH
Definition errlevel.h:82
#define D_MULTI_ERRORS
Definition errlevel.h:64
#define D_VLAN_DEBUG
Definition errlevel.h:153
#define D_IMPORT_ERRORS
Definition errlevel.h:63
#define D_ROUTE_QUOTA
Definition errlevel.h:89
#define D_MULTI_MEDIUM
Definition errlevel.h:101
#define D_DCO
Definition errlevel.h:93
#define D_MULTI_DEBUG
Definition errlevel.h:126
#define D_MULTI_DROPPED
Definition errlevel.h:100
#define D_DCO_DEBUG
Definition errlevel.h:117
#define D_MULTI_LOW
Definition errlevel.h:85
#define D_TLS_ERRORS
Definition errlevel.h:58
#define D_LOW
Definition errlevel.h:96
#define M_INFO
Definition errlevel.h:54
#define D_GREMLIN
Definition errlevel.h:77
const struct rw_handle * event_t
Definition event.h:89
@ EVENT_ARG_MULTI_INSTANCE
Definition event.h:134
void reschedule_multi_process(struct context *c)
Reschedule tls_multi_process.
Definition forward.c:402
bool send_control_channel_string(struct context *c, const char *str, msglvl_t msglevel)
Definition forward.c:409
void pre_select(struct context *c)
Definition forward.c:1993
void process_ip_header(struct context *c, unsigned int flags, struct buffer *buf, struct link_socket *sock)
Definition forward.c:1690
void extract_dco_float_peer_addr(const sa_family_t socket_family, struct openvpn_sockaddr *out_osaddr, const struct sockaddr *float_sa)
Transfers float_sa data extracted from an incoming DCO PEER_FLOAT_NTF to out_osaddr for later process...
Definition forward.c:1239
Interface functions to the internal and external multiplexers.
#define PIP_MSSFIX
Definition forward.h:337
static void register_activity(struct context *c, const int64_t size)
Definition forward.h:364
#define PIPV6_ICMP_NOHOST_SERVER
Definition forward.h:342
static struct link_socket_info * get_link_socket_info(struct context *c)
Definition forward.h:351
#define ANY_OUT(c)
Definition forward.h:39
#define PIPV4_PASSTOS
Definition forward.h:336
#define TM_INITIAL
As yet un-trusted tls_session \ being negotiated.
Definition ssl_common.h:553
#define KS_PRIMARY
Primary key state index.
Definition ssl_common.h:472
#define TM_ACTIVE
Active tls_session.
Definition ssl_common.h:552
void encrypt_sign(struct context *c, bool comp_frag)
Process a data channel packet that will be sent through a VPN tunnel.
Definition forward.c:649
void tunnel_server(struct context *top)
Main event loop for OpenVPN in server mode.
Definition multi.c:4346
static void tunnel_server_loop(struct multi_context *multi)
Main event loop for OpenVPN in point-to-multipoint server mode.
Definition multi.c:4315
void process_incoming_link_part2(struct context *c, struct link_socket_info *lsi, const uint8_t *orig_buf)
Continues processing a packet read from the external network interface.
Definition forward.c:1146
bool multi_process_incoming_link(struct multi_context *m, struct multi_instance *instance, const unsigned int mpp_flags, struct link_socket *sock)
Demultiplex and process a packet received over the external network interface.
Definition multi.c:3564
bool process_incoming_link_part1(struct context *c, const struct link_socket_info *lsi, bool floated)
Starts processing a packet read from the external network interface.
Definition forward.c:1013
struct multi_instance * multi_get_create_instance_udp(struct multi_context *m, bool *floated, struct link_socket *sock)
Get, and if necessary create, the multi_instance associated with a packet's source address.
Definition mudp.c:407
void process_incoming_tun(struct context *c, struct link_socket *out_sock)
Process a packet read from the virtual tun/tap network interface.
Definition forward.c:1505
bool multi_process_incoming_tun(struct multi_context *m, const unsigned int mpp_flags)
Determine the destination VPN tunnel of a packet received over the virtual tun/tap network interface ...
Definition multi.c:3627
void uninit_management_callback(void)
Definition init.c:4449
void initialization_sequence_completed(struct context *c, const unsigned int flags)
Definition init.c:1520
void close_instance(struct context *c)
Definition init.c:4783
void inherit_context_top(struct context *dest, const struct context *src)
Definition init.c:4944
void free_context_buffers(struct context_buffers *b)
Definition init.c:3728
void init_instance_handle_signals(struct context *c, const struct env_set *env, const unsigned int flags)
Definition init.c:4761
void inherit_context_child(struct context *dest, const struct context *src, struct link_socket *sock)
Definition init.c:4856
void context_clear_2(struct context *c)
Definition init.c:91
void close_context(struct context *c, int sig, unsigned int flags)
Definition init.c:4990
bool do_deferred_options(struct context *c, const uint64_t found, const bool is_update)
Definition init.c:2591
struct context_buffers * init_context_buffers(const struct frame *frame)
Definition init.c:3703
void management_show_net_callback(void *arg, const msglvl_t msglevel)
Definition init.c:4280
#define CC_GC_FREE
Definition init.h:109
#define CC_HARD_USR1_TO_HUP
Definition init.h:111
#define ISC_SERVER
Definition init.h:121
static unsigned int constrain_uint(unsigned int x, unsigned int min, unsigned int max)
Definition integer.h:139
static int min_int(int x, int y)
Definition integer.h:105
static SERVICE_STATUS status
Definition interactive.c:52
@ route
Definition interactive.c:86
@ read
bool event_timeout_trigger(struct event_timeout *et, struct timeval *tv, const int et_const_retry)
This is the principal function for testing and triggering recurring timers.
Definition interval.c:42
#define ETT_DEFAULT
Definition interval.h:222
static void event_timeout_init(struct event_timeout *et, interval_t n, const time_t last)
Initialises a timer struct.
Definition interval.h:172
void hash_iterator_free(struct hash_iterator *hi)
Definition list.c:272
struct hash_element * hash_iterator_next(struct hash_iterator *hi)
Definition list.c:278
void hash_iterator_delete_element(struct hash_iterator *hi)
Definition list.c:310
void hash_iterator_init(struct hash *hash, struct hash_iterator *hi)
Definition list.c:236
struct hash * hash_init(const uint32_t n_buckets, uint64_t(*hash_function)(const void *key, const uint8_t hash_key[HASH_KEY_LEN]), bool(*compare_function)(const void *key1, const void *key2))
Definition list.c:36
void hash_free(struct hash *hash)
Definition list.c:62
struct hash_element * hash_lookup_fast(struct hash *hash, struct hash_bucket *bucket, const void *key, uint64_t hv)
Definition list.c:81
bool hash_add(struct hash *hash, const void *key, void *value, bool replace)
Definition list.c:139
void hash_remove_by_value(struct hash *hash, const void *value)
Definition list.c:167
void hash_iterator_init_range(struct hash *hash, struct hash_iterator *hi, uint32_t start_bucket, uint32_t end_bucket)
Definition list.c:215
static bool hash_remove(struct hash *hash, const void *key)
Definition list.h:164
static void * hash_lookup(struct hash *hash, const void *key)
Definition list.h:131
#define HASH_KEY_LEN
Definition list.h:53
static uint32_t hash_n_elements(const struct hash *hash)
Definition list.h:113
static uint32_t hash_n_buckets(const struct hash *hash)
Definition list.h:119
static void hash_add_fast(struct hash *hash, struct hash_bucket *bucket, const void *key, uint64_t hv, void *value)
Definition list.h:149
static struct hash_bucket * hash_bucket(struct hash *hash, uint64_t hv)
Definition list.h:125
static uint64_t hash_value(const struct hash *hash, const void *key)
Definition list.h:107
void management_check_bytecount_server(struct multi_context *multi, struct timeval *timeval)
Definition manage.c:4374
bool management_send_acc_message(struct context *c, struct tls_multi *multi, struct tls_session *session, struct buffer_list *input)
Definition manage.c:4429
void management_connection_established(struct management *man, struct man_def_auth_context *mdac, const struct env_set *es)
Definition manage.c:3172
void management_notify_client_close(const struct management *man, struct man_def_auth_context *mdac, const struct env_set *es)
Definition manage.c:3182
void management_set_callback(struct management *man, const struct management_callback *cb)
Definition manage.c:2925
void management_learn_addr(struct man_def_auth_context *mdac, const struct mroute_addr *addr, const bool primary)
Definition manage.c:3195
#define MCF_SERVER
Definition manage.h:175
void mbuf_dereference_instance(struct mbuf_set *ms, const struct multi_instance *mi)
Definition mbuf.c:168
void mbuf_add_item(struct mbuf_set *ms, const struct mbuf_item *item)
Definition mbuf.c:104
struct mbuf_buffer * mbuf_alloc_buf(const struct buffer *buf)
Definition mbuf.c:65
void mbuf_free_buf(struct mbuf_buffer *mb)
Definition mbuf.c:76
bool mbuf_extract_item(struct mbuf_set *ms, struct mbuf_item *item)
Definition mbuf.c:126
void mbuf_free(struct mbuf_set *ms)
Definition mbuf.c:50
struct mbuf_set * mbuf_init(unsigned int size)
Definition mbuf.c:38
#define MF_UNICAST
Definition mbuf.h:47
static int mbuf_maximum_queued(const struct mbuf_set *ms)
Definition mbuf.h:93
void mroute_addr_mask_host_bits(struct mroute_addr *ma)
Definition mroute.c:319
void mroute_helper_add_iroute46(struct mroute_helper *mh, int netbits)
Definition mroute.c:521
const char * mroute_addr_print_ex(const struct mroute_addr *ma, const unsigned int flags, struct gc_arena *gc)
Definition mroute.c:378
bool mroute_extract_openvpn_sockaddr(struct mroute_addr *addr, const struct openvpn_sockaddr *osaddr, bool use_port)
Definition mroute.c:255
const char * mroute_addr_print(const struct mroute_addr *ma, struct gc_arena *gc)
Definition mroute.c:372
void mroute_helper_del_iroute46(struct mroute_helper *mh, int netbits)
Definition mroute.c:536
bool mroute_learnable_address(const struct mroute_addr *addr, struct gc_arena *gc)
Definition mroute.c:64
bool mroute_addr_compare_function(const void *key1, const void *key2)
Definition mroute.c:366
struct mroute_helper * mroute_helper_init(int ageable_ttl_secs)
Definition mroute.c:483
void mroute_addr_init(struct mroute_addr *addr)
Definition mroute.c:39
uint64_t mroute_addr_hash_function(const void *key, const uint8_t hash_key[HASH_KEY_LEN])
Definition mroute.c:359
void mroute_helper_free(struct mroute_helper *mh)
Definition mroute.c:552
#define MROUTE_EXTRACT_SUCCEEDED
Definition mroute.h:38
#define MROUTE_EXTRACT_MCAST
Definition mroute.h:40
static unsigned int mroute_extract_addr_from_packet(struct mroute_addr *src, struct mroute_addr *dest, uint16_t vid, const struct buffer *buf, int tunnel_type)
Definition mroute.h:183
#define MR_WITH_NETBITS
Definition mroute.h:70
#define MR_WITH_PROTO
Definition mroute.h:76
static void mroute_extract_in_addr_t(struct mroute_addr *dest, const in_addr_t src)
Definition mroute.h:244
#define MR_ADDR_IPV4
Definition mroute.h:62
#define MR_ONLINK_DCO_ADDR
Definition mroute.h:79
static bool mroute_addr_equal(const struct mroute_addr *a1, const struct mroute_addr *a2)
Definition mroute.h:209
#define MAPF_SHOW_FAMILY
Definition mroute.h:158
#define MROUTE_EXTRACT_BCAST
Definition mroute.h:39
#define MR_ADDR_IPV6
Definition mroute.h:63
#define MR_ADDR_MASK
Definition mroute.h:64
bool multi_tcp_instance_specific_init(const struct multi_context *m, struct multi_instance *mi)
Definition mtcp.c:70
void multi_tcp_instance_specific_free(struct multi_instance *mi)
Definition mtcp.c:92
void multi_tcp_delete_event(struct multi_io *multi_io, event_t event)
Definition mtcp.c:98
void multi_tcp_dereference_instance(struct multi_io *multi_io, struct multi_instance *mi)
Definition mtcp.c:107
#define BUF_SIZE(f)
Definition mtu.h:188
static const char * np(const char *str)
Definition multi-auth.c:146
static struct multi_instance * multi_learn_addr(struct multi_context *m, struct multi_instance *mi, const struct mroute_addr *addr, const unsigned int flags)
Definition multi.c:1034
static void multi_schedule_context_wakeup(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:3003
bool multi_check_push_ifconfig_ipv6_extra_route(const struct options *o, const struct in6_addr *dest)
Determines if the ifconfig_ipv6_local address falls into the range of the local IP addresses of the V...
Definition multi.c:4573
static void multi_client_connect_early_setup(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:2457
static enum client_connect_return multi_client_connect_real_addr(struct multi_context *m, struct multi_instance *mi, bool deferred, uint64_t *option_types_found)
This sets up the client real address (outer tunnel addr) in the hash map for data channel packet look...
Definition multi.c:2494
static void multi_reap_free(struct multi_reap *mr)
Definition multi.c:217
static bool ccs_gen_deferred_ret_file(struct multi_instance *mi)
Create a temporary file for the return value of client connect and puts it into the client_connect_de...
Definition multi.c:1919
static void multi_process_float(struct multi_context *m, struct multi_instance *mi, struct link_socket *sock)
Handles peer floating.
Definition multi.c:3228
static void multi_reap_range(const struct multi_context *m, uint32_t start_bucket, uint32_t end_bucket)
Definition multi.c:163
struct multi_instance * multi_create_instance(struct multi_context *m, const struct mroute_addr *real, struct link_socket *sock)
Definition multi.c:726
static void multi_add_iroutes(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:1296
void multi_ifconfig_pool_persist(struct multi_context *m, bool force)
Definition multi.c:152
static enum client_connect_return multi_client_connect_compress_migrate(struct multi_context *m, struct multi_instance *mi, bool deferred, uint64_t *option_types_found)
Do the necessary modification for doing the compress migrate.
Definition multi.c:2529
static void multi_top_free(struct multi_context *m)
Definition multi.c:3880
static void multi_unlearn_addr(struct multi_context *m, const struct multi_instance *mi, const struct mroute_addr *addr)
Definition multi.c:4406
static void multi_signal_instance(struct multi_context *m, struct multi_instance *mi, const int sig)
Definition multi.c:3298
void multi_reap_process_dowork(const struct multi_context *m)
Definition multi.c:204
static bool override_locked_username(struct multi_instance *mi)
Overrides the locked username with the username of –override-username.
Definition multi.c:2631
static int management_callback_n_clients(void *arg)
Definition multi.c:3966
static bool multi_check_dest_addr_allowed(struct multi_context *m, struct multi_instance *mi, const struct mroute_addr *real)
This methods checks if a client instance is allowed to use an address.
Definition multi.c:3146
bool multi_process_signal(struct multi_context *m)
Definition multi.c:3926
static void multi_select_virtual_addr(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:1427
static void multi_get_timeout(struct multi_context *multi, struct timeval *timeval)
Determines the earliest wakeup interval based on periodic operations.
Definition multi.c:4295
void multi_close_instance_on_signal(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:3286
bool multi_process_post(struct multi_context *m, struct multi_instance *mi, const unsigned int flags)
Perform postprocessing of a VPN tunnel instance.
Definition multi.c:3045
static void multi_unlearn_in6_addr(struct multi_context *m, const struct multi_instance *mi, struct in6_addr a6)
Definition multi.c:4459
static void multi_delete_dup(struct multi_context *m, const struct multi_instance *new_mi)
Definition multi.c:1343
static void multi_connection_established(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:2706
void multi_process_per_second_timers_dowork(struct multi_context *m)
Definition multi.c:3844
static void multi_set_virtual_addr_env(struct multi_instance *mi)
Definition multi.c:1568
static void multi_client_connect_setenv(struct multi_instance *mi)
Definition multi.c:1712
struct multi_instance * multi_get_queue(struct mbuf_set *ms)
Definition multi.c:3718
static void setenv_stats(struct context *c)
Definition multi.c:515
bool multi_process_timeout(struct multi_context *m, const unsigned int mpp_flags)
Definition multi.c:3754
static int management_callback_kill_by_cn(void *arg, const char *del_cn)
Definition multi.c:3973
static void multi_client_disconnect_script(struct multi_instance *mi)
Definition multi.c:535
static bool stale_route_check_trigger(struct multi_context *m)
Definition multi.c:3833
struct multi_instance * lookup_by_cid(struct multi_context *m, const unsigned long cid)
Definition multi.c:4033
static bool management_kill_by_cid(void *arg, const unsigned long cid, const char *kill_msg)
Definition multi.c:4047
static enum client_connect_return multi_client_connect_call_script(struct multi_context *m, struct multi_instance *mi, bool deferred, uint64_t *option_types_found)
Runs the –client-connect script if one is defined.
Definition multi.c:2230
static void multi_init(struct context *t)
Definition multi.c:271
static void generate_prefix(struct multi_instance *mi)
Definition multi.c:459
static void multi_del_iroutes(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:488
static enum client_connect_return multi_client_connect_call_plugin_v1(struct multi_context *m, struct multi_instance *mi, bool deferred, uint64_t *option_types_found)
Definition multi.c:2050
enum client_connect_return(* multi_client_connect_handler)(struct multi_context *m, struct multi_instance *mi, bool from_deferred, uint64_t *option_types_found)
Definition multi.c:2611
static void management_delete_event(void *arg, event_t event)
Definition multi.c:4023
static uint64_t cid_hash_function(const void *key, const uint8_t hash_key[HASH_KEY_LEN])
Definition multi.c:234
enum client_connect_return multi_client_connect_mda(struct multi_context *m, struct multi_instance *mi, bool deferred, uint64_t *option_types_found)
Definition multi.c:1679
static bool management_client_acc_msg(void *arg, const unsigned long cid, const unsigned int mda_key_id, struct buffer_list *input)
Definition multi.c:4180
static const char * calculate_app_control_extra(struct multi_instance *mi, struct gc_arena *gc)
Definition multi.c:4082
static void multi_uninit(struct multi_context *m)
Definition multi.c:675
const char * multi_instance_string(const struct multi_instance *mi, bool null, struct gc_arena *gc)
Definition multi.c:426
static unsigned int compute_wakeup_sigma(const struct timeval *delta)
Definition multi.c:2979
static bool learn_address_script(const struct multi_context *m, const struct multi_instance *mi, const char *op, const struct mroute_addr *addr)
Definition multi.c:85
static void multi_unicast(struct multi_context *m, const struct buffer *buf, struct multi_instance *mi)
Definition multi.c:2921
static void multi_client_connect_post(struct multi_context *m, struct multi_instance *mi, const char *dc_file, uint64_t *option_types_found)
Definition multi.c:1614
void multi_close_instance(struct multi_context *m, struct multi_instance *mi, bool shutdown)
Definition multi.c:566
static bool management_client_pending_auth(void *arg, const unsigned long cid, const unsigned int mda_key_id, const char *extra, unsigned int timeout)
Definition multi.c:4102
static void multi_push_restart_schedule_exit(struct multi_context *m, bool next_server)
Definition multi.c:3893
static void multi_top_init(struct context *top)
Definition multi.c:3873
static struct tls_session * lookup_session_by_mda_key_id(struct tls_multi *multi, const unsigned int mda_key_id)
Definition multi.c:4064
static bool ccs_gen_config_file(struct multi_instance *mi)
Create a temporary file for the config directives of the client connect script and puts it into the c...
Definition multi.c:2024
static enum client_connect_return multi_client_connect_call_plugin_v2(struct multi_context *m, struct multi_instance *mi, bool deferred, uint64_t *option_types_found)
Definition multi.c:2140
static void check_stale_routes(struct multi_context *m)
Definition multi.c:1377
bool multi_check_push_ifconfig_extra_route(const struct options *o, in_addr_t dest)
Determines if the ifconfig_push_local address falls into the range of the local IP addresses of the V...
Definition multi.c:4553
static void multi_process_incoming_link_data(struct multi_context *m, bool floated, struct link_socket *sock)
Process incoming data packet from clients.
Definition multi.c:3417
static bool management_client_auth(void *arg, const unsigned long cid, const unsigned int mda_key_id, const bool auth, const char *reason, const char *client_reason, struct buffer_list *cc_config)
Definition multi.c:4142
static void multi_client_connect_late_setup(struct multi_context *m, struct multi_instance *mi, const uint64_t option_types_found)
Definition multi.c:2334
static void multi_bcast(struct multi_context *m, const struct buffer *buf, const struct multi_instance *sender_instance, uint16_t vid)
Definition multi.c:2938
static int management_callback_kill_by_addr(void *arg, const in_addr_t addr, const uint16_t port, const uint8_t proto)
Definition multi.c:3995
static void multi_reap_all(const struct multi_context *m)
Definition multi.c:187
static void multi_unlearn_in_addr_t(struct multi_context *m, const struct multi_instance *mi, in_addr_t a)
Definition multi.c:4441
static void multi_print_status(struct multi_context *m, struct status_output *so, const int version)
Definition multi.c:810
void route_quota_exceeded(const struct multi_instance *mi)
Definition multi.c:3787
void ungenerate_prefix(struct multi_instance *mi)
Definition multi.c:476
void multi_assign_peer_id(struct multi_context *m, struct multi_instance *mi)
Assigns a peer-id to a a client and adds the instance to the the instances array of the multi_context...
Definition multi.c:4256
static struct multi_reap * multi_reap_new(uint32_t buckets_per_pass)
Definition multi.c:193
static struct multi_instance * multi_get_instance_by_virtual_addr(struct multi_context *m, const struct mroute_addr *addr, bool cidr_routing)
Definition multi.c:1123
void init_management_callback_multi(struct multi_context *m)
Definition multi.c:4228
static void multi_add_mbuf(struct multi_context *m, struct multi_instance *mi, struct mbuf_buffer *mb)
Definition multi.c:2902
static enum client_connect_return ccs_test_deferred_ret_file(struct multi_instance *mi)
Tests whether the deferred return value file exists and returns the contained return value.
Definition multi.c:1951
static void multi_client_connect_post_plugin(struct multi_context *m, struct multi_instance *mi, const struct plugin_return *pr, uint64_t *option_types_found)
Definition multi.c:1640
static uint32_t reap_buckets_per_pass(uint32_t n_buckets)
Definition multi.c:226
static char * management_get_peer_info(void *arg, const unsigned long cid)
Definition multi.c:4210
static bool multi_client_set_protocol_options(struct context *c)
Calculates the options that depend on the client capabilities based on local options and available pe...
Definition multi.c:1742
void unlearn_ifconfig_ipv6(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:4485
static struct multi_instance * multi_learn_in_addr_t(struct multi_context *m, struct multi_instance *mi, in_addr_t a, int netbits, bool primary)
Definition multi.c:1198
static bool is_exit_restart(int sig)
Definition multi.c:3887
static bool ifconfig_push_constraint_satisfied(const struct context *c)
Definition multi.c:1407
static void set_cc_config(struct multi_instance *mi, struct buffer_list *cc_config)
Definition multi.c:77
static bool cid_compare_function(const void *key1, const void *key2)
Definition multi.c:241
static void multi_client_disconnect_setenv(struct multi_instance *mi)
Definition multi.c:522
void unlearn_ifconfig(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:4473
void update_vhash(struct multi_context *m, struct multi_instance *mi, const char *new_ip, const char *new_ipv6)
Update the vhash with new IP/IPv6 addresses in the multi_context when a push-update message containin...
Definition multi.c:4507
static bool multi_client_generate_tls_keys(struct context *c)
Generates the data channel keys.
Definition multi.c:2311
static enum client_connect_return multi_client_connect_source_ccd(struct multi_context *m, struct multi_instance *mi, bool deferred, uint64_t *option_types_found)
Try to source a dynamic config file from the –client-config-dir directory.
Definition multi.c:2561
static struct multi_instance * multi_learn_in6_addr(struct multi_context *m, struct multi_instance *mi, struct in6_addr a6, int netbits, bool primary)
Definition multi.c:1244
static bool multi_client_setup_dco_initial(const struct multi_context *m, struct multi_instance *mi, struct gc_arena *gc)
Definition multi.c:2288
static void management_callback_status(void *arg, const int version, struct status_output *so)
Definition multi.c:3951
static void ccs_delete_config_file(struct multi_instance *mi)
Deletes the temporary file for the config directives of the client connect script and removes it into...
Definition multi.c:2001
static void ccs_delete_deferred_ret_file(struct multi_instance *mi)
Delete the temporary file for the return value of client connect It also removes it from client_conne...
Definition multi.c:1894
static const multi_client_connect_handler client_connect_handlers[]
Definition multi.c:2615
static enum client_connect_return multi_client_connect_script_deferred(struct multi_context *m, struct multi_instance *mi, uint64_t *option_types_found)
Definition multi.c:2189
Header file for server-mode related structures and functions.
client_connect_return
Return values used by the client connect call-back functions.
Definition multi.h:237
@ CC_RET_DEFERRED
Definition multi.h:240
@ CC_RET_FAILED
Definition multi.h:238
@ CC_RET_SKIPPED
Definition multi.h:241
@ CC_RET_SUCCEEDED
Definition multi.h:239
static bool multi_output_queue_ready(const struct multi_context *m, const struct multi_instance *mi)
Definition multi.h:400
#define MULTI_PREFIX_MAX_LENGTH
Definition multi.h:44
#define MULTI_CHECK_SIG(m)
Definition multi.h:642
#define REAP_MIN
Definition multi.h:542
static void multi_route_del(struct multi_route *route)
Definition multi.h:470
static void multi_reap_process(const struct multi_context *m)
Definition multi.h:556
static void route_quota_inc(struct multi_instance *mi)
Definition multi.h:423
void multi_process_incoming_dco(dco_context_t *dco)
Process an incoming DCO message (from kernel space).
#define MULTI_ROUTE_CACHE
Definition multi.h:252
static void clear_prefix(void)
Definition multi.h:523
static bool multi_route_defined(const struct multi_context *m, const struct multi_route *r)
Definition multi.h:479
#define REAP_DIVISOR
Definition multi.h:541
#define MULTI_CACHE_ROUTE_TTL
Definition multi.h:549
#define MPP_CLOSE_ON_SIGNAL
Definition multi.h:287
static void set_prefix(const struct multi_instance *mi)
Definition multi.h:511
#define REAP_MAX
Definition multi.h:543
static void multi_instance_dec_refcount(struct multi_instance *mi)
Definition multi.h:460
static void multi_instance_inc_refcount(struct multi_instance *mi)
Definition multi.h:454
static void multi_get_timeout_instance(struct multi_context *m, struct timeval *dest)
Definition multi.h:584
#define CLIENT_CONNECT_OPT_MASK
Definition multi.h:609
static void multi_set_pending(struct multi_context *m, struct multi_instance *mi)
Definition multi.h:645
#define MULTI_ROUTE_AGEABLE
Definition multi.h:253
#define MPP_RECORD_TOUCH
Definition multi.h:288
#define MULTI_ROUTE_PERMANENT
Definition multi.h:254
#define MPP_PRE_SELECT
Definition multi.h:286
static void multi_process_per_second_timers(struct multi_context *m)
Definition multi.h:565
static bool route_quota_test(const struct multi_instance *mi)
Definition multi.h:436
struct multi_io * multi_io_init(const int maxclients)
Definition multi_io.c:108
void multi_io_process_io(struct multi_context *m)
Definition multi_io.c:561
void multi_io_free(struct multi_io *multi_io)
Definition multi_io.c:125
int multi_io_wait(struct multi_context *m)
Definition multi_io.c:166
void multi_io_action(struct multi_context *m, struct multi_instance *mi, int action, bool poll)
Definition multi_io.c:686
#define TA_TIMEOUT
Definition multi_io.h:45
#define CLEAR(x)
Definition basic.h:32
#define M_OPTERR
Definition error.h:101
#define M_CLIENT
Definition error.h:108
static bool check_debug_level(msglvl_t level)
Definition error.h:253
#define M_USAGE
Definition error.h:107
#define M_NONFATAL
Definition error.h:91
#define dmsg(flags,...)
Definition error.h:164
#define msg(flags,...)
Definition error.h:152
unsigned int msglvl_t
Definition error.h:77
#define ASSERT(x)
Definition error.h:221
#define M_WARN
Definition error.h:92
#define M_ERRNO
Definition error.h:95
static bool is_cas_pending(enum multi_status cas)
Definition openvpn.h:210
#define MAX_PEER_ID
Definition openvpn.h:552
#define CM_TOP
Definition openvpn.h:480
const char title_string[]
Definition options.c:75
bool has_udp_in_local_list(const struct options *options)
Definition options.c:7979
#define MODE_SERVER
Definition options.h:265
static bool dco_enabled(const struct options *o)
Returns whether the current configuration has dco enabled.
Definition options.h:987
void options_string_import(struct options *options, const char *config, const msglvl_t msglevel, const uint64_t permission_mask, uint64_t *option_types_found, struct env_set *es)
#define OPT_P_COMP
Definition options.h:755
void options_server_import(struct options *o, const char *filename, msglvl_t msglevel, uint64_t permission_mask, uint64_t *option_types_found, struct env_set *es)
const char * time_string(time_t t, tv_usec_t usec, bool show_usec, struct gc_arena *gc)
Definition otime.c:104
struct frequency_limit * frequency_limit_init(int max, int per)
Definition otime.c:137
time_t now
Definition otime.c:33
void frequency_limit_free(struct frequency_limit *f)
Definition otime.c:152
static int openvpn_gettimeofday(struct timeval *tv, void *tz)
Definition otime.h:71
static void tv_add(struct timeval *dest, const struct timeval *src)
Definition otime.h:129
@ OVPN_DEL_PEER_REASON_EXPIRED
@ OVPN_DEL_PEER_REASON_TRANSPORT_DISCONNECT
@ OVPN_DEL_PEER_REASON_TRANSPORT_ERROR
@ OVPN_DEL_PEER_REASON_USERSPACE
@ OVPN_CMD_FLOAT_PEER
@ OVPN_CMD_SWAP_KEYS
@ OVPN_CMD_DEL_PEER
bool platform_test_file(const char *filename)
Return true if filename can be opened for read.
Definition platform.c:681
const char * platform_create_temp_file(const char *directory, const char *prefix, struct gc_arena *gc)
Create a temporary file in directory, returns the filename of the created file.
Definition platform.c:540
const char * platform_gen_path(const char *directory, const char *filename, struct gc_arena *gc)
Put a directory and filename together.
Definition platform.c:617
bool platform_unlink(const char *filename)
Definition platform.c:487
void plugin_return_free(struct plugin_return *pr)
Definition plugin.c:992
void plugin_return_get_column(const struct plugin_return *src, struct plugin_return *dest, const char *colname)
Definition plugin.c:978
bool plugin_defined(const struct plugin_list *pl, const int type)
Definition plugin.c:910
static void plugin_return_init(struct plugin_return *pr)
Definition plugin.h:163
static int plugin_call(const struct plugin_list *pl, const int type, const struct argv *av, struct plugin_return *pr, struct env_set *es)
Definition plugin.h:195
static bool plugin_return_defined(const struct plugin_return *pr)
Definition plugin.h:157
ifconfig_pool_handle ifconfig_pool_acquire(struct ifconfig_pool *pool, in_addr_t *local, in_addr_t *remote, struct in6_addr *remote_ipv6, const char *common_name)
Definition pool.c:298
bool ifconfig_pool_release(struct ifconfig_pool *pool, ifconfig_pool_handle hand, const bool hard)
Definition pool.c:350
void ifconfig_pool_write(struct ifconfig_pool_persist *persist, const struct ifconfig_pool *pool)
Definition pool.c:712
bool ifconfig_pool_write_trigger(struct ifconfig_pool_persist *persist)
Definition pool.c:573
void ifconfig_pool_free(struct ifconfig_pool *pool)
Definition pool.c:282
void ifconfig_pool_read(struct ifconfig_pool_persist *persist, struct ifconfig_pool *pool)
Definition pool.c:586
struct ifconfig_pool * ifconfig_pool_init(const bool ipv4_pool, enum pool_type type, in_addr_t start, in_addr_t end, const bool duplicate_cn, const bool ipv6_pool, const struct in6_addr ipv6_base, const int ipv6_netbits)
Definition pool.c:141
pool_type
Definition pool.h:35
@ IFCONFIG_POOL_30NET
Definition pool.h:36
@ IFCONFIG_POOL_INDIV
Definition pool.h:37
#define DEV_TYPE_TAP
Definition proto.h:36
#define DEV_TYPE_UNDEF
Definition proto.h:34
#define TOP_NET30
Definition proto.h:41
#define DEV_TYPE_TUN
Definition proto.h:35
#define TOP_P2P
Definition proto.h:42
#define TOP_SUBNET
Definition proto.h:43
int process_incoming_push_request(struct context *c)
Definition push.c:1044
bool send_auth_pending_messages(const struct tls_multi *tls_multi, struct tls_session *session, const char *extra, unsigned int timeout)
Sends the auth pending control messages to a client.
Definition push.c:490
void push_option(struct options *o, const char *opt, msglvl_t msglevel)
Definition push.c:954
void send_restart(struct context *c, const char *kill_msg)
Definition push.c:550
void remove_iroutes_from_push_route_list(struct options *o)
Definition push.c:1205
bool management_callback_send_push_update_by_cid(void *arg, unsigned long cid, const char *options)
Definition push_util.c:367
bool management_callback_send_push_update_broadcast(void *arg, const char *options)
Definition push_util.c:359
void initial_rate_limit_free(struct initial_packet_rate_limit *irl)
free the initial-packet rate limiter structure
struct initial_packet_rate_limit * initial_rate_limit_init(int max_per_period, int period_length)
allocate and initialize the initial-packet rate limiter structure
bool ipv6_net_contains_host(const struct in6_addr *network, unsigned int bits, const struct in6_addr *host)
check whether an IPv6 host address is covered by a given network/bits
Definition route.c:706
static int openvpn_run_script(const struct argv *a, const struct env_set *es, const unsigned int flags, const char *hook)
Will run a script and return the exit code of the script if between 0 and 255, -1 otherwise.
Definition run_command.h:89
void schedule_remove_entry(struct schedule *s, struct schedule_entry *e)
Definition schedule.c:388
struct schedule * schedule_init(void)
Definition schedule.c:373
void schedule_free(struct schedule *s)
Definition schedule.c:382
static void schedule_add_entry(struct schedule *s, struct schedule_entry *e, const struct timeval *tv, unsigned int sigma)
Add a struct schedule_entry to the scheduler btree or update an existing entry with a new wakeup time...
Definition schedule.h:98
static bool session_id_defined(const struct session_id *sid1)
Definition session_id.h:53
static uint64_t session_id_hash_function(const void *key, const uint8_t hash_key[HASH_KEY_LEN])
Definition sid_hash.h:81
static bool session_id_hash_equal(const void *sid1, const void *sid2)
Definition sid_hash.h:89
static bool multi_hash_sid_remove(struct multi_context *m, const struct session_id *sid)
Definition sid_hash.h:59
int signal_reset(struct signal_info *si, int signum)
Clear the signal if its current value equals signum.
Definition sig.c:262
void remap_signal(struct context *c)
Definition sig.c:588
void throw_signal(const int signum)
Throw a hard signal.
Definition sig.c:175
void print_signal(const struct signal_info *si, const char *title, msglvl_t msglevel)
Definition sig.c:290
void register_signal(struct signal_info *si, int signum, const char *signal_text)
Register a soft signal in the signal_info struct si respecting priority.
Definition sig.c:228
#define IS_SIG(c)
Definition sig.h:47
void setenv_trusted(struct env_set *es, const struct link_socket_info *info)
Definition socket.c:1496
void setenv_in_addr_t(struct env_set *es, const char *name_prefix, in_addr_t addr, const unsigned int flags)
void setenv_in6_addr(struct env_set *es, const char *name_prefix, const struct in6_addr *addr, const unsigned int flags)
const char * print_in6_addr(struct in6_addr a6, unsigned int flags, struct gc_arena *gc)
const char * print_in_addr_t(in_addr_t addr, unsigned int flags, struct gc_arena *gc)
#define IA_EMPTY_IF_UNDEF
Definition socket_util.h:89
static bool proto_is_tcp(int proto)
returns if the proto is a TCP variant (tcp-server, tcp-client or tcp)
static bool proto_is_dgram(int proto)
Return if the protocol is datagram (UDP).
#define SA_SET_IF_NONZERO
void tls_update_remote_addr(struct tls_multi *multi, const struct link_socket_actual *addr)
Updates remote address in TLS sessions.
Definition ssl.c:4285
bool tls_session_update_crypto_params(struct tls_multi *multi, struct tls_session *session, struct options *options, struct frame *frame, struct frame *frame_fragment, const struct link_socket_info *lsi, dco_context_t *dco)
Update TLS session crypto parameters (cipher and auth) and derive data channel keys based on the supp...
Definition ssl.c:1708
void tls_session_soft_reset(struct tls_multi *tls_multi)
Definition ssl.c:1836
#define IV_PROTO_CC_EXIT_NOTIFY
Support for explicit exit notify via control channel This also includes support for the protocol-flag...
Definition ssl.h:102
#define IV_PROTO_DATA_EPOCH
Support the extended packet id and epoch format for data channel packets.
Definition ssl.h:111
#define IV_PROTO_DATA_V2
Support P_DATA_V2.
Definition ssl.h:80
#define IV_PROTO_TLS_KEY_EXPORT
Supports key derivation via TLS key material exporter [RFC5705].
Definition ssl.h:87
#define IV_PROTO_DYN_TLS_CRYPT
Support to dynamic tls-crypt (renegotiation with TLS-EKM derived tls-crypt key).
Definition ssl.h:108
#define IV_PROTO_REQUEST_PUSH
Assume client will send a push request and server does not need to wait for a push-request to send a ...
Definition ssl.h:84
#define IV_PROTO_NCP_P2P
Support doing NCP in P2P mode.
Definition ssl.h:95
@ CAS_CONNECT_DONE
Definition ssl_common.h:601
@ CAS_PENDING_DEFERRED
Waiting on an async option import handler.
Definition ssl_common.h:591
@ CAS_WAITING_AUTH
Initial TLS connection established but deferred auth is not yet finished.
Definition ssl_common.h:589
@ CAS_PENDING_DEFERRED_PARTIAL
at least handler succeeded but another is still pending
Definition ssl_common.h:592
@ CAS_PENDING
Options import (Connect script/plugin, ccd,...).
Definition ssl_common.h:590
@ CAS_NOT_CONNECTED
Definition ssl_common.h:588
@ CAS_FAILED
Option import failed or explicitly denied the client.
Definition ssl_common.h:593
@ KS_AUTH_FALSE
Key state is not authenticated.
Definition ssl_common.h:154
@ KS_AUTH_DEFERRED
Key state authentication is being deferred, by async auth.
Definition ssl_common.h:155
static const struct key_state * get_primary_key(const struct tls_multi *multi)
gets an item of key_state objects in the order they should be scanned by data channel modules.
Definition ssl_common.h:771
#define SSLF_USERNAME_AS_COMMON_NAME
Definition ssl_common.h:430
char * ncp_get_best_cipher(const char *server_list, const char *peer_info, const char *remote_cipher, struct gc_arena *gc)
Iterates through the ciphers in server_list and return the first cipher that is also supported by the...
Definition ssl_ncp.c:238
const char * tls_peer_ncp_list(const char *peer_info, struct gc_arena *gc)
Returns the support cipher list from the peer according to the IV_NCP and IV_CIPHER values in peer_in...
Definition ssl_ncp.c:217
const char * ncp_expanded_ciphers(struct options *o, struct gc_arena *gc)
returns the o->ncp_ciphers in brackets, e.g.
Definition ssl_ncp.c:628
Control Channel SSL/Data dynamic negotiation Module This file is split from ssl.h to be able to unit ...
SSL utility functions.
static unsigned int extract_iv_proto(const char *peer_info)
Extracts the IV_PROTO variable and returns its value or 0 if it cannot be extracted.
Definition ssl_util.h:77
bool ssl_verify_username_length(const struct tls_session *session, const char *username)
Checks if the username length is valid to use.
bool tls_authenticate_key(struct tls_multi *multi, const unsigned int mda_key_id, const bool auth, const char *client_reason)
bool cert_hash_compare(const struct cert_hash_set *chs1, const struct cert_hash_set *chs2)
Compares certificates hashes, returns true if hashes are equal.
Definition ssl_verify.c:229
void tls_lock_cert_hash_set(struct tls_multi *multi)
Locks the certificate hash set used in the given tunnel.
Definition ssl_verify.c:286
void tls_lock_common_name(struct tls_multi *multi)
Locks the common name field for the given tunnel.
Definition ssl_verify.c:132
const char * tls_username(const struct tls_multi *multi, const bool null)
Returns the username field for the given tunnel.
Definition ssl_verify.c:172
void set_common_name(struct tls_session *session, const char *common_name)
Sets the common name field for the given tunnel.
Definition ssl_verify.c:85
void auth_set_client_reason(struct tls_multi *multi, const char *client_reason)
Sets the reason why authentication of a client failed.
Definition ssl_verify.c:812
const char * tls_common_name(const struct tls_multi *multi, const bool null)
Returns the common name field for the given tunnel.
Definition ssl_verify.c:107
Control Channel Verification Module.
void status_reset(const struct status_output *so)
Definition status.c:138
bool status_trigger(struct status_output *so)
Definition status.c:123
void status_printf(struct status_output *so, const char *format,...)
Definition status.c:212
struct status_output * status_open(const char *filename, const int refresh_freq, const int msglevel, const struct virtual_output *vout, const unsigned int flags)
Definition status.c:59
void status_flush(struct status_output *so)
Definition status.c:147
bool status_close(struct status_output *so)
Definition status.c:178
Definition argv.h:35
One node in a buffer_list linked list.
Definition buffer.h:2152
struct buffer_entry * next
Pointer to the next node, or NULL.
Definition buffer.h:2154
struct buffer buf
The buffer stored in this list node.
Definition buffer.h:2153
A singly-linked list of buffers, with head/tail pointers for O(1) push.
Definition buffer.h:2159
struct buffer_entry * head
Next item to pop/peek.
Definition buffer.h:2160
Wrapper structure for dynamically allocated memory.
Definition buffer.h:71
uint8_t * data
Pointer to the allocated memory.
Definition buffer.h:78
int len
Length in bytes of the actual content within the allocated memory.
Definition buffer.h:76
Detached client connection state.
Definition multi.h:71
uint64_t option_types_found
Definition multi.h:76
char * config_file
The temporary file name that contains the config directives returned by the client-connect script.
Definition multi.h:88
char * deferred_ret_file
The temporary file name that contains the return status of the client-connect script if it exits with...
Definition multi.h:82
unsigned int flags
Definition comp.h:77
int explicit_exit_notification
Definition options.h:152
int fragment
Definition options.h:143
struct ifconfig_pool_persist * ifconfig_pool_persist
Definition openvpn.h:198
struct status_output * status_output
Definition openvpn.h:186
struct tuntap * tuntap
Tun/tap virtual network interface.
Definition openvpn.h:173
bool push_request_received
Definition openvpn.h:424
counter_type link_read_bytes
Definition openvpn.h:267
counter_type link_write_bytes
Definition openvpn.h:270
bool push_ifconfig_ipv6_defined
Definition openvpn.h:431
struct fragment_master * fragment
Definition openvpn.h:253
bool push_ifconfig_defined
Definition openvpn.h:425
counter_type dco_read_bytes
Definition openvpn.h:268
struct man_def_auth_context mda_context
Definition openvpn.h:450
counter_type dco_write_bytes
Definition openvpn.h:271
struct env_set * es
Definition openvpn.h:420
struct tls_multi * tls_multi
TLS state structure for this VPN tunnel.
Definition openvpn.h:324
struct frame frame
Definition openvpn.h:249
struct in6_addr push_ifconfig_ipv6_remote
Definition openvpn.h:434
struct link_socket_actual from
Definition openvpn.h:246
struct frame frame_fragment
Definition openvpn.h:254
int push_ifconfig_ipv6_netbits
Definition openvpn.h:433
struct buffer to_link
Definition openvpn.h:377
struct buffer to_tun
Definition openvpn.h:376
struct in6_addr push_ifconfig_ipv6_local
Definition openvpn.h:432
struct link_socket ** link_sockets
Definition openvpn.h:238
in_addr_t push_ifconfig_local_alias
Definition openvpn.h:429
struct link_socket_info ** link_socket_infos
Definition openvpn.h:239
struct link_socket_actual * to_link_addr
Definition openvpn.h:245
in_addr_t push_ifconfig_remote_netmask
Definition openvpn.h:428
struct buffer buf
Definition openvpn.h:375
struct timeval timeval
Time to next event of timers and similar.
Definition openvpn.h:396
struct event_set * event_set
Definition openvpn.h:231
struct context_buffers * buffers
Definition openvpn.h:367
in_addr_t push_ifconfig_local
Definition openvpn.h:427
Contains all state information for one tunnel.
Definition openvpn.h:471
int mode
Role of this context within the OpenVPN process.
Definition openvpn.h:484
struct multi_context * multi
Pointer to the main P2MP context.
Definition openvpn.h:489
bool did_dco_iroutes
Whether DCO iroutes have been installed.
Definition openvpn.h:510
struct signal_info * sig
Internal error signaling object.
Definition openvpn.h:500
openvpn_net_ctx_t net_ctx
Networking API opaque context.
Definition openvpn.h:498
struct plugin_list * plugins
List of plug-ins.
Definition openvpn.h:502
struct context_2 c2
Level 2 context.
Definition openvpn.h:516
struct env_set * es
Set of environment variables.
Definition openvpn.h:496
struct options options
Options loaded from command line or configuration file.
Definition openvpn.h:472
struct context_1 c1
Level 1 context.
Definition openvpn.h:515
Security parameter state for processing data channel packets.
Definition crypto.h:293
struct key_ctx_bi key_ctx_bi
OpenSSL cipher and HMAC contexts for both sending and receiving directions.
Definition crypto.h:294
int signal_received
Definition multi.h:62
struct timeval wakeup
Definition multi.h:63
union event_arg::@352313260244035237115140212234220346176163201310 u
struct multi_instance * mi
Definition event.h:144
event_arg_t type
Definition event.h:141
struct buffer outgoing
Buffer containing the remaining parts of the fragmented packet being sent.
Definition fragment.h:172
Packet geometry parameters.
Definition mtu.h:113
struct frame::@074234134026241341315172337061247271261307273127 buf
int payload_size
the maximum size that a payload that our buffers can hold from either tun device or network link.
Definition mtu.h:118
int headroom
the headroom in the buffer, this is choosen to allow all potential header to be added before the pack...
Definition mtu.h:124
Garbage collection arena used to keep track of dynamically allocated memory.
Definition buffer.h:127
void * value
Definition list.h:41
const void * key
Definition list.h:42
Definition list.h:56
struct iroute_ipv6 * next
Definition route.h:271
unsigned int netbits
Definition route.h:270
struct in6_addr network
Definition route.h:269
in_addr_t network
Definition route.h:262
int netbits
Definition route.h:263
struct iroute * next
Definition route.h:264
Container for bidirectional cipher and HMAC key material.
Definition crypto.h:240
bool initialized
Definition crypto.h:285
Security parameter state of one TLS and data channel key session.
Definition ssl_common.h:208
struct auth_deferred_status plugin_auth
Definition ssl_common.h:268
unsigned int mda_key_id
Definition ssl_common.h:263
struct auth_deferred_status script_auth
Definition ssl_common.h:269
enum ks_auth_state authenticated
Definition ssl_common.h:259
Container for unidirectional cipher and HMAC key material.
Definition crypto.h:152
unsigned long cid
Definition manage.h:64
bool(* client_acc_msg)(void *arg, const unsigned long cid, const unsigned int mda_key_id, struct buffer_list *msg)
Definition manage.h:193
char *(* get_peer_info)(void *arg, const unsigned long cid)
Definition manage.h:192
bool(* client_auth)(void *arg, const unsigned long cid, const unsigned int mda_key_id, const bool auth, const char *reason, const char *client_reason, struct buffer_list *cc_config)
Definition manage.h:187
int(* kill_by_addr)(void *arg, const in_addr_t addr, const uint16_t port, const uint8_t proto)
Definition manage.h:181
void(* delete_event)(void *arg, event_t event)
Definition manage.h:182
bool(* push_update_broadcast)(void *arg, const char *options)
Definition manage.h:206
bool(* push_update_by_cid)(void *arg, unsigned long cid, const char *options)
Definition manage.h:207
bool(* client_pending_auth)(void *arg, const unsigned long cid, const unsigned int kid, const char *extra, unsigned int timeout)
Definition manage.h:190
int(* n_clients)(void *arg)
Definition manage.h:183
void(* status)(void *arg, const int version, struct status_output *so)
Definition manage.h:178
void(* show_net)(void *arg, const msglvl_t msglevel)
Definition manage.h:179
unsigned int flags
Definition manage.h:176
int(* kill_by_cn)(void *arg, const char *common_name)
Definition manage.h:180
bool(* kill_by_cid)(void *arg, const unsigned long cid, const char *kill_msg)
Definition manage.h:185
unsigned int flags
Definition mbuf.h:48
struct buffer buf
Definition mbuf.h:44
struct mbuf_buffer * buffer
Definition mbuf.h:53
struct multi_instance * instance
Definition mbuf.h:54
uint16_t vid
Definition mroute.h:94
uint8_t addr[OPENVPN_ETH_ALEN]
Definition mroute.h:93
uint8_t proto
Definition mroute.h:84
uint8_t type
Definition mroute.h:85
struct mroute_addr::@201361377123046052363312040316220023015150251140::@324142022017217332104337017226063207330251301017 v6
in_port_t port
Definition mroute.h:99
uint8_t len
Definition mroute.h:83
struct mroute_addr::@201361377123046052363312040316220023015150251140::@363302133323255313212060077174173034011260361234 v4
uint8_t netbits
Definition mroute.h:86
unsigned int cache_generation
Definition mroute.h:133
uint8_t net_len[MR_HELPER_NET_LEN]
Definition mroute.h:136
int n_net_len
Definition mroute.h:135
Main OpenVPN server state structure.
Definition multi.h:170
int n_clients
Definition multi.h:204
struct mroute_addr local
Definition multi.h:199
struct schedule * schedule
Definition multi.h:189
uint32_t assigned_peer_ids
Number of peer-ids that are currently assigned.
Definition multi.h:177
struct mbuf_set * mbuf
Set of buffers for passing data channel packets between VPN tunnel instances.
Definition multi.h:190
struct initial_packet_rate_limit * initial_rate_limiter
Definition multi.h:196
struct deferred_signal_schedule_entry deferred_shutdown_signal
Definition multi.h:230
uint32_t max_peerid
highest currently allocated peer-id and maximum allocated/valid index in instances
Definition multi.h:174
struct multi_reap * reaper
Definition multi.h:198
struct multi_io * multi_io
I/O state and events tracker.
Definition multi.h:193
struct hash * hash
VPN tunnel instances indexed by real address of the remote peer.
Definition multi.h:179
struct hash * cid_hash
Definition multi.h:207
unsigned long cid_counter
Definition multi.h:208
struct event_timeout stale_routes_check_et
Definition multi.h:223
int tcp_queue_limit
Definition multi.h:202
struct ifconfig_pool * ifconfig_pool
Definition multi.h:194
struct frequency_limit * new_connection_limiter
Definition multi.h:195
uint32_t max_clients
Definition multi.h:201
struct context top
Storage structure for process-wide configuration.
Definition multi.h:217
int status_file_version
Definition multi.h:203
struct multi_instance * pending
Definition multi.h:211
struct hash * vhash
VPN tunnel instances indexed by virtual address of remote hosts.
Definition multi.h:181
struct multi_instance ** instances
Array of multi_instances with the size of max_clients.
Definition multi.h:171
struct multi_instance ** mpp_touched
Definition multi.h:213
bool enable_c2c
Definition multi.h:200
struct hash * sid_hash
TLS sessions indexed by the peer's session id.
Definition multi.h:183
struct multi_instance * earliest_wakeup
Definition multi.h:212
struct mroute_helper * route_helper
Definition multi.h:197
Server-mode state structure for one single VPN tunnel.
Definition multi.h:102
struct buffer_list * cc_config
Definition multi.h:145
struct client_connect_defer_state client_connect_defer_state
Definition multi.h:152
bool did_cid_hash
Definition multi.h:144
time_t created
Time at which a VPN tunnel instance was created.
Definition multi.h:116
in_addr_t reporting_addr
Definition multi.h:131
char msg_prefix[MULTI_PREFIX_MAX_LENGTH]
Definition multi.h:124
struct mroute_addr real
External network address of the remote peer.
Definition multi.h:121
bool did_iroutes
Definition multi.h:147
ifconfig_pool_handle vaddr_handle
Definition multi.h:123
bool did_real_hash
Indicates that the real address/port of the client is hashed in the multi_context m->hash table.
Definition multi.h:136
struct gc_arena gc
Definition multi.h:112
struct in6_addr reporting_addr_ipv6
Definition multi.h:132
struct timeval wakeup
Definition multi.h:120
struct event_arg ev_arg
this struct will store a pointer to either mi or link_socket, depending on the event type,...
Definition multi.h:107
struct context context
The context structure storing state for this VPN tunnel.
Definition multi.h:150
struct session_id sid_hashed_value
If this is multi_instance is hashed in the sid lookup table the session id here is a non-null session...
Definition multi.h:141
int n_clients_delta
Definition multi.h:148
time_t last_call
Definition multi.h:55
uint32_t buckets_per_pass
Definition multi.h:54
uint32_t bucket_base
Definition multi.h:53
struct mroute_addr addr
Definition multi.h:249
time_t last_reference
Definition multi.h:258
unsigned int cache_generation
Definition multi.h:257
unsigned int flags
Definition multi.h:255
struct multi_instance * instance
Definition multi.h:250
union openvpn_sockaddr::@051240265251124304325377241125360350250341115171 addr
struct sockaddr_in in4
Definition socket_util.h:43
struct compress_options comp
Definition options.h:410
uint32_t sid_hash_size
Definition options.h:501
int push_ifconfig_ipv6_netbits
Definition options.h:524
int max_routes_per_client
Definition options.h:537
const char * ncp_ciphers_conf
The original ncp_ciphers specified by the user in the configuration.
Definition options.h:580
int status_file_version
Definition options.h:407
in_addr_t push_ifconfig_constraint_network
Definition options.h:519
const char * tmp_dir
Definition options.h:466
unsigned int imported_protocol_flags
Definition options.h:739
int stale_routes_ageing_time
Definition options.h:539
bool duplicate_cn
Definition options.h:528
uint32_t real_hash_size
Definition options.h:499
bool use_peer_id
Whether the data channel uses the DATA_V2 header (peer-id).
Definition options.h:707
in_addr_t ifconfig_pool_netmask
Definition options.h:491
const char * ifconfig_ipv6_local
Definition options.h:329
int cf_max
Definition options.h:530
const char * dev_type
Definition options.h:323
bool push_ifconfig_defined
Definition options.h:514
bool ifconfig_pool_defined
Definition options.h:488
bool vlan_tagging
Definition options.h:728
in_addr_t ifconfig_pool_end
Definition options.h:490
bool ifconfig_ipv6_pool_defined
Definition options.h:495
uint32_t max_clients
Definition options.h:536
const char * client_disconnect_script
Definition options.h:503
int n_bcast_buf
Definition options.h:510
const char * ifconfig_local
Definition options.h:327
struct connection_entry ce
Definition options.h:294
struct iroute_ipv6 * iroutes_ipv6
Definition options.h:513
in_addr_t push_ifconfig_local_alias
Definition options.h:517
int topology
Definition options.h:326
const char * ncp_ciphers
Definition options.h:581
uint32_t virtual_hash_size
Definition options.h:500
const char * learn_address_script
Definition options.h:504
const char * ciphername
Definition options.h:576
int cf_initial_max
Definition options.h:533
int stale_routes_check_interval
Definition options.h:538
uint16_t vlan_pvid
Definition options.h:730
int mode
Definition options.h:266
int ifconfig_ipv6_pool_netbits
Definition options.h:497
in_addr_t push_ifconfig_constraint_netmask
Definition options.h:520
bool enable_ncp_fallback
If defined fall back to ciphername if NCP fails.
Definition options.h:577
in_addr_t push_ifconfig_local
Definition options.h:515
struct gc_arena gc
Definition options.h:258
bool push_ifconfig_constraint_defined
Definition options.h:518
int cf_initial_per
Definition options.h:534
bool force_key_material_export
Definition options.h:714
struct iroute * iroutes
Definition options.h:512
struct in6_addr push_ifconfig_ipv6_remote
Definition options.h:525
const char * client_connect_script
Definition options.h:502
bool push_ifconfig_ipv6_defined
Definition options.h:522
int tcp_queue_limit
Definition options.h:511
const char * override_username
Definition options.h:509
struct in6_addr push_ifconfig_ipv6_local
Definition options.h:523
const char * ifconfig_remote_netmask
Definition options.h:328
bool enable_c2c
Definition options.h:527
int cf_per
Definition options.h:531
in_addr_t ifconfig_pool_start
Definition options.h:489
in_addr_t push_ifconfig_remote_netmask
Definition options.h:516
const char * dev
Definition options.h:322
struct in6_addr ifconfig_ipv6_pool_base
Definition options.h:496
const char * client_config_dir
Definition options.h:506
int ifconfig_ipv6_netbits
Definition options.h:330
struct openvpn_plugin_string_list * list[MAX_PLUGINS]
Definition plugin.h:106
Definition schedule.h:41
const char * signal_text
Definition sig.h:44
volatile int signal_received
Definition sig.h:42
Security parameter state for a single VPN tunnel.
Definition ssl_common.h:619
char * auth_token_initial
The first auth-token we sent to a client.
Definition ssl_common.h:691
bool remote_usescomp
remote announced comp-lzo in OCC string
Definition ssl_common.h:713
char * peer_info
A multi-line string of general-purpose info received from peer over control channel.
Definition ssl_common.h:680
char * remote_ciphername
cipher specified in peer's config file
Definition ssl_common.h:712
char * locked_username
The locked username is the username we assume the client is using.
Definition ssl_common.h:657
enum multi_status multi_state
Definition ssl_common.h:640
int acc_max_message_length
the maximum length of an ACC control channel message
Definition ssl_common.h:741
struct tls_session session[TM_SIZE]
Array of tls_session objects representing control channel sessions with the remote peer.
Definition ssl_common.h:721
struct cert_hash_set * locked_cert_hash_set
Definition ssl_common.h:663
char * locked_cn
Our locked common name, username, and cert hashes (cannot change during the life of this tls_multi ob...
Definition ssl_common.h:652
bool use_peer_id
Definition ssl_common.h:709
char * acc_negotiated_protocols
the protocols that are negotiated with the peer.
Definition ssl_common.h:738
char * locked_original_username
The username that client initially used before being overridden by –override-user.
Definition ssl_common.h:661
uint32_t rx_peer_id
Definition ssl_common.h:707
int dco_peer_id
This is the handle that DCO uses to identify this session with the kernel.
Definition ssl_common.h:733
bool data_epoch_supported
whether our underlying data channel supports new data channel features (epoch keys with AEAD tag at t...
Definition ssl_common.h:384
Security parameter state of a single session within a VPN tunnel.
Definition ssl_common.h:497
struct key_state key[KS_SIZE]
Definition ssl_common.h:532
struct tls_options * opt
Definition ssl_common.h:499
in_addr_t local
Definition tun.h:208
struct in6_addr local_ipv6
Definition tun.h:211
dco_context_t dco
Definition tun.h:247
in_addr_t remote_netmask
Definition tun.h:209
char username[USER_PASS_LEN]
Definition misc.h:70
#define SIGHUP
Definition syshead.h:55
#define SIGINT
Definition syshead.h:56
#define SIGTERM
Definition syshead.h:59
#define SIGUSR1
Definition syshead.h:57
uint32_t in_addr_t
Definition syshead.h:52
#define SIGUSR2
Definition syshead.h:58
static int cleanup(void **state)
struct gc_arena gc
Definition test_ssl.c:138
int dev_type_enum(const char *dev, const char *dev_type)
Definition tun.c:518
#define TUNNEL_TOPOLOGY(tt)
Definition tun.h:185
#define TUNNEL_TYPE(tt)
Definition tun.h:182
int16_t vlan_decapsulate(const struct context *c, struct buffer *buf)
Definition vlan.c:81
bool vlan_is_tagged(const struct buffer *buf)
Definition vlan.c:261