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 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _ISCSI_IF_H 27 #define _ISCSI_IF_H 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 #ifdef _KERNEL 34 #include <sys/types.h> 35 #include <sys/strsubr.h> /* for prototype of kstrgetmsg */ 36 #include <sys/socket.h> 37 #include <sys/socketvar.h> /* for struct sonode */ 38 #endif 39 #include <netinet/in.h> 40 #include <sys/scsi/impl/uscsi.h> 41 #include <sys/scsi/adapters/iscsi_protocol.h> 42 43 /* 44 * Each of the top level structures have a version field as 45 * the first member. That version value will be set by the 46 * caller. The consumer of the structure will check to see 47 * if the version is correct. 48 */ 49 #define ISCSI_INTERFACE_VERSION 3 50 51 /* 52 * The maximum length of an iSCSI name is 223. 224 is used 53 * to provide space for a null character. 54 */ 55 #define ISCSI_MAX_NAME_LEN 224 56 57 /* 58 * Login parameter values are used instead of ascii text 59 * between the IMA plug-in and kernel. 60 */ 61 #define ISCSI_LOGIN_PARAM_DATA_SEQUENCE_IN_ORDER 0x0000 /* bool */ 62 #define ISCSI_LOGIN_PARAM_IMMEDIATE_DATA 0x0001 /* bool */ 63 #define ISCSI_LOGIN_PARAM_INITIAL_R2T 0x0002 /* bool */ 64 #define ISCSI_LOGIN_PARAM_DATA_PDU_IN_ORDER 0x0003 /* bool */ 65 #define ISCSI_LOGIN_PARAM_HEADER_DIGEST 0x0004 /* int */ 66 #define ISCSI_LOGIN_PARAM_DATA_DIGEST 0x0005 /* int */ 67 #define ISCSI_LOGIN_PARAM_DEFAULT_TIME_2_RETAIN 0x0006 /* int */ 68 #define ISCSI_LOGIN_PARAM_DEFAULT_TIME_2_WAIT 0x0007 /* int */ 69 #define ISCSI_LOGIN_PARAM_MAX_RECV_DATA_SEGMENT_LENGTH 0x0008 /* int */ 70 #define ISCSI_LOGIN_PARAM_FIRST_BURST_LENGTH 0x0009 /* int */ 71 #define ISCSI_LOGIN_PARAM_MAX_BURST_LENGTH 0x000A /* int */ 72 #define ISCSI_LOGIN_PARAM_MAX_CONNECTIONS 0x000B /* int */ 73 #define ISCSI_LOGIN_PARAM_OUTSTANDING_R2T 0x000C /* int */ 74 #define ISCSI_LOGIN_PARAM_ERROR_RECOVERY_LEVEL 0x000D /* int */ 75 /* 76 * number of login parameters - needs to be updated when new parameter added 77 */ 78 #define ISCSI_NUM_LOGIN_PARAM 0x000E 79 80 /* 81 * Used internally by the persistent store code. Currently a bitmap is kept of 82 * which params are currently set. This allows for quick a look up instead of 83 * cycling through the possible entries. Using an unsigned int as the bitmap we 84 * can have parameter numbers up through 31. Since the current only has 22 85 * we're okay. 86 */ 87 #define ISCSI_LOGIN_PARAM_DB_ENTRY 0x0020 88 /* 89 * Special case. When this parameter value is set in iscsi_param_set_t 90 * the member s_value (type iscsi_param_set_t) is not used. 91 * The name field contains the InitiatorName for the system which 92 * should be used for all future sessions. 93 */ 94 #define ISCSI_LOGIN_PARAM_INITIATOR_NAME 0x0021 95 #define ISCSI_LOGIN_PARAM_INITIATOR_ALIAS 0x0022 96 97 #define ISCSI_DEVCTL "devctl" 98 #define ISCSI_DRIVER_DEVCTL "/devices/iscsi:" ISCSI_DEVCTL 99 100 /* 101 * ioctls supported by the driver. 102 */ 103 #define ISCSI_IOCTL (('i' << 24) | ('S' << 16) | ('C' << 8)) 104 #define ISCSI_CREATE_OID (ISCSI_IOCTL | 2) 105 #define ISCSI_LOGIN (ISCSI_IOCTL | 3) 106 #define ISCSI_LOGOUT (ISCSI_IOCTL | 4) 107 #define ISCSI_PARAM_GET (ISCSI_IOCTL | 5) 108 #define ISCSI_PARAM_SET (ISCSI_IOCTL | 6) 109 #define ISCSI_TARGET_PARAM_CLEAR (ISCSI_IOCTL | 8) 110 #define ISCSI_TARGET_OID_LIST_GET (ISCSI_IOCTL | 9) 111 #define ISCSI_TARGET_PROPS_GET (ISCSI_IOCTL | 10) 112 #define ISCSI_TARGET_PROPS_SET (ISCSI_IOCTL | 11) 113 #define ISCSI_TARGET_ADDRESS_GET (ISCSI_IOCTL | 12) 114 #define ISCSI_CHAP_SET (ISCSI_IOCTL | 13) 115 #define ISCSI_CHAP_GET (ISCSI_IOCTL | 14) 116 #define ISCSI_CHAP_CLEAR (ISCSI_IOCTL | 15) 117 #define ISCSI_STATIC_GET (ISCSI_IOCTL | 16) 118 #define ISCSI_STATIC_SET (ISCSI_IOCTL | 17) 119 #define ISCSI_STATIC_CLEAR (ISCSI_IOCTL | 18) 120 #define ISCSI_DISCOVERY_SET (ISCSI_IOCTL | 19) 121 #define ISCSI_DISCOVERY_GET (ISCSI_IOCTL | 20) 122 #define ISCSI_DISCOVERY_CLEAR (ISCSI_IOCTL | 21) 123 #define ISCSI_DISCOVERY_PROPS (ISCSI_IOCTL | 22) 124 #define ISCSI_DISCOVERY_ADDR_SET (ISCSI_IOCTL | 23) 125 #define ISCSI_DISCOVERY_ADDR_LIST_GET (ISCSI_IOCTL | 24) 126 #define ISCSI_DISCOVERY_ADDR_CLEAR (ISCSI_IOCTL | 25) 127 #define ISCSI_RADIUS_SET (ISCSI_IOCTL | 26) 128 #define ISCSI_RADIUS_GET (ISCSI_IOCTL | 27) 129 #define ISCSI_DB_RELOAD (ISCSI_IOCTL | 28) 130 #define ISCSI_LUN_OID_LIST_GET (ISCSI_IOCTL | 29) 131 #define ISCSI_LUN_PROPS_GET (ISCSI_IOCTL | 30) 132 #define ISCSI_CONN_OID_LIST_GET (ISCSI_IOCTL | 31) 133 #define ISCSI_CONN_PROPS_GET (ISCSI_IOCTL | 32) 134 #define ISCSI_USCSI (ISCSI_IOCTL | 33) 135 #define ISCSI_DOOR_HANDLE_SET (ISCSI_IOCTL | 34) 136 #define ISCSI_DISCOVERY_EVENTS (ISCSI_IOCTL | 35) 137 #define ISCSI_AUTH_SET (ISCSI_IOCTL | 36) 138 #define ISCSI_AUTH_GET (ISCSI_IOCTL | 37) 139 #define ISCSI_AUTH_CLEAR (ISCSI_IOCTL | 38) 140 #define ISCSI_SENDTGTS_GET (ISCSI_IOCTL | 39) 141 #define ISCSI_ISNS_SERVER_ADDR_SET (ISCSI_IOCTL | 40) 142 #define ISCSI_ISNS_SERVER_ADDR_LIST_GET (ISCSI_IOCTL | 41) 143 #define ISCSI_ISNS_SERVER_ADDR_CLEAR (ISCSI_IOCTL | 42) 144 #define ISCSI_ISNS_SERVER_GET (ISCSI_IOCTL | 43) 145 #define ISCSI_GET_CONFIG_SESSIONS (ISCSI_IOCTL | 44) 146 #define ISCSI_SET_CONFIG_SESSIONS (ISCSI_IOCTL | 45) 147 #define ISCSI_INIT_NODE_NAME_SET (ISCSI_IOCTL | 46) 148 #define ISCSI_IS_ACTIVE (ISCSI_IOCTL | 47) 149 #define ISCSI_BOOTPROP_GET (ISCSI_IOCTL | 48) 150 #define ISCSI_DB_DUMP (ISCSI_IOCTL | 100) /* DBG */ 151 152 /* 153 * Misc. defines 154 */ 155 #define ISCSI_CHAP_NAME_LEN 512 156 #define ISCSI_CHAP_SECRET_LEN 16 157 #define ISCSI_TGT_OID_LIST 0x0001 158 #define ISCSI_STATIC_TGT_OID_LIST 0x0002 159 #define ISCSI_TGT_PARAM_OID_LIST 0x0004 160 #define ISCSI_SESS_PARAM 0x0001 161 #define ISCSI_CONN_PARAM 0x0002 162 163 /* digest level defines */ 164 #define ISCSI_DIGEST_NONE 0 165 #define ISCSI_DIGEST_CRC32C 1 166 #define ISCSI_DIGEST_CRC32C_NONE 2 /* offer both, prefer CRC32C */ 167 #define ISCSI_DIGEST_NONE_CRC32C 3 /* offer both, prefer None */ 168 169 /* 170 * A last error associated with each target session is returned in the 171 * iscsi_target_t structure. 172 */ 173 typedef enum iscsi_error { 174 NoError, AuthenticationError, LoginParamError, ConnectionReset 175 } iscsi_error_t; 176 177 /* 178 * The values associated with each enum is based on the IMA specification. 179 */ 180 typedef enum iSCSIDiscoveryMethod { 181 iSCSIDiscoveryMethodUnknown = 0, 182 iSCSIDiscoveryMethodStatic = 1, 183 iSCSIDiscoveryMethodSLP = 2, 184 iSCSIDiscoveryMethodISNS = 4, 185 iSCSIDiscoveryMethodSendTargets = 8, 186 /* 187 * Since there is no specification about boot discovery method, 188 * we should leave a value gap in case of other discovery 189 * methods added. 190 */ 191 iSCSIDiscoveryMethodBoot = 128 192 } iSCSIDiscoveryMethod_t; 193 #define ISCSI_ALL_DISCOVERY_METHODS (iSCSIDiscoveryMethodStatic | \ 194 iSCSIDiscoveryMethodSLP | \ 195 iSCSIDiscoveryMethodISNS | \ 196 iSCSIDiscoveryMethodSendTargets) 197 198 /* 199 * Before anything can be done to a target it must have an OID. 200 */ 201 typedef struct iscsi_oid { 202 uint32_t o_vers; /* In */ 203 uchar_t o_name[ISCSI_MAX_NAME_LEN]; /* In */ 204 /* 205 * tpgt is only 16 bits per spec. use 32 in ioctl to reduce 206 * packing issue. Also -1 tpgt denotes default value. iSCSI 207 * stack will detemermine tpgt during login. 208 */ 209 int o_tpgt; /* In */ 210 uint32_t o_oid; /* Out */ 211 } iscsi_oid_t; 212 #define ISCSI_OID_NOTSET 0 213 #define ISCSI_INITIATOR_OID 1 /* Other OIDs follow > 1 */ 214 #define ISCSI_DEFAULT_TPGT -1 215 216 /* 217 * iSCSI Login Parameters - Reference iscsi draft for 218 * definitions of the below login params. 219 */ 220 typedef struct iscsi_login_params { 221 boolean_t immediate_data; 222 boolean_t initial_r2t; 223 int first_burst_length; /* range: 512 - 2**24-1 */ 224 int max_burst_length; /* range: 512 - 2**24-1 */ 225 boolean_t data_pdu_in_order; 226 boolean_t data_sequence_in_order; 227 int default_time_to_wait; 228 int default_time_to_retain; 229 int header_digest; 230 int data_digest; 231 int max_recv_data_seg_len; /* range: 512 - 2**24-1 */ 232 int max_xmit_data_seg_len; /* range: 512 - 2**24-1 */ 233 int max_connections; 234 int max_outstanding_r2t; 235 int error_recovery_level; 236 boolean_t ifmarker; 237 boolean_t ofmarker; 238 } iscsi_login_params_t; 239 240 /* 241 * Once parameters have been set via ISCSI_SET_PARAM the login is initiated 242 * by sending an ISCSI_LOGIN ioctl with the following structure filled in. 243 */ 244 typedef struct entry { 245 int e_vers; 246 uint32_t e_oid; 247 union { 248 struct in_addr u_in4; 249 struct in6_addr u_in6; 250 } e_u; 251 /* 252 * e_insize indicates which of the previous structs is valid. 253 */ 254 int e_insize; 255 int e_port; 256 int e_tpgt; 257 /* e_boot should be true if a boot session is created. */ 258 boolean_t e_boot; 259 } entry_t; 260 261 /* 262 * Used when setting or gettnig the Initiator Name or Alias. 263 */ 264 typedef struct node_name { 265 unsigned char n_name[ISCSI_MAX_NAME_LEN]; 266 int n_len; 267 } node_name_t; 268 269 typedef struct _iSCSIMinMaxValue { 270 uint32_t i_current, 271 i_default, 272 i_min, 273 i_max, 274 i_incr; 275 } iscsi_int_info_t; 276 277 typedef struct _iSCSIBoolValue { 278 boolean_t b_current, 279 b_default; 280 } iscsi_bool_info_t; 281 282 typedef struct _iSCSIParamValueGet { 283 boolean_t v_valid, 284 v_settable; 285 iscsi_int_info_t v_integer; 286 iscsi_bool_info_t v_bool; 287 uchar_t v_name[ISCSI_MAX_NAME_LEN]; 288 } iscsi_get_value_t; 289 290 typedef struct _iSCSILoginParamGet { 291 uint32_t g_vers; /* In */ 292 uint32_t g_oid; /* In */ 293 uint32_t g_param; /* Out */ 294 iscsi_get_value_t g_value; /* Out */ 295 uint32_t g_conn_cid; /* In */ 296 297 /* 298 * To indicate whether session or connection related param is 299 * being requested. 300 */ 301 uint32_t g_param_type; /* In */ 302 } iscsi_param_get_t; 303 304 typedef struct iscsi_set_value { 305 uint32_t v_integer; 306 boolean_t v_bool; 307 uchar_t v_name[ISCSI_MAX_NAME_LEN]; 308 } iscsi_set_value_t; 309 310 /* 311 * All of the members of this structure are set by the user agent and 312 * consumed by the driver. 313 */ 314 typedef struct iSCSILoginParamSet { 315 uint32_t s_vers, 316 s_oid; 317 uint32_t s_param; 318 iscsi_set_value_t s_value; 319 } iscsi_param_set_t; 320 321 /* 322 * Data in this structure is set by the user agent and consumed by 323 * the driver. 324 */ 325 typedef struct chap_props { 326 uint32_t c_vers, 327 c_retries, 328 c_oid; 329 unsigned char c_user[128]; 330 uint32_t c_user_len; 331 unsigned char c_secret[16]; 332 uint32_t c_secret_len; 333 } iscsi_chap_props_t; 334 335 typedef enum authMethod { 336 authMethodNone = 0x00, 337 authMethodCHAP = 0x01, 338 authMethodSRP = 0x02, 339 authMethodKRB5 = 0x04, 340 authMethodSPKM1 = 0x08, 341 authMethodSPKM2 = 0x10 342 } authMethod_t; 343 344 /* 345 * Data in this structure is set by the user agent and consumed by 346 * the driver. 347 */ 348 typedef struct auth_props { 349 uint32_t a_vers; 350 uint32_t a_oid; 351 boolean_t a_bi_auth; 352 authMethod_t a_auth_method; 353 } iscsi_auth_props_t; 354 355 /* 356 * Data in this structure is set by the user agent and consumed by 357 * the driver. 358 */ 359 #define MAX_RAD_SHARED_SECRET_LEN 128 360 typedef struct radius_props { 361 uint32_t r_vers; 362 uint32_t r_oid; 363 union { 364 struct in_addr u_in4; 365 struct in6_addr u_in6; 366 } r_addr; 367 /* 368 * r_insize indicates which of the previous structs is valid. 369 */ 370 int r_insize; 371 372 uint32_t r_port; 373 uint8_t r_shared_secret[MAX_RAD_SHARED_SECRET_LEN]; 374 boolean_t r_radius_access; 375 boolean_t r_radius_config_valid; 376 uint32_t r_shared_secret_len; 377 } iscsi_radius_props_t; 378 379 typedef struct _IPAddress { 380 union { 381 struct in_addr in4; 382 struct in6_addr in6; 383 } i_addr; 384 /* i_insize determines which is valid in the union above */ 385 int i_insize; 386 } iscsi_ipaddr_t; 387 388 typedef struct _iSCSITargetAddressKey { 389 iscsi_ipaddr_t a_addr; 390 uint32_t a_port, 391 a_oid; 392 } iscsi_addr_t; 393 394 typedef struct _iSCSITargetAddressKeyProperties { 395 uint32_t al_vers, /* In */ 396 al_oid; /* In */ 397 uint32_t al_in_cnt; /* In */ 398 uint32_t al_out_cnt; /* Out */ 399 uint32_t al_tpgt; /* Out */ 400 iscsi_addr_t al_addrs[1]; /* Out */ 401 } iscsi_addr_list_t; 402 403 typedef struct _iSCSITargetProperties { 404 uint32_t p_vers, /* In */ 405 p_oid; /* In */ 406 uchar_t p_name[ISCSI_MAX_NAME_LEN]; /* Out */ 407 uint_t p_name_len; /* Out */ 408 uchar_t p_alias[ISCSI_MAX_NAME_LEN]; /* Out */ 409 uint_t p_alias_len; /* Out */ 410 iSCSIDiscoveryMethod_t p_discovery; /* Out */ 411 boolean_t p_connected; /* Out */ 412 uint32_t p_num_of_connections; /* Out */ 413 /* ---- If connected == B_TRUE then lastErr has no meaning. ---- */ 414 iscsi_error_t p_last_err; /* Out */ 415 /* 416 * Target portal group tag = -1 value means default. 417 */ 418 int p_tpgt_conf; /* Out */ 419 int p_tpgt_nego; /* Out */ 420 uchar_t p_isid[ISCSI_ISID_LEN]; /* Out */ 421 uchar_t p_reserved[128]; 422 } iscsi_property_t; 423 424 typedef struct _iSCSITargetDeviceList { 425 uint32_t tl_vers, /* In */ 426 tl_in_cnt, /* In */ 427 tl_tgt_list_type, /* In */ 428 tl_out_cnt, /* Out */ 429 tl_oid_list[1]; /* Out */ 430 } iscsi_target_list_t; 431 432 typedef struct _iSCSIStaticTargetProperties { 433 uint32_t p_vers, /* In */ 434 p_oid; /* In */ 435 uchar_t p_name[ISCSI_MAX_NAME_LEN]; /* Out */ 436 uint_t p_name_len; /* Out */ 437 iscsi_addr_list_t p_addr_list; /* Out */ 438 } iscsi_static_property_t; 439 440 typedef enum iscsi_lun_status { 441 LunValid, LunDoesNotExist 442 } iscsi_lun_status_t; 443 444 /* 445 * SCSI inquiry vendor and product identifier buffer length - these values are 446 * defined by the identifier length plus 1 byte for the 447 * null termination. 448 */ 449 #define ISCSI_INQ_VID_BUF_LEN 9 /* 8 byte ID */ 450 #define ISCSI_INQ_PID_BUF_LEN 17 /* 16 byte ID */ 451 452 typedef struct iscsi_lun_props { 453 uint32_t lp_vers, /* In */ 454 lp_tgt_oid, /* In */ 455 lp_oid, /* In */ 456 lp_num, /* Out */ 457 lp_status; /* Out */ 458 char lp_pathname[MAXPATHLEN], /* Out */ 459 lp_vid[ISCSI_INQ_VID_BUF_LEN], /* Out */ 460 lp_pid[ISCSI_INQ_PID_BUF_LEN]; /* Out */ 461 time_t lp_time_online; /* Out */ 462 } iscsi_lun_props_t; 463 464 typedef struct iscsi_if_lun { 465 uint32_t l_tgt_oid, 466 l_oid, 467 l_num; 468 } iscsi_if_lun_t; 469 470 typedef struct iscsi_lun_list { 471 uint32_t ll_vers; /* In */ 472 boolean_t ll_all_tgts; /* In */ 473 uint32_t ll_tgt_oid, /* In */ 474 ll_in_cnt, /* In */ 475 ll_out_cnt; /* Out */ 476 iscsi_if_lun_t ll_luns[1]; /* Out */ 477 } iscsi_lun_list_t; 478 479 typedef struct iscsi_conn_props { 480 uint32_t cp_vers, /* In */ 481 cp_oid, /* In */ 482 cp_cid, /* In */ 483 cp_sess_oid; /* In */ 484 union { 485 struct sockaddr_in soa4; 486 struct sockaddr_in6 soa6; 487 } cp_local; /* Out */ 488 union { 489 struct sockaddr_in soa4; 490 struct sockaddr_in6 soa6; 491 } cp_peer; /* Out */ 492 493 494 iscsi_login_params_t cp_params; 495 boolean_t cp_params_valid; 496 497 } iscsi_conn_props_t; 498 499 typedef struct iscsi_if_conn { 500 uint32_t c_sess_oid, 501 c_oid, 502 c_cid; 503 } iscsi_if_conn_t; 504 505 typedef struct iscsi_conn_list { 506 uint32_t cl_vers; /* In */ 507 boolean_t cl_all_sess; /* In */ 508 uint32_t cl_sess_oid, /* In */ 509 cl_in_cnt, /* In */ 510 cl_out_cnt; /* Out */ 511 iscsi_if_conn_t cl_list[1]; /* Out */ 512 } iscsi_conn_list_t; 513 514 typedef enum iSNSDiscoveryMethod { 515 iSNSDiscoveryMethodStatic = 0, 516 iSNSDiscoveryMethodDHCP = 1, 517 iSNSDiscoveryMethodSLP = 2 518 } isns_method_t; 519 520 typedef struct iSCSIDiscoveryProperties { 521 uint32_t vers; 522 boolean_t iSNSDiscoverySettable; 523 boolean_t iSNSDiscoveryEnabled; 524 isns_method_t iSNSDiscoveryMethod; 525 unsigned char iSNSDomainName[256]; 526 boolean_t SLPDiscoverySettable; 527 boolean_t SLPDiscoveryEnabled; 528 boolean_t StaticDiscoverySettable; 529 boolean_t StaticDiscoveryEnabled; 530 boolean_t SendTargetsDiscoverySettable; 531 boolean_t SendTargetsDiscoveryEnabled; 532 } iSCSIDiscoveryProperties_t; 533 534 typedef struct iscsi_uscsi { 535 uint32_t iu_vers; 536 uint32_t iu_oid; 537 int iu_tpgt; 538 uint32_t iu_len; 539 uint32_t iu_lun; 540 struct uscsi_cmd iu_ucmd; 541 } iscsi_uscsi_t; 542 543 #if defined(_SYSCALL32) 544 typedef struct iscsi_uscsi32 { 545 uint32_t iu_vers; 546 uint32_t iu_oid; 547 int iu_tpgt; 548 uint32_t iu_len; 549 uint32_t iu_lun; 550 struct uscsi_cmd32 iu_ucmd; 551 } iscsi_uscsi32_t; 552 #endif /* _SYSCALL32 */ 553 554 typedef struct iscsi_sendtgts_entry { 555 /* ---- Node name, NULL terminated UTF-8 string ---- */ 556 uchar_t ste_name[ISCSI_MAX_NAME_LEN]; 557 558 iscsi_addr_t ste_ipaddr; 559 int ste_tpgt; 560 } iscsi_sendtgts_entry_t; 561 562 typedef struct iscsi_sendtgts_list { 563 entry_t stl_entry; /* In */ 564 uint32_t stl_in_cnt, /* In */ 565 stl_out_cnt; /* Out */ 566 iscsi_sendtgts_entry_t stl_list[1]; /* Out */ 567 } iscsi_sendtgts_list_t; 568 569 typedef struct iscsi_statictgt_entry { 570 entry_t te_entry; /* In */ 571 uchar_t te_name[ISCSI_MAX_NAME_LEN]; /* In */ 572 } iscsi_target_entry_t; 573 574 /* iSNS Draft - section 4.1.1. */ 575 typedef struct isns_portal_group { 576 uint8_t pg_iscsi_name[ISCSI_MAX_NAME_LEN]; 577 union { 578 in_addr_t u_ip4; 579 in6_addr_t u_ip6; 580 } pg_ip_addr; 581 int insize; 582 583 in_port_t pg_port; 584 uint16_t pg_tag; 585 586 iscsi_ipaddr_t isns_server_ip; 587 uint32_t isns_server_port; 588 } isns_portal_group_t; 589 590 typedef struct isns_portal_group_list { 591 uint32_t pg_in_cnt, 592 pg_out_cnt; 593 isns_portal_group_t pg_list[1]; 594 } isns_portal_group_list_t; 595 596 typedef struct isns_server_portal_group_list { 597 iscsi_addr_t addr; 598 isns_portal_group_list_t addr_port_list; 599 } isns_server_portal_group_list_t; 600 601 #define ISCSI_MIN_CONFIG_SESSIONS 1 602 /* lowered max config sessions due to ct_power_cnt >= 0 assert */ 603 #define ISCSI_MAX_CONFIG_SESSIONS 4 604 605 typedef struct iscsi_config_sess { 606 uint32_t ics_ver; 607 uint32_t ics_oid; 608 boolean_t ics_bound; 609 uint_t ics_in; 610 uint_t ics_out; 611 iscsi_ipaddr_t ics_bindings[1]; 612 } iscsi_config_sess_t; 613 614 /* iscsi booting prop */ 615 typedef struct _iSCSIBootProperties { 616 node_name_t ini_name; 617 node_name_t tgt_name; 618 iscsi_auth_props_t auth; 619 iscsi_chap_props_t ini_chap; 620 iscsi_chap_props_t tgt_chap; 621 int iscsiboot; 622 boolean_t hba_mpxio_enabled; 623 } iscsi_boot_property_t; 624 625 #define ISCSI_SESSION_CONFIG_SIZE(SIZE) \ 626 (sizeof (iscsi_config_sess_t) + \ 627 ((SIZE - 1) * sizeof (iscsi_ipaddr_t))) 628 629 /* 630 * Event class and subclass information 631 */ 632 #define EC_ISCSI "EC_iSCSI" 633 #define ESC_ISCSI_STATIC_START "ESC_static_start" 634 #define ESC_ISCSI_STATIC_END "ESC_static_end" 635 #define ESC_ISCSI_SEND_TARGETS_START "ESC_send_targets_start" 636 #define ESC_ISCSI_SEND_TARGETS_END "ESC_send_targets_end" 637 #define ESC_ISCSI_SLP_START "ESC_slp_start" 638 #define ESC_ISCSI_SLP_END "ESC_slp_end" 639 #define ESC_ISCSI_ISNS_START "ESC_isns_start" 640 #define ESC_ISCSI_ISNS_END "ESC_isns_end" 641 #define ESC_ISCSI_PROP_CHANGE "ESC_prop_change" 642 643 #ifdef _KERNEL 644 /* ---- iscsi_utils.c ---- */ 645 extern int iscsid_open(char *, int, int); 646 extern int iscsid_close(int); 647 extern int iscsid_remove(char *filename); 648 extern int iscsid_rename(char *oldname, char *newname); 649 extern ssize_t iscsid_write(int, void *, ssize_t); 650 extern ssize_t iscsid_read(int, void *, ssize_t); 651 extern ssize_t iscsid_sendto(struct sonode *, void *, size_t, 652 struct sockaddr *, socklen_t); 653 extern ssize_t iscsid_recvfrom(struct sonode *, void *buffer, 654 size_t len); 655 extern int iscsid_errno; 656 #endif 657 658 /* 659 * Function prototypes for those routines found in the common code 660 */ 661 /* ---- utils.c ---- */ 662 extern boolean_t utils_iqn_create(char *, int); 663 extern char *prt_bitmap(int, char *, char *, int); 664 extern char *utils_map_param(int); 665 extern boolean_t parse_addr_port_tpgt(char *in, char **addr, 666 int *type, char **port, char **tpgt); 667 668 #ifdef __cplusplus 669 } 670 #endif 671 672 #endif /* _ISCSI_IF_H */ 673