diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2023-08-11 15:12:28 +1000 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2023-08-13 17:30:17 +0200 |
commit | eda4f1997e57d5c8b8cd668065634fd87495e908 (patch) | |
tree | 0590ea66ec13dfa93cceb27bf9536b7b1680446d /tap.c | |
parent | 485b5fb8f97c203a9842639fc708f32458be0c18 (diff) | |
download | passt-eda4f1997e57d5c8b8cd668065634fd87495e908.tar passt-eda4f1997e57d5c8b8cd668065634fd87495e908.tar.gz passt-eda4f1997e57d5c8b8cd668065634fd87495e908.tar.bz2 passt-eda4f1997e57d5c8b8cd668065634fd87495e908.tar.lz passt-eda4f1997e57d5c8b8cd668065634fd87495e908.tar.xz passt-eda4f1997e57d5c8b8cd668065634fd87495e908.tar.zst passt-eda4f1997e57d5c8b8cd668065634fd87495e908.zip |
epoll: Split listening Unix domain socket into its own type
tap_handler() actually handles events on three different types of object:
the /dev/tap character device (pasta), a connected Unix domain socket
(passt) or a listening Unix domain socket (passt).
The last, in particular, really has no handling in common with the others,
so split it into its own epoll type and directly dispatch to the relevant
handler from the top level.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'tap.c')
-rw-r--r-- | tap.c | 15 |
1 files changed, 4 insertions, 11 deletions
@@ -1071,7 +1071,7 @@ restart: static void tap_sock_unix_init(struct ctx *c) { int fd = socket(AF_UNIX, SOCK_STREAM, 0); - union epoll_ref ref = { .type = EPOLL_TYPE_TAP }; + union epoll_ref ref = { .type = EPOLL_TYPE_TAP_LISTEN }; struct epoll_event ev = { 0 }; struct sockaddr_un addr = { .sun_family = AF_UNIX, @@ -1137,11 +1137,11 @@ static void tap_sock_unix_init(struct ctx *c) } /** - * tap_sock_unix_new() - Handle new connection on listening socket + * tap_listen_handler() - Handle new connection on listening socket * @c: Execution context * @events: epoll events */ -static void tap_sock_unix_new(struct ctx *c, uint32_t events) +void tap_listen_handler(struct ctx *c, uint32_t events) { union epoll_ref ref = { .type = EPOLL_TYPE_TAP }; struct epoll_event ev = { 0 }; @@ -1285,18 +1285,11 @@ void tap_sock_init(struct ctx *c) /** * tap_handler() - Packet handler for AF_UNIX or tuntap file descriptor * @c: Execution context - * @fd: File descriptor where event occurred * @events: epoll events * @now: Current timestamp, can be NULL on EPOLLERR */ -void tap_handler(struct ctx *c, int fd, uint32_t events, - const struct timespec *now) +void tap_handler(struct ctx *c, uint32_t events, const struct timespec *now) { - if (fd == c->fd_tap_listen) { - tap_sock_unix_new(c, events); - return; - } - if (c->mode == MODE_PASST) tap_handler_passt(c, events, now); else if (c->mode == MODE_PASTA) |