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 06/12] tcp, udp: Make {tcp,udp}_listen() return socket fds
Date: Sat, 20 Dec 2025 01:18:58 +1100 [thread overview]
Message-ID: <20251219141904.1758072-7-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20251219141904.1758072-1-david@gibson.dropbear.id.au>
{tcp,udp}_listen() currently return 0 on success, rather than the socket
fd they created. We had that historically because these functions could
sometimes create multiple sockets. We've now refactored things to avoid
that, so it makes more sense for them to return the socket on success.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
conf.c | 14 +++++++-------
tcp.c | 7 ++-----
udp.c | 4 ++--
3 files changed, 11 insertions(+), 14 deletions(-)
diff --git a/conf.c b/conf.c
index 9d94e449..3d41a0fb 100644
--- a/conf.c
+++ b/conf.c
@@ -150,7 +150,7 @@ static void conf_ports_range_except(const struct ctx *c, char optname,
unsigned delta = to - first;
bool bound_one = false;
unsigned base, i;
- int ret;
+ int fd;
if (first == 0) {
die("Can't forward port 0 for option '-%c %s'",
@@ -175,25 +175,25 @@ static void conf_ports_range_except(const struct ctx *c, char optname,
fwd->delta[i] = delta;
if (!(flags & FWD_SCAN) && optname == 't')
- ret = tcp_listen(c, PIF_HOST, addr, ifname, i);
+ fd = tcp_listen(c, PIF_HOST, addr, ifname, i);
else if (!(flags & FWD_SCAN) && optname == 'u')
- ret = udp_listen(c, PIF_HOST, addr, ifname, i);
+ fd = udp_listen(c, PIF_HOST, addr, ifname, i);
else
/* No way to check in advance for -T and -U */
- ret = 0;
+ fd = 0; /* dummy */
- if (ret == -ENFILE || ret == -EMFILE) {
+ if (fd == -ENFILE || fd == -EMFILE) {
die(
"Can't open enough sockets for port specifier: %s",
optarg);
}
- if (!ret) {
+ if (fd >= 0) {
bound_one = true;
} else if (!(flags & FWD_WEAK)) {
die(
"Failed to bind port %u (%s) for option '-%c %s'",
- i, strerror_(-ret), optname, optarg);
+ i, strerror_(-fd), optname, optarg);
}
}
diff --git a/tcp.c b/tcp.c
index 71c6d632..e52f5420 100644
--- a/tcp.c
+++ b/tcp.c
@@ -2680,7 +2680,7 @@ void tcp_sock_handler(const struct ctx *c, union epoll_ref ref,
* @ifname: Name of interface to bind to, NULL for any
* @port: Port, host order
*
- * Return: 0 on success, negative error code on failure
+ * Return: Socket fd on success, negative error code on failure
*/
int tcp_listen(const struct ctx *c, uint8_t pif,
const union inany_addr *addr, const char *ifname, in_port_t port)
@@ -2731,10 +2731,7 @@ int tcp_listen(const struct ctx *c, uint8_t pif,
socks[port][V6] = s < 0 ? -1 : s;
}
- if (s < 0)
- return s;
-
- return 0;
+ return s;
}
/**
diff --git a/udp.c b/udp.c
index eda55c39..6168c36c 100644
--- a/udp.c
+++ b/udp.c
@@ -1136,7 +1136,7 @@ int udp_tap_handler(const struct ctx *c, uint8_t pif,
* @ifname: Name of interface to bind to, NULL if not configured
* @port: Port, host order
*
- * Return: 0 on success, negative error code on failure
+ * Return: Socket fd on success, negative error code on failure
*/
int udp_listen(const struct ctx *c, uint8_t pif,
const union inany_addr *addr, const char *ifname, in_port_t port)
@@ -1182,7 +1182,7 @@ int udp_listen(const struct ctx *c, uint8_t pif,
if (!addr || !inany_v4(addr))
socks[V6][port] = s < 0 ? -1 : s;
- return s < 0 ? s : 0;
+ return s;
}
/**
--
2.52.0
next prev parent reply other threads:[~2025-12-19 14:19 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-19 14:18 [PATCH v2 00/12] RFC: Improve forwarding data structure David Gibson
2025-12-19 14:18 ` [PATCH v2 01/12] tcp: Combine tcp_sock_init_one() and tcp_sock_init() into tcp_listen() David Gibson
2025-12-19 14:18 ` [PATCH v2 02/12] udp: Rename udp_sock_init() to udp_listen() with small cleanups David Gibson
2025-12-19 14:18 ` [PATCH v2 03/12] conf, fwd: Keep a table of our port forwarding configuration David Gibson
2025-12-19 14:18 ` [PATCH v2 04/12] conf: Accurately record ifname and address for outbound forwards David Gibson
2025-12-19 14:18 ` [PATCH v2 05/12] conf, fwd: Record "auto" port forwards in forwarding table David Gibson
2025-12-19 14:18 ` David Gibson [this message]
2025-12-19 14:18 ` [PATCH v2 07/12] fwd: Make space to store listening sockets in forward table David Gibson
2025-12-19 14:19 ` [PATCH v2 08/12] ip: Add ipproto_name() function David Gibson
2025-12-19 14:19 ` [PATCH v2 09/12] fwd, tcp, udp: Set up listening sockets based on forward table David Gibson
2025-12-19 14:19 ` [PATCH v2 10/12] tcp, udp: Remove old auto-forwarding socket arrays David Gibson
2025-12-19 14:19 ` [PATCH v2 11/12] fwd: Generate auto-forward exclusions from socket fd tables David Gibson
2025-12-19 14:19 ` [PATCH v2 12/12] tcp: Remove unused tcp_epoll_ref 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=20251219141904.1758072-7-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).