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 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_LIBSTMF_H
27 #define	_LIBSTMF_H
28 
29 #include <time.h>
30 #include <sys/param.h>
31 #include <libnvpair.h>
32 
33 #ifdef	__cplusplus
34 extern "C" {
35 #endif
36 
37 /* Constants and Types */
38 
39 /* LU and Local Port states */
40 #define	STMF_LOGICAL_UNIT_OFFLINE	0
41 #define	STMF_LOGICAL_UNIT_OFFLINING	1
42 #define	STMF_LOGICAL_UNIT_ONLINE	2
43 #define	STMF_LOGICAL_UNIT_ONLINING	3
44 #define	STMF_LOGICAL_UNIT_UNREGISTERED	4
45 #define	STMF_TARGET_PORT_OFFLINE	5
46 #define	STMF_TARGET_PORT_OFFLINING	6
47 #define	STMF_TARGET_PORT_ONLINE		7
48 #define	STMF_TARGET_PORT_ONLINING	8
49 #define	STMF_SERVICE_STATE_ONLINE	9
50 #define	STMF_SERVICE_STATE_OFFLINE	10
51 #define	STMF_SERVICE_STATE_ONLINING	11
52 #define	STMF_SERVICE_STATE_OFFLINING	12
53 #define	STMF_SERVICE_STATE_UNKNOWN	13
54 #define	STMF_CONFIG_STATE_NONE		14
55 #define	STMF_CONFIG_STATE_INIT		15
56 #define	STMF_CONFIG_STATE_INIT_DONE	16
57 #define	STMF_CONFIG_STATE_UNKNOWN	17
58 
59 #define	STMF_IDENT_LENGTH   255
60 
61 /* API status return values */
62 #define	STMF_STATUS_SUCCESS	    0x0000
63 #define	STMF_STATUS_ERROR	    0x8000
64 #define	STMF_ERROR_BUSY			(STMF_STATUS_ERROR | 0x01)
65 #define	STMF_ERROR_NOT_FOUND		(STMF_STATUS_ERROR | 0x02)
66 #define	STMF_ERROR_MEMBER_NOT_FOUND	(STMF_STATUS_ERROR | 0x03)
67 #define	STMF_ERROR_GROUP_NOT_FOUND	(STMF_STATUS_ERROR | 0x04)
68 #define	STMF_ERROR_PERM			(STMF_STATUS_ERROR | 0x05)
69 #define	STMF_ERROR_NOMEM		(STMF_STATUS_ERROR | 0x06)
70 #define	STMF_ERROR_INVALID_ARG		(STMF_STATUS_ERROR | 0x07)
71 #define	STMF_ERROR_EXISTS		(STMF_STATUS_ERROR | 0x08)
72 #define	STMF_ERROR_SERVICE_NOT_FOUND	(STMF_STATUS_ERROR | 0x09)
73 #define	STMF_ERROR_SERVICE_ONLINE	(STMF_STATUS_ERROR | 0x0a)
74 #define	STMF_ERROR_SERVICE_OFFLINE	(STMF_STATUS_ERROR | 0x0b)
75 #define	STMF_ERROR_GROUP_IN_USE		(STMF_STATUS_ERROR | 0x0c)
76 #define	STMF_ERROR_LUN_IN_USE		(STMF_STATUS_ERROR | 0x0d)
77 #define	STMF_ERROR_VE_CONFLICT		(STMF_STATUS_ERROR | 0x0e)
78 #define	STMF_ERROR_CONFIG_NONE		(STMF_STATUS_ERROR | 0x0f)
79 #define	STMF_ERROR_SERVICE_DATA_VERSION (STMF_STATUS_ERROR | 0x10)
80 #define	STMF_ERROR_INVALID_HG		(STMF_STATUS_ERROR | 0x11)
81 #define	STMF_ERROR_INVALID_TG		(STMF_STATUS_ERROR | 0x12)
82 #define	STMF_ERROR_PROV_DATA_STALE	(STMF_STATUS_ERROR | 0x13)
83 
84 /* Initiator Name Types */
85 #define	STMF_FC_PORT_WWN	    1
86 #define	STMF_ISCSI_NAME		    2
87 
88 /* protected data flag for provider store */
89 #define	STMF_PROTECTED_DATA	0x0001
90 
91 /* provider types */
92 #define	STMF_LU_PROVIDER_TYPE	1
93 #define	STMF_PORT_PROVIDER_TYPE	2
94 
95 
96 /* devid code set and name types */
97 #define	EUI_64_TYPE	2
98 #define	NAA_TYPE	3
99 #define	SCSI_NAME_TYPE	8
100 
101 #define	BINARY_CODE_SET	1
102 #define	ASCII_CODE_SET	2
103 #define	UTF_8_CODE_SET	3
104 
105 typedef enum _stmfProtocol
106 {
107 	STMF_PROTOCOL_FIBRE_CHANNEL =	0,
108 	STMF_PROTOCOL_ISCSI =		1,
109 	STMF_PROTOCOL_SAS =		2
110 } stmfProtocol;
111 
112 
113 typedef struct _stmfGuid
114 {
115 	uchar_t	guid[16];
116 } stmfGuid;
117 
118 typedef struct _stmfGuidList
119 {
120 	uint32_t cnt;
121 	stmfGuid guid[1];
122 } stmfGuidList;
123 
124 typedef struct _stmfState
125 {
126 	int operationalState;
127 	int configState;
128 } stmfState;
129 
130 typedef struct _stmfDevid
131 {
132 	uint8_t identLength;	/* length of ident */
133 	uint8_t	ident[STMF_IDENT_LENGTH]; /* SCSI name string ident */
134 } stmfDevid;
135 
136 typedef struct _stmfDevidList
137 {
138 	uint32_t cnt;
139 	stmfDevid devid[1];
140 } stmfDevidList;
141 
142 typedef char stmfGroupName[256];
143 typedef char stmfProviderName[256];
144 
145 typedef struct _stmfGroupList
146 {
147 	uint32_t cnt;
148 	stmfGroupName name[1];
149 } stmfGroupList;
150 
151 typedef struct _stmfProvider
152 {
153 	int providerType;
154 	stmfProviderName name;
155 } stmfProvider;
156 
157 typedef struct _stmfProviderList
158 {
159 	uint32_t cnt;
160 	stmfProvider provider[1];
161 } stmfProviderList;
162 
163 typedef struct _stmfSession
164 {
165 	stmfDevid initiator;
166 	char alias[256];
167 	time_t creationTime;
168 } stmfSession;
169 
170 typedef struct _stmfSessionList
171 {
172 	uint32_t cnt;
173 	stmfSession session[1];
174 } stmfSessionList;
175 
176 
177 typedef struct _stmfViewEntry
178 {
179 	boolean_t	veIndexValid;	/* if B_TRUE, veIndex is valid value */
180 	uint32_t	veIndex;	/* View Entry index */
181 	boolean_t	allHosts;	/* all initiator ports */
182 	stmfGroupName   hostGroup;	/* Host Group Name */
183 	boolean_t	allTargets;	/* B_TRUE = targetGroup is invalid */
184 	stmfGroupName	targetGroup;	/* Target Group Name */
185 	boolean_t	luNbrValid;	/* if B_TRUE, luNbr is a valid value */
186 	uchar_t		luNbr[8];	/* LU number for this view entry */
187 } stmfViewEntry;
188 
189 typedef struct _stmfViewEntryList
190 {
191 	uint32_t cnt;
192 	stmfViewEntry ve[1];
193 } stmfViewEntryList;
194 
195 typedef struct _stmfViewEntryProperties
196 {
197 	stmfGuid	associatedLogicalUnitGuid;
198 	stmfViewEntry	viewEntry;
199 } stmfViewEntryProperties;
200 
201 typedef struct _stmfGroupProperties
202 {
203 	uint32_t	cnt;
204 	stmfDevid	name[1];
205 } stmfGroupProperties;
206 
207 typedef struct _stmfTargetProperties
208 {
209 	stmfProviderName providerName;
210 	char		 alias[256];
211 	uint16_t	 status;
212 	stmfProtocol	 protocol;
213 	stmfDevid	 devid;
214 } stmfTargetProperties;
215 
216 typedef struct _stmfLogicalUnitProperties
217 {
218 	char	    alias[256];
219 	uchar_t	    vendor[8];
220 	uchar_t	    product[16];
221 	uchar_t	    revision[4];
222 	uint32_t    status;
223 	char	    providerName[256];
224 	stmfGuid    luid;
225 } stmfLogicalUnitProperties;
226 
227 typedef struct _stmfLogicalUnitProviderProperties
228 {
229 	char	    providerName[MAXPATHLEN];
230 	uint32_t    instance;
231 	uint32_t    status;
232 	uchar_t	    rsvd[64];
233 } stmfLogicalUnitProviderProperties;
234 
235 typedef struct _stmfLocalPortProviderProperties
236 {
237 	char	    providerName[MAXPATHLEN];
238 	uint32_t    instance;
239 	uint32_t    status;
240 	uchar_t	    rsvd[64];
241 } stmfLocalPortProviderProperties;
242 
243 
244 /* API prototypes */
245 int stmfAddToHostGroup(stmfGroupName *hostGroupName, stmfDevid *name);
246 int stmfAddToTargetGroup(stmfGroupName *targetGroupName, stmfDevid *targetName);
247 int stmfAddViewEntry(stmfGuid *lu, stmfViewEntry *viewEntry);
248 int stmfClearProviderData(char *providerName, int providerType);
249 int stmfCreateHostGroup(stmfGroupName *hostGroupName);
250 int stmfCreateTargetGroup(stmfGroupName *targetGroupName);
251 int stmfDeleteHostGroup(stmfGroupName *hostGroupName);
252 int stmfDeleteTargetGroup(stmfGroupName *targetGroupName);
253 int stmfDevidFromIscsiName(char *iscsiName, stmfDevid *devid);
254 int stmfDevidFromWwn(uchar_t wwn[8], stmfDevid *devid);
255 void stmfFreeMemory(void *);
256 int stmfGetHostGroupList(stmfGroupList **initiatorGroupList);
257 int stmfGetHostGroupMembers(stmfGroupName *hostGroupName,
258     stmfGroupProperties **groupProperties);
259 int stmfGetLocalPortProviderList(stmfProviderList **localPortProviderList);
260 int stmfGetLocalPortProviderProperties(stmfProviderName *providerName,
261     stmfLocalPortProviderProperties *providerProperties);
262 int stmfGetLogicalUnitList(stmfGuidList **logicalUnitList);
263 int stmfGetLogicalUnitProperties(stmfGuid *logicalUnit,
264     stmfLogicalUnitProperties *logicalUnitProps);
265 int stmfGetLogicalUnitProviderList(stmfProviderList **logicalUnitProviderList);
266 int stmfGetLogicalUnitProviderProperties(stmfProviderName *providerName,
267     stmfLogicalUnitProviderProperties *providerProperties);
268 int stmfGetProviderData(char *providerName, nvlist_t **nvl, int providerType);
269 int stmfGetProviderDataProt(char *providerName, nvlist_t **nvl,
270     int providerType, uint64_t *setToken);
271 int stmfGetSessionList(stmfDevid *target, stmfSessionList **sessionList);
272 int stmfGetState(stmfState *);
273 int stmfGetTargetGroupList(stmfGroupList **targetGroupList);
274 int stmfGetTargetGroupMembers(stmfGroupName *targetGroupName,
275     stmfGroupProperties **groupProperties);
276 int stmfGetTargetList(stmfDevidList **targetList);
277 int stmfGetTargetProperties(stmfDevid *target,
278     stmfTargetProperties *targetProps);
279 int stmfGetViewEntryList(stmfGuid *lu, stmfViewEntryList **viewEntryList);
280 int stmfLoadConfig(void);
281 int stmfOffline(void);
282 int stmfOfflineTarget(stmfDevid *devid);
283 int stmfOfflineLogicalUnit(stmfGuid *logicalUnit);
284 int stmfOnline(void);
285 int stmfOnlineTarget(stmfDevid *devid);
286 int stmfOnlineLogicalUnit(stmfGuid *logicalUnit);
287 int stmfRemoveFromHostGroup(stmfGroupName *hostGroupName,
288     stmfDevid *initiatorName);
289 int stmfRemoveFromTargetGroup(stmfGroupName *targetGroupName,
290     stmfDevid *targetName);
291 int stmfRemoveViewEntry(stmfGuid *lu, uint32_t viewEntryIndex);
292 int stmfSetProviderData(char *providerName, nvlist_t *nvl, int providerType);
293 int stmfSetProviderDataProt(char *providerName, nvlist_t *nvl,
294     int providerType, uint64_t *setToken);
295 
296 #ifdef	__cplusplus
297 }
298 #endif
299 
300 #endif	/* _LIBSTMF_H */
301