public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: Stefano Brivio <sbrivio@redhat.com>, passt-dev@passt.top
Cc: David Gibson <david@gibson.dropbear.id.au>
Subject: [PATCH 3/4] fwd, pif: Remove duplicated logic between tcp_listen() and udp_listen()
Date: Tue,  9 Jun 2026 16:30:04 +1000	[thread overview]
Message-ID: <20260609063005.113744-4-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20260609063005.113744-1-david@gibson.dropbear.id.au>

tcp_listen() and udp_listen() have only some simple logic around a call to
pif_listen(), and it's basically identical in each case.  If we move the
common logic into pif_listen() we can then remove {tcp,udp}_listen()
entirely, with their caller in fwd_sync_one() calling pif_listen()
directly.

We also move the logic converting from a protocol id to an epoll type from
fwd_sync_one() into pif_listen().  It's a bit arbitrary, but seems slightly
nicer that way.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 fwd.c |  8 +-------
 pif.c | 31 ++++++++++++++++++++++++++-----
 pif.h |  2 +-
 tcp.c | 38 --------------------------------------
 tcp.h |  2 --
 udp.c | 38 --------------------------------------
 udp.h |  2 --
 7 files changed, 28 insertions(+), 93 deletions(-)

diff --git a/fwd.c b/fwd.c
index c0a6adac..042158cf 100644
--- a/fwd.c
+++ b/fwd.c
@@ -389,13 +389,7 @@ static int fwd_sync_one(const struct ctx *c, uint8_t pif, unsigned idx,
 			continue;
 		}
 
