diff --git a/passt.c b/passt.c index 5867d0e..970426d 100644 --- a/passt.c +++ b/passt.c @@ -64,6 +64,7 @@ char *epoll_type_str[EPOLL_TYPE_MAX + 1] = { [EPOLL_TYPE_ICMPV6] = "ICMPv6 socket", [EPOLL_TYPE_NSQUIT] = "namespace inotify", [EPOLL_TYPE_TAP] = "tap device", + [EPOLL_TYPE_TAP_LISTEN] = "listening qemu socket", }; /** @@ -317,7 +318,10 @@ loop: switch (ref.type) { case EPOLL_TYPE_TAP: - tap_handler(&c, ref.fd, events[i].events, &now); + tap_handler(&c, events[i].events, &now); + break; + case EPOLL_TYPE_TAP_LISTEN: + tap_listen_handler(&c, eventmask); break; case EPOLL_TYPE_NSQUIT: pasta_netns_quit_handler(&c, quit_fd); diff --git a/passt.h b/passt.h index a625d48..dbadec2 100644 --- a/passt.h +++ b/passt.h @@ -61,10 +61,12 @@ enum epoll_type { EPOLL_TYPE_ICMPV6, /* inotify fd watching for end of netns (pasta) */ EPOLL_TYPE_NSQUIT, - /* tap char device, or qemu socket fd */ + /* tap char device, or connected qemu socket fd */ EPOLL_TYPE_TAP, + /* socket listening for qemu socket connections */ + EPOLL_TYPE_TAP_LISTEN, - EPOLL_TYPE_MAX = EPOLL_TYPE_TAP, + EPOLL_TYPE_MAX = EPOLL_TYPE_TAP_LISTEN, }; /** diff --git a/tap.c b/tap.c index 32ddae2..07a650b 100644 --- a/tap.c +++ b/tap.c @@ -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) diff --git a/tap.h b/tap.h index a1ad115..dd6bfdd 100644 --- a/tap.h +++ b/tap.h @@ -76,8 +76,8 @@ int tap_send(const struct ctx *c, const void *data, size_t len); void tap_send_frames(struct ctx *c, const struct iovec *iov, size_t n); void tap_update_mac(struct tap_hdr *taph, const unsigned char *eth_d, const unsigned char *eth_s); -void tap_handler(struct ctx *c, int fd, uint32_t events, - const struct timespec *now); +void tap_listen_handler(struct ctx *c, uint32_t events); +void tap_handler(struct ctx *c, uint32_t events, const struct timespec *now); void tap_sock_init(struct ctx *c); #endif /* TAP_H */