Skip to content

Commit 75eb6af

Browse files
chuckleverTrond Myklebust
authored andcommitted
SUNRPC: Add a TCP-with-TLS RPC transport class
Use the new TLS handshake API to enable the SunRPC client code to request a TLS handshake. This implements support for RFC 9289, only on TCP sockets. Upper layers such as NFS use RPC-with-TLS to protect in-transit traffic. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
1 parent dea034b commit 75eb6af

File tree

5 files changed

+418
-0
lines changed

5 files changed

+418
-0
lines changed

include/linux/sunrpc/xprt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ enum xprt_transports {
200200
XPRT_TRANSPORT_RDMA = 256,
201201
XPRT_TRANSPORT_BC_RDMA = XPRT_TRANSPORT_RDMA | XPRT_TRANSPORT_BC,
202202
XPRT_TRANSPORT_LOCAL = 257,
203+
XPRT_TRANSPORT_TCP_TLS = 258,
203204
};
204205

205206
struct rpc_sysfs_xprt;

include/linux/sunrpc/xprtsock.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,11 @@ struct sock_xprt {
5757
struct work_struct error_worker;
5858
struct work_struct recv_worker;
5959
struct mutex recv_mutex;
60+
struct completion handshake_done;
6061
struct sockaddr_storage srcaddr;
6162
unsigned short srcport;
6263
int xprt_err;
64+
struct rpc_clnt *clnt;
6365

6466
/*
6567
* UDP socket buffer size parameters

include/trace/events/sunrpc.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1525,6 +1525,50 @@ TRACE_EVENT(rpcb_unregister,
15251525
)
15261526
);
15271527

1528+
/**
1529+
** RPC-over-TLS tracepoints
1530+
**/
1531+
1532+
DECLARE_EVENT_CLASS(rpc_tls_class,
1533+
TP_PROTO(
1534+
const struct rpc_clnt *clnt,
1535+
const struct rpc_xprt *xprt
1536+
),
1537+
1538+
TP_ARGS(clnt, xprt),
1539+
1540+
TP_STRUCT__entry(
1541+
__field(unsigned long, requested_policy)
1542+
__field(u32, version)
1543+
__string(servername, xprt->servername)
1544+
__string(progname, clnt->cl_program->name)
1545+
),
1546+
1547+
TP_fast_assign(
1548+
__entry->requested_policy = clnt->cl_xprtsec.policy;
1549+
__entry->version = clnt->cl_vers;
1550+
__assign_str(servername, xprt->servername);
1551+
__assign_str(progname, clnt->cl_program->name)
1552+
),
1553+
1554+
TP_printk("server=%s %sv%u requested_policy=%s",
1555+
__get_str(servername), __get_str(progname), __entry->version,
1556+
rpc_show_xprtsec_policy(__entry->requested_policy)
1557+
)
1558+
);
1559+
1560+
#define DEFINE_RPC_TLS_EVENT(name) \
1561+
DEFINE_EVENT(rpc_tls_class, rpc_tls_##name, \
1562+
TP_PROTO( \
1563+
const struct rpc_clnt *clnt, \
1564+
const struct rpc_xprt *xprt \
1565+
), \
1566+
TP_ARGS(clnt, xprt))
1567+
1568+
DEFINE_RPC_TLS_EVENT(unavailable);
1569+
DEFINE_RPC_TLS_EVENT(not_started);
1570+
1571+
15281572
/* Record an xdr_buf containing a fully-formed RPC message */
15291573
DECLARE_EVENT_CLASS(svc_xdr_msg_class,
15301574
TP_PROTO(

net/sunrpc/sysfs.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ static ssize_t rpc_sysfs_xprt_dstaddr_store(struct kobject *kobj,
239239
if (!xprt)
240240
return 0;
241241
if (!(xprt->xprt_class->ident == XPRT_TRANSPORT_TCP ||
242+
xprt->xprt_class->ident == XPRT_TRANSPORT_TCP_TLS ||
242243
xprt->xprt_class->ident == XPRT_TRANSPORT_RDMA)) {
243244
xprt_put(xprt);
244245
return -EOPNOTSUPP;

0 commit comments

Comments
 (0)