/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. */ #ifndef _STMF_IOCTL_H #define _STMF_IOCTL_H #ifdef __cplusplus extern "C" { #endif #define STMF_VERSION_1 1 #define STMF_IOCTL (((uint32_t)'S') << 24) #define STMF_IOCTL_LU_LIST (STMF_IOCTL | 1) #define STMF_IOCTL_TARGET_PORT_LIST (STMF_IOCTL | 2) #define STMF_IOCTL_SESSION_LIST (STMF_IOCTL | 3) #define STMF_IOCTL_GET_LU_PROPERTIES (STMF_IOCTL | 4) #define STMF_IOCTL_GET_TARGET_PORT_PROPERTIES (STMF_IOCTL | 5) #define STMF_IOCTL_SET_STMF_STATE (STMF_IOCTL | 6) #define STMF_IOCTL_GET_STMF_STATE (STMF_IOCTL | 7) #define STMF_IOCTL_SET_LU_STATE (STMF_IOCTL | 8) #define STMF_IOCTL_SET_TARGET_PORT_STATE (STMF_IOCTL | 9) #define STMF_IOCTL_CREATE_HOST_GROUP (STMF_IOCTL | 10) #define STMF_IOCTL_REMOVE_HOST_GROUP (STMF_IOCTL | 11) #define STMF_IOCTL_ADD_HG_ENTRY (STMF_IOCTL | 12) #define STMF_IOCTL_REMOVE_HG_ENTRY (STMF_IOCTL | 13) #define STMF_IOCTL_CREATE_TARGET_GROUP (STMF_IOCTL | 14) #define STMF_IOCTL_REMOVE_TARGET_GROUP (STMF_IOCTL | 15) #define STMF_IOCTL_ADD_TG_ENTRY (STMF_IOCTL | 16) #define STMF_IOCTL_REMOVE_TG_ENTRY (STMF_IOCTL | 17) #define STMF_IOCTL_ADD_VIEW_ENTRY (STMF_IOCTL | 18) #define STMF_IOCTL_REMOVE_VIEW_ENTRY (STMF_IOCTL | 19) #define STMF_IOCTL_GET_HG_LIST (STMF_IOCTL | 20) #define STMF_IOCTL_GET_TG_LIST (STMF_IOCTL | 21) #define STMF_IOCTL_GET_HG_ENTRIES (STMF_IOCTL | 22) #define STMF_IOCTL_GET_TG_ENTRIES (STMF_IOCTL | 23) #define STMF_IOCTL_GET_VE_LIST (STMF_IOCTL | 24) #define STMF_IOCTL_LOAD_PP_DATA (STMF_IOCTL | 25) #define STMF_IOCTL_CLEAR_PP_DATA (STMF_IOCTL | 26) #define STMF_IOCTL_GET_PP_DATA (STMF_IOCTL | 27) #define STMF_IOCTL_CLEAR_TRACE (STMF_IOCTL | 28) #define STMF_IOCTL_ADD_TRACE (STMF_IOCTL | 29) #define STMF_IOCTL_GET_TRACE_POSITION (STMF_IOCTL | 30) #define STMF_IOCTL_GET_TRACE (STMF_IOCTL | 31) #define STMF_IOCTL_REG_LU_LIST (STMF_IOCTL | 32) #define STMF_IOCTL_VE_LU_LIST (STMF_IOCTL | 33) #define STMF_IOCTL_LU_VE_LIST (STMF_IOCTL | 34) #define STMF_IOCTL_VALIDATE_VIEW (STMF_IOCTL | 35) #define STMF_IOCTL_SET_ALUA_STATE (STMF_IOCTL | 36) #define STMF_IOCTL_GET_ALUA_STATE (STMF_IOCTL | 37) #define STMF_IOCTL_SET_STMF_PROPS (STMF_IOCTL | 38) typedef struct stmf_iocdata { uint32_t stmf_version; uint32_t stmf_error; uint32_t stmf_ibuf_size; uint32_t stmf_obuf_size; uint32_t stmf_obuf_nentries; /* # entries xferred */ uint32_t stmf_obuf_max_nentries; /* #,could have been xferred */ uint64_t stmf_ibuf; uint64_t stmf_obuf; } stmf_iocdata_t; typedef struct slist_lu { uint8_t lu_guid[16]; } slist_lu_t; typedef struct slist_target_port { uint8_t target[260]; } slist_target_port_t; typedef struct slist_scsi_session { uint8_t initiator[260]; /* creation_time is really time_t. But time_t is defined as long. */ uint32_t creation_time; char alias[256]; } slist_scsi_session_t; /* * States for LUs and LPORTs */ #define STMF_STATE_OFFLINE 0 #define STMF_STATE_ONLINING 1 #define STMF_STATE_ONLINE 2 #define STMF_STATE_OFFLINING 3 /* * States for the STMF config. */ #define STMF_CONFIG_NONE 0 #define STMF_CONFIG_INIT 1 #define STMF_CONFIG_INIT_DONE 2 typedef struct sioc_lu_props { uint8_t lu_guid[16]; uint8_t lu_state:4, lu_present:1, lu_rsvd:3; char lu_provider_name[255]; char lu_alias[256]; } sioc_lu_props_t; typedef struct sioc_target_port_props { uint8_t tgt_id[260]; uint8_t tgt_state:4, tgt_present:1, tgt_rsvd:3; char tgt_provider_name[255]; char tgt_alias[256]; } sioc_target_port_props_t; /* * This struct is used for getting and setting state of LU/LPORT or STMF. */ typedef struct stmf_state_desc { uint8_t ident[260]; /* N/A for STMF itself */ uint8_t state; uint8_t config_state; /* N/A for LU/LPORTs */ } stmf_state_desc_t; /* * This struct is used for setting the alua state */ typedef struct stmf_alua_state_desc { uint8_t alua_state; uint16_t alua_node; } stmf_alua_state_desc_t; /* Error definitions for group/view entry/provider dataioctls */ #define STMF_IOCERR_NONE 0 #define STMF_IOCERR_HG_EXISTS 1 #define STMF_IOCERR_INVALID_HG 2 #define STMF_IOCERR_TG_EXISTS 3 #define STMF_IOCERR_INVALID_TG 4 #define STMF_IOCERR_HG_ENTRY_EXISTS 5 #define STMF_IOCERR_INVALID_HG_ENTRY 6 #define STMF_IOCERR_TG_ENTRY_EXISTS 7 #define STMF_IOCERR_INVALID_TG_ENTRY 8 #define STMF_IOCERR_TG_UPDATE_NEED_SVC_OFFLINE 9 #define STMF_IOCERR_LU_NUMBER_IN_USE 10 #define STMF_IOCERR_INVALID_LU_ID 11 #define STMF_IOCERR_VIEW_ENTRY_CONFLICT 12 #define STMF_IOCERR_HG_IN_USE 13 #define STMF_IOCERR_TG_IN_USE 14 #define STMF_IOCERR_INVALID_VIEW_ENTRY 15 #define STMF_IOCERR_INVALID_VE_ID 16 #define STMF_IOCERR_UPDATE_NEED_CFG_INIT 17 #define STMF_IOCERR_PPD_UPDATED 18 #define STMF_IOCERR_INSUFFICIENT_BUF 19 #define STMF_IOCERR_TG_NEED_TG_OFFLINE 20 typedef struct stmf_group_name { uint16_t name_size; /* in bytes */ uint16_t rsvd_1; uint32_t rsvd_2; uint8_t name[512]; /* 256 * wchar_t */ } stmf_group_name_t; /* * struct used to operate (add/remove entry) on a group. */ typedef struct stmf_ge_ident { uint16_t ident_size; uint8_t ident[256]; } stmf_ge_ident_t; typedef struct stmf_group_op_data { stmf_group_name_t group; uint8_t ident[260]; } stmf_group_op_data_t; typedef struct stmf_view_op_entry { uint32_t ve_ndx_valid:1, ve_lu_number_valid:1, ve_all_hosts:1, ve_all_targets:1, rsvd:28; uint32_t ve_ndx; uint8_t ve_lu_nbr[8]; uint8_t ve_guid[16]; stmf_group_name_t ve_host_group; stmf_group_name_t ve_target_group; } stmf_view_op_entry_t; typedef struct stmf_ppioctl_data { char ppi_name[255]; /* Provider name including \0 */ uint8_t ppi_port_provider:1, ppi_lu_provider:1, ppi_token_valid:1, ppt_rsvd:5; uint64_t ppi_token; uint64_t ppi_data_size; uint8_t ppi_data[8]; } stmf_ppioctl_data_t; typedef struct stmf_set_props { uint32_t default_lu_state_value; uint32_t default_target_state_value; } stmf_set_props_t; /* * SCSI device ID descriptor as per SPC3 7.6.3 */ typedef struct scsi_devid_desc { #ifdef _BIT_FIELDS_HTOL uint8_t protocol_id:4, code_set:4; uint8_t piv:1, rsvd1:1, association:2, ident_type:4; #else uint8_t code_set:4, protocol_id:4; uint8_t ident_type:4, association:2, rsvd1:1, piv:1; #endif uint8_t rsvd2; uint8_t ident_length; uint8_t ident[1]; } scsi_devid_desc_t; /* * Protocol Identifier */ #define PROTOCOL_FIBRE_CHANNEL 0 #define PROTOCOL_PARALLEL_SCSI 1 #define PROTOCOL_SSA 2 #define PROTOCOL_IEEE_1394 3 #define PROTOCOL_SRP 4 #define PROTOCOL_iSCSI 5 #define PROTOCOL_SAS 6 #define PROTOCOL_ADT 7 #define PROTOCOL_ATAPI 8 #define PROTOCOL_ANY 15 /* * Code set definitions */ #define CODE_SET_BINARY 1 #define CODE_SET_ASCII 2 #define CODE_SET_UTF8 3 /* * Association values */ #define ID_IS_LOGICAL_UNIT 0 #define ID_IS_TARGET_PORT 1 #define ID_IS_TARGET_CONTAINING_LU 2 /* * ident type */ #define ID_TYPE_VENDOR_SPECIFIC 0 #define ID_TYPE_T10_VID 1 #define ID_TYPE_EUI64 2 #define ID_TYPE_NAA 3 #define ID_TYPE_RELATIVE_TARGET_PORT 4 #define ID_TYPE_TARGET_PORT_GROUP 5 #define ID_TYPE_LOGICAL_UNIT_GROUP 6 #define ID_TYPE_MD5_LOGICAL_UNIT 7 #define ID_TYPE_SCSI_NAME_STRING 8 int stmf_copyin_iocdata(intptr_t data, int mode, stmf_iocdata_t **iocd, void **ibuf, void **obuf); int stmf_copyout_iocdata(intptr_t data, int mode, stmf_iocdata_t *iocd, void *obuf); #ifdef __cplusplus } #endif #endif /* _STMF_IOCTL_H */