Skip to content

Commit

Permalink
io_work: pass event_arg object to event handler in case of socket event
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Gianmarco De Gregori <[email protected]>
Message-Id: <[email protected]>
URL: https://www.mail-archive.com/[email protected]/msg29625.html
Signed-off-by: Gert Doering <[email protected]>
  • Loading branch information
ordex authored and cron2 committed Oct 23, 2024
1 parent 04c34f8 commit 5861274
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 4 deletions.
6 changes: 6 additions & 0 deletions src/openvpn/event.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
25 changes: 23 additions & 2 deletions src/openvpn/forward.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
10 changes: 8 additions & 2 deletions src/openvpn/mtcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 *
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 5861274

Please sign in to comment.