Blame view

include/linux/sunrpc/clnt.h 9.33 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
  /*
   *  linux/include/linux/sunrpc/clnt.h
   *
   *  Declarations for the high-level RPC client interface
   *
   *  Copyright (C) 1995, 1996, Olaf Kirch <okir@monad.swb.de>
   */
  
  #ifndef _LINUX_SUNRPC_CLNT_H
  #define _LINUX_SUNRPC_CLNT_H
d77385f23   Trond Myklebust   SUNRPC: Fix rpc_s...
11
  #include <linux/types.h>
a02d69261   Chuck Lever   SUNRPC: Provide f...
12
13
14
  #include <linux/socket.h>
  #include <linux/in.h>
  #include <linux/in6.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
17
18
19
20
21
22
  #include <linux/sunrpc/msg_prot.h>
  #include <linux/sunrpc/sched.h>
  #include <linux/sunrpc/xprt.h>
  #include <linux/sunrpc/auth.h>
  #include <linux/sunrpc/stats.h>
  #include <linux/sunrpc/xdr.h>
  #include <linux/sunrpc/timer.h>
  #include <asm/signal.h>
7d217caca   Trond Myklebust   SUNRPC: Replace r...
23
  #include <linux/path.h>
4516fc045   Jeff Layton   sunrpc: add routi...
24
  #include <net/ipv6.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
