1 /* 2 * rpcsock.h Declarations for the RPC call interface. 3 * 4 * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de> 5 */ 6 7 8 #ifndef _LINUX_RPCSOCK_H 9 #define _LINUX_RPCSOCK_H 10 11 /* 12 * The rpcsock code maintains an estimate on the maximum number of out- 13 * standing RPC requests, using the congestion avoidance implemented in 14 * 44BSD. This is basically the Van Jacobson slow start algorithm: If a 15 * retransmit occurs, the congestion window is halved; otherwise, it is 16 * incremented by 1/cwnd when a reply is received and a full number of 17 * requests are outstanding. 18 * 19 * Upper procedures may check whether a request would block waiting for 20 * a free RPC slot by using the RPC_CONGESTED() macro. 21 * 22 * Note: on machines with low memory we should probably use a smaller 23 * MAXREQS value: At 32 outstanding reqs with 8 megs of RAM, fragment 24 * reassembly will frequently run out of memory. 25 */ 26 #define RPC_MAXREQS 32 27 #define RPC_CWNDSCALE 256 28 #define RPC_MAXCWND (RPC_MAXREQS * RPC_CWNDSCALE) 29 /* #define RPC_INITCWND (RPC_MAXCWND / 2) */ 30 #define RPC_INITCWND RPC_CWNDSCALE 31 #define RPC_CONGESTED(rsock) ((rsock)->cong >= (rsock)->cwnd) 32 33 /* RPC reply header size: xid, direction, status, accept_status (verifier 34 * size computed separately) 35 */ 36 #define RPC_HDRSIZE (4 * 4) 37 38 /* 39 * This describes a timeout strategy 40 */ 41 struct rpc_timeout { 42 unsigned long to_initval, 43 to_maxval, 44 to_increment; 45 int to_retries; 46 char to_exponential; 47 }; 48 49 /* 50 * This describes a complete RPC request 51 */ 52 struct rpc_ioreq { 53 struct rpc_wait * rq_slot; 54 struct sockaddr * rq_addr; 55 int rq_alen; 56 struct iovec rq_svec[UIO_FASTIOV]; 57 unsigned int rq_snr; 58 unsigned long rq_slen; 59 struct iovec rq_rvec[UIO_FASTIOV]; 60 unsigned int rq_rnr; 61 unsigned long rq_rlen; 62 }; 63 64 /* 65 * This is the callback handler for async RPC. 66 */ 67 struct rpc_wait; 68 typedef void (*rpc_callback_fn_t)(int, struct rpc_wait *, void *); 69 70 /* 71 * Wait information. This struct defines all the state of an RPC 72 * request currently in flight. 73 */ 74 struct rpc_wait { 75 struct rpc_sock * w_sock; 76 struct rpc_wait * w_prev; 77 struct rpc_wait * w_next; 78 struct rpc_ioreq * w_req; 79 int w_result; 80 wait_queue_head_t w_wait; 81 rpc_callback_fn_t w_handler; 82 void * w_cdata; 83 char w_queued; 84 char w_gotit; 85 __u32 w_xid; 86 }; 87 88 struct rpc_sock { 89 struct file * file; 90 struct socket * sock; 91 struct sock * inet; 92 struct rpc_wait waiting[RPC_MAXREQS]; 93 unsigned long cong; 94 unsigned long cwnd; 95 struct rpc_wait * pending; 96 struct rpc_wait * free; 97 wait_queue_head_t backlog; 98 wait_queue_head_t shutwait; 99 int shutdown; 100 }; 101 102 #ifdef __KERNEL__ 103 104 /* rpc_call: Call synchronously */ 105 int rpc_call(struct rpc_sock *, struct rpc_ioreq *, 106 struct rpc_timeout *); 107 /* These implement asynch calls for nfsiod: Process calls rpc_reserve and 108 * rpc_transmits, then passes the request to nfsiod, which collects the 109 * results via rpc_doio 110 */ 111 int rpc_reserve(struct rpc_sock *, struct rpc_ioreq *, int); 112 void rpc_release(struct rpc_sock *, struct rpc_ioreq *); 113 int rpc_transmit(struct rpc_sock *, struct rpc_ioreq *); 114 int rpc_doio(struct rpc_sock *, struct rpc_ioreq *, 115 struct rpc_timeout *, int); 116 struct rpc_sock * rpc_makesock(struct file *); 117 int rpc_closesock(struct rpc_sock *); 118 119 #endif /* __KERNEL__*/ 120 121 #endif /* _LINUX_RPCSOCK_H */ 122