public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
* [PATCH] pasta: Strip RTA_PREFSRC when copying routes to the namespace
@ 2023-08-23  7:03 David Gibson
  2023-08-23 15:24 ` Stefano Brivio
  0 siblings, 1 reply; 2+ messages in thread
From: David Gibson @ 2023-08-23  7:03 UTC (permalink / raw)
  To: Stefano Brivio, passt-dev; +Cc: David Gibson

Host routes can include a preferred source address (RTA_PREFSRC), which
must be one of the host's addresses.  However when using pasta with -a the
namespace might be given a different address, not on the host.  This seems
to occur pretty routinely depending on the network configuration systems
in place on the host.

With --config-net we will try to copy host routes to the namespace.  If
one of those includes an RTA_PREFSRC, but the namespace doesn't have the
host address, this will fail with -EINVAL, causing pasta to fail.

Fix this by stripping off RTA_PREFSRC attributes from routes as we copy
them to the namespace.  This is by no means infallible, bit it should at
least handle common cases for the time being.

Link: https://bugs.passt.top/show_bug.cgi?id=71
Link: https://github.com/containers/podman/pull/19699#issuecomment-1688769287

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 netlink.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/netlink.c b/netlink.c
index f55f2c3..98f08e7 100644
--- a/netlink.c
+++ b/netlink.c
@@ -462,8 +462,21 @@ int nl_route_dup(int s_src, unsigned int ifi_src,
 
 		for (rta = RTM_RTA(rtm), na = RTM_PAYLOAD(nh); RTA_OK(rta, na);
 		     rta = RTA_NEXT(rta, na)) {
-			if (rta->rta_type == RTA_OIF)
+			if (rta->rta_type == RTA_OIF) {
+				/* The host obviously list's the host interface
+				 * id here, we need to change it to the
+				 * namespace's interface id
+				 */
 				*(unsigned int *)RTA_DATA(rta) = ifi_dst;
+			} else if (rta->rta_type == RTA_PREFSRC) {
+				/* Host routes might include a preferred source
+				 * address, which must be one of the host's
+				 * addresses.  However, with -a pasta will use a
+				 * different namespace address, making such a
+				 * route invalid in the namespace.  Strip off
+				 * RTA_PREFSRC attributes to avoid that. */
+				rta->rta_type = RTA_UNSPEC;
+			}
 		}
 	}
 
-- 
@@ -462,8 +462,21 @@ int nl_route_dup(int s_src, unsigned int ifi_src,
 
 		for (rta = RTM_RTA(rtm), na = RTM_PAYLOAD(nh); RTA_OK(rta, na);
 		     rta = RTA_NEXT(rta, na)) {
-			if (rta->rta_type == RTA_OIF)
+			if (rta->rta_type == RTA_OIF) {
+				/* The host obviously list's the host interface
+				 * id here, we need to change it to the
+				 * namespace's interface id
+				 */
 				*(unsigned int *)RTA_DATA(rta) = ifi_dst;
+			} else if (rta->rta_type == RTA_PREFSRC) {
+				/* Host routes might include a preferred source
+				 * address, which must be one of the host's
+				 * addresses.  However, with -a pasta will use a
+				 * different namespace address, making such a
+				 * route invalid in the namespace.  Strip off
+				 * RTA_PREFSRC attributes to avoid that. */
+				rta->rta_type = RTA_UNSPEC;
+			}
 		}
 	}
 
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] pasta: Strip RTA_PREFSRC when copying routes to the namespace
  2023-08-23  7:03 [PATCH] pasta: Strip RTA_PREFSRC when copying routes to the namespace David Gibson
@ 2023-08-23 15:24 ` Stefano Brivio
  0 siblings, 0 replies; 2+ messages in thread
From: Stefano Brivio @ 2023-08-23 15:24 UTC (permalink / raw)
  To: David Gibson; +Cc: passt-dev

On Wed, 23 Aug 2023 17:03:38 +1000
David Gibson <david@gibson.dropbear.id.au> wrote:

> Host routes can include a preferred source address (RTA_PREFSRC), which
> must be one of the host's addresses.  However when using pasta with -a the
> namespace might be given a different address, not on the host.  This seems
> to occur pretty routinely depending on the network configuration systems
> in place on the host.
> 
> With --config-net we will try to copy host routes to the namespace.  If
> one of those includes an RTA_PREFSRC, but the namespace doesn't have the
> host address, this will fail with -EINVAL, causing pasta to fail.
> 
> Fix this by stripping off RTA_PREFSRC attributes from routes as we copy
> them to the namespace.  This is by no means infallible, bit it should at
> least handle common cases for the time being.
> 
> Link: https://bugs.passt.top/show_bug.cgi?id=71
> Link: https://github.com/containers/podman/pull/19699#issuecomment-1688769287
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>

Applied.

-- 
Stefano


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-08-23 15:25 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-23  7:03 [PATCH] pasta: Strip RTA_PREFSRC when copying routes to the namespace David Gibson
2023-08-23 15:24 ` Stefano Brivio

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).