aboutgitcodebugslistschat
path: root/tap.c
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2023-08-11 15:12:29 +1000
committerStefano Brivio <sbrivio@redhat.com>2023-08-13 17:30:20 +0200
commitae5f6c8e1b95580ca3c2f245e02efb28ad11e2aa (patch)
treea789bf944b16d49e4fc0bfba252fa63b078b0e0d /tap.c
parenteda4f1997e57d5c8b8cd668065634fd87495e908 (diff)
downloadpasst-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.c39
1 files changed, 15 insertions, 24 deletions
diff --git a/tap.c b/tap.c
index 07a650b..a6f8692 100644
--- a/tap.c
+++ b/tap.c
@@ -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);
-}