xref: /csrg-svn/sys/nfs/nfsproto.h (revision 56279)
1 /*
2  * Copyright (c) 1989 The Regents of the University of California.
3  * 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  * %sccs.include.redist.c%
9  *
10  *	@(#)nfsproto.h	7.10 (Berkeley) 09/16/92
11  */
12 
13 /*
14  * nfs definitions as per the version 2 specs
15  */
16 
17 /*
18  * Constants as defined in the Sun NFS Version 2 spec.
19  * "NFS: Network File System Protocol Specification" RFC1094
20  */
21 
22 #define NFS_PORT	2049
23 #define	NFS_PROG	100003
24 #define NFS_VER2	2
25 #define	NFS_MAXDGRAMDATA 8192
26 #define	NFS_MAXDATA	32768
27 #define	NFS_MAXPATHLEN	1024
28 #define	NFS_MAXNAMLEN	255
29 #define	NFS_FHSIZE	32
30 #define	NFS_MAXPKTHDR	404
31 #define NFS_MAXPACKET	(NFS_MAXPKTHDR+NFS_MAXDATA)
32 #define	NFS_MINPACKET	20
33 #define	NFS_FABLKSIZE	512	/* Size in bytes of a block wrt fa_blocks */
34 
35 /* Stat numbers for rpc returns */
36 #define	NFS_OK		0
37 #define	NFSERR_PERM	1
38 #define	NFSERR_NOENT	2
39 #define	NFSERR_IO	5
40 #define	NFSERR_NXIO	6
41 #define	NFSERR_ACCES	13
42 #define	NFSERR_EXIST	17
43 #define	NFSERR_NODEV	19
44 #define	NFSERR_NOTDIR	20
45 #define	NFSERR_ISDIR	21
46 #define	NFSERR_FBIG	27
47 #define	NFSERR_NOSPC	28
48 #define	NFSERR_ROFS	30
49 #define	NFSERR_NAMETOL	63
50 #define	NFSERR_NOTEMPTY	66
51 #define	NFSERR_DQUOT	69
52 #define	NFSERR_STALE	70
53 #define	NFSERR_WFLUSH	99
54 
55 /* Sizes in bytes of various nfs rpc components */
56 #define	NFSX_FH		32
57 #define	NFSX_UNSIGNED	4
58 #define	NFSX_NFSFATTR	68
59 #define	NFSX_NQFATTR	92
60 #define	NFSX_NFSSATTR	32
61 #define	NFSX_NQSATTR	44
62 #define	NFSX_COOKIE	4
63 #define NFSX_NFSSTATFS	20
64 #define	NFSX_NQSTATFS	28
65 #define	NFSX_FATTR(isnq)	((isnq) ? NFSX_NQFATTR : NFSX_NFSFATTR)
66 #define	NFSX_SATTR(isnq)	((isnq) ? NFSX_NQSATTR : NFSX_NFSSATTR)
67 #define	NFSX_STATFS(isnq)	((isnq) ? NFSX_NQSTATFS : NFSX_NFSSTATFS)
68 
69 /* nfs rpc procedure numbers */
70 #define	NFSPROC_NULL		0
71 #define	NFSPROC_GETATTR		1
72 #define	NFSPROC_SETATTR		2
73 #define	NFSPROC_NOOP		3
74 #define	NFSPROC_ROOT		NFSPROC_NOOP	/* Obsolete */
75 #define	NFSPROC_LOOKUP		4
76 #define	NFSPROC_READLINK	5
77 #define	NFSPROC_READ		6
78 #define	NFSPROC_WRITECACHE	NFSPROC_NOOP	/* Obsolete */
79 #define	NFSPROC_WRITE		8
80 #define	NFSPROC_CREATE		9
81 #define	NFSPROC_REMOVE		10
82 #define	NFSPROC_RENAME		11
83 #define	NFSPROC_LINK		12
84 #define	NFSPROC_SYMLINK		13
85 #define	NFSPROC_MKDIR		14
86 #define	NFSPROC_RMDIR		15
87 #define	NFSPROC_READDIR		16
88 #define	NFSPROC_STATFS		17
89 
90 /* NQ nfs numbers */
91 #define	NQNFSPROC_READDIRLOOK	18
92 #define	NQNFSPROC_GETLEASE	19
93 #define	NQNFSPROC_VACATED	20
94 #define	NQNFSPROC_EVICTED	21
95 
96 #define	NFS_NPROCS		22
97 /* Conversion macros */
98 extern int		vttoif_tab[];
99 #define	vtonfs_mode(t,m) \
100 		txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : \
101 				MAKEIMODE((t), (m)))
102 #define	nfstov_mode(a)	(fxdr_unsigned(u_short, (a))&07777)
103 #define	vtonfs_type(a)	txdr_unsigned(nfs_type[((long)(a))])
104 #define	nfstov_type(a)	ntov_type[fxdr_unsigned(u_long,(a))&0x7]
105 
106 /* File types */
107 typedef enum { NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5 } nfstype;
108 
109 /* Structs for common parts of the rpc's */
110 struct nfsv2_time {
111 	u_long	nfs_sec;
112 	u_long	nfs_usec;
113 };
114 
115 struct nqnfs_time {
116 	u_long	nq_sec;
117 	u_long	nq_nsec;
118 };
119 
120 /*
121  * File attributes and setable attributes. These structures cover both
122  * NFS version 2 and the NQNFS protocol. Note that the union is only
123  * used to that one pointer can refer to both variants. These structures
124  * go out on the wire and must be densely packed, so no quad data types
125  * are used. (all fields are longs or u_longs or structures of same)
126  * NB: You can't do sizeof(struct nfsv2_fattr), you must use the
127  *     NFSX_FATTR(isnq) macro.
128  */
129 struct nfsv2_fattr {
130 	u_long	fa_type;
131 	u_long	fa_mode;
132 	u_long	fa_nlink;
133 	u_long	fa_uid;
134 	u_long	fa_gid;
135 	union {
136 		struct {
137 			u_long	nfsfa_size;
138 			u_long	nfsfa_blocksize;
139 			u_long	nfsfa_rdev;
140 			u_long	nfsfa_blocks;
141 			u_long	nfsfa_fsid;
142 			u_long	nfsfa_fileid;
143 			struct nfsv2_time nfsfa_atime;
144 			struct nfsv2_time nfsfa_mtime;
145 			struct nfsv2_time nfsfa_ctime;
146 		} fa_nfsv2;
147 		struct {
148 			struct {
149 				u_long	nqfa_qsize[2];
150 			} nqfa_size;
151 			u_long	nqfa_blocksize;
152 			u_long	nqfa_rdev;
153 			struct {
154 				u_long	nqfa_qbytes[2];
155 			} nqfa_bytes;
156 			u_long	nqfa_fsid;
157 			u_long	nqfa_fileid;
158 			struct nqnfs_time nqfa_atime;
159 			struct nqnfs_time nqfa_mtime;
160 			struct nqnfs_time nqfa_ctime;
161 			u_long	nqfa_flags;
162 			u_long	nqfa_gen;
163 			struct {
164 				u_long	nqfa_qfilerev[2];
165 			} nqfa_filerev;
166 		} fa_nqnfs;
167 	} fa_un;
168 };
169 
170 /* and some ugly defines for accessing union components */
171 #define	fa_nfssize		fa_un.fa_nfsv2.nfsfa_size
172 #define	fa_nfsblocksize		fa_un.fa_nfsv2.nfsfa_blocksize
173 #define	fa_nfsrdev		fa_un.fa_nfsv2.nfsfa_rdev
174 #define	fa_nfsblocks		fa_un.fa_nfsv2.nfsfa_blocks
175 #define	fa_nfsfsid		fa_un.fa_nfsv2.nfsfa_fsid
176 #define	fa_nfsfileid		fa_un.fa_nfsv2.nfsfa_fileid
177 #define	fa_nfsatime		fa_un.fa_nfsv2.nfsfa_atime
178 #define	fa_nfsmtime		fa_un.fa_nfsv2.nfsfa_mtime
179 #define	fa_nfsctime		fa_un.fa_nfsv2.nfsfa_ctime
180 #define	fa_nqsize		fa_un.fa_nqnfs.nqfa_size
181 #define	fa_nqblocksize		fa_un.fa_nqnfs.nqfa_blocksize
182 #define	fa_nqrdev		fa_un.fa_nqnfs.nqfa_rdev
183 #define	fa_nqbytes		fa_un.fa_nqnfs.nqfa_bytes
184 #define	fa_nqfsid		fa_un.fa_nqnfs.nqfa_fsid
185 #define	fa_nqfileid		fa_un.fa_nqnfs.nqfa_fileid
186 #define	fa_nqatime		fa_un.fa_nqnfs.nqfa_atime
187 #define	fa_nqmtime		fa_un.fa_nqnfs.nqfa_mtime
188 #define	fa_nqctime		fa_un.fa_nqnfs.nqfa_ctime
189 #define	fa_nqflags		fa_un.fa_nqnfs.nqfa_flags
190 #define	fa_nqgen		fa_un.fa_nqnfs.nqfa_gen
191 #define	fa_nqfilerev		fa_un.fa_nqnfs.nqfa_filerev
192 
193 struct nfsv2_sattr {
194 	u_long	sa_mode;
195 	u_long	sa_uid;
196 	u_long	sa_gid;
197 	union {
198 		struct {
199 			u_long	nfssa_size;
200 			struct nfsv2_time nfssa_atime;
201 			struct nfsv2_time nfssa_mtime;
202 		} sa_nfsv2;
203 		struct {
204 			struct {
205 				u_long	nqsa_qsize[2];
206 			} nqsa_size;
207 			struct nqnfs_time nqsa_atime;
208 			struct nqnfs_time nqsa_mtime;
209 			u_long	nqsa_flags;
210 			u_long	nqsa_rdev;
211 		} sa_nqnfs;
212 	} sa_un;
213 };
214 
215 /* and some ugly defines for accessing the unions */
216 #define	sa_nfssize		sa_un.sa_nfsv2.nfssa_size
217 #define	sa_nfsatime		sa_un.sa_nfsv2.nfssa_atime
218 #define	sa_nfsmtime		sa_un.sa_nfsv2.nfssa_mtime
219 #define	sa_nqsize		sa_un.sa_nqnfs.nqsa_size
220 #define	sa_nqatime		sa_un.sa_nqnfs.nqsa_atime
221 #define	sa_nqmtime		sa_un.sa_nqnfs.nqsa_mtime
222 #define	sa_nqflags		sa_un.sa_nqnfs.nqsa_flags
223 #define	sa_nqrdev		sa_un.sa_nqnfs.nqsa_rdev
224 
225 struct nfsv2_statfs {
226 	u_long	sf_tsize;
227 	u_long	sf_bsize;
228 	u_long	sf_blocks;
229 	u_long	sf_bfree;
230 	u_long	sf_bavail;
231 	u_long	sf_files;	/* Nqnfs only */
232 	u_long	sf_ffree;	/* ditto      */
233 };
234