Linux Audio

Check our new training course

Loading...
  1/*
  2 *  linux/include/linux/sunrpc/xprt.h
  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>
 15#include <linux/ktime.h>
 16#include <linux/sunrpc/sched.h>
 17#include <linux/sunrpc/xdr.h>
 18#include <linux/sunrpc/msg_prot.h>
 19
 20#ifdef __KERNEL__
 21
 22#define RPC_MIN_SLOT_TABLE	(2U)
 23#define RPC_DEF_SLOT_TABLE	(16U)
 24#define RPC_MAX_SLOT_TABLE_LIMIT	(65536U)
 25#define RPC_MAX_SLOT_TABLE	RPC_MAX_SLOT_TABLE_LIMIT
 26
 27/*
 28 * This describes a timeout strategy
 29 */
 30struct 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
 38enum rpc_display_format_t {
 39	RPC_DISPLAY_ADDR = 0,
 40	RPC_DISPLAY_PORT,
 41	RPC_DISPLAY_PROTO,
 42	RPC_DISPLAY_HEX_ADDR,
 43	RPC_DISPLAY_HEX_PORT,
 44	RPC_DISPLAY_NETID,
 45	RPC_DISPLAY_MAX,
 46};
 47
 48struct rpc_task;
 49struct rpc_xprt;
 50struct seq_file;
 51
 52/*
 53 * This describes a complete RPC request
 54 */
 55struct 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 */
 67	struct rpc_cred *	rq_cred;	/* Bound cred */
 68	__be32			rq_xid;		/* request XID */
 69	int			rq_cong;	/* has incremented xprt->cong */
 70	u32			rq_seqno;	/* gss seq no. used on req. */
 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 */
 75	struct list_head	rq_list;
 76
 77	__u32 *			rq_buffer;	/* XDR encode buffer */
 78	size_t			rq_callsize,
 79				rq_rcvsize;
 80	size_t			rq_xmit_bytes_sent;	/* total bytes sent */
 81	size_t			rq_reply_bytes_recvd;	/* total reply bytes */
 82							/* received */
 83
 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 */
 89	ktime_t			rq_rtt;		/* round-trip time */
 90	unsigned int		rq_retries;	/* # of retries */
 91	unsigned int		rq_connect_cookie;
 92						/* A cookie used to track the
 93						   state of the transport
 94						   connection */
 95	
 96	/*
 97	 * Partial send handling
 98	 */
 99	u32			rq_bytes_sent;	/* Bytes we have sent */
