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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/linux/sunrpc/clnt_xprt.h
  3.  *
  4.  *  Declarations for the RPC transport interface.
  5.  *
  6.  *  Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
  7.  */
  8. #ifndef _LINUX_SUNRPC_XPRT_H
  9. #define _LINUX_SUNRPC_XPRT_H
  10. #include <linux/uio.h>
  11. #include <linux/socket.h>
  12. #include <linux/in.h>
  13. #include <linux/sunrpc/sched.h>
  14. /*
  15.  * Maximum number of iov's we use.
  16.  */
  17. #define MAX_IOVEC 10
  18. /*
  19.  * The transport code maintains an estimate on the maximum number of out-
  20.  * standing RPC requests, using a smoothed version of the congestion
  21.  * avoidance implemented in 44BSD. This is basically the Van Jacobson
  22.  * slow start algorithm: If a retransmit occurs, the congestion window is
  23.  * halved; otherwise, it is incremented by 1/cwnd when
  24.  *
  25.  * - a reply is received and
  26.  * - a full number of requests are outstanding and
  27.  * - the congestion window hasn't been updated recently.
  28.  *
  29.  * Upper procedures may check whether a request would block waiting for
  30.  * a free RPC slot by using the RPC_CONGESTED() macro.
  31.  *
  32.  * Note: on machines with low memory we should probably use a smaller
  33.  * MAXREQS value: At 32 outstanding reqs with 8 megs of RAM, fragment
  34.  * reassembly will frequently run out of memory.
  35.  * Come Linux 2.3, we'll handle fragments directly.
  36.  */
  37. #define RPC_MAXCONG 16
  38. #define RPC_MAXREQS (RPC_MAXCONG + 1)
  39. #define RPC_CWNDSCALE 256
  40. #define RPC_MAXCWND (RPC_MAXCONG * RPC_CWNDSCALE)
  41. #define RPC_INITCWND RPC_CWNDSCALE
  42. #define RPCXPRT_CONGESTED(xprt) 
  43. ((xprt)->cong >= (xprt)->cwnd)
  44. /* Default timeout values */
  45. #define RPC_MAX_UDP_TIMEOUT (60*HZ)
  46. #define RPC_MAX_TCP_TIMEOUT (600*HZ)
  47. /* RPC call and reply header size as number of 32bit words (verifier
  48.  * size computed separately)
  49.  */
  50. #define RPC_CALLHDRSIZE 6
  51. #define RPC_REPHDRSIZE 4
  52. /*
  53.  * This describes a timeout strategy
  54.  */
  55. struct rpc_timeout {
  56. unsigned long to_current, /* current timeout */
  57. to_initval, /* initial timeout */
  58. to_maxval, /* max timeout */
  59. to_increment, /* if !exponential */
  60. to_resrvval; /* reserve timeout */
  61. short to_retries; /* max # of retries */
  62. unsigned char to_exponential;
  63. };
  64. /*
  65.  * This is the RPC buffer
  66.  */
  67. struct rpc_iov {
  68. struct iovec io_vec[MAX_IOVEC];
  69. unsigned int io_nr;
  70. unsigned int io_len;
  71. };
  72. /*
  73.  * This describes a complete RPC request
  74.  */
  75. struct rpc_rqst {
  76. /*
  77.  * This is the user-visible part
  78.  */
  79. struct rpc_xprt * rq_xprt; /* RPC client */
  80. struct rpc_timeout rq_timeout; /* timeout parms */
  81. struct rpc_iov rq_snd_buf; /* send buffer */
  82. struct rpc_iov rq_rcv_buf; /* recv buffer */
  83. /*
  84.  * This is the private part
  85.  */
  86. struct rpc_task * rq_task; /* RPC task data */
  87. __u32 rq_xid; /* request XID */
  88. struct rpc_rqst * rq_next; /* free list */
  89. volatile unsigned char rq_received : 1;/* receive completed */
  90. /*
  91.  * For authentication (e.g. auth_des)
  92.  */
  93. u32 rq_creddata[2];
  94. /*
  95.  * Partial send handling
  96.  */
  97. u32 rq_bytes_sent; /* Bytes we have sent */
  98. #ifdef RPC_PROFILE
  99. unsigned long rq_xtime; /* when transmitted */
  100. #endif
  101. };
  102. #define rq_svec rq_snd_buf.io_vec
  103. #define rq_snr rq_snd_buf.io_nr
  104. #define rq_slen rq_snd_buf.io_len
  105. #define rq_rvec rq_rcv_buf.io_vec
  106. #define rq_rnr rq_rcv_buf.io_nr
  107. #define rq_rlen rq_rcv_buf.io_len
  108. struct rpc_xprt {
  109. struct socket * sock; /* BSD socket layer */
  110. struct sock * inet; /* INET layer */
  111. struct rpc_timeout timeout; /* timeout parms */
  112. struct sockaddr_in addr; /* server address */
  113. int prot; /* IP protocol */
  114. unsigned long cong; /* current congestion */
  115. unsigned long cwnd; /* congestion window */
  116. unsigned long congtime; /* hold cwnd until then */
  117. struct rpc_wait_queue sending; /* requests waiting to send */
  118. struct rpc_wait_queue pending; /* requests in flight */
  119. struct rpc_wait_queue backlog; /* waiting for slot */
  120. struct rpc_rqst * free; /* free slots */
  121. struct rpc_rqst slot[RPC_MAXREQS];
  122. unsigned long sockstate; /* Socket state */
  123. unsigned char shutdown   : 1, /* being shut down */
  124. nocong    : 1, /* no congestion control */
  125. stream     : 1, /* TCP */
  126. tcp_more   : 1; /* more record fragments */
  127. /*
  128.  * State of TCP reply receive stuff
  129.  */
  130. u32 tcp_recm; /* Fragment header */
  131. u32 tcp_xid; /* Current XID */
  132. unsigned int tcp_reclen, /* fragment length */
  133. tcp_offset, /* fragment offset */
  134. tcp_copied; /* copied to request */
  135. struct list_head rx_pending; /* receive pending list */
  136. /*
  137.  * Send stuff
  138.  */
  139. spinlock_t sock_lock; /* lock socket info */
  140. spinlock_t xprt_lock; /* lock xprt info */
  141. struct rpc_task * snd_task; /* Task blocked in send */
  142. void (*old_data_ready)(struct sock *, int);
  143. void (*old_state_change)(struct sock *);
  144. void (*old_write_space)(struct sock *);
  145. wait_queue_head_t cong_wait;
  146. };
  147. #ifdef __KERNEL__
  148. struct rpc_xprt * xprt_create_proto(int proto, struct sockaddr_in *addr,
  149. struct rpc_timeout *toparms);
  150. int xprt_destroy(struct rpc_xprt *);
  151. void xprt_shutdown(struct rpc_xprt *);
  152. void xprt_default_timeout(struct rpc_timeout *, int);
  153. void xprt_set_timeout(struct rpc_timeout *, unsigned int,
  154. unsigned long);
  155. int xprt_reserve(struct rpc_task *);
  156. void xprt_transmit(struct rpc_task *);
  157. void xprt_receive(struct rpc_task *);
  158. int xprt_adjust_timeout(struct rpc_timeout *);
  159. void xprt_release(struct rpc_task *);
  160. void xprt_reconnect(struct rpc_task *);
  161. int xprt_clear_backlog(struct rpc_xprt *);
  162. int xprt_tcp_pending(void);
  163. void __rpciod_tcp_dispatcher(void);
  164. #define XPRT_WSPACE 0
  165. #define XPRT_CONNECT 1
  166. #define xprt_wspace(xp) (test_bit(XPRT_WSPACE, &(xp)->sockstate))
  167. #define xprt_test_and_set_wspace(xp) (test_and_set_bit(XPRT_WSPACE, &(xp)->sockstate))
  168. #define xprt_clear_wspace(xp) (clear_bit(XPRT_WSPACE, &(xp)->sockstate))
  169. #define xprt_connected(xp) (!(xp)->stream || test_bit(XPRT_CONNECT, &(xp)->sockstate))
  170. #define xprt_set_connected(xp) (set_bit(XPRT_CONNECT, &(xp)->sockstate))
  171. #define xprt_test_and_set_connected(xp) (test_and_set_bit(XPRT_CONNECT, &(xp)->sockstate))
  172. #define xprt_clear_connected(xp) (clear_bit(XPRT_CONNECT, &(xp)->sockstate))
  173. static inline
  174. void rpciod_tcp_dispatcher(void)
  175. {
  176. if (xprt_tcp_pending())
  177. __rpciod_tcp_dispatcher();
  178. }
  179. #endif /* __KERNEL__*/
  180. #endif /* _LINUX_SUNRPC_XPRT_H */