xprt.h 11.3 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2
 *  linux/include/linux/sunrpc/xprt.h
L
Linus Torvalds 已提交
3 4 5 6 7 8 9 10 11 12 13 14
 *
 *  Declarations for the RPC transport interface.
 *
 *  Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
 */

#ifndef _LINUX_SUNRPC_XPRT_H
#define _LINUX_SUNRPC_XPRT_H

#include <linux/uio.h>
#include <linux/socket.h>
#include <linux/in.h>
15
#include <linux/kref.h>
16
#include <linux/ktime.h>
L
Linus Torvalds 已提交
17 18
#include <linux/sunrpc/sched.h>
#include <linux/sunrpc/xdr.h>
19
#include <linux/sunrpc/msg_prot.h>
L
Linus Torvalds 已提交
20

21 22
#ifdef __KERNEL__

L
Linus Torvalds 已提交
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
#define RPC_MIN_SLOT_TABLE	(2U)
#define RPC_DEF_SLOT_TABLE	(16U)
#define RPC_MAX_SLOT_TABLE	(128U)

/*
 * This describes a timeout strategy
 */
struct rpc_timeout {
	unsigned long		to_initval,		/* initial timeout */
				to_maxval,		/* max timeout */
				to_increment;		/* if !exponential */
	unsigned int		to_retries;		/* max # of retries */
	unsigned char		to_exponential;
};

38 39 40 41
enum rpc_display_format_t {
	RPC_DISPLAY_ADDR = 0,
	RPC_DISPLAY_PORT,
	RPC_DISPLAY_PROTO,
42 43
	RPC_DISPLAY_HEX_ADDR,
	RPC_DISPLAY_HEX_PORT,
44
	RPC_DISPLAY_NETID,
45 46 47
	RPC_DISPLAY_MAX,
};

48 49
struct rpc_task;
struct rpc_xprt;
50
struct seq_file;
51

L
Linus Torvalds 已提交
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
/*
 * This describes a complete RPC request
 */
struct rpc_rqst {
	/*
	 * This is the user-visible part
	 */
	struct rpc_xprt *	rq_xprt;		/* RPC client */
	struct xdr_buf		rq_snd_buf;		/* send buffer */
	struct xdr_buf		rq_rcv_buf;		/* recv buffer */

	/*
	 * This is the private part
	 */
	struct rpc_task *	rq_task;	/* RPC task data */
67
	__be32			rq_xid;		/* request XID */
L
Linus Torvalds 已提交
68
	int			rq_cong;	/* has incremented xprt->cong */
69 70
	int			rq_reply_bytes_recvd;	/* number of reply */
							/* bytes received */
L
Linus Torvalds 已提交
71
	u32			rq_seqno;	/* gss seq no. used on req. */
72 73 74 75
	int			rq_enc_pages_num;
	struct page		**rq_enc_pages;	/* scratch pages for use by
						   gss privacy code */
	void (*rq_release_snd_buf)(struct rpc_rqst *); /* release rq_enc_pages */
L
Linus Torvalds 已提交
76 77
	struct list_head	rq_list;

78
	__u32 *			rq_buffer;	/* XDR encode buffer */
79
	size_t			rq_callsize,
80
				rq_rcvsize;
81

L
Linus Torvalds 已提交
82 83 84 85 86 87
	struct xdr_buf		rq_private_buf;		/* The receive buffer
							 * used in the softirq.
							 */
	unsigned long		rq_majortimeo;	/* major timeout alarm */
	unsigned long		rq_timeout;	/* Current timeout value */
	unsigned int		rq_retries;	/* # of retries */
88 89 90 91
	unsigned int		rq_connect_cookie;
						/* A cookie used to track the
						   state of the transport
						   connection */
L
Linus Torvalds 已提交
92 93 94 95 96 97
	
	/*
	 * Partial send handling
	 */
	u32			rq_bytes_sent;	/* Bytes we have sent */

98
	ktime_t			rq_xtime;	/* transmit time stamp */
L
Linus Torvalds 已提交
99
	int			rq_ntrans;
100 101 102 103 104 105

#if defined(CONFIG_NFS_V4_1)
	struct list_head	rq_bc_list;	/* Callback service list */
	unsigned long		rq_bc_pa_state;	/* Backchannel prealloc state */
	struct list_head	rq_bc_pa_list;	/* Backchannel prealloc list */
#endif /* CONFIG_NFS_V4_1 */
L
Linus Torvalds 已提交
106 107 108 109
};
#define rq_svec			rq_snd_buf.head
#define rq_slen			rq_snd_buf.len

