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#if defined(__GNUC__) || defined(__clang__)
251#pragma GCC diagnostic push
252#pragma GCC diagnostic ignored "-Wsign-conversion"
253#endif
254
255#ifdef ENABLE_ASYNC_PUSH
256static uint64_t
257/*
258 * inotify watcher descriptors are used as hash value
259 */
260int_hash_function(const void *key, const uint8_t hash_key[HASH_KEY_LEN])
261{
262 return (uintptr_t)key;
263}
264
265static bool
266int_compare_function(const void *key1, const void *key2)
267{
268 return (uintptr_t)key1 == (uintptr_t)key2;
269}
270#endif
271
272/*
273 * Main initialization function, init multi_context object.
274 */
275static void
277{
278 struct multi_context *m = t->multi;
279 int dev = DEV_TYPE_UNDEF;
280
281 msg(D_MULTI_LOW, "MULTI: multi_init called, r=%" PRIu32 " v=%" PRIu32 " s=%" PRIu32,
283
284 /*
285 * Get tun/tap/null device type
286 */
288
289 /*
290 * Init our multi_context object.
291 */
292 CLEAR(*m);
293
294 /*
295 * Real address hash table (source port number is
296 * considered to be part of the address). Used
297 * to determine which client sent an incoming packet
298 * which is seen on the TCP/UDP socket.
299 */
302
303 /*
304 * Virtual address hash table. Used to determine
305 * which client to route a packet to.
306 */
309
310 /*
311 * Peer session id hash table. Used to lookup a session by the session
312 * id of one of its active sessions */
315
316#ifdef ENABLE_MANAGEMENT
318#endif
319
320#ifdef ENABLE_ASYNC_PUSH
321 /*
322 * Mapping between inotify watch descriptors and
323 * multi_instances.
324 */
325 m->inotify_watchers =
326 hash_init(t->options.real_hash_size, int_hash_function, int_compare_function);
327#endif
328
329 /*
330 * This is our scheduler, for time-based wakeup
331 * events.
332 */
333 m->schedule = schedule_init();
334
335 /*
336 * Limit frequency of incoming connections to control
337 * DoS.
338 */
342
343 /*
344 * Allocate broadcast/multicast buffer list
345 */
347
348 /*
349 * Different status file format options are available
350 */
352
353 /*
354 * Possibly allocate an ifconfig pool, do it
355 * differently based on whether a tun or tap style
356 * tunnel.
357 */
359 {
361
362 if (dev == DEV_TYPE_TUN && t->options.topology == TOP_NET30)
363 {
365 }
366
372
373 /* reload pool data from file */
375 {
377 }
378 }
379
380 /*
381 * Help us keep track of routing table.
382 */
384
385 /*
386 * Initialize route and instance reaper.
387 */
389
390 /*
391 * Get local ifconfig address
392 */
393 CLEAR(m->local);
394 ASSERT(t->c1.tuntap);
396
397 /*
398 * Per-client limits
399 */
401
402 m->instances = calloc(m->max_clients, sizeof(struct multi_instance *));
403
404 m->top.c2.event_set = t->c2.event_set;
405
406 /*
407 * Initialize multi-socket I/O wait object
408 */
411
412 /*
413 * Allow client <-> client communication, without going through
414 * tun/tap interface and network stack?
415 */
417
418 /* initialize stale routes check timer */
420 {
421 msg(M_INFO,
422 "Initializing stale route check timer to run every %i seconds and to removing routes with activity timeout older than %i seconds",
425 }
426
428}
429
430const char *
431multi_instance_string(const struct multi_instance *mi, bool null, struct gc_arena *gc)
432{
433 if (mi)
434 {
436 const char *cn = tls_common_name(mi->context.c2.tls_multi, true);
437
438 if (cn)
439 {
440 buf_printf(&out, "%s/", cn);
441 }
442 buf_printf(&out, "%s", mroute_addr_print(&mi->real, gc));
443
444 bool debug_rx_pid = (check_debug_level(D_DCO_DEBUG) && dco_enabled(&mi->context.options))
446
447 if (mi->context.c2.tls_multi && debug_rx_pid)
448 {
449 buf_printf(&out, " rx-peer-id=%u", mi->context.c2.tls_multi->rx_peer_id);
450 }
451 return BSTR(&out);
452 }
453 else if (null)
454 {
455 return NULL;
456 }
457 else
458 {
459 return "UNDEF";
460 }
461}
462
463static void
465{
466 struct gc_arena gc = gc_new();
467 const char *prefix = multi_instance_string(mi, true, &gc);
468 if (prefix)
469 {
470 strlcpy(mi->msg_prefix, prefix, sizeof(mi->msg_prefix));
471 }
472 else
473 {
474 mi->msg_prefix[0] = '\0';
475 }
476 set_prefix(mi);
477 gc_free(&gc);
478}
479
480void
482{
483 mi->msg_prefix[0] = '\0';
484 set_prefix(mi);
485}
486
487/*
488 * Tell the route helper about deleted iroutes so
489 * that it can update its mask of currently used
490 * CIDR netlengths.
491 */
492static void
494{
495 const struct iroute *ir;
496 const struct iroute_ipv6 *ir6;
497
498 /* check if DCO iroutes were already removed when scheduling a delayed exit */
499 if (mi->context.did_dco_iroutes)
500 {
501 mi->context.did_dco_iroutes = false;
503 }
504
506 {
507 for (ir = mi->context.options.iroutes; ir != NULL; ir = ir->next)
508 {
510 }
511
512 for (ir6 = mi->context.options.iroutes_ipv6; ir6 != NULL; ir6 = ir6->next)
513 {
515 }
516 }
517}
518
519static void
521{
522 setenv_counter(c->c2.es, "bytes_received", c->c2.link_read_bytes + c->c2.dco_read_bytes);
523 setenv_counter(c->c2.es, "bytes_sent", c->c2.link_write_bytes + c->c2.dco_write_bytes);
524}
525
526static void
528{
529 /* setenv client real IP address */
531
532 /* setenv stats */
533 setenv_stats(&mi->context);
534
535 /* setenv connection duration */
536 setenv_long_long(mi->context.c2.es, "time_duration", now - mi->created);
537}
538
539static void
541{
543
544 if (plugin_defined(mi->context.plugins, OPENVPN_PLUGIN_CLIENT_DISCONNECT))
545 {
546 if (plugin_call(mi->context.plugins, OPENVPN_PLUGIN_CLIENT_DISCONNECT, NULL, NULL,
547 mi->context.c2.es)
548 != OPENVPN_PLUGIN_FUNC_SUCCESS)
549 {
550 msg(M_WARN, "WARNING: client-disconnect plugin call failed");
551 }
552 }
553
555 {
556 struct argv argv = argv_new();
557 setenv_str(mi->context.c2.es, "script_type", "client-disconnect");
559 openvpn_run_script(&argv, mi->context.c2.es, 0, "--client-disconnect");
560 argv_free(&argv);
561 }
562#ifdef ENABLE_MANAGEMENT
563 if (management)
564 {
566 }
567#endif
568}
569
570void
571multi_close_instance(struct multi_context *m, struct multi_instance *mi, bool shutdown)
572{
573 ASSERT(!mi->halt);
574 mi->halt = true;
575 bool is_dgram = proto_is_dgram(mi->context.c2.link_sockets[0]->info.proto);
576
577 dmsg(D_MULTI_DEBUG, "MULTI: multi_close_instance called");
578
579 /* adjust current client connection count */
580 m->n_clients += mi->n_clients_delta;
581 mi->n_clients_delta = 0;
582
583 /* prevent dangling pointers */
584 if (m->pending == mi)
585 {
586 multi_set_pending(m, NULL);
587 }
588 if (m->earliest_wakeup == mi)
589 {
590 m->earliest_wakeup = NULL;
591 }
592
593 /* The sid hash holds a reference on the instance: drop it on
594 * instance close, otherwise the instance is never freed */
596 {
598 }
599
600 if (!shutdown)
601 {
602 if (mi->did_real_hash)
603 {
604 ASSERT(hash_remove(m->hash, &mi->real));
605 }
606#ifdef ENABLE_MANAGEMENT
607 if (mi->did_cid_hash)
608 {
610 }
611#endif
612
613#ifdef ENABLE_ASYNC_PUSH
614 if (mi->inotify_watch != -1)
615 {
616 hash_remove(m->inotify_watchers, (void *)(uintptr_t)mi->inotify_watch);
617 mi->inotify_watch = -1;
618 }
619#endif
620
622 {
623 m->instances[mi->context.c2.tls_multi->rx_peer_id] = NULL;
624
625 /* Adjust the max_peerid as this might have been the highest
626 * peer id instance */
627 while (m->max_peerid > 0 && m->instances[m->max_peerid] == NULL)
628 {
629 m->max_peerid--;
630 }
631
633 }
634
636
637 ifconfig_pool_release(m->ifconfig_pool, mi->vaddr_handle, false);
638
639 if (mi->did_iroutes)
640 {
641 multi_del_iroutes(m, mi);
642 mi->did_iroutes = false;
643 }
644
645 if (!is_dgram)
646 {
648 }
649
651 }
652
653#ifdef ENABLE_MANAGEMENT
654 set_cc_config(mi, NULL);
655#endif
656
658 {
660 }
661
663
665
667
668 /*
669 * Don't actually delete the instance memory allocation yet,
670 * because virtual routes may still point to it. Let the
671 * vhash reaper deal with it.
672 */
674}
675
676/*
677 * Called on shutdown or restart.
678 */
679static void
681{
682 if (m->hash)
683 {
684 /* fetch final stats while all peers can still be mapped to their instances */
685 if (dco_enabled(&m->top.options))
686 {
688 }
689
690 for (uint32_t i = 0; i <= m->max_peerid; i++)
691 {
692 struct multi_instance *mi = m->instances[i];
693 if (mi)
694 {
695 multi_close_instance(m, mi, true);
696 }
697 }
698
700
701 hash_free(m->hash);
702 hash_free(m->vhash);
704#ifdef ENABLE_MANAGEMENT
706#endif
707 m->hash = NULL;
708
709 free(m->instances);
710
711#ifdef ENABLE_ASYNC_PUSH
712 hash_free(m->inotify_watchers);
713 m->inotify_watchers = NULL;
714#endif
715
717 mbuf_free(m->mbuf);
724 }
725}
726
727/*
728 * Create a client instance object for a newly connected client.
729 */
730struct multi_instance *
732 struct link_socket *sock)
733{
734 struct multi_instance *mi;
735
736 msg(D_MULTI_MEDIUM, "MULTI: multi_create_instance called");
737
739
740 mi->gc = gc_new();
742 mi->vaddr_handle = -1;
743 mi->created = now;
745
746 if (real)
747 {
748 mi->real = *real;
749 generate_prefix(mi);
750 }
751
752 inherit_context_child(&mi->context, &m->top, sock);
753 if (IS_SIG(&mi->context))
754 {
755 goto err;
756 }
757
759
760 if (m->assigned_peer_ids >= m->max_clients)
761 {
763 "MULTI: new incoming connection would exceed maximum number of clients (%u)",
764 m->max_clients);
765 goto err;
766 }
767
768 if (!real) /* TCP mode? */
769 {
771 {
772 goto err;
773 }
774 generate_prefix(mi);
775 }
776
777#ifdef ENABLE_MANAGEMENT
778 do
779 {
781 } while (!hash_add(m->cid_hash, &mi->context.c2.mda_context.cid, mi, false));
782 mi->did_cid_hash = true;
783#endif
784
785 mi->context.c2.push_request_received = false;
786#ifdef ENABLE_ASYNC_PUSH
787 mi->inotify_watch = -1;
788#endif
789
791 {
792 msg(D_MULTI_ERRORS, "MULTI: signal occurred during client instance initialization");
793 goto err;
794 }
795
797 mi->ev_arg.u.mi = mi;
798
799 return mi;
800
801err:
802 multi_close_instance(m, mi, false);
803 return NULL;
804}
805
806/*
807 * Dump tables -- triggered by SIGUSR2.
808 * If status file is defined, write to file.
809 * If status file is NULL, write to syslog.
810 */
811static void
812multi_print_status(struct multi_context *m, struct status_output *so, const int version)
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
837 for (uint32_t i = 0; i <= m->max_peerid; i++)
838 {
839 const struct multi_instance *mi = m->instances[i];
840
841 struct gc_arena gc = gc_new();
842 if (mi && !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 }
853
854 status_printf(so, "ROUTING TABLE");
855 status_printf(so, "Virtual Address,Common Name,Real Address,Last Ref");
856 hash_iterator_init(m->vhash, &hi);
857 while ((he = hash_iterator_next(&hi)))
858 {
859 struct gc_arena gc = gc_new();
860 const struct multi_route *route = (struct multi_route *)he->value;
861
863 {
864 const struct multi_instance *mi = route->instance;
865 const struct mroute_addr *ma = &route->addr;
866 char flags[2] = { 0, 0 };
867
868 if (route->flags & MULTI_ROUTE_CACHE)
869 {
870 flags[0] = 'C';
871 }
872 status_printf(so, "%s%s,%s,%s,%s", mroute_addr_print(ma, &gc), flags,
874 mroute_addr_print(&mi->real, &gc),
875 time_string(route->last_reference, 0, false, &gc));
876 }
877 gc_free(&gc);
878 }
880
881 status_printf(so, "GLOBAL STATS");
882 if (m->mbuf)
883 {
884 status_printf(so, "Max bcast/mcast queue length,%d", mbuf_maximum_queued(m->mbuf));
885 }
886
887 status_printf(so, "END");
888 }
889 else if (version == 2 || version == 3)
890 {
891 const char sep = (version == 3) ? '\t' : ',';
892
893 /*
894 * Status file version 2 and 3
895 */
896 status_printf(so, "TITLE%c%s", sep, title_string);
897 status_printf(so, "TIME%c%s%c%u", sep, time_string(now, 0, false, &gc_top), sep,
898 (unsigned int)now);
900 so,
901 "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",
902 sep, sep, sep, sep, sep, sep, sep, sep, sep, sep, sep, sep, sep);
903
904 for (uint32_t i = 0; i <= m->max_peerid; i++)
905 {
906 const struct multi_instance *mi = m->instances[i];
907 struct gc_arena gc = gc_new();
908
909 if (mi && !mi->halt)
910 {
912 so,
913 "CLIENT_LIST%c%s%c%s%c%s%c%s%c" counter_format "%c" counter_format
914 "%c%s%c%u%c%s%c"
915#ifdef ENABLE_MANAGEMENT
916 "%lu"
917#else
918 ""
919#endif
920 "%c%" PRIu32 "%c%s",
921 sep, tls_common_name(mi->context.c2.tls_multi, false), sep,
922 mroute_addr_print(&mi->real, &gc), sep,
927 time_string(mi->created, 0, false, &gc), sep, (unsigned int)mi->created,
928 sep, tls_username(mi->context.c2.tls_multi, false),
929#ifdef ENABLE_MANAGEMENT
930 sep, mi->context.c2.mda_context.cid,
931#else
932 sep,
933#endif
936 }
937 gc_free(&gc);
938 }
939
941 so,
942 "HEADER%cROUTING_TABLE%cVirtual Address%cCommon Name%cReal Address%cLast Ref%cLast Ref (time_t)",
943 sep, sep, sep, sep, sep, sep);
944 hash_iterator_init(m->vhash, &hi);
945 while ((he = hash_iterator_next(&hi)))
946 {
947 struct gc_arena gc = gc_new();
948 const struct multi_route *route = (struct multi_route *)he->value;
949
951 {
952 const struct multi_instance *mi = route->instance;
953 const struct mroute_addr *ma = &route->addr;
954 char flags[2] = { 0, 0 };
955
956 if (route->flags & MULTI_ROUTE_CACHE)
957 {
958 flags[0] = 'C';
959 }
960 status_printf(so, "ROUTING_TABLE%c%s%s%c%s%c%s%c%s%c%u", sep,
961 mroute_addr_print(ma, &gc), flags, sep,
962 tls_common_name(mi->context.c2.tls_multi, false), sep,
963 mroute_addr_print(&mi->real, &gc), sep,
964 time_string(route->last_reference, 0, false, &gc), sep,
965 (unsigned int)route->last_reference);
966 }
967 gc_free(&gc);
968 }
970
971 if (m->mbuf)
972 {
973 status_printf(so, "GLOBAL_STATS%cMax bcast/mcast queue length%c%d", sep, sep,
975 }
976
977 status_printf(so, "GLOBAL_STATS%cdco_enabled%c%d", sep, sep,
978 dco_enabled(&m->top.options));
979 status_printf(so, "END");
980 }
981 else
982 {
983 status_printf(so, "ERROR: bad status format version number");
984 }
985
986 status_flush(so);
987 gc_free(&gc_top);
988
989#ifdef ENABLE_ASYNC_PUSH
990 if (m->inotify_watchers)
991 {
992 msg(D_MULTI_DEBUG, "inotify watchers count: %u", hash_n_elements(m->inotify_watchers));
993 }
994#endif
995}
996
997/*
998 * Learn a virtual address or route.
999 * The learn will fail if the learn address
1000 * script/plugin fails. In this case the
1001 * return value may be != mi.
1002 * Return the instance which owns this route,
1003 * or NULL if none.
1004 */
1005static struct multi_instance *
1006multi_learn_addr(struct multi_context *m, struct multi_instance *mi, const struct mroute_addr *addr,
1007 const unsigned int flags)
1008{
1009 struct hash_element *he;
1010 const uint64_t hv = hash_value(m->vhash, addr);
1011 struct hash_bucket *bucket = hash_bucket(m->vhash, hv);
1012 struct multi_route *oldroute = NULL;
1013 struct multi_instance *owner = NULL;
1014 struct gc_arena gc = gc_new();
1015
1016 /* if route currently exists, get the instance which owns it */
1017 he = hash_lookup_fast(m->vhash, bucket, addr, hv);
1018 if (he)
1019 {
1020 oldroute = (struct multi_route *)he->value;
1021 }
1022 if (oldroute && multi_route_defined(m, oldroute))
1023 {
1024 owner = oldroute->instance;
1025 }
1026
1027 /* do we need to add address to hash table? */
1028 if ((!owner || owner != mi) && mroute_learnable_address(addr, &gc)
1029 && !mroute_addr_equal(addr, &m->local))
1030 {
1031 struct multi_route *newroute;
1032 bool learn_succeeded = false;
1033
1034 ALLOC_OBJ(newroute, struct multi_route);
1035 newroute->addr = *addr;
1036 newroute->instance = mi;
1037 newroute->flags = flags;
1038 newroute->last_reference = now;
1039 newroute->cache_generation = 0;
1040
1041 /* The cache is invalidated when cache_generation is incremented */
1043 {
1045 }
1046
1047 if (oldroute) /* route already exists? */
1048 {
1049 if (route_quota_test(mi) && learn_address_script(m, mi, "update", &newroute->addr))
1050 {
1051 learn_succeeded = true;
1052 owner = mi;
1054 route_quota_inc(mi);
1055
1056 /* delete old route */
1057 multi_route_del(oldroute);
1058
1059 /* modify hash table entry, replacing old route */
1060 he->key = &newroute->addr;
1061 he->value = newroute;
1062 }
1063 }
1064 else
1065 {
1066 if (route_quota_test(mi) && learn_address_script(m, mi, "add", &newroute->addr))
1067 {
1068 learn_succeeded = true;
1069 owner = mi;
1071 route_quota_inc(mi);
1072
1073 /* add new route */
1074 hash_add_fast(m->vhash, bucket, &newroute->addr, hv, newroute);
1075 }
1076 }
1077
1078 msg(D_MULTI_LOW, "MULTI: Learn%s: %s -> %s", learn_succeeded ? "" : " FAILED",
1079 mroute_addr_print(&newroute->addr, &gc), multi_instance_string(mi, false, &gc));
1080
1081 if (!learn_succeeded)
1082 {
1083 free(newroute);
1084 }
1085 }
1086 gc_free(&gc);
1087
1088 return owner;
1089}
1090
1091/*
1092 * Get client instance based on virtual address.
1093 */
1094static struct multi_instance *
1096 bool cidr_routing)
1097{
1098 struct multi_route *route;
1099 struct multi_instance *ret = NULL;
1100
1101 /* check for local address */
1102 if (mroute_addr_equal(addr, &m->local))
1103 {
1104 return NULL;
1105 }
1106
1107 route = (struct multi_route *)hash_lookup(m->vhash, addr);
1108
1109 /* does host route (possible cached) exist? */
1110 if (route && multi_route_defined(m, route))
1111 {
1112 struct multi_instance *mi = route->instance;
1113 route->last_reference = now;
1114 ret = mi;
1115 }
1116 else if (cidr_routing) /* do we need to regenerate a host route cache entry? */
1117 {
1118 struct mroute_helper *rh = m->route_helper;
1119 struct mroute_addr tryaddr;
1120 int i;
1121
1122 /* cycle through each CIDR length */
1123 for (i = 0; i < rh->n_net_len; ++i)
1124 {
1125 tryaddr = *addr;
1126 tryaddr.type |= MR_WITH_NETBITS;
1127 tryaddr.netbits = rh->net_len[i];
1129
1130 /* look up a possible route with netbits netmask */
1131 route = (struct multi_route *)hash_lookup(m->vhash, &tryaddr);
1132
1133 if (route && multi_route_defined(m, route))
1134 {
1135 /* found an applicable route, cache host route */
1136 struct multi_instance *mi = route->instance;
1138 ret = mi;
1139 break;
1140 }
1141 }
1142 }
1143
1144#ifndef ENABLE_SMALL
1146 {
1147 struct gc_arena gc = gc_new();
1148 const char *addr_text = mroute_addr_print(addr, &gc);
1149 if (ret)
1150 {
1151 dmsg(D_MULTI_DEBUG, "GET INST BY VIRT: %s -> %s via %s", addr_text,
1152 multi_instance_string(ret, false, &gc), mroute_addr_print(&route->addr, &gc));
1153 }
1154 else
1155 {
1156 dmsg(D_MULTI_DEBUG, "GET INST BY VIRT: %s [failed]", addr_text);
1157 }
1158 gc_free(&gc);
1159 }
1160#endif
1161
1162 ASSERT(!(ret && ret->halt));
1163 return ret;
1164}
1165
1166/*
1167 * Helper function to multi_learn_addr().
1168 */
1169static struct multi_instance *
1171 int netbits, /* -1 if host route, otherwise # of network bits in address */
1172 bool primary)
1173{
1174 struct openvpn_sockaddr remote_si;
1175 struct mroute_addr addr = { 0 };
1176
1177 CLEAR(remote_si);
1178 remote_si.addr.in4.sin_family = AF_INET;
1179 remote_si.addr.in4.sin_addr.s_addr = htonl(a);
1180 addr.proto = 0;
1181 ASSERT(mroute_extract_openvpn_sockaddr(&addr, &remote_si, false));
1182
1183 if (netbits >= 0)
1184 {
1185 addr.type |= MR_WITH_NETBITS;
1186 addr.netbits = (uint8_t)netbits;
1187 }
1188
1189 struct multi_instance *owner = multi_learn_addr(m, mi, &addr, MULTI_ROUTE_PERMANENT);
1190#ifdef ENABLE_MANAGEMENT
1191 if (management && owner)
1192 {
1193 management_learn_addr(&mi->context.c2.mda_context, &addr, primary);
1194 }
1195#endif
1196 if (primary && multi_check_push_ifconfig_extra_route(&mi->context.options, addr.v4.addr))
1197 {
1198 /* "primary" is the VPN ifconfig address of the peer */
1199 /* if it does not fall into the network defined by ifconfig_local
1200 * we install this as extra onscope address on the interface */
1201 addr.netbits = 32;
1202 addr.type |= MR_ONLINK_DCO_ADDR;
1203
1204 dco_install_iroute(m, mi, &addr);
1205 }
1206 else if (!primary)
1207 {
1208 ASSERT(netbits >= 0); /* DCO requires populated netbits */
1209 dco_install_iroute(m, mi, &addr);
1210 }
1211
1212 return owner;
1213}
1214
1215static struct multi_instance *
1216multi_learn_in6_addr(struct multi_context *m, struct multi_instance *mi, struct in6_addr a6,
1217 int netbits, /* -1 if host route, otherwise # of network bits in address */
1218 bool primary)
1219{
1220 struct mroute_addr addr = { 0 };
1221
1222 addr.len = 16;
1223 addr.type = MR_ADDR_IPV6;
1224 addr.netbits = 0;
1225 addr.v6.addr = a6;
1226
1227 if (netbits >= 0)
1228 {
1229 addr.type |= MR_WITH_NETBITS;
1230 addr.netbits = (uint8_t)netbits;
1232 }
1233
1234 struct multi_instance *owner = multi_learn_addr(m, mi, &addr, MULTI_ROUTE_PERMANENT);
1235#ifdef ENABLE_MANAGEMENT
1236 if (management && owner)
1237 {
1238 management_learn_addr(&mi->context.c2.mda_context, &addr, primary);
1239 }
1240#endif
1242 {
1243 /* "primary" is the VPN ifconfig address of the peer */
1244 /* if it does not fall into the network defined by ifconfig_local
1245 * we install this as extra onscope address on the interface */
1246 addr.netbits = 128;
1247 addr.type |= MR_ONLINK_DCO_ADDR;
1248
1249 dco_install_iroute(m, mi, &addr);
1250 }
1251 else if (!primary)
1252 {
1253 /* "primary" is the VPN ifconfig address of the peer and already
1254 * known to DCO, so only install "extra" iroutes (primary = false)
1255 */
1256 ASSERT(netbits >= 0); /* DCO requires populated netbits */
1257 dco_install_iroute(m, mi, &addr);
1258 }
1259
1260 return owner;
1261}
1262
1263/*
1264 * A new client has connected, add routes (server -> client)
1265 * to internal routing table.
1266 */
1267static void
1269{
1270 struct gc_arena gc = gc_new();
1271 const struct iroute *ir;
1272 const struct iroute_ipv6 *ir6;
1274 {
1275 mi->did_iroutes = true;
1276 /* multi_learn_in{6}_addr_t takes care of installing the DCO iroute */
1277 mi->context.did_dco_iroutes = true;
1278 for (ir = mi->context.options.iroutes; ir != NULL; ir = ir->next)
1279 {
1280 if (ir->netbits >= 0)
1281 {
1282 msg(D_MULTI_LOW, "MULTI: internal route %s/%d -> %s",
1283 print_in_addr_t(ir->network, 0, &gc), ir->netbits,
1284 multi_instance_string(mi, false, &gc));
1285 }
1286 else
1287 {
1288 msg(D_MULTI_LOW, "MULTI: internal route %s -> %s",
1289 print_in_addr_t(ir->network, 0, &gc), multi_instance_string(mi, false, &gc));
1290 }
1291
1293
1294 multi_learn_in_addr_t(m, mi, ir->network, ir->netbits, false);
1295 }
1296 for (ir6 = mi->context.options.iroutes_ipv6; ir6 != NULL; ir6 = ir6->next)
1297 {
1298 msg(D_MULTI_LOW, "MULTI: internal route %s/%u -> %s",
1299 print_in6_addr(ir6->network, 0, &gc), ir6->netbits,
1300 multi_instance_string(mi, false, &gc));
1301
1303
1304 multi_learn_in6_addr(m, mi, ir6->network, ir6->netbits, false);
1305 }
1306 }
1307 gc_free(&gc);
1308}
1309
1310/*
1311 * Given an instance (new_mi), delete all other instances which use the
1312 * same common name.
1313 */
1314static void
1315multi_delete_dup(struct multi_context *m, const struct multi_instance *new_mi)
1316{
1317 if (new_mi)
1318 {
1319 const char *new_cn = tls_common_name(new_mi->context.c2.tls_multi, true);
1320 if (new_cn)
1321 {
1322 int count = 0;
1323
1324 for (uint32_t i = 0; i <= m->max_peerid; i++)
1325 {
1326 struct multi_instance *mi = m->instances[i];
1327 if (mi && mi != new_mi && !mi->halt)
1328 {
1329 const char *cn = tls_common_name(mi->context.c2.tls_multi, true);
1330 if (cn && !strcmp(cn, new_cn))
1331 {
1332 multi_close_instance(m, mi, false);
1333 ++count;
1334 }
1335 }
1336 }
1337
1338 if (count)
1339 {
1341 "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.",
1342 new_cn);
1343 }
1344 }
1345 }
1346}
1347
1348static void
1350{
1351 struct gc_arena gc = gc_new();
1352 struct hash_iterator hi;
1353 struct hash_element *he;
1354
1355 dmsg(D_MULTI_DEBUG, "MULTI: Checking stale routes");
1357 while ((he = hash_iterator_next(&hi)) != NULL)
1358 {
1359 struct multi_route *r = (struct multi_route *)he->value;
1361 && difftime(now, r->last_reference) >= m->top.options.stale_routes_ageing_time)
1362 {
1363 dmsg(D_MULTI_DEBUG, "MULTI: Deleting stale route for address '%s'",
1364 mroute_addr_print(&r->addr, &gc));
1365 learn_address_script(m, NULL, "delete", &r->addr);
1366 multi_route_del(r);
1368 }
1369 }
1370 hash_iterator_free(&hi);
1371 gc_free(&gc);
1372}
1373
1374/*
1375 * Ensure that endpoint to be pushed to client
1376 * complies with --ifconfig-push-constraint directive.
1377 */
1378static bool
1380{
1381 const struct options *o = &c->options;
1383 {
1386 }
1387 else
1388 {
1389 return true;
1390 }
1391}
1392
1393/*
1394 * Select a virtual address for a new client instance.
1395 * Use an --ifconfig-push directive, if given (static IP).
1396 * Otherwise use an --ifconfig-pool address (dynamic IP).
1397 */
1398static void
1400{
1401 struct gc_arena gc = gc_new();
1402
1403 /*
1404 * If ifconfig addresses were set by dynamic config file,
1405 * release pool addresses, otherwise keep them.
1406 */
1408 {
1409 /* ifconfig addresses were set statically,
1410 * release dynamic allocation */
1411 if (mi->vaddr_handle >= 0)
1412 {
1414 mi->vaddr_handle = -1;
1415 }
1416
1417 mi->context.c2.push_ifconfig_defined = true;
1422
1423 /* the current implementation does not allow "static IPv4, pool IPv6",
1424 * (see below) so issue a warning if that happens - don't break the
1425 * session, though, as we don't even know if this client WANTS IPv6
1426 */
1429 {
1430 msg(M_INFO,
1431 "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.");
1432 }
1433 }
1434 else if (m->ifconfig_pool && mi->vaddr_handle < 0) /* otherwise, choose a pool address */
1435 {
1436 in_addr_t local = 0, remote = 0;
1437 struct in6_addr remote_ipv6;
1438 const char *cn = NULL;
1439
1440 if (!mi->context.options.duplicate_cn)
1441 {
1442 cn = tls_common_name(mi->context.c2.tls_multi, true);
1443 }
1444
1445 CLEAR(remote_ipv6);
1446 mi->vaddr_handle =
1447 ifconfig_pool_acquire(m->ifconfig_pool, &local, &remote, &remote_ipv6, cn);
1448 if (mi->vaddr_handle >= 0)
1449 {
1450 const int tunnel_type = TUNNEL_TYPE(mi->context.c1.tuntap);
1451 const int tunnel_topology = TUNNEL_TOPOLOGY(mi->context.c1.tuntap);
1452
1453 msg(M_INFO, "MULTI_sva: pool returned IPv4=%s, IPv6=%s",
1455 : "(Not enabled)"),
1457 ? print_in6_addr(remote_ipv6, 0, &gc)
1458 : "(Not enabled)"));
1459
1461 {
1462 /* set push_ifconfig_remote_netmask from pool ifconfig address(es) */
1463 mi->context.c2.push_ifconfig_local = remote;
1464 if (tunnel_type == DEV_TYPE_TAP
1465 || (tunnel_type == DEV_TYPE_TUN && tunnel_topology == TOP_SUBNET))
1466 {
1470 {
1473 }
1474 }
1475 else if (tunnel_type == DEV_TYPE_TUN)
1476 {
1477 if (tunnel_topology == TOP_P2P)
1478 {
1480 }
1481 else if (tunnel_topology == TOP_NET30)
1482 {
1484 }
1485 }
1486
1488 {
1489 mi->context.c2.push_ifconfig_defined = true;
1490 }
1491 else
1492 {
1494 "MULTI: no --ifconfig-pool netmask parameter is available to push to %s",
1495 multi_instance_string(mi, false, &gc));
1496 }
1497 }
1498
1500 {
1501 mi->context.c2.push_ifconfig_ipv6_local = remote_ipv6;
1506 }
1507 }
1508 else
1509 {
1510 msg(D_MULTI_ERRORS, "MULTI: no free --ifconfig-pool addresses are available");
1511 }
1512 }
1513
1514 /* IPv6 push_ifconfig is a bit problematic - since IPv6 shares the
1515 * pool handling with IPv4, the combination "static IPv4, dynamic IPv6"
1516 * will fail (because no pool will be allocated in this case).
1517 * OTOH, this doesn't make too much sense in reality - and the other
1518 * way round ("dynamic IPv4, static IPv6") or "both static" makes sense
1519 * -> and so it's implemented right now
1520 */
1522 {
1527
1528 msg(M_INFO, "MULTI_sva: push_ifconfig_ipv6 %s/%d",
1531 }
1532
1533 gc_free(&gc);
1534}
1535
1536/*
1537 * Set virtual address environmental variables.
1538 */
1539static void
1541{
1542 setenv_del(mi->context.c2.es, "ifconfig_pool_local_ip");
1543 setenv_del(mi->context.c2.es, "ifconfig_pool_remote_ip");
1544 setenv_del(mi->context.c2.es, "ifconfig_pool_netmask");
1545
1547 {
1548 const int tunnel_type = TUNNEL_TYPE(mi->context.c1.tuntap);
1549 const int tunnel_topology = TUNNEL_TOPOLOGY(mi->context.c1.tuntap);
1550
1551 setenv_in_addr_t(mi->context.c2.es, "ifconfig_pool_remote_ip",
1553
1554 if (tunnel_type == DEV_TYPE_TAP
1555 || (tunnel_type == DEV_TYPE_TUN && tunnel_topology == TOP_SUBNET))
1556 {
1557 setenv_in_addr_t(mi->context.c2.es, "ifconfig_pool_netmask",
1559 }
1560 else if (tunnel_type == DEV_TYPE_TUN)
1561 {
1562 setenv_in_addr_t(mi->context.c2.es, "ifconfig_pool_local_ip",
1564 }
1565 }
1566
1567 setenv_del(mi->context.c2.es, "ifconfig_pool_local_ip6");
1568 setenv_del(mi->context.c2.es, "ifconfig_pool_remote_ip6");
1569 setenv_del(mi->context.c2.es, "ifconfig_pool_ip6_netbits");
1570
1572 {
1573 setenv_in6_addr(mi->context.c2.es, "ifconfig_pool_remote",
1575 setenv_in6_addr(mi->context.c2.es, "ifconfig_pool_local",
1577 setenv_int(mi->context.c2.es, "ifconfig_pool_ip6_netbits",
1579 }
1580}
1581
1582/*
1583 * Called after client-connect script is called
1584 */
1585static void
1586multi_client_connect_post(struct multi_context *m, struct multi_instance *mi, const char *dc_file,
1587 uint64_t *option_types_found)
1588{
1589 /* Did script generate a dynamic config file? */
1590 if (platform_test_file(dc_file))
1591 {
1593 CLIENT_CONNECT_OPT_MASK, option_types_found, mi->context.c2.es);
1594
1595 /*
1596 * If the --client-connect script generates a config file
1597 * with an --ifconfig-push directive, it will override any
1598 * --ifconfig-push directive from the --client-config-dir
1599 * directory or any --ifconfig-pool dynamic address.
1600 */
1603 }
1604}
1605
1606#ifdef ENABLE_PLUGIN
1607
1608/*
1609 * Called after client-connect plug-in is called
1610 */
1611static void
1613 const struct plugin_return *pr, uint64_t *option_types_found)
1614{
1615 struct plugin_return config;
1616
1617 plugin_return_get_column(pr, &config, "config");
1618
1619 /* Did script generate a dynamic config file? */
1620 if (plugin_return_defined(&config))
1621 {
1622 int i;
1623 for (i = 0; i < config.n; ++i)
1624 {
1625 if (config.list[i] && config.list[i]->value)
1626 {
1627 options_string_import(&mi->context.options, config.list[i]->value,
1629 option_types_found, mi->context.c2.es);
1630 }
1631 }
1632
1633 /*
1634 * If the --client-connect script generates a config file
1635 * with an --ifconfig-push directive, it will override any
1636 * --ifconfig-push directive from the --client-config-dir
1637 * directory or any --ifconfig-pool dynamic address.
1638 */
1641 }
1642}
1643
1644#endif /* ifdef ENABLE_PLUGIN */
1645
1646
1647/*
1648 * Called to load management-derived client-connect config
1649 */
1651multi_client_connect_mda(struct multi_context *m, struct multi_instance *mi, bool deferred,
1652 uint64_t *option_types_found)
1653{
1654 /* We never return CC_RET_DEFERRED */
1655 ASSERT(!deferred);
1657#ifdef ENABLE_MANAGEMENT
1658 if (mi->cc_config)
1659 {
1660 struct buffer_entry *be;
1661 for (be = mi->cc_config->head; be != NULL; be = be->next)
1662 {
1663 const char *opt = BSTR(&be->buf);
1665 CLIENT_CONNECT_OPT_MASK, option_types_found, mi->context.c2.es);
1666 }
1667
1668 /*
1669 * If the --client-connect script generates a config file
1670 * with an --ifconfig-push directive, it will override any
1671 * --ifconfig-push directive from the --client-config-dir
1672 * directory or any --ifconfig-pool dynamic address.
1673 */
1676
1677 ret = CC_RET_SUCCEEDED;
1678 }
1679#endif /* ifdef ENABLE_MANAGEMENT */
1680 return ret;
1681}
1682
1683static void
1685{
1686 struct gc_arena gc = gc_new();
1687
1688 /* setenv incoming cert common name for script */
1689 setenv_str(mi->context.c2.es, "common_name", tls_common_name(mi->context.c2.tls_multi, true));
1690
1691 /* setenv client real IP address */
1693
1694 /* setenv client virtual IP address */
1696
1697 /* setenv connection time */
1698 {
1699 const char *created_ascii = time_string(mi->created, 0, false, &gc);
1700 setenv_str(mi->context.c2.es, "time_ascii", created_ascii);
1701 setenv_long_long(mi->context.c2.es, "time_unix", mi->created);
1702 }
1703
1704 gc_free(&gc);
1705}
1706
1713static bool
1715{
1716 struct tls_multi *tls_multi = c->c2.tls_multi;
1717 const char *const peer_info = tls_multi->peer_info;
1718 struct options *o = &c->options;
1719
1720
1721 unsigned int proto = extract_iv_proto(peer_info);
1722 if (proto & IV_PROTO_DATA_V2)
1723 {
1724 tls_multi->use_peer_id = true;
1725 o->use_peer_id = true;
1726 }
1727 else if (dco_enabled(o))
1728 {
1729 msg(M_INFO, "Client does not support DATA_V2. Data channel offloading "
1730 "requires DATA_V2. Dropping client.");
1731 auth_set_client_reason(tls_multi, "Data channel negotiation "
1732 "failed (missing DATA_V2)");
1733 return false;
1734 }
1735
1736 /* Print a warning if we detect the client being in P2P mode and will
1737 * not accept our pushed ciphers */
1738 if (proto & IV_PROTO_NCP_P2P)
1739 {
1740 msg(M_WARN, "Note: peer reports running in P2P mode (no --pull/--client "
1741 "option). It will not negotiate ciphers with this server. "
1742 "Expect this connection to fail.");
1743 }
1744
1745 if (proto & IV_PROTO_REQUEST_PUSH)
1746 {
1747 c->c2.push_request_received = true;
1748 }
1749
1750 if (proto & IV_PROTO_TLS_KEY_EXPORT)
1751 {
1753 }
1754 else if (o->force_key_material_export)
1755 {
1756 msg(M_INFO, "PUSH: client does not support TLS Keying Material "
1757 "Exporters but --force-tls-key-material-export is enabled.");
1758 auth_set_client_reason(tls_multi, "Client incompatible with this "
1759 "server. Keying Material Exporters (RFC 5705) "
1760 "support missing. Upgrade to a client that "
1761 "supports this feature (OpenVPN 2.6.0+).");
1762 return false;
1763 }
1764 if (proto & IV_PROTO_DYN_TLS_CRYPT)
1765 {
1767 }
1768
1769 if (proto & IV_PROTO_CC_EXIT_NOTIFY)
1770 {
1772 }
1773
1774 /* Select cipher if client supports Negotiable Crypto Parameters */
1775
1776 /* if we have already created our key, we cannot *change* our own
1777 * cipher -> so log the fact and push the "what we have now" cipher
1778 * (so the client is always told what we expect it to use)
1779 */
1781 {
1782 msg(M_INFO,
1783 "PUSH: client wants to negotiate cipher (NCP), but "
1784 "server has already generated data channel keys, "
1785 "re-sending previously negotiated cipher '%s'",
1786 o->ciphername);
1787 return true;
1788 }
1789
1790 /*
1791 * Push the first cipher from --data-ciphers to the client that
1792 * the client announces to be supporting.
1793 */
1794 const char *push_cipher =
1796 if (push_cipher)
1797 {
1798 /* Enable epoch data key format if supported and AEAD cipher in use */
1800 && cipher_kt_mode_aead(push_cipher))
1801 {
1803 }
1804
1805 o->ciphername = push_cipher;
1806 return true;
1807 }
1808
1809 /* NCP cipher negotiation failed. Try to figure out why exactly it
1810 * failed and give good error messages and potentially do a fallback
1811 * for non NCP clients */
1812 struct gc_arena gc = gc_new();
1813 bool ret = false;
1814
1815 const char *peer_ciphers = tls_peer_ncp_list(peer_info, &gc);
1816 /* If we are in a situation where we know the client ciphers, there is no
1817 * reason to fall back to a cipher that will not be accepted by the other
1818 * side, in this situation we fail the auth*/
1819 if (strlen(peer_ciphers) > 0)
1820 {
1821 msg(M_INFO,
1822 "PUSH: No common cipher between server and client. "
1823 "Server data-ciphers: '%s'%s, client supported ciphers '%s'",
1824 o->ncp_ciphers_conf, ncp_expanded_ciphers(o, &gc), peer_ciphers);
1825 }
1826 else if (tls_multi->remote_ciphername)
1827 {
1828 msg(M_INFO,
1829 "PUSH: No common cipher between server and client. "
1830 "Server data-ciphers: '%s'%s, client supports cipher '%s'",
1832 }
1833 else
1834 {
1835 msg(M_INFO, "PUSH: No NCP or OCC cipher data received from peer.");
1836
1837 if (o->enable_ncp_fallback)
1838 {
1839 msg(M_INFO,
1840 "Using data channel cipher '%s' since "
1841 "--data-ciphers-fallback is set.",
1842 o->ciphername);
1843 ret = true;
1844 }
1845 else
1846 {
1847 msg(M_INFO, "Use --data-ciphers-fallback with the cipher the "
1848 "client is using if you want to allow the client to connect");
1849 }
1850 }
1851 if (!ret)
1852 {
1853 auth_set_client_reason(tls_multi, "Data channel cipher negotiation "
1854 "failed (no shared cipher)");
1855 }
1856
1857 gc_free(&gc);
1858 return ret;
1859}
1860
1865static void
1867{
1869 if (!ccs->deferred_ret_file)
1870 {
1871 return;
1872 }
1873
1874 setenv_del(mi->context.c2.es, "client_connect_deferred_file");
1876 {
1877 msg(D_MULTI_ERRORS, "MULTI: problem deleting temporary file: %s", ccs->deferred_ret_file);
1878 }
1879 free(ccs->deferred_ret_file);
1880 ccs->deferred_ret_file = NULL;
1881}
1882
1890static bool
1892{
1894 struct gc_arena gc = gc_new();
1895 const char *fn;
1896
1897 /* Delete file if it already exists */
1899
1901 if (!fn)
1902 {
1903 gc_free(&gc);
1904 return false;
1905 }
1906 ccs->deferred_ret_file = string_alloc(fn, NULL);
1907
1908 setenv_str(mi->context.c2.es, "client_connect_deferred_file", ccs->deferred_ret_file);
1909
1910 gc_free(&gc);
1911 return true;
1912}
1913
1922static enum client_connect_return
1924{
1925 const struct client_connect_defer_state *ccs = &(mi->client_connect_defer_state);
1926 FILE *fp = fopen(ccs->deferred_ret_file, "r");
1927 if (!fp)
1928 {
1929 return CC_RET_SKIPPED;
1930 }
1931
1933 const int c = fgetc(fp);
1934 switch (c)
1935 {
1936 case '0':
1937 ret = CC_RET_FAILED;
1938 break;
1939
1940 case '1':
1941 ret = CC_RET_SUCCEEDED;
1942 break;
1943
1944 case '2':
1945 ret = CC_RET_DEFERRED;
1946 break;
1947
1948 case EOF:
1949 if (feof(fp))
1950 {
1951 ret = CC_RET_SKIPPED;
1952 break;
1953 }
1954
1955 /* Not EOF but other error -> fall through to error state */
1956 default:
1957 /* We received an unknown/unexpected value. Assume failure. */
1958 msg(M_WARN, "WARNING: Unknown/unexpected value in deferred "
1959 "client-connect resultfile");
1960 ret = CC_RET_FAILED;
1961 }
1962 fclose(fp);
1963
1964 return ret;
1965}
1966
1972static void
1974{
1976 if (ccs->config_file)
1977 {
1978 setenv_del(mi->context.c2.es, "client_connect_config_file");
1979 if (!platform_unlink(ccs->config_file))
1980 {
1981 msg(D_MULTI_ERRORS, "MULTI: problem deleting temporary file: %s", ccs->config_file);
1982 }
1983 free(ccs->config_file);
1984 ccs->config_file = NULL;
1985 }
1986}
1987
1995static bool
1997{
1999 struct gc_arena gc = gc_new();
2000 const char *fn;
2001
2002 if (ccs->config_file)
2003 {
2005 }
2006
2008 if (!fn)
2009 {
2010 gc_free(&gc);
2011 return false;
2012 }
2013 ccs->config_file = string_alloc(fn, NULL);
2014
2015 setenv_str(mi->context.c2.es, "client_connect_config_file", ccs->config_file);
2016
2017 gc_free(&gc);
2018 return true;
2019}
2020
2021static enum client_connect_return
2023 bool deferred, uint64_t *option_types_found)
2024{
2026#ifdef ENABLE_PLUGIN
2027 ASSERT(m);
2028 ASSERT(mi);
2029 ASSERT(option_types_found);
2031
2032 /* deprecated callback, use a file for passing back return info */
2033 if (plugin_defined(mi->context.plugins, OPENVPN_PLUGIN_CLIENT_CONNECT))
2034 {
2035 struct argv argv = argv_new();
2036 int call;
2037
2038 if (!deferred)
2039 {
2040 call = OPENVPN_PLUGIN_CLIENT_CONNECT;
2042 {
2043 ret = CC_RET_FAILED;
2044 goto cleanup;
2045 }
2046 }
2047 else
2048 {
2049 call = OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER;
2050 /* the initial call should have created these files */
2051 ASSERT(ccs->config_file);
2053 }
2054
2055 argv_printf(&argv, "%s", ccs->config_file);
2056 int plug_ret = plugin_call(mi->context.plugins, call, &argv, NULL, mi->context.c2.es);
2057 if (plug_ret == OPENVPN_PLUGIN_FUNC_SUCCESS)
2058 {
2059 ret = CC_RET_SUCCEEDED;
2060 }
2061 else if (plug_ret == OPENVPN_PLUGIN_FUNC_DEFERRED)
2062 {
2063 ret = CC_RET_DEFERRED;
2069 }
2070 else
2071 {
2072 msg(M_WARN, "WARNING: client-connect plugin call failed");
2073 ret = CC_RET_FAILED;
2074 }
2075
2076
2082 int file_ret = ccs_test_deferred_ret_file(mi);
2083
2084 if (file_ret == CC_RET_FAILED)
2085 {
2086 ret = CC_RET_FAILED;
2087 }
2088 else if (ret == CC_RET_SUCCEEDED && file_ret == CC_RET_DEFERRED)
2089 {
2090 ret = CC_RET_DEFERRED;
2091 }
2092
2093 /* if we still think we have succeeded, do postprocessing */
2094 if (ret == CC_RET_SUCCEEDED)
2095 {
2096 multi_client_connect_post(m, mi, ccs->config_file, option_types_found);
2097 }
2098cleanup:
2099 argv_free(&argv);
2100
2101 if (ret != CC_RET_DEFERRED)
2102 {
2105 }
2106 }
2107#endif /* ifdef ENABLE_PLUGIN */
2108 return ret;
2109}
2110
2111static enum client_connect_return
2113 bool deferred, uint64_t *option_types_found)
2114{
2116#ifdef ENABLE_PLUGIN
2117 ASSERT(m);
2118 ASSERT(mi);
2119 ASSERT(option_types_found);
2120
2121 int call = deferred ? OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER_V2 : OPENVPN_PLUGIN_CLIENT_CONNECT_V2;
2122 /* V2 callback, use a plugin_return struct for passing back return info */
2123 if (plugin_defined(mi->context.plugins, call))
2124 {
2125 struct plugin_return pr;
2126
2127 plugin_return_init(&pr);
2128
2129 int plug_ret = plugin_call(mi->context.plugins, call, NULL, &pr, mi->context.c2.es);
2130 if (plug_ret == OPENVPN_PLUGIN_FUNC_SUCCESS)
2131 {
2132 multi_client_connect_post_plugin(m, mi, &pr, option_types_found);
2133 ret = CC_RET_SUCCEEDED;
2134 }
2135 else if (plug_ret == OPENVPN_PLUGIN_FUNC_DEFERRED)
2136 {
2137 ret = CC_RET_DEFERRED;
2138 if (!(plugin_defined(mi->context.plugins, OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER_V2)))
2139 {
2140 msg(M_WARN, "A plugin that defers from the "
2141 "OPENVPN_PLUGIN_CLIENT_CONNECT_V2 call must also "
2142 "declare support for "
2143 "OPENVPN_PLUGIN_CLIENT_CONNECT_DEFER_V2");
2144 ret = CC_RET_FAILED;
2145 }
2146 }
2147 else
2148 {
2149 msg(M_WARN, "WARNING: client-connect-v2 plugin call failed");
2150 ret = CC_RET_FAILED;
2151 }
2152
2153
2154 plugin_return_free(&pr);
2155 }
2156#endif /* ifdef ENABLE_PLUGIN */
2157 return ret;
2158}
2159
2160static enum client_connect_return
2162 uint64_t *option_types_found)
2163{
2164 ASSERT(mi);
2165 ASSERT(option_types_found);
2166 const struct client_connect_defer_state *ccs = &(mi->client_connect_defer_state);
2168
2170
2171 if (ret == CC_RET_SKIPPED)
2172 {
2173 /*
2174 * Skipped and deferred are equivalent in this context.
2175 * skipped means that the called program has not yet
2176 * written a return status implicitly needing more time
2177 * while deferred is the explicit notification that it
2178 * needs more time
2179 */
2180 ret = CC_RET_DEFERRED;
2181 }
2182
2183 if (ret == CC_RET_SUCCEEDED)
2184 {
2188 }
2189 if (ret == CC_RET_FAILED)
2190 {
2191 msg(M_INFO, "MULTI: deferred --client-connect script returned CC_RET_FAILED");
2194 }
2195 return ret;
2196}
2197
2201static enum client_connect_return
2203 uint64_t *option_types_found)
2204{
2205 if (deferred)
2206 {
2208 }
2209 ASSERT(m);
2210 ASSERT(mi);
2211
2214
2216 {
2217 struct argv argv = argv_new();
2218
2219 setenv_str(mi->context.c2.es, "script_type", "client-connect");
2220
2222 {
2223 ret = CC_RET_FAILED;
2224 goto cleanup;
2225 }
2226
2228 argv_printf_cat(&argv, "%s", ccs->config_file);
2229
2230 if (openvpn_run_script(&argv, mi->context.c2.es, 0, "--client-connect"))
2231 {
2233 {
2234 ret = CC_RET_DEFERRED;
2235 }
2236 else
2237 {
2238 multi_client_connect_post(m, mi, ccs->config_file, option_types_found);
2239 ret = CC_RET_SUCCEEDED;
2240 }
2241 }
2242 else
2243 {
2244 ret = CC_RET_FAILED;
2245 }
2246cleanup:
2247 if (ret != CC_RET_DEFERRED)
2248 {
2251 }
2252 argv_free(&argv);
2253 }
2254 return ret;
2255}
2256
2257static bool
2259 struct gc_arena *gc)
2260{
2261 if (!dco_enabled(&mi->context.options))
2262 {
2263 /* DCO not enabled, nothing to do, return sucess */
2264 return true;
2265 }
2266 int ret = dco_multi_add_new_peer(m, mi);
2267 if (ret < 0)
2268 {
2269 msg(D_DCO, "Cannot add peer to DCO for %s: %s (%d)", multi_instance_string(mi, false, gc),
2270 strerror(-ret), ret);
2271 return false;
2272 }
2273
2274 return true;
2275}
2276
2280static bool
2282{
2283 struct frame *frame_fragment = NULL;
2284#ifdef ENABLE_FRAGMENT
2285 if (c->options.ce.fragment)
2286 {
2287 frame_fragment = &c->c2.frame_fragment;
2288 }
2289#endif
2292 frame_fragment, get_link_socket_info(c),
2293 &c->c1.tuntap->dco))
2294 {
2295 msg(D_TLS_ERRORS, "TLS Error: initializing data channel failed");
2296 register_signal(c->sig, SIGUSR1, "process-push-msg-failed");
2297 return false;
2298 }
2299
2300 return true;
2301}
2302
2303static void
2305 const uint64_t option_types_found)
2306{
2307 ASSERT(m);
2308 ASSERT(mi);
2309
2310 struct gc_arena gc = gc_new();
2311 /*
2312 * Process sourced options.
2313 */
2314 do_deferred_options(&mi->context, option_types_found, false);
2315
2316 /*
2317 * make sure we got ifconfig settings from somewhere
2318 */
2320 {
2322 "MULTI: no dynamic or static remote "
2323 "--ifconfig address is available for %s",
2324 multi_instance_string(mi, false, &gc));
2325 }
2326
2327 /*
2328 * make sure that ifconfig settings comply with constraints
2329 */
2331 {
2332 const char *ifconfig_constraint_network =
2334 const char *ifconfig_constraint_netmask =
2336
2337 /* JYFIXME -- this should cause the connection to fail */
2339 "MULTI ERROR: primary virtual IP for %s (%s) "
2340 "violates tunnel network/netmask constraint (%s/%s)",
2341 multi_instance_string(mi, false, &gc),
2343 ifconfig_constraint_network, ifconfig_constraint_netmask);
2344 }
2345
2346 /* set our client's VPN endpoint for status reporting purposes */
2349
2350 /* set context-level authentication flag */
2352
2353 /* Since dco-win maintains iroute routing table (subnet -> peer),
2354 * peer must be added before iroutes. For other platforms it doesn't matter. */
2355
2356 /* authentication complete, calculate dynamic client specific options */
2358 {
2360 }
2361 /* only continue if setting protocol options worked */
2362 else if (!multi_client_setup_dco_initial(m, mi, &gc))
2363 {
2365 }
2366 /* Generate data channel keys only if setting protocol options
2367 * and DCO initial setup has not failed */
2369 {
2371 }
2372
2373 /* dco peer has been added, it is now safe for Windows to add iroutes */
2374
2375 /*
2376 * For routed tunnels, set up internal route to endpoint
2377 * plus add all iroute routes.
2378 */
2380 {
2382 {
2384 msg(D_MULTI_LOW, "MULTI: primary virtual IP for %s: %s",
2385 multi_instance_string(mi, false, &gc),
2387 }
2388
2390 {
2392 /* TODO: find out where addresses are "unlearned"!! */
2393 const char *ifconfig_local_ipv6 =
2395 msg(D_MULTI_LOW, "MULTI: primary virtual IPv6 for %s: %s",
2396 multi_instance_string(mi, false, &gc), ifconfig_local_ipv6);
2397 }
2398
2399 /* add routes locally, pointing to new client, if
2400 * --iroute options have been specified */
2401 multi_add_iroutes(m, mi);
2402
2403 /*
2404 * iroutes represent subnets which are "owned" by a particular
2405 * client. Therefore, do not actually push a route to a client
2406 * if it matches one of the client's iroutes.
2407 */
2409 }
2410 else if (mi->context.options.iroutes)
2411 {
2413 "MULTI: --iroute options rejected for %s -- iroute "
2414 "only works with tun-style tunnels",
2415 multi_instance_string(mi, false, &gc));
2416 }
2417
2418 /* send push reply if ready */
2420 {
2422 }
2423 gc_free(&gc);
2424}
2425
2426static void
2428{
2429 ASSERT(mi->context.c1.tuntap);
2430 /*
2431 * lock down the common name and cert hashes so they can't change
2432 * during future TLS renegotiations
2433 */
2436
2437 /* generate a msg() prefix for this client instance */
2438 generate_prefix(mi);
2439
2440 /* delete instances of previous clients with same common-name */
2441 if (!mi->context.options.duplicate_cn)
2442 {
2443 multi_delete_dup(m, mi);
2444 }
2445
2446 /* reset pool handle to null */
2447 mi->vaddr_handle = -1;
2448
2449 /* do --client-connect setenvs */
2451
2453}
2454
2455static bool
2456multi_check_dest_addr_allowed(struct multi_context *m, struct multi_instance *mi, const struct mroute_addr *real);
2457
2463static enum client_connect_return
2465 bool deferred, uint64_t *option_types_found)
2466{
2467 if (proto_is_tcp(mi->real.proto))
2468 {
2469 /* For TCP connection we neither need to be able to map incoming
2470 * DATA_V1 packets to the multi_instance nor do we need to ensure
2471 * that two TCP connections are not using the same address as the
2472 * OS takes care of that. */
2473 return CC_RET_SUCCEEDED;
2474 }
2475
2476 /* If the address is already taken up by another client we fail the new
2477 * connection */
2478 if (!multi_check_dest_addr_allowed(m, mi, &mi->real))
2479 {
2481 "MULTI: client IP address and port already assigned to another "
2482 "client, terminating connection");
2483 return CC_RET_FAILED;
2484 }
2485
2486 ASSERT(!mi->did_real_hash);
2487 ASSERT(hash_add(m->hash, &mi->real, mi, false));
2488 mi->did_real_hash = true;
2489 return CC_RET_SUCCEEDED;
2490}
2491
2498static enum client_connect_return
2500 bool deferred, uint64_t *option_types_found)
2501{
2502#ifdef USE_COMP
2503 struct options *o = &mi->context.options;
2504 const char *const peer_info = mi->context.c2.tls_multi->peer_info;
2505
2507 {
2508 if (peer_info && strstr(peer_info, "IV_COMP_STUBv2=1"))
2509 {
2510 push_option(o, "compress stub-v2", M_USAGE);
2511 }
2512 else
2513 {
2514 /* Client is old and does not support STUBv2 but since it
2515 * announced comp-lzo via OCC we assume it uses comp-lzo, so
2516 * switch to that and push the uncompressed variant. */
2517 push_option(o, "comp-lzo no", M_USAGE);
2518 o->comp.alg = COMP_ALG_STUB;
2519 *option_types_found |= OPT_P_COMP;
2520 }
2521 }
2522#endif
2523 return CC_RET_SUCCEEDED;
2524}
2525
2530static enum client_connect_return
2532 uint64_t *option_types_found)
2533{
2534 /* Since we never return a CC_RET_DEFERRED, this indicates a serious
2535 * problem */
2536 ASSERT(!deferred);
2539 {
2540 struct gc_arena gc = gc_new();
2541 const char *ccd_file = NULL;
2542
2543 const char *ccd_client =
2545 tls_common_name(mi->context.c2.tls_multi, false), &gc);
2546
2547 const char *ccd_default =
2549
2550
2551 /* try common-name file */
2552 if (platform_test_file(ccd_client))
2553 {
2554 ccd_file = ccd_client;
2555 }
2556 /* try default file */
2557 else if (platform_test_file(ccd_default))
2558 {
2559 ccd_file = ccd_default;
2560 }
2561
2562 if (ccd_file)
2563 {
2565 CLIENT_CONNECT_OPT_MASK, option_types_found, mi->context.c2.es);
2566 /*
2567 * Select a virtual address from either --ifconfig-push in
2568 * --client-config-dir file or --ifconfig-pool.
2569 */
2571
2573
2574 ret = CC_RET_SUCCEEDED;
2575 }
2576 gc_free(&gc);
2577 }
2578 return ret;
2579}
2580
2582 struct multi_context *m, struct multi_instance *mi, bool from_deferred,
2583 uint64_t *option_types_found);
2584
2595
2600static bool
2602{
2603 struct tls_multi *multi = mi->context.c2.tls_multi;
2604 const struct options *options = &mi->context.options;
2605 struct tls_session *session = &multi->session[TM_ACTIVE];
2606
2607 if (!multi->locked_username)
2608 {
2609 msg(D_MULTI_ERRORS, "MULTI: Ignoring override-username as no "
2610 "user/password method is enabled. Enable "
2611 "--management-client-auth, --auth-user-pass-verify, or a "
2612 "plugin with user/password verify capability.");
2613 return false;
2614 }
2615
2616 if (!multi->locked_original_username
2617 && strcmp(multi->locked_username, options->override_username) != 0)
2618 {
2619 /* Check if the username length is acceptable */
2621 {
2622 return false;
2623 }
2624
2626 multi->locked_username = strdup(options->override_username);
2627
2628 /* Override also the common name if username should be set as common
2629 * name */
2630 if ((session->opt->ssl_flags & SSLF_USERNAME_AS_COMMON_NAME))
2631 {
2633 free(multi->locked_cn);
2634 multi->locked_cn = NULL;
2635 tls_lock_common_name(multi);
2636 }
2637
2638 /* Regenerate the auth-token if enabled */
2639 if (multi->auth_token_initial)
2640 {
2641 struct user_pass up;
2642 CLEAR(up);
2643 strlcpy(up.username, multi->locked_username, sizeof(up.username));
2644
2645 generate_auth_token(&up, multi);
2646 }
2647
2649 "MULTI: Note, override-username changes username "
2650 "from '%s' to '%s'",
2652 }
2653 return true;
2654}
2655
2656/*
2657 * Called as soon as the SSL/TLS connection is authenticated.
2658 *
2659 * Will collect the client specific configuration from the different
2660 * sources like ccd files, connect plugins and management interface.
2661 *
2662 * This method starts with cas_context CAS_PENDING and will move the
2663 * state machine to either CAS_SUCCEEDED on success or
2664 * CAS_FAILED/CAS_PARTIAL on failure.
2665 *
2666 * Instance-specific directives to be processed (CLIENT_CONNECT_OPT_MASK)
2667 * include:
2668 *
2669 * iroute start-ip end-ip
2670 * ifconfig-push local remote-netmask
2671 * push
2672 *
2673 *
2674 */
2675static void
2677{
2678 /* We are only called for the CAS_PENDING_x states, so we
2679 * can ignore other states here */
2680 bool from_deferred = (mi->context.c2.tls_multi->multi_state != CAS_PENDING);
2681
2682 int *cur_handler_index = &mi->client_connect_defer_state.cur_handler_index;
2683 uint64_t *option_types_found = &mi->client_connect_defer_state.option_types_found;
2684
2685 /* We are called for the first time */
2686 if (!from_deferred)
2687 {
2688 *cur_handler_index = 0;
2689 *option_types_found = 0;
2690 /* Initially we have no handler that has returned a result */
2692
2694 }
2695
2696 bool cc_succeeded = true;
2697
2698 while (cc_succeeded && client_connect_handlers[*cur_handler_index] != NULL)
2699 {
2700 enum client_connect_return ret;
2701 ret = client_connect_handlers[*cur_handler_index](m, mi, from_deferred, option_types_found);
2702
2703 from_deferred = false;
2704
2705 switch (ret)
2706 {
2707 case CC_RET_SUCCEEDED:
2708 /*
2709 * Remember that we already had at least one handler
2710 * returning a result should we go to into deferred state
2711 */
2712 mi->context.c2.tls_multi->multi_state = CAS_PENDING_DEFERRED_PARTIAL;
2713 break;
2714
2715 case CC_RET_SKIPPED:
2716 /*
2717 * Move on with the next handler without modifying any
2718 * other state
2719 */
2720 break;
2721
2722 case CC_RET_DEFERRED:
2723 /*
2724 * we already set multi_status to DEFERRED_RESULT or
2725 * DEFERRED_NO_RESULT. We just return
2726 * from the function as having multi_status
2727 */
2728 return;
2729
2730 case CC_RET_FAILED:
2731 /*
2732 * One handler failed. We abort the chain and set the final
2733 * result to failed
2734 */
2735 cc_succeeded = false;
2736 break;
2737
2738 default:
2739 ASSERT(0);
2740 }
2741
2742 /*
2743 * Check for "disable" directive in client-config-dir file
2744 * or config file generated by --client-connect script.
2745 */
2746 if (mi->context.options.disable)
2747 {
2748 msg(D_MULTI_ERRORS, "MULTI: client has been rejected due to "
2749 "'disable' directive");
2750 cc_succeeded = false;
2751 }
2752
2753 (*cur_handler_index)++;
2754 }
2755
2757 {
2758 if (!override_locked_username(mi))
2759 {
2760 cc_succeeded = false;
2761 }
2762 }
2763
2764 /* Check if we have forbidding options in the current mode */
2765 if (dco_enabled(&mi->context.options)
2767 {
2768 msg(D_MULTI_ERRORS, "MULTI: client has been rejected due to incompatible DCO options");
2769 cc_succeeded = false;
2770 }
2771
2773 {
2774 msg(D_MULTI_ERRORS, "MULTI: client has been rejected due to invalid compression options");
2775 cc_succeeded = false;
2776 }
2777
2778 if (cc_succeeded)
2779 {
2780 multi_client_connect_late_setup(m, mi, *option_types_found);
2781 }
2782 else
2783 {
2784 /* run the disconnect script if we had a connect script that
2785 * did not fail */
2787 {
2789 }
2790
2792 }
2793
2794 /* increment number of current authenticated clients */
2795 ++m->n_clients;
2796 --mi->n_clients_delta;
2797
2798#ifdef ENABLE_MANAGEMENT
2799 if (management)
2800 {
2802 mi->context.c2.es);
2803 }
2804#endif
2805}
2806
2807#ifdef ENABLE_ASYNC_PUSH
2808/*
2809 * Called when inotify event is fired, which happens when acf
2810 * or connect-status file is closed or deleted.
2811 * Continues authentication and sends push_reply
2812 * (or be deferred again by client-connect)
2813 */
2814void
2815multi_process_file_closed(struct multi_context *m, const unsigned int mpp_flags)
2816{
2817 char buffer[INOTIFY_EVENT_BUFFER_SIZE];
2818 ssize_t buffer_i = 0;
2819 ssize_t r = read(m->top.c2.inotify_fd, buffer, INOTIFY_EVENT_BUFFER_SIZE);
2820 if (r < 0)
2821 {
2822 msg(M_WARN | M_ERRNO, "MULTI: multi_process_file_closed error");
2823 return;
2824 }
2825
2826 while (buffer_i < r)
2827 {
2828 /* parse inotify events */
2829 struct inotify_event *pevent = (struct inotify_event *)&buffer[buffer_i];
2830 size_t event_size = sizeof(struct inotify_event) + pevent->len;
2831 buffer_i += event_size;
2832
2833 msg(D_MULTI_DEBUG, "MULTI: modified fd %d, mask %d", pevent->wd, pevent->mask);
2834
2835 struct multi_instance *mi =
2836 hash_lookup(m->inotify_watchers, (void *)(uintptr_t)pevent->wd);
2837
2838 if (pevent->mask & IN_CLOSE_WRITE)
2839 {
2840 if (mi)
2841 {
2842 /* continue authentication, perform NCP negotiation and send push_reply */
2843 multi_process_post(m, mi, mpp_flags);
2844 }
2845 else
2846 {
2847 msg(D_MULTI_ERRORS, "MULTI: multi_instance not found!");
2848 }
2849 }
2850 else if (pevent->mask & IN_IGNORED)
2851 {
2852 /* this event is _always_ fired when watch is removed or file is deleted */
2853 if (mi)
2854 {
2855 hash_remove(m->inotify_watchers, (void *)(uintptr_t)pevent->wd);
2856 mi->inotify_watch = -1;
2857 }
2858 }
2859 else
2860 {
2861 msg(D_MULTI_ERRORS, "MULTI: unknown mask %d", pevent->mask);
2862 }
2863 }
2864}
2865#endif /* ifdef ENABLE_ASYNC_PUSH */
2866
2867/*
2868 * Add a mbuf buffer to a particular
2869 * instance.
2870 */
2871static void
2872multi_add_mbuf(struct multi_context *m, struct multi_instance *mi, struct mbuf_buffer *mb)
2873{
2874 if (multi_output_queue_ready(m, mi))
2875 {
2876 struct mbuf_item item;
2877 item.buffer = mb;
2878 item.instance = mi;
2879 mbuf_add_item(m->mbuf, &item);
2880 }
2881 else
2882 {
2883 msg(D_MULTI_DROPPED, "MULTI: packet dropped due to output saturation (multi_add_mbuf)");
2884 }
2885}
2886
2887/*
2888 * Add a packet to a client instance output queue.
2889 */
2890static inline void
2891multi_unicast(struct multi_context *m, const struct buffer *buf, struct multi_instance *mi)
2892{
2893 struct mbuf_buffer *mb;
2894
2895 if (BLEN(buf) > 0)
2896 {
2897 mb = mbuf_alloc_buf(buf);
2898 mb->flags = MF_UNICAST;
2899 multi_add_mbuf(m, mi, mb);
2900 mbuf_free_buf(mb);
2901 }
2902}
2903
2904/*
2905 * Broadcast a packet to all clients.
2906 */
2907static void
2908multi_bcast(struct multi_context *m, const struct buffer *buf,
2909 const struct multi_instance *sender_instance, uint16_t vid)
2910{
2911 struct mbuf_buffer *mb;
2912
2913 if (BLEN(buf) > 0)
2914 {
2915#ifdef MULTI_DEBUG_EVENT_LOOP
2916 printf("BCAST len=%d\n", BLEN(buf));
2917#endif
2918 mb = mbuf_alloc_buf(buf);
2919
2920 for (uint32_t i = 0; i <= m->max_peerid; i++)
2921 {
2922 struct multi_instance *mi = m->instances[i];
2923
2924 if (mi && mi != sender_instance && !mi->halt)
2925 {
2926 if (vid != 0 && vid != mi->context.options.vlan_pvid)
2927 {
2928 continue;
2929 }
2930 multi_add_mbuf(m, mi, mb);
2931 }
2932 }
2933 mbuf_free_buf(mb);
2934 }
2935}
2936
2937/*
2938 * Given a time delta, indicating that we wish to be
2939 * awoken by the scheduler at time now + delta, figure
2940 * a sigma parameter (in microseconds) that represents
2941 * a sort of fuzz factor around delta, so that we're
2942 * really telling the scheduler to wake us up any time
2943 * between now + delta - sigma and now + delta + sigma.
2944 *
2945 * The sigma parameter helps the scheduler to run more efficiently.
2946 * Sigma should be no larger than TV_WITHIN_SIGMA_MAX_USEC
2947 */
2948static inline unsigned int
2949compute_wakeup_sigma(const struct timeval *delta)
2950{
2951 ASSERT(delta->tv_sec >= 0);
2952 ASSERT(delta->tv_usec >= 0);
2953 if (delta->tv_sec < 1)
2954 {
2955 /* if < 1 sec, fuzz = # of microseconds / 8 */
2956 return (unsigned int)(delta->tv_usec >> 3);
2957 }
2958 else
2959 {
2960 /* if < 10 minutes, fuzz = 13.1% of timeout */
2961 if (delta->tv_sec < 600)
2962 {
2963 return (unsigned int)(delta->tv_sec << 17);
2964 }
2965 else
2966 {
2967 return 120 * 1000000; /* if >= 10 minutes, fuzz = 2 minutes */
2968 }
2969 }
2970}
2971
2972static void
2974{
2975 /* calculate an absolute wakeup time */
2976 ASSERT(!openvpn_gettimeofday(&mi->wakeup, NULL));
2977 tv_add(&mi->wakeup, &mi->context.c2.timeval);
2978
2979 /* tell scheduler to wake us up at some point in the future */
2980 schedule_add_entry(m->schedule, (struct schedule_entry *)mi, &mi->wakeup,
2982}
2983
2984#if defined(ENABLE_ASYNC_PUSH)
2985static void
2986add_inotify_file_watch(struct multi_context *m, struct multi_instance *mi, int inotify_fd,
2987 const char *file)
2988{
2989 /* watch acf file */
2990 int watch_descriptor = inotify_add_watch(inotify_fd, file, IN_CLOSE_WRITE | IN_ONESHOT);
2991 if (watch_descriptor >= 0)
2992 {
2993 if (mi->inotify_watch != -1)
2994 {
2995 hash_remove(m->inotify_watchers, (void *)(uintptr_t)mi->inotify_watch);
2996 }
2997 hash_add(m->inotify_watchers, (void *)(uintptr_t)watch_descriptor, mi, true);
2998 mi->inotify_watch = watch_descriptor;
2999 }
3000 else
3001 {
3002 msg(M_NONFATAL | M_ERRNO, "MULTI: inotify_add_watch error");
3003 }
3004}
3005#endif /* if defined(ENABLE_ASYNC_PUSH) */
3006
3007/*
3008 * Figure instance-specific timers, convert
3009 * earliest to absolute time in mi->wakeup,
3010 * call scheduler with our future wakeup time.
3011 *
3012 * Also close context on signal.
3013 */
3014bool
3015multi_process_post(struct multi_context *m, struct multi_instance *mi, const unsigned int flags)
3016{
3017 bool ret = true;
3018
3019 if (!IS_SIG(&mi->context)
3020 && ((flags & MPP_PRE_SELECT)))
3021 {
3022#if defined(ENABLE_ASYNC_PUSH)
3023 bool was_unauthenticated = true;
3024 const struct key_state *ks = NULL;
3025 if (mi->context.c2.tls_multi)
3026 {
3028 was_unauthenticated = (ks->authenticated == KS_AUTH_FALSE);
3029 }
3030#endif
3031
3032 /* figure timeouts and fetch possible outgoing
3033 * to_link packets (such as ping or TLS control) */
3034 pre_select(&mi->context);
3035
3036#if defined(ENABLE_ASYNC_PUSH)
3037 /*
3038 * if we see the state transition from unauthenticated to deferred
3039 * and an auth_control_file, we assume it got just added and add
3040 * inotify watch to that file
3041 */
3042 if (ks && ks->plugin_auth.auth_control_file && was_unauthenticated
3043 && (ks->authenticated == KS_AUTH_DEFERRED))
3044 {
3045 add_inotify_file_watch(m, mi, m->top.c2.inotify_fd, ks->plugin_auth.auth_control_file);
3046 }
3047 if (ks && ks->script_auth.auth_control_file && was_unauthenticated
3048 && (ks->authenticated == KS_AUTH_DEFERRED))
3049 {
3050 add_inotify_file_watch(m, mi, m->top.c2.inotify_fd, ks->script_auth.auth_control_file);
3051 }
3052#endif
3053
3054 if (!IS_SIG(&mi->context))
3055 {
3056 /* connection is "established" when SSL/TLS key negotiation succeeds
3057 * and (if specified) auth user/pass succeeds */
3058
3060 {
3062 }
3063#if defined(ENABLE_ASYNC_PUSH)
3066 {
3067 add_inotify_file_watch(m, mi, m->top.c2.inotify_fd,
3069 }
3070#endif
3071 /* tell scheduler to wake us up at some point in the future */
3073 }
3074 }
3075
3076 if (IS_SIG(&mi->context))
3077 {
3078 if (flags & MPP_CLOSE_ON_SIGNAL)
3079 {
3081 ret = false;
3082 }
3083 }
3084 else
3085 {
3086 /* continue to pend on output? */
3087 multi_set_pending(m, ANY_OUT(&mi->context) ? mi : NULL);
3088
3089#ifdef MULTI_DEBUG_EVENT_LOOP
3090 printf("POST %s[%d] to=%d lo=%d/%d w=%" PRIi64 "/%ld\n", id(mi), (int)(mi == m->pending),
3092 mi->context.c2.fragment ? mi->context.c2.fragment->outgoing.len : -1,
3093 (int64_t)mi->context.c2.timeval.tv_sec, (long)mi->context.c2.timeval.tv_usec);
3094#endif
3095 }
3096
3097 if ((flags & MPP_RECORD_TOUCH) && m->mpp_touched)
3098 {
3099 *m->mpp_touched = mi;
3100 }
3101
3102 return ret;
3103}
3104
3115static bool
3117 const struct mroute_addr *real)
3118{
3119 struct hash *hash = m->hash;
3120 const uint64_t hv = hash_value(hash, real);
3121 struct hash_bucket *bucket = hash_bucket(hash, hv);
3122
3123 /* make sure that we don't assign the client to an address taken by
3124 * another client */
3125 struct hash_element *he = hash_lookup_fast(hash, bucket, real, hv);
3126 if (!he)
3127 {
3128 /* Address is not taken, everything is fine. */
3129 return true;
3130 }
3131
3132 struct multi_instance *ex_mi = he->value;
3133
3134 const struct tls_multi *m1 = mi->context.c2.tls_multi;
3135 const struct tls_multi *m2 = ex_mi->context.c2.tls_multi;
3136
3137 struct gc_arena gc = gc_new();
3138 int ret = false;
3139
3140 /* do not allow if target address is taken by client with another cert */
3142 {
3143 msg(D_MULTI_LOW, "Disallow float/connect to an address taken by another client %s",
3144 multi_instance_string(ex_mi, false, &gc));
3145
3146 mi->context.c2.buf.len = 0;
3147 goto done;
3148 }
3149
3150 /* do not allow if target address has a different username */
3151 if (m1->locked_username || m2->locked_username)
3152 {
3153 if (!m1->locked_username || !m2->locked_username
3154 || strcmp(m1->locked_username, m2->locked_username) != 0)
3155 {
3156 msg(D_MULTI_LOW, "Disallow float/connect to an address taken by another client %s",
3157 multi_instance_string(ex_mi, false, &gc));
3158 mi->context.c2.buf.len = 0;
3159 goto done;
3160 }
3161 }
3162
3163 /* It doesn't make sense to let a peer float to the address it already
3164 * has, so we disallow it. This can happen if a DCO netlink notification
3165 * gets lost and we miss a floating step.
3166 */
3167 if (m1->rx_peer_id == m2->rx_peer_id)
3168 {
3169 msg(M_WARN,
3170 "disallowing peer %" PRIu32 " (%s) from floating to "
3171 "its own address (%s)",
3173 mroute_addr_print(&mi->real, &gc));
3174 goto done;
3175 }
3176
3178 "closing instance %s due to float collision with %s "
3179 "using the same certificate and username",
3180 multi_instance_string(ex_mi, false, &gc), multi_instance_string(mi, false, &gc));
3181 multi_close_instance(m, ex_mi, false);
3182 ret = true;
3183
3184done:
3185 gc_free(&gc);
3186 return ret;
3187}
3188
3197static void
3199{
3200 struct mroute_addr real = { 0 };
3201
3202 if (mi->real.type & MR_WITH_PROTO)
3203 {
3204 real.type |= MR_WITH_PROTO;
3205 real.proto = sock->info.proto;
3206 }
3207
3208 if (!mroute_extract_openvpn_sockaddr(&real, &m->top.c2.from.dest, true))
3209 {
3210 return;
3211 }
3212
3213 if (!multi_check_dest_addr_allowed(m, mi, &real))
3214 {
3215 return;
3216 }
3217
3218 struct gc_arena gc = gc_new();
3219
3220 msg(D_MULTI_MEDIUM, "peer %" PRIu32 " (%s) floated from %s to %s",
3222 tls_common_name(mi->context.c2.tls_multi, false),
3225
3226 /* remove old address from hash table before changing address */
3227 ASSERT(hash_remove(m->hash, &mi->real));
3228
3229 /* change external network address of the remote peer */
3230 mi->real = real;
3231 generate_prefix(mi);
3232
3233 mi->context.c2.from = m->top.c2.from;
3234 mi->context.c2.to_link_addr = &mi->context.c2.from;
3235
3236 /* inherit parent link_socket and link_socket_info */
3237 mi->context.c2.link_sockets[0] = sock;
3239
3241
3242 ASSERT(hash_add(m->hash, &mi->real, mi, false));
3243
3244#ifdef ENABLE_MANAGEMENT
3245 ASSERT(hash_add(m->cid_hash, &mi->context.c2.mda_context.cid, mi, true));
3246#endif
3247
3248 gc_free(&gc);
3249}
3250
3251/*
3252 * Called when an instance should be closed due to the
3253 * reception of a soft signal.
3254 */
3255void
3257{
3258 remap_signal(&mi->context);
3259 set_prefix(mi);
3260 print_signal(mi->context.sig, "client-instance", D_MULTI_LOW);
3261 clear_prefix();
3262 multi_close_instance(m, mi, false);
3263}
3264
3265#if (defined(ENABLE_DCO) && (defined(TARGET_LINUX) || defined(TARGET_FREEBSD))) \
3266 || defined(ENABLE_MANAGEMENT)
3267static void
3268multi_signal_instance(struct multi_context *m, struct multi_instance *mi, const int sig)
3269{
3270 mi->context.sig->signal_received = sig;
3272}
3273#endif
3274
3275#if defined(ENABLE_DCO)
3276static void
3277process_incoming_del_peer(struct multi_context *m, struct multi_instance *mi, const dco_context_t *dco)
3278{
3279 const char *reason = "ovpn-dco: unknown reason";
3280 switch (dco->dco_del_peer_reason)
3281 {
3283 reason = "ovpn-dco: ping expired";
3284 break;
3285
3287 reason = "ovpn-dco: transport error";
3288 break;
3289
3291 reason = "ovpn-dco: transport disconnected";
3292 break;
3293
3295 /* We assume that is ourselves. Unfortunately, sometimes these
3296 * events happen with enough delay that they can have an order of
3297 *
3298 * dco_del_peer x
3299 * [new client connecting]
3300 * dco_new_peer x
3301 * event from dco_del_peer arrives.
3302 *
3303 * if we do not ignore this we get desynced with the kernel
3304 * since we assume the peer-id is free again. The other way would
3305 * be to send a dco_del_peer again
3306 */
3307 return;
3308 }
3309
3310 /* When kernel already deleted the peer, the socket is no longer
3311 * installed, and we do not need to clean up the state in the kernel */
3312 mi->context.c2.tls_multi->dco_peer_id = -1;
3313 mi->context.sig->signal_text = reason;
3315}
3316
3317void
3319{
3320 ASSERT(dco->c->multi);
3321
3322 struct multi_context *m = dco->c->multi;
3323
3324 int peer_id = dco->dco_message_peer_id;
3325
3326 /* no peer-specific message delivered -> nothing to process.
3327 * bail out right away
3328 */
3329 if (peer_id < 0)
3330 {
3331 return;
3332 }
3333
3334 if (((uint32_t)peer_id < m->max_clients) && m->instances[peer_id])
3335 {
3336 struct multi_instance *mi = m->instances[peer_id];
3337 set_prefix(mi);
3338 if (dco->dco_message_type == OVPN_CMD_DEL_PEER)
3339 {
3340 process_incoming_del_peer(m, mi, dco);
3341 }
3342 else if (dco->dco_message_type == OVPN_CMD_FLOAT_PEER)
3343 {
3344 ASSERT(mi->context.c2.link_sockets[0]);
3346 &m->top.c2.from.dest,
3347 (struct sockaddr *)&dco->dco_float_peer_ss);
3349 CLEAR(dco->dco_float_peer_ss);
3350 }
3351 else if (dco->dco_message_type == OVPN_CMD_SWAP_KEYS)
3352 {
3354 }
3355 clear_prefix();
3356 }
3357 else
3358 {
3359 msglvl_t msglevel = D_DCO;
3360 if (dco->dco_message_type == OVPN_CMD_DEL_PEER
3361 && dco->dco_del_peer_reason == OVPN_DEL_PEER_REASON_USERSPACE)
3362 {
3363 /* we receive OVPN_CMD_DEL_PEER message with reason USERSPACE
3364 * after we kill the peer ourselves. This peer may have already
3365 * been deleted, so we end up here.
3366 * In this case, print the following debug message with DCO_DEBUG
3367 * level only to avoid polluting the standard DCO level with this
3368 * harmless event.
3369 */
3370 msglevel = D_DCO_DEBUG;
3371 }
3372 msg(msglevel,
3373 "Received DCO message for unknown peer-id: %d, "
3374 "type %d, del_peer_reason %d",
3375 peer_id, dco->dco_message_type, dco->dco_del_peer_reason);
3376 }
3377}
3378#endif /* if defined(ENABLE_DCO) */
3379
3386static void
3387multi_process_incoming_link_data(struct multi_context *m, bool floated, struct link_socket *sock)
3388{
3389 struct link_socket_info *lsi = &sock->info;
3390 const uint8_t *orig_buf;
3391
3392 /* decrypt in instance context */
3393 struct context *c = &m->pending->context;
3394
3395 orig_buf = c->c2.buf.data;
3396 if (process_incoming_link_part1(c, lsi, floated))
3397 {
3398 /* nonzero length means that we have a valid, decrypted packed */
3399 if (floated && c->c2.buf.len > 0)
3400 {
3401 multi_process_float(m, m->pending, sock);
3402 }
3403
3404 process_incoming_link_part2(c, lsi, orig_buf);
3405 }
3406
3408 {
3409 struct mroute_addr src, dest;
3410 /* extract packet source and dest addresses */
3411 unsigned int mroute_flags =
3413
3414 /* drop packet if extract failed */
3415 if (!(mroute_flags & MROUTE_EXTRACT_SUCCEEDED))
3416 {
3417 c->c2.to_tun.len = 0;
3418 }
3419 /* make sure that source address is associated with this client */
3420 else if (multi_get_instance_by_virtual_addr(m, &src, true) != m->pending)
3421 {
3422 /* IPv6 link-local address (fe80::xxx)? */
3423 if ((src.type & MR_ADDR_MASK) == MR_ADDR_IPV6
3424 && IN6_IS_ADDR_LINKLOCAL(&src.v6.addr))
3425 {
3426 /* do nothing, for now. TODO: add address learning */
3427 }
3428 else
3429 {
3430 struct gc_arena gc = gc_new();
3432 "MULTI: bad source address from client [%s], packet dropped",
3433 mroute_addr_print(&src, &gc));
3434 gc_free(&gc);
3435 }
3436 c->c2.to_tun.len = 0;
3437 }
3438 /* client-to-client communication enabled? */
3439 else if (m->enable_c2c)
3440 {
3441 /* multicast? */
3442 if (mroute_flags & MROUTE_EXTRACT_MCAST)
3443 {
3444 /* for now, treat multicast as broadcast */
3445 multi_bcast(m, &c->c2.to_tun, m->pending, 0);
3446 }
3447 else /* possible client to client routing */
3448 {
3449 ASSERT(!(mroute_flags & MROUTE_EXTRACT_BCAST));
3450 struct multi_instance *mi = multi_get_instance_by_virtual_addr(m, &dest, true);
3451
3452 /* if dest addr is a known client, route to it */
3453 if (mi)
3454 {
3455 {
3456 multi_unicast(m, &c->c2.to_tun, mi);
3458 }
3459 c->c2.to_tun.len = 0;
3460 }
3461 }
3462 }
3463 }
3464 else if (TUNNEL_TYPE(m->top.c1.tuntap) == DEV_TYPE_TAP)
3465 {
3466 uint16_t vid = 0;
3467
3468 if (m->top.options.vlan_tagging)
3469 {
3470 if (vlan_is_tagged(&c->c2.to_tun))
3471 {
3472 /* Drop VLAN-tagged frame. */
3473 msg(D_VLAN_DEBUG, "dropping incoming VLAN-tagged frame");
3474 c->c2.to_tun.len = 0;
3475 }
3476 else
3477 {
3478 vid = c->options.vlan_pvid;
3479 }
3480 }
3481 /* extract packet source and dest addresses */
3482 struct mroute_addr src, dest;
3483 /* extract packet source and dest addresses */
3484 unsigned int mroute_flags =
3486
3487 if (mroute_flags & MROUTE_EXTRACT_SUCCEEDED)
3488 {
3489 if (multi_learn_addr(m, m->pending, &src, 0) == m->pending)
3490 {
3491 /* check for broadcast */
3492 if (m->enable_c2c)
3493 {
3494 if (mroute_flags & (MROUTE_EXTRACT_BCAST | MROUTE_EXTRACT_MCAST))
3495 {
3496 multi_bcast(m, &c->c2.to_tun, m->pending, vid);
3497 }
3498 else /* try client-to-client routing */
3499 {
3500 struct multi_instance *mi = multi_get_instance_by_virtual_addr(m, &dest, false);
3501
3502 /* if dest addr is a known client, route to it */
3503 if (mi)
3504 {
3505 multi_unicast(m, &c->c2.to_tun, mi);
3507 c->c2.to_tun.len = 0;
3508 }
3509 }
3510 }
3511 }
3512 else
3513 {
3514 struct gc_arena gc = gc_new();
3516 "MULTI: bad source address from client [%s], packet dropped",
3517 mroute_addr_print(&src, &gc));
3518 c->c2.to_tun.len = 0;
3519 gc_free(&gc);
3520 }
3521 }
3522 else
3523 {
3524 c->c2.to_tun.len = 0;
3525 }
3526 }
3527}
3528
3529/*
3530 * Process packets in the TCP/UDP socket -> TUN/TAP interface direction,
3531 * i.e. client -> server direction.
3532 */
3533bool
3535 const unsigned int mpp_flags, struct link_socket *sock)
3536{
3537 struct context *c;
3538 bool ret = true;
3539 bool floated = false;
3540
3541 if (m->pending)
3542 {
3543 return true;
3544 }
3545
3546 if (!instance)
3547 {
3548#ifdef MULTI_DEBUG_EVENT_LOOP
3549 printf("TCP/UDP -> TUN [%d]\n", BLEN(&m->top.c2.buf));
3550#endif
3551 multi_set_pending(m, multi_get_create_instance_udp(m, &floated, sock));
3552 }
3553 else
3554 {
3555 multi_set_pending(m, instance);
3556 }
3557
3558 if (!m->pending)
3559 {
3560 return true;
3561 }
3562 set_prefix(m->pending);
3563
3564 /* get instance context */
3565 c = &m->pending->context;
3566
3567 if (!instance)
3568 {
3569 /* transfer packet pointer from top-level context buffer to instance */
3570 c->c2.buf = m->top.c2.buf;
3571
3572 /* transfer from-addr from top-level context buffer to instance */
3573 if (!floated)
3574 {
3575 c->c2.from = m->top.c2.from;
3576 }
3577 }
3578
3579 if (BLEN(&c->c2.buf) > 0)
3580 {
3581 multi_process_incoming_link_data(m, floated, sock);
3582 }
3583
3584 /* postprocess and set wakeup */
3585 ret = multi_process_post(m, m->pending, mpp_flags);
3586
3587 clear_prefix();
3588
3589 return ret;
3590}
3591
3592/*
3593 * Process packets in the TUN/TAP interface -> TCP/UDP socket direction,
3594 * i.e. server -> client direction.
3595 */
3596bool
3597multi_process_incoming_tun(struct multi_context *m, const unsigned int mpp_flags)
3598{
3599 bool ret = true;
3600
3601 if (BLEN(&m->top.c2.buf) > 0)
3602 {
3603 unsigned int mroute_flags;
3604 struct mroute_addr src = { 0 }, dest = { 0 };
3605 const int dev_type = TUNNEL_TYPE(m->top.c1.tuntap);
3606 int16_t vid = 0;
3607
3608#ifdef MULTI_DEBUG_EVENT_LOOP
3609 printf("TUN -> TCP/UDP [%d]\n", BLEN(&m->top.c2.buf));
3610#endif
3611
3612 if (m->pending)
3613 {
3614 return true;
3615 }
3616
3617 if (dev_type == DEV_TYPE_TAP && m->top.options.vlan_tagging)
3618 {
3619 vid = vlan_decapsulate(&m->top, &m->top.c2.buf);
3620 if (vid < 0)
3621 {
3622 return false;
3623 }
3624 }
3625
3626 /*
3627 * Route an incoming tun/tap packet to
3628 * the appropriate multi_instance object.
3629 */
3630 mroute_flags = mroute_extract_addr_from_packet(&src, &dest, vid, &m->top.c2.buf, dev_type);
3631
3632 if (mroute_flags & MROUTE_EXTRACT_SUCCEEDED)
3633 {
3634 struct context *c;
3635
3636 /* broadcast or multicast dest addr? */
3637 if (mroute_flags & (MROUTE_EXTRACT_BCAST | MROUTE_EXTRACT_MCAST))
3638 {
3639 /* for now, treat multicast as broadcast */
3640 multi_bcast(m, &m->top.c2.buf, NULL, vid);
3641 }
3642 else
3643 {
3645 m, multi_get_instance_by_virtual_addr(m, &dest, dev_type == DEV_TYPE_TUN));
3646
3647 if (m->pending)
3648 {
3649 /* get instance context */
3650 c = &m->pending->context;
3651
3652 set_prefix(m->pending);
3653
3654 {
3656 {
3657 /* transfer packet pointer from top-level context buffer to instance */
3658 c->c2.buf = m->top.c2.buf;
3659 }
3660 else
3661 {
3662 /* drop packet */
3664 "MULTI: packet dropped due to output saturation (multi_process_incoming_tun)");
3665 buf_reset_len(&c->c2.buf);
3666 }
3667 }
3668
3669 /* encrypt in instance context */
3671
3672 /* postprocess and set wakeup */
3673 ret = multi_process_post(m, m->pending, mpp_flags);
3674
3675 clear_prefix();
3676 }
3677 }
3678 }
3679 }
3680 return ret;
3681}
3682
3683/*
3684 * Process a possible client-to-client/bcast/mcast message in the
3685 * queue.
3686 */
3687struct multi_instance *
3689{
3690 struct mbuf_item item;
3691
3692 if (mbuf_extract_item(ms, &item)) /* cleartext IP packet */
3693 {
3694 unsigned int pip_flags = PIPV4_PASSTOS | PIPV6_ICMP_NOHOST_SERVER;
3695
3696 set_prefix(item.instance);
3697 item.instance->context.c2.buf = item.buffer->buf;
3698 if (item.buffer->flags
3699 & MF_UNICAST) /* --mssfix doesn't make sense for broadcast or multicast */
3700 {
3701 pip_flags |= PIP_MSSFIX;
3702 }
3703 process_ip_header(&item.instance->context, pip_flags, &item.instance->context.c2.buf,
3704 item.instance->context.c2.link_sockets[0]);
3705 encrypt_sign(&item.instance->context, true);
3706 mbuf_free_buf(item.buffer);
3707
3708 dmsg(D_MULTI_DEBUG, "MULTI: C2C/MCAST/BCAST");
3709
3710 clear_prefix();
3711 return item.instance;
3712 }
3713 else
3714 {
3715 return NULL;
3716 }
3717}
3718
3719/*
3720 * Called when an I/O wait times out. Usually means that a particular
3721 * client instance object needs timer-based service.
3722 */
3723bool
3724multi_process_timeout(struct multi_context *m, const unsigned int mpp_flags)
3725{
3726 bool ret = true;
3727
3728#ifdef MULTI_DEBUG_EVENT_LOOP
3729 printf("%s -> TIMEOUT\n", id(m->earliest_wakeup));
3730#endif
3731
3732 /* instance marked for wakeup? */
3733 if (m->earliest_wakeup)
3734 {
3736 {
3740 }
3741 else
3742 {
3744 ret = multi_process_post(m, m->earliest_wakeup, mpp_flags);
3745 clear_prefix();
3746 }
3747 m->earliest_wakeup = NULL;
3748 }
3749 return ret;
3750}
3751
3752/*
3753 * Per-client route quota management
3754 */
3755
3756void
3758{
3759 struct gc_arena gc = gc_new();
3761 "MULTI ROUTE: route quota (%d) exceeded for %s (see --max-routes-per-client option)",
3763 gc_free(&gc);
3764}
3765
3766#ifdef ENABLE_DEBUG
3767/*
3768 * Flood clients with random packets
3769 */
3770static void
3771gremlin_flood_clients(struct multi_context *m)
3772{
3773 const int level = GREMLIN_PACKET_FLOOD_LEVEL(m->top.options.gremlin);
3774 if (level)
3775 {
3776 struct gc_arena gc = gc_new();
3777 struct buffer buf = alloc_buf_gc(BUF_SIZE(&m->top.c2.frame), &gc);
3778 struct packet_flood_parms parm = get_packet_flood_parms(level);
3779 int i;
3780
3781 ASSERT(buf_init(&buf, m->top.c2.frame.buf.headroom));
3782 parm.packet_size = min_int(parm.packet_size, m->top.c2.frame.buf.payload_size);
3783
3784 msg(D_GREMLIN, "GREMLIN_FLOOD_CLIENTS: flooding clients with %d packets of size %d",
3785 parm.n_packets, parm.packet_size);
3786
3787 for (i = 0; i < parm.packet_size; ++i)
3788 {
3789 ASSERT(buf_write_u8(&buf, (uint8_t)(get_random() & 0xFF)));
3790 }
3791
3792 for (i = 0; i < parm.n_packets; ++i)
3793 {
3794 multi_bcast(m, &buf, NULL, 0);
3795 }
3796
3797 gc_free(&gc);
3798 }
3799}
3800#endif /* ifdef ENABLE_DEBUG */
3801
3802static bool
3804{
3805 struct timeval null;
3806 CLEAR(null);
3808}
3809
3810/*
3811 * Process timers in the top-level context
3812 */
3813void
3815{
3816 /* possibly reap instances/routes in vhash */
3818
3819 /* possibly print to status log */
3820 if (m->top.c1.status_output)
3821 {
3823 {
3825 }
3826 }
3827
3828 /* possibly flush ifconfig-pool file */
3830
3831#ifdef ENABLE_DEBUG
3832 gremlin_flood_clients(m);
3833#endif
3834
3835 /* Should we check for stale routes? */
3837 {
3839 }
3840}
3841
3842static void
3844{
3845 inherit_context_top(&top->multi->top, top);
3847}
3848
3849static void
3855
3856static bool
3858{
3859 return (sig == SIGUSR1 || sig == SIGTERM || sig == SIGHUP || sig == SIGINT);
3860}
3861
3862static void
3864{
3865 /* tell all clients to restart */
3866 for (uint32_t i = 0; i <= m->max_peerid; i++)
3867 {
3868 struct multi_instance *mi = m->instances[i];
3869 if (mi && !mi->halt && proto_is_dgram(mi->context.c2.link_sockets[0]->info.proto))
3870 {
3871 send_control_channel_string(&mi->context, next_server ? "RESTART,[N]" : "RESTART",
3872 D_PUSH);
3874 }
3875 }
3876
3877 /* reschedule signal */
3879 struct timeval tv = { .tv_sec = 2, .tv_usec = 0 };
3881
3883
3887
3888 signal_reset(m->top.sig, 0);
3889}
3890
3891/*
3892 * Return true if event loop should break,
3893 * false if it should continue.
3894 */
3895bool
3897{
3898 if (signal_reset(m->top.sig, SIGUSR2) == SIGUSR2)
3899 {
3900 struct status_output *so = status_open(NULL, 0, M_INFO, NULL, 0);
3902 status_close(so);
3903 return false;
3904 }
3908 {
3910 return false;
3911 }
3912 return true;
3913}
3914
3915/*
3916 * Management subsystem callbacks
3917 */
3918#ifdef ENABLE_MANAGEMENT
3919
3920static void
3921management_callback_status(void *arg, const int version, struct status_output *so)
3922{
3923 struct multi_context *m = (struct multi_context *)arg;
3924
3925 if (!version)
3926 {
3928 }
3929 else
3930 {
3931 multi_print_status(m, so, version);
3932 }
3933}
3934
3935static int
3937{
3938 const struct multi_context *m = (struct multi_context *)arg;
3939 return m->n_clients;
3940}
3941
3942static int
3943management_callback_kill_by_cn(void *arg, const char *del_cn)
3944{
3945 struct multi_context *m = (struct multi_context *)arg;
3946 int count = 0;
3947
3948 for (uint32_t i = 0; i <= m->max_peerid; i++)
3949 {
3950 struct multi_instance *mi = m->instances[i];
3951 if (mi && !mi->halt)
3952 {
3953 const char *cn = tls_common_name(mi->context.c2.tls_multi, false);
3954 if (cn && !strcmp(cn, del_cn))
3955 {
3957 ++count;
3958 }
3959 }
3960 }
3961 return count;
3962}
3963
3964static int
3965management_callback_kill_by_addr(void *arg, const in_addr_t addr, const uint16_t port, const uint8_t proto)
3966{
3967 struct multi_context *m = (struct multi_context *)arg;
3968 struct openvpn_sockaddr saddr;
3969 struct mroute_addr maddr;
3970 int count = 0;
3971
3972 CLEAR(saddr);
3973 saddr.addr.in4.sin_family = AF_INET;
3974 saddr.addr.in4.sin_addr.s_addr = htonl(addr);
3975 saddr.addr.in4.sin_port = htons(port);
3976 maddr.proto = proto;
3977 if (mroute_extract_openvpn_sockaddr(&maddr, &saddr, true))
3978 {
3979 for (uint32_t i = 0; i <= m->max_peerid; i++)
3980 {
3981 struct multi_instance *mi = m->instances[i];
3982 if (mi && !mi->halt && mroute_addr_equal(&maddr, &mi->real))
3983 {
3985 ++count;
3986 }
3987 }
3988 }
3989 return count;
3990}
3991
3992static void
3994{
3995 struct multi_context *m = (struct multi_context *)arg;
3996 if (m->multi_io)
3997 {
3999 }
4000}
4001
4002struct multi_instance *
4003lookup_by_cid(struct multi_context *m, const unsigned long cid)
4004{
4005 if (m)
4006 {
4007 struct multi_instance *mi = (struct multi_instance *)hash_lookup(m->cid_hash, &cid);
4008 if (mi && !mi->halt)
4009 {
4010 return mi;
4011 }
4012 }
4013 return NULL;
4014}
4015
4016static bool
4017management_kill_by_cid(void *arg, const unsigned long cid, const char *kill_msg)
4018{
4019 struct multi_context *m = (struct multi_context *)arg;
4020 struct multi_instance *mi = lookup_by_cid(m, cid);
4021 if (mi)
4022 {
4023 send_restart(&mi->context, kill_msg); /* was: multi_signal_instance (m, mi, SIGTERM); */
4025 return true;
4026 }
4027 else
4028 {
4029 return false;
4030 }
4031}
4032
4033static struct tls_session *
4035 const unsigned int mda_key_id)
4036{
4037 if (multi->session[TM_INITIAL].key[KS_PRIMARY].mda_key_id == mda_key_id)
4038 {
4039 return &multi->session[TM_INITIAL];
4040 }
4041 else if (multi->session[TM_ACTIVE].key[KS_PRIMARY].mda_key_id == mda_key_id)
4042 {
4043 return &multi->session[TM_ACTIVE];
4044 }
4045 else
4046 {
4047 return NULL;
4048 }
4049}
4050
4051static const char *
4053{
4054 struct context *c = &mi->context;
4055 struct tls_multi *multi = c->c2.tls_multi;
4056
4057 if (!multi->acc_negotiated_protocols)
4058 {
4059 msg(M_CLIENT, "ACC: No negotiated protocols");
4060 return NULL;
4061 }
4062
4063 struct buffer buf = alloc_buf_gc(1024, gc);
4064
4065 buf_printf(&buf, "ACC:%d A:6 %s", multi->acc_max_message_length,
4067 return buf_str(&buf);
4068}
4069
4070
4071static bool
4072management_client_pending_auth(void *arg, const unsigned long cid, const unsigned int mda_key_id,
4073 const char *extra, unsigned int timeout)
4074{
4075 struct multi_context *m = (struct multi_context *)arg;
4076 struct multi_instance *mi = lookup_by_cid(m, cid);
4077
4078 if (mi)
4079 {
4080 struct tls_multi *multi = mi->context.c2.tls_multi;
4081
4082 struct gc_arena gc = gc_new();
4083 if (!strcmp(extra, "ACC"))
4084 {
4085 extra = calculate_app_control_extra(mi, &gc);
4086 if (!extra)
4087 {
4088 gc_free(&gc);
4089 return false;
4090 }
4091 }
4092 struct tls_session *session = lookup_session_by_mda_key_id(multi, mda_key_id);
4093
4094 if (!session)
4095 {
4096 gc_free(&gc);
4097 return false;
4098 }
4099
4100 /* sends INFO_PRE and AUTH_PENDING messages to client */
4101 bool ret = send_auth_pending_messages(multi, session, extra, timeout);
4104 gc_free(&gc);
4105 return ret;
4106 }
4107 return false;
4108}
4109
4110
4111static bool
4112management_client_auth(void *arg, const unsigned long cid, const unsigned int mda_key_id,
4113 const bool auth, const char *reason, const char *client_reason,
4114 struct buffer_list *cc_config) /* ownership transferred */
4115{
4116 struct multi_context *m = (struct multi_context *)arg;
4117 struct multi_instance *mi = lookup_by_cid(m, cid);
4118 bool cc_config_owned = true;
4119 bool ret = false;
4120
4121 if (mi)
4122 {
4123 ret = tls_authenticate_key(mi->context.c2.tls_multi, mda_key_id, auth, client_reason);
4124 if (ret)
4125 {
4126 if (auth)
4127 {
4129 {
4131 cc_config_owned = false;
4132 }
4133 }
4134 else if (reason)
4135 {
4136 msg(D_MULTI_LOW, "MULTI: connection rejected: %s, CLI:%s", reason,
4137 np(client_reason));
4138 }
4139 }
4140 }
4141 if (cc_config_owned && cc_config)
4142 {
4144 }
4145 return ret;
4146}
4147
4148
4149static bool
4151 const unsigned long cid,
4152 const unsigned int mda_key_id,
4153 struct buffer_list *input) /* ownership transferred */
4154{
4155 struct multi_context *m = (struct multi_context *)arg;
4156 struct multi_instance *mi = lookup_by_cid(m, cid);
4157
4158 bool ret = false;
4159 if (mi && buffer_list_defined(input))
4160 {
4161 struct tls_multi *multi = mi->context.c2.tls_multi;
4162 struct tls_session *session = lookup_session_by_mda_key_id(multi, mda_key_id);
4163 if (!session)
4164 {
4165 msg(M_CLIENT, "client session not found");
4166 buffer_list_free(input);
4167 return false;
4168 }
4169
4170 ret = management_send_acc_message(&mi->context, multi, session, input);
4172 }
4173
4174 buffer_list_free(input);
4175 return ret;
4176}
4177
4178
4179static char *
4180management_get_peer_info(void *arg, const unsigned long cid)
4181{
4182 struct multi_context *m = (struct multi_context *)arg;
4183 struct multi_instance *mi = lookup_by_cid(m, cid);
4184 char *ret = NULL;
4185
4186 if (mi)
4187 {
4188 ret = mi->context.c2.tls_multi->peer_info;
4189 }
4190
4191 return ret;
4192}
4193
4194#endif /* ifdef ENABLE_MANAGEMENT */
4195
4196
4197void
4224
4225void
4227{
4228 /* max_clients must be less then max peer-id value */
4230
4231 for (uint32_t i = 0; i < m->max_clients; ++i)
4232 {
4233 if (!m->instances[i])
4234 {
4235 mi->context.c2.tls_multi->rx_peer_id = i;
4236 m->instances[i] = mi;
4237 break;
4238 }
4239 }
4240
4241 /* should not really end up here, since multi_create_instance returns null
4242 * if amount of clients exceeds max_clients and this method would then
4243 * also not have been called */
4245
4247 {
4249 }
4250
4251 m->assigned_peer_ids++;
4252}
4253
4264static void
4265multi_get_timeout(struct multi_context *multi, struct timeval *timeval)
4266{
4267 multi_get_timeout_instance(multi, timeval);
4268
4269#ifdef ENABLE_MANAGEMENT
4270 if (management)
4271 {
4272 management_check_bytecount_server(multi, timeval);
4273 }
4274#endif /* ENABLE_MANAGEMENT */
4275}
4276
4277/**************************************************************************/
4284static void
4286{
4287 while (true)
4288 {
4289 /* wait on tun/socket list */
4290 multi_get_timeout(multi, &multi->top.c2.timeval);
4291 const int status = multi_io_wait(multi);
4292 MULTI_CHECK_SIG(multi);
4293
4294 /* check on status of coarse timers */
4296
4297 /* timeout? */
4298 if (status > 0)
4299 {
4300 /* process the I/O which triggered select */
4301 multi_io_process_io(multi);
4302 }
4303 else if (status == 0)
4304 {
4305 multi_io_action(multi, NULL, TA_TIMEOUT, false);
4306 }
4307
4308 MULTI_CHECK_SIG(multi);
4309 }
4310}
4311
4312/*
4313 * Top level event loop.
4314 */
4315void
4317{
4318 ASSERT(top->options.mode == MODE_SERVER);
4319
4320 struct multi_context multi;
4321
4322 top->mode = CM_TOP;
4323 // cppcheck-suppress autoVariables ; yes, we know this is dangerous
4324 top->multi = &multi;
4326
4327 /* initialize top-tunnel instance */
4329 if (IS_SIG(top))
4330 {
4331 return;
4332 }
4333
4334 /* initialize global multi_context object */
4335 multi_init(top);
4336
4337 /* initialize our cloned top object */
4339
4340 /* initialize management interface */
4342
4343 /* finished with initialization */
4344 initialization_sequence_completed(top, ISC_SERVER); /* --mode server --proto tcp-server */
4345
4346#ifdef ENABLE_ASYNC_PUSH
4347 multi.top.c2.inotify_fd = inotify_init();
4348 if (multi.top.c2.inotify_fd < 0)
4349 {
4350 msg(D_MULTI_ERRORS | M_ERRNO, "MULTI: inotify_init error");
4351 }
4352#endif
4353
4354 tunnel_server_loop(&multi);
4355
4356#ifdef ENABLE_ASYNC_PUSH
4357 msg(D_LOW, "%s: close multi.top.c2.inotify_fd (%d)",
4358 __func__, multi.top.c2.inotify_fd);
4359 close(multi.top.c2.inotify_fd);
4360#endif
4361
4362 /* shut down management interface */
4364
4365 /* save ifconfig-pool */
4366 multi_ifconfig_pool_persist(&multi, true);
4367
4368 /* tear down tunnel instance (unless --persist-tun) */
4369 multi_uninit(&multi);
4370 multi_top_free(&multi);
4372}
4373
4374/* Searches for the address and deletes it if it is owned by the multi_instance */
4375static void
4376multi_unlearn_addr(struct multi_context *m, const struct multi_instance *mi, const struct mroute_addr *addr)
4377{
4378 struct hash_element *he;
4379 const uint64_t hv = hash_value(m->vhash, addr);
4380 struct hash_bucket *bucket = hash_bucket(m->vhash, hv);
4381 struct multi_route *r = NULL;
4382
4383 /* if route currently exists, get the instance which owns it */
4384 he = hash_lookup_fast(m->vhash, bucket, addr, hv);
4385 if (he)
4386 {
4387 r = (struct multi_route *)he->value;
4388 }
4389
4390 /* if the route does not exist or exists but is not owned by the current instance, return */
4391 if (!r || r->instance != mi)
4392 {
4393 return;
4394 }
4395
4396 struct gc_arena gc = gc_new();
4397 msg(D_MULTI_LOW, "MULTI: Unlearn: %s -> %s", mroute_addr_print(&r->addr, &gc), multi_instance_string(mi, false, &gc));
4398 learn_address_script(m, NULL, "delete", &r->addr);
4400 multi_route_del(r);
4401
4402 gc_free(&gc);
4403}
4404
4410static void
4412{
4413 struct mroute_addr addr;
4414 CLEAR(addr);
4415
4416 addr.type = MR_ADDR_IPV4;
4417 addr.len = 4;
4418 addr.v4.addr = a;
4419
4420 multi_unlearn_addr(m, mi, &addr);
4421}
4422
4428static void
4429multi_unlearn_in6_addr(struct multi_context *m, const struct multi_instance *mi, struct in6_addr a6)
4430{
4431 struct mroute_addr addr;
4432 CLEAR(addr);
4433
4434 addr.type = MR_ADDR_IPV6;
4435 addr.len = 16;
4436 addr.v6.addr = a6;
4437
4438 multi_unlearn_addr(m, mi, &addr);
4439}
4440
4441/* Function to unlearn previous ifconfig of a client in the server multi_context after a PUSH_UPDATE */
4442void
4444{
4445 in_addr_t old_addr = 0;
4446 old_addr = htonl(mi->context.c2.push_ifconfig_local);
4447 multi_unlearn_in_addr_t(m, mi, old_addr);
4448 mi->context.c2.push_ifconfig_defined = false;
4450 mi->reporting_addr = 0;
4451}
4452
4453/* Function to unlearn previous ifconfig-ipv6 of a client in the server multi_context after a PUSH_UPDATE */
4454void
4456{
4457 struct in6_addr old_addr6;
4458 CLEAR(old_addr6);
4459 old_addr6 = mi->context.c2.push_ifconfig_ipv6_local;
4460 multi_unlearn_in6_addr(m, mi, old_addr6);
4464}
4465
4476void
4477update_vhash(struct multi_context *m, struct multi_instance *mi, const char *new_ip, const char *new_ipv6)
4478{
4479 if (new_ip)
4480 {
4481 /* Remove old IP */
4483 {
4484 unlearn_ifconfig(m, mi);
4485 }
4486
4487 /* Add new IP */
4488 struct in_addr new_addr;
4489 CLEAR(new_addr);
4490 if (inet_pton(AF_INET, new_ip, &new_addr) == 1
4491 && multi_learn_in_addr_t(m, mi, ntohl(new_addr.s_addr), -1, true))
4492 {
4493 mi->context.c2.push_ifconfig_defined = true;
4494 mi->context.c2.push_ifconfig_local = ntohl(new_addr.s_addr);
4495 /* set our client's VPN endpoint for status reporting purposes */
4497 }
4498 }
4499
4500 if (new_ipv6)
4501 {
4502 /* Remove old IPv6 */
4504 {
4505 unlearn_ifconfig_ipv6(m, mi);
4506 }
4507
4508 /* Add new IPv6 */
4509 struct in6_addr new_addr6;
4510 CLEAR(new_addr6);
4511 if (inet_pton(AF_INET6, new_ipv6, &new_addr6) == 1
4512 && multi_learn_in6_addr(m, mi, new_addr6, -1, true))
4513 {
4515 mi->context.c2.push_ifconfig_ipv6_local = new_addr6;
4516 /* set our client's VPN endpoint for status reporting purposes */
4518 }
4519 }
4520}
4521
4522bool
4524{
4525 in_addr_t local_addr, local_netmask;
4526
4528 {
4529 /* If we do not have a local address, we just return false as
4530 * this check doesn't make sense. */
4531 return false;
4532 }
4533
4534 /* if it falls into the network defined by ifconfig_local we assume
4535 * it is already known to DCO and only install "extra" iroutes */
4536 inet_pton(AF_INET, o->ifconfig_local, &local_addr);
4537 inet_pton(AF_INET, o->ifconfig_remote_netmask, &local_netmask);
4538
4539 return (local_addr & local_netmask) != (dest & local_netmask);
4540}
4541
4542bool
4543multi_check_push_ifconfig_ipv6_extra_route(const struct options *o, const struct in6_addr *dest)
4544{
4546 {
4547 /* If we do not have a local address, we just return false as
4548 * this check doesn't make sense. */
4549 return false;
4550 }
4551
4552 /* if it falls into the network defined by ifconfig_local we assume
4553 * it is already known to DCO and only install "extra" iroutes */
4554 struct in6_addr ifconfig_local;
4555 if (inet_pton(AF_INET6, o->ifconfig_ipv6_local, &ifconfig_local) != 1)
4556 {
4557 return false;
4558 }
4559
4560 return (!ipv6_net_contains_host(&ifconfig_local, o->ifconfig_ipv6_netbits,
4561 dest));
4562}
4563
4564#if defined(__GNUC__) || defined(__clang__)
4565#pragma GCC diagnostic pop
4566#endif
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:490
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:447
bool argv_printf_cat(struct argv *argres, const char *format,...)
printf() inspired argv concatenation.
Definition argv.c:471
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:1205
bool buf_printf(struct buffer *buf, const char *format,...)
printf-style append to a buffer with overflow check.
Definition buffer.c:231
void buffer_list_free(struct buffer_list *ol)
Frees a buffer list and all the buffers in it.
Definition buffer.c:1195
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:619
#define ALLOC_OBJ(dptr, type)
Allocate memory for a single object of the given type.
Definition buffer.h:2025
#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:1288
#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:1974
#define ALLOC_OBJ_CLEAR(dptr, type)
Allocate and zero-initialise memory for a single object of the given type.
Definition buffer.h:2036
#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:1958
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:1776
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:1705
#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:347
#define CO_USE_DYNAMIC_TLS_CRYPT
Bit-flag indicating that renegotiations are using tls-crypt with a TLS-EKM derived key.
Definition crypto.h:363
#define CO_EPOCH_DATA_KEY_FORMAT
Bit-flag indicating the epoch the data format.
Definition crypto.h:367
#define CO_USE_CC_EXIT_NOTIFY
Bit-flag indicating that explicit exit notifies should be sent via the control channel instead of usi...
Definition crypto.h:359
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:81
#define D_MULTI_ERRORS
Definition errlevel.h:64
#define D_VLAN_DEBUG
Definition errlevel.h:150
#define D_IMPORT_ERRORS
Definition errlevel.h:63
#define D_ROUTE_QUOTA
Definition errlevel.h:88
#define D_MULTI_MEDIUM
Definition errlevel.h:99
#define D_DCO
Definition errlevel.h:92
#define D_MULTI_DEBUG
Definition errlevel.h:124
#define D_MULTI_DROPPED
Definition errlevel.h:98
#define D_DCO_DEBUG
Definition errlevel.h:115
#define D_MULTI_LOW
Definition errlevel.h:84
#define D_TLS_ERRORS
Definition errlevel.h:58
#define D_LOW
Definition errlevel.h:95
#define M_INFO
Definition errlevel.h:54
#define D_GREMLIN
Definition errlevel.h:76
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:407
bool send_control_channel_string(struct context *c, const char *str, msglvl_t msglevel)
Definition forward.c:414
void pre_select(struct context *c)
Definition forward.c:1968
void process_ip_header(struct context *c, unsigned int flags, struct buffer *buf, struct link_socket *sock)
Definition forward.c:1670
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:1230
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:654
void tunnel_server(struct context *top)
Main event loop for OpenVPN in server mode.
Definition multi.c:4316
static void tunnel_server_loop(struct multi_context *multi)
Main event loop for OpenVPN in point-to-multipoint server mode.
Definition multi.c:4285
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:1143
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:3534
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:1010
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:1491
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:3597
void uninit_management_callback(void)
Definition init.c:4321
void initialization_sequence_completed(struct context *c, const unsigned int flags)
Definition init.c:1487
void close_instance(struct context *c)
Definition init.c:4655
void inherit_context_top(struct context *dest, const struct context *src)
Definition init.c:4808
void free_context_buffers(struct context_buffers *b)
Definition init.c:3601
void init_instance_handle_signals(struct context *c, const struct env_set *env, const unsigned int flags)
Definition init.c:4633
void inherit_context_child(struct context *dest, const struct context *src, struct link_socket *sock)
Definition init.c:4728
void context_clear_2(struct context *c)
Definition init.c:90
void close_context(struct context *c, int sig, unsigned int flags)
Definition init.c:4854
bool do_deferred_options(struct context *c, const uint64_t found, const bool is_update)
Definition init.c:2558
struct context_buffers * init_context_buffers(const struct frame *frame)
Definition init.c:3576
void management_show_net_callback(void *arg, const msglvl_t msglevel)
Definition init.c:4152
#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:4404
bool management_send_acc_message(struct context *c, struct tls_multi *multi, struct tls_session *session, struct buffer_list *input)
Definition manage.c:4460
void management_connection_established(struct management *man, struct man_def_auth_context *mdac, const struct env_set *es)
Definition manage.c:3189
void management_notify_client_close(const struct management *man, struct man_def_auth_context *mdac, const struct env_set *es)
Definition manage.c:3199
void management_set_callback(struct management *man, const struct management_callback *cb)
Definition manage.c:2946
void management_learn_addr(struct man_def_auth_context *mdac, const struct mroute_addr *addr, const bool primary)
Definition manage.c:3212
#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:75
void multi_tcp_instance_specific_free(struct multi_instance *mi)
Definition mtcp.c:101
void multi_tcp_delete_event(struct multi_io *multi_io, event_t event)
Definition mtcp.c:107
void multi_tcp_dereference_instance(struct multi_io *multi_io, struct multi_instance *mi)
Definition mtcp.c:116
#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:1006
static void multi_schedule_context_wakeup(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:2973
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:4543
static void multi_client_connect_early_setup(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:2427
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:2464
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:1891
static void multi_process_float(struct multi_context *m, struct multi_instance *mi, struct link_socket *sock)
Handles peer floating.
Definition multi.c:3198
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:731
static void multi_add_iroutes(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:1268
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:2499
static void multi_top_free(struct multi_context *m)
Definition multi.c:3850
static void multi_unlearn_addr(struct multi_context *m, const struct multi_instance *mi, const struct mroute_addr *addr)
Definition multi.c:4376
static void multi_signal_instance(struct multi_context *m, struct multi_instance *mi, const int sig)
Definition multi.c:3268
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:2601
static int management_callback_n_clients(void *arg)
Definition multi.c:3936
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:3116
bool multi_process_signal(struct multi_context *m)
Definition multi.c:3896
static void multi_select_virtual_addr(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:1399
static void multi_get_timeout(struct multi_context *multi, struct timeval *timeval)
Determines the earliest wakeup interval based on periodic operations.
Definition multi.c:4265
void multi_close_instance_on_signal(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:3256
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:3015
static void multi_unlearn_in6_addr(struct multi_context *m, const struct multi_instance *mi, struct in6_addr a6)
Definition multi.c:4429
static void multi_delete_dup(struct multi_context *m, const struct multi_instance *new_mi)
Definition multi.c:1315
static void multi_connection_established(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:2676
void multi_process_per_second_timers_dowork(struct multi_context *m)
Definition multi.c:3814
static void multi_set_virtual_addr_env(struct multi_instance *mi)
Definition multi.c:1540
static void multi_client_connect_setenv(struct multi_instance *mi)
Definition multi.c:1684
struct multi_instance * multi_get_queue(struct mbuf_set *ms)
Definition multi.c:3688
static void setenv_stats(struct context *c)
Definition multi.c:520
bool multi_process_timeout(struct multi_context *m, const unsigned int mpp_flags)
Definition multi.c:3724
static int management_callback_kill_by_cn(void *arg, const char *del_cn)
Definition multi.c:3943
static void multi_client_disconnect_script(struct multi_instance *mi)
Definition multi.c:540
static bool stale_route_check_trigger(struct multi_context *m)
Definition multi.c:3803
struct multi_instance * lookup_by_cid(struct multi_context *m, const unsigned long cid)
Definition multi.c:4003
static bool management_kill_by_cid(void *arg, const unsigned long cid, const char *kill_msg)
Definition multi.c:4017
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:2202
static void multi_init(struct context *t)
Definition multi.c:276
static void generate_prefix(struct multi_instance *mi)
Definition multi.c:464
static void multi_del_iroutes(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:493
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:2022
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:2581
static void management_delete_event(void *arg, event_t event)
Definition multi.c:3993
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:1651
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:4150
static const char * calculate_app_control_extra(struct multi_instance *mi, struct gc_arena *gc)
Definition multi.c:4052
static void multi_uninit(struct multi_context *m)
Definition multi.c:680
const char * multi_instance_string(const struct multi_instance *mi, bool null, struct gc_arena *gc)
Definition multi.c:431
static unsigned int compute_wakeup_sigma(const struct timeval *delta)
Definition multi.c:2949
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:2891
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:1586
void multi_close_instance(struct multi_context *m, struct multi_instance *mi, bool shutdown)
Definition multi.c:571
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:4072
static void multi_push_restart_schedule_exit(struct multi_context *m, bool next_server)
Definition multi.c:3863
static void multi_top_init(struct context *top)
Definition multi.c:3843
static struct tls_session * lookup_session_by_mda_key_id(struct tls_multi *multi, const unsigned int mda_key_id)
Definition multi.c:4034
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:1996
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:2112
static void check_stale_routes(struct multi_context *m)
Definition multi.c:1349
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:4523
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:3387
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:4112
static void multi_client_connect_late_setup(struct multi_context *m, struct multi_instance *mi, const uint64_t option_types_found)
Definition multi.c:2304
static void multi_bcast(struct multi_context *m, const struct buffer *buf, const struct multi_instance *sender_instance, uint16_t vid)
Definition multi.c:2908
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:3965
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:4411
static void multi_print_status(struct multi_context *m, struct status_output *so, const int version)
Definition multi.c:812
void route_quota_exceeded(const struct multi_instance *mi)
Definition multi.c:3757
void ungenerate_prefix(struct multi_instance *mi)
Definition multi.c:481
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:4226
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:1095
void init_management_callback_multi(struct multi_context *m)
Definition multi.c:4198
static void multi_add_mbuf(struct multi_context *m, struct multi_instance *mi, struct mbuf_buffer *mb)
Definition multi.c:2872
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:1923
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:1612
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:4180
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:1714
void unlearn_ifconfig_ipv6(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:4455
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:1170
static bool is_exit_restart(int sig)
Definition multi.c:3857
static bool ifconfig_push_constraint_satisfied(const struct context *c)
Definition multi.c:1379
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:527
void unlearn_ifconfig(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:4443
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:4477
static bool multi_client_generate_tls_keys(struct context *c)
Generates the data channel keys.
Definition multi.c:2281
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:2531
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:1216
static bool multi_client_setup_dco_initial(const struct multi_context *m, struct multi_instance *mi, struct gc_arena *gc)
Definition multi.c:2258
static void management_callback_status(void *arg, const int version, struct status_output *so)
Definition multi.c:3921
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:1973
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:1866
static const multi_client_connect_handler client_connect_handlers[]
Definition multi.c:2585
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:2161
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:113
void multi_io_process_io(struct multi_context *m)
Definition multi_io.c:570
void multi_io_free(struct multi_io *multi_io)
Definition multi_io.c:134
int multi_io_wait(struct multi_context *m)
Definition multi_io.c:175
void multi_io_action(struct multi_context *m, struct multi_instance *mi, int action, bool poll)
Definition multi_io.c:695
#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:192
#define MAX_PEER_ID
Definition openvpn.h:526
#define CM_TOP
Definition openvpn.h:454
const char title_string[]
Definition options.c:75
bool has_udp_in_local_list(const struct options *options)
Definition options.c:7884
#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:981
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:751
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:690
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:545
const char * platform_gen_path(const char *directory, const char *filename, struct gc_arena *gc)
Put a directory and filename together.
Definition platform.c:622
bool platform_unlink(const char *filename)
Definition platform.c:492
void plugin_return_free(struct plugin_return *pr)
Definition plugin.c:1001
void plugin_return_get_column(const struct plugin_return *src, struct plugin_return *dest, const char *colname)
Definition plugin.c:987
bool plugin_defined(const struct plugin_list *pl, const int type)
Definition plugin.c:919
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:303
bool ifconfig_pool_release(struct ifconfig_pool *pool, ifconfig_pool_handle hand, const bool hard)
Definition pool.c:355
void ifconfig_pool_write(struct ifconfig_pool_persist *persist, const struct ifconfig_pool *pool)
Definition pool.c:721
bool ifconfig_pool_write_trigger(struct ifconfig_pool_persist *persist)
Definition pool.c:578
void ifconfig_pool_free(struct ifconfig_pool *pool)
Definition pool.c:287
void ifconfig_pool_read(struct ifconfig_pool_persist *persist, struct ifconfig_pool *pool)
Definition pool.c:591
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:146
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:1053
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:495
void push_option(struct options *o, const char *opt, msglvl_t msglevel)
Definition push.c:963
void send_restart(struct context *c, const char *kill_msg)
Definition push.c:555
void remove_iroutes_from_push_route_list(struct options *o)
Definition push.c:1214
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:711
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:582
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:1494
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:4380
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:1730
void tls_session_soft_reset(struct tls_multi *tls_multi)
Definition ssl.c:1858
#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:637
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:828
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:147
bool status_trigger(struct status_output *so)
Definition status.c:132
void status_printf(struct status_output *so, const char *format,...)
Definition status.c:226
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:64
void status_flush(struct status_output *so)
Definition status.c:156
bool status_close(struct status_output *so)
Definition status.c:187
Definition argv.h:35
One node in a buffer_list linked list.
Definition buffer.h:2161
struct buffer_entry * next
Pointer to the next node, or NULL.
Definition buffer.h:2163
struct buffer buf
The buffer stored in this list node.
Definition buffer.h:2162
A singly-linked list of buffers, with head/tail pointers for O(1) push.
Definition buffer.h:2168
struct buffer_entry * head
Next item to pop/peek.
Definition buffer.h:2169
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:180
struct status_output * status_output
Definition openvpn.h:168
struct tuntap * tuntap
Tun/tap virtual network interface.
Definition openvpn.h:155
bool push_request_received
Definition openvpn.h:398
counter_type link_read_bytes
Definition openvpn.h:249
counter_type link_write_bytes
Definition openvpn.h:252
bool push_ifconfig_ipv6_defined
Definition openvpn.h:405
struct fragment_master * fragment
Definition openvpn.h:235
bool push_ifconfig_defined
Definition openvpn.h:399
counter_type dco_read_bytes
Definition openvpn.h:250
struct man_def_auth_context mda_context
Definition openvpn.h:424
counter_type dco_write_bytes
Definition openvpn.h:253
struct env_set * es
Definition openvpn.h:394
struct tls_multi * tls_multi
TLS state structure for this VPN tunnel.
Definition openvpn.h:300
struct frame frame
Definition openvpn.h:231
struct in6_addr push_ifconfig_ipv6_remote
Definition openvpn.h:408
struct link_socket_actual from
Definition openvpn.h:228
struct frame frame_fragment
Definition openvpn.h:236
int push_ifconfig_ipv6_netbits
Definition openvpn.h:407
struct buffer to_link
Definition openvpn.h:351
struct buffer to_tun
Definition openvpn.h:350
struct in6_addr push_ifconfig_ipv6_local
Definition openvpn.h:406
struct link_socket ** link_sockets
Definition openvpn.h:220
in_addr_t push_ifconfig_local_alias
Definition openvpn.h:403
struct link_socket_info ** link_socket_infos
Definition openvpn.h:221
struct link_socket_actual * to_link_addr
Definition openvpn.h:227
in_addr_t push_ifconfig_remote_netmask
Definition openvpn.h:402
struct buffer buf
Definition openvpn.h:349
struct timeval timeval
Time to next event of timers and similar.
Definition openvpn.h:370
struct event_set * event_set
Definition openvpn.h:213
struct context_buffers * buffers
Definition openvpn.h:341
in_addr_t push_ifconfig_local
Definition openvpn.h:401
Contains all state information for one tunnel.
Definition openvpn.h:445
int mode
Role of this context within the OpenVPN process.
Definition openvpn.h:458
struct multi_context * multi
Pointer to the main P2MP context.
Definition openvpn.h:463
bool did_dco_iroutes
Whether DCO iroutes have been installed.
Definition openvpn.h:484
struct signal_info * sig
Internal error signaling object.
Definition openvpn.h:474
openvpn_net_ctx_t net_ctx
Networking API opaque context.
Definition openvpn.h:472
struct plugin_list * plugins
List of plug-ins.
Definition openvpn.h:476
struct context_2 c2
Level 2 context.
Definition openvpn.h:490
struct env_set * es
Set of environment variables.
Definition openvpn.h:470
struct options options
Options loaded from command line or configuration file.
Definition openvpn.h:446
struct context_1 c1
Level 1 context.
Definition openvpn.h:489
Security parameter state for processing data channel packets.
Definition crypto.h:286
struct key_ctx_bi key_ctx_bi
OpenSSL cipher and HMAC contexts for both sending and receiving directions.
Definition crypto.h:287
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:233
bool initialized
Definition crypto.h:278
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:145
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:577
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:735
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:703
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:724
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:578
uint32_t virtual_hash_size
Definition options.h:500
const char * learn_address_script
Definition options.h:504
const char * ciphername
Definition options.h:573
int cf_initial_max
Definition options.h:533
int stale_routes_check_interval
Definition options.h:538
uint16_t vlan_pvid
Definition options.h:726
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:574
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:710
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:527
#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:86
bool vlan_is_tagged(const struct buffer *buf)
Definition vlan.c:270