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