| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:47 -04:00
										 |  |  |  *  linux/include/linux/sunrpc/xprt.h | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  * | 
					
						
							|  |  |  |  *  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>
 | 
					
						
							| 
									
										
										
										
											2010-05-07 13:34:47 -04:00
										 |  |  | #include <linux/ktime.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #include <linux/sunrpc/sched.h>
 | 
					
						
							|  |  |  | #include <linux/sunrpc/xdr.h>
 | 
					
						
							| 
									
										
										
										
											2006-10-04 02:15:47 -07:00
										 |  |  | #include <linux/sunrpc/msg_prot.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-07-08 13:08:54 +02:00
										 |  |  | #ifdef __KERNEL__
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #define RPC_MIN_SLOT_TABLE	(2U)
 | 
					
						
							|  |  |  | #define RPC_DEF_SLOT_TABLE	(16U)
 | 
					
						
							| 
									
										
										
										
											2011-07-17 18:11:30 -04:00
										 |  |  | #define RPC_MAX_SLOT_TABLE_LIMIT	(65536U)
 | 
					
						
							| 
									
										
										
										
											2012-02-06 15:18:48 -05:00
										 |  |  | #define RPC_MAX_SLOT_TABLE	RPC_MAX_SLOT_TABLE_LIMIT
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-28 10:34:49 -04:00
										 |  |  | #define RPC_CWNDSHIFT		(8U)
 | 
					
						
							|  |  |  | #define RPC_CWNDSCALE		(1U << RPC_CWNDSHIFT)
 | 
					
						
							|  |  |  | #define RPC_INITCWND		RPC_CWNDSCALE
 | 
					
						
							|  |  |  | #define RPC_MAXCWND(xprt)	((xprt)->max_reqs << RPC_CWNDSHIFT)
 | 
					
						
							|  |  |  | #define RPCXPRT_CONGESTED(xprt) ((xprt)->cong >= (xprt)->cwnd)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * 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; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-22 20:06:18 -04:00
										 |  |  | enum rpc_display_format_t { | 
					
						
							|  |  |  | 	RPC_DISPLAY_ADDR = 0, | 
					
						
							|  |  |  | 	RPC_DISPLAY_PORT, | 
					
						
							|  |  |  | 	RPC_DISPLAY_PROTO, | 
					
						
							| 
									
										
										
										
											2007-08-06 11:57:02 -04:00
										 |  |  | 	RPC_DISPLAY_HEX_ADDR, | 
					
						
							|  |  |  | 	RPC_DISPLAY_HEX_PORT, | 
					
						
							| 
									
										
										
										
											2007-09-10 13:43:05 -04:00
										 |  |  | 	RPC_DISPLAY_NETID, | 
					
						
							| 
									
										
										
										
											2006-08-22 20:06:18 -04:00
										 |  |  | 	RPC_DISPLAY_MAX, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-25 16:25:54 -07:00
										 |  |  | struct rpc_task; | 
					
						
							|  |  |  | struct rpc_xprt; | 
					
						
							| 
									
										
										
										
											2006-04-18 13:21:42 -04:00
										 |  |  | struct seq_file; | 
					
						
							| 
									
										
										
										
											2005-08-25 16:25:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * 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 */ | 
					
						
							| 
									
										
										
										
											2010-07-31 14:29:08 -04:00
										 |  |  | 	struct rpc_cred *	rq_cred;	/* Bound cred */ | 
					
						
							| 
									
										
										
										
											2006-09-26 22:29:38 -07:00
										 |  |  | 	__be32			rq_xid;		/* request XID */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	int			rq_cong;	/* has incremented xprt->cong */ | 
					
						
							|  |  |  | 	u32			rq_seqno;	/* gss seq no. used on req. */ | 
					
						
							| 
									
										
										
										
											2005-10-13 16:54:43 -04:00
										 |  |  | 	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 */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	struct list_head	rq_list; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-03 09:55:49 +01:00
										 |  |  | 	__u32 *			rq_buffer;	/* XDR encode buffer */ | 
					
						
							| 
									
										
										
										
											2008-12-23 16:06:13 -05:00
										 |  |  | 	size_t			rq_callsize, | 
					
						
							| 
									
										
										
										
											2007-03-29 16:47:53 -04:00
										 |  |  | 				rq_rcvsize; | 
					
						
							| 
									
										
										
										
											2010-05-13 12:51:49 -04:00
										 |  |  | 	size_t			rq_xmit_bytes_sent;	/* total bytes sent */ | 
					
						
							|  |  |  | 	size_t			rq_reply_bytes_recvd;	/* total reply bytes */ | 
					
						
							|  |  |  | 							/* received */ | 
					
						
							| 
									
										
										
										
											2006-01-03 09:55:49 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	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 */ | 
					
						
							| 
									
										
										
										
											2010-05-13 12:51:49 -04:00
										 |  |  | 	ktime_t			rq_rtt;		/* round-trip time */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	unsigned int		rq_retries;	/* # of retries */ | 
					
						
							| 
									
										
										
										
											2008-04-17 16:52:57 -04:00
										 |  |  | 	unsigned int		rq_connect_cookie; | 
					
						
							|  |  |  | 						/* A cookie used to track the
 | 
					
						
							|  |  |  | 						   state of the transport | 
					
						
							|  |  |  | 						   connection */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * Partial send handling | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	u32			rq_bytes_sent;	/* Bytes we have sent */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-07 13:34:47 -04:00
										 |  |  | 	ktime_t			rq_xtime;	/* transmit time stamp */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	int			rq_ntrans; | 
					
						
							| 
									
										
										
										
											2009-04-01 09:22:58 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-13 19:20:49 -04:00
										 |  |  | #if defined(CONFIG_SUNRPC_BACKCHANNEL)
 | 
					
						
							| 
									
										
										
										
											2009-04-01 09:22:58 -04:00
										 |  |  | 	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 */ | 
					
						
							| 
									
										
										
										
											2011-07-13 19:20:49 -04:00
										 |  |  | #endif /* CONFIG_SUNRPC_BACKCHANEL */
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | #define rq_svec			rq_snd_buf.head
 | 
					
						
							|  |  |  | #define rq_slen			rq_snd_buf.len
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:23 -04:00
										 |  |  | struct rpc_xprt_ops { | 
					
						
							| 
									
										
										
										
											2005-08-25 16:25:56 -07:00
										 |  |  | 	void		(*set_buffer_size)(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize); | 
					
						
							| 
									
										
										
										
											2011-07-17 16:01:03 -04:00
										 |  |  | 	int		(*reserve_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2005-08-25 16:25:51 -07:00
										 |  |  | 	void		(*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2012-09-07 11:08:50 -04:00
										 |  |  | 	void		(*alloc_slot)(struct rpc_xprt *xprt, struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2006-08-22 20:06:16 -04:00
										 |  |  | 	void		(*rpcbind)(struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2006-01-03 09:55:51 +01:00
										 |  |  | 	void		(*set_port)(struct rpc_xprt *xprt, unsigned short port); | 
					
						
							| 
									
										
										
										
											2013-01-08 09:26:49 -05:00
										 |  |  | 	void		(*connect)(struct rpc_xprt *xprt, struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2006-01-03 09:55:49 +01:00
										 |  |  | 	void *		(*buf_alloc)(struct rpc_task *task, size_t size); | 
					
						
							| 
									
										
										
										
											2007-03-29 16:47:58 -04:00
										 |  |  | 	void		(*buf_free)(void *buffer); | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:23 -04:00
										 |  |  | 	int		(*send_request)(struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2005-08-25 16:25:50 -07:00
										 |  |  | 	void		(*set_retrans_timeout)(struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2013-01-08 09:48:15 -05:00
										 |  |  | 	void		(*timer)(struct rpc_xprt *xprt, struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2005-08-25 16:25:53 -07:00
										 |  |  | 	void		(*release_request)(struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:23 -04:00
										 |  |  | 	void		(*close)(struct rpc_xprt *xprt); | 
					
						
							|  |  |  | 	void		(*destroy)(struct rpc_xprt *xprt); | 
					
						
							| 
									
										
										
										
											2006-03-20 13:44:16 -05:00
										 |  |  | 	void		(*print_stats)(struct rpc_xprt *xprt, struct seq_file *seq); | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:23 -04:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-10 17:33:30 +03:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * 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, | 
					
						
							| 
									
										
										
										
											2011-05-09 15:22:44 -04:00
										 |  |  | 	XPRT_TRANSPORT_RDMA	= 256, | 
					
						
							|  |  |  | 	XPRT_TRANSPORT_LOCAL	= 257, | 
					
						
							| 
									
										
										
										
											2009-09-10 17:33:30 +03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | struct rpc_xprt { | 
					
						
							| 
									
										
										
										
											2011-03-15 19:56:30 -04:00
										 |  |  | 	atomic_t		count;		/* Reference count */ | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:23 -04:00
										 |  |  | 	struct rpc_xprt_ops *	ops;		/* transport methods */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-20 16:03:55 -05:00
										 |  |  | 	const struct rpc_timeout *timeout;	/* timeout parms */ | 
					
						
							| 
									
										
										
										
											2006-08-22 20:06:19 -04:00
										 |  |  | 	struct sockaddr_storage	addr;		/* server address */ | 
					
						
							|  |  |  | 	size_t			addrlen;	/* size of server address */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	int			prot;		/* IP protocol */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	unsigned long		cong;		/* current congestion */ | 
					
						
							|  |  |  | 	unsigned long		cwnd;		/* congestion window */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	size_t			max_payload;	/* largest RPC payload size,
 | 
					
						
							|  |  |  | 						   in bytes */ | 
					
						
							| 
									
										
										
										
											2005-08-25 16:25:49 -07:00
										 |  |  | 	unsigned int		tsh_size;	/* size of transport specific
 | 
					
						
							|  |  |  | 						   header */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-22 20:06:15 -04:00
										 |  |  | 	struct rpc_wait_queue	binding;	/* requests waiting on rpcbind */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	struct rpc_wait_queue	sending;	/* requests waiting to send */ | 
					
						
							|  |  |  | 	struct rpc_wait_queue	pending;	/* requests in flight */ | 
					
						
							|  |  |  | 	struct rpc_wait_queue	backlog;	/* waiting for slot */ | 
					
						
							|  |  |  | 	struct list_head	free;		/* free slots */ | 
					
						
							| 
									
										
										
										
											2011-07-17 18:11:30 -04:00
										 |  |  | 	unsigned int		max_reqs;	/* max number of slots */ | 
					
						
							|  |  |  | 	unsigned int		min_reqs;	/* min number of slots */ | 
					
						
							|  |  |  | 	atomic_t		num_reqs;	/* total slots */ | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:38 -04:00
										 |  |  | 	unsigned long		state;		/* transport state */ | 
					
						
							| 
									
										
										
										
											2012-09-11 17:21:25 -04:00
										 |  |  | 	unsigned char		resvport   : 1; /* use a reserved port */ | 
					
						
							| 
									
										
										
										
											2012-07-31 16:45:12 -07:00
										 |  |  | 	unsigned int		swapper;	/* we're swapping over this
 | 
					
						
							|  |  |  | 						   transport */ | 
					
						
							| 
									
										
										
										
											2007-03-29 16:48:04 -04:00
										 |  |  | 	unsigned int		bind_index;	/* bind function index */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/*
 | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:47 -04:00
										 |  |  | 	 * Connection of transports | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2010-04-16 16:42:12 -04:00
										 |  |  | 	unsigned long		bind_timeout, | 
					
						
							| 
									
										
										
										
											2005-08-25 16:25:55 -07:00
										 |  |  | 				reestablish_timeout; | 
					
						
							| 
									
										
										
										
											2008-04-17 16:52:57 -04:00
										 |  |  | 	unsigned int		connect_cookie;	/* A cookie that gets bumped
 | 
					
						
							|  |  |  | 						   every time the transport | 
					
						
							|  |  |  | 						   is reconnected */ | 
					
						
							| 
									
										
										
										
											2005-08-25 16:25:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	/*
 | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:47 -04:00
										 |  |  | 	 * Disconnection of idle transports | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	 */ | 
					
						
							|  |  |  | 	struct work_struct	task_cleanup; | 
					
						
							|  |  |  | 	struct timer_list	timer; | 
					
						
							| 
									
										
										
										
											2005-08-25 16:25:55 -07:00
										 |  |  | 	unsigned long		last_used, | 
					
						
							|  |  |  | 				idle_timeout; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * Send stuff | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:32 -04:00
										 |  |  | 	spinlock_t		transport_lock;	/* lock transport info */ | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:35 -04:00
										 |  |  | 	spinlock_t		reserve_lock;	/* lock slot table */ | 
					
						
							| 
									
										
										
										
											2006-10-17 14:44:24 -04:00
										 |  |  | 	u32			xid;		/* Next XID value to use */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	struct rpc_task *	snd_task;	/* Task blocked in send */ | 
					
						
							| 
									
										
										
										
											2009-09-10 17:32:28 +03:00
										 |  |  | 	struct svc_xprt		*bc_xprt;	/* NFSv4.1 backchannel */ | 
					
						
							| 
									
										
										
										
											2011-07-13 19:20:49 -04:00
										 |  |  | #if defined(CONFIG_SUNRPC_BACKCHANNEL)
 | 
					
						
							| 
									
										
										
										
											2009-04-01 09:22:58 -04:00
										 |  |  | 	struct svc_serv		*bc_serv;       /* The RPC service which will */ | 
					
						
							|  |  |  | 						/* process the callback */ | 
					
						
							| 
									
										
										
										
											2009-04-01 09:23:00 -04:00
										 |  |  | 	unsigned int		bc_alloc_count;	/* Total number of preallocs */ | 
					
						
							| 
									
										
										
										
											2009-04-01 09:22:58 -04:00
										 |  |  | 	spinlock_t		bc_pa_lock;	/* Protects the preallocated
 | 
					
						
							|  |  |  | 						 * items */ | 
					
						
							|  |  |  | 	struct list_head	bc_pa_list;	/* List of preallocated
 | 
					
						
							|  |  |  | 						 * backchannel rpc_rqst's */ | 
					
						
							| 
									
										
										
										
											2011-07-13 19:20:49 -04:00
										 |  |  | #endif /* CONFIG_SUNRPC_BACKCHANNEL */
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	struct list_head	recv; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-03-20 13:44:16 -05:00
										 |  |  | 	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 */ | 
					
						
							| 
									
										
										
										
											2012-02-14 16:19:18 -05:00
										 |  |  | 					bad_xids,	/* lookup_rqst didn't find XID */ | 
					
						
							|  |  |  | 					max_slots;	/* max rpc_slots used */ | 
					
						
							| 
									
										
										
										
											2006-03-20 13:44:16 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		unsigned long long	req_u,		/* average requests on the wire */ | 
					
						
							| 
									
										
										
										
											2012-02-14 16:19:18 -05:00
										 |  |  | 					bklog_u,	/* backlog queue utilization */ | 
					
						
							|  |  |  | 					sending_u,	/* send q utilization */ | 
					
						
							|  |  |  | 					pending_u;	/* pend q utilization */ | 
					
						
							| 
									
										
										
										
											2006-03-20 13:44:16 -05:00
										 |  |  | 	} stat; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-29 16:05:43 +04:00
										 |  |  | 	struct net		*xprt_net; | 
					
						
							| 
									
										
										
										
											2012-03-01 17:01:05 -05:00
										 |  |  | 	const char		*servername; | 
					
						
							| 
									
										
										
										
											2008-01-07 18:34:48 -05:00
										 |  |  | 	const char		*address_strings[RPC_DISPLAY_MAX]; | 
					
						
							| 
									
										
										
										
											2014-11-26 14:44:44 -05:00
										 |  |  | #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
 | 
					
						
							|  |  |  | 	struct dentry		*debugfs;		/* debugfs directory */ | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-13 19:20:49 -04:00
										 |  |  | #if defined(CONFIG_SUNRPC_BACKCHANNEL)
 | 
					
						
							| 
									
										
										
										
											2009-04-01 09:22:58 -04:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Backchannel flags | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define	RPC_BC_PA_IN_USE	0x0001		/* Preallocated backchannel */
 | 
					
						
							|  |  |  | 						/* buffer in use */ | 
					
						
							| 
									
										
										
										
											2011-07-13 19:20:49 -04:00
										 |  |  | #endif /* CONFIG_SUNRPC_BACKCHANNEL */
 | 
					
						
							| 
									
										
										
										
											2009-04-01 09:22:58 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-13 19:20:49 -04:00
										 |  |  | #if defined(CONFIG_SUNRPC_BACKCHANNEL)
 | 
					
						
							| 
									
										
										
										
											2009-04-01 09:23:03 -04:00
										 |  |  | 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; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-07-13 19:20:49 -04:00
										 |  |  | #endif /* CONFIG_SUNRPC_BACKCHANNEL */
 | 
					
						
							| 
									
										
										
										
											2009-04-01 09:23:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-14 11:42:00 -04:00
										 |  |  | #define XPRT_CREATE_INFINITE_SLOTS	(1U)
 | 
					
						
							| 
									
										
										
										
											2013-04-11 15:06:36 -04:00
										 |  |  | #define XPRT_CREATE_NO_IDLE_TIMEOUT	(1U << 1)
 | 
					
						
							| 
									
										
										
										
											2013-04-14 11:42:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-10 13:47:07 -04:00
										 |  |  | struct xprt_create { | 
					
						
							| 
									
										
										
										
											2007-09-10 13:47:57 -04:00
										 |  |  | 	int			ident;		/* XPRT_TRANSPORT identifier */ | 
					
						
							| 
									
										
										
										
											2010-09-29 16:05:12 +04:00
										 |  |  | 	struct net *		net; | 
					
						
							| 
									
										
										
										
											2007-07-09 22:23:35 +02:00
										 |  |  | 	struct sockaddr *	srcaddr;	/* optional local address */ | 
					
						
							| 
									
										
										
										
											2007-07-08 13:08:54 +02:00
										 |  |  | 	struct sockaddr *	dstaddr;	/* remote peer address */ | 
					
						
							|  |  |  | 	size_t			addrlen; | 
					
						
							| 
									
										
										
										
											2012-03-01 17:01:05 -05:00
										 |  |  | 	const char		*servername; | 
					
						
							| 
									
										
										
										
											2009-09-10 17:33:30 +03:00
										 |  |  | 	struct svc_xprt		*bc_xprt;	/* NFSv4.1 backchannel */ | 
					
						
							| 
									
										
										
										
											2013-04-14 11:42:00 -04:00
										 |  |  | 	unsigned int		flags; | 
					
						
							| 
									
										
										
										
											2007-07-08 13:08:54 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-10 13:46:00 -04:00
										 |  |  | struct xprt_class { | 
					
						
							|  |  |  | 	struct list_head	list; | 
					
						
							| 
									
										
										
										
											2007-09-10 13:47:57 -04:00
										 |  |  | 	int			ident;		/* XPRT_TRANSPORT identifier */ | 
					
						
							| 
									
										
										
										
											2007-09-10 13:47:07 -04:00
										 |  |  | 	struct rpc_xprt *	(*setup)(struct xprt_create *); | 
					
						
							| 
									
										
										
										
											2007-09-10 13:46:00 -04:00
										 |  |  | 	struct module		*owner; | 
					
						
							|  |  |  | 	char			name[32]; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:47 -04:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Generic internal transport functions | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2007-09-10 13:47:07 -04:00
										 |  |  | struct rpc_xprt		*xprt_create_transport(struct xprt_create *args); | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:47 -04:00
										 |  |  | void			xprt_connect(struct rpc_task *task); | 
					
						
							|  |  |  | void			xprt_reserve(struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2013-04-14 10:49:37 -04:00
										 |  |  | void			xprt_retry_reserve(struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2011-07-17 16:01:03 -04:00
										 |  |  | int			xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task); | 
					
						
							|  |  |  | int			xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2012-09-07 11:08:50 -04:00
										 |  |  | void			xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task); | 
					
						
							|  |  |  | void			xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2013-09-25 12:17:18 -04:00
										 |  |  | bool			xprt_prepare_transmit(struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:47 -04:00
										 |  |  | void			xprt_transmit(struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2006-07-27 17:22:50 -04:00
										 |  |  | void			xprt_end_transmit(struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | int			xprt_adjust_timeout(struct rpc_rqst *req); | 
					
						
							| 
									
										
										
										
											2005-08-25 16:25:51 -07:00
										 |  |  | 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); | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:47 -04:00
										 |  |  | void			xprt_release(struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2006-09-05 12:55:57 -04:00
										 |  |  | void			xprt_put(struct rpc_xprt *xprt); | 
					
						
							| 
									
										
										
										
											2011-07-17 18:11:30 -04:00
										 |  |  | struct rpc_xprt *	xprt_alloc(struct net *net, size_t size, | 
					
						
							|  |  |  | 				unsigned int num_prealloc, | 
					
						
							|  |  |  | 				unsigned int max_req); | 
					
						
							| 
									
										
										
										
											2010-09-29 16:03:13 +04:00
										 |  |  | void			xprt_free(struct rpc_xprt *); | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-24 11:59:46 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * xprt_get - return a reference to an RPC transport. | 
					
						
							|  |  |  |  * @xprt: pointer to the transport | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static inline struct rpc_xprt *xprt_get(struct rpc_xprt *xprt) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (atomic_inc_not_zero(&xprt->count)) | 
					
						
							|  |  |  | 		return xprt; | 
					
						
							|  |  |  | 	return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-09-26 22:29:38 -07:00
										 |  |  | static inline __be32 *xprt_skip_transport_header(struct rpc_xprt *xprt, __be32 *p) | 
					
						
							| 
									
										
										
										
											2005-08-25 16:25:49 -07:00
										 |  |  | { | 
					
						
							|  |  |  | 	return p + xprt->tsh_size; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:47 -04:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Transport switch helper functions | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2007-09-10 13:46:00 -04:00
										 |  |  | int			xprt_register_transport(struct xprt_class *type); | 
					
						
							|  |  |  | int			xprt_unregister_transport(struct xprt_class *type); | 
					
						
							| 
									
										
										
										
											2009-03-11 14:37:56 -04:00
										 |  |  | int			xprt_load_transport(const char *); | 
					
						
							| 
									
										
										
										
											2005-08-25 16:25:50 -07:00
										 |  |  | void			xprt_set_retrans_timeout_def(struct rpc_task *task); | 
					
						
							|  |  |  | void			xprt_set_retrans_timeout_rtt(struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:47 -04:00
										 |  |  | void			xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status); | 
					
						
							| 
									
										
										
										
											2008-04-17 18:52:19 -04:00
										 |  |  | void			xprt_wait_for_buffer_space(struct rpc_task *task, rpc_action action); | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:50 -04:00
										 |  |  | void			xprt_write_space(struct rpc_xprt *xprt); | 
					
						
							| 
									
										
										
										
											2013-01-08 09:48:15 -05:00
										 |  |  | void			xprt_adjust_cwnd(struct rpc_xprt *xprt, struct rpc_task *task, int result); | 
					
						
							| 
									
										
										
										
											2006-09-26 22:29:38 -07:00
										 |  |  | struct rpc_rqst *	xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid); | 
					
						
							| 
									
										
										
										
											2005-08-25 16:25:52 -07:00
										 |  |  | void			xprt_complete_rqst(struct rpc_task *task, int copied); | 
					
						
							| 
									
										
										
										
											2005-08-25 16:25:53 -07:00
										 |  |  | void			xprt_release_rqst_cong(struct rpc_task *task); | 
					
						
							| 
									
										
										
										
											2007-11-06 18:44:20 -05:00
										 |  |  | void			xprt_disconnect_done(struct rpc_xprt *xprt); | 
					
						
							| 
									
										
										
										
											2007-11-06 10:18:36 -05:00
										 |  |  | void			xprt_force_disconnect(struct rpc_xprt *xprt); | 
					
						
							| 
									
										
										
										
											2008-04-17 16:52:57 -04:00
										 |  |  | void			xprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie); | 
					
						
							| 
									
										
										
										
											2012-07-31 16:45:12 -07:00
										 |  |  | int			xs_swapper(struct rpc_xprt *xprt, int enable); | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:38 -04:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Reserved bit positions in xprt->state | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define XPRT_LOCKED		(0)
 | 
					
						
							|  |  |  | #define XPRT_CONNECTED		(1)
 | 
					
						
							|  |  |  | #define XPRT_CONNECTING		(2)
 | 
					
						
							| 
									
										
										
										
											2006-01-03 09:55:55 +01:00
										 |  |  | #define XPRT_CLOSE_WAIT		(3)
 | 
					
						
							| 
									
										
										
										
											2006-08-22 20:06:15 -04:00
										 |  |  | #define XPRT_BOUND		(4)
 | 
					
						
							| 
									
										
										
										
											2006-08-22 20:06:15 -04:00
										 |  |  | #define XPRT_BINDING		(5)
 | 
					
						
							| 
									
										
										
										
											2007-11-05 17:42:39 -05:00
										 |  |  | #define XPRT_CLOSING		(6)
 | 
					
						
							| 
									
										
										
										
											2009-03-11 14:38:03 -04:00
										 |  |  | #define XPRT_CONNECTION_ABORT	(7)
 | 
					
						
							| 
									
										
										
										
											2009-04-21 17:18:20 -04:00
										 |  |  | #define XPRT_CONNECTION_CLOSE	(8)
 | 
					
						
							| 
									
										
										
										
											2013-04-14 10:49:37 -04:00
										 |  |  | #define XPRT_CONGESTED		(9)
 | 
					
						
							| 
									
										
										
										
											2014-09-23 12:26:19 -04:00
										 |  |  | #define XPRT_CONNECTION_REUSE	(10)
 | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:38 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-03-17 18:06:10 +01:00
										 |  |  | 	smp_mb__before_atomic(); | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:38 -04:00
										 |  |  | 	clear_bit(XPRT_CONNECTING, &xprt->state); | 
					
						
							| 
									
										
										
										
											2014-03-17 18:06:10 +01:00
										 |  |  | 	smp_mb__after_atomic(); | 
					
						
							| 
									
										
										
										
											2005-08-11 16:25:38 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-22 20:06:15 -04:00
										 |  |  | 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); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-22 20:06:15 -04:00
										 |  |  | static inline void xprt_clear_binding(struct rpc_xprt *xprt) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-03-17 18:06:10 +01:00
										 |  |  | 	smp_mb__before_atomic(); | 
					
						
							| 
									
										
										
										
											2006-08-22 20:06:15 -04:00
										 |  |  | 	clear_bit(XPRT_BINDING, &xprt->state); | 
					
						
							| 
									
										
										
										
											2014-03-17 18:06:10 +01:00
										 |  |  | 	smp_mb__after_atomic(); | 
					
						
							| 
									
										
										
										
											2006-08-22 20:06:15 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline int xprt_test_and_set_binding(struct rpc_xprt *xprt) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return test_and_set_bit(XPRT_BINDING, &xprt->state); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #endif /* __KERNEL__*/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* _LINUX_SUNRPC_XPRT_H */
 |