summaryrefslogtreecommitdiff
path: root/usr.sbin/tcpdump/nfsv2.h
blob: 04d1164a40297194bd9ce677e7182da9dcad7c23 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
/*	$OpenBSD: nfsv2.h,v 1.7 2003/06/02 23:36:54 millert Exp $	*/

/*
 * Copyright (c) 1994, 1995, 1996
 *	The Regents of the University of California.  All rights reserved.
 *
 * This code is derived from software contributed to Berkeley by
 * Rick Macklem at The University of Guelph.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *	@(#)nfsv2.h	7.11 (Berkeley) 9/30/92
 */

/*
 * nfs definitions as per the version 2 specs
 */

/*
 * Constants as defined in the Sun NFS Version 2 spec.
 * "NFS: Network File System Protocol Specification" RFC1094
 */

#define NFS_PORT	2049
#define	NFS_PROG	100003
#define NFS_VER2	2
#define	NFS_MAXDGRAMDATA 8192
#define	NFS_MAXDATA	32768
#define	NFS_MAXPATHLEN	1024
#define	NFS_MAXNAMLEN	255
#define	NFS_FHSIZE	32
#define	NFS_MAXPKTHDR	404
#define NFS_MAXPACKET	(NFS_MAXPKTHDR+NFS_MAXDATA)
#define	NFS_MINPACKET	20
#define	NFS_FABLKSIZE	512	/* Size in bytes of a block wrt fa_blocks */

/* Stat numbers for rpc returns */
#define	NFS_OK		0
#define	NFSERR_PERM	1
#define	NFSERR_NOENT	2
#define	NFSERR_IO	5
#define	NFSERR_NXIO	6
#define	NFSERR_ACCES	13
#define	NFSERR_EXIST	17
#define	NFSERR_NODEV	19
#define	NFSERR_NOTDIR	20
#define	NFSERR_ISDIR	21
#define	NFSERR_FBIG	27
#define	NFSERR_NOSPC	28
#define	NFSERR_ROFS	30
#define	NFSERR_NAMETOL	63
#define	NFSERR_NOTEMPTY	66
#define	NFSERR_DQUOT	69
#define	NFSERR_STALE	70
#define	NFSERR_WFLUSH	99

/* Sizes in bytes of various nfs rpc components */
#define	NFSX_FH		32
#define	NFSX_UNSIGNED	4
#define	NFSX_NFSFATTR	68
#define	NFSX_NQFATTR	92
#define	NFSX_NFSSATTR	32
#define	NFSX_NQSATTR	44
#define	NFSX_COOKIE	4
#define NFSX_NFSSTATFS	20
#define	NFSX_NQSTATFS	28
#define	NFSX_FATTR(isnq)	((isnq) ? NFSX_NQFATTR : NFSX_NFSFATTR)
#define	NFSX_SATTR(isnq)	((isnq) ? NFSX_NQSATTR : NFSX_NFSSATTR)
#define	NFSX_STATFS(isnq)	((isnq) ? NFSX_NQSTATFS : NFSX_NFSSTATFS)

/* nfs rpc procedure numbers */
#define	NFSPROC_NULL		0
#define	NFSPROC_GETATTR		1
#define	NFSPROC_SETATTR		2
#define	NFSPROC_NOOP		3
#define	NFSPROC_ROOT		NFSPROC_NOOP	/* Obsolete */
#define	NFSPROC_LOOKUP		4
#define	NFSPROC_READLINK	5
#define	NFSPROC_READ		6
#define	NFSPROC_WRITECACHE	NFSPROC_NOOP	/* Obsolete */
#define	NFSPROC_WRITE		8
#define	NFSPROC_CREATE		9
#define	NFSPROC_REMOVE		10
#define	NFSPROC_RENAME		11
#define	NFSPROC_LINK		12
#define	NFSPROC_SYMLINK		13
#define	NFSPROC_MKDIR		14
#define	NFSPROC_RMDIR		15
#define	NFSPROC_READDIR		16
#define	NFSPROC_STATFS		17

/* NQ nfs numbers */
#define	NQNFSPROC_READDIRLOOK	18
#define	NQNFSPROC_GETLEASE	19
#define	NQNFSPROC_VACATED	20
#define	NQNFSPROC_EVICTED	21
#define	NQNFSPROC_ACCESS	22

#define	NFS_NPROCS		23
/* Conversion macros */
extern int		vttoif_tab[];
#define	vtonfs_mode(t,m) \
		txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : \
				MAKEIMODE((t), (m)))
#define	nfstov_mode(a)	(fxdr_unsigned(u_short, (a))&07777)
#define	vtonfs_type(a)	txdr_unsigned(nfs_type[((int32_t)(a))])
#define	nfstov_type(a)	ntov_type[fxdr_unsigned(u_int32_t,(a))&0x7]

/* File types */
typedef enum {
    NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5
} tcpdump_nfstype;

/* Structs for common parts of the rpc's */
struct nfsv2_time {
	u_int32_t nfs_sec;
	u_int32_t nfs_usec;
};

struct nqnfs_time {
	u_int32_t nq_sec;
	u_int32_t nq_nsec;
};

