#ifndef _ISCSI_IF_H
#define _ISCSI_IF_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _KERNEL
#include <sys/types.h>
#include <sys/strsubr.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#endif
#include <netinet/in.h>
#include <sys/scsi/impl/uscsi.h>
#include <sys/iscsi_protocol.h>
#define ISCSI_INTERFACE_VERSION 3
#define ISCSI_MAX_NAME_LEN 224
#define ISCSI_LOGIN_PARAM_DATA_SEQUENCE_IN_ORDER 0x0000
#define ISCSI_LOGIN_PARAM_IMMEDIATE_DATA 0x0001
#define ISCSI_LOGIN_PARAM_INITIAL_R2T 0x0002
#define ISCSI_LOGIN_PARAM_DATA_PDU_IN_ORDER 0x0003
#define ISCSI_LOGIN_PARAM_HEADER_DIGEST 0x0004
#define ISCSI_LOGIN_PARAM_DATA_DIGEST 0x0005
#define ISCSI_LOGIN_PARAM_DEFAULT_TIME_2_RETAIN 0x0006
#define ISCSI_LOGIN_PARAM_DEFAULT_TIME_2_WAIT 0x0007
#define ISCSI_LOGIN_PARAM_MAX_RECV_DATA_SEGMENT_LENGTH 0x0008
#define ISCSI_LOGIN_PARAM_FIRST_BURST_LENGTH 0x0009
#define ISCSI_LOGIN_PARAM_MAX_BURST_LENGTH 0x000A
#define ISCSI_LOGIN_PARAM_MAX_CONNECTIONS 0x000B
#define ISCSI_LOGIN_PARAM_OUTSTANDING_R2T 0x000C
#define ISCSI_LOGIN_PARAM_ERROR_RECOVERY_LEVEL 0x000D
#define ISCSI_NUM_LOGIN_PARAM 0x000E
#define ISCSI_LOGIN_PARAM_DB_ENTRY 0x0020
#define ISCSI_LOGIN_PARAM_INITIATOR_NAME 0x0021
#define ISCSI_LOGIN_PARAM_INITIATOR_ALIAS 0x0022
#define ISCSI_DEVCTL "devctl"
#define ISCSI_DRIVER_DEVCTL "/devices/iscsi:" ISCSI_DEVCTL
#define ISCSI_IOCTL (('i' << 24) | ('S' << 16) | ('C' << 8))
#define ISCSI_CREATE_OID (ISCSI_IOCTL | 2)
#define ISCSI_LOGIN (ISCSI_IOCTL | 3)
#define ISCSI_LOGOUT (ISCSI_IOCTL | 4)
#define ISCSI_PARAM_GET (ISCSI_IOCTL | 5)
#define ISCSI_PARAM_SET (ISCSI_IOCTL | 6)
#define ISCSI_TARGET_PARAM_CLEAR (ISCSI_IOCTL | 8)
#define ISCSI_TARGET_OID_LIST_GET (ISCSI_IOCTL | 9)
#define ISCSI_TARGET_PROPS_GET (ISCSI_IOCTL | 10)
#define ISCSI_TARGET_PROPS_SET (ISCSI_IOCTL | 11)
#define ISCSI_TARGET_ADDRESS_GET (ISCSI_IOCTL | 12)
#define ISCSI_CHAP_SET (ISCSI_IOCTL | 13)
#define ISCSI_CHAP_GET (ISCSI_IOCTL | 14)
#define ISCSI_CHAP_CLEAR (ISCSI_IOCTL | 15)
#define ISCSI_STATIC_GET (ISCSI_IOCTL | 16)
#define ISCSI_STATIC_SET (ISCSI_IOCTL | 17)
#define ISCSI_STATIC_CLEAR (ISCSI_IOCTL | 18)
#define ISCSI_DISCOVERY_SET (ISCSI_IOCTL | 19)
#define ISCSI_DISCOVERY_GET (ISCSI_IOCTL | 20)
#define ISCSI_DISCOVERY_CLEAR (ISCSI_IOCTL | 21)
#define ISCSI_DISCOVERY_PROPS (ISCSI_IOCTL | 22)
#define ISCSI_DISCOVERY_ADDR_SET (ISCSI_IOCTL | 23)
#define ISCSI_DISCOVERY_ADDR_LIST_GET (ISCSI_IOCTL | 24)
#define ISCSI_DISCOVERY_ADDR_CLEAR (ISCSI_IOCTL | 25)
#define ISCSI_RADIUS_SET (ISCSI_IOCTL | 26)
#define ISCSI_RADIUS_GET (ISCSI_IOCTL | 27)
#define ISCSI_DB_RELOAD (ISCSI_IOCTL | 28)
#define ISCSI_LUN_OID_LIST_GET (ISCSI_IOCTL | 29)
#define ISCSI_LUN_PROPS_GET (ISCSI_IOCTL | 30)
#define ISCSI_CONN_OID_LIST_GET (ISCSI_IOCTL | 31)
#define ISCSI_CONN_PROPS_GET (ISCSI_IOCTL | 32)
#define ISCSI_USCSI (ISCSI_IOCTL | 33)
#define ISCSI_DOOR_HANDLE_SET (ISCSI_IOCTL | 34)
#define ISCSI_DISCOVERY_EVENTS (ISCSI_IOCTL | 35)
#define ISCSI_AUTH_SET (ISCSI_IOCTL | 36)
#define ISCSI_AUTH_GET (ISCSI_IOCTL | 37)
#define ISCSI_AUTH_CLEAR (ISCSI_IOCTL | 38)
#define ISCSI_SENDTGTS_GET (ISCSI_IOCTL | 39)
#define ISCSI_ISNS_SERVER_ADDR_SET (ISCSI_IOCTL | 40)
#define ISCSI_ISNS_SERVER_ADDR_LIST_GET (ISCSI_IOCTL | 41)
#define ISCSI_ISNS_SERVER_ADDR_CLEAR (ISCSI_IOCTL | 42)
#define ISCSI_ISNS_SERVER_GET (ISCSI_IOCTL | 43)
#define ISCSI_GET_CONFIG_SESSIONS (ISCSI_IOCTL | 44)
#define ISCSI_SET_CONFIG_SESSIONS (ISCSI_IOCTL | 45)
#define ISCSI_INIT_NODE_NAME_SET (ISCSI_IOCTL | 46)
#define ISCSI_DB_DUMP (ISCSI_IOCTL | 100)
#define ISCSI_CHAP_NAME_LEN 512
#define ISCSI_CHAP_SECRET_LEN 16
#define ISCSI_TGT_OID_LIST 0x0001
#define ISCSI_STATIC_TGT_OID_LIST 0x0002
#define ISCSI_TGT_PARAM_OID_LIST 0x0004
#define ISCSI_SESS_PARAM 0x0001
#define ISCSI_CONN_PARAM 0x0002
#define ISCSI_DIGEST_NONE 0
#define ISCSI_DIGEST_CRC32C 1
#define ISCSI_DIGEST_CRC32C_NONE 2
#define ISCSI_DIGEST_NONE_CRC32C 3
typedef enum iscsi_error {
NoError, AuthenticationError, LoginParamError, ConnectionReset
} iscsi_error_t;
typedef enum iSCSIDiscoveryMethod {
iSCSIDiscoveryMethodUnknown = 0,
iSCSIDiscoveryMethodStatic = 1,
iSCSIDiscoveryMethodSLP = 2,
iSCSIDiscoveryMethodISNS = 4,
iSCSIDiscoveryMethodSendTargets = 8
} iSCSIDiscoveryMethod_t;
#define ISCSI_ALL_DISCOVERY_METHODS (iSCSIDiscoveryMethodStatic | \
iSCSIDiscoveryMethodSLP | \
iSCSIDiscoveryMethodISNS | \
iSCSIDiscoveryMethodSendTargets)
typedef struct iscsi_oid {
uint32_t o_vers;
uchar_t o_name[ISCSI_MAX_NAME_LEN];
int o_tpgt;
uint32_t o_oid;
} iscsi_oid_t;
#define ISCSI_OID_NOTSET 0
#define ISCSI_INITIATOR_OID 1
#define ISCSI_DEFAULT_TPGT -1
typedef struct iscsi_login_params {
boolean_t immediate_data;
boolean_t initial_r2t;
int first_burst_length;
int max_burst_length;
boolean_t data_pdu_in_order;
boolean_t data_sequence_in_order;
int default_time_to_wait;
int default_time_to_retain;
int header_digest;
int data_digest;
int max_recv_data_seg_len;
int max_xmit_data_seg_len;
int max_connections;
int max_outstanding_r2t;
int error_recovery_level;
boolean_t ifmarker;
boolean_t ofmarker;
} iscsi_login_params_t;
typedef struct entry {
int e_vers;
uint32_t e_oid;
union {
struct in_addr u_in4;
struct in6_addr u_in6;
} e_u;
int e_insize;
int e_port;
int e_tpgt;
} entry_t;
typedef struct node_name {
unsigned char n_name[ISCSI_MAX_NAME_LEN];
int n_len;
} node_name_t;
typedef struct _iSCSIMinMaxValue {
uint32_t i_current,
i_default,
i_min,
i_max,
i_incr;
} iscsi_int_info_t;
typedef struct _iSCSIBoolValue {
boolean_t b_current,
b_default;
} iscsi_bool_info_t;
typedef struct _iSCSIParamValueGet {
boolean_t v_valid,
v_settable;
iscsi_int_info_t v_integer;
iscsi_bool_info_t v_bool;
uchar_t v_name[ISCSI_MAX_NAME_LEN];
} iscsi_get_value_t;
typedef struct _iSCSILoginParamGet {
uint32_t g_vers;
uint32_t g_oid;
uint32_t g_param;
iscsi_get_value_t g_value;
uint32_t g_conn_cid;
uint32_t g_param_type;
} iscsi_param_get_t;
typedef struct iscsi_set_value {
uint32_t v_integer;
boolean_t v_bool;
uchar_t v_name[ISCSI_MAX_NAME_LEN];
} iscsi_set_value_t;
typedef struct iSCSILoginParamSet {
uint32_t s_vers,
s_oid;
uint32_t s_param;
iscsi_set_value_t s_value;
} iscsi_param_set_t;
typedef struct chap_props {
uint32_t c_vers,
c_retries,
c_oid;
unsigned char c_user[128];
uint32_t c_user_len;
unsigned char c_secret[16];
uint32_t c_secret_len;
} iscsi_chap_props_t;
typedef enum authMethod {
authMethodNone = 0x00,
authMethodCHAP = 0x01,
authMethodSRP = 0x02,
authMethodKRB5 = 0x04,
authMethodSPKM1 = 0x08,
authMethodSPKM2 = 0x10
} authMethod_t;
typedef struct auth_props {
uint32_t a_vers;
uint32_t a_oid;
boolean_t a_bi_auth;
authMethod_t a_auth_method;
} iscsi_auth_props_t;
#define MAX_RAD_SHARED_SECRET_LEN 128
typedef struct radius_props {
uint32_t r_vers;
uint32_t r_oid;
union {
struct in_addr u_in4;
struct in6_addr u_in6;
} r_addr;
int r_insize;
uint32_t r_port;
uint8_t r_shared_secret[MAX_RAD_SHARED_SECRET_LEN];
boolean_t r_radius_access;
boolean_t r_radius_config_valid;
uint32_t r_shared_secret_len;
} iscsi_radius_props_t;
typedef struct _IPAddress {
union {
struct in_addr in4;
struct in6_addr in6;
} i_addr;
int i_insize;
} iscsi_ipaddr_t;
typedef struct _iSCSITargetAddressKey {
iscsi_ipaddr_t a_addr;
uint32_t a_port,
a_oid;
} iscsi_addr_t;
typedef struct _iSCSITargetAddressKeyProperties {
uint32_t al_vers,
al_oid;
uint32_t al_in_cnt;
uint32_t al_out_cnt;
uint32_t al_tpgt;
iscsi_addr_t al_addrs[1];
} iscsi_addr_list_t;
typedef struct _iSCSITargetProperties {
uint32_t p_vers,
p_oid;
uchar_t p_name[ISCSI_MAX_NAME_LEN];
uint_t p_name_len;
uchar_t p_alias[ISCSI_MAX_NAME_LEN];
uint_t p_alias_len;
iSCSIDiscoveryMethod_t p_discovery;
boolean_t p_connected;
uint32_t p_num_of_connections;
iscsi_error_t p_last_err;
int p_tpgt_conf;
int p_tpgt_nego;
uchar_t p_isid[ISCSI_ISID_LEN];
uchar_t p_reserved[128];
} iscsi_property_t;
typedef struct _iSCSITargetDeviceList {
uint32_t tl_vers,
tl_in_cnt,
tl_tgt_list_type,
tl_out_cnt,
tl_oid_list[1];
} iscsi_target_list_t;
typedef struct _iSCSIStaticTargetProperties {
uint32_t p_vers,
p_oid;
uchar_t p_name[ISCSI_MAX_NAME_LEN];
uint_t p_name_len;
iscsi_addr_list_t p_addr_list;
} iscsi_static_property_t;
typedef enum iscsi_lun_status {
LunValid, LunDoesNotExist
} iscsi_lun_status_t;
#define ISCSI_INQ_VID_BUF_LEN 9
#define ISCSI_INQ_PID_BUF_LEN 17
typedef struct iscsi_lun_props {
uint32_t lp_vers,
lp_tgt_oid,
lp_oid,
lp_num,
lp_status;
char lp_pathname[MAXPATHLEN],
lp_vid[ISCSI_INQ_VID_BUF_LEN],
lp_pid[ISCSI_INQ_PID_BUF_LEN];
time_t lp_time_online;
} iscsi_lun_props_t;
typedef struct iscsi_if_lun {
uint32_t l_tgt_oid,
l_oid,
l_num;
} iscsi_if_lun_t;
typedef struct iscsi_lun_list {
uint32_t ll_vers;
boolean_t ll_all_tgts;
uint32_t ll_tgt_oid,
ll_in_cnt,
ll_out_cnt;
iscsi_if_lun_t ll_luns[1];
} iscsi_lun_list_t;
typedef struct iscsi_conn_props {
uint32_t cp_vers,
cp_oid,
cp_cid,
cp_sess_oid;
union {
struct sockaddr_in soa4;
struct sockaddr_in6 soa6;
} cp_local;
union {
struct sockaddr_in soa4;
struct sockaddr_in6 soa6;
} cp_peer;
iscsi_login_params_t cp_params;
boolean_t cp_params_valid;
} iscsi_conn_props_t;
typedef struct iscsi_if_conn {
uint32_t c_sess_oid,
c_oid,
c_cid;
} iscsi_if_conn_t;
typedef struct iscsi_conn_list {
uint32_t cl_vers;
boolean_t cl_all_sess;
uint32_t cl_sess_oid,
cl_in_cnt,
cl_out_cnt;
iscsi_if_conn_t cl_list[1];
} iscsi_conn_list_t;
typedef enum iSNSDiscoveryMethod {
iSNSDiscoveryMethodStatic = 0,
iSNSDiscoveryMethodDHCP = 1,
iSNSDiscoveryMethodSLP = 2
} isns_method_t;
typedef struct iSCSIDiscoveryProperties {
uint32_t vers;
boolean_t iSNSDiscoverySettable;
boolean_t iSNSDiscoveryEnabled;
isns_method_t iSNSDiscoveryMethod;
unsigned char iSNSDomainName[256];
boolean_t SLPDiscoverySettable;
boolean_t SLPDiscoveryEnabled;
boolean_t StaticDiscoverySettable;
boolean_t StaticDiscoveryEnabled;
boolean_t SendTargetsDiscoverySettable;
boolean_t SendTargetsDiscoveryEnabled;
} iSCSIDiscoveryProperties_t;
typedef struct iscsi_uscsi {
uint32_t iu_vers;
uint32_t iu_oid;
int iu_tpgt;
uint32_t iu_len;
uint32_t iu_lun;
struct uscsi_cmd iu_ucmd;
} iscsi_uscsi_t;
#if defined(_SYSCALL32)
typedef struct iscsi_uscsi32 {
uint32_t iu_vers;
uint32_t iu_oid;
int iu_tpgt;
uint32_t iu_len;
uint32_t iu_lun;
struct uscsi_cmd32 iu_ucmd;
} iscsi_uscsi32_t;
#endif
typedef struct iscsi_sendtgts_entry {
uchar_t ste_name[ISCSI_MAX_NAME_LEN];
iscsi_addr_t ste_ipaddr;
int ste_tpgt;
} iscsi_sendtgts_entry_t;
typedef struct iscsi_sendtgts_list {
entry_t stl_entry;
uint32_t stl_in_cnt,
stl_out_cnt;
iscsi_sendtgts_entry_t stl_list[1];
} iscsi_sendtgts_list_t;
typedef struct iscsi_statictgt_entry {
entry_t te_entry;
uchar_t te_name[ISCSI_MAX_NAME_LEN];
} iscsi_target_entry_t;
typedef struct isns_portal_group {
uint8_t pg_iscsi_name[ISCSI_MAX_NAME_LEN];
union {
in_addr_t u_ip4;
in6_addr_t u_ip6;
} pg_ip_addr;
int insize;
in_port_t pg_port;
uint16_t pg_tag;
iscsi_ipaddr_t isns_server_ip;
uint32_t isns_server_port;
} isns_portal_group_t;
typedef struct isns_portal_group_list {
uint32_t pg_in_cnt,
pg_out_cnt;
isns_portal_group_t pg_list[1];
} isns_portal_group_list_t;
typedef struct isns_server_portal_group_list {
iscsi_addr_t addr;
isns_portal_group_list_t addr_port_list;
} isns_server_portal_group_list_t;
#define ISCSI_MIN_CONFIG_SESSIONS 1
#define ISCSI_MAX_CONFIG_SESSIONS 4
typedef struct iscsi_config_sess {
uint32_t ics_ver;
uint32_t ics_oid;
boolean_t ics_bound;
uint_t ics_in;
uint_t ics_out;
iscsi_ipaddr_t ics_bindings[1];
} iscsi_config_sess_t;
#define ISCSI_SESSION_CONFIG_SIZE(SIZE) \
(sizeof (iscsi_config_sess_t) + \
((SIZE - 1) * sizeof (iscsi_ipaddr_t)))
#define EC_ISCSI "EC_iSCSI"
#define ESC_ISCSI_STATIC_START "ESC_static_start"
#define ESC_ISCSI_STATIC_END "ESC_static_end"
#define ESC_ISCSI_SEND_TARGETS_START "ESC_send_targets_start"
#define ESC_ISCSI_SEND_TARGETS_END "ESC_send_targets_end"
#define ESC_ISCSI_SLP_START "ESC_slp_start"
#define ESC_ISCSI_SLP_END "ESC_slp_end"
#define ESC_ISCSI_ISNS_START "ESC_isns_start"
#define ESC_ISCSI_ISNS_END "ESC_isns_end"
#define ESC_ISCSI_PROP_CHANGE "ESC_prop_change"
#ifdef _KERNEL
extern int iscsid_open(char *, int, int);
extern int iscsid_close(int);
extern int iscsid_remove(char *filename);
extern int iscsid_rename(char *oldname, char *newname);
extern ssize_t iscsid_write(int, void *, ssize_t);
extern ssize_t iscsid_read(int, void *, ssize_t);
extern ssize_t iscsid_sendto(struct sonode *, void *, size_t,
struct sockaddr *, socklen_t);
extern ssize_t iscsid_recvfrom(struct sonode *, void *buffer,
size_t len);
extern int iscsid_errno;
#endif
extern boolean_t utils_iqn_create(char *, int);
extern char *prt_bitmap(int, char *, char *, int);
extern char *utils_map_param(int);
extern boolean_t parse_addr_port_tpgt(char *in, char **addr,
int *type, char **port, char **tpgt);
#ifdef __cplusplus
}
#endif
#endif