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 */