/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _NFS4_IDMAP_IMPL_H
#define	_NFS4_IDMAP_IMPL_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#include <sys/list.h>
#include <sys/door.h>

/*
 * This is a private header file.  Applications should not directly include
 * this file.
 */

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * Cache Entry Definitions
 */
#define	NFSID_CACHE_ANCHORS	256

typedef struct nfsidmap {
	struct nfsidmap *id_chain[2];	/* must be first */
	time_t		 id_time;	/* time stamp */
	uid_t		 id_no;		/* uid/gid */
	utf8string	 id_str;	/* user@domain string */
} nfsidmap_t;

#define	id_forw			id_chain[0]
#define	id_back			id_chain[1]
#define	id_len			id_str.utf8string_len
#define	id_val			id_str.utf8string_val

typedef struct nfsidhq {
	union {
		struct nfsidhq	*hq_head[2];	/* for empty queue */
		struct nfsidmap *hq_chain[2];	/* for LRU list */
	} hq_link;
	kmutex_t	hq_lock;		/* protects hash queue */
} nfsidhq_t;

#define	hq_que_forw		hq_link.hq_head[0]
#define	hq_que_back		hq_link.hq_head[1]
#define	hq_lru_forw		hq_link.hq_chain[0]
#define	hq_lru_back		hq_link.hq_chain[1]

typedef struct {
	const char	*name;		/* cache name */
	nfsidhq_t	*table;		/* hash table */
	/*
	 * Since we need to know the status of nfsmapid from random functions
	 * that deal with idmap caches, we keep a pointer to the relevant fields
	 * in the zone's globals so we don't have to keep passing them around.
	 */
	door_handle_t		*nfsidmap_daemon_dh;
} idmap_cache_info_t;

typedef enum hash_stat { HQ_HASH_HINT, HQ_HASH_FIND } hash_stat;

/*
 * Per-zone modular globals
 */
struct nfsidmap_globals {
	list_node_t		nig_link; /* linkage into global list */
	enum clnt_stat		nig_last_stat;	/* status of last RPC call */
	int			nig_msg_done;	/* have we printed a message? */
	idmap_cache_info_t	u2s_ci;	/* table mapping uid-to-string */
	idmap_cache_info_t	s2u_ci;	/* table mapping string-to-uid */
	idmap_cache_info_t	g2s_ci;	/* table mapping groupid-to-string */
	idmap_cache_info_t	s2g_ci;	/* table mapping string-to-groupid */
	pid_t			nfsidmap_pid;
	kmutex_t		nfsidmap_daemon_lock;
	/*
	 * nfsidmap_daemon_lock protects the following:
	 * 	nfsidmap_daemon_dh
	 */
	door_handle_t		nfsidmap_daemon_dh;
};

#ifdef	__cplusplus
}
#endif

#endif /* _NFS4_IDMAP_IMPL_H */