1/*	$NetBSD$	*/
2/*-
3 * Copyright (c) 1989, 1993
4 *	The Regents of the University of California.  All rights reserved.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * Rick Macklem at The University of Guelph.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 4. Neither the name of the University nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 *	@(#)nfsm_subs.h	8.2 (Berkeley) 3/30/95
34 * FreeBSD: head/sys/nfs/nfs_common.h 245568 2013-01-17 19:03:24Z jhb
35 * $NetBSD$
36 */
37
38#ifndef _NFS_NFS_COMMON_H_
39#define _NFS_NFS_COMMON_H_
40
41extern enum vtype nv3tov_type[];
42extern nfstype nfsv3_type[];
43
44#define	vtonfsv2_mode(t, m) \
45    txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : MAKEIMODE((t), (m)))
46
47#define	nfsv3tov_type(a)	nv3tov_type[fxdr_unsigned(u_int32_t,(a))&0x7]
48#define	vtonfsv3_type(a)	txdr_unsigned(nfsv3_type[((int32_t)(a))])
49
50int	nfs_adv(struct mbuf **, caddr_t *, int, int);
51void	*nfsm_disct(struct mbuf **, caddr_t *, int, int, int);
52int	nfs_realign(struct mbuf **, int);
53
54/* ****************************** */
55/* Build request/reply phase macros */
56
57void	*nfsm_build_xx(int s, struct mbuf **mb, caddr_t *bpos);
58
59#define	nfsm_build(c, s) \
60	(c)nfsm_build_xx((s), &mb, &bpos)
61
62/* ****************************** */
63/* Interpretation phase macros */
64
65void	*nfsm_dissect_xx(int s, struct mbuf **md, caddr_t *dpos);
66void	*nfsm_dissect_xx_nonblock(int s, struct mbuf **md, caddr_t *dpos);
67int	nfsm_strsiz_xx(int *s, int m, struct mbuf **md, caddr_t *dpos);
68int	nfsm_adv_xx(int s, struct mbuf **md, caddr_t *dpos);
69
70/* Error check helpers */
71#define nfsm_dcheck(t1, mrep) \
72do { \
73	if (t1 != 0) { \
74		error = t1; \
75		m_freem((mrep)); \
76		(mrep) = NULL; \
77		goto nfsmout; \
78	} \
79} while (0)
80
81#define nfsm_dcheckp(retp, mrep) \
82do { \
83	if (retp == NULL) { \
84		error = EBADRPC; \
85		m_freem((mrep)); \
86		(mrep) = NULL; \
87		goto nfsmout; \
88	} \
89} while (0)
90
91#define	nfsm_dissect(c, s) \
92({ \
93	void *ret; \
94	ret = nfsm_dissect_xx((s), &md, &dpos); \
95	nfsm_dcheckp(ret, mrep); \
96	(c)ret; \
97})
98
99#define	nfsm_dissect_nonblock(c, s) \
100({ \
101	void *ret; \
102	ret = nfsm_dissect_xx_nonblock((s), &md, &dpos); \
103	nfsm_dcheckp(ret, mrep); \
104	(c)ret; \
105})
106
107#define	nfsm_strsiz(s,m) \
108do { \
109	int t1; \
110	t1 = nfsm_strsiz_xx(&(s), (m), &md, &dpos); \
111	nfsm_dcheck(t1, mrep); \
112} while(0)
113
114#define nfsm_mtouio(p,s) \
115do {\
116	int32_t t1 = 0; \
117	if ((s) > 0) \
118		t1 = nfsm_mbuftouio(&md, (p), (s), &dpos); \
119	nfsm_dcheck(t1, mrep); \
120} while (0)
121
122#define nfsm_rndup(a)	(((a)+3)&(~0x3))
123
124#define	nfsm_adv(s) \
125do { \
126	int t1; \
127	t1 = nfsm_adv_xx((s), &md, &dpos); \
128	nfsm_dcheck(t1, mrep); \
129} while (0)
130
131#ifdef __NO_STRICT_ALIGNMENT
132#define nfsm_aligned(p, t)	1
133#else
134#define nfsm_aligned(p, t)	((((u_long)(p)) & (sizeof(t) - 1)) == 0)
135#endif
136
137#endif
138