xprt.h
上传用户:szlgq88
上传日期:2009-04-28
资源大小:48287k
文件大小:7k
源码类别:

嵌入式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. #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. extern unsigned int xprt_udp_slot_table_entries;
  30. extern unsigned int xprt_tcp_slot_table_entries;
  31. #define RPC_MIN_SLOT_TABLE (2U)
  32. #define RPC_DEF_SLOT_TABLE (16U)
  33. #define RPC_MAX_SLOT_TABLE (128U)
  34. #define RPC_CWNDSHIFT (8U)
  35. #define RPC_CWNDSCALE (1U << RPC_CWNDSHIFT)
  36. #define RPC_INITCWND RPC_CWNDSCALE
  37. #define RPC_MAXCWND(xprt) ((xprt)->max_reqs << RPC_CWNDSHIFT)
  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. /*
  43.  * Wait duration for an RPC TCP connection to be established.  Solaris
  44.  * NFS over TCP uses 60 seconds, for example, which is in line with how
  45.  * long a server takes to reboot.
  46.  */
  47. #define RPC_CONNECT_TIMEOUT (60*HZ)
  48. /*
  49.  * Delay an arbitrary number of seconds before attempting to reconnect
  50.  * after an error.
  51.  */
  52. #define RPC_REESTABLISH_TIMEOUT (15*HZ)
  53. /* RPC call and reply header size as number of 32bit words (verifier
  54.  * size computed separately)
  55.  */
  56. #define RPC_CALLHDRSIZE 6
  57. #define RPC_REPHDRSIZE 4
  58. /*
  59.  * This describes a timeout strategy
  60.  */
  61. struct rpc_timeout {
  62. unsigned long to_initval, /* initial timeout */
  63. to_maxval, /* max timeout */
  64. to_increment; /* if !exponential */
  65. unsigned int to_retries; /* max # of retries */
  66. unsigned char to_exponential;
  67. };
  68. /*
  69.  * This describes a complete RPC request
  70.  */
  71. struct rpc_rqst {
  72. /*
  73.  * This is the user-visible part
  74.  */
  75. struct rpc_xprt * rq_xprt; /* RPC client */
  76. struct xdr_buf rq_snd_buf; /* send buffer */
  77. struct xdr_buf rq_rcv_buf; /* recv buffer */
  78. /*
  79.  * This is the private part
  80.  */
  81. struct rpc_task * rq_task; /* RPC task data */
  82. __u32 rq_xid; /* request XID */
  83. int rq_cong; /* has incremented xprt->cong */
  84. int rq_received; /* receive completed */
  85. u32 rq_seqno; /* gss seq no. used on req. */
  86. struct list_head rq_list;
  87. struct xdr_buf rq_private_buf; /* The receive buffer
  88.  * used in the softirq.
  89.  */
  90. unsigned long rq_majortimeo; /* major timeout alarm */
  91. unsigned long rq_timeout; /* Current timeout value */
  92. unsigned int rq_retries; /* # of retries */
  93. /*
  94.  * For authentication (e.g. auth_des)
  95.  */
  96. u32 rq_creddata[2];
  97. /*
  98.  * Partial send handling
  99.  */
  100. u32 rq_bytes_sent; /* Bytes we have sent */
  101. unsigned long rq_xtime; /* when transmitted */
  102. int rq_ntrans;
  103. };
  104. #define rq_svec rq_snd_buf.head
  105. #define rq_slen rq_snd_buf.len
  106. #define XPRT_LAST_FRAG (1 << 0)
  107. #define XPRT_COPY_RECM (1 << 1)
  108. #define XPRT_COPY_XID (1 << 2)
  109. #define XPRT_COPY_DATA (1 << 3)
  110. struct rpc_xprt {
  111. struct socket * sock; /* BSD socket layer */
  112. struct sock * inet; /* INET layer */
  113. struct rpc_timeout timeout; /* timeout parms */
  114. struct sockaddr_in addr; /* server address */
  115. int prot; /* IP protocol */
  116. unsigned long cong; /* current congestion */
  117. unsigned long cwnd; /* congestion window */
  118. unsigned int rcvsize, /* socket receive buffer size */
  119. sndsize; /* socket send buffer size */
  120. size_t max_payload; /* largest RPC payload size,
  121.    in bytes */
  122. struct rpc_wait_queue sending; /* requests waiting to send */
  123. struct rpc_wait_queue resend; /* requests waiting to resend */
  124. struct rpc_wait_queue pending; /* requests in flight */
  125. struct rpc_wait_queue backlog; /* waiting for slot */
  126. struct list_head free; /* free slots */
  127. struct rpc_rqst * slot; /* slot table storage */
  128. unsigned int max_reqs; /* total slots */
  129. unsigned long sockstate; /* Socket state */
  130. unsigned char shutdown   : 1, /* being shut down */
  131. nocong    : 1, /* no congestion control */
  132. resvport   : 1, /* use a reserved port */
  133. stream     : 1; /* TCP */
  134. /*
  135.  * XID
  136.  */
  137. __u32 xid; /* Next XID value to use */
  138. /*
  139.  * State of TCP reply receive stuff
  140.  */
  141. u32 tcp_recm, /* Fragment header */
  142. tcp_xid, /* Current XID */
  143. tcp_reclen, /* fragment length */
  144. tcp_offset; /* fragment offset */
  145. unsigned long tcp_copied, /* copied to request */
  146. tcp_flags;
  147. /*
  148.  * Connection of sockets
  149.  */
  150. struct work_struct sock_connect;
  151. unsigned short port;
  152. /*
  153.  * Disconnection of idle sockets
  154.  */
  155. struct work_struct task_cleanup;
  156. struct timer_list timer;
  157. unsigned long last_used;
  158. /*
  159.  * Send stuff
  160.  */
  161. spinlock_t sock_lock; /* lock socket info */
  162. spinlock_t xprt_lock; /* lock xprt info */
  163. struct rpc_task * snd_task; /* Task blocked in send */
  164. struct list_head recv;
  165. void (*old_data_ready)(struct sock *, int);
  166. void (*old_state_change)(struct sock *);
  167. void (*old_write_space)(struct sock *);
  168. wait_queue_head_t cong_wait;
  169. };
  170. #ifdef __KERNEL__
  171. struct rpc_xprt * xprt_create_proto(int proto, struct sockaddr_in *addr,
  172. struct rpc_timeout *toparms);
  173. int xprt_destroy(struct rpc_xprt *);
  174. void xprt_set_timeout(struct rpc_timeout *, unsigned int,
  175. unsigned long);
  176. void xprt_reserve(struct rpc_task *);
  177. int xprt_prepare_transmit(struct rpc_task *);
  178. void xprt_transmit(struct rpc_task *);
  179. void xprt_receive(struct rpc_task *);
  180. int xprt_adjust_timeout(struct rpc_rqst *req);
  181. void xprt_release(struct rpc_task *);
  182. void xprt_connect(struct rpc_task *);
  183. void xprt_sock_setbufsize(struct rpc_xprt *);
  184. #define XPRT_LOCKED 0
  185. #define XPRT_CONNECT 1
  186. #define XPRT_CONNECTING 2
  187. #define xprt_connected(xp) (test_bit(XPRT_CONNECT, &(xp)->sockstate))
  188. #define xprt_set_connected(xp) (set_bit(XPRT_CONNECT, &(xp)->sockstate))
  189. #define xprt_test_and_set_connected(xp) (test_and_set_bit(XPRT_CONNECT, &(xp)->sockstate))
  190. #define xprt_test_and_clear_connected(xp) 
  191. (test_and_clear_bit(XPRT_CONNECT, &(xp)->sockstate))
  192. #define xprt_clear_connected(xp) (clear_bit(XPRT_CONNECT, &(xp)->sockstate))
  193. #endif /* __KERNEL__*/
  194. #endif /* _LINUX_SUNRPC_XPRT_H */