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 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 #ifndef _STMF_IOCTL_H 26 #define _STMF_IOCTL_H 27 28 #ifdef __cplusplus 29 extern "C" { 30 #endif 31 32 #define STMF_VERSION_1 1 33 34 #define STMF_IOCTL (((uint32_t)'S') << 24) 35 #define STMF_IOCTL_LU_LIST (STMF_IOCTL | 1) 36 #define STMF_IOCTL_TARGET_PORT_LIST (STMF_IOCTL | 2) 37 #define STMF_IOCTL_SESSION_LIST (STMF_IOCTL | 3) 38 #define STMF_IOCTL_GET_LU_PROPERTIES (STMF_IOCTL | 4) 39 #define STMF_IOCTL_GET_TARGET_PORT_PROPERTIES (STMF_IOCTL | 5) 40 #define STMF_IOCTL_SET_STMF_STATE (STMF_IOCTL | 6) 41 #define STMF_IOCTL_GET_STMF_STATE (STMF_IOCTL | 7) 42 #define STMF_IOCTL_SET_LU_STATE (STMF_IOCTL | 8) 43 #define STMF_IOCTL_SET_TARGET_PORT_STATE (STMF_IOCTL | 9) 44 #define STMF_IOCTL_CREATE_HOST_GROUP (STMF_IOCTL | 10) 45 #define STMF_IOCTL_REMOVE_HOST_GROUP (STMF_IOCTL | 11) 46 #define STMF_IOCTL_ADD_HG_ENTRY (STMF_IOCTL | 12) 47 #define STMF_IOCTL_REMOVE_HG_ENTRY (STMF_IOCTL | 13) 48 #define STMF_IOCTL_CREATE_TARGET_GROUP (STMF_IOCTL | 14) 49 #define STMF_IOCTL_REMOVE_TARGET_GROUP (STMF_IOCTL | 15) 50 #define STMF_IOCTL_ADD_TG_ENTRY (STMF_IOCTL | 16) 51 #define STMF_IOCTL_REMOVE_TG_ENTRY (STMF_IOCTL | 17) 52 #define STMF_IOCTL_ADD_VIEW_ENTRY (STMF_IOCTL | 18) 53 #define STMF_IOCTL_REMOVE_VIEW_ENTRY (STMF_IOCTL | 19) 54 #define STMF_IOCTL_GET_HG_LIST (STMF_IOCTL | 20) 55 #define STMF_IOCTL_GET_TG_LIST (STMF_IOCTL | 21) 56 #define STMF_IOCTL_GET_HG_ENTRIES (STMF_IOCTL | 22) 57 #define STMF_IOCTL_GET_TG_ENTRIES (STMF_IOCTL | 23) 58 #define STMF_IOCTL_GET_VE_LIST (STMF_IOCTL | 24) 59 #define STMF_IOCTL_LOAD_PP_DATA (STMF_IOCTL | 25) 60 #define STMF_IOCTL_CLEAR_PP_DATA (STMF_IOCTL | 26) 61 #define STMF_IOCTL_GET_PP_DATA (STMF_IOCTL | 27) 62 #define STMF_IOCTL_CLEAR_TRACE (STMF_IOCTL | 28) 63 #define STMF_IOCTL_ADD_TRACE (STMF_IOCTL | 29) 64 #define STMF_IOCTL_GET_TRACE_POSITION (STMF_IOCTL | 30) 65 #define STMF_IOCTL_GET_TRACE (STMF_IOCTL | 31) 66 #define STMF_IOCTL_REG_LU_LIST (STMF_IOCTL | 32) 67 #define STMF_IOCTL_VE_LU_LIST (STMF_IOCTL | 33) 68 #define STMF_IOCTL_LU_VE_LIST (STMF_IOCTL | 34) 69 #define STMF_IOCTL_VALIDATE_VIEW (STMF_IOCTL | 35) 70 #define STMF_IOCTL_SET_ALUA_STATE (STMF_IOCTL | 36) 71 #define STMF_IOCTL_GET_ALUA_STATE (STMF_IOCTL | 37) 72 73 typedef struct stmf_iocdata { 74 uint32_t stmf_version; 75 uint32_t stmf_error; 76 uint32_t stmf_ibuf_size; 77 uint32_t stmf_obuf_size; 78 uint32_t stmf_obuf_nentries; /* # entries xferred */ 79 uint32_t stmf_obuf_max_nentries; /* #,could have been xferred */ 80 uint64_t stmf_ibuf; 81 uint64_t stmf_obuf; 82 } stmf_iocdata_t; 83 84 typedef struct slist_lu { 85 uint8_t lu_guid[16]; 86 } slist_lu_t; 87 88 typedef struct slist_target_port { 89 uint8_t target[260]; 90 } slist_target_port_t; 91 92 typedef struct slist_scsi_session { 93 uint8_t initiator[260]; 94 /* creation_time is really time_t. But time_t is defined as long. */ 95 uint32_t creation_time; 96 char alias[256]; 97 } slist_scsi_session_t; 98 99 /* 100 * States for LUs and LPORTs 101 */ 102 #define STMF_STATE_OFFLINE 0 103 #define STMF_STATE_ONLINING 1 104 #define STMF_STATE_ONLINE 2 105 #define STMF_STATE_OFFLINING 3 106 107 /* 108 * States for the STMF config. 109 */ 110 #define STMF_CONFIG_NONE 0 111 #define STMF_CONFIG_INIT 1 112 #define STMF_CONFIG_INIT_DONE 2 113 114 typedef struct sioc_lu_props { 115 uint8_t lu_guid[16]; 116 uint8_t lu_state:4, 117 lu_present:1, 118 lu_rsvd:3; 119 char lu_provider_name[255]; 120 char lu_alias[256]; 121 } sioc_lu_props_t; 122 123 typedef struct sioc_target_port_props { 124 uint8_t tgt_id[260]; 125 uint8_t tgt_state:4, 126 tgt_present:1, 127 tgt_rsvd:3; 128 char tgt_provider_name[255]; 129 char tgt_alias[256]; 130 } sioc_target_port_props_t; 131 132 /* 133 * This struct is used for getting and setting state of LU/LPORT or STMF. 134 */ 135 typedef struct stmf_state_desc { 136 uint8_t ident[260]; /* N/A for STMF itself */ 137 uint8_t state; 138 uint8_t config_state; /* N/A for LU/LPORTs */ 139 } stmf_state_desc_t; 140 141 /* 142 * This struct is used for setting the alua state 143 */ 144 typedef struct stmf_alua_state_desc { 145 uint8_t alua_state; 146 uint16_t alua_node; 147 } stmf_alua_state_desc_t; 148 149 /* Error definitions for group/view entry/provider dataioctls */ 150 #define STMF_IOCERR_NONE 0 151 #define STMF_IOCERR_HG_EXISTS 1 152 #define STMF_IOCERR_INVALID_HG 2 153 #define STMF_IOCERR_TG_EXISTS 3 154 #define STMF_IOCERR_INVALID_TG 4 155 #define STMF_IOCERR_HG_ENTRY_EXISTS 5 156 #define STMF_IOCERR_INVALID_HG_ENTRY 6 157 #define STMF_IOCERR_TG_ENTRY_EXISTS 7 158 #define STMF_IOCERR_INVALID_TG_ENTRY 8 159 #define STMF_IOCERR_TG_UPDATE_NEED_SVC_OFFLINE 9 160 #define STMF_IOCERR_LU_NUMBER_IN_USE 10 161 #define STMF_IOCERR_INVALID_LU_ID 11 162 #define STMF_IOCERR_VIEW_ENTRY_CONFLICT 12 163 #define STMF_IOCERR_HG_IN_USE 13 164 #define STMF_IOCERR_TG_IN_USE 14 165 #define STMF_IOCERR_INVALID_VIEW_ENTRY 15 166 #define STMF_IOCERR_INVALID_VE_ID 16 167 #define STMF_IOCERR_UPDATE_NEED_CFG_INIT 17 168 #define STMF_IOCERR_PPD_UPDATED 18 169 #define STMF_IOCERR_INSUFFICIENT_BUF 19 170 #define STMF_IOCERR_TG_NEED_TG_OFFLINE 20 171 172 173 typedef struct stmf_group_name { 174 uint16_t name_size; /* in bytes */ 175 uint16_t rsvd_1; 176 uint32_t rsvd_2; 177 uint8_t name[512]; /* 256 * wchar_t */ 178 } stmf_group_name_t; 179 180 /* 181 * struct used to operate (add/remove entry) on a group. 182 */ 183 184 typedef struct stmf_ge_ident { 185 uint16_t ident_size; 186 uint8_t ident[256]; 187 } stmf_ge_ident_t; 188 189 typedef struct stmf_group_op_data { 190 stmf_group_name_t group; 191 uint8_t ident[260]; 192 } stmf_group_op_data_t; 193 194 typedef struct stmf_view_op_entry { 195 uint32_t ve_ndx_valid:1, 196 ve_lu_number_valid:1, 197 ve_all_hosts:1, 198 ve_all_targets:1, 199 rsvd:28; 200 uint32_t ve_ndx; 201 uint8_t ve_lu_nbr[8]; 202 uint8_t ve_guid[16]; 203 stmf_group_name_t ve_host_group; 204 stmf_group_name_t ve_target_group; 205 } stmf_view_op_entry_t; 206 207 typedef struct stmf_ppioctl_data { 208 char ppi_name[255]; /* Provider name including \0 */ 209 uint8_t ppi_port_provider:1, 210 ppi_lu_provider:1, 211 ppi_token_valid:1, 212 ppt_rsvd:5; 213 uint64_t ppi_token; 214 uint64_t ppi_data_size; 215 uint8_t ppi_data[8]; 216 } stmf_ppioctl_data_t; 217 218 /* 219 * SCSI device ID descriptor as per SPC3 7.6.3 220 */ 221 typedef struct scsi_devid_desc { 222 #ifdef _BIT_FIELDS_HTOL 223 uint8_t protocol_id:4, 224 code_set:4; 225 uint8_t piv:1, 226 rsvd1:1, 227 association:2, 228 ident_type:4; 229 #else 230 uint8_t code_set:4, 231 protocol_id:4; 232 uint8_t ident_type:4, 233 association:2, 234 rsvd1:1, 235 piv:1; 236 #endif 237 uint8_t rsvd2; 238 uint8_t ident_length; 239 uint8_t ident[1]; 240 } scsi_devid_desc_t; 241 242 /* 243 * Protocol Identifier 244 */ 245 #define PROTOCOL_FIBRE_CHANNEL 0 246 #define PROTOCOL_PARALLEL_SCSI 1 247 #define PROTOCOL_SSA 2 248 #define PROTOCOL_IEEE_1394 3 249 #define PROTOCOL_SRP 4 250 #define PROTOCOL_iSCSI 5 251 #define PROTOCOL_SAS 6 252 #define PROTOCOL_ADT 7 253 #define PROTOCOL_ATAPI 8 254 #define PROTOCOL_ANY 15 255 256 /* 257 * Code set definitions 258 */ 259 #define CODE_SET_BINARY 1 260 #define CODE_SET_ASCII 2 261 #define CODE_SET_UTF8 3 262 263 /* 264 * Association values 265 */ 266 #define ID_IS_LOGICAL_UNIT 0 267 #define ID_IS_TARGET_PORT 1 268 #define ID_IS_TARGET_CONTAINING_LU 2 269 270 /* 271 * ident type 272 */ 273 #define ID_TYPE_VENDOR_SPECIFIC 0 274 #define ID_TYPE_T10_VID 1 275 #define ID_TYPE_EUI64 2 276 #define ID_TYPE_NAA 3 277 #define ID_TYPE_RELATIVE_TARGET_PORT 4 278 #define ID_TYPE_TARGET_PORT_GROUP 5 279 #define ID_TYPE_LOGICAL_UNIT_GROUP 6 280 #define ID_TYPE_MD5_LOGICAL_UNIT 7 281 #define ID_TYPE_SCSI_NAME_STRING 8 282 283 int stmf_copyin_iocdata(intptr_t data, int mode, stmf_iocdata_t **iocd, 284 void **ibuf, void **obuf); 285 int stmf_copyout_iocdata(intptr_t data, int mode, stmf_iocdata_t *iocd, 286 void *obuf); 287 288 #ifdef __cplusplus 289 } 290 #endif 291 292 #endif /* _STMF_IOCTL_H */ 293