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
41typedef 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
156typedef 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
170typedef 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
187typedef 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
204typedef 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
282typedef 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
317typedef 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
338typedef 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
353typedef 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
378typedef 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
402typedef 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