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(a)gibson.dropbear.id.au> --- udp.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/udp.c b/udp.c index d2f8027c..03a5936e 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)) -- 2.43.2