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 066945A027C for ; Fri, 11 Aug 2023 07:12:41 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=201602; t=1691730753; bh=eJ8udvn6QYEw6EOqdScIpCQ9l7zO9n1OrLCjstP/vog=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lV9ilWDbFf54QyuNi3p3LdQ1iyPUzMJmMNWFqVCJ1aYKZAR3iXnWlGCkJRvTfYlSk 0iS0ggDm14AFEIp57DZ40eLd7ph/YhSmBpkJe2fwtqHI9b5AxwiggQ3avLc0NBSM+u WSaTwOBhOp04+UgjhcxW+NVdj+sbLl7hoOBw8UJ4= Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4RMX3j2m01z4wyD; Fri, 11 Aug 2023 15:12:33 +1000 (AEST) From: David Gibson To: passt-dev@passt.top, Stefano Brivio Subject: [PATCH v3 13/13] epoll: Use different epoll types for passt and pasta tap fds Date: Fri, 11 Aug 2023 15:12:29 +1000 Message-ID: <20230811051229.343838-14-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: VYNCZHYR2R6HU3JYBCLGRBB63NWMFPVA X-Message-ID-Hash: VYNCZHYR2R6HU3JYBCLGRBB63NWMFPVA 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: 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 --- passt.c | 10 +++++++--- passt.h | 6 ++++-- tap.c | 39 +++++++++++++++------------------------ tap.h | 5 ++++- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/passt.c b/passt.c index 970426d..ca0acc6 100644 --- a/passt.c +++ b/passt.c @@ -63,7 +63,8 @@ char *epoll_type_str[EPOLL_TYPE_MAX + 1] = { [EPOLL_TYPE_ICMP] = "ICMP socket", [EPOLL_TYPE_ICMPV6] = "ICMPv6 socket", [EPOLL_TYPE_NSQUIT] = "namespace inotify", - [EPOLL_TYPE_TAP] = "tap device", + [EPOLL_TYPE_TAP_PASTA] = "/dev/net/tun device", + [EPOLL_TYPE_TAP_PASST] = "connected qemu socket", [EPOLL_TYPE_TAP_LISTEN] = "listening qemu socket", }; @@ -317,8 +318,11 @@ loop: EPOLL_TYPE_STR(ref.type), ref.fd, eventmask); switch (ref.type) { - case EPOLL_TYPE_TAP: - tap_handler(&c, events[i].events, &now); + case EPOLL_TYPE_TAP_PASTA: + tap_handler_pasta(&c, eventmask, &now); + break; + case EPOLL_TYPE_TAP_PASST: + tap_handler_passt(&c, eventmask, &now); break; case EPOLL_TYPE_TAP_LISTEN: tap_listen_handler(&c, eventmask); diff --git a/passt.h b/passt.h index dbadec2..0500ff0 100644 --- a/passt.h +++ b/passt.h @@ -61,8 +61,10 @@ enum epoll_type { EPOLL_TYPE_ICMPV6, /* inotify fd watching for end of netns (pasta) */ EPOLL_TYPE_NSQUIT, - /* tap char device, or connected qemu socket fd */ - EPOLL_TYPE_TAP, + /* tuntap character device */ + EPOLL_TYPE_TAP_PASTA, + /* socket connected to qemu */ + EPOLL_TYPE_TAP_PASST, /* socket listening for qemu socket connections */ EPOLL_TYPE_TAP_LISTEN, diff --git a/tap.c b/tap.c index de6ecf3..c5ec006 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); -} diff --git a/tap.h b/tap.h index dd6bfdd..021fb7c 100644 --- a/tap.h +++ b/tap.h @@ -77,7 +77,10 @@ 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_listen_handler(struct ctx *c, uint32_t events); -void tap_handler(struct ctx *c, uint32_t events, const struct timespec *now); +void tap_handler_pasta(struct ctx *c, uint32_t events, + const struct timespec *now); +void tap_handler_passt(struct ctx *c, uint32_t events, + const struct timespec *now); void tap_sock_init(struct ctx *c); #endif /* TAP_H */ -- 2.41.0