clnt.h 5.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11
/*
 *  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

12 13 14 15
#include <linux/socket.h>
#include <linux/in.h>
#include <linux/in6.h>

L
Linus Torvalds 已提交
16 17 18 19 20 21 22 23
#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>
24
#include <linux/path.h>
L
Linus Torvalds 已提交
25 26 27 28 29 30 31

struct rpc_inode;

/*
 * The high-level client handle
 */
struct rpc_clnt {
32
	struct kref		cl_kref;	/* Number of references */
33 34
	struct list_head	cl_clients;	/* Global list of clients */
	struct list_head	cl_tasks;	/* List of tasks */
35
	spinlock_t		cl_lock;	/* spinlock */
L
Linus Torvalds 已提交
36 37
	struct rpc_xprt *	cl_xprt;	/* transport */
	struct rpc_procinfo *	cl_procinfo;	/* procedure info */
38 39 40
	u32			cl_prog,	/* RPC program number */
				cl_vers,	/* RPC version number */
				cl_maxproc;	/* max procedure number */
L
Linus Torvalds 已提交
41 42 43 44

	char *			cl_server;	/* server machine name */
	char *			cl_protname;	/* protocol name */
	struct rpc_auth *	cl_auth;	/* authenticator */
45 46
	struct rpc_stat *	cl_stats;	/* per-program statistics */
	struct rpc_iostats *	cl_metrics;	/* per-client statistics */
L
Linus Torvalds 已提交
47 48

	unsigned int		cl_softrtry : 1,/* soft timeouts */
49
				cl_discrtry : 1,/* disconnect before retry */
O
Olga Kornievskaia 已提交
50 51
				cl_autobind : 1,/* use getport() */
				cl_chatty   : 1;/* be verbose */
L
Linus Torvalds 已提交
52 53

	struct rpc_rtt *	cl_rtt;		/* RTO estimator data */
54
	const struct rpc_timeout *cl_timeout;	/* Timeout strategy */
L
Linus Torvalds 已提交
55 56 57

	int			cl_nodelen;	/* nodename length */
	char 			cl_nodename[UNX_MAXNODENAME];
58
	struct path		cl_path;
L
Linus Torvalds 已提交
59 60
	struct rpc_clnt *	cl_parent;	/* Points to parent of clones */
	struct rpc_rtt		cl_rtt_default;
61
	struct rpc_timeout	cl_timeout_default;
62
	struct rpc_program *	cl_program;
L
Linus Torvalds 已提交
63
	char			cl_inline_name[32];
64
	char			*cl_principal;	/* target to authenticate to */
L
Linus Torvalds 已提交
65 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 91 92
};

/*
 * 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 */
	kxdrproc_t		p_encode;	/* XDR encode function */
	kxdrproc_t		p_decode;	/* XDR decode function */
93 94
	unsigned int		p_arglen;	/* argument hdr length (u32) */
	unsigned int		p_replen;	/* reply hdr length (u32) */
L
Linus Torvalds 已提交
95 96
	unsigned int		p_count;	/* call count */
	unsigned int		p_timer;	/* Which RTT timer to use */
97 98
	u32			p_statidx;	/* Which procedure to account */
	char *			p_name;		/* name of procedure */
L
Linus Torvalds 已提交
99 100 101 102
};

#ifdef __KERNEL__

103 104 105 106
struct rpc_create_args {
	int			protocol;
	struct sockaddr		*address;
	size_t			addrsize;
107
	struct sockaddr		*saddress;
108
	const struct rpc_timeout *timeout;
109 110
	char			*servername;
	struct rpc_program	*program;
111
	u32			prognumber;	/* overrides program->number */
112 113 114
	u32			version;
	rpc_authflavor_t	authflavor;
	unsigned long		flags;
115
	char			*client_name;
116 117 118 119 120
};

/* Values for "flags" field */
#define RPC_CLNT_CREATE_HARDRTRY	(1UL << 0)
#define RPC_CLNT_CREATE_AUTOBIND	(1UL << 2)
121 122 123
#define RPC_CLNT_CREATE_NONPRIVPORT	(1UL << 3)
#define RPC_CLNT_CREATE_NOPING		(1UL << 4)
#define RPC_CLNT_CREATE_DISCRTRY	(1UL << 5)
O
Olga Kornievskaia 已提交
124
#define RPC_CLNT_CREATE_QUIET		(1UL << 6)
125 126

struct rpc_clnt *rpc_create(struct rpc_create_args *args);
127
struct rpc_clnt	*rpc_bind_new_program(struct rpc_clnt *,
128
				struct rpc_program *, u32);
L
Linus Torvalds 已提交
129
struct rpc_clnt *rpc_clone_client(struct rpc_clnt *);
130
void		rpc_shutdown_client(struct rpc_clnt *);
L
Linus Torvalds 已提交
131
void		rpc_release_client(struct rpc_clnt *);
132

133
int		rpcb_register(u32, u32, int, unsigned short);
134 135
int		rpcb_v4_register(const u32 program, const u32 version,
				 const struct sockaddr *address,
136
				 const char *netid);
137
int		rpcb_getport_sync(struct sockaddr_in *, u32, u32, int);
138
void		rpcb_getport_async(struct rpc_task *);
L
Linus Torvalds 已提交
139

140
void		rpc_call_start(struct rpc_task *);
141 142 143
int		rpc_call_async(struct rpc_clnt *clnt,
			       const struct rpc_message *msg, int flags,
			       const struct rpc_call_ops *tk_ops,
144
			       void *calldata);
145 146
int		rpc_call_sync(struct rpc_clnt *clnt,
			      const struct rpc_message *msg, int flags);
147 148
struct rpc_task *rpc_call_null(struct rpc_clnt *clnt, struct rpc_cred *cred,
			       int flags);
149
void		rpc_restart_call_prepare(struct rpc_task *);
L
Linus Torvalds 已提交
150 151 152
void		rpc_restart_call(struct rpc_task *);
void		rpc_setbufsize(struct rpc_clnt *, unsigned int, unsigned int);
size_t		rpc_max_payload(struct rpc_clnt *);
153
void		rpc_force_rebind(struct rpc_clnt *);
154
size_t		rpc_peeraddr(struct rpc_clnt *, struct sockaddr *, size_t);
155
const char	*rpc_peeraddr2str(struct rpc_clnt *, enum rpc_display_format_t);
L
Linus Torvalds 已提交
156

157 158 159 160 161 162 163 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
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);
char *		rpc_sockaddr2uaddr(const struct sockaddr *);
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")

L
Linus Torvalds 已提交
191 192
#endif /* __KERNEL__ */
#endif /* _LINUX_SUNRPC_CLNT_H */