Commit 0d3ca07f authored by Chuck Lever's avatar Chuck Lever Committed by Trond Myklebust

SUNRPC: Ignore data_ready callbacks during TLS handshakes

The RPC header parser doesn't recognize TLS handshake traffic, so it
will close the connection prematurely with an error. To avoid that,
shunt the transport's data_ready callback when there is a TLS
handshake in progress.

The XPRT_SOCK_IGNORE_RECV flag will be toggled by code added in a
subsequent patch.
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 12072652
...@@ -90,5 +90,6 @@ struct sock_xprt { ...@@ -90,5 +90,6 @@ struct sock_xprt {
#define XPRT_SOCK_WAKE_DISCONNECT (7) #define XPRT_SOCK_WAKE_DISCONNECT (7)
#define XPRT_SOCK_CONNECT_SENT (8) #define XPRT_SOCK_CONNECT_SENT (8)
#define XPRT_SOCK_NOSPACE (9) #define XPRT_SOCK_NOSPACE (9)
#define XPRT_SOCK_IGNORE_RECV (10)
#endif /* _LINUX_SUNRPC_XPRTSOCK_H */ #endif /* _LINUX_SUNRPC_XPRTSOCK_H */
...@@ -700,6 +700,8 @@ static void xs_poll_check_readable(struct sock_xprt *transport) ...@@ -700,6 +700,8 @@ static void xs_poll_check_readable(struct sock_xprt *transport)
{ {
clear_bit(XPRT_SOCK_DATA_READY, &transport->sock_state); clear_bit(XPRT_SOCK_DATA_READY, &transport->sock_state);
if (test_bit(XPRT_SOCK_IGNORE_RECV, &transport->sock_state))
return;
if (!xs_poll_socket_readable(transport)) if (!xs_poll_socket_readable(transport))
return; return;
if (!test_and_set_bit(XPRT_SOCK_DATA_READY, &transport->sock_state)) if (!test_and_set_bit(XPRT_SOCK_DATA_READY, &transport->sock_state))
...@@ -1385,6 +1387,10 @@ static void xs_data_ready(struct sock *sk) ...@@ -1385,6 +1387,10 @@ static void xs_data_ready(struct sock *sk)
trace_xs_data_ready(xprt); trace_xs_data_ready(xprt);
transport->old_data_ready(sk); transport->old_data_ready(sk);
if (test_bit(XPRT_SOCK_IGNORE_RECV, &transport->sock_state))
return;
/* Any data means we had a useful conversation, so /* Any data means we had a useful conversation, so
* then we don't need to delay the next reconnect * then we don't need to delay the next reconnect
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment