diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2023-08-11 15:12:29 +1000 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2023-08-13 17:30:20 +0200 |
commit | ae5f6c8e1b95580ca3c2f245e02efb28ad11e2aa (patch) | |
tree | a789bf944b16d49e4fc0bfba252fa63b078b0e0d /tap.c | |
parent | eda4f1997e57d5c8b8cd668065634fd87495e908 (diff) | |
download | passt-ae5f6c8e1b95580ca3c2f245e02efb28ad11e2aa.tar passt-ae5f6c8e1b95580ca3c2f245e02efb28ad11e2aa.tar.gz passt-ae5f6c8e1b95580ca3c2f245e02efb28ad11e2aa.tar.bz2 passt-ae5f6c8e1b95580ca3c2f245e02efb28ad11e2aa.tar.lz passt-ae5f6c8e1b95580ca3c2f245e02efb28ad11e2aa.tar.xz passt-ae5f6c8e1b95580ca3c2f245e02efb28ad11e2aa.tar.zst passt-ae5f6c8e1b95580ca3c2f245e02efb28ad11e2aa.zip |
epoll: Use different epoll types for passt and pasta tap fds
Currently we have a single epoll event type for the "tap" fd, which could
be either a handle on a /dev/net/tun device (pasta) or a connected Unix
socket (passt). However for the two modes we call different handler
functions. Simplify this a little by using different epoll types and
dispatching directly to the correct handler function.
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 | 39 |
1 files changed, 15 insertions, 24 deletions
@@ -914,8 +914,8 @@ static void tap_sock_reset(struct ctx *c) * @events: epoll events * @now: Current timestamp */ -static void tap_handler_passt(struct ctx *c, uint32_t events, - const struct timespec *now) +void tap_handler_passt(struct ctx *c, uint32_t events, + const struct timespec *now) { struct ethhdr *eh; ssize_t n, rem; @@ -996,13 +996,13 @@ next: } /** - * tap_handler_pasta() - Packet handler for tuntap file descriptor + * tap_handler_pasta() - Packet handler for /dev/net/tun file descriptor * @c: Execution context * @events: epoll events * @now: Current timestamp */ -static void tap_handler_pasta(struct ctx *c, uint32_t events, - const struct timespec *now) +void tap_handler_pasta(struct ctx *c, uint32_t events, + const struct timespec *now) { ssize_t n, len; int ret; @@ -1143,7 +1143,7 @@ static void tap_sock_unix_init(struct ctx *c) */ void tap_listen_handler(struct ctx *c, uint32_t events) { - union epoll_ref ref = { .type = EPOLL_TYPE_TAP }; + union epoll_ref ref = { .type = EPOLL_TYPE_TAP_PASST }; struct epoll_event ev = { 0 }; int v = INT_MAX / 2; struct ucred ucred; @@ -1225,12 +1225,12 @@ static int tap_ns_tun(void *arg) } /** - * tap_sock_init_tun() - Set up tuntap file descriptor + * tap_sock_tun_init() - Set up /dev/net/tun file descriptor * @c: Execution context */ static void tap_sock_tun_init(struct ctx *c) { - union epoll_ref ref = { .type = EPOLL_TYPE_TAP }; + union epoll_ref ref = { .type = EPOLL_TYPE_TAP_PASTA }; struct epoll_event ev = { 0 }; NS_CALL(tap_ns_tun, c); @@ -1263,11 +1263,16 @@ void tap_sock_init(struct ctx *c) } if (c->fd_tap != -1) { /* Passed as --fd */ - union epoll_ref ref = { .type = EPOLL_TYPE_TAP }; struct epoll_event ev = { 0 }; - ASSERT(c->one_off); + union epoll_ref ref; + ASSERT(c->one_off); ref.fd = c->fd_tap; + if (c->mode == MODE_PASST) + ref.type = EPOLL_TYPE_TAP_PASST; + else + ref.type = EPOLL_TYPE_TAP_PASTA; + ev.events = EPOLLIN | EPOLLET | EPOLLRDHUP; ev.data.u64 = ref.u64; epoll_ctl(c->epollfd, EPOLL_CTL_ADD, c->fd_tap, &ev); @@ -1281,17 +1286,3 @@ void tap_sock_init(struct ctx *c) tap_sock_tun_init(c); } } - -/** - * tap_handler() - Packet handler for AF_UNIX or tuntap file descriptor - * @c: Execution context - * @events: epoll events - * @now: Current timestamp, can be NULL on EPOLLERR - */ -void tap_handler(struct ctx *c, uint32_t events, const struct timespec *now) -{ - if (c->mode == MODE_PASST) - tap_handler_passt(c, events, now); - else if (c->mode == MODE_PASTA) - tap_handler_pasta(c, events, now); -} |