1/*
2 * Copyright (c) 2000-2014 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_NAMED_ATTR		0x00000400
109#define NFS_FSFLAG_FHTYPE_MASK		0xFF000000
110#define NFS_FSFLAG_FHTYPE_SHIFT		24
111
112/*
113 * NFS file system location structures
114 */
115struct nfs_fs_server {
116	char *			ns_name;		/* name of server */
117	char **			ns_addresses;		/* array of addresses for server */
118	uint32_t		ns_addrcount;		/* # of addresses */
119};
120struct nfs_fs_path {
121	char **			np_components;		/* array of component pointers */
122	uint32_t		np_compcount;		/* # components in path */
123};
124struct nfs_fs_location {
125	struct nfs_fs_server **	nl_servers;		/* array of server pointers */
126	struct nfs_fs_path	nl_path;		/* file system path */
127	uint32_t		nl_servcount;		/* # of servers */
128};
129
130struct nfs_location_index {
131	uint8_t 		nli_flags;		/* misc flags */
132	uint8_t 		nli_loc;		/* location index */
133	uint8_t 		nli_serv;		/* server index */
134	uint8_t 		nli_addr;		/* address index */
135};
136#define NLI_VALID	0x01	/* index is valid */
137
138struct nfs_fs_locations {
139	struct nfs_fs_path	nl_root;		/* current server's root file system path */
140	uint32_t		nl_numlocs;		/* # of locations */
141	struct nfs_location_index nl_current;		/* index of current location/server/address */
142	struct nfs_fs_location **nl_locations;		/* array of fs locations */
143};
144
145/*
146 * RPC record marker parsing state
147 */
148struct nfs_rpc_record_state {
149	mbuf_t			nrrs_m;			/* mbufs for current record */
150	mbuf_t			nrrs_mlast;
151	uint16_t		nrrs_lastfrag;		/* last fragment of record */
152	uint16_t		nrrs_markerleft;	/* marker bytes remaining */
153	uint32_t		nrrs_fragleft;		/* fragment bytes remaining */
154	uint32_t		nrrs_reclen;		/* length of RPC record */
155};
156
157/*
158 * NFS socket structures
159 */
160struct nfs_socket {
161	lck_mtx_t		nso_lock;		/* nfs socket lock */
162	TAILQ_ENTRY(nfs_socket)	nso_link;		/* list of sockets */
163	struct sockaddr *	nso_saddr;		/* socket address */
164	struct sockaddr *	nso_saddr2;		/* additional socket address */
165	void *			nso_wake;		/* address to wake up */
166	time_t			nso_timestamp;
167	time_t			nso_reqtimestamp;	/* last request sent */
168	socket_t		nso_so;			/* socket */
169	uint8_t			nso_sotype;		/* Type of socket */
170	uint16_t		nso_flags;		/* NSO_* flags */
171	struct nfs_location_index nso_location;		/* location index */
172	uint32_t		nso_protocol;		/* RPC protocol */
173	uint32_t		nso_version;		/* RPC protocol version */
174	uint32_t		nso_pingxid;		/* RPC XID of NULL ping request */
175	int			nso_error;		/* saved error/status */
176	struct nfs_rpc_record_state nso_rrs;		/* RPC record parsing state (TCP) */
177};
178TAILQ_HEAD(nfssocketlist, nfs_socket);
179/* nso_flags */
180#define NSO_UPCALL		0x0001			/* socket upcall in progress */
181#define NSO_DEAD		0x0002			/* socket is dead */
182#define NSO_CONNECTING		0x0004			/* socket is being connected */
183#define NSO_CONNECTED		0x0008			/* socket connection complete */
184#define NSO_PINGING		0x0010			/* socket is being tested */
185#define NSO_VERIFIED		0x0020			/* socket appears functional */
186#define NSO_DISCONNECTING	0x0040			/* socket is being disconnected */
187
188/* NFS connect socket search state */
189struct nfs_socket_search {
190	struct nfs_location_index nss_startloc;		/* starting location index */
191	struct nfs_location_index nss_nextloc;		/* next location index */
192	struct nfssocketlist	nss_socklist;		/* list of active sockets */
193	time_t			nss_timestamp;		/* search start time */
194	time_t			nss_last;		/* timestamp of last socket */
195	struct nfs_socket *	nss_sock;		/* found socket */
196	uint8_t			nss_sotype;		/* TCP/UDP */
197	uint8_t			nss_sockcnt;		/* # of active sockets */
198	in_port_t		nss_port;		/* port # to connect to */
199	uint32_t		nss_protocol;		/* RPC protocol */
200	uint32_t		nss_version;		/* RPC protocol version */
201	uint32_t		nss_flags;		/* (see below) */
202	int			nss_addrcnt;		/* Number addresses to try or left */
203	int			nss_timeo;		/* how long we are willing to wait */
204	int			nss_error;		/* best error we've gotten so far */
205};
206/* nss_flags */
207#define NSS_VERBOSE		0x00000001		/* OK to log info about socket search */
208#define NSS_WARNED		0x00000002		/* logged warning about socket search taking a while */
209
210/*
211 * function table for calling version-specific NFS functions
212 */
213struct nfs_funcs {
214	int	(*nf_mount)(struct nfsmount *, vfs_context_t, nfsnode_t *);
215	int	(*nf_update_statfs)(struct nfsmount *, vfs_context_t);
216	int	(*nf_getquota)(struct nfsmount *, vfs_context_t, uid_t, int, struct dqblk *);
217	int	(*nf_access_rpc)(nfsnode_t, u_int32_t *, int, vfs_context_t);
218	int	(*nf_getattr_rpc)(nfsnode_t, mount_t, u_char *, size_t, int, vfs_context_t, struct nfs_vattr *, u_int64_t *);
219	int	(*nf_setattr_rpc)(nfsnode_t, struct vnode_attr *, vfs_context_t);
220	int	(*nf_read_rpc_async)(nfsnode_t, off_t, size_t, thread_t, kauth_cred_t, struct nfsreq_cbinfo *, struct nfsreq **);
221	int	(*nf_read_rpc_async_finish)(nfsnode_t, struct nfsreq *, uio_t, size_t *, int *);
222	int	(*nf_readlink_rpc)(nfsnode_t, char *, uint32_t *, vfs_context_t);
223	int	(*nf_write_rpc_async)(nfsnode_t, uio_t, size_t, thread_t, kauth_cred_t, int, struct nfsreq_cbinfo *, struct nfsreq **);
224	int	(*nf_write_rpc_async_finish)(nfsnode_t, struct nfsreq *, int *, size_t *, uint64_t *);
225	int	(*nf_commit_rpc)(nfsnode_t, uint64_t, uint64_t, kauth_cred_t, uint64_t);
226	int	(*nf_lookup_rpc_async)(nfsnode_t, char *, int, vfs_context_t, struct nfsreq **);
227	int	(*nf_lookup_rpc_async_finish)(nfsnode_t, char *, int, vfs_context_t, struct nfsreq *, u_int64_t *, fhandle_t *, struct nfs_vattr *);
228	int	(*nf_remove_rpc)(nfsnode_t, char *, int, thread_t, kauth_cred_t);
229	int	(*nf_rename_rpc)(nfsnode_t, char *, int, nfsnode_t, char *, int, vfs_context_t);
230	int	(*nf_setlock_rpc)(nfsnode_t, struct nfs_open_file *, struct nfs_file_lock *, int, int, thread_t, kauth_cred_t);
231	int	(*nf_unlock_rpc)(nfsnode_t, struct nfs_lock_owner *, int, uint64_t, uint64_t, int, thread_t, kauth_cred_t);
232	int	(*nf_getlock_rpc)(nfsnode_t, struct nfs_lock_owner *, struct flock *, uint64_t, uint64_t, vfs_context_t);
233};
234
235/*
236 * The long form of the NFSv4 client ID.
237 */
238struct nfs_client_id {
239	TAILQ_ENTRY(nfs_client_id)	nci_link;	/* list of client IDs */
240	char				*nci_id;	/* client id buffer */
241	int				nci_idlen;	/* length of client id buffer */
242};
243TAILQ_HEAD(nfsclientidlist, nfs_client_id);
244extern struct nfsclientidlist nfsclientids;
245
246/*
247 * Mount structure.
248 * One allocated on every NFS mount.
249 * Holds NFS specific information for mount.
250 */
251struct nfsmount {
252	lck_mtx_t nm_lock;		/* nfs mount lock */
253	char *	nm_args;		/* NFS mount args (XDR) */
254	uint32_t nm_mattrs[NFS_MATTR_BITMAP_LEN]; /* mount attributes in mount args */
255	uint32_t nm_mflags_mask[NFS_MFLAG_BITMAP_LEN]; /* mount flags mask in mount args */
256	uint32_t nm_mflags[NFS_MFLAG_BITMAP_LEN]; /* mount flags in mount args */
257	uint32_t nm_flags[NFS_MFLAG_BITMAP_LEN]; /* current mount flags (soft, intr, etc...) */
258	char *  nm_realm;		/* Kerberos realm to use */
259	char *  nm_principal;		/* GSS principal to use on initial mount */
260	char *	nm_sprinc;		/* Kerberos principal of the server */
261	int	nm_ref;			/* Reference count on this mount */
262	int	nm_state;		/* Internal state flags */
263	int	nm_vers;		/* NFS version */
264	struct nfs_funcs *nm_funcs;	/* version-specific functions */
265	kauth_cred_t nm_mcred;		/* credential used for the mount */
266	mount_t	nm_mountp;		/* VFS structure for this filesystem */
267	nfsnode_t nm_dnp;		/* root directory nfsnode pointer */
268	struct nfs_fs_locations nm_locations; /* file system locations */
269	uint32_t nm_numgrps;		/* Max. size of groupslist */
270	TAILQ_HEAD(, nfs_gss_clnt_ctx) nm_gsscl;	/* GSS user contexts */
271	TAILQ_HEAD(, nfs_gss_clnt_ctx) nm_gssnccl;	/* GSS neg cache contexts */
272	uint32_t nm_ncentries;		/* GSS expired negative cache entries */
273	int	nm_timeo;		/* Init timer for NFSMNT_DUMBTIMR */
274	int	nm_retry;		/* Max retries */
275	uint32_t nm_rsize;		/* Max size of read rpc */
276	uint32_t nm_wsize;		/* Max size of write rpc */
277	uint32_t nm_biosize;		/* buffer I/O size */
278	uint32_t nm_readdirsize;	/* Size of a readdir rpc */
279	uint32_t nm_readahead;		/* Num. of blocks to readahead */
280	uint32_t nm_acregmin;		/* reg file min attr cache timeout */
281	uint32_t nm_acregmax;		/* reg file max attr cache timeout */
282	uint32_t nm_acdirmin;		/* dir min attr cache timeout */
283	uint32_t nm_acdirmax;		/* dir max attr cache timeout */
284	uint32_t nm_auth;		/* security mechanism flavor being used */
285	uint32_t nm_writers;		/* Number of nodes open for writing */
286	uint32_t nm_mappers;		/* Number of nodes that have mmapped */
287	struct nfs_sec nm_sec;		/* acceptable security mechanism flavors */
288	struct nfs_sec nm_servsec;	/* server's acceptable security mechanism flavors */
289	fhandle_t *nm_fh;		/* initial file handle */
290	uint8_t  nm_lockmode;		/* advisory file locking mode */
291	/* mount info */
292	uint32_t nm_fsattrstamp;	/* timestamp for fs attrs */
293	struct nfs_fsattr nm_fsattr;	/* file system attributes */
294	uint64_t nm_verf;		/* v3/v4 write verifier */
295	union {
296	    struct {			/* v2/v3 specific fields */
297		TAILQ_ENTRY(nfsmount) ldlink; /* chain of mounts registered for lockd use */
298		int udp_sent;		/* UDP request send count */
299		int udp_cwnd;		/* UDP request congestion window */
300		struct nfs_reqqhead udp_cwndq; /* requests waiting on cwnd */
301		struct sockaddr *rqsaddr;/* cached rquota socket address */
302		uint32_t rqsaddrstamp;	/* timestamp of rquota socket address */
303	    } v3;
304	    struct {			/* v4 specific fields */
305		struct nfs_client_id *longid; /* client ID, long form */
306		uint64_t mounttime;	/* used as client ID verifier */
307		uint64_t clientid;	/* client ID, short form */
308		thread_call_t renew_timer; /* RENEW timer call */
309		nfs_fsid fsid;		/* NFS file system id */
310		TAILQ_HEAD(, nfsnode) delegations; /* list of nodes with delegations */
311		TAILQ_HEAD(, nfsnode) dreturnq; /* list of nodes with delegations to return */
312		TAILQ_ENTRY(nfsmount) cblink; /* chain of mounts registered for callbacks */
313		uint32_t cbid;		/* callback channel identifier */
314		uint32_t cbrefs;	/* # callbacks using this mount */
315	    } v4;
316	} nm_un;
317	/* common state */
318	TAILQ_HEAD(, nfs_open_owner) nm_open_owners; /* list of open owners */
319	uint32_t nm_stateinuse;		/* state in use counter */
320	uint32_t nm_stategenid;		/* state generation counter */
321	time_t	nm_recover_start;	/* recover start time */
322 	LIST_HEAD(, nfsnode) nm_monlist; /* list of nodes being monitored */
323	/* async I/O queue */
324	struct nfs_reqqhead nm_resendq;	/* async I/O resend queue */
325	struct nfs_reqqhead nm_iodq;	/* async I/O request queue */
326	struct nfsiod *nm_niod;		/* nfsiod processing this mount */
327	TAILQ_ENTRY(nfsmount) nm_iodlink; /* chain of mounts awaiting nfsiod */
328	int	nm_asyncwrites;		/* outstanding async I/O writes */
329	/* socket state */
330	uint8_t	nm_sofamily;		/* (preferred) protocol family of socket */
331	uint8_t	nm_sotype;		/* (preferred) type of socket */
332	in_port_t	nm_nfsport;	/* NFS protocol port */
333	in_port_t	nm_mountport;	/* MOUNT protocol port (v2/v3) */
334	struct nfs_socket_search *nm_nss; /* current socket search structure */
335	struct nfs_socket *nm_nso;	/* current socket */
336	struct sockaddr	*nm_saddr;	/* Address of server */
337	u_short nm_sockflags;		/* socket state flags */
338	time_t	nm_deadto_start;	/* dead timeout start time */
339	time_t	nm_reconnect_start;	/* reconnect start time */
340	int	nm_tprintf_initial_delay;	/* delay first "server down" */
341	int	nm_tprintf_delay;	/* delay between "server down" */
342	int	nm_deadtimeout;		/* delay between first "server down" and dead set at mount time */
343	int	nm_curdeadtimeout;	/* current dead timeout. Adjusted by mount state and mobility */
344	int	nm_srtt[4];		/* Timers for RPCs */
345	int	nm_sdrtt[4];
346	int	nm_timeouts;		/* Request timeouts */
347	int	nm_jbreqs;		/* # R_JBTPRINTFMSG requests */
348	int	nm_mounterror;		/* status of mount connect */
349	TAILQ_ENTRY(nfsmount) nm_pokeq;	/* mount poke queue chain */
350	thread_t nm_sockthd;		/* socket thread for this mount */
351};
352
353/* macro for checking current mount flags */
354#define NMFLAG(NMP, F)		NFS_BITMAP_ISSET((NMP)->nm_flags, NFS_MFLAG_ ## F)
355/* macros for checking (original) mount attributes/flags */
356#define NM_OMATTR_GIVEN(NMP, F)	NFS_BITMAP_ISSET((NMP)->nm_mattrs, NFS_MATTR_ ## F)
357#define NM_OMFLAG_GIVEN(NMP, F)	NFS_BITMAP_ISSET((NMP)->nm_mflags_mask, NFS_MFLAG_ ## F)
358#define NM_OMFLAG(NMP, F)	NFS_BITMAP_ISSET((NMP)->nm_mflags, NFS_MFLAG_ ## F)
359
360/*
361 * NFS mount state flags (nm_state)
362 */
363#define NFSSTA_MOUNT_THREAD	0x00000040  /* nfs_mount_connect_thread running */
364#define NFSSTA_MONITOR_SCAN	0x00000080  /* scan of monitored nodes in progress */
365#define NFSSTA_UNMOUNTING	0x00000100  /* an unmount attempt is in progress */
366#define NFSSTA_NEEDSECINFO	0x00000200  /* need to fetch security info */
367#define NFSSTA_CLIENTID		0x00000400  /* short client ID is valid */
368#define NFSSTA_BIGCOOKIES	0x00000800  /* have seen >32bit dir cookies */
369#define NFSSTA_JUKEBOXTIMEO	0x00001000  /* experienced a jukebox timeout */
370#define NFSSTA_LOCKTIMEO	0x00002000  /* experienced a lock req timeout */
371#define NFSSTA_MOUNTED		0x00004000  /* completely mounted */
372#define NFSSTA_LOCKSWORK	0x00008000  /* lock ops have worked. */
373#define NFSSTA_TIMEO		0x00010000  /* experienced a timeout. */
374#define NFSSTA_FORCE		0x00020000  /* doing a forced unmount. */
375#define NFSSTA_HASWRITEVERF	0x00040000  /* Has write verifier for V3 */
376#define NFSSTA_GOTPATHCONF	0x00080000  /* Got the V3 pathconf info */
377#define NFSSTA_GOTFSINFO	0x00100000  /* Got the V3 fsinfo */
378#define NFSSTA_SENDING		0x00800000  /* Sending on socket */
379#define NFSSTA_SNDLOCK		0x01000000  /* Send socket lock */
380#define NFSSTA_WANTSND		0x02000000  /* Want above */
381#define NFSSTA_DEAD		0x04000000  /* mount is dead */
382#define NFSSTA_RECOVER		0x08000000  /* mount state needs to be recovered */
383#define NFSSTA_RECOVER_EXPIRED	0x10000000  /* mount state expired */
384#define NFSSTA_REVOKE		0x20000000  /* need to scan for revoked nodes */
385#define	NFSSTA_SQUISHY		0x40000000  /* we can ask to be forcibly unmounted */
386#define NFSSTA_MOUNT_DRAIN	0x80000000  /* mount is draining references */
387
388/* flags for nm_sockflags */
389#define NMSOCK_READY		0x0001	/* socket is ready for use */
390#define NMSOCK_CONNECTING	0x0002	/* socket is being connect()ed */
391#define NMSOCK_SETUP		0x0004	/* socket/connection is being set up */
392#define NMSOCK_UNMOUNT		0x0008	/* unmounted, no more socket activity */
393#define NMSOCK_HASCONNECTED	0x0010	/* socket has connected before */
394#define NMSOCK_POKE		0x0020	/* socket needs to be poked */
395#define NMSOCK_DISCONNECTING	0x0080	/* socket is being disconnected */
396
397/* aliases for version-specific fields */
398#define nm_ldlink	nm_un.v3.ldlink
399#define nm_sent		nm_un.v3.udp_sent
400#define nm_cwnd		nm_un.v3.udp_cwnd
401#define nm_cwndq	nm_un.v3.udp_cwndq
402#define nm_rqproto	nm_un.v3.rqproto
403#define nm_rqsaddr	nm_un.v3.rqsaddr
404#define nm_rqsaddrstamp	nm_un.v3.rqsaddrstamp
405#define nm_longid	nm_un.v4.longid
406#define nm_clientid	nm_un.v4.clientid
407#define nm_mounttime	nm_un.v4.mounttime
408#define nm_fsid		nm_un.v4.fsid
409#define nm_renew_timer	nm_un.v4.renew_timer
410#define nm_cbid		nm_un.v4.cbid
411#define nm_cblink	nm_un.v4.cblink
412#define nm_cbrefs	nm_un.v4.cbrefs
413#define nm_delegations	nm_un.v4.delegations
414#define nm_dreturnq	nm_un.v4.dreturnq
415
416#if defined(KERNEL)
417/*
418 * Macros to convert from various things to mount structures.
419 */
420#define VFSTONFS(mp)	((mp) ? ((struct nfsmount *)vfs_fsprivate(mp)) : NULL)
421#define VTONMP(vp)	VFSTONFS(vnode_mount(vp))
422#define NFSTONMP(np)	VTONMP(NFSTOV(np))
423#define NFSTOMP(np)	(vnode_mount(NFSTOV(np)))
424
425#endif /* KERNEL */
426
427#endif /* __APPLE_API_PRIVATE */
428#endif /* _NFS_NFSMOUNT_H_ */
429