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