epoll: Fold sock_handler into general switch on epoll event fd

When we process events from epoll_wait(), we check for a number of special
cases before calling sock_handler() which then dispatches based on the
protocol type of the socket in the event.

Fold these cases together into a single switch on the fd type recorded in
the epoll data field.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
David Gibson 2023-08-11 15:12:23 +10:00 committed by Stefano Brivio
parent 6a6735ece4
commit d850caab66

54
passt.c
View file

@ -64,29 +64,6 @@ char *epoll_type_str[EPOLL_TYPE_MAX + 1] = {
[EPOLL_TYPE_TAP] = "tap device",
};
/**
* sock_handler() - Event handler for L4 sockets
* @c: Execution context
* @ref: epoll reference
* @events: epoll events
* @now: Current timestamp
*/
static void sock_handler(struct ctx *c, union epoll_ref ref,
uint32_t events, const struct timespec *now)
{
trace("%s: packet from %s %i (events: 0x%08x)",
c->mode == MODE_PASST ? "passt" : "pasta",
EPOLL_TYPE_STR(ref.type), ref.fd, events);
if (!c->no_tcp && ref.type == EPOLL_TYPE_TCP)
tcp_sock_handler(c, ref, events, now);
else if (!c->no_udp && ref.type == EPOLL_TYPE_UDP)
udp_sock_handler(c, ref, events, now);
else if (!c->no_icmp &&
(ref.type == EPOLL_TYPE_ICMP || ref.type == EPOLL_TYPE_ICMPV6))
icmp_sock_handler(c, ref, events, now);
}
/**
* post_handler() - Run periodic and deferred tasks for L4 protocol handlers
* @c: Execution context
@ -330,13 +307,36 @@ loop:
for (i = 0; i < nfds; i++) {
union epoll_ref ref = *((union epoll_ref *)&events[i].data.u64);
uint32_t eventmask = events[i].events;
if (ref.type == EPOLL_TYPE_TAP)
trace("%s: epoll event on %s %i (events: 0x%08x)",
c.mode == MODE_PASST ? "passt" : "pasta",
EPOLL_TYPE_STR(ref.type), ref.fd, eventmask);
switch (ref.type) {
case EPOLL_TYPE_TAP:
tap_handler(&c, ref.fd, events[i].events, &now);
else if (ref.type == EPOLL_TYPE_NSQUIT)
break;
case EPOLL_TYPE_NSQUIT:
pasta_netns_quit_handler(&c, quit_fd);
else
sock_handler(&c, ref, events[i].events, &now);
break;
case EPOLL_TYPE_TCP:
if (!c.no_tcp)
tcp_sock_handler(&c, ref, eventmask, &now);
break;
case EPOLL_TYPE_UDP:
if (!c.no_udp)
udp_sock_handler(&c, ref, eventmask, &now);
break;
case EPOLL_TYPE_ICMP:
case EPOLL_TYPE_ICMPV6:
if (!c.no_icmp)
icmp_sock_handler(&c, ref, eventmask, &now);
break;
default:
/* Can't happen */
ASSERT(0);
}
}
post_handler(&c, &now);