1191783Srmacklem/*-
2191783Srmacklem * Copyright (c) 1989, 1993
3191783Srmacklem *	The Regents of the University of California.  All rights reserved.
4191783Srmacklem *
5191783Srmacklem * This code is derived from software contributed to Berkeley by
6191783Srmacklem * Rick Macklem at The University of Guelph.
7191783Srmacklem *
8191783Srmacklem * Redistribution and use in source and binary forms, with or without
9191783Srmacklem * modification, are permitted provided that the following conditions
10191783Srmacklem * are met:
11191783Srmacklem * 1. Redistributions of source code must retain the above copyright
12191783Srmacklem *    notice, this list of conditions and the following disclaimer.
13191783Srmacklem * 2. Redistributions in binary form must reproduce the above copyright
14191783Srmacklem *    notice, this list of conditions and the following disclaimer in the
15191783Srmacklem *    documentation and/or other materials provided with the distribution.
16191783Srmacklem * 4. Neither the name of the University nor the names of its contributors
17191783Srmacklem *    may be used to endorse or promote products derived from this software
18191783Srmacklem *    without specific prior written permission.
19191783Srmacklem *
20191783Srmacklem * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21191783Srmacklem * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22191783Srmacklem * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23191783Srmacklem * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24191783Srmacklem * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25191783Srmacklem * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26191783Srmacklem * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27191783Srmacklem * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28191783Srmacklem * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29191783Srmacklem * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30191783Srmacklem * SUCH DAMAGE.
31191783Srmacklem *
32191783Srmacklem * $FreeBSD: stable/11/sys/fs/nfs/nfsproto.h 347045 2019-05-03 03:05:22Z rmacklem $
33191783Srmacklem */
34191783Srmacklem
35191783Srmacklem#ifndef _NFS_NFSPROTO_H_
36191783Srmacklem#define	_NFS_NFSPROTO_H_
37191783Srmacklem
38191783Srmacklem/*
39191783Srmacklem * nfs definitions as per the Version 2, 3 and 4 specs
40191783Srmacklem */
41191783Srmacklem
42191783Srmacklem/*
43191783Srmacklem * Constants as defined in the NFS Version 2, 3 and 4 specs.
44191783Srmacklem * "NFS: Network File System Protocol Specification" RFC1094
45191783Srmacklem * and in the "NFS: Network File System Version 3 Protocol
46191783Srmacklem * Specification"
47191783Srmacklem */
48191783Srmacklem
49191783Srmacklem#define	NFS_PORT	2049
50191783Srmacklem#define	NFS_PROG	100003
51191783Srmacklem#define	NFS_CALLBCKPROG	0x40000000	/* V4 only */
52191783Srmacklem#define	NFS_VER2	2
53191783Srmacklem#define	NFS_VER3	3
54191783Srmacklem#define	NFS_VER4	4
55191783Srmacklem#define	NFS_V2MAXDATA	8192
56191783Srmacklem#define	NFS_MAXDGRAMDATA 16384
57191783Srmacklem#define	NFS_MAXPATHLEN	1024
58191783Srmacklem#define	NFS_MAXNAMLEN	255
59320615Srmacklem/*
60320615Srmacklem * Calculating the maximum XDR overhead for an NFS RPC isn't easy.
61320615Srmacklem * NFS_MAXPKTHDR is antiquated and assumes AUTH_SYS over UDP.
62320615Srmacklem * NFS_MAXXDR should be sufficient for all NFS versions over TCP.
63320615Srmacklem * It includes:
64320615Srmacklem * - Maximum RPC message header. It can include 2 400byte authenticators plus
65320615Srmacklem *   a machine name of unlimited length, although it is usually relatively
66320615Srmacklem *   small.
67320615Srmacklem * - XDR overheads for the NFSv4 compound. This can include Owner and
68320615Srmacklem *   Owner_group strings, which are usually fairly small, but are allowed
69320615Srmacklem *   to be up to 1024 bytes each.
70320615Srmacklem * 4096 is overkill, but should always be sufficient.
71320615Srmacklem */
72191783Srmacklem#define	NFS_MAXPKTHDR	404
73320615Srmacklem#define	NFS_MAXXDR	4096
74320615Srmacklem#define	NFS_MAXPACKET	(NFS_SRVMAXIO + NFS_MAXXDR)
75191783Srmacklem#define	NFS_MINPACKET	20
76191783Srmacklem#define	NFS_FABLKSIZE	512	/* Size in bytes of a block wrt fa_blocks */
77191783Srmacklem#define	NFSV4_MINORVERSION	0	/* V4 Minor version */
78244042Srmacklem#define	NFSV41_MINORVERSION	1	/* V4 Minor version */
79191783Srmacklem#define	NFSV4_CBVERS		1	/* V4 CB Version */
80244042Srmacklem#define	NFSV41_CBVERS		4	/* V4.1 CB Version */
81191783Srmacklem#define	NFSV4_SMALLSTR	50		/* Strings small enough for stack */
82191783Srmacklem
83281628Srmacklem/*
84281628Srmacklem * This value isn't a fixed value in the RFCs.
85281628Srmacklem * It is the maximum data size supported by NFSv3 or NFSv4 over TCP for
86281628Srmacklem * the server.  It should be set to the I/O size preferred by ZFS or
87281628Srmacklem * MAXBSIZE, whichever is greater.
88281628Srmacklem * ZFS currently prefers 128K.
89281628Srmacklem * It used to be called NFS_MAXDATA, but has been renamed to clarify that
90281628Srmacklem * it refers to server side only and doesn't conflict with the NFS_MAXDATA
91281628Srmacklem * defined in rpcsvc/nfs_prot.h for userland.
92281628Srmacklem */
93281628Srmacklem#define	NFS_SRVMAXIO	(128 * 1024)
94281628Srmacklem
95191783Srmacklem/* Stat numbers for rpc returns (version 2, 3 and 4) */
96221462Srmacklem/*
97221462Srmacklem * These numbers are hard-wired in the RFCs, so they can't be changed.
98221462Srmacklem * The code currently assumes that the ones < 10000 are the same as
99221462Srmacklem * sys/errno.h and that sys/errno.h will never go as high as 10000.
100221462Srmacklem * If the value in sys/errno.h of any entry listed below is changed,
101221462Srmacklem * the NFS code must be modified to do the mapping between them.
102221462Srmacklem * (You can ignore NFSERR_WFLUSH, since it is never actually used.)
103221462Srmacklem */
104191783Srmacklem#define	NFSERR_OK		0
105191783Srmacklem#define	NFSERR_PERM		1
106191783Srmacklem#define	NFSERR_NOENT		2
107191783Srmacklem#define	NFSERR_IO		5
108191783Srmacklem#define	NFSERR_NXIO		6
109191783Srmacklem#define	NFSERR_ACCES		13
110191783Srmacklem#define	NFSERR_EXIST		17
111191783Srmacklem#define	NFSERR_XDEV		18	/* Version 3, 4 only */
112191783Srmacklem#define	NFSERR_NODEV		19
113191783Srmacklem#define	NFSERR_NOTDIR		20
114191783Srmacklem#define	NFSERR_ISDIR		21
115191783Srmacklem#define	NFSERR_INVAL		22	/* Version 3, 4 only */
116191783Srmacklem#define	NFSERR_FBIG		27
117191783Srmacklem#define	NFSERR_NOSPC		28
118191783Srmacklem#define	NFSERR_ROFS		30
119191783Srmacklem#define	NFSERR_MLINK		31	/* Version 3, 4 only */
120191783Srmacklem#define	NFSERR_NAMETOL		63
121191783Srmacklem#define	NFSERR_NOTEMPTY		66
122191783Srmacklem#define	NFSERR_DQUOT		69
123191783Srmacklem#define	NFSERR_STALE		70
124191783Srmacklem#define	NFSERR_REMOTE		71	/* Version 3 only */
125191783Srmacklem#define	NFSERR_WFLUSH		99	/* Version 2 only */
126191783Srmacklem#define	NFSERR_BADHANDLE	10001	/* These are Version 3, 4 only */
127191783Srmacklem#define	NFSERR_NOT_SYNC		10002	/* Version 3 Only */
128191783Srmacklem#define	NFSERR_BAD_COOKIE	10003
129191783Srmacklem#define	NFSERR_NOTSUPP		10004
130191783Srmacklem#define	NFSERR_TOOSMALL		10005
131191783Srmacklem#define	NFSERR_SERVERFAULT	10006
132191783Srmacklem#define	NFSERR_BADTYPE		10007
133191783Srmacklem#define	NFSERR_DELAY		10008	/* Called NFSERR_JUKEBOX for V3 */
134191783Srmacklem#define	NFSERR_SAME		10009	/* These are Version 4 only */
135191783Srmacklem#define	NFSERR_DENIED		10010
136191783Srmacklem#define	NFSERR_EXPIRED		10011
137191783Srmacklem#define	NFSERR_LOCKED		10012
138191783Srmacklem#define	NFSERR_GRACE		10013
139191783Srmacklem#define	NFSERR_FHEXPIRED	10014
140191783Srmacklem#define	NFSERR_SHAREDENIED	10015
141191783Srmacklem#define	NFSERR_WRONGSEC		10016
142191783Srmacklem#define	NFSERR_CLIDINUSE	10017
143191783Srmacklem#define	NFSERR_RESOURCE		10018
144191783Srmacklem#define	NFSERR_MOVED		10019
145191783Srmacklem#define	NFSERR_NOFILEHANDLE	10020
146191783Srmacklem#define	NFSERR_MINORVERMISMATCH	10021
147191783Srmacklem#define	NFSERR_STALECLIENTID	10022
148191783Srmacklem#define	NFSERR_STALESTATEID	10023
149191783Srmacklem#define	NFSERR_OLDSTATEID	10024
150191783Srmacklem#define	NFSERR_BADSTATEID	10025
151191783Srmacklem#define	NFSERR_BADSEQID		10026
152191783Srmacklem#define	NFSERR_NOTSAME		10027
153191783Srmacklem#define	NFSERR_LOCKRANGE	10028
154191783Srmacklem#define	NFSERR_SYMLINK		10029
155191783Srmacklem#define	NFSERR_RESTOREFH	10030
156191783Srmacklem#define	NFSERR_LEASEMOVED	10031
157191783Srmacklem#define	NFSERR_ATTRNOTSUPP	10032
158191783Srmacklem#define	NFSERR_NOGRACE		10033
159191783Srmacklem#define	NFSERR_RECLAIMBAD	10034
160191783Srmacklem#define	NFSERR_RECLAIMCONFLICT	10035
161191783Srmacklem#define	NFSERR_BADXDR		10036
162191783Srmacklem#define	NFSERR_LOCKSHELD	10037
163191783Srmacklem#define	NFSERR_OPENMODE		10038
164191783Srmacklem#define	NFSERR_BADOWNER		10039
165191783Srmacklem#define	NFSERR_BADCHAR		10040
166191783Srmacklem#define	NFSERR_BADNAME		10041
167191783Srmacklem#define	NFSERR_BADRANGE		10042
168191783Srmacklem#define	NFSERR_LOCKNOTSUPP	10043
169191783Srmacklem#define	NFSERR_OPILLEGAL	10044
170191783Srmacklem#define	NFSERR_DEADLOCK		10045
171191783Srmacklem#define	NFSERR_FILEOPEN		10046
172191783Srmacklem#define	NFSERR_ADMINREVOKED	10047
173191783Srmacklem#define	NFSERR_CBPATHDOWN	10048
174191783Srmacklem
175244042Srmacklem/* NFSv4.1 specific errors. */
176244042Srmacklem#define	NFSERR_BADIOMODE	10049
177244042Srmacklem#define	NFSERR_BADLAYOUT	10050
178244042Srmacklem#define	NFSERR_BADSESSIONDIGEST	10051
179244042Srmacklem#define	NFSERR_BADSESSION	10052
180244042Srmacklem#define	NFSERR_BADSLOT		10053
181244042Srmacklem#define	NFSERR_COMPLETEALREADY	10054
182244042Srmacklem#define	NFSERR_NOTBNDTOSESS	10055
183244042Srmacklem#define	NFSERR_DELEGALREADYWANT	10056
184244042Srmacklem#define	NFSERR_BACKCHANBUSY	10057
185244042Srmacklem#define	NFSERR_LAYOUTTRYLATER	10058
186244042Srmacklem#define	NFSERR_LAYOUTUNAVAIL	10059
187244042Srmacklem#define	NFSERR_NOMATCHLAYOUT	10060
188244042Srmacklem#define	NFSERR_RECALLCONFLICT	10061
189244042Srmacklem#define	NFSERR_UNKNLAYOUTTYPE	10062
190244042Srmacklem#define	NFSERR_SEQMISORDERED	10063
191244042Srmacklem#define	NFSERR_SEQUENCEPOS	10064
192244042Srmacklem#define	NFSERR_REQTOOBIG	10065
193244042Srmacklem#define	NFSERR_REPTOOBIG	10066
194244042Srmacklem#define	NFSERR_REPTOOBIGTOCACHE	10067
195244042Srmacklem#define	NFSERR_RETRYUNCACHEDREP	10068
196244042Srmacklem#define	NFSERR_UNSAFECOMPOUND	10069
197244042Srmacklem#define	NFSERR_TOOMANYOPS	10070
198244042Srmacklem#define	NFSERR_OPNOTINSESS	10071
199244042Srmacklem#define	NFSERR_HASHALGUNSUPP	10072
200244042Srmacklem#define	NFSERR_CLIENTIDBUSY	10074
201244042Srmacklem#define	NFSERR_PNFSIOHOLE	10075
202244042Srmacklem#define	NFSERR_SEQFALSERETRY	10076
203244042Srmacklem#define	NFSERR_BADHIGHSLOT	10077
204244042Srmacklem#define	NFSERR_DEADSESSION	10078
205244042Srmacklem#define	NFSERR_ENCRALGUNSUPP	10079
206244042Srmacklem#define	NFSERR_PNFSNOLAYOUT	10080
207244042Srmacklem#define	NFSERR_NOTONLYOP	10081
208244042Srmacklem#define	NFSERR_WRONGCRED	10082
209244042Srmacklem#define	NFSERR_WRONGTYPE	10083
210244042Srmacklem#define	NFSERR_DIRDELEGUNAVAIL	10084
211244042Srmacklem#define	NFSERR_REJECTDELEG	10085
212244042Srmacklem#define	NFSERR_RETURNCONFLICT	10086
213244042Srmacklem#define	NFSERR_DELEGREVOKED	10087
214244042Srmacklem
215191783Srmacklem#define	NFSERR_STALEWRITEVERF	30001	/* Fake return for nfs_commit() */
216191783Srmacklem#define	NFSERR_DONTREPLY	30003	/* Don't process request */
217191783Srmacklem#define	NFSERR_RETVOID		30004	/* Return void, not error */
218191783Srmacklem#define	NFSERR_REPLYFROMCACHE	30005	/* Reply from recent request cache */
219191783Srmacklem#define	NFSERR_STALEDONTRECOVER	30006	/* Don't initiate recovery */
220191783Srmacklem
221191783Srmacklem#define	NFSERR_RPCERR		0x40000000 /* Mark an RPC layer error */
222191783Srmacklem#define	NFSERR_AUTHERR		0x80000000 /* Mark an authentication error */
223191783Srmacklem
224191783Srmacklem#define	NFSERR_RPCMISMATCH	(NFSERR_RPCERR | RPC_MISMATCH)
225191783Srmacklem#define	NFSERR_PROGUNAVAIL	(NFSERR_RPCERR | RPC_PROGUNAVAIL)
226191783Srmacklem#define	NFSERR_PROGMISMATCH	(NFSERR_RPCERR | RPC_PROGMISMATCH)
227191783Srmacklem#define	NFSERR_PROGNOTV4	(NFSERR_RPCERR | 0xffff)
228191783Srmacklem#define	NFSERR_PROCUNAVAIL	(NFSERR_RPCERR | RPC_PROCUNAVAIL)
229191783Srmacklem#define	NFSERR_GARBAGE		(NFSERR_RPCERR | RPC_GARBAGE)
230191783Srmacklem
231191783Srmacklem/* Sizes in bytes of various nfs rpc components */
232191783Srmacklem#define	NFSX_UNSIGNED	4
233191783Srmacklem#define	NFSX_HYPER	(2 * NFSX_UNSIGNED)
234191783Srmacklem
235191783Srmacklem/* specific to NFS Version 2 */
236191783Srmacklem#define	NFSX_V2FH	32
237191783Srmacklem#define	NFSX_V2FATTR	68
238191783Srmacklem#define	NFSX_V2SATTR	32
239191783Srmacklem#define	NFSX_V2COOKIE	4
240191783Srmacklem#define	NFSX_V2STATFS	20
241191783Srmacklem
242191783Srmacklem/* specific to NFS Version 3 */
243191783Srmacklem#define	NFSX_V3FHMAX		64	/* max. allowed by protocol */
244191783Srmacklem#define	NFSX_V3FATTR		84
245191783Srmacklem#define	NFSX_V3SATTR		60	/* max. all fields filled in */
246191783Srmacklem#define	NFSX_V3SRVSATTR		(sizeof (struct nfsv3_sattr))
247191783Srmacklem#define	NFSX_V3POSTOPATTR	(NFSX_V3FATTR + NFSX_UNSIGNED)
248191783Srmacklem#define	NFSX_V3WCCDATA		(NFSX_V3POSTOPATTR + 8 * NFSX_UNSIGNED)
249191783Srmacklem#define	NFSX_V3STATFS		52
250191783Srmacklem#define	NFSX_V3FSINFO		48
251191783Srmacklem#define	NFSX_V3PATHCONF		24
252191783Srmacklem
253191783Srmacklem/* specific to NFS Version 4 */
254191783Srmacklem#define	NFSX_V4FHMAX		128
255191783Srmacklem#define	NFSX_V4FSID		(2 * NFSX_HYPER)
256191783Srmacklem#define	NFSX_V4SPECDATA		(2 * NFSX_UNSIGNED)
257191783Srmacklem#define	NFSX_V4TIME		(NFSX_HYPER + NFSX_UNSIGNED)
258191783Srmacklem#define	NFSX_V4SETTIME		(NFSX_UNSIGNED + NFSX_V4TIME)
259244042Srmacklem#define	NFSX_V4SESSIONID	16
260244042Srmacklem#define	NFSX_V4DEVICEID		16
261191783Srmacklem
262191783Srmacklem/* sizes common to multiple NFS versions */
263191783Srmacklem#define	NFSX_FHMAX		(NFSX_V4FHMAX)
264191783Srmacklem#define	NFSX_MYFH		(sizeof (fhandle_t)) /* size this server uses */
265191783Srmacklem#define	NFSX_VERF 		8
266191783Srmacklem#define	NFSX_STATEIDOTHER	12
267191783Srmacklem#define	NFSX_STATEID		(NFSX_UNSIGNED + NFSX_STATEIDOTHER)
268191783Srmacklem#define	NFSX_GSSH		12
269191783Srmacklem
270191783Srmacklem/* variants for multiple versions */
271191783Srmacklem#define	NFSX_STATFS(v3)		((v3) ? NFSX_V3STATFS : NFSX_V2STATFS)
272191783Srmacklem
273191783Srmacklem/* nfs rpc procedure numbers (before version mapping) */
274191783Srmacklem#define	NFSPROC_NULL		0
275191783Srmacklem#define	NFSPROC_GETATTR		1
276191783Srmacklem#define	NFSPROC_SETATTR		2
277191783Srmacklem#define	NFSPROC_LOOKUP		3
278191783Srmacklem#define	NFSPROC_ACCESS		4
279191783Srmacklem#define	NFSPROC_READLINK	5
280191783Srmacklem#define	NFSPROC_READ		6
281191783Srmacklem#define	NFSPROC_WRITE		7
282191783Srmacklem#define	NFSPROC_CREATE		8
283191783Srmacklem#define	NFSPROC_MKDIR		9
284191783Srmacklem#define	NFSPROC_SYMLINK		10
285191783Srmacklem#define	NFSPROC_MKNOD		11
286191783Srmacklem#define	NFSPROC_REMOVE		12
287191783Srmacklem#define	NFSPROC_RMDIR		13
288191783Srmacklem#define	NFSPROC_RENAME		14
289191783Srmacklem#define	NFSPROC_LINK		15
290191783Srmacklem#define	NFSPROC_READDIR		16
291191783Srmacklem#define	NFSPROC_READDIRPLUS	17
292191783Srmacklem#define	NFSPROC_FSSTAT		18
293191783Srmacklem#define	NFSPROC_FSINFO		19
294191783Srmacklem#define	NFSPROC_PATHCONF	20
295191783Srmacklem#define	NFSPROC_COMMIT		21
296191783Srmacklem
297191783Srmacklem/*
298223280Srmacklem * The lower numbers -> 21 are used by NFSv2 and v3. These define higher
299223280Srmacklem * numbers used by NFSv4.
300223280Srmacklem * NFS_V3NPROCS is one greater than the last V3 op and NFS_NPROCS is
301223280Srmacklem * one greater than the last number.
302223280Srmacklem */
303223280Srmacklem#ifndef	NFS_V3NPROCS
304223280Srmacklem#define	NFS_V3NPROCS		22
305223280Srmacklem
306223280Srmacklem#define	NFSPROC_LOOKUPP		22
307223280Srmacklem#define	NFSPROC_SETCLIENTID	23
308223280Srmacklem#define	NFSPROC_SETCLIENTIDCFRM	24
309223280Srmacklem#define	NFSPROC_LOCK		25
310223280Srmacklem#define	NFSPROC_LOCKU		26
311223280Srmacklem#define	NFSPROC_OPEN		27
312223280Srmacklem#define	NFSPROC_CLOSE		28
313223280Srmacklem#define	NFSPROC_OPENCONFIRM	29
314223280Srmacklem#define	NFSPROC_LOCKT		30
315223280Srmacklem#define	NFSPROC_OPENDOWNGRADE	31
316223280Srmacklem#define	NFSPROC_RENEW		32
317223280Srmacklem#define	NFSPROC_PUTROOTFH	33
318223280Srmacklem#define	NFSPROC_RELEASELCKOWN	34
319223280Srmacklem#define	NFSPROC_DELEGRETURN	35
320223280Srmacklem#define	NFSPROC_RETDELEGREMOVE	36
321223280Srmacklem#define	NFSPROC_RETDELEGRENAME1	37
322223280Srmacklem#define	NFSPROC_RETDELEGRENAME2	38
323223280Srmacklem#define	NFSPROC_GETACL		39
324223280Srmacklem#define	NFSPROC_SETACL		40
325223280Srmacklem
326223280Srmacklem/*
327223280Srmacklem * Must be defined as one higher than the last Proc# above.
328223280Srmacklem */
329223280Srmacklem#define	NFSV4_NPROCS		41
330244042Srmacklem
331244042Srmacklem/* Additional procedures for NFSv4.1. */
332244042Srmacklem#define	NFSPROC_EXCHANGEID	41
333244042Srmacklem#define	NFSPROC_CREATESESSION	42
334244042Srmacklem#define	NFSPROC_DESTROYSESSION	43
335244042Srmacklem#define	NFSPROC_DESTROYCLIENT	44
336244042Srmacklem#define	NFSPROC_FREESTATEID	45
337244042Srmacklem#define	NFSPROC_LAYOUTGET	46
338244042Srmacklem#define	NFSPROC_GETDEVICEINFO	47
339244042Srmacklem#define	NFSPROC_LAYOUTCOMMIT	48
340244042Srmacklem#define	NFSPROC_LAYOUTRETURN	49
341244042Srmacklem#define	NFSPROC_RECLAIMCOMPL	50
342244042Srmacklem#define	NFSPROC_WRITEDS		51
343244042Srmacklem#define	NFSPROC_READDS		52
344244042Srmacklem#define	NFSPROC_COMMITDS	53
345320998Srmacklem#define	NFSPROC_OPENLAYGET	54
346320998Srmacklem#define	NFSPROC_CREATELAYGET	55
347244042Srmacklem
348244042Srmacklem/*
349244042Srmacklem * Must be defined as one higher than the last NFSv4.1 Proc# above.
350244042Srmacklem */
351320998Srmacklem#define	NFSV41_NPROCS		56
352244042Srmacklem
353223280Srmacklem#endif	/* NFS_V3NPROCS */
354223280Srmacklem
355223280Srmacklem/*
356223280Srmacklem * Define NFS_NPROCS as NFSV4_NPROCS for the experimental kernel code.
357223280Srmacklem */
358223280Srmacklem#ifndef	NFS_NPROCS
359223280Srmacklem#define	NFS_NPROCS		NFSV4_NPROCS
360223280Srmacklem#endif
361223280Srmacklem
362223280Srmacklem/*
363191783Srmacklem * NFSPROC_NOOP is a fake op# that can't be the same as any V2/3/4 Procedure
364306609Srmacklem * or Operation#. Since the NFS V4 Op #s go higher, use NFSV42_NOPS, which
365191783Srmacklem * is one greater than the highest Op#.
366191783Srmacklem */
367306609Srmacklem#define	NFSPROC_NOOP		NFSV42_NOPS
368191783Srmacklem
369191783Srmacklem/* Actual Version 2 procedure numbers */
370191783Srmacklem#define	NFSV2PROC_NULL		0
371191783Srmacklem#define	NFSV2PROC_GETATTR	1
372191783Srmacklem#define	NFSV2PROC_SETATTR	2
373191783Srmacklem#define	NFSV2PROC_NOOP		3
374191783Srmacklem#define	NFSV2PROC_ROOT		NFSV2PROC_NOOP	/* Obsolete */
375191783Srmacklem#define	NFSV2PROC_LOOKUP	4
376191783Srmacklem#define	NFSV2PROC_READLINK	5
377191783Srmacklem#define	NFSV2PROC_READ		6
378191783Srmacklem#define	NFSV2PROC_WRITECACHE	NFSV2PROC_NOOP	/* Obsolete */
379191783Srmacklem#define	NFSV2PROC_WRITE		8
380191783Srmacklem#define	NFSV2PROC_CREATE	9
381191783Srmacklem#define	NFSV2PROC_REMOVE	10
382191783Srmacklem#define	NFSV2PROC_RENAME	11
383191783Srmacklem#define	NFSV2PROC_LINK		12
384191783Srmacklem#define	NFSV2PROC_SYMLINK	13
385191783Srmacklem#define	NFSV2PROC_MKDIR		14
386191783Srmacklem#define	NFSV2PROC_RMDIR		15
387191783Srmacklem#define	NFSV2PROC_READDIR	16
388191783Srmacklem#define	NFSV2PROC_STATFS	17
389191783Srmacklem
390191783Srmacklem/*
391192152Srmacklem * V4 Procedure numbers
392191783Srmacklem */
393191783Srmacklem#define	NFSV4PROC_COMPOUND	1
394191783Srmacklem#define	NFSV4PROC_CBNULL	0
395191783Srmacklem#define	NFSV4PROC_CBCOMPOUND	1
396191783Srmacklem
397191783Srmacklem/*
398191783Srmacklem * Constants used by the Version 3 and 4 protocols for various RPCs
399191783Srmacklem */
400191783Srmacklem#define	NFSV3SATTRTIME_DONTCHANGE	0
401191783Srmacklem#define	NFSV3SATTRTIME_TOSERVER		1
402191783Srmacklem#define	NFSV3SATTRTIME_TOCLIENT		2
403191783Srmacklem
404191783Srmacklem#define	NFSV4SATTRTIME_TOSERVER		0
405191783Srmacklem#define	NFSV4SATTRTIME_TOCLIENT		1
406191783Srmacklem
407191783Srmacklem#define	NFSV4LOCKT_READ			1
408191783Srmacklem#define	NFSV4LOCKT_WRITE		2
409191783Srmacklem#define	NFSV4LOCKT_READW		3
410191783Srmacklem#define	NFSV4LOCKT_WRITEW		4
411191783Srmacklem#define	NFSV4LOCKT_RELEASE		5
412191783Srmacklem
413191783Srmacklem#define	NFSV4OPEN_NOCREATE		0
414191783Srmacklem#define	NFSV4OPEN_CREATE		1
415191783Srmacklem#define	NFSV4OPEN_CLAIMNULL		0
416191783Srmacklem#define	NFSV4OPEN_CLAIMPREVIOUS		1
417191783Srmacklem#define	NFSV4OPEN_CLAIMDELEGATECUR	2
418191783Srmacklem#define	NFSV4OPEN_CLAIMDELEGATEPREV	3
419268115Srmacklem#define	NFSV4OPEN_CLAIMFH		4
420268115Srmacklem#define	NFSV4OPEN_CLAIMDELEGATECURFH	5
421268115Srmacklem#define	NFSV4OPEN_CLAIMDELEGATEPREVFH	6
422191783Srmacklem#define	NFSV4OPEN_DELEGATENONE		0
423191783Srmacklem#define	NFSV4OPEN_DELEGATEREAD		1
424191783Srmacklem#define	NFSV4OPEN_DELEGATEWRITE		2
425268115Srmacklem#define	NFSV4OPEN_DELEGATENONEEXT	3
426191783Srmacklem#define	NFSV4OPEN_LIMITSIZE		1
427191783Srmacklem#define	NFSV4OPEN_LIMITBLOCKS		2
428191783Srmacklem
429191783Srmacklem/*
430191783Srmacklem * Nfs V4 ACE stuff
431191783Srmacklem */
432191783Srmacklem#define	NFSV4ACE_ALLOWEDTYPE		0x00000000
433191783Srmacklem#define	NFSV4ACE_DENIEDTYPE		0x00000001
434191783Srmacklem#define	NFSV4ACE_AUDITTYPE		0x00000002
435191783Srmacklem#define	NFSV4ACE_ALARMTYPE		0x00000003
436191783Srmacklem
437191783Srmacklem#define	NFSV4ACE_SUPALLOWED		0x00000001
438191783Srmacklem#define	NFSV4ACE_SUPDENIED		0x00000002
439191783Srmacklem#define	NFSV4ACE_SUPAUDIT		0x00000004
440191783Srmacklem#define	NFSV4ACE_SUPALARM		0x00000008
441191783Srmacklem
442191783Srmacklem#define	NFSV4ACE_SUPTYPES	(NFSV4ACE_SUPALLOWED | NFSV4ACE_SUPDENIED)
443191783Srmacklem
444191783Srmacklem#define	NFSV4ACE_FILEINHERIT		0x00000001
445191783Srmacklem#define	NFSV4ACE_DIRECTORYINHERIT	0x00000002
446191783Srmacklem#define	NFSV4ACE_NOPROPAGATEINHERIT	0x00000004
447191783Srmacklem#define	NFSV4ACE_INHERITONLY		0x00000008
448191783Srmacklem#define	NFSV4ACE_SUCCESSFULACCESS	0x00000010
449191783Srmacklem#define	NFSV4ACE_FAILEDACCESS		0x00000020
450191783Srmacklem#define	NFSV4ACE_IDENTIFIERGROUP	0x00000040
451191783Srmacklem
452191783Srmacklem#define	NFSV4ACE_READDATA		0x00000001
453191783Srmacklem#define	NFSV4ACE_LISTDIRECTORY		0x00000001
454191783Srmacklem#define	NFSV4ACE_WRITEDATA		0x00000002
455191783Srmacklem#define	NFSV4ACE_ADDFILE		0x00000002
456191783Srmacklem#define	NFSV4ACE_APPENDDATA		0x00000004
457191783Srmacklem#define	NFSV4ACE_ADDSUBDIRECTORY	0x00000004
458191783Srmacklem#define	NFSV4ACE_READNAMEDATTR		0x00000008
459191783Srmacklem#define	NFSV4ACE_WRITENAMEDATTR		0x00000010
460191783Srmacklem#define	NFSV4ACE_EXECUTE		0x00000020
461191783Srmacklem#define	NFSV4ACE_SEARCH			0x00000020
462191783Srmacklem#define	NFSV4ACE_DELETECHILD		0x00000040
463191783Srmacklem#define	NFSV4ACE_READATTRIBUTES		0x00000080
464191783Srmacklem#define	NFSV4ACE_WRITEATTRIBUTES	0x00000100
465191783Srmacklem#define	NFSV4ACE_DELETE			0x00010000
466191783Srmacklem#define	NFSV4ACE_READACL		0x00020000
467191783Srmacklem#define	NFSV4ACE_WRITEACL		0x00040000
468191783Srmacklem#define	NFSV4ACE_WRITEOWNER		0x00080000
469191783Srmacklem#define	NFSV4ACE_SYNCHRONIZE		0x00100000
470191783Srmacklem
471191783Srmacklem/*
472191783Srmacklem * Here are the mappings between mode bits and acl mask bits for
473191783Srmacklem * directories and other files.
474191783Srmacklem * (Named attributes have not been included, since named attributes are
475191783Srmacklem *  not yet supported.)
476191783Srmacklem * The mailing list seems to indicate that NFSV4ACE_EXECUTE refers to
477191783Srmacklem * searching a directory, although I can't find a statement of that in
478191783Srmacklem * the RFC.
479191783Srmacklem */
480191783Srmacklem#define	NFSV4ACE_ALLFILESMASK	(NFSV4ACE_READATTRIBUTES | NFSV4ACE_READACL)
481191783Srmacklem#define	NFSV4ACE_OWNERMASK	(NFSV4ACE_WRITEATTRIBUTES | NFSV4ACE_WRITEACL)
482191783Srmacklem#define	NFSV4ACE_DIRREADMASK	NFSV4ACE_LISTDIRECTORY
483191783Srmacklem#define	NFSV4ACE_DIREXECUTEMASK	NFSV4ACE_EXECUTE
484191783Srmacklem#define	NFSV4ACE_DIRWRITEMASK	(NFSV4ACE_ADDFILE | 			\
485191783Srmacklem		NFSV4ACE_ADDSUBDIRECTORY | NFSV4ACE_DELETECHILD)
486191783Srmacklem#define	NFSV4ACE_READMASK	NFSV4ACE_READDATA
487191783Srmacklem#define	NFSV4ACE_WRITEMASK	(NFSV4ACE_WRITEDATA | NFSV4ACE_APPENDDATA)
488191783Srmacklem#define	NFSV4ACE_EXECUTEMASK	NFSV4ACE_EXECUTE
489191783Srmacklem#define	NFSV4ACE_ALLFILEBITS	(NFSV4ACE_READMASK | NFSV4ACE_WRITEMASK | \
490191783Srmacklem	NFSV4ACE_EXECUTEMASK | NFSV4ACE_SYNCHRONIZE)
491191783Srmacklem#define	NFSV4ACE_ALLDIRBITS	(NFSV4ACE_DIRREADMASK | 		\
492191783Srmacklem	NFSV4ACE_DIRWRITEMASK | NFSV4ACE_DIREXECUTEMASK)
493191783Srmacklem#define	NFSV4ACE_AUDITMASK	0x0
494191783Srmacklem
495191783Srmacklem/*
496191783Srmacklem * These GENERIC masks are not used and are no longer believed to be useful.
497191783Srmacklem */
498191783Srmacklem#define	NFSV4ACE_GENERICREAD		0x00120081
499191783Srmacklem#define	NFSV4ACE_GENERICWRITE		0x00160106
500191783Srmacklem#define	NFSV4ACE_GENERICEXECUTE		0x001200a0
501191783Srmacklem
502191783Srmacklem#define	NFSSTATEID_PUTALLZERO		0
503191783Srmacklem#define	NFSSTATEID_PUTALLONE		1
504191783Srmacklem#define	NFSSTATEID_PUTSTATEID		2
505244042Srmacklem#define	NFSSTATEID_PUTSEQIDZERO		3
506191783Srmacklem
507191783Srmacklem/*
508191783Srmacklem * Bits for share access and deny.
509191783Srmacklem */
510191783Srmacklem#define	NFSV4OPEN_ACCESSREAD		0x00000001
511191783Srmacklem#define	NFSV4OPEN_ACCESSWRITE		0x00000002
512191783Srmacklem#define	NFSV4OPEN_ACCESSBOTH		0x00000003
513268115Srmacklem#define	NFSV4OPEN_WANTDELEGMASK		0x0000ff00
514268115Srmacklem#define	NFSV4OPEN_WANTREADDELEG		0x00000100
515268115Srmacklem#define	NFSV4OPEN_WANTWRITEDELEG	0x00000200
516268115Srmacklem#define	NFSV4OPEN_WANTANYDELEG		0x00000300
517268115Srmacklem#define	NFSV4OPEN_WANTNODELEG		0x00000400
518268115Srmacklem#define	NFSV4OPEN_WANTCANCEL		0x00000500
519268115Srmacklem#define	NFSV4OPEN_WANTSIGNALDELEG	0x00010000
520268115Srmacklem#define	NFSV4OPEN_WANTPUSHDELEG		0x00020000
521191783Srmacklem
522191783Srmacklem#define	NFSV4OPEN_DENYNONE		0x00000000
523191783Srmacklem#define	NFSV4OPEN_DENYREAD		0x00000001
524191783Srmacklem#define	NFSV4OPEN_DENYWRITE		0x00000002
525191783Srmacklem#define	NFSV4OPEN_DENYBOTH		0x00000003
526191783Srmacklem
527191783Srmacklem/*
528268115Srmacklem * Delegate_none_ext reply values.
529268115Srmacklem */
530268115Srmacklem#define	NFSV4OPEN_NOTWANTED		0
531268115Srmacklem#define	NFSV4OPEN_CONTENTION		1
532268115Srmacklem#define	NFSV4OPEN_RESOURCE		2
533268115Srmacklem#define	NFSV4OPEN_NOTSUPPFTYPE		3
534268115Srmacklem#define	NFSV4OPEN_NOTSUPPWRITEFTYPE	4
535268115Srmacklem#define	NFSV4OPEN_NOTSUPPUPGRADE	5
536268115Srmacklem#define	NFSV4OPEN_NOTSUPPDOWNGRADE	6
537268115Srmacklem#define	NFSV4OPEN_CANCELLED		7
538268115Srmacklem#define	NFSV4OPEN_ISDIR			8
539268115Srmacklem
540268115Srmacklem/*
541191783Srmacklem * Open result flags
542268115Srmacklem * (The first four are in the spec. The rest are used internally.)
543191783Srmacklem */
544191783Srmacklem#define	NFSV4OPEN_RESULTCONFIRM		0x00000002
545191783Srmacklem#define	NFSV4OPEN_LOCKTYPEPOSIX		0x00000004
546268115Srmacklem#define	NFSV4OPEN_PRESERVEUNLINKED	0x00000008
547268115Srmacklem#define	NFSV4OPEN_MAYNOTIFYLOCK		0x00000020
548191783Srmacklem#define	NFSV4OPEN_RFLAGS 						\
549268115Srmacklem    (NFSV4OPEN_RESULTCONFIRM | NFSV4OPEN_LOCKTYPEPOSIX |		\
550268115Srmacklem    NFSV4OPEN_PRESERVEUNLINKED | NFSV4OPEN_MAYNOTIFYLOCK)
551191783Srmacklem#define	NFSV4OPEN_RECALL		0x00010000
552191783Srmacklem#define	NFSV4OPEN_READDELEGATE		0x00020000
553191783Srmacklem#define	NFSV4OPEN_WRITEDELEGATE		0x00040000
554268115Srmacklem#define	NFSV4OPEN_WDRESOURCE		0x00080000
555268115Srmacklem#define	NFSV4OPEN_WDCONTENTION		0x00100000
556268115Srmacklem#define	NFSV4OPEN_WDNOTWANTED		0x00200000
557337064Srmacklem#define	NFSV4OPEN_WDSUPPFTYPE		0x00400000
558191783Srmacklem
559191783Srmacklem/*
560191783Srmacklem * NFS V4 File Handle types
561191783Srmacklem */
562191783Srmacklem#define	NFSV4FHTYPE_PERSISTENT		0x0
563191783Srmacklem#define	NFSV4FHTYPE_NOEXPIREWITHOPEN	0x1
564191783Srmacklem#define	NFSV4FHTYPE_VOLATILEANY		0x2
565191783Srmacklem#define	NFSV4FHTYPE_VOLATILEMIGRATE	0x4
566191783Srmacklem#define	NFSV4FHTYPE_VOLATILERENAME	0x8
567191783Srmacklem
568191783Srmacklem/*
569191783Srmacklem * Maximum size of V4 opaque strings.
570191783Srmacklem */
571191783Srmacklem#define	NFSV4_OPAQUELIMIT	1024
572191783Srmacklem
573191783Srmacklem/*
574191783Srmacklem * These are the same for V3 and V4.
575191783Srmacklem */
576191783Srmacklem#define	NFSACCESS_READ			0x01
577191783Srmacklem#define	NFSACCESS_LOOKUP		0x02
578191783Srmacklem#define	NFSACCESS_MODIFY		0x04
579191783Srmacklem#define	NFSACCESS_EXTEND		0x08
580191783Srmacklem#define	NFSACCESS_DELETE		0x10
581191783Srmacklem#define	NFSACCESS_EXECUTE		0x20
582191783Srmacklem
583191783Srmacklem#define	NFSWRITE_UNSTABLE		0
584191783Srmacklem#define	NFSWRITE_DATASYNC		1
585191783Srmacklem#define	NFSWRITE_FILESYNC		2
586191783Srmacklem
587191783Srmacklem#define	NFSCREATE_UNCHECKED		0
588191783Srmacklem#define	NFSCREATE_GUARDED		1
589191783Srmacklem#define	NFSCREATE_EXCLUSIVE		2
590244042Srmacklem#define	NFSCREATE_EXCLUSIVE41		3
591191783Srmacklem
592191783Srmacklem#define	NFSV3FSINFO_LINK		0x01
593191783Srmacklem#define	NFSV3FSINFO_SYMLINK		0x02
594191783Srmacklem#define	NFSV3FSINFO_HOMOGENEOUS		0x08
595191783Srmacklem#define	NFSV3FSINFO_CANSETTIME		0x10
596191783Srmacklem
597244042Srmacklem/* Flags for Exchange ID */
598244042Srmacklem#define	NFSV4EXCH_SUPPMOVEDREFER	0x00000001
599244042Srmacklem#define	NFSV4EXCH_SUPPMOVEDMIGR	0x00000002
600244042Srmacklem#define	NFSV4EXCH_BINDPRINCSTATEID	0x00000100
601244042Srmacklem#define	NFSV4EXCH_USENONPNFS		0x00010000
602244042Srmacklem#define	NFSV4EXCH_USEPNFSMDS		0x00020000
603244042Srmacklem#define	NFSV4EXCH_USEPNFSDS		0x00040000
604244042Srmacklem#define	NFSV4EXCH_MASKPNFS		0x00070000
605244042Srmacklem#define	NFSV4EXCH_UPDCONFIRMEDRECA	0x40000000
606244042Srmacklem#define	NFSV4EXCH_CONFIRMEDR		0x80000000
607244042Srmacklem
608244042Srmacklem/* State Protects */
609244042Srmacklem#define	NFSV4EXCH_SP4NONE		0
610244042Srmacklem#define	NFSV4EXCH_SP4MACHCRED		1
611244042Srmacklem#define	NFSV4EXCH_SP4SSV		2
612244042Srmacklem
613244042Srmacklem/* Flags for Create Session */
614244042Srmacklem#define	NFSV4CRSESS_PERSIST		0x00000001
615244042Srmacklem#define	NFSV4CRSESS_CONNBACKCHAN	0x00000002
616244042Srmacklem#define	NFSV4CRSESS_CONNRDMA		0x00000004
617244042Srmacklem
618244042Srmacklem/* Flags for Sequence */
619244042Srmacklem#define	NFSV4SEQ_CBPATHDOWN		0x00000001
620244042Srmacklem#define	NFSV4SEQ_CBGSSCONTEXPIRING	0x00000002
621244042Srmacklem#define	NFSV4SEQ_CBGSSCONTEXPIRED	0x00000004
622244042Srmacklem#define	NFSV4SEQ_EXPIREDALLSTATEREVOKED	0x00000008
623244042Srmacklem#define	NFSV4SEQ_EXPIREDSOMESTATEREVOKED 0x00000010
624244042Srmacklem#define	NFSV4SEQ_ADMINSTATEREVOKED	0x00000020
625244042Srmacklem#define	NFSV4SEQ_RECALLABLESTATEREVOKED	0x00000040
626244042Srmacklem#define	NFSV4SEQ_LEASEMOVED		0x00000080
627244042Srmacklem#define	NFSV4SEQ_RESTARTRECLAIMNEEDED	0x00000100
628244042Srmacklem#define	NFSV4SEQ_CBPATHDOWNSESSION	0x00000200
629244042Srmacklem#define	NFSV4SEQ_BACKCHANNELFAULT	0x00000400
630244042Srmacklem#define	NFSV4SEQ_DEVIDCHANGED		0x00000800
631244042Srmacklem#define	NFSV4SEQ_DEVIDDELETED		0x00001000
632244042Srmacklem
633244042Srmacklem/* Flags for Layout. */
634244042Srmacklem#define	NFSLAYOUTRETURN_FILE		1
635244042Srmacklem#define	NFSLAYOUTRETURN_FSID		2
636244042Srmacklem#define	NFSLAYOUTRETURN_ALL		3
637244042Srmacklem
638244042Srmacklem#define	NFSLAYOUT_NFSV4_1_FILES		0x1
639244042Srmacklem#define	NFSLAYOUT_OSD2_OBJECTS		0x2
640244042Srmacklem#define	NFSLAYOUT_BLOCK_VOLUME		0x3
641244042Srmacklem
642244042Srmacklem#define	NFSLAYOUTIOMODE_READ		1
643244042Srmacklem#define	NFSLAYOUTIOMODE_RW		2
644244042Srmacklem#define	NFSLAYOUTIOMODE_ANY		3
645244042Srmacklem
646244042Srmacklem/* Flags for Get Device Info. */
647244042Srmacklem#define	NFSDEVICEIDNOTIFY_CHANGEBIT	0x1
648244042Srmacklem#define	NFSDEVICEIDNOTIFY_DELETEBIT	0x2
649244042Srmacklem
650244042Srmacklem/* Flags for File Layout. */
651244042Srmacklem#define	NFSFLAYUTIL_DENSE		0x1
652244042Srmacklem#define	NFSFLAYUTIL_COMMIT_THRU_MDS	0x2
653244042Srmacklem
654336842Srmacklem/* Enum values for Bind Connection to Session. */
655336842Srmacklem#define	NFSCDFC4_FORE		0x1
656336842Srmacklem#define	NFSCDFC4_BACK		0x2
657336842Srmacklem#define	NFSCDFC4_FORE_OR_BOTH	0x3
658336842Srmacklem#define	NFSCDFC4_BACK_OR_BOTH	0x7
659336842Srmacklem#define	NFSCDFS4_FORE		0x1
660336842Srmacklem#define	NFSCDFS4_BACK		0x2
661336842Srmacklem#define	NFSCDFS4_BOTH		0x3
662336842Srmacklem
663191783Srmacklem/* Conversion macros */
664191783Srmacklem#define	vtonfsv2_mode(t,m) 						\
665191783Srmacklem		txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : 	\
666191783Srmacklem				MAKEIMODE((t), (m)))
667191783Srmacklem#define	vtonfsv34_mode(m)	txdr_unsigned((m) & 07777)
668191783Srmacklem#define	nfstov_mode(a)		(fxdr_unsigned(u_int16_t, (a))&07777)
669191783Srmacklem#define	vtonfsv2_type(a)  (((u_int32_t)(a)) >= 9 ? txdr_unsigned(NFNON) : \
670191783Srmacklem		txdr_unsigned(newnfsv2_type[((u_int32_t)(a))]))
671191783Srmacklem#define	vtonfsv34_type(a)  (((u_int32_t)(a)) >= 9 ? txdr_unsigned(NFNON) : \
672191783Srmacklem		txdr_unsigned(nfsv34_type[((u_int32_t)(a))]))
673191783Srmacklem#define	nfsv2tov_type(a)	newnv2tov_type[fxdr_unsigned(u_int32_t,(a))&0x7]
674191783Srmacklem#define	nfsv34tov_type(a)	nv34tov_type[fxdr_unsigned(u_int32_t,(a))&0x7]
675191783Srmacklem#define	vtonfs_dtype(a)	(((u_int32_t)(a)) >= 9 ? IFTODT(VTTOIF(VNON)) : \
676191783Srmacklem			 IFTODT(VTTOIF(a)))
677191783Srmacklem
678191783Srmacklem/* File types */
679191783Srmacklemtypedef enum { NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5,
680191783Srmacklem	NFSOCK=6, NFFIFO=7, NFATTRDIR=8, NFNAMEDATTR=9 } nfstype;
681191783Srmacklem
682191783Srmacklem/* Structs for common parts of the rpc's */
683191783Srmacklem
684191783Srmacklemstruct nfsv2_time {
685191783Srmacklem	u_int32_t nfsv2_sec;
686191783Srmacklem	u_int32_t nfsv2_usec;
687191783Srmacklem};
688191783Srmacklemtypedef struct nfsv2_time	nfstime2;
689191783Srmacklem
690191783Srmacklemstruct nfsv3_time {
691191783Srmacklem	u_int32_t nfsv3_sec;
692191783Srmacklem	u_int32_t nfsv3_nsec;
693191783Srmacklem};
694191783Srmacklemtypedef struct nfsv3_time	nfstime3;
695191783Srmacklem
696191783Srmacklemstruct nfsv4_time {
697191783Srmacklem	u_int32_t nfsv4_highsec;
698191783Srmacklem	u_int32_t nfsv4_sec;
699191783Srmacklem	u_int32_t nfsv4_nsec;
700191783Srmacklem};
701191783Srmacklemtypedef struct nfsv4_time	nfstime4;
702191783Srmacklem
703191783Srmacklem/*
704191783Srmacklem * Quads are defined as arrays of 2 longs to ensure dense packing for the
705191783Srmacklem * protocol and to facilitate xdr conversion.
706191783Srmacklem */
707191783Srmacklemstruct nfs_uquad {
708191783Srmacklem	u_int32_t nfsuquad[2];
709191783Srmacklem};
710191783Srmacklemtypedef	struct nfs_uquad	nfsuint64;
711191783Srmacklem
712191783Srmacklem/*
713191783Srmacklem * Used to convert between two u_longs and a u_quad_t.
714191783Srmacklem */
715191783Srmacklemunion nfs_quadconvert {
716191783Srmacklem	u_int32_t lval[2];
717191783Srmacklem	u_quad_t  qval;
718191783Srmacklem};
719191783Srmacklemtypedef union nfs_quadconvert	nfsquad_t;
720191783Srmacklem
721191783Srmacklem/*
722191783Srmacklem * NFS Version 3 special file number.
723191783Srmacklem */
724191783Srmacklemstruct nfsv3_spec {
725191783Srmacklem	u_int32_t specdata1;
726191783Srmacklem	u_int32_t specdata2;
727191783Srmacklem};
728191783Srmacklemtypedef	struct nfsv3_spec	nfsv3spec;
729191783Srmacklem
730191783Srmacklem/*
731191783Srmacklem * File attributes and setable attributes. These structures cover both
732191783Srmacklem * NFS version 2 and the version 3 protocol. Note that the union is only
733191783Srmacklem * used so that one pointer can refer to both variants. These structures
734191783Srmacklem * go out on the wire and must be densely packed, so no quad data types
735191783Srmacklem * are used. (all fields are longs or u_longs or structures of same)
736191783Srmacklem * NB: You can't do sizeof(struct nfs_fattr), you must use the
737191783Srmacklem *     NFSX_FATTR(v3) macro.
738191783Srmacklem */
739191783Srmacklemstruct nfs_fattr {
740191783Srmacklem	u_int32_t fa_type;
741191783Srmacklem	u_int32_t fa_mode;
742191783Srmacklem	u_int32_t fa_nlink;
743191783Srmacklem	u_int32_t fa_uid;
744191783Srmacklem	u_int32_t fa_gid;
745191783Srmacklem	union {
746191783Srmacklem		struct {
747191783Srmacklem			u_int32_t nfsv2fa_size;
748191783Srmacklem			u_int32_t nfsv2fa_blocksize;
749191783Srmacklem			u_int32_t nfsv2fa_rdev;
750191783Srmacklem			u_int32_t nfsv2fa_blocks;
751191783Srmacklem			u_int32_t nfsv2fa_fsid;
752191783Srmacklem			u_int32_t nfsv2fa_fileid;
753191783Srmacklem			nfstime2  nfsv2fa_atime;
754191783Srmacklem			nfstime2  nfsv2fa_mtime;
755191783Srmacklem			nfstime2  nfsv2fa_ctime;
756191783Srmacklem		} fa_nfsv2;
757191783Srmacklem		struct {
758191783Srmacklem			nfsuint64 nfsv3fa_size;
759191783Srmacklem			nfsuint64 nfsv3fa_used;
760191783Srmacklem			nfsv3spec nfsv3fa_rdev;
761191783Srmacklem			nfsuint64 nfsv3fa_fsid;
762191783Srmacklem			nfsuint64 nfsv3fa_fileid;
763191783Srmacklem			nfstime3  nfsv3fa_atime;
764191783Srmacklem			nfstime3  nfsv3fa_mtime;
765191783Srmacklem			nfstime3  nfsv3fa_ctime;
766191783Srmacklem		} fa_nfsv3;
767191783Srmacklem	} fa_un;
768191783Srmacklem};
769191783Srmacklem
770191783Srmacklem/* and some ugly defines for accessing union components */
771191783Srmacklem#define	fa2_size		fa_un.fa_nfsv2.nfsv2fa_size
772191783Srmacklem#define	fa2_blocksize		fa_un.fa_nfsv2.nfsv2fa_blocksize
773191783Srmacklem#define	fa2_rdev		fa_un.fa_nfsv2.nfsv2fa_rdev
774191783Srmacklem#define	fa2_blocks		fa_un.fa_nfsv2.nfsv2fa_blocks
775191783Srmacklem#define	fa2_fsid		fa_un.fa_nfsv2.nfsv2fa_fsid
776191783Srmacklem#define	fa2_fileid		fa_un.fa_nfsv2.nfsv2fa_fileid
777191783Srmacklem#define	fa2_atime		fa_un.fa_nfsv2.nfsv2fa_atime
778191783Srmacklem#define	fa2_mtime		fa_un.fa_nfsv2.nfsv2fa_mtime
779191783Srmacklem#define	fa2_ctime		fa_un.fa_nfsv2.nfsv2fa_ctime
780191783Srmacklem#define	fa3_size		fa_un.fa_nfsv3.nfsv3fa_size
781191783Srmacklem#define	fa3_used		fa_un.fa_nfsv3.nfsv3fa_used
782191783Srmacklem#define	fa3_rdev		fa_un.fa_nfsv3.nfsv3fa_rdev
783191783Srmacklem#define	fa3_fsid		fa_un.fa_nfsv3.nfsv3fa_fsid
784191783Srmacklem#define	fa3_fileid		fa_un.fa_nfsv3.nfsv3fa_fileid
785191783Srmacklem#define	fa3_atime		fa_un.fa_nfsv3.nfsv3fa_atime
786191783Srmacklem#define	fa3_mtime		fa_un.fa_nfsv3.nfsv3fa_mtime
787191783Srmacklem#define	fa3_ctime		fa_un.fa_nfsv3.nfsv3fa_ctime
788191783Srmacklem
789191783Srmacklemstruct nfsv2_sattr {
790191783Srmacklem	u_int32_t sa_mode;
791191783Srmacklem	u_int32_t sa_uid;
792191783Srmacklem	u_int32_t sa_gid;
793191783Srmacklem	u_int32_t sa_size;
794191783Srmacklem	nfstime2  sa_atime;
795191783Srmacklem	nfstime2  sa_mtime;
796191783Srmacklem};
797191783Srmacklem
798191783Srmacklem/*
799191783Srmacklem * NFS Version 3 sattr structure for the new node creation case.
800191783Srmacklem */
801191783Srmacklemstruct nfsv3_sattr {
802191783Srmacklem	u_int32_t sa_modetrue;
803191783Srmacklem	u_int32_t sa_mode;
804191783Srmacklem	u_int32_t sa_uidfalse;
805191783Srmacklem	u_int32_t sa_gidfalse;
806191783Srmacklem	u_int32_t sa_sizefalse;
807191783Srmacklem	u_int32_t sa_atimetype;
808191783Srmacklem	nfstime3  sa_atime;
809191783Srmacklem	u_int32_t sa_mtimetype;
810191783Srmacklem	nfstime3  sa_mtime;
811191783Srmacklem};
812191783Srmacklem
813191783Srmacklem/*
814191783Srmacklem * The attribute bits used for V4.
815191783Srmacklem * NFSATTRBIT_xxx defines the attribute# (and its bit position)
816191783Srmacklem * NFSATTRBM_xxx is a 32bit mask with the correct bit set within the
817191783Srmacklem *	appropriate 32bit word.
818191783Srmacklem * NFSATTRBIT_MAX is one greater than the largest NFSATTRBIT_xxx
819191783Srmacklem */
820191783Srmacklem#define	NFSATTRBIT_SUPPORTEDATTRS	0
821191783Srmacklem#define	NFSATTRBIT_TYPE			1
822191783Srmacklem#define	NFSATTRBIT_FHEXPIRETYPE		2
823191783Srmacklem#define	NFSATTRBIT_CHANGE		3
824191783Srmacklem#define	NFSATTRBIT_SIZE			4
825191783Srmacklem#define	NFSATTRBIT_LINKSUPPORT		5
826191783Srmacklem#define	NFSATTRBIT_SYMLINKSUPPORT	6
827191783Srmacklem#define	NFSATTRBIT_NAMEDATTR		7
828191783Srmacklem#define	NFSATTRBIT_FSID			8
829191783Srmacklem#define	NFSATTRBIT_UNIQUEHANDLES	9
830191783Srmacklem#define	NFSATTRBIT_LEASETIME		10
831191783Srmacklem#define	NFSATTRBIT_RDATTRERROR		11
832191783Srmacklem#define	NFSATTRBIT_ACL			12
833191783Srmacklem#define	NFSATTRBIT_ACLSUPPORT		13
834191783Srmacklem#define	NFSATTRBIT_ARCHIVE		14
835191783Srmacklem#define	NFSATTRBIT_CANSETTIME		15
836191783Srmacklem#define	NFSATTRBIT_CASEINSENSITIVE	16
837191783Srmacklem#define	NFSATTRBIT_CASEPRESERVING	17
838191783Srmacklem#define	NFSATTRBIT_CHOWNRESTRICTED	18
839191783Srmacklem#define	NFSATTRBIT_FILEHANDLE		19
840191783Srmacklem#define	NFSATTRBIT_FILEID		20
841191783Srmacklem#define	NFSATTRBIT_FILESAVAIL		21
842191783Srmacklem#define	NFSATTRBIT_FILESFREE		22
843191783Srmacklem#define	NFSATTRBIT_FILESTOTAL		23
844191783Srmacklem#define	NFSATTRBIT_FSLOCATIONS		24
845191783Srmacklem#define	NFSATTRBIT_HIDDEN		25
846191783Srmacklem#define	NFSATTRBIT_HOMOGENEOUS		26
847191783Srmacklem#define	NFSATTRBIT_MAXFILESIZE		27
848191783Srmacklem#define	NFSATTRBIT_MAXLINK		28
849191783Srmacklem#define	NFSATTRBIT_MAXNAME		29
850191783Srmacklem#define	NFSATTRBIT_MAXREAD		30
851191783Srmacklem#define	NFSATTRBIT_MAXWRITE		31
852191783Srmacklem#define	NFSATTRBIT_MIMETYPE		32
853191783Srmacklem#define	NFSATTRBIT_MODE			33
854191783Srmacklem#define	NFSATTRBIT_NOTRUNC		34
855191783Srmacklem#define	NFSATTRBIT_NUMLINKS		35
856191783Srmacklem#define	NFSATTRBIT_OWNER		36
857191783Srmacklem#define	NFSATTRBIT_OWNERGROUP		37
858191783Srmacklem#define	NFSATTRBIT_QUOTAHARD		38
859191783Srmacklem#define	NFSATTRBIT_QUOTASOFT		39
860191783Srmacklem#define	NFSATTRBIT_QUOTAUSED		40
861191783Srmacklem#define	NFSATTRBIT_RAWDEV		41
862191783Srmacklem#define	NFSATTRBIT_SPACEAVAIL		42
863191783Srmacklem#define	NFSATTRBIT_SPACEFREE		43
864191783Srmacklem#define	NFSATTRBIT_SPACETOTAL		44
865191783Srmacklem#define	NFSATTRBIT_SPACEUSED		45
866191783Srmacklem#define	NFSATTRBIT_SYSTEM		46
867191783Srmacklem#define	NFSATTRBIT_TIMEACCESS		47
868191783Srmacklem#define	NFSATTRBIT_TIMEACCESSSET	48
869191783Srmacklem#define	NFSATTRBIT_TIMEBACKUP		49
870191783Srmacklem#define	NFSATTRBIT_TIMECREATE		50
871191783Srmacklem#define	NFSATTRBIT_TIMEDELTA		51
872191783Srmacklem#define	NFSATTRBIT_TIMEMETADATA		52
873191783Srmacklem#define	NFSATTRBIT_TIMEMODIFY		53
874191783Srmacklem#define	NFSATTRBIT_TIMEMODIFYSET	54
875191783Srmacklem#define	NFSATTRBIT_MOUNTEDONFILEID	55
876268115Srmacklem#define	NFSATTRBIT_DIRNOTIFDELAY	56
877268115Srmacklem#define	NFSATTRBIT_DIRENTNOTIFDELAY	57
878268115Srmacklem#define	NFSATTRBIT_DACL			58
879268115Srmacklem#define	NFSATTRBIT_SACL			59
880268115Srmacklem#define	NFSATTRBIT_CHANGEPOLICY		60
881268115Srmacklem#define	NFSATTRBIT_FSSTATUS		61
882268115Srmacklem#define	NFSATTRBIT_FSLAYOUTTYPE		62
883268115Srmacklem#define	NFSATTRBIT_LAYOUTHINT		63
884268115Srmacklem#define	NFSATTRBIT_LAYOUTTYPE		64
885268115Srmacklem#define	NFSATTRBIT_LAYOUTBLKSIZE	65
886268115Srmacklem#define	NFSATTRBIT_LAYOUTALIGNMENT	66
887268115Srmacklem#define	NFSATTRBIT_FSLOCATIONSINFO	67
888268115Srmacklem#define	NFSATTRBIT_MDSTHRESHOLD		68
889268115Srmacklem#define	NFSATTRBIT_RETENTIONGET		69
890268115Srmacklem#define	NFSATTRBIT_RETENTIONSET		70
891268115Srmacklem#define	NFSATTRBIT_RETENTEVTGET		71
892268115Srmacklem#define	NFSATTRBIT_RETENTEVTSET		72
893268115Srmacklem#define	NFSATTRBIT_RETENTIONHOLD	73
894268115Srmacklem#define	NFSATTRBIT_MODESETMASKED	74
895268115Srmacklem#define	NFSATTRBIT_SUPPATTREXCLCREAT	75
896268115Srmacklem#define	NFSATTRBIT_FSCHARSETCAP		76
897191783Srmacklem
898191783Srmacklem#define	NFSATTRBM_SUPPORTEDATTRS	0x00000001
899191783Srmacklem#define	NFSATTRBM_TYPE			0x00000002
900191783Srmacklem#define	NFSATTRBM_FHEXPIRETYPE		0x00000004
901191783Srmacklem#define	NFSATTRBM_CHANGE		0x00000008
902191783Srmacklem#define	NFSATTRBM_SIZE			0x00000010
903191783Srmacklem#define	NFSATTRBM_LINKSUPPORT		0x00000020
904191783Srmacklem#define	NFSATTRBM_SYMLINKSUPPORT	0x00000040
905191783Srmacklem#define	NFSATTRBM_NAMEDATTR		0x00000080
906191783Srmacklem#define	NFSATTRBM_FSID			0x00000100
907191783Srmacklem#define	NFSATTRBM_UNIQUEHANDLES		0x00000200
908191783Srmacklem#define	NFSATTRBM_LEASETIME		0x00000400
909191783Srmacklem#define	NFSATTRBM_RDATTRERROR		0x00000800
910191783Srmacklem#define	NFSATTRBM_ACL			0x00001000
911191783Srmacklem#define	NFSATTRBM_ACLSUPPORT		0x00002000
912191783Srmacklem#define	NFSATTRBM_ARCHIVE		0x00004000
913191783Srmacklem#define	NFSATTRBM_CANSETTIME		0x00008000
914191783Srmacklem#define	NFSATTRBM_CASEINSENSITIVE	0x00010000
915191783Srmacklem#define	NFSATTRBM_CASEPRESERVING	0x00020000
916191783Srmacklem#define	NFSATTRBM_CHOWNRESTRICTED	0x00040000
917191783Srmacklem#define	NFSATTRBM_FILEHANDLE		0x00080000
918191783Srmacklem#define	NFSATTRBM_FILEID		0x00100000
919191783Srmacklem#define	NFSATTRBM_FILESAVAIL		0x00200000
920191783Srmacklem#define	NFSATTRBM_FILESFREE		0x00400000
921191783Srmacklem#define	NFSATTRBM_FILESTOTAL		0x00800000
922191783Srmacklem#define	NFSATTRBM_FSLOCATIONS		0x01000000
923191783Srmacklem#define	NFSATTRBM_HIDDEN		0x02000000
924191783Srmacklem#define	NFSATTRBM_HOMOGENEOUS		0x04000000
925191783Srmacklem#define	NFSATTRBM_MAXFILESIZE		0x08000000
926191783Srmacklem#define	NFSATTRBM_MAXLINK		0x10000000
927191783Srmacklem#define	NFSATTRBM_MAXNAME		0x20000000
928191783Srmacklem#define	NFSATTRBM_MAXREAD		0x40000000
929191783Srmacklem#define	NFSATTRBM_MAXWRITE		0x80000000
930191783Srmacklem#define	NFSATTRBM_MIMETYPE		0x00000001
931191783Srmacklem#define	NFSATTRBM_MODE			0x00000002
932191783Srmacklem#define	NFSATTRBM_NOTRUNC		0x00000004
933191783Srmacklem#define	NFSATTRBM_NUMLINKS		0x00000008
934191783Srmacklem#define	NFSATTRBM_OWNER			0x00000010
935191783Srmacklem#define	NFSATTRBM_OWNERGROUP		0x00000020
936191783Srmacklem#define	NFSATTRBM_QUOTAHARD		0x00000040
937191783Srmacklem#define	NFSATTRBM_QUOTASOFT		0x00000080
938191783Srmacklem#define	NFSATTRBM_QUOTAUSED		0x00000100
939191783Srmacklem#define	NFSATTRBM_RAWDEV		0x00000200
940191783Srmacklem#define	NFSATTRBM_SPACEAVAIL		0x00000400
941191783Srmacklem#define	NFSATTRBM_SPACEFREE		0x00000800
942191783Srmacklem#define	NFSATTRBM_SPACETOTAL		0x00001000
943191783Srmacklem#define	NFSATTRBM_SPACEUSED		0x00002000
944191783Srmacklem#define	NFSATTRBM_SYSTEM		0x00004000
945191783Srmacklem#define	NFSATTRBM_TIMEACCESS		0x00008000
946191783Srmacklem#define	NFSATTRBM_TIMEACCESSSET		0x00010000
947191783Srmacklem#define	NFSATTRBM_TIMEBACKUP		0x00020000
948191783Srmacklem#define	NFSATTRBM_TIMECREATE		0x00040000
949191783Srmacklem#define	NFSATTRBM_TIMEDELTA		0x00080000
950191783Srmacklem#define	NFSATTRBM_TIMEMETADATA		0x00100000
951191783Srmacklem#define	NFSATTRBM_TIMEMODIFY		0x00200000
952191783Srmacklem#define	NFSATTRBM_TIMEMODIFYSET		0x00400000
953191783Srmacklem#define	NFSATTRBM_MOUNTEDONFILEID	0x00800000
954268115Srmacklem#define	NFSATTRBM_DIRNOTIFDELAY		0x01000000
955268115Srmacklem#define	NFSATTRBM_DIRENTNOTIFDELAY	0x02000000
956268115Srmacklem#define	NFSATTRBM_DACL			0x04000000
957268115Srmacklem#define	NFSATTRBM_SACL			0x08000000
958268115Srmacklem#define	NFSATTRBM_CHANGEPOLICY		0x10000000
959268115Srmacklem#define	NFSATTRBM_FSSTATUS		0x20000000
960268115Srmacklem#define	NFSATTRBM_FSLAYOUTTYPE		0x40000000
961268115Srmacklem#define	NFSATTRBM_LAYOUTHINT		0x80000000
962268115Srmacklem#define	NFSATTRBM_LAYOUTTYPE		0x00000001
963268115Srmacklem#define	NFSATTRBM_LAYOUTBLKSIZE		0x00000002
964268115Srmacklem#define	NFSATTRBM_LAYOUTALIGNMENT	0x00000004
965268115Srmacklem#define	NFSATTRBM_FSLOCATIONSINFO	0x00000008
966268115Srmacklem#define	NFSATTRBM_MDSTHRESHOLD		0x00000010
967268115Srmacklem#define	NFSATTRBM_RETENTIONGET		0x00000020
968268115Srmacklem#define	NFSATTRBM_RETENTIONSET		0x00000040
969268115Srmacklem#define	NFSATTRBM_RETENTEVTGET		0x00000080
970268115Srmacklem#define	NFSATTRBM_RETENTEVTSET		0x00000100
971268115Srmacklem#define	NFSATTRBM_RETENTIONHOLD		0x00000200
972268115Srmacklem#define	NFSATTRBM_MODESETMASKED		0x00000400
973268115Srmacklem#define	NFSATTRBM_SUPPATTREXCLCREAT	0x00000800
974268115Srmacklem#define	NFSATTRBM_FSCHARSETCAP		0x00001000
975191783Srmacklem
976268115Srmacklem#define	NFSATTRBIT_MAX			77
977191783Srmacklem
978191783Srmacklem/*
979191783Srmacklem * Sets of attributes that are supported, by words in the bitmap.
980191783Srmacklem */
981191783Srmacklem/*
982191783Srmacklem * NFSATTRBIT_SUPPORTED - SUPP0 - bits 0<->31
983191783Srmacklem *			  SUPP1 - bits 32<->63
984268115Srmacklem *			  SUPP2 - bits 64<->95
985191783Srmacklem */
986191783Srmacklem#define	NFSATTRBIT_SUPP0						\
987191783Srmacklem 	(NFSATTRBM_SUPPORTEDATTRS |					\
988191783Srmacklem 	NFSATTRBM_TYPE |						\
989191783Srmacklem 	NFSATTRBM_FHEXPIRETYPE |					\
990191783Srmacklem 	NFSATTRBM_CHANGE |						\
991191783Srmacklem 	NFSATTRBM_SIZE |						\
992191783Srmacklem 	NFSATTRBM_LINKSUPPORT |						\
993191783Srmacklem 	NFSATTRBM_SYMLINKSUPPORT |					\
994191783Srmacklem 	NFSATTRBM_NAMEDATTR |						\
995191783Srmacklem 	NFSATTRBM_FSID |						\
996191783Srmacklem 	NFSATTRBM_UNIQUEHANDLES |					\
997191783Srmacklem 	NFSATTRBM_LEASETIME |						\
998191783Srmacklem 	NFSATTRBM_RDATTRERROR |						\
999191783Srmacklem 	NFSATTRBM_ACL |							\
1000191783Srmacklem 	NFSATTRBM_ACLSUPPORT |						\
1001191783Srmacklem 	NFSATTRBM_CANSETTIME |						\
1002191783Srmacklem 	NFSATTRBM_CASEINSENSITIVE |					\
1003191783Srmacklem 	NFSATTRBM_CASEPRESERVING |					\
1004191783Srmacklem 	NFSATTRBM_CHOWNRESTRICTED |					\
1005191783Srmacklem 	NFSATTRBM_FILEHANDLE |						\
1006191783Srmacklem 	NFSATTRBM_FILEID |						\
1007191783Srmacklem 	NFSATTRBM_FILESAVAIL |						\
1008191783Srmacklem 	NFSATTRBM_FILESFREE |						\
1009191783Srmacklem 	NFSATTRBM_FILESTOTAL |						\
1010191783Srmacklem	NFSATTRBM_FSLOCATIONS |						\
1011191783Srmacklem 	NFSATTRBM_HOMOGENEOUS |						\
1012191783Srmacklem 	NFSATTRBM_MAXFILESIZE |						\
1013191783Srmacklem 	NFSATTRBM_MAXLINK |						\
1014191783Srmacklem 	NFSATTRBM_MAXNAME |						\
1015191783Srmacklem 	NFSATTRBM_MAXREAD |						\
1016191783Srmacklem 	NFSATTRBM_MAXWRITE)
1017191783Srmacklem
1018191783Srmacklem/*
1019191783Srmacklem * NFSATTRBIT_S1 - subset of SUPP1 - OR of the following bits:
1020191783Srmacklem */
1021191783Srmacklem#define	NFSATTRBIT_S1							\
1022191783Srmacklem 	(NFSATTRBM_MODE |						\
1023191783Srmacklem 	NFSATTRBM_NOTRUNC |						\
1024191783Srmacklem 	NFSATTRBM_NUMLINKS |						\
1025191783Srmacklem 	NFSATTRBM_OWNER |						\
1026191783Srmacklem 	NFSATTRBM_OWNERGROUP |						\
1027191783Srmacklem 	NFSATTRBM_RAWDEV |						\
1028191783Srmacklem 	NFSATTRBM_SPACEAVAIL |						\
1029191783Srmacklem 	NFSATTRBM_SPACEFREE |						\
1030191783Srmacklem 	NFSATTRBM_SPACETOTAL |						\
1031191783Srmacklem 	NFSATTRBM_SPACEUSED |						\
1032191783Srmacklem 	NFSATTRBM_TIMEACCESS |						\
1033191783Srmacklem 	NFSATTRBM_TIMEDELTA |						\
1034191783Srmacklem 	NFSATTRBM_TIMEMETADATA |					\
1035191783Srmacklem 	NFSATTRBM_TIMEMODIFY |						\
1036272467Saraujo 	NFSATTRBM_MOUNTEDONFILEID |					\
1037272467Saraujo	NFSATTRBM_QUOTAHARD |                        			\
1038272467Saraujo    	NFSATTRBM_QUOTASOFT |                        			\
1039272467Saraujo    	NFSATTRBM_QUOTAUSED)
1040191783Srmacklem
1041272467Saraujo
1042191783Srmacklem#ifdef QUOTA
1043191783Srmacklem/*
1044191783Srmacklem * If QUOTA OR in NFSATTRBIT_QUOTAHARD, NFSATTRBIT_QUOTASOFT and
1045191783Srmacklem * NFSATTRBIT_QUOTAUSED.
1046191783Srmacklem */
1047191783Srmacklem#define	NFSATTRBIT_SUPP1	(NFSATTRBIT_S1 |			\
1048191783Srmacklem				NFSATTRBM_QUOTAHARD |			\
1049191783Srmacklem				NFSATTRBM_QUOTASOFT |			\
1050191783Srmacklem				NFSATTRBM_QUOTAUSED)
1051191783Srmacklem#else
1052191783Srmacklem#define	NFSATTRBIT_SUPP1	NFSATTRBIT_S1
1053191783Srmacklem#endif
1054191783Srmacklem
1055268115Srmacklem#define	NFSATTRBIT_SUPP2	NFSATTRBM_SUPPATTREXCLCREAT
1056268115Srmacklem
1057191783Srmacklem/*
1058347039Srmacklem * These are the set only attributes.
1059191783Srmacklem */
1060347039Srmacklem#define	NFSATTRBIT_SUPPSETONLY1	 (NFSATTRBM_TIMEACCESSSET |		\
1061191783Srmacklem				 NFSATTRBM_TIMEMODIFYSET)
1062347045Srmacklem#define	NFSATTRBIT_SUPPSETONLY2	(NFSATTRBM_MODESETMASKED)
1063191783Srmacklem
1064191783Srmacklem/*
1065191783Srmacklem * NFSATTRBIT_SETABLE - SETABLE0 - bits 0<->31
1066191783Srmacklem *			SETABLE1 - bits 32<->63
1067268115Srmacklem *			SETABLE2 - bits 64<->95
1068191783Srmacklem */
1069191783Srmacklem#define	NFSATTRBIT_SETABLE0						\
1070191783Srmacklem	(NFSATTRBM_SIZE |						\
1071191783Srmacklem	NFSATTRBM_ACL)
1072191783Srmacklem#define	NFSATTRBIT_SETABLE1						\
1073191783Srmacklem 	(NFSATTRBM_MODE |						\
1074191783Srmacklem 	NFSATTRBM_OWNER |						\
1075191783Srmacklem 	NFSATTRBM_OWNERGROUP |						\
1076191783Srmacklem 	NFSATTRBM_TIMEACCESSSET |					\
1077191783Srmacklem 	NFSATTRBM_TIMEMODIFYSET)
1078347045Srmacklem#define	NFSATTRBIT_SETABLE2						\
1079347045Srmacklem	(NFSATTRBM_MODESETMASKED)
1080191783Srmacklem
1081191783Srmacklem/*
1082347039Srmacklem * NFSATTRBIT_NFSV41 - Attributes only supported by NFSv4.1.
1083347039Srmacklem */
1084347039Srmacklem#define	NFSATTRBIT_NFSV41_1						\
1085347039Srmacklem	(NFSATTRBM_FSLAYOUTTYPE)
1086347039Srmacklem#define	NFSATTRBIT_NFSV41_2						\
1087347039Srmacklem	(NFSATTRBM_LAYOUTTYPE |						\
1088347039Srmacklem	NFSATTRBM_LAYOUTBLKSIZE |					\
1089347039Srmacklem	NFSATTRBM_LAYOUTALIGNMENT |					\
1090347039Srmacklem	NFSATTRBM_MODESETMASKED |					\
1091347039Srmacklem	NFSATTRBM_SUPPATTREXCLCREAT)
1092347039Srmacklem
1093347039Srmacklem/*
1094191783Srmacklem * Set of attributes that the getattr vnode op needs.
1095191783Srmacklem * OR of the following bits.
1096191783Srmacklem * NFSATTRBIT_GETATTR0 - bits 0<->31
1097191783Srmacklem */
1098191783Srmacklem#define	NFSATTRBIT_GETATTR0						\
1099191783Srmacklem 	(NFSATTRBM_SUPPORTEDATTRS |					\
1100191783Srmacklem 	NFSATTRBM_TYPE |						\
1101191783Srmacklem 	NFSATTRBM_CHANGE |						\
1102191783Srmacklem 	NFSATTRBM_SIZE |						\
1103191783Srmacklem 	NFSATTRBM_FSID |						\
1104191783Srmacklem 	NFSATTRBM_FILEID |						\
1105191783Srmacklem 	NFSATTRBM_MAXREAD)
1106191783Srmacklem
1107191783Srmacklem/*
1108191783Srmacklem * NFSATTRBIT_GETATTR1 - bits 32<->63
1109191783Srmacklem */
1110191783Srmacklem#define	NFSATTRBIT_GETATTR1						\
1111191783Srmacklem 	(NFSATTRBM_MODE |						\
1112191783Srmacklem 	NFSATTRBM_NUMLINKS |						\
1113191783Srmacklem 	NFSATTRBM_OWNER |						\
1114191783Srmacklem 	NFSATTRBM_OWNERGROUP |						\
1115191783Srmacklem 	NFSATTRBM_RAWDEV |						\
1116191783Srmacklem 	NFSATTRBM_SPACEUSED |						\
1117191783Srmacklem 	NFSATTRBM_TIMEACCESS |						\
1118191783Srmacklem 	NFSATTRBM_TIMEMETADATA |					\
1119191783Srmacklem 	NFSATTRBM_TIMEMODIFY)
1120191783Srmacklem
1121191783Srmacklem/*
1122268115Srmacklem * NFSATTRBIT_GETATTR2 - bits 64<->95
1123268115Srmacklem */
1124268115Srmacklem#define	NFSATTRBIT_GETATTR2		0
1125268115Srmacklem
1126268115Srmacklem/*
1127191783Srmacklem * Subset of the above that the Write RPC gets.
1128191783Srmacklem * OR of the following bits.
1129191783Srmacklem * NFSATTRBIT_WRITEGETATTR0 - bits 0<->31
1130191783Srmacklem */
1131191783Srmacklem#define	NFSATTRBIT_WRITEGETATTR0					\
1132223657Srmacklem 	(NFSATTRBM_SUPPORTEDATTRS |					\
1133223657Srmacklem 	NFSATTRBM_TYPE |						\
1134223657Srmacklem 	NFSATTRBM_CHANGE |						\
1135191783Srmacklem 	NFSATTRBM_SIZE |						\
1136223657Srmacklem 	NFSATTRBM_FSID |						\
1137223657Srmacklem 	NFSATTRBM_FILEID |						\
1138223657Srmacklem 	NFSATTRBM_MAXREAD)
1139191783Srmacklem
1140191783Srmacklem/*
1141191783Srmacklem * NFSATTRBIT_WRITEGETATTR1 - bits 32<->63
1142191783Srmacklem */
1143191783Srmacklem#define	NFSATTRBIT_WRITEGETATTR1					\
1144223657Srmacklem 	(NFSATTRBM_MODE |						\
1145223657Srmacklem 	NFSATTRBM_NUMLINKS |						\
1146223657Srmacklem 	NFSATTRBM_RAWDEV |						\
1147223657Srmacklem 	NFSATTRBM_SPACEUSED |						\
1148223657Srmacklem 	NFSATTRBM_TIMEACCESS |						\
1149223657Srmacklem 	NFSATTRBM_TIMEMETADATA |					\
1150191783Srmacklem 	NFSATTRBM_TIMEMODIFY)
1151191783Srmacklem
1152191783Srmacklem/*
1153268115Srmacklem * NFSATTRBIT_WRITEGETATTR2 - bits 64<->95
1154268115Srmacklem */
1155268115Srmacklem#define	NFSATTRBIT_WRITEGETATTR2	0
1156268115Srmacklem
1157268115Srmacklem/*
1158191783Srmacklem * Set of attributes that the wccattr operation op needs.
1159191783Srmacklem * OR of the following bits.
1160191783Srmacklem * NFSATTRBIT_WCCATTR0 - bits 0<->31
1161191783Srmacklem */
1162191783Srmacklem#define	NFSATTRBIT_WCCATTR0	0
1163191783Srmacklem
1164191783Srmacklem/*
1165191783Srmacklem * NFSATTRBIT_WCCATTR1 - bits 32<->63
1166191783Srmacklem */
1167191783Srmacklem#define	NFSATTRBIT_WCCATTR1						\
1168191783Srmacklem 	(NFSATTRBM_TIMEMODIFY)
1169191783Srmacklem
1170191783Srmacklem/*
1171268115Srmacklem * NFSATTRBIT_WCCATTR2 - bits 64<->95
1172268115Srmacklem */
1173268115Srmacklem#define	NFSATTRBIT_WCCATTR2		0
1174268115Srmacklem
1175268115Srmacklem/*
1176191783Srmacklem * NFSATTRBIT_CBGETATTR0 - bits 0<->31
1177191783Srmacklem */
1178191783Srmacklem#define	NFSATTRBIT_CBGETATTR0	(NFSATTRBM_CHANGE | NFSATTRBM_SIZE)
1179191783Srmacklem
1180191783Srmacklem/*
1181191783Srmacklem * NFSATTRBIT_CBGETATTR1 - bits 32<->63
1182191783Srmacklem */
1183191783Srmacklem#define	NFSATTRBIT_CBGETATTR1		0x0
1184191783Srmacklem
1185191783Srmacklem/*
1186268115Srmacklem * NFSATTRBIT_CBGETATTR2 - bits 64<->95
1187268115Srmacklem */
1188268115Srmacklem#define	NFSATTRBIT_CBGETATTR2		0x0
1189268115Srmacklem
1190268115Srmacklem/*
1191191783Srmacklem * Sets of attributes that require a VFS_STATFS() call to get the
1192191783Srmacklem * values of.
1193191783Srmacklem * NFSATTRBIT_STATFS0 - bits 0<->31
1194191783Srmacklem */
1195191783Srmacklem#define	NFSATTRBIT_STATFS0						\
1196191783Srmacklem	(NFSATTRBM_LINKSUPPORT |					\
1197191783Srmacklem	NFSATTRBM_SYMLINKSUPPORT |					\
1198191783Srmacklem	NFSATTRBM_CANSETTIME |						\
1199191783Srmacklem 	NFSATTRBM_FILESAVAIL |						\
1200191783Srmacklem 	NFSATTRBM_FILESFREE |						\
1201191783Srmacklem 	NFSATTRBM_FILESTOTAL |						\
1202191783Srmacklem 	NFSATTRBM_HOMOGENEOUS |						\
1203191783Srmacklem 	NFSATTRBM_MAXFILESIZE |						\
1204191783Srmacklem	NFSATTRBM_MAXNAME |						\
1205191783Srmacklem	NFSATTRBM_MAXREAD |						\
1206191783Srmacklem	NFSATTRBM_MAXWRITE)
1207191783Srmacklem
1208191783Srmacklem/*
1209191783Srmacklem * NFSATTRBIT_STATFS1 - bits 32<->63
1210191783Srmacklem */
1211191783Srmacklem#define	NFSATTRBIT_STATFS1						\
1212191783Srmacklem 	(NFSATTRBM_QUOTAHARD |						\
1213191783Srmacklem 	NFSATTRBM_QUOTASOFT |						\
1214191783Srmacklem 	NFSATTRBM_QUOTAUSED |						\
1215191783Srmacklem 	NFSATTRBM_SPACEAVAIL |						\
1216191783Srmacklem 	NFSATTRBM_SPACEFREE |						\
1217191783Srmacklem 	NFSATTRBM_SPACETOTAL |						\
1218191783Srmacklem 	NFSATTRBM_SPACEUSED |						\
1219191783Srmacklem	NFSATTRBM_TIMEDELTA)
1220191783Srmacklem
1221191783Srmacklem/*
1222268115Srmacklem * NFSATTRBIT_STATFS2 - bits 64<->95
1223268115Srmacklem */
1224268115Srmacklem#define	NFSATTRBIT_STATFS2		0
1225268115Srmacklem
1226268115Srmacklem/*
1227191783Srmacklem * These are the bits that are needed by the nfs_statfs() call.
1228191783Srmacklem * (The regular getattr bits are or'd in so the vnode gets the correct
1229191783Srmacklem *  type, etc.)
1230191783Srmacklem * NFSGETATTRBIT_STATFS0 - bits 0<->31
1231191783Srmacklem */
1232191783Srmacklem#define	NFSGETATTRBIT_STATFS0	(NFSATTRBIT_GETATTR0 |			\
1233191783Srmacklem				NFSATTRBM_LINKSUPPORT |			\
1234191783Srmacklem				NFSATTRBM_SYMLINKSUPPORT |		\
1235191783Srmacklem				NFSATTRBM_CANSETTIME |			\
1236191783Srmacklem				NFSATTRBM_FILESFREE |			\
1237191783Srmacklem				NFSATTRBM_FILESTOTAL |			\
1238191783Srmacklem				NFSATTRBM_HOMOGENEOUS |			\
1239191783Srmacklem				NFSATTRBM_MAXFILESIZE |			\
1240191783Srmacklem				NFSATTRBM_MAXNAME |			\
1241191783Srmacklem				NFSATTRBM_MAXREAD |			\
1242191783Srmacklem				NFSATTRBM_MAXWRITE)
1243191783Srmacklem
1244191783Srmacklem/*
1245191783Srmacklem * NFSGETATTRBIT_STATFS1 - bits 32<->63
1246191783Srmacklem */
1247191783Srmacklem#define	NFSGETATTRBIT_STATFS1	(NFSATTRBIT_GETATTR1 |			\
1248191783Srmacklem				NFSATTRBM_SPACEAVAIL |			\
1249191783Srmacklem				NFSATTRBM_SPACEFREE |			\
1250191783Srmacklem				NFSATTRBM_SPACETOTAL |			\
1251191783Srmacklem				NFSATTRBM_TIMEDELTA)
1252191783Srmacklem
1253191783Srmacklem/*
1254268115Srmacklem * NFSGETATTRBIT_STATFS2 - bits 64<->95
1255268115Srmacklem */
1256268115Srmacklem#define	NFSGETATTRBIT_STATFS2		0
1257268115Srmacklem
1258268115Srmacklem/*
1259191783Srmacklem * Set of attributes for the equivalent of an nfsv3 pathconf rpc.
1260191783Srmacklem * NFSGETATTRBIT_PATHCONF0 - bits 0<->31
1261191783Srmacklem */
1262191783Srmacklem#define	NFSGETATTRBIT_PATHCONF0	(NFSATTRBIT_GETATTR0 |			\
1263191783Srmacklem			 	NFSATTRBM_CASEINSENSITIVE |		\
1264191783Srmacklem			 	NFSATTRBM_CASEPRESERVING |		\
1265191783Srmacklem			 	NFSATTRBM_CHOWNRESTRICTED |		\
1266191783Srmacklem			 	NFSATTRBM_MAXLINK |			\
1267191783Srmacklem			 	NFSATTRBM_MAXNAME)
1268191783Srmacklem
1269191783Srmacklem/*
1270191783Srmacklem * NFSGETATTRBIT_PATHCONF1 - bits 32<->63
1271191783Srmacklem */
1272191783Srmacklem#define	NFSGETATTRBIT_PATHCONF1	(NFSATTRBIT_GETATTR1 |			\
1273191783Srmacklem				NFSATTRBM_NOTRUNC)
1274191783Srmacklem
1275191783Srmacklem/*
1276268115Srmacklem * NFSGETATTRBIT_PATHCONF2 - bits 64<->95
1277268115Srmacklem */
1278268115Srmacklem#define	NFSGETATTRBIT_PATHCONF2		0
1279268115Srmacklem
1280268115Srmacklem/*
1281191783Srmacklem * Sets of attributes required by readdir and readdirplus.
1282191783Srmacklem * NFSATTRBIT_READDIRPLUS0	(NFSATTRBIT_GETATTR0 | NFSATTRBIT_FILEHANDLE |
1283191783Srmacklem *				 NFSATTRBIT_RDATTRERROR)
1284191783Srmacklem */
1285191783Srmacklem#define	NFSATTRBIT_READDIRPLUS0	(NFSATTRBIT_GETATTR0 | NFSATTRBM_FILEHANDLE | \
1286191783Srmacklem				NFSATTRBM_RDATTRERROR)
1287191783Srmacklem#define	NFSATTRBIT_READDIRPLUS1	NFSATTRBIT_GETATTR1
1288268115Srmacklem#define	NFSATTRBIT_READDIRPLUS2		0
1289191783Srmacklem
1290191783Srmacklem/*
1291191783Srmacklem * Set of attributes supported by Referral vnodes.
1292191783Srmacklem */
1293191783Srmacklem#define	NFSATTRBIT_REFERRAL0	(NFSATTRBM_TYPE | NFSATTRBM_FSID |	\
1294191783Srmacklem	NFSATTRBM_RDATTRERROR | NFSATTRBM_FSLOCATIONS)
1295191783Srmacklem#define	NFSATTRBIT_REFERRAL1	NFSATTRBM_MOUNTEDONFILEID
1296268115Srmacklem#define	NFSATTRBIT_REFERRAL2		0
1297191783Srmacklem
1298191783Srmacklem/*
1299191783Srmacklem * Structure for data handled by the statfs rpc. Since some fields are
1300191783Srmacklem * u_int64_t, this cannot be used for copying data on/off the wire, due
1301191783Srmacklem * to alignment concerns.
1302191783Srmacklem */
1303191783Srmacklemstruct nfsstatfs {
1304191783Srmacklem	union {
1305191783Srmacklem		struct {
1306191783Srmacklem			u_int32_t nfsv2sf_tsize;
1307191783Srmacklem			u_int32_t nfsv2sf_bsize;
1308191783Srmacklem			u_int32_t nfsv2sf_blocks;
1309191783Srmacklem			u_int32_t nfsv2sf_bfree;
1310191783Srmacklem			u_int32_t nfsv2sf_bavail;
1311191783Srmacklem		} sf_nfsv2;
1312191783Srmacklem		struct {
1313191783Srmacklem			u_int64_t nfsv3sf_tbytes;
1314191783Srmacklem			u_int64_t nfsv3sf_fbytes;
1315191783Srmacklem			u_int64_t nfsv3sf_abytes;
1316191783Srmacklem			u_int64_t nfsv3sf_tfiles;
1317191783Srmacklem			u_int64_t nfsv3sf_ffiles;
1318191783Srmacklem			u_int64_t nfsv3sf_afiles;
1319191783Srmacklem			u_int32_t nfsv3sf_invarsec;
1320191783Srmacklem		} sf_nfsv3;
1321191783Srmacklem	} sf_un;
1322191783Srmacklem};
1323191783Srmacklem
1324191783Srmacklem#define	sf_tsize	sf_un.sf_nfsv2.nfsv2sf_tsize
1325191783Srmacklem#define	sf_bsize	sf_un.sf_nfsv2.nfsv2sf_bsize
1326191783Srmacklem#define	sf_blocks	sf_un.sf_nfsv2.nfsv2sf_blocks
1327191783Srmacklem#define	sf_bfree	sf_un.sf_nfsv2.nfsv2sf_bfree
1328191783Srmacklem#define	sf_bavail	sf_un.sf_nfsv2.nfsv2sf_bavail
1329191783Srmacklem#define	sf_tbytes	sf_un.sf_nfsv3.nfsv3sf_tbytes
1330191783Srmacklem#define	sf_fbytes	sf_un.sf_nfsv3.nfsv3sf_fbytes
1331191783Srmacklem#define	sf_abytes	sf_un.sf_nfsv3.nfsv3sf_abytes
1332191783Srmacklem#define	sf_tfiles	sf_un.sf_nfsv3.nfsv3sf_tfiles
1333191783Srmacklem#define	sf_ffiles	sf_un.sf_nfsv3.nfsv3sf_ffiles
1334191783Srmacklem#define	sf_afiles	sf_un.sf_nfsv3.nfsv3sf_afiles
1335191783Srmacklem#define	sf_invarsec	sf_un.sf_nfsv3.nfsv3sf_invarsec
1336191783Srmacklem
1337191783Srmacklem/*
1338191783Srmacklem * Now defined using u_int64_t for the 64 bit field(s).
1339191783Srmacklem * (Cannot be used to move data on/off the wire, due to alignment concerns.)
1340191783Srmacklem */
1341191783Srmacklemstruct nfsfsinfo {
1342191783Srmacklem	u_int32_t fs_rtmax;
1343191783Srmacklem	u_int32_t fs_rtpref;
1344191783Srmacklem	u_int32_t fs_rtmult;
1345191783Srmacklem	u_int32_t fs_wtmax;
1346191783Srmacklem	u_int32_t fs_wtpref;
1347191783Srmacklem	u_int32_t fs_wtmult;
1348191783Srmacklem	u_int32_t fs_dtpref;
1349191783Srmacklem	u_int64_t fs_maxfilesize;
1350191783Srmacklem	struct timespec fs_timedelta;
1351191783Srmacklem	u_int32_t fs_properties;
1352191783Srmacklem};
1353191783Srmacklem
1354191783Srmacklem/*
1355191783Srmacklem * Bits for fs_properties
1356191783Srmacklem */
1357191783Srmacklem#define	NFSV3_FSFLINK		0x1
1358191783Srmacklem#define	NFSV3_FSFSYMLINK	0x2
1359191783Srmacklem#define	NFSV3_FSFHOMOGENEOUS	0x4
1360191783Srmacklem#define	NFSV3_FSFCANSETTIME	0x8
1361191783Srmacklem
1362191783Srmacklem/*
1363191783Srmacklem * Yikes, overload fs_rtmult as fs_maxname for V4.
1364191783Srmacklem */
1365191783Srmacklem#define	fs_maxname	fs_rtmult
1366191783Srmacklem
1367191783Srmacklemstruct nfsv3_pathconf {
1368191783Srmacklem	u_int32_t pc_linkmax;
1369191783Srmacklem	u_int32_t pc_namemax;
1370191783Srmacklem	u_int32_t pc_notrunc;
1371191783Srmacklem	u_int32_t pc_chownrestricted;
1372191783Srmacklem	u_int32_t pc_caseinsensitive;
1373191783Srmacklem	u_int32_t pc_casepreserving;
1374191783Srmacklem};
1375191783Srmacklem
1376191783Srmacklem/*
1377191783Srmacklem * NFS V4 data structures.
1378191783Srmacklem */
1379191783Srmacklemstruct nfsv4stateid {
1380191783Srmacklem	u_int32_t	seqid;
1381191783Srmacklem	u_int32_t	other[NFSX_STATEIDOTHER / NFSX_UNSIGNED];
1382191783Srmacklem};
1383191783Srmacklemtypedef struct nfsv4stateid nfsv4stateid_t;
1384191783Srmacklem
1385191783Srmacklem#endif	/* _NFS_NFSPROTO_H_ */
1386