home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 4 / hacker04 / 04_HACK04.ISO / darwin / darwinx86.iso / usr / include / nfs / nfs.h < prev    next >
Encoding:
C/C++ Source or Header  |  2001-09-30  |  30.3 KB  |  842 lines

  1. /*
  2.  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
  3.  *
  4.  * @APPLE_LICENSE_HEADER_START@
  5.  * 
  6.  * The contents of this file constitute Original Code as defined in and
  7.  * are subject to the Apple Public Source License Version 1.1 (the
  8.  * "License").  You may not use this file except in compliance with the
  9.  * License.  Please obtain a copy of the License at
  10.  * http://www.apple.com/publicsource and read it before using this file.
  11.  * 
  12.  * This Original Code and all software distributed under the License are
  13.  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  14.  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  15.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
  16.  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
  17.  * License for the specific language governing rights and limitations
  18.  * under the License.
  19.  * 
  20.  * @APPLE_LICENSE_HEADER_END@
  21.  */
  22. /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
  23. /*
  24.  * Copyright (c) 1989, 1993, 1995
  25.  *    The Regents of the University of California.  All rights reserved.
  26.  *
  27.  * This code is derived from software contributed to Berkeley by
  28.  * Rick Macklem at The University of Guelph.
  29.  *
  30.  * Redistribution and use in source and binary forms, with or without
  31.  * modification, are permitted provided that the following conditions
  32.  * are met:
  33.  * 1. Redistributions of source code must retain the above copyright
  34.  *    notice, this list of conditions and the following disclaimer.
  35.  * 2. Redistributions in binary form must reproduce the above copyright
  36.  *    notice, this list of conditions and the following disclaimer in the
  37.  *    documentation and/or other materials provided with the distribution.
  38.  * 3. All advertising materials mentioning features or use of this software
  39.  *    must display the following acknowledgement:
  40.  *    This product includes software developed by the University of
  41.  *    California, Berkeley and its contributors.
  42.  * 4. Neither the name of the University nor the names of its contributors
  43.  *    may be used to endorse or promote products derived from this software
  44.  *    without specific prior written permission.
  45.  *
  46.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  47.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  48.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  49.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  50.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  51.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  52.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  53.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  54.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  55.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  56.  * SUCH DAMAGE.
  57.  *
  58.  *    @(#)nfs.h    8.4 (Berkeley) 5/1/95
  59.  * FreeBSD-Id: nfs.h,v 1.32 1997/10/12 20:25:38 phk Exp $
  60.  */
  61.  
  62. #ifndef _NFS_NFS_H_
  63. #define _NFS_NFS_H_
  64.  
  65. /*
  66.  * Tunable constants for nfs
  67.  */
  68.  
  69. #define    NFS_MAXIOVEC    34
  70. #define NFS_TICKINTVL    5        /* Desired time for a tick (msec) */
  71. #define NFS_HZ        (hz / nfs_ticks) /* Ticks/sec */
  72. #define    NFS_TIMEO    (1 * NFS_HZ)    /* Default timeout = 1 second */
  73. #define    NFS_MINTIMEO    (1 * NFS_HZ)    /* Min timeout to use */
  74. #define    NFS_MAXTIMEO    (60 * NFS_HZ)    /* Max timeout to backoff to */
  75. #define    NFS_MINIDEMTIMEO (5 * NFS_HZ)    /* Min timeout for non-idempotent ops*/
  76. #define    NFS_MAXREXMIT    100        /* Stop counting after this many */
  77. #define    NFS_MAXWINDOW    1024        /* Max number of outstanding requests */
  78. #define    NFS_RETRANS    10        /* Num of retrans for soft mounts */
  79. #define    NFS_MAXGRPS    16        /* Max. size of groups list */
  80. #ifndef NFS_MINATTRTIMO
  81. #define    NFS_MINATTRTIMO 5        /* Attribute cache timeout in sec */
  82. #endif
  83. #ifndef NFS_MAXATTRTIMO
  84. #define    NFS_MAXATTRTIMO 60
  85. #endif
  86. #define    NFS_WSIZE    8192        /* Def. write data size <= 8192 */
  87. #define    NFS_RSIZE    8192        /* Def. read data size <= 8192 */
  88. #define NFS_READDIRSIZE    8192        /* Def. readdir size */
  89. #define    NFS_DEFRAHEAD    1        /* Def. read ahead # blocks */
  90. #define    NFS_MAXRAHEAD    4        /* Max. read ahead # blocks */
  91. #define    NFS_MAXUIDHASH    64        /* Max. # of hashed uid entries/mp */
  92. #define    NFS_MAXASYNCDAEMON     20    /* Max. number async_daemons runnable */
  93. #define NFS_MAXGATHERDELAY    100    /* Max. write gather delay (msec) */
  94. #ifndef NFS_GATHERDELAY
  95. #define NFS_GATHERDELAY        10    /* Default write gather delay (msec) */
  96. #endif
  97. #define    NFS_DIRBLKSIZ    4096        /* Must be a multiple of DIRBLKSIZ */
  98.  
  99. /*
  100.  * Oddballs
  101.  */
  102. #define    NMOD(a)        ((a) % nfs_asyncdaemons)
  103. #define NFS_CMPFH(n, f, s) \
  104.     ((n)->n_fhsize == (s) && !bcmp((caddr_t)(n)->n_fhp, (caddr_t)(f), (s)))
  105. #define NFS_ISV3(v)    (VFSTONFS((v)->v_mount)->nm_flag & NFSMNT_NFSV3)
  106. #define NFS_SRVMAXDATA(n) \
  107.         (((n)->nd_flag & ND_NFSV3) ? (((n)->nd_nam2) ? \
  108.          NFS_MAXDGRAMDATA : NFS_MAXDATA) : NFS_V2MAXDATA)
  109.  
  110. /*
  111.  * XXX
  112.  * The B_INVAFTERWRITE flag should be set to whatever is required by the
  113.  * buffer cache code to say "Invalidate the block after it is written back".
  114.  */
  115. #ifdef __FreeBSD__
  116. #define    B_INVAFTERWRITE    B_NOCACHE
  117. #else
  118. #define    B_INVAFTERWRITE    B_INVAL
  119. #endif
  120.  
  121. /*
  122.  * The IO_METASYNC flag should be implemented for local file systems.
  123.  * (Until then, it is nothin at all.)
  124.  */
  125. #ifndef IO_METASYNC
  126. #define IO_METASYNC    0
  127. #endif
  128.  
  129. /*
  130.  * Set the attribute timeout based on how recently the file has been modified.
  131.  */
  132. #define    NFS_ATTRTIMEO(np) \
  133.     ((((np)->n_flag & NMODIFIED) || \
  134.      (time.tv_sec - (np)->n_mtime) / 10 < NFS_MINATTRTIMO) ? NFS_MINATTRTIMO : \
  135.      ((time.tv_sec - (np)->n_mtime) / 10 > NFS_MAXATTRTIMO ? NFS_MAXATTRTIMO : \
  136.       (time.tv_sec - (np)->n_mtime) / 10))
  137.  
  138. /*
  139.  * Expected allocation sizes for major data structures. If the actual size
  140.  * of the structure exceeds these sizes, then malloc() will be allocating
  141.  * almost twice the memory required. This is used in nfs_init() to warn
  142.  * the sysadmin that the size of a structure should be reduced.
  143.  * (These sizes are always a power of 2. If the kernel malloc() changes
  144.  *  to one that does not allocate space in powers of 2 size, then this all
  145.  *  becomes bunk!).
  146.  * Note that some of these structures come out of there own nfs zones.
  147. */
  148. #define NFS_NODEALLOC    512
  149. #define NFS_MNTALLOC    512
  150. #define NFS_SVCALLOC    256
  151. #define NFS_UIDALLOC    128
  152.  
  153. /*
  154.  * Arguments to mount NFS
  155.  */
  156. #define NFS_ARGSVERSION    3        /* change when nfs_args changes */
  157. struct nfs_args {
  158.     int        version;    /* args structure version number */
  159.     struct sockaddr    *addr;        /* file server address */
  160.     int        addrlen;    /* length of address */
  161.     int        sotype;        /* Socket type */
  162.     int        proto;        /* and Protocol */
  163.     u_char        *fh;        /* File handle to be mounted */
  164.     int        fhsize;        /* Size, in bytes, of fh */
  165.     int        flags;        /* flags */
  166.     int        wsize;        /* write size in bytes */
  167.     int        rsize;        /* read size in bytes */
  168.     int        readdirsize;    /* readdir size in bytes */
  169.     int        timeo;        /* initial timeout in .1 secs */
  170.     int        retrans;    /* times to retry send */
  171.     int        maxgrouplist;    /* Max. size of group list */
  172.     int        readahead;    /* # of blocks to readahead */
  173.     int        leaseterm;    /* Term (sec) of lease */
  174.     int        deadthresh;    /* Retrans threshold */
  175.     char        *hostname;    /* server's name */
  176. };
  177.  
  178. /*
  179.  * NFS mount option flags
  180.  */
  181. #define    NFSMNT_SOFT        0x00000001  /* soft mount (hard is default) */
  182. #define    NFSMNT_WSIZE        0x00000002  /* set write size */
  183. #define    NFSMNT_RSIZE        0x00000004  /* set read size */
  184. #define    NFSMNT_TIMEO        0x00000008  /* set initial timeout */
  185. #define    NFSMNT_RETRANS        0x00000010  /* set number of request retries */
  186. #define    NFSMNT_MAXGRPS        0x00000020  /* set maximum grouplist size */
  187. #define    NFSMNT_INT        0x00000040  /* allow interrupts on hard mount */
  188. #define    NFSMNT_NOCONN        0x00000080  /* Don't Connect the socket */
  189. #define    NFSMNT_NQNFS        0x00000100  /* Use Nqnfs protocol */
  190. #define    NFSMNT_NFSV3        0x00000200  /* Use NFS Version 3 protocol */
  191. #define    NFSMNT_KERB        0x00000400  /* Use Kerberos authentication */
  192. #define    NFSMNT_DUMBTIMR        0x00000800  /* Don't estimate rtt dynamically */
  193. #define    NFSMNT_LEASETERM    0x00001000  /* set lease term (nqnfs) */
  194. #define    NFSMNT_READAHEAD    0x00002000  /* set read ahead */
  195. #define    NFSMNT_DEADTHRESH    0x00004000  /* set dead server retry thresh */
  196. #define    NFSMNT_RESVPORT        0x00008000  /* Allocate a reserved port */
  197. #define    NFSMNT_RDIRPLUS        0x00010000  /* Use Readdirplus for V3 */
  198. #define    NFSMNT_READDIRSIZE    0x00020000  /* Set readdir size */
  199. #define    NFSMNT_INTERNAL        0xfffc0000  /* Bits set internally */
  200. #define NFSMNT_HASWRITEVERF    0x00040000  /* Has write verifier for V3 */
  201. #define NFSMNT_GOTPATHCONF    0x00080000  /* Got the V3 pathconf info */
  202. #define NFSMNT_GOTFSINFO    0x00100000  /* Got the V3 fsinfo */
  203. #define    NFSMNT_MNTD        0x00200000  /* Mnt server for mnt point */
  204. #define    NFSMNT_DISMINPROG    0x00400000  /* Dismount in progress */
  205. #define    NFSMNT_DISMNT        0x00800000  /* Dismounted */
  206. #define    NFSMNT_SNDLOCK        0x01000000  /* Send socket lock */
  207. #define    NFSMNT_WANTSND        0x02000000  /* Want above */
  208. #define    NFSMNT_RCVLOCK        0x04000000  /* Rcv socket lock */
  209. #define    NFSMNT_WANTRCV        0x08000000  /* Want above */
  210. #define    NFSMNT_WAITAUTH        0x10000000  /* Wait for authentication */
  211. #define    NFSMNT_HASAUTH        0x20000000  /* Has authenticator */
  212. #define    NFSMNT_WANTAUTH        0x40000000  /* Wants an authenticator */
  213. #define    NFSMNT_AUTHERR        0x80000000  /* Authentication error */
  214.  
  215. /*
  216.  * Structures for the nfssvc(2) syscall. Not that anyone but nfsd and mount_nfs
  217.  * should ever try and use it.
  218.  */
  219. struct nfsd_args {
  220.     int    sock;        /* Socket to serve */
  221.     caddr_t    name;        /* Client addr for connection based sockets */
  222.     int    namelen;    /* Length of name */
  223. };
  224.  
  225. struct nfsd_srvargs {
  226.     struct nfsd    *nsd_nfsd;    /* Pointer to in kernel nfsd struct */
  227.     uid_t        nsd_uid;    /* Effective uid mapped to cred */
  228.     u_long        nsd_haddr;    /* Ip address of client */
  229.     struct ucred    nsd_cr;        /* Cred. uid maps to */
  230.     int        nsd_authlen;    /* Length of auth string (ret) */
  231.     u_char        *nsd_authstr;    /* Auth string (ret) */
  232.     int        nsd_verflen;    /* and the verfier */
  233.     u_char        *nsd_verfstr;
  234.     struct timeval    nsd_timestamp;    /* timestamp from verifier */
  235.     u_long        nsd_ttl;    /* credential ttl (sec) */
  236.     NFSKERBKEY_T    nsd_key;    /* Session key */
  237. };
  238.  
  239. struct nfsd_cargs {
  240.     char        *ncd_dirp;    /* Mount dir path */
  241.     uid_t        ncd_authuid;    /* Effective uid */
  242.     int        ncd_authtype;    /* Type of authenticator */
  243.     int        ncd_authlen;    /* Length of authenticator string */
  244.     u_char        *ncd_authstr;    /* Authenticator string */
  245.     int        ncd_verflen;    /* and the verifier */
  246.     u_char        *ncd_verfstr;
  247.     NFSKERBKEY_T    ncd_key;    /* Session key */
  248. };
  249.  
  250. /*
  251.  * XXX to allow amd to include nfs.h without nfsproto.h
  252.  */
  253. #ifdef NFS_NPROCS
  254. /*
  255.  * Stats structure
  256.  */
  257. struct nfsstats {
  258.     int    attrcache_hits;
  259.     int    attrcache_misses;
  260.     int    lookupcache_hits;
  261.     int    lookupcache_misses;
  262.     int    direofcache_hits;
  263.     int    direofcache_misses;
  264.     int    biocache_reads;
  265.     int    read_bios;
  266.     int    read_physios;
  267.     int    biocache_writes;
  268.     int    write_bios;
  269.     int    write_physios;
  270.     int    biocache_readlinks;
  271.     int    readlink_bios;
  272.     int    biocache_readdirs;
  273.     int    readdir_bios;
  274.     int    rpccnt[NFS_NPROCS];
  275.     int    rpcretries;
  276.     int    srvrpccnt[NFS_NPROCS];
  277.     int    srvrpc_errs;
  278.     int    srv_errs;
  279.     int    rpcrequests;
  280.     int    rpctimeouts;
  281.     int    rpcunexpected;
  282.     int    rpcinvalid;
  283.     int    srvcache_inproghits;
  284.     int    srvcache_idemdonehits;
  285.     int    srvcache_nonidemdonehits;
  286.     int    srvcache_misses;
  287.     int    srvnqnfs_leases;
  288.     int    srvnqnfs_maxleases;
  289.     int    srvnqnfs_getleases;
  290.     int    srvvop_writes;
  291.     int pageins;
  292.     int pageouts;
  293. };
  294. #endif
  295.  
  296. /*
  297.  * Flags for nfssvc() system call.
  298.  */
  299. #define    NFSSVC_BIOD    0x002
  300. #define    NFSSVC_NFSD    0x004
  301. #define    NFSSVC_ADDSOCK    0x008
  302. #define    NFSSVC_AUTHIN    0x010
  303. #define    NFSSVC_GOTAUTH    0x040
  304. #define    NFSSVC_AUTHINFAIL 0x080
  305. #define    NFSSVC_MNTD    0x100
  306.  
  307. /*
  308.  * fs.nfs sysctl(3) identifiers
  309.  */
  310. #define NFS_NFSSTATS    1        /* struct: struct nfsstats */
  311. #define NFS_NFSPRIVPORT    2        /* int: prohibit nfs to resvports */
  312.  
  313. #define FS_NFS_NAMES { \
  314.                { 0, 0 }, \
  315.                { "nfsstats", CTLTYPE_STRUCT }, \
  316.                { "nfsprivport", CTLTYPE_INT }, \
  317. }
  318.  
  319. #ifndef NFS_MUIDHASHSIZ
  320. #define NFS_MUIDHASHSIZ    63    /* Tune the size of nfsmount with this */
  321. #endif
  322. #ifndef NFS_WDELAYHASHSIZ
  323. #define    NFS_WDELAYHASHSIZ 16    /* and with this */
  324. #endif
  325.  
  326. /*
  327.  * The set of signals the interrupt an I/O in progress for NFSMNT_INT mounts.
  328.  * What should be in this set is open to debate, but I believe that since
  329.  * I/O system calls on ufs are never interrupted by signals the set should
  330.  * be minimal. My reasoning is that many current programs that use signals
  331.  * such as SIGALRM will not expect file I/O system calls to be interrupted
  332.  * by them and break.
  333.  */
  334. #ifdef KERNEL
  335.  
  336. #ifdef MALLOC_DECLARE
  337. MALLOC_DECLARE(M_NFSREQ);
  338. MALLOC_DECLARE(M_NFSMNT);
  339. MALLOC_DECLARE(M_NFSDIROFF);
  340. MALLOC_DECLARE(M_NFSRVDESC);
  341. MALLOC_DECLARE(M_NFSUID);
  342. MALLOC_DECLARE(M_NQLEASE);
  343. MALLOC_DECLARE(M_NFSD);
  344. MALLOC_DECLARE(M_NFSBIGFH);
  345. #endif
  346.  
  347. struct uio; struct buf; struct vattr; struct nameidata;    /* XXX */
  348.  
  349. #define    NFSINT_SIGMASK    (sigmask(SIGINT)|sigmask(SIGTERM)|sigmask(SIGKILL)| \
  350.              sigmask(SIGHUP)|sigmask(SIGQUIT))
  351.  
  352. /*
  353.  * Socket errors ignored for connectionless sockets??
  354.  * For now, ignore them all
  355.  */
  356. #define    NFSIGNORE_SOERROR(s, e) \
  357.         ((e) != EINTR && (e) != ERESTART && (e) != EWOULDBLOCK && \
  358.         ((s) & PR_CONNREQUIRED) == 0)
  359.  
  360. /*
  361.  * Nfs outstanding request list element
  362.  */
  363. struct nfsreq {
  364.     TAILQ_ENTRY(nfsreq) r_chain;
  365.     struct mbuf    *r_mreq;
  366.     struct mbuf    *r_mrep;
  367.     struct mbuf    *r_md;
  368.     caddr_t        r_dpos;
  369.     struct nfsmount *r_nmp;
  370.     struct vnode    *r_vp;
  371.     u_long        r_xid;
  372.     int        r_flags;    /* flags on request, see below */
  373.     int        r_retry;    /* max retransmission count */
  374.     int        r_rexmit;    /* current retrans count */
  375.     int        r_timer;    /* tick counter on reply */
  376.     u_int32_t    r_procnum;    /* NFS procedure number */
  377.     int        r_rtt;        /* RTT for rpc */
  378.     struct proc    *r_procp;    /* Proc that did I/O system call */
  379. };
  380.  
  381. /*
  382.  * Queue head for nfsreq's
  383.  */
  384. extern TAILQ_HEAD(nfs_reqq, nfsreq) nfs_reqq;
  385.  
  386. /* Flag values for r_flags */
  387. #define R_TIMING    0x01        /* timing request (in mntp) */
  388. #define R_SENT        0x02        /* request has been sent */
  389. #define    R_SOFTTERM    0x04        /* soft mnt, too many retries */
  390. #define    R_INTR        0x08        /* intr mnt, signal pending */
  391. #define    R_SOCKERR    0x10        /* Fatal error on socket */
  392. #define    R_TPRINTFMSG    0x20        /* Did a tprintf msg. */
  393. #define    R_MUSTRESEND    0x40        /* Must resend request */
  394. #define    R_GETONEREP    0x80        /* Probe for one reply only */
  395.  
  396. /*
  397.  * A list of nfssvc_sock structures is maintained with all the sockets
  398.  * that require service by the nfsd.
  399.  * The nfsuid structs hang off of the nfssvc_sock structs in both lru
  400.  * and uid hash lists.
  401.  */
  402. #ifndef NFS_UIDHASHSIZ
  403. #define    NFS_UIDHASHSIZ    29    /* Tune the size of nfssvc_sock with this */
  404. #endif
  405. #define    NUIDHASH(sock, uid) \
  406.     (&(sock)->ns_uidhashtbl[(uid) % NFS_UIDHASHSIZ])
  407. #define    NWDELAYHASH(sock, f) \
  408.     (&(sock)->ns_wdelayhashtbl[(*((u_long *)(f))) % NFS_WDELAYHASHSIZ])
  409. #define    NMUIDHASH(nmp, uid) \
  410.     (&(nmp)->nm_uidhashtbl[(uid) % NFS_MUIDHASHSIZ])
  411. #define    NFSNOHASH(fhsum) \
  412.     (&nfsnodehashtbl[(fhsum) & nfsnodehash])
  413.  
  414. /*
  415.  * Network address hash list element
  416.  */
  417. union nethostaddr {
  418.     u_long had_inetaddr;
  419.     struct mbuf *had_nam;
  420. };
  421.  
  422. struct nfsuid {
  423.     TAILQ_ENTRY(nfsuid) nu_lru;    /* LRU chain */
  424.     LIST_ENTRY(nfsuid) nu_hash;    /* Hash list */
  425.     int        nu_flag;    /* Flags */
  426.     union nethostaddr nu_haddr;    /* Host addr. for dgram sockets */
  427.     struct ucred    nu_cr;        /* Cred uid mapped to */
  428.     int        nu_expire;    /* Expiry time (sec) */
  429.     struct timeval    nu_timestamp;    /* Kerb. timestamp */
  430.     u_long        nu_nickname;    /* Nickname on server */
  431.     NFSKERBKEY_T    nu_key;        /* and session key */
  432. };
  433.  
  434. #define    nu_inetaddr    nu_haddr.had_inetaddr
  435. #define    nu_nam        nu_haddr.had_nam
  436. /* Bits for nu_flag */
  437. #define    NU_INETADDR    0x1
  438. #define NU_NAM        0x2
  439. #define NU_NETFAM(u)    (((u)->nu_flag & NU_INETADDR) ? AF_INET : AF_ISO)
  440.  
  441. #ifdef notyet
  442. /* XXX CSM 12/2/97 When/if we merge queue.h */
  443. struct nfsrv_rec {
  444.     STAILQ_ENTRY(nfsrv_rec) nr_link;
  445.     struct sockaddr    *nr_address;
  446.     struct mbuf    *nr_packet;
  447. };
  448. #endif
  449.  
  450. struct nfssvc_sock {
  451.     TAILQ_ENTRY(nfssvc_sock) ns_chain;    /* List of all nfssvc_sock's */
  452.     TAILQ_HEAD(, nfsuid) ns_uidlruhead;
  453.     struct file    *ns_fp;
  454.     struct socket    *ns_so;
  455.     struct mbuf    *ns_nam;
  456.     struct mbuf    *ns_raw;
  457.     struct mbuf    *ns_rawend;
  458.     struct mbuf    *ns_rec;
  459.     struct mbuf    *ns_recend;
  460.     struct mbuf    *ns_frag;
  461.     int        ns_flag;
  462.     int        ns_solock;
  463.     int        ns_cc;
  464.     int        ns_reclen;
  465.     int        ns_numuids;
  466.     u_long        ns_sref;
  467.     LIST_HEAD(, nfsrv_descript) ns_tq;    /* Write gather lists */
  468.     LIST_HEAD(, nfsuid) ns_uidhashtbl[NFS_UIDHASHSIZ];
  469.     LIST_HEAD(nfsrvw_delayhash, nfsrv_descript) ns_wdelayhashtbl[NFS_WDELAYHASHSIZ];
  470. };
  471.  
  472. /* Bits for "ns_flag" */
  473. #define    SLP_VALID    0x01
  474. #define    SLP_DOREC    0x02
  475. #define    SLP_NEEDQ    0x04
  476. #define    SLP_DISCONN    0x08
  477. #define    SLP_GETSTREAM    0x10
  478. #define    SLP_LASTFRAG    0x20
  479. #define SLP_ALLFLAGS    0xff
  480.  
  481. extern TAILQ_HEAD(nfssvc_sockhead, nfssvc_sock) nfssvc_sockhead;
  482. extern int nfssvc_sockhead_flag;
  483. #define    SLP_INIT    0x01
  484. #define    SLP_WANTINIT    0x02
  485.  
  486. /*
  487.  * One of these structures is allocated for each nfsd.
  488.  */
  489. struct nfsd {
  490.     TAILQ_ENTRY(nfsd) nfsd_chain;    /* List of all nfsd's */
  491.     int        nfsd_flag;    /* NFSD_ flags */
  492.     struct nfssvc_sock *nfsd_slp;    /* Current socket */
  493.     int        nfsd_authlen;    /* Authenticator len */
  494.     u_char        nfsd_authstr[RPCAUTH_MAXSIZ]; /* Authenticator data */
  495.     int        nfsd_verflen;    /* and the Verifier */
  496.     u_char        nfsd_verfstr[RPCVERF_MAXSIZ];
  497.     struct proc    *nfsd_procp;    /* Proc ptr */
  498.     struct nfsrv_descript *nfsd_nd;    /* Associated nfsrv_descript */
  499. };
  500.  
  501. /* Bits for "nfsd_flag" */
  502. #define    NFSD_WAITING    0x01
  503. #define    NFSD_REQINPROG    0x02
  504. #define    NFSD_NEEDAUTH    0x04
  505. #define    NFSD_AUTHFAIL    0x08
  506.  
  507. /*
  508.  * This structure is used by the server for describing each request.
  509.  * Some fields are used only when write request gathering is performed.
  510.  */
  511. struct nfsrv_descript {
  512.     u_quad_t        nd_time;    /* Write deadline (usec) */
  513.     off_t            nd_off;        /* Start byte offset */
  514.     off_t            nd_eoff;    /* and end byte offset */
  515.     LIST_ENTRY(nfsrv_descript) nd_hash;    /* Hash list */
  516.     LIST_ENTRY(nfsrv_descript) nd_tq;        /* and timer list */
  517.     LIST_HEAD(,nfsrv_descript) nd_coalesce;    /* coalesced writes */
  518.     struct mbuf        *nd_mrep;    /* Request mbuf list */
  519.     struct mbuf        *nd_md;        /* Current dissect mbuf */
  520.     struct mbuf        *nd_mreq;    /* Reply mbuf list */
  521.     struct mbuf        *nd_nam;    /* and socket addr */
  522.     struct mbuf        *nd_nam2;    /* return socket addr */
  523.     caddr_t            nd_dpos;    /* Current dissect pos */
  524.     u_int32_t        nd_procnum;    /* RPC # */
  525.     int            nd_stable;    /* storage type */
  526.     int            nd_flag;    /* nd_flag */
  527.     int            nd_len;        /* Length of this write */
  528.     int            nd_repstat;    /* Reply status */
  529.     u_long            nd_retxid;    /* Reply xid */
  530.     u_long            nd_duration;    /* Lease duration */
  531.     struct timeval        nd_starttime;    /* Time RPC initiated */
  532.     fhandle_t        nd_fh;        /* File handle */
  533.     struct ucred        nd_cr;        /* Credentials */
  534. };
  535.  
  536. /* Bits for "nd_flag" */
  537. #define    ND_READ        LEASE_READ
  538. #define ND_WRITE    LEASE_WRITE
  539. #define ND_CHECK    0x04
  540. #define ND_LEASE    (ND_READ | ND_WRITE | ND_CHECK)
  541. #define ND_NFSV3    0x08
  542. #define ND_NQNFS    0x10
  543. #define ND_KERBNICK    0x20
  544. #define ND_KERBFULL    0x40
  545. #define ND_KERBAUTH    (ND_KERBNICK | ND_KERBFULL)
  546.  
  547. extern TAILQ_HEAD(nfsd_head, nfsd) nfsd_head;
  548. extern int nfsd_head_flag;
  549. #define    NFSD_CHECKSLP    0x01
  550.  
  551. /*
  552.  * These macros compare nfsrv_descript structures.
  553.  */
  554. #define NFSW_CONTIG(o, n) \
  555.         ((o)->nd_eoff >= (n)->nd_off && \
  556.          !bcmp((caddr_t)&(o)->nd_fh, (caddr_t)&(n)->nd_fh, NFSX_V3FH))
  557.  
  558. #define NFSW_SAMECRED(o, n) \
  559.     (((o)->nd_flag & ND_KERBAUTH) == ((n)->nd_flag & ND_KERBAUTH) && \
  560.       !bcmp((caddr_t)&(o)->nd_cr, (caddr_t)&(n)->nd_cr, \
  561.         sizeof (struct ucred)))
  562.  
  563. /*
  564.  * Defines for WebNFS
  565.  */
  566.  
  567. #define WEBNFS_ESC_CHAR        '%'
  568. #define WEBNFS_SPECCHAR_START    0x80
  569.  
  570. #define WEBNFS_NATIVE_CHAR    0x80
  571. /*
  572.  * ..
  573.  * Possibly more here in the future.
  574.  */
  575.  
  576. /*
  577.  * Macro for converting escape characters in WebNFS pathnames.
  578.  * Should really be in libkern.
  579.  */
  580.  
  581. #define HEXTOC(c) \
  582.     ((c) >= 'a' ? ((c) - ('a' - 10)) : \
  583.         ((c) >= 'A' ? ((c) - ('A' - 10)) : ((c) - '0')))
  584. #define HEXSTRTOI(p) \
  585.     ((HEXTOC(p[0]) << 4) + HEXTOC(p[1]))
  586.  
  587. #define NFSDIAG 0
  588. #if NFSDIAG
  589.  
  590. extern int nfs_debug;
  591. #define NFS_DEBUG_ASYNCIO    1 /* asynchronous i/o */
  592. #define NFS_DEBUG_WG        2 /* server write gathering */
  593. #define NFS_DEBUG_RC        4 /* server request caching */
  594. #define NFS_DEBUG_SILLY        8 /* nfs_sillyrename (.nfsXXX aka turd files) */
  595. #define NFS_DEBUG_DUP        16 /* debug duplicate requests */
  596. #define NFS_DEBUG_ATTR        32
  597.  
  598. #define NFS_DPF(cat, args)                    \
  599.     do {                            \
  600.         if (nfs_debug & NFS_DEBUG_##cat) kprintf args;    \
  601.     } while (0)
  602.  
  603. #else
  604.  
  605. #define NFS_DPF(cat, args)
  606.  
  607. #endif /* NFSDIAG */
  608.  
  609. int    nfs_init __P((struct vfsconf *vfsp));
  610. int    nfs_reply __P((struct nfsreq *));
  611. int    nfs_getreq __P((struct nfsrv_descript *,struct nfsd *,int));
  612. int    nfs_send __P((struct socket *, struct mbuf *, struct mbuf *, 
  613.               struct nfsreq *));
  614. int    nfs_rephead __P((int, struct nfsrv_descript *, struct nfssvc_sock *,
  615.              int, int, u_quad_t *, struct mbuf **, struct mbuf **,
  616.              caddr_t *));
  617. int    nfs_sndlock __P((int *, struct nfsreq *));
  618. void    nfs_sndunlock __P((int *flagp));
  619. int    nfs_disct __P((struct mbuf **, caddr_t *, int, int, caddr_t *));
  620. int    nfs_vinvalbuf __P((struct vnode *, int, struct ucred *, struct proc *,
  621.                int));
  622. int    nfs_readrpc __P((struct vnode *, struct uio *, struct ucred *));
  623. int    nfs_writerpc __P((struct vnode *, struct uio *, struct ucred *, int *, 
  624.               int *));
  625. int    nfs_readdirrpc __P((struct vnode *, struct uio *, struct ucred *));
  626. int    nfs_asyncio __P((struct buf *, struct ucred *));
  627. int    nfs_doio __P((struct buf *, struct ucred *, struct proc *));
  628. int    nfs_readlinkrpc __P((struct vnode *, struct uio *, struct ucred *));
  629. int    nfs_sigintr __P((struct nfsmount *, struct nfsreq *, struct proc *));
  630. int    nfs_readdirplusrpc __P((struct vnode *, struct uio *, struct ucred *));
  631. int    nfsm_disct __P((struct mbuf **, caddr_t *, int, int, caddr_t *));
  632. void    nfsm_srvfattr __P((struct nfsrv_descript *, struct vattr *, 
  633.                struct nfs_fattr *));
  634. void    nfsm_srvwcc __P((struct nfsrv_descript *, int, struct vattr *, int,
  635.              struct vattr *, struct mbuf **, char **));
  636. void    nfsm_srvpostopattr __P((struct nfsrv_descript *, int, struct vattr *,
  637.                 struct mbuf **, char **));
  638. int    netaddr_match __P((int, union nethostaddr *, struct mbuf *));
  639. int    nfs_request __P((struct vnode *, struct mbuf *, int, struct proc *,
  640.              struct ucred *, struct mbuf **, struct mbuf **,
  641.              caddr_t *));
  642. int    nfs_loadattrcache __P((struct vnode **, struct mbuf **, caddr_t *,
  643.                    struct vattr *));
  644. int    nfs_namei __P((struct nameidata *, fhandle_t *, int,
  645.                struct nfssvc_sock *, struct mbuf *, struct mbuf **,
  646.                caddr_t *, struct vnode **, struct proc *, int, int));
  647. void    nfsm_adj __P((struct mbuf *, int, int));
  648. int    nfsm_mbuftouio __P((struct mbuf **, struct uio *, int, caddr_t *));
  649. void    nfsrv_initcache __P((void));
  650. int    nfs_getauth __P((struct nfsmount *, struct nfsreq *, struct ucred *, 
  651.              char **, int *, char *, int *, NFSKERBKEY_T));
  652. int    nfs_getnickauth __P((struct nfsmount *, struct ucred *, char **, 
  653.                  int *, char *, int));
  654. int    nfs_savenickauth __P((struct nfsmount *, struct ucred *, int, 
  655.                   NFSKERBKEY_T, struct mbuf **, char **,
  656.                   struct mbuf *));
  657. int    nfs_adv __P((struct mbuf **, caddr_t *, int, int));
  658. void    nfs_nhinit __P((void));
  659. void    nfs_timer __P((void*));
  660. u_long    nfs_hash __P((nfsfh_t *, int));
  661. int    nfsrv_dorec __P((struct nfssvc_sock *, struct nfsd *, 
  662.              struct nfsrv_descript **));
  663. int    nfsrv_getcache __P((struct nfsrv_descript *, struct nfssvc_sock *,
  664.                 struct mbuf **));
  665. void    nfsrv_updatecache __P((struct nfsrv_descript *, int, struct mbuf *));
  666. void    nfsrv_cleancache __P((void));
  667. int    nfs_connect __P((struct nfsmount *, struct nfsreq *));
  668. void    nfs_disconnect __P((struct nfsmount *));
  669. int    nfs_getattrcache __P((struct vnode *, struct vattr *));
  670. int    nfsm_strtmbuf __P((struct mbuf **, char **, char *, long));
  671. int    nfs_bioread __P((struct vnode *, struct uio *, int, struct ucred *,
  672.              int));
  673. int    nfsm_uiotombuf __P((struct uio *, struct mbuf **, int, caddr_t *));
  674. void    nfsrv_init __P((int));
  675. void    nfs_clearcommit __P((struct mount *));
  676. int    nfsrv_errmap __P((struct nfsrv_descript *, int));
  677. void    nfsrvw_sort __P((gid_t *, int));
  678. void    nfsrv_setcred __P((struct ucred *, struct ucred *));
  679. int    nfs_writebp __P((struct buf *, int));
  680. int    nfsrv_object_create __P((struct vnode *));
  681. void    nfsrv_wakenfsd __P((struct nfssvc_sock *slp));
  682. int    nfsrv_writegather __P((struct nfsrv_descript **, struct nfssvc_sock *,
  683.                    struct proc *, struct mbuf **));
  684. int    nfs_fsinfo __P((struct nfsmount *, struct vnode *, struct ucred *,
  685.             struct proc *p));
  686.  
  687. int    nfsrv3_access __P((struct nfsrv_descript *nfsd, 
  688.                struct nfssvc_sock *slp,
  689.                struct proc *procp, struct mbuf **mrq));
  690. int    nfsrv_commit __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
  691.               struct proc *procp, struct mbuf **mrq));
  692. int    nfsrv_create __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
  693.               struct proc *procp, struct mbuf **mrq));
  694. int    nfsrv_fhtovp __P((fhandle_t *, int, struct vnode **, struct ucred *,
  695.               struct nfssvc_sock *, struct mbuf *, int *,
  696.               int, int));
  697. int    nfsrv_setpublicfs __P((struct mount *, struct netexport *,
  698.                    struct export_args *));
  699. int    nfs_ispublicfh __P((fhandle_t *));
  700. int    nfsrv_fsinfo __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
  701.               struct proc *procp, struct mbuf **mrq));
  702. int    nfsrv_getattr __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
  703.                struct proc *procp, struct mbuf **mrq));
  704. int    nfsrv_link __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
  705.             struct proc *procp, struct mbuf **mrq));
  706. int    nfsrv_lookup __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
  707.               struct proc *procp, struct mbuf **mrq));
  708. int    nfsrv_mkdir __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
  709.              struct proc *procp, struct mbuf **mrq));
  710. int    nfsrv_mknod __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
  711.              struct proc *procp, struct mbuf **mrq));
  712. int    nfsrv_noop __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
  713.             struct proc *procp, struct mbuf **mrq));
  714. int    nfsrv_null __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
  715.             struct proc *procp, struct mbuf **mrq));
  716. int    nfsrv_pathconf __P((struct nfsrv_descript *nfsd,
  717.                 struct nfssvc_sock *slp, struct proc *procp,
  718.                 struct mbuf **mrq));
  719. int    nfsrv_read __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
  720.             struct proc *procp, struct mbuf **mrq));
  721. int    nfsrv_readdir __P((struct nfsrv_descript *nfsd, 
  722.                struct nfssvc_sock *slp,
  723.                struct proc *procp, struct mbuf **mrq));
  724. int    nfsrv_readdirplus __P((struct nfsrv_descript *nfsd,
  725.                    struct nfssvc_sock *slp, struct proc *procp,
  726.                    struct mbuf **mrq));
  727. int    nfsrv_readlink __P((struct nfsrv_descript *nfsd,
  728.                 struct nfssvc_sock *slp, struct proc *procp,
  729.                 struct mbuf **mrq));
  730. int    nfsrv_remove __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
  731.               struct proc *procp, struct mbuf **mrq));
  732. int    nfsrv_rename __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
  733.               struct proc *procp, struct mbuf **mrq));
  734. int    nfsrv_rmdir __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
  735.              struct proc *procp, struct mbuf **mrq));
  736. int    nfsrv_setattr __P((struct nfsrv_descript *nfsd, 
  737.                struct nfssvc_sock *slp,
  738.                struct proc *procp, struct mbuf **mrq));
  739. int    nfsrv_statfs __P((struct nfsrv_descript *nfsd, 
  740.               struct nfssvc_sock *slp,
  741.               struct proc *procp, struct mbuf **mrq));
  742. int    nfsrv_symlink __P((struct nfsrv_descript *nfsd, 
  743.                struct nfssvc_sock *slp,
  744.                struct proc *procp, struct mbuf **mrq));
  745. int    nfsrv_write __P((struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
  746.              struct proc *procp, struct mbuf **mrq));
  747. void    nfsrv_rcv __P((struct socket *so, caddr_t arg, int waitflag));
  748. void    nfsrv_slpderef __P((struct nfssvc_sock *slp));
  749.  
  750. #if NFSDIAG
  751.  
  752. extern int nfstraceindx;
  753. #define NFSTBUFSIZ 8912
  754. struct nfstracerec { uint i1, i2, i3, i4; };
  755. extern struct nfstracerec nfstracebuf[NFSTBUFSIZ];
  756. extern uint nfstracemask; /* 32 bits - trace points over 31 are unconditional */
  757.  
  758. /* 0x0000000f nfs_getattrcache trace points */
  759. #define NFSTRC_GAC_MISS 0x00    /* 0x00000001 cache miss */
  760. #define NFSTRC_GAC_HIT    0x01    /* 0x00000002 cache hit */
  761. #define NFSTRC_GAC_NP    0x02    /* 0x00000004 np size mismatch - vp... */
  762. /* 0x00000038 nfs_loadattrcache trace points */
  763. #define NFSTRC_LAC    0x03    /* 0x00000008 function entry point - vp */
  764. #define NFSTRC_LAC_INIT    0x04    /* 0x00000010 new vp & init n_mtime - vp */
  765. #define NFSTRC_LAC_NP    0x05    /* 0x00000020 np size mismatch - vp... */
  766. /* 0x000000c0 nfs_getattr trace points */
  767. #define NFSTRC_GA_INV    0x06    /* 0x00000040 times mismatch - vp */
  768. #define NFSTRC_GA_INV1    0x07    /* 0x00000080 invalidate ok - vp */
  769. /* 0x00000100 vmp_invalidate trace points */
  770. #define NFSTRC_VMP_INV    0x08    /* 0x00000100 function entry point - vmp */
  771. /* 0x00000200 nfs_request trace points */
  772. #define NFSTRC_REQ    0x09    /* 0x00000200 - alternates vp and procnum */
  773. /* 0x00000c00 vmp_push_range trace points */
  774. #define NFSTRC_VPR    0xa    /* 0x00000400 entry point - vp... */
  775. #define NFSTRC_VPR_DONE    0xb    /* 0x00000800 tail exit - error # */
  776. /* 0x00003000 nfs_doio trace points */
  777. #define NFSTRC_DIO    0xc    /* 0x00001000 entry point - vp */
  778. #define NFSTRC_DIO_DONE    0xd    /* 0x00002000 exit points - vp */
  779. /* 0x000fc000 congestion window trace points */
  780. #define NFSTRC_CWND_INIT      0xe
  781. #define NFSTRC_CWND_REPLY     0xf
  782. #define NFSTRC_CWND_TIMER     0x10
  783. #define NFSTRC_CWND_REQ1      0x11
  784. #define NFSTRC_CWND_REQ2      0x12
  785. #define NFSTRC_CWND_SOFT      0x13
  786. /* 0xfff00000 nfs_rcvlock & nfs_rcvunlock trace points */
  787. #define NFSTRC_ECONN    0x14
  788. #define NFSTRC_RCVERR    0x15
  789. #define NFSTRC_REQFREE    0x16
  790. #define NFSTRC_NOTMINE    0x17
  791. #define NFSTRC_6    0x18
  792. #define NFSTRC_7    0x19
  793. #define NFSTRC_RCVLCKINTR    0x1a
  794. #define NFSTRC_RCVALREADY    0x1b
  795. #define NFSTRC_RCVLCKW    0x1c    /* 0x10000000 seeking recieve lock (waiting) */
  796. #define NFSTRC_RCVLCK    0x1d    /* 0x20000000 getting recieve lock */ 
  797. #define NFSTRC_RCVUNLW    0x1e    /* 0x40000000 releasing rcv lock w/ wakeup */
  798. #define NFSTRC_RCVUNL    0x1f    /* 0x80000000 releasing rcv lock w/o wakeup */
  799. /* trace points beyond 31 are on if any of above points are on */
  800. #define NFSTRC_GA_INV2    0x20    /* nfs_getattr invalidate - error# */
  801. #define NFSTRC_VBAD    0x21
  802. #define NFSTRC_REQERR    0x22
  803. #define NFSTRC_RPCERR    0x23
  804. #define NFSTRC_DISSECTERR    0x24
  805. #define NFSTRC_CONTINUE    0xff    /* continuation record for previous entry */
  806.  
  807. #define NFSTRACEX(a1, a2, a3, a4) \
  808. ( \
  809.     nfstracebuf[nfstraceindx].i1 = (uint)(a1), \
  810.     nfstracebuf[nfstraceindx].i2 = (uint)(a2), \
  811.     nfstracebuf[nfstraceindx].i3 = (uint)(a3), \
  812.     nfstracebuf[nfstraceindx].i4 = (uint)(a4), \
  813.     nfstraceindx = (nfstraceindx + 1) % NFSTBUFSIZ, \
  814.     1 \
  815. )
  816.  
  817. #define NFSTRACE(cnst, fptr) \
  818. ( \
  819.     (nfstracemask && ((cnst) > 31 || nfstracemask & 1<<(cnst))) ? \
  820.         NFSTRACEX((cnst), (fptr), current_thread(), \
  821.               clock_get_system_value().tv_nsec) : \
  822.         0 \
  823. )
  824.  
  825. #define NFSTRACE4(cnst, fptr, a2, a3, a4) \
  826. ( \
  827.     NFSTRACE(cnst,fptr) ? \
  828.         NFSTRACEX(NFSTRC_CONTINUE, a2, a3, a4) : \
  829.         0 \
  830. )
  831.  
  832. #else    /* NFSDIAG */
  833.  
  834.     #define NFSTRACE(cnst, fptr)
  835.     #define NFSTRACE4(cnst, fptr, a2, a3, a4)
  836.  
  837. #endif    /* NFSDIAG */
  838.  
  839. #endif    /* KERNEL */
  840.  
  841. #endif
  842.