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 DCO_SHIFT 10
72#define DCO_READ (1 << (DCO_SHIFT + READ_SHIFT))
73#define DCO_WRITE (1 << (DCO_SHIFT + WRITE_SHIFT))
74
75/*
76 * Initialization flags passed to event_set_init
77 */
78#define EVENT_METHOD_US_TIMEOUT (1 << 0)
79#define EVENT_METHOD_FAST (1 << 1)
80
81/*
82 * The following constant is used as boundary between integer value
83 * and real addresses when passing arguments to event handlers as (void *)
84 */
85#define MULTI_N ((void *)16) /* upper bound on MTCP_x */
86
87#ifdef _WIN32
88
89typedef const struct rw_handle *event_t;
90
91#define UNDEFINED_EVENT (NULL)
92
93#else /* ifdef _WIN32 */
94
95typedef int event_t;
96
97#define UNDEFINED_EVENT (-1)
98
99#endif
100
101struct event_set;
102struct event_set_return;
103
105{
106 void (*free)(struct event_set *es);
107 void (*reset)(struct event_set *es);
108 void (*del)(struct event_set *es, event_t event);
109 void (*ctl)(struct event_set *es, event_t event, unsigned int rwflags, void *arg);
110
111 /*
112 * Return status for wait:
113 * -1 on signal or error
114 * 0 on timeout
115 * length of event_set_return if at least 1 event is returned
116 */
117 int (*wait)(struct event_set *es, const struct timeval *tv, struct event_set_return *out,
118 int outlen);
119};
120
122{
123 unsigned int rwflags;
124 void *arg;
125};
126
128{
130};
131
137
138/* generic event argument object to pass to event_ctl() */
140{
142 union
143 {
144 struct multi_instance *mi; /* if type = EVENT_ARG_MULTI_INSTANCE */
145 struct link_socket *sock; /* if type = EVENT_ARG_LINK_SOCKET */
146 } u;
147};
148
149/*
150 * maxevents on input: desired max number of event_t descriptors
151 * simultaneously set with event_ctl
152 * maxevents on output: may be modified down, depending on limitations
153 * of underlying API
154 * flags: EVENT_METHOD_x flags
155 */
156struct event_set *event_set_init(int *maxevents, unsigned int flags);
157
158static inline void
160{
161 if (es)
162 {
163 (*es->func.free)(es);
164 }
165}
166
167static inline void
169{
170 (*es->func.reset)(es);
171}
172
173static inline void
175{
176 (*es->func.del)(es, event);
177}
178
179static inline void
180event_ctl(struct event_set *es, event_t event, unsigned int rwflags, void *arg)
181{
182 (*es->func.ctl)(es, event, rwflags, arg);
183}
184
185static inline int
186event_wait(struct event_set *es, const struct timeval *tv, struct event_set_return *out, int outlen)
187{
188 int ret;
189 ret = (*es->func.wait)(es, tv, out, outlen);
190 return ret;
191}
192
193static inline void
195{
196 esr->rwflags = 0;
197 esr->arg = NULL;
198}
199
200#ifdef _WIN32
201
202static inline void
203wait_signal(struct event_set *es, void *arg)
204{
206 {
208 }
209}
210
211#else /* ifdef _WIN32 */
212
213static inline void
214wait_signal(struct event_set *es, void *arg)
215{
216}
217
218#endif
219
220#endif /* ifndef EVENT_H */
static void event_free(struct event_set *es)
Definition event.h:159
static void event_del(struct event_set *es, event_t event)
Definition event.h:174
static int event_wait(struct event_set *es, const struct timeval *tv, struct event_set_return *out, int outlen)
Definition event.h:186
const struct rw_handle * event_t
Definition event.h:89
static void event_set_return_init(struct event_set_return *esr)
Definition event.h:194
#define EVENT_READ
Definition event.h:37
struct event_set * event_set_init(int *maxevents, unsigned int flags)
Definition event.c:1187
static void event_reset(struct event_set *es)
Definition event.h:168
static void wait_signal(struct event_set *es, void *arg)
Definition event.h:203
event_arg_t
Definition event.h:133
@ EVENT_ARG_LINK_SOCKET
Definition event.h:135
@ EVENT_ARG_MULTI_INSTANCE
Definition event.h:134
static void event_ctl(struct event_set *es, event_t event, unsigned int rwflags, void *arg)
Definition event.h:180
struct link_socket * sock
Definition event.h:145
struct multi_instance * mi
Definition event.h:144
union event_arg::@1 u
event_arg_t type
Definition event.h:141
void(* ctl)(struct event_set *es, event_t event, unsigned int rwflags, void *arg)
Definition event.h:109
int(* wait)(struct event_set *es, const struct timeval *tv, struct event_set_return *out, int outlen)
Definition event.h:117
void(* del)(struct event_set *es, event_t event)
Definition event.h:108
void(* reset)(struct event_set *es)
Definition event.h:107
void(* free)(struct event_set *es)
Definition event.h:106
unsigned int rwflags
Definition event.h:123
struct event_set_functions func
Definition event.h:129
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