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