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