1/*
2 * Copyright (c) 2000-2007 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
29/*
30 * Copyright (c) 1989, 1993
31 *	The Regents of the University of California.  All rights reserved.
32 *
33 * This code is derived from software contributed to Berkeley by
34 * Rick Macklem at The University of Guelph.
35 *
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
38 * are met:
39 * 1. Redistributions of source code must retain the above copyright
40 *    notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright
42 *    notice, this list of conditions and the following disclaimer in the
43 *    documentation and/or other materials provided with the distribution.
44 * 3. All advertising materials mentioning features or use of this software
45 *    must display the following acknowledgement:
46 *	This product includes software developed by the University of
47 *	California, Berkeley and its contributors.
48 * 4. Neither the name of the University nor the names of its contributors
49 *    may be used to endorse or promote products derived from this software
50 *    without specific prior written permission.
51 *
52 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
53 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62 * SUCH DAMAGE.
63 *
64 *	@(#)nfsmount.h	8.3 (Berkeley) 3/30/95
65 * FreeBSD-Id: nfsmount.h,v 1.13 1997/08/16 19:16:05 wollman Exp $
66 */
67
68
69#ifndef _NFS_NFSMOUNT_H_
70#define _NFS_NFSMOUNT_H_
71
72#include <sys/appleapiopts.h>
73
74#ifdef __APPLE_API_PRIVATE
75
76/*
77 * NFS mount file system attributes
78 */
79struct nfs_fsattr {
80	uint32_t	nfsa_flags;		/* file system flags */
81	uint32_t	nfsa_lease;		/* lease time in seconds */
82	uint32_t	nfsa_maxname;		/* maximum filename size */
83	uint32_t	nfsa_maxlink;		/* maximum # links */
84	uint32_t	nfsa_bsize;		/* block size */
85	uint32_t	nfsa_pad;		/* UNUSED */
86	uint64_t	nfsa_maxfilesize;	/* maximum file size */
87	uint64_t	nfsa_maxread;		/* maximum read size */
88	uint64_t	nfsa_maxwrite;		/* maximum write size */
89	uint64_t	nfsa_files_avail;	/* file slots available */
90	uint64_t	nfsa_files_free;	/* file slots free */
91	uint64_t	nfsa_files_total;	/* file slots total */
92	uint64_t	nfsa_space_avail;	/* disk space available */
93	uint64_t	nfsa_space_free;	/* disk space free */
94	uint64_t	nfsa_space_total;	/* disk space total */
95	uint32_t	nfsa_supp_attr[NFS_ATTR_BITMAP_LEN]; /* attributes supported on this file system */
96	uint32_t	nfsa_bitmap[NFS_ATTR_BITMAP_LEN]; /* valid attributes */
97};
98#define NFS_FSFLAG_LINK			0x00000001
99#define NFS_FSFLAG_SYMLINK		0x00000002
100#define NFS_FSFLAG_UNIQUE_FH		0x00000004
101#define NFS_FSFLAG_ACL			0x00000008
102#define NFS_FSFLAG_SET_TIME		0x00000010
103#define NFS_FSFLAG_CASE_INSENSITIVE	0x00000020
104#define NFS_FSFLAG_CASE_PRESERVING	0x00000040
105#define NFS_FSFLAG_CHOWN_RESTRICTED	0x00000080
106#define NFS_FSFLAG_HOMOGENEOUS		0x00000100
107#define NFS_FSFLAG_NO_TRUNC		0x00000200
108#define NFS_FSFLAG_FHTYPE_MASK		0xFF000000
109#define NFS_FSFLAG_FHTYPE_SHIFT		24
110
111/*
112 * function table for calling version-specific NFS functions
113 */
114struct nfs_funcs {
115	int	(*nf_mount)(struct nfsmount *, vfs_context_t, struct user_nfs_args *, nfsnode_t *);
116	int	(*nf_update_statfs)(struct nfsmount *, vfs_context_t);
117	int	(*nf_getquota)(struct nfsmount *, vfs_context_t, u_long, int, struct dqblk *);
118	int	(*nf_access_rpc)(nfsnode_t, u_long *, vfs_context_t);
119	int	(*nf_getattr_rpc)(nfsnode_t, mount_t, u_char *, size_t, vfs_context_t, struct nfs_vattr *, u_int64_t *);
120	int	(*nf_setattr_rpc)(nfsnode_t, struct vnode_attr *, vfs_context_t, int);
121	int	(*nf_read_rpc_async)(nfsnode_t, off_t, size_t, thread_t, kauth_cred_t, struct nfsreq_cbinfo *, struct nfsreq **);
122	int	(*nf_read_rpc_async_finish)(nfsnode_t, struct nfsreq *, struct uio *, size_t *, int *);
123	int	(*nf_readlink_rpc)(nfsnode_t, char *, uint32_t *, vfs_context_t);
124	int	(*nf_write_rpc_async)(nfsnode_t, struct uio *, size_t, thread_t, kauth_cred_t, int, struct nfsreq_cbinfo *, struct nfsreq **);
125	int	(*nf_write_rpc_async_finish)(nfsnode_t, struct nfsreq *, int *, size_t *, uint64_t *);
126	int	(*nf_commit_rpc)(nfsnode_t, uint64_t, uint64_t, kauth_cred_t);
127	int	(*nf_lookup_rpc_async)(nfsnode_t, char *, int, vfs_context_t, struct nfsreq **);
128	int	(*nf_lookup_rpc_async_finish)(nfsnode_t, vfs_context_t, struct nfsreq *, u_int64_t *, fhandle_t *, struct nfs_vattr *);
129	int	(*nf_remove_rpc)(nfsnode_t, char *, int, thread_t, kauth_cred_t);
130	int	(*nf_rename_rpc)(nfsnode_t, char *, int, nfsnode_t, char *, int, vfs_context_t);
131};
132
133/*
134 * Mount structure.
135 * One allocated on every NFS mount.
136 * Holds NFS specific information for mount.
137 */
138struct nfsmount {
139	lck_mtx_t nm_lock;		/* nfs mount lock */
140	int	nm_flag;		/* Flags for soft/hard... */
141	int	nm_state;		/* Internal state flags */
142	int	nm_vers;		/* NFS version */
143	struct nfs_funcs *nm_funcs;	/* version-specific functions */
144	mount_t	nm_mountp;		/* VFS structure for this filesystem */
145	nfsnode_t nm_dnp;		/* root directory nfsnode pointer */
146	int	nm_numgrps;		/* Max. size of groupslist */
147	TAILQ_HEAD(, nfs_gss_clnt_ctx) nm_gsscl; /* GSS user contexts */
148	int	nm_timeo;		/* Init timer for NFSMNT_DUMBTIMR */
149	int	nm_retry;		/* Max retries */
150	int	nm_rsize;		/* Max size of read rpc */
151	int	nm_wsize;		/* Max size of write rpc */
152	int	nm_biosize;		/* buffer I/O size */
153	int	nm_readdirsize;		/* Size of a readdir rpc */
154	int	nm_readahead;		/* Num. of blocks to readahead */
155	int	nm_acregmin;		/* reg file min attr cache timeout */
156	int	nm_acregmax;		/* reg file max attr cache timeout */
157	int	nm_acdirmin;		/* dir min attr cache timeout */
158	int	nm_acdirmax;		/* dir max attr cache timeout */
159	uint32_t nm_auth;		/* security mechanism flavor */
160	/* mount info */
161	uint32_t nm_fsattrstamp;	/* timestamp for fs attrs */
162	struct nfs_fsattr nm_fsattr;	/* file system attributes */
163	uint64_t nm_verf;		/* v3/v4 write verifier */
164	union {
165	    struct {			/* v2/v3 specific fields */
166		u_short rqport;		/* cached rquota port */
167		uint32_t rqportstamp;	/* timestamp of rquota port */
168	    } v3;
169	    struct {			/* v4 specific fields */
170		uint64_t clientid;	/* client ID */
171		uint64_t mounttime;	/* mount verifier */
172		thread_call_t renew_timer; /* RENEW timer call */
173	    } v4;
174	} nm_un;
175	/* async I/O queue */
176	struct nfs_reqqhead nm_resendq;	/* async I/O resend queue */
177	struct nfs_reqqhead nm_iodq;	/* async I/O request queue */
178	struct nfsiod *nm_niod;		/* nfsiod processing this mount */
179	TAILQ_ENTRY(nfsmount) nm_iodlink; /* chain of mounts awaiting nfsiod */
180	int	nm_asyncwrites;		/* outstanding async I/O writes */
181	/* socket state */
182	int	nm_sotype;		/* Type of socket */
183	int	nm_soproto;		/* and protocol */
184	mbuf_t	nm_nam;			/* Address of server */
185	u_short nm_sockflags;		/* socket state flags */
186	socket_t nm_so;			/* RPC socket */
187	int	nm_reconnect_start;	/* reconnect start time */
188	int	nm_tprintf_initial_delay;	/* delay first "server down" */
189	int	nm_tprintf_delay;	/* delay between "server down" */
190	int	nm_srtt[4];		/* Timers for RPCs */
191	int	nm_sdrtt[4];
192	int	nm_timeouts;		/* Request timeouts */
193	union {
194		struct {
195			int sent;	/* Request send count */
196			int cwnd;	/* Request congestion window */
197			struct nfs_reqqhead cwndq; /* requests waiting on cwnd */
198		} udp;
199		struct {
200			u_int32_t mleft;/* marker bytes remaining */
201			u_int32_t fleft;/* fragment bytes remaining */
202			u_int32_t len;	/* length of RPC record */
203			mbuf_t m;	/* mbufs for current record */
204			mbuf_t mlast;
205		} tcp;
206	} nm_sockstate;
207	TAILQ_ENTRY(nfsmount) nm_pokeq;	/* mount poke queue chain */
208	thread_t nm_sockthd;		/* socket thread for this mount */
209};
210
211/*
212 * NFS mount state flags (nm_state)
213 */
214#define NFSSTA_JUKEBOXTIMEO	0x00001000  /* experienced a jukebox timeout */
215#define NFSSTA_LOCKTIMEO	0x00002000  /* experienced a lock req timeout */
216#define NFSSTA_MOUNTED		0x00004000  /* completely mounted */
217#define NFSSTA_LOCKSWORK	0x00008000  /* lock ops have worked. */
218#define NFSSTA_TIMEO		0x00010000  /* experienced a timeout. */
219#define NFSSTA_FORCE		0x00020000  /* doing a forced unmount. */
220#define NFSSTA_HASWRITEVERF	0x00040000  /* Has write verifier for V3 */
221#define NFSSTA_GOTPATHCONF	0x00080000  /* Got the V3 pathconf info */
222#define NFSSTA_GOTFSINFO	0x00100000  /* Got the V3 fsinfo */
223#define NFSSTA_SNDLOCK		0x01000000  /* Send socket lock */
224#define NFSSTA_WANTSND		0x02000000  /* Want above */
225
226/* flags for nm_sockflags */
227#define NMSOCK_READY		0x0001	/* socket is ready for use */
228#define NMSOCK_CONNECTING	0x0002	/* socket is being connect()ed */
229#define NMSOCK_SETUP		0x0004	/* socket/connection is being set up */
230#define NMSOCK_UNMOUNT		0x0008	/* unmounted, no more socket activity */
231#define NMSOCK_LASTFRAG		0x0010	/* on last fragment of RPC record */
232#define NMSOCK_POKE		0x0020	/* socket needs to be poked */
233#define NMSOCK_UPCALL		0x0040	/* socket upcall in progress */
234
235/* aliases for socket state variables */
236#define nm_sent		nm_sockstate.udp.sent
237#define nm_cwnd		nm_sockstate.udp.cwnd
238#define nm_cwndq	nm_sockstate.udp.cwndq
239#define nm_markerleft	nm_sockstate.tcp.mleft
240#define nm_fragleft	nm_sockstate.tcp.fleft
241#define nm_reclen	nm_sockstate.tcp.len
242#define nm_m		nm_sockstate.tcp.m
243#define nm_mlast	nm_sockstate.tcp.mlast
244
245/* aliases for version-specific fields */
246#define nm_rqport	nm_un.v3.rqport
247#define nm_rqportstamp	nm_un.v3.rqportstamp
248#define nm_clientid	nm_un.v4.clientid
249#define nm_mounttime	nm_un.v4.mounttime
250#define nm_renew_timer	nm_un.v4.renew_timer
251
252#if defined(KERNEL)
253/*
254 * Macros to convert from various things to mount structures.
255 */
256#define VFSTONFS(mp)	((mp) ? ((struct nfsmount *)vfs_fsprivate(mp)) : NULL)
257#define VTONMP(vp)	VFSTONFS(vnode_mount(vp))
258#define NFSTONMP(np)	VTONMP(NFSTOV(np))
259#define NFSTOMP(np)	(vnode_mount(NFSTOV(np)))
260
261#endif /* KERNEL */
262
263#endif /* __APPLE_API_PRIVATE */
264#endif /* _NFS_NFSMOUNT_H_ */
265