aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2024-02-28 16:39:26 +1100
committerStefano Brivio <sbrivio@redhat.com>2024-02-29 05:40:59 +0100
commitbc2d0d381c1d7c0708eda11935b040662e44d2a4 (patch)
treebd031b5a06b7966c6a1f1e6fc7bfd710569c04fb
parent720d777a699546f8caaed548d25d419e5f899c2f (diff)
downloadpasst-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>
-rw-r--r--udp.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/udp.c b/udp.c
index 3d44f81..d992acd 100644
--- a/udp.c
+++ b/udp.c
@@ -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))