xref: /openbsd-src/usr.sbin/amd/include/am.h (revision 898184e3e61f9129feb5978fad5a8c6865f00b92)
1 /*	$OpenBSD: am.h,v 1.12 2009/10/27 23:59:51 deraadt Exp $	*/
2 
3 /*
4  * Copyright (c) 1990 Jan-Simon Pendry
5  * Copyright (c) 1990 Imperial College of Science, Technology & Medicine
6  * Copyright (c) 1990, 1993
7  *	The Regents of the University of California.  All rights reserved.
8  *
9  * This code is derived from software contributed to Berkeley by
10  * Jan-Simon Pendry at Imperial College, London.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  * 3. 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.
23  *
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
34  * SUCH DAMAGE.
35  *
36  *	from: @(#)am.h	5.6 (Berkeley) 6/6/93
37  */
38 
39 #include "config.h"
40 
41 /*
42  * Global declarations
43  */
44 #include <sys/param.h>
45 #include <sys/socket.h>
46 #include <rpc/rpc.h>
47 #include <sys/mount.h>
48 #include <string.h>
49 #include <stdlib.h>
50 #ifdef MNTENT_HDR
51 #include MNTENT_HDR
52 #endif /* MNTENT_HDR */
53 #ifndef NFS_PROTOCOL_VERSION
54 #if NFS_ARGSVERSION >= 3
55 #define NFS_PROTOCOL_VERSION 3
56 #endif /* NFS_ARGSVERSION >= 3 */
57 #endif /* NFS_PROTOCOL_VERSION */
58 #include "nfs_prot.h"
59 #include <assert.h>
60 
61 #ifdef DEBUG_MEM
62 #include <malloc.h>
63 #endif /* DEBUG_MEM */
64 
65 #ifndef MAXHOSTNAMELEN
66 #define MAXHOSTNAMELEN 64
67 #endif /* MAXHOSTNAMELEN */
68 
69 #ifndef MNTTYPE_AUTO
70 #define MNTTYPE_AUTO "auto"
71 #endif /* MNTTYPE_AUTO */
72 
73 #ifndef FALSE
74 #define FALSE 0
75 #define TRUE 1
76 #endif /* FALSE */
77 
78 #ifndef ROOT_MAP
79 #define	ROOT_MAP "\"root\""
80 #endif /* ROOT_MAP */
81 
82 /*
83  * Flags from command line
84  */
85 extern int print_pid;		/* Print pid to stdout */
86 extern int normalize_hosts;	/* Normalize host names before use */
87 extern int restart_existing_mounts;
88 #ifdef HAS_NIS_MAPS
89 extern char *domain;		/* NIS domain to use */
90 #endif /* HAS_NIS_MAPS */
91 extern int am_timeo;		/* Cache period */
92 extern int afs_timeo;		/* AFS timeout */
93 extern int afs_retrans;		/* AFS retrans */
94 extern int am_timeo_w;		/* Unmount timeout */
95 extern char *mtab;		/* Mount table */
96 
97 typedef enum {
98 	Start,
99 	Run,
100 	Finishing,
101 	Quit,
102 	Done
103 } serv_state;
104 
105 extern serv_state amd_state;	/* Should we go now */
106 extern int immediate_abort;	/* Should close-down unmounts be retried */
107 extern time_t do_mapc_reload;	/* Flush & reload mount map cache */
108 
109 /*
110  * Useful constants
111  */
112 extern char pid_fsname[];	/* kiska.southseas.nz:(pid%d) */
113 extern char hostd[];		/* "kiska.southseas.nz" */
114 extern char *hostdomain;	/* "southseas.nz" */
115 extern char *op_sys;		/* "sos4" */
116 extern char *arch;		/* "sun4" */
117 extern char *karch;		/* "sun4c" */
118 extern char *cluster;		/* "r+d-kluster" */
119 extern char *endian;		/* "big" */
120 extern char *auto_dir;		/* "/a" */
121 extern char version[];		/* Version info */
122 
123 typedef struct am_ops am_ops;
124 typedef struct am_node am_node;
125 typedef struct am_opts am_opts;
126 typedef struct mntfs mntfs;
127 typedef struct fserver fserver;
128 typedef struct fsrvinfo fsrvinfo;
129 
130 /*
131  * Debug defns.
132  */
133 #ifdef DEBUG
134 #define	DEBUG_MTAB	"./mtab"
135 
136 extern int debug_flags;		/* Debug options */
137 
138 #define	D_DAEMON	0x0001	/* Enter daemon mode */
139 #define	D_TRACE		0x0002	/* Do protocol trace */
140 #define	D_FULL		0x0004	/* Do full trace */
141 #define	D_MTAB		0x0008	/* Use local mtab */
142 #define	D_AMQ		0x0010	/* Register amq program */
143 #define	D_STR		0x0020	/* Debug string munging */
144 #define	D_MEM		0x0040	/* Trace memory allocations */
145 
146 /*
147  * Normally, don't enter daemon mode, and don't register amq
148  */
149 #define	D_TEST	(~(D_DAEMON|D_MEM|D_STR))
150 #endif /* DEBUG */
151 
152 /*
153  * Global variables.
154  */
155 extern unsigned short nfs_port;	/* Our NFS service port */
156 extern struct in_addr myipaddr;	/* (An) IP address of this host */
157 
158 extern int foreground;		/* Foreground process */
159 extern time_t next_softclock;	/* Time to call softclock() */
160 extern int task_notify_todo;	/* Task notifier needs running */
161 #ifdef HAS_TFS
162 extern int nfs_server_code_available;
163 #endif /* HAS_TFS */
164 extern int last_used_map;	/* Last map being used for mounts */
165 extern AUTH *nfs_auth;		/* Dummy uthorisation for remote servers */
166 extern am_node **exported_ap;	/* List of nodes */
167 extern int first_free_map;	/* First free node */
168 extern am_node *root_node;	/* Node for "root" */
169 extern char *wire;		/* Name of primary connected network */
170 #define	NEXP_AP	(254)
171 #define NEXP_AP_MARGIN (128)
172 
173 typedef int (*task_fun)(void *);
174 typedef void (*cb_fun)(int, int, void *);
175 typedef void (*fwd_fun)(void *, int, struct sockaddr_in *,
176 				struct sockaddr_in *, void *, int);
177 
178 /*
179  * String comparison macros
180  */
181 #define STREQ(s1, s2) (strcmp((s1), (s2)) == 0)
182 #define FSTREQ(s1, s2) ((*(s1) == *(s2)) && STREQ((s1),(s2)))
183 
184 /*
185  * Linked list
186  */
187 typedef struct qelem qelem;
188 struct qelem {
189 	qelem *q_forw;
190 	qelem *q_back;
191 };
192 #define	FIRST(ty, q)	((ty *) ((q)->q_forw))
193 #define	LAST(ty, q)	((ty *) ((q)->q_back))
194 #define	NEXT(ty, q)	((ty *) (((qelem *) q)->q_forw))
195 #define	PREV(ty, q)	((ty *) (((qelem *) q)->q_back))
196 #define	HEAD(ty, q)	((ty *) q)
197 #define	ITER(v, ty, q) \
198 	for ((v) = FIRST(ty,(q)); (v) != HEAD(ty,(q)); (v) = NEXT(ty,(v)))
199 
200 /*
201  * List of mount table entries
202  */
203 typedef struct mntlist mntlist;
204 struct mntlist {
205 	struct mntlist *mnext;
206 	struct mntent *mnt;
207 };
208 
209 /*
210  * Mount map
211  */
212 typedef struct mnt_map mnt_map;
213 
214 struct fhstatus;
215 
216 /*
217  * Global routines
218  */
219 extern void	 am_mounted(am_node *);
220 extern void	 am_unmounted(am_node *);
221 extern pid_t	 background(void);
222 extern int	 bind_resv_port(int, unsigned short *);
223 extern int	 compute_mount_flags(struct mntent *);
224 extern int	 softclock(void);
225 #ifdef DEBUG
226 extern int	 debug_option(char *);
227 #endif /* DEBUG */
228 extern void	 deslashify(char *);
229 extern void	 discard_mntlist(mntlist *mp);
230 /*extern void	 domain_strip(char *, char *);*/
231 extern mntfs	*dup_mntfs(mntfs *);
232 extern fserver	*dup_srvr(fserver*);
233 extern int	eval_fs_opts(am_opts *, char *, char *, char *, char *, char *);
234 extern char	*expand_key(char *);
235 extern am_node	*exported_ap_alloc(void);
236 extern am_node	*find_ap(char *);
237 extern am_node	*find_mf(mntfs *);
238 extern mntfs	*find_mntfs(am_ops *, am_opts *, char *, char *, char *,
239 		 char *, char *);
240 extern void	 flush_mntfs(void);
241 extern void	 flush_nfs_fhandle_cache(fserver *);
242 extern void	 flush_srvr_nfs_cache(void);
243 extern void	 forcibly_timeout_mp(am_node *);
244 extern void	 free_mntfs(mntfs *);
245 extern void	 free_opts(am_opts *);
246 extern void	 free_map(am_node *);
247 extern void	 free_mntlist(mntlist *);
248 extern void	 free_srvr(fserver *);
249 extern int	 fwd_init(void);
250 extern int	 fwd_packet(int, void *, int, struct sockaddr_in *,
251 		 struct sockaddr_in *, void *, fwd_fun);
252 extern void	 fwd_reply(void);
253 extern void	 get_args(int, char *[]);
254 extern char	*getwire(void);
255 #ifdef NEED_MNTOPT_PARSER
256 extern char	*hasmntopt(struct mntent *, char *);
257 #endif /* NEED_MNTOPT_PARSER */
258 extern int	 hasmntval(struct mntent *, char *);
259 extern void	 host_normalize(char **);
260 extern char	*inet_dquad(char *, size_t, u_int32_t);
261 extern void	 init_map(am_node *, char *);
262 extern void	 insert_am(am_node *, am_node *);
263 extern void	 ins_que(qelem *, qelem *);
264 extern int	 islocalnet(in_addr_t);
265 extern int	 make_nfs_auth(void);
266 extern void	 make_root_node(void);
267 extern int	 make_rpc_packet(char *, int, u_long, struct rpc_msg *,
268 		 void *, xdrproc_t, AUTH *);
269 extern void	 map_flush_srvr(fserver *);
270 extern void	 mapc_add_kv(mnt_map *, char *, char *);
271 extern mnt_map	*mapc_find(char *, char *);
272 extern void	 mapc_free(mnt_map *);
273 extern int	 mapc_keyiter(mnt_map*, void (*)(char *,void *), void *);
274 extern int	 mapc_search(mnt_map *, char *, char **);
275 extern void	 mapc_reload(void);
276 extern void	 mapc_showtypes(FILE *);
277 extern void	 mf_mounted(mntfs *mf);
278 extern int	 mkdirs(char *, int);
279 extern void	 mk_fattr(am_node *, int);
280 extern void	 mnt_free(struct mntent *);
281 extern int	 mount_auto_node(char *, void *);
282 extern int	 mount_automounter(pid_t);
283 extern int	 mount_exported(void);
284 extern int	 mount_fs(struct mntent *, int, caddr_t, int, MTYPE_TYPE);
285 extern int	 mount_nfs_fh(struct fhstatus *, char *, char *, char *, mntfs *);
286 extern int	 mount_node(am_node *);
287 extern mntfs	*new_mntfs(void);
288 extern void	 new_ttl(am_node *);
289 extern am_node	*next_map(int *);
290 extern int	 nfs_srvr_port(fserver *, u_short *, void *);
291 extern void	 normalize_slash(char *);
292 extern void	 ops_showfstypes(FILE *);
293 extern int	 pickup_rpc_reply(void *, int, void *, xdrproc_t);
294 extern mntlist	*read_mtab(char *);
295 extern mntfs	*realloc_mntfs(mntfs *, am_ops *, am_opts *, char *,
296 		 char *, char *, char *, char *);
297 extern void	 rem_que(qelem *);
298 extern void	 reschedule_timeout_mp(void);
299 extern void	 restart(void);
300 #ifdef UPDATE_MTAB
301 extern void	 rewrite_mtab(mntlist *);
302 #endif /* UPDATE_MTAB */
303 extern void	 rmdirs(char *);
304 extern am_node	*root_ap(char *, int);
305 extern int	 root_keyiter(void (*)(char *,void *), void *);
306 extern void	 root_newmap(char *, char *, char *);
307 extern void	 rpc_msg_init(struct rpc_msg *, u_long, u_long, u_long);
308 extern void	 run_task(task_fun, void *, cb_fun, void *);
309 extern void	 sched_task(cb_fun, void *, void *);
310 extern void	 show_rcs_info(const char *, char *);
311 extern void	 sigchld(int);
312 extern void	 srvrlog(fserver *, char *);
313 extern char	*str3cat(char *, char *, char *, char *);
314 extern char	*strnsave(const char *, int);
315 extern char	*strealloc(char *, char *);
316 extern char	**strsplit(char *, int, int);
317 extern int	 switch_option(char *);
318 extern int	 switch_to_logfile(char *);
319 extern void	 do_task_notify(void);
320 extern int	 timeout(unsigned int, void (*fn)(), void *);
321 extern void	 timeout_mp(void);
322 extern void	 umount_exported(void);
323 extern int	 umount_fs(char *);
324 /*extern int unmount_node(am_node*);
325 extern int unmount_node_wrap(void *);*/
326 extern void	 unregister_amq(void);
327 extern void	 untimeout(int);
328 extern int	 valid_key(char *);
329 extern void	 wakeup(void *);
330 extern void	 wakeup_task(int, int, void *);
331 extern void	 wakeup_srvr(fserver *);
332 extern void	 write_mntent(struct mntent *);
333 #ifdef UPDATE_MTAB
334 extern void	 unlock_mntlist(void);
335 #else
336 #define	unlock_mntlist()
337 #endif /* UPDATE_MTAB */
338 
339 
340 #define	ALLOC(ty)	((struct ty *) xmalloc(sizeof(struct ty)))
341 
342 /*
343  * Options
344  */
345 struct am_opts {
346 	char	*fs_glob;		/* Smashed copy of global options */
347 	char	*fs_local;		/* Expanded copy of local options */
348 	char	*fs_mtab;		/* Mount table entry */
349 	/* Other options ... */
350 	char	*opt_dev;
351 	char	*opt_delay;
352 	char	*opt_dir;
353 	char	*opt_fs;
354 	char	*opt_group;
355 	char	*opt_mount;
356 	char	*opt_opts;
357 	char	*opt_remopts;
358 	char	*opt_pref;
359 	char	*opt_cache;
360 	char	*opt_rfs;
361 	char	*opt_rhost;
362 	char	*opt_sublink;
363 	char	*opt_type;
364 	char	*opt_unmount;
365 	char	*opt_user;
366 };
367 
368 /*
369  * File Handle
370  *
371  * This is interpreted by indexing the exported array
372  * by fhh_id.
373  *
374  * The whole structure is mapped onto a standard fhandle_t
375  * when transmitted.
376  */
377 struct am_fh {
378 	int	fhh_pid;		/* process id */
379 	int	fhh_id;			/* map id */
380 	int	fhh_gen;		/* generation number */
381 };
382 
383 extern am_node	*fh_to_mp(nfs_fh *);
384 extern am_node	*fh_to_mp3(nfs_fh *, int *, int);
385 extern void	 mp_to_fh(am_node *, nfs_fh *);
386 #define	fh_to_mp2(fhp, rp) fh_to_mp3(fhp, rp, VLOOK_CREATE)
387 extern int	 auto_fmount(am_node *mp);
388 extern int	 auto_fumount(am_node *mp);
389 
390 #define	MAX_READDIR_ENTRIES	16
391 
392 typedef char	*(*vfs_match)(am_opts *);
393 typedef int	 (*vfs_init)(mntfs *);
394 typedef int	 (*vmount_fs)(am_node *);
395 typedef int	 (*vfmount_fs)(mntfs *);
396 typedef int	 (*vumount_fs)(am_node *);
397 typedef int	 (*vfumount_fs)(mntfs *);
398 typedef am_node	*(*vlookuppn)(am_node *, char *, int *, int);
399 typedef int	 (*vreaddir)(am_node *, nfscookie, dirlist *, entry *, int);
400 typedef am_node	*(*vreadlink)(am_node *, int *);
401 typedef void	 (*vmounted)(mntfs *);
402 typedef void	 (*vumounted)(am_node *);
403 typedef fserver	*(*vffserver)(mntfs *);
404 
405 struct am_ops {
406 	char		*fs_type;
407 	vfs_match	fs_match;
408 	vfs_init	fs_init;
409 	vmount_fs	mount_fs;
410 	vfmount_fs	fmount_fs;
411 	vumount_fs	umount_fs;
412 	vfumount_fs	fumount_fs;
413 	vlookuppn	lookuppn;
414 	vreaddir	readdir;
415 	vreadlink	readlink;
416 	vmounted	mounted;
417 	vumounted	umounted;
418 	vffserver	ffserver;
419 	int		fs_flags;
420 };
421 extern am_node	*efs_lookuppn(am_node *, char *, int *, int);
422 extern int	 efs_readdir(am_node *, nfscookie, dirlist *, entry *, int);
423 
424 #define	VLOOK_CREATE	0x1
425 #define	VLOOK_DELETE	0x2
426 
427 #define FS_DIRECTORY	0x0001		/* This looks like a dir, not a link */
428 #define	FS_MBACKGROUND	0x0002		/* Should background this mount */
429 #define	FS_NOTIMEOUT	0x0004		/* Don't bother with timeouts */
430 #define FS_MKMNT	0x0008		/* Need to make the mount point */
431 #define FS_UBACKGROUND	0x0010		/* Unmount in background */
432 #define	FS_BACKGROUND	(FS_MBACKGROUND|FS_UBACKGROUND)
433 #define	FS_DISCARD	0x0020		/* Discard immediately on last reference */
434 #define	FS_AMQINFO	0x0040		/* Amq is interested in this fs type */
435 
436 #ifdef SUNOS4_COMPAT
437 extern am_ops	*sunos4_match(am_opts *, char *, char *, char *, char *, char *);
438 #endif /* SUNOS4_COMPAT */
439 extern am_ops	*ops_match(am_opts *, char *, char *, char *, char *, char *);
440 #include "fstype.h"
441 
442 /*
443  * Per-mountpoint statistics
444  */
445 struct am_stats {
446 	time_t	s_mtime;	/* Mount time */
447 	u_short	s_uid;		/* Uid of mounter */
448 	int	s_getattr;	/* Count of getattrs */
449 	int	s_lookup;	/* Count of lookups */
450 	int	s_readdir;	/* Count of readdirs */
451 	int	s_readlink;	/* Count of readlinks */
452 	int	s_statfs;	/* Count of statfs */
453 };
454 typedef struct am_stats am_stats;
455 
456 /*
457  * System statistics
458  */
459 struct amd_stats {
460 	int	d_drops;	/* Dropped requests */
461 	int	d_stale;	/* Stale NFS handles */
462 	int	d_mok;		/* Successful mounts */
463 	int	d_merr;		/* Failed mounts */
464 	int	d_uerr;		/* Failed unmounts */
465 };
466 extern struct amd_stats amd_stats;
467 
468 /*
469  * List of fileservers
470  */
471 struct fserver {
472 	qelem		fs_q;		/* List of fileservers */
473 	int		fs_refc;	/* Number of references to this node */
474 	char		*fs_host;	/* Normalized hostname of server */
475 	struct sockaddr_in *fs_ip;	/* Network address of server */
476 	int		fs_cid;		/* Callout id */
477 	int		fs_pinger;	/* Ping (keepalive) interval */
478 	int		fs_flags;	/* Flags */
479 	char		*fs_type;	/* File server type */
480 	void 		*fs_private;	/* Private data */
481 	void		(*fs_prfree)();	/* Free private data */
482 };
483 #define	FSF_VALID	0x0001		/* Valid information available */
484 #define	FSF_DOWN	0x0002		/* This fileserver is thought to be down */
485 #define	FSF_ERROR	0x0004		/* Permanent error has occured */
486 #define	FSF_WANT	0x0008		/* Want a wakeup call */
487 #define	FSF_PINGING	0x0010		/* Already doing pings */
488 #define	FSRV_ISDOWN(fs)	(((fs)->fs_flags & (FSF_DOWN|FSF_VALID)) == (FSF_DOWN|FSF_VALID))
489 #define	FSRV_ISUP(fs)	(((fs)->fs_flags & (FSF_DOWN|FSF_VALID)) == (FSF_VALID))
490 
491 /*
492  * List of mounted filesystems
493  */
494 struct mntfs {
495 	qelem		mf_q;		/* List of mounted filesystems */
496 	am_ops		*mf_ops;	/* Operations on this mountpoint */
497 	am_opts		*mf_fo;		/* File opts */
498 	char		*mf_mount;	/* "/a/kiska/home/kiska" */
499 	char		*mf_info;	/* Mount info */
500 	char		*mf_auto;	/* Automount opts */
501 	char		*mf_mopts;	/* FS mount opts */
502 	char		*mf_remopts;	/* Remote FS mount opts */
503 	fserver		*mf_server;	/* File server */
504 	int		mf_flags;	/* Flags */
505 	int		mf_error;	/* Error code from background mount */
506 	int		mf_refc;	/* Number of references to this node */
507 	int		mf_cid;		/* Callout id */
508 	void		(*mf_prfree)();	/* Free private space */
509 	void 		*mf_private;	/* Private - per-fs data */
510 };
511 
512 #define	MFF_MOUNTED	0x0001		/* Node is mounted */
513 #define	MFF_MOUNTING	0x0002		/* Mount is in progress */
514 #define	MFF_UNMOUNTING	0x0004		/* Unmount is in progress */
515 #define	MFF_RESTART	0x0008		/* Restarted node */
516 #define MFF_MKMNT	0x0010		/* Delete this node's am_mount */
517 #define	MFF_ERROR	0x0020		/* This node failed to mount */
518 #define	MFF_LOGDOWN	0x0040		/* Logged that this mount is down */
519 #define	MFF_RSTKEEP	0x0080		/* Don't timeout this filesystem - restarted */
520 #define	MFF_WANTTIMO	0x0100		/* Need a timeout call when not busy */
521 
522 /*
523  * Map of auto-mount points.
524  */
525 struct am_node {
526 	int		am_mapno;	/* Map number */
527 	mntfs		*am_mnt;	/* Mounted filesystem */
528 	char		*am_name;	/* "kiska"
529 					   Name of this node */
530 	char		*am_path;	/* "/home/kiska"
531 					   Path of this node's mount point */
532 	char		*am_link;	/* "/a/kiska/home/kiska/this/that"
533 					   Link to sub-directory */
534 	am_node		*am_parent,	/* Parent of this node */
535 			*am_ysib,	/* Younger sibling of this node */
536 			*am_osib,	/* Older sibling of this node */
537 			*am_child;	/* First child of this node */
538 	struct attrstat	am_attr;	/* File attributes */
539 #define am_fattr	am_attr.attrstat_u.attributes
540 	int		am_flags;	/* Boolean flags */
541 	int		am_error;	/* Specific mount error */
542 	time_t		am_ttl;		/* Time to live */
543 	int		am_timeo_w;	/* Wait interval */
544 	int		am_timeo;	/* Timeout interval */
545 	unsigned int	am_gen;		/* Generation number */
546 	char		*am_pref;	/* Mount info prefix */
547 	am_stats	am_stats;	/* Statistics gathering */
548 };
549 
550 #define	AMF_NOTIMEOUT	0x0001		/* This node never times out */
551 #define	AMF_ROOT	0x0002		/* This is a root node */
552 
553 #define	ONE_HOUR	(60 * 60)	/* One hour in seconds */
554 
555 /*
556  * The following values can be tuned...
557  */
558 #define	ALLOWED_MOUNT_TIME	40		/* 40s for a mount */
559 #define	AM_TTL			(5 * 60)	/* Default cache period */
560 #define	AM_TTL_W		(2 * 60)	/* Default unmount interval */
561 #define	AM_PINGER		30		/* NFS ping interval for live systems */
562 #define	AFS_TIMEO		8		/* Default afs timeout - .8s */
563 #define	AFS_RETRANS		((ALLOWED_MOUNT_TIME*10+5*afs_timeo)/afs_timeo * 2)
564 						/* Default afs retrans - 1/10th seconds */
565 
566 #define	RPC_XID_PORTMAP		0
567 #define	RPC_XID_MOUNTD		1
568 #define	RPC_XID_NFSPING		2
569 #define	RPC_XID_MASK		(0x0f)		/* 16 id's for now */
570 #define	MK_RPC_XID(type_id, uniq)	((type_id) | ((uniq) << 4))
571