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  */
53 struct multi_reap
54 {
57  time_t last_call;
58 };
59 
60 
62 {
65  struct timeval wakeup;
66 };
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 
90  char *config_file;
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 
108  struct event_arg ev_arg;
113  struct gc_arena gc;
114  bool halt;
115  int refcount;
116  int route_count; /* number of routes (including cached routes) owned by this instance */
117  time_t created;
121  struct timeval wakeup; /* absolute time */
122  struct mroute_addr real;
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 
136  bool did_iter;
137 #ifdef ENABLE_MANAGEMENT
140 #endif
142  int n_clients_delta; /* added to multi_context.n_clients when instance is closed */
143 
144  struct context context;
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;
178  struct multi_io *multi_io;
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 
226 {
231 };
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 /**************************************************************************/
257 void tunnel_server(struct context *top);
258 
259 
260 const 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 
266 void multi_init(struct multi_context *m, struct context *t);
267 
268 void multi_uninit(struct multi_context *m);
269 
270 void multi_top_init(struct multi_context *m, struct context *top);
271 
272 void multi_top_free(struct multi_context *m);
273 
274 struct multi_instance *multi_create_instance(struct multi_context *m, const struct mroute_addr *real,
275  struct link_socket *sock);
276 
277 void multi_close_instance(struct multi_context *m, struct multi_instance *mi, bool shutdown);
278 
279 bool multi_process_timeout(struct multi_context *m, const unsigned int mpp_flags);
280 
289 void 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 /**************************************************************************/
320 bool multi_process_post(struct multi_context *m, struct multi_instance *mi, const unsigned int flags);
321 
332 
333 /**************************************************************************/
357 bool multi_process_incoming_link(struct multi_context *m, struct multi_instance *instance, const unsigned int mpp_flags,
358  struct link_socket *sock);
359 
360 
376 bool multi_process_incoming_tun(struct multi_context *m, const unsigned int mpp_flags);
377 
378 
379 void multi_process_drop_outgoing_tun(struct multi_context *m, const unsigned int mpp_flags);
380 
381 void multi_print_status(struct multi_context *m, struct status_output *so, const int version);
382 
383 struct multi_instance *multi_get_queue(struct mbuf_set *ms);
384 
385 void multi_add_mbuf(struct multi_context *m,
386  struct multi_instance *mi,
387  struct mbuf_buffer *mb);
388 
389 void multi_ifconfig_pool_persist(struct multi_context *m, bool force);
390 
391 bool multi_process_signal(struct multi_context *m);
392 
394 
396 
397 #ifdef ENABLE_ASYNC_PUSH
398 
405 void 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  */
412 static 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  */
431 static 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 
451 void route_quota_exceeded(const struct multi_instance *mi);
452 
453 static inline void
455 {
456  ++mi->route_count;
457 }
458 
459 static inline void
461 {
462  --mi->route_count;
463 }
464 
465 /* can we add a new route? */
466 static inline bool
468 {
470  {
472  return false;
473  }
474  else
475  {
476  return true;
477  }
478 }
479 
480 /*
481  * Instance reference counting
482  */
483 
484 static inline void
486 {
487  ++mi->refcount;
488 }
489 
490 static inline void
492 {
493  if (--mi->refcount <= 0)
494  {
495  gc_free(&mi->gc);
496  free(mi);
497  }
498 }
499 
500 static inline void
502 {
503  struct multi_instance *mi = route->instance;
504  route_quota_dec(mi);
506  free(route);
507 }
508 
509 static 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  */
536 void
538 
539 /*
540  * Set a msg() function prefix with our current client instance ID.
541  */
542 
543 static 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 
555 static 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 
584 void multi_reap_process_dowork(const struct multi_context *m);
585 
587 
588 static inline void
590 {
591  if (m->reaper->last_call != now)
592  {
594  }
595 }
596 
597 static inline void
599 {
600  if (m->per_second_trigger != now)
601  {
603  m->per_second_trigger = now;
604  }
605 }
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  */
615 static inline void
616 multi_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 
658 static inline bool
659 multi_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 
682 static inline bool
683 multi_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 
698 static inline void
700 {
701  m->pending = mi;
702 }
711 void multi_assign_peer_id(struct multi_context *m, struct multi_instance *mi);
712 
713 
714 #endif /* MULTI_H */
multi_reap::buckets_per_pass
int buckets_per_pass
Definition: multi.h:56
multi_context::n_clients
int n_clients
Definition: multi.h:189
multi_instance
Server-mode state structure for one single VPN tunnel.
Definition: multi.h:103
multi_instance::halt
bool halt
Definition: multi.h:114
reflect_filter.h
multi_process_incoming_dco
bool multi_process_incoming_dco(struct multi_context *m)
Process an incoming DCO message (from kernel space).
ifconfig_pool_handle
int ifconfig_pool_handle
Definition: pool.h:71
multi_uninit
void multi_uninit(struct multi_context *m)
Definition: multi.c:710
mbuf_defined
static bool mbuf_defined(const struct mbuf_set *ms)
Definition: mbuf.h:80
route_quota_exceeded
void route_quota_exceeded(const struct multi_instance *mi)
Definition: multi.c:3802
multi_process_per_second_timers_dowork
void multi_process_per_second_timers_dowork(struct multi_context *m)
Definition: multi.c:3860
multi_context::route_helper
struct mroute_helper * route_helper
Definition: multi.h:182
CC_RET_FAILED
@ CC_RET_FAILED
Definition: multi.h:227
route_quota_test
static bool route_quota_test(const struct multi_instance *mi)
Definition: multi.h:467
multi_instance::tcp_rwflags
unsigned int tcp_rwflags
Definition: multi.h:128
multi_context::stale_routes_check_et
struct event_timeout stale_routes_check_et
Definition: multi.h:212
deferred_signal_schedule_entry::se
struct schedule_entry se
Definition: multi.h:63
tv_delta
static void tv_delta(struct timeval *dest, const struct timeval *t1, const struct timeval *t2)
Definition: otime.h:220
multi_context::reaper
struct multi_reap * reaper
Definition: multi.h:183
forward.h
multi_instance::reporting_addr
in_addr_t reporting_addr
Definition: multi.h:132
multi_process_float
void multi_process_float(struct multi_context *m, struct multi_instance *mi, struct link_socket *sock)
Handles peer floating.
Definition: multi.c:3209
CC_RET_SUCCEEDED
@ CC_RET_SUCCEEDED
Definition: multi.h:228
buffer::len
int len
Length in bytes of the actual content within the allocated memory.
Definition: buffer.h:66
multi_process_signal
bool multi_process_signal(struct multi_context *m)
Definition: multi.c:3949
multi_context::tcp_queue_limit
int tcp_queue_limit
Definition: multi.h:187
MULTI_ROUTE_AGEABLE
#define MULTI_ROUTE_AGEABLE
Definition: multi.h:242
initial_packet_rate_limit
struct that handles all the rate limiting logic for initial responses
Definition: reflect_filter.h:30
multi_top_init
void multi_top_init(struct multi_context *m, struct context *top)
Definition: multi.c:3889
schedule.h
context
Contains all state information for one tunnel.
Definition: openvpn.h:473
hash
Definition: list.h:56
process_outgoing_tun
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
deferred_signal_schedule_entry::wakeup
struct timeval wakeup
Definition: multi.h:65
mbuf_set
Definition: mbuf.h:56
multi_context::mbuf
struct mbuf_set * mbuf
Set of buffers for passing data channel packets between VPN tunnel instances.
Definition: multi.h:175
multi_instance::real
struct mroute_addr real
External network address of the remote peer.
Definition: multi.h:122
multi_instance::gc
struct gc_arena gc
Definition: multi.h:113
REAP_MAX_WAKEUP
#define REAP_MAX_WAKEUP
Definition: multi.h:573
set_prefix
static void set_prefix(struct multi_instance *mi)
Definition: multi.h:544
client_connect_defer_state::deferred_ret_file
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
multi_instance::wakeup
struct timeval wakeup
Definition: multi.h:121
multi_instance::ev_arg
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
multi_context::hmac_reply_ls
struct link_socket * hmac_reply_ls
Definition: multi.h:207
schedule_get_earliest_wakeup
static struct schedule_entry * schedule_get_earliest_wakeup(struct schedule *s, struct timeval *wakeup)
Definition: schedule.h:118
process_outgoing_link
void process_outgoing_link(struct context *c, struct link_socket *sock)
Write a packet to the external network interface.
Definition: forward.c:1744
vlan.h
multi_io
Definition: multi_io.h:52
multi_close_instance_on_signal
void multi_close_instance_on_signal(struct multi_context *m, struct multi_instance *mi)
Definition: multi.c:3287
multi_ifconfig_pool_persist
void multi_ifconfig_pool_persist(struct multi_context *m, bool force)
Definition: multi.c:165
multi_instance::se
struct schedule_entry se
Definition: multi.h:104
schedule
Definition: schedule.h:53
multi_instance::route_count
int route_count
Definition: multi.h:116
multi_context::per_second_trigger
time_t per_second_trigger
Definition: multi.h:200
client_connect_defer_state::config_file
char * config_file
The temporary file name that contains the config directives returned by the client-connect script.
Definition: multi.h:90
multi_context::schedule
struct schedule * schedule
Definition: multi.h:174
ifconfig_pool
Definition: pool.h:49
client_connect_defer_state
Detached client connection state.
Definition: multi.h:72
multi_route::addr
struct mroute_addr addr
Definition: multi.h:238
multi_route::last_reference
time_t last_reference
Definition: multi.h:246
multi_reap::last_call
time_t last_call
Definition: multi.h:57
multi_context::enable_c2c
bool enable_c2c
Definition: multi.h:185
multi_route::instance
struct multi_instance * instance
Definition: multi.h:239
multi_context::max_clients
int max_clients
Definition: multi.h:186
multi_context::new_connection_limiter
struct frequency_limit * new_connection_limiter
Definition: multi.h:180
multi_process_post
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:3112
CLEAR
#define CLEAR(x)
Definition: basic.h:33
multi_context::cid_counter
unsigned long cid_counter
Definition: multi.h:193
multi_context::deferred_shutdown_signal
struct deferred_signal_schedule_entry deferred_shutdown_signal
Definition: multi.h:219
clear_prefix
static void clear_prefix(void)
Definition: multi.h:556
multi_instance_dec_refcount
static void multi_instance_dec_refcount(struct multi_instance *mi)
Definition: multi.h:491
context::c2
struct context_2 c2
Level 2 context.
Definition: openvpn.h:514
multi_context::instances
struct multi_instance ** instances
Array of multi_instances.
Definition: multi.h:164
ASSERT
#define ASSERT(x)
Definition: error.h:195
route_quota_inc
static void route_quota_inc(struct multi_instance *mi)
Definition: multi.h:454
multi_instance::cc_config
struct buffer_list * cc_config
Definition: multi.h:139
multi_context::top
struct context top
Storage structure for process-wide configuration.
Definition: multi.h:202
multi_instance::socket_set_called
bool socket_set_called
Definition: multi.h:130
ungenerate_prefix
void ungenerate_prefix(struct multi_instance *mi)
Definition: multi.c:514
multi_context::status_file_version
int status_file_version
Definition: multi.h:188
multi_context::local
struct mroute_addr local
Definition: multi.h:184
multi_io.h
multi_add_mbuf
void multi_add_mbuf(struct multi_context *m, struct multi_instance *mi, struct mbuf_buffer *mb)
Definition: multi.c:2953
tunnel_server
void tunnel_server(struct context *top)
Main event loop for OpenVPN in server mode.
Definition: multi.c:4283
context_buffers
Definition: openvpn.h:94
init.h
multi_process_outgoing_link_dowork
static bool multi_process_outgoing_link_dowork(struct multi_context *m, struct multi_instance *mi, const unsigned int mpp_flags)
Definition: multi.h:683
multi_context::cid_hash
struct hash * cid_hash
Definition: multi.h:192
vlan_process_outgoing_tun
void vlan_process_outgoing_tun(struct multi_context *m, struct multi_instance *mi)
Definition: vlan.c:296
multi_instance_inc_refcount
static void multi_instance_inc_refcount(struct multi_instance *mi)
Definition: multi.h:485
mbuf.h
context::options
struct options options
Options loaded from command line or configuration file.
Definition: openvpn.h:475
multi_context::mpp_touched
struct multi_instance ** mpp_touched
Definition: multi.h:198
pool.h
mroute_helper::cache_generation
unsigned int cache_generation
Definition: mroute.h:125
multi_context::hash
struct hash * hash
VPN tunnel instances indexed by real address of the remote peer.
Definition: multi.h:167
multi_instance::reporting_addr_ipv6
struct in6_addr reporting_addr_ipv6
Definition: multi.h:133
multi_process_per_second_timers
static void multi_process_per_second_timers(struct multi_context *m)
Definition: multi.h:598
status_output
Definition: status.h:48
frequency_limit
Definition: otime.h:31
multi_instance::did_cid_hash
bool did_cid_hash
Definition: multi.h:138
multi_reap
Definition: multi.h:53
multi_context::pending
struct multi_instance * pending
Definition: multi.h:196
msg_set_prefix
static void msg_set_prefix(const char *prefix)
Definition: error.h:301
multi_context::vhash
struct hash * vhash
VPN tunnel instances indexed by virtual address of remote hosts.
Definition: multi.h:169
multi_process_timeout
bool multi_process_timeout(struct multi_context *m, const unsigned int mpp_flags)
Definition: multi.c:3749
buffer
Wrapper structure for dynamically allocated memory.
Definition: buffer.h:60
multi_init
void multi_init(struct multi_context *m, struct context *t)
Definition: multi.c:294
deferred_signal_schedule_entry::signal_received
int signal_received
Definition: multi.h:64
init_management_callback_multi
void init_management_callback_multi(struct multi_context *m)
Definition: multi.c:4194
multi_context::earliest_wakeup
struct multi_instance * earliest_wakeup
Definition: multi.h:197
multi_instance::vaddr_handle
ifconfig_pool_handle vaddr_handle
Definition: multi.h:124
event_arg
Definition: event.h:141
multi_context::hmac_reply
struct buffer hmac_reply
Definition: multi.h:205
multi_route::flags
unsigned int flags
Definition: multi.h:243
route_quota_dec
static void route_quota_dec(struct multi_instance *mi)
Definition: multi.h:460
multi_instance::msg_prefix
char msg_prefix[MULTI_PREFIX_MAX_LENGTH]
Definition: multi.h:125
multi_set_pending
static void multi_set_pending(struct multi_context *m, struct multi_instance *mi)
Definition: multi.h:699
mroute_addr
Definition: mroute.h:78
mroute_helper::ageable_ttl_secs
int ageable_ttl_secs
Definition: mroute.h:126
multi_process_incoming_tun
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:3620
multi_assign_peer_id
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:4219
schedule_entry
Definition: schedule.h:44
context_2::link_sockets
struct link_socket ** link_sockets
Definition: openvpn.h:237
gc_arena
Garbage collection arena used to keep track of dynamically allocated memory.
Definition: buffer.h:116
multi_close_instance
void multi_close_instance(struct multi_context *m, struct multi_instance *mi, bool shutdown)
Definition: multi.c:606
mbuf_buffer
Definition: mbuf.h:41
route
@ route
Definition: interactive.c:87
multi_route
Definition: multi.h:236
multi_instance::did_iter
bool did_iter
Definition: multi.h:136
mroute.h
multi_context
Main OpenVPN server state structure.
Definition: multi.h:163
deferred_signal_schedule_entry
Definition: multi.h:61
perf.h
multi_output_queue_ready
static bool multi_output_queue_ready(const struct multi_context *m, const struct multi_instance *mi)
Definition: multi.h:413
multi_process_drop_outgoing_tun
void multi_process_drop_outgoing_tun(struct multi_context *m, const unsigned int mpp_flags)
Definition: multi.c:3780
multi_process_incoming_link
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:3416
client_connect_defer_state::cur_handler_index
int cur_handler_index
Definition: multi.h:75
client_connect_return
client_connect_return
Return values used by the client connect call-back functions.
Definition: multi.h:225
multi_context::hmac_reply_dest
struct link_socket_actual * hmac_reply_dest
Definition: multi.h:206
context_2::to_tun
struct buffer to_tun
Definition: openvpn.h:376
multi_context::context_buffers
struct context_buffers * context_buffers
Definition: multi.h:199
multi_context::iter
struct hash * iter
VPN tunnel instances indexed by real address of the remote peer, optimized for iteration.
Definition: multi.h:171
client_connect_defer_state::option_types_found
unsigned int option_types_found
Definition: multi.h:78
multi_instance_string
const char * multi_instance_string(const struct multi_instance *mi, bool null, struct gc_arena *gc)
Definition: multi.c:466
multi_get_queue
struct multi_instance * multi_get_queue(struct mbuf_set *ms)
Definition: multi.c:3714
mtcp.h
multi_context::multi_io
struct multi_io * multi_io
I/O state and events tracker.
Definition: multi.h:178
openvpn_gettimeofday
static int openvpn_gettimeofday(struct timeval *tv, void *tz)
Definition: otime.h:64
mbuf_len
static unsigned int mbuf_len(const struct mbuf_set *ms)
Definition: mbuf.h:86
mroute_helper
Definition: mroute.h:124
gc_free
static void gc_free(struct gc_arena *a)
Definition: buffer.h:1033
CC_RET_SKIPPED
@ CC_RET_SKIPPED
Definition: multi.h:230
multi_route::cache_generation
unsigned int cache_generation
Definition: multi.h:245
multi_route_defined
static bool multi_route_defined(const struct multi_context *m, const struct multi_route *r)
Definition: multi.h:510
options::max_routes_per_client
int max_routes_per_client
Definition: options.h:536
multi_reap::bucket_base
int bucket_base
Definition: multi.h:55
mudp.h
multi_create_instance
struct multi_instance * multi_create_instance(struct multi_context *m, const struct mroute_addr *real, struct link_socket *sock)
Definition: multi.c:758
MULTI_ROUTE_CACHE
#define MULTI_ROUTE_CACHE
Definition: multi.h:241
now
time_t now
Definition: otime.c:34
multi_instance::did_iroutes
bool did_iroutes
Definition: multi.h:141
multi_instance::created
time_t created
Time at which a VPN tunnel instance was created.
Definition: multi.h:117
multi_route_del
static void multi_route_del(struct multi_route *route)
Definition: multi.h:501
multi_context::initial_rate_limiter
struct initial_packet_rate_limit * initial_rate_limiter
Definition: multi.h:181
event_timeout
Definition: interval.h:136
multi_process_outgoing_tun
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
multi_instance::tcp_link_out_deferred
struct mbuf_set * tcp_link_out_deferred
Definition: multi.h:129
list.h
CC_RET_DEFERRED
@ CC_RET_DEFERRED
Definition: multi.h:229
MULTI_PREFIX_MAX_LENGTH
#define MULTI_PREFIX_MAX_LENGTH
Definition: multi.h:46
multi_print_status
void multi_print_status(struct multi_context *m, struct status_output *so, const int version)
Definition: multi.c:852
multi_context::ifconfig_pool
struct ifconfig_pool * ifconfig_pool
Definition: multi.h:179
buffer_list
Definition: buffer.h:1120
multi_instance::did_real_hash
bool did_real_hash
Definition: multi.h:135
multi_instance::context
struct context context
The context structure storing state for this VPN tunnel.
Definition: multi.h:144
multi_reap_process_dowork
void multi_reap_process_dowork(const struct multi_context *m)
Definition: multi.c:227
multi_get_timeout
static void multi_get_timeout(struct multi_context *m, struct timeval *dest)
Definition: multi.h:616
multi_instance::n_clients_delta
int n_clients_delta
Definition: multi.h:142
multi_top_free
void multi_top_free(struct multi_context *m)
Definition: multi.c:3896
multi_instance::refcount
int refcount
Definition: multi.h:115
multi_process_outgoing_link_pre
static struct multi_instance * multi_process_outgoing_link_pre(struct multi_context *m)
Definition: multi.h:432
gc
struct gc_arena gc
Definition: test_ssl.c:155
multi_reap_process
static void multi_reap_process(const struct multi_context *m)
Definition: multi.h:589