1/*
2 * IMPORTANT:  READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
3 * By downloading, copying, installing or using the software you agree
4 * to this license.  If you do not agree to this license, do not
5 * download, install, copy or use the software.
6 *
7 * Intel License Agreement
8 *
9 * Copyright (c) 2000, Intel Corporation
10 * All rights reserved.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 *
16 * -Redistributions of source code must retain the above copyright
17 *  notice, this list of conditions and the following disclaimer.
18 *
19 * -Redistributions in binary form must reproduce the above copyright
20 *  notice, this list of conditions and the following disclaimer in the
21 *  documentation and/or other materials provided with the
22 *  distribution.
23 *
24 * -The name of Intel Corporation may not be used to endorse or
25 *  promote products derived from this software without specific prior
26 *  written permission.
27 *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
31 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL INTEL
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
35 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
36 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
37 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
38 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
39 * SUCH DAMAGE.
40 */
41#ifndef ISCSI_H
42#define ISCSI_H
43
44#include "iscsiutil.h"
45
46/*
47 * iSCSI Version 18
48 */
49
50#define ISCSI_VENDOR	"NetBSD"
51#define ISCSI_PRODUCT	"NetBSD iSCSI"
52#define ISCSI_VERSION	0
53
54/*
55 * Parameters
56 */
57
58#define ISCSI_IMMEDIATE_DATA_DFLT            1
59#define ISCSI_INITIAL_R2T_DFLT               1
60#define ISCSI_USE_PHASE_COLLAPSED_READ_DFLT  0
61#define ISCSI_HEADER_LEN                     48
62#define ISCSI_PORT                           3260	/* Default port */
63#define ISCSI_OPCODE(HEADER)                 (HEADER[0] & 0x3f)
64
65#define ISCSI_FIRST_BURST                    (ISCSI_FIRST_BURST_DFLT)
66#define ISCSI_DATA_PDU_LENGTH                (ISCSI_DATA_PDU_LENGTH_DFLT)
67
68/*
69 * Opcodes
70 */
71enum {
72	ISCSI_NOP_OUT       = 0x00,
73	ISCSI_SCSI_CMD      = 0x01,
74	ISCSI_TASK_CMD      = 0x02,
75	ISCSI_LOGIN_CMD     = 0x03,
76	ISCSI_TEXT_CMD      = 0x04,
77	ISCSI_WRITE_DATA    = 0x05,
78	ISCSI_LOGOUT_CMD    = 0x06,
79	ISCSI_SNACK         = 0x10,	/* not implemented */
80	ISCSI_NOP_IN        = 0x20,
81	ISCSI_SCSI_RSP      = 0x21,
82	ISCSI_TASK_RSP      = 0x22,
83	ISCSI_LOGIN_RSP     = 0x23,
84	ISCSI_TEXT_RSP      = 0x24,
85	ISCSI_READ_DATA     = 0x25,
86	ISCSI_LOGOUT_RSP    = 0x26,
87	ISCSI_R2T           = 0x31,
88	ISCSI_ASYNC         = 0x32,
89	ISCSI_REJECT        = 0x3f
90};
91
92enum {
93	ISCSI_AHS_EXTENDED_CDB	= 0x01,
94	ISCSI_AHS_BIDI_READ	= 0x02
95};
96
97/*
98 * Login Phase
99 */
100enum {
101	ISCSI_LOGIN_STATUS_SUCCESS          = 0,
102	ISCSI_LOGIN_STATUS_REDIRECTION      = 1,
103	ISCSI_LOGIN_STATUS_INITIATOR_ERROR  = 2,
104	ISCSI_LOGIN_STATUS_TARGET_ERROR     = 3,
105
106	ISCSI_LOGIN_STAGE_SECURITY          = 0,
107	ISCSI_LOGIN_STAGE_NEGOTIATE         = 1,
108	ISCSI_LOGIN_STAGE_FULL_FEATURE      = 3
109};
110
111/* detailed return codes for login phase */
112enum {
113	ISCSI_LOGIN_DETAIL_SUCCESS = 0x0,
114	ISCSI_LOGIN_DETAIL_INIT_AUTH_FAILURE = 0x01,
115	ISCSI_LOGIN_DETAIL_VERSION_NOT_SUPPORTED = 0x05,
116	ISCSI_LOGIN_DETAIL_NOT_LOGGED_IN = 0x0b
117};
118
119
120/*
121 * Logout Phase
122 */
123enum {
124	ISCSI_LOGOUT_CLOSE_SESSION      = 0,
125	ISCSI_LOGOUT_CLOSE_CONNECTION   = 1,
126	ISCSI_LOGOUT_CLOSE_RECOVERY     = 2,
127
128	ISCSI_LOGOUT_STATUS_SUCCESS     = 0,
129	ISCSI_LOGOUT_STATUS_NO_CID      = 1,
130	ISCSI_LOGOUT_STATUS_NO_RECOVERY = 2,
131	ISCSI_LOGOUT_STATUS_FAILURE     = 3
132};
133
134
135/*
136 * Task Command
137 */
138enum {
139	ISCSI_TASK_CMD_ABORT_TASK           = 1,
140	ISCSI_TASK_CMD_ABORT_TASK_SET       = 2,
141	ISCSI_TASK_CMD_CLEAR_ACA            = 3,
142	ISCSI_TASK_CMD_CLEAR_TASK_SET       = 4,
143	ISCSI_TASK_CMD_LOGICAL_UNIT_RESET   = 5,
144	ISCSI_TASK_CMD_TARGET_WARM_RESET    = 6,
145	ISCSI_TASK_CMD_TARGET_COLD_RESET    = 7,
146	ISCSI_TASK_CMD_TARGET_REASSIGN      = 8
147};
148
149typedef struct iscsi_task_cmd_t {
150	int32_t         immediate;
151	uint8_t         function;
152	uint64_t        lun;
153	uint32_t        tag;
154	uint32_t        ref_tag;
155	uint32_t        CmdSN;
156	uint32_t        ExpStatSN;
157	uint32_t        RefCmdSN;
158	uint32_t        ExpDataSN;
159}               iscsi_task_cmd_t;
160
161int             iscsi_task_cmd_encap(uint8_t *header, iscsi_task_cmd_t * cmd);
162int             iscsi_task_cmd_decap(uint8_t *header, iscsi_task_cmd_t * cmd);
163
164
165/*
166 * Task Response
167 */
168enum {
169	ISCSI_TASK_RSP_FUNCTION_COMPLETE  = 0,
170	ISCSI_TASK_RSP_NO_SUCH_TASK       = 1,
171	ISCSI_TASK_RSP_NO_SUCH_LUN        = 2,
172	ISCSI_TASK_RSP_STILL_ALLEGIANT    = 3,
173	ISCSI_TASK_RSP_NO_FAILOVER        = 4,
174	ISCSI_TASK_RSP_NO_SUPPORT	  = 5,
175	ISCSI_TASK_RSP_AUTHORIZED_FAILED  = 6,
176
177	ISCSI_TASK_RSP_REJECTED           = 255,
178
179	ISCSI_TASK_QUAL_FUNCTION_EXECUTED = 0,
180	ISCSI_TASK_QUAL_NOT_AUTHORIZED    = 1
181};
182
183typedef struct iscsi_task_rsp_t {
184	uint8_t         response;
185	uint32_t        length;
186	uint32_t        tag;
187	uint32_t        StatSN;
188	uint32_t        ExpCmdSN;
189	uint32_t        MaxCmdSN;
190}               iscsi_task_rsp_t;
191
192int             iscsi_task_rsp_encap(uint8_t *header, iscsi_task_rsp_t * rsp);
193int             iscsi_task_rsp_decap(uint8_t *header, iscsi_task_rsp_t * rsp);
194
195
196/*
197 * NOP-Out
198 */
199
200
201typedef struct iscsi_nop_out_args_t {
202	int32_t         immediate;
203	uint32_t        length;
204	uint64_t        lun;
205	uint32_t        tag;
206	uint32_t        transfer_tag;
207	uint32_t        CmdSN;
208	uint32_t        ExpStatSN;
209	const uint8_t   *data;
210}               iscsi_nop_out_args_t;
211
212int             iscsi_nop_out_encap(uint8_t *header, iscsi_nop_out_args_t * cmd);
213int             iscsi_nop_out_decap(uint8_t *header, iscsi_nop_out_args_t * cmd);
214
215
216/*
217 * NOP-In
218 */
219
220
221typedef struct iscsi_nop_in_args_t {
222	uint32_t        length;
223	uint64_t        lun;
224	uint32_t        tag;
225	uint32_t        transfer_tag;
226	uint32_t        StatSN;
227	uint32_t        ExpCmdSN;
228	uint32_t        MaxCmdSN;
229}               iscsi_nop_in_args_t;
230
231int             iscsi_nop_in_encap(uint8_t *header, iscsi_nop_in_args_t * cmd);
232int             iscsi_nop_in_decap(uint8_t *header, iscsi_nop_in_args_t * cmd);
233
234
235/*
236 * Text Command
237 */
238
239
240typedef struct iscsi_text_cmd_args_t {
241	int32_t         immediate;
242	int32_t         final;
243	int32_t         cont;
244	uint32_t        length;
245	uint64_t        lun;
246	uint32_t        tag;
247	uint32_t        transfer_tag;
248	uint32_t        CmdSN;
249	uint32_t        ExpStatSN;
250	char           *text;
251}               iscsi_text_cmd_args_t;
252
253int             iscsi_text_cmd_encap(uint8_t *header, iscsi_text_cmd_args_t * cmd);
254int             iscsi_text_cmd_decap(uint8_t *header, iscsi_text_cmd_args_t * cmd);
255
256
257/*
258 * Text Response
259 */
260
261
262typedef struct iscsi_text_rsp_args_t {
263	int32_t         final;
264	int32_t         cont;
265	uint32_t        length;
266	uint64_t        lun;
267	uint32_t        tag;
268	uint32_t        transfer_tag;
269	uint32_t        StatSN;
270	uint32_t        ExpCmdSN;
271	uint32_t        MaxCmdSN;
272}               iscsi_text_rsp_args_t;
273
274int             iscsi_text_rsp_encap(uint8_t *header, iscsi_text_rsp_args_t * rsp);
275int             iscsi_text_rsp_decap(uint8_t *header, iscsi_text_rsp_args_t * rsp);
276
277
278/*
279 * Login Command
280 */
281
282
283typedef struct iscsi_login_cmd_args_t {
284	int32_t         transit;
285	int32_t         cont;
286	uint8_t         csg;
287	uint8_t         nsg;
288	int8_t          version_max;
289	int8_t          version_min;
290	uint8_t         AHSlength;
291	uint32_t        length;
292	uint64_t	isid;
293	uint16_t        tsih;
294	uint32_t        tag;
295	uint16_t        cid;
296	uint32_t        CmdSN;
297	uint32_t        ExpStatSN;
298	char           *text;
299}               iscsi_login_cmd_args_t;
300
301int             iscsi_login_cmd_encap(uint8_t *header, iscsi_login_cmd_args_t * cmd);
302int             iscsi_login_cmd_decap(uint8_t *header, iscsi_login_cmd_args_t * cmd);
303
304
305/*
306 * Login Response
307 */
308
309
310typedef struct iscsi_login_rsp_args_t {
311	int32_t         transit;
312	int32_t         cont;
313	uint8_t         csg;
314	uint8_t         nsg;
315	int8_t          version_max;
316	int8_t          version_active;
317	uint8_t         AHSlength;
318	uint32_t        length;
319	uint64_t	isid;
320	uint16_t        tsih;
321	uint32_t        tag;
322	uint32_t        StatSN;
323	uint32_t        ExpCmdSN;
324	uint32_t        MaxCmdSN;
325	uint8_t         status_class;
326	uint8_t         status_detail;
327}               iscsi_login_rsp_args_t;
328
329int             iscsi_login_rsp_encap(uint8_t *header, iscsi_login_rsp_args_t * rsp);
330int             iscsi_login_rsp_decap(uint8_t *header, iscsi_login_rsp_args_t * rsp);
331
332
333/*
334 * Logout Command
335 */
336
337
338typedef struct iscsi_logout_cmd_args_t {
339	int32_t         immediate;
340	uint8_t         reason;
341	uint32_t        tag;
342	uint16_t        cid;
343	uint32_t        CmdSN;
344	uint32_t        ExpStatSN;
345}               iscsi_logout_cmd_args_t;
346
347int             iscsi_logout_cmd_encap(uint8_t *header, iscsi_logout_cmd_args_t * cmd);
348int             iscsi_logout_cmd_decap(uint8_t *header, iscsi_logout_cmd_args_t * cmd);
349
350
351/*
352 * Logout Response
353 */
354
355
356typedef struct iscsi_logout_rsp_args_t {
357	uint8_t         response;
358	uint32_t        length;
359	uint32_t        tag;
360	uint32_t        StatSN;
361	uint32_t        ExpCmdSN;
362	uint32_t        MaxCmdSN;
363	uint16_t        Time2Wait;
364	uint16_t        Time2Retain;
365}               iscsi_logout_rsp_args_t;
366
367int             iscsi_logout_rsp_encap(uint8_t *header, iscsi_logout_rsp_args_t * rsp);
368int             iscsi_logout_rsp_decap(uint8_t *header, iscsi_logout_rsp_args_t * rsp);
369
370
371/*
372 * SCSI Command
373 */
374
375
376typedef struct iscsi_scsi_cmd_args_t {
377	int32_t         immediate;
378	int32_t         final;
379	int32_t         input;
380	int32_t         output;
381	uint8_t         attr;
382	uint32_t        length;
383	uint64_t        lun;
384	uint32_t        tag;
385	uint32_t        trans_len;
386	uint32_t        bidi_trans_len;
387	uint32_t        CmdSN;
388	uint32_t        ExpStatSN;
389	uint8_t  	*cdb;
390	uint8_t  	*ext_cdb;
391	uint8_t  	*ahs;
392	uint8_t         ahs_len;
393	uint8_t  	*send_data;
394	uint8_t		*send_buffer;	/* malloc'ed buffer for READ */
395	int32_t         send_sg_len;
396	uint8_t  	*recv_data;
397	int32_t         recv_sg_len;
398	uint8_t         status;
399	uint32_t        bytes_sent;
400	uint32_t        bytes_recv;
401}               iscsi_scsi_cmd_args_t;
402
403int             iscsi_scsi_cmd_encap(uint8_t *header, iscsi_scsi_cmd_args_t * cmd);
404int             iscsi_scsi_cmd_decap(uint8_t *header, iscsi_scsi_cmd_args_t * cmd);
405
406
407/*
408 * SCSI Response
409 */
410
411
412typedef struct iscsi_scsi_rsp_args_t {
413	int32_t         bidi_overflow;
414	int32_t         bidi_underflow;
415	int32_t         overflow;
416	int32_t         underflow;
417
418
419	uint8_t         response;
420	uint8_t         status;
421	uint32_t        ahs_len;
422	uint32_t        length;
423	uint32_t        tag;
424	uint32_t        StatSN;
425	uint32_t        ExpCmdSN;
426	uint32_t        MaxCmdSN;
427	uint32_t        ExpDataSN;
428	uint32_t        bidi_res_cnt;
429	uint32_t        basic_res_cnt;
430}               iscsi_scsi_rsp_t;
431
432int             iscsi_scsi_rsp_encap(uint8_t *header, iscsi_scsi_rsp_t * rsp);
433int             iscsi_scsi_rsp_decap(uint8_t *header, iscsi_scsi_rsp_t * rsp);
434
435
436/*
437 * Ready To Transfer (R2T)
438 */
439
440
441typedef struct iscsi_r2t_args_t {
442	uint32_t        AHSlength;
443	uint64_t        lun;
444	uint32_t        tag;
445	uint32_t        transfer_tag;
446	uint32_t        StatSN;
447	uint32_t        ExpCmdSN;
448	uint32_t        MaxCmdSN;
449	uint32_t        R2TSN;
450	uint32_t        offset;
451	uint32_t        length;
452}               iscsi_r2t_t;
453
454int             iscsi_r2t_encap(uint8_t *header, iscsi_r2t_t * cmd);
455int             iscsi_r2t_decap(uint8_t *header, iscsi_r2t_t * cmd);
456
457
458/*
459 * SCSI Write Data
460 */
461
462
463typedef struct iscsi_write_data_args_t {
464	int32_t         final;
465	uint32_t        length;
466	uint64_t        lun;
467	uint32_t        tag;
468	uint32_t        transfer_tag;
469	uint32_t        ExpStatSN;
470	uint32_t        DataSN;
471	uint32_t        offset;
472}               iscsi_write_data_t;
473
474int             iscsi_write_data_encap(uint8_t *header, iscsi_write_data_t * cmd);
475int             iscsi_write_data_decap(uint8_t *header, iscsi_write_data_t * cmd);
476
477
478/*
479 * SCSI Read Data
480 */
481
482
483typedef struct iscsi_read_data_args_t {
484	int32_t         final;
485	int32_t         ack;
486	int32_t         overflow;
487	int32_t         underflow;
488	int32_t         S_bit;
489	uint8_t         status;
490	uint32_t        length;
491	uint64_t        lun;
492	uint32_t        task_tag;
493	uint32_t        transfer_tag;
494	uint32_t        StatSN;
495	uint32_t        ExpCmdSN;
496	uint32_t        MaxCmdSN;
497	uint32_t        DataSN;
498	uint32_t        offset;
499	uint32_t        res_count;
500}               iscsi_read_data_t;
501
502int             iscsi_read_data_encap(uint8_t *header, iscsi_read_data_t * cmd);
503int             iscsi_read_data_decap(uint8_t *header, iscsi_read_data_t * cmd);
504
505
506/*
507 * Reject
508 */
509
510typedef struct iscsi_reject_args_t {
511	uint8_t         reason;
512	uint32_t        length;
513	uint32_t        StatSN;
514	uint32_t        ExpCmdSN;
515	uint32_t        MaxCmdSN;
516	uint32_t        DataSN;
517	char           *header;
518
519}               iscsi_reject_t;
520
521int             iscsi_reject_encap(uint8_t *header, iscsi_reject_t * cmd);
522int             iscsi_reject_decap(uint8_t *header, iscsi_reject_t * cmd);
523
524/*
525 * Async Message
526 */
527
528typedef struct iscsi_async_msg_args_t {
529	uint8_t         AHSlength;
530	uint64_t        lun;
531	uint32_t        StatSN;
532	uint32_t        ExpCmdSN;
533	uint32_t        MaxCmdSN;
534	uint32_t        length;
535	uint8_t         AsyncEvent;
536	uint8_t         AsyncVCode;
537}               iscsi_async_msg_t;
538
539int             iscsi_amsg_decap(uint8_t *header, iscsi_async_msg_t * msg);
540
541#ifndef SOL_TCP
542#define SOL_TCP IPPROTO_TCP
543#endif
544
545#endif				/* ISCSI_H */
546