2 * Copyright (c) 1989, 1993, 1995
3 * The Regents of the University of California. All rights reserved.
5 * This code is derived from software contributed to Berkeley by
6 * Rick Macklem at The University of Guelph.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
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. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by the University of
19 * California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 * may be used to endorse or promote products derived from this software
22 * without specific prior written permission.
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * @(#)nfs.h 8.4 (Berkeley) 5/1/95
40 #ifndef _NFSSERVER_NFS_H_
41 #define _NFSSERVER_NFS_H_
48 * Tunable constants for nfs
51 #define NFS_TICKINTVL 5 /* Desired time for a tick (msec) */
52 #define NFS_HZ (hz / nfs_ticks) /* Ticks/sec */
53 #define NFS_TIMEO (1 * NFS_HZ) /* Default timeout = 1 second */
54 #define NFS_MINTIMEO (1 * NFS_HZ) /* Min timeout to use */
55 #define NFS_MAXTIMEO (60 * NFS_HZ) /* Max timeout to backoff to */
56 #define NFS_MINIDEMTIMEO (5 * NFS_HZ) /* Min timeout for non-idempotent ops*/
57 #define NFS_MAXUIDHASH 64 /* Max. # of hashed uid entries/mp */
58 #ifndef NFS_GATHERDELAY
59 #define NFS_GATHERDELAY 10 /* Default write gather delay (msec) */
62 #define DIRBLKSIZ 512 /* XXX we used to use ufs's DIRBLKSIZ */
68 #define NFS_SRVMAXDATA(n) \
69 (((n)->nd_flag & ND_NFSV3) ? (((n)->nd_nam2) ? \
70 NFS_MAXDGRAMDATA : NFS_MAXDATA) : NFS_V2MAXDATA)
74 * The B_INVAFTERWRITE flag should be set to whatever is required by the
75 * buffer cache code to say "Invalidate the block after it is written back".
77 #define B_INVAFTERWRITE B_NOCACHE
80 * The IO_METASYNC flag should be implemented for local filesystems.
81 * (Until then, it is nothin at all.)
88 /* NFS state flags XXX -Wunused */
89 #define NFSRV_SNDLOCK 0x01000000 /* Send socket lock */
90 #define NFSRV_WANTSND 0x02000000 /* Want above */
93 * Structures for the nfssvc(2) syscall. Not that anyone but nfsd and mount_nfs
94 * should ever try and use it.
97 int sock; /* Socket to serve */
98 caddr_t name; /* Client addr for connection based sockets */
99 int namelen; /* Length of name */
102 struct nfsd_srvargs {
103 struct nfsd *nsd_nfsd; /* Pointer to in kernel nfsd struct */
104 uid_t nsd_uid; /* Effective uid mapped to cred */
105 u_int32_t nsd_haddr; /* Ip address of client */
106 struct xucred nsd_cr; /* Cred. uid maps to */
107 u_int nsd_authlen; /* Length of auth string (ret) */
108 u_char *nsd_authstr; /* Auth string (ret) */
109 u_int nsd_verflen; /* and the verfier */
111 struct timeval nsd_timestamp; /* timestamp from verifier */
112 u_int32_t nsd_ttl; /* credential ttl (sec) */
116 char *ncd_dirp; /* Mount dir path */
117 uid_t ncd_authuid; /* Effective uid */
118 int ncd_authtype; /* Type of authenticator */
119 u_int ncd_authlen; /* Length of authenticator string */
120 u_char *ncd_authstr; /* Authenticator string */
121 u_int ncd_verflen; /* and the verifier */
126 * XXX to allow amd to include nfs.h without nfsproto.h
129 #include <nfsserver/nfsrvstats.h>
133 * Flags for nfssvc() system call.
135 #define NFSSVC_NFSD 0x004
136 #define NFSSVC_ADDSOCK 0x008
139 * vfs.nfsrv sysctl(3) identifiers
141 #define NFS_NFSRVSTATS 1 /* struct: struct nfsrvstats */
142 #define NFS_NFSPRIVPORT 2 /* int: prohibit nfs to resvports */
146 #ifdef MALLOC_DECLARE
147 MALLOC_DECLARE(M_NFSRVDESC);
148 MALLOC_DECLARE(M_NFSD);
151 /* Forward declarations */
153 struct nfsrv_descript;
158 extern struct callout_handle nfsrv_timer_handle;
159 extern struct nfsrvstats nfsrvstats;
161 extern int nfsrv_ticks;
162 extern int nfsrvw_procrastinate;
163 extern int nfsrvw_procrastinate_v3;
165 /* Various values converted to XDR form. */
166 extern u_int32_t nfsrv_nfs_false, nfsrv_nfs_true, nfsrv_nfs_xdrneg1,
168 extern u_int32_t nfsrv_rpc_reply, nfsrv_rpc_msgdenied, nfsrv_rpc_mismatch,
170 extern u_int32_t nfsrv_rpc_auth_unix, nfsrv_rpc_msgaccepted, nfsrv_rpc_call,
173 /* Procedure table data */
174 extern int nfsrvv2_procid[NFS_NPROCS];
175 extern int nfsrv_nfsv3_procid[NFS_NPROCS];
176 extern int32_t (*nfsrv3_procs[NFS_NPROCS])(struct nfsrv_descript *nd,
177 struct nfssvc_sock *slp, struct thread *td,
178 struct mbuf **mreqp);
181 * A list of nfssvc_sock structures is maintained with all the sockets
182 * that require service by the nfsd.
184 #ifndef NFS_WDELAYHASHSIZ
185 #define NFS_WDELAYHASHSIZ 16 /* and with this */
187 #define NWDELAYHASH(sock, f) \
188 (&(sock)->ns_wdelayhashtbl[(*((u_int32_t *)(f))) % NFS_WDELAYHASHSIZ])
191 * Network address hash list element
194 u_int32_t had_inetaddr;
195 struct sockaddr *had_nam;
198 #define nu_inetaddr nu_haddr.had_inetaddr
199 #define nu_nam nu_haddr.had_nam
200 /* Bits for nu_flag */
201 #define NU_INETADDR 0x1
203 #define NU_NETFAM(u) (((u)->nu_flag & NU_INETADDR) ? AF_INET : AF_ISO)
206 STAILQ_ENTRY(nfsrv_rec) nr_link;
207 struct sockaddr *nr_address;
208 struct mbuf *nr_packet;
212 TAILQ_ENTRY(nfssvc_sock) ns_chain; /* List of all nfssvc_sock's */
214 struct socket *ns_so;
215 struct sockaddr *ns_nam;
217 struct mbuf *ns_rawend;
218 STAILQ_HEAD(, nfsrv_rec) ns_rec;
219 struct mbuf *ns_frag;
225 LIST_HEAD(, nfsrv_descript) ns_tq; /* Write gather lists */
226 LIST_HEAD(nfsrvw_delayhash, nfsrv_descript) ns_wdelayhashtbl[NFS_WDELAYHASHSIZ];
229 /* Bits for "ns_flag" */
230 #define SLP_VALID 0x01
231 #define SLP_DOREC 0x02
232 #define SLP_NEEDQ 0x04
233 #define SLP_DISCONN 0x08
234 #define SLP_GETSTREAM 0x10
235 #define SLP_LASTFRAG 0x20
236 #define SLP_ALLFLAGS 0xff
238 extern TAILQ_HEAD(nfssvc_sockhead, nfssvc_sock) nfssvc_sockhead;
239 extern int nfssvc_sockhead_flag;
240 #define SLP_INIT 0x01
241 #define SLP_WANTINIT 0x02
244 * One of these structures is allocated for each nfsd.
247 TAILQ_ENTRY(nfsd) nfsd_chain; /* List of all nfsd's */
248 int nfsd_flag; /* NFSD_ flags */
249 struct nfssvc_sock *nfsd_slp; /* Current socket */
250 int nfsd_authlen; /* Authenticator len */
251 u_char nfsd_authstr[RPCAUTH_MAXSIZ]; /* Authenticator data */
252 int nfsd_verflen; /* and the Verifier */
253 u_char nfsd_verfstr[RPCVERF_MAXSIZ];
254 struct thread *nfsd_td; /* daemon thread ptr */
255 struct nfsrv_descript *nfsd_nd; /* Associated nfsrv_descript */
258 /* Bits for "nfsd_flag" */
259 #define NFSD_WAITING 0x01
260 #define NFSD_REQINPROG 0x02
263 * This structure is used by the server for describing each request.
264 * Some fields are used only when write request gathering is performed.
266 struct nfsrv_descript {
267 u_quad_t nd_time; /* Write deadline (usec) */
268 off_t nd_off; /* Start byte offset */
269 off_t nd_eoff; /* and end byte offset */
270 LIST_ENTRY(nfsrv_descript) nd_hash; /* Hash list */
271 LIST_ENTRY(nfsrv_descript) nd_tq; /* and timer list */
272 LIST_HEAD(, nfsrv_descript) nd_coalesce;/* coalesced writes */
273 struct mbuf *nd_mrep; /* Request mbuf list */
274 struct mbuf *nd_md; /* Current dissect mbuf */
275 struct mbuf *nd_mreq; /* Reply mbuf list */
276 struct sockaddr *nd_nam; /* and socket addr */
277 struct sockaddr *nd_nam2; /* return socket addr */
278 caddr_t nd_dpos; /* Current dissect pos */
279 u_int32_t nd_procnum; /* RPC # */
280 int nd_stable; /* storage type */
281 int nd_flag; /* nd_flag */
282 int nd_len; /* Length of this write */
283 int nd_repstat; /* Reply status */
284 u_int32_t nd_retxid; /* Reply xid */
285 struct timeval nd_starttime; /* Time RPC initiated */
286 fhandle_t nd_fh; /* File handle */
287 struct ucred nd_cr; /* Credentials */
290 /* Bits for "nd_flag" */
291 #define ND_NFSV3 0x08
293 extern TAILQ_HEAD(nfsd_head, nfsd) nfsd_head;
294 extern int nfsd_head_flag;
295 #define NFSD_CHECKSLP 0x01
298 * These macros compare nfsrv_descript structures.
300 #define NFSW_CONTIG(o, n) \
301 ((o)->nd_eoff >= (n)->nd_off && \
302 !bcmp((caddr_t)&(o)->nd_fh, (caddr_t)&(n)->nd_fh, NFSX_V3FH))
304 #define NFSW_SAMECRED(o, n) \
305 (!bcmp((caddr_t)&(o)->nd_cr, (caddr_t)&(n)->nd_cr, \
306 sizeof (struct ucred)))
312 #define WEBNFS_ESC_CHAR '%'
313 #define WEBNFS_SPECCHAR_START 0x80
315 #define WEBNFS_NATIVE_CHAR 0x80
318 * Possibly more here in the future.
322 * Macro for converting escape characters in WebNFS pathnames.
323 * Should really be in libkern.
327 ((c) >= 'a' ? ((c) - ('a' - 10)) : \
328 ((c) >= 'A' ? ((c) - ('A' - 10)) : ((c) - '0')))
329 #define HEXSTRTOI(p) \
330 ((HEXTOC(p[0]) << 4) + HEXTOC(p[1]))
334 extern int nfs_debug;
335 #define NFS_DEBUG_ASYNCIO 1 /* asynchronous i/o */
336 #define NFS_DEBUG_WG 2 /* server write gathering */
337 #define NFS_DEBUG_RC 4 /* server request caching */
339 #define NFS_DPF(cat, args) \
341 if (nfs_debug & NFS_DEBUG_##cat) printf args; \
346 #define NFS_DPF(cat, args)
350 int nfs_getreq(struct nfsrv_descript *, struct nfsd *, int);
351 int nfsrv_send(struct socket *, struct sockaddr *, struct mbuf *);
352 struct mbuf *nfs_rephead(int, struct nfsrv_descript *, int, struct mbuf **,
354 int nfs_slplock(struct nfssvc_sock *, int);
355 void nfs_slpunlock(struct nfssvc_sock *);
356 void nfsm_srvfattr(struct nfsrv_descript *, struct vattr *,
358 void nfsm_srvwcc(struct nfsrv_descript *, int, struct vattr *, int,
359 struct vattr *, struct mbuf **, char **);
360 void nfsm_srvpostopattr(struct nfsrv_descript *, int, struct vattr *,
361 struct mbuf **, char **);
362 int netaddr_match(int, union nethostaddr *, struct sockaddr *);
363 int nfs_namei(struct nameidata *, fhandle_t *, int,
364 struct nfssvc_sock *, struct sockaddr *, struct mbuf **,
365 caddr_t *, struct vnode **, struct thread *, int);
366 void nfsm_adj(struct mbuf *, int, int);
367 int nfsm_mbuftouio(struct mbuf **, struct uio *, int, caddr_t *);
368 void nfsrv_initcache(void);
369 void nfsrv_timer(void *);
370 int nfsrv_dorec(struct nfssvc_sock *, struct nfsd *,
371 struct nfsrv_descript **);
372 int nfsrv_getcache(struct nfsrv_descript *, struct mbuf **);
373 void nfsrv_updatecache(struct nfsrv_descript *, int, struct mbuf *);
374 void nfsrv_cleancache(void);
375 void nfsrv_init(int);
376 int nfsrv_errmap(struct nfsrv_descript *, int);
377 void nfsrvw_sort(gid_t *, int);
378 void nfsrv_setcred(struct ucred *, struct ucred *);
379 int nfsrv_object_create(struct vnode *);
380 void nfsrv_wakenfsd(struct nfssvc_sock *slp);
381 int nfsrv_writegather(struct nfsrv_descript **, struct nfssvc_sock *,
382 struct thread *, struct mbuf **);
384 int nfsrv3_access(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
385 struct thread *td, struct mbuf **mrq);
386 int nfsrv_commit(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
387 struct thread *td, struct mbuf **mrq);
388 int nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
389 struct thread *td, struct mbuf **mrq);
390 int nfsrv_fhtovp(fhandle_t *, int, struct vnode **, struct ucred *,
391 struct nfssvc_sock *, struct sockaddr *, int *, int);
392 int nfsrv_setpublicfs(struct mount *, struct netexport *,
393 struct export_args *);
394 int nfs_ispublicfh(fhandle_t *);
395 int nfsrv_fsinfo(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
396 struct thread *td, struct mbuf **mrq);
397 int nfsrv_getattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
398 struct thread *td, struct mbuf **mrq);
399 int nfsrv_link(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
400 struct thread *td, struct mbuf **mrq);
401 int nfsrv_lookup(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
402 struct thread *td, struct mbuf **mrq);
403 int nfsrv_mkdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
404 struct thread *td, struct mbuf **mrq);
405 int nfsrv_mknod(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
406 struct thread *td, struct mbuf **mrq);
407 int nfsrv_noop(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
408 struct thread *td, struct mbuf **mrq);
409 int nfsrv_null(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
410 struct thread *td, struct mbuf **mrq);
411 int nfsrv_pathconf(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
412 struct thread *td, struct mbuf **mrq);
413 int nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
414 struct thread *td, struct mbuf **mrq);
415 int nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
416 struct thread *td, struct mbuf **mrq);
417 int nfsrv_readdirplus(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
418 struct thread *td, struct mbuf **mrq);
419 int nfsrv_readlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
420 struct thread *td, struct mbuf **mrq);
421 int nfsrv_remove(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
422 struct thread *td, struct mbuf **mrq);
423 int nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
424 struct thread *td, struct mbuf **mrq);
425 int nfsrv_rmdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
426 struct thread *td, struct mbuf **mrq);
427 int nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
428 struct thread *td, struct mbuf **mrq);
429 int nfsrv_statfs(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
430 struct thread *td, struct mbuf **mrq);
431 int nfsrv_symlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
432 struct thread *td, struct mbuf **mrq);
433 int nfsrv_write(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
434 struct thread *td, struct mbuf **mrq);
435 void nfsrv_rcv(struct socket *so, void *arg, int waitflag);
436 void nfsrv_slpderef(struct nfssvc_sock *slp);