xref: /minix3/external/bsd/tcpdump/dist/nfs.h (revision b636d99d91c3d54204248f643c14627405d4afd1)
1*b636d99dSDavid van Moolenbroek /*	NetBSD: nfs.h,v 1.1 1996/05/23 22:49:53 fvdl Exp 	*/
2*b636d99dSDavid van Moolenbroek 
3*b636d99dSDavid van Moolenbroek /*
4*b636d99dSDavid van Moolenbroek  * Copyright (c) 1989, 1993
5*b636d99dSDavid van Moolenbroek  *	The Regents of the University of California.  All rights reserved.
6*b636d99dSDavid van Moolenbroek  *
7*b636d99dSDavid van Moolenbroek  * This code is derived from software contributed to Berkeley by
8*b636d99dSDavid van Moolenbroek  * Rick Macklem at The University of Guelph.
9*b636d99dSDavid van Moolenbroek  *
10*b636d99dSDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
11*b636d99dSDavid van Moolenbroek  * modification, are permitted provided that the following conditions
12*b636d99dSDavid van Moolenbroek  * are met:
13*b636d99dSDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
14*b636d99dSDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
15*b636d99dSDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
16*b636d99dSDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
17*b636d99dSDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
18*b636d99dSDavid van Moolenbroek  * 3. Neither the name of the University nor the names of its contributors
19*b636d99dSDavid van Moolenbroek  *    may be used to endorse or promote products derived from this software
20*b636d99dSDavid van Moolenbroek  *    without specific prior written permission.
21*b636d99dSDavid van Moolenbroek  *
22*b636d99dSDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23*b636d99dSDavid van Moolenbroek  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24*b636d99dSDavid van Moolenbroek  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25*b636d99dSDavid van Moolenbroek  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26*b636d99dSDavid van Moolenbroek  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27*b636d99dSDavid van Moolenbroek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28*b636d99dSDavid van Moolenbroek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29*b636d99dSDavid van Moolenbroek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30*b636d99dSDavid van Moolenbroek  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31*b636d99dSDavid van Moolenbroek  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32*b636d99dSDavid van Moolenbroek  * SUCH DAMAGE.
33*b636d99dSDavid van Moolenbroek  *
34*b636d99dSDavid van Moolenbroek  *	@(#)nfsproto.h	8.2 (Berkeley) 3/30/95
35*b636d99dSDavid van Moolenbroek  */
36*b636d99dSDavid van Moolenbroek 
37*b636d99dSDavid van Moolenbroek /*
38*b636d99dSDavid van Moolenbroek  * nfs definitions as per the Version 2 and 3 specs
39*b636d99dSDavid van Moolenbroek  */
40*b636d99dSDavid van Moolenbroek 
41*b636d99dSDavid van Moolenbroek /*
42*b636d99dSDavid van Moolenbroek  * Constants as defined in the Sun NFS Version 2 and 3 specs.
43*b636d99dSDavid van Moolenbroek  * "NFS: Network File System Protocol Specification" RFC1094
44*b636d99dSDavid van Moolenbroek  * and in the "NFS: Network File System Version 3 Protocol
45*b636d99dSDavid van Moolenbroek  * Specification"
46*b636d99dSDavid van Moolenbroek  */
47*b636d99dSDavid van Moolenbroek 
48*b636d99dSDavid van Moolenbroek #define NFS_PORT	2049
49*b636d99dSDavid van Moolenbroek #define	NFS_PROG	100003
50*b636d99dSDavid van Moolenbroek #define NFS_VER2	2
51*b636d99dSDavid van Moolenbroek #define	NFS_VER3	3
52*b636d99dSDavid van Moolenbroek #define NFS_V2MAXDATA	8192
53*b636d99dSDavid van Moolenbroek #define	NFS_MAXDGRAMDATA 16384
54*b636d99dSDavid van Moolenbroek #define	NFS_MAXDATA	32768
55*b636d99dSDavid van Moolenbroek #define	NFS_MAXPATHLEN	1024
56*b636d99dSDavid van Moolenbroek #define	NFS_MAXNAMLEN	255
57*b636d99dSDavid van Moolenbroek #define	NFS_MAXPKTHDR	404
58*b636d99dSDavid van Moolenbroek #define NFS_MAXPACKET	(NFS_MAXPKTHDR + NFS_MAXDATA)
59*b636d99dSDavid van Moolenbroek #define	NFS_MINPACKET	20
60*b636d99dSDavid van Moolenbroek #define	NFS_FABLKSIZE	512	/* Size in bytes of a block wrt fa_blocks */
61*b636d99dSDavid van Moolenbroek 
62*b636d99dSDavid van Moolenbroek /* Stat numbers for rpc returns (version 2 and 3) */
63*b636d99dSDavid van Moolenbroek #define	NFS_OK			0
64*b636d99dSDavid van Moolenbroek #define	NFSERR_PERM		1
65*b636d99dSDavid van Moolenbroek #define	NFSERR_NOENT		2
66*b636d99dSDavid van Moolenbroek #define	NFSERR_IO		5
67*b636d99dSDavid van Moolenbroek #define	NFSERR_NXIO		6
68*b636d99dSDavid van Moolenbroek #define	NFSERR_ACCES		13
69*b636d99dSDavid van Moolenbroek #define	NFSERR_EXIST		17
70*b636d99dSDavid van Moolenbroek #define	NFSERR_XDEV		18	/* Version 3 only */
71*b636d99dSDavid van Moolenbroek #define	NFSERR_NODEV		19
72*b636d99dSDavid van Moolenbroek #define	NFSERR_NOTDIR		20
73*b636d99dSDavid van Moolenbroek #define	NFSERR_ISDIR		21
74*b636d99dSDavid van Moolenbroek #define	NFSERR_INVAL		22	/* Version 3 only */
75*b636d99dSDavid van Moolenbroek #define	NFSERR_FBIG		27
76*b636d99dSDavid van Moolenbroek #define	NFSERR_NOSPC		28
77*b636d99dSDavid van Moolenbroek #define	NFSERR_ROFS		30
78*b636d99dSDavid van Moolenbroek #define	NFSERR_MLINK		31	/* Version 3 only */
79*b636d99dSDavid van Moolenbroek #define	NFSERR_NAMETOL		63
80*b636d99dSDavid van Moolenbroek #define	NFSERR_NOTEMPTY		66
81*b636d99dSDavid van Moolenbroek #define	NFSERR_DQUOT		69
82*b636d99dSDavid van Moolenbroek #define	NFSERR_STALE		70
83*b636d99dSDavid van Moolenbroek #define	NFSERR_REMOTE		71	/* Version 3 only */
84*b636d99dSDavid van Moolenbroek #define	NFSERR_WFLUSH		99	/* Version 2 only */
85*b636d99dSDavid van Moolenbroek #define	NFSERR_BADHANDLE	10001	/* The rest Version 3 only */
86*b636d99dSDavid van Moolenbroek #define	NFSERR_NOT_SYNC		10002
87*b636d99dSDavid van Moolenbroek #define	NFSERR_BAD_COOKIE	10003
88*b636d99dSDavid van Moolenbroek #define	NFSERR_NOTSUPP		10004
89*b636d99dSDavid van Moolenbroek #define	NFSERR_TOOSMALL		10005
90*b636d99dSDavid van Moolenbroek #define	NFSERR_SERVERFAULT	10006
91*b636d99dSDavid van Moolenbroek #define	NFSERR_BADTYPE		10007
92*b636d99dSDavid van Moolenbroek #define	NFSERR_JUKEBOX		10008
93*b636d99dSDavid van Moolenbroek #define NFSERR_TRYLATER		NFSERR_JUKEBOX
94*b636d99dSDavid van Moolenbroek #define	NFSERR_STALEWRITEVERF	30001	/* Fake return for nfs_commit() */
95*b636d99dSDavid van Moolenbroek 
96*b636d99dSDavid van Moolenbroek #define NFSERR_RETVOID		0x20000000 /* Return void, not error */
97*b636d99dSDavid van Moolenbroek #define NFSERR_AUTHERR		0x40000000 /* Mark an authentication error */
98*b636d99dSDavid van Moolenbroek #define NFSERR_RETERR		0x80000000 /* Mark an error return for V3 */
99*b636d99dSDavid van Moolenbroek 
100*b636d99dSDavid van Moolenbroek /* Sizes in bytes of various nfs rpc components */
101*b636d99dSDavid van Moolenbroek #define	NFSX_UNSIGNED	4
102*b636d99dSDavid van Moolenbroek 
103*b636d99dSDavid van Moolenbroek /* specific to NFS Version 2 */
104*b636d99dSDavid van Moolenbroek #define	NFSX_V2FH	32
105*b636d99dSDavid van Moolenbroek #define	NFSX_V2FATTR	68
106*b636d99dSDavid van Moolenbroek #define	NFSX_V2SATTR	32
107*b636d99dSDavid van Moolenbroek #define	NFSX_V2COOKIE	4
108*b636d99dSDavid van Moolenbroek #define NFSX_V2STATFS	20
109*b636d99dSDavid van Moolenbroek 
110*b636d99dSDavid van Moolenbroek /* specific to NFS Version 3 */
111*b636d99dSDavid van Moolenbroek #if 0
112*b636d99dSDavid van Moolenbroek #define NFSX_V3FH		(sizeof (fhandle_t)) /* size this server uses */
113*b636d99dSDavid van Moolenbroek #endif
114*b636d99dSDavid van Moolenbroek #define	NFSX_V3FHMAX		64	/* max. allowed by protocol */
115*b636d99dSDavid van Moolenbroek #define NFSX_V3FATTR		84
116*b636d99dSDavid van Moolenbroek #define NFSX_V3SATTR		60	/* max. all fields filled in */
117*b636d99dSDavid van Moolenbroek #define NFSX_V3SRVSATTR		(sizeof (struct nfsv3_sattr))
118*b636d99dSDavid van Moolenbroek #define NFSX_V3POSTOPATTR	(NFSX_V3FATTR + NFSX_UNSIGNED)
119*b636d99dSDavid van Moolenbroek #define NFSX_V3WCCDATA		(NFSX_V3POSTOPATTR + 8 * NFSX_UNSIGNED)
120*b636d99dSDavid van Moolenbroek #define NFSX_V3COOKIEVERF 	8
121*b636d99dSDavid van Moolenbroek #define NFSX_V3WRITEVERF 	8
122*b636d99dSDavid van Moolenbroek #define NFSX_V3CREATEVERF	8
123*b636d99dSDavid van Moolenbroek #define NFSX_V3STATFS		52
124*b636d99dSDavid van Moolenbroek #define NFSX_V3FSINFO		48
125*b636d99dSDavid van Moolenbroek #define NFSX_V3PATHCONF		24
126*b636d99dSDavid van Moolenbroek 
127*b636d99dSDavid van Moolenbroek /* variants for both versions */
128*b636d99dSDavid van Moolenbroek #define NFSX_FH(v3)		((v3) ? (NFSX_V3FHMAX + NFSX_UNSIGNED) : \
129*b636d99dSDavid van Moolenbroek 					NFSX_V2FH)
130*b636d99dSDavid van Moolenbroek #define NFSX_SRVFH(v3)		((v3) ? NFSX_V3FH : NFSX_V2FH)
131*b636d99dSDavid van Moolenbroek #define	NFSX_FATTR(v3)		((v3) ? NFSX_V3FATTR : NFSX_V2FATTR)
132*b636d99dSDavid van Moolenbroek #define NFSX_PREOPATTR(v3)	((v3) ? (7 * NFSX_UNSIGNED) : 0)
133*b636d99dSDavid van Moolenbroek #define NFSX_POSTOPATTR(v3)	((v3) ? (NFSX_V3FATTR + NFSX_UNSIGNED) : 0)
134*b636d99dSDavid van Moolenbroek #define NFSX_POSTOPORFATTR(v3)	((v3) ? (NFSX_V3FATTR + NFSX_UNSIGNED) : \
135*b636d99dSDavid van Moolenbroek 					NFSX_V2FATTR)
136*b636d99dSDavid van Moolenbroek #define NFSX_WCCDATA(v3)	((v3) ? NFSX_V3WCCDATA : 0)
137*b636d99dSDavid van Moolenbroek #define NFSX_WCCORFATTR(v3)	((v3) ? NFSX_V3WCCDATA : NFSX_V2FATTR)
138*b636d99dSDavid van Moolenbroek #define	NFSX_SATTR(v3)		((v3) ? NFSX_V3SATTR : NFSX_V2SATTR)
139*b636d99dSDavid van Moolenbroek #define	NFSX_COOKIEVERF(v3)	((v3) ? NFSX_V3COOKIEVERF : 0)
140*b636d99dSDavid van Moolenbroek #define	NFSX_WRITEVERF(v3)	((v3) ? NFSX_V3WRITEVERF : 0)
141*b636d99dSDavid van Moolenbroek #define NFSX_READDIR(v3)	((v3) ? (5 * NFSX_UNSIGNED) : \
142*b636d99dSDavid van Moolenbroek 					(2 * NFSX_UNSIGNED))
143*b636d99dSDavid van Moolenbroek #define	NFSX_STATFS(v3)		((v3) ? NFSX_V3STATFS : NFSX_V2STATFS)
144*b636d99dSDavid van Moolenbroek 
145*b636d99dSDavid van Moolenbroek /* nfs rpc procedure numbers (before version mapping) */
146*b636d99dSDavid van Moolenbroek #define	NFSPROC_NULL		0
147*b636d99dSDavid van Moolenbroek #define	NFSPROC_GETATTR		1
148*b636d99dSDavid van Moolenbroek #define	NFSPROC_SETATTR		2
149*b636d99dSDavid van Moolenbroek #define	NFSPROC_LOOKUP		3
150*b636d99dSDavid van Moolenbroek #define	NFSPROC_ACCESS		4
151*b636d99dSDavid van Moolenbroek #define	NFSPROC_READLINK	5
152*b636d99dSDavid van Moolenbroek #define	NFSPROC_READ		6
153*b636d99dSDavid van Moolenbroek #define	NFSPROC_WRITE		7
154*b636d99dSDavid van Moolenbroek #define	NFSPROC_CREATE		8
155*b636d99dSDavid van Moolenbroek #define	NFSPROC_MKDIR		9
156*b636d99dSDavid van Moolenbroek #define	NFSPROC_SYMLINK		10
157*b636d99dSDavid van Moolenbroek #define	NFSPROC_MKNOD		11
158*b636d99dSDavid van Moolenbroek #define	NFSPROC_REMOVE		12
159*b636d99dSDavid van Moolenbroek #define	NFSPROC_RMDIR		13
160*b636d99dSDavid van Moolenbroek #define	NFSPROC_RENAME		14
161*b636d99dSDavid van Moolenbroek #define	NFSPROC_LINK		15
162*b636d99dSDavid van Moolenbroek #define	NFSPROC_READDIR		16
163*b636d99dSDavid van Moolenbroek #define	NFSPROC_READDIRPLUS	17
164*b636d99dSDavid van Moolenbroek #define	NFSPROC_FSSTAT		18
165*b636d99dSDavid van Moolenbroek #define	NFSPROC_FSINFO		19
166*b636d99dSDavid van Moolenbroek #define	NFSPROC_PATHCONF	20
167*b636d99dSDavid van Moolenbroek #define	NFSPROC_COMMIT		21
168*b636d99dSDavid van Moolenbroek 
169*b636d99dSDavid van Moolenbroek /* And leasing (nqnfs) procedure numbers (must be last) */
170*b636d99dSDavid van Moolenbroek #define	NQNFSPROC_GETLEASE	22
171*b636d99dSDavid van Moolenbroek #define	NQNFSPROC_VACATED	23
172*b636d99dSDavid van Moolenbroek #define	NQNFSPROC_EVICTED	24
173*b636d99dSDavid van Moolenbroek 
174*b636d99dSDavid van Moolenbroek #define NFSPROC_NOOP		25
175*b636d99dSDavid van Moolenbroek #define	NFS_NPROCS		26
176*b636d99dSDavid van Moolenbroek 
177*b636d99dSDavid van Moolenbroek /* Actual Version 2 procedure numbers */
178*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_NULL		0
179*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_GETATTR	1
180*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_SETATTR	2
181*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_NOOP		3
182*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_ROOT		NFSV2PROC_NOOP	/* Obsolete */
183*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_LOOKUP	4
184*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_READLINK	5
185*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_READ		6
186*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_WRITECACHE	NFSV2PROC_NOOP	/* Obsolete */
187*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_WRITE		8
188*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_CREATE	9
189*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_REMOVE	10
190*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_RENAME	11
191*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_LINK		12
192*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_SYMLINK	13
193*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_MKDIR		14
194*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_RMDIR		15
195*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_READDIR	16
196*b636d99dSDavid van Moolenbroek #define	NFSV2PROC_STATFS	17
197*b636d99dSDavid van Moolenbroek 
198*b636d99dSDavid van Moolenbroek /*
199*b636d99dSDavid van Moolenbroek  * Constants used by the Version 3 protocol for various RPCs
200*b636d99dSDavid van Moolenbroek  */
201*b636d99dSDavid van Moolenbroek #define NFSV3SATTRTIME_DONTCHANGE	0
202*b636d99dSDavid van Moolenbroek #define NFSV3SATTRTIME_TOSERVER		1
203*b636d99dSDavid van Moolenbroek #define NFSV3SATTRTIME_TOCLIENT		2
204*b636d99dSDavid van Moolenbroek 
205*b636d99dSDavid van Moolenbroek #define NFSV3ATTRTIME_NMODES		3
206*b636d99dSDavid van Moolenbroek 
207*b636d99dSDavid van Moolenbroek #define NFSV3ACCESS_READ		0x01
208*b636d99dSDavid van Moolenbroek #define NFSV3ACCESS_LOOKUP		0x02
209*b636d99dSDavid van Moolenbroek #define NFSV3ACCESS_MODIFY		0x04
210*b636d99dSDavid van Moolenbroek #define NFSV3ACCESS_EXTEND		0x08
211*b636d99dSDavid van Moolenbroek #define NFSV3ACCESS_DELETE		0x10
212*b636d99dSDavid van Moolenbroek #define NFSV3ACCESS_EXECUTE		0x20
213*b636d99dSDavid van Moolenbroek #define NFSV3ACCESS_FULL		0x3f
214*b636d99dSDavid van Moolenbroek 
215*b636d99dSDavid van Moolenbroek #define NFSV3WRITE_UNSTABLE		0
216*b636d99dSDavid van Moolenbroek #define NFSV3WRITE_DATASYNC		1
217*b636d99dSDavid van Moolenbroek #define NFSV3WRITE_FILESYNC		2
218*b636d99dSDavid van Moolenbroek 
219*b636d99dSDavid van Moolenbroek #define NFSV3WRITE_NMODES		3
220*b636d99dSDavid van Moolenbroek 
221*b636d99dSDavid van Moolenbroek #define NFSV3CREATE_UNCHECKED		0
222*b636d99dSDavid van Moolenbroek #define NFSV3CREATE_GUARDED		1
223*b636d99dSDavid van Moolenbroek #define NFSV3CREATE_EXCLUSIVE		2
224*b636d99dSDavid van Moolenbroek 
225*b636d99dSDavid van Moolenbroek #define NFSV3CREATE_NMODES		3
226*b636d99dSDavid van Moolenbroek 
227*b636d99dSDavid van Moolenbroek #define NFSV3FSINFO_LINK		0x01
228*b636d99dSDavid van Moolenbroek #define NFSV3FSINFO_SYMLINK		0x02
229*b636d99dSDavid van Moolenbroek #define NFSV3FSINFO_HOMOGENEOUS		0x08
230*b636d99dSDavid van Moolenbroek #define NFSV3FSINFO_CANSETTIME		0x10
231*b636d99dSDavid van Moolenbroek 
232*b636d99dSDavid van Moolenbroek /* Conversion macros */
233*b636d99dSDavid van Moolenbroek #define	vtonfsv2_mode(t,m) \
234*b636d99dSDavid van Moolenbroek 		txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : \
235*b636d99dSDavid van Moolenbroek 				MAKEIMODE((t), (m)))
236*b636d99dSDavid van Moolenbroek #define vtonfsv3_mode(m)	txdr_unsigned((m) & 07777)
237*b636d99dSDavid van Moolenbroek #define	nfstov_mode(a)		(fxdr_unsigned(uint16_t, (a))&07777)
238*b636d99dSDavid van Moolenbroek #define	vtonfsv2_type(a)	txdr_unsigned(nfsv2_type[((int32_t)(a))])
239*b636d99dSDavid van Moolenbroek #define	vtonfsv3_type(a)	txdr_unsigned(nfsv3_type[((int32_t)(a))])
240*b636d99dSDavid van Moolenbroek #define	nfsv2tov_type(a)	nv2tov_type[fxdr_unsigned(uint32_t,(a))&0x7]
241*b636d99dSDavid van Moolenbroek #define	nfsv3tov_type(a)	nv3tov_type[fxdr_unsigned(uint32_t,(a))&0x7]
242*b636d99dSDavid van Moolenbroek 
243*b636d99dSDavid van Moolenbroek /* File types */
244*b636d99dSDavid van Moolenbroek typedef enum { NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5,
245*b636d99dSDavid van Moolenbroek 	NFSOCK=6, NFFIFO=7 } nfs_type;
246*b636d99dSDavid van Moolenbroek 
247*b636d99dSDavid van Moolenbroek /* Structs for common parts of the rpc's */
248*b636d99dSDavid van Moolenbroek /*
249*b636d99dSDavid van Moolenbroek  * File Handle (32 bytes for version 2), variable up to 64 for version 3.
250*b636d99dSDavid van Moolenbroek  * File Handles of up to NFS_SMALLFH in size are stored directly in the
251*b636d99dSDavid van Moolenbroek  * nfs node, whereas larger ones are malloc'd. (This never happens when
252*b636d99dSDavid van Moolenbroek  * NFS_SMALLFH is set to 64.)
253*b636d99dSDavid van Moolenbroek  * NFS_SMALLFH should be in the range of 32 to 64 and be divisible by 4.
254*b636d99dSDavid van Moolenbroek  */
255*b636d99dSDavid van Moolenbroek #ifndef NFS_SMALLFH
256*b636d99dSDavid van Moolenbroek #define NFS_SMALLFH	64
257*b636d99dSDavid van Moolenbroek #endif
258*b636d99dSDavid van Moolenbroek union nfsfh {
259*b636d99dSDavid van Moolenbroek /*	fhandle_t fh_generic; */
260*b636d99dSDavid van Moolenbroek 	u_char    fh_bytes[NFS_SMALLFH];
261*b636d99dSDavid van Moolenbroek };
262*b636d99dSDavid van Moolenbroek typedef union nfsfh nfsfh_t;
263*b636d99dSDavid van Moolenbroek 
264*b636d99dSDavid van Moolenbroek struct nfsv2_time {
265*b636d99dSDavid van Moolenbroek 	uint32_t nfsv2_sec;
266*b636d99dSDavid van Moolenbroek 	uint32_t nfsv2_usec;
267*b636d99dSDavid van Moolenbroek };
268*b636d99dSDavid van Moolenbroek typedef struct nfsv2_time	nfstime2;
269*b636d99dSDavid van Moolenbroek 
270*b636d99dSDavid van Moolenbroek struct nfsv3_time {
271*b636d99dSDavid van Moolenbroek 	uint32_t nfsv3_sec;
272*b636d99dSDavid van Moolenbroek 	uint32_t nfsv3_nsec;
273*b636d99dSDavid van Moolenbroek };
274*b636d99dSDavid van Moolenbroek typedef struct nfsv3_time	nfstime3;
275*b636d99dSDavid van Moolenbroek 
276*b636d99dSDavid van Moolenbroek /*
277*b636d99dSDavid van Moolenbroek  * Quads are defined as arrays of 2 longs to ensure dense packing for the
278*b636d99dSDavid van Moolenbroek  * protocol and to facilitate xdr conversion.
279*b636d99dSDavid van Moolenbroek  */
280*b636d99dSDavid van Moolenbroek struct nfs_uquad {
281*b636d99dSDavid van Moolenbroek 	uint32_t nfsuquad[2];
282*b636d99dSDavid van Moolenbroek };
283*b636d99dSDavid van Moolenbroek typedef	struct nfs_uquad	nfsuint64;
284*b636d99dSDavid van Moolenbroek 
285*b636d99dSDavid van Moolenbroek /*
286*b636d99dSDavid van Moolenbroek  * NFS Version 3 special file number.
287*b636d99dSDavid van Moolenbroek  */
288*b636d99dSDavid van Moolenbroek struct nfsv3_spec {
289*b636d99dSDavid van Moolenbroek 	uint32_t specdata1;
290*b636d99dSDavid van Moolenbroek 	uint32_t specdata2;
291*b636d99dSDavid van Moolenbroek };
292*b636d99dSDavid van Moolenbroek typedef	struct nfsv3_spec	nfsv3spec;
293*b636d99dSDavid van Moolenbroek 
294*b636d99dSDavid van Moolenbroek /*
295*b636d99dSDavid van Moolenbroek  * File attributes and setable attributes. These structures cover both
296*b636d99dSDavid van Moolenbroek  * NFS version 2 and the version 3 protocol. Note that the union is only
297*b636d99dSDavid van Moolenbroek  * used so that one pointer can refer to both variants. These structures
298*b636d99dSDavid van Moolenbroek  * go out on the wire and must be densely packed, so no quad data types
299*b636d99dSDavid van Moolenbroek  * are used. (all fields are longs or u_longs or structures of same)
300*b636d99dSDavid van Moolenbroek  * NB: You can't do sizeof(struct nfs_fattr), you must use the
301*b636d99dSDavid van Moolenbroek  *     NFSX_FATTR(v3) macro.
302*b636d99dSDavid van Moolenbroek  */
303*b636d99dSDavid van Moolenbroek struct nfs_fattr {
304*b636d99dSDavid van Moolenbroek 	uint32_t fa_type;
305*b636d99dSDavid van Moolenbroek 	uint32_t fa_mode;
306*b636d99dSDavid van Moolenbroek 	uint32_t fa_nlink;
307*b636d99dSDavid van Moolenbroek 	uint32_t fa_uid;
308*b636d99dSDavid van Moolenbroek 	uint32_t fa_gid;
309*b636d99dSDavid van Moolenbroek 	union {
310*b636d99dSDavid van Moolenbroek 		struct {
311*b636d99dSDavid van Moolenbroek 			uint32_t nfsv2fa_size;
312*b636d99dSDavid van Moolenbroek 			uint32_t nfsv2fa_blocksize;
313*b636d99dSDavid van Moolenbroek 			uint32_t nfsv2fa_rdev;
314*b636d99dSDavid van Moolenbroek 			uint32_t nfsv2fa_blocks;
315*b636d99dSDavid van Moolenbroek 			uint32_t nfsv2fa_fsid;
316*b636d99dSDavid van Moolenbroek 			uint32_t nfsv2fa_fileid;
317*b636d99dSDavid van Moolenbroek 			nfstime2  nfsv2fa_atime;
318*b636d99dSDavid van Moolenbroek 			nfstime2  nfsv2fa_mtime;
319*b636d99dSDavid van Moolenbroek 			nfstime2  nfsv2fa_ctime;
320*b636d99dSDavid van Moolenbroek 		} fa_nfsv2;
321*b636d99dSDavid van Moolenbroek 		struct {
322*b636d99dSDavid van Moolenbroek 			nfsuint64 nfsv3fa_size;
323*b636d99dSDavid van Moolenbroek 			nfsuint64 nfsv3fa_used;
324*b636d99dSDavid van Moolenbroek 			nfsv3spec nfsv3fa_rdev;
325*b636d99dSDavid van Moolenbroek 			nfsuint64 nfsv3fa_fsid;
326*b636d99dSDavid van Moolenbroek 			nfsuint64 nfsv3fa_fileid;
327*b636d99dSDavid van Moolenbroek 			nfstime3  nfsv3fa_atime;
328*b636d99dSDavid van Moolenbroek 			nfstime3  nfsv3fa_mtime;
329*b636d99dSDavid van Moolenbroek 			nfstime3  nfsv3fa_ctime;
330*b636d99dSDavid van Moolenbroek 		} fa_nfsv3;
331*b636d99dSDavid van Moolenbroek 	} fa_un;
332*b636d99dSDavid van Moolenbroek };
333*b636d99dSDavid van Moolenbroek 
334*b636d99dSDavid van Moolenbroek /* and some ugly defines for accessing union components */
335*b636d99dSDavid van Moolenbroek #define	fa2_size		fa_un.fa_nfsv2.nfsv2fa_size
336*b636d99dSDavid van Moolenbroek #define	fa2_blocksize		fa_un.fa_nfsv2.nfsv2fa_blocksize
337*b636d99dSDavid van Moolenbroek #define	fa2_rdev		fa_un.fa_nfsv2.nfsv2fa_rdev
338*b636d99dSDavid van Moolenbroek #define	fa2_blocks		fa_un.fa_nfsv2.nfsv2fa_blocks
339*b636d99dSDavid van Moolenbroek #define	fa2_fsid		fa_un.fa_nfsv2.nfsv2fa_fsid
340*b636d99dSDavid van Moolenbroek #define	fa2_fileid		fa_un.fa_nfsv2.nfsv2fa_fileid
341*b636d99dSDavid van Moolenbroek #define	fa2_atime		fa_un.fa_nfsv2.nfsv2fa_atime
342*b636d99dSDavid van Moolenbroek #define	fa2_mtime		fa_un.fa_nfsv2.nfsv2fa_mtime
343*b636d99dSDavid van Moolenbroek #define	fa2_ctime		fa_un.fa_nfsv2.nfsv2fa_ctime
344*b636d99dSDavid van Moolenbroek #define	fa3_size		fa_un.fa_nfsv3.nfsv3fa_size
345*b636d99dSDavid van Moolenbroek #define	fa3_used		fa_un.fa_nfsv3.nfsv3fa_used
346*b636d99dSDavid van Moolenbroek #define	fa3_rdev		fa_un.fa_nfsv3.nfsv3fa_rdev
347*b636d99dSDavid van Moolenbroek #define	fa3_fsid		fa_un.fa_nfsv3.nfsv3fa_fsid
348*b636d99dSDavid van Moolenbroek #define	fa3_fileid		fa_un.fa_nfsv3.nfsv3fa_fileid
349*b636d99dSDavid van Moolenbroek #define	fa3_atime		fa_un.fa_nfsv3.nfsv3fa_atime
350*b636d99dSDavid van Moolenbroek #define	fa3_mtime		fa_un.fa_nfsv3.nfsv3fa_mtime
351*b636d99dSDavid van Moolenbroek #define	fa3_ctime		fa_un.fa_nfsv3.nfsv3fa_ctime
352*b636d99dSDavid van Moolenbroek 
353*b636d99dSDavid van Moolenbroek struct nfsv2_sattr {
354*b636d99dSDavid van Moolenbroek 	uint32_t sa_mode;
355*b636d99dSDavid van Moolenbroek 	uint32_t sa_uid;
356*b636d99dSDavid van Moolenbroek 	uint32_t sa_gid;
357*b636d99dSDavid van Moolenbroek 	uint32_t sa_size;
358*b636d99dSDavid van Moolenbroek 	nfstime2  sa_atime;
359*b636d99dSDavid van Moolenbroek 	nfstime2  sa_mtime;
360*b636d99dSDavid van Moolenbroek };
361*b636d99dSDavid van Moolenbroek 
362*b636d99dSDavid van Moolenbroek /*
363*b636d99dSDavid van Moolenbroek  * NFS Version 3 sattr structure for the new node creation case.
364*b636d99dSDavid van Moolenbroek  */
365*b636d99dSDavid van Moolenbroek struct nfsv3_sattr {
366*b636d99dSDavid van Moolenbroek 	uint32_t   sa_modeset;
367*b636d99dSDavid van Moolenbroek 	uint32_t   sa_mode;
368*b636d99dSDavid van Moolenbroek 	uint32_t   sa_uidset;
369*b636d99dSDavid van Moolenbroek 	uint32_t   sa_uid;
370*b636d99dSDavid van Moolenbroek 	uint32_t   sa_gidset;
371*b636d99dSDavid van Moolenbroek 	uint32_t   sa_gid;
372*b636d99dSDavid van Moolenbroek 	uint32_t   sa_sizeset;
373*b636d99dSDavid van Moolenbroek 	uint32_t   sa_size;
374*b636d99dSDavid van Moolenbroek 	uint32_t   sa_atimetype;
375*b636d99dSDavid van Moolenbroek 	nfstime3  sa_atime;
376*b636d99dSDavid van Moolenbroek 	uint32_t   sa_mtimetype;
377*b636d99dSDavid van Moolenbroek 	nfstime3  sa_mtime;
378*b636d99dSDavid van Moolenbroek };
379*b636d99dSDavid van Moolenbroek 
380*b636d99dSDavid van Moolenbroek struct nfs_statfs {
381*b636d99dSDavid van Moolenbroek 	union {
382*b636d99dSDavid van Moolenbroek 		struct {
383*b636d99dSDavid van Moolenbroek 			uint32_t nfsv2sf_tsize;
384*b636d99dSDavid van Moolenbroek 			uint32_t nfsv2sf_bsize;
385*b636d99dSDavid van Moolenbroek 			uint32_t nfsv2sf_blocks;
386*b636d99dSDavid van Moolenbroek 			uint32_t nfsv2sf_bfree;
387*b636d99dSDavid van Moolenbroek 			uint32_t nfsv2sf_bavail;
388*b636d99dSDavid van Moolenbroek 		} sf_nfsv2;
389*b636d99dSDavid van Moolenbroek 		struct {
390*b636d99dSDavid van Moolenbroek 			nfsuint64 nfsv3sf_tbytes;
391*b636d99dSDavid van Moolenbroek 			nfsuint64 nfsv3sf_fbytes;
392*b636d99dSDavid van Moolenbroek 			nfsuint64 nfsv3sf_abytes;
393*b636d99dSDavid van Moolenbroek 			nfsuint64 nfsv3sf_tfiles;
394*b636d99dSDavid van Moolenbroek 			nfsuint64 nfsv3sf_ffiles;
395*b636d99dSDavid van Moolenbroek 			nfsuint64 nfsv3sf_afiles;
396*b636d99dSDavid van Moolenbroek 			uint32_t nfsv3sf_invarsec;
397*b636d99dSDavid van Moolenbroek 		} sf_nfsv3;
398*b636d99dSDavid van Moolenbroek 	} sf_un;
399*b636d99dSDavid van Moolenbroek };
400*b636d99dSDavid van Moolenbroek 
401*b636d99dSDavid van Moolenbroek #define sf_tsize	sf_un.sf_nfsv2.nfsv2sf_tsize
402*b636d99dSDavid van Moolenbroek #define sf_bsize	sf_un.sf_nfsv2.nfsv2sf_bsize
403*b636d99dSDavid van Moolenbroek #define sf_blocks	sf_un.sf_nfsv2.nfsv2sf_blocks
404*b636d99dSDavid van Moolenbroek #define sf_bfree	sf_un.sf_nfsv2.nfsv2sf_bfree
405*b636d99dSDavid van Moolenbroek #define sf_bavail	sf_un.sf_nfsv2.nfsv2sf_bavail
406*b636d99dSDavid van Moolenbroek #define sf_tbytes	sf_un.sf_nfsv3.nfsv3sf_tbytes
407*b636d99dSDavid van Moolenbroek #define sf_fbytes	sf_un.sf_nfsv3.nfsv3sf_fbytes
408*b636d99dSDavid van Moolenbroek #define sf_abytes	sf_un.sf_nfsv3.nfsv3sf_abytes
409*b636d99dSDavid van Moolenbroek #define sf_tfiles	sf_un.sf_nfsv3.nfsv3sf_tfiles
410*b636d99dSDavid van Moolenbroek #define sf_ffiles	sf_un.sf_nfsv3.nfsv3sf_ffiles
411*b636d99dSDavid van Moolenbroek #define sf_afiles	sf_un.sf_nfsv3.nfsv3sf_afiles
412*b636d99dSDavid van Moolenbroek #define sf_invarsec	sf_un.sf_nfsv3.nfsv3sf_invarsec
413*b636d99dSDavid van Moolenbroek 
414*b636d99dSDavid van Moolenbroek struct nfsv3_fsinfo {
415*b636d99dSDavid van Moolenbroek 	uint32_t fs_rtmax;
416*b636d99dSDavid van Moolenbroek 	uint32_t fs_rtpref;
417*b636d99dSDavid van Moolenbroek 	uint32_t fs_rtmult;
418*b636d99dSDavid van Moolenbroek 	uint32_t fs_wtmax;
419*b636d99dSDavid van Moolenbroek 	uint32_t fs_wtpref;
420*b636d99dSDavid van Moolenbroek 	uint32_t fs_wtmult;
421*b636d99dSDavid van Moolenbroek 	uint32_t fs_dtpref;
422*b636d99dSDavid van Moolenbroek 	nfsuint64 fs_maxfilesize;
423*b636d99dSDavid van Moolenbroek 	nfstime3  fs_timedelta;
424*b636d99dSDavid van Moolenbroek 	uint32_t fs_properties;
425*b636d99dSDavid van Moolenbroek };
426*b636d99dSDavid van Moolenbroek 
427*b636d99dSDavid van Moolenbroek struct nfsv3_pathconf {
428*b636d99dSDavid van Moolenbroek 	uint32_t pc_linkmax;
429*b636d99dSDavid van Moolenbroek 	uint32_t pc_namemax;
430*b636d99dSDavid van Moolenbroek 	uint32_t pc_notrunc;
431*b636d99dSDavid van Moolenbroek 	uint32_t pc_chownrestricted;
432*b636d99dSDavid van Moolenbroek 	uint32_t pc_caseinsensitive;
433*b636d99dSDavid van Moolenbroek 	uint32_t pc_casepreserving;
434*b636d99dSDavid van Moolenbroek };
435