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-2024 OpenVPN Inc <sales@openvpn.net>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2
12 * as published by the Free Software Foundation.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 */
23
29#ifndef MULTI_H
30#define MULTI_H
31
32#include "init.h"
33#include "forward.h"
34#include "mroute.h"
35#include "mbuf.h"
36#include "list.h"
37#include "schedule.h"
38#include "pool.h"
39#include "mudp.h"
40#include "mtcp.h"
41#include "multi_io.h"
42#include "perf.h"
43#include "vlan.h"
44#include "reflect_filter.h"
45
46#define MULTI_PREFIX_MAX_LENGTH 256
47
48/*
49 * Walk (don't run) through the routing table,
50 * deleting old entries, and possibly multi_instance
51 * structs as well which have been marked for deletion.
52 */
59
60
67
73{
74 /* Index of currently executed handler. */
76 /* Remember which option classes where processed for delayed option
77 * handling. */
78 unsigned int option_types_found;
79
85
91};
92
104 struct schedule_entry se; /* this must be the first element of the structure,
105 * We cast between this and schedule_entry so the
106 * beginning of the struct must be identical */
107
113 struct gc_arena gc;
114 bool halt;
116 int route_count; /* number of routes (including cached routes) owned by this instance */
117 time_t created;
121 struct timeval wakeup; /* absolute time */
126
127 /* queued outgoing data in Server/TCP mode */
128 unsigned int tcp_rwflags;
131
132 in_addr_t reporting_addr; /* IP address shown in status listing */
133 struct in6_addr reporting_addr_ipv6; /* IPv6 address in status listing */
134
137#ifdef ENABLE_MANAGEMENT
140#endif
142 int n_clients_delta; /* added to multi_context.n_clients when instance is closed */
143
147#ifdef ENABLE_ASYNC_PUSH
148 int inotify_watch; /* watch descriptor for acf */
149#endif
150};
151
152
167 struct hash *hash;
169 struct hash *vhash;
171 struct hash *iter;
175 struct mbuf_set *mbuf;
189 int n_clients; /* current number of authenticated clients */
190
191#ifdef ENABLE_MANAGEMENT
192 struct hash *cid_hash;
193 unsigned long cid_counter;
194#endif
195
201
202 struct context top;
208
209 /*
210 * Timer object for stale route check
211 */
213
214#ifdef ENABLE_ASYNC_PUSH
215 /* mapping between inotify watch descriptors and multi_instances */
216 struct hash *inotify_watchers;
217#endif
218
220};
221
232
233/*
234 * Host route
235 */
237{
240
241#define MULTI_ROUTE_CACHE (1<<0)
242#define MULTI_ROUTE_AGEABLE (1<<1)
243 unsigned int flags;
244
245 unsigned int cache_generation;
247};
248
249
250/**************************************************************************/
257void tunnel_server(struct context *top);
258
259
260const char *multi_instance_string(const struct multi_instance *mi, bool null, struct gc_arena *gc);
261
262/*
263 * Called by mtcp.c, mudp.c, or other (to be written) protocol drivers
264 */
265
266void multi_init(struct multi_context *m, struct context *t);
267
268void multi_uninit(struct multi_context *m);
269
270void multi_top_init(struct multi_context *m, struct context *top);
271
272void multi_top_free(struct multi_context *m);
273
274struct multi_instance *multi_create_instance(struct multi_context *m, const struct mroute_addr *real,
275 struct link_socket *sock);
276
277void multi_close_instance(struct multi_context *m, struct multi_instance *mi, bool shutdown);
278
279bool multi_process_timeout(struct multi_context *m, const unsigned int mpp_flags);
280
289void multi_process_float(struct multi_context *m, struct multi_instance *mi,
290 struct link_socket *sock);
291
292#define MPP_PRE_SELECT (1<<0)
293#define MPP_CONDITIONAL_PRE_SELECT (1<<1)
294#define MPP_CLOSE_ON_SIGNAL (1<<2)
295#define MPP_RECORD_TOUCH (1<<3)
296
297
298/**************************************************************************/
320bool multi_process_post(struct multi_context *m, struct multi_instance *mi, const unsigned int flags);
321
332
333/**************************************************************************/
357bool multi_process_incoming_link(struct multi_context *m, struct multi_instance *instance, const unsigned int mpp_flags,
358 struct link_socket *sock);
359
360
376bool multi_process_incoming_tun(struct multi_context *m, const unsigned int mpp_flags);
377
378
379void multi_process_drop_outgoing_tun(struct multi_context *m, const unsigned int mpp_flags);
380
381void multi_print_status(struct multi_context *m, struct status_output *so, const int version);
382
383struct multi_instance *multi_get_queue(struct mbuf_set *ms);
384
385void multi_add_mbuf(struct multi_context *m,
386 struct multi_instance *mi,
387 struct mbuf_buffer *mb);
388
389void multi_ifconfig_pool_persist(struct multi_context *m, bool force);
390
391bool multi_process_signal(struct multi_context *m);
392
394
396
397#ifdef ENABLE_ASYNC_PUSH
405void multi_process_file_closed(struct multi_context *m, const unsigned int mpp_flags);
406
407#endif
408
409/*
410 * Return true if our output queue is not full
411 */
412static inline bool
414 const struct multi_instance *mi)
415{
416 if (mi->tcp_link_out_deferred)
417 {
419 }
420 else
421 {
422 return true;
423 }
424}
425
426/*
427 * Determine which instance has pending output
428 * and prepare the output for sending in
429 * the to_link buffer.
430 */
431static inline struct multi_instance *
433{
434 struct multi_instance *mi = NULL;
435
436 if (m->pending)
437 {
438 mi = m->pending;
439 }
440 else if (mbuf_defined(m->mbuf))
441 {
442 mi = multi_get_queue(m->mbuf);
443 }
444 return mi;
445}
446
447/*
448 * Per-client route quota management
449 */
450
451void route_quota_exceeded(const struct multi_instance *mi);
452
453static inline void
455{
456 ++mi->route_count;
457}
458
459static inline void
461{
462 --mi->route_count;
463}
464
465/* can we add a new route? */
466static inline bool
468{
470 {
472 return false;
473 }
474 else
475 {
476 return true;
477 }
478}
479
480/*
481 * Instance reference counting
482 */
483
484static inline void
486{
487 ++mi->refcount;
488}
489
490static inline void
492{
493 if (--mi->refcount <= 0)
494 {
495 gc_free(&mi->gc);
496 free(mi);
497 }
498}
499
500static inline void
502{
503 struct multi_instance *mi = route->instance;
504 route_quota_dec(mi);
506 free(route);
507}
508
509static inline bool
511 const struct multi_route *r)
512{
513 if (r->instance->halt)
514 {
515 return false;
516 }
517 else if ((r->flags & MULTI_ROUTE_CACHE)
519 {
520 return false;
521 }
522 else if ((r->flags & MULTI_ROUTE_AGEABLE)
524 {
525 return false;
526 }
527 else
528 {
529 return true;
530 }
531}
532
533/*
534 * Takes prefix away from multi_instance.
535 */
536void
538
539/*
540 * Set a msg() function prefix with our current client instance ID.
541 */
542
543static inline void
545{
546#ifdef MULTI_DEBUG_EVENT_LOOP
547 if (mi->msg_prefix[0])
548 {
549 printf("[%s]\n", mi->msg_prefix);
550 }
551#endif
552 msg_set_prefix(mi->msg_prefix[0] ? mi->msg_prefix : NULL);
553}
554
555static inline void
557{
558#ifdef MULTI_DEBUG_EVENT_LOOP
559 printf("[NULL]\n");
560#endif
561 msg_set_prefix(NULL);
562}
563
564/*
565 * Instance Reaper
566 *
567 * Reaper constants. The reaper is the process where the virtual address
568 * and virtual route hash table is scanned for dead entries which are
569 * then removed. The hash table could potentially be quite large, so we
570 * don't want to reap in a single pass.
571 */
572
573#define REAP_MAX_WAKEUP 10 /* Do reap pass at least once per n seconds */
574#define REAP_DIVISOR 256 /* How many passes to cover whole hash table */
575#define REAP_MIN 16 /* Minimum number of buckets per pass */
576#define REAP_MAX 1024 /* Maximum number of buckets per pass */
577
578/*
579 * Mark a cached host route for deletion after this
580 * many seconds without any references.
581 */
582#define MULTI_CACHE_ROUTE_TTL 60
583
584void multi_reap_process_dowork(const struct multi_context *m);
585
587
588static inline void
590{
591 if (m->reaper->last_call != now)
592 {
594 }
595}
596
597static inline void
606
607/*
608 * Compute earliest timeout expiry from the set of
609 * all instances. Output:
610 *
611 * m->earliest_wakeup : instance needing the earliest service.
612 * dest : earliest timeout as a delta in relation
613 * to current time.
614 */
615static inline void
616multi_get_timeout(struct multi_context *m, struct timeval *dest)
617{
618 struct timeval tv, current;
619
620 CLEAR(tv);
622 if (m->earliest_wakeup)
623 {
624 ASSERT(!openvpn_gettimeofday(&current, NULL));
625 tv_delta(dest, &current, &tv);
626 if (dest->tv_sec >= REAP_MAX_WAKEUP)
627 {
628 m->earliest_wakeup = NULL;
629 dest->tv_sec = REAP_MAX_WAKEUP;
630 dest->tv_usec = 0;
631 }
632 }
633 else
634 {
635 dest->tv_sec = REAP_MAX_WAKEUP;
636 dest->tv_usec = 0;
637 }
638}
639
640
658static inline bool
659multi_process_outgoing_tun(struct multi_context *m, const unsigned int mpp_flags)
660{
661 struct multi_instance *mi = m->pending;
662 bool ret = true;
663
664 ASSERT(mi);
665#ifdef MULTI_DEBUG_EVENT_LOOP
666 printf("%s -> TUN len=%d\n",
667 id(mi),
668 mi->context.c2.to_tun.len);
669#endif
670 set_prefix(mi);
673 ret = multi_process_post(m, mi, mpp_flags);
674 clear_prefix();
675 return ret;
676}
677
678#define CLIENT_CONNECT_OPT_MASK (OPT_P_INSTANCE | OPT_P_INHERIT \
679 |OPT_P_PUSH | OPT_P_TIMER | OPT_P_CONFIG \
680 |OPT_P_ECHO | OPT_P_COMP | OPT_P_SOCKFLAGS)
681
682static inline bool
683multi_process_outgoing_link_dowork(struct multi_context *m, struct multi_instance *mi, const unsigned int mpp_flags)
684{
685 bool ret = true;
686 set_prefix(mi);
688 ret = multi_process_post(m, mi, mpp_flags);
689 clear_prefix();
690 return ret;
691}
692
693/*
694 * Check for signals.
695 */
696#define MULTI_CHECK_SIG(m) EVENT_LOOP_CHECK_SIGNAL(&(m)->top, multi_process_signal, (m))
697
698static inline void
700{
701 m->pending = mi;
702}
711void multi_assign_peer_id(struct multi_context *m, struct multi_instance *mi);
712
713
714#endif /* MULTI_H */
static void gc_free(struct gc_arena *a)
Definition buffer.h:1033
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:4219
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:3352
void process_outgoing_link(struct context *c, struct link_socket *sock)
Write a packet to the external network interface.
Definition forward.c:1744
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:1901
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:659
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:3556
@ route
Definition interactive.c:87
static bool mbuf_defined(const struct mbuf_set *ms)
Definition mbuf.h:80
static unsigned int mbuf_len(const struct mbuf_set *ms)
Definition mbuf.h:86
bool multi_process_incoming_dco(struct multi_context *m)
Process an incoming DCO message (from kernel space).
client_connect_return
Return values used by the client connect call-back functions.
Definition multi.h:226
@ CC_RET_DEFERRED
Definition multi.h:229
@ CC_RET_FAILED
Definition multi.h:227
@ CC_RET_SKIPPED
Definition multi.h:230
@ CC_RET_SUCCEEDED
Definition multi.h:228
struct multi_instance * multi_create_instance(struct multi_context *m, const struct mroute_addr *real, struct link_socket *sock)
Definition multi.c:756
static bool multi_output_queue_ready(const struct multi_context *m, const struct multi_instance *mi)
Definition multi.h:413
#define REAP_MAX_WAKEUP
Definition multi.h:573
void multi_ifconfig_pool_persist(struct multi_context *m, bool force)
Definition multi.c:163
#define MULTI_PREFIX_MAX_LENGTH
Definition multi.h:46
void multi_reap_process_dowork(const struct multi_context *m)
Definition multi.c:225
static void route_quota_dec(struct multi_instance *mi)
Definition multi.h:460
bool multi_process_signal(struct multi_context *m)
Definition multi.c:3885
void multi_init(struct multi_context *m, struct context *t)
Definition multi.c:292
void multi_close_instance_on_signal(struct multi_context *m, struct multi_instance *mi)
Definition multi.c:3223
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:3048
void multi_process_per_second_timers_dowork(struct multi_context *m)
Definition multi.c:3796
struct multi_instance * multi_get_queue(struct mbuf_set *ms)
Definition multi.c:3650
bool multi_process_timeout(struct multi_context *m, const unsigned int mpp_flags)
Definition multi.c:3685
static void set_prefix(struct multi_instance *mi)
Definition multi.h:544
void multi_process_float(struct multi_context *m, struct multi_instance *mi, struct link_socket *sock)
Handles peer floating.
Definition multi.c:3145
static void multi_route_del(struct multi_route *route)
Definition multi.h:501
static void multi_reap_process(const struct multi_context *m)
Definition multi.h:589
static void route_quota_inc(struct multi_instance *mi)
Definition multi.h:454
#define MULTI_ROUTE_CACHE
Definition multi.h:241
const char * multi_instance_string(const struct multi_instance *mi, bool null, struct gc_arena *gc)
Definition multi.c:464
static void clear_prefix(void)
Definition multi.h:556
void multi_close_instance(struct multi_context *m, struct multi_instance *mi, bool shutdown)
Definition multi.c:604
static bool multi_route_defined(const struct multi_context *m, const struct multi_route *r)
Definition multi.h:510
static struct multi_instance * multi_process_outgoing_link_pre(struct multi_context *m)
Definition multi.h:432
static void multi_instance_dec_refcount(struct multi_instance *mi)
Definition multi.h:491
void multi_add_mbuf(struct multi_context *m, struct multi_instance *mi, struct mbuf_buffer *mb)
Definition multi.c:2889
static void multi_instance_inc_refcount(struct multi_instance *mi)
Definition multi.h:485
void route_quota_exceeded(const struct multi_instance *mi)
Definition multi.c:3738
void ungenerate_prefix(struct multi_instance *mi)
Definition multi.c:512
void multi_top_free(struct multi_context *m)
Definition multi.c:3832
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:4155
static void multi_get_timeout(struct multi_context *m, struct timeval *dest)
Definition multi.h:616
static void multi_set_pending(struct multi_context *m, struct multi_instance *mi)
Definition multi.h:699
void multi_top_init(struct multi_context *m, struct context *top)
Definition multi.c:3825
void init_management_callback_multi(struct multi_context *m)
Definition multi.c:4130
#define MULTI_ROUTE_AGEABLE
Definition multi.h:242
void multi_process_drop_outgoing_tun(struct multi_context *m, const unsigned int mpp_flags)
Definition multi.c:3716
static bool multi_process_outgoing_link_dowork(struct multi_context *m, struct multi_instance *mi, const unsigned int mpp_flags)
Definition multi.h:683
static void multi_process_per_second_timers(struct multi_context *m)
Definition multi.h:598
void multi_print_status(struct multi_context *m, struct status_output *so, const int version)
Definition multi.c:850
static bool route_quota_test(const struct multi_instance *mi)
Definition multi.h:467
void multi_uninit(struct multi_context *m)
Definition multi.c:708
#define CLEAR(x)
Definition basic.h:33
static void msg_set_prefix(const char *prefix)
Definition error.h:301
#define ASSERT(x)
Definition error.h:195
time_t now
Definition otime.c:34
static void tv_delta(struct timeval *dest, const struct timeval *t1, const struct timeval *t2)
Definition otime.h:220
static int openvpn_gettimeofday(struct timeval *tv, void *tz)
Definition otime.h:64
int ifconfig_pool_handle
Definition pool.h:71
static struct schedule_entry * schedule_get_earliest_wakeup(struct schedule *s, struct timeval *wakeup)
Definition schedule.h:118
Wrapper structure for dynamically allocated memory.
Definition buffer.h:61
int len
Length in bytes of the actual content within the allocated memory.
Definition buffer.h:66
Detached client connection state.
Definition multi.h:73
char * config_file
The temporary file name that contains the config directives returned by the client-connect script.
Definition multi.h:90
unsigned int option_types_found
Definition multi.h:78
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:84
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:474
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:475
Definition multi.h:62
int signal_received
Definition multi.h:64
struct timeval wakeup
Definition multi.h:65
struct schedule_entry se
Definition multi.h:63
Garbage collection arena used to keep track of dynamically allocated memory.
Definition buffer.h:117
Definition list.h:57
struct that handles all the rate limiting logic for initial responses
int ageable_ttl_secs
Definition mroute.h:126
unsigned int cache_generation
Definition mroute.h:125
Main OpenVPN server state structure.
Definition multi.h:163
int n_clients
Definition multi.h:189
struct mroute_addr local
Definition multi.h:184
struct schedule * schedule
Definition multi.h:174
time_t per_second_trigger
Definition multi.h:200
struct mbuf_set * mbuf
Set of buffers for passing data channel packets between VPN tunnel instances.
Definition multi.h:175
struct initial_packet_rate_limit * initial_rate_limiter
Definition multi.h:181
struct deferred_signal_schedule_entry deferred_shutdown_signal
Definition multi.h:219
struct link_socket_actual * hmac_reply_dest
Definition multi.h:206
int max_clients
Definition multi.h:186
struct multi_reap * reaper
Definition multi.h:183
struct multi_io * multi_io
I/O state and events tracker.
Definition multi.h:178
struct hash * hash
VPN tunnel instances indexed by real address of the remote peer.
Definition multi.h:167
struct context_buffers * context_buffers
Definition multi.h:199
struct hash * cid_hash
Definition multi.h:192
unsigned long cid_counter
Definition multi.h:193
struct event_timeout stale_routes_check_et
Definition multi.h:212
struct link_socket * hmac_reply_ls
Definition multi.h:207
int tcp_queue_limit
Definition multi.h:187
struct ifconfig_pool * ifconfig_pool
Definition multi.h:179
struct frequency_limit * new_connection_limiter
Definition multi.h:180
struct context top
Storage structure for process-wide configuration.
Definition multi.h:202
int status_file_version
Definition multi.h:188
struct multi_instance * pending
Definition multi.h:196
struct hash * vhash
VPN tunnel instances indexed by virtual address of remote hosts.
Definition multi.h:169
struct hash * iter
VPN tunnel instances indexed by real address of the remote peer, optimized for iteration.
Definition multi.h:171
struct multi_instance ** instances
Array of multi_instances.
Definition multi.h:164
struct multi_instance ** mpp_touched
Definition multi.h:198
struct buffer hmac_reply
Definition multi.h:205
bool enable_c2c
Definition multi.h:185
struct multi_instance * earliest_wakeup
Definition multi.h:197
struct mroute_helper * route_helper
Definition multi.h:182
Server-mode state structure for one single VPN tunnel.
Definition multi.h:103
struct mbuf_set * tcp_link_out_deferred
Definition multi.h:129
struct buffer_list * cc_config
Definition multi.h:139
bool did_cid_hash
Definition multi.h:138
time_t created
Time at which a VPN tunnel instance was created.
Definition multi.h:117
in_addr_t reporting_addr
Definition multi.h:132
unsigned int tcp_rwflags
Definition multi.h:128
char msg_prefix[MULTI_PREFIX_MAX_LENGTH]
Definition multi.h:125
struct mroute_addr real
External network address of the remote peer.
Definition multi.h:122
bool did_iroutes
Definition multi.h:141
bool socket_set_called
Definition multi.h:130
int route_count
Definition multi.h:116
ifconfig_pool_handle vaddr_handle
Definition multi.h:124
bool did_real_hash
Definition multi.h:135
struct gc_arena gc
Definition multi.h:113
struct in6_addr reporting_addr_ipv6
Definition multi.h:133
struct timeval wakeup
Definition multi.h:121
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:108
bool did_iter
Definition multi.h:136
struct context context
The context structure storing state for this VPN tunnel.
Definition multi.h:144
struct schedule_entry se
Definition multi.h:104
int n_clients_delta
Definition multi.h:142
time_t last_call
Definition multi.h:57
int buckets_per_pass
Definition multi.h:56
int bucket_base
Definition multi.h:55
struct mroute_addr addr
Definition multi.h:238
time_t last_reference
Definition multi.h:246
unsigned int cache_generation
Definition multi.h:245
unsigned int flags
Definition multi.h:243
struct multi_instance * instance
Definition multi.h:239
int max_routes_per_client
Definition options.h:535
Definition schedule.h:45
struct gc_arena gc
Definition test_ssl.c:155
void vlan_process_outgoing_tun(struct multi_context *m, struct multi_instance *mi)
Definition vlan.c:296