diff options
| author | David Gibson <david@gibson.dropbear.id.au> | 2025-04-10 17:16:40 +1000 |
|---|---|---|
| committer | Stefano Brivio <sbrivio@redhat.com> | 2025-04-10 19:46:16 +0200 |
| commit | 59cc89f4cc018988428637d97745cc4c919126cb (patch) | |
| tree | 12688ff4bf049d5151bd86b12098680b7a6b11d5 /contrib | |
| parent | 695c62396eb3f4627c1114ce444394e3ba34373a (diff) | |
| download | passt-59cc89f4cc018988428637d97745cc4c919126cb.tar passt-59cc89f4cc018988428637d97745cc4c919126cb.tar.gz passt-59cc89f4cc018988428637d97745cc4c919126cb.tar.bz2 passt-59cc89f4cc018988428637d97745cc4c919126cb.tar.lz passt-59cc89f4cc018988428637d97745cc4c919126cb.tar.xz passt-59cc89f4cc018988428637d97745cc4c919126cb.tar.zst passt-59cc89f4cc018988428637d97745cc4c919126cb.zip | |
udp, udp_flow: Track our specific address on socket interfaces
So far for UDP flows (like TCP connections) we didn't record our address
(oaddr) in the flow table entry for socket based pifs. That's because we
didn't have that information when a flow was initiated by a datagram coming
to a "listening" socket with 0.0.0.0 or :: address. Even when we did have
the information, we didn't record it, to simplify address matching on
lookups.
This meant that in some circumstances we could send replies on a UDP flow
from a different address than the originating request came to, which is
surprising and breaks certain setups.
We now have code in udp_peek_addr() which does determine our address for
incoming UDP datagrams. We can use that information to properly populate
oaddr in the flow table for flow initiated from a socket.
In order to be able to consistently match datagrams to flows, we must
*always* have a specific oaddr, not an unspecified address (that's how the
flow hash table works). So, we also need to fill in oaddr correctly for
flows we initiate *to* sockets. Our forwarding logic doesn't specify
oaddr here, letting the kernel decide based on the routing table. In this
case we need to call getsockname() after connect()ing the socket to find
which local address the kernel picked.
This adds getsockname() to our seccomp profile for all variants.
Link: https://bugs.passt.top/show_bug.cgi?id=99
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'contrib')
0 files changed, 0 insertions, 0 deletions