-		if (rule->proto == IPPROTO_TCP)
-			fd = tcp_listen(c, pif, idx, addr, ifname, port);
-		else if (rule->proto == IPPROTO_UDP)
-			fd = udp_listen(c, pif, idx, addr, ifname, port);
-		else
-			assert(0);
-
+		fd = pif_listen(c, rule->proto, pif, addr, ifname, port, idx);
 		if (fd < 0) {
 			char astr[INANY_ADDRSTRLEN];
 
diff --git a/pif.c b/pif.c
index d5e31613..ede2f903 100644
--- a/pif.c
+++ b/pif.c
@@ -64,7 +64,7 @@ void pif_sockaddr(const struct ctx *c, union sockaddr_inany *sa,
 
 /** pif_listen() - Open a listening socket on a specified pif
  * @c:		Execution context
- * @type:	Socket epoll type
+ * @proto:	Socket protocol (IPPROTO_TCP or IPPROTO_UDP)
  * @pif:	Interface for this socket
  * @addr:	Address to bind to, or NULL for dual-stack any
  * @ifname:	Interface for binding, NULL for any
@@ -76,7 +76,7 @@ void pif_sockaddr(const struct ctx *c, union sockaddr_inany *sa,
  *
  * Return: newly created socket, negative error code on failure
  */
-int pif_listen(const struct ctx *c, enum epoll_type type, uint8_t pif,
+int pif_listen(const struct ctx *c, uint8_t proto, uint8_t pif,
 	       const union inany_addr *addr, const char *ifname,
 	       in_port_t port, unsigned rule)
 {
@@ -85,19 +85,40 @@ int pif_listen(const struct ctx *c, enum epoll_type type, uint8_t pif,
 
 	assert(pif_is_socket(pif));
 
+	if (!c->ifi4) {
+		if (!addr)
+			/* Restrict to v6 only */
+			addr = &inany_any6;
+		else if (inany_v4(addr))
+			return -EAFNOSUPPORT;
+	}
+	if (!c->ifi6) {
+		if (!addr)
+			/* Restrict to v4 only */
+			addr = &inany_any4;
+		else if (!inany_v4(addr))
+			return -EAFNOSUPPORT;
+	}
+
+	if (proto == IPPROTO_TCP)
+		ref.type = EPOLL_TYPE_TCP_LISTEN;
+	else if (proto == IPPROTO_UDP)
+		ref.type = EPOLL_TYPE_UDP_LISTEN;
+	else
+		return -EPROTONOSUPPORT;
+
 	if (!addr) {
-		ref.fd = sock_l4_dualstack_any(c, type, port, ifname);
+		ref.fd = sock_l4_dualstack_any(c, ref.type, port, ifname);
 	} else {
 		union sockaddr_inany sa;
 
 		pif_sockaddr(c, &sa, pif, addr, port);
-		ref.fd = sock_l4(c, type, &sa, ifname);
+		ref.fd = sock_l4(c, ref.type, &sa, ifname);
 	}
 
 	if (ref.fd < 0)
 		return ref.fd;
 
-	ref.type = type;
 	ref.listen.port = port;
 	ref.listen.pif = pif;
 	ref.listen.rule = rule;
diff --git a/pif.h b/pif.h
index 62223d12..3a1e2e57 100644
--- a/pif.h
+++ b/pif.h
@@ -66,7 +66,7 @@ static inline bool pif_is_socket(uint8_t pif)
 
 void pif_sockaddr(const struct ctx *c, union sockaddr_inany *sa,
 		  uint8_t pif, const union inany_addr *addr, in_port_t port);
-int pif_listen(const struct ctx *c, enum epoll_type type, uint8_t pif,
+int pif_listen(const struct ctx *c, uint8_t proto, uint8_t pif,
 	       const union inany_addr *addr, const char *ifname,
 	       in_port_t port, unsigned rule);
 
diff --git a/tcp.c b/tcp.c
index c4000754..36add423 100644
--- a/tcp.c
+++ b/tcp.c
@@ -2739,44 +2739,6 @@ void tcp_sock_handler(const struct ctx *c, union epoll_ref ref,
 	}
 }
 
-/**
- * tcp_listen() - Create listening socket
- * @c:		Execution context
- * @pif:	Interface to open the socket for (PIF_HOST or PIF_SPLICE)
- * @rule:	Index of relevant forwarding rule
- * @addr:	Pointer to address for binding, NULL for any
- * @ifname:	Name of interface to bind to, NULL for any
- * @port:	Port, host order
- *
- * Return: socket fd on success, negative error code on failure
- */
-int tcp_listen(const struct ctx *c, uint8_t pif, unsigned rule,
-	       const union inany_addr *addr, const char *ifname, in_port_t port)
-{
-	int s;
-
-	assert(!c->no_tcp);
-
-	if (!c->ifi4) {
-		if (!addr)
-			/* Restrict to v6 only */
-			addr = &inany_any6;
-		else if (inany_v4(addr))
-			return -EAFNOSUPPORT;
-	}
-	if (!c->ifi6) {
-		if (!addr)
-			/* Restrict to v4 only */
-			addr = &inany_any4;
-		else if (!inany_v4(addr))
-			return -EAFNOSUPPORT;
-	}
-
-	s = pif_listen(c, EPOLL_TYPE_TCP_LISTEN, pif, addr, ifname, port, rule);
-
-	return s;
-}
-
 /**
  * tcp_sock_refill_pool() - Refill one pool of pre-opened sockets
  * @pool:	Pool of sockets to refill
diff --git a/tcp.h b/tcp.h
index 3262a807..57deef57 100644
--- a/tcp.h
+++ b/tcp.h
@@ -26,8 +26,6 @@ void tcp_sock_handler(const struct ctx *c, union epoll_ref ref,
 int tcp_tap_handler(const struct ctx *c, uint8_t pif, sa_family_t af,
 		    const void *saddr, const void *daddr, uint32_t flow_lbl,
 		    const struct pool *p, int idx, const struct timespec *now);
-int tcp_listen(const struct ctx *c, uint8_t pif, unsigned rule,
-	       const union inany_addr *addr, const char *ifname, in_port_t port);
 int tcp_init(struct ctx *c);
 void tcp_defer_handler(struct ctx *c, const struct timespec *now);
 
diff --git a/udp.c b/udp.c
index c28d6ee2..375befa7 100644
--- a/udp.c
+++ b/udp.c
@@ -1124,44 +1124,6 @@ int udp_tap_handler(const struct ctx *c, uint8_t pif,
 	return count;
 }
 
-/**
- * udp_listen() - Initialise listening socket for a given port
- * @c:		Execution context
- * @pif:	Interface to open the socket for (PIF_HOST or PIF_SPLICE)
- * @rule:	Index of relevant forwarding rule
- * @addr:	Pointer to address for binding, NULL if not configured
- * @ifname:	Name of interface to bind to, NULL if not configured
- * @port:	Port, host order
- *
- * Return: socket fd on success, negative error code on failure
- */
-int udp_listen(const struct ctx *c, uint8_t pif, unsigned rule,
-	       const union inany_addr *addr, const char *ifname, in_port_t port)
-{
-	int s;
-
-	assert(!c->no_udp);
-
-	if (!c->ifi4) {
-		if (!addr)
-			/* Restrict to v6 only */
-			addr = &inany_any6;
-		else if (inany_v4(addr))
-			return -EAFNOSUPPORT;
-	}
-	if (!c->ifi6) {
-		if (!addr)
-			/* Restrict to v4 only */
-			addr = &inany_any4;
-		else if (!inany_v4(addr))
-			return -EAFNOSUPPORT;
-	}
-
-	s = pif_listen(c, EPOLL_TYPE_UDP_LISTEN, pif, addr, ifname, port, rule);
-
-	return s;
-}
-
 /**
  * udp_splice_iov_init() - Set up buffers and descriptors for recvmmsg/sendmmsg
  */
diff --git a/udp.h b/udp.h
index a75d5aea..9ea7de68 100644
--- a/udp.h
+++ b/udp.h
@@ -19,8 +19,6 @@ int udp_tap_handler(const struct ctx *c, uint8_t pif,
 		    sa_family_t af, const void *saddr, const void *daddr,
 		    uint8_t ttl, const struct pool *p, int idx,
 		    const struct timespec *now);
-int udp_listen(const struct ctx *c, uint8_t pif, unsigned rule,
-	       const union inany_addr *addr, const char *ifname, in_port_t port);
 int udp_init(struct ctx *c);
 void udp_update_l2_buf(const unsigned char *eth_d);
 
-- 
2.54.0


  parent reply	other threads:[~2026-06-09  6:30 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-09  6:30 [PATCH 0/4] Assorted minor socket creation cleanups David Gibson
2026-06-09  6:30 ` [PATCH 1/4] flow: Correct misleading signature of flowside_sock_l4() David Gibson
2026-06-09  6:30 ` [PATCH 2/4] Makefile: Remove unused DUAL_STACK_SOCKETS define David Gibson
2026-06-09  6:30 ` David Gibson [this message]
2026-06-09  6:30 ` [PATCH 4/4] pif, util: Move listen(2) call from sock_l4_() to pif_listen() 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=20260609063005.113744-4-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).