xprt.h 8.5 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 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
 *
 *  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>
#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)

/* Default timeout values */
#define RPC_MAX_UDP_TIMEOUT	(60*HZ)
#define RPC_MAX_TCP_TIMEOUT	(600*HZ)

/*
 * Wait duration for an RPC TCP connection to be established.  Solaris
 * NFS over TCP uses 60 seconds, for example, which is in line with how
 * long a server takes to reboot.
 */
#define RPC_CONNECT_TIMEOUT	(60*HZ)

/*
 * Delay an arbitrary number of seconds before attempting to reconnect
 * after an error.
 */
#define RPC_REESTABLISH_TIMEOUT	(15*HZ)

42 43 44 45 46 47 48
/*
 * RPC transport idle timeout.
 */
#define RPC_IDLE_DISCONNECT_TIMEOUT	(5*60*HZ)

/*
 * RPC call and reply header size as number of 32bit words (verifier
L
Linus Torvalds 已提交
49 50 51 52 53
 * size computed separately)
 */
#define RPC_CALLHDRSIZE		6
#define RPC_REPHDRSIZE		4

54 55 56 57 58 59 60 61 62 63 64
/*
 * 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)
#define RPC_DEF_MIN_RESVPORT	(650U)
#define RPC_DEF_MAX_RESVPORT	(1023U)

L
Linus Torvalds 已提交
65 66 67 68 69 70 71 72 73 74 75
/*
 * 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;
};

76 77 78
struct rpc_task;
struct rpc_xprt;

L
Linus Torvalds 已提交
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
/*
 * 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 */
	__u32			rq_xid;		/* request XID */
	int			rq_cong;	/* has incremented xprt->cong */
	int			rq_received;	/* receive completed */
	u32			rq_seqno;	/* gss seq no. used on req. */

	struct list_head	rq_list;

	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 */
	/*
	 * For authentication (e.g. auth_des)
	 */
	u32			rq_creddata[2];
	
	/*
	 * 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

124 125
struct rpc_xprt_ops {
	void		(*set_buffer_size)(struct rpc_xprt *xprt);
126
	int		(*reserve_xprt)(struct rpc_task *task);
127
	void		(*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
128 129
	void		(*connect)(struct rpc_task *task);
	int		(*send_request)(struct rpc_task *task);
130
	void		(*set_retrans_timeout)(struct rpc_task *task);
131
	void		(*timer)(struct rpc_task *task);
132
	void		(*release_request)(struct rpc_task *task);
133 134 135
	void		(*close)(struct rpc_xprt *xprt);
	void		(*destroy)(struct rpc_xprt *xprt);
};
L
Linus Torvalds 已提交
136 137

struct rpc_xprt {
138
	struct rpc_xprt_ops *	ops;		/* transport methods */
L
Linus Torvalds 已提交
139 140 141 142 143 144 145 146 147 148
	struct socket *		sock;		/* BSD socket layer */
	struct sock *		inet;		/* INET layer */

	struct rpc_timeout	timeout;	/* timeout parms */
	struct sockaddr_in	addr;		/* server address */
	int			prot;		/* IP protocol */

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

149 150
	unsigned int		rcvsize,	/* transport rcv buffer size */
				sndsize;	/* transport send buffer size */
L
Linus Torvalds 已提交
151 152 153

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

	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 */
164
	unsigned long		state;		/* transport state */
L
Linus Torvalds 已提交
165
	unsigned char		shutdown   : 1,	/* being shut down */
166
				resvport   : 1; /* use a reserved port */
L
Linus Torvalds 已提交
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182

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

	/*
	 * State of TCP reply receive stuff
	 */
	u32			tcp_recm,	/* Fragment header */
				tcp_xid,	/* Current XID */
				tcp_reclen,	/* fragment length */
				tcp_offset;	/* fragment offset */
	unsigned long		tcp_copied,	/* copied to request */
				tcp_flags;
	/*
183
	 * Connection of transports
L
Linus Torvalds 已提交
184
	 */
185
	struct work_struct	connect_worker;
L
Linus Torvalds 已提交
186 187
	unsigned short		port;
	/*
188
	 * Disconnection of idle transports
L
Linus Torvalds 已提交
189 190 191 192 193 194 195 196
	 */
	struct work_struct	task_cleanup;
	struct timer_list	timer;
	unsigned long		last_used;

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

	struct list_head	recv;


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

209 210 211 212 213
#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 已提交
214 215
#ifdef __KERNEL__

216 217 218 219 220 221 222 223 224 225 226
/*
 * Transport operations used by ULPs
 */
struct rpc_xprt *	xprt_create_proto(int proto, struct sockaddr_in *addr, struct rpc_timeout *to);
void			xprt_set_timeout(struct rpc_timeout *to, unsigned int retr, unsigned long incr);

/*
 * Generic internal transport functions
 */
void			xprt_connect(struct rpc_task *task);
void			xprt_reserve(struct rpc_task *task);
227 228
int			xprt_reserve_xprt(struct rpc_task *task);
int			xprt_reserve_xprt_cong(struct rpc_task *task);
229 230
int			xprt_prepare_transmit(struct rpc_task *task);
void			xprt_transmit(struct rpc_task *task);
L
Linus Torvalds 已提交
231
int			xprt_adjust_timeout(struct rpc_rqst *req);
232 233
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);
234 235 236
void			xprt_release(struct rpc_task *task);
int			xprt_destroy(struct rpc_xprt *xprt);

237 238 239 240 241
static inline u32 *xprt_skip_transport_header(struct rpc_xprt *xprt, u32 *p)
{
	return p + xprt->tsh_size;
}

242 243 244
/*
 * Transport switch helper functions
 */
245 246
void			xprt_set_retrans_timeout_def(struct rpc_task *task);
void			xprt_set_retrans_timeout_rtt(struct rpc_task *task);
247
void			xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status);
248 249
void			xprt_wait_for_buffer_space(struct rpc_task *task);
void			xprt_write_space(struct rpc_xprt *xprt);
250
void			xprt_update_rtt(struct rpc_task *task);
251
void			xprt_adjust_cwnd(struct rpc_task *task, int result);
252
struct rpc_rqst *	xprt_lookup_rqst(struct rpc_xprt *xprt, u32 xid);
253
void			xprt_complete_rqst(struct rpc_task *task, int copied);
254
void			xprt_release_rqst_cong(struct rpc_task *task);
255 256 257 258 259 260 261
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 已提交
262

263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 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)

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 已提交
311 312 313 314

#endif /* __KERNEL__*/

#endif /* _LINUX_SUNRPC_XPRT_H */