xref: /dragonfly/sys/vfs/nfs/nfs.h (revision 5b3b84424f6bfcb5eb06ad9dcd7a29cfd895a39e)
1 /*
2  * Copyright (c) 1989, 1993, 1995
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  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the University nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  *
32  *        @(#)nfs.h 8.4 (Berkeley) 5/1/95
33  * $FreeBSD: src/sys/nfs/nfs.h,v 1.53.2.5 2002/02/20 01:35:34 iedowse Exp $
34  */
35 
36 #ifndef _NFS_NFS_H_
37 #define _NFS_NFS_H_
38 
39 #ifdef _KERNEL
40 #include "opt_nfs.h"
41 #endif
42 
43 #include <sys/vnode.h>
44 #include <sys/mutex.h>
45 #include <sys/thread.h>
46 
47 /*
48  * Tunable constants for nfs
49  */
50 
51 #define   NFS_MAXIOVEC        34
52 #define NFS_TICKINTVL         200                 /* Desired time for a tick (msec) */
53 #define NFS_HZ                (hz / nfs_ticks) /* Ticks/sec */
54 #define   NFS_TIMEO (1 * NFS_HZ)        /* Default timeout = 1 second */
55 #define   NFS_MINTIMEO        (1 * NFS_HZ)        /* Min timeout to use */
56 #define   NFS_MAXTIMEO        (60 * NFS_HZ)       /* Max timeout to backoff to */
57 #define   NFS_MINIDEMTIMEO (5 * NFS_HZ) /* Min timeout for non-idempotent ops*/
58 #define   NFS_MAXREXMIT       100                 /* Stop counting after this many */
59 #define   NFS_MAXWINDOW       1024                /* Max number of outstanding requests */
60 #define   NFS_RETRANS         10                  /* Num of retrans for soft mounts */
61 #define   NFS_MAXGRPS         16                  /* Max. size of groups list */
62 #ifndef NFS_MINATTRTIMO
63 #define   NFS_MINATTRTIMO 3             /* VREG attrib cache timeout in sec */
64 #endif
65 #ifndef NFS_DEFATTRTIMO
66 #define   NFS_DEFATTRTIMO 10            /* VREG attrib cache timeout in sec */
67 #endif
68 #ifndef NFS_MAXATTRTIMO
69 #define   NFS_MAXATTRTIMO 60
70 #endif
71 #ifndef NFS_MINDIRATTRTIMO
72 #define   NFS_MINDIRATTRTIMO 30                   /* VDIR attrib cache timeout in sec */
73 #endif
74 #ifndef NFS_MAXDIRATTRTIMO
75 #define   NFS_MAXDIRATTRTIMO 60
76 #endif
77 #ifndef NFS_DEADTHRESH
78 #define NFS_DEADTHRESH        NFS_NEVERDEAD
79 #endif
80 #define NFS_NEVERDEAD         9
81 #define   NFS_WSIZE 8192                /* Def. write data size <= 8192 */
82 #define   NFS_RSIZE 8192                /* Def. read data size <= 8192 */
83 #define NFS_READDIRSIZE       8192                /* Def. readdir size */
84 #define   NFS_DEFRAHEAD       6                   /* Def. read ahead # blocks */
85 #define   NFS_MAXRAHEAD       32                  /* Max. read ahead # blocks */
86 #define   NFS_MAXASYNCBIO     64                  /* Max. asynchronous BIOs */
87 #define   NFS_MAXUIDHASH      64                  /* Max. # of hashed uid entries/mp */
88 #define NFS_MAXGATHERDELAY    100       /* Max. write gather delay (msec) */
89 #ifndef NFS_GATHERDELAY
90 #define NFS_GATHERDELAY                 20        /* Default write gather delay (msec) */
91 #endif
92 #define   NFS_DIRBLKSIZ       4096                /* Must be a multiple of DIRBLKSIZ */
93 #ifdef _KERNEL
94 #define   DIRBLKSIZ 512                 /* XXX we used to use ufs's DIRBLKSIZ */
95 #endif
96 
97 #define NFS_ASYSCALE                    256
98 #define NFS_MINASYNC_SCALED   (4 * NFS_ASYSCALE)
99 #define NFS_MAXASYNC_SCALED   (NFS_MAXASYNCBIO * NFS_ASYSCALE)
100 
101 /*
102  * Oddballs
103  */
104 #define   NMOD(a)             ((a) % nfs_asyncdaemons)
105 #define NFS_CMPFH(n, f, s) \
106           ((n)->n_fhsize == (s) && !bcmp((caddr_t)(n)->n_fhp, (caddr_t)(f), (s)))
107 #define NFS_ISV3(v) (VFSTONFS((v)->v_mount)->nm_flag & NFSMNT_NFSV3)
108 #define NFS_SRVMAXDATA(n) \
109                     (((n)->nd_flag & ND_NFSV3) ? (((n)->nd_nam2) ? \
110                      NFS_MAXDGRAMDATA : NFS_MAXDATA) : NFS_V2MAXDATA)
111 
112 /*
113  * The IO_METASYNC flag should be implemented for local file systems.
114  * (Until then, it is nothin at all.)
115  */
116 #ifndef IO_METASYNC
117 #define IO_METASYNC 0
118 #endif
119 
120 /*
121  * Arguments to mount NFS
122  */
123 #define NFS_ARGSVERSION       3                   /* change when nfs_args changes */
124 struct nfs_args {
125           int                 version;  /* args structure version number */
126           struct sockaddr     *addr;              /* file server address */
127           int                 addrlen;  /* length of address */
128           int                 sotype;             /* Socket type */
129           int                 proto;              /* and Protocol */
130           u_char              *fh;                /* File handle to be mounted */
131           int                 fhsize;             /* Size, in bytes, of fh */
132           int                 flags;              /* flags */
133           int                 wsize;              /* write size in bytes */
134           int                 rsize;              /* read size in bytes */
135           int                 readdirsize;        /* readdir size in bytes */
136           int                 timeo;              /* initial timeout in .1 secs */
137           int                 retrans;  /* times to retry send */
138           int                 maxgrouplist;       /* Max. size of group list */
139           int                 readahead;          /* # of blocks to readahead */
140           int                 unused01; /* Term (sec) of lease */
141           int                 deadthresh;         /* Retrans threshold */
142           char                *hostname;          /* server's name */
143           int                 acregmin; /* cache attrs for reg files min time */
144           int                 acregmax; /* cache attrs for reg files max time */
145           int                 acdirmin; /* cache attrs for dirs min time */
146           int                 acdirmax; /* cache attrs for dirs max time */
147 };
148 
149 /*
150  * NFS mount option flags
151  */
152 #define   NFSMNT_SOFT                   0x00000001  /* soft mount (hard is default) */
153 #define   NFSMNT_WSIZE                  0x00000002  /* set write size */
154 #define   NFSMNT_RSIZE                  0x00000004  /* set read size */
155 #define   NFSMNT_TIMEO                  0x00000008  /* set initial timeout */
156 #define   NFSMNT_RETRANS                0x00000010  /* set number of request retries */
157 #define   NFSMNT_MAXGRPS                0x00000020  /* set maximum grouplist size */
158 #define   NFSMNT_INT                    0x00000040  /* allow interrupts on hard mount */
159 #define   NFSMNT_NOCONN                 0x00000080  /* Don't Connect the socket */
160 #define   NFSMNT_FORCE                  0x00000100  /* Forced unmount */
161 #define   NFSMNT_NFSV3                  0x00000200  /* Use NFS Version 3 protocol */
162 #define   NFSMNT_KERB                   0x00000400  /* Use Kerberos authentication */
163 #define   NFSMNT_DUMBTIMR               0x00000800  /* Don't estimate rtt dynamically */
164 #define   NFSMNT_CACHE                  0x00001000  /* enable swapcache */
165 #define   NFSMNT_READAHEAD    0x00002000  /* set read ahead */
166 #define   NFSMNT_DEADTHRESH   0x00004000  /* set dead server retry thresh */
167 #define   NFSMNT_RESVPORT               0x00008000  /* Allocate a reserved port */
168 #define   NFSMNT_RDIRPLUS               0x00010000  /* Use Readdirplus for V3 */
169 #define   NFSMNT_READDIRSIZE  0x00020000  /* Set readdir size */
170 #define   NFSMNT_ACREGMIN               0x00040000
171 #define   NFSMNT_ACREGMAX               0x00080000
172 #define   NFSMNT_ACDIRMIN               0x00100000
173 #define   NFSMNT_ACDIRMAX               0x00200000
174 #define   NFSMNT_RETRYCNT               0x00400000  /* Set retry count */
175 
176 #define NFSSTA_HASWRITEVERF   0x00040000  /* Has write verifier for V3 */
177 #define NFSSTA_GOTPATHCONF    0x00080000  /* Got the V3 pathconf info */
178 #define NFSSTA_GOTFSINFO      0x00100000  /* Got the V3 fsinfo */
179 #define   NFSSTA_MNTD                   0x00200000  /* Mnt server for mnt point */
180 #define   NFSSTA_DISMINPROG   0x00400000  /* Dismount in progress */
181 #define   NFSSTA_DISMNT                 0x00800000  /* Dismounted */
182 #define   NFSSTA_SENDSPACE    0x01000000  /* Printed sendspace warning */
183 #define   NFSSTA_UNUSED25               0x02000000
184 #define   NFSSTA_UNUSED26               0x04000000
185 #define   NFSSTA_UNUSED27               0x08000000
186 #define   NFSSTA_WAITAUTH               0x10000000  /* Wait for authentication */
187 #define   NFSSTA_HASAUTH                0x20000000  /* Has authenticator */
188 #define   NFSSTA_WANTAUTH               0x40000000  /* Wants an authenticator */
189 #define   NFSSTA_AUTHERR                0x80000000  /* Authentication error */
190 
191 /*
192  * Structures for the nfssvc(2) syscall. Not that anyone but nfsd and mount_nfs
193  * should ever try and use it.
194  */
195 struct nfsd_args {
196           int       sock;               /* Socket to serve */
197           caddr_t   name;               /* Client addr for connection based sockets */
198           int       namelen;  /* Length of name */
199 };
200 
201 struct nfsd_srvargs {
202           struct nfsd         *nsd_nfsd;          /* Pointer to in kernel nfsd struct */
203           uid_t               nsd_uid;  /* Effective uid mapped to cred */
204           u_int32_t nsd_haddr;          /* Ip address of client */
205           struct ucred        nsd_cr;             /* Cred. uid maps to */
206           u_int               nsd_authlen;        /* Length of auth string (ret) */
207           u_char              *nsd_authstr;       /* Auth string (ret) */
208           u_int               nsd_verflen;        /* and the verfier */
209           u_char              *nsd_verfstr;
210           struct timeval      nsd_timestamp;      /* timestamp from verifier */
211           u_int32_t nsd_ttl;  /* credential ttl (sec) */
212           NFSKERBKEY_T        nsd_key;  /* Session key */
213 };
214 
215 struct nfsd_cargs {
216           char                *ncd_dirp;          /* Mount dir path */
217           uid_t               ncd_authuid;        /* Effective uid */
218           int                 ncd_authtype;       /* Type of authenticator */
219           u_int               ncd_authlen;        /* Length of authenticator string */
220           u_char              *ncd_authstr;       /* Authenticator string */
221           u_int               ncd_verflen;        /* and the verifier */
222           u_char              *ncd_verfstr;
223           NFSKERBKEY_T        ncd_key;  /* Session key */
224 };
225 
226 /*
227  * XXX to allow amd to include nfs.h without nfsproto.h
228  */
229 #ifdef NFS_NPROCS
230 /*
231  * Stats structure
232  */
233 struct nfsstats {
234           int       attrcache_hits;
235           int       attrcache_misses;
236           int       lookupcache_hits;
237           int       lookupcache_misses;
238           int       direofcache_hits;
239           int       direofcache_misses;
240           int       biocache_reads;
241           int       read_bios;
242           int       read_physios;
243           int       biocache_writes;
244           int       write_bios;
245           int       write_physios;
246           int       biocache_readlinks;
247           int       readlink_bios;
248           int       biocache_readdirs;
249           int       readdir_bios;
250           int       rpccnt[NFS_NPROCS];
251           int       rpcretries;
252           int       srvrpccnt[NFS_NPROCS];
253           int       srvrpc_errs;
254           int       srv_errs;
255           int       rpcrequests;
256           int       rpctimeouts;
257           int       rpcunexpected;
258           int       rpcinvalid;
259           int       srvcache_inproghits;
260           int       srvcache_idemdonehits;
261           int       srvcache_nonidemdonehits;
262           int       srvcache_misses;
263           int       srvnqnfs_leases;
264           int       srvnqnfs_maxleases;
265           int       srvnqnfs_getleases;
266           int       srvvop_writes;
267           int       accesscache_hits;
268           int       accesscache_misses;
269 };
270 #endif
271 
272 /*
273  * Flags for nfssvc() system call.
274  */
275 #define   NFSSVC_BIOD         0x002
276 #define   NFSSVC_NFSD         0x004
277 #define   NFSSVC_ADDSOCK      0x008
278 #define   NFSSVC_AUTHIN       0x010
279 #define   NFSSVC_GOTAUTH      0x040
280 #define   NFSSVC_AUTHINFAIL 0x080
281 #define   NFSSVC_MNTD         0x100
282 
283 /*
284  * fs.nfs sysctl(3) identifiers
285  */
286 #define NFS_NFSSTATS          1                   /* struct: struct nfsstats */
287 #define NFS_NFSPRIVPORT       2                   /* int: prohibit nfs to resvports */
288 
289 #define FS_NFS_NAMES { \
290                            { 0, 0 }, \
291                            { "nfsstats", CTLTYPE_STRUCT }, \
292                            { "nfsprivport", CTLTYPE_INT }, \
293 }
294 
295 #ifdef _KERNEL
296 
297 #ifdef MALLOC_DECLARE
298 MALLOC_DECLARE(M_NFS);
299 MALLOC_DECLARE(M_NFSREQ);
300 MALLOC_DECLARE(M_NFSDIROFF);
301 MALLOC_DECLARE(M_NFSRVDESC);
302 MALLOC_DECLARE(M_NFSUID);
303 MALLOC_DECLARE(M_NFSD);
304 MALLOC_DECLARE(M_NFSBIGFH);
305 #endif
306 
307 extern struct callout nfs_timer_handle;
308 extern int nfs_async;
309 extern int nfs_maxasyncbio;
310 extern int nfs_soreserve;
311 
312 struct uio;
313 struct buf;
314 struct bio;
315 struct vattr;
316 struct nlookupdata;
317 
318 /*
319  * The set of signals the interrupt an I/O in progress for NFSMNT_INT mounts.
320  * What should be in this set is open to debate, but I believe that since
321  * I/O system calls on ufs are never interrupted by signals the set should
322  * be minimal. My reasoning is that many current programs that use signals
323  * such as SIGALRM will not expect file I/O system calls to be interrupted
324  * by them and break.
325  */
326 #define   NFSINT_SIGMASK(set)                                                             \
327           (SIGISMEMBER(set, SIGINT) || SIGISMEMBER(set, SIGTERM) ||   \
328            SIGISMEMBER(set, SIGHUP) || SIGISMEMBER(set, SIGKILL) ||   \
329            SIGISMEMBER(set, SIGQUIT))
330 
331 /*
332  * Socket errors ignored for connectionless sockets??
333  * For now, ignore them all
334  */
335 #define   NFSIGNORE_SOERROR(s, e) \
336                     ((e) != EINTR && (e) != ERESTART && (e) != EWOULDBLOCK && \
337                     ((s) & PR_CONNREQUIRED) == 0)
338 
339 struct nfsm_info;
340 
341 /*
342  * Nfs outstanding request list element
343  */
344 struct nfsreq {
345           TAILQ_ENTRY(nfsreq) r_chain;
346           struct nfsm_info *r_info;
347           mtx_link_t          r_link;
348           struct mbuf         *r_mreq;
349           struct mbuf         *r_mrep;
350           struct mbuf         *r_md;
351           caddr_t             r_dpos;
352           struct nfsmount *r_nmp;
353           struct vnode        *r_vp;
354           u_int32_t r_xid;
355           int                 r_flags;  /* flags on request, see below */
356           int                 r_retry;  /* max retransmission count */
357           int                 r_rexmit; /* current retrans count */
358           int                 r_timer;  /* tick counter on reply */
359           u_int32_t r_procnum;          /* NFS procedure number */
360           int                 r_rtt;              /* RTT for rpc */
361           struct thread       *r_td;              /* Thread that did I/O system call */
362           struct mbuf         *r_mrest;
363           struct mbuf         *r_mheadend;
364           struct mbuf         **r_mrp;
365           struct mbuf         **r_mdp;
366           caddr_t             *r_dposp;
367           int                 r_mrest_len;
368           int                 r_failed_auth;
369           NFSKERBKEY_T        r_key;
370           struct ucred        *r_cred;
371 };
372 
373 /*
374  * Flag values for r_flags
375  *
376  * R_TIMING -       Timer is active on request.  If timer goes off the
377  *                  request's retransmit counter will bump and it will
378  *                  be flagged NEEDSXMIT to retransmit.
379  *
380  * R_SENT -         Indicates that the request was sent the first time.
381  *                  This stays set unless we want to repeat a first-time
382  *                  styled transmit sequence.
383  *
384  * R_NEEDSXMIT - The request needs a [re]transmission.  It will still
385  *                  be sitting on nm_reqq if synchronous, otherwise it
386  *                  will be moved to nm_reqtxq.
387  *
388  * R_ASYNC -        Indicates an asynchronous request, which modifies the
389  *                  behavior of how it is dealt with.
390  *
391  * R_LOCKED -       Prevents the request from being moved between queues
392  *                  e.g. by the timer or by the async thread.
393  */
394 #define R_TIMING    0x0001              /* timing request (in mntp) */
395 #define R_SENT                0x0002              /* request has been sent */
396 #define   R_SOFTTERM          0x0004              /* soft mnt, too many retries */
397 #define   R_INTR              0x0008              /* intr mnt, signal pending */
398 #define   R_SOCKERR 0x0010              /* Fatal error on socket */
399 #define   R_TPRINTFMSG        0x0020              /* Did a tprintf msg. */
400 #define   R_NEEDSXMIT         0x0040              /* Needs [re]transmission */
401 #define   R_ASYNC             0x0080              /* Asynchronous mechanics */
402 #define R_ONREQQ    0x0100              /* On primary request queue */
403 #define R_LOCKED    0x0200              /* Locked by the someone */
404 #define R_WANTED    0x0400              /* Someone wants access */
405 
406 /*
407  * A list of nfssvc_sock structures is maintained with all the sockets
408  * that require service by the nfsd.
409  * The nfsuid structs hang off of the nfssvc_sock structs in both lru
410  * and uid hash lists.
411  */
412 #ifndef NFS_UIDHASHSIZ
413 #define   NFS_UIDHASHSIZ      29        /* Tune the size of nfssvc_sock with this */
414 #endif
415 #define   NUIDHASH(sock, uid) \
416           (&(sock)->ns_uidhashtbl[(uid) % NFS_UIDHASHSIZ])
417 #ifndef NFS_WDELAYHASHSIZ
418 #define   NFS_WDELAYHASHSIZ 16          /* and with this */
419 #endif
420 #define   NWDELAYHASH(sock, f) \
421           (&(sock)->ns_wdelayhashtbl[(*((u_int32_t *)(f))) % NFS_WDELAYHASHSIZ])
422 #ifndef NFS_MUIDHASHSIZ
423 #define NFS_MUIDHASHSIZ       63        /* Tune the size of nfsmount with this */
424 #endif
425 #define   NMUIDHASH(nmp, uid) \
426           (&(nmp)->nm_uidhashtbl[(uid) % NFS_MUIDHASHSIZ])
427 
428 /*
429  * Network address hash list element
430  */
431 union nethostaddr {
432           u_int32_t had_inetaddr;
433           struct sockaddr *had_nam;
434 };
435 
436 struct nfsuid {
437           TAILQ_ENTRY(nfsuid) nu_lru;   /* LRU chain */
438           LIST_ENTRY(nfsuid) nu_hash;   /* Hash list */
439           int                 nu_flag;  /* Flags */
440           union nethostaddr nu_haddr;   /* Host addr. for dgram sockets */
441           struct ucred        nu_cr;              /* Cred uid mapped to */
442           time_t              nu_expire;          /* Expiry time (time_uptime) */
443           struct timeval      nu_timestamp;       /* Kerb. timestamp */
444           u_int32_t nu_nickname;        /* Nickname on server */
445           NFSKERBKEY_T        nu_key;             /* and session key */
446 };
447 
448 #define   nu_inetaddr         nu_haddr.had_inetaddr
449 #define   nu_nam              nu_haddr.had_nam
450 /* Bits for nu_flag */
451 #define   NU_INETADDR         0x1
452 #define NU_NAM                0x2
453 
454 struct nfsrv_rec {
455           STAILQ_ENTRY(nfsrv_rec) nr_link;
456           struct sockaddr     *nr_address;
457           struct mbuf         *nr_packet;
458 };
459 
460 struct nfssvc_sock {
461           TAILQ_ENTRY(nfssvc_sock) ns_chain;      /* List of all nfssvc_sock's */
462           TAILQ_HEAD(, nfsuid) ns_uidlruhead;
463           struct file         *ns_fp;
464           struct socket       *ns_so;
465           struct sockaddr     *ns_nam;
466           struct mbuf         *ns_raw;
467           struct mbuf         *ns_rawend;
468           STAILQ_HEAD(, nfsrv_rec) ns_rec;
469           struct mbuf         *ns_frag;
470           int                 ns_numrec;
471           u_int32_t ns_flag;
472           u_int32_t ns_needq_upcall;
473           struct mtx          ns_solock;
474           int                 ns_cc;
475           int                 ns_reclen;
476           int                 ns_numuids;
477           u_int32_t ns_sref;
478           LIST_HEAD(, nfsrv_descript) ns_tq;      /* Write gather lists */
479           LIST_HEAD(, nfsuid) ns_uidhashtbl[NFS_UIDHASHSIZ];
480           LIST_HEAD(nfsrvw_delayhash, nfsrv_descript) ns_wdelayhashtbl[NFS_WDELAYHASHSIZ];
481           struct lwkt_token ns_token;
482 };
483 
484 /* Bits for "ns_flag" */
485 #define   SLP_VALID 0x0001
486 #define   SLP_DOREC 0x0002    /* socket holding at least one record */
487 #define   SLP_NEEDQ 0x0004    /* socket needs general rx processing */
488 #define   SLP_DISCONN         0x0008
489 #define   SLP_GETSTREAM       0x0010    /* receive stream interlock */
490 #define   SLP_LASTFRAG        0x0020
491 
492 #define SLP_ALLFLAGS                    0xff
493 #define SLP_ACTION_MASK                 (SLP_NEEDQ | SLP_DOREC | SLP_DISCONN)
494 
495 extern TAILQ_HEAD(nfssvc_sockhead, nfssvc_sock) nfssvc_sockhead;
496 extern int nfssvc_sockhead_flag;
497 extern TAILQ_HEAD(nfsmount_head, nfsmount) nfs_mountq;
498 
499 #define   SLP_INIT  0x01
500 #define   SLP_WANTINIT        0x02
501 
502 /*
503  * One of these structures is allocated for each nfsd.
504  */
505 struct nfsd {
506           TAILQ_ENTRY(nfsd) nfsd_chain; /* List of all nfsd's */
507           int                 nfsd_flag;          /* NFSD_ flags */
508           struct nfssvc_sock *nfsd_slp; /* Current socket */
509           int                 nfsd_authlen;       /* Authenticator len */
510           u_char              nfsd_authstr[RPCAUTH_MAXSIZ]; /* Authenticator data */
511           int                 nfsd_verflen;       /* and the Verifier */
512           u_char              nfsd_verfstr[RPCVERF_MAXSIZ];
513           struct thread       *nfsd_td; /* thread ptr */
514           struct nfsrv_descript *nfsd_nd;         /* Associated nfsrv_descript */
515 };
516 
517 /* Bits for "nfsd_flag" */
518 #define   NFSD_WAITING        0x01
519 #define   NFSD_REQINPROG      0x02
520 #define   NFSD_NEEDAUTH       0x04
521 #define   NFSD_AUTHFAIL       0x08
522 
523 /* Bits for loadattrcache */
524 #define NFS_LATTR_NOSHRINK    0x01
525 #define NFS_LATTR_NOMTIMECHECK          0x02
526 
527 #define NFSRV_RECLIMIT(slp)   ((slp)->ns_numrec >= nfsd_waiting + 4)
528 
529 /*
530  * This structure is used by the server for describing each request.
531  * Some fields are used only when write request gathering is performed.
532  */
533 struct nfsrv_descript {
534           u_quad_t            nd_time;  /* Write deadline (usec) */
535           off_t                         nd_off;             /* Start byte offset */
536           off_t                         nd_eoff;  /* and end byte offset */
537           LIST_ENTRY(nfsrv_descript) nd_hash;     /* Hash list */
538           LIST_ENTRY(nfsrv_descript) nd_tq;                 /* and timer list */
539           LIST_HEAD(,nfsrv_descript) nd_coalesce; /* coalesced writes */
540           struct mbuf                   *nd_mrep; /* Request mbuf list */
541           struct mbuf                   *nd_md;             /* Current dissect mbuf */
542           struct mbuf                   *nd_mreq; /* Reply mbuf list */
543           struct sockaddr               *nd_nam;  /* and socket addr */
544           struct sockaddr               *nd_nam2; /* return socket addr */
545           caddr_t                       nd_dpos;  /* Current dissect pos */
546           u_int32_t           nd_procnum;         /* RPC # */
547           int                           nd_stable;          /* storage type */
548           int                           nd_flag;  /* nd_flag */
549           int                           nd_len;             /* Length of this write */
550           int                           nd_repstat;         /* Reply status */
551           u_int32_t           nd_retxid;          /* Reply xid */
552           struct timeval                nd_starttime;       /* Time RPC initiated */
553           fhandle_t           nd_fh;              /* File handle */
554           struct ucred                  nd_cr;              /* Credentials */
555 };
556 
557 /* Bits for "nd_flag" */
558 #define   ND_READ             0x01
559 #define ND_WRITE    0x02
560 #define ND_CHECK    0x04
561 #define ND_NFSV3    0x08
562 #define ND_UNUSED010          0x10
563 #define ND_KERBNICK 0x20
564 #define ND_KERBFULL 0x40
565 #define ND_KERBAUTH (ND_KERBNICK | ND_KERBFULL)
566 
567 extern TAILQ_HEAD(nfsd_head, nfsd) nfsd_head;
568 extern int nfsd_head_flag;
569 extern int nfsd_waiting;
570 #define   NFSD_CHECKSLP       0x01
571 
572 /*
573  * These macros compare nfsrv_descript structures.
574  */
575 #define NFSW_CONTIG(o, n) \
576                     ((o)->nd_eoff >= (n)->nd_off && \
577                      !bcmp((caddr_t)&(o)->nd_fh, (caddr_t)&(n)->nd_fh, NFSX_V3FH))
578 
579 #define NFSW_SAMECRED(o, n) \
580           (((o)->nd_flag & ND_KERBAUTH) == ((n)->nd_flag & ND_KERBAUTH) && \
581            !bcmp((caddr_t)&(o)->nd_cr, (caddr_t)&(n)->nd_cr, \
582                     sizeof (struct ucred)))
583 
584 /*
585  * Defines for WebNFS
586  */
587 
588 #define WEBNFS_ESC_CHAR                 '%'
589 #define WEBNFS_SPECCHAR_START 0x80
590 
591 #define WEBNFS_NATIVE_CHAR    0x80
592 /*
593  * ..
594  * Possibly more here in the future.
595  */
596 
597 /*
598  * Macro for converting escape characters in WebNFS pathnames.
599  * Should really be in libkern.
600  */
601 
602 #define HEXTOC(c) \
603           ((c) >= 'a' ? ((c) - ('a' - 10)) : \
604               ((c) >= 'A' ? ((c) - ('A' - 10)) : ((c) - '0')))
605 #define HEXSTRTOI(p) \
606           ((HEXTOC(p[0]) << 4) + HEXTOC(p[1]))
607 
608 #ifdef NFS_DEBUG
609 
610 extern int nfs_debug;
611 #define NFS_DEBUG_ASYNCIO     1 /* asynchronous i/o */
612 #define NFS_DEBUG_WG                    2 /* server write gathering */
613 #define NFS_DEBUG_RC                    4 /* server request caching */
614 
615 #define NFS_DPF(cat, args)                                            \
616           do {                                                                  \
617                     if (nfs_debug & NFS_DEBUG_##cat) kprintf args;    \
618           } while (0)
619 
620 #else
621 
622 #define NFS_DPF(cat, args)
623 
624 #endif
625 
626 extern u_int32_t nfs_xdrneg1;
627 extern u_int32_t rpc_reply, rpc_msgdenied, rpc_mismatch, rpc_vers;
628 extern u_int32_t rpc_auth_unix, rpc_msgaccepted, rpc_call, rpc_autherr;
629 extern u_int32_t rpc_auth_kerb;
630 extern u_int32_t nfs_prog, nfs_true, nfs_false;
631 extern struct nfsstats nfsstats;
632 extern nfstype nfsv2_type[9];
633 extern nfstype nfsv3_type[9];
634 extern int nfsv2_procid[NFS_NPROCS];
635 extern enum vtype nv3tov_type[8];
636 extern int nfsv3_procid[NFS_NPROCS];
637 extern int nfs_ticks;
638 extern struct nfsrtt nfsrtt;
639 extern int nfsrtton;
640 extern int nfsrvw_procrastinate;
641 extern int nfsrvw_procrastinate_v3;
642 extern int32_t (*nfsrv3_procs[NFS_NPROCS]) (struct nfsrv_descript *nd,
643                                                       struct nfssvc_sock *slp,
644                                                       struct thread *td,
645                                                       struct mbuf **mreqp);
646 
647 extern struct nfsv3_diskless nfsv3_diskless;
648 extern struct lwkt_token nfs_token;
649 
650 u_quad_t nfs_curusec (void);
651 int       nfs_init (struct vfsconf *vfsp);
652 int       nfs_uninit (struct vfsconf *vfsp);
653 struct ucred *nfs_crhold(struct ucred *cred);
654 int       nfs_crsame(struct ucred *cr1, struct ucred *cr2);
655 int       nfs_reply (struct nfsmount *nmp, struct nfsreq *);
656 int       nfs_getreq (struct nfsrv_descript *,struct nfsd *,int);
657 int       nfs_send (struct socket *, struct sockaddr *, struct mbuf *,
658                           struct nfsreq *);
659 int       nfs_rephead (int, struct nfsrv_descript *, struct nfssvc_sock *,
660                                int, struct mbuf **, struct mbuf **, caddr_t *);
661 int       nfs_sndlock (struct nfsmount *, struct nfsreq *);
662 void      nfs_sndunlock (struct nfsmount *);
663 int       nfs_slplock (struct nfssvc_sock *, int);
664 void      nfs_slpunlock (struct nfssvc_sock *);
665 int       nfs_disct (struct mbuf **, caddr_t *, int, int, caddr_t *);
666 int       nfs_vinvalbuf (struct vnode *, int, int);
667 int       nfs_readrpc_uio (struct vnode *, struct uio *);
668 void      nfs_readrpc_bio (struct vnode *, struct bio *);
669 int       nfs_writerpc_uio (struct vnode *, struct uio *, int *, int *);
670 void      nfs_writerpc_bio (struct vnode *, struct bio *);
671 int       nfs_commitrpc_uio (struct vnode *vp, u_quad_t offset, int cnt,
672                               struct thread *td);
673 void      nfs_commitrpc_bio (struct vnode *vp, struct bio *);
674 int       nfs_readdirrpc_uio (struct vnode *, struct uio *);
675 void      nfs_startio(struct vnode *vp, struct bio *, struct thread *);
676 int       nfs_doio(struct vnode *vp, struct bio *, struct thread *);
677 void      nfs_asyncio(struct vnode *vp, struct bio *bio);
678 int       nfs_asyncok(struct nfsmount *nmp);
679 
680 int       nfs_readlinkrpc_uio (struct vnode *, struct uio *);
681 int       nfs_sigintr (struct nfsmount *, struct nfsreq *, struct thread *);
682 int       nfs_readdirplusrpc_uio (struct vnode *, struct uio *);
683 int       netaddr_match (int, union nethostaddr *, struct sockaddr *);
684 
685 int       nfs_loadattrcache (struct vnode *, struct mbuf **, caddr_t *,
686                               struct vattr *, int);
687 int       nfs_namei (struct nlookupdata *, struct ucred *, int,
688                         struct vnode **, struct vnode **, fhandle_t *, int,
689                         struct nfssvc_sock *, struct sockaddr *, struct mbuf **,
690                         caddr_t *, struct vnode **, struct thread *, int, int);
691 void      nfsrv_initcache (void);
692 void      nfsrv_destroycache (void);
693 int       nfs_getauth (struct nfsmount *, struct nfsreq *, struct ucred *,
694                                char **, int *, char *, int *, NFSKERBKEY_T);
695 int       nfs_getnickauth (struct nfsmount *, struct ucred *, char **,
696                                    int *, char *, int);
697 int       nfs_savenickauth (struct nfsmount *, struct ucred *, int,
698                                     NFSKERBKEY_T, struct mbuf **, char **,
699                                     struct mbuf *);
700 int       nfs_adv (struct mbuf **, caddr_t *, int, int);
701 void      nfs_nhinit (void);
702 void      nfs_nhdestroy (void);
703 int       nfs_nmcancelreqs (struct nfsmount *);
704 void      nfs_timer_callout (void*);
705 int       nfsrv_dorec (struct nfssvc_sock *, struct nfsd *,
706                                struct nfsrv_descript **);
707 int       nfsrv_getcache (struct nfsrv_descript *, struct nfssvc_sock *,
708                                   struct mbuf **);
709 void      nfsrv_updatecache (struct nfsrv_descript *, int, struct mbuf *);
710 void      nfsrv_cleancache (void);
711 int       nfs_connect (struct nfsmount *, struct nfsreq *);
712 void      nfs_disconnect (struct nfsmount *);
713 void      nfs_safedisconnect (struct nfsmount *);
714 int       nfs_getattrcache (struct vnode *, struct vattr *);
715 int       nfs_bioread (struct vnode *, struct uio *, int);
716 void      nfsrv_init (int);
717 void      nfs_clearcommit (struct mount *);
718 int       nfsrv_errmap (struct nfsrv_descript *, int);
719 void      nfsrvw_sort (gid_t *, int);
720 void      nfsrv_setcred (struct ucred *, struct ucred *);
721 int       nfsrv_object_create (struct vnode *);
722 void      nfsrv_wakenfsd (struct nfssvc_sock *slp, int nparallel);
723 int       nfsrv_writegather (struct nfsrv_descript **, struct nfssvc_sock *,
724                                      struct thread *, struct mbuf **);
725 int       nfs_fsinfo (struct nfsmount *, struct vnode *, struct thread *p);
726 
727 int       nfsrv3_access (struct nfsrv_descript *nfsd,
728                                  struct nfssvc_sock *slp,
729                                  struct thread *td, struct mbuf **mrq);
730 int       nfsrv_commit (struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
731                                 struct thread *td, struct mbuf **mrq);
732 int       nfsrv_create (struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
733                                 struct thread *td, struct mbuf **mrq);
734 int       nfsrv_fhtovp (fhandle_t *, int, struct mount **, struct vnode **,
735                                 struct ucred *, struct nfssvc_sock *,
736                                 struct sockaddr *, int *, int, int);
737 int       nfsrv_setpublicfs (struct mount *, struct netexport *,
738                                      struct export_args *);
739 int       nfs_ispublicfh (fhandle_t *);
740 int       nfsrv_fsinfo (struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
741                                 struct thread *td, struct mbuf **mrq);
742 int       nfsrv_getattr (struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
743                                  struct thread *td, struct mbuf **mrq);
744 int       nfsrv_link (struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
745                               struct thread *td, struct mbuf **mrq);
746 int       nfsrv_lookup (struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
747                                 struct thread *td, struct mbuf **mrq);
748 int       nfsrv_mkdir (struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
749                                struct thread *td, struct mbuf **mrq);
750 int       nfsrv_mknod (struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
751                                struct thread *td, struct mbuf **mrq);
752 int       nfsrv_noop (struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
753                               struct thread *td, struct mbuf **mrq);
754 int       nfsrv_null (struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
755                               struct thread *td, struct mbuf **mrq);
756 int       nfsrv_pathconf (struct nfsrv_descript *nfsd,
757                                   struct nfssvc_sock *slp, struct thread *td,
758                                   struct mbuf **mrq);
759 int       nfsrv_read (struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
760                               struct thread *td, struct mbuf **mrq);
761 int       nfsrv_readdir (struct nfsrv_descript *nfsd,
762                                  struct nfssvc_sock *slp,
763                                  struct thread *td, struct mbuf **mrq);
764 int       nfsrv_readdirplus (struct nfsrv_descript *nfsd,
765                                      struct nfssvc_sock *slp, struct thread *td,
766                                      struct mbuf **mrq);
767 int       nfsrv_readlink (struct nfsrv_descript *nfsd,
768                                   struct nfssvc_sock *slp, struct thread *td,
769                                   struct mbuf **mrq);
770 int       nfsrv_remove (struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
771                                 struct thread *td, struct mbuf **mrq);
772 int       nfsrv_rename (struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
773                                 struct thread *td, struct mbuf **mrq);
774 int       nfsrv_rmdir (struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
775                                struct thread *td, struct mbuf **mrq);
776 int       nfsrv_setattr (struct nfsrv_descript *nfsd,
777                                  struct nfssvc_sock *slp,
778                                  struct thread *td, struct mbuf **mrq);
779 int       nfsrv_statfs (struct nfsrv_descript *nfsd,
780                                 struct nfssvc_sock *slp,
781                                 struct thread *td, struct mbuf **mrq);
782 int       nfsrv_symlink (struct nfsrv_descript *nfsd,
783                                  struct nfssvc_sock *slp,
784                                  struct thread *td, struct mbuf **mrq);
785 int       nfsrv_write (struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
786                                struct thread *td, struct mbuf **mrq);
787 void      nfsrv_rcv (struct socket *so, void *arg, int waitflag);
788 void      nfsrv_rcv_upcall (struct socket *so, void *arg, int waitflag);
789 void      nfsrv_slpderef (struct nfssvc_sock *slp);
790 void      nfsrv_slpref (struct nfssvc_sock *slp);
791 int       nfs_meta_setsize (struct vnode *vp, struct thread *td,
792                               off_t nbase, int nvextflags);
793 int       nfs_clientd(struct nfsmount *nmp, struct ucred *cred,
794                               struct nfsd_cargs *ncd, int flag, caddr_t argp,
795                               struct thread *td);
796 void      nfssvc_iod_reader(void *arg);
797 void      nfssvc_iod_writer(void *arg);
798 void      nfssvc_iod_stop1(struct nfsmount *nmp);
799 void      nfssvc_iod_stop2(struct nfsmount *nmp);
800 void      nfssvc_iod_writer_wakeup(struct nfsmount *nmp);
801 void      nfssvc_iod_reader_wakeup(struct nfsmount *nmp);
802 
803 #endif    /* _KERNEL */
804 
805 #endif
806