From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: passt.top; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=F0MG1A4C; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by passt.top (Postfix) with ESMTPS id 297275A0265 for ; Mon, 17 Aug 2026 22:18:37 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786997916; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FF7QdZZOM9t8hNeXKlLcI3SuQWlO7p8dYA2fb4Q9d84=; b=F0MG1A4CHN3ciKndbodQwmPjLUyyxtwh+yyfp67xm7IOMd9Djdt3so18bgbgEk5gnJ/Wqs KLshqSthKyBc+2/VCHN1Vxeyr/+Gy2zNwDnrOaZtX4TUDzMaNdosxGcPPqSBKvzJhsmNQW Y1og4TR/hOkf8RSy/2Zc2jRf+spWzvw= Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-665-4WDStD_SPLqaZ2niuBfUXQ-1; Mon, 17 Aug 2026 16:18:34 -0400 X-MC-Unique: 4WDStD_SPLqaZ2niuBfUXQ-1 X-Mimecast-MFC-AGG-ID: 4WDStD_SPLqaZ2niuBfUXQ_1786997913 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-496bbcf7d1eso30359805e9.0 for ; Mon, 17 Aug 2026 13:18:34 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786997913; x=1787602713; h=date:content-transfer-encoding:content-type:mime-version :organization:references:in-reply-to:message-id:subject:cc:to:from :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to:content-type; bh=FF7QdZZOM9t8hNeXKlLcI3SuQWlO7p8dYA2fb4Q9d84=; b=fFRsdFdAUqCOBTou9d9dOSn9wJo1EpyB+wDf3DYv8pGtH4RvXdAw7rJ2wWBDrfoTaH txkTDdRtyKa7FuyJq3Q1Kp0roZGVak/S87LhSrm2nSEB5NsZCUjMTLPrnYmKjWU3FEKO 2GAWBmIveliHS8oryyIYCIBN6ABpsKuqgPe4/qxBUiuy1Hn5W2dqT1vWR/JzCS498vYI V8LAU+R7S9Maghz/NqP8AJrosG5FSxNER6MzFpJX5q9Oycf17E5YuT1j+t/0/Di0GwEf 0yhNw/QpOyRrBIheYsxd35OdGeh6S1jTKG20RNHGhdCW/ZsR31hZleOoOsSFqll1h2nt ehNQ== X-Gm-Message-State: AOJu0Yw1As2N7C52L4RBStgY9jQONFD/PVLHwKp1d6RfFjhoyK2FnBdF R2F87DJp1ejDk1BIJwlvhVjOJcZbNY+vbjk2FTKeLA6TJ28QY4ZwUPtdaxY+w22lux7K2hINefo xBYTYYAmvf6IOM6eZKhPPkyguTsFwuGa0/pUvn8w5F/5DmsJe1Fe/6A== X-Gm-Gg: AR+sD12EK3mprZtrvhUS+o3ZAa3PnMayulZqHVsz5wJMrix4mPoUJ29LgytoFQXbR/V /JHDT/XzMe3k06uzi+DJ0fSWidVve3oo46bKHUluGB8pRmul2Q+Hhp9AsQnuJvPohFmFE5PhmSP OjeIN7rQykLl2+xUPU5T/nlM7Im1GcIsaRACfHMCue+E2+cg+CmMEbktHVFh9B+H3Z4x8tiqF+H Y6JI0KRP6FN1OwxwcHsu+0fe2JlSSFnJUP4z6EGSCd/dmugcETCr3G/c9uYYyPW60LAeLi9v2Jm yyFmt/+5xyh29NYwLwsyHTSwJ2rtmSJ8vgrktD+I1JAwxyhtrEHhWA7Or/rYObgE1adoaxbf7vR qRgMh1DYdnzr0xu8x46Lp/3P5RW8X X-Received: by 2002:a05:600c:3495:b0:499:873b:471c with SMTP id 5b1f17b1804b1-4998794fafdmr473951205e9.6.1786997913219; Mon, 17 Aug 2026 13:18:33 -0700 (PDT) X-Received: by 2002:a05:600c:3495:b0:499:873b:471c with SMTP id 5b1f17b1804b1-4998794fafdmr473950445e9.6.1786997912762; Mon, 17 Aug 2026 13:18:32 -0700 (PDT) Received: from maya.myfinge.rs (ifcgrfdd.trafficplex.cloud. [176.103.220.4]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-482a5b7840esm5725805f8f.29.2026.08.17.13.18.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 17 Aug 2026 13:18:32 -0700 (PDT) From: Stefano Brivio To: David Gibson Subject: Re: [PATCH 2/2] conf, fwd: Prefer same-scope address as inbound source address from host Message-ID: <20260817221830.0835d9fb@elisabeth> In-Reply-To: References: <20260722232639.1105561-1-sbrivio@redhat.com> <20260722232639.1105561-3-sbrivio@redhat.com> <20260723114234.2266f6dc@elisabeth> Organization: Red Hat X-Mailer: Claws Mail 4.2.0 (GTK 3.24.49; x86_64-pc-linux-gnu) MIME-Version: 1.0 Date: Mon, 17 Aug 2026 22:18:31 +0200 (CEST) X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: zZ1_jXddAustAekKJj1MIrCFi8aO7YQqjs-R_pup32A_1786997913 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Message-ID-Hash: I55APSU54SZARMSZQJHTM4S6YYU4RVCI X-Message-ID-Hash: I55APSU54SZARMSZQJHTM4S6YYU4RVCI X-MailFrom: sbrivio@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: passt-dev@passt.top, Jan =?UTF-8?B?Um9kw6Fr?= , Paul Holzinger X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: On Mon, 27 Jul 2026 11:52:50 +1000 David Gibson wrote: > On Thu, Jul 23, 2026 at 11:42:36AM +0200, Stefano Brivio wrote: > > On Thu, 23 Jul 2026 13:36:58 +1000 > > David Gibson wrote: > > > > > On Thu, Jul 23, 2026 at 01:26:39AM +0200, Stefano Brivio wrote: > > > > We might have situations, such as the one described in > > > > https://bugs.passt.top/show_bug.cgi?id=217, where using a link-local > > > > address as source in a given namespace doesn't guarantee that we can > > > > reach the intended destination, because, for instance, the inbound > > > > traffic we forward is in turn forwarded to a different interface, such > > > > as a bridge. > > > > > > > > In that case, the assumption from 9618d247006a ("ndp, dhcpv6, tcp, > > > > udp: Always use link-local as source if gateway isn't") isn't a safe > > > > one: the user might have specified a valid gateway address, matching > > > > the scope of the destination address, but we won't use it as address > > > > of last resort, and prefer a link-local address with a mismatch in > > > > scope instead. > > > > > > > > This should only be an issue in IPv6 local mode, because, otherwise, > > > > we source address and default gateway address (presumably compatible) > > > > from the host. > > > > > > > > So, in local mode, if the user specifies a given default gateway > > > > address for IPv6, note that as 'our_tap_addr', like we would do with > > > > with IPv4, and stick to Rule 2 of RFC 6724, Section 5, when selecting > > > > a source address, by preferring an address with the same scope, if > > > > available. > > > > > > > > Reported-by: Paul Holzinger > > > > Link: https://bugs.passt.top/show_bug.cgi?id=217 > > > > Signed-off-by: Stefano Brivio > > > > > > Reviewed-by: David Gibson > > > > > > [snip] > > > > diff --git a/fwd.c b/fwd.c > > > > index 7152169..4ba0af3 100644 > > > > --- a/fwd.c > > > > +++ b/fwd.c > > > > @@ -1090,7 +1090,11 @@ uint8_t fwd_nat_from_host(const struct ctx *c, > > > > return PIF_NONE; > > > > tgt->oaddr = inany_from_v4(c->ip4.our_tap_addr); > > > > } else { > > > > - tgt->oaddr.a6 = c->ip6.our_tap_ll; > > > > + if (inany_is_linklocal6(&tgt->eaddr) || > > > > > > Just to make sure you're aware: this will only trigger if tgt->eaddr > > > has been set at this point, which is not always the case. In fact it > > > will usually only be the case when the rule specifies a target > > > address. In other cases we pick tgt->oaddr first then pick > > > tgt->eaddr's scope to try to match it. > > > > Right, yes, I had half a mind to try and change this slightly (see > > below) but then I realised that luckily it wasn't needed for this > > minimal fix, as Podman will specify an explicit destination address, so > > I preferred to avoid the topic altogether for the moment (including > > avoiding comments that risk ignoring some corner cases) because: > > > > > I think the fact that the order in which we pick eaddr and oaddr > > > varies is pretty confusing, but I haven't so far seen a way to avoid > > > it without breaking something worse. > > > > ...I think that, at least in the !nat_inbound() case, we should avoid > > a strict ordering in the selection of source and destination address > > (we should look into both at the same time) because in general we know > > upfront if we can match the scope between source and destination, > > I'm not entirely sure what you mean by that. I mean that we shouldn't try to do something like: 1. check table with mapping of source addresses, apply transformations 2. check table with mapping of destination addresses, apply transformations but rather: 1. check table with mapping of source addresses and table with mapping of destination addresses, and apply relevant transformations (establishing some rules on how to check both "at the same time" is more complicated than the alternative, but also more useful) > > and we > > should always try to do that (same here, RFC 6724 Section 5 Rule 2). > > AFAICT the RFC rules are assuming you already know the destination address. Yes, true, I'm not saying that we should apply the RFC as it is (it doesn't cover what we're doing, just something that resembles it). I'm just saying that if we consider both source and destination address mappings at the same time, we can find a combination that satisfies that rule. > > And, if there are multiple ways to match the scopes, we should prefer > > the most specific / smaller common scope (same rule as above, Section > > 3.1 helps in the interpretation). > > Ok, makes sense, although again I'm not sure it really follows from > the RFC which seems to assume a known destination. Same here: we shouldn't apply those sequentially (even though that makes sense in the general scenario foreseen by the RFC, but we don't need to apply the RFC -- it's just that those rules are useful to draw some inspiration). > > But this would be much simpler to implement once we have Jon's changes > > generalising address storage, because at that point we could have a > > lookup function for the smallest scope of usable address, or even a > > joint lookup function altogether. In detail, I think we should do this > > (again, under the !nat_inbound() condition): > > Right. > > > > > 1. if there's a possible link-local source address and a possible > > destination source address, pick both > > Did you mean specifically a link-local possible destination address > here? Ah, yes, sorry. Both link-local. > > 2. if there's a possible unicast source address and a possible unicast > > destination address, pick both > > > > 3. if there's a possible link-local source address, pick it, and then > > pick any (mismatching) destination address > > > > 4. otherwise, pick any available source address, and any available > > destination address > > > > ...and once we have that series, we can probably avoid implementing > > these as distinct steps. I would defer all this to that point, and > > meanwhile just fix whatever critical case might come up (like the > > current one with Podman). > > Ok. > > > > I still think this change is correct: not previously having > > > ip6.our_tap_addr was only possible because we did this odd dance to > > > pick eaddr based on oaddr's scope rather than the other way around. > > > > > > > + IN6_IS_ADDR_UNSPECIFIED(&c->ip6.our_tap_addr)) > > > > + tgt->oaddr.a6 = c->ip6.our_tap_ll; > > > > + else > > > > + tgt->oaddr.a6 = c->ip6.our_tap_addr; > > > > } > > > > } > > > > tgt->oport = ini->eport; > > > > diff --git a/passt.h b/passt.h > > > > index a61baca..51ccd4f 100644 > > > > --- a/passt.h > > > > +++ b/passt.h > > > > @@ -121,6 +121,7 @@ struct ip4_ctx { > > > > * @dns: DNS addresses for DHCPv6 and NDP > > > > * @dns_match: Forward DNS query if sent to this address > > > > * @our_tap_ll: Link-local IPv6 address for passt's use on tap > > > > + * @our_tap_addr: Non-LL IPv6 address for passt's use on tap (if any) > > > > * @dns_host: Use this DNS on the host for forwarding > > > > * @addr_out: Optional source address for outbound traffic > > > > * @ifname_out: Optional interface name to bind outbound sockets to > > > > @@ -140,6 +141,7 @@ struct ip6_ctx { > > > > struct in6_addr dns[MAXNS]; > > > > struct in6_addr dns_match; > > > > struct in6_addr our_tap_ll; > > > > + struct in6_addr our_tap_addr; > > > > > > > > /* PIF_HOST addresses */ > > > > struct in6_addr dns_host; > > > > -- > > > > 2.43.0 -- Stefano