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