On Thu, Oct 02, 2025 at 08:34:09PM -0400, Jon Maloy wrote: > We forward the incoming MAC address through the tap interface when > receiving incoming packets from network local hosts. > > This is a part of the solution to bug > https://bugs.passt.top/show_bug.cgi?id=120 > > Signed-off-by: Jon Maloy > Reviewed-by: David Gibson [snip] > @@ -801,13 +800,19 @@ static void udp_buf_sock_to_tap(const struct ctx *c, int s, int n, > flow_sidx_t tosidx) > { > const struct flowside *toside = flowside_at_sidx(tosidx); > + struct udp_flow *uflow = udp_at_sidx(tosidx); > + uint8_t *omac = uflow->f.tap_omac; > int i; > > if ((n = udp_sock_recv(c, s, udp_mh_recv, n)) <= 0) > return; > > + /* Find if neighbour table has a recorded MAC address */ > + if (MAC_IS_UNDEF(omac)) > + fwd_neigh_mac_get(c, &toside->oaddr, omac); Uh oh. Here you're looking up based on a guest side address, whereas other places are looking up based on a host side address. You need to pick one. > + > for (i = 0; i < n; i++) > - udp_tap_prepare(udp_mh_recv, i, toside, false); > + udp_tap_prepare(udp_mh_recv, i, omac, toside, false); > > tap_send_frames(c, &udp_l2_iov[0][0], UDP_NUM_IOVS, n); > } > diff --git a/udp.h b/udp.h > index 8f8531a..dd6e5ad 100644 > --- a/udp.h > +++ b/udp.h > @@ -21,7 +21,7 @@ int udp_sock_init(const struct ctx *c, int ns, const union inany_addr *addr, > const char *ifname, in_port_t port); > int udp_init(struct ctx *c); > void udp_timer(struct ctx *c, const struct timespec *now); > -void udp_update_l2_buf(const unsigned char *eth_d, const unsigned char *eth_s); > +void udp_update_l2_buf(const unsigned char *eth_d); > > /** > * union udp_listen_epoll_ref - epoll reference for "listening" UDP sockets > -- > 2.50.1 > -- 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