mirror of
https://github.com/OpenVPN/openvpn.git
synced 2024-11-27 03:33:55 +08:00
io_work: pass event_arg object to event handler in case of socket event
In order to allow the code to work with multiple listening sockets it is essential to allow the generic multi_io event handler to distinguish between the various socket objects. This can be achieved by passing an event_arg object that contains a pointer to the link_socket. This code path is used on clients as well as UDP servers. Change-Id: I7ebf0d4fb2a23278e16003b2e35598178155d658 Signed-off-by: Antonio Quartulli <a@unstable.cc> Signed-off-by: Gianmarco De Gregori <gianmarco@mandelbit.com> Message-Id: <20241023142030.731-1-gert@greenie.muc.de> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg29625.html Signed-off-by: Gert Doering <gert@greenie.muc.de>
This commit is contained in:
parent
04c34f81be
commit
5861274168
@ -82,6 +82,12 @@
|
||||
#define EVENT_METHOD_US_TIMEOUT (1<<0)
|
||||
#define EVENT_METHOD_FAST (1<<1)
|
||||
|
||||
/*
|
||||
* The following constant is used as boundary between integer value
|
||||
* and real addresses when passing arguments to event handlers as (void *)
|
||||
*/
|
||||
#define MULTI_N ((void *)16) /* upper bound on MTCP_x */
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
typedef const struct rw_handle *event_t;
|
||||
|
@ -2183,7 +2183,8 @@ io_wait_dowork(struct context *c, const unsigned int flags)
|
||||
/*
|
||||
* Configure event wait based on socket, tuntap flags.
|
||||
*/
|
||||
socket_set(c->c2.link_socket, c->c2.event_set, socket, (void *)socket_shift, NULL);
|
||||
socket_set(c->c2.link_socket, c->c2.event_set, socket,
|
||||
&c->c2.link_socket->ev_arg, NULL);
|
||||
tun_set(c->c1.tuntap, c->c2.event_set, tuntap, (void *)tun_shift, NULL);
|
||||
#if defined(TARGET_LINUX) || defined(TARGET_FREEBSD)
|
||||
if (socket & EVENT_READ && c->c2.did_open_tun)
|
||||
@ -2246,7 +2247,27 @@ io_wait_dowork(struct context *c, const unsigned int flags)
|
||||
for (i = 0; i < status; ++i)
|
||||
{
|
||||
const struct event_set_return *e = &esr[i];
|
||||
c->c2.event_set_status |= ((e->rwflags & 3) << (uintptr_t)e->arg);
|
||||
uintptr_t shift;
|
||||
|
||||
if (e->arg >= MULTI_N)
|
||||
{
|
||||
struct event_arg *ev_arg = (struct event_arg *)e->arg;
|
||||
if (ev_arg->type != EVENT_ARG_LINK_SOCKET)
|
||||
{
|
||||
c->c2.event_set_status = ES_ERROR;
|
||||
msg(D_LINK_ERRORS,
|
||||
"io_work: non socket event delivered");
|
||||
return;
|
||||
}
|
||||
|
||||
shift = socket_shift;
|
||||
}
|
||||
else
|
||||
{
|
||||
shift = (uintptr_t)e->arg;
|
||||
}
|
||||
|
||||
c->c2.event_set_status |= ((e->rwflags & 3) << shift);
|
||||
}
|
||||
}
|
||||
else if (status == 0)
|
||||
|
@ -60,7 +60,13 @@
|
||||
#define MTCP_FILE_CLOSE_WRITE ((void *)5)
|
||||
#define MTCP_DCO ((void *)6)
|
||||
|
||||
#define MTCP_N ((void *)16) /* upper bound on MTCP_x */
|
||||
struct ta_iow_flags
|
||||
{
|
||||
unsigned int flags;
|
||||
unsigned int ret;
|
||||
unsigned int tun;
|
||||
unsigned int sock;
|
||||
};
|
||||
|
||||
#ifdef ENABLE_DEBUG
|
||||
static const char *
|
||||
@ -686,7 +692,7 @@ multi_tcp_process_io(struct multi_context *m)
|
||||
struct event_set_return *e = &mtcp->esr[i];
|
||||
|
||||
/* incoming data for instance or listening socket? */
|
||||
if (e->arg >= MTCP_N)
|
||||
if (e->arg >= MULTI_N)
|
||||
{
|
||||
struct event_arg *ev_arg = (struct event_arg *)e->arg;
|
||||
switch (ev_arg->type)
|
||||
|
Loading…
Reference in New Issue
Block a user