From: Jon Maloy <jmaloy@redhat.com>
To: sbrivio@redhat.com, dgibson@redhat.com,
david@gibson.dropbear.id.au, jmaloy@redhat.com,
passt-dev@passt.top
Subject: [RFC 11/12] netlink: Prevent host route events from overwriting guest-configured gateway
Date: Sun, 14 Dec 2025 20:54:40 -0500 [thread overview]
Message-ID: <20251215015441.887736-12-jmaloy@redhat.com> (raw)
In-Reply-To: <20251215015441.887736-1-jmaloy@redhat.com>
We add a new context flag 'guest_gw_from_ns' to track if the gateway
was configured from the guest side, something that might have happened
either via the -g option or by a namespace-side netlink event. When set,
host side route events will not be permitted to overwrite the guest's
gateway configuration.
This gives any gateway setting from the guest side precedence over any
ditto coming from the host side.
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
---
conf.c | 2 ++
netlink.c | 15 +++++++++++++--
passt.h | 4 ++++
3 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/conf.c b/conf.c
index 0a4a28a..f26637c 100644
--- a/conf.c
+++ b/conf.c
@@ -1891,6 +1891,7 @@ void conf(struct ctx *c, int argc, char **argv)
!IN6_IS_ADDR_LOOPBACK(&c->ip6.guest_gw)) {
if (c->mode == MODE_PASTA)
c->ip6.no_copy_routes = true;
+ c->ip6.guest_gw_from_ns = true;
break;
}
@@ -1900,6 +1901,7 @@ void conf(struct ctx *c, int argc, char **argv)
!IN4_IS_ADDR_LOOPBACK(&c->ip4.guest_gw)) {
if (c->mode == MODE_PASTA)
c->ip4.no_copy_routes = true;
+ c->ip4.guest_gw_from_ns = true;
break;
}
diff --git a/netlink.c b/netlink.c
index d049239..de04fb7 100644
--- a/netlink.c
+++ b/netlink.c
@@ -490,6 +490,9 @@ static void nl_linkaddr_host_msg_read(struct ctx *c, const struct nlmsghdr *nh)
if (rtm->rtm_family == AF_INET) {
char buf[INET_ADDRSTRLEN];
+ if (c->ip4.guest_gw_from_ns)
+ return;
+
if (!is_new) {
c->ip4.guest_gw = (struct in_addr){ 0 };
c->ip4.our_tap_addr = (struct in_addr){ 0 };
@@ -503,6 +506,9 @@ static void nl_linkaddr_host_msg_read(struct ctx *c, const struct nlmsghdr *nh)
} else if (rtm->rtm_family == AF_INET6) {
char buf[INET6_ADDRSTRLEN];
+ if (c->ip6.guest_gw_from_ns)
+ return;
+
if (!is_new) {
c->ip6.guest_gw = (struct in6_addr){ 0 };
return;
@@ -658,15 +664,20 @@ static void nl_linkaddr_msg_read(struct ctx *c, const struct nlmsghdr *nh)
if (is_new) {
c->ip4.guest_gw = *(struct in_addr *)gw;
c->ip4.our_tap_addr = c->ip4.guest_gw;
+ c->ip4.guest_gw_from_ns = true;
} else {
c->ip4.guest_gw = (struct in_addr){ 0 };
c->ip4.our_tap_addr = (struct in_addr){ 0 };
+ c->ip4.guest_gw_from_ns = false;
}
} else if (rtm->rtm_family == AF_INET6) {
- if (is_new)
+ if (is_new) {
c->ip6.guest_gw = *(struct in6_addr *)gw;
- else
+ c->ip6.guest_gw_from_ns = true;
+ } else {
c->ip6.guest_gw = (struct in6_addr){ 0 };
+ c->ip6.guest_gw_from_ns = false;
+ }
}
}
}
diff --git a/passt.h b/passt.h
index 70ccaf1..5e7bc99 100644
--- a/passt.h
+++ b/passt.h
@@ -82,6 +82,7 @@ enum passt_modes {
* @ifname_out: Optional interface name to bind outbound sockets to
* @no_copy_routes: Don't copy all routes when configuring target namespace
* @no_copy_addrs: Don't copy all addresses when configuring namespace
+ * @guest_gw_from_ns: Gateway was set from namespace (config or ns event)
*/
struct ip4_ctx {
/* PIF_TAP addresses */
@@ -104,6 +105,7 @@ struct ip4_ctx {
bool no_copy_routes;
bool no_copy_addrs;
+ bool guest_gw_from_ns;
};
/**
@@ -125,6 +127,7 @@ struct ip4_ctx {
* @ifname_out: Optional interface name to bind outbound sockets to
* @no_copy_routes: Don't copy all routes when configuring target namespace
* @no_copy_addrs: Don't copy all addresses when configuring namespace
+ * @guest_gw_from_ns: Gateway was set from namespace (config or ns event)
*/
struct ip6_ctx {
/* PIF_TAP addresses */
@@ -148,6 +151,7 @@ struct ip6_ctx {
bool no_copy_routes;
bool no_copy_addrs;
+ bool guest_gw_from_ns;
};
#include <netinet/if_ether.h>
--
2.51.1
next prev parent reply other threads:[~2025-12-15 1:55 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
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 ` Jon Maloy [this message]
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=20251215015441.887736-12-jmaloy@redhat.com \
--to=jmaloy@redhat.com \
--cc=david@gibson.dropbear.id.au \
--cc=dgibson@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).