clnt.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * linux/include/linux/sunrpc/clnt.h
  4. *
  5. * Declarations for the high-level RPC client interface
  6. *
  7. * Copyright (C) 1995, 1996, Olaf Kirch <[email protected]>
  8. */
  9. #ifndef _LINUX_SUNRPC_CLNT_H
  10. #define _LINUX_SUNRPC_CLNT_H
  11. #include <linux/types.h>
  12. #include <linux/socket.h>
  13. #include <linux/in.h>
  14. #include <linux/in6.h>
  15. #include <linux/refcount.h>
  16. #include <linux/sunrpc/msg_prot.h>
  17. #include <linux/sunrpc/sched.h>
  18. #include <linux/sunrpc/xprt.h>
  19. #include <linux/sunrpc/auth.h>
  20. #include <linux/sunrpc/stats.h>
  21. #include <linux/sunrpc/xdr.h>
  22. #include <linux/sunrpc/timer.h>
  23. #include <linux/sunrpc/rpc_pipe_fs.h>
  24. #include <asm/signal.h>
  25. #include <linux/path.h>
  26. #include <net/ipv6.h>
  27. #include <linux/sunrpc/xprtmultipath.h>
  28. struct rpc_inode;
  29. struct rpc_sysfs_client;
  30. /*
  31. * The high-level client handle
  32. */
  33. struct rpc_clnt {
  34. refcount_t cl_count; /* Number of references */
  35. unsigned int cl_clid; /* client id */
  36. struct list_head cl_clients; /* Global list of clients */
  37. struct list_head cl_tasks; /* List of tasks */
  38. atomic_t cl_pid; /* task PID counter */
  39. spinlock_t cl_lock; /* spinlock */
  40. struct rpc_xprt __rcu * cl_xprt; /* transport */
  41. const struct rpc_procinfo *cl_procinfo; /* procedure info */
  42. u32 cl_prog, /* RPC program number */
  43. cl_vers, /* RPC version number */
  44. cl_maxproc; /* max procedure number */
  45. struct rpc_auth * cl_auth; /* authenticator */
  46. struct rpc_stat * cl_stats; /* per-program statistics */
  47. struct rpc_iostats * cl_metrics; /* per-client statistics */
  48. unsigned int cl_softrtry : 1,/* soft timeouts */
  49. cl_softerr : 1,/* Timeouts return errors */
  50. cl_discrtry : 1,/* disconnect before retry */
  51. cl_noretranstimeo: 1,/* No retransmit timeouts */
  52. cl_autobind : 1,/* use getport() */
  53. cl_chatty : 1;/* be verbose */
  54. struct rpc_rtt * cl_rtt; /* RTO estimator data */
  55. const struct rpc_timeout *cl_timeout; /* Timeout strategy */
  56. atomic_t cl_swapper; /* swapfile count */
  57. int cl_nodelen; /* nodename length */
  58. char cl_nodename[UNX_MAXNODENAME+1];
  59. struct rpc_pipe_dir_head cl_pipedir_objects;
  60. struct rpc_clnt * cl_parent; /* Points to parent of clones */
  61. struct rpc_rtt cl_rtt_default;
  62. struct rpc_timeout cl_timeout_default;
  63. const struct rpc_program *cl_program;
  64. const char * cl_principal; /* use for machine cred */
  65. #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
  66. struct dentry *cl_debugfs; /* debugfs directory */
  67. #endif
  68. struct rpc_sysfs_client *cl_sysfs; /* sysfs directory */
  69. /* cl_work is only needed after cl_xpi is no longer used,
  70. * and that are of similar size
  71. */
  72. union {
  73. struct rpc_xprt_iter cl_xpi;
  74. struct work_struct cl_work;
  75. };
  76. const struct cred *cl_cred;
  77. unsigned int cl_max_connect; /* max number of transports not to the same IP */
  78. struct super_block *pipefs_sb;
  79. };
  80. /*
  81. * General RPC program info
  82. */
  83. #define RPC_MAXVERSION 4
  84. struct rpc_program {
  85. const char * name; /* protocol name */
  86. u32 number; /* program number */
  87. unsigned int nrvers; /* number of versions */
  88. const struct rpc_version ** version; /* version array */
  89. struct rpc_stat * stats; /* statistics */
  90. const char * pipe_dir_name; /* path to rpc_pipefs dir */
  91. };
  92. struct rpc_version {
  93. u32 number; /* version number */
  94. unsigned int nrprocs; /* number of procs */
  95. const struct rpc_procinfo *procs; /* procedure array */
  96. unsigned int *counts; /* call counts */
  97. };
  98. /*
  99. * Procedure information
  100. */
  101. struct rpc_procinfo {
  102. u32 p_proc; /* RPC procedure number */
  103. kxdreproc_t p_encode; /* XDR encode function */
  104. kxdrdproc_t p_decode; /* XDR decode function */
  105. unsigned int p_arglen; /* argument hdr length (u32) */
  106. unsigned int p_replen; /* reply hdr length (u32) */
  107. unsigned int p_timer; /* Which RTT timer to use */
  108. u32 p_statidx; /* Which procedure to account */
  109. const char * p_name; /* name of procedure */
  110. };
  111. struct 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; /* overrides program->number */
  122. u32 version;
  123. rpc_authflavor_t authflavor;
  124. u32 nconnect;
  125. unsigned long flags;
  126. char *client_name;
  127. struct svc_xprt *bc_xprt; /* NFSv4.1 backchannel */
  128. const struct cred *cred;
  129. unsigned int max_connect;
  130. };
  131. struct rpc_add_xprt_test {
  132. void (*add_xprt_test)(struct rpc_clnt *clnt,
  133. struct rpc_xprt *xprt,
  134. void *calldata);
  135. void *data;
  136. };
  137. /* Values for "flags" field */
  138. #define RPC_CLNT_CREATE_HARDRTRY (1UL << 0)
  139. #define RPC_CLNT_CREATE_AUTOBIND (1UL << 2)
  140. #define RPC_CLNT_CREATE_NONPRIVPORT (1UL << 3)
  141. #define RPC_CLNT_CREATE_NOPING (1UL << 4)
  142. #define RPC_CLNT_CREATE_DISCRTRY (1UL << 5)
  143. #define RPC_CLNT_CREATE_QUIET (1UL << 6)
  144. #define RPC_CLNT_CREATE_INFINITE_SLOTS (1UL << 7)
  145. #define RPC_CLNT_CREATE_NO_IDLE_TIMEOUT (1UL << 8)
  146. #define RPC_CLNT_CREATE_NO_RETRANS_TIMEOUT (1UL << 9)
  147. #define RPC_CLNT_CREATE_SOFTERR (1UL << 10)
  148. #define RPC_CLNT_CREATE_REUSEPORT (1UL << 11)
  149. #define RPC_CLNT_CREATE_CONNECTED (1UL << 12)
  150. struct rpc_clnt *rpc_create(struct rpc_create_args *args);
  151. struct rpc_clnt *rpc_bind_new_program(struct rpc_clnt *,
  152. const struct rpc_program *, u32);
  153. struct rpc_clnt *rpc_clone_client(struct rpc_clnt *);
  154. struct rpc_clnt *rpc_clone_client_set_auth(struct rpc_clnt *,
  155. rpc_authflavor_t);
  156. int rpc_switch_client_transport(struct rpc_clnt *,
  157. struct xprt_create *,
  158. const struct rpc_timeout *);
  159. void rpc_shutdown_client(struct rpc_clnt *);
  160. void rpc_release_client(struct rpc_clnt *);
  161. void rpc_task_release_transport(struct rpc_task *);
  162. void rpc_task_release_client(struct rpc_task *);
  163. struct rpc_xprt *rpc_task_get_xprt(struct rpc_clnt *clnt,
  164. struct rpc_xprt *xprt);
  165. int rpcb_create_local(struct net *);
  166. void rpcb_put_local(struct net *);
  167. int rpcb_register(struct net *, u32, u32, int, unsigned short);
  168. int rpcb_v4_register(struct net *net, const u32 program,
  169. const u32 version,
  170. const struct sockaddr *address,
  171. const char *netid);
  172. void rpcb_getport_async(struct rpc_task *);
  173. void rpc_prepare_reply_pages(struct rpc_rqst *req, struct page **pages,
  174. unsigned int base, unsigned int len,
  175. unsigned int hdrsize);
  176. void rpc_call_start(struct rpc_task *);
  177. int rpc_call_async(struct rpc_clnt *clnt,
  178. const struct rpc_message *msg, int flags,
  179. const struct rpc_call_ops *tk_ops,
  180. void *calldata);
  181. int rpc_call_sync(struct rpc_clnt *clnt,
  182. const struct rpc_message *msg, int flags);
  183. struct rpc_task *rpc_call_null(struct rpc_clnt *clnt, struct rpc_cred *cred,
  184. int flags);
  185. int rpc_restart_call_prepare(struct rpc_task *);
  186. int rpc_restart_call(struct rpc_task *);
  187. void rpc_setbufsize(struct rpc_clnt *, unsigned int, unsigned int);
  188. struct net * rpc_net_ns(struct rpc_clnt *);
  189. size_t rpc_max_payload(struct rpc_clnt *);
  190. size_t rpc_max_bc_payload(struct rpc_clnt *);
  191. unsigned int rpc_num_bc_slots(struct rpc_clnt *);
  192. void rpc_force_rebind(struct rpc_clnt *);
  193. size_t rpc_peeraddr(struct rpc_clnt *, struct sockaddr *, size_t);
  194. const char *rpc_peeraddr2str(struct rpc_clnt *, enum rpc_display_format_t);
  195. int rpc_localaddr(struct rpc_clnt *, struct sockaddr *, size_t);
  196. int rpc_clnt_iterate_for_each_xprt(struct rpc_clnt *clnt,
  197. int (*fn)(struct rpc_clnt *, struct rpc_xprt *, void *),
  198. void *data);
  199. int rpc_clnt_test_and_add_xprt(struct rpc_clnt *clnt,
  200. struct rpc_xprt_switch *xps,
  201. struct rpc_xprt *xprt,
  202. void *dummy);
  203. int rpc_clnt_add_xprt(struct rpc_clnt *, struct xprt_create *,
  204. int (*setup)(struct rpc_clnt *,
  205. struct rpc_xprt_switch *,
  206. struct rpc_xprt *,
  207. void *),
  208. void *data);
  209. void rpc_set_connect_timeout(struct rpc_clnt *clnt,
  210. unsigned long connect_timeout,
  211. unsigned long reconnect_timeout);
  212. int rpc_clnt_setup_test_and_add_xprt(struct rpc_clnt *,
  213. struct rpc_xprt_switch *,
  214. struct rpc_xprt *,
  215. void *);
  216. void rpc_clnt_manage_trunked_xprts(struct rpc_clnt *);
  217. void rpc_clnt_probe_trunked_xprts(struct rpc_clnt *,
  218. struct rpc_add_xprt_test *);
  219. const char *rpc_proc_name(const struct rpc_task *task);
  220. void rpc_clnt_xprt_switch_put(struct rpc_clnt *);
  221. void rpc_clnt_xprt_switch_add_xprt(struct rpc_clnt *, struct rpc_xprt *);
  222. void rpc_clnt_xprt_switch_remove_xprt(struct rpc_clnt *, struct rpc_xprt *);
  223. bool rpc_clnt_xprt_switch_has_addr(struct rpc_clnt *clnt,
  224. const struct sockaddr *sap);
  225. void rpc_clnt_xprt_set_online(struct rpc_clnt *clnt, struct rpc_xprt *xprt);
  226. void rpc_clnt_disconnect(struct rpc_clnt *clnt);
  227. void rpc_cleanup_clids(void);
  228. static inline int rpc_reply_expected(struct rpc_task *task)
  229. {
  230. return (task->tk_msg.rpc_proc != NULL) &&
  231. (task->tk_msg.rpc_proc->p_decode != NULL);
  232. }
  233. static inline void rpc_task_close_connection(struct rpc_task *task)
  234. {
  235. if (task->tk_xprt)
  236. xprt_force_disconnect(task->tk_xprt);
  237. }
  238. #endif /* _LINUX_SUNRPC_CLNT_H */