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 #define STMF_ERROR_UNMAP_SET (STMF_STATUS_ERROR | 0x10a)
110
111 /* Initiator Name Types */
112 #define STMF_FC_PORT_WWN 1
113 #define STMF_ISCSI_NAME 2
114
115
116 /* provider types */
117 #define STMF_LU_PROVIDER_TYPE 1
118 #define STMF_PORT_PROVIDER_TYPE 2
119
120 /* LU Resource types */
121 #define STMF_DISK 0
122
123 /* Persistence methods */
124 #define STMF_PERSIST_SMF 1
125 #define STMF_PERSIST_NONE 2
126
127 /* Logical unit access states */
128 #define STMF_ACCESS_ACTIVE "0"
129 #define STMF_ACCESS_ACTIVE_TO_STANDBY "1"
130 #define STMF_ACCESS_STANDBY "2"
131 #define STMF_ACCESS_STANDBY_TO_ACTIVE "3"
132
133 /*
134 * LU Disk Properties
135 */
136
137 enum {
138 STMF_LU_PROP_ALIAS = 1,
139 STMF_LU_PROP_BLOCK_SIZE,
140 STMF_LU_PROP_COMPANY_ID,
141 STMF_LU_PROP_FILENAME,
142 STMF_LU_PROP_GUID,
143 STMF_LU_PROP_META_FILENAME,
144 STMF_LU_PROP_MGMT_URL,
145 STMF_LU_PROP_NEW,
146 STMF_LU_PROP_SIZE,
147 STMF_LU_PROP_WRITE_PROTECT,
148 STMF_LU_PROP_WRITE_CACHE_DISABLE,
149 STMF_LU_PROP_VID,
150 STMF_LU_PROP_PID,
151 STMF_LU_PROP_SERIAL_NUM,
152 STMF_LU_PROP_ACCESS_STATE,
153 STMF_LU_PROP_HOST_ID,
154 STMF_LU_PROP_UNMAP
155 };
156
157
158 /* devid code set and name types */
159 #define EUI_64_TYPE 2
160 #define NAA_TYPE 3
161 #define SCSI_NAME_TYPE 8
162
163 #define BINARY_CODE_SET 1
164 #define ASCII_CODE_SET 2
165 #define UTF_8_CODE_SET 3
166
167 typedef enum _stmfProtocol
168 {
169 STMF_PROTOCOL_FIBRE_CHANNEL = 0,
170 STMF_PROTOCOL_SCSI = 1,
171 STMF_PROTOCOL_SSA = 2,
172 STMF_PROTOCOL_IEEE_1394 = 3,
173 STMF_PROTOCOL_SRP = 4,
174 STMF_PROTOCOL_ISCSI = 5,
175 STMF_PROTOCOL_SAS = 6
176 } stmfProtocol;
177
178
179 typedef struct _stmfGuid
180 {
181 uchar_t guid[16];
182 } stmfGuid;
183
184 typedef struct _stmfGuidList
185 {
186 uint32_t cnt;
187 stmfGuid guid[1];
188 } stmfGuidList;
189
190 typedef struct _stmfState
191 {
192 int operationalState;
193 int configState;
194 } stmfState;
195
196 typedef struct _stmfDevid
197 {
198 uint8_t identLength; /* length of ident */
199 uint8_t ident[STMF_IDENT_LENGTH]; /* SCSI name string ident */
200 } stmfDevid;
201
202 typedef struct _stmfDevidList
203 {
204 uint32_t cnt;
205 stmfDevid devid[1];
206 } stmfDevidList;
207
208 typedef char stmfGroupName[256];
209 typedef char stmfProviderName[256];
210
211 typedef struct _stmfGroupList
212 {
213 uint32_t cnt;
214 stmfGroupName name[1];
215 } stmfGroupList;
216
217 typedef struct _stmfProvider
218 {
219 int providerType;
220 stmfProviderName name;
221 } stmfProvider;
222
223 typedef struct _stmfProviderList
224 {
225 uint32_t cnt;
226 stmfProvider provider[1];
227 } stmfProviderList;
228
229 typedef struct _stmfSession
230 {
231 stmfDevid initiator;
232 char alias[256];
233 time_t creationTime;
234 } stmfSession;
235
236 typedef struct _stmfSessionList
237 {
238 uint32_t cnt;
239 stmfSession session[1];
240 } stmfSessionList;
241
242
243 typedef struct _stmfViewEntry
244 {
245 boolean_t veIndexValid; /* if B_TRUE, veIndex is valid value */
246 uint32_t veIndex; /* View Entry index */
247 boolean_t allHosts; /* all initiator ports */
248 stmfGroupName hostGroup; /* Host Group Name */
249 boolean_t allTargets; /* B_TRUE = targetGroup is invalid */
250 stmfGroupName targetGroup; /* Target Group Name */
251 boolean_t luNbrValid; /* if B_TRUE, luNbr is a valid value */
252 uchar_t luNbr[8]; /* LU number for this view entry */
253 } stmfViewEntry;
254
255 typedef struct _stmfViewEntryList
256 {
257 uint32_t cnt;
258 stmfViewEntry ve[1];
259 } stmfViewEntryList;
260
261 typedef struct _stmfViewEntryProperties
262 {
263 stmfGuid associatedLogicalUnitGuid;
264 stmfViewEntry viewEntry;
265 } stmfViewEntryProperties;
266
267 typedef struct _stmfGroupProperties
268 {
269 uint32_t cnt;
270 stmfDevid name[1];
271 } stmfGroupProperties;
272
273 typedef struct _stmfTargetProperties
274 {
275 stmfProviderName providerName;
276 char alias[256];
277 uint16_t status;
278 stmfProtocol protocol;
279 stmfDevid devid;
280 } stmfTargetProperties;
281
282 typedef struct _stmfLogicalUnitProperties
283 {
284 char alias[256];
285 uchar_t vendor[8];
286 uchar_t product[16];
287 uchar_t revision[4];
288 uint32_t status;
289 char providerName[256];
290 stmfGuid luid;
291 } stmfLogicalUnitProperties;
292
293 typedef void * luResource;
294
295 typedef struct _stmfLogicalUnitProviderProperties
296 {
297 char providerName[MAXPATHLEN];
298 uint32_t instance;
299 uint32_t status;
300 uchar_t rsvd[64];
301 } stmfLogicalUnitProviderProperties;
302
303 typedef struct _stmfLocalPortProviderProperties
304 {
305 char providerName[MAXPATHLEN];
306 uint32_t instance;
307 uint32_t status;
308 uchar_t rsvd[64];
309 } stmfLocalPortProviderProperties;
310
311 /* API prototypes */
312 int stmfAddToHostGroup(stmfGroupName *hostGroupName, stmfDevid *name);
313 int stmfAddToTargetGroup(stmfGroupName *targetGroupName, stmfDevid *targetName);
314 int stmfAddViewEntry(stmfGuid *lu, stmfViewEntry *viewEntry);
315 int stmfClearProviderData(char *providerName, int providerType);
316 int stmfCreateHostGroup(stmfGroupName *hostGroupName);
317 int stmfCreateLu(luResource hdl, stmfGuid *luGuid);
318 int stmfCreateLuResource(uint16_t dType, luResource *hdl);
319 int stmfCreateTargetGroup(stmfGroupName *targetGroupName);
320 int stmfDeleteHostGroup(stmfGroupName *hostGroupName);
321 int stmfDeleteLu(stmfGuid *luGuid);
322 int stmfDeleteTargetGroup(stmfGroupName *targetGroupName);
323 void stmfDestroyProxyDoor(int hdl);
324 int stmfDevidFromIscsiName(char *iscsiName, stmfDevid *devid);
325 int stmfDevidFromWwn(uchar_t wwn[8], stmfDevid *devid);
326 int stmfFreeLuResource(luResource hdl);
327 void stmfFreeMemory(void *);
328 int stmfGetAluaState(boolean_t *enabled, uint32_t *node);
329 int stmfGetGlobalLuProp(uint16_t dType, uint32_t prop, char *propVal,
330 size_t *propLen);
331 int stmfGetHostGroupList(stmfGroupList **initiatorGroupList);
332 int stmfGetHostGroupMembers(stmfGroupName *hostGroupName,
333 stmfGroupProperties **groupProperties);
334 int stmfGetLocalPortProviderList(stmfProviderList **localPortProviderList);
335 int stmfGetLocalPortProviderProperties(stmfProviderName *providerName,
336 stmfLocalPortProviderProperties *providerProperties);
337 int stmfGetLogicalUnitList(stmfGuidList **logicalUnitList);
338 int stmfGetLogicalUnitProperties(stmfGuid *logicalUnit,
339 stmfLogicalUnitProperties *logicalUnitProps);
340 int stmfGetLogicalUnitProviderList(stmfProviderList **logicalUnitProviderList);
341 int stmfGetLogicalUnitProviderProperties(stmfProviderName *providerName,
342 stmfLogicalUnitProviderProperties *providerProperties);
343 int stmfGetLuProp(luResource hdl, uint32_t propType, char *prop,
344 size_t *propLen);
345 int stmfGetLuResource(stmfGuid *luGuid, luResource *hdl);
346 int stmfGetPersistMethod(uint8_t *persistType, boolean_t serviceState);
347 int stmfGetProviderData(char *providerName, nvlist_t **nvl, int providerType);
348 int stmfGetProviderDataProt(char *providerName, nvlist_t **nvl,
349 int providerType, uint64_t *setToken);
350 int stmfGetSessionList(stmfDevid *target, stmfSessionList **sessionList);
351 int stmfGetState(stmfState *);
352 int stmfGetTargetGroupList(stmfGroupList **targetGroupList);
353 int stmfGetTargetGroupMembers(stmfGroupName *targetGroupName,
354 stmfGroupProperties **groupProperties);
355 int stmfGetTargetList(stmfDevidList **targetList);
356 int stmfGetTargetProperties(stmfDevid *target,
357 stmfTargetProperties *targetProps);
358 int stmfGetViewEntryList(stmfGuid *lu, stmfViewEntryList **viewEntryList);
359 int stmfImportLu(uint16_t dType, char *fname, stmfGuid *luGuid);
360 int stmfInitProxyDoor(int *hdl, int fd);
361 int stmfLoadConfig(void);
362 int stmfLuStandby(stmfGuid *luGuid);
363 int stmfModifyLu(stmfGuid *luGuid, uint32_t prop, const char *propVal);
364 int stmfModifyLuByFname(uint16_t dType, const char *fname, uint32_t prop,
365 const char *propVal);
366 int stmfOffline(void);
367 int stmfOfflineTarget(stmfDevid *devid);
368 int stmfOfflineLogicalUnit(stmfGuid *logicalUnit);
369 int stmfOnline(void);
370 int stmfOnlineTarget(stmfDevid *devid);
371 int stmfOnlineLogicalUnit(stmfGuid *logicalUnit);
372 int stmfPostProxyMsg(int hdl, void *buf, uint32_t buflen);
373 int stmfRemoveFromHostGroup(stmfGroupName *hostGroupName,
374 stmfDevid *initiatorName);
375 int stmfRemoveFromTargetGroup(stmfGroupName *targetGroupName,
376 stmfDevid *targetName);
377 int stmfRemoveViewEntry(stmfGuid *lu, uint32_t viewEntryIndex);
378 int stmfSetAluaState(boolean_t enabled, uint32_t node);
379 int stmfSetGlobalLuProp(uint16_t dType, uint32_t propType, const char *propVal);
380 int stmfSetLuProp(luResource hdl, uint32_t propType, const char *propVal);
381 int stmfSetPersistMethod(uint8_t persistType, boolean_t serviceSet);
382 int stmfSetProviderData(char *providerName, nvlist_t *nvl, int providerType);
383 int stmfSetProviderDataProt(char *providerName, nvlist_t *nvl,
384 int providerType, uint64_t *setToken);
385 int stmfValidateView(stmfViewEntry *viewEntry);
386 int stmfSetStmfProp(uint8_t propType, char *propVal);
387 int stmfGetStmfProp(uint8_t propType, char *propVal, size_t *propLen);
388 int stmfLoadStmfProps(void);
389
390 #ifdef __cplusplus
391 }
392 #endif
393
394 #endif /* _LIBSTMF_H */