mirror of https://gitee.com/openkylin/linux.git
84 lines
2.1 KiB
C
84 lines
2.1 KiB
C
|
/*
|
||
|
* linux/net/sunrpc/svc_xprt.c
|
||
|
*
|
||
|
* Author: Tom Tucker <tom@opengridcomputing.com>
|
||
|
*/
|
||
|
|
||
|
#include <linux/sched.h>
|
||
|
#include <linux/errno.h>
|
||
|
#include <linux/fcntl.h>
|
||
|
#include <linux/net.h>
|
||
|
#include <linux/in.h>
|
||
|
#include <linux/inet.h>
|
||
|
#include <linux/udp.h>
|
||
|
#include <linux/tcp.h>
|
||
|
#include <linux/unistd.h>
|
||
|
#include <linux/slab.h>
|
||
|
#include <linux/netdevice.h>
|
||
|
#include <linux/skbuff.h>
|
||
|
#include <linux/file.h>
|
||
|
#include <linux/freezer.h>
|
||
|
#include <net/sock.h>
|
||
|
#include <net/checksum.h>
|
||
|
#include <net/ip.h>
|
||
|
#include <net/ipv6.h>
|
||
|
#include <net/tcp_states.h>
|
||
|
#include <linux/uaccess.h>
|
||
|
#include <asm/ioctls.h>
|
||
|
|
||
|
#include <linux/sunrpc/types.h>
|
||
|
#include <linux/sunrpc/clnt.h>
|
||
|
#include <linux/sunrpc/xdr.h>
|
||
|
#include <linux/sunrpc/svcsock.h>
|
||
|
#include <linux/sunrpc/stats.h>
|
||
|
#include <linux/sunrpc/svc_xprt.h>
|
||
|
|
||
|
#define RPCDBG_FACILITY RPCDBG_SVCXPRT
|
||
|
|
||
|
/* List of registered transport classes */
|
||
|
static DEFINE_SPINLOCK(svc_xprt_class_lock);
|
||
|
static LIST_HEAD(svc_xprt_class_list);
|
||
|
|
||
|
int svc_reg_xprt_class(struct svc_xprt_class *xcl)
|
||
|
{
|
||
|
struct svc_xprt_class *cl;
|
||
|
int res = -EEXIST;
|
||
|
|
||
|
dprintk("svc: Adding svc transport class '%s'\n", xcl->xcl_name);
|
||
|
|
||
|
INIT_LIST_HEAD(&xcl->xcl_list);
|
||
|
spin_lock(&svc_xprt_class_lock);
|
||
|
/* Make sure there isn't already a class with the same name */
|
||
|
list_for_each_entry(cl, &svc_xprt_class_list, xcl_list) {
|
||
|
if (strcmp(xcl->xcl_name, cl->xcl_name) == 0)
|
||
|
goto out;
|
||
|
}
|
||
|
list_add_tail(&xcl->xcl_list, &svc_xprt_class_list);
|
||
|
res = 0;
|
||
|
out:
|
||
|
spin_unlock(&svc_xprt_class_lock);
|
||
|
return res;
|
||
|
}
|
||
|
EXPORT_SYMBOL_GPL(svc_reg_xprt_class);
|
||
|
|
||
|
void svc_unreg_xprt_class(struct svc_xprt_class *xcl)
|
||
|
{
|
||
|
dprintk("svc: Removing svc transport class '%s'\n", xcl->xcl_name);
|
||
|
spin_lock(&svc_xprt_class_lock);
|
||
|
list_del_init(&xcl->xcl_list);
|
||
|
spin_unlock(&svc_xprt_class_lock);
|
||
|
}
|
||
|
EXPORT_SYMBOL_GPL(svc_unreg_xprt_class);
|
||
|
|
||
|
/*
|
||
|
* Called by transport drivers to initialize the transport independent
|
||
|
* portion of the transport instance.
|
||
|
*/
|
||
|
void svc_xprt_init(struct svc_xprt_class *xcl, struct svc_xprt *xprt)
|
||
|
{
|
||
|
memset(xprt, 0, sizeof(*xprt));
|
||
|
xprt->xpt_class = xcl;
|
||
|
xprt->xpt_ops = xcl->xcl_ops;
|
||
|
}
|
||
|
EXPORT_SYMBOL_GPL(svc_xprt_init);
|