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