1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25#ifndef	_LUN_MAP_H
26#define	_LUN_MAP_H
27
28#include <sys/stmf_defines.h>
29
30#ifdef	__cplusplus
31extern "C" {
32#endif
33
34typedef struct stmf_lun_map {
35	uint32_t	lm_nluns;
36	uint32_t	lm_nentries;
37	void		**lm_plus; /* this can be lun or view entry */
38} stmf_lun_map_t;
39
40struct stmf_itl_data;
41
42typedef struct stmf_lun_map_ent {
43	struct stmf_lu		*ent_lu;
44	struct stmf_itl_data	*ent_itl_datap;
45} stmf_lun_map_ent_t;
46
47void stmf_view_init();
48void stmf_view_clear_config();
49stmf_status_t stmf_session_create_lun_map(stmf_i_local_port_t *ilport,
50		stmf_i_scsi_session_t *iss);
51stmf_status_t stmf_session_destroy_lun_map(stmf_i_local_port_t *ilport,
52		stmf_i_scsi_session_t *iss);
53stmf_xfer_data_t *stmf_session_prepare_report_lun_data(stmf_lun_map_t *sm);
54void stmf_add_lu_to_active_sessions(stmf_lu_t *lu);
55void stmf_session_lu_unmapall(stmf_lu_t *lu);
56void *stmf_get_ent_from_map(stmf_lun_map_t *sm, uint16_t lun_num);
57
58
59/*
60 * Common struct used to maintain an Identifer's data. That Identifier
61 * can be a Host group, Target group or LU GUID data. Note that a LU is
62 * different from LU GUID data because either can be there without
63 * its counterpart being present in the system.
64 * id_impl_specific pointer to:
65 * case LUID, a list of stmf_view_entry
66 * case initiator group, a list of initiators
67 * case target group, a list of targets
68 * id_pt_to_object pointer to stmf_i_lu_t instance for LU.
69 */
70typedef struct stmf_id_data {
71	struct stmf_id_data		*id_next;
72	struct stmf_id_data		*id_prev;
73	uint32_t			id_refcnt;
74	uint16_t			id_type;
75	uint16_t			id_data_size;
76	uint8_t				*id_data;
77	uint32_t			id_total_alloc_size;
78	uint32_t			id_rsvd;
79	void				*id_pt_to_object;
80	void				*id_impl_specific;
81} stmf_id_data_t;
82
83typedef enum {
84	STMF_ID_TYPE_HOST,
85	STMF_ID_TYPE_TARGET,
86	STMF_ID_TYPE_LU_GUID,
87	STMF_ID_TYPE_HOST_GROUP,
88	STMF_ID_TYPE_TARGET_GROUP
89} stmf_id_type_t;
90
91typedef struct stmf_id_list {
92	stmf_id_data_t		*idl_head;
93	stmf_id_data_t		*idl_tail;
94	uint32_t		id_count;
95} stmf_id_list_t;
96
97typedef struct stmf_view_entry {
98	struct stmf_view_entry	*ve_next;
99	struct stmf_view_entry	*ve_prev;
100	uint32_t		ve_id;
101	stmf_id_data_t		*ve_hg;
102	stmf_id_data_t		*ve_tg;
103	stmf_id_data_t		*ve_luid;
104	uint8_t			ve_lun[8];
105} stmf_view_entry_t;
106
107/*
108 * Following structs are used as an alternate representation of view entries
109 * in a LU ID.
110 * ver_tg_root--->ver_tg_t    +-> ver_tg_t ....
111 *                   |        |
112 *                  vert_next-+
113 *                   |
114 *                   vert_verh_list --> ver_hg_t  +-> ver_hg_t ....
115 *                                        |       |
116 *                                      verh_next-+
117 *                                        |
118 *                                      verh_ve_map (view entry map for this
119 *                                             target group + host group )
120 */
121
122typedef struct ver_hg {
123	struct ver_hg		*verh_next;
124	stmf_id_data_t		*verh_hg_ref;	/* ref. to the host group */
125	stmf_lun_map_t		verh_ve_map;
126} stmf_ver_hg_t;
127
128typedef struct ver_tg {
129	struct ver_tg		*vert_next;
130	stmf_id_data_t		*vert_tg_ref;	/* ref to target group */
131	stmf_ver_hg_t		*vert_verh_list;
132} stmf_ver_tg_t;
133
134/*
135 * flag which define how the merging of maps is to be done.
136 */
137typedef enum {
138	MERGE_FLAG_NO_DUPLICATE		= 0x01, /* fail upon duplicate */
139	MERGE_FLAG_RETURN_NEW_MAP	= 0x02, /* Does not modify dst */
140	MERGE_FLAG_NONE			= 0
141} stmf_merge_flags_t;
142
143int stmf_add_group_member(uint8_t *grpname, uint16_t grpname_size,
144		uint8_t	*entry_ident, uint16_t entry_size,
145		stmf_id_type_t entry_type, uint32_t *err_detail);
146int stmf_remove_group_member(uint8_t *grpname, uint16_t grpname_size,
147		uint8_t *entry_ident, uint16_t entry_size,
148		stmf_id_type_t entry_type, uint32_t *err_detail);
149int stmf_remove_group(uint8_t *grpname, uint16_t grpname_size,
150		stmf_id_type_t group_type, uint32_t *err_detail);
151int stmf_add_group(uint8_t *grpname, uint16_t grpname_size,
152		stmf_id_type_t group_type, uint32_t *err_detail);
153int stmf_add_ve(uint8_t *hgname, uint16_t hgname_size, uint8_t *tgname,
154		uint16_t tgname_size, uint8_t *lu_guid, uint32_t *ve_id,
155		uint8_t *luNbr, uint32_t *err_detail);
156int stmf_validate_lun_ve(uint8_t *hgname, uint16_t hgname_size, uint8_t *tgname,
157		uint16_t tgname_size, uint8_t *luNbr, uint32_t *err_detail);
158int stmf_remove_ve_by_id(uint8_t *guid, uint32_t veid, uint32_t *err_detail);
159stmf_id_data_t *stmf_lookup_id(stmf_id_list_t *idlist, uint16_t id_size,
160		uint8_t *data);
161stmf_id_data_t *stmf_lookup_group_for_target(uint8_t *ident,
162		uint16_t ident_size);
163
164#ifdef	__cplusplus
165}
166#endif
167
168#endif /* _LUN_MAP_H */
169