100
101	ktime_t			rq_xtime;	/* transmit time stamp */
102	int			rq_ntrans;
103
104#if defined(CONFIG_SUNRPC_BACKCHANNEL)
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 */
108#endif /* CONFIG_SUNRPC_BACKCHANEL */
109};
110#define rq_svec			rq_snd_buf.head
111#define rq_slen			rq_snd_buf.len
112
113struct rpc_xprt_ops {
114	void		(*set_buffer_size)(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize);
115	int		(*reserve_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
116	void		(*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
117	void		(*rpcbind)(struct rpc_task *task);
118	void		(*set_port)(struct rpc_xprt *xprt, unsigned short port);
119	void		(*connect)(struct rpc_task *task);
120	void *		(*buf_alloc)(struct rpc_task *task, size_t size);
121	void		(*buf_free)(void *buffer);
122	int		(*send_request)(struct rpc_task *task);
123	void		(*set_retrans_timeout)(struct rpc_task *task);
124	void		(*timer)(struct rpc_task *task);
125	void		(*release_request)(struct rpc_task *task);
126	void		(*close)(struct rpc_xprt *xprt);
127	void		(*destroy)(struct rpc_xprt *xprt);
128	void		(*print_stats)(struct rpc_xprt *xprt, struct seq_file *seq);
129};
130
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)
141enum xprt_transports {
142	XPRT_TRANSPORT_UDP	= IPPROTO_UDP,
143	XPRT_TRANSPORT_TCP	= IPPROTO_TCP,
144	XPRT_TRANSPORT_BC_TCP	= IPPROTO_TCP | XPRT_TRANSPORT_BC,
145	XPRT_TRANSPORT_RDMA	= 256,
146	XPRT_TRANSPORT_LOCAL	= 257,
147};
148
149struct rpc_xprt {
150	atomic_t		count;		/* Reference count */
151	struct rpc_xprt_ops *	ops;		/* transport methods */
152
153	const struct rpc_timeout *timeout;	/* timeout parms */
154	struct sockaddr_storage	addr;		/* server address */
155	size_t			addrlen;	/* size of server address */
156	int			prot;		/* IP protocol */
157
158	unsigned long		cong;		/* current congestion */
159	unsigned long		cwnd;		/* congestion window */
160
161	size_t			max_payload;	/* largest RPC payload size,
162						   in bytes */
163	unsigned int		tsh_size;	/* size of transport specific
164						   header */
165
166	struct rpc_wait_queue	binding;	/* requests waiting on rpcbind */
167	struct rpc_wait_queue	sending;	/* requests waiting to send */
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 */
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 */
174	unsigned long		state;		/* transport state */
175	unsigned char		shutdown   : 1,	/* being shut down */
176				resvport   : 1; /* use a reserved port */
177	unsigned int		bind_index;	/* bind function index */
178
179	/*
180	 * Connection of transports
181	 */
182	unsigned long		bind_timeout,
183				reestablish_timeout;
184	unsigned int		connect_cookie;	/* A cookie that gets bumped
185						   every time the transport
186						   is reconnected */
187
188	/*
189	 * Disconnection of idle transports
190	 */
191	struct work_struct	task_cleanup;
192	struct timer_list	timer;
193	unsigned long		last_used,
194				idle_timeout;
195
196	/*
197	 * Send stuff
198	 */
199	spinlock_t		transport_lock;	/* lock transport info */
200	spinlock_t		reserve_lock;	/* lock slot table */
201	u32			xid;		/* Next XID value to use */
202	struct rpc_task *	snd_task;	/* Task blocked in send */
203	struct svc_xprt		*bc_xprt;	/* NFSv4.1 backchannel */
204#if defined(CONFIG_SUNRPC_BACKCHANNEL)
205	struct svc_serv		*bc_serv;       /* The RPC service which will */
206						/* process the callback */
207	unsigned int		bc_alloc_count;	/* Total number of preallocs */
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 */
212#endif /* CONFIG_SUNRPC_BACKCHANNEL */
213	struct list_head	recv;
214
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 */
222					bad_xids,	/* lookup_rqst didn't find XID */
223					max_slots;	/* max rpc_slots used */
224
225		unsigned long long	req_u,		/* average requests on the wire */
226					bklog_u,	/* backlog queue utilization */
227					sending_u,	/* send q utilization */
228					pending_u;	/* pend q utilization */
229	} stat;
230
231	struct net		*xprt_net;
232	const char		*servername;
233	const char		*address_strings[RPC_DISPLAY_MAX];
234};
235
236#if defined(CONFIG_SUNRPC_BACKCHANNEL)
237/*
238 * Backchannel flags
239 */
240#define	RPC_BC_PA_IN_USE	0x0001		/* Preallocated backchannel */
241						/* buffer in use */
242#endif /* CONFIG_SUNRPC_BACKCHANNEL */
243
244#if defined(CONFIG_SUNRPC_BACKCHANNEL)
245static 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
250static inline int bc_prealloc(struct rpc_rqst *req)
251{
252	return 0;
253}
254#endif /* CONFIG_SUNRPC_BACKCHANNEL */
255
256struct xprt_create {
257	int			ident;		/* XPRT_TRANSPORT identifier */
258	struct net *		net;
259	struct sockaddr *	srcaddr;	/* optional local address */
260	struct sockaddr *	dstaddr;	/* remote peer address */
261	size_t			addrlen;
262	const char		*servername;
263	struct svc_xprt		*bc_xprt;	/* NFSv4.1 backchannel */
264};
265
266struct xprt_class {
267	struct list_head	list;
268	int			ident;		/* XPRT_TRANSPORT identifier */
269	struct rpc_xprt *	(*setup)(struct xprt_create *);
270	struct module		*owner;
271	char			name[32];
272};
273
274/*
275 * Generic internal transport functions
276 */
277struct rpc_xprt		*xprt_create_transport(struct xprt_create *args);
278void			xprt_connect(struct rpc_task *task);
279void			xprt_reserve(struct rpc_task *task);
280int			xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task);
281int			xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task);
282int			xprt_prepare_transmit(struct rpc_task *task);
283void			xprt_transmit(struct rpc_task *task);
284void			xprt_end_transmit(struct rpc_task *task);
285int			xprt_adjust_timeout(struct rpc_rqst *req);
286void			xprt_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task);
287void			xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task);
288void			xprt_release(struct rpc_task *task);
289struct rpc_xprt *	xprt_get(struct rpc_xprt *xprt);
290void			xprt_put(struct rpc_xprt *xprt);
291struct rpc_xprt *	xprt_alloc(struct net *net, size_t size,
292				unsigned int num_prealloc,
293				unsigned int max_req);
294void			xprt_free(struct rpc_xprt *);
295
296static inline __be32 *xprt_skip_transport_header(struct rpc_xprt *xprt, __be32 *p)
297{
298	return p + xprt->tsh_size;
299}
300
301/*
302 * Transport switch helper functions
303 */
304int			xprt_register_transport(struct xprt_class *type);
305int			xprt_unregister_transport(struct xprt_class *type);
306int			xprt_load_transport(const char *);
307void			xprt_set_retrans_timeout_def(struct rpc_task *task);
308void			xprt_set_retrans_timeout_rtt(struct rpc_task *task);
309void			xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status);
310void			xprt_wait_for_buffer_space(struct rpc_task *task, rpc_action action);
311void			xprt_write_space(struct rpc_xprt *xprt);
312void			xprt_adjust_cwnd(struct rpc_task *task, int result);
313struct rpc_rqst *	xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid);
314void			xprt_complete_rqst(struct rpc_task *task, int copied);
315void			xprt_release_rqst_cong(struct rpc_task *task);
316void			xprt_disconnect_done(struct rpc_xprt *xprt);
317void			xprt_force_disconnect(struct rpc_xprt *xprt);
318void			xprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie);
319
320/*
321 * Reserved bit positions in xprt->state
322 */
323#define XPRT_LOCKED		(0)
324#define XPRT_CONNECTED		(1)
325#define XPRT_CONNECTING		(2)
326#define XPRT_CLOSE_WAIT		(3)
327#define XPRT_BOUND		(4)
328#define XPRT_BINDING		(5)
329#define XPRT_CLOSING		(6)
330#define XPRT_CONNECTION_ABORT	(7)
331#define XPRT_CONNECTION_CLOSE	(8)
332
333static inline void xprt_set_connected(struct rpc_xprt *xprt)
334{
335	set_bit(XPRT_CONNECTED, &xprt->state);
336}
337
338static inline void xprt_clear_connected(struct rpc_xprt *xprt)
339{
340	clear_bit(XPRT_CONNECTED, &xprt->state);
341}
342
343static inline int xprt_connected(struct rpc_xprt *xprt)
344{
345	return test_bit(XPRT_CONNECTED, &xprt->state);
346}
347
348static inline int xprt_test_and_set_connected(struct rpc_xprt *xprt)
349{
350	return test_and_set_bit(XPRT_CONNECTED, &xprt->state);
351}
352
353static inline int xprt_test_and_clear_connected(struct rpc_xprt *xprt)
354{
355	return test_and_clear_bit(XPRT_CONNECTED, &xprt->state);
356}
357
358static 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
365static inline int xprt_connecting(struct rpc_xprt *xprt)
366{
367	return test_bit(XPRT_CONNECTING, &xprt->state);
368}
369
370static inline int xprt_test_and_set_connecting(struct rpc_xprt *xprt)
371{
372	return test_and_set_bit(XPRT_CONNECTING, &xprt->state);
373}
374
375static inline void xprt_set_bound(struct rpc_xprt *xprt)
376{
377	test_and_set_bit(XPRT_BOUND, &xprt->state);
378}
379
380static inline int xprt_bound(struct rpc_xprt *xprt)
381{
382	return test_bit(XPRT_BOUND, &xprt->state);
383}
384
385static inline void xprt_clear_bound(struct rpc_xprt *xprt)
386{
387	clear_bit(XPRT_BOUND, &xprt->state);
388}
389
390static 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
397static inline int xprt_test_and_set_binding(struct rpc_xprt *xprt)
398{
399	return test_and_set_bit(XPRT_BINDING, &xprt->state);
400}
401
402#endif /* __KERNEL__*/
403
404#endif /* _LINUX_SUNRPC_XPRT_H */