From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from gandalf.ozlabs.org (gandalf.ozlabs.org [150.107.74.76]) by passt.top (Postfix) with ESMTPS id 7B6C75A0271 for ; Fri, 11 Aug 2023 07:12:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=201602; t=1691730753; bh=q3nor6BHrzisgUVlOuZzisAjW/m5supNiQfvRfk25tY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hcSoWDJ02c8dcDUXInqGJLC2IPv5sdhMM851dxaei7fGQ3VQXuiogxRkWoGRUdzNZ ugSWNlkUjetvsInn42Cl/0S+j9Lu4gsihRWnowdtgSQAEmSE7LN1+W9gIJP4F6y5kL NIS7c/yIvJ9w9QrcvH6utZMYJ+9kHksAxxd81XDU= Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4RMX3j2ff3z4wyT; Fri, 11 Aug 2023 15:12:33 +1000 (AEST) From: David Gibson To: passt-dev@passt.top, Stefano Brivio Subject: [PATCH v3 12/13] epoll: Split listening Unix domain socket into its own type Date: Fri, 11 Aug 2023 15:12:28 +1000 Message-ID: <20230811051229.343838-13-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230811051229.343838-1-david@gibson.dropbear.id.au> References: <20230811051229.343838-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: M6BK7I6CKT5UD7WCAMUSDBFHOIEIV765 X-Message-ID-Hash: M6BK7I6CKT5UD7WCAMUSDBFHOIEIV765 X-MailFrom: dgibson@gandalf.ozlabs.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: David Gibson X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: 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 --- passt.c | 6 +++++- passt.h | 6 ++++-- tap.c | 15 ++++----------- tap.h | 4 ++-- 4 files changed, 15 insertions(+), 16 deletions(-) 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 4817d21..de6ecf3 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 */ -- 2.41.0