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

Linux/Unix编程

开发平台:

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