On Thu, 12 Jun 2025 00:21:51 -0400
Jon Maloy
tcp_rst_no_conn() needs to identify and specify which source mac address to use when sending an RST to the guest. This is because it doesn't have access to any flow structure where this address could be fetched.
Signed-off-by: Jon Maloy
--- tcp.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tcp.c b/tcp.c index 1a32424..b49f603 100644 --- a/tcp.c +++ b/tcp.c @@ -309,6 +309,7 @@ #include "tcp_internal.h" #include "tcp_buf.h" #include "tcp_vu.h" +#include "netlink.h"
#ifndef __USE_MISC /* From Linux UAPI, missing in netinet/tcp.h provided by musl */ @@ -1888,6 +1889,9 @@ static void tcp_rst_no_conn(const struct ctx *c, int af, const struct tcphdr *th, size_t l4len) { struct iov_tail payload = IOV_TAIL(NULL, 0, 0); + unsigned char src_mac[ETH_ALEN]; + union inany_addr translated; + union inany_addr dst;
Same comment as previous patches, here, and...
struct tcphdr *rsth; char buf[USHRT_MAX]; uint32_t psum = 0; @@ -1897,8 +1901,15 @@ static void tcp_rst_no_conn(const struct ctx *c, int af, if (th->rst) return;
+ /* If remote host on local network - respond with its mac address */ + memcpy(src_mac, c->our_tap_mac, ETH_ALEN); + inany_from_af(&dst, af, daddr); + nat_outbound(c, &dst, &translated); + if (!memcmp(&dst, &translated, sizeof(dst))) + nl_mac_get(nl_sock, &dst, src_mac);
here. The rest of the series looks good to me! -- Stefano