svc_xprt.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /*
  2. * linux/net/sunrpc/svc_xprt.c
  3. *
  4. * Author: Tom Tucker <tom@opengridcomputing.com>
  5. */
  6. #include <linux/sched.h>
  7. #include <linux/errno.h>
  8. #include <linux/fcntl.h>
  9. #include <linux/net.h>
  10. #include <linux/in.h>
  11. #include <linux/inet.h>
  12. #include <linux/udp.h>
  13. #include <linux/tcp.h>
  14. #include <linux/unistd.h>
  15. #include <linux/slab.h>
  16. #include <linux/netdevice.h>
  17. #include <linux/skbuff.h>
  18. #include <linux/file.h>
  19. #include <linux/freezer.h>
  20. #include <net/sock.h>
  21. #include <net/checksum.h>
  22. #include <net/ip.h>
  23. #include <net/ipv6.h>
  24. #include <net/tcp_states.h>
  25. #include <linux/uaccess.h>
  26. #include <asm/ioctls.h>
  27. #include <linux/sunrpc/types.h>
  28. #include <linux/sunrpc/clnt.h>
  29. #include <linux/sunrpc/xdr.h>
  30. #include <linux/sunrpc/svcsock.h>
  31. #include <linux/sunrpc/stats.h>
  32. #include <linux/sunrpc/svc_xprt.h>
  33. #define RPCDBG_FACILITY RPCDBG_SVCXPRT
  34. /* List of registered transport classes */
  35. static DEFINE_SPINLOCK(svc_xprt_class_lock);
  36. static LIST_HEAD(svc_xprt_class_list);
  37. int svc_reg_xprt_class(struct svc_xprt_class *xcl)
  38. {
  39. struct svc_xprt_class *cl;
  40. int res = -EEXIST;
  41. dprintk("svc: Adding svc transport class '%s'\n", xcl->xcl_name);
  42. INIT_LIST_HEAD(&xcl->xcl_list);
  43. spin_lock(&svc_xprt_class_lock);
  44. /* Make sure there isn't already a class with the same name */
  45. list_for_each_entry(cl, &svc_xprt_class_list, xcl_list) {
  46. if (strcmp(xcl->xcl_name, cl->xcl_name) == 0)
  47. goto out;
  48. }
  49. list_add_tail(&xcl->xcl_list, &svc_xprt_class_list);
  50. res = 0;
  51. out:
  52. spin_unlock(&svc_xprt_class_lock);
  53. return res;
  54. }
  55. EXPORT_SYMBOL_GPL(svc_reg_xprt_class);
  56. void svc_unreg_xprt_class(struct svc_xprt_class *xcl)
  57. {
  58. dprintk("svc: Removing svc transport class '%s'\n", xcl->xcl_name);
  59. spin_lock(&svc_xprt_class_lock);
  60. list_del_init(&xcl->xcl_list);
  61. spin_unlock(&svc_xprt_class_lock);
  62. }
  63. EXPORT_SYMBOL_GPL(svc_unreg_xprt_class);
  64. /*
  65. * Called by transport drivers to initialize the transport independent
  66. * portion of the transport instance.
  67. */
  68. void svc_xprt_init(struct svc_xprt_class *xcl, struct svc_xprt *xprt)
  69. {
  70. memset(xprt, 0, sizeof(*xprt));
  71. xprt->xpt_class = xcl;
  72. xprt->xpt_ops = xcl->xcl_ops;
  73. }
  74. EXPORT_SYMBOL_GPL(svc_xprt_init);