1/*-
2 * SPDX-License-Identifier: BSD-3-Clause
3 *
4 * Copyright (c) 1989, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * This code is derived from software contributed to Berkeley by
8 * Rick Macklem at The University of Guelph.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. Neither the name of the University nor the names of its contributors
19 * may be used to endorse or promote products derived from this software
20 * without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 */
34
35#ifndef _NFS_NFSPROTO_H_
36#define _NFS_NFSPROTO_H_
37
38/*
39 * nfs definitions as per the Version 2 and 3 specs
40 */
41
42/*
43 * Constants as defined in the Sun NFS Version 2 and 3 specs.
44 * "NFS: Network File System Protocol Specification" RFC1094
45 * and in the "NFS: Network File System Version 3 Protocol
46 * Specification"
47 */
48
49#define NFS_PORT 2049
50#define NFS_PROG 100003
51#define NFS_VER2 2
52#define NFS_VER3 3
53#define NFS_VER4 4
54
55#define NFS_V2MAXDATA 8192
56#define NFS_MAXDGRAMDATA 16384
57#define NFS_MAXDATA 32768
58#define NFS_MAXPATHLEN 1024
59#define NFS_MAXNAMLEN 255
60#define NFS_MAXPKTHDR 404 /* XXXv4 this needs to be adjust for v4 */
61#define NFS_MAXPACKET (NFS_MAXPKTHDR + NFS_MAXDATA)
62#define NFS_MINPACKET 20
63#define NFS_FABLKSIZE 512 /* Size in bytes of a block wrt fa_blocks */
64
65/* Stat numbers for rpc returns (version 2, 3 and 4) */
66#define NFS_OK 0
67#define NFSERR_PERM 1
68#define NFSERR_NOENT 2
69#define NFSERR_IO 5
70#define NFSERR_NXIO 6
71#define NFSERR_ACCES 13
72#define NFSERR_EXIST 17
73#define NFSERR_XDEV 18 /* Version 3 only */
74#define NFSERR_NODEV 19
75#define NFSERR_NOTDIR 20
76#define NFSERR_ISDIR 21
77#define NFSERR_INVAL 22 /* Version 3 only */
78#define NFSERR_FBIG 27
79#define NFSERR_NOSPC 28
80#define NFSERR_ROFS 30
81#define NFSERR_MLINK 31 /* Version 3 only */
82#define NFSERR_NAMETOL 63
83#define NFSERR_NOTEMPTY 66
84#define NFSERR_DQUOT 69
85#define NFSERR_STALE 70
86#define NFSERR_REMOTE 71 /* Version 3 only */
87#define NFSERR_WFLUSH 99 /* Version 2 only */
88#define NFSERR_BADHANDLE 10001 /* The rest Version 3, 4 only */
89#define NFSERR_NOT_SYNC 10002
90#define NFSERR_BAD_COOKIE 10003
91#define NFSERR_NOTSUPP 10004
92#define NFSERR_TOOSMALL 10005
93#define NFSERR_SERVERFAULT 10006
94#define NFSERR_BADTYPE 10007
95#define NFSERR_JUKEBOX 10008
96#define NFSERR_TRYLATER NFSERR_JUKEBOX
97#define NFSERR_SAME 10009 /* The rest Version 4 only */
98#define NFSERR_DENIED 10010
99#define NFSERR_EXPIRED 10011
100#define NFSERR_LOCKED 10012
101#define NFSERR_GRACE 10013
102#define NFSERR_FHEXPIRED 10014
103#define NFSERR_SHARDE_DENIED 10015
104#define NFSERR_WRONGSEC 10016
105#define NFSERR_CLID_INUSE 10017
106#define NFSERR_RESOURCE 10018
107#define NFSERR_MOVED 10019
108#define NFSERR_NOFILEHANDLE 10020
109#define NFSERR_MINOR_VERS_MISMATCH 10021
110#define NFSERR_STALE_CLIENTID 10022
111#define NFSERR_STALE_STATEID 10023
112#define NFSERR_OLD_STATEID 10024
113#define NFSERR_BAD_STATEID 10025
114#define NFSERR_BAD_SEQID 10026
115#define NFSERR_NOT_SAME 10027
116#define NFSERR_LOCK_RANGE 10028
117#define NFSERR_SYMLINK 10029
118#define NFSERR_READDIR_NOSPC 10030
119#define NFSERR_LEASE_MOVED 10031
120#define NFSERR_ATTRNOTSUPP 10032
121#define NFSERR_NO_GRACE 10033
122#define NFSERR_RECLAIM_BAD 10034
123#define NFSERR_RECLAIM_CONFLICT 10035
124#define NFSERR_BADXDR 10036
125#define NFSERR_LOCKS_HELD 10037
126#define NFSERR_OPENMODE 10038
127#define NFSERR_BADOWNER 10039
128#define NFSERR_BADCHAR 10040
129#define NFSERR_BADNAME 10041
130#define NFSERR_BAD_RANGE 10042
131#define NFSERR_LOCK_NOTSUPP 10043
132#define NFSERR_OP_ILLEGAL 10044
133#define NFSERR_DEADLOCK 10045
134#define NFSERR_FILE_OPEN 10046
135#define NFSERR_STALEWRITEVERF 30001 /* Fake return for nfs_commit() */
136
137#define NFSERR_RETVOID 0x20000000 /* Return void, not error */
138#define NFSERR_AUTHERR 0x40000000 /* Mark an authentication error */
139#define NFSERR_RETERR 0x80000000 /* Mark an error return for V3 */
140
141/* Sizes in bytes of various nfs rpc components */
142#define NFSX_UNSIGNED 4
143
144/* specific to NFS Version 2 */
145#define NFSX_V2FH 32
146#define NFSX_V2FATTR 68
147#define NFSX_V2SATTR 32
148#define NFSX_V2COOKIE 4
149#define NFSX_V2STATFS 20
150
151/* specific to NFS Version 3 */
152#define NFSX_V3FH (sizeof (fhandle_t)) /* size this server uses */
153#define NFSX_V3FHMAX 64 /* max. allowed by protocol */
154#define NFSX_V3FATTR 84
155#define NFSX_V3SATTR 60 /* max. all fields filled in */
156#define NFSX_V3SRVSATTR (sizeof (struct nfsv3_sattr))
157#define NFSX_V3POSTOPATTR (NFSX_V3FATTR + NFSX_UNSIGNED)
158#define NFSX_V3WCCDATA (NFSX_V3POSTOPATTR + 8 * NFSX_UNSIGNED)
159#define NFSX_V3COOKIEVERF 8
160#define NFSX_V3WRITEVERF 8
161#define NFSX_V3CREATEVERF 8
162#define NFSX_V3STATFS 52
163#define NFSX_V3FSINFO 48
164#define NFSX_V3PATHCONF 24
165
166/* specific to NFS Version 4 */
167#define NFSX_V4VERF 8
168#define NFSX_V4FH 128
169#define NFSX_V4STATEID 16
170
171/* variants for both versions */
172#define NFSX_FH(v3) ((v3) ? (NFSX_V3FHMAX + NFSX_UNSIGNED) : \
173 NFSX_V2FH)
174#define NFSX_SRVFH(v3) ((v3) ? NFSX_V3FH : NFSX_V2FH)
175#define NFSX_FATTR(v3) ((v3) ? NFSX_V3FATTR : NFSX_V2FATTR)
176#define NFSX_PREOPATTR(v3) ((v3) ? (7 * NFSX_UNSIGNED) : 0)
177#define NFSX_POSTOPATTR(v3) ((v3) ? (NFSX_V3FATTR + NFSX_UNSIGNED) : 0)
178#define NFSX_POSTOPORFATTR(v3) ((v3) ? (NFSX_V3FATTR + NFSX_UNSIGNED) : \
179 NFSX_V2FATTR)
180#define NFSX_WCCDATA(v3) ((v3) ? NFSX_V3WCCDATA : 0)
181#define NFSX_WCCORFATTR(v3) ((v3) ? NFSX_V3WCCDATA : NFSX_V2FATTR)
182#define NFSX_SATTR(v3) ((v3) ? NFSX_V3SATTR : NFSX_V2SATTR)
183#define NFSX_COOKIEVERF(v3) ((v3) ? NFSX_V3COOKIEVERF : 0)
184#define NFSX_WRITEVERF(v3) ((v3) ? NFSX_V3WRITEVERF : 0)
185#define NFSX_READDIR(v3) ((v3) ? (5 * NFSX_UNSIGNED) : \
186 (2 * NFSX_UNSIGNED))
187#define NFSX_STATFS(v3) ((v3) ? NFSX_V3STATFS : NFSX_V2STATFS)
188
189/* nfs rpc procedure numbers (before version mapping) */
190#define NFSPROC_NULL 0
191#define NFSPROC_GETATTR 1
192#define NFSPROC_SETATTR 2
193#define NFSPROC_LOOKUP 3
194#define NFSPROC_ACCESS 4
195#define NFSPROC_READLINK 5
196#define NFSPROC_READ 6
197#define NFSPROC_WRITE 7
198#define NFSPROC_CREATE 8
199#define NFSPROC_MKDIR 9
200#define NFSPROC_SYMLINK 10
201#define NFSPROC_MKNOD 11
202#define NFSPROC_REMOVE 12
203#define NFSPROC_RMDIR 13
204#define NFSPROC_RENAME 14
205#define NFSPROC_LINK 15
206#define NFSPROC_READDIR 16
207#define NFSPROC_READDIRPLUS 17
208#define NFSPROC_FSSTAT 18
209#define NFSPROC_FSINFO 19
210#define NFSPROC_PATHCONF 20
211#define NFSPROC_COMMIT 21
212#define NFSPROC_NOOP 22
213#define NFS_NPROCS 23
214
215/* Actual Version 2 procedure numbers */
216#define NFSV2PROC_NULL 0
217#define NFSV2PROC_GETATTR 1
218#define NFSV2PROC_SETATTR 2
219#define NFSV2PROC_NOOP 3
220#define NFSV2PROC_ROOT NFSV2PROC_NOOP /* Obsolete */
221#define NFSV2PROC_LOOKUP 4
222#define NFSV2PROC_READLINK 5
223#define NFSV2PROC_READ 6
224#define NFSV2PROC_WRITECACHE NFSV2PROC_NOOP /* Obsolete */
225#define NFSV2PROC_WRITE 8
226#define NFSV2PROC_CREATE 9
227#define NFSV2PROC_REMOVE 10
228#define NFSV2PROC_RENAME 11
229#define NFSV2PROC_LINK 12
230#define NFSV2PROC_SYMLINK 13
231#define NFSV2PROC_MKDIR 14
232#define NFSV2PROC_RMDIR 15
233#define NFSV2PROC_READDIR 16
234#define NFSV2PROC_STATFS 17
235
236/* Version 4 procedure numbers */
237#define NFSV4PROC_NULL 0
238#define NFSV4PROC_COMPOUND 1
239
240/* Version 4 operation numbers */
241#define NFSV4OP_ACCESS 3
242#define NFSV4OP_CLOSE 4
243#define NFSV4OP_COMMIT 5
244#define NFSV4OP_CREATE 6
245#define NFSV4OP_DELEGPURGE 7
246#define NFSV4OP_DELEGRETURN 8
247#define NFSV4OP_GETATTR 9
248#define NFSV4OP_GETFH 10
249#define NFSV4OP_LINK 11
250#define NFSV4OP_LOCK 12
251#define NFSV4OP_LOCKT 13
252#define NFSV4OP_LOCKU 14
253#define NFSV4OP_LOOKUP 15
254#define NFSV4OP_LOOKUPP 16
255#define NFSV4OP_NVERIFY 17
256#define NFSV4OP_OPEN 18
257#define NFSV4OP_OPENATTR 19
258#define NFSV4OP_OPEN_CONFIRM 20
259#define NFSV4OP_OPEN_DOWNGRADE 21
260#define NFSV4OP_PUTFH 22
261#define NFSV4OP_PUTPUBFH 23
262#define NFSV4OP_PUTROOTFH 24
263#define NFSV4OP_READ 25
264#define NFSV4OP_READDIR 26
265#define NFSV4OP_READLINK 27
266#define NFSV4OP_REMOVE 28
267#define NFSV4OP_RENAME 29
268#define NFSV4OP_RENEW 30
269#define NFSV4OP_RESTOREFH 31
270#define NFSV4OP_SAVEFH 32
271#define NFSV4OP_SECINFO 33
272#define NFSV4OP_SETATTR 34
273#define NFSV4OP_SETCLIENTID 35
274#define NFSV4OP_SETCLIENTID_CONFIRM 36
275#define NFSV4OP_VERIFY 37
276#define NFSV4OP_WRITE 38
277
278/*
279 * Constants used by the Version 3 protocol for various RPCs
280 */
281#define NFSV3SATTRTIME_DONTCHANGE 0
282#define NFSV3SATTRTIME_TOSERVER 1
283#define NFSV3SATTRTIME_TOCLIENT 2
284
285#define NFSV3ACCESS_READ 0x01
286#define NFSV3ACCESS_LOOKUP 0x02
287#define NFSV3ACCESS_MODIFY 0x04
288#define NFSV3ACCESS_EXTEND 0x08
289#define NFSV3ACCESS_DELETE 0x10
290#define NFSV3ACCESS_EXECUTE 0x20
291
292#define NFSV3WRITE_UNSTABLE 0
293#define NFSV3WRITE_DATASYNC 1
294#define NFSV3WRITE_FILESYNC 2
295
296#define NFSV3CREATE_UNCHECKED 0
297#define NFSV3CREATE_GUARDED 1
298#define NFSV3CREATE_EXCLUSIVE 2
299
300#define NFSV3FSINFO_LINK 0x01
301#define NFSV3FSINFO_SYMLINK 0x02
302#define NFSV3FSINFO_HOMOGENEOUS 0x08
303#define NFSV3FSINFO_CANSETTIME 0x10
304
305/*
306 * Constants used by the Version 4 protocol for various RPCs
307 */
308
309#define NFSV4ACCESS_READ 0x01
310#define NFSV4ACCESS_LOOKUP 0x02
311#define NFSV4ACCESS_MODIFY 0x04
312#define NFSV4ACCESS_EXTEND 0x08
313#define NFSV4ACCESS_DELETE 0x10
314#define NFSV4ACCESS_EXECUTE 0x20
315
316#define NFSV4OPENRES_MLOCK 0x01
317#define NFSV4OPENRES_CONFIRM 0x02
318
319#define NFSV4OPENSHARE_ACCESS_READ 0x01
320#define NFSV4OPENSHARE_ACCESS_WRITE 0x02
321#define NFSV4OPENSHARE_ACCESS_BOTH 0x03
322#define NFSV4OPENSHARE_DENY_NONE 0x00
323#define NFSV4OPENSHARE_DENY_READ 0x01
324#define NFSV4OPENSHARE_DENY_WRITE 0x02
325#define NFSV4OPENSHARE_DENY_BOTH 0x03
326
327/* File types */
328typedef enum {
329 NFNON=0,
330 NFREG=1,
331 NFDIR=2,
332 NFBLK=3,
333 NFCHR=4,
334 NFLNK=5,
335 NFSOCK=6,
336 NFFIFO=7,
337 NFATTRDIR = 8,
338 NFNAMEDATTR = 9,
339 NFBAD = 10,
340} nfstype;
341
342/* NFSv4 claim type */
343typedef enum {
344 NCLNULL = 0,
345 NCLPREV = 1,
346 NCLDELEGCUR = 2,
347 NCLDELEGPREV = 3,
348} nfsv4cltype;
349
350/* Other NFSv4 types */
351typedef enum {
352 NSHUNSTABLE = 0,
353 NSHDATASYNC = 1,
354 NSHFILESYNC = 2,
355} nfsv4stablehow;
356
357typedef enum { OTNOCREATE = 0, OTCREATE = 1 } nfsv4opentype;
358typedef enum { CMUNCHECKED = 0, CMGUARDED = 1, CMEXCLUSIVE = 2 } nfsv4createmode;
359typedef enum { THSERVERTIME = 0, THCLIENTTIME = 1 } nfsv4timehow;
360typedef enum { ODNONE = 0, ODREAD = 1, ODWRITE = 2 } nfsv4opendelegtype;
361
362/* Structs for common parts of the rpc's */
363
364/*
365 * File Handle (32 bytes for version 2), variable up to 64 for version 3.
366 * File Handles of up to NFS_SMALLFH in size are stored directly in the
367 * nfs node, whereas larger ones are malloc'd. (This never happens when
368 * NFS_SMALLFH is set to 64.)
369 * NFS_SMALLFH should be in the range of 32 to 64 and be divisible by 4.
370 */
371#ifndef NFS_SMALLFH
372#define NFS_SMALLFH 128
373#endif
374union nfsfh {
375 fhandle_t fh_generic;
376 u_char fh_bytes[NFS_SMALLFH];
377};
378typedef union nfsfh nfsfh_t;
379
380struct nfsv2_time {
381 u_int32_t nfsv2_sec;
382 u_int32_t nfsv2_usec;
383};
384typedef struct nfsv2_time nfstime2;
385
386struct nfsv3_time {
387 u_int32_t nfsv3_sec;
388 u_int32_t nfsv3_nsec;
389};
390typedef struct nfsv3_time nfstime3;
391
392/*
393 * Quads are defined as arrays of 2 longs to ensure dense packing for the
394 * protocol and to facilitate xdr conversion.
395 */
396struct nfs_uquad {
397 u_int32_t nfsuquad[2];
398};
399typedef struct nfs_uquad nfsuint64;
400
401/*
402 * Used to convert between two u_longs and a u_quad_t.
403 */
404union nfs_quadconvert {
405 u_int32_t lval[2];
406 u_quad_t qval;
407};
408typedef union nfs_quadconvert nfsquad_t;
409
410/*
411 * NFS Version 3 special file number.
412 */
413struct nfsv3_spec {
414 u_int32_t specdata1;
415 u_int32_t specdata2;
416};
417typedef struct nfsv3_spec nfsv3spec;
418
419/*
420 * NFS Version 4 bitmap.
421 */
422struct nfsv4_bitmap {
423 uint32_t bmlen;
424 uint32_t *bmval;
425};
426typedef struct nfsv4_bitmap nfsv4bitmap;
427
428struct nfsv4_changeinfo {
429 u_int ciatomic;
430 uint64_t cibefore;
431 uint64_t ciafter;
432};
433typedef struct nfsv4_changeinfo nfsv4changeinfo;
434
435/*
436 * File attributes and setable attributes. These structures cover both
437 * NFS version 2 and the version 3 protocol. Note that the union is only
438 * used so that one pointer can refer to both variants. These structures
439 * go out on the wire and must be densely packed, so no quad data types
440 * are used. (all fields are longs or u_longs or structures of same)
441 * NB: You can't do sizeof(struct nfs_fattr), you must use the
442 * NFSX_FATTR(v3) macro.
443 */
444struct nfs_fattr {
445 u_int32_t fa_type;
446 u_int32_t fa_mode;
447 u_int32_t fa_nlink;
448 u_int32_t fa_uid;
449 u_int32_t fa_gid;
450 union {
451 struct {
452 u_int32_t nfsv2fa_size;
453 u_int32_t nfsv2fa_blocksize;
454 u_int32_t nfsv2fa_rdev;
455 u_int32_t nfsv2fa_blocks;
456 u_int32_t nfsv2fa_fsid;
457 u_int32_t nfsv2fa_fileid;
458 nfstime2 nfsv2fa_atime;
459 nfstime2 nfsv2fa_mtime;
460 nfstime2 nfsv2fa_ctime;
461 } fa_nfsv2;
462 struct {
463 nfsuint64 nfsv3fa_size;
464 nfsuint64 nfsv3fa_used;
465 nfsv3spec nfsv3fa_rdev;
466 nfsuint64 nfsv3fa_fsid;
467 nfsuint64 nfsv3fa_fileid;
468 nfstime3 nfsv3fa_atime;
469 nfstime3 nfsv3fa_mtime;
470 nfstime3 nfsv3fa_ctime;
471 } fa_nfsv3;
472 } fa_un;
473};
474
475/* and some ugly defines for accessing union components */
476#define fa2_size fa_un.fa_nfsv2.nfsv2fa_size
477#define fa2_blocksize fa_un.fa_nfsv2.nfsv2fa_blocksize
478#define fa2_rdev fa_un.fa_nfsv2.nfsv2fa_rdev
479#define fa2_blocks fa_un.fa_nfsv2.nfsv2fa_blocks
480#define fa2_fsid fa_un.fa_nfsv2.nfsv2fa_fsid
481#define fa2_fileid fa_un.fa_nfsv2.nfsv2fa_fileid
482#define fa2_atime fa_un.fa_nfsv2.nfsv2fa_atime
483#define fa2_mtime fa_un.fa_nfsv2.nfsv2fa_mtime
484#define fa2_ctime fa_un.fa_nfsv2.nfsv2fa_ctime
485#define fa3_size fa_un.fa_nfsv3.nfsv3fa_size
486#define fa3_used fa_un.fa_nfsv3.nfsv3fa_used
487#define fa3_rdev fa_un.fa_nfsv3.nfsv3fa_rdev
488#define fa3_fsid fa_un.fa_nfsv3.nfsv3fa_fsid
489#define fa3_fileid fa_un.fa_nfsv3.nfsv3fa_fileid
490#define fa3_atime fa_un.fa_nfsv3.nfsv3fa_atime
491#define fa3_mtime fa_un.fa_nfsv3.nfsv3fa_mtime
492#define fa3_ctime fa_un.fa_nfsv3.nfsv3fa_ctime
493
494struct nfsv4_fattr {
495 u_int fa4_valid;
496 nfstype fa4_type;
497 off_t fa4_size;
498 uint64_t fa4_fsid_major;
499 uint64_t fa4_fsid_minor;
500 uint64_t fa4_fileid;
501 mode_t fa4_mode;
502 nlink_t fa4_nlink;
503 uid_t fa4_uid;
504 gid_t fa4_gid;
505 uint32_t fa4_rdev_major;
506 uint32_t fa4_rdev_minor;
507 struct timespec fa4_atime;
508 struct timespec fa4_btime;
509 struct timespec fa4_ctime;
510 struct timespec fa4_mtime;
511 uint64_t fa4_maxread;
512 uint64_t fa4_maxwrite;
513 uint64_t fa4_ffree;
514 uint64_t fa4_ftotal;
515 uint32_t fa4_maxname;
516 uint64_t fa4_savail;
517 uint64_t fa4_sfree;
518 uint64_t fa4_stotal;
519 uint64_t fa4_changeid;
520 uint32_t fa4_lease_time;
521 uint64_t fa4_maxfilesize;
522};
523
524/* Flags for fa4_valid */
525#define FA4V_SIZE 0x00000001
526#define FA4V_FSID 0x00000002
527#define FA4V_FILEID 0x00000004
528#define FA4V_MODE 0x00000008
529#define FA4V_NLINK 0x00000010
530#define FA4V_UID 0x00000020
531#define FA4V_GID 0x00000040
532#define FA4V_RDEV 0x00000080
533#define FA4V_ATIME 0x00000100
534#define FA4V_BTIME 0x00000200
535#define FA4V_CTIME 0x00000400
536#define FA4V_MTIME 0x00000800
537#define FA4V_MAXREAD 0x00001000
538#define FA4V_MAXWRITE 0x00002000
539#define FA4V_TYPE 0x00004000
540#define FA4V_FFREE 0x00008000
541#define FA4V_FTOTAL 0x00010000
542#define FA4V_MAXNAME 0x00020000
543#define FA4V_SAVAIL 0x00040000
544#define FA4V_SFREE 0x00080000
545#define FA4V_STOTAL 0x00100000
546#define FA4V_CHANGEID 0x00200000
547#define FA4V_LEASE_TIME 0x00400000
548#define FA4V_MAXFILESIZE 0x00800000
549#define FA4V_ACL 0x01000000
550
551/* Offsets into bitmask */
552#define FA4_SUPPORTED_ATTRS 0
553#define FA4_TYPE 1
554#define FA4_FH_EXPIRE_TYPE 2
555#define FA4_CHANGE 3
556#define FA4_SIZE 4
557#define FA4_LINK_SUPPORT 5
558#define FA4_SYMLINK_SUPPORT 6
559#define FA4_NAMED_ATTR 7
560#define FA4_FSID 8
561#define FA4_UNIQUE_HANDLES 9
562#define FA4_LEASE_TIME 10
563#define FA4_RDATTR_ERROR 11
564#define FA4_ACL 12
565#define FA4_ACLSUPPORT 13
566#define FA4_ARCHIVE 14
567#define FA4_CANSETTIME 15
568#define FA4_CASE_INSENSITIVE 16
569#define FA4_CASE_PRESERVING 17
570#define FA4_CHOWN_RESTRICTED 18
571#define FA4_FILEHANDLE 19
572#define FA4_FILEID 20
573#define FA4_FILES_AVAIL 21
574#define FA4_FILES_FREE 22
575#define FA4_FILES_TOTAL 23
576#define FA4_FS_LOCATIONS 24
577#define FA4_HIDDEN 25
578#define FA4_HOMOGENEOUS 26
579#define FA4_MAXFILESIZE 27
580#define FA4_MAXLINK 28
581#define FA4_MAXNAME 29
582#define FA4_MAXREAD 30
583#define FA4_MAXWRITE 31
584#define FA4_MIMETYPE 32
585#define FA4_MODE 33
586#define FA4_NO_TRUNC 34
587#define FA4_NUMLINKS 35
588#define FA4_OWNER 36
589#define FA4_OWNER_GROUP 37
590#define FA4_QUOTA_HARD 38
591#define FA4_QUOTA_SOFT 39
592#define FA4_QUOTA_USED 40
593#define FA4_RAWDEV 41
594#define FA4_SPACE_AVAIL 42
595#define FA4_SPACE_FREE 43
596#define FA4_SPACE_TOTAL 44
597#define FA4_SPACE_USED 45
598#define FA4_SYSTEM 46
599#define FA4_TIME_ACCESS 47
600#define FA4_TIME_ACCESS_SET 48
601#define FA4_TIME_BACKUP 49
602#define FA4_TIME_CREATE 50
603#define FA4_TIME_DELTA 51
604#define FA4_TIME_METADATA 52
605#define FA4_TIME_MODIFY 53
606#define FA4_TIME_MODIFY_SET 54
607#define FA4_ATTR_MAX 55
608
609/* Macros for v4 fattr manipulation */
610#define FA4_SET(n, p) ((p)[(n)/32] |= (1 << ((n) % 32)))
611#define FA4_CLR(n, p) ((p)[(n)/32] &= ~(1 << ((n) % 32)))
612#define FA4_ISSET(n, p) ((p)[(n)/32] & (1 << ((n) % 32)))
613#define FA4_ZERO(p) bzero((p), 8)
614#define FA4_SKIP(p) ((p) += 2)
615
616struct nfsv2_sattr {
617 u_int32_t sa_mode;
618 u_int32_t sa_uid;
619 u_int32_t sa_gid;
620 u_int32_t sa_size;
621 nfstime2 sa_atime;
622 nfstime2 sa_mtime;
623};
624
625/*
626 * NFS Version 3 sattr structure for the new node creation case.
627 */
628struct nfsv3_sattr {
629 u_int32_t sa_modetrue;
630 u_int32_t sa_mode;
631 u_int32_t sa_uidfalse;
632 u_int32_t sa_gidfalse;
633 u_int32_t sa_sizefalse;
634 u_int32_t sa_atimetype;
635 nfstime3 sa_atime;
636 u_int32_t sa_mtimetype;
637 nfstime3 sa_mtime;
638};
639
640struct nfs_statfs {
641 union {
642 struct {
643 u_int32_t nfsv2sf_tsize;
644 u_int32_t nfsv2sf_bsize;
645 u_int32_t nfsv2sf_blocks;
646 u_int32_t nfsv2sf_bfree;
647 u_int32_t nfsv2sf_bavail;
648 } sf_nfsv2;
649 struct {
650 nfsuint64 nfsv3sf_tbytes;
651 nfsuint64 nfsv3sf_fbytes;
652 nfsuint64 nfsv3sf_abytes;
653 nfsuint64 nfsv3sf_tfiles;
654 nfsuint64 nfsv3sf_ffiles;
655 nfsuint64 nfsv3sf_afiles;
656 u_int32_t nfsv3sf_invarsec;
657 } sf_nfsv3;
658 } sf_un;
659};
660
661#define sf_tsize sf_un.sf_nfsv2.nfsv2sf_tsize
662#define sf_bsize sf_un.sf_nfsv2.nfsv2sf_bsize
663#define sf_blocks sf_un.sf_nfsv2.nfsv2sf_blocks
664#define sf_bfree sf_un.sf_nfsv2.nfsv2sf_bfree
665#define sf_bavail sf_un.sf_nfsv2.nfsv2sf_bavail
666#define sf_tbytes sf_un.sf_nfsv3.nfsv3sf_tbytes
667#define sf_fbytes sf_un.sf_nfsv3.nfsv3sf_fbytes
668#define sf_abytes sf_un.sf_nfsv3.nfsv3sf_abytes
669#define sf_tfiles sf_un.sf_nfsv3.nfsv3sf_tfiles
670#define sf_ffiles sf_un.sf_nfsv3.nfsv3sf_ffiles
671#define sf_afiles sf_un.sf_nfsv3.nfsv3sf_afiles
672#define sf_invarsec sf_un.sf_nfsv3.nfsv3sf_invarsec
673
674struct nfsv3_fsinfo {
675 u_int32_t fs_rtmax;
676 u_int32_t fs_rtpref;
677 u_int32_t fs_rtmult;
678 u_int32_t fs_wtmax;
679 u_int32_t fs_wtpref;
680 u_int32_t fs_wtmult;
681 u_int32_t fs_dtpref;
682 nfsuint64 fs_maxfilesize;
683 nfstime3 fs_timedelta;
684 u_int32_t fs_properties;
685};
686
687struct nfsv3_pathconf {
688 u_int32_t pc_linkmax;
689 u_int32_t pc_namemax;
690 u_int32_t pc_notrunc;
691 u_int32_t pc_chownrestricted;
692 u_int32_t pc_caseinsensitive;
693 u_int32_t pc_casepreserving;
694};
695
696#endif