public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: passt-dev@passt.top, Stefano Brivio <sbrivio@redhat.com>
Cc: David Gibson <david@gibson.dropbear.id.au>
Subject: [PATCH v2 12/13] epoll: Split listening Unix domain socket into its own type
Date: Thu, 10 Aug 2023 12:33:14 +1000	[thread overview]
Message-ID: <20230810023315.684784-13-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20230810023315.684784-1-david@gibson.dropbear.id.au>

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 <david@gibson.dropbear.id.au>
---
 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 2a207b4..a4e6341 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 6c3ce48..ceedaaa 100644
--- a/tap.c
+++ b/tap.c
@@ -1076,7 +1076,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,
@@ -1142,11 +1142,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 };
@@ -1290,18 +1290,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 */
-- 
@@ -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


  parent reply	other threads:[~2023-08-10  2:33 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-10  2:33 [PATCH v2 00/13] Clean up to tap errors and epoll dispatch David Gibson
2023-08-10  2:33 ` [PATCH v2 01/13] tap: Clean up tap reset path David Gibson
2023-08-10  2:33 ` [PATCH v2 02/13] tap: Clean up behaviour for errors on listening Unix socket David Gibson
2023-08-10  2:33 ` [PATCH v2 03/13] tap: Fold reset handling into tap_handler_pasta() David Gibson
2023-08-10  2:33 ` [PATCH v2 04/13] tap: Fold reset handling into tap_handler_passt() David Gibson
2023-08-10 19:49   ` Stefano Brivio
2023-08-11  3:07     ` David Gibson
2023-08-10  2:33 ` [PATCH v2 05/13] epoll: Generalize epoll_ref to cover things other than sockets David Gibson
2023-08-10  2:33 ` [PATCH v2 06/13] epoll: Always use epoll_ref for the epoll data variable David Gibson
2023-08-10  2:33 ` [PATCH v2 07/13] epoll: Fold sock_handler into general switch on epoll event fd David Gibson
2023-08-10 19:49   ` Stefano Brivio
2023-08-11  3:11     ` David Gibson
2023-08-10  2:33 ` [PATCH v2 08/13] epoll: Split handling of ICMP and ICMPv6 sockets David Gibson
2023-08-10  2:33 ` [PATCH v2 09/13] epoll: Tiny cleanup to udp_sock_handler() David Gibson
2023-08-10  2:33 ` [PATCH v2 10/13] epoll: Split handling of TCP timerfds into its own handler function David Gibson
2023-08-10  2:33 ` [PATCH v2 11/13] epoll: Split handling of listening TCP sockets into their own handler David Gibson
2023-08-10  2:33 ` David Gibson [this message]
2023-08-10  2:33 ` [PATCH v2 13/13] epoll: Use different epoll types for passt and pasta tap fds David Gibson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230810023315.684784-13-david@gibson.dropbear.id.au \
    --to=david@gibson.dropbear.id.au \
    --cc=passt-dev@passt.top \
    --cc=sbrivio@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).