1 1.81 riastrad /* $NetBSD: nfs.h,v 1.81 2024/12/07 02:05:55 riastradh Exp $ */ 2 1.1 mycroft /* 3 1.10 fvdl * Copyright (c) 1989, 1993, 1995 4 1.3 mycroft * The Regents of the University of California. All rights reserved. 5 1.1 mycroft * 6 1.1 mycroft * This code is derived from software contributed to Berkeley by 7 1.1 mycroft * Rick Macklem at The University of Guelph. 8 1.1 mycroft * 9 1.1 mycroft * Redistribution and use in source and binary forms, with or without 10 1.1 mycroft * modification, are permitted provided that the following conditions 11 1.1 mycroft * are met: 12 1.1 mycroft * 1. Redistributions of source code must retain the above copyright 13 1.1 mycroft * notice, this list of conditions and the following disclaimer. 14 1.1 mycroft * 2. Redistributions in binary form must reproduce the above copyright 15 1.1 mycroft * notice, this list of conditions and the following disclaimer in the 16 1.1 mycroft * documentation and/or other materials provided with the distribution. 17 1.40 agc * 3. Neither the name of the University nor the names of its contributors 18 1.1 mycroft * may be used to endorse or promote products derived from this software 19 1.1 mycroft * without specific prior written permission. 20 1.1 mycroft * 21 1.1 mycroft * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 1.1 mycroft * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 1.1 mycroft * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 1.1 mycroft * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 1.1 mycroft * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 1.1 mycroft * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 1.1 mycroft * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 1.1 mycroft * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 1.1 mycroft * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 1.1 mycroft * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 1.1 mycroft * SUCH DAMAGE. 32 1.1 mycroft * 33 1.10 fvdl * @(#)nfs.h 8.4 (Berkeley) 5/1/95 34 1.1 mycroft */ 35 1.1 mycroft 36 1.10 fvdl #ifndef _NFS_NFS_H_ 37 1.10 fvdl #define _NFS_NFS_H_ 38 1.67 yamt 39 1.66 dogcow #ifdef _KERNEL 40 1.66 dogcow #include <sys/condvar.h> 41 1.67 yamt #include <sys/fstypes.h> 42 1.67 yamt #include <sys/mbuf.h> 43 1.67 yamt #include <sys/mutex.h> 44 1.77 riastrad #include <sys/rbtree.h> 45 1.66 dogcow #endif 46 1.10 fvdl 47 1.81 riastrad #include <nfs/rpcv2.h> 48 1.81 riastrad 49 1.1 mycroft /* 50 1.1 mycroft * Tunable constants for nfs 51 1.1 mycroft */ 52 1.1 mycroft 53 1.1 mycroft #define NFS_MAXIOVEC 34 54 1.10 fvdl #define NFS_TICKINTVL 5 /* Desired time for a tick (msec) */ 55 1.10 fvdl #define NFS_HZ (hz / nfs_ticks) /* Ticks/sec */ 56 1.14 fvdl #define NFS_TIMEO (3 * NFS_HZ) /* Default timeout = 3 seconds */ 57 1.10 fvdl #define NFS_MINTIMEO (1 * NFS_HZ) /* Min timeout to use */ 58 1.10 fvdl #define NFS_MAXTIMEO (60 * NFS_HZ) /* Max timeout to backoff to */ 59 1.10 fvdl #define NFS_MINIDEMTIMEO (5 * NFS_HZ) /* Min timeout for non-idempotent ops*/ 60 1.1 mycroft #define NFS_MAXREXMIT 100 /* Stop counting after this many */ 61 1.1 mycroft #define NFS_MAXWINDOW 1024 /* Max number of outstanding requests */ 62 1.1 mycroft #define NFS_RETRANS 10 /* Num of retrans for soft mounts */ 63 1.3 mycroft #define NFS_MAXGRPS 16 /* Max. size of groups list */ 64 1.10 fvdl #ifndef NFS_MINATTRTIMO 65 1.3 mycroft #define NFS_MINATTRTIMO 5 /* Attribute cache timeout in sec */ 66 1.10 fvdl #endif 67 1.10 fvdl #ifndef NFS_MAXATTRTIMO 68 1.3 mycroft #define NFS_MAXATTRTIMO 60 69 1.10 fvdl #endif 70 1.41 yamt #define NFS_TRYLATERDEL 1 /* Initial try later delay (sec) */ 71 1.41 yamt #define NFS_TRYLATERDELMAX (1*60) /* Maximum try later delay (sec) */ 72 1.41 yamt #define NFS_TRYLATERDELMUL 2 /* Exponential backoff multiplier */ 73 1.27 fvdl 74 1.81 riastrad #define NFS_CWNDSCALE 256 75 1.81 riastrad #define NFS_MAXCWND (NFS_CWNDSCALE * 32) 76 1.72 pooka 77 1.27 fvdl /* 78 1.27 fvdl * These can be overridden through <machine/param.h>, included via 79 1.27 fvdl * <sys/param.h>. This means that <sys/param.h> should always be 80 1.27 fvdl * included before this file. 81 1.27 fvdl */ 82 1.26 matt #ifndef NFS_WSIZE 83 1.27 fvdl #define NFS_WSIZE 8192 /* Def. write data size */ 84 1.26 matt #endif 85 1.26 matt #ifndef NFS_RSIZE 86 1.27 fvdl #define NFS_RSIZE 8192 /* Def. read data size */ 87 1.26 matt #endif 88 1.27 fvdl #ifndef NFS_READDIRSIZE 89 1.10 fvdl #define NFS_READDIRSIZE 8192 /* Def. readdir size */ 90 1.27 fvdl #endif 91 1.27 fvdl 92 1.43 jonathan /* 93 1.43 jonathan * NFS client IO daemon threads. May be overridden by config options. 94 1.43 jonathan */ 95 1.43 jonathan #ifndef NFS_MAXASYNCDAEMON 96 1.80 msaitoh #define NFS_MAXASYNCDAEMON 128 /* Max. number async_daemons runnable */ 97 1.43 jonathan #endif 98 1.43 jonathan 99 1.43 jonathan /* 100 1.43 jonathan * NFS client read-ahead. May be overridden by config options. 101 1.43 jonathan * Should be no more than NFS_MAXASYNCDAEMON as each read-ahead operation 102 1.43 jonathan * requires one IO thread. 103 1.43 jonathan */ 104 1.43 jonathan #ifndef NFS_MAXRAHEAD 105 1.43 jonathan #define NFS_MAXRAHEAD 32 /* Max. read ahead # blocks */ 106 1.43 jonathan #endif 107 1.24 fvdl #define NFS_DEFRAHEAD 2 /* Def. read ahead # blocks */ 108 1.43 jonathan 109 1.3 mycroft #define NFS_MAXUIDHASH 64 /* Max. # of hashed uid entries/mp */ 110 1.43 jonathan 111 1.61 yamt #define NFS_DEFDEADTHRESH NFS_NEVERDEAD /* Default nm_deadthresh */ 112 1.61 yamt #define NFS_NEVERDEAD 9 /* Greater than max. nm_timeouts */ 113 1.61 yamt 114 1.21 tsarna #ifdef _KERNEL 115 1.21 tsarna extern int nfs_niothreads; /* Number of async_daemons desired */ 116 1.29 gmcgarry #ifndef NFS_DEFAULT_NIOTHREADS 117 1.29 gmcgarry #define NFS_DEFAULT_NIOTHREADS 4 118 1.29 gmcgarry #endif 119 1.21 tsarna #endif 120 1.10 fvdl #define NFS_MAXGATHERDELAY 100 /* Max. write gather delay (msec) */ 121 1.10 fvdl #ifndef NFS_GATHERDELAY 122 1.10 fvdl #define NFS_GATHERDELAY 10 /* Default write gather delay (msec) */ 123 1.10 fvdl #endif 124 1.16 fvdl 125 1.10 fvdl /* 126 1.16 fvdl * NFS_DIRBLKSIZ is the size of buffers in the buffer cache used for 127 1.16 fvdl * NFS directory vnodes. NFS_DIRFRAGSIZ is the minimum aligned amount 128 1.16 fvdl * of data in those buffers, and thus the minimum amount of data 129 1.16 fvdl * that you can request. NFS_DIRFRAGSIZ should be no smaller than 130 1.16 fvdl * DIRBLKSIZ. 131 1.10 fvdl */ 132 1.16 fvdl 133 1.16 fvdl #define NFS_DIRBLKSIZ 8192 /* Must be a multiple of DIRBLKSIZ */ 134 1.16 fvdl #define NFS_DIRFRAGSIZ 512 /* Same as DIRBLKSIZ, generally */ 135 1.16 fvdl 136 1.16 fvdl /* 137 1.16 fvdl * Maximum number of directory entries cached per NFS node, to avoid 138 1.16 fvdl * having this grow without bounds on very large directories. The 139 1.16 fvdl * minimum size to get reasonable performance for emulated binaries 140 1.16 fvdl * is the maximum number of entries that fits in NFS_DIRBLKSIZ. 141 1.16 fvdl * For NFS_DIRBLKSIZ = 512, this would be 512 / 14 = 36. 142 1.16 fvdl */ 143 1.16 fvdl #define NFS_MAXDIRCACHE (NFS_DIRBLKSIZ / 14) 144 1.10 fvdl 145 1.10 fvdl /* 146 1.10 fvdl * Oddballs 147 1.10 fvdl */ 148 1.10 fvdl #define NFS_CMPFH(n, f, s) \ 149 1.63 christos ((n)->n_fhsize == (s) && !memcmp((void *)(n)->n_fhp, (void *)(f), (s))) 150 1.23 bjh21 #ifdef NFS_V2_ONLY 151 1.23 bjh21 #define NFS_ISV3(v) (0) 152 1.23 bjh21 #else 153 1.10 fvdl #define NFS_ISV3(v) (VFSTONFS((v)->v_mount)->nm_flag & NFSMNT_NFSV3) 154 1.23 bjh21 #endif 155 1.10 fvdl #define NFS_SRVMAXDATA(n) \ 156 1.10 fvdl (((n)->nd_flag & ND_NFSV3) ? (((n)->nd_nam2) ? \ 157 1.10 fvdl NFS_MAXDGRAMDATA : NFS_MAXDATA) : NFS_V2MAXDATA) 158 1.10 fvdl 159 1.10 fvdl /* 160 1.25 chs * Use the vm_page flag reserved for pager use to indicate pages 161 1.25 chs * which have been written to the server but not yet committed. 162 1.10 fvdl */ 163 1.25 chs #define PG_NEEDCOMMIT PG_PAGER1 164 1.10 fvdl 165 1.10 fvdl /* 166 1.10 fvdl * The IO_METASYNC flag should be implemented for local file systems. 167 1.10 fvdl * (Until then, it is nothin at all.) 168 1.10 fvdl */ 169 1.10 fvdl #ifndef IO_METASYNC 170 1.10 fvdl #define IO_METASYNC 0 171 1.10 fvdl #endif 172 1.1 mycroft 173 1.1 mycroft /* 174 1.50 jmmv * Export arguments for local filesystem mount calls. 175 1.50 jmmv * Keep in mind that changing this structure modifies nfssvc(2)'s ABI (see 176 1.50 jmmv * 'struct mountd_exports_list' below). 177 1.51 jmmv * When modifying this structure, take care to also edit the 178 1.51 jmmv * nfs_update_exports_30 function in nfs_export.c accordingly to convert 179 1.51 jmmv * export_args to export_args30. 180 1.50 jmmv */ 181 1.50 jmmv struct export_args { 182 1.50 jmmv int ex_flags; /* export related flags */ 183 1.50 jmmv uid_t ex_root; /* mapping for root uid */ 184 1.50 jmmv struct uucred ex_anon; /* mapping for anonymous user */ 185 1.50 jmmv struct sockaddr *ex_addr; /* net address to which exported */ 186 1.50 jmmv int ex_addrlen; /* and the net address length */ 187 1.50 jmmv struct sockaddr *ex_mask; /* mask of valid bits in saddr */ 188 1.50 jmmv int ex_masklen; /* and the smask length */ 189 1.50 jmmv char *ex_indexfile; /* index file for WebNFS URLs */ 190 1.50 jmmv }; 191 1.50 jmmv 192 1.50 jmmv /* 193 1.50 jmmv * Structures for the nfssvc(2) syscall. Not that anyone but mountd, nfsd and 194 1.50 jmmv * mount_nfs should ever try and use it. 195 1.3 mycroft */ 196 1.3 mycroft struct nfsd_args { 197 1.3 mycroft int sock; /* Socket to serve */ 198 1.63 christos void * name; /* Client addr for connection based sockets */ 199 1.3 mycroft int namelen; /* Length of name */ 200 1.3 mycroft }; 201 1.3 mycroft 202 1.3 mycroft struct nfsd_srvargs { 203 1.3 mycroft struct nfsd *nsd_nfsd; /* Pointer to in kernel nfsd struct */ 204 1.3 mycroft uid_t nsd_uid; /* Effective uid mapped to cred */ 205 1.9 cgd u_int32_t nsd_haddr; /* Ip address of client */ 206 1.32 christos struct uucred nsd_cr; /* Cred. uid maps to */ 207 1.3 mycroft int nsd_authlen; /* Length of auth string (ret) */ 208 1.10 fvdl u_char *nsd_authstr; /* Auth string (ret) */ 209 1.10 fvdl int nsd_verflen; /* and the verfier */ 210 1.10 fvdl u_char *nsd_verfstr; 211 1.10 fvdl struct timeval nsd_timestamp; /* timestamp from verifier */ 212 1.10 fvdl u_int32_t nsd_ttl; /* credential ttl (sec) */ 213 1.10 fvdl NFSKERBKEY_T nsd_key; /* Session key */ 214 1.3 mycroft }; 215 1.3 mycroft 216 1.3 mycroft struct nfsd_cargs { 217 1.3 mycroft char *ncd_dirp; /* Mount dir path */ 218 1.3 mycroft uid_t ncd_authuid; /* Effective uid */ 219 1.3 mycroft int ncd_authtype; /* Type of authenticator */ 220 1.30 jdolecek u_int ncd_authlen; /* Length of authenticator string */ 221 1.10 fvdl u_char *ncd_authstr; /* Authenticator string */ 222 1.30 jdolecek u_int ncd_verflen; /* and the verifier */ 223 1.10 fvdl u_char *ncd_verfstr; 224 1.10 fvdl NFSKERBKEY_T ncd_key; /* Session key */ 225 1.3 mycroft }; 226 1.3 mycroft 227 1.50 jmmv struct mountd_exports_list { 228 1.50 jmmv const char *mel_path; 229 1.50 jmmv size_t mel_nexports; 230 1.50 jmmv struct export_args *mel_exports; 231 1.50 jmmv }; 232 1.50 jmmv 233 1.3 mycroft /* 234 1.61 yamt * try to keep nfsstats, which is exposed to userland via sysctl, 235 1.61 yamt * compatible after NQNFS removal. 236 1.61 yamt * 26 is the old value of NFS_NPROCS, which includes NQNFS procedures. 237 1.61 yamt */ 238 1.61 yamt #define NFSSTATS_NPROCS 26 239 1.61 yamt 240 1.61 yamt /* 241 1.3 mycroft * Stats structure 242 1.3 mycroft */ 243 1.3 mycroft struct nfsstats { 244 1.74 christos uint32_t attrcache_hits; 245 1.74 christos uint32_t attrcache_misses; 246 1.74 christos uint32_t lookupcache_hits; 247 1.74 christos uint32_t lookupcache_misses; 248 1.74 christos uint32_t direofcache_hits; 249 1.74 christos uint32_t direofcache_misses; 250 1.74 christos uint32_t biocache_reads; 251 1.74 christos uint32_t read_bios; 252 1.74 christos uint32_t read_physios; 253 1.74 christos uint32_t biocache_writes; 254 1.74 christos uint32_t write_bios; 255 1.74 christos uint32_t write_physios; 256 1.74 christos uint32_t biocache_readlinks; 257 1.74 christos uint32_t readlink_bios; 258 1.74 christos uint32_t biocache_readdirs; 259 1.74 christos uint32_t readdir_bios; 260 1.74 christos uint32_t rpccnt[NFSSTATS_NPROCS]; 261 1.74 christos uint32_t rpcretries; 262 1.74 christos uint32_t srvrpccnt[NFSSTATS_NPROCS]; 263 1.74 christos uint32_t srvrpc_errs; 264 1.74 christos uint32_t srv_errs; 265 1.74 christos uint32_t rpcrequests; 266 1.74 christos uint32_t rpctimeouts; 267 1.74 christos uint32_t rpcunexpected; 268 1.74 christos uint32_t rpcinvalid; 269 1.74 christos uint32_t srvcache_inproghits; 270 1.74 christos uint32_t srvcache_idemdonehits; 271 1.74 christos uint32_t srvcache_nonidemdonehits; 272 1.74 christos uint32_t srvcache_misses; 273 1.74 christos uint32_t __srvnqnfs_leases; /* unused */ 274 1.74 christos uint32_t __srvnqnfs_maxleases; /* unused */ 275 1.74 christos uint32_t __srvnqnfs_getleases; /* unused */ 276 1.74 christos uint32_t srvvop_writes; 277 1.3 mycroft }; 278 1.3 mycroft 279 1.3 mycroft /* 280 1.3 mycroft * Flags for nfssvc() system call. 281 1.3 mycroft */ 282 1.3 mycroft #define NFSSVC_BIOD 0x002 283 1.3 mycroft #define NFSSVC_NFSD 0x004 284 1.3 mycroft #define NFSSVC_ADDSOCK 0x008 285 1.3 mycroft #define NFSSVC_AUTHIN 0x010 286 1.3 mycroft #define NFSSVC_GOTAUTH 0x040 287 1.3 mycroft #define NFSSVC_AUTHINFAIL 0x080 288 1.3 mycroft #define NFSSVC_MNTD 0x100 289 1.50 jmmv #define NFSSVC_SETEXPORTSLIST 0x200 290 1.79 hannken #define NFSSVC_REPLACEEXPORTSLIST 0x400 291 1.3 mycroft 292 1.3 mycroft /* 293 1.10 fvdl * fs.nfs sysctl(3) identifiers 294 1.10 fvdl */ 295 1.10 fvdl #define NFS_NFSSTATS 1 /* struct: struct nfsstats */ 296 1.21 tsarna #define NFS_IOTHREADS 2 /* number of io threads */ 297 1.10 fvdl 298 1.10 fvdl /* 299 1.1 mycroft * The set of signals the interrupt an I/O in progress for NFSMNT_INT mounts. 300 1.1 mycroft * What should be in this set is open to debate, but I believe that since 301 1.1 mycroft * I/O system calls on ufs are never interrupted by signals the set should 302 1.1 mycroft * be minimal. My reasoning is that many current programs that use signals 303 1.1 mycroft * such as SIGALRM will not expect file I/O system calls to be interrupted 304 1.1 mycroft * by them and break. 305 1.1 mycroft */ 306 1.8 jtc #ifdef _KERNEL 307 1.10 fvdl 308 1.10 fvdl struct uio; struct buf; struct vattr; struct nameidata; /* XXX */ 309 1.1 mycroft 310 1.1 mycroft /* 311 1.1 mycroft * Socket errors ignored for connectionless sockets?? 312 1.1 mycroft * For now, ignore them all 313 1.1 mycroft */ 314 1.1 mycroft #define NFSIGNORE_SOERROR(s, e) \ 315 1.1 mycroft ((e) != EINTR && (e) != ERESTART && (e) != EWOULDBLOCK && \ 316 1.1 mycroft ((s) & PR_CONNREQUIRED) == 0) 317 1.1 mycroft 318 1.1 mycroft /* 319 1.1 mycroft * Nfs outstanding request list element 320 1.1 mycroft */ 321 1.1 mycroft struct nfsreq { 322 1.5 mycroft TAILQ_ENTRY(nfsreq) r_chain; 323 1.1 mycroft struct mbuf *r_mreq; 324 1.1 mycroft struct mbuf *r_mrep; 325 1.3 mycroft struct mbuf *r_md; 326 1.63 christos void * r_dpos; 327 1.1 mycroft struct nfsmount *r_nmp; 328 1.9 cgd u_int32_t r_xid; 329 1.3 mycroft int r_flags; /* flags on request, see below */ 330 1.3 mycroft int r_retry; /* max retransmission count */ 331 1.3 mycroft int r_rexmit; /* current retrans count */ 332 1.14 fvdl u_int32_t r_procnum; /* NFS procedure number */ 333 1.3 mycroft int r_rtt; /* RTT for rpc */ 334 1.52 christos struct lwp *r_lwp; /* LWP that did I/O system call */ 335 1.1 mycroft }; 336 1.5 mycroft 337 1.5 mycroft /* 338 1.5 mycroft * Queue head for nfsreq's 339 1.5 mycroft */ 340 1.33 matt extern TAILQ_HEAD(nfsreqhead, nfsreq) nfs_reqq; 341 1.76 christos extern kmutex_t nfs_reqq_lock; 342 1.1 mycroft 343 1.1 mycroft /* Flag values for r_flags */ 344 1.1 mycroft #define R_TIMING 0x01 /* timing request (in mntp) */ 345 1.1 mycroft #define R_SENT 0x02 /* request has been sent */ 346 1.1 mycroft #define R_SOFTTERM 0x04 /* soft mnt, too many retries */ 347 1.1 mycroft #define R_INTR 0x08 /* intr mnt, signal pending */ 348 1.1 mycroft #define R_SOCKERR 0x10 /* Fatal error on socket */ 349 1.1 mycroft #define R_TPRINTFMSG 0x20 /* Did a tprintf msg. */ 350 1.1 mycroft #define R_MUSTRESEND 0x40 /* Must resend request */ 351 1.45 yamt #define R_REXMITTED 0x100 /* retransmitted after reconnect */ 352 1.3 mycroft 353 1.1 mycroft /* 354 1.3 mycroft * A list of nfssvc_sock structures is maintained with all the sockets 355 1.3 mycroft * that require service by the nfsd. 356 1.3 mycroft * The nfsuid structs hang off of the nfssvc_sock structs in both lru 357 1.3 mycroft * and uid hash lists. 358 1.1 mycroft */ 359 1.10 fvdl #ifndef NFS_UIDHASHSIZ 360 1.10 fvdl #define NFS_UIDHASHSIZ 29 /* Tune the size of nfssvc_sock with this */ 361 1.10 fvdl #endif 362 1.6 mycroft #define NUIDHASH(sock, uid) \ 363 1.10 fvdl (&(sock)->ns_uidhashtbl[(uid) % NFS_UIDHASHSIZ]) 364 1.10 fvdl #ifndef NFS_WDELAYHASHSIZ 365 1.10 fvdl #define NFS_WDELAYHASHSIZ 16 /* and with this */ 366 1.10 fvdl #endif 367 1.10 fvdl #ifndef NFS_MUIDHASHSIZ 368 1.12 thorpej #define NFS_MUIDHASHSIZ 63 /* Tune the size of nfsmount with this */ 369 1.10 fvdl #endif 370 1.10 fvdl #define NMUIDHASH(nmp, uid) \ 371 1.10 fvdl (&(nmp)->nm_uidhashtbl[(uid) % NFS_MUIDHASHSIZ]) 372 1.16 fvdl 373 1.16 fvdl #ifndef NFS_DIRHASHSIZ 374 1.17 fvdl #define NFS_DIRHASHSIZ 64 375 1.16 fvdl #endif 376 1.16 fvdl #define NFSDIRHASH(np, off) \ 377 1.16 fvdl (&np->n_dircache[(nfs_dirhash((off)) & nfsdirhashmask)]) 378 1.16 fvdl 379 1.16 fvdl /* 380 1.16 fvdl * Macros for storing/retrieving cookies into directory buffers. 381 1.16 fvdl */ 382 1.16 fvdl #define NFS_STASHCOOKIE(dp,off) \ 383 1.63 christos *((off_t *)((char *)(dp) + (dp)->d_reclen - sizeof (off_t))) = off 384 1.16 fvdl #define NFS_GETCOOKIE(dp) \ 385 1.63 christos (*((off_t *)((char *)(dp) + (dp)->d_reclen - sizeof (off_t)))) 386 1.17 fvdl #define NFS_STASHCOOKIE32(dp, val) \ 387 1.63 christos *((u_int32_t *)((char *)(dp) + (dp)->d_reclen - sizeof (off_t) - \ 388 1.16 fvdl sizeof (int))) = val 389 1.17 fvdl #define NFS_GETCOOKIE32(dp) \ 390 1.63 christos (*((u_int32_t *)((char *)(dp) + (dp)->d_reclen - sizeof (off_t) - \ 391 1.16 fvdl sizeof (int)))) 392 1.16 fvdl 393 1.16 fvdl /* 394 1.16 fvdl * Flags passed to nfs_bioread(). 395 1.16 fvdl */ 396 1.16 fvdl #define NFSBIO_CACHECOOKIES 0x0001 /* Cache dir offset cookies */ 397 1.1 mycroft 398 1.1 mycroft /* 399 1.3 mycroft * Network address hash list element 400 1.1 mycroft */ 401 1.3 mycroft union nethostaddr { 402 1.9 cgd u_int32_t had_inetaddr; 403 1.3 mycroft struct mbuf *had_nam; 404 1.3 mycroft }; 405 1.3 mycroft 406 1.3 mycroft struct nfsuid { 407 1.6 mycroft TAILQ_ENTRY(nfsuid) nu_lru; /* LRU chain */ 408 1.6 mycroft LIST_ENTRY(nfsuid) nu_hash; /* Hash list */ 409 1.3 mycroft int nu_flag; /* Flags */ 410 1.3 mycroft union nethostaddr nu_haddr; /* Host addr. for dgram sockets */ 411 1.56 elad kauth_cred_t nu_cr; /* Cred uid mapped to */ 412 1.10 fvdl int nu_expire; /* Expiry time (sec) */ 413 1.10 fvdl struct timeval nu_timestamp; /* Kerb. timestamp */ 414 1.10 fvdl u_int32_t nu_nickname; /* Nickname on server */ 415 1.10 fvdl NFSKERBKEY_T nu_key; /* and session key */ 416 1.3 mycroft }; 417 1.3 mycroft 418 1.3 mycroft #define nu_inetaddr nu_haddr.had_inetaddr 419 1.3 mycroft #define nu_nam nu_haddr.had_nam 420 1.3 mycroft /* Bits for nu_flag */ 421 1.3 mycroft #define NU_INETADDR 0x1 422 1.10 fvdl #define NU_NAM 0x2 423 1.22 fvdl #define NU_NETFAM(u) \ 424 1.73 joerg (((u)->nu_flag & NU_INETADDR) ? AF_INET : AF_INET6) 425 1.3 mycroft 426 1.69 yamt /* 427 1.69 yamt * b: protected by SLP_BUSY 428 1.69 yamt * g: protected by nfsd_lock 429 1.69 yamt * s: protected by ns_lock 430 1.69 yamt * a: protected by ns_alock 431 1.69 yamt */ 432 1.69 yamt 433 1.3 mycroft struct nfssvc_sock { 434 1.65 yamt kmutex_t ns_lock; 435 1.69 yamt kmutex_t ns_alock; 436 1.69 yamt kcondvar_t ns_cv; /* s: */ 437 1.69 yamt TAILQ_ENTRY(nfssvc_sock) ns_chain; /* g: List of all nfssvc_sock */ 438 1.69 yamt TAILQ_ENTRY(nfssvc_sock) ns_pending; /* g: List of pending sockets */ 439 1.7 mycroft TAILQ_HEAD(, nfsuid) ns_uidlruhead; 440 1.3 mycroft struct file *ns_fp; 441 1.3 mycroft struct socket *ns_so; 442 1.3 mycroft struct mbuf *ns_nam; 443 1.69 yamt struct mbuf *ns_raw; /* b: */ 444 1.69 yamt struct mbuf *ns_rawend; /* b: */ 445 1.69 yamt struct mbuf *ns_rec; /* b: */ 446 1.69 yamt struct mbuf *ns_recend; /* b: */ 447 1.69 yamt struct mbuf *ns_frag; /* b: */ 448 1.69 yamt int ns_flags; /* s: */ 449 1.69 yamt int ns_aflags; /* a: */ 450 1.69 yamt int ns_gflags; /* g: */ 451 1.69 yamt int ns_sflags; /* b: */ 452 1.69 yamt int ns_cc; /* b: */ 453 1.69 yamt int ns_reclen; /* b: */ 454 1.3 mycroft int ns_numuids; 455 1.69 yamt u_int32_t ns_sref; /* g: */ 456 1.69 yamt SIMPLEQ_HEAD(, nfsrv_descript) ns_sendq; /* s: send reply list */ 457 1.69 yamt LIST_HEAD(, nfsrv_descript) ns_tq; /* g: Write gather lists */ 458 1.10 fvdl LIST_HEAD(, nfsuid) ns_uidhashtbl[NFS_UIDHASHSIZ]; 459 1.69 yamt LIST_HEAD(nfsrvw_delayhash, nfsrv_descript) ns_wdelayhashtbl[NFS_WDELAYHASHSIZ]; /* g: */ 460 1.1 mycroft }; 461 1.1 mycroft 462 1.69 yamt /* Bits for "ns_flags" */ 463 1.3 mycroft #define SLP_VALID 0x01 464 1.53 yamt #define SLP_BUSY 0x10 465 1.54 yamt #define SLP_SENDING 0x80 466 1.3 mycroft 467 1.69 yamt /* Bits for "ns_aflags" */ 468 1.69 yamt #define SLP_A_NEEDQ 0x01 469 1.69 yamt #define SLP_A_DISCONN 0x04 470 1.69 yamt 471 1.69 yamt /* Bits for "ns_gflags" */ 472 1.69 yamt #define SLP_G_DOREC 0x02 /* on nfssvc_sockpending queue */ 473 1.69 yamt 474 1.69 yamt /* Bits for "ns_sflags" */ 475 1.69 yamt #define SLP_S_LASTFRAG 0x40 476 1.69 yamt 477 1.33 matt extern TAILQ_HEAD(nfssvc_sockhead, nfssvc_sock) nfssvc_sockhead; 478 1.37 yamt extern struct nfssvc_sockhead nfssvc_sockpending; 479 1.33 matt extern int nfssvc_sockhead_flag; 480 1.6 mycroft #define SLP_INIT 0x01 481 1.3 mycroft 482 1.3 mycroft /* 483 1.3 mycroft * One of these structures is allocated for each nfsd. 484 1.3 mycroft */ 485 1.3 mycroft struct nfsd { 486 1.77 riastrad struct rb_node nfsd_node; /* Tree of all nfsd's */ 487 1.37 yamt SLIST_ENTRY(nfsd) nfsd_idle; /* List of idle nfsd's */ 488 1.65 yamt kcondvar_t nfsd_cv; 489 1.10 fvdl int nfsd_flag; /* NFSD_ flags */ 490 1.10 fvdl struct nfssvc_sock *nfsd_slp; /* Current socket */ 491 1.10 fvdl int nfsd_authlen; /* Authenticator len */ 492 1.10 fvdl u_char nfsd_authstr[RPCAUTH_MAXSIZ]; /* Authenticator data */ 493 1.10 fvdl int nfsd_verflen; /* and the Verifier */ 494 1.10 fvdl u_char nfsd_verfstr[RPCVERF_MAXSIZ]; 495 1.10 fvdl struct proc *nfsd_procp; /* Proc ptr */ 496 1.10 fvdl struct nfsrv_descript *nfsd_nd; /* Associated nfsrv_descript */ 497 1.77 riastrad uint32_t nfsd_cookie; /* Userland cookie, fits 32bit ptr */ 498 1.3 mycroft }; 499 1.1 mycroft 500 1.10 fvdl /* Bits for "nfsd_flag" */ 501 1.6 mycroft #define NFSD_NEEDAUTH 0x04 502 1.6 mycroft #define NFSD_AUTHFAIL 0x08 503 1.6 mycroft 504 1.59 yamt #define NFSD_MAXFHSIZE 64 505 1.59 yamt typedef struct nfsrvfh { 506 1.59 yamt size_t nsfh_size; 507 1.59 yamt union { 508 1.59 yamt fhandle_t u_fh; 509 1.59 yamt uint8_t u_opaque[NFSD_MAXFHSIZE]; 510 1.59 yamt } nsfh_u; 511 1.59 yamt } nfsrvfh_t; 512 1.59 yamt #define NFSRVFH_SIZE(nsfh) ((nsfh)->nsfh_size) 513 1.60 yamt #define NFSRVFH_DATA(nsfh) ((nsfh)->nsfh_u.u_opaque) 514 1.59 yamt #define NFSRVFH_FHANDLE(nsfh) (&(nsfh)->nsfh_u.u_fh) 515 1.59 yamt 516 1.10 fvdl /* 517 1.10 fvdl * This structure is used by the server for describing each request. 518 1.10 fvdl * Some fields are used only when write request gathering is performed. 519 1.10 fvdl */ 520 1.10 fvdl struct nfsrv_descript { 521 1.10 fvdl u_quad_t nd_time; /* Write deadline (usec) */ 522 1.10 fvdl off_t nd_off; /* Start byte offset */ 523 1.10 fvdl off_t nd_eoff; /* and end byte offset */ 524 1.10 fvdl LIST_ENTRY(nfsrv_descript) nd_hash; /* Hash list */ 525 1.10 fvdl LIST_ENTRY(nfsrv_descript) nd_tq; /* and timer list */ 526 1.10 fvdl LIST_HEAD(,nfsrv_descript) nd_coalesce; /* coalesced writes */ 527 1.54 yamt SIMPLEQ_ENTRY(nfsrv_descript) nd_sendq; /* send reply list */ 528 1.10 fvdl struct mbuf *nd_mrep; /* Request mbuf list */ 529 1.10 fvdl struct mbuf *nd_md; /* Current dissect mbuf */ 530 1.10 fvdl struct mbuf *nd_mreq; /* Reply mbuf list */ 531 1.10 fvdl struct mbuf *nd_nam; /* and socket addr */ 532 1.10 fvdl struct mbuf *nd_nam2; /* return socket addr */ 533 1.63 christos void * nd_dpos; /* Current dissect pos */ 534 1.14 fvdl u_int32_t nd_procnum; /* RPC # */ 535 1.10 fvdl int nd_stable; /* storage type */ 536 1.10 fvdl int nd_flag; /* nd_flag */ 537 1.10 fvdl int nd_len; /* Length of this write */ 538 1.10 fvdl int nd_repstat; /* Reply status */ 539 1.10 fvdl u_int32_t nd_retxid; /* Reply xid */ 540 1.10 fvdl u_int32_t nd_duration; /* Lease duration */ 541 1.10 fvdl struct timeval nd_starttime; /* Time RPC initiated */ 542 1.59 yamt nfsrvfh_t nd_fh; /* File handle */ 543 1.56 elad kauth_cred_t nd_cr; /* Credentials */ 544 1.10 fvdl }; 545 1.10 fvdl 546 1.10 fvdl /* Bits for "nd_flag" */ 547 1.75 riastrad #define ND_READ 0x01 /* Check lease for readers */ 548 1.75 riastrad #define ND_WRITE 0x02 /* Check lease for modifiers */ 549 1.10 fvdl #define ND_CHECK 0x04 550 1.10 fvdl #define ND_LEASE (ND_READ | ND_WRITE | ND_CHECK) 551 1.10 fvdl #define ND_NFSV3 0x08 552 1.10 fvdl #define ND_KERBNICK 0x20 553 1.10 fvdl #define ND_KERBFULL 0x40 554 1.10 fvdl #define ND_KERBAUTH (ND_KERBNICK | ND_KERBFULL) 555 1.10 fvdl 556 1.65 yamt extern kmutex_t nfsd_lock; 557 1.65 yamt extern kcondvar_t nfsd_initcv; 558 1.37 yamt extern SLIST_HEAD(nfsdidlehead, nfsd) nfsd_idle_head; 559 1.33 matt extern int nfsd_head_flag; 560 1.6 mycroft #define NFSD_CHECKSLP 0x01 561 1.33 matt 562 1.35 matt extern struct mowner nfs_mowner; 563 1.33 matt extern struct nfsstats nfsstats; 564 1.33 matt extern int nfs_numasync; 565 1.6 mycroft 566 1.10 fvdl /* 567 1.10 fvdl * These macros compare nfsrv_descript structures. 568 1.10 fvdl */ 569 1.10 fvdl #define NFSW_CONTIG(o, n) \ 570 1.10 fvdl ((o)->nd_eoff >= (n)->nd_off && \ 571 1.63 christos !memcmp((void *)&(o)->nd_fh, (void *)&(n)->nd_fh, NFSX_V3FH)) 572 1.10 fvdl 573 1.15 fvdl /* 574 1.15 fvdl * Defines for WebNFS 575 1.15 fvdl */ 576 1.15 fvdl 577 1.15 fvdl #define WEBNFS_ESC_CHAR '%' 578 1.15 fvdl #define WEBNFS_SPECCHAR_START 0x80 579 1.15 fvdl 580 1.15 fvdl #define WEBNFS_NATIVE_CHAR 0x80 581 1.15 fvdl /* 582 1.15 fvdl * .. 583 1.15 fvdl * Possibly more here in the future. 584 1.15 fvdl */ 585 1.15 fvdl 586 1.15 fvdl /* 587 1.15 fvdl * Macro for converting escape characters in WebNFS pathnames. 588 1.15 fvdl * Should really be in libkern. 589 1.15 fvdl */ 590 1.15 fvdl 591 1.15 fvdl #define HEXTOC(c) \ 592 1.15 fvdl ((c) >= 'a' ? ((c) - ('a' - 10)) : \ 593 1.15 fvdl ((c) >= 'A' ? ((c) - ('A' - 10)) : ((c) - '0'))) 594 1.15 fvdl #define HEXSTRTOI(p) \ 595 1.15 fvdl ((HEXTOC(p[0]) << 4) + HEXTOC(p[1])) 596 1.50 jmmv 597 1.50 jmmv /* 598 1.50 jmmv * Structure holding information for a publicly exported filesystem 599 1.50 jmmv * (WebNFS). Currently the specs allow just for one such filesystem. 600 1.50 jmmv */ 601 1.50 jmmv struct nfs_public { 602 1.50 jmmv int np_valid; /* Do we hold valid information */ 603 1.58 martin fhandle_t *np_handle; /* Filehandle for pub fs (internal) */ 604 1.50 jmmv struct mount *np_mount; /* Mountpoint of exported fs */ 605 1.50 jmmv char *np_index; /* Index file */ 606 1.50 jmmv }; 607 1.8 jtc #endif /* _KERNEL */ 608 1.10 fvdl 609 1.10 fvdl #endif /* _NFS_NFS_H */ 610