xref: /onnv-gate/usr/src/uts/common/sys/iscsi_protocol.h (revision 12546:b9d61378e1b8)
12314Smcneal /*
22314Smcneal  * CDDL HEADER START
32314Smcneal  *
42314Smcneal  * The contents of this file are subject to the terms of the
52314Smcneal  * Common Development and Distribution License (the "License").
62314Smcneal  * You may not use this file except in compliance with the License.
72314Smcneal  *
82314Smcneal  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
92314Smcneal  * or http://www.opensolaris.org/os/licensing.
102314Smcneal  * See the License for the specific language governing permissions
112314Smcneal  * and limitations under the License.
122314Smcneal  *
132314Smcneal  * When distributing Covered Code, include this CDDL HEADER in each
142314Smcneal  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
152314Smcneal  * If applicable, add the following below this CDDL HEADER, with the
162314Smcneal  * fields enclosed by brackets "[]" replaced with your own identifying
172314Smcneal  * information: Portions Copyright [yyyy] [name of copyright owner]
182314Smcneal  *
192314Smcneal  * CDDL HEADER END
202314Smcneal  */
212314Smcneal /*
22*12546SBing.Zhao@Sun.COM  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
232314Smcneal  */
242314Smcneal 
252314Smcneal #ifndef _ISCSI_PROTOCOL_H
262314Smcneal #define	_ISCSI_PROTOCOL_H
272314Smcneal 
282314Smcneal #ifdef __cplusplus
292314Smcneal extern "C" {
302314Smcneal #endif
312314Smcneal 
322314Smcneal /*
332314Smcneal  * iSCSI connection daemon
342314Smcneal  * Copyright (C) 2001 Cisco Systems, Inc.
352314Smcneal  * All rights reserved.
362314Smcneal  *
372314Smcneal  * This file sets up definitions of messages and constants used by the
382314Smcneal  * iSCSI protocol.
392314Smcneal  *
402314Smcneal  */
412314Smcneal 
422314Smcneal #include <sys/types.h>
432314Smcneal #include <sys/isa_defs.h>
442314Smcneal 
452314Smcneal #define	ISCSI_MAX_NAME_LEN	224
46*12546SBing.Zhao@Sun.COM #define	ISCSI_MAX_C_USER_LEN	512
472314Smcneal 
482314Smcneal /* iSCSI listen port for incoming connections */
492314Smcneal #define	ISCSI_LISTEN_PORT 3260
502314Smcneal 
512314Smcneal /* assumes a pointer to a 3-byte array */
522314Smcneal #define	ntoh24(p) (((p)[0] << 16) | ((p)[1] << 8) | ((p)[2]))
532314Smcneal 
542314Smcneal /* assumes a pointer to a 3 byte array, and an integer value */
552314Smcneal #define	hton24(p, v) {\
562314Smcneal 	p[0] = (((v) >> 16) & 0xFF); \
572314Smcneal 	p[1] = (((v) >> 8) & 0xFF); \
582314Smcneal 	p[2] = ((v) & 0xFF); \
592314Smcneal }
602314Smcneal 
612314Smcneal 
622314Smcneal /* for Login min, max, active version fields */
632314Smcneal #define	ISCSI_MIN_VERSION	0x00
642314Smcneal #define	ISCSI_DRAFT8_VERSION    0x02
652314Smcneal #define	ISCSI_DRAFT20_VERSION   0x00
662314Smcneal #define	ISCSI_MAX_VERSION	0x02
672314Smcneal 
682314Smcneal /* Min. and Max. length of a PDU we can support */
692314Smcneal #define	ISCSI_MIN_PDU_LENGTH	(8 << 9)	/* 4KB */
702314Smcneal #define	ISCSI_MAX_PDU_LENGTH	(0xffffffff)	/* Huge */
712314Smcneal 
722314Smcneal /* Padding word length */
732314Smcneal #define	ISCSI_PAD_WORD_LEN		4
742314Smcneal 
752314Smcneal /* Max. number of Key=Value pairs in a text message */
762314Smcneal #define	ISCSI_MAX_KEY_VALUE_PAIRS	8192
772314Smcneal 
782314Smcneal /* text separtor between key value pairs exhanged in login */
792314Smcneal #define	ISCSI_TEXT_SEPARATOR	'='
802314Smcneal 
817978SPeter.Dunlap@Sun.COM /* reserved text constants for Text Mode Negotiation */
827978SPeter.Dunlap@Sun.COM #define	ISCSI_TEXT_NONE			"None"
837978SPeter.Dunlap@Sun.COM #define	ISCSI_TEXT_REJECT		"Reject"
847978SPeter.Dunlap@Sun.COM #define	ISCSI_TEXT_IRRELEVANT		"Irrelevant"
857978SPeter.Dunlap@Sun.COM #define	ISCSI_TEXT_NOTUNDERSTOOD	"NotUnderstood"
867978SPeter.Dunlap@Sun.COM 
872314Smcneal /* Reserved value for initiator/target task tag */
882314Smcneal #define	ISCSI_RSVD_TASK_TAG	0xffffffff
892314Smcneal 
902314Smcneal /* maximum length for text keys/values */
912314Smcneal #define	KEY_MAXLEN 64
922314Smcneal #define	VALUE_MAXLEN 255
932314Smcneal #define	TARGET_NAME_MAXLEN    VALUE_MAXLEN
942314Smcneal 
952314Smcneal /* most PDU types have a final bit */
962314Smcneal #define	ISCSI_FLAG_FINAL		0x80
972314Smcneal 
982314Smcneal /*
992314Smcneal  * Strings used during SendTargets requests
1002314Smcneal  */
1012314Smcneal #define	ISCSI_TEXT_SEPARATOR	'='
1022314Smcneal #define	TARGETNAME "TargetName="
1032314Smcneal #define	TARGETADDRESS "TargetAddress="
1042314Smcneal 
1052314Smcneal /* iSCSI Template Message Header */
1062314Smcneal typedef struct _iscsi_hdr {
1072314Smcneal 	uint8_t opcode;
1082314Smcneal 	uint8_t flags;	/* Final bit */
1092314Smcneal 	uint8_t rsvd2[2];
1102314Smcneal 	uint8_t hlength;	/* AHSs total length */
1112314Smcneal 	uint8_t dlength[3];	/* Data length */
1122314Smcneal 	uint8_t lun[8];
1132314Smcneal 	uint32_t itt;	/* Initiator Task Tag */
1142314Smcneal 	uint8_t		rsvd3[8];
1152314Smcneal 	uint32_t	expstatsn;
1162314Smcneal 	uint8_t		other[16];
1172314Smcneal } iscsi_hdr_t;
1182314Smcneal 
1192314Smcneal typedef struct _iscsi_rsp_hdr {
1202314Smcneal 	uint8_t		opcode;
1212314Smcneal 	uint8_t		flags;
1222314Smcneal 	uint8_t		rsvd1[3];
1232314Smcneal 	uint8_t		dlength[3];
1242314Smcneal 	uint8_t		rsvd2[8];
1252314Smcneal 	uint32_t	itt;
1262314Smcneal 	uint8_t		rsvd3[4];
1272314Smcneal 	uint32_t	statsn;
1282314Smcneal 	uint32_t	expcmdsn;
1292314Smcneal 	uint32_t	maxcmdsn;
1302314Smcneal 	uint8_t		rsvd4[12];
1312314Smcneal } iscsi_rsp_hdr_t;
1322314Smcneal 
1332314Smcneal /* Opcode encoding bits */
1342314Smcneal #define	ISCSI_OP_RETRY			0x80
1352314Smcneal #define	ISCSI_OP_IMMEDIATE		0x40
1362314Smcneal #define	ISCSI_OPCODE_MASK		0x3F
1372314Smcneal 
1382314Smcneal /* Client to Server Message Opcode values */
1392314Smcneal #define	ISCSI_OP_NOOP_OUT		0x00
1402314Smcneal #define	ISCSI_OP_SCSI_CMD		0x01
1412314Smcneal #define	ISCSI_OP_SCSI_TASK_MGT_MSG	0x02
1422314Smcneal #define	ISCSI_OP_LOGIN_CMD		0x03
1432314Smcneal #define	ISCSI_OP_TEXT_CMD		0x04
1442314Smcneal #define	ISCSI_OP_SCSI_DATA		0x05
1452314Smcneal #define	ISCSI_OP_LOGOUT_CMD		0x06
1462314Smcneal #define	ISCSI_OP_SNACK_CMD		0x10
1472314Smcneal 
1482314Smcneal /* Server to Client Message Opcode values */
1492314Smcneal #define	ISCSI_OP_NOOP_IN		0x20
1502314Smcneal #define	ISCSI_OP_SCSI_RSP		0x21
1512314Smcneal #define	ISCSI_OP_SCSI_TASK_MGT_RSP	0x22
1522314Smcneal #define	ISCSI_OP_LOGIN_RSP		0x23
1532314Smcneal #define	ISCSI_OP_TEXT_RSP		0x24
1542314Smcneal #define	ISCSI_OP_SCSI_DATA_RSP		0x25
1552314Smcneal #define	ISCSI_OP_LOGOUT_RSP		0x26
1562314Smcneal #define	ISCSI_OP_RTT_RSP		0x31
1572314Smcneal #define	ISCSI_OP_ASYNC_EVENT		0x32
1582314Smcneal #define	ISCSI_OP_REJECT_MSG		0x3f
1592314Smcneal 
1602314Smcneal 
1612314Smcneal /* SCSI Command Header */
1622314Smcneal typedef struct _iscsi_scsi_cmd_hdr {
1632314Smcneal 	uint8_t opcode;
1642314Smcneal 	uint8_t flags;
1652314Smcneal 	uint8_t rsvd[2];
1662314Smcneal 	uint8_t hlength;
1672314Smcneal 	uint8_t dlength[3];
1682314Smcneal 	uint8_t lun[8];
1692314Smcneal 	uint32_t itt;	/* Initiator Task Tag */
1702314Smcneal 	uint32_t data_length;
1712314Smcneal 	uint32_t cmdsn;
1722314Smcneal 	uint32_t expstatsn;
1732314Smcneal 	uint8_t scb[16];	/* SCSI Command Block */
1742314Smcneal 	/*
1752314Smcneal 	 * Additional Data (Command Dependent)
1762314Smcneal 	 */
1772314Smcneal } iscsi_scsi_cmd_hdr_t;
1782314Smcneal 
1792314Smcneal /* Command PDU flags */
1802314Smcneal #define	ISCSI_FLAG_CMD_READ		0x40
1812314Smcneal #define	ISCSI_FLAG_CMD_WRITE		0x20
1822314Smcneal #define	ISCSI_FLAG_CMD_ATTR_MASK	0x07	/* 3 bits */
1832314Smcneal 
1842314Smcneal /* SCSI Command Attribute values */
1852314Smcneal #define	ISCSI_ATTR_UNTAGGED		0
1862314Smcneal #define	ISCSI_ATTR_SIMPLE		1
1872314Smcneal #define	ISCSI_ATTR_ORDERED		2
1882314Smcneal #define	ISCSI_ATTR_HEAD_OF_QUEUE	3
1892314Smcneal #define	ISCSI_ATTR_ACA			4
1902314Smcneal 
1912314Smcneal 
1922314Smcneal /* SCSI Response Header */
1932314Smcneal typedef struct _iscsi_scsi_rsp_hdr {
1942314Smcneal 	uint8_t opcode;
1952314Smcneal 	uint8_t flags;
1962314Smcneal 	uint8_t response;
1972314Smcneal 	uint8_t cmd_status;
1982314Smcneal 	uint8_t hlength;
1992314Smcneal 	uint8_t dlength[3];
2002314Smcneal 	uint8_t rsvd[8];
2012314Smcneal 	uint32_t itt;	/* Initiator Task Tag */
2022314Smcneal 	uint32_t rsvd1;
2032314Smcneal 	uint32_t statsn;
2042314Smcneal 	uint32_t expcmdsn;
2052314Smcneal 	uint32_t maxcmdsn;
2062314Smcneal 	uint32_t expdatasn;
2072314Smcneal 	uint32_t bi_residual_count;
2082314Smcneal 	uint32_t residual_count;
2092314Smcneal 	/*
2102314Smcneal 	 * Response or Sense Data (optional)
2112314Smcneal 	 */
2122314Smcneal } iscsi_scsi_rsp_hdr_t;
2132314Smcneal 
2142314Smcneal /* 10.2.2.3 - Extended CDB Additional Header Segment */
2152314Smcneal 
2162314Smcneal typedef struct _iscsi_addl_hdr {
2172314Smcneal 	iscsi_scsi_cmd_hdr_t ahs_isch;
2182314Smcneal 	uint8_t ahs_hlen_hi;
2192314Smcneal 	uint8_t ahs_hlen_lo;
2202314Smcneal 	uint8_t ahs_key;
2212314Smcneal 	uint8_t ahs_resv;
2222314Smcneal 	uint8_t ahs_extscb[4];
2232314Smcneal } iscsi_addl_hdr_t;
2242314Smcneal 
2252314Smcneal /* Command Response PDU flags */
2262314Smcneal #define	ISCSI_FLAG_CMD_BIDI_OVERFLOW	0x10
2272314Smcneal #define	ISCSI_FLAG_CMD_BIDI_UNDERFLOW	0x08
2282314Smcneal #define	ISCSI_FLAG_CMD_OVERFLOW		0x04
2292314Smcneal #define	ISCSI_FLAG_CMD_UNDERFLOW	0x02
2302314Smcneal 
2312314Smcneal /* iSCSI Status values. Valid if Rsp Selector bit is not set */
2322314Smcneal #define	ISCSI_STATUS_CMD_COMPLETED	0
2332314Smcneal #define	ISCSI_STATUS_TARGET_FAILURE	1
2342314Smcneal #define	ISCSI_STATUS_SUBSYS_FAILURE	2
2352314Smcneal 
2362314Smcneal 
2372314Smcneal /* Asynchronous Event Header */
2382314Smcneal typedef struct _iscsi_async_evt_hdr {
2392314Smcneal 	uint8_t opcode;
2402314Smcneal 	uint8_t flags;
2412314Smcneal 	uint8_t rsvd2[2];
2422314Smcneal 	uint8_t rsvd3;
2432314Smcneal 	uint8_t dlength[3];
2442314Smcneal 	uint8_t lun[8];
2452314Smcneal 	uint8_t rsvd4[8];
2462314Smcneal 	uint32_t statsn;
2472314Smcneal 	uint32_t expcmdsn;
2482314Smcneal 	uint32_t maxcmdsn;
2492314Smcneal 	uint8_t async_event;
2502314Smcneal 	uint8_t async_vcode;
2512314Smcneal 	uint16_t param1;
2522314Smcneal 	uint16_t param2;
2532314Smcneal 	uint16_t param3;
2542314Smcneal 	uint8_t rsvd5[4];
2552314Smcneal } iscsi_async_evt_hdr_t;
2562314Smcneal 
2572314Smcneal /* iSCSI Event Indicator values */
2582314Smcneal #define	ISCSI_ASYNC_EVENT_SCSI_EVENT			0
2592314Smcneal #define	ISCSI_ASYNC_EVENT_REQUEST_LOGOUT		1
2602314Smcneal #define	ISCSI_ASYNC_EVENT_DROPPING_CONNECTION		2
2612314Smcneal #define	ISCSI_ASYNC_EVENT_DROPPING_ALL_CONNECTIONS	3
2622314Smcneal #define	ISCSI_ASYNC_EVENT_PARAM_NEGOTIATION		4
2632314Smcneal #define	ISCSI_ASYNC_EVENT_VENDOR_SPECIFIC		255
2642314Smcneal 
2652314Smcneal 
2662314Smcneal /* NOP-Out Message */
2672314Smcneal typedef struct _iscsi_nop_out_hdr {
2682314Smcneal 	uint8_t opcode;
2692314Smcneal 	uint8_t flags;
2702314Smcneal 	uint16_t rsvd2;
2712314Smcneal 	uint8_t rsvd3;
2722314Smcneal 	uint8_t dlength[3];
2732314Smcneal 	uint8_t lun[8];
2742314Smcneal 	uint32_t itt;	/* Initiator Task Tag */
2752314Smcneal 	uint32_t ttt;	/* Target Transfer Tag */
2762314Smcneal 	uint32_t cmdsn;
2772314Smcneal 	uint32_t expstatsn;
2782314Smcneal 	uint8_t rsvd4[16];
2792314Smcneal } iscsi_nop_out_hdr_t;
2802314Smcneal 
2812314Smcneal 
2822314Smcneal /* NOP-In Message */
2832314Smcneal typedef struct _iscsi_nop_in_hdr {
2842314Smcneal 	uint8_t opcode;
2852314Smcneal 	uint8_t flags;
2862314Smcneal 	uint16_t rsvd2;
2872314Smcneal 	uint8_t rsvd3;
2882314Smcneal 	uint8_t dlength[3];
2892314Smcneal 	uint8_t lun[8];
2902314Smcneal 	uint32_t itt;	/* Initiator Task Tag */
2912314Smcneal 	uint32_t ttt;	/* Target Transfer Tag */
2922314Smcneal 	uint32_t statsn;
2932314Smcneal 	uint32_t expcmdsn;
2942314Smcneal 	uint32_t maxcmdsn;
2952314Smcneal 	uint8_t rsvd4[12];
2962314Smcneal } iscsi_nop_in_hdr_t;
2972314Smcneal 
2982314Smcneal /* SCSI Task Management Message Header */
2992314Smcneal typedef struct _iscsi_scsi_task_mgt_hdr {
3002314Smcneal 	uint8_t opcode;
3012314Smcneal 	uint8_t function;
3022314Smcneal 	uint8_t rsvd1[2];
3032314Smcneal 	uint8_t hlength;
3042314Smcneal 	uint8_t dlength[3];
3052314Smcneal 	uint8_t lun[8];
3062314Smcneal 	uint32_t itt;	/* Initiator Task Tag */
3072314Smcneal 	uint32_t rtt;	/* Reference Task Tag */
3082314Smcneal 	uint32_t cmdsn;
3092314Smcneal 	uint32_t expstatsn;
3102314Smcneal 	uint32_t refcmdsn;
3112314Smcneal 	uint32_t expdatasn;
3122314Smcneal 	uint8_t rsvd2[8];
3132314Smcneal } iscsi_scsi_task_mgt_hdr_t;
3142314Smcneal 
3152314Smcneal #define	ISCSI_FLAG_TASK_MGMT_FUNCTION_MASK  0x7F
3162314Smcneal 
3172314Smcneal /* Function values */
3182314Smcneal #define	ISCSI_TM_FUNC_ABORT_TASK		1
3192314Smcneal #define	ISCSI_TM_FUNC_ABORT_TASK_SET		2
3202314Smcneal #define	ISCSI_TM_FUNC_CLEAR_ACA			3
3212314Smcneal #define	ISCSI_TM_FUNC_CLEAR_TASK_SET		4
3222314Smcneal #define	ISCSI_TM_FUNC_LOGICAL_UNIT_RESET	5
3232314Smcneal #define	ISCSI_TM_FUNC_TARGET_WARM_RESET		6
3242314Smcneal #define	ISCSI_TM_FUNC_TARGET_COLD_RESET		7
3252314Smcneal #define	ISCSI_TM_FUNC_TASK_REASSIGN		8
3262314Smcneal 
3272314Smcneal 
3282314Smcneal /* SCSI Task Management Response Header */
3292314Smcneal typedef struct _iscsi_scsi_task_mgt_rsp_hdr {
3302314Smcneal 	uint8_t opcode;
3312314Smcneal 	uint8_t flags;
3322314Smcneal 	uint8_t response;	/* see Response values below */
3332314Smcneal 	uint8_t qualifier;
3342314Smcneal 	uint8_t hlength;
3352314Smcneal 	uint8_t dlength[3];
3362314Smcneal 	uint8_t rsvd2[8];
3372314Smcneal 	uint32_t itt;	/* Initiator Task Tag */
3382314Smcneal 	uint32_t rtt;	/* Reference Task Tag */
3392314Smcneal 	uint32_t statsn;
3402314Smcneal 	uint32_t expcmdsn;
3412314Smcneal 	uint32_t maxcmdsn;
3422314Smcneal 	uint8_t rsvd3[12];
3432314Smcneal } iscsi_scsi_task_mgt_rsp_hdr_t;
3442314Smcneal 
3452314Smcneal 
3462314Smcneal /* Response values */
3472314Smcneal #define	SCSI_TCP_TM_RESP_COMPLETE	0x00
3482314Smcneal #define	SCSI_TCP_TM_RESP_NO_TASK	0x01
3492314Smcneal #define	SCSI_TCP_TM_RESP_NO_LUN		0x02
3502314Smcneal #define	SCSI_TCP_TM_RESP_TASK_ALLEGIANT	0x03
3517978SPeter.Dunlap@Sun.COM #define	SCSI_TCP_TM_RESP_NO_ALLG_REASSN	0x04
3527978SPeter.Dunlap@Sun.COM #define	SCSI_TCP_TM_RESP_FUNC_NOT_SUPP	0x05
3537978SPeter.Dunlap@Sun.COM #define	SCSI_TCP_TM_RESP_FUNC_AUTH_FAIL	0x06
3542314Smcneal #define	SCSI_TCP_TM_RESP_REJECTED	0xff
3552314Smcneal 
3567978SPeter.Dunlap@Sun.COM /*
3577978SPeter.Dunlap@Sun.COM  * Maintained for backward compatibility.
3587978SPeter.Dunlap@Sun.COM  */
3597978SPeter.Dunlap@Sun.COM 
3607978SPeter.Dunlap@Sun.COM #define	SCSI_TCP_TM_RESP_NO_FAILOVER	SCSI_TCP_TM_RESP_NO_ALLG_REASSN
3617978SPeter.Dunlap@Sun.COM #define	SCSI_TCP_TM_RESP_IN_PRGRESS	SCSI_TCP_TM_RESP_FUNC_NOT_SUPP
3627978SPeter.Dunlap@Sun.COM 
3632314Smcneal /* Ready To Transfer Header */
3642314Smcneal typedef struct _iscsi_rtt_hdr {
3652314Smcneal 	uint8_t opcode;
3662314Smcneal 	uint8_t flags;
3672314Smcneal 	uint8_t rsvd2[2];
3682314Smcneal 	uint8_t rsvd3[12];
3692314Smcneal 	uint32_t itt;	/* Initiator Task Tag */
3702314Smcneal 	uint32_t ttt;	/* Target Transfer Tag */
3712314Smcneal 	uint32_t statsn;
3722314Smcneal 	uint32_t expcmdsn;
3732314Smcneal 	uint32_t maxcmdsn;
3742314Smcneal 	uint32_t rttsn;
3752314Smcneal 	uint32_t data_offset;
3762314Smcneal 	uint32_t data_length;
3772314Smcneal } iscsi_rtt_hdr_t;
3782314Smcneal 
3792314Smcneal 
3802314Smcneal /* SCSI Data Hdr */
3812314Smcneal typedef struct _iscsi_data_hdr {
3822314Smcneal 	uint8_t opcode;
3832314Smcneal 	uint8_t flags;
3842314Smcneal 	uint8_t rsvd2[2];
3852314Smcneal 	uint8_t rsvd3;
3862314Smcneal 	uint8_t dlength[3];
3872314Smcneal 	uint8_t lun[8];
3882314Smcneal 	uint32_t itt;
3892314Smcneal 	uint32_t ttt;
3902314Smcneal 	uint32_t rsvd4;
3912314Smcneal 	uint32_t expstatsn;
3922314Smcneal 	uint32_t rsvd5;
3932314Smcneal 	uint32_t datasn;
3942314Smcneal 	uint32_t offset;
3952314Smcneal 	uint32_t rsvd6;
3962314Smcneal 	/*
3972314Smcneal 	 * Payload
3982314Smcneal 	 */
3992314Smcneal } iscsi_data_hdr_t;
4002314Smcneal 
4012314Smcneal /* SCSI Data Response Hdr */
4022314Smcneal typedef struct _iscsi_data_rsp_hdr {
4032314Smcneal 	uint8_t opcode;
4042314Smcneal 	uint8_t flags;
4052314Smcneal 	uint8_t rsvd2;
4062314Smcneal 	uint8_t cmd_status;
4072314Smcneal 	uint8_t hlength;
4082314Smcneal 	uint8_t dlength[3];
4092314Smcneal 	uint8_t lun[8];
4102314Smcneal 	uint32_t itt;
4112314Smcneal 	uint32_t ttt;
4122314Smcneal 	uint32_t statsn;
4132314Smcneal 	uint32_t expcmdsn;
4142314Smcneal 	uint32_t maxcmdsn;
4152314Smcneal 	uint32_t datasn;
4162314Smcneal 	uint32_t offset;
4172314Smcneal 	uint32_t residual_count;
4182314Smcneal } iscsi_data_rsp_hdr_t;
4192314Smcneal 
4202314Smcneal /* Data Response PDU flags */
4212314Smcneal #define	ISCSI_FLAG_DATA_ACK		0x40
4222314Smcneal #define	ISCSI_FLAG_DATA_OVERFLOW	0x04
4232314Smcneal #define	ISCSI_FLAG_DATA_UNDERFLOW	0x02
4242314Smcneal #define	ISCSI_FLAG_DATA_STATUS		0x01
4252314Smcneal 
4262314Smcneal 
4272314Smcneal /* Text Header */
4282314Smcneal typedef struct _iscsi_text_hdr {
4292314Smcneal 	uint8_t opcode;
4302314Smcneal 	uint8_t flags;
4312314Smcneal 	uint8_t rsvd2[2];
4322314Smcneal 	uint8_t hlength;
4332314Smcneal 	uint8_t dlength[3];
4342314Smcneal 	uint8_t rsvd4[8];
4352314Smcneal 	uint32_t itt;
4362314Smcneal 	uint32_t ttt;
4372314Smcneal 	uint32_t cmdsn;
4382314Smcneal 	uint32_t expstatsn;
4392314Smcneal 	uint8_t rsvd5[16];
4402314Smcneal 	/*
4412314Smcneal 	 * Text - key=value pairs
4422314Smcneal 	 */
4432314Smcneal } iscsi_text_hdr_t;
4442314Smcneal 
4452314Smcneal #define	ISCSI_FLAG_TEXT_CONTINUE	0x40
4462314Smcneal 
4472314Smcneal /* Text Response Header */
4482314Smcneal typedef struct _iscsi_text_rsp_hdr {
4492314Smcneal 	uint8_t opcode;
4502314Smcneal 	uint8_t flags;
4512314Smcneal 	uint8_t rsvd2[2];
4522314Smcneal 	uint8_t hlength;
4532314Smcneal 	uint8_t dlength[3];
4542314Smcneal 	uint8_t rsvd4[8];
4552314Smcneal 	uint32_t itt;
4562314Smcneal 	uint32_t ttt;
4572314Smcneal 	uint32_t statsn;
4582314Smcneal 	uint32_t expcmdsn;
4592314Smcneal 	uint32_t maxcmdsn;
4602314Smcneal 	uint8_t rsvd5[12];
4612314Smcneal 	/*
4622314Smcneal 	 * Text Response - key:value pairs
4632314Smcneal 	 */
4642314Smcneal } iscsi_text_rsp_hdr_t;
4652314Smcneal 
4667978SPeter.Dunlap@Sun.COM #define	ISCSI_ISID_LEN	6
4677978SPeter.Dunlap@Sun.COM 
4682314Smcneal /* Login Header */
4692314Smcneal typedef struct _iscsi_login_hdr {
4702314Smcneal 	uint8_t opcode;
4712314Smcneal 	uint8_t flags;
4722314Smcneal 	uint8_t max_version;	/* Max. version supported */
4732314Smcneal 	uint8_t min_version;	/* Min. version supported */
4742314Smcneal 	uint8_t hlength;
4752314Smcneal 	uint8_t dlength[3];
4767978SPeter.Dunlap@Sun.COM 	uint8_t isid[ISCSI_ISID_LEN];	/* Initiator Session ID */
4772314Smcneal 	uint16_t tsid;	/* Target Session ID */
4782314Smcneal 	uint32_t itt;	/* Initiator Task Tag */
4792314Smcneal 	uint16_t cid;
4802314Smcneal 	uint16_t rsvd3;
4812314Smcneal 	uint32_t cmdsn;
4822314Smcneal 	uint32_t expstatsn;
4832314Smcneal 	uint8_t rsvd5[16];
4842314Smcneal } iscsi_login_hdr_t;
4852314Smcneal 
4862314Smcneal /* Login PDU flags */
4872314Smcneal #define	ISCSI_FLAG_LOGIN_TRANSIT		0x80
4882314Smcneal #define	ISCSI_FLAG_LOGIN_CONTINUE		0x40
4892314Smcneal #define	ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK	0x0C	/* 2 bits */
4902314Smcneal #define	ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK	0x03	/* 2 bits */
4912314Smcneal 
4922314Smcneal #define	ISCSI_LOGIN_CURRENT_STAGE(flags) \
4932314Smcneal 	((flags & ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK) >> 2)
4942314Smcneal #define	ISCSI_LOGIN_NEXT_STAGE(flags) \
4952314Smcneal 	(flags & ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK)
4962314Smcneal 
4972314Smcneal 
4982314Smcneal /* Login Response Header */
4992314Smcneal typedef struct _iscsi_login_rsp_hdr {
5002314Smcneal 	uint8_t opcode;
5012314Smcneal 	uint8_t flags;
5022314Smcneal 	uint8_t max_version;	/* Max. version supported */
5032314Smcneal 	uint8_t active_version;	/* Active version */
5042314Smcneal 	uint8_t hlength;
5052314Smcneal 	uint8_t dlength[3];
5067978SPeter.Dunlap@Sun.COM 	uint8_t isid[ISCSI_ISID_LEN];	/* Initiator Session ID */
5072314Smcneal 	uint16_t tsid;	/* Target Session ID */
5082314Smcneal 	uint32_t itt;	/* Initiator Task Tag */
5092314Smcneal 	uint32_t rsvd3;
5102314Smcneal 	uint32_t statsn;
5112314Smcneal 	uint32_t expcmdsn;
5122314Smcneal 	uint32_t maxcmdsn;
5132314Smcneal 	uint8_t status_class;	/* see Login RSP ststus classes below */
5142314Smcneal 	uint8_t status_detail;	/* see Login RSP Status details below */
5152314Smcneal 	uint8_t rsvd4[10];
5162314Smcneal } iscsi_login_rsp_hdr_t;
5172314Smcneal 
5182314Smcneal /* Login stage (phase) codes for CSG, NSG */
5192314Smcneal #define	ISCSI_SECURITY_NEGOTIATION_STAGE	0
5202314Smcneal #define	ISCSI_OP_PARMS_NEGOTIATION_STAGE	1
5212314Smcneal #define	ISCSI_FULL_FEATURE_PHASE		3
5222314Smcneal 
5232314Smcneal /* Login Status response classes */
5242314Smcneal #define	ISCSI_STATUS_CLASS_SUCCESS		0x00
5252314Smcneal #define	ISCSI_STATUS_CLASS_REDIRECT		0x01
5262314Smcneal #define	ISCSI_STATUS_CLASS_INITIATOR_ERR	0x02
5272314Smcneal #define	ISCSI_STATUS_CLASS_TARGET_ERR		0x03
5282314Smcneal 
5292314Smcneal /* Login Status response detail codes */
5302314Smcneal /* Class-0 (Success) */
5312314Smcneal #define	ISCSI_LOGIN_STATUS_ACCEPT		0x00
5322314Smcneal 
5332314Smcneal /* Class-1 (Redirection) */
5342314Smcneal #define	ISCSI_LOGIN_STATUS_TGT_MOVED_TEMP	0x01
5352314Smcneal #define	ISCSI_LOGIN_STATUS_TGT_MOVED_PERM	0x02
5362314Smcneal 
5372314Smcneal /* Class-2 (Initiator Error) */
5382314Smcneal #define	ISCSI_LOGIN_STATUS_INIT_ERR		0x00
5392314Smcneal #define	ISCSI_LOGIN_STATUS_AUTH_FAILED		0x01
5402314Smcneal #define	ISCSI_LOGIN_STATUS_TGT_FORBIDDEN	0x02
5412314Smcneal #define	ISCSI_LOGIN_STATUS_TGT_NOT_FOUND	0x03
5422314Smcneal #define	ISCSI_LOGIN_STATUS_TGT_REMOVED		0x04
5432314Smcneal #define	ISCSI_LOGIN_STATUS_NO_VERSION		0x05
5442314Smcneal #define	ISCSI_LOGIN_STATUS_ISID_ERROR		0x06
5452314Smcneal #define	ISCSI_LOGIN_STATUS_MISSING_FIELDS	0x07
5462314Smcneal #define	ISCSI_LOGIN_STATUS_CONN_ADD_FAILED	0x08
5472314Smcneal #define	ISCSI_LOGIN_STATUS_NO_SESSION_TYPE	0x09
5482314Smcneal #define	ISCSI_LOGIN_STATUS_NO_SESSION		0x0a
5492314Smcneal #define	ISCSI_LOGIN_STATUS_INVALID_REQUEST	0x0b
5502314Smcneal 
5512314Smcneal /* Class-3 (Target Error) */
5522314Smcneal #define	ISCSI_LOGIN_STATUS_TARGET_ERROR		0x00
5532314Smcneal #define	ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE	0x01
5542314Smcneal #define	ISCSI_LOGIN_STATUS_NO_RESOURCES		0x02
5552314Smcneal 
5562314Smcneal /* Logout Header */
5572314Smcneal typedef struct _iscsi_logout_hdr {
5582314Smcneal 	uint8_t opcode;
5592314Smcneal 	uint8_t flags;
5602314Smcneal 	uint8_t rsvd1[2];
5612314Smcneal 	uint8_t hlength;
5622314Smcneal 	uint8_t dlength[3];
5632314Smcneal 	uint8_t rsvd2[8];
5642314Smcneal 	uint32_t itt;	/* Initiator Task Tag */
5652314Smcneal 	uint16_t cid;
5662314Smcneal 	uint8_t rsvd3[2];
5672314Smcneal 	uint32_t cmdsn;
5682314Smcneal 	uint32_t expstatsn;
5692314Smcneal 	uint8_t rsvd4[16];
5702314Smcneal } iscsi_logout_hdr_t;
5712314Smcneal 
5722314Smcneal /* Logout PDU flags */
5732314Smcneal #define	ISCSI_FLAG_LOGOUT_REASON_MASK		0x7F
5742314Smcneal 
5752314Smcneal /* logout reason_code values */
5762314Smcneal 
5772314Smcneal #define	ISCSI_LOGOUT_REASON_CLOSE_SESSION	0
5782314Smcneal #define	ISCSI_LOGOUT_REASON_CLOSE_CONNECTION	1
5792314Smcneal #define	ISCSI_LOGOUT_REASON_RECOVERY		2
5802314Smcneal #define	ISCSI_LOGOUT_REASON_AEN_REQUEST		3
5812314Smcneal 
5822314Smcneal /* Logout Response Header */
5832314Smcneal typedef struct _iscsi_logout_rsp_hdr {
5842314Smcneal 	uint8_t opcode;
5852314Smcneal 	uint8_t flags;
5862314Smcneal 	uint8_t response;	/* see Logout response values below */
5872314Smcneal 	uint8_t rsvd2;
5882314Smcneal 	uint8_t hlength;
5892314Smcneal 	uint8_t dlength[3];
5902314Smcneal 	uint8_t rsvd3[8];
5912314Smcneal 	uint32_t itt;	/* Initiator Task Tag */
5922314Smcneal 	uint32_t rsvd4;
5932314Smcneal 	uint32_t statsn;
5942314Smcneal 	uint32_t expcmdsn;
5952314Smcneal 	uint32_t maxcmdsn;
5962314Smcneal 	uint32_t rsvd5;
5972314Smcneal 	uint16_t t2wait;
5982314Smcneal 	uint16_t t2retain;
5992314Smcneal 	uint32_t rsvd6;
6002314Smcneal } iscsi_logout_rsp_hdr_t;
6012314Smcneal 
6022314Smcneal /* logout response status values */
6032314Smcneal 
6042314Smcneal #define	ISCSI_LOGOUT_SUCCESS		  0
6052314Smcneal #define	ISCSI_LOGOUT_CID_NOT_FOUND	  1
6062314Smcneal #define	ISCSI_LOGOUT_RECOVERY_UNSUPPORTED 2
6072314Smcneal #define	ISCSI_LOGOUT_CLEANUP_FAILED	  3
6082314Smcneal 
6092314Smcneal 
6102314Smcneal /* SNACK Header */
6112314Smcneal typedef struct _iscsi_snack_hdr {
6122314Smcneal 	uint8_t opcode;
6132314Smcneal 	uint8_t flags;
6142314Smcneal 	uint8_t rsvd2[14];
6152314Smcneal 	uint32_t itt;
6162314Smcneal 	uint32_t begrun;
6172314Smcneal 	uint32_t runlength;
6182314Smcneal 	uint32_t expstatsn;
6192314Smcneal 	uint32_t rsvd3;
6202314Smcneal 	uint32_t expdatasn;
6212314Smcneal 	uint8_t rsvd6[8];
6222314Smcneal } iscsi_snack_hdr_t;
6232314Smcneal 
6242314Smcneal /* SNACK PDU flags */
6252314Smcneal #define	ISCSI_FLAG_SNACK_TYPE_MASK	0x0F	/* 4 bits */
6262314Smcneal 
6272314Smcneal /* Reject Message Header */
6282314Smcneal typedef struct _iscsi_reject_rsp_hdr {
6292314Smcneal 	uint8_t opcode;
6302314Smcneal 	uint8_t flags;
6312314Smcneal 	uint8_t reason;
6322314Smcneal 	uint8_t rsvd2;
6332314Smcneal 	uint8_t rsvd3;
6342314Smcneal 	uint8_t dlength[3];
6357978SPeter.Dunlap@Sun.COM 	uint8_t rsvd4[8];
6367978SPeter.Dunlap@Sun.COM 	uint8_t	must_be_ff[4];
6377978SPeter.Dunlap@Sun.COM 	uint8_t	rsvd4a[4];
6382314Smcneal 	uint32_t statsn;
6392314Smcneal 	uint32_t expcmdsn;
6402314Smcneal 	uint32_t maxcmdsn;
6412314Smcneal 	uint32_t datasn;
6422314Smcneal 	uint8_t rsvd5[8];
6432314Smcneal 	/*
6442314Smcneal 	 * Text - Rejected hdr
6452314Smcneal 	 */
6462314Smcneal } iscsi_reject_rsp_hdr_t;
6472314Smcneal 
6482314Smcneal /* Reason for Reject */
6492314Smcneal #define	ISCSI_REJECT_CMD_BEFORE_LOGIN		1
6502314Smcneal #define	ISCSI_REJECT_DATA_DIGEST_ERROR		2
6512314Smcneal #define	ISCSI_REJECT_SNACK_REJECT		3
6522314Smcneal #define	ISCSI_REJECT_PROTOCOL_ERROR		4
6532314Smcneal #define	ISCSI_REJECT_CMD_NOT_SUPPORTED		5
6542314Smcneal #define	ISCSI_REJECT_IMM_CMD_REJECT		6
6552314Smcneal #define	ISCSI_REJECT_TASK_IN_PROGRESS		7
6562314Smcneal #define	ISCSI_REJECT_INVALID_DATA_ACK		8
6572314Smcneal #define	ISCSI_REJECT_INVALID_PDU_FIELD		9
6582314Smcneal #define	ISCSI_REJECT_LONG_OPERATION_REJECT	10
6592314Smcneal #define	ISCSI_REJECT_NEGOTIATION_RESET		11
6602314Smcneal #define	ISCSI_REJECT_WAITING_FOR_LOGOUT		12
6612314Smcneal 
6622314Smcneal /* Defaults as defined by the iSCSI specification */
6632314Smcneal #define	ISCSI_DEFAULT_IMMEDIATE_DATA		TRUE
6642314Smcneal #define	ISCSI_DEFAULT_INITIALR2T		TRUE
6652314Smcneal #define	ISCSI_DEFAULT_FIRST_BURST_LENGTH	(64 * 1024) /* 64kbytes */
6662314Smcneal #define	ISCSI_DEFAULT_MAX_BURST_LENGTH		(256 * 1024) /* 256kbytes */
6672314Smcneal #define	ISCSI_DEFAULT_DATA_PDU_IN_ORDER		TRUE
6682314Smcneal #define	ISCSI_DEFAULT_DATA_SEQUENCE_IN_ORDER	TRUE
6692314Smcneal #define	ISCSI_DEFAULT_TIME_TO_WAIT		2 /* 2 seconds */
6702314Smcneal #define	ISCSI_DEFAULT_TIME_TO_RETAIN		20 /* 20 seconds */
6712314Smcneal #define	ISCSI_DEFAULT_HEADER_DIGEST		ISCSI_DIGEST_NONE
6722314Smcneal #define	ISCSI_DEFAULT_DATA_DIGEST		ISCSI_DIGEST_NONE
6738656SPeter.Dunlap@Sun.COM #define	ISCSI_DEFAULT_MAX_RECV_SEG_LEN		(8 * 1024)
6742314Smcneal #define	ISCSI_DEFAULT_MAX_XMIT_SEG_LEN		(8 * 1024)
6752314Smcneal #define	ISCSI_DEFAULT_MAX_CONNECTIONS		1
6762314Smcneal #define	ISCSI_DEFAULT_MAX_OUT_R2T		1
6772314Smcneal #define	ISCSI_DEFAULT_ERROR_RECOVERY_LEVEL	0
6782314Smcneal #define	ISCSI_DEFAULT_IFMARKER			FALSE
6792314Smcneal #define	ISCSI_DEFAULT_OFMARKER			FALSE
6802314Smcneal 
6812314Smcneal /*
6827978SPeter.Dunlap@Sun.COM  * Minimum values from the iSCSI specification
6837978SPeter.Dunlap@Sun.COM  */
6847978SPeter.Dunlap@Sun.COM 
6857978SPeter.Dunlap@Sun.COM #define	ISCSI_MIN_TIME2RETAIN			0
6867978SPeter.Dunlap@Sun.COM #define	ISCSI_MIN_TIME2WAIT			0
6877978SPeter.Dunlap@Sun.COM #define	ISCSI_MIN_ERROR_RECOVERY_LEVEL		0
6887978SPeter.Dunlap@Sun.COM #define	ISCSI_MIN_RECV_DATA_SEGMENT_LENGTH	0x200
6897978SPeter.Dunlap@Sun.COM #define	ISCSI_MIN_FIRST_BURST_LENGTH		0x200
6907978SPeter.Dunlap@Sun.COM #define	ISCSI_MIN_MAX_BURST_LENGTH		0x200
6917978SPeter.Dunlap@Sun.COM #define	ISCSI_MIN_CONNECTIONS			1
6927978SPeter.Dunlap@Sun.COM #define	ISCSI_MIN_MAX_OUTSTANDING_R2T		1
6937978SPeter.Dunlap@Sun.COM 
6947978SPeter.Dunlap@Sun.COM /*
6952314Smcneal  * Maximum values from the iSCSI specification
6962314Smcneal  */
6972314Smcneal #define	ISCSI_MAX_HEADER_DIGEST			3
6982314Smcneal #define	ISCSI_MAX_DATA_DIGEST			3
6992314Smcneal #define	ISCSI_MAX_TIME2RETAIN			3600
7002314Smcneal #define	ISCSI_MAX_TIME2WAIT			3600
7012314Smcneal #define	ISCSI_MAX_ERROR_RECOVERY_LEVEL		2
7022314Smcneal #define	ISCSI_MAX_FIRST_BURST_LENGTH		0xffffff
7032314Smcneal #define	ISCSI_MAX_BURST_LENGTH			0xffffff
7042314Smcneal #define	ISCSI_MAX_CONNECTIONS			65535
7052314Smcneal #define	ISCSI_MAX_OUTSTANDING_R2T		65535
7062314Smcneal #define	ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH	0xffffff
7072314Smcneal #define	ISCSI_MAX_TPGT_VALUE			65535 /* 16 bit numeric */
7082314Smcneal 
7092314Smcneal /*
7102314Smcneal  * iqn and eui name prefixes and related defines
7112314Smcneal  */
7122314Smcneal #define	ISCSI_IQN_NAME_PREFIX			"iqn"
7132314Smcneal #define	ISCSI_EUI_NAME_PREFIX			"eui"
7142314Smcneal #define	ISCSI_EUI_NAME_LEN			20 /* eui. plus 16 octets */
7152314Smcneal 
7162314Smcneal #ifdef __cplusplus
7172314Smcneal }
7182314Smcneal #endif
7192314Smcneal 
7202314Smcneal #endif /* _ISCSI_PROTOCOL_H */
721