OpenVPN
event.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-2025 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#ifndef EVENT_H
24#define EVENT_H
25
26#include "win32.h"
27#include "sig.h"
28#include "perf.h"
29
30/*
31 * rwflags passed to event_ctl and returned by
32 * struct event_set_return.
33 */
34#define READ_SHIFT 0
35#define WRITE_SHIFT 1
36
37#define EVENT_UNDEF 4
38#define EVENT_READ (1 << READ_SHIFT)
39#define EVENT_WRITE (1 << WRITE_SHIFT)
40
41/* event flags returned by io_wait.
42 *
43 * All these events are defined as bits in a bitfield.
44 * Each event 'type' owns two bits in the bitfield: one for the READ
45 * event and one for the WRITE event.
46 *
47 * For this reason, the specific event bit is calculated by adding
48 * the event type identifier (always a multiple of 2, as defined
49 * below) to 0 for READ and 1 for WRITE.
50 *
51 * E.g.
52 * MANAGEMENT_SHIFT = 6; <---- event type identifier
53 * MANAGEMENT_READ = (1 << (6 + 0)), <---- READ event
54 * MANAGEMENT_WRITE = (1 << (6 + 1)) <---- WRITE event
55 *
56 * 'error' and 'file_close' are special and use read/write for different
57 * signals.
58 */
59
60#define SOCKET_SHIFT 0
61#define SOCKET_READ (1 << (SOCKET_SHIFT + READ_SHIFT))
62#define SOCKET_WRITE (1 << (SOCKET_SHIFT + WRITE_SHIFT))
63#define TUN_SHIFT 2
64#define TUN_READ (1 << (TUN_SHIFT + READ_SHIFT))
65#define TUN_WRITE (1 << (TUN_SHIFT + WRITE_SHIFT))
66#define ERR_SHIFT 4
67#define ES_ERROR (1 << (ERR_SHIFT + READ_SHIFT))
68#define ES_TIMEOUT (1 << (ERR_SHIFT + WRITE_SHIFT))
69#define MANAGEMENT_SHIFT 6
70#define MANAGEMENT_READ (1 << (MANAGEMENT_SHIFT + READ_SHIFT))
71#define MANAGEMENT_WRITE (1 << (MANAGEMENT_SHIFT + WRITE_SHIFT))
72#define FILE_SHIFT 8
73#define FILE_CLOSED (1 << (FILE_SHIFT + READ_SHIFT))
74#define DCO_SHIFT 10
75#define DCO_READ (1 << (DCO_SHIFT + READ_SHIFT))
76#define DCO_WRITE (1 << (DCO_SHIFT + WRITE_SHIFT))
77
78/*
79 * Initialization flags passed to event_set_init
80 */
81#define EVENT_METHOD_US_TIMEOUT (1 << 0)
82#define EVENT_METHOD_FAST (1 << 1)
83
84/*
85 * The following constant is used as boundary between integer value
86 * and real addresses when passing arguments to event handlers as (void *)
87 */
88#define MULTI_N ((void *)16) /* upper bound on MTCP_x */
89
90#ifdef _WIN32
91
92typedef const struct rw_handle *event_t;
93
94#define UNDEFINED_EVENT (NULL)
95
96#else /* ifdef _WIN32 */
97
98typedef int event_t;
99
100#define UNDEFINED_EVENT (-1)
101
102#endif
103
104struct event_set;
105struct event_set_return;
106
108{
109 void (*free)(struct event_set *es);
110 void (*reset)(struct event_set *es);
111 void (*del)(struct event_set *es, event_t event);
112 void (*ctl)(struct event_set *es, event_t event, unsigned int rwflags, void *arg);
113
114 /*
115 * Return status for wait:
116 * -1 on signal or error
117 * 0 on timeout
118 * length of event_set_return if at least 1 event is returned
119 */
120 int (*wait)(struct event_set *es, const struct timeval *tv, struct event_set_return *out,
121 int outlen);
122};
123
125{
126 unsigned int rwflags;
127 void *arg;
128};
129
131{
133};
134
140
141/* generic event argument object to pass to event_ctl() */
143{
145 union
146 {
147 struct multi_instance *mi; /* if type = EVENT_ARG_MULTI_INSTANCE */
148 struct link_socket *sock; /* if type = EVENT_ARG_LINK_SOCKET */
149 } u;
150};
151
152/*
153 * maxevents on input: desired max number of event_t descriptors
154 * simultaneously set with event_ctl
155 * maxevents on output: may be modified down, depending on limitations
156 * of underlying API
157 * flags: EVENT_METHOD_x flags
158 */
159struct event_set *event_set_init(int *maxevents, unsigned int flags);
160
161static inline void
163{
164 if (es)
165 {
166 (*es->func.free)(es);
167 }
168}
169
170static inline void
172{
173 (*es->func.reset)(es);
174}
175
176static inline void
178{
179 (*es->func.del)(es, event);
180}
181
182static inline void
183event_ctl(struct event_set *es, event_t event, unsigned int rwflags, void *arg)
184{
185 (*es->func.ctl)(es, event, rwflags, arg);
186}
187
188static inline int
189event_wait(struct event_set *es, const struct timeval *tv, struct event_set_return *out, int outlen)
190{
191 int ret;
193 ret = (*es->func.wait)(es, tv, out, outlen);
194 perf_pop();
195 return ret;
196}
197
198static inline void
200{
201 esr->rwflags = 0;
202 esr->arg = NULL;
203}
204
205#ifdef _WIN32
206
207static inline void
208wait_signal(struct event_set *es, void *arg)
209{
211 {
213 }
214}
215
216#else /* ifdef _WIN32 */
217
218static inline void
219wait_signal(struct event_set *es, void *arg)
220{
221}
222
223#endif
224
225#endif /* ifndef EVENT_H */
static void event_free(struct event_set *es)
Definition event.h:162
static void event_del(struct event_set *es, event_t event)
Definition event.h:177
static int event_wait(struct event_set *es, const struct timeval *tv, struct event_set_return *out, int outlen)
Definition event.h:189
const struct rw_handle * event_t
Definition event.h:92
static void event_set_return_init(struct event_set_return *esr)
Definition event.h:199
#define EVENT_READ
Definition event.h:38
struct event_set * event_set_init(int *maxevents, unsigned int flags)
Definition event.c:1167
static void event_reset(struct event_set *es)
Definition event.h:171
static void wait_signal(struct event_set *es, void *arg)
Definition event.h:208
event_arg_t
Definition event.h:136
@ EVENT_ARG_LINK_SOCKET
Definition event.h:138
@ EVENT_ARG_MULTI_INSTANCE
Definition event.h:137
static void event_ctl(struct event_set *es, event_t event, unsigned int rwflags, void *arg)
Definition event.h:183
static void perf_push(int type)
Definition perf.h:77
static void perf_pop(void)
Definition perf.h:81
#define PERF_IO_WAIT
Definition perf.h:42
struct link_socket * sock
Definition event.h:148
struct multi_instance * mi
Definition event.h:147
union event_arg::@1 u
event_arg_t type
Definition event.h:144
void(* ctl)(struct event_set *es, event_t event, unsigned int rwflags, void *arg)
Definition event.h:112
int(* wait)(struct event_set *es, const struct timeval *tv, struct event_set_return *out, int outlen)
Definition event.h:120
void(* del)(struct event_set *es, event_t event)
Definition event.h:111
void(* reset)(struct event_set *es)
Definition event.h:110
void(* free)(struct event_set *es)
Definition event.h:109
unsigned int rwflags
Definition event.h:126
struct event_set_functions func
Definition event.h:132
Server-mode state structure for one single VPN tunnel.
Definition multi.h:103
HANDLE read
Definition win32.h:81
struct rw_handle in
Definition win32.h:161
struct env_set * es
#define HANDLE_DEFINED(h)
Definition win32.h:68