diff options
author | Chuck Lever <chuck.lever@ORACLE.COM> | 2011-05-09 15:22:44 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2011-05-27 17:42:47 -0400 |
commit | 176e21ee2ec89cae8d45cf1a850ea45a45428fb8 (patch) | |
tree | 4e1231617d193b3fe62ea5bd4df5e4d8fe8b9e80 /net/sunrpc/clnt.c | |
parent | 559649efb9b0d248541933197bdf7b75529da457 (diff) |
SUNRPC: Support for RPC over AF_LOCAL transports
TI-RPC introduces the capability of performing RPC over AF_LOCAL
sockets. It uses this mainly for registering and unregistering
local RPC services securely with the local rpcbind, but we could
also conceivably use it as a generic upcall mechanism.
This patch provides a client-side only implementation for the moment.
We might also consider a server-side implementation to provide
AF_LOCAL access to NLM (for statd downcalls, and such like).
Autobinding is not supported on kernel AF_LOCAL transports at this
time. Kernel ULPs must specify the pathname of the remote endpoint
when an AF_LOCAL transport is created. rpcbind supports registering
services available via AF_LOCAL, so the kernel could handle it with
some adjustment to ->rpcbind and ->set_port. But we don't need this
feature for doing upcalls via well-known named sockets.
This has not been tested with ULPs that move a substantial amount of
data. Thus, I can't attest to how robust the write_space and
congestion management logic is.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'net/sunrpc/clnt.c')
-rw-r--r-- | net/sunrpc/clnt.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 08ed49629b86..b84d7395535e 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -28,7 +28,9 @@ | |||
28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
29 | #include <linux/utsname.h> | 29 | #include <linux/utsname.h> |
30 | #include <linux/workqueue.h> | 30 | #include <linux/workqueue.h> |
31 | #include <linux/in.h> | ||
31 | #include <linux/in6.h> | 32 | #include <linux/in6.h> |
33 | #include <linux/un.h> | ||
32 | 34 | ||
33 | #include <linux/sunrpc/clnt.h> | 35 | #include <linux/sunrpc/clnt.h> |
34 | #include <linux/sunrpc/rpc_pipe_fs.h> | 36 | #include <linux/sunrpc/rpc_pipe_fs.h> |
@@ -294,6 +296,8 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args) | |||
294 | * up a string representation of the passed-in address. | 296 | * up a string representation of the passed-in address. |
295 | */ | 297 | */ |
296 | if (args->servername == NULL) { | 298 | if (args->servername == NULL) { |
299 | struct sockaddr_un *sun = | ||
300 | (struct sockaddr_un *)args->address; | ||
297 | struct sockaddr_in *sin = | 301 | struct sockaddr_in *sin = |
298 | (struct sockaddr_in *)args->address; | 302 | (struct sockaddr_in *)args->address; |
299 | struct sockaddr_in6 *sin6 = | 303 | struct sockaddr_in6 *sin6 = |
@@ -301,6 +305,10 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args) | |||
301 | 305 | ||
302 | servername[0] = '\0'; | 306 | servername[0] = '\0'; |
303 | switch (args->address->sa_family) { | 307 | switch (args->address->sa_family) { |
308 | case AF_LOCAL: | ||
309 | snprintf(servername, sizeof(servername), "%s", | ||
310 | sun->sun_path); | ||
311 | break; | ||
304 | case AF_INET: | 312 | case AF_INET: |
305 | snprintf(servername, sizeof(servername), "%pI4", | 313 | snprintf(servername, sizeof(servername), "%pI4", |
306 | &sin->sin_addr.s_addr); | 314 | &sin->sin_addr.s_addr); |