[PATCH] udp: Use IP_FREEBIND for flow sockets as well as listening sockets
The --freebind option allows pasta to listen on addresses that aren't
registered on the host, which has a number of use cases. However, we
omitted this option for UDP "flow sockets" which are created once a flow
is started, connect()ed specifically to the peer. Flow sockets are also
bound, and if the peer has contacted a freebind address, we need
IP_FREEBIND to do so.
Link: https://bugs.passt.top/show_bug.cgi?id=174
Signed-off-by: David Gibson
On Thu, 13 Nov 2025 12:34:13 +1100
David Gibson
The --freebind option allows pasta to listen on addresses that aren't registered on the host, which has a number of use cases. However, we omitted this option for UDP "flow sockets" which are created once a flow is started, connect()ed specifically to the peer. Flow sockets are also bound, and if the peer has contacted a freebind address, we need IP_FREEBIND to do so.
Link: https://bugs.passt.top/show_bug.cgi?id=174
Signed-off-by: David Gibson
Applied.
--- util.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
I'm still waiting on confirmation from the reporter that this actually fixes bug 174. However, I'm pretty sure this is _a_ correct fix, whether or not it's a complete fix for the issue seen by the reporter.
From https://bugs.passt.top/show_bug.cgi?id=174#c0: I can't downgrade passt/pasta to an earlier version or test patches in my current setup ...so I guess we'll have to guess...
diff --git a/util.c b/util.c index 44c21a3e..ab23463b 100644 --- a/util.c +++ b/util.c @@ -67,9 +67,8 @@ int sock_l4_sa(const struct ctx *c, enum epoll_type type, freebind = c->freebind; break; case EPOLL_TYPE_UDP_LISTEN: - freebind = c->freebind; - /* fallthrough */ case EPOLL_TYPE_UDP: + freebind = c->freebind; proto = IPPROTO_UDP; socktype = SOCK_DGRAM | SOCK_NONBLOCK; break;
-- Stefano
On Thu, Nov 13, 2025 at 11:22:23PM +0100, Stefano Brivio wrote:
On Thu, 13 Nov 2025 12:34:13 +1100 David Gibson
wrote: The --freebind option allows pasta to listen on addresses that aren't registered on the host, which has a number of use cases. However, we omitted this option for UDP "flow sockets" which are created once a flow is started, connect()ed specifically to the peer. Flow sockets are also bound, and if the peer has contacted a freebind address, we need IP_FREEBIND to do so.
Link: https://bugs.passt.top/show_bug.cgi?id=174
Signed-off-by: David Gibson
Applied.
--- util.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
I'm still waiting on confirmation from the reporter that this actually fixes bug 174. However, I'm pretty sure this is _a_ correct fix, whether or not it's a complete fix for the issue seen by the reporter.
I can't downgrade passt/pasta to an earlier version or test patches in my current setup
Ah, missed that.
...so I guess we'll have to guess...
I guess we will.
diff --git a/util.c b/util.c index 44c21a3e..ab23463b 100644 --- a/util.c +++ b/util.c @@ -67,9 +67,8 @@ int sock_l4_sa(const struct ctx *c, enum epoll_type type, freebind = c->freebind; break; case EPOLL_TYPE_UDP_LISTEN: - freebind = c->freebind; - /* fallthrough */ case EPOLL_TYPE_UDP: + freebind = c->freebind; proto = IPPROTO_UDP; socktype = SOCK_DGRAM | SOCK_NONBLOCK; break;
-- Stefano
-- David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson
participants (2)
-
David Gibson
-
Stefano Brivio