28
29
30
31
  struct rpc_inode;
  
  /*
   * The high-level client handle
   */
  struct rpc_clnt {
006abe887   Trond Myklebust   SUNRPC: Fix a rac...
32
  	atomic_t		cl_count;	/* Number of references */
6529eba08   Trond Myklebust   SUNRPC: Move rpc_...
33
34
  	struct list_head	cl_clients;	/* Global list of clients */
  	struct list_head	cl_tasks;	/* List of tasks */
4bef61ff7   Trond Myklebust   SUNRPC: Add a per...
35
  	spinlock_t		cl_lock;	/* spinlock */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
37
  	struct rpc_xprt *	cl_xprt;	/* transport */
  	struct rpc_procinfo *	cl_procinfo;	/* procedure info */
4a68179d3   Chuck Lever   SUNRPC: Make RPC ...
38
39
40
  	u32			cl_prog,	/* RPC program number */
  				cl_vers,	/* RPC version number */
  				cl_maxproc;	/* max procedure number */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
42
43
44
  
  	char *			cl_server;	/* server machine name */
  	char *			cl_protname;	/* protocol name */
  	struct rpc_auth *	cl_auth;	/* authenticator */
11c556b3d   Chuck Lever   SUNRPC: provide a...
45
46
  	struct rpc_stat *	cl_stats;	/* per-program statistics */
  	struct rpc_iostats *	cl_metrics;	/* per-client statistics */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
48
  
  	unsigned int		cl_softrtry : 1,/* soft timeouts */
43d78ef2b   Chuck Lever   NFS: disconnect b...
49
  				cl_discrtry : 1,/* disconnect before retry */
b6b6152c4   Olga Kornievskaia   rpc: bring back c...
50
51
  				cl_autobind : 1,/* use getport() */
  				cl_chatty   : 1;/* be verbose */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
  
  	struct rpc_rtt *	cl_rtt;		/* RTO estimator data */
ba7392bb3   Trond Myklebust   SUNRPC: Add suppo...
54
  	const struct rpc_timeout *cl_timeout;	/* Timeout strategy */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
56
57
  
  	int			cl_nodelen;	/* nodename length */
  	char 			cl_nodename[UNX_MAXNODENAME];
7d217caca   Trond Myklebust   SUNRPC: Replace r...
58
  	struct path		cl_path;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
60
  	struct rpc_clnt *	cl_parent;	/* Points to parent of clones */
  	struct rpc_rtt		cl_rtt_default;
ba7392bb3   Trond Myklebust   SUNRPC: Add suppo...
61
  	struct rpc_timeout	cl_timeout_default;
3e32a5d99   Trond Myklebust   SUNRPC: Give clon...
62
  	struct rpc_program *	cl_program;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63
  	char			cl_inline_name[32];
608207e88   Olga Kornievskaia   rpc: pass target ...
64
  	char			*cl_principal;	/* target to authenticate to */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
65
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
  
  /*
   * General RPC program info
   */
  #define RPC_MAXVERSION		4
  struct rpc_program {
  	char *			name;		/* protocol name */
  	u32			number;		/* program number */
  	unsigned int		nrvers;		/* number of versions */
  	struct rpc_version **	version;	/* version array */
  	struct rpc_stat *	stats;		/* statistics */
  	char *			pipe_dir_name;	/* path to rpc_pipefs dir */
  };
  
  struct rpc_version {
  	u32			number;		/* version number */
  	unsigned int		nrprocs;	/* number of procs */
  	struct rpc_procinfo *	procs;		/* procedure array */
  };
  
  /*
   * Procedure information
   */
  struct rpc_procinfo {
  	u32			p_proc;		/* RPC procedure number */
9f06c719f   Chuck Lever   SUNRPC: New xdr_s...
91
  	kxdreproc_t		p_encode;	/* XDR encode function */
bf2695516   Chuck Lever   SUNRPC: New xdr_s...
92
  	kxdrdproc_t		p_decode;	/* XDR decode function */
2bea90d43   Chuck Lever   SUNRPC: RPC buffe...
93
94
  	unsigned int		p_arglen;	/* argument hdr length (u32) */
  	unsigned int		p_replen;	/* reply hdr length (u32) */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
95
96
  	unsigned int		p_count;	/* call count */
  	unsigned int		p_timer;	/* Which RTT timer to use */
cc0175c1d   Chuck Lever   SUNRPC: display h...
97
98
  	u32			p_statidx;	/* Which procedure to account */
  	char *			p_name;		/* name of procedure */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
  #ifdef __KERNEL__
c2866763b   Chuck Lever   SUNRPC: use socka...
101
  struct rpc_create_args {
c653ce3f0   Pavel Emelyanov   sunrpc: Add net t...
102
  	struct net		*net;
c2866763b   Chuck Lever   SUNRPC: use socka...
103
104
105
  	int			protocol;
  	struct sockaddr		*address;
  	size_t			addrsize;
d3bc9a1de   Frank van Maarseveen   SUNRPC client: ad...
106
  	struct sockaddr		*saddress;
ba7392bb3   Trond Myklebust   SUNRPC: Add suppo...
107
  	const struct rpc_timeout *timeout;
c2866763b   Chuck Lever   SUNRPC: use socka...
108
109
  	char			*servername;
  	struct rpc_program	*program;
d5b337b48   Benny Halevy   nfsd: use nfs cli...
110
  	u32			prognumber;	/* overrides program->number */
c2866763b   Chuck Lever   SUNRPC: use socka...
111
112
113
  	u32			version;
  	rpc_authflavor_t	authflavor;
  	unsigned long		flags;
608207e88   Olga Kornievskaia   rpc: pass target ...
114
  	char			*client_name;
f300baba5   Alexandros Batsakis   nfsd41: sunrpc: a...
115
  	struct svc_xprt		*bc_xprt;	/* NFSv4.1 backchannel */
c2866763b   Chuck Lever   SUNRPC: use socka...
116
117
118
119
  };
  
  /* Values for "flags" field */
  #define RPC_CLNT_CREATE_HARDRTRY	(1UL << 0)
c2866763b   Chuck Lever   SUNRPC: use socka...
120
  #define RPC_CLNT_CREATE_AUTOBIND	(1UL << 2)
90c5755ff   Trond Myklebust   SUNRPC: Kill rpc_...
121
122
123
  #define RPC_CLNT_CREATE_NONPRIVPORT	(1UL << 3)
  #define RPC_CLNT_CREATE_NOPING		(1UL << 4)
  #define RPC_CLNT_CREATE_DISCRTRY	(1UL << 5)
b6b6152c4   Olga Kornievskaia   rpc: bring back c...
124
  #define RPC_CLNT_CREATE_QUIET		(1UL << 6)
c2866763b   Chuck Lever   SUNRPC: use socka...
125
126
  
  struct rpc_clnt *rpc_create(struct rpc_create_args *args);
007e251f2   Andreas Gruenbacher   [PATCH] RPC: Allo...
127
  struct rpc_clnt	*rpc_bind_new_program(struct rpc_clnt *,
89eb21c35   Chuck Lever   SUNRPC: fix a sig...
128
  				struct rpc_program *, u32);
cbdabc7f8   Andy Adamson   NFSv4.1: filelayo...
129
  void rpc_task_reset_client(struct rpc_task *task, struct rpc_clnt *clnt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130
  struct rpc_clnt *rpc_clone_client(struct rpc_clnt *);
4c402b409   Trond Myklebust   SUNRPC: Remove rp...
131
  void		rpc_shutdown_client(struct rpc_clnt *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
132
  void		rpc_release_client(struct rpc_clnt *);
58f9612c6   Trond Myklebust   SUNRPC: Move rema...
133
  void		rpc_task_release_client(struct rpc_task *);
cce63cd63   Chuck Lever   SUNRPC: Rename rp...
134

d99085605   Stanislav Kinsbursky   SUNRPC: introduce...
135
136
  int		rpcb_create_local(void);
  void		rpcb_put_local(void);
14aeb2118   Chuck Lever   SUNRPC: Simplify ...
137
  int		rpcb_register(u32, u32, int, unsigned short);
c2e1b09ff   Chuck Lever   SUNRPC: Support r...
138
139
  int		rpcb_v4_register(const u32 program, const u32 version,
  				 const struct sockaddr *address,
14aeb2118   Chuck Lever   SUNRPC: Simplify ...
140
  				 const char *netid);
45160d627   Chuck Lever   SUNRPC: Rename rp...
141
  void		rpcb_getport_async(struct rpc_task *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142

77de2c590   Trond Myklebust   SUNRPC: Add a hel...
143
  void		rpc_call_start(struct rpc_task *);
cbc200592   Trond Myklebust   SUNRPC: Declare a...
144
145
146
  int		rpc_call_async(struct rpc_clnt *clnt,
  			       const struct rpc_message *msg, int flags,
  			       const struct rpc_call_ops *tk_ops,
963d8fe53   Trond Myklebust   RPC: Clean up RPC...
147
  			       void *calldata);
cbc200592   Trond Myklebust   SUNRPC: Declare a...
148
149
  int		rpc_call_sync(struct rpc_clnt *clnt,
  			      const struct rpc_message *msg, int flags);
5e1550d6a   Trond Myklebust   SUNRPC: Add the h...
150
151
  struct rpc_task *rpc_call_null(struct rpc_clnt *clnt, struct rpc_cred *cred,
  			       int flags);
f1f88fc7e   Trond Myklebust   SUNRPC: The funct...
152
153
  int		rpc_restart_call_prepare(struct rpc_task *);
  int		rpc_restart_call(struct rpc_task *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
154
155
  void		rpc_setbufsize(struct rpc_clnt *, unsigned int, unsigned int);
  size_t		rpc_max_payload(struct rpc_clnt *);
35f5a422c   Chuck Lever   SUNRPC: new inter...
156
  void		rpc_force_rebind(struct rpc_clnt *);
ed39440a2   Chuck Lever   SUNRPC: create AP...
157
  size_t		rpc_peeraddr(struct rpc_clnt *, struct sockaddr *, size_t);
b454ae906   Chuck Lever   SUNRPC: fewer con...
158
  const char	*rpc_peeraddr2str(struct rpc_clnt *, enum rpc_display_format_t);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
159

a02d69261   Chuck Lever   SUNRPC: Provide f...
160
161
162
  size_t		rpc_ntop(const struct sockaddr *, char *, const size_t);
  size_t		rpc_pton(const char *, const size_t,
  			 struct sockaddr *, const size_t);
d77385f23   Trond Myklebust   SUNRPC: Fix rpc_s...
163
  char *		rpc_sockaddr2uaddr(const struct sockaddr *, gfp_t);
a02d69261   Chuck Lever   SUNRPC: Provide f...
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
  size_t		rpc_uaddr2sockaddr(const char *, const size_t,
  				   struct sockaddr *, const size_t);
  
  static inline unsigned short rpc_get_port(const struct sockaddr *sap)
  {
  	switch (sap->sa_family) {
  	case AF_INET:
  		return ntohs(((struct sockaddr_in *)sap)->sin_port);
  	case AF_INET6:
  		return ntohs(((struct sockaddr_in6 *)sap)->sin6_port);
  	}
  	return 0;
  }
  
  static inline void rpc_set_port(struct sockaddr *sap,
  				const unsigned short port)
  {
  	switch (sap->sa_family) {
  	case AF_INET:
  		((struct sockaddr_in *)sap)->sin_port = htons(port);
  		break;
  	case AF_INET6:
  		((struct sockaddr_in6 *)sap)->sin6_port = htons(port);
  		break;
  	}
  }
  
  #define IPV6_SCOPE_DELIMITER		'%'
  #define IPV6_SCOPE_ID_LEN		sizeof("%nnnnnnnnnn")
4516fc045   Jeff Layton   sunrpc: add routi...
193
194
195
196
197
198
199
200
  static inline bool __rpc_cmp_addr4(const struct sockaddr *sap1,
  				   const struct sockaddr *sap2)
  {
  	const struct sockaddr_in *sin1 = (const struct sockaddr_in *)sap1;
  	const struct sockaddr_in *sin2 = (const struct sockaddr_in *)sap2;
  
  	return sin1->sin_addr.s_addr == sin2->sin_addr.s_addr;
  }
be3ad6b0b   Jeff Layton   sunrpc: add commo...
201
202
203
204
205
206
207
208
209
210
  static inline bool __rpc_copy_addr4(struct sockaddr *dst,
  				    const struct sockaddr *src)
  {
  	const struct sockaddr_in *ssin = (struct sockaddr_in *) src;
  	struct sockaddr_in *dsin = (struct sockaddr_in *) dst;
  
  	dsin->sin_family = ssin->sin_family;
  	dsin->sin_addr.s_addr = ssin->sin_addr.s_addr;
  	return true;
  }
dfd56b8b3   Eric Dumazet   net: use IS_ENABL...
211
  #if IS_ENABLED(CONFIG_IPV6)
4516fc045   Jeff Layton   sunrpc: add routi...
212
213
214
215
216
  static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1,
  				   const struct sockaddr *sap2)
  {
  	const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sap1;
  	const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2;
038c01598   Mi Jinlong   SUNRPC: compare s...
217
218
219
220
221
222
223
  
  	if (!ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr))
  		return false;
  	else if (ipv6_addr_type(&sin1->sin6_addr) & IPV6_ADDR_LINKLOCAL)
  		return sin1->sin6_scope_id == sin2->sin6_scope_id;
  
  	return true;
4516fc045   Jeff Layton   sunrpc: add routi...
224
  }
be3ad6b0b   Jeff Layton   sunrpc: add commo...
225
226
227
228
229
230
231
232
  
  static inline bool __rpc_copy_addr6(struct sockaddr *dst,
  				    const struct sockaddr *src)
  {
  	const struct sockaddr_in6 *ssin6 = (const struct sockaddr_in6 *) src;
  	struct sockaddr_in6 *dsin6 = (struct sockaddr_in6 *) dst;
  
  	dsin6->sin6_family = ssin6->sin6_family;
4e3fd7a06   Alexey Dobriyan   net: remove ipv6_...
233
  	dsin6->sin6_addr = ssin6->sin6_addr;
be3ad6b0b   Jeff Layton   sunrpc: add commo...
234
235
  	return true;
  }
dfd56b8b3   Eric Dumazet   net: use IS_ENABL...
236
  #else	/* !(IS_ENABLED(CONFIG_IPV6) */
4516fc045   Jeff Layton   sunrpc: add routi...
237
238
239
240
241
  static inline bool __rpc_cmp_addr6(const struct sockaddr *sap1,
  				   const struct sockaddr *sap2)
  {
  	return false;
  }
be3ad6b0b   Jeff Layton   sunrpc: add commo...
242
243
244
245
246
247
  
  static inline bool __rpc_copy_addr6(struct sockaddr *dst,
  				    const struct sockaddr *src)
  {
  	return false;
  }
dfd56b8b3   Eric Dumazet   net: use IS_ENABL...
248
  #endif	/* !(IS_ENABLED(CONFIG_IPV6) */
4516fc045   Jeff Layton   sunrpc: add routi...
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
  
  /**
   * rpc_cmp_addr - compare the address portion of two sockaddrs.
   * @sap1: first sockaddr
   * @sap2: second sockaddr
   *
   * Just compares the family and address portion. Ignores port, scope, etc.
   * Returns true if the addrs are equal, false if they aren't.
   */
  static inline bool rpc_cmp_addr(const struct sockaddr *sap1,
  				const struct sockaddr *sap2)
  {
  	if (sap1->sa_family == sap2->sa_family) {
  		switch (sap1->sa_family) {
  		case AF_INET:
  			return __rpc_cmp_addr4(sap1, sap2);
  		case AF_INET6:
  			return __rpc_cmp_addr6(sap1, sap2);
  		}
  	}
  	return false;
  }
be3ad6b0b   Jeff Layton   sunrpc: add commo...
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
  /**
   * rpc_copy_addr - copy the address portion of one sockaddr to another
   * @dst: destination sockaddr
   * @src: source sockaddr
   *
   * Just copies the address portion and family. Ignores port, scope, etc.
   * Caller is responsible for making certain that dst is large enough to hold
   * the address in src. Returns true if address family is supported. Returns
   * false otherwise.
   */
  static inline bool rpc_copy_addr(struct sockaddr *dst,
  				 const struct sockaddr *src)
  {
  	switch (src->sa_family) {
  	case AF_INET:
  		return __rpc_copy_addr4(dst, src);
  	case AF_INET6:
  		return __rpc_copy_addr6(dst, src);
  	}
  	return false;
  }
fbf4665f4   Jeff Layton   nfsd: populate si...
292
293
294
295
296
297
298
299
300
301
302
303
304
305
  /**
   * rpc_get_scope_id - return scopeid for a given sockaddr
   * @sa: sockaddr to get scopeid from
   *
   * Returns the value of the sin6_scope_id for AF_INET6 addrs, or 0 if
   * not an AF_INET6 address.
   */
  static inline u32 rpc_get_scope_id(const struct sockaddr *sa)
  {
  	if (sa->sa_family != AF_INET6)
  		return 0;
  
  	return ((struct sockaddr_in6 *) sa)->sin6_scope_id;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
306
307
  #endif /* __KERNEL__ */
  #endif /* _LINUX_SUNRPC_CLNT_H */