diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2024-02-28 16:39:26 +1100 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2024-02-29 05:40:59 +0100 |
commit | bc2d0d381c1d7c0708eda11935b040662e44d2a4 (patch) | |
tree | bd031b5a06b7966c6a1f1e6fc7bfd710569c04fb /udp.c | |
parent | 720d777a699546f8caaed548d25d419e5f899c2f (diff) | |
download | passt-bc2d0d381c1d7c0708eda11935b040662e44d2a4.tar passt-bc2d0d381c1d7c0708eda11935b040662e44d2a4.tar.gz passt-bc2d0d381c1d7c0708eda11935b040662e44d2a4.tar.bz2 passt-bc2d0d381c1d7c0708eda11935b040662e44d2a4.tar.lz passt-bc2d0d381c1d7c0708eda11935b040662e44d2a4.tar.xz passt-bc2d0d381c1d7c0708eda11935b040662e44d2a4.tar.zst passt-bc2d0d381c1d7c0708eda11935b040662e44d2a4.zip |
udp: Set pif in epoll reference for ephemeral host sockets
The udp_epoll_ref contains a field for the pif to which the socket belongs.
We fill this in for permanent sockets created with udp_sock_init() and for
spliced sockets, however, we omit it for ephemeral sockets created for
tap originated flows.
This is a bug, although we currently get away with it, because we don't
consult that field for such flows. Correctly fill it in.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'udp.c')
-rw-r--r-- | udp.c | 11 |
1 files changed, 9 insertions, 2 deletions
@@ -868,7 +868,10 @@ int udp_tap_handler(struct ctx *c, uint8_t pif, src, dst, udp_tap_map[V4][src].sock); if ((s = udp_tap_map[V4][src].sock) < 0) { struct in_addr bind_addr = IN4ADDR_ANY_INIT; - union udp_epoll_ref uref = { .port = src }; + union udp_epoll_ref uref = { + .port = src, + .pif = PIF_HOST, + }; const char *bind_if = NULL; if (!IN6_IS_ADDR_LOOPBACK(&s_in.sin_addr)) @@ -916,7 +919,11 @@ int udp_tap_handler(struct ctx *c, uint8_t pif, } if ((s = udp_tap_map[V6][src].sock) < 0) { - union udp_epoll_ref uref = { .v6 = 1, .port = src }; + union udp_epoll_ref uref = { + .v6 = 1, + .port = src, + .pif = PIF_HOST, + }; const char *bind_if = NULL; if (!IN6_IS_ADDR_LOOPBACK(&s_in6.sin6_addr)) |