| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 2 | *  linux/include/linux/sunrpc/xprt.h | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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> | 
| Trond Myklebust | 6b6ca86 | 2006-09-05 12:55:57 -0400 | [diff] [blame] | 15 | #include <linux/kref.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 16 | #include <linux/sunrpc/sched.h> | 
|  | 17 | #include <linux/sunrpc/xdr.h> | 
| Greg Banks | 7adae48 | 2006-10-04 02:15:47 -0700 | [diff] [blame] | 18 | #include <linux/sunrpc/msg_prot.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 19 |  | 
| Frank van Maarseveen | 96802a0 | 2007-07-08 13:08:54 +0200 | [diff] [blame] | 20 | #ifdef __KERNEL__ | 
|  | 21 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 22 | #define RPC_MIN_SLOT_TABLE	(2U) | 
|  | 23 | #define RPC_DEF_SLOT_TABLE	(16U) | 
|  | 24 | #define RPC_MAX_SLOT_TABLE	(128U) | 
|  | 25 |  | 
| Chuck Lever | a246b01 | 2005-08-11 16:25:23 -0400 | [diff] [blame] | 26 | /* | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 27 | * This describes a timeout strategy | 
|  | 28 | */ | 
|  | 29 | struct rpc_timeout { | 
|  | 30 | unsigned long		to_initval,		/* initial timeout */ | 
|  | 31 | to_maxval,		/* max timeout */ | 
|  | 32 | to_increment;		/* if !exponential */ | 
|  | 33 | unsigned int		to_retries;		/* max # of retries */ | 
|  | 34 | unsigned char		to_exponential; | 
|  | 35 | }; | 
|  | 36 |  | 
| Chuck Lever | edb267a | 2006-08-22 20:06:18 -0400 | [diff] [blame] | 37 | enum rpc_display_format_t { | 
|  | 38 | RPC_DISPLAY_ADDR = 0, | 
|  | 39 | RPC_DISPLAY_PORT, | 
|  | 40 | RPC_DISPLAY_PROTO, | 
|  | 41 | RPC_DISPLAY_ALL, | 
| Chuck Lever | fbfe3cc | 2007-08-06 11:57:02 -0400 | [diff] [blame] | 42 | RPC_DISPLAY_HEX_ADDR, | 
|  | 43 | RPC_DISPLAY_HEX_PORT, | 
| Chuck Lever | 756805e | 2007-08-16 16:03:26 -0400 | [diff] [blame] | 44 | RPC_DISPLAY_UNIVERSAL_ADDR, | 
| \"Talpey, Thomas\ | 4417c8c | 2007-09-10 13:43:05 -0400 | [diff] [blame] | 45 | RPC_DISPLAY_NETID, | 
| Chuck Lever | edb267a | 2006-08-22 20:06:18 -0400 | [diff] [blame] | 46 | RPC_DISPLAY_MAX, | 
|  | 47 | }; | 
|  | 48 |  | 
| Chuck Lever | 529b33c | 2005-08-25 16:25:54 -0700 | [diff] [blame] | 49 | struct rpc_task; | 
|  | 50 | struct rpc_xprt; | 
| Trond Myklebust | e99170f | 2006-04-18 13:21:42 -0400 | [diff] [blame] | 51 | struct seq_file; | 
| Chuck Lever | 529b33c | 2005-08-25 16:25:54 -0700 | [diff] [blame] | 52 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 53 | /* | 
|  | 54 | * This describes a complete RPC request | 
|  | 55 | */ | 
|  | 56 | struct rpc_rqst { | 
|  | 57 | /* | 
|  | 58 | * This is the user-visible part | 
|  | 59 | */ | 
|  | 60 | struct rpc_xprt *	rq_xprt;		/* RPC client */ | 
|  | 61 | struct xdr_buf		rq_snd_buf;		/* send buffer */ | 
|  | 62 | struct xdr_buf		rq_rcv_buf;		/* recv buffer */ | 
|  | 63 |  | 
|  | 64 | /* | 
|  | 65 | * This is the private part | 
|  | 66 | */ | 
|  | 67 | struct rpc_task *	rq_task;	/* RPC task data */ | 
| Alexey Dobriyan | d8ed029 | 2006-09-26 22:29:38 -0700 | [diff] [blame] | 68 | __be32			rq_xid;		/* request XID */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 69 | int			rq_cong;	/* has incremented xprt->cong */ | 
|  | 70 | int			rq_received;	/* receive completed */ | 
|  | 71 | u32			rq_seqno;	/* gss seq no. used on req. */ | 
| J. Bruce Fields | ead5e1c | 2005-10-13 16:54:43 -0400 | [diff] [blame] | 72 | int			rq_enc_pages_num; | 
|  | 73 | struct page		**rq_enc_pages;	/* scratch pages for use by | 
|  | 74 | gss privacy code */ | 
|  | 75 | void (*rq_release_snd_buf)(struct rpc_rqst *); /* release rq_enc_pages */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 76 | struct list_head	rq_list; | 
|  | 77 |  | 
| Chuck Lever | 0210714 | 2006-01-03 09:55:49 +0100 | [diff] [blame] | 78 | __u32 *			rq_buffer;	/* XDR encode buffer */ | 
| Chuck Lever | 2bea90d | 2007-03-29 16:47:53 -0400 | [diff] [blame] | 79 | size_t			rq_bufsize, | 
|  | 80 | rq_callsize, | 
|  | 81 | rq_rcvsize; | 
| Chuck Lever | 0210714 | 2006-01-03 09:55:49 +0100 | [diff] [blame] | 82 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 83 | struct xdr_buf		rq_private_buf;		/* The receive buffer | 
|  | 84 | * used in the softirq. | 
|  | 85 | */ | 
|  | 86 | unsigned long		rq_majortimeo;	/* major timeout alarm */ | 
|  | 87 | unsigned long		rq_timeout;	/* Current timeout value */ | 
|  | 88 | unsigned int		rq_retries;	/* # of retries */ | 
| Trond Myklebust | 7c1d71c | 2008-04-17 16:52:57 -0400 | [diff] [blame] | 89 | unsigned int		rq_connect_cookie; | 
|  | 90 | /* A cookie used to track the | 
|  | 91 | state of the transport | 
|  | 92 | connection */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 93 |  | 
|  | 94 | /* | 
|  | 95 | * Partial send handling | 
|  | 96 | */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 97 | u32			rq_bytes_sent;	/* Bytes we have sent */ | 
|  | 98 |  | 
|  | 99 | unsigned long		rq_xtime;	/* when transmitted */ | 
|  | 100 | int			rq_ntrans; | 
|  | 101 | }; | 
|  | 102 | #define rq_svec			rq_snd_buf.head | 
|  | 103 | #define rq_slen			rq_snd_buf.len | 
|  | 104 |  | 
| Chuck Lever | a246b01 | 2005-08-11 16:25:23 -0400 | [diff] [blame] | 105 | struct rpc_xprt_ops { | 
| Chuck Lever | 470056c | 2005-08-25 16:25:56 -0700 | [diff] [blame] | 106 | void		(*set_buffer_size)(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize); | 
| Chuck Lever | 12a8046 | 2005-08-25 16:25:51 -0700 | [diff] [blame] | 107 | int		(*reserve_xprt)(struct rpc_task *task); | 
| Chuck Lever | 49e9a89 | 2005-08-25 16:25:51 -0700 | [diff] [blame] | 108 | void		(*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); | 
| Chuck Lever | bbf7c1d | 2006-08-22 20:06:16 -0400 | [diff] [blame] | 109 | void		(*rpcbind)(struct rpc_task *task); | 
| Chuck Lever | 9220041 | 2006-01-03 09:55:51 +0100 | [diff] [blame] | 110 | void		(*set_port)(struct rpc_xprt *xprt, unsigned short port); | 
| Chuck Lever | a246b01 | 2005-08-11 16:25:23 -0400 | [diff] [blame] | 111 | void		(*connect)(struct rpc_task *task); | 
| Chuck Lever | 0210714 | 2006-01-03 09:55:49 +0100 | [diff] [blame] | 112 | void *		(*buf_alloc)(struct rpc_task *task, size_t size); | 
| Chuck Lever | c5a4dd8 | 2007-03-29 16:47:58 -0400 | [diff] [blame] | 113 | void		(*buf_free)(void *buffer); | 
| Chuck Lever | a246b01 | 2005-08-11 16:25:23 -0400 | [diff] [blame] | 114 | int		(*send_request)(struct rpc_task *task); | 
| Chuck Lever | fe3aca2 | 2005-08-25 16:25:50 -0700 | [diff] [blame] | 115 | void		(*set_retrans_timeout)(struct rpc_task *task); | 
| Chuck Lever | 46c0ee8 | 2005-08-25 16:25:52 -0700 | [diff] [blame] | 116 | void		(*timer)(struct rpc_task *task); | 
| Chuck Lever | a58dd39 | 2005-08-25 16:25:53 -0700 | [diff] [blame] | 117 | void		(*release_request)(struct rpc_task *task); | 
| Chuck Lever | a246b01 | 2005-08-11 16:25:23 -0400 | [diff] [blame] | 118 | void		(*close)(struct rpc_xprt *xprt); | 
|  | 119 | void		(*destroy)(struct rpc_xprt *xprt); | 
| Chuck Lever | 262ca07 | 2006-03-20 13:44:16 -0500 | [diff] [blame] | 120 | void		(*print_stats)(struct rpc_xprt *xprt, struct seq_file *seq); | 
| Chuck Lever | a246b01 | 2005-08-11 16:25:23 -0400 | [diff] [blame] | 121 | }; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 122 |  | 
|  | 123 | struct rpc_xprt { | 
| Trond Myklebust | 6b6ca86 | 2006-09-05 12:55:57 -0400 | [diff] [blame] | 124 | struct kref		kref;		/* Reference count */ | 
| Chuck Lever | a246b01 | 2005-08-11 16:25:23 -0400 | [diff] [blame] | 125 | struct rpc_xprt_ops *	ops;		/* transport methods */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 126 |  | 
| Trond Myklebust | ba7392b | 2007-12-20 16:03:55 -0500 | [diff] [blame] | 127 | const struct rpc_timeout *timeout;	/* timeout parms */ | 
| Chuck Lever | c4efcb1 | 2006-08-22 20:06:19 -0400 | [diff] [blame] | 128 | struct sockaddr_storage	addr;		/* server address */ | 
|  | 129 | size_t			addrlen;	/* size of server address */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 130 | int			prot;		/* IP protocol */ | 
|  | 131 |  | 
|  | 132 | unsigned long		cong;		/* current congestion */ | 
|  | 133 | unsigned long		cwnd;		/* congestion window */ | 
|  | 134 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 135 | size_t			max_payload;	/* largest RPC payload size, | 
|  | 136 | in bytes */ | 
| Chuck Lever | 808012f | 2005-08-25 16:25:49 -0700 | [diff] [blame] | 137 | unsigned int		tsh_size;	/* size of transport specific | 
|  | 138 | header */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 139 |  | 
| Chuck Lever | 4a68179 | 2006-08-22 20:06:15 -0400 | [diff] [blame] | 140 | struct rpc_wait_queue	binding;	/* requests waiting on rpcbind */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 141 | struct rpc_wait_queue	sending;	/* requests waiting to send */ | 
|  | 142 | struct rpc_wait_queue	resend;		/* requests waiting to resend */ | 
|  | 143 | struct rpc_wait_queue	pending;	/* requests in flight */ | 
|  | 144 | struct rpc_wait_queue	backlog;	/* waiting for slot */ | 
|  | 145 | struct list_head	free;		/* free slots */ | 
|  | 146 | struct rpc_rqst *	slot;		/* slot table storage */ | 
|  | 147 | unsigned int		max_reqs;	/* total slots */ | 
| Chuck Lever | 2226feb | 2005-08-11 16:25:38 -0400 | [diff] [blame] | 148 | unsigned long		state;		/* transport state */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 149 | unsigned char		shutdown   : 1,	/* being shut down */ | 
| Chuck Lever | 43118c2 | 2005-08-25 16:25:49 -0700 | [diff] [blame] | 150 | resvport   : 1; /* use a reserved port */ | 
| Chuck Lever | a509050 | 2007-03-29 16:48:04 -0400 | [diff] [blame] | 151 | unsigned int		bind_index;	/* bind function index */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 152 |  | 
|  | 153 | /* | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 154 | * Connection of transports | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 155 | */ | 
| Chuck Lever | 03bf4b7 | 2005-08-25 16:25:55 -0700 | [diff] [blame] | 156 | unsigned long		connect_timeout, | 
|  | 157 | bind_timeout, | 
|  | 158 | reestablish_timeout; | 
| Trond Myklebust | 7c1d71c | 2008-04-17 16:52:57 -0400 | [diff] [blame] | 159 | unsigned int		connect_cookie;	/* A cookie that gets bumped | 
|  | 160 | every time the transport | 
|  | 161 | is reconnected */ | 
| Chuck Lever | 03bf4b7 | 2005-08-25 16:25:55 -0700 | [diff] [blame] | 162 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 163 | /* | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 164 | * Disconnection of idle transports | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 165 | */ | 
|  | 166 | struct work_struct	task_cleanup; | 
|  | 167 | struct timer_list	timer; | 
| Chuck Lever | 03bf4b7 | 2005-08-25 16:25:55 -0700 | [diff] [blame] | 168 | unsigned long		last_used, | 
|  | 169 | idle_timeout; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 170 |  | 
|  | 171 | /* | 
|  | 172 | * Send stuff | 
|  | 173 | */ | 
| Chuck Lever | 4a0f8c0 | 2005-08-11 16:25:32 -0400 | [diff] [blame] | 174 | spinlock_t		transport_lock;	/* lock transport info */ | 
| Chuck Lever | 5dc0772 | 2005-08-11 16:25:35 -0400 | [diff] [blame] | 175 | spinlock_t		reserve_lock;	/* lock slot table */ | 
| Chuck Lever | e744cf2 | 2006-10-17 14:44:24 -0400 | [diff] [blame] | 176 | u32			xid;		/* Next XID value to use */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 177 | struct rpc_task *	snd_task;	/* Task blocked in send */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 178 | struct list_head	recv; | 
|  | 179 |  | 
| Chuck Lever | 262ca07 | 2006-03-20 13:44:16 -0500 | [diff] [blame] | 180 | struct { | 
|  | 181 | unsigned long		bind_count,	/* total number of binds */ | 
|  | 182 | connect_count,	/* total number of connects */ | 
|  | 183 | connect_start,	/* connect start timestamp */ | 
|  | 184 | connect_time,	/* jiffies waiting for connect */ | 
|  | 185 | sends,		/* how many complete requests */ | 
|  | 186 | recvs,		/* how many complete requests */ | 
|  | 187 | bad_xids;	/* lookup_rqst didn't find XID */ | 
|  | 188 |  | 
|  | 189 | unsigned long long	req_u,		/* average requests on the wire */ | 
|  | 190 | bklog_u;	/* backlog queue utilization */ | 
|  | 191 | } stat; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 192 |  | 
| Chuck Lever | b454ae9 | 2008-01-07 18:34:48 -0500 | [diff] [blame] | 193 | const char		*address_strings[RPC_DISPLAY_MAX]; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 194 | }; | 
|  | 195 |  | 
| \"Talpey, Thomas\ | 3c341b0 | 2007-09-10 13:47:07 -0400 | [diff] [blame] | 196 | struct xprt_create { | 
| \"Talpey, Thomas\ | 4fa016e | 2007-09-10 13:47:57 -0400 | [diff] [blame] | 197 | int			ident;		/* XPRT_TRANSPORT identifier */ | 
| Frank van Maarseveen | d3bc9a1 | 2007-07-09 22:23:35 +0200 | [diff] [blame] | 198 | struct sockaddr *	srcaddr;	/* optional local address */ | 
| Frank van Maarseveen | 96802a0 | 2007-07-08 13:08:54 +0200 | [diff] [blame] | 199 | struct sockaddr *	dstaddr;	/* remote peer address */ | 
|  | 200 | size_t			addrlen; | 
| Frank van Maarseveen | 96802a0 | 2007-07-08 13:08:54 +0200 | [diff] [blame] | 201 | }; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 202 |  | 
| \"Talpey, Thomas\ | 81c098a | 2007-09-10 13:46:00 -0400 | [diff] [blame] | 203 | struct xprt_class { | 
|  | 204 | struct list_head	list; | 
| \"Talpey, Thomas\ | 4fa016e | 2007-09-10 13:47:57 -0400 | [diff] [blame] | 205 | int			ident;		/* XPRT_TRANSPORT identifier */ | 
| \"Talpey, Thomas\ | 3c341b0 | 2007-09-10 13:47:07 -0400 | [diff] [blame] | 206 | struct rpc_xprt *	(*setup)(struct xprt_create *); | 
| \"Talpey, Thomas\ | 81c098a | 2007-09-10 13:46:00 -0400 | [diff] [blame] | 207 | struct module		*owner; | 
|  | 208 | char			name[32]; | 
|  | 209 | }; | 
|  | 210 |  | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 211 | /* | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 212 | * Generic internal transport functions | 
|  | 213 | */ | 
| \"Talpey, Thomas\ | 3c341b0 | 2007-09-10 13:47:07 -0400 | [diff] [blame] | 214 | struct rpc_xprt		*xprt_create_transport(struct xprt_create *args); | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 215 | void			xprt_connect(struct rpc_task *task); | 
|  | 216 | void			xprt_reserve(struct rpc_task *task); | 
| Chuck Lever | 12a8046 | 2005-08-25 16:25:51 -0700 | [diff] [blame] | 217 | int			xprt_reserve_xprt(struct rpc_task *task); | 
|  | 218 | int			xprt_reserve_xprt_cong(struct rpc_task *task); | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 219 | int			xprt_prepare_transmit(struct rpc_task *task); | 
|  | 220 | void			xprt_transmit(struct rpc_task *task); | 
| Trond Myklebust | e0ab53d | 2006-07-27 17:22:50 -0400 | [diff] [blame] | 221 | void			xprt_end_transmit(struct rpc_task *task); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 222 | int			xprt_adjust_timeout(struct rpc_rqst *req); | 
| Chuck Lever | 49e9a89 | 2005-08-25 16:25:51 -0700 | [diff] [blame] | 223 | void			xprt_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task); | 
|  | 224 | void			xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 225 | void			xprt_release(struct rpc_task *task); | 
| Trond Myklebust | 6b6ca86 | 2006-09-05 12:55:57 -0400 | [diff] [blame] | 226 | struct rpc_xprt *	xprt_get(struct rpc_xprt *xprt); | 
|  | 227 | void			xprt_put(struct rpc_xprt *xprt); | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 228 |  | 
| Alexey Dobriyan | d8ed029 | 2006-09-26 22:29:38 -0700 | [diff] [blame] | 229 | static inline __be32 *xprt_skip_transport_header(struct rpc_xprt *xprt, __be32 *p) | 
| Chuck Lever | 808012f | 2005-08-25 16:25:49 -0700 | [diff] [blame] | 230 | { | 
|  | 231 | return p + xprt->tsh_size; | 
|  | 232 | } | 
|  | 233 |  | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 234 | /* | 
|  | 235 | * Transport switch helper functions | 
|  | 236 | */ | 
| \"Talpey, Thomas\ | 81c098a | 2007-09-10 13:46:00 -0400 | [diff] [blame] | 237 | int			xprt_register_transport(struct xprt_class *type); | 
|  | 238 | int			xprt_unregister_transport(struct xprt_class *type); | 
| Chuck Lever | fe3aca2 | 2005-08-25 16:25:50 -0700 | [diff] [blame] | 239 | void			xprt_set_retrans_timeout_def(struct rpc_task *task); | 
|  | 240 | void			xprt_set_retrans_timeout_rtt(struct rpc_task *task); | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 241 | void			xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status); | 
| Trond Myklebust | b6ddf64 | 2008-04-17 18:52:19 -0400 | [diff] [blame] | 242 | void			xprt_wait_for_buffer_space(struct rpc_task *task, rpc_action action); | 
| Chuck Lever | c7b2cae | 2005-08-11 16:25:50 -0400 | [diff] [blame] | 243 | void			xprt_write_space(struct rpc_xprt *xprt); | 
| Chuck Lever | 1570c1e | 2005-08-25 16:25:52 -0700 | [diff] [blame] | 244 | void			xprt_update_rtt(struct rpc_task *task); | 
| Chuck Lever | 46c0ee8 | 2005-08-25 16:25:52 -0700 | [diff] [blame] | 245 | void			xprt_adjust_cwnd(struct rpc_task *task, int result); | 
| Alexey Dobriyan | d8ed029 | 2006-09-26 22:29:38 -0700 | [diff] [blame] | 246 | struct rpc_rqst *	xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid); | 
| Chuck Lever | 1570c1e | 2005-08-25 16:25:52 -0700 | [diff] [blame] | 247 | void			xprt_complete_rqst(struct rpc_task *task, int copied); | 
| Chuck Lever | a58dd39 | 2005-08-25 16:25:53 -0700 | [diff] [blame] | 248 | void			xprt_release_rqst_cong(struct rpc_task *task); | 
| Trond Myklebust | 62da3b2 | 2007-11-06 18:44:20 -0500 | [diff] [blame] | 249 | void			xprt_disconnect_done(struct rpc_xprt *xprt); | 
| Trond Myklebust | 66af1e5 | 2007-11-06 10:18:36 -0500 | [diff] [blame] | 250 | void			xprt_force_disconnect(struct rpc_xprt *xprt); | 
| Trond Myklebust | 7c1d71c | 2008-04-17 16:52:57 -0400 | [diff] [blame] | 251 | void			xprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie); | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 252 |  | 
|  | 253 | /* | 
| Chuck Lever | 2226feb | 2005-08-11 16:25:38 -0400 | [diff] [blame] | 254 | * Reserved bit positions in xprt->state | 
|  | 255 | */ | 
|  | 256 | #define XPRT_LOCKED		(0) | 
|  | 257 | #define XPRT_CONNECTED		(1) | 
|  | 258 | #define XPRT_CONNECTING		(2) | 
| Trond Myklebust | 632e3bd | 2006-01-03 09:55:55 +0100 | [diff] [blame] | 259 | #define XPRT_CLOSE_WAIT		(3) | 
| Chuck Lever | ec739ef | 2006-08-22 20:06:15 -0400 | [diff] [blame] | 260 | #define XPRT_BOUND		(4) | 
| Chuck Lever | 4a68179 | 2006-08-22 20:06:15 -0400 | [diff] [blame] | 261 | #define XPRT_BINDING		(5) | 
| Trond Myklebust | 3b948ae | 2007-11-05 17:42:39 -0500 | [diff] [blame] | 262 | #define XPRT_CLOSING		(6) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 263 |  | 
| Chuck Lever | 2226feb | 2005-08-11 16:25:38 -0400 | [diff] [blame] | 264 | static inline void xprt_set_connected(struct rpc_xprt *xprt) | 
|  | 265 | { | 
|  | 266 | set_bit(XPRT_CONNECTED, &xprt->state); | 
|  | 267 | } | 
|  | 268 |  | 
|  | 269 | static inline void xprt_clear_connected(struct rpc_xprt *xprt) | 
|  | 270 | { | 
|  | 271 | clear_bit(XPRT_CONNECTED, &xprt->state); | 
|  | 272 | } | 
|  | 273 |  | 
|  | 274 | static inline int xprt_connected(struct rpc_xprt *xprt) | 
|  | 275 | { | 
|  | 276 | return test_bit(XPRT_CONNECTED, &xprt->state); | 
|  | 277 | } | 
|  | 278 |  | 
|  | 279 | static inline int xprt_test_and_set_connected(struct rpc_xprt *xprt) | 
|  | 280 | { | 
|  | 281 | return test_and_set_bit(XPRT_CONNECTED, &xprt->state); | 
|  | 282 | } | 
|  | 283 |  | 
|  | 284 | static inline int xprt_test_and_clear_connected(struct rpc_xprt *xprt) | 
|  | 285 | { | 
|  | 286 | return test_and_clear_bit(XPRT_CONNECTED, &xprt->state); | 
|  | 287 | } | 
|  | 288 |  | 
|  | 289 | static inline void xprt_clear_connecting(struct rpc_xprt *xprt) | 
|  | 290 | { | 
|  | 291 | smp_mb__before_clear_bit(); | 
|  | 292 | clear_bit(XPRT_CONNECTING, &xprt->state); | 
|  | 293 | smp_mb__after_clear_bit(); | 
|  | 294 | } | 
|  | 295 |  | 
|  | 296 | static inline int xprt_connecting(struct rpc_xprt *xprt) | 
|  | 297 | { | 
|  | 298 | return test_bit(XPRT_CONNECTING, &xprt->state); | 
|  | 299 | } | 
|  | 300 |  | 
|  | 301 | static inline int xprt_test_and_set_connecting(struct rpc_xprt *xprt) | 
|  | 302 | { | 
|  | 303 | return test_and_set_bit(XPRT_CONNECTING, &xprt->state); | 
|  | 304 | } | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 305 |  | 
| Chuck Lever | ec739ef | 2006-08-22 20:06:15 -0400 | [diff] [blame] | 306 | static inline void xprt_set_bound(struct rpc_xprt *xprt) | 
|  | 307 | { | 
|  | 308 | test_and_set_bit(XPRT_BOUND, &xprt->state); | 
|  | 309 | } | 
|  | 310 |  | 
|  | 311 | static inline int xprt_bound(struct rpc_xprt *xprt) | 
|  | 312 | { | 
|  | 313 | return test_bit(XPRT_BOUND, &xprt->state); | 
|  | 314 | } | 
|  | 315 |  | 
|  | 316 | static inline void xprt_clear_bound(struct rpc_xprt *xprt) | 
|  | 317 | { | 
|  | 318 | clear_bit(XPRT_BOUND, &xprt->state); | 
|  | 319 | } | 
|  | 320 |  | 
| Chuck Lever | 4a68179 | 2006-08-22 20:06:15 -0400 | [diff] [blame] | 321 | static inline void xprt_clear_binding(struct rpc_xprt *xprt) | 
|  | 322 | { | 
|  | 323 | smp_mb__before_clear_bit(); | 
|  | 324 | clear_bit(XPRT_BINDING, &xprt->state); | 
|  | 325 | smp_mb__after_clear_bit(); | 
|  | 326 | } | 
|  | 327 |  | 
|  | 328 | static inline int xprt_test_and_set_binding(struct rpc_xprt *xprt) | 
|  | 329 | { | 
|  | 330 | return test_and_set_bit(XPRT_BINDING, &xprt->state); | 
|  | 331 | } | 
|  | 332 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 333 | #endif /* __KERNEL__*/ | 
|  | 334 |  | 
|  | 335 | #endif /* _LINUX_SUNRPC_XPRT_H */ |