summaryrefslogtreecommitdiffstats
path: root/sys/rpc/rpcclnt.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/rpc/rpcclnt.h')
-rw-r--r--sys/rpc/rpcclnt.h358
1 files changed, 358 insertions, 0 deletions
diff --git a/sys/rpc/rpcclnt.h b/sys/rpc/rpcclnt.h
new file mode 100644
index 0000000..48681ab
--- /dev/null
+++ b/sys/rpc/rpcclnt.h
@@ -0,0 +1,358 @@
+/* $FreeBSD$ */
+/* $OpenBSD: nfsmount.h,v 1.11 2002/03/14 01:27:13 millert Exp $ */
+/* $NetBSD: nfsmount.h,v 1.10 1996/02/18 11:54:03 fvdl Exp $ */
+
+/*
+ * copyright (c) 2003
+ * the regents of the university of michigan
+ * all rights reserved
+ *
+ * permission is granted to use, copy, create derivative works and redistribute
+ * this software and such derivative works for any purpose, so long as the name
+ * of the university of michigan is not used in any advertising or publicity
+ * pertaining to the use or distribution of this software without specific,
+ * written prior authorization. if the above copyright notice or any other
+ * identification of the university of michigan is included in any copy of any
+ * portion of this software, then the disclaimer below must also be included.
+ *
+ * this software is provided as is, without representation from the university
+ * of michigan as to its fitness for any purpose, and without warranty by the
+ * university of michigan of any kind, either express or implied, including
+ * without limitation the implied warranties of merchantability and fitness for
+ * a particular purpose. the regents of the university of michigan shall not be
+ * liable for any damages, including special, indirect, incidental, or
+ * consequential damages, with respect to any claim arising out of or in
+ * connection with the use of the software, even if it has been or is hereafter
+ * advised of the possibility of such damages.
+ */
+
+/*
+ * Copyright (c) 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Rick Macklem at The University of Guelph.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)nfsmount.h 8.3 (Berkeley) 3/30/95
+ */
+
+
+#ifndef _RPCCLNT_H_
+#define _RPCCLNT_H_
+
+#include <sys/types.h>
+#include <sys/malloc.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+
+#ifdef __OpenBSD__
+ #define RPC_EXEC_CTX struct proc *
+#else
+ #define RPC_EXEC_CTX struct thread *
+#endif
+
+
+#ifdef RPCCLNT_DEBUG
+#define RPCDEBUG(args...) do{ \
+ if(rpcdebugon != 0){ \
+ printf("%s(): ", __FUNCTION__);\
+ printf(args); \
+ printf("\n"); \
+ }}while(0)
+#else
+#define RPCDEBUG(args...)
+#endif
+
+/* from nfs/nfs.h */
+#define RPC_TICKINTVL 5
+
+
+/* from nfs/nfsproto.h */
+#define RPC_MAXDATA 32768
+#define RPC_MAXPKTHDR 404
+#define RPC_MAXPACKET (RPC_MAXPKTHDR + RPC_MAXDATA)
+
+#define RPCX_UNSIGNED 4
+
+/* defines for rpcclnt's rc_flags
+ XXX these flags came from the NFSMNT_* flags in OpenBSD's sys/mount.h */
+#define RPCCLNT_SOFT 0x001 /* soft mount (hard is details) */
+#define RPCCLNT_INT 0x002 /* allow interrupts on hard mounts */
+#define RPCCLNT_NOCONN 0x004 /* dont connect the socket (udp) */
+#define RPCCLNT_DUMBTIMR 0x010
+
+#define RPCCLNT_SNDLOCK 0x100
+#define RPCCLNT_WANTSND 0x200
+#define RPCCLNT_RCVLOCK 0x400
+#define RPCCLNT_WANTRCV 0x800
+
+
+/* Flag values for r_flags */
+#define R_TIMING 0x01 /* timing request (in mntp) */
+#define R_SENT 0x02 /* request has been sent */
+#define R_SOFTTERM 0x04 /* soft mnt, too many retries */
+#define R_INTR 0x08 /* intr mnt, signal pending */
+#define R_SOCKERR 0x10 /* Fatal error on socket */
+#define R_TPRINTFMSG 0x20 /* Did a tprintf msg. */
+#define R_MUSTRESEND 0x40 /* Must resend request */
+#define R_GETONEREP 0x80 /* Probe for one reply only */
+
+
+#define RPC_HZ (hz / rpcclnt_ticks) /* Ticks/sec */
+#define RPC_TIMEO (1 * RPC_HZ) /* Default timeout = 1 second */
+
+#define RPC_MAXREXMIT 100 /* Stop counting after this many */
+
+
+#define RPCIGNORE_SOERROR(s, e) \
+ ((e) != EINTR && (e) != ERESTART && (e) != EWOULDBLOCK && \
+ ((s) & PR_CONNREQUIRED) == 0)
+
+#define RPCINT_SIGMASK (sigmask(SIGINT)|sigmask(SIGTERM)|sigmask(SIGKILL)| \
+ sigmask(SIGHUP)|sigmask(SIGQUIT))
+
+#define RPCMADV(m, s) (m)->m_data += (s)
+
+#define RPCAUTH_ROOTCREDS NULL
+
+#define RPCCLNTINT_SIGMASK(set) \
+ (SIGISMEMBER(set, SIGINT) || SIGISMEMBER(set, SIGTERM) || \
+ SIGISMEMBER(set, SIGHUP) || SIGISMEMBER(set, SIGKILL) || \
+ SIGISMEMBER(set, SIGQUIT))
+
+
+#define fxdr_unsigned(t, v) ((t)ntohl((int32_t)(v)))
+#define txdr_unsigned(v) (htonl((int32_t)(v)))
+
+
+/* global rpcstats
+ * XXX should be per rpcclnt */
+struct rpcstats {
+ int rpcretries;
+ int rpcrequests;
+ int rpctimeouts;
+ int rpcunexpected;
+ int rpcinvalid;
+};
+
+struct rpc_program {
+ u_int32_t prog_id;
+ u_int32_t prog_version;
+ char * prog_name;
+};
+
+struct rpc_auth {
+ unsigned int auth_type;
+};
+
+struct rpctask {
+ TAILQ_ENTRY(rpctask) r_chain;
+ struct mbuf *r_mreq;
+ struct mbuf *r_mrep;
+ struct mbuf *r_md;
+ caddr_t r_dpos;
+
+ struct rpcclnt *r_rpcclnt;
+
+ u_int32_t r_xid;
+ int r_flags; /* flags on request, see below */
+ int r_retry; /* max retransmission count */
+ int r_rexmit; /* current retrans count */
+ int r_timer; /* tick counter on reply */
+ int r_procnum; /* NFS procedure number */
+ int r_rtt; /* RTT for rpc */
+ RPC_EXEC_CTX r_td;
+};
+
+struct rpc_reply {
+ struct {
+ u_int32_t type;
+ u_int32_t status;
+
+ /* used only when reply == RPC_MSGDENIED and
+ * status == RPC_AUTHERR */
+ u_int32_t autherr;
+
+ /* rpc mismatch info if reply == RPC_MSGDENIED and
+ * status == RPC_MISMATCH */
+ struct {
+ u_int32_t low;
+ u_int32_t high;
+ } mismatch_info;
+ } stat;
+
+ /* head of the mbuf chain */
+ struct mbuf * mrep;
+
+ /* mbuf and position of the verification opaque data
+ * note that this is only valid when stat.reply == RPC_MSGACCEPTED */
+ u_int32_t verf_type;
+ u_int32_t verf_size;
+ struct mbuf * verf_md;
+ caddr_t verf_dpos;
+
+ /* mbuf and postion of the result of the rpc request */
+ struct mbuf * result_md;
+ caddr_t result_dpos;
+};
+
+
+/*
+ * RPC Client connection context.
+ * One allocated on every NFS mount.
+ * Holds RPC specific information for mount.
+ */
+/* XXX: please note that all pointer type variables are just set (not copied),
+ * so it is up to the user to free these values */
+struct rpcclnt {
+ int rc_flag; /* For RPCCLNT_* flags */
+
+ int rc_wsize; /* Max size of the request data */
+ int rc_rsize; /* Max size of the response data */
+ struct sockaddr *rc_name;
+ struct socket *rc_so; /* Rpc socket */
+ int rc_sotype; /* Type of socket */
+ int rc_soproto; /* and protocol */
+ int rc_soflags; /* pr_flags for socket protocol */
+
+ int rc_timeo; /* Init timer for NFSMNT_DUMBTIMR */
+ int rc_retry; /* Max retries */
+ int rc_srtt[4]; /* Timers for rpcs */
+ int rc_sdrtt[4];
+ int rc_sent; /* Request send count */
+ int rc_cwnd; /* Request send window */
+ int rc_timeouts; /* Request timeouts */
+
+/* XXX: this is not being set!!!! */
+ int rc_deadthresh; /* Threshold of timeouts-->dead server*/
+
+
+ /* authentication: */
+ /* currently can be RPCAUTH_NULL, RPCAUTH_KERBV4, RPCAUTH_UNIX */
+ /* should be kept in XDR form */
+ int rc_authtype; /* Authenticator type */
+
+
+#if 0
+ /* RPCAUTH_KERB4 */
+ int rc_authlen; /* and length */
+ char *rc_authstr; /* Authenticator string */
+ int rc_verflen;
+ char *rc_verfstr; /* and the verifier */
+#endif
+
+ /* RPCAUTH_UNIX*/
+ struct rpc_auth * rc_auth; /* authentication */
+
+#if 0
+ /* stored in XDR form (network byte order) */
+ unsigned int rc_progid; /* program id */
+ unsigned int rc_progvers; /* program version */
+
+ /* name of server for log messages */
+ const char *rc_servername; /* for printing error messages */
+#else
+ struct rpc_program * rc_prog;
+#endif
+
+ /* XXX: this should be removed */
+ int rc_proctlen; /* if == 0 then rc_proct == NULL */
+ int * rc_proct;
+};
+
+#ifdef __OpenBSD__
+extern struct pool rpcreply_pool;
+extern struct pool rpcclnt_pool;
+#else
+/* MALLOC_DECLARE(M_RPC); */
+#endif
+extern int rpcdebugon;
+
+
+#ifdef __OpenBSD__
+#define rpcclnt_get(X) \
+ do { \
+ (X) = pool_get(&rpcclnt_pool, PR_WAITOK); \
+ bzero((X), sizeof(struct rpcclnt)); \
+ }while(0)
+
+#define rpcclnt_put(X) \
+ do { \
+ if ((X) != NULL){ \
+ pool_put(&rpcclnt_pool, (X)); \
+ }}while(0)
+
+#else /* !__OpenBSD__ */
+
+/* usage count for module (un)loading */
+extern unsigned int rpcclnt_usage;
+extern struct mtx rpcclnt_usage_mutex;
+
+void rpcclnt_create(struct rpcclnt ** rpc);
+void rpcclnt_destroy(struct rpcclnt * rpc);
+
+#define rpcclnt_get(X) rpcclnt_create(&(X))
+#define rpcclnt_put(X) rpcclnt_destroy(X)
+
+#ifdef RPCCLNT_TEST
+struct rpcclnt_test_args {
+ int nothing;
+};
+int rpcclnt_test(struct thread *, struct rpcclnt_test_args *);
+
+#define RPC_RETURN(X) do { RPCDEBUG("returning %d", X); return X; }while(0)
+#endif /* RPCCLNT_TEST */
+
+#endif /* !__OpenBSD__ */
+
+void rpcclnt_init(void);
+void rpcclnt_uninit(void);
+#if 0
+int rpcclnt_setup(struct rpcclnt *, int, struct sockaddr *, int, int, int, int, const char *, int, int);
+#endif
+
+int rpcclnt_setup(struct rpcclnt *, struct rpc_program *, struct sockaddr *, int, int, struct rpc_auth *, int, int, int);
+
+
+int rpcclnt_connect(struct rpcclnt *, RPC_EXEC_CTX td);
+int rpcclnt_reconnect(struct rpctask *, RPC_EXEC_CTX td);
+void rpcclnt_disconnect(struct rpcclnt *);
+void rpcclnt_safedisconnect(struct rpcclnt *);
+
+void rpcclnt_setauth(struct rpcclnt *, u_int32_t, u_int32_t, char *, u_int32_t, char *, struct ucred *);
+int rpcclnt_request(struct rpcclnt *, struct mbuf *, int, RPC_EXEC_CTX, struct ucred *, struct rpc_reply *);
+int rpcclnt_err(struct rpc_reply *);
+
+int rpcclnt_cancelreqs(struct rpcclnt *);
+int rpcclnt_sigintr(struct rpcclnt *, struct rpctask *, RPC_EXEC_CTX);
+
+
+#endif /* _RPCCLNT_H_ */
OpenPOWER on IntegriCloud