1
2
3
4
5
6
7
8
9
10#ifndef _LINUX_SUNRPC_CLNT_H
11#define _LINUX_SUNRPC_CLNT_H
12
13#include <linux/types.h>
14#include <linux/socket.h>
15#include <linux/in.h>
16#include <linux/in6.h>
17
18#include <linux/sunrpc/msg_prot.h>
19#include <linux/sunrpc/sched.h>
20#include <linux/sunrpc/xprt.h>
21#include <linux/sunrpc/auth.h>
22#include <linux/sunrpc/stats.h>
23#include <linux/sunrpc/xdr.h>
24#include <linux/sunrpc/timer.h>
25#include <linux/sunrpc/rpc_pipe_fs.h>
26#include <asm/signal.h>
27#include <linux/path.h>
28#include <net/ipv6.h>
29#include <linux/sunrpc/xprtmultipath.h>
30
31struct rpc_inode;
32
33
34
35
36struct rpc_clnt {
37 atomic_t cl_count;
38 unsigned int cl_clid;
39 struct list_head cl_clients;
40 struct list_head cl_tasks;
41 spinlock_t cl_lock;
42 struct rpc_xprt __rcu * cl_xprt;
43 const struct rpc_procinfo *cl_procinfo;
44 u32 cl_prog,
45 cl_vers,
46 cl_maxproc;
47
48 struct rpc_auth * cl_auth;
49 struct rpc_stat * cl_stats;
50 struct rpc_iostats * cl_metrics;
51
52 unsigned int cl_softrtry : 1,
53 cl_discrtry : 1,
54 cl_noretranstimeo: 1,
55 cl_autobind : 1,
56 cl_chatty : 1;
57
58 struct rpc_rtt * cl_rtt;
59 const struct rpc_timeout *cl_timeout;
60
61 atomic_t cl_swapper;
62 int cl_nodelen;
63 char cl_nodename[UNX_MAXNODENAME+1];
64 struct rpc_pipe_dir_head cl_pipedir_objects;
65 struct rpc_clnt * cl_parent;
66 struct rpc_rtt cl_rtt_default;
67 struct rpc_timeout cl_timeout_default;
68 const struct rpc_program *cl_program;
69#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
70 struct dentry *cl_debugfs;
71#endif
72 struct rpc_xprt_iter cl_xpi;
73};
74
75
76
77
78#define RPC_MAXVERSION 4
79struct rpc_program {
80 const char * name;
81 u32 number;
82 unsigned int nrvers;
83 const struct rpc_version ** version;
84 struct rpc_stat * stats;
85 const char * pipe_dir_name;
86};
87
88struct rpc_version {
89 u32 number;
90 unsigned int nrprocs;
91 const struct rpc_procinfo *procs;
92 unsigned int *counts;
93};
94
95
96
97
98struct rpc_procinfo {
99 u32 p_proc;
100 kxdreproc_t p_encode;
101 kxdrdproc_t p_decode;
102 unsigned int p_arglen;
103 unsigned int p_replen;
104 unsigned int p_timer;
105 u32 p_statidx;
106 const char * p_name;
107};
108
109#ifdef __KERNEL__
110
111struct rpc_create_args {
112 struct net *net;
113 int protocol;
114 struct sockaddr *address;
115 size_t addrsize;
116 struct sockaddr *saddress;
117 const struct rpc_timeout *timeout;
118 const char *servername;
119 const char *nodename;
120 const struct rpc_program *program;
121 u32 prognumber;
122 u32 version;
123 rpc_authflavor_t authflavor;
124 unsigned long flags;
125 char *client_name;
126 struct svc_xprt *bc_xprt;
127};
128
129struct rpc_add_xprt_test {
130 int (*add_xprt_test)(struct rpc_clnt *,
131 struct rpc_xprt *,
132 void *calldata);
133 void *data;
134};
135
136
137#define RPC_CLNT_CREATE_HARDRTRY (1UL << 0)
138#define RPC_CLNT_CREATE_AUTOBIND (1UL << 2)
139#define RPC_CLNT_CREATE_NONPRIVPORT (1UL << 3)
140#define RPC_CLNT_CREATE_NOPING (1UL << 4)
141#define RPC_CLNT_CREATE_DISCRTRY (1UL << 5)
142#define RPC_CLNT_CREATE_QUIET (1UL << 6)
143#define RPC_CLNT_CREATE_INFINITE_SLOTS (1UL << 7)
144#define RPC_CLNT_CREATE_NO_IDLE_TIMEOUT (1UL << 8)
145#define RPC_CLNT_CREATE_NO_RETRANS_TIMEOUT (1UL << 9)
146
147struct rpc_clnt *rpc_create(struct rpc_create_args *args);
148struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *,
149 const struct rpc_program *, u32);
150struct rpc_clnt *rpc_clone_client(struct rpc_clnt *);
151struct rpc_clnt *rpc_clone_client_set_auth(struct rpc_clnt *,
152 rpc_authflavor_t);
153int rpc_switch_client_transport(struct rpc_clnt *,
154 struct xprt_create *,
155 const struct rpc_timeout *);
156
157void rpc_shutdown_client(struct rpc_clnt *);
158void rpc_release_client(struct rpc_clnt *);
159void rpc_task_release_client(struct rpc_task *);
160
161int rpcb_create_local(struct net *);
162void rpcb_put_local(struct net *);
163int rpcb_register(struct net *, u32, u32, int, unsigned short);
164int rpcb_v4_register(struct net *net, const u32 program,
165 const u32 version,
166 const struct sockaddr *address,
167 const char *netid);
168void rpcb_getport_async(struct rpc_task *);
169
170void rpc_call_start(struct rpc_task *);
171int rpc_call_async(struct rpc_clnt *clnt,
172 const struct rpc_message *msg, int flags,
173 const struct rpc_call_ops *tk_ops,
174 void *calldata);
175int rpc_call_sync(struct rpc_clnt *clnt,
176 const struct rpc_message *msg, int flags);
177struct rpc_task *rpc_call_null(struct rpc_clnt *clnt, struct rpc_cred *cred,
178 int flags);
179int rpc_restart_call_prepare(struct rpc_task *);
180int rpc_restart_call(struct rpc_task *);
181void rpc_setbufsize(struct rpc_clnt *, unsigned int, unsigned int);
182struct net * rpc_net_ns(struct rpc_clnt *);
183size_t rpc_max_payload(struct rpc_clnt *);
184size_t rpc_max_bc_payload(struct rpc_clnt *);
185void rpc_force_rebind(struct rpc_clnt *);
186size_t rpc_peeraddr(struct rpc_clnt *, struct sockaddr *, size_t);
187const char *rpc_peeraddr2str(struct rpc_clnt *, enum rpc_display_format_t);
188int rpc_localaddr(struct rpc_clnt *, struct sockaddr *, size_t);
189
190int rpc_clnt_iterate_for_each_xprt(struct rpc_clnt *clnt,
191 int (*fn)(struct rpc_clnt *, struct rpc_xprt *, void *),
192 void *data);
193
194int rpc_clnt_test_and_add_xprt(struct rpc_clnt *clnt,
195 struct rpc_xprt_switch *xps,
196 struct rpc_xprt *xprt,
197 void *dummy);
198int rpc_clnt_add_xprt(struct rpc_clnt *, struct xprt_create *,
199 int (*setup)(struct rpc_clnt *,
200 struct rpc_xprt_switch *,
201 struct rpc_xprt *,
202 void *),
203 void *data);
204void rpc_set_connect_timeout(struct rpc_clnt *clnt,
205 unsigned long connect_timeout,
206 unsigned long reconnect_timeout);
207
208int rpc_clnt_setup_test_and_add_xprt(struct rpc_clnt *,
209 struct rpc_xprt_switch *,
210 struct rpc_xprt *,
211 void *);
212
213const char *rpc_proc_name(const struct rpc_task *task);
214
215void rpc_clnt_xprt_switch_put(struct rpc_clnt *);
216void rpc_clnt_xprt_switch_add_xprt(struct rpc_clnt *, struct rpc_xprt *);
217bool rpc_clnt_xprt_switch_has_addr(struct rpc_clnt *clnt,
218 const struct sockaddr *sap);
219void rpc_cleanup_clids(void);
220
221static inline int rpc_reply_expected(struct rpc_task *task)
222{
223 return (task->tk_msg.rpc_proc != NULL) &&
224 (task->tk_msg.rpc_proc->p_decode != NULL);
225}
226
227#endif
228#endif
229