aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/svc_xprt.c
diff options
context:
space:
mode:
authorTom Tucker <tom@opengridcomputing.com>2007-12-30 22:07:15 -0500
committerJ. Bruce Fields <bfields@citi.umich.edu>2008-02-01 16:42:07 -0500
commit1d8206b97a09e7ff2fbef17d8d1ea008d764eeaa (patch)
tree0975483e82fab57c25fdbb19a9946985659a8ca2 /net/sunrpc/svc_xprt.c
parentcb5c7d668e1af269a9409721268f027b86abf29c (diff)
svc: Add an svc transport class
The transport class (svc_xprt_class) represents a type of transport, e.g. udp, tcp, rdma. A transport class has a unique name and a set of transport operations kept in the svc_xprt_ops structure. A transport class can be dynamically registered and unregisterd. The svc_xprt_class represents the module that implements the transport type and keeps reference counts on the module to avoid unloading while there are active users. The endpoint (svc_xprt) is a generic, transport independent endpoint that can be used to send and receive data for an RPC service. It inherits it's operations from the transport class. A transport driver module registers and unregisters itself with svc sunrpc by calling svc_reg_xprt_class, and svc_unreg_xprt_class respectively. Signed-off-by: Tom Tucker <tom@opengridcomputing.com> Acked-by: Neil Brown <neilb@suse.de> Reviewed-by: Chuck Lever <chuck.lever@oracle.com> Reviewed-by: Greg Banks <gnb@sgi.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'net/sunrpc/svc_xprt.c')
-rw-r--r--net/sunrpc/svc_xprt.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
new file mode 100644
index 000000000000..fe5270fae336
--- /dev/null
+++ b/net/sunrpc/svc_xprt.c
@@ -0,0 +1,83 @@
1/*
2 * linux/net/sunrpc/svc_xprt.c
3 *
4 * Author: Tom Tucker <tom@opengridcomputing.com>
5 */
6
7#include <linux/sched.h>
8#include <linux/errno.h>
9#include <linux/fcntl.h>
10#include <linux/net.h>
11#include <linux/in.h>
12#include <linux/inet.h>
13#include <linux/udp.h>
14#include <linux/tcp.h>
15#include <linux/unistd.h>
16#include <linux/slab.h>
17#include <linux/netdevice.h>
18#include <linux/skbuff.h>
19#include <linux/file.h>
20#include <linux/freezer.h>
21#include <net/sock.h>
22#include <net/checksum.h>
23#include <net/ip.h>
24#include <net/ipv6.h>
25#include <net/tcp_states.h>
26#include <linux/uaccess.h>
27#include <asm/ioctls.h>
28
29#include <linux/sunrpc/types.h>
30#include <linux/sunrpc/clnt.h>
31#include <linux/sunrpc/xdr.h>
32#include <linux/sunrpc/svcsock.h>
33#include <linux/sunrpc/stats.h>
34#include <linux/sunrpc/svc_xprt.h>
35
36#define RPCDBG_FACILITY RPCDBG_SVCXPRT
37
38/* List of registered transport classes */
39static DEFINE_SPINLOCK(svc_xprt_class_lock);
40static LIST_HEAD(svc_xprt_class_list);
41
42int svc_reg_xprt_class(struct svc_xprt_class *xcl)
43{
44 struct svc_xprt_class *cl;
45 int res = -EEXIST;
46
47 dprintk("svc: Adding svc transport class '%s'\n", xcl->xcl_name);
48
49 INIT_LIST_HEAD(&xcl->xcl_list);
50 spin_lock(&svc_xprt_class_lock);
51 /* Make sure there isn't already a class with the same name */
52 list_for_each_entry(cl, &svc_xprt_class_list, xcl_list) {
53 if (strcmp(xcl->xcl_name, cl->xcl_name) == 0)
54 goto out;
55 }
56 list_add_tail(&xcl->xcl_list, &svc_xprt_class_list);
57 res = 0;
58out:
59 spin_unlock(&svc_xprt_class_lock);
60 return res;
61}
62EXPORT_SYMBOL_GPL(svc_reg_xprt_class);
63
64void svc_unreg_xprt_class(struct svc_xprt_class *xcl)
65{
66 dprintk("svc: Removing svc transport class '%s'\n", xcl->xcl_name);
67 spin_lock(&svc_xprt_class_lock);
68 list_del_init(&xcl->xcl_list);
69 spin_unlock(&svc_xprt_class_lock);
70}
71EXPORT_SYMBOL_GPL(svc_unreg_xprt_class);
72
73/*
74 * Called by transport drivers to initialize the transport independent
75 * portion of the transport instance.
76 */
77void svc_xprt_init(struct svc_xprt_class *xcl, struct svc_xprt *xprt)
78{
79 memset(xprt, 0, sizeof(*xprt));
80 xprt->xpt_class = xcl;
81 xprt->xpt_ops = xcl->xcl_ops;
82}
83EXPORT_SYMBOL_GPL(svc_xprt_init);