public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
From: David Gibson <david@gibson.dropbear.id.au>
To: Stefano Brivio <sbrivio@redhat.com>, passt-dev@passt.top
Cc: David Gibson <david@gibson.dropbear.id.au>
Subject: [PATCH 5/5] fwd: Don't rewrite inbound multicast destinations
Date: Fri, 10 Jul 2026 16:56:11 +1000	[thread overview]
Message-ID: <20260710065611.530947-6-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20260710065611.530947-1-david@gibson.dropbear.id.au>

fwd_nat_from_host() (nearly) always rewrites the destination address for
inbound flows to the observed guest address.  Usually, that makes sense:
regardless of the host address to which the new flow arrived, we want to
direct it to the guest.  However, that clearly does not make sense for
multicast - it should still appear as a multicast transmission to the
guest.

In particular this can work very badly for multicast protocols which use
the same source and destination ports by convention (e.g. mDNS).  In this
case, we will attempt to forword multicast packets to our own socket,
causing a forwarding loop (see bug 209 for more details).

While it's certainly not enough to make us handle multicast correctly in
all circumstances, not translating multicast destinations is closer to
correct, and prevents bug 209 at least.

Link: https://bugs.passt.top/show_bug.cgi?id=209
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 fwd.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/fwd.c b/fwd.c
index 7d39898e..e59413b6 100644
--- a/fwd.c
+++ b/fwd.c
@@ -1045,7 +1045,8 @@ uint8_t fwd_nat_from_host(const struct ctx *c,
 	tgt->eport = rule->to + (ini->oport - rule->first);
 	if (!inany_is_unspecified(&rule->taddr))
 		tgt->eaddr = rule->taddr;
-	else if (c->host_lo_to_ns_lo && inany_is_loopback(&ini->oaddr))
+	else if (inany_is_multicast(&ini->oaddr) ||
+		 (c->host_lo_to_ns_lo && inany_is_loopback(&ini->oaddr)))
 		tgt->eaddr = ini->oaddr;
 
 	/* TODO: Allow splicing with specified target address */
-- 
2.55.0


      parent reply	other threads:[~2026-07-10  6:56 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-10  6:56 [PATCH 0/5] RFC: Fix bug 209 David Gibson
2026-07-10  6:56 ` [PATCH 1/5] fwd: Clarify semantics of --host-lo-to-ns-lo David Gibson
2026-07-10  6:56 ` [PATCH 2/5] udp: Validate that we have a unicast source address David Gibson
2026-07-10  6:56 ` [PATCH 3/5] fwd: Rework default address logic for inbound flows David Gibson
2026-07-10  6:56 ` [PATCH 4/5] fwd: Reorder DNAPT and SNAT steps in fwd_nat_from_host() David Gibson
2026-07-10  6:56 ` David Gibson [this message]

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=20260710065611.530947-6-david@gibson.dropbear.id.au \
    --to=david@gibson.dropbear.id.au \
    --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).