/*
* Special tags passed to event.[ch] functions
*/
-#define MTCP_SOCKET ((void *)1)
#define MTCP_TUN ((void *)2)
#define MTCP_SIG ((void *)3) /* Only on Windows */
#define MTCP_MANAGEMENT ((void *)4)
socket_set(mi->context.c2.link_socket,
m->mtcp->es,
mbuf_defined(mi->tcp_link_out_deferred) ? EVENT_WRITE : EVENT_READ,
- mi,
+ &mi->ev_arg,
&mi->tcp_rwflags);
}
}
struct multi_tcp *mtcp)
{
int status;
- unsigned int *persistent = &mtcp->tun_rwflags;
- socket_set_listen_persistent(c->c2.link_socket, mtcp->es, MTCP_SOCKET);
+ socket_set_listen_persistent(c->c2.link_socket, mtcp->es,
+ &c->c2.link_socket->ev_arg);
#ifdef _WIN32
if (tuntap_is_wintun(c->c1.tuntap))
persistent = NULL;
}
#endif
- tun_set(c->c1.tuntap, mtcp->es, EVENT_READ, MTCP_TUN, persistent);
+ tun_set(c->c1.tuntap, mtcp->es, EVENT_READ, MTCP_TUN, &mtcp->tun_rwflags);
#if defined(TARGET_LINUX) || defined(TARGET_FREEBSD)
dco_event_set(&c->c1.tuntap->dco, mtcp->es, MTCP_DCO);
#endif
{
struct event_set_return *e = &mtcp->esr[i];
- /* incoming data for instance? */
+ /* incoming data for instance or listening socket? */
if (e->arg >= MTCP_N)
{
- struct multi_instance *mi = (struct multi_instance *) e->arg;
- if (mi)
+ struct event_arg *ev_arg = (struct event_arg *)e->arg;
+ switch (ev_arg->type)
{
- if (e->rwflags & EVENT_WRITE)
- {
- multi_tcp_action(m, mi, TA_SOCKET_WRITE_READY, false);
- }
- else if (e->rwflags & EVENT_READ)
- {
- multi_tcp_action(m, mi, TA_SOCKET_READ, false);
- }
+ struct multi_instance *mi;
+
+ /* react to event on child instance */
+ case EVENT_ARG_MULTI_INSTANCE:
+ if (!ev_arg->u.mi)
+ {
+ msg(D_MULTI_ERRORS, "MULTI: mtcp_proc_io: null minstance");
+ break;
+ }
+
+ mi = ev_arg->u.mi;
+ if (e->rwflags & EVENT_WRITE)
+ {
+ multi_tcp_action(m, mi, TA_SOCKET_WRITE_READY, false);
+ }
+ else if (e->rwflags & EVENT_READ)
+ {
+ multi_tcp_action(m, mi, TA_SOCKET_READ, false);
+ }
+ break;
+
+ /* new incoming TCP client attempting to connect? */
+ case EVENT_ARG_LINK_SOCKET:
+ ASSERT(m->top.c2.link_socket);
+ socket_reset_listen_persistent(m->top.c2.link_socket);
+ mi = multi_create_instance_tcp(m);
+ if (mi)
+ {
+ multi_tcp_action(m, mi, TA_INITIAL, false);
+ }
+ break;
}
}
else
multi_tcp_action(m, NULL, TA_TUN_READ, false);
}
}
- /* new incoming TCP client attempting to connect? */
- else if (e->arg == MTCP_SOCKET)
- {
- struct multi_instance *mi;
- ASSERT(m->top.c2.link_socket);
- socket_reset_listen_persistent(m->top.c2.link_socket);
- mi = multi_create_instance_tcp(m);
- if (mi)
- {
- multi_tcp_action(m, mi, TA_INITIAL, false);
- }
- }
#if defined(ENABLE_DCO) && (defined(TARGET_LINUX) || defined(TARGET_FREEBSD))
/* incoming data on DCO? */
else if (e->arg == MTCP_DCO)