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