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