svc.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

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 svc_rqst * sv_threads; /* idle server threads */
  26. struct svc_sock * 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 svc_sock * sv_allsocks; /* all sockets */
  34. char * sv_name; /* service name */
  35. };
  36. /*
  37.  * Maximum payload size supported by a kernel RPC server.
  38.  * This is use to determine the max number of pages nfsd is
  39.  * willing to return in a single READ operation.
  40.  */
  41. #define RPCSVC_MAXPAYLOAD 16384u
  42. /*
  43.  * Buffer to store RPC requests or replies in.
  44.  * Each server thread has one of these beasts.
  45.  *
  46.  * Area points to the allocated memory chunk currently owned by the
  47.  * buffer. Base points to the buffer containing the request, which is
  48.  * different from area when directly reading from an sk_buff. buf is
  49.  * the current read/write position while processing an RPC request.
  50.  *
  51.  * The array of iovecs can hold additional data that the server process
  52.  * may not want to copy into the RPC reply buffer, but pass to the 
  53.  * network sendmsg routines directly. The prime candidate for this
  54.  * will of course be NFS READ operations, but one might also want to
  55.  * do something about READLINK and READDIR. It might be worthwhile
  56.  * to implement some generic readdir cache in the VFS layer...
  57.  *
  58.  * On the receiving end of the RPC server, the iovec may be used to hold
  59.  * the list of IP fragments once we get to process fragmented UDP
  60.  * datagrams directly.
  61.  */
  62. #define RPCSVC_MAXIOV ((RPCSVC_MAXPAYLOAD+PAGE_SIZE-1)/PAGE_SIZE + 1)
  63. struct svc_buf {
  64. u32 * area; /* allocated memory */
  65. u32 * base; /* base of RPC datagram */
  66. int buflen; /* total length of buffer */
  67. u32 * buf; /* read/write pointer */
  68. int len; /* current end of buffer */
  69. /* iovec for zero-copy NFS READs */
  70. struct iovec iov[RPCSVC_MAXIOV];
  71. int nriov;
  72. };
  73. #define svc_getlong(argp, val) { (val) = *(argp)->buf++; (argp)->len--; }
  74. #define svc_putlong(resp, val) { *(resp)->buf++ = (val); (resp)->len++; }
  75. /*
  76.  * The context of a single thread, including the request currently being
  77.  * processed.
  78.  * NOTE: First two items must be prev/next.
  79.  */
  80. struct svc_rqst {
  81. struct svc_rqst * rq_prev; /* idle list */
  82. struct svc_rqst * rq_next;
  83. struct svc_sock * rq_sock; /* socket */
  84. struct sockaddr_in rq_addr; /* peer address */
  85. int rq_addrlen;
  86. struct svc_serv * rq_server; /* RPC service definition */
  87. struct svc_procedure * rq_procinfo; /* procedure info */
  88. struct svc_cred rq_cred; /* auth info */
  89. struct sk_buff * rq_skbuff; /* fast recv inet buffer */
  90. struct svc_buf rq_defbuf; /* default buffer */
  91. struct svc_buf rq_argbuf; /* argument buffer */
  92. struct svc_buf rq_resbuf; /* result buffer */
  93. u32 rq_xid; /* transmission id */
  94. u32 rq_prog; /* program number */
  95. u32 rq_vers; /* program version */
  96. u32 rq_proc; /* procedure number */
  97. u32 rq_prot; /* IP protocol */
  98. unsigned short rq_verfed  : 1, /* reply has verifier */
  99. rq_userset : 1, /* auth->setuser OK */
  100. rq_secure  : 1, /* secure port */
  101. rq_auth    : 1; /* check client */
  102. void * rq_argp; /* decoded arguments */
  103. void * rq_resp; /* xdr'd results */
  104. /* Catering to nfsd */
  105. struct svc_client * rq_client; /* RPC peer info */
  106. struct svc_cacherep * rq_cacherep; /* cache info */
  107. wait_queue_head_t rq_wait; /* synchronozation */
  108. };
  109. /*
  110.  * RPC program
  111.  */
  112. struct svc_program {
  113. u32 pg_prog; /* program number */
  114. unsigned int pg_lovers; /* lowest version */
  115. unsigned int pg_hivers; /* lowest version */
  116. unsigned int pg_nvers; /* number of versions */
  117. struct svc_version ** pg_vers; /* version array */
  118. char * pg_name; /* service name */
  119. struct svc_stat * pg_stats; /* rpc statistics */
  120. };
  121. /*
  122.  * RPC program version
  123.  */
  124. struct svc_version {
  125. u32 vs_vers; /* version number */
  126. u32 vs_nproc; /* number of procedures */
  127. struct svc_procedure * vs_proc; /* per-procedure info */
  128. /* Override dispatch function (e.g. when caching replies).
  129.  * A return value of 0 means drop the request. 
  130.  * vs_dispatch == NULL means use default dispatcher.
  131.  */
  132. int (*vs_dispatch)(struct svc_rqst *, u32 *);
  133. };
  134. /*
  135.  * RPC procedure info
  136.  */
  137. typedef int (*svc_procfunc)(struct svc_rqst *, void *argp, void *resp);
  138. struct svc_procedure {
  139. svc_procfunc pc_func; /* process the request */
  140. kxdrproc_t pc_decode; /* XDR decode args */
  141. kxdrproc_t pc_encode; /* XDR encode result */
  142. kxdrproc_t pc_release; /* XDR free result */
  143. unsigned int pc_argsize; /* argument struct size */
  144. unsigned int pc_ressize; /* result struct size */
  145. unsigned int pc_count; /* call count */
  146. unsigned int pc_cachetype; /* cache info (NFS) */
  147. };
  148. /*
  149.  * This is the RPC server thread function prototype
  150.  */
  151. typedef void (*svc_thread_fn)(struct svc_rqst *);
  152. /*
  153.  * Function prototypes.
  154.  */
  155. struct svc_serv *  svc_create(struct svc_program *, unsigned int, unsigned int);
  156. int    svc_create_thread(svc_thread_fn, struct svc_serv *);
  157. void    svc_exit_thread(struct svc_rqst *);
  158. void    svc_destroy(struct svc_serv *);
  159. int    svc_process(struct svc_serv *, struct svc_rqst *);
  160. int    svc_register(struct svc_serv *, int, unsigned short);
  161. void    svc_wake_up(struct svc_serv *);
  162. #endif /* SUNRPC_SVC_H */