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 (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
23  */
24 
25 #ifndef	_LIBSTMF_H
26 #define	_LIBSTMF_H
27 
28 #include <time.h>
29 #include <sys/param.h>
30 #include <libnvpair.h>
31 
32 #ifdef	__cplusplus
33 extern "C" {
34 #endif
35 
36 /* Constants and Types */
37 
38 /* LU and Local Port states */
39 #define	STMF_LOGICAL_UNIT_OFFLINE	0
40 #define	STMF_LOGICAL_UNIT_OFFLINING	1
41 #define	STMF_LOGICAL_UNIT_ONLINE	2
42 #define	STMF_LOGICAL_UNIT_ONLINING	3
43 #define	STMF_LOGICAL_UNIT_UNREGISTERED	4
44 #define	STMF_TARGET_PORT_OFFLINE	5
45 #define	STMF_TARGET_PORT_OFFLINING	6
46 #define	STMF_TARGET_PORT_ONLINE		7
47 #define	STMF_TARGET_PORT_ONLINING	8
48 #define	STMF_SERVICE_STATE_ONLINE	9
49 #define	STMF_SERVICE_STATE_OFFLINE	10
50 #define	STMF_SERVICE_STATE_ONLINING	11
51 #define	STMF_SERVICE_STATE_OFFLINING	12
52 #define	STMF_SERVICE_STATE_UNKNOWN	13
53 #define	STMF_CONFIG_STATE_NONE		14
54 #define	STMF_CONFIG_STATE_INIT		15
55 #define	STMF_CONFIG_STATE_INIT_DONE	16
56 #define	STMF_CONFIG_STATE_UNKNOWN	17
57 #define	STMF_DEFAULT_LU_STATE		18
58 #define	STMF_DEFAULT_TARGET_PORT_STATE	19
59 
60 #define	STMF_IDENT_LENGTH   255
61 
62 /* API status return values */
63 #define	STMF_STATUS_SUCCESS	    0x0000
64 #define	STMF_STATUS_ERROR	    0x8000
65 #define	STMF_ERROR_BUSY			(STMF_STATUS_ERROR | 0x01)
66 #define	STMF_ERROR_NOT_FOUND		(STMF_STATUS_ERROR | 0x02)
67 #define	STMF_ERROR_MEMBER_NOT_FOUND	(STMF_STATUS_ERROR | 0x03)
68 #define	STMF_ERROR_GROUP_NOT_FOUND	(STMF_STATUS_ERROR | 0x04)
69 #define	STMF_ERROR_PERM			(STMF_STATUS_ERROR | 0x05)
70 #define	STMF_ERROR_NOMEM		(STMF_STATUS_ERROR | 0x06)
71 #define	STMF_ERROR_INVALID_ARG		(STMF_STATUS_ERROR | 0x07)
72 #define	STMF_ERROR_EXISTS		(STMF_STATUS_ERROR | 0x08)
73 #define	STMF_ERROR_SERVICE_NOT_FOUND	(STMF_STATUS_ERROR | 0x09)
74 #define	STMF_ERROR_SERVICE_ONLINE	(STMF_STATUS_ERROR | 0x0a)
75 #define	STMF_ERROR_SERVICE_OFFLINE	(STMF_STATUS_ERROR | 0x0b)
76 #define	STMF_ERROR_GROUP_IN_USE		(STMF_STATUS_ERROR | 0x0c)
77 #define	STMF_ERROR_LUN_IN_USE		(STMF_STATUS_ERROR | 0x0d)
78 #define	STMF_ERROR_VE_CONFLICT		(STMF_STATUS_ERROR | 0x0e)
79 #define	STMF_ERROR_CONFIG_NONE		(STMF_STATUS_ERROR | 0x0f)
80 #define	STMF_ERROR_SERVICE_DATA_VERSION (STMF_STATUS_ERROR | 0x10)
81 #define	STMF_ERROR_INVALID_HG		(STMF_STATUS_ERROR | 0x11)
82 #define	STMF_ERROR_INVALID_TG		(STMF_STATUS_ERROR | 0x12)
83 #define	STMF_ERROR_PROV_DATA_STALE	(STMF_STATUS_ERROR | 0x13)
84 #define	STMF_ERROR_NO_PROP		(STMF_STATUS_ERROR | 0x14)
85 #define	STMF_ERROR_NO_PROP_VAL		(STMF_STATUS_ERROR | 0x15)
86 #define	STMF_ERROR_MISSING_PROP_VAL	(STMF_STATUS_ERROR | 0x16)
87 #define	STMF_ERROR_INVALID_BLOCKSIZE	(STMF_STATUS_ERROR | 0x17)
88 #define	STMF_ERROR_FILE_ALREADY		(STMF_STATUS_ERROR | 0x18)
89 #define	STMF_ERROR_INVALID_PROPSIZE	(STMF_STATUS_ERROR | 0x19)
90 #define	STMF_ERROR_INVALID_PROP		(STMF_STATUS_ERROR | 0x20)
91 #define	STMF_ERROR_PERSIST_TYPE		(STMF_STATUS_ERROR | 0x21)
92 #define	STMF_ERROR_TG_ONLINE		(STMF_STATUS_ERROR | 0x22)
93 #define	STMF_ERROR_ACCESS_STATE_SET	(STMF_STATUS_ERROR | 0x23)
94 #define	STMF_ERROR_NO_PROP_STANDBY	(STMF_STATUS_ERROR | 0x24)
95 #define	STMF_ERROR_POST_MSG_FAILED	(STMF_STATUS_ERROR | 0x25)
96 #define	STMF_ERROR_DOOR_INSTALLED	(STMF_STATUS_ERROR | 0x26)
97 
98 /* Failures for stmfCreateLu */
99 #define	STMF_ERROR_FILE_IN_USE		(STMF_STATUS_ERROR | 0x100)
100 #define	STMF_ERROR_INVALID_BLKSIZE	(STMF_STATUS_ERROR | 0x101)
101 #define	STMF_ERROR_GUID_IN_USE		(STMF_STATUS_ERROR | 0x102)
102 #define	STMF_ERROR_META_FILE_NAME	(STMF_STATUS_ERROR | 0x103)
103 #define	STMF_ERROR_DATA_FILE_NAME	(STMF_STATUS_ERROR | 0x104)
104 #define	STMF_ERROR_SIZE_OUT_OF_RANGE	(STMF_STATUS_ERROR | 0x105)
105 #define	STMF_ERROR_LU_BUSY		(STMF_STATUS_ERROR | 0x106)
106 #define	STMF_ERROR_META_CREATION	(STMF_STATUS_ERROR | 0x107)
107 #define	STMF_ERROR_FILE_SIZE_INVALID	(STMF_STATUS_ERROR | 0x108)
108 #define	STMF_ERROR_WRITE_CACHE_SET	(STMF_STATUS_ERROR | 0x109)
109 
110 /* Initiator Name Types */
111 #define	STMF_FC_PORT_WWN	    1
112 #define	STMF_ISCSI_NAME		    2
113 
114 
115 /* provider types */
116 #define	STMF_LU_PROVIDER_TYPE	1
117 #define	STMF_PORT_PROVIDER_TYPE	2
118 
119 /* LU Resource types */
120 #define	STMF_DISK   0
121 
122 /* Persistence methods */
123 #define	STMF_PERSIST_SMF	1
124 #define	STMF_PERSIST_NONE	2
125 
126 /* Logical unit access states */
127 #define	STMF_ACCESS_ACTIVE		"0"
128 #define	STMF_ACCESS_ACTIVE_TO_STANDBY   "1"
129 #define	STMF_ACCESS_STANDBY		"2"
130 #define	STMF_ACCESS_STANDBY_TO_ACTIVE	"3"
131 
132 /*
133  * LU Disk Properties
134  */
135 
136 enum {
137 	STMF_LU_PROP_ALIAS = 1,
138 	STMF_LU_PROP_BLOCK_SIZE,
139 	STMF_LU_PROP_COMPANY_ID,
140 	STMF_LU_PROP_FILENAME,
141 	STMF_LU_PROP_GUID,
142 	STMF_LU_PROP_META_FILENAME,
143 	STMF_LU_PROP_MGMT_URL,
144 	STMF_LU_PROP_NEW,
145 	STMF_LU_PROP_SIZE,
146 	STMF_LU_PROP_WRITE_PROTECT,
147 	STMF_LU_PROP_WRITE_CACHE_DISABLE,
148 	STMF_LU_PROP_VID,
149 	STMF_LU_PROP_PID,
150 	STMF_LU_PROP_SERIAL_NUM,
151 	STMF_LU_PROP_ACCESS_STATE,
152 	STMF_LU_PROP_HOST_ID
153 };
154 
155 
156 /* devid code set and name types */
157 #define	EUI_64_TYPE	2
158 #define	NAA_TYPE	3
159 #define	SCSI_NAME_TYPE	8
160 
161 #define	BINARY_CODE_SET	1
162 #define	ASCII_CODE_SET	2
163 #define	UTF_8_CODE_SET	3
164 
165 typedef enum _stmfProtocol
166 {
167 	STMF_PROTOCOL_FIBRE_CHANNEL =	0,
168 	STMF_PROTOCOL_SCSI =		1,
169 	STMF_PROTOCOL_SSA =		2,
170 	STMF_PROTOCOL_IEEE_1394 =	3,
171 	STMF_PROTOCOL_SRP =		4,
172 	STMF_PROTOCOL_ISCSI =		5,
173 	STMF_PROTOCOL_SAS =		6
174 } stmfProtocol;
175 
176 
177 typedef struct _stmfGuid
178 {
179 	uchar_t	guid[16];
180 } stmfGuid;
181 
182 typedef struct _stmfGuidList
183 {
184 	uint32_t cnt;
185 	stmfGuid guid[1];
186 } stmfGuidList;
187 
188 typedef struct _stmfState
189 {
190 	int operationalState;
191 	int configState;
192 } stmfState;
193 
194 typedef struct _stmfDevid
195 {
196 	uint8_t identLength;	/* length of ident */
197 	uint8_t	ident[STMF_IDENT_LENGTH]; /* SCSI name string ident */
198 } stmfDevid;
199 
200 typedef struct _stmfDevidList
201 {
202 	uint32_t cnt;
203 	stmfDevid devid[1];
204 } stmfDevidList;
205 
206 typedef char stmfGroupName[256];
207 typedef char stmfProviderName[256];
208 
209 typedef struct _stmfGroupList
210 {
211 	uint32_t cnt;
212 	stmfGroupName name[1];
213 } stmfGroupList;
214 
215 typedef struct _stmfProvider
216 {
217 	int providerType;
218 	stmfProviderName name;
219 } stmfProvider;
220 
221 typedef struct _stmfProviderList
222 {
223 	uint32_t cnt;
224 	stmfProvider provider[1];
225 } stmfProviderList;
226 
227 typedef struct _stmfSession
228 {
229 	stmfDevid initiator;
230 	char alias[256];
231 	time_t creationTime;
232 } stmfSession;
233 
234 typedef struct _stmfSessionList
235 {
236 	uint32_t cnt;
237 	stmfSession session[1];
238 } stmfSessionList;
239 
240 
241 typedef struct _stmfViewEntry
242 {
243 	boolean_t	veIndexValid;	/* if B_TRUE, veIndex is valid value */
244 	uint32_t	veIndex;	/* View Entry index */
245 	boolean_t	allHosts;	/* all initiator ports */
246 	stmfGroupName   hostGroup;	/* Host Group Name */
247 	boolean_t	allTargets;	/* B_TRUE = targetGroup is invalid */
248 	stmfGroupName	targetGroup;	/* Target Group Name */
249 	boolean_t	luNbrValid;	/* if B_TRUE, luNbr is a valid value */
250 	uchar_t		luNbr[8];	/* LU number for this view entry */
251 } stmfViewEntry;
252 
253 typedef struct _stmfViewEntryList
254 {
255 	uint32_t cnt;
256 	stmfViewEntry ve[1];
257 } stmfViewEntryList;
258 
259 typedef struct _stmfViewEntryProperties
260 {
261 	stmfGuid	associatedLogicalUnitGuid;
262 	stmfViewEntry	viewEntry;
263 } stmfViewEntryProperties;
264 
265 typedef struct _stmfGroupProperties
266 {
267 	uint32_t	cnt;
268 	stmfDevid	name[1];
269 } stmfGroupProperties;
270 
271 typedef struct _stmfTargetProperties
272 {
273 	stmfProviderName providerName;
274 	char		 alias[256];
275 	uint16_t	 status;
276 	stmfProtocol	 protocol;
277 	stmfDevid	 devid;
278 } stmfTargetProperties;
279 
280 typedef struct _stmfLogicalUnitProperties
281 {
282 	char	    alias[256];
283 	uchar_t	    vendor[8];
284 	uchar_t	    product[16];
285 	uchar_t	    revision[4];
286 	uint32_t    status;
287 	char	    providerName[256];
288 	stmfGuid    luid;
289 } stmfLogicalUnitProperties;
290 
291 typedef void * luResource;
292 
293 typedef struct _stmfLogicalUnitProviderProperties
294 {
295 	char	    providerName[MAXPATHLEN];
296 	uint32_t    instance;
297 	uint32_t    status;
298 	uchar_t	    rsvd[64];
299 } stmfLogicalUnitProviderProperties;
300 
301 typedef struct _stmfLocalPortProviderProperties
302 {
303 	char	    providerName[MAXPATHLEN];
304 	uint32_t    instance;
305 	uint32_t    status;
306 	uchar_t	    rsvd[64];
307 } stmfLocalPortProviderProperties;
308 
309 /* API prototypes */
310 int stmfAddToHostGroup(stmfGroupName *hostGroupName, stmfDevid *name);
311 int stmfAddToTargetGroup(stmfGroupName *targetGroupName, stmfDevid *targetName);
312 int stmfAddViewEntry(stmfGuid *lu, stmfViewEntry *viewEntry);
313 int stmfClearProviderData(char *providerName, int providerType);
314 int stmfCreateHostGroup(stmfGroupName *hostGroupName);
315 int stmfCreateLu(luResource hdl, stmfGuid *luGuid);
316 int stmfCreateLuResource(uint16_t dType, luResource *hdl);
317 int stmfCreateTargetGroup(stmfGroupName *targetGroupName);
318 int stmfDeleteHostGroup(stmfGroupName *hostGroupName);
319 int stmfDeleteLu(stmfGuid *luGuid);
320 int stmfDeleteTargetGroup(stmfGroupName *targetGroupName);
321 void stmfDestroyProxyDoor(int hdl);
322 int stmfDevidFromIscsiName(char *iscsiName, stmfDevid *devid);
323 int stmfDevidFromWwn(uchar_t wwn[8], stmfDevid *devid);
324 int stmfFreeLuResource(luResource hdl);
325 void stmfFreeMemory(void *);
326 int stmfGetAluaState(boolean_t *enabled, uint32_t *node);
327 int stmfGetGlobalLuProp(uint16_t dType, uint32_t prop, char *propVal,
328     size_t *propLen);
329 int stmfGetHostGroupList(stmfGroupList **initiatorGroupList);
330 int stmfGetHostGroupMembers(stmfGroupName *hostGroupName,
331     stmfGroupProperties **groupProperties);
332 int stmfGetLocalPortProviderList(stmfProviderList **localPortProviderList);
333 int stmfGetLocalPortProviderProperties(stmfProviderName *providerName,
334     stmfLocalPortProviderProperties *providerProperties);
335 int stmfGetLogicalUnitList(stmfGuidList **logicalUnitList);
336 int stmfGetLogicalUnitProperties(stmfGuid *logicalUnit,
337     stmfLogicalUnitProperties *logicalUnitProps);
338 int stmfGetLogicalUnitProviderList(stmfProviderList **logicalUnitProviderList);
339 int stmfGetLogicalUnitProviderProperties(stmfProviderName *providerName,
340     stmfLogicalUnitProviderProperties *providerProperties);
341 int stmfGetLuProp(luResource hdl, uint32_t propType, char *prop,
342     size_t *propLen);
343 int stmfGetLuResource(stmfGuid *luGuid, luResource *hdl);
344 int stmfGetPersistMethod(uint8_t *persistType, boolean_t serviceState);
345 int stmfGetProviderData(char *providerName, nvlist_t **nvl, int providerType);
346 int stmfGetProviderDataProt(char *providerName, nvlist_t **nvl,
347     int providerType, uint64_t *setToken);
348 int stmfGetSessionList(stmfDevid *target, stmfSessionList **sessionList);
349 int stmfGetState(stmfState *);
350 int stmfGetTargetGroupList(stmfGroupList **targetGroupList);
351 int stmfGetTargetGroupMembers(stmfGroupName *targetGroupName,
352     stmfGroupProperties **groupProperties);
353 int stmfGetTargetList(stmfDevidList **targetList);
354 int stmfGetTargetProperties(stmfDevid *target,
355     stmfTargetProperties *targetProps);
356 int stmfGetViewEntryList(stmfGuid *lu, stmfViewEntryList **viewEntryList);
357 int stmfImportLu(uint16_t dType, char *fname, stmfGuid *luGuid);
358 int stmfInitProxyDoor(int *hdl, int fd);
359 int stmfLoadConfig(void);
360 int stmfLuStandby(stmfGuid *luGuid);
361 int stmfModifyLu(stmfGuid *luGuid, uint32_t prop, const char *propVal);
362 int stmfModifyLuByFname(uint16_t dType, const char *fname, uint32_t prop,
363     const char *propVal);
364 int stmfOffline(void);
365 int stmfOfflineTarget(stmfDevid *devid);
366 int stmfOfflineLogicalUnit(stmfGuid *logicalUnit);
367 int stmfOnline(void);
368 int stmfOnlineTarget(stmfDevid *devid);
369 int stmfOnlineLogicalUnit(stmfGuid *logicalUnit);
370 int stmfPostProxyMsg(int hdl, void *buf, uint32_t buflen);
371 int stmfRemoveFromHostGroup(stmfGroupName *hostGroupName,
372     stmfDevid *initiatorName);
373 int stmfRemoveFromTargetGroup(stmfGroupName *targetGroupName,
374     stmfDevid *targetName);
375 int stmfRemoveViewEntry(stmfGuid *lu, uint32_t viewEntryIndex);
376 int stmfSetAluaState(boolean_t enabled, uint32_t node);
377 int stmfSetGlobalLuProp(uint16_t dType, uint32_t propType, const char *propVal);
378 int stmfSetLuProp(luResource hdl, uint32_t propType, const char *propVal);
379 int stmfSetPersistMethod(uint8_t persistType, boolean_t serviceSet);
380 int stmfSetProviderData(char *providerName, nvlist_t *nvl, int providerType);
381 int stmfSetProviderDataProt(char *providerName, nvlist_t *nvl,
382     int providerType, uint64_t *setToken);
383 int stmfValidateView(stmfViewEntry *viewEntry);
384 int stmfSetStmfProp(uint8_t propType, char *propVal);
385 int stmfGetStmfProp(uint8_t propType, char *propVal, size_t *propLen);
386 int stmfLoadStmfProps(void);
387 
388 #ifdef	__cplusplus
389 }
390 #endif
391 
392 #endif	/* _LIBSTMF_H */
393