xref: /original-bsd/sys/nfs/nfsproto.h (revision 3705696b)
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  * %sccs.include.redist.c%
9  *
10  *	@(#)nfsproto.h	8.1 (Berkeley) 06/10/93
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 #define	NQNFSPROC_ACCESS	22
96 
97 #define	NFS_NPROCS		23
98 /* Conversion macros */
99 extern int		vttoif_tab[];
100 #define	vtonfs_mode(t,m) \
101 		txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : \
102 				MAKEIMODE((t), (m)))
103 #define	nfstov_mode(a)	(fxdr_unsigned(u_short, (a))&07777)
104 #define	vtonfs_type(a)	txdr_unsigned(nfs_type[((long)(a))])
105 #define	nfstov_type(a)	ntov_type[fxdr_unsigned(u_long,(a))&0x7]
106 
107 /* File types */
108 typedef enum { NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5 } nfstype;
109 
110 /* Structs for common parts of the rpc's */
111 struct nfsv2_time {
112 	u_long	nfs_sec;
113 	u_long	nfs_usec;
114 };
115 
116 struct nqnfs_time {
117 	u_long	nq_sec;
118 	u_long	nq_nsec;
119 };
120 
121 /*
122  * File attributes and setable attributes. These structures cover both
123  * NFS version 2 and the NQNFS protocol. Note that the union is only
124  * used to that one pointer can refer to both variants. These structures
125  * go out on the wire and must be densely packed, so no quad data types
126  * are used. (all fields are longs or u_longs or structures of same)
127  * NB: You can't do sizeof(struct nfsv2_fattr), you must use the
128  *     NFSX_FATTR(isnq) macro.
129  */
130 struct nfsv2_fattr {
131 	u_long	fa_type;
132 	u_long	fa_mode;
133 	u_long	fa_nlink;
134 	u_long	fa_uid;
135 	u_long	fa_gid;
136 	union {
137 		struct {
138 			u_long	nfsfa_size;
139 			u_long	nfsfa_blocksize;
140 			u_long	nfsfa_rdev;
141 			u_long	nfsfa_blocks;
142 			u_long	nfsfa_fsid;
143 			u_long	nfsfa_fileid;
144 			struct nfsv2_time nfsfa_atime;
145 			struct nfsv2_time nfsfa_mtime;
146 			struct nfsv2_time nfsfa_ctime;
147 		} fa_nfsv2;
148 		struct {
149 			struct {
150 				u_long	nqfa_qsize[2];
151 			} nqfa_size;
152 			u_long	nqfa_blocksize;
153 			u_long	nqfa_rdev;
154 			struct {
155 				u_long	nqfa_qbytes[2];
156 			} nqfa_bytes;
157 			u_long	nqfa_fsid;
158 			u_long	nqfa_fileid;
159 			struct nqnfs_time nqfa_atime;
160 			struct nqnfs_time nqfa_mtime;
161 			struct nqnfs_time nqfa_ctime;
162 			u_long	nqfa_flags;
163 			u_long	nqfa_gen;
164 			struct {
165 				u_long	nqfa_qfilerev[2];
166 			} nqfa_filerev;
167 		} fa_nqnfs;
168 	} fa_un;
169 };
170 
171 /* and some ugly defines for accessing union components */
172 #define	fa_nfssize		fa_un.fa_nfsv2.nfsfa_size
173 #define	fa_nfsblocksize		fa_un.fa_nfsv2.nfsfa_blocksize
174 #define	fa_nfsrdev		fa_un.fa_nfsv2.nfsfa_rdev
175 #define	fa_nfsblocks		fa_un.fa_nfsv2.nfsfa_blocks
176 #define	fa_nfsfsid		fa_un.fa_nfsv2.nfsfa_fsid
177 #define	fa_nfsfileid		fa_un.fa_nfsv2.nfsfa_fileid
178 #define	fa_nfsatime		fa_un.fa_nfsv2.nfsfa_atime
179 #define	fa_nfsmtime		fa_un.fa_nfsv2.nfsfa_mtime
180 #define	fa_nfsctime		fa_un.fa_nfsv2.nfsfa_ctime
181 #define	fa_nqsize		fa_un.fa_nqnfs.nqfa_size
182 #define	fa_nqblocksize		fa_un.fa_nqnfs.nqfa_blocksize
183 #define	fa_nqrdev		fa_un.fa_nqnfs.nqfa_rdev
184 #define	fa_nqbytes		fa_un.fa_nqnfs.nqfa_bytes
185 #define	fa_nqfsid		fa_un.fa_nqnfs.nqfa_fsid
186 #define	fa_nqfileid		fa_un.fa_nqnfs.nqfa_fileid
187 #define	fa_nqatime		fa_un.fa_nqnfs.nqfa_atime
188 #define	fa_nqmtime		fa_un.fa_nqnfs.nqfa_mtime
189 #define	fa_nqctime		fa_un.fa_nqnfs.nqfa_ctime
190 #define	fa_nqflags		fa_un.fa_nqnfs.nqfa_flags
191 #define	fa_nqgen		fa_un.fa_nqnfs.nqfa_gen
192 #define	fa_nqfilerev		fa_un.fa_nqnfs.nqfa_filerev
193 
194 struct nfsv2_sattr {
195 	u_long	sa_mode;
196 	u_long	sa_uid;
197 	u_long	sa_gid;
198 	union {
199 		struct {
200 			u_long	nfssa_size;
201 			struct nfsv2_time nfssa_atime;
202 			struct nfsv2_time nfssa_mtime;
203 		} sa_nfsv2;
204 		struct {
205 			struct {
206 				u_long	nqsa_qsize[2];
207 			} nqsa_size;
208 			struct nqnfs_time nqsa_atime;
209 			struct nqnfs_time nqsa_mtime;
210 			u_long	nqsa_flags;
211 			u_long	nqsa_rdev;
212 		} sa_nqnfs;
213 	} sa_un;
214 };
215 
216 /* and some ugly defines for accessing the unions */
217 #define	sa_nfssize		sa_un.sa_nfsv2.nfssa_size
218 #define	sa_nfsatime		sa_un.sa_nfsv2.nfssa_atime
219 #define	sa_nfsmtime		sa_un.sa_nfsv2.nfssa_mtime
220 #define	sa_nqsize		sa_un.sa_nqnfs.nqsa_size
221 #define	sa_nqatime		sa_un.sa_nqnfs.nqsa_atime
222 #define	sa_nqmtime		sa_un.sa_nqnfs.nqsa_mtime
223 #define	sa_nqflags		sa_un.sa_nqnfs.nqsa_flags
224 #define	sa_nqrdev		sa_un.sa_nqnfs.nqsa_rdev
225 
226 struct nfsv2_statfs {
227 	u_long	sf_tsize;
228 	u_long	sf_bsize;
229 	u_long	sf_blocks;
230 	u_long	sf_bfree;
231 	u_long	sf_bavail;
232 	u_long	sf_files;	/* Nqnfs only */
233 	u_long	sf_ffree;	/* ditto      */
234 };
235