/*
 * File attributes and setable attributes. These structures cover both
 * NFS version 2 and the NQNFS protocol. Note that the union is only
 * used to that one pointer can refer to both variants. These structures
 * go out on the wire and must be densely packed, so no quad data types
 * are used. (all fields are int32_t or u_int32_t's or structures of same)
 * NB: You can't do sizeof(struct nfsv2_fattr), you must use the
 *     NFSX_FATTR(isnq) macro.
 */
struct nfsv2_fattr {
	u_int32_t fa_type;
	u_int32_t fa_mode;
	u_int32_t fa_nlink;
	u_int32_t fa_uid;
	u_int32_t fa_gid;
	union {
		struct {
			u_int32_t nfsfa_size;
			u_int32_t nfsfa_blocksize;
			u_int32_t nfsfa_rdev;
			u_int32_t nfsfa_blocks;
			u_int32_t nfsfa_fsid;
			u_int32_t nfsfa_fileid;
			struct nfsv2_time nfsfa_atime;
			struct nfsv2_time nfsfa_mtime;
			struct nfsv2_time nfsfa_ctime;
		} fa_nfsv2;
		struct {
			struct {
				u_int32_t nqfa_qsize[2];
			} nqfa_size;
			u_int32_t nqfa_blocksize;
			u_int32_t nqfa_rdev;
			struct {
				u_int32_t	nqfa_qbytes[2];
			} nqfa_bytes;
			u_int32_t nqfa_fsid;
			u_int32_t nqfa_fileid;
			struct nqnfs_time nqfa_atime;
			struct nqnfs_time nqfa_mtime;
			struct nqnfs_time nqfa_ctime;
			u_int32_t nqfa_flags;
			u_int32_t nqfa_gen;
			struct {
				u_int32_t nqfa_qfilerev[2];
			} nqfa_filerev;
		} fa_nqnfs;
	} fa_un;
};

/* and some ugly defines for accessing union components */
#define	fa_nfssize		fa_un.fa_nfsv2.nfsfa_size
#define	fa_nfsblocksize		fa_un.fa_nfsv2.nfsfa_blocksize
#define	fa_nfsrdev		fa_un.fa_nfsv2.nfsfa_rdev
#define	fa_nfsblocks		fa_un.fa_nfsv2.nfsfa_blocks
#define	fa_nfsfsid		fa_un.fa_nfsv2.nfsfa_fsid
#define	fa_nfsfileid		fa_un.fa_nfsv2.nfsfa_fileid
#define	fa_nfsatime		fa_un.fa_nfsv2.nfsfa_atime
#define	fa_nfsmtime		fa_un.fa_nfsv2.nfsfa_mtime
#define	fa_nfsctime		fa_un.fa_nfsv2.nfsfa_ctime
#define	fa_nqsize		fa_un.fa_nqnfs.nqfa_size
#define	fa_nqblocksize		fa_un.fa_nqnfs.nqfa_blocksize
#define	fa_nqrdev		fa_un.fa_nqnfs.nqfa_rdev
#define	fa_nqbytes		fa_un.fa_nqnfs.nqfa_bytes
#define	fa_nqfsid		fa_un.fa_nqnfs.nqfa_fsid
#define	fa_nqfileid		fa_un.fa_nqnfs.nqfa_fileid
#define	fa_nqatime		fa_un.fa_nqnfs.nqfa_atime
#define	fa_nqmtime		fa_un.fa_nqnfs.nqfa_mtime
#define	fa_nqctime		fa_un.fa_nqnfs.nqfa_ctime
#define	fa_nqflags		fa_un.fa_nqnfs.nqfa_flags
#define	fa_nqgen		fa_un.fa_nqnfs.nqfa_gen
#define	fa_nqfilerev		fa_un.fa_nqnfs.nqfa_filerev

struct nfsv2_sattr {
	u_int32_t sa_mode;
	u_int32_t sa_uid;
	u_int32_t sa_gid;
	union {
		struct {
			u_int32_t nfssa_size;
			struct nfsv2_time nfssa_atime;
			struct nfsv2_time nfssa_mtime;
		} sa_nfsv2;
		struct {
			struct {
				u_int32_t nqsa_qsize[2];
			} nqsa_size;
			struct nqnfs_time nqsa_atime;
			struct nqnfs_time nqsa_mtime;
			u_int32_t nqsa_flags;
			u_int32_t nqsa_rdev;
		} sa_nqnfs;
	} sa_un;
};

/* and some ugly defines for accessing the unions */
#define	sa_nfssize		sa_un.sa_nfsv2.nfssa_size
#define	sa_nfsatime		sa_un.sa_nfsv2.nfssa_atime
#define	sa_nfsmtime		sa_un.sa_nfsv2.nfssa_mtime
#define	sa_nqsize		sa_un.sa_nqnfs.nqsa_size
#define	sa_nqatime		sa_un.sa_nqnfs.nqsa_atime
#define	sa_nqmtime		sa_un.sa_nqnfs.nqsa_mtime
#define	sa_nqflags		sa_un.sa_nqnfs.nqsa_flags
#define	sa_nqrdev		sa_un.sa_nqnfs.nqsa_rdev

struct nfsv2_statfs {
	u_int32_t sf_tsize;
	u_int32_t sf_bsize;
	u_int32_t sf_blocks;
	u_int32_t sf_bfree;
	u_int32_t sf_bavail;
	u_int32_t sf_files;	/* Nqnfs only */
	u_int32_t sf_ffree;	/* ditto      */
};