| 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> | 
| Chuck Lever | ff83997 | 2010-05-07 13:34:47 -0400 | [diff] [blame] | 15 | #include <linux/ktime.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) | 
| Trond Myklebust | d9ba131 | 2011-07-17 18:11:30 -0400 | [diff] [blame] | 24 | #define RPC_MAX_SLOT_TABLE_LIMIT	(65536U) | 
| Trond Myklebust | 8833812 | 2012-02-06 15:18:48 -0500 | [diff] [blame] | 25 | #define RPC_MAX_SLOT_TABLE	RPC_MAX_SLOT_TABLE_LIMIT | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 26 |  | 
| Chuck Lever | a246b01 | 2005-08-11 16:25:23 -0400 | [diff] [blame] | 27 | /* | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 28 | * This describes a timeout strategy | 
|  | 29 | */ | 
|  | 30 | struct rpc_timeout { | 
|  | 31 | unsigned long		to_initval,		/* initial timeout */ | 
|  | 32 | to_maxval,		/* max timeout */ | 
|  | 33 | to_increment;		/* if !exponential */ | 
|  | 34 | unsigned int		to_retries;		/* max # of retries */ | 
|  | 35 | unsigned char		to_exponential; | 
|  | 36 | }; | 
|  | 37 |  | 
| Chuck Lever | edb267a | 2006-08-22 20:06:18 -0400 | [diff] [blame] | 38 | enum rpc_display_format_t { | 
|  | 39 | RPC_DISPLAY_ADDR = 0, | 
|  | 40 | RPC_DISPLAY_PORT, | 
|  | 41 | RPC_DISPLAY_PROTO, | 
| Chuck Lever | fbfe3cc | 2007-08-06 11:57:02 -0400 | [diff] [blame] | 42 | RPC_DISPLAY_HEX_ADDR, | 
|  | 43 | RPC_DISPLAY_HEX_PORT, | 
| \"Talpey, Thomas\ | 4417c8c | 2007-09-10 13:43:05 -0400 | [diff] [blame] | 44 | RPC_DISPLAY_NETID, | 
| Chuck Lever | edb267a | 2006-08-22 20:06:18 -0400 | [diff] [blame] | 45 | RPC_DISPLAY_MAX, | 
|  | 46 | }; | 
|  | 47 |  | 
| Chuck Lever | 529b33c | 2005-08-25 16:25:54 -0700 | [diff] [blame] | 48 | struct rpc_task; | 
|  | 49 | struct rpc_xprt; | 
| Trond Myklebust | e99170f | 2006-04-18 13:21:42 -0400 | [diff] [blame] | 50 | struct seq_file; | 
| Chuck Lever | 529b33c | 2005-08-25 16:25:54 -0700 | [diff] [blame] | 51 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 52 | /* | 
|  | 53 | * This describes a complete RPC request | 
|  | 54 | */ | 
|  | 55 | struct rpc_rqst { | 
|  | 56 | /* | 
|  | 57 | * This is the user-visible part | 
|  | 58 | */ | 
|  | 59 | struct rpc_xprt *	rq_xprt;		/* RPC client */ | 
|  | 60 | struct xdr_buf		rq_snd_buf;		/* send buffer */ | 
|  | 61 | struct xdr_buf		rq_rcv_buf;		/* recv buffer */ | 
|  | 62 |  | 
|  | 63 | /* | 
|  | 64 | * This is the private part | 
|  | 65 | */ | 
|  | 66 | struct rpc_task *	rq_task;	/* RPC task data */ | 
| Trond Myklebust | a17c215 | 2010-07-31 14:29:08 -0400 | [diff] [blame] | 67 | struct rpc_cred *	rq_cred;	/* Bound cred */ | 
| 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 */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 70 | u32			rq_seqno;	/* gss seq no. used on req. */ | 
| J. Bruce Fields | ead5e1c | 2005-10-13 16:54:43 -0400 | [diff] [blame] | 71 | int			rq_enc_pages_num; | 
|  | 72 | struct page		**rq_enc_pages;	/* scratch pages for use by | 
|  | 73 | gss privacy code */ | 
|  | 74 | void (*rq_release_snd_buf)(struct rpc_rqst *); /* release rq_enc_pages */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 75 | struct list_head	rq_list; | 
|  | 76 |  | 
| Chuck Lever | 0210714 | 2006-01-03 09:55:49 +0100 | [diff] [blame] | 77 | __u32 *			rq_buffer;	/* XDR encode buffer */ | 
| Benny Halevy | c977a2e | 2008-12-23 16:06:13 -0500 | [diff] [blame] | 78 | size_t			rq_callsize, | 
| Chuck Lever | 2bea90d | 2007-03-29 16:47:53 -0400 | [diff] [blame] | 79 | rq_rcvsize; | 
| Trond Myklebust | d60dbb2 | 2010-05-13 12:51:49 -0400 | [diff] [blame] | 80 | size_t			rq_xmit_bytes_sent;	/* total bytes sent */ | 
|  | 81 | size_t			rq_reply_bytes_recvd;	/* total reply bytes */ | 
|  | 82 | /* received */ | 
| Chuck Lever | 0210714 | 2006-01-03 09:55:49 +0100 | [diff] [blame] | 83 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 84 | struct xdr_buf		rq_private_buf;		/* The receive buffer | 
|  | 85 | * used in the softirq. | 
|  | 86 | */ | 
|  | 87 | unsigned long		rq_majortimeo;	/* major timeout alarm */ | 
|  | 88 | unsigned long		rq_timeout;	/* Current timeout value */ | 
| Trond Myklebust | d60dbb2 | 2010-05-13 12:51:49 -0400 | [diff] [blame] | 89 | ktime_t			rq_rtt;		/* round-trip time */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 90 | unsigned int		rq_retries;	/* # of retries */ | 
| Trond Myklebust | 7c1d71c | 2008-04-17 16:52:57 -0400 | [diff] [blame] | 91 | unsigned int		rq_connect_cookie; | 
|  | 92 | /* A cookie used to track the | 
|  | 93 | state of the transport | 
|  | 94 | connection */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 95 |  | 
|  | 96 | /* | 
|  | 97 | * Partial send handling | 
|  | 98 | */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 99 | u32			rq_bytes_sent;	/* Bytes we have sent */ | 
|  | 100 |  | 
| Chuck Lever | ff83997 | 2010-05-07 13:34:47 -0400 | [diff] [blame] | 101 | ktime_t			rq_xtime;	/* transmit time stamp */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 102 | int			rq_ntrans; | 
| Ricardo Labiaga | 56632b5 | 2009-04-01 09:22:58 -0400 | [diff] [blame] | 103 |  | 
| Trond Myklebust | 9e00abc | 2011-07-13 19:20:49 -0400 | [diff] [blame] | 104 | #if defined(CONFIG_SUNRPC_BACKCHANNEL) | 
| Ricardo Labiaga | 56632b5 | 2009-04-01 09:22:58 -0400 | [diff] [blame] | 105 | struct list_head	rq_bc_list;	/* Callback service list */ | 
|  | 106 | unsigned long		rq_bc_pa_state;	/* Backchannel prealloc state */ | 
|  | 107 | struct list_head	rq_bc_pa_list;	/* Backchannel prealloc list */ | 
| Trond Myklebust | 9e00abc | 2011-07-13 19:20:49 -0400 | [diff] [blame] | 108 | #endif /* CONFIG_SUNRPC_BACKCHANEL */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 109 | }; | 
|  | 110 | #define rq_svec			rq_snd_buf.head | 
|  | 111 | #define rq_slen			rq_snd_buf.len | 
|  | 112 |  | 
| Chuck Lever | a246b01 | 2005-08-11 16:25:23 -0400 | [diff] [blame] | 113 | struct rpc_xprt_ops { | 
| Chuck Lever | 470056c | 2005-08-25 16:25:56 -0700 | [diff] [blame] | 114 | void		(*set_buffer_size)(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize); | 
| Trond Myklebust | 43cedbf | 2011-07-17 16:01:03 -0400 | [diff] [blame] | 115 | int		(*reserve_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); | 
| Chuck Lever | 49e9a89 | 2005-08-25 16:25:51 -0700 | [diff] [blame] | 116 | void		(*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); | 
| Chuck Lever | bbf7c1d | 2006-08-22 20:06:16 -0400 | [diff] [blame] | 117 | void		(*rpcbind)(struct rpc_task *task); | 
| Chuck Lever | 9220041 | 2006-01-03 09:55:51 +0100 | [diff] [blame] | 118 | void		(*set_port)(struct rpc_xprt *xprt, unsigned short port); | 
| Chuck Lever | a246b01 | 2005-08-11 16:25:23 -0400 | [diff] [blame] | 119 | void		(*connect)(struct rpc_task *task); | 
| Chuck Lever | 0210714 | 2006-01-03 09:55:49 +0100 | [diff] [blame] | 120 | void *		(*buf_alloc)(struct rpc_task *task, size_t size); | 
| Chuck Lever | c5a4dd8 | 2007-03-29 16:47:58 -0400 | [diff] [blame] | 121 | void		(*buf_free)(void *buffer); | 
| Chuck Lever | a246b01 | 2005-08-11 16:25:23 -0400 | [diff] [blame] | 122 | int		(*send_request)(struct rpc_task *task); | 
| Chuck Lever | fe3aca2 | 2005-08-25 16:25:50 -0700 | [diff] [blame] | 123 | void		(*set_retrans_timeout)(struct rpc_task *task); | 
| Chuck Lever | 46c0ee8 | 2005-08-25 16:25:52 -0700 | [diff] [blame] | 124 | void		(*timer)(struct rpc_task *task); | 
| Chuck Lever | a58dd39 | 2005-08-25 16:25:53 -0700 | [diff] [blame] | 125 | void		(*release_request)(struct rpc_task *task); | 
| Chuck Lever | a246b01 | 2005-08-11 16:25:23 -0400 | [diff] [blame] | 126 | void		(*close)(struct rpc_xprt *xprt); | 
|  | 127 | void		(*destroy)(struct rpc_xprt *xprt); | 
| Chuck Lever | 262ca07 | 2006-03-20 13:44:16 -0500 | [diff] [blame] | 128 | void		(*print_stats)(struct rpc_xprt *xprt, struct seq_file *seq); | 
| Chuck Lever | a246b01 | 2005-08-11 16:25:23 -0400 | [diff] [blame] | 129 | }; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 130 |  | 
| Alexandros Batsakis | f300bab | 2009-09-10 17:33:30 +0300 | [diff] [blame] | 131 | /* | 
|  | 132 | * RPC transport identifiers | 
|  | 133 | * | 
|  | 134 | * To preserve compatibility with the historical use of raw IP protocol | 
|  | 135 | * id's for transport selection, UDP and TCP identifiers are specified | 
|  | 136 | * with the previous values. No such restriction exists for new transports, | 
|  | 137 | * except that they may not collide with these values (17 and 6, | 
|  | 138 | * respectively). | 
|  | 139 | */ | 
|  | 140 | #define XPRT_TRANSPORT_BC       (1 << 31) | 
|  | 141 | enum xprt_transports { | 
|  | 142 | XPRT_TRANSPORT_UDP	= IPPROTO_UDP, | 
|  | 143 | XPRT_TRANSPORT_TCP	= IPPROTO_TCP, | 
|  | 144 | XPRT_TRANSPORT_BC_TCP	= IPPROTO_TCP | XPRT_TRANSPORT_BC, | 
| Chuck Lever | 176e21e | 2011-05-09 15:22:44 -0400 | [diff] [blame] | 145 | XPRT_TRANSPORT_RDMA	= 256, | 
|  | 146 | XPRT_TRANSPORT_LOCAL	= 257, | 
| Alexandros Batsakis | f300bab | 2009-09-10 17:33:30 +0300 | [diff] [blame] | 147 | }; | 
|  | 148 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 149 | struct rpc_xprt { | 
| Trond Myklebust | a8de240 | 2011-03-15 19:56:30 -0400 | [diff] [blame] | 150 | atomic_t		count;		/* Reference count */ | 
| Chuck Lever | a246b01 | 2005-08-11 16:25:23 -0400 | [diff] [blame] | 151 | struct rpc_xprt_ops *	ops;		/* transport methods */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 152 |  | 
| Trond Myklebust | ba7392b | 2007-12-20 16:03:55 -0500 | [diff] [blame] | 153 | const struct rpc_timeout *timeout;	/* timeout parms */ | 
| Chuck Lever | c4efcb1 | 2006-08-22 20:06:19 -0400 | [diff] [blame] | 154 | struct sockaddr_storage	addr;		/* server address */ | 
|  | 155 | size_t			addrlen;	/* size of server address */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 156 | int			prot;		/* IP protocol */ | 
|  | 157 |  | 
|  | 158 | unsigned long		cong;		/* current congestion */ | 
|  | 159 | unsigned long		cwnd;		/* congestion window */ | 
|  | 160 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 161 | size_t			max_payload;	/* largest RPC payload size, | 
|  | 162 | in bytes */ | 
| Chuck Lever | 808012f | 2005-08-25 16:25:49 -0700 | [diff] [blame] | 163 | unsigned int		tsh_size;	/* size of transport specific | 
|  | 164 | header */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 165 |  | 
| Chuck Lever | 4a68179 | 2006-08-22 20:06:15 -0400 | [diff] [blame] | 166 | struct rpc_wait_queue	binding;	/* requests waiting on rpcbind */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 167 | struct rpc_wait_queue	sending;	/* requests waiting to send */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 168 | struct rpc_wait_queue	pending;	/* requests in flight */ | 
|  | 169 | struct rpc_wait_queue	backlog;	/* waiting for slot */ | 
|  | 170 | struct list_head	free;		/* free slots */ | 
| Trond Myklebust | d9ba131 | 2011-07-17 18:11:30 -0400 | [diff] [blame] | 171 | unsigned int		max_reqs;	/* max number of slots */ | 
|  | 172 | unsigned int		min_reqs;	/* min number of slots */ | 
|  | 173 | atomic_t		num_reqs;	/* total slots */ | 
| Chuck Lever | 2226feb | 2005-08-11 16:25:38 -0400 | [diff] [blame] | 174 | unsigned long		state;		/* transport state */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 175 | unsigned char		shutdown   : 1,	/* being shut down */ | 
| Chuck Lever | 43118c2 | 2005-08-25 16:25:49 -0700 | [diff] [blame] | 176 | resvport   : 1; /* use a reserved port */ | 
| Chuck Lever | a509050 | 2007-03-29 16:48:04 -0400 | [diff] [blame] | 177 | unsigned int		bind_index;	/* bind function index */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 178 |  | 
|  | 179 | /* | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 180 | * Connection of transports | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 181 | */ | 
| Trond Myklebust | a8ce4a8 | 2010-04-16 16:42:12 -0400 | [diff] [blame] | 182 | unsigned long		bind_timeout, | 
| Chuck Lever | 03bf4b7 | 2005-08-25 16:25:55 -0700 | [diff] [blame] | 183 | reestablish_timeout; | 
| Trond Myklebust | 7c1d71c | 2008-04-17 16:52:57 -0400 | [diff] [blame] | 184 | unsigned int		connect_cookie;	/* A cookie that gets bumped | 
|  | 185 | every time the transport | 
|  | 186 | is reconnected */ | 
| Chuck Lever | 03bf4b7 | 2005-08-25 16:25:55 -0700 | [diff] [blame] | 187 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 188 | /* | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 189 | * Disconnection of idle transports | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 190 | */ | 
|  | 191 | struct work_struct	task_cleanup; | 
|  | 192 | struct timer_list	timer; | 
| Chuck Lever | 03bf4b7 | 2005-08-25 16:25:55 -0700 | [diff] [blame] | 193 | unsigned long		last_used, | 
|  | 194 | idle_timeout; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 195 |  | 
|  | 196 | /* | 
|  | 197 | * Send stuff | 
|  | 198 | */ | 
| Chuck Lever | 4a0f8c0 | 2005-08-11 16:25:32 -0400 | [diff] [blame] | 199 | spinlock_t		transport_lock;	/* lock transport info */ | 
| Chuck Lever | 5dc0772 | 2005-08-11 16:25:35 -0400 | [diff] [blame] | 200 | spinlock_t		reserve_lock;	/* lock slot table */ | 
| Chuck Lever | e744cf2 | 2006-10-17 14:44:24 -0400 | [diff] [blame] | 201 | u32			xid;		/* Next XID value to use */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 202 | struct rpc_task *	snd_task;	/* Task blocked in send */ | 
| Rahul Iyer | 4cfc7e6 | 2009-09-10 17:32:28 +0300 | [diff] [blame] | 203 | struct svc_xprt		*bc_xprt;	/* NFSv4.1 backchannel */ | 
| Trond Myklebust | 9e00abc | 2011-07-13 19:20:49 -0400 | [diff] [blame] | 204 | #if defined(CONFIG_SUNRPC_BACKCHANNEL) | 
| Ricardo Labiaga | 56632b5 | 2009-04-01 09:22:58 -0400 | [diff] [blame] | 205 | struct svc_serv		*bc_serv;       /* The RPC service which will */ | 
|  | 206 | /* process the callback */ | 
| Ricardo Labiaga | fb7a0b9 | 2009-04-01 09:23:00 -0400 | [diff] [blame] | 207 | unsigned int		bc_alloc_count;	/* Total number of preallocs */ | 
| Ricardo Labiaga | 56632b5 | 2009-04-01 09:22:58 -0400 | [diff] [blame] | 208 | spinlock_t		bc_pa_lock;	/* Protects the preallocated | 
|  | 209 | * items */ | 
|  | 210 | struct list_head	bc_pa_list;	/* List of preallocated | 
|  | 211 | * backchannel rpc_rqst's */ | 
| Trond Myklebust | 9e00abc | 2011-07-13 19:20:49 -0400 | [diff] [blame] | 212 | #endif /* CONFIG_SUNRPC_BACKCHANNEL */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 213 | struct list_head	recv; | 
|  | 214 |  | 
| Chuck Lever | 262ca07 | 2006-03-20 13:44:16 -0500 | [diff] [blame] | 215 | struct { | 
|  | 216 | unsigned long		bind_count,	/* total number of binds */ | 
|  | 217 | connect_count,	/* total number of connects */ | 
|  | 218 | connect_start,	/* connect start timestamp */ | 
|  | 219 | connect_time,	/* jiffies waiting for connect */ | 
|  | 220 | sends,		/* how many complete requests */ | 
|  | 221 | recvs,		/* how many complete requests */ | 
| Andy Adamson | 15a4520 | 2012-02-14 16:19:18 -0500 | [diff] [blame] | 222 | bad_xids,	/* lookup_rqst didn't find XID */ | 
|  | 223 | max_slots;	/* max rpc_slots used */ | 
| Chuck Lever | 262ca07 | 2006-03-20 13:44:16 -0500 | [diff] [blame] | 224 |  | 
|  | 225 | unsigned long long	req_u,		/* average requests on the wire */ | 
| Andy Adamson | 15a4520 | 2012-02-14 16:19:18 -0500 | [diff] [blame] | 226 | bklog_u,	/* backlog queue utilization */ | 
|  | 227 | sending_u,	/* send q utilization */ | 
|  | 228 | pending_u;	/* pend q utilization */ | 
| Chuck Lever | 262ca07 | 2006-03-20 13:44:16 -0500 | [diff] [blame] | 229 | } stat; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 230 |  | 
| Pavel Emelyanov | 37aa213 | 2010-09-29 16:05:43 +0400 | [diff] [blame] | 231 | struct net		*xprt_net; | 
| Trond Myklebust | 4e0038b | 2012-03-01 17:01:05 -0500 | [diff] [blame] | 232 | const char		*servername; | 
| Chuck Lever | b454ae9 | 2008-01-07 18:34:48 -0500 | [diff] [blame] | 233 | const char		*address_strings[RPC_DISPLAY_MAX]; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 234 | }; | 
|  | 235 |  | 
| Trond Myklebust | 9e00abc | 2011-07-13 19:20:49 -0400 | [diff] [blame] | 236 | #if defined(CONFIG_SUNRPC_BACKCHANNEL) | 
| Ricardo Labiaga | 56632b5 | 2009-04-01 09:22:58 -0400 | [diff] [blame] | 237 | /* | 
|  | 238 | * Backchannel flags | 
|  | 239 | */ | 
|  | 240 | #define	RPC_BC_PA_IN_USE	0x0001		/* Preallocated backchannel */ | 
|  | 241 | /* buffer in use */ | 
| Trond Myklebust | 9e00abc | 2011-07-13 19:20:49 -0400 | [diff] [blame] | 242 | #endif /* CONFIG_SUNRPC_BACKCHANNEL */ | 
| Ricardo Labiaga | 56632b5 | 2009-04-01 09:22:58 -0400 | [diff] [blame] | 243 |  | 
| Trond Myklebust | 9e00abc | 2011-07-13 19:20:49 -0400 | [diff] [blame] | 244 | #if defined(CONFIG_SUNRPC_BACKCHANNEL) | 
| Ricardo Labiaga | 55ae1aa | 2009-04-01 09:23:03 -0400 | [diff] [blame] | 245 | static inline int bc_prealloc(struct rpc_rqst *req) | 
|  | 246 | { | 
|  | 247 | return test_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state); | 
|  | 248 | } | 
|  | 249 | #else | 
|  | 250 | static inline int bc_prealloc(struct rpc_rqst *req) | 
|  | 251 | { | 
|  | 252 | return 0; | 
|  | 253 | } | 
| Trond Myklebust | 9e00abc | 2011-07-13 19:20:49 -0400 | [diff] [blame] | 254 | #endif /* CONFIG_SUNRPC_BACKCHANNEL */ | 
| Ricardo Labiaga | 55ae1aa | 2009-04-01 09:23:03 -0400 | [diff] [blame] | 255 |  | 
| \"Talpey, Thomas\ | 3c341b0 | 2007-09-10 13:47:07 -0400 | [diff] [blame] | 256 | struct xprt_create { | 
| \"Talpey, Thomas\ | 4fa016e | 2007-09-10 13:47:57 -0400 | [diff] [blame] | 257 | int			ident;		/* XPRT_TRANSPORT identifier */ | 
| Pavel Emelyanov | 9a23e33 | 2010-09-29 16:05:12 +0400 | [diff] [blame] | 258 | struct net *		net; | 
| Frank van Maarseveen | d3bc9a1 | 2007-07-09 22:23:35 +0200 | [diff] [blame] | 259 | struct sockaddr *	srcaddr;	/* optional local address */ | 
| Frank van Maarseveen | 96802a0 | 2007-07-08 13:08:54 +0200 | [diff] [blame] | 260 | struct sockaddr *	dstaddr;	/* remote peer address */ | 
|  | 261 | size_t			addrlen; | 
| Trond Myklebust | 4e0038b | 2012-03-01 17:01:05 -0500 | [diff] [blame] | 262 | const char		*servername; | 
| Alexandros Batsakis | f300bab | 2009-09-10 17:33:30 +0300 | [diff] [blame] | 263 | struct svc_xprt		*bc_xprt;	/* NFSv4.1 backchannel */ | 
| Frank van Maarseveen | 96802a0 | 2007-07-08 13:08:54 +0200 | [diff] [blame] | 264 | }; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 265 |  | 
| \"Talpey, Thomas\ | 81c098a | 2007-09-10 13:46:00 -0400 | [diff] [blame] | 266 | struct xprt_class { | 
|  | 267 | struct list_head	list; | 
| \"Talpey, Thomas\ | 4fa016e | 2007-09-10 13:47:57 -0400 | [diff] [blame] | 268 | int			ident;		/* XPRT_TRANSPORT identifier */ | 
| \"Talpey, Thomas\ | 3c341b0 | 2007-09-10 13:47:07 -0400 | [diff] [blame] | 269 | struct rpc_xprt *	(*setup)(struct xprt_create *); | 
| \"Talpey, Thomas\ | 81c098a | 2007-09-10 13:46:00 -0400 | [diff] [blame] | 270 | struct module		*owner; | 
|  | 271 | char			name[32]; | 
|  | 272 | }; | 
|  | 273 |  | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 274 | /* | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 275 | * Generic internal transport functions | 
|  | 276 | */ | 
| \"Talpey, Thomas\ | 3c341b0 | 2007-09-10 13:47:07 -0400 | [diff] [blame] | 277 | struct rpc_xprt		*xprt_create_transport(struct xprt_create *args); | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 278 | void			xprt_connect(struct rpc_task *task); | 
|  | 279 | void			xprt_reserve(struct rpc_task *task); | 
| Trond Myklebust | 43cedbf | 2011-07-17 16:01:03 -0400 | [diff] [blame] | 280 | int			xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task); | 
|  | 281 | int			xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 282 | int			xprt_prepare_transmit(struct rpc_task *task); | 
|  | 283 | void			xprt_transmit(struct rpc_task *task); | 
| Trond Myklebust | e0ab53d | 2006-07-27 17:22:50 -0400 | [diff] [blame] | 284 | void			xprt_end_transmit(struct rpc_task *task); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 285 | int			xprt_adjust_timeout(struct rpc_rqst *req); | 
| Chuck Lever | 49e9a89 | 2005-08-25 16:25:51 -0700 | [diff] [blame] | 286 | void			xprt_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task); | 
|  | 287 | 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] | 288 | void			xprt_release(struct rpc_task *task); | 
| Trond Myklebust | 6b6ca86 | 2006-09-05 12:55:57 -0400 | [diff] [blame] | 289 | struct rpc_xprt *	xprt_get(struct rpc_xprt *xprt); | 
|  | 290 | void			xprt_put(struct rpc_xprt *xprt); | 
| Trond Myklebust | d9ba131 | 2011-07-17 18:11:30 -0400 | [diff] [blame] | 291 | struct rpc_xprt *	xprt_alloc(struct net *net, size_t size, | 
|  | 292 | unsigned int num_prealloc, | 
|  | 293 | unsigned int max_req); | 
| Pavel Emelyanov | e204e62 | 2010-09-29 16:03:13 +0400 | [diff] [blame] | 294 | void			xprt_free(struct rpc_xprt *); | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 295 |  | 
| Alexey Dobriyan | d8ed029 | 2006-09-26 22:29:38 -0700 | [diff] [blame] | 296 | 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] | 297 | { | 
|  | 298 | return p + xprt->tsh_size; | 
|  | 299 | } | 
|  | 300 |  | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 301 | /* | 
|  | 302 | * Transport switch helper functions | 
|  | 303 | */ | 
| \"Talpey, Thomas\ | 81c098a | 2007-09-10 13:46:00 -0400 | [diff] [blame] | 304 | int			xprt_register_transport(struct xprt_class *type); | 
|  | 305 | int			xprt_unregister_transport(struct xprt_class *type); | 
| Tom Talpey | 441e3e2 | 2009-03-11 14:37:56 -0400 | [diff] [blame] | 306 | int			xprt_load_transport(const char *); | 
| Chuck Lever | fe3aca2 | 2005-08-25 16:25:50 -0700 | [diff] [blame] | 307 | void			xprt_set_retrans_timeout_def(struct rpc_task *task); | 
|  | 308 | void			xprt_set_retrans_timeout_rtt(struct rpc_task *task); | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 309 | void			xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status); | 
| Trond Myklebust | b6ddf64 | 2008-04-17 18:52:19 -0400 | [diff] [blame] | 310 | 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] | 311 | void			xprt_write_space(struct rpc_xprt *xprt); | 
| Chuck Lever | 46c0ee8 | 2005-08-25 16:25:52 -0700 | [diff] [blame] | 312 | void			xprt_adjust_cwnd(struct rpc_task *task, int result); | 
| Alexey Dobriyan | d8ed029 | 2006-09-26 22:29:38 -0700 | [diff] [blame] | 313 | struct rpc_rqst *	xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid); | 
| Chuck Lever | 1570c1e | 2005-08-25 16:25:52 -0700 | [diff] [blame] | 314 | void			xprt_complete_rqst(struct rpc_task *task, int copied); | 
| Chuck Lever | a58dd39 | 2005-08-25 16:25:53 -0700 | [diff] [blame] | 315 | void			xprt_release_rqst_cong(struct rpc_task *task); | 
| Trond Myklebust | 62da3b2 | 2007-11-06 18:44:20 -0500 | [diff] [blame] | 316 | void			xprt_disconnect_done(struct rpc_xprt *xprt); | 
| Trond Myklebust | 66af1e5 | 2007-11-06 10:18:36 -0500 | [diff] [blame] | 317 | void			xprt_force_disconnect(struct rpc_xprt *xprt); | 
| Trond Myklebust | 7c1d71c | 2008-04-17 16:52:57 -0400 | [diff] [blame] | 318 | void			xprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie); | 
| Chuck Lever | 55aa4f5 | 2005-08-11 16:25:47 -0400 | [diff] [blame] | 319 |  | 
|  | 320 | /* | 
| Chuck Lever | 2226feb | 2005-08-11 16:25:38 -0400 | [diff] [blame] | 321 | * Reserved bit positions in xprt->state | 
|  | 322 | */ | 
|  | 323 | #define XPRT_LOCKED		(0) | 
|  | 324 | #define XPRT_CONNECTED		(1) | 
|  | 325 | #define XPRT_CONNECTING		(2) | 
| Trond Myklebust | 632e3bd | 2006-01-03 09:55:55 +0100 | [diff] [blame] | 326 | #define XPRT_CLOSE_WAIT		(3) | 
| Chuck Lever | ec739ef | 2006-08-22 20:06:15 -0400 | [diff] [blame] | 327 | #define XPRT_BOUND		(4) | 
| Chuck Lever | 4a68179 | 2006-08-22 20:06:15 -0400 | [diff] [blame] | 328 | #define XPRT_BINDING		(5) | 
| Trond Myklebust | 3b948ae | 2007-11-05 17:42:39 -0500 | [diff] [blame] | 329 | #define XPRT_CLOSING		(6) | 
| Trond Myklebust | 7d1e825 | 2009-03-11 14:38:03 -0400 | [diff] [blame] | 330 | #define XPRT_CONNECTION_ABORT	(7) | 
| Trond Myklebust | f75e674 | 2009-04-21 17:18:20 -0400 | [diff] [blame] | 331 | #define XPRT_CONNECTION_CLOSE	(8) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 332 |  | 
| Chuck Lever | 2226feb | 2005-08-11 16:25:38 -0400 | [diff] [blame] | 333 | static inline void xprt_set_connected(struct rpc_xprt *xprt) | 
|  | 334 | { | 
|  | 335 | set_bit(XPRT_CONNECTED, &xprt->state); | 
|  | 336 | } | 
|  | 337 |  | 
|  | 338 | static inline void xprt_clear_connected(struct rpc_xprt *xprt) | 
|  | 339 | { | 
|  | 340 | clear_bit(XPRT_CONNECTED, &xprt->state); | 
|  | 341 | } | 
|  | 342 |  | 
|  | 343 | static inline int xprt_connected(struct rpc_xprt *xprt) | 
|  | 344 | { | 
|  | 345 | return test_bit(XPRT_CONNECTED, &xprt->state); | 
|  | 346 | } | 
|  | 347 |  | 
|  | 348 | static inline int xprt_test_and_set_connected(struct rpc_xprt *xprt) | 
|  | 349 | { | 
|  | 350 | return test_and_set_bit(XPRT_CONNECTED, &xprt->state); | 
|  | 351 | } | 
|  | 352 |  | 
|  | 353 | static inline int xprt_test_and_clear_connected(struct rpc_xprt *xprt) | 
|  | 354 | { | 
|  | 355 | return test_and_clear_bit(XPRT_CONNECTED, &xprt->state); | 
|  | 356 | } | 
|  | 357 |  | 
|  | 358 | static inline void xprt_clear_connecting(struct rpc_xprt *xprt) | 
|  | 359 | { | 
|  | 360 | smp_mb__before_clear_bit(); | 
|  | 361 | clear_bit(XPRT_CONNECTING, &xprt->state); | 
|  | 362 | smp_mb__after_clear_bit(); | 
|  | 363 | } | 
|  | 364 |  | 
|  | 365 | static inline int xprt_connecting(struct rpc_xprt *xprt) | 
|  | 366 | { | 
|  | 367 | return test_bit(XPRT_CONNECTING, &xprt->state); | 
|  | 368 | } | 
|  | 369 |  | 
|  | 370 | static inline int xprt_test_and_set_connecting(struct rpc_xprt *xprt) | 
|  | 371 | { | 
|  | 372 | return test_and_set_bit(XPRT_CONNECTING, &xprt->state); | 
|  | 373 | } | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 374 |  | 
| Chuck Lever | ec739ef | 2006-08-22 20:06:15 -0400 | [diff] [blame] | 375 | static inline void xprt_set_bound(struct rpc_xprt *xprt) | 
|  | 376 | { | 
|  | 377 | test_and_set_bit(XPRT_BOUND, &xprt->state); | 
|  | 378 | } | 
|  | 379 |  | 
|  | 380 | static inline int xprt_bound(struct rpc_xprt *xprt) | 
|  | 381 | { | 
|  | 382 | return test_bit(XPRT_BOUND, &xprt->state); | 
|  | 383 | } | 
|  | 384 |  | 
|  | 385 | static inline void xprt_clear_bound(struct rpc_xprt *xprt) | 
|  | 386 | { | 
|  | 387 | clear_bit(XPRT_BOUND, &xprt->state); | 
|  | 388 | } | 
|  | 389 |  | 
| Chuck Lever | 4a68179 | 2006-08-22 20:06:15 -0400 | [diff] [blame] | 390 | static inline void xprt_clear_binding(struct rpc_xprt *xprt) | 
|  | 391 | { | 
|  | 392 | smp_mb__before_clear_bit(); | 
|  | 393 | clear_bit(XPRT_BINDING, &xprt->state); | 
|  | 394 | smp_mb__after_clear_bit(); | 
|  | 395 | } | 
|  | 396 |  | 
|  | 397 | static inline int xprt_test_and_set_binding(struct rpc_xprt *xprt) | 
|  | 398 | { | 
|  | 399 | return test_and_set_bit(XPRT_BINDING, &xprt->state); | 
|  | 400 | } | 
|  | 401 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 402 | #endif /* __KERNEL__*/ | 
|  | 403 |  | 
|  | 404 | #endif /* _LINUX_SUNRPC_XPRT_H */ |