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 13/13] epoll: Use different epoll types for passt and pasta tap fds
Date: Thu, 10 Aug 2023 12:33:15 +1000	[thread overview]
Message-ID: <20230810023315.684784-14-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20230810023315.684784-1-david@gibson.dropbear.id.au>

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>
---
 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 a4e6341..26a1dac 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, events);
 
 		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 ceedaaa..8373bc4 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;
@@ -1001,13 +1001,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;
@@ -1148,7 +1148,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;
@@ -1230,12 +1230,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);
@@ -1268,11 +1268,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);
@@ -1286,17 +1291,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 */
-- 
@@ -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


      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 ` [PATCH v2 12/13] epoll: Split listening Unix domain socket into its own type David Gibson
2023-08-10  2:33 ` David Gibson [this message]

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-14-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).