110
struct rpc_xprt_ops {
111
	void		(*set_buffer_size)(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize);
112
	int		(*reserve_xprt)(struct rpc_task *task);
113
	void		(*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
114
	void		(*rpcbind)(struct rpc_task *task);
115
	void		(*set_port)(struct rpc_xprt *xprt, unsigned short port);
116
	void		(*connect)(struct rpc_task *task);
117
	void *		(*buf_alloc)(struct rpc_task *task, size_t size);
118
	void		(*buf_free)(void *buffer);
119
	int		(*send_request)(struct rpc_task *task);
120
	void		(*set_retrans_timeout)(struct rpc_task *task);
121
	void		(*timer)(struct rpc_task *task);
122
	void		(*release_request)(struct rpc_task *task);
123 124
	void		(*close)(struct rpc_xprt *xprt);
	void		(*destroy)(struct rpc_xprt *xprt);
125
	void		(*print_stats)(struct rpc_xprt *xprt, struct seq_file *seq);
126
};
L
Linus Torvalds 已提交
127

128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
/*
 * RPC transport identifiers
 *
 * To preserve compatibility with the historical use of raw IP protocol
 * id's for transport selection, UDP and TCP identifiers are specified
 * with the previous values. No such restriction exists for new transports,
 * except that they may not collide with these values (17 and 6,
 * respectively).
 */
#define XPRT_TRANSPORT_BC       (1 << 31)
enum xprt_transports {
	XPRT_TRANSPORT_UDP	= IPPROTO_UDP,
	XPRT_TRANSPORT_TCP	= IPPROTO_TCP,
	XPRT_TRANSPORT_BC_TCP	= IPPROTO_TCP | XPRT_TRANSPORT_BC,
	XPRT_TRANSPORT_RDMA	= 256
};

L
Linus Torvalds 已提交
145
struct rpc_xprt {
146
	struct kref		kref;		/* Reference count */
147
	struct rpc_xprt_ops *	ops;		/* transport methods */
L
Linus Torvalds 已提交
148

149
	const struct rpc_timeout *timeout;	/* timeout parms */
150 151
	struct sockaddr_storage	addr;		/* server address */
	size_t			addrlen;	/* size of server address */
L
Linus Torvalds 已提交
152 153 154 155 156 157 158
	int			prot;		/* IP protocol */

	unsigned long		cong;		/* current congestion */
	unsigned long		cwnd;		/* congestion window */

	size_t			max_payload;	/* largest RPC payload size,
						   in bytes */
159 160
	unsigned int		tsh_size;	/* size of transport specific
						   header */
L
Linus Torvalds 已提交
161

162
	struct rpc_wait_queue	binding;	/* requests waiting on rpcbind */
L
Linus Torvalds 已提交
163 164 165 166 167 168 169
	struct rpc_wait_queue	sending;	/* requests waiting to send */
	struct rpc_wait_queue	resend;		/* requests waiting to resend */
	struct rpc_wait_queue	pending;	/* requests in flight */
	struct rpc_wait_queue	backlog;	/* waiting for slot */
	struct list_head	free;		/* free slots */
	struct rpc_rqst *	slot;		/* slot table storage */
	unsigned int		max_reqs;	/* total slots */
170
	unsigned long		state;		/* transport state */
L
Linus Torvalds 已提交
171
	unsigned char		shutdown   : 1,	/* being shut down */
172
				resvport   : 1; /* use a reserved port */
173
	unsigned int		bind_index;	/* bind function index */
L
Linus Torvalds 已提交
174 175

	/*
176
	 * Connection of transports
L
Linus Torvalds 已提交
177
	 */
178
	unsigned long		bind_timeout,
179
				reestablish_timeout;
180 181 182
	unsigned int		connect_cookie;	/* A cookie that gets bumped
						   every time the transport
						   is reconnected */
183

L
Linus Torvalds 已提交
184
	/*
185
	 * Disconnection of idle transports
L
Linus Torvalds 已提交
186 187 188
	 */
	struct work_struct	task_cleanup;
	struct timer_list	timer;
189 190
	unsigned long		last_used,
				idle_timeout;
L
Linus Torvalds 已提交
191 192 193 194

	/*
	 * Send stuff
	 */
C
Chuck Lever 已提交
195
	spinlock_t		transport_lock;	/* lock transport info */
C
Chuck Lever 已提交
196
	spinlock_t		reserve_lock;	/* lock slot table */
197
	u32			xid;		/* Next XID value to use */
L
Linus Torvalds 已提交
198
	struct rpc_task *	snd_task;	/* Task blocked in send */
199
	struct svc_xprt		*bc_xprt;	/* NFSv4.1 backchannel */
200 201 202
#if defined(CONFIG_NFS_V4_1)
	struct svc_serv		*bc_serv;       /* The RPC service which will */
						/* process the callback */
203
	unsigned int		bc_alloc_count;	/* Total number of preallocs */
204 205 206 207 208
	spinlock_t		bc_pa_lock;	/* Protects the preallocated
						 * items */
	struct list_head	bc_pa_list;	/* List of preallocated
						 * backchannel rpc_rqst's */
#endif /* CONFIG_NFS_V4_1 */
L
Linus Torvalds 已提交
209 210
	struct list_head	recv;

211 212 213 214 215 216 217 218 219 220 221 222
	struct {
		unsigned long		bind_count,	/* total number of binds */
					connect_count,	/* total number of connects */
					connect_start,	/* connect start timestamp */
					connect_time,	/* jiffies waiting for connect */
					sends,		/* how many complete requests */
					recvs,		/* how many complete requests */
					bad_xids;	/* lookup_rqst didn't find XID */

		unsigned long long	req_u,		/* average requests on the wire */
					bklog_u;	/* backlog queue utilization */
	} stat;
L
Linus Torvalds 已提交
223

224
	const char		*address_strings[RPC_DISPLAY_MAX];
L
Linus Torvalds 已提交
225 226
};

227 228 229 230 231 232 233 234
#if defined(CONFIG_NFS_V4_1)
/*
 * Backchannel flags
 */
#define	RPC_BC_PA_IN_USE	0x0001		/* Preallocated backchannel */
						/* buffer in use */
#endif /* CONFIG_NFS_V4_1 */

235 236 237 238 239 240 241 242 243 244 245 246
#if defined(CONFIG_NFS_V4_1)
static inline int bc_prealloc(struct rpc_rqst *req)
{
	return test_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state);
}
#else
static inline int bc_prealloc(struct rpc_rqst *req)
{
	return 0;
}
#endif /* CONFIG_NFS_V4_1 */

247
struct xprt_create {
248
	int			ident;		/* XPRT_TRANSPORT identifier */
249
	struct sockaddr *	srcaddr;	/* optional local address */
250 251
	struct sockaddr *	dstaddr;	/* remote peer address */
	size_t			addrlen;
252
	struct svc_xprt		*bc_xprt;	/* NFSv4.1 backchannel */
253
};
L
Linus Torvalds 已提交
254

255 256
struct xprt_class {
	struct list_head	list;
257
	int			ident;		/* XPRT_TRANSPORT identifier */
258
	struct rpc_xprt *	(*setup)(struct xprt_create *);
259 260 261 262
	struct module		*owner;
	char			name[32];
};

263 264 265
/*
 * Generic internal transport functions
 */
266
struct rpc_xprt		*xprt_create_transport(struct xprt_create *args);
267 268
void			xprt_connect(struct rpc_task *task);
void			xprt_reserve(struct rpc_task *task);
269 270
int			xprt_reserve_xprt(struct rpc_task *task);
int			xprt_reserve_xprt_cong(struct rpc_task *task);
271 272
int			xprt_prepare_transmit(struct rpc_task *task);
void			xprt_transmit(struct rpc_task *task);
273
void			xprt_end_transmit(struct rpc_task *task);
L
Linus Torvalds 已提交
274
int			xprt_adjust_timeout(struct rpc_rqst *req);
275 276
void			xprt_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task);
void			xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task);
277
void			xprt_release(struct rpc_task *task);
278 279
struct rpc_xprt *	xprt_get(struct rpc_xprt *xprt);
void			xprt_put(struct rpc_xprt *xprt);
280

281
static inline __be32 *xprt_skip_transport_header(struct rpc_xprt *xprt, __be32 *p)
282 283 284 285
{
	return p + xprt->tsh_size;
}

286 287 288
/*
 * Transport switch helper functions
 */
289 290
int			xprt_register_transport(struct xprt_class *type);
int			xprt_unregister_transport(struct xprt_class *type);
291
int			xprt_load_transport(const char *);
292 293
void			xprt_set_retrans_timeout_def(struct rpc_task *task);
void			xprt_set_retrans_timeout_rtt(struct rpc_task *task);
294
void			xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status);
295
void			xprt_wait_for_buffer_space(struct rpc_task *task, rpc_action action);
296
void			xprt_write_space(struct rpc_xprt *xprt);
297
void			xprt_adjust_cwnd(struct rpc_task *task, int result);
298
struct rpc_rqst *	xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid);
299
void			xprt_complete_rqst(struct rpc_task *task, int copied);
300
void			xprt_release_rqst_cong(struct rpc_task *task);
301
void			xprt_disconnect_done(struct rpc_xprt *xprt);
302
void			xprt_force_disconnect(struct rpc_xprt *xprt);
303
void			xprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie);
304

305 306 307 308 309 310
/*
 * Reserved bit positions in xprt->state
 */
#define XPRT_LOCKED		(0)
#define XPRT_CONNECTED		(1)
#define XPRT_CONNECTING		(2)
311
#define XPRT_CLOSE_WAIT		(3)
312
#define XPRT_BOUND		(4)
313
#define XPRT_BINDING		(5)
314
#define XPRT_CLOSING		(6)
315
#define XPRT_CONNECTION_ABORT	(7)
316
#define XPRT_CONNECTION_CLOSE	(8)
317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358

static inline void xprt_set_connected(struct rpc_xprt *xprt)
{
	set_bit(XPRT_CONNECTED, &xprt->state);
}

static inline void xprt_clear_connected(struct rpc_xprt *xprt)
{
	clear_bit(XPRT_CONNECTED, &xprt->state);
}

static inline int xprt_connected(struct rpc_xprt *xprt)
{
	return test_bit(XPRT_CONNECTED, &xprt->state);
}

static inline int xprt_test_and_set_connected(struct rpc_xprt *xprt)
{
	return test_and_set_bit(XPRT_CONNECTED, &xprt->state);
}

static inline int xprt_test_and_clear_connected(struct rpc_xprt *xprt)
{
	return test_and_clear_bit(XPRT_CONNECTED, &xprt->state);
}

static inline void xprt_clear_connecting(struct rpc_xprt *xprt)
{
	smp_mb__before_clear_bit();
	clear_bit(XPRT_CONNECTING, &xprt->state);
	smp_mb__after_clear_bit();
}

static inline int xprt_connecting(struct rpc_xprt *xprt)
{
	return test_bit(XPRT_CONNECTING, &xprt->state);
}

static inline int xprt_test_and_set_connecting(struct rpc_xprt *xprt)
{
	return test_and_set_bit(XPRT_CONNECTING, &xprt->state);
}
L
Linus Torvalds 已提交
359

360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
static inline void xprt_set_bound(struct rpc_xprt *xprt)
{
	test_and_set_bit(XPRT_BOUND, &xprt->state);
}

static inline int xprt_bound(struct rpc_xprt *xprt)
{
	return test_bit(XPRT_BOUND, &xprt->state);
}

static inline void xprt_clear_bound(struct rpc_xprt *xprt)
{
	clear_bit(XPRT_BOUND, &xprt->state);
}

375 376 377 378 379 380 381 382 383 384 385 386
static inline void xprt_clear_binding(struct rpc_xprt *xprt)
{
	smp_mb__before_clear_bit();
	clear_bit(XPRT_BINDING, &xprt->state);
	smp_mb__after_clear_bit();
}

static inline int xprt_test_and_set_binding(struct rpc_xprt *xprt)
{
	return test_and_set_bit(XPRT_BINDING, &xprt->state);
}

L
Linus Torvalds 已提交
387 388 389
#endif /* __KERNEL__*/

#endif /* _LINUX_SUNRPC_XPRT_H */