svc.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:6k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * linux/include/linux/sunrpc/svc.h
  3.  *
  4.  * RPC server declarations.
  5.  *
  6.  * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
  7.  */
  8. #ifndef SUNRPC_SVC_H
  9. #define SUNRPC_SVC_H
  10. #include <linux/in.h>
  11. #include <linux/sunrpc/types.h>
  12. #include <linux/sunrpc/xdr.h>
  13. #include <linux/sunrpc/svcauth.h>
  14. /*
  15.  * RPC service.
  16.  *
  17.  * An RPC service is a ``daemon,'' possibly multithreaded, which
  18.  * receives and processes incoming RPC messages.
  19.  * It has one or more transport sockets associated with it, and maintains
  20.  * a list of idle threads waiting for input.
  21.  *
  22.  * We currently do not support more than one RPC program per daemon.
  23.  */
  24. struct svc_serv {
  25. struct list_head sv_threads; /* idle server threads */
  26. struct list_head sv_sockets; /* pending sockets */
  27. struct svc_program * sv_program; /* RPC program */
  28. struct svc_stat * sv_stats; /* RPC statistics */
  29. spinlock_t sv_lock;
  30. unsigned int sv_nrthreads; /* # of server threads */
  31. unsigned int sv_bufsz; /* datagram buffer size */
  32. unsigned int sv_xdrsize; /* XDR buffer size */
  33. struct list_head sv_permsocks; /* all permanent sockets */
  34. struct list_head sv_tempsocks; /* all temporary sockets */
  35. int sv_tmpcnt; /* count of temporary sockets */
  36. char * sv_name; /* service name */
  37. };
  38. /*
  39.  * Maximum payload size supported by a kernel RPC server.
  40.  * This is use to determine the max number of pages nfsd is
  41.  * willing to return in a single READ operation.
  42.  */
  43. #define RPCSVC_MAXPAYLOAD 16384u
  44. /*
  45.  * Buffer to store RPC requests or replies in.
  46.  * Each server thread has one of these beasts.
  47.  *
  48.  * Area points to the allocated memory chunk currently owned by the
  49.  * buffer. Base points to the buffer containing the request, which is
  50.  * different from area when directly reading from an sk_buff. buf is
  51.  * the current read/write position while processing an RPC request.
  52.  *
  53.  * The array of iovecs can hold additional data that the server process
  54.  * may not want to copy into the RPC reply buffer, but pass to the 
  55.  * network sendmsg routines directly. The prime candidate for this
  56.  * will of course be NFS READ operations, but one might also want to
  57.  * do something about READLINK and READDIR. It might be worthwhile
  58.  * to implement some generic readdir cache in the VFS layer...
  59.  *
  60.  * On the receiving end of the RPC server, the iovec may be used to hold
  61.  * the list of IP fragments once we get to process fragmented UDP
  62.  * datagrams directly.
  63.  */
  64. #define RPCSVC_MAXIOV ((RPCSVC_MAXPAYLOAD+PAGE_SIZE-1)/PAGE_SIZE + 1)
  65. struct svc_buf {
  66. u32 * area; /* allocated memory */
  67. u32 * base; /* base of RPC datagram */
  68. int buflen; /* total length of buffer */
  69. u32 * buf; /* read/write pointer */
  70. int len; /* current end of buffer */
  71. /* iovec for zero-copy NFS READs */
  72. struct iovec iov[RPCSVC_MAXIOV];
  73. int nriov;
  74. };
  75. #define svc_getlong(argp, val) { (val) = *(argp)->buf++; (argp)->len--; }
  76. #define svc_putlong(resp, val) { *(resp)->buf++ = (val); (resp)->len++; }
  77. /*
  78.  * The context of a single thread, including the request currently being
  79.  * processed.
  80.  * NOTE: First two items must be prev/next.
  81.  */
  82. struct svc_rqst {
  83. struct list_head rq_list; /* idle list */
  84. struct svc_sock * rq_sock; /* socket */
  85. struct sockaddr_in rq_addr; /* peer address */
  86. int rq_addrlen;
  87. struct svc_serv * rq_server; /* RPC service definition */
  88. struct svc_procedure * rq_procinfo; /* procedure info */
  89. struct svc_cred rq_cred; /* auth info */
  90. struct sk_buff * rq_skbuff; /* fast recv inet buffer */
  91. struct svc_buf rq_defbuf; /* default buffer */
  92. struct svc_buf rq_argbuf; /* argument buffer */
  93. struct svc_buf rq_resbuf; /* result buffer */
  94. u32 rq_xid; /* transmission id */
  95. u32 rq_prog; /* program number */
  96. u32 rq_vers; /* program version */
  97. u32 rq_proc; /* procedure number */
  98. u32 rq_prot; /* IP protocol */
  99. unsigned short rq_verfed  : 1, /* reply has verifier */
  100. rq_userset : 1, /* auth->setuser OK */
  101. rq_secure  : 1, /* secure port */
  102. rq_auth    : 1; /* check client */
  103. void * rq_argp; /* decoded arguments */
  104. void * rq_resp; /* xdr'd results */
  105. int rq_reserved; /* space on socket outq
  106.  * reserved for this request
  107.  */
  108. /* Catering to nfsd */
  109. struct svc_client * rq_client; /* RPC peer info */
  110. struct svc_cacherep * rq_cacherep; /* cache info */
  111. struct knfsd_fh * rq_reffh; /* Referrence filehandle, used to
  112.  * determine what device number
  113.  * to report (real or virtual)
  114.  */
  115. wait_queue_head_t rq_wait; /* synchronozation */
  116. };
  117. /*
  118.  * RPC program
  119.  */
  120. struct svc_program {
  121. u32 pg_prog; /* program number */
  122. unsigned int pg_lovers; /* lowest version */
  123. unsigned int pg_hivers; /* lowest version */
  124. unsigned int pg_nvers; /* number of versions */
  125. struct svc_version ** pg_vers; /* version array */
  126. char * pg_name; /* service name */
  127. struct svc_stat * pg_stats; /* rpc statistics */
  128. };
  129. /*
  130.  * RPC program version
  131.  */
  132. struct svc_version {
  133. u32 vs_vers; /* version number */
  134. u32 vs_nproc; /* number of procedures */
  135. struct svc_procedure * vs_proc; /* per-procedure info */
  136. /* Override dispatch function (e.g. when caching replies).
  137.  * A return value of 0 means drop the request. 
  138.  * vs_dispatch == NULL means use default dispatcher.
  139.  */
  140. int (*vs_dispatch)(struct svc_rqst *, u32 *);
  141. };
  142. /*
  143.  * RPC procedure info
  144.  */
  145. typedef int (*svc_procfunc)(struct svc_rqst *, void *argp, void *resp);
  146. struct svc_procedure {
  147. svc_procfunc pc_func; /* process the request */
  148. kxdrproc_t pc_decode; /* XDR decode args */
  149. kxdrproc_t pc_encode; /* XDR encode result */
  150. kxdrproc_t pc_release; /* XDR free result */
  151. unsigned int pc_argsize; /* argument struct size */
  152. unsigned int pc_ressize; /* result struct size */
  153. unsigned int pc_count; /* call count */
  154. unsigned int pc_cachetype; /* cache info (NFS) */
  155. unsigned int pc_xdrressize; /* maximum size of XDR reply */
  156. };
  157. /*
  158.  * This is the RPC server thread function prototype
  159.  */
  160. typedef void (*svc_thread_fn)(struct svc_rqst *);
  161. /*
  162.  * Function prototypes.
  163.  */
  164. struct svc_serv *  svc_create(struct svc_program *, unsigned int, unsigned int);
  165. int    svc_create_thread(svc_thread_fn, struct svc_serv *);
  166. void    svc_exit_thread(struct svc_rqst *);
  167. void    svc_destroy(struct svc_serv *);
  168. int    svc_process(struct svc_serv *, struct svc_rqst *);
  169. int    svc_register(struct svc_serv *, int, unsigned short);
  170. void    svc_wake_up(struct svc_serv *);
  171. void    svc_reserve(struct svc_rqst *rqstp, int space);
  172. #endif /* SUNRPC_SVC_H */