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: [RFC 05/12] fwd: Check all configured addresses in guest accessibility functions
Date: Mon, 15 Dec 2025 21:06:32 +1100 [thread overview]
Message-ID: <aT_dqGl949HGmoFN@zatzit> (raw)
In-Reply-To: <20251215015441.887736-6-jmaloy@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 3682 bytes --]
On Sun, Dec 14, 2025 at 08:54:34PM -0500, Jon Maloy wrote:
> We update fwd_guest_accessible4() and fwd_guest_accessible6() to check
> against all addresses in the addrs[] array, not just addrs[0].
>
> This ensures that when multiple addresses are configured via -a options,
> traffic using any of them is correctly identified as guest traffic for
> NAT and forwarding decisions.
That last paragraph is not an accurate. fwd_guest_accessible() isn't
about "identifying guest traffic". It's about detecting inbound
traffic that we have *no way* to forward to the guest and dropping it.
This occurs when we have a peer address that we have no translation
for, but collides with an address the guest is using.
>
> Signed-off-by: Jon Maloy <jmaloy@redhat.com>
> ---
> fwd.c | 22 ++++++++++++++++------
> 1 file changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/fwd.c b/fwd.c
> index 408af30..ece381d 100644
> --- a/fwd.c
> +++ b/fwd.c
> @@ -502,6 +502,8 @@ static bool is_dns_flow(uint8_t proto, const struct flowside *ini)
> static bool fwd_guest_accessible4(const struct ctx *c,
> const struct in_addr *addr)
> {
> + int i;
> +
> if (IN4_IS_ADDR_LOOPBACK(addr))
> return false;
>
> @@ -513,11 +515,15 @@ static bool fwd_guest_accessible4(const struct ctx *c,
> if (IN4_IS_ADDR_UNSPECIFIED(addr))
> return false;
>
> - /* For IPv4, addr_seen is initialised to addr, so is always a valid
> - * address
> + /* Check against all configured guest addresses */
> + for (i = 0; i < c->ip4.addr_count; i++)
> + if (IN4_ARE_ADDR_EQUAL(addr, &c->ip4.addrs[i].addr))
> + return false;
> +
> + /* Also check addr_seen: it tracks the address the guest is actually
> + * using, which may differ from configured addresses.
> */
> - if (IN4_ARE_ADDR_EQUAL(addr, &c->ip4.addrs[0].addr) ||
> - IN4_ARE_ADDR_EQUAL(addr, &c->ip4.addr_seen))
> + if (IN4_ARE_ADDR_EQUAL(addr, &c->ip4.addr_seen))
Really an overall series comment, rather than specific to this patch:
If we're allowing multiple addresses, it doesn't make sense to leave
the 'addr_seen' mechanism as-is. If the guest actually uses multiple
addresses, then addr_seen will bounce around between them in a not
very meaningful way.
Personally, I've never been super-convinced that allowing the guest to
just use an arbitrary address we didn't give it is a good idea. But,
I guess it's an established feature now. I think the way to do that
in a multi-address environment would be to add addresses we observe
the guest using to the list of addresses. They should probably be
flagged as having been observed coming from the guest, rather than
coming from either -a or the host.
> return false;
>
> return true;
> @@ -534,11 +540,15 @@ static bool fwd_guest_accessible4(const struct ctx *c,
> static bool fwd_guest_accessible6(const struct ctx *c,
> const struct in6_addr *addr)
> {
> + int i;
> +
> if (IN6_IS_ADDR_LOOPBACK(addr))
> return false;
>
> - if (IN6_ARE_ADDR_EQUAL(addr, &c->ip6.addrs[0].addr))
> - return false;
> + /* Check against all configured guest addresses */
> + for (i = 0; i < c->ip6.addr_count; i++)
> + if (IN6_ARE_ADDR_EQUAL(addr, &c->ip6.addrs[i].addr))
> + return false;
>
> /* For IPv6, addr_seen starts unspecified, because we don't know what LL
> * address the guest will take until we see it. Only check against it
> --
> 2.51.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-12-15 10:08 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-15 1:54 [RFC 00/12] Support for multiple address and late binding Jon Maloy
2025-12-15 1:54 ` [RFC 01/12] ip: Introduce multi-address data structures for IPv4 and IPv6 Jon Maloy
2025-12-15 9:40 ` David Gibson
2025-12-15 22:05 ` Jon Maloy
2025-12-16 1:58 ` Jon Maloy
2025-12-16 3:14 ` David Gibson
2025-12-15 9:46 ` David Gibson
2025-12-15 1:54 ` [RFC 02/12] ip: Add ip4_default_prefix_len() helper function for class-based prefix Jon Maloy
2025-12-15 9:41 ` David Gibson
2025-12-15 1:54 ` [RFC 03/12] conf: Allow multiple -a/--address options per address family Jon Maloy
2025-12-15 9:53 ` David Gibson
2025-12-15 1:54 ` [RFC 04/12] conf: Apply -n/--netmask to most recently added address Jon Maloy
2025-12-15 9:54 ` David Gibson
2025-12-15 22:43 ` Jon Maloy
2025-12-15 1:54 ` [RFC 05/12] fwd: Check all configured addresses in guest accessibility functions Jon Maloy
2025-12-15 10:06 ` David Gibson [this message]
2025-12-15 1:54 ` [RFC 06/12] arp: Check all configured addresses in ARP filtering Jon Maloy
2025-12-15 10:07 ` David Gibson
2025-12-15 1:54 ` [RFC 07/12] netlink: Subscribe to link/address changes in namespace Jon Maloy
2025-12-15 10:32 ` David Gibson
2025-12-15 23:25 ` Jon Maloy
2025-12-16 3:21 ` David Gibson
2025-12-15 1:54 ` [RFC 08/12] netlink: Subscribe to route " Jon Maloy
2025-12-15 10:38 ` David Gibson
2025-12-15 1:54 ` [RFC 09/12] netlink: Add host-side monitoring for late template interface binding Jon Maloy
2025-12-15 1:54 ` [RFC 10/12] netlink: Add host-side route monitoring and propagation Jon Maloy
2025-12-15 1:54 ` [RFC 11/12] netlink: Prevent host route events from overwriting guest-configured gateway Jon Maloy
2025-12-15 1:54 ` [RFC 12/12] netlink: Rename tap interface when late binding discovers template name Jon Maloy
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=aT_dqGl949HGmoFN@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).