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 9#ifndef _LINUX_SUNRPC_XPRT_H 10#define _LINUX_SUNRPC_XPRT_H 11 12#include <linux/uio.h> 13#include <linux/socket.h> 14#include <linux/in.h> 15#include <linux/sunrpc/sched.h> 16#include <linux/sunrpc/xdr.h> 17 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 * congestion 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 */ 36#define RPC_MAXCONG (16) 37#define RPC_MAXREQS RPC_MAXCONG 38#define RPC_CWNDSCALE (256) 39#define RPC_MAXCWND (RPC_MAXCONG * RPC_CWNDSCALE) 40#define RPC_INITCWND RPC_CWNDSCALE 41#define RPCXPRT_CONGESTED(xprt) ((xprt)->cong >= (xprt)->cwnd) 42 43/* Default timeout values */ 44#define RPC_MAX_UDP_TIMEOUT (60*HZ) 45#define RPC_MAX_TCP_TIMEOUT (600*HZ) 46 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/* 54 * This describes a timeout strategy 55 */ 56struct rpc_timeout { 57 unsigned long to_current, /* current timeout */ 58 to_initval, /* initial timeout */ 59 to_maxval, /* max timeout */ 60 to_increment, /* if !exponential */ 61 to_resrvval; /* reserve timeout */ 62 short to_retries; /* max # of retries */ 63 unsigned char to_exponential; 64}; 65 66/* 67 * This describes a complete RPC request 68 */ 69struct rpc_rqst { 70 /* 71 * This is the user-visible part 72 */ 73 struct rpc_xprt * rq_xprt; /* RPC client */ 74 struct rpc_timeout rq_timeout; /* timeout parms */ 75 struct xdr_buf rq_snd_buf; /* send buffer */ 76 struct xdr_buf rq_rcv_buf; /* recv buffer */ 77 78 /* 79 * This is the private part 80 */ 81 struct rpc_task * rq_task; /* RPC task data */ 82 __u32 rq_xid; /* request XID */ 83 struct rpc_rqst * rq_next; /* free list */ 84 int rq_cong; /* has incremented xprt->cong */ 85 int rq_received; /* receive completed */ 86 87 struct list_head rq_list; 88 89 /* 90 * For authentication (e.g. auth_des) 91 */ 92 u32 rq_creddata[2]; 93 94 /* 95 * Partial send handling 96 */ 97 98 u32 rq_bytes_sent; /* Bytes we have sent */ 99 100 long rq_xtime; /* when transmitted */ 101 int rq_ntimeo; 102 int rq_nresend; 103}; 104#define rq_svec rq_snd_buf.head 105#define rq_slen rq_snd_buf.len 106#define rq_rvec rq_rcv_buf.head 107#define rq_rlen rq_rcv_buf.len 108 109#define XPRT_LAST_FRAG (1 << 0) 110#define XPRT_COPY_RECM (1 << 1) 111#define XPRT_COPY_XID (1 << 2) 112#define XPRT_COPY_DATA (1 << 3) 113 114struct rpc_xprt { 115 struct socket * sock; /* BSD socket layer */ 116 struct sock * inet; /* INET layer */ 117 118 struct rpc_timeout timeout; /* timeout parms */ 119 struct sockaddr_in addr; /* server address */ 120 int prot; /* IP protocol */ 121 122 unsigned long cong; /* current congestion */ 123 unsigned long cwnd; /* congestion window */ 124 125 unsigned int rcvsize, /* socket receive buffer size */ 126 sndsize; /* socket send buffer size */ 127 128 struct rpc_wait_queue sending; /* requests waiting to send */ 129 struct rpc_wait_queue resend; /* requests waiting to resend */ 130 struct rpc_wait_queue pending; /* requests in flight */ 131 struct rpc_wait_queue backlog; /* waiting for slot */ 132 struct rpc_rqst * free; /* free slots */ 133 struct rpc_rqst slot[RPC_MAXREQS]; 134 unsigned long sockstate; /* Socket state */ 135 unsigned char shutdown : 1, /* being shut down */ 136 nocong : 1, /* no congestion control */ 137 stream : 1; /* TCP */ 138 139 /* 140 * State of TCP reply receive stuff 141 */ 142 u32 tcp_recm, /* Fragment header */ 143 tcp_xid, /* Current XID */ 144 tcp_reclen, /* fragment length */ 145 tcp_offset; /* fragment offset */ 146 unsigned long tcp_copied, /* copied to request */ 147 tcp_flags; 148 149 /* 150 * Send stuff 151 */ 152 spinlock_t sock_lock; /* lock socket info */ 153 spinlock_t xprt_lock; /* lock xprt info */ 154 struct rpc_task * snd_task; /* Task blocked in send */ 155 156 struct list_head recv; 157 158 159 void (*old_data_ready)(struct sock *, int); 160 void (*old_state_change)(struct sock *); 161 void (*old_write_space)(struct sock *); 162 163 wait_queue_head_t cong_wait; 164}; 165 166#ifdef __KERNEL__ 167 168struct rpc_xprt * xprt_create_proto(int proto, struct sockaddr_in *addr, 169 struct rpc_timeout *toparms); 170int xprt_destroy(struct rpc_xprt *); 171void xprt_shutdown(struct rpc_xprt *); 172void xprt_default_timeout(struct rpc_timeout *, int); 173void xprt_set_timeout(struct rpc_timeout *, unsigned int, 174 unsigned long); 175 176int xprt_reserve(struct rpc_task *); 177void xprt_transmit(struct rpc_task *); 178void xprt_receive(struct rpc_task *); 179int xprt_adjust_timeout(struct rpc_timeout *); 180void xprt_release(struct rpc_task *); 181void xprt_reconnect(struct rpc_task *); 182int xprt_clear_backlog(struct rpc_xprt *); 183void xprt_sock_setbufsize(struct rpc_xprt *); 184 185#define XPRT_CONNECT 0 186 187#define xprt_connected(xp) (!(xp)->stream || 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_clear_connected(xp) (clear_bit(XPRT_CONNECT, &(xp)->sockstate)) 191 192#endif /* __KERNEL__*/ 193 194#endif /* _LINUX_SUNRPC_XPRT_H */ 195