OpenVPN
multi.h
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
28#ifndef MULTI_H
29#define MULTI_H
30
31#include "init.h"
32#include "forward.h"
33#include "mroute.h"
34#include "mbuf.h"
35#include "list.h"
36#include "schedule.h"
37#include "pool.h"
38#include "mudp.h"
39#include "mtcp.h"
40#include "multi_io.h"
41#include "vlan.h"
42#include "reflect_filter.h"
43
44#define MULTI_PREFIX_MAX_LENGTH 256
45
46/*
47 * Walk (don't run) through the routing table,
48 * deleting old entries, and possibly multi_instance
49 * structs as well which have been marked for deletion.
50 */
52{
53 uint32_t bucket_base;
55 time_t last_call;
56};
57
58
65
71{
72 /* Index of currently executed handler. */
74 /* Remember which option classes where processed for delayed option
75 * handling. */
77
83
89};
90
102{
103 struct schedule_entry se; /* this must be the first element of the structure,
104 * We cast between this and schedule_entry so the
105 * beginning of the struct must be identical */
106
112 struct gc_arena gc;
113 bool halt;
115 int route_count; /* number of routes (including cached routes) owned by this instance */
116 time_t created;
120 struct timeval wakeup; /* absolute time */
125
126 /* queued outgoing data in Server/TCP mode */
127 unsigned int tcp_rwflags;
130
131 in_addr_t reporting_addr; /* IP address shown in status listing */
132 struct in6_addr reporting_addr_ipv6; /* IPv6 address in status listing */
133
135#ifdef ENABLE_MANAGEMENT
138#endif
140 int n_clients_delta; /* added to multi_context.n_clients when instance is closed */
141
145#ifdef ENABLE_ASYNC_PUSH
146 int inotify_watch; /* watch descriptor for acf */
147#endif
148};
149
150
162{
166 uint32_t max_peerid;
169 struct hash *hash;
171 struct hash *vhash;
174 struct mbuf_set *mbuf;
185 uint32_t max_clients;
188 int n_clients; /* current number of authenticated clients */
189
190#ifdef ENABLE_MANAGEMENT
191 struct hash *cid_hash;
192 unsigned long cid_counter;
193#endif
194
200
201 struct context top;
207
208 /*
209 * Timer object for stale route check
210 */
212
213#ifdef ENABLE_ASYNC_PUSH
214 /* mapping between inotify watch descriptors and multi_instances */
215 struct hash *inotify_watchers;
216#endif
217
219};
220
231
232/*
233 * Host route
234 */
236{
239
240#define MULTI_ROUTE_CACHE (1 << 0)
241#define MULTI_ROUTE_AGEABLE (1 << 1)
242 unsigned int flags;
243
244 unsigned int cache_generation;
246};
247
248
249/**************************************************************************/
256void tunnel_server(struct context *top);
257
258
259const char *multi_instance_string(const struct multi_instance *mi, bool null, struct gc_arena *gc);
260
261/*
262 * Called by mtcp.c, mudp.c, or other (to be written) protocol drivers
263 */
264
266 const struct mroute_addr *real,
267 struct link_socket *sock);
268
269void multi_close_instance(struct multi_context *m, struct multi_instance *mi, bool shutdown);
270
271bool multi_process_timeout(struct multi_context *m, const unsigned int mpp_flags);
272
273#define MPP_PRE_SELECT (1 << 0)
274#define MPP_CLOSE_ON_SIGNAL (1 << 1)
275#define MPP_RECORD_TOUCH (1 << 2)
276
277
278/**************************************************************************/
300bool multi_process_post(struct multi_context *m, struct multi_instance *mi,
301 const unsigned int flags);
302
309
310/**************************************************************************/
334bool multi_process_incoming_link(struct multi_context *m, struct multi_instance *instance,
335 const unsigned int mpp_flags, struct link_socket *sock);
336
337
353bool multi_process_incoming_tun(struct multi_context *m, const unsigned int mpp_flags);
354
355
356void multi_process_drop_outgoing_tun(struct multi_context *m, const unsigned int mpp_flags);
357
358struct multi_instance *multi_get_queue(struct mbuf_set *ms);
359
360void multi_add_mbuf(struct multi_context *m, struct multi_instance *mi, struct mbuf_buffer *mb);
361
362void multi_ifconfig_pool_persist(struct multi_context *m, bool force);
363
364bool multi_process_signal(struct multi_context *m);
365
367
369
370#ifdef ENABLE_ASYNC_PUSH
378void multi_process_file_closed(struct multi_context *m, const unsigned int mpp_flags);
379
380#endif
381
382#if defined(__GNUC__) || defined(__clang__)
383#pragma GCC diagnostic push
384#pragma GCC diagnostic ignored "-Wsign-compare"
385#endif
386
387/*
388 * Return true if our output queue is not full
389 */
390static inline bool
391multi_output_queue_ready(const struct multi_context *m, const struct multi_instance *mi)
392{
393 if (mi->tcp_link_out_deferred)
394 {
396 }
397 else
398 {
399 return true;
400 }
401}
402
403#if defined(__GNUC__) || defined(__clang__)
404#pragma GCC diagnostic pop
405#endif
406
407/*
408 * Determine which instance has pending output
409 * and prepare the output for sending in
410 * the to_link buffer.
411 */
412static inline struct multi_instance *
414{
415 struct multi_instance *mi = NULL;
416
417 if (m->pending)
418 {
419 mi = m->pending;
420 }
421 else if (mbuf_defined(m->mbuf))
422 {
423 mi = multi_get_queue(m->mbuf);
424 }
425 return mi;
426}
427
428/*
429 * Per-client route quota management
430 */
431
432void route_quota_exceeded(const struct multi_instance *mi);
433
434static inline void
436{
437 ++mi->route_count;
438}
439
440static inline void
442{
443 --mi->route_count;
444}
445
446/* can we add a new route? */
447static inline bool
449{
451 {
453 return false;
454 }
455 else
456 {
457 return true;
458 }
459}
460
461/*
462 * Instance reference counting
463 */
464
465static inline void
467{
468 ++mi->refcount;
469}
470
471static inline void
473{
474 if (--mi->refcount <= 0)
475 {
476 gc_free(&mi->gc);
477 free(mi);
478 }
479}
480
481static inline void
483{
484 struct multi_instance *mi = route->instance;
485 route_quota_dec(mi);
487 free(route);
488}
489
490static inline bool
491multi_route_defined(const struct multi_context *m, const struct multi_route *r)
492{
493 if (r->instance->halt)
494 {
495 return false;
496 }
497 else if ((r->flags & MULTI_ROUTE_CACHE)
499 {
500 return false;
501 }
502 else if ((r->flags & MULTI_ROUTE_AGEABLE)
504 {
505 return false;
506 }
507 else
508 {
509 return true;
510 }
511}
512
513/*
514 * Takes prefix away from multi_instance.
515 */
516void ungenerate_prefix(struct multi_instance *mi);
517
518/*
519 * Set a msg() function prefix with our current client instance ID.
520 */
521
522static inline void
524{
525#ifdef MULTI_DEBUG_EVENT_LOOP
526 if (mi->msg_prefix[0])
527 {
528 printf("[%s]\n", mi->msg_prefix);
529 }
530#endif
531 msg_set_prefix(mi->msg_prefix[0] ? mi->msg_prefix : NULL);
532}
533
534static inline void
536{
537#ifdef MULTI_DEBUG_EVENT_LOOP
538 printf("[NULL]\n");
539#endif
540 msg_set_prefix(NULL);
541}
542
543/*
544 * Instance Reaper
545 *
546 * Reaper constants. The reaper is the process where the virtual address
547 * and virtual route hash table is scanned for dead entries which are
548 * then removed. The hash table could potentially be quite large, so we
549 * don't want to reap in a single pass.
550 */
551
552#define REAP_MAX_WAKEUP 10 /* Do reap pass at least once per n seconds */
553#define REAP_DIVISOR 256 /* How many passes to cover whole hash table */
554#define REAP_MIN 16 /* Minimum number of buckets per pass */
555#define REAP_MAX 1024 /* Maximum number of buckets per pass */
556
557/*
558 * Mark a cached host route for deletion after this
559 * many seconds without any references.
560 */
561#define MULTI_CACHE_ROUTE_TTL 60
562
563void multi_reap_process_dowork(const struct multi_context *m);
564
566
567static inline void
569{
570 if (m->reaper->last_call != now)
571 {
573 }
574}
575
576static inline void
585
586/*
587 * Updates \c dest with the earliest timeout as a delta relative to the current
588 * time and sets \c m->earliest_wakeup to the \c multi_instance with the
589 * soonest scheduled wakeup.
590 *
591 * @param m Pointer to the multi context
592 * @param dest Pointer to a timeval struct that will hold the earliest timeout
593 * delta.
594 */
595static inline void
596multi_get_timeout_instance(struct multi_context *m, struct timeval *dest)
597{
598 struct timeval tv, current;
599
600 CLEAR(tv);
602 if (m->earliest_wakeup)
603 {
604 ASSERT(!openvpn_gettimeofday(&current, NULL));
605 tv_delta(dest, &current, &tv);
606 if (dest->tv_sec >= REAP_MAX_WAKEUP)
607 {
608 m->earliest_wakeup = NULL;
609 dest->tv_sec = REAP_MAX_WAKEUP;
610 dest->tv_usec = 0;
611 }
612 }
613 else
614 {
615 dest->tv_sec = REAP_MAX_WAKEUP;
616 dest->tv_usec = 0;
617 }
618}
619
620
638static inline bool
639multi_process_outgoing_tun(struct multi_context *m, const unsigned int mpp_flags)
640{
641 struct multi_instance *mi = m->pending;
642 bool ret = true;
643
644 ASSERT(mi);
645#ifdef MULTI_DEBUG_EVENT_LOOP
646 printf("%s -> TUN len=%d\n", id(mi), mi->context.c2.to_tun.len);
647#endif
648 set_prefix(mi);
651 ret = multi_process_post(m, mi, mpp_flags);
652 clear_prefix();
653 return ret;
654}
655
656#define CLIENT_CONNECT_OPT_MASK \
657 (OPT_P_INSTANCE | OPT_P_INHERIT | OPT_P_PUSH | OPT_P_TIMER | OPT_P_CONFIG | OPT_P_ECHO \
658 | OPT_P_COMP | OPT_P_SOCKFLAGS)
659
660static inline bool
662 const unsigned int mpp_flags)
663{
664 bool ret = true;
665 set_prefix(mi);
667 ret = multi_process_post(m, mi, mpp_flags);
668 clear_prefix();
669 return ret;
670}
671
682bool
684
695bool
697 struct in6_addr *dest);
698
699/*
700 * Check for signals.
701 */
702#define MULTI_CHECK_SIG(m) EVENT_LOOP_CHECK_SIGNAL(&(m)->top, multi_process_signal, (m))
703
704static inline void
706{
707 m->pending = mi;
708}
717void multi_assign_peer_id(struct multi_context *m, struct multi_instance *mi);
718
719#ifdef ENABLE_MANAGEMENT
720struct multi_instance *
721lookup_by_cid(struct multi_context *m, const unsigned long cid);
722#endif
723
724void
725update_vhash(struct multi_context *m, struct multi_instance *mi, const char *new_ip, const char *new_ipv6);
726void unlearn_ifconfig(struct multi_context *m, struct multi_instance *mi);
727void unlearn_ifconfig_ipv6(struct multi_context *m, struct multi_instance *mi);
728
729#endif /* MULTI_H */
static void gc_free(struct gc_arena *a)
Definition buffer.h:1049
void * dco_context_t
Definition dco.h:259
Interface functions to the internal and external multiplexers.
void tunnel_server(struct context *top)
Main event loop for OpenVPN in server mode.
Definition multi.c:4170
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:3306
void process_outgoing_link(struct context *c, struct link_socket *sock)
Write a packet to the external network interface.
Definition forward.c:1746
void process_outgoing_tun(struct context *c, struct link_socket *in_sock)
Write a packet to the virtual tun/tap network interface.
Definition forward.c:1880
static bool multi_process_outgoing_tun(struct multi_context *m, const unsigned int mpp_flags)
Send a packet over the virtual tun/tap network interface to its locally reachable destination.
Definition multi.h:639
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:3504
@ route
Definition interactive.c:85
static bool mbuf_defined(const struct mbuf_set *ms)
Definition mbuf.h:81
static unsigned int mbuf_len(const struct mbuf_set *ms)
Definition mbuf.h:87
client_connect_return
Return values used by the client connect call-back functions.
Definition multi.h:225
@ CC_RET_DEFERRED
Definition multi.h:228
@ CC_RET_FAILED
Definition multi.h:226
@ CC_RET_SKIPPED
Definition multi.h:229
@ CC_RET_SUCCEEDED
Definition multi.h:227
struct multi_instance * multi_create_instance(struct multi_context *m, const struct mroute_addr *real, struct link_socket *sock)
Definition multi.c:702
static bool multi_output_queue_ready(const struct multi_context *m, const struct multi_instance *mi)
Definition multi.h:391
#define REAP_MAX_WAKEUP
Definition multi.h:552
void multi_ifconfig_pool_persist(struct multi_context *m, bool force)
Definition multi.c:150
#define MULTI_PREFIX_MAX_LENGTH
Definition multi.h:44
void multi_reap_process_dowork(const struct multi_context *m)
Definition multi.c:202
static void route_quota_dec(struct multi_instance *mi)
Definition multi.h:441
bool multi_process_signal(struct multi_context *m)
Definition multi.c:3825
void multi_close_instance_on_signal(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:3177
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:2981
void multi_process_per_second_timers_dowork(struct multi_context *m)
Definition multi.c:3743
struct multi_instance * multi_get_queue(struct mbuf_set *ms)
Definition multi.c:3596
bool multi_process_timeout(struct multi_context *m, const unsigned int mpp_flags)
Definition multi.c:3632
static void set_prefix(struct multi_instance *mi)
Definition multi.h:523
static void multi_route_del(struct multi_route *route)
Definition multi.h:482
bool multi_check_push_ifconfig_ipv6_extra_route(struct multi_instance *mi, 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:4397
static void multi_reap_process(const struct multi_context *m)
Definition multi.h:568
struct multi_instance * lookup_by_cid(struct multi_context *m, const unsigned long cid)
Definition multi.c:3932
static void route_quota_inc(struct multi_instance *mi)
Definition multi.h:435
void multi_process_incoming_dco(dco_context_t *dco)
Process an incoming DCO message (from kernel space).
bool multi_check_push_ifconfig_extra_route(struct multi_instance *mi, 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:4376
#define MULTI_ROUTE_CACHE
Definition multi.h:240
const char * multi_instance_string(const struct multi_instance *mi, bool null, struct gc_arena *gc)
Definition multi.c:418
static void clear_prefix(void)
Definition multi.h:535
void multi_close_instance(struct multi_context *m, struct multi_instance *mi, bool shutdown)
Definition multi.c:558
static bool multi_route_defined(const struct multi_context *m, const struct multi_route *r)
Definition multi.h:491
static struct multi_instance * multi_process_outgoing_link_pre(struct multi_context *m)
Definition multi.h:413
static void multi_instance_dec_refcount(struct multi_instance *mi)
Definition multi.h:472
void multi_add_mbuf(struct multi_context *m, struct multi_instance *mi, struct mbuf_buffer *mb)
Definition multi.c:2838
static void multi_instance_inc_refcount(struct multi_instance *mi)
Definition multi.h:466
void route_quota_exceeded(const struct multi_instance *mi)
Definition multi.c:3686
void ungenerate_prefix(struct multi_instance *mi)
Definition multi.c:465
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:4080
static void multi_get_timeout_instance(struct multi_context *m, struct timeval *dest)
Definition multi.h:596
static void multi_set_pending(struct multi_context *m, struct multi_instance *mi)
Definition multi.h:705
void init_management_callback_multi(struct multi_context *m)
Definition multi.c:4053
#define MULTI_ROUTE_AGEABLE
Definition multi.h:241
void unlearn_ifconfig_ipv6(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:4308
void multi_process_drop_outgoing_tun(struct multi_context *m, const unsigned int mpp_flags)
Definition multi.c:3664
void unlearn_ifconfig(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:4296
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:4330
static bool multi_process_outgoing_link_dowork(struct multi_context *m, struct multi_instance *mi, const unsigned int mpp_flags)
Definition multi.h:661
static void multi_process_per_second_timers(struct multi_context *m)
Definition multi.h:577
static bool route_quota_test(const struct multi_instance *mi)
Definition multi.h:448
#define CLEAR(x)
Definition basic.h:32
static void msg_set_prefix(const char *prefix)
Definition error.h:330
#define ASSERT(x)
Definition error.h:219
time_t now
Definition otime.c:33
static void tv_delta(struct timeval *dest, const struct timeval *t1, const struct timeval *t2)
Definition otime.h:228
static int openvpn_gettimeofday(struct timeval *tv, void *tz)
Definition otime.h:71
int ifconfig_pool_handle
Definition pool.h:72
static struct schedule_entry * schedule_get_earliest_wakeup(struct schedule *s, struct timeval *wakeup)
Definition schedule.h:124
Wrapper structure for dynamically allocated memory.
Definition buffer.h:60
int len
Length in bytes of the actual content within the allocated memory.
Definition buffer.h:65
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
struct buffer to_tun
Definition openvpn.h:376
struct link_socket ** link_sockets
Definition openvpn.h:237
Contains all state information for one tunnel.
Definition openvpn.h:471
struct context_2 c2
Level 2 context.
Definition openvpn.h:514
struct options options
Options loaded from command line or configuration file.
Definition openvpn.h:472
Definition multi.h:60
int signal_received
Definition multi.h:62
struct timeval wakeup
Definition multi.h:63
struct schedule_entry se
Definition multi.h:61
Garbage collection arena used to keep track of dynamically allocated memory.
Definition buffer.h:116
Definition list.h:53
struct that handles all the rate limiting logic for initial responses
int ageable_ttl_secs
Definition mroute.h:134
unsigned int cache_generation
Definition mroute.h:133
Main OpenVPN server state structure.
Definition multi.h:162
int n_clients
Definition multi.h:188
struct mroute_addr local
Definition multi.h:183
struct schedule * schedule
Definition multi.h:173
time_t per_second_trigger
Definition multi.h:199
struct mbuf_set * mbuf
Set of buffers for passing data channel packets between VPN tunnel instances.
Definition multi.h:174
struct initial_packet_rate_limit * initial_rate_limiter
Definition multi.h:180
struct deferred_signal_schedule_entry deferred_shutdown_signal
Definition multi.h:218
struct link_socket_actual * hmac_reply_dest
Definition multi.h:205
uint32_t max_peerid
highest currently allocated peer-id and maximum allocated/valid index in instances
Definition multi.h:166
struct multi_reap * reaper
Definition multi.h:182
struct multi_io * multi_io
I/O state and events tracker.
Definition multi.h:177
struct hash * hash
VPN tunnel instances indexed by real address of the remote peer.
Definition multi.h:169
struct context_buffers * context_buffers
Definition multi.h:198
struct hash * cid_hash
Definition multi.h:191
unsigned long cid_counter
Definition multi.h:192
struct event_timeout stale_routes_check_et
Definition multi.h:211
struct link_socket * hmac_reply_ls
Definition multi.h:206
int tcp_queue_limit
Definition multi.h:186
struct ifconfig_pool * ifconfig_pool
Definition multi.h:178
struct frequency_limit * new_connection_limiter
Definition multi.h:179
uint32_t max_clients
Definition multi.h:185
struct context top
Storage structure for process-wide configuration.
Definition multi.h:201
int status_file_version
Definition multi.h:187
struct multi_instance * pending
Definition multi.h:195
struct hash * vhash
VPN tunnel instances indexed by virtual address of remote hosts.
Definition multi.h:171
struct multi_instance ** instances
Array of multi_instances with the size of max_clients.
Definition multi.h:163
struct multi_instance ** mpp_touched
Definition multi.h:197
struct buffer hmac_reply
Definition multi.h:204
bool enable_c2c
Definition multi.h:184
struct multi_instance * earliest_wakeup
Definition multi.h:196
struct mroute_helper * route_helper
Definition multi.h:181
Server-mode state structure for one single VPN tunnel.
Definition multi.h:102
struct mbuf_set * tcp_link_out_deferred
Definition multi.h:128
struct buffer_list * cc_config
Definition multi.h:137
bool did_cid_hash
Definition multi.h:136
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
unsigned int tcp_rwflags
Definition multi.h:127
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:139
bool socket_set_called
Definition multi.h:129
int route_count
Definition multi.h:115
ifconfig_pool_handle vaddr_handle
Definition multi.h:123
bool did_real_hash
Definition multi.h:134
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:142
struct schedule_entry se
Definition multi.h:103
int n_clients_delta
Definition multi.h:140
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:237
time_t last_reference
Definition multi.h:245
unsigned int cache_generation
Definition multi.h:244
unsigned int flags
Definition multi.h:242
struct multi_instance * instance
Definition multi.h:238
int max_routes_per_client
Definition options.h:534
Definition schedule.h:44
uint32_t in_addr_t
Definition syshead.h:52
struct gc_arena gc
Definition test_ssl.c:133
void vlan_process_outgoing_tun(struct multi_context *m, struct multi_instance *mi)
Definition vlan.c:291