From: Jordan Rife <jrife@google.com>
To: chuck.lever@oracle.com, jlayton@kernel.org, neilb@suse.de
Cc: linux-nfs@vger.kernel.org, Jordan Rife <jrife@google.com>
Subject: [PATCH] SUNRPC: Avoid address overwrite with eBPF NAT
Date: Wed, 16 Aug 2023 20:48:09 -0500 [thread overview]
Message-ID: <20230817014808.3494465-2-jrife@google.com> (raw)
kernel_connect() will modify the rpc_xprt socket address in contexts
where eBPF programs perform NAT instead of iptables. In these contexts,
it is common for an NFS mount to be mounted to be a static virtual IP
while the server has an ephemeral IP leading to a problem where the
virtual IP gets overwritten and forgotten. When the endpoint IP changes,
reconnect attempts fail and the mount never recovers.
This patch protects addr from being modified in these scenarios, allowing
NFS reconnects to work as intended.
Link: https://github.com/cilium/cilium/issues/21541#issuecomment-1386857338
Signed-off-by: Jordan Rife <jrife@google.com>
---
include/linux/sunrpc/xprt.h | 1 +
net/sunrpc/xprtsock.c | 17 +++++++++++++++--
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h
index b52411bcfe4e7..ddde79b025c53 100644
--- a/include/linux/sunrpc/xprt.h
+++ b/include/linux/sunrpc/xprt.h
@@ -211,6 +211,7 @@ struct rpc_xprt {
const struct rpc_timeout *timeout; /* timeout parms */
struct sockaddr_storage addr; /* server address */
+ struct sockaddr_storage m_addr; /* mutable server address */
size_t addrlen; /* size of server address */
int prot; /* IP protocol */
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
index 9f010369100a2..4100e0bf5ebba 100644
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@ -236,6 +236,18 @@ static inline struct sockaddr *xs_addr(struct rpc_xprt *xprt)
return (struct sockaddr *) &xprt->addr;
}
+static inline struct sockaddr *xs_m_addr(struct rpc_xprt *xprt)
+{
+ /* kernel_connect() may modify the address in contexts where NAT is
+ * performed by eBPF programs instead of iptables. Make a copy to ensure
+ * that our original address, xprt->addr, is not modified. Without this,
+ * NFS reconnects may fail if the endpoint address changes.
+ */
+ memcpy(&xprt->m_addr, &xprt->addr, xprt->addrlen);
+
+ return (struct sockaddr *) &xprt->m_addr;
+}
+
static inline struct sockaddr_un *xs_addr_un(struct rpc_xprt *xprt)
{
return (struct sockaddr_un *) &xprt->addr;
@@ -1954,7 +1966,7 @@ static int xs_local_finish_connecting(struct rpc_xprt *xprt,
xs_stream_start_connect(transport);
- return kernel_connect(sock, xs_addr(xprt), xprt->addrlen, 0);
+ return kernel_connect(sock, xs_m_addr(xprt), xprt->addrlen, 0);
}
/**
@@ -2334,7 +2346,8 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
/* Tell the socket layer to start connecting... */
set_bit(XPRT_SOCK_CONNECTING, &transport->sock_state);
- return kernel_connect(sock, xs_addr(xprt), xprt->addrlen, O_NONBLOCK);
+
+ return kernel_connect(sock, xs_m_addr(xprt), xprt->addrlen, O_NONBLOCK);
}
/**
--
2.42.0.rc1.204.g551eb34607-goog
next reply other threads:[~2023-08-17 1:49 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-17 1:48 Jordan Rife [this message]
2023-08-17 2:07 ` [PATCH] SUNRPC: Avoid address overwrite with eBPF NAT Chuck Lever III
2023-08-17 2:09 ` Trond Myklebust
2023-08-17 2:29 ` Trond Myklebust
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=20230817014808.3494465-2-jrife@google.com \
--to=jrife@google.com \
--cc=chuck.lever@oracle.com \
--cc=jlayton@kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=neilb@suse.de \
/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.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox