xprt.h 10.2 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>
L
Linus Torvalds 已提交
16 17 18 19 20 21 22 23 24 25
#include <linux/sunrpc/sched.h>
#include <linux/sunrpc/xdr.h>

extern unsigned int xprt_udp_slot_table_entries;
extern unsigned int xprt_tcp_slot_table_entries;

#define RPC_MIN_SLOT_TABLE	(2U)
#define RPC_DEF_SLOT_TABLE	(16U)
#define RPC_MAX_SLOT_TABLE	(128U)

26 27
/*
 * RPC call and reply header size as number of 32bit words (verifier
L
Linus Torvalds 已提交
28 29 30 31 32
 * size computed separately)
 */
#define RPC_CALLHDRSIZE		6
#define RPC_REPHDRSIZE		4

33 34 35 36 37 38 39 40
/*
 * Parameters for choosing a free port
 */
extern unsigned int xprt_min_resvport;
extern unsigned int xprt_max_resvport;

#define RPC_MIN_RESVPORT	(1U)
#define RPC_MAX_RESVPORT	(65535U)
41
#define RPC_DEF_MIN_RESVPORT	(665U)
42 43
#define RPC_DEF_MAX_RESVPORT	(1023U)

L
Linus Torvalds 已提交
44 45 46 47 48 49 50 51 52 53 54
/*
 * 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;
};

55 56 57 58 59 60 61 62
enum rpc_display_format_t {
	RPC_DISPLAY_ADDR = 0,
	RPC_DISPLAY_PORT,
	RPC_DISPLAY_PROTO,
	RPC_DISPLAY_ALL,
	RPC_DISPLAY_MAX,
};

63 64
struct rpc_task;
struct rpc_xprt;
65
struct seq_file;
66

L
Linus Torvalds 已提交
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
/*
 * 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 */
82
	__be32			rq_xid;		/* request XID */
L
Linus Torvalds 已提交
83 84 85
	int			rq_cong;	/* has incremented xprt->cong */
	int			rq_received;	/* receive completed */
	u32			rq_seqno;	/* gss seq no. used on req. */
86 87 88 89
	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 已提交
90 91
	struct list_head	rq_list;

92 93 94
	__u32 *			rq_buffer;	/* XDR encode buffer */
	size_t			rq_bufsize;

L
Linus Torvalds 已提交
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
	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 */
	
	/*
	 * Partial send handling
	 */
	u32			rq_bytes_sent;	/* Bytes we have sent */

	unsigned long		rq_xtime;	/* when transmitted */
	int			rq_ntrans;
};
#define rq_svec			rq_snd_buf.head
#define rq_slen			rq_snd_buf.len

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

struct rpc_xprt {
133
	struct kref		kref;		/* Reference count */
134
	struct rpc_xprt_ops *	ops;		/* transport methods */
L
Linus Torvalds 已提交
135 136 137 138
	struct socket *		sock;		/* BSD socket layer */
	struct sock *		inet;		/* INET layer */

	struct rpc_timeout	timeout;	/* timeout parms */
139 140
	struct sockaddr_storage	addr;		/* server address */
	size_t			addrlen;	/* size of server address */
L
Linus Torvalds 已提交
141 142 143 144 145
	int			prot;		/* IP protocol */

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

146
	size_t			rcvsize,	/* transport rcv buffer size */
147
				sndsize;	/* transport send buffer size */
L
Linus Torvalds 已提交
148 149 150

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

154
	struct rpc_wait_queue	binding;	/* requests waiting on rpcbind */
L
Linus Torvalds 已提交
155 156 157 158 159 160 161
	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 */
162
	unsigned long		state;		/* transport state */
L
Linus Torvalds 已提交
163
	unsigned char		shutdown   : 1,	/* being shut down */
164
				resvport   : 1; /* use a reserved port */
L
Linus Torvalds 已提交
165 166 167 168 169 170 171 172 173

	/*
	 * XID
	 */
	__u32			xid;		/* Next XID value to use */

	/*
	 * State of TCP reply receive stuff
	 */
174 175 176
	__be32			tcp_recm,	/* Fragment header */
				tcp_xid;	/* Current XID */
	u32			tcp_reclen,	/* fragment length */
L
Linus Torvalds 已提交
177 178 179 180
				tcp_offset;	/* fragment offset */
	unsigned long		tcp_copied,	/* copied to request */
				tcp_flags;
	/*
181
	 * Connection of transports
L
Linus Torvalds 已提交
182
	 */
183 184 185
	unsigned long		connect_timeout,
				bind_timeout,
				reestablish_timeout;
186
	struct work_struct	connect_worker;
L
Linus Torvalds 已提交
187
	unsigned short		port;
188

L
Linus Torvalds 已提交
189
	/*
190
	 * Disconnection of idle transports
L
Linus Torvalds 已提交
191 192 193
	 */
	struct work_struct	task_cleanup;
	struct timer_list	timer;
194 195
	unsigned long		last_used,
				idle_timeout;
L
Linus Torvalds 已提交
196 197 198 199

	/*
	 * Send stuff
	 */
C
Chuck Lever 已提交
200
	spinlock_t		transport_lock;	/* lock transport info */
C
Chuck Lever 已提交
201
	spinlock_t		reserve_lock;	/* lock slot table */
L
Linus Torvalds 已提交
202 203 204 205
	struct rpc_task *	snd_task;	/* Task blocked in send */

	struct list_head	recv;

206 207 208 209 210 211 212 213 214 215 216 217
	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 已提交
218 219 220 221

	void			(*old_data_ready)(struct sock *, int);
	void			(*old_state_change)(struct sock *);
	void			(*old_write_space)(struct sock *);
222 223

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

226 227 228 229 230
#define XPRT_LAST_FRAG		(1 << 0)
#define XPRT_COPY_RECM		(1 << 1)
#define XPRT_COPY_XID		(1 << 2)
#define XPRT_COPY_DATA		(1 << 3)

L
Linus Torvalds 已提交
231 232
#ifdef __KERNEL__

233 234 235 236 237 238 239 240
/*
 * Transport operations used by ULPs
 */
void			xprt_set_timeout(struct rpc_timeout *to, unsigned int retr, unsigned long incr);

/*
 * Generic internal transport functions
 */
241
struct rpc_xprt *	xprt_create_transport(int proto, struct sockaddr *addr, size_t size, struct rpc_timeout *toparms);
242 243
void			xprt_connect(struct rpc_task *task);
void			xprt_reserve(struct rpc_task *task);
244 245
int			xprt_reserve_xprt(struct rpc_task *task);
int			xprt_reserve_xprt_cong(struct rpc_task *task);
246 247
int			xprt_prepare_transmit(struct rpc_task *task);
void			xprt_transmit(struct rpc_task *task);
248
void			xprt_end_transmit(struct rpc_task *task);
L
Linus Torvalds 已提交
249
int			xprt_adjust_timeout(struct rpc_rqst *req);
250 251
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);
252
void			xprt_release(struct rpc_task *task);
253 254
struct rpc_xprt *	xprt_get(struct rpc_xprt *xprt);
void			xprt_put(struct rpc_xprt *xprt);
255

256
static inline __be32 *xprt_skip_transport_header(struct rpc_xprt *xprt, __be32 *p)
257 258 259 260
{
	return p + xprt->tsh_size;
}

261 262 263
/*
 * Transport switch helper functions
 */
264 265
void			xprt_set_retrans_timeout_def(struct rpc_task *task);
void			xprt_set_retrans_timeout_rtt(struct rpc_task *task);
266
void			xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status);
267 268
void			xprt_wait_for_buffer_space(struct rpc_task *task);
void			xprt_write_space(struct rpc_xprt *xprt);
269
void			xprt_update_rtt(struct rpc_task *task);
270
void			xprt_adjust_cwnd(struct rpc_task *task, int result);
271
struct rpc_rqst *	xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid);
272
void			xprt_complete_rqst(struct rpc_task *task, int copied);
273
void			xprt_release_rqst_cong(struct rpc_task *task);
274 275 276 277 278 279 280
void			xprt_disconnect(struct rpc_xprt *xprt);

/*
 * Socket transport setup operations
 */
int			xs_setup_udp(struct rpc_xprt *xprt, struct rpc_timeout *to);
int			xs_setup_tcp(struct rpc_xprt *xprt, struct rpc_timeout *to);
L
Linus Torvalds 已提交
281

282 283 284 285 286 287
/*
 * Reserved bit positions in xprt->state
 */
#define XPRT_LOCKED		(0)
#define XPRT_CONNECTED		(1)
#define XPRT_CONNECTING		(2)
288
#define XPRT_CLOSE_WAIT		(3)
289
#define XPRT_BOUND		(4)
290
#define XPRT_BINDING		(5)
291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332

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 已提交
333

334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
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);
}

349 350 351 352 353 354 355 356 357 358 359 360
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 已提交
361 362 363
#endif /* __KERNEL__*/

#endif /* _LINUX_SUNRPC_XPRT_H */