#ifndef _NFS_NFS_H_
#define _NFS_NFS_H_
#include <sys/appleapiopts.h>
#include <sys/cdefs.h>
#ifdef __APPLE_API_PRIVATE
#define NFS_MAXIOVEC 34
#define NFS_TICKINTVL 5
#define NFS_HZ (hz / nfs_ticks)
#define NFS_TIMEO (1 * NFS_HZ)
#define NFS_MINTIMEO (1 * NFS_HZ)
#define NFS_MAXTIMEO (60 * NFS_HZ)
#define NFS_MINIDEMTIMEO (5 * NFS_HZ)
#define NFS_MAXREXMIT 100
#define NFS_MAXWINDOW 1024
#define NFS_RETRANS 10
#define NFS_TRYLATERDEL 15
#define NFS_MAXGRPS 16
#ifndef NFS_MINATTRTIMO
#define NFS_MINATTRTIMO 5
#endif
#ifndef NFS_MAXATTRTIMO
#define NFS_MAXATTRTIMO 60
#endif
#ifndef NFS_MINDIRATTRTIMO
#define NFS_MINDIRATTRTIMO 5
#endif
#ifndef NFS_MAXDIRATTRTIMO
#define NFS_MAXDIRATTRTIMO 60
#endif
#define NFS_WSIZE 16384
#define NFS_RSIZE 16384
#define NFS_DGRAM_WSIZE 8192
#define NFS_DGRAM_RSIZE 8192
#define NFS_READDIRSIZE 8192
#define NFS_DEFRAHEAD 4
#define NFS_MAXRAHEAD 16
#define NFS_MAXUIDHASH 64
#define NFS_MAXASYNCDAEMON 32
#define NFS_MAXGATHERDELAY 100
#ifndef NFS_GATHERDELAY
#define NFS_GATHERDELAY 10
#endif
#define NFS_DIRBLKSIZ 4096
#if defined(KERNEL) && !defined(DIRBLKSIZ)
#define DIRBLKSIZ 512
#endif
#define NMOD(a) ((a) % nfs_asyncdaemons)
#define NFS_CMPFH(n, f, s) \
((n)->n_fhsize == (s) && !bcmp((caddr_t)(n)->n_fhp, (caddr_t)(f), (s)))
#define NFS_ISV3(v) (VFSTONFS(vnode_mount(v))->nm_flag & NFSMNT_NFSV3)
#define NFS_SRVMAXDATA(n) \
(((n)->nd_flag & ND_NFSV3) ? (((n)->nd_nam2) ? \
NFS_MAXDGRAMDATA : NFS_MAXDATA) : NFS_V2MAXDATA)
#ifdef __FreeBSD__
#define NB_INVAFTERWRITE NB_NOCACHE
#else
#define NB_INVAFTERWRITE NB_INVAL
#endif
#ifndef IO_METASYNC
#define IO_METASYNC 0
#endif
#define NFS_NODEALLOC 512
#define NFS_MNTALLOC 512
#define NFS_SVCALLOC 256
#define NFS_UIDALLOC 128
#define NFS_ARGSVERSION 4
struct nfs_args {
int version;
struct sockaddr *addr;
int addrlen;
int sotype;
int proto;
u_char *fh;
int fhsize;
int flags;
int wsize;
int rsize;
int readdirsize;
int timeo;
int retrans;
int maxgrouplist;
int readahead;
int leaseterm;
int deadthresh;
char *hostname;
int acregmin;
int acregmax;
int acdirmin;
int acdirmax;
};
struct nfs_args3 {
int version;
struct sockaddr *addr;
int addrlen;
int sotype;
int proto;
u_char *fh;
int fhsize;
int flags;
int wsize;
int rsize;
int readdirsize;
int timeo;
int retrans;
int maxgrouplist;
int readahead;
int leaseterm;
int deadthresh;
char *hostname;
};
#ifdef KERNEL
#if __DARWIN_ALIGN_NATURAL
#pragma options align=natural
#endif
struct user_nfs_args {
int version;
user_addr_t addr;
int addrlen;
int sotype;
int proto;
user_addr_t fh;
int fhsize;
int flags;
int wsize;
int rsize;
int readdirsize;
int timeo;
int retrans;
int maxgrouplist;
int readahead;
int leaseterm;
int deadthresh;
user_addr_t hostname;
int acregmin;
int acregmax;
int acdirmin;
int acdirmax;
};
struct user_nfs_args3 {
int version;
user_addr_t addr;
int addrlen;
int sotype;
int proto;
user_addr_t fh;
int fhsize;
int flags;
int wsize;
int rsize;
int readdirsize;
int timeo;
int retrans;
int maxgrouplist;
int readahead;
int leaseterm;
int deadthresh;
user_addr_t hostname;
};
#if __DARWIN_ALIGN_NATURAL
#pragma options align=reset
#endif
#endif // KERNEL
#define NFSMNT_SOFT 0x00000001
#define NFSMNT_WSIZE 0x00000002
#define NFSMNT_RSIZE 0x00000004
#define NFSMNT_TIMEO 0x00000008
#define NFSMNT_RETRANS 0x00000010
#define NFSMNT_MAXGRPS 0x00000020
#define NFSMNT_INT 0x00000040
#define NFSMNT_NOCONN 0x00000080
#define NFSMNT_NFSV3 0x00000200
#define NFSMNT_KERB 0x00000400
#define NFSMNT_DUMBTIMR 0x00000800
#define NFSMNT_READAHEAD 0x00002000
#define NFSMNT_RESVPORT 0x00008000
#define NFSMNT_RDIRPLUS 0x00010000
#define NFSMNT_READDIRSIZE 0x00020000
#define NFSMNT_NOLOCKS 0x00040000
#define NFSMNT_ACREGMIN 0x00100000
#define NFSMNT_ACREGMAX 0x00200000
#define NFSMNT_ACDIRMIN 0x00400000
#define NFSMNT_ACDIRMAX 0x00800000
#define NFSSTA_LOCKTIMEO 0x00002000
#define NFSSTA_MOUNTED 0x00004000
#define NFSSTA_LOCKSWORK 0x00008000
#define NFSSTA_TIMEO 0x00010000
#define NFSSTA_FORCE 0x00020000
#define NFSSTA_HASWRITEVERF 0x00040000
#define NFSSTA_GOTPATHCONF 0x00080000
#define NFSSTA_GOTFSINFO 0x00100000
#define NFSSTA_MNTD 0x00200000
#define NFSSTA_SNDLOCK 0x01000000
#define NFSSTA_WANTSND 0x02000000
#define NFSSTA_RCVLOCK 0x04000000
#define NFSSTA_WANTRCV 0x08000000
#define NFSSTA_WAITAUTH 0x10000000
#define NFSSTA_HASAUTH 0x20000000
#define NFSSTA_WANTAUTH 0x40000000
#define NFSSTA_AUTHERR 0x80000000
#define NFSPCINFO_NOTRUNC 0x01
#define NFSPCINFO_CHOWN_RESTRICTED 0x02
#define NFSPCINFO_CASE_INSENSITIVE 0x04
#define NFSPCINFO_CASE_PRESERVING 0x08
struct nfsd_args {
int sock;
caddr_t name;
int namelen;
};
#ifdef KERNEL
#if __DARWIN_ALIGN_NATURAL
#pragma options align=natural
#endif
struct user_nfsd_args {
int sock;
user_addr_t name;
int namelen;
};
#if __DARWIN_ALIGN_NATURAL
#pragma options align=reset
#endif
#endif // KERNEL
struct nfsd_srvargs {
struct nfsd *nsd_nfsd;
uid_t nsd_uid;
u_long nsd_haddr;
struct ucred nsd_cr;
int nsd_authlen;
u_char *nsd_authstr;
int nsd_verflen;
u_char *nsd_verfstr;
struct timeval nsd_timestamp;
u_long nsd_ttl;
NFSKERBKEY_T nsd_key;
};
struct nfsd_cargs {
char *ncd_dirp;
uid_t ncd_authuid;
int ncd_authtype;
int ncd_authlen;
u_char *ncd_authstr;
int ncd_verflen;
u_char *ncd_verfstr;
NFSKERBKEY_T ncd_key;
};
#define NFS_FH_VERSION 0x4e580000
struct nfs_exphandle {
uint32_t nxh_version;
uint32_t nxh_fsid;
uint32_t nxh_expid;
uint16_t nxh_flags;
uint8_t nxh_reserved;
uint8_t nxh_fidlen;
};
#define NXHF_INVALIDFH 0x0001
#define NFS_MAX_FID_SIZE (NFS_MAX_FH_SIZE - sizeof(struct nfs_exphandle))
#define NFSV2_MAX_FID_SIZE (NFSV2_MAX_FH_SIZE - sizeof(struct nfs_exphandle))
struct nfs_filehandle {
int nfh_len;
struct nfs_exphandle nfh_xh;
unsigned char nfh_fid[NFS_MAX_FID_SIZE];
};
struct nfs_export_net_args {
uint32_t nxna_flags;
struct xucred nxna_cred;
struct sockaddr_storage nxna_addr;
struct sockaddr_storage nxna_mask;
};
struct nfs_export_args {
uint32_t nxa_fsid;
uint32_t nxa_expid;
char *nxa_fspath;
char *nxa_exppath;
uint32_t nxa_flags;
uint32_t nxa_netcount;
struct nfs_export_net_args *nxa_nets;
};
#ifdef KERNEL
#if __DARWIN_ALIGN_NATURAL
#pragma options align=natural
#endif
struct user_nfs_export_args {
uint32_t nxa_fsid;
uint32_t nxa_expid;
user_addr_t nxa_fspath;
user_addr_t nxa_exppath;
uint32_t nxa_flags;
uint32_t nxa_netcount;
user_addr_t nxa_nets;
};
#if __DARWIN_ALIGN_NATURAL
#pragma options align=reset
#endif
#endif
#define NXA_DELETE 0x0001
#define NXA_ADD 0x0002
#define NXA_REPLACE 0x0003
#define NX_READONLY 0x0001
#define NX_DEFAULTEXPORT 0x0002
#define NX_MAPROOT 0x0004
#define NX_MAPALL 0x0008
#define NX_KERB 0x0010
#ifdef KERNEL
struct nfs_exportfs;
struct nfs_export_options {
uint32_t nxo_flags;
kauth_cred_t nxo_cred;
};
struct nfs_netopt {
struct radix_node no_rnodes[2];
struct nfs_export_options no_opt;
};
struct nfs_export {
LIST_ENTRY(nfs_export) nx_next;
LIST_ENTRY(nfs_export) nx_hash;
struct nfs_export *nx_parent;
uint32_t nx_id;
uint32_t nx_flags;
struct nfs_exportfs *nx_fs;
char *nx_path;
struct nfs_filehandle nx_fh;
struct nfs_export_options nx_defopt;
uint32_t nx_expcnt;
struct radix_node_head *nx_rtable[AF_MAX+1];
};
struct nfs_exportfs {
LIST_ENTRY(nfs_exportfs) nxfs_next;
uint32_t nxfs_id;
char *nxfs_path;
LIST_HEAD(,nfs_export) nxfs_exports;
};
extern LIST_HEAD(nfsexpfslist, nfs_exportfs) nfs_exports;
extern lck_rw_t nfs_export_rwlock; #define NFSEXPHASHVAL(FSID, EXPID) \
(((FSID) >> 24) ^ ((FSID) >> 16) ^ ((FSID) >> 8) ^ (EXPID))
#define NFSEXPHASH(FSID, EXPID) \
(&nfsexphashtbl[NFSEXPHASHVAL((FSID),(EXPID)) & nfsexphash])
extern LIST_HEAD(nfsexphashhead, nfs_export) *nfsexphashtbl;
extern u_long nfsexphash;
#endif // KERNEL
#ifdef NFS_NPROCS
struct nfsstats {
int attrcache_hits;
int attrcache_misses;
int lookupcache_hits;
int lookupcache_misses;
int direofcache_hits;
int direofcache_misses;
int biocache_reads;
int read_bios;
int read_physios;
int biocache_writes;
int write_bios;
int write_physios;
int biocache_readlinks;
int readlink_bios;
int biocache_readdirs;
int readdir_bios;
int rpccnt[NFS_NPROCS];
int rpcretries;
int srvrpccnt[NFS_NPROCS];
int srvrpc_errs;
int srv_errs;
int rpcrequests;
int rpctimeouts;
int rpcunexpected;
int rpcinvalid;
int srvcache_inproghits;
int srvcache_idemdonehits;
int srvcache_nonidemdonehits;
int srvcache_misses;
int srvvop_writes;
int pageins;
int pageouts;
};
#endif
#define NFSSVC_BIOD 0x002
#define NFSSVC_NFSD 0x004
#define NFSSVC_ADDSOCK 0x008
#define NFSSVC_AUTHIN 0x010
#define NFSSVC_GOTAUTH 0x040
#define NFSSVC_AUTHINFAIL 0x080
#define NFSSVC_MNTD 0x100
#define NFSSVC_EXPORT 0x200
#define NFSCLNT_LOCKDANS 0x200
#define NFSCLNT_LOCKDFD 0x400
#define NFSCLNT_LOCKDWAIT 0x800
#define NFS_NFSSTATS 1
#define NFS_NFSPRIVPORT 2
#define FS_NFS_NAMES { \
{ 0, 0 }, \
{ "nfsstats", CTLTYPE_STRUCT }, \
{ "nfsprivport", CTLTYPE_INT }, \
}
#ifndef NFS_MUIDHASHSIZ
#define NFS_MUIDHASHSIZ 63
#endif
#ifndef NFS_WDELAYHASHSIZ
#define NFS_WDELAYHASHSIZ 16
#endif
#ifdef KERNEL
#include <sys/kernel_types.h>
#ifdef MALLOC_DECLARE
MALLOC_DECLARE(M_NFSREQ);
MALLOC_DECLARE(M_NFSMNT);
MALLOC_DECLARE(M_NFSDIROFF);
MALLOC_DECLARE(M_NFSRVDESC);
MALLOC_DECLARE(M_NFSUID);
MALLOC_DECLARE(M_NFSD);
MALLOC_DECLARE(M_NFSBIGFH);
#endif
struct uio; struct vnode_attr; struct nameidata;
struct nfsbuf;
struct nfs_vattr;
struct nfsnode;
#define NFSINT_SIGMASK (sigmask(SIGINT)|sigmask(SIGTERM)|sigmask(SIGKILL)| \
sigmask(SIGHUP)|sigmask(SIGQUIT))
__private_extern__ int nfs_mbuf_mlen, nfs_mbuf_mhlen,
nfs_mbuf_minclsize, nfs_mbuf_mclbytes;
#define NFSIGNORE_SOERROR(s, e) \
((e) != EINTR && (e) != ERESTART && (e) != EWOULDBLOCK && \
(e) != EIO && ((s)) != SOCK_STREAM)
struct nfsreq {
TAILQ_ENTRY(nfsreq) r_chain;
mbuf_t r_mreq;
mbuf_t r_mrep;
mbuf_t r_md;
caddr_t r_dpos;
struct nfsmount *r_nmp;
vnode_t r_vp;
u_long r_xid;
int r_flags;
int r_retry;
int r_rexmit;
int r_timer;
u_int32_t r_procnum;
int r_rtt;
proc_t r_procp;
long r_lastmsg;
};
extern TAILQ_HEAD(nfs_reqq, nfsreq) nfs_reqq;
#define R_TIMING 0x0001
#define R_SENT 0x0002
#define R_SOFTTERM 0x0004
#define R_INTR 0x0008
#define R_SOCKERR 0x0010
#define R_TPRINTFMSG 0x0020
#define R_MUSTRESEND 0x0040
#define R_BUSY 0x0100
#define R_WAITING 0x0200
#define R_RESENDERR 0x0400
#ifndef NFS_UIDHASHSIZ
#define NFS_UIDHASHSIZ 13
#endif
#define NUIDHASH(sock, uid) \
(&(sock)->ns_uidhashtbl[(uid) % NFS_UIDHASHSIZ])
#define NWDELAYHASH(sock, f) \
(&(sock)->ns_wdelayhashtbl[(*((u_long *)(f))) % NFS_WDELAYHASHSIZ])
#define NMUIDHASH(nmp, uid) \
(&(nmp)->nm_uidhashtbl[(uid) % NFS_MUIDHASHSIZ])
#define NFSNOHASH(fhsum) \
(&nfsnodehashtbl[(fhsum) & nfsnodehash])
union nethostaddr {
u_long had_inetaddr;
mbuf_t had_nam;
};
struct nfsuid {
TAILQ_ENTRY(nfsuid) nu_lru;
LIST_ENTRY(nfsuid) nu_hash;
int nu_flag;
union nethostaddr nu_haddr;
kauth_cred_t nu_cr;
int nu_expire;
struct timeval nu_timestamp;
u_long nu_nickname;
NFSKERBKEY_T nu_key;
};
#define nu_inetaddr nu_haddr.had_inetaddr
#define nu_nam nu_haddr.had_nam
#define NU_INETADDR 0x1
#define NU_NAM 0x2
#define NU_NETFAM(u) (((u)->nu_flag & NU_INETADDR) ? AF_INET : AF_ISO)
#ifdef notyet
struct nfsrv_rec {
STAILQ_ENTRY(nfsrv_rec) nr_link;
struct sockaddr *nr_address;
mbuf_t nr_packet;
};
#endif
struct nfssvc_sock {
TAILQ_ENTRY(nfssvc_sock) ns_chain;
lck_rw_t ns_rwlock;
socket_t ns_so;
mbuf_t ns_nam;
mbuf_t ns_raw;
mbuf_t ns_rawend;
mbuf_t ns_rec;
mbuf_t ns_recend;
mbuf_t ns_frag;
int ns_flag;
int ns_sotype;
int ns_cc;
int ns_reclen;
int ns_numuids;
u_long ns_sref;
lck_mtx_t ns_wgmutex;
u_quad_t ns_wgtime;
LIST_HEAD(, nfsrv_descript) ns_tq;
LIST_HEAD(nfsrvw_delayhash, nfsrv_descript) ns_wdelayhashtbl[NFS_WDELAYHASHSIZ];
TAILQ_HEAD(, nfsuid) ns_uidlruhead;
LIST_HEAD(, nfsuid) ns_uidhashtbl[NFS_UIDHASHSIZ];
};
#define SLP_VALID 0x01
#define SLP_DOREC 0x02
#define SLP_NEEDQ 0x04
#define SLP_DISCONN 0x08
#define SLP_GETSTREAM 0x10
#define SLP_LASTFRAG 0x20
#define SLP_ALLFLAGS 0xff
extern TAILQ_HEAD(nfssvc_sockhead, nfssvc_sock) nfssvc_sockhead;
extern lck_grp_attr_t *nfs_slp_group_attr;
extern lck_attr_t *nfs_slp_lock_attr;
extern lck_grp_t *nfs_slp_rwlock_group;
extern lck_grp_t *nfs_slp_mutex_group;
struct nfsd {
TAILQ_ENTRY(nfsd) nfsd_chain;
int nfsd_flag;
struct nfssvc_sock *nfsd_slp;
int nfsd_authlen;
u_char nfsd_authstr[RPCAUTH_MAXSIZ];
int nfsd_verflen;
u_char nfsd_verfstr[RPCVERF_MAXSIZ];
proc_t nfsd_procp;
struct nfsrv_descript *nfsd_nd;
};
#define NFSD_WAITING 0x01
#define NFSD_REQINPROG 0x02
#define NFSD_NEEDAUTH 0x04
#define NFSD_AUTHFAIL 0x08
struct nfsrv_descript {
u_quad_t nd_time;
off_t nd_off;
off_t nd_eoff;
LIST_ENTRY(nfsrv_descript) nd_hash;
LIST_ENTRY(nfsrv_descript) nd_tq;
LIST_HEAD(,nfsrv_descript) nd_coalesce;
mbuf_t nd_mrep;
mbuf_t nd_md;
mbuf_t nd_mreq;
mbuf_t nd_nam;
mbuf_t nd_nam2;
caddr_t nd_dpos;
u_int32_t nd_procnum;
int nd_stable;
int nd_flag;
int nd_len;
int nd_repstat;
u_long nd_retxid;
struct timeval nd_starttime;
struct nfs_filehandle nd_fh;
kauth_cred_t nd_cr;
};
#define ND_NFSV3 0x08
#define ND_KERBNICK 0x20
#define ND_KERBFULL 0x40
#define ND_KERBAUTH (ND_KERBNICK | ND_KERBFULL)
extern TAILQ_HEAD(nfsd_head, nfsd) nfsd_head;
extern int nfsd_head_flag;
#define NFSD_CHECKSLP 0x01
#define NFSW_CONTIG(o, n) \
(((o)->nd_eoff >= (n)->nd_off) && \
((o)->nd_fh.nfh_len == (n)->nd_fh.nfh_len) && \
!bcmp((caddr_t)&(o)->nd_fh, (caddr_t)&(n)->nd_fh, (o)->nd_fh.nfh_len))
#define NFSW_SAMECRED(o, n) \
(((o)->nd_flag & ND_KERBAUTH) == ((n)->nd_flag & ND_KERBAUTH) && \
!bcmp((caddr_t)(o)->nd_cr, (caddr_t)(n)->nd_cr, \
sizeof (struct ucred)))
extern lck_grp_t * nfsd_lck_grp;
extern lck_grp_attr_t * nfsd_lck_grp_attr;
extern lck_attr_t * nfsd_lck_attr;
extern lck_mtx_t *nfsd_mutex;
extern int nfs_numnfsd, nfsd_waiting;
#define WEBNFS_ESC_CHAR '%'
#define WEBNFS_SPECCHAR_START 0x80
#define WEBNFS_NATIVE_CHAR 0x80
#define ISHEX(c) \
((((c) >= 'a') && ((c) <= 'f')) || \
(((c) >= 'A') && ((c) <= 'F')) || \
(((c) >= '0') && ((c) <= '9')))
#define HEXTOC(c) \
((c) >= 'a' ? ((c) - ('a' - 10)) : \
((c) >= 'A' ? ((c) - ('A' - 10)) : ((c) - '0')))
#define HEXSTRTOI(p) \
((HEXTOC(p[0]) << 4) + HEXTOC(p[1]))
__BEGIN_DECLS
int nfs_init(struct vfsconf *vfsp);
void nfs_mbuf_init(void);
int nfs_reply(struct nfsreq *);
int nfs_getreq(struct nfsrv_descript *,struct nfsd *,int);
int nfs_send(socket_t, mbuf_t, mbuf_t, struct nfsreq *);
int nfs_rephead(int, struct nfsrv_descript *, struct nfssvc_sock *,
int, mbuf_t *, mbuf_t *, caddr_t *);
int nfs_sndlock(struct nfsreq *);
void nfs_sndunlock(struct nfsreq *);
int nfs_vinvalbuf(vnode_t, int, struct ucred *, proc_t, int);
int nfs_buf_page_inval(vnode_t vp, off_t offset);
int nfs_readrpc(vnode_t, struct uio *, struct ucred *, proc_t);
int nfs_writerpc(vnode_t, struct uio *, struct ucred *, proc_t, int *, int *);
int nfs_readdirrpc(vnode_t, struct uio *, struct ucred *, proc_t);
int nfs_readdirplusrpc(vnode_t, struct uio *, struct ucred *, proc_t);
int nfs_asyncio(struct nfsbuf *, struct ucred *);
int nfs_doio(struct nfsbuf *, struct ucred *, proc_t);
int nfs_readlinkrpc(vnode_t, struct uio *, struct ucred *, proc_t);
int nfs_sigintr(struct nfsmount *, struct nfsreq *, proc_t);
int nfsm_disct(mbuf_t *, caddr_t *, int, int, caddr_t *);
void nfsm_srvfattr(struct nfsrv_descript *, struct vnode_attr *,
struct nfs_fattr *);
void nfsm_srvwcc(struct nfsrv_descript *, int, struct vnode_attr *, int,
struct vnode_attr *, mbuf_t *, char **);
void nfsm_srvpostopattr(struct nfsrv_descript *, int, struct vnode_attr *,
mbuf_t *, char **);
int netaddr_match(int, union nethostaddr *, mbuf_t);
int nfs_request(vnode_t, mount_t, mbuf_t, int, proc_t,
struct ucred *, mbuf_t *, mbuf_t *,
caddr_t *, u_int64_t *);
int nfs_parsefattr(mbuf_t *, caddr_t *, int, struct nfs_vattr *);
int nfs_loadattrcache(struct nfsnode *, struct nfs_vattr *, u_int64_t *, int);
int nfsm_path_mbuftond(mbuf_t *, caddr_t *, int, int, int *, struct nameidata *);
int nfs_namei(struct nfsrv_descript *, struct vfs_context *, struct nameidata *,
struct nfs_filehandle *, mbuf_t, int, vnode_t *,
struct nfs_export **, struct nfs_export_options **);
void nfsm_adj(mbuf_t, int, int);
int nfsm_mbuftouio(mbuf_t *, struct uio *, int, caddr_t *);
void nfsrv_initcache(void);
int nfs_getauth(struct nfsmount *, struct nfsreq *, struct ucred *,
char **, int *, char *, int *, NFSKERBKEY_T);
int nfs_getnickauth(struct nfsmount *, struct ucred *, char **,
int *, char *, int);
int nfs_savenickauth(struct nfsmount *, struct ucred *, int,
NFSKERBKEY_T, mbuf_t *, char **,
mbuf_t);
int nfs_adv(mbuf_t *, caddr_t *, int, int);
void nfs_nhinit(void);
void nfs_timer_funnel(void*);
void nfs_timer(void*);
u_long nfs_hash(u_char *, int);
int nfsrv_dorec(struct nfssvc_sock *, struct nfsd *,
struct nfsrv_descript **);
int nfsrv_getcache(struct nfsrv_descript *, struct nfssvc_sock *,
mbuf_t *);
void nfsrv_updatecache(struct nfsrv_descript *, int, mbuf_t);
void nfsrv_cleancache(void);
int nfs_bind_resv_thread_wake(void);
int nfs_connect(struct nfsmount *, struct nfsreq *);
void nfs_disconnect(struct nfsmount *);
int nfs_getattr_no_vnode(mount_t,u_char *,int,struct ucred *,proc_t,struct nfs_vattr *,u_int64_t *);
int nfs_getattr(vnode_t vp, struct nfs_vattr *nvap, struct ucred *cred, proc_t p);
int nfs_getattrcache(vnode_t, struct nfs_vattr *);
int nfs_attrcachetimeout(vnode_t);
int nfsm_strtmbuf(mbuf_t *, char **, char *, long);
int nfs_bioread(vnode_t, struct uio *, int, struct ucred *, proc_t);
int nfsm_uiotombuf(struct uio *, mbuf_t *, int, caddr_t *);
void nfsrv_init(int);
int nfs_commit(vnode_t vp, u_quad_t offset, u_int32_t count,
struct ucred *cred, proc_t procp);
int nfs_flushcommits(vnode_t, proc_t, int);
int nfs_flush(vnode_t,int,struct ucred *,proc_t,int);
void nfs_clearcommit(mount_t);
int nfsrv_errmap(struct nfsrv_descript *, int);
void nfsrvw_sort(gid_t *, int);
void nfsrv_setcred(struct ucred *, struct ucred *);
int nfs_buf_write(struct nfsbuf *);
void nfsrv_wakenfsd(struct nfssvc_sock *slp);
int nfsrv_writegather(struct nfsrv_descript **, struct nfssvc_sock *,
proc_t, mbuf_t *);
int nfs_fsinfo(struct nfsmount *, vnode_t, struct ucred *, proc_t p);
int nfs_pathconfrpc(vnode_t, struct nfsv3_pathconf *, kauth_cred_t, proc_t);
void nfs_pathconf_cache(struct nfsmount *, struct nfsv3_pathconf *);
int nfsrv3_access(struct nfsrv_descript *nfsd,
struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_commit(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_credcheck(struct nfsrv_descript *, struct nfs_export *,
struct nfs_export_options *);
int nfsrv_export(struct user_nfs_export_args *, struct vfs_context *);
int nfsrv_fhmatch(struct nfs_filehandle *fh1, struct nfs_filehandle *fh2);
int nfsrv_fhtovp(struct nfs_filehandle *, mbuf_t, int, vnode_t *,
struct nfs_export **, struct nfs_export_options **);
int nfs_ispublicfh(struct nfs_filehandle *);
int nfsrv_fsinfo(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_getattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_link(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_lookup(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_mkdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_mknod(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_noop(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_null(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_pathconf(struct nfsrv_descript *nfsd,
struct nfssvc_sock *slp, proc_t procp,
mbuf_t *mrq);
void nfsrv_rcv(socket_t, caddr_t arg, int waitflag);
void nfsrv_rcv_locked(socket_t, struct nfssvc_sock *slp, int waitflag);
int nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_readdir(struct nfsrv_descript *nfsd,
struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_readdirplus(struct nfsrv_descript *nfsd,
struct nfssvc_sock *slp, proc_t procp,
mbuf_t *mrq);
int nfsrv_readlink(struct nfsrv_descript *nfsd,
struct nfssvc_sock *slp, proc_t procp,
mbuf_t *mrq);
int nfsrv_remove(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_rmdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_setattr(struct nfsrv_descript *nfsd,
struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
void nfsrv_slpderef(struct nfssvc_sock *slp);
int nfsrv_statfs(struct nfsrv_descript *nfsd,
struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_symlink(struct nfsrv_descript *nfsd,
struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_write(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
proc_t procp, mbuf_t *mrq);
int nfsrv_vptofh( struct nfs_export *, int, struct nfs_filehandle *,
vnode_t, struct vfs_context *, struct nfs_filehandle *);
void nfs_up(struct nfsmount *, proc_t, int, const char *);
void nfs_down(struct nfsmount *, proc_t, int, int, const char *);
struct nfs_diskless;
int nfs_boot_init(struct nfs_diskless *nd, proc_t procp);
int nfs_boot_getfh(struct nfs_diskless *nd, proc_t procp, int v3, int sotype);
__END_DECLS
#endif
#endif
#endif