From: David Gibson <david@gibson.dropbear.id.au>
To: Jon Maloy <jmaloy@redhat.com>
Cc: sbrivio@redhat.com, dgibson@redhat.com, passt-dev@passt.top
Subject: Re: [PATCH v5 09/10] tcp: make tcp_rst_no_conn() respond with correct MAC address
Date: Mon, 8 Sep 2025 13:29:38 +1000 [thread overview]
Message-ID: <aL5Nou_srHH8thza@zatzit> (raw)
In-Reply-To: <20250906021154.2760611-10-jmaloy@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 3296 bytes --]
On Fri, Sep 05, 2025 at 10:11:53PM -0400, Jon Maloy wrote:
> 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 <jmaloy@redhat.com>
>
> ---
> v3: - Adapted to the signature change in nl_mac_get() function, so that
> we now consider only the template interface when checking the
> ARP/NDP table.
> v4: - Adapted to previous name changes in this series
> v5: - Eliminated use of function fwd_iany_nat().
> - Instead using the translation result of an attempted NAT lookup.
> ---
> tcp.c | 14 +++++++++++---
> 1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/tcp.c b/tcp.c
> index 383654c..54e75bb 100644
> --- a/tcp.c
> +++ b/tcp.c
> @@ -1912,6 +1912,8 @@ 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 tgt, tgt_nat;
'tgt' is not a good name here. 'tgt' typically refers to the "target"
(non initiating) side of a flow. But in this instance there is no flow.
> struct tcphdr *rsth;
> char buf[USHRT_MAX];
> uint32_t psum = 0;
> @@ -1921,9 +1923,15 @@ static void tcp_rst_no_conn(const struct ctx *c, int af,
> if (th->rst)
> return;
>
> + /* Try to use true MAC address if remote host's address or
> + * NAT translated address can be found in ARP/NDP table.
> + */
> + inany_from_af(&tgt, af, daddr);
> + nat_outbound(c, &tgt, &tgt_nat);
> + fwd_neigh_mac_get(c, &tgt_nat, src_mac);
I'm not convinced we actually want to do a MAC lookup in this case.
In this case the guest has send us a packet that looks bogus. The RST
is explicitly something we're synthesizing, not something that's
_actually_ from the peer. We have to lie about the IP address or the
guest won't attach this RST to the right connection, but I don't see
that we need to lie about the MAC address as well - especially since
it has a cost to do so.
Or to look at it another way, if we get here the guest's idea of what
the surrounding network is already out of sync with passt's idea. So
trying to preserve that idea by faking the MAC is kind of pointless.
> if (af == AF_INET) {
> - struct iphdr *ip4h = tap_push_l2h(c, buf, c->our_tap_mac,
> - ETH_P_IP);
> + struct iphdr *ip4h = tap_push_l2h(c, buf, src_mac, ETH_P_IP);
> const struct in_addr *rst_src = daddr;
> const struct in_addr *rst_dst = saddr;
>
> @@ -1933,7 +1941,7 @@ static void tcp_rst_no_conn(const struct ctx *c, int af,
> *rst_src, *rst_dst);
>
> } else {
> - struct ipv6hdr *ip6h = tap_push_l2h(c, buf, c->our_tap_mac, ETH_P_IPV6);
> + struct ipv6hdr *ip6h = tap_push_l2h(c, buf, src_mac, ETH_P_IPV6);
> const struct in6_addr *rst_src = daddr;
> const struct in6_addr *rst_dst = saddr;
>
> --
> 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
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2025-09-08 3:35 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-06 2:11 [PATCH v5 00/10] Use true MAC address of LAN local remote hosts Jon Maloy
2025-09-06 2:11 ` [PATCH v5 01/10] netlink: add function to extract MAC addresses from NDP/ARP table Jon Maloy
2025-09-08 2:12 ` David Gibson
2025-09-06 2:11 ` [PATCH v5 02/10] fwd: Added cache table for ARP/NDP contents Jon Maloy
2025-09-08 2:42 ` David Gibson
2025-09-09 15:02 ` Jon Maloy
2025-09-10 1:49 ` David Gibson
2025-09-08 9:57 ` David Gibson
2025-09-06 2:11 ` [PATCH v5 03/10] fwd: Add entries of ARP/NDP cache table to a FIFO/LRU queue Jon Maloy
2025-09-08 2:51 ` David Gibson
2025-09-06 2:11 ` [PATCH v5 04/10] arp/ndp: respond with true MAC address of LAN local remote hosts Jon Maloy
2025-09-08 3:04 ` David Gibson
2025-09-06 2:11 ` [PATCH v5 05/10] flow: add MAC address of LAN local remote hosts to flow Jon Maloy
2025-09-08 3:07 ` David Gibson
2025-09-06 2:11 ` [PATCH v5 06/10] udp: forward external source MAC address through tap interface Jon Maloy
2025-09-08 3:13 ` David Gibson
2025-09-06 2:11 ` [PATCH v5 07/10] tcp: " Jon Maloy
2025-09-08 3:18 ` David Gibson
2025-09-06 2:11 ` [PATCH v5 08/10] tap: change signature of function tap_push_l2h() Jon Maloy
2025-09-08 3:21 ` David Gibson
2025-09-06 2:11 ` [PATCH v5 09/10] tcp: make tcp_rst_no_conn() respond with correct MAC address Jon Maloy
2025-09-08 3:29 ` David Gibson [this message]
2025-09-06 2:11 ` [PATCH v5 10/10] icmp: let icmp use mac address from flowside structure Jon Maloy
2025-09-08 3:35 ` David Gibson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aL5Nou_srHH8thza@zatzit \
--to=david@gibson.dropbear.id.au \
--cc=dgibson@redhat.com \
--cc=jmaloy@redhat.com \
--cc=passt-dev@passt.top \
--cc=sbrivio@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://passt.top/passt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).