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