1139823Simp/*-
222521Sdyson * Copyright (c) 1989, 1993, 1995
31541Srgrimes *	The Regents of the University of California.  All rights reserved.
41541Srgrimes *
51541Srgrimes * This code is derived from software contributed to Berkeley by
61541Srgrimes * Rick Macklem at The University of Guelph.
71541Srgrimes *
81541Srgrimes * Redistribution and use in source and binary forms, with or without
91541Srgrimes * modification, are permitted provided that the following conditions
101541Srgrimes * are met:
111541Srgrimes * 1. Redistributions of source code must retain the above copyright
121541Srgrimes *    notice, this list of conditions and the following disclaimer.
131541Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
141541Srgrimes *    notice, this list of conditions and the following disclaimer in the
151541Srgrimes *    documentation and/or other materials provided with the distribution.
161541Srgrimes * 4. Neither the name of the University nor the names of its contributors
171541Srgrimes *    may be used to endorse or promote products derived from this software
181541Srgrimes *    without specific prior written permission.
191541Srgrimes *
201541Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
211541Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
221541Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
231541Srgrimes * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
241541Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
251541Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
261541Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
271541Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
281541Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
291541Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
301541Srgrimes * SUCH DAMAGE.
311541Srgrimes *
3222521Sdyson *	@(#)nfs.h	8.4 (Berkeley) 5/1/95
3350477Speter * $FreeBSD$
341541Srgrimes */
351541Srgrimes
3683651Speter#ifndef _NFSSERVER_NFS_H_
3783651Speter#define _NFSSERVER_NFS_H_
382175Spaul
3955206Speter#ifdef _KERNEL
4037272Sjmg#include "opt_nfs.h"
4137291Sjmg#endif
4237272Sjmg
43190971Srmacklem#include <nfs/nfssvc.h>
44190971Srmacklem
451541Srgrimes/*
461541Srgrimes * Tunable constants for nfs
471541Srgrimes */
481541Srgrimes
49126962Speter#define NFS_TICKINTVL	10		/* Desired time for a tick (msec) */
509336Sdfr#define NFS_HZ		(hz / nfs_ticks) /* Ticks/sec */
519336Sdfr#define	NFS_TIMEO	(1 * NFS_HZ)	/* Default timeout = 1 second */
529336Sdfr#define	NFS_MINTIMEO	(1 * NFS_HZ)	/* Min timeout to use */
539336Sdfr#define	NFS_MAXTIMEO	(60 * NFS_HZ)	/* Max timeout to backoff to */
549336Sdfr#define	NFS_MINIDEMTIMEO (5 * NFS_HZ)	/* Min timeout for non-idempotent ops*/
551541Srgrimes#define	NFS_MAXUIDHASH	64		/* Max. # of hashed uid entries/mp */
569336Sdfr#ifndef NFS_GATHERDELAY
579336Sdfr#define NFS_GATHERDELAY		10	/* Default write gather delay (msec) */
589336Sdfr#endif
5955206Speter#ifdef _KERNEL
6024378Sbde#define	DIRBLKSIZ	512		/* XXX we used to use ufs's DIRBLKSIZ */
6124378Sbde#endif
629336Sdfr
639336Sdfr/*
649336Sdfr * Oddballs
659336Sdfr */
669336Sdfr#define NFS_SRVMAXDATA(n) \
679336Sdfr		(((n)->nd_flag & ND_NFSV3) ? (((n)->nd_nam2) ? \
689336Sdfr		 NFS_MAXDGRAMDATA : NFS_MAXDATA) : NFS_V2MAXDATA)
691541Srgrimes
701541Srgrimes/*
719336Sdfr * XXX
729336Sdfr * The B_INVAFTERWRITE flag should be set to whatever is required by the
739336Sdfr * buffer cache code to say "Invalidate the block after it is written back".
749336Sdfr */
759336Sdfr#define	B_INVAFTERWRITE	B_NOCACHE
769336Sdfr
779336Sdfr/*
7896755Strhodes * The IO_METASYNC flag should be implemented for local filesystems.
799336Sdfr * (Until then, it is nothin at all.)
809336Sdfr */
819336Sdfr#ifndef IO_METASYNC
829336Sdfr#define IO_METASYNC	0
839336Sdfr#endif
849336Sdfr
8583651Speter/* NFS state flags XXX -Wunused */
8683651Speter#define	NFSRV_SNDLOCK		0x01000000  /* Send socket lock */
8783651Speter#define	NFSRV_WANTSND		0x02000000  /* Want above */
8822521Sdyson
8922521Sdyson/*
90201899Smarius * Structures for the nfssvc(2) syscall.  Not that anyone but nfsd and
91201899Smarius * mount_nfs should ever try and use it.
921541Srgrimes */
93184588Sdfr
94184588Sdfr/*
95184588Sdfr * Add a socket to monitor for NFS requests.
96184588Sdfr */
97184588Sdfrstruct nfsd_addsock_args {
981541Srgrimes	int	sock;		/* Socket to serve */
9922521Sdyson	caddr_t	name;		/* Client addr for connection based sockets */
1001541Srgrimes	int	namelen;	/* Length of name */
1011541Srgrimes};
1021541Srgrimes
1031541Srgrimes/*
104184588Sdfr * Start processing requests.
105184588Sdfr */
106184588Sdfrstruct nfsd_nfsd_args {
107184588Sdfr	const char *principal;	/* GSS-API service principal name */
108184588Sdfr	int	minthreads;	/* minimum service thread count */
109184588Sdfr	int	maxthreads;	/* maximum service thread count */
110184588Sdfr};
111184588Sdfr
112184588Sdfr/*
11322521Sdyson * XXX to allow amd to include nfs.h without nfsproto.h
11422521Sdyson */
11522521Sdyson#ifdef NFS_NPROCS
11683651Speter#include <nfsserver/nfsrvstats.h>
11722521Sdyson#endif
1181541Srgrimes
1191541Srgrimes/*
12083651Speter * vfs.nfsrv sysctl(3) identifiers
1213820Swollman */
12283651Speter#define NFS_NFSRVSTATS	1		/* struct: struct nfsrvstats */
12324330Sguido#define NFS_NFSPRIVPORT	2		/* int: prohibit nfs to resvports */
1243820Swollman
12555206Speter#ifdef _KERNEL
1264067Swollman
127129639Srwatsonextern struct mtx nfsd_mtx;
128129639Srwatson#define	NFSD_LOCK_ASSERT()	mtx_assert(&nfsd_mtx, MA_OWNED)
129129639Srwatson#define	NFSD_UNLOCK_ASSERT()	mtx_assert(&nfsd_mtx, MA_NOTOWNED)
130129639Srwatson#define	NFSD_LOCK_DONTCARE()
131129639Srwatson#define	NFSD_LOCK()	mtx_lock(&nfsd_mtx)
132129639Srwatson#define	NFSD_UNLOCK()	mtx_unlock(&nfsd_mtx)
133129639Srwatson
13430354Sphk#ifdef MALLOC_DECLARE
13530354SphkMALLOC_DECLARE(M_NFSRVDESC);
13630354SphkMALLOC_DECLARE(M_NFSD);
13730354Sphk#endif
13830354Sphk
13983651Speter/* Forward declarations */
14083651Speterstruct nfssvc_sock;
14183651Speterstruct nfsrv_descript;
14283651Speterstruct uio;
14383651Speterstruct vattr;
14483651Speterstruct nameidata;
14536329Speter
146126723Skanextern struct callout nfsrv_callout;
14783651Speterextern struct nfsrvstats nfsrvstats;
14838894Sbde
14989094Smsmithextern int	nfsrv_ticks;
15083651Speterextern int	nfsrvw_procrastinate;
15183651Speterextern int	nfsrvw_procrastinate_v3;
152128112Speadarextern int 	nfsrv_numnfsd;
1534067Swollman
15483651Speter/* Various values converted to XDR form. */
15589094Smsmithextern u_int32_t nfsrv_nfs_false, nfsrv_nfs_true, nfsrv_nfs_xdrneg1,
15689094Smsmith	nfsrv_nfs_prog;
15789094Smsmithextern u_int32_t nfsrv_rpc_reply, nfsrv_rpc_msgdenied, nfsrv_rpc_mismatch,
15889094Smsmith	nfsrv_rpc_vers;
15989094Smsmithextern u_int32_t nfsrv_rpc_auth_unix, nfsrv_rpc_msgaccepted, nfsrv_rpc_call,
16089094Smsmith	nfsrv_rpc_autherr;
1611541Srgrimes
16283651Speter/* Procedure table data */
163129639Srwatsonextern const int	nfsrvv2_procid[NFS_NPROCS];
164129639Srwatsonextern const int	nfsrv_nfsv3_procid[NFS_NPROCS];
16583651Speterextern int32_t (*nfsrv3_procs[NFS_NPROCS])(struct nfsrv_descript *nd,
166183103Sattilio		    struct nfssvc_sock *slp, struct mbuf **mreqp);
1671541Srgrimes
1681541Srgrimes/*
1691541Srgrimes * A list of nfssvc_sock structures is maintained with all the sockets
1701541Srgrimes * that require service by the nfsd.
1711541Srgrimes */
1729336Sdfr#ifndef NFS_WDELAYHASHSIZ
1739336Sdfr#define	NFS_WDELAYHASHSIZ 16	/* and with this */
1749336Sdfr#endif
1759336Sdfr#define	NWDELAYHASH(sock, f) \
17636541Speter	(&(sock)->ns_wdelayhashtbl[(*((u_int32_t *)(f))) % NFS_WDELAYHASHSIZ])
1771541Srgrimes
17836503Speter/*
1799336Sdfr * This structure is used by the server for describing each request.
1809336Sdfr */
1819336Sdfrstruct nfsrv_descript {
1829336Sdfr	struct mbuf		*nd_mrep;	/* Request mbuf list */
1839336Sdfr	struct mbuf		*nd_md;		/* Current dissect mbuf */
1849336Sdfr	struct mbuf		*nd_mreq;	/* Reply mbuf list */
18528270Swollman	struct sockaddr		*nd_nam;	/* and socket addr */
18628270Swollman	struct sockaddr		*nd_nam2;	/* return socket addr */
1879336Sdfr	caddr_t			nd_dpos;	/* Current dissect pos */
18826420Sdfr	u_int32_t		nd_procnum;	/* RPC # */
1899336Sdfr	int			nd_stable;	/* storage type */
1909336Sdfr	int			nd_flag;	/* nd_flag */
1919336Sdfr	int			nd_repstat;	/* Reply status */
1929336Sdfr	fhandle_t		nd_fh;		/* File handle */
193154960Scsjp	struct ucred		*nd_cr;		/* Credentials */
194184588Sdfr	int			nd_credflavor;	/* Security flavor */
1959336Sdfr};
1969336Sdfr
1979336Sdfr/* Bits for "nd_flag" */
1989336Sdfr#define ND_NFSV3	0x08
1999336Sdfr
2009336Sdfr/*
20127446Sdfr * Defines for WebNFS
20227446Sdfr */
20327446Sdfr
20427446Sdfr#define WEBNFS_ESC_CHAR		'%'
20527446Sdfr#define WEBNFS_SPECCHAR_START	0x80
20627446Sdfr
20727446Sdfr#define WEBNFS_NATIVE_CHAR	0x80
20827446Sdfr/*
20927446Sdfr * ..
21027446Sdfr * Possibly more here in the future.
21127446Sdfr */
21227446Sdfr
21327446Sdfr/*
21427446Sdfr * Macro for converting escape characters in WebNFS pathnames.
21527446Sdfr * Should really be in libkern.
21627446Sdfr */
21727446Sdfr
21827446Sdfr#define HEXTOC(c) \
21927446Sdfr	((c) >= 'a' ? ((c) - ('a' - 10)) : \
22027446Sdfr	    ((c) >= 'A' ? ((c) - ('A' - 10)) : ((c) - '0')))
22127446Sdfr#define HEXSTRTOI(p) \
22227446Sdfr	((HEXTOC(p[0]) << 4) + HEXTOC(p[1]))
22327446Sdfr
22425663Sdfr#ifdef NFS_DEBUG
22522521Sdyson
22625663Sdfrextern int nfs_debug;
22725663Sdfr#define NFS_DEBUG_ASYNCIO	1 /* asynchronous i/o */
22825663Sdfr#define NFS_DEBUG_WG		2 /* server write gathering */
22925663Sdfr#define NFS_DEBUG_RC		4 /* server request caching */
23025663Sdfr
23125663Sdfr#define NFS_DPF(cat, args)					\
23225663Sdfr	do {							\
23325663Sdfr		if (nfs_debug & NFS_DEBUG_##cat) printf args;	\
23425663Sdfr	} while (0)
23525663Sdfr
23625663Sdfr#else
23725663Sdfr
23825663Sdfr#define NFS_DPF(cat, args)
23925663Sdfr
24025663Sdfr#endif
24125663Sdfr
242216632Spjd/*
243216632Spjd * The following flags can be passed to nfsrv_fhtovp() function.
244216632Spjd */
245216632Spjd/* Leave file system busy on success. */
246216632Spjd#define	NFSRV_FLAG_BUSY		0x01
247216632Spjd
24884079Speterstruct mbuf *nfs_rephead(int, struct nfsrv_descript *, int, struct mbuf **,
24984079Speter	    caddr_t *);
25083651Spetervoid	nfsm_srvfattr(struct nfsrv_descript *, struct vattr *,
25183651Speter	    struct nfs_fattr *);
25283651Spetervoid	nfsm_srvwcc(struct nfsrv_descript *, int, struct vattr *, int,
25383651Speter	    struct vattr *, struct mbuf **, char **);
25483651Spetervoid	nfsm_srvpostopattr(struct nfsrv_descript *, int, struct vattr *,
25583651Speter	    struct mbuf **, char **);
256184588Sdfrint	nfs_namei(struct nameidata *, struct nfsrv_descript *, fhandle_t *,
257184588Sdfr	    int, struct nfssvc_sock *, struct sockaddr *, struct mbuf **,
258183103Sattilio	    caddr_t *, struct vnode **, int, struct vattr *, int *, int);
25983651Spetervoid	nfsm_adj(struct mbuf *, int, int);
26083651Speterint	nfsm_mbuftouio(struct mbuf **, struct uio *, int, caddr_t *);
26183651Spetervoid	nfsrv_init(int);
26283651Speterint	nfsrv_errmap(struct nfsrv_descript *, int);
26383651Spetervoid	nfsrvw_sort(gid_t *, int);
2646361Sphk
26583651Speterint	nfsrv3_access(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
266183103Sattilio	    struct mbuf **mrq);
26783651Speterint	nfsrv_commit(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
268183103Sattilio	    struct mbuf **mrq);
26983651Speterint	nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
270183103Sattilio	    struct mbuf **mrq);
271184588Sdfrint	nfsrv_fhtovp(fhandle_t *, int, struct vnode **, int *,
272184588Sdfr	    struct nfsrv_descript *, struct nfssvc_sock *, struct sockaddr *,
273216632Spjd	    int *);
27483651Speterint	nfsrv_setpublicfs(struct mount *, struct netexport *,
27583651Speter	    struct export_args *);
27683651Speterint	nfs_ispublicfh(fhandle_t *);
27783651Speterint	nfsrv_fsinfo(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
278183103Sattilio	    struct mbuf **mrq);
27983651Speterint	nfsrv_getattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
280183103Sattilio	    struct mbuf **mrq);
28183651Speterint	nfsrv_link(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
282183103Sattilio	    struct mbuf **mrq);
28383651Speterint	nfsrv_lookup(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
284183103Sattilio	    struct mbuf **mrq);
28583651Speterint	nfsrv_mkdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
286183103Sattilio	    struct mbuf **mrq);
28783651Speterint	nfsrv_mknod(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
288183103Sattilio	    struct mbuf **mrq);
28983651Speterint	nfsrv_noop(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
290183103Sattilio	    struct mbuf **mrq);
29183651Speterint	nfsrv_null(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
292183103Sattilio	    struct mbuf **mrq);
29383651Speterint	nfsrv_pathconf(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
294183103Sattilio	    struct mbuf **mrq);
29583651Speterint	nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
296183103Sattilio	    struct mbuf **mrq);
29783651Speterint	nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
298183103Sattilio	    struct mbuf **mrq);
29983651Speterint	nfsrv_readdirplus(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
300183103Sattilio	    struct mbuf **mrq);
30183651Speterint	nfsrv_readlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
302183103Sattilio	    struct mbuf **mrq);
30383651Speterint	nfsrv_remove(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
304183103Sattilio	    struct mbuf **mrq);
30583651Speterint	nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
306183103Sattilio	    struct mbuf **mrq);
30783651Speterint	nfsrv_rmdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
308183103Sattilio	    struct mbuf **mrq);
30983651Speterint	nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
310183103Sattilio	    struct mbuf **mrq);
31183651Speterint	nfsrv_statfs(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
312183103Sattilio	    struct mbuf **mrq);
31383651Speterint	nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
314183103Sattilio	    struct mbuf **mrq);
31583651Speterint	nfsrv_write(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
316183103Sattilio	    struct mbuf **mrq);
317190971Srmacklem/*
318190971Srmacklem * #ifdef _SYS_SYSPROTO_H_ so that it is only defined when sysproto.h
319190971Srmacklem * has been included, so that "struct nfssvc_args" is defined.
320190971Srmacklem */
321190971Srmacklem#ifdef _SYS_SYSPROTO_H_
322190971Srmacklemint nfssvc_nfsserver(struct thread *, struct nfssvc_args *);
323190971Srmacklem#endif
32455206Speter#endif	/* _KERNEL */
3252175Spaul
3262175Spaul#endif
327