| From 38ed082c01e14b6fba37a182cd866b1bd8e7e5f8 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 15 Jun 2021 11:18:38 +1000 |
| Subject: SUNRPC: prevent port reuse on transports which don't request it. |
| |
| From: NeilBrown <neilb@suse.de> |
| |
| [ Upstream commit bc1c56e9bbe92766d017efb5f0a0c71f80da5570 ] |
| |
| If an RPC client is created without RPC_CLNT_CREATE_REUSEPORT, it should |
| not reuse the source port when a TCP connection is re-established. |
| This is currently implemented by preventing the source port being |
| recorded after a successful connection (the call to xs_set_srcport()). |
| |
| However the source port is also recorded after a successful bind in xs_bind(). |
| This may not be needed at all and certainly is not wanted when |
| RPC_CLNT_CREATE_REUSEPORT wasn't requested. |
| |
| So avoid that assignment when xprt.reuseport is not set. |
| |
| With this change, NFSv4.1 and later mounts use a different port number on |
| each connection. This is helpful with some firewalls which don't cope |
| well with port reuse. |
| |
| Signed-off-by: NeilBrown <neilb@suse.de> |
| Fixes: e6237b6feb37 ("NFSv4.1: Don't rebind to the same source port when reconnecting to the server") |
| Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| net/sunrpc/xprtsock.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c |
| index e35760f238a4..87cb0e36eade 100644 |
| --- a/net/sunrpc/xprtsock.c |
| +++ b/net/sunrpc/xprtsock.c |
| @@ -1680,7 +1680,8 @@ static int xs_bind(struct sock_xprt *transport, struct socket *sock) |
| err = kernel_bind(sock, (struct sockaddr *)&myaddr, |
| transport->xprt.addrlen); |
| if (err == 0) { |
| - transport->srcport = port; |
| + if (transport->xprt.reuseport) |
| + transport->srcport = port; |
| break; |
| } |
| last = port; |
| -- |
| 2.30.2 |
| |