1 /* $NetBSD: iscsi_ioctl.h,v 1.3 2013/04/04 22:17:13 dsl Exp $ */ 2 3 /*- 4 * Copyright (c) 2004,2005,2006,2011 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Wasabi Systems, Inc. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 #ifndef _ISCSI_IOCTL_H 32 #define _ISCSI_IOCTL_H 33 34 #include <dev/iscsi/iscsi.h> 35 #include <sys/scsiio.h> 36 37 /* ================== Interface Structures ======================== */ 38 39 /* ===== Login, add_connection, and restore_connection ===== */ 40 41 typedef struct { 42 uint32_t status; 43 int socket; 44 struct { 45 unsigned int HeaderDigest:1; 46 unsigned int DataDigest:1; 47 unsigned int MaxConnections:1; 48 unsigned int DefaultTime2Wait:1; 49 unsigned int DefaultTime2Retain:1; 50 unsigned int MaxRecvDataSegmentLength:1; 51 unsigned int auth_info:1; 52 unsigned int user_name:1; 53 unsigned int password:1; 54 unsigned int target_password:1; 55 unsigned int TargetName:1; 56 unsigned int TargetAlias:1; 57 unsigned int ErrorRecoveryLevel:1; 58 } is_present; 59 iscsi_auth_info_t auth_info; 60 iscsi_login_session_type_t login_type; 61 iscsi_digest_t HeaderDigest; 62 iscsi_digest_t DataDigest; 63 uint32_t session_id; 64 uint32_t connection_id; 65 uint32_t MaxRecvDataSegmentLength; 66 uint16_t MaxConnections; 67 uint16_t DefaultTime2Wait; 68 uint16_t DefaultTime2Retain; 69 uint16_t ErrorRecoveryLevel; 70 void *user_name; 71 void *password; 72 void *target_password; 73 void *TargetName; 74 void *TargetAlias; 75 } iscsi_login_parameters_t; 76 77 /* 78 status 79 Contains, on return, the result of the command. 80 socket 81 A handle to the open TCP connection to the target portal. 82 is_present 83 Contains a bitfield that indicates which members of the 84 iscsi_login_parameters structure contain valid data. 85 auth_info 86 Is a bitfield of parameters for authorization. 87 The members are 88 mutual_auth Indicates that authentication should be mutual, i.e. 89 the initiator should authenticate the target, and the target 90 should authenticate the initiator. If not specified, the target 91 will authenticate the initiator only. 92 is_secure Indicates that the connection is secure. 93 auth_number Indicates the number of elements in auth_type. 94 When 0, no authentication will be used. 95 auth_type 96 Contains up to ISCSI_AUTH_OPTIONS enumerator values of type 97 iscsi_auth_types that indicates the authentication method that should 98 be used to establish a login connection (none, CHAP, KRB5, etc.), in 99 order of priority. The first element is the most preferred method, the 100 last element the least preferred. 101 login_type 102 Contains an enumerator value of type login_session_type that indicates 103 the type of logon session (discovery, informational, or full featured). 104 HeaderDigest 105 Indicates which digest (if any) to use for the PDU header. 106 DataDigest 107 Indicates which digest (if any) to use for the PDU data. 108 session_id 109 Login: OUT: Receives an integer that identifies the session. 110 Add_connection, Restore_connection: IN: Session ID. 111 connection_id 112 Login, Add_connection: OUT: Receives an integer that identifies the 113 connection. 114 Restore_connection: IN: Connection ID. 115 MaxRecvDataSegmentLength 116 Allows limiting or extending the maximum receive data segment length. 117 Must contain a value between 512 and 2**24-1 if specified. 118 MaxConnections 119 Contains a value between 1 and 65535 that specifies the maximum number 120 of connections to target devices that can be associated with a single 121 logon session. A value of 0 indicates that there no limit to the 122 number of connections. 123 DefaultTime2Wait 124 Specifies the minimum time to wait, in seconds, before attempting to 125 reconnect or reassign a connection that has been dropped. 126 The default is 2. 127 DefaultTime2Retain 128 Specifies the maximum time, in seconds, allowed to reassign a 129 connection after the initial wait indicated in DefaultTime2Retain has 130 elapsed. The default is 20. 131 ErrorRecoveryLevel 132 Specifies the desired error recovery level for the session. 133 The default and maximum is 2. 134 user_name 135 Sets the user (or CHAP) name to use during login authentication of the 136 initiator (zero terminated UTF-8 string). Default is initiator name. 137 password 138 Contains the password to use during login authentication of the 139 initiator (zero terminated UTF-8 string). Required if authentication 140 is requested. 141 target_password 142 Contains the password to use during login authentication of the target 143 (zero terminated UTF-8 string). Required if mutual authentication is 144 requested. 145 TargetName 146 Indicates the name of the target with which to establish the logon 147 session (zero terminated UTF-8 string). 148 TargetAlias 149 Receives the target alias as a zero terminated UTF-8 string. When 150 present, the buffer must be of size ISCSI_STRING_LENGTH. 151 */ 152 153 154 /* ===== Logout ===== */ 155 156 typedef struct { 157 uint32_t status; 158 uint32_t session_id; 159 } iscsi_logout_parameters_t; 160 161 /* 162 status 163 Contains, on return, the result of the command. 164 session_id 165 Contains an integer that identifies the session. 166 */ 167 168 /* ===== remove_connection ===== */ 169 170 typedef struct { 171 uint32_t status; 172 uint32_t session_id; 173 uint32_t connection_id; 174 } iscsi_remove_parameters_t; 175 176 /* 177 status 178 Contains, on return, the result of the command. 179 session_id 180 Contains an integer that identifies the session. 181 connection_id 182 Contains an integer that identifies the connection. 183 */ 184 185 /* ===== connection status ===== */ 186 187 typedef struct { 188 uint32_t status; 189 uint32_t session_id; 190 uint32_t connection_id; 191 } iscsi_conn_status_parameters_t; 192 193 /* 194 status 195 Contains, on return, the result of the command. 196 session_id 197 Contains an integer that identifies the session. 198 connection_id 199 Contains an integer that identifies the connection. 200 */ 201 202 /* ===== io_command ===== */ 203 204 typedef struct { 205 uint32_t status; 206 uint32_t session_id; 207 uint32_t connection_id; 208 struct { 209 unsigned int immediate:1; 210 } options; 211 uint64_t lun; 212 scsireq_t req; 213 } iscsi_iocommand_parameters_t; 214 215 /* 216 status 217 Contains, on return, the result of the command (an ISCSI_STATUS code). 218 lun 219 Indicates which of the target's logical units should provide the data. 220 session_id 221 Contains an integer that identifies the session. 222 connection_id 223 Contains an integer that identifies the connection. 224 This parameter is optional and should only be used for test purposes. 225 options 226 A bitfield indicating options for the command. 227 The members are 228 immediate Indicates that the command should be sent 229 immediately, ahead of any queued requests. 230 231 req 232 Contains the parameters for the request as defined in sys/scsiio.h 233 typedef struct scsireq { 234 u_long flags; 235 u_long timeout; 236 uint8_t cmd[16]; 237 uint8_t cmdlen; 238 void * databuf; 239 u_long datalen; 240 u_long datalen_used; 241 uint8_t sense[SENSEBUFLEN]; 242 uint8_t senselen; 243 uint8_t senselen_used; 244 uint8_t status; 245 uint8_t retsts; 246 int error; 247 } scsireq_t; 248 249 flags 250 Indicates request status and type. 251 timeout 252 Indicates a timeout value (reserved). 253 cmd 254 SCSI command buffer. 255 cmdlen 256 Length of SCSI command in cmd. 257 databuf 258 Pointer to user-space buffer that holds the data 259 read or written by the SCSI command. 260 datalen 261 Indicates the size in bytes of the buffer at databuf. 262 datalen_used 263 Returns the number of bytes actually read or written. 264 sense 265 Sense data buffer. 266 senselen 267 Indicates the requested size of sense data. Must not exceed 268 SENSEBUFLEN (48). 269 senselen_used 270 Contains, on return, the number of bytes written to sense. 271 status 272 Contains, on return, the original SCSI status (reserved). 273 retsts 274 Contains, on return, the status of the command as defined in scsiio.h. 275 error 276 Contains, on return, the original SCSI error bits (reserved). 277 */ 278 279 280 /* ===== send_targets ===== */ 281 282 typedef struct { 283 uint32_t status; 284 uint32_t session_id; 285 void *response_buffer; 286 uint32_t response_size; 287 uint32_t response_used; 288 uint32_t response_total; 289 uint8_t key[ISCSI_STRING_LENGTH]; 290 } iscsi_send_targets_parameters_t; 291 292 /* 293 status 294 Contains, on return, the result of the command. 295 session_id 296 Contains an integer that identifies the session. 297 response_buffer 298 User mode address of buffer to hold the response data retrieved by 299 the iSCSI send targets command. 300 response_size 301 Contains, on input, the size in bytes of the buffer at 302 response_buffer. If this is 0, the command will execute the 303 SendTargets request, and return (in response_total) the number of 304 bytes required. 305 response_used 306 Contains, on return, the number of bytes actually retrieved to 307 response_buffer. 308 response_total 309 Contains, on return, the total number of bytes required to hold the 310 complete list of targets. This may be larger than response_size. 311 key 312 Specifies the SendTargets key value ("All", <target name>, or empty). 313 */ 314 315 /* ===== set_node_name ===== */ 316 317 typedef struct { 318 uint32_t status; 319 uint8_t InitiatorName[ISCSI_STRING_LENGTH]; 320 uint8_t InitiatorAlias[ISCSI_STRING_LENGTH]; 321 uint8_t ISID[6]; 322 } iscsi_set_node_name_parameters_t; 323 324 /* 325 status 326 Contains, on return, the result of the command. 327 InitiatorName 328 Specifies the InitiatorName used during login. Required. 329 InitiatorAlias 330 Specifies the InitiatorAlias for use during login. May be empty. 331 ISID 332 Specifies the ISID (a 6 byte binary value) for use during login. 333 May be zero (all bytes) for the initiator to use a default value. 334 */ 335 336 /* ===== register_event and deregister_event ===== */ 337 338 typedef struct { 339 uint32_t status; 340 uint32_t event_id; 341 } iscsi_register_event_parameters_t; 342 343 /* 344 status 345 Contains, on return, the result of the command. 346 event_id 347 Returns driver-assigned event ID to be used in 348 subsequent calls to wait_event and deregister_event. 349 */ 350 351 /* ===== wait_event ===== */ 352 353 typedef enum { 354 ISCSI_SESSION_TERMINATED = 1, 355 ISCSI_CONNECTION_TERMINATED, 356 ISCSI_RECOVER_CONNECTION, 357 ISCSI_DRIVER_TERMINATING 358 } iscsi_event_t; 359 360 /* 361 Driver Events 362 363 ISCSI_SESSION_TERMINATED 364 The specified session (including all of its associated connections) 365 has been terminated. 366 ISCSI_CONNECTION_TERMINATED 367 The specified connection has been terminated. 368 ISCSI_RECOVER_CONNECTION 369 The application should attempt to recover the given connection. 370 ISCSI_DRIVER_TERMINATING 371 The driver is unloading. 372 The application MUST call ISCSI_DEREGISTER_EVENT as soon as possible 373 after receiving this event. After performing the deregister IOCTL, 374 the application must no longer attempt to access the driver. 375 */ 376 377 378 typedef struct { 379 uint32_t status; 380 uint32_t event_id; 381 iscsi_event_t event_kind; 382 uint32_t session_id; 383 uint32_t connection_id; 384 uint32_t reason; 385 } iscsi_wait_event_parameters_t; 386 387 /* 388 status 389 Contains, on return, the result of the command. 390 event_id 391 Driver assigned event ID. 392 event_kind 393 Identifies the event. 394 session_id 395 Identifies the affected session (0 for DRIVER_TERMINATING). 396 connection_id 397 Identifies the affected connection (0 for DRIVER_TERMINATING). 398 reason 399 Identifies the termination reason (ISCSI status code). 400 */ 401 402 typedef struct { 403 uint32_t status; 404 uint16_t interface_version; 405 uint16_t major; 406 uint16_t minor; 407 uint8_t version_string[ISCSI_STRING_LENGTH]; 408 } iscsi_get_version_parameters_t; 409 410 /* 411 status 412 Contains, on return, the result of the command. 413 interface_version 414 Updated when interface changes. Current Version is 2. 415 major 416 Major version number. 417 minor 418 Minor version number. 419 version_string 420 Displayable version string (zero terminated). 421 */ 422 423 /* ========================= IOCTL Codes =========================== */ 424 425 #define ISCSI_GET_VERSION _IOWR(0, 1, iscsi_get_version_parameters_t) 426 #define ISCSI_LOGIN _IOWR(0, 2, iscsi_login_parameters_t) 427 #define ISCSI_LOGOUT _IOWR(0, 3, iscsi_logout_parameters_t) 428 #define ISCSI_ADD_CONNECTION _IOWR(0, 4, iscsi_login_parameters_t) 429 #define ISCSI_RESTORE_CONNECTION _IOWR(0, 5, iscsi_login_parameters_t) 430 #define ISCSI_REMOVE_CONNECTION _IOWR(0, 6, iscsi_remove_parameters_t) 431 #define ISCSI_CONNECTION_STATUS _IOWR(0, 7, iscsi_conn_status_parameters_t) 432 #define ISCSI_SEND_TARGETS _IOWR(0, 8, iscsi_send_targets_parameters_t) 433 #define ISCSI_SET_NODE_NAME _IOWR(0, 9, iscsi_set_node_name_parameters_t) 434 #define ISCSI_IO_COMMAND _IOWR(0, 10, iscsi_iocommand_parameters_t) 435 #define ISCSI_REGISTER_EVENT _IOWR(0, 11, iscsi_register_event_parameters_t) 436 #define ISCSI_DEREGISTER_EVENT _IOWR(0, 12, iscsi_register_event_parameters_t) 437 #define ISCSI_WAIT_EVENT _IOWR(0, 13, iscsi_wait_event_parameters_t) 438 #define ISCSI_POLL_EVENT _IOWR(0, 14, iscsi_wait_event_parameters_t) 439 440 #endif /* !_ISCSI_IOCTL_H */ 441