Home | History | Annotate | Download | only in sys
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef _ISCSI_PROTOCOL_H
     27 #define	_ISCSI_PROTOCOL_H
     28 
     29 #ifdef __cplusplus
     30 extern "C" {
     31 #endif
     32 
     33 /*
     34  * iSCSI connection daemon
     35  * Copyright (C) 2001 Cisco Systems, Inc.
     36  * All rights reserved.
     37  *
     38  * This file sets up definitions of messages and constants used by the
     39  * iSCSI protocol.
     40  *
     41  */
     42 
     43 #include <sys/types.h>
     44 #include <sys/isa_defs.h>
     45 
     46 #define	ISCSI_MAX_NAME_LEN	224
     47 
     48 /* iSCSI listen port for incoming connections */
     49 #define	ISCSI_LISTEN_PORT 3260
     50 
     51 /* assumes a pointer to a 3-byte array */
     52 #define	ntoh24(p) (((p)[0] << 16) | ((p)[1] << 8) | ((p)[2]))
     53 
     54 /* assumes a pointer to a 3 byte array, and an integer value */
     55 #define	hton24(p, v) {\
     56 	p[0] = (((v) >> 16) & 0xFF); \
     57 	p[1] = (((v) >> 8) & 0xFF); \
     58 	p[2] = ((v) & 0xFF); \
     59 }
     60 
     61 
     62 /* for Login min, max, active version fields */
     63 #define	ISCSI_MIN_VERSION	0x00
     64 #define	ISCSI_DRAFT8_VERSION    0x02
     65 #define	ISCSI_DRAFT20_VERSION   0x00
     66 #define	ISCSI_MAX_VERSION	0x02
     67 
     68 /* Min. and Max. length of a PDU we can support */
     69 #define	ISCSI_MIN_PDU_LENGTH	(8 << 9)	/* 4KB */
     70 #define	ISCSI_MAX_PDU_LENGTH	(0xffffffff)	/* Huge */
     71 
     72 /* Padding word length */
     73 #define	ISCSI_PAD_WORD_LEN		4
     74 
     75 /* Max. number of Key=Value pairs in a text message */
     76 #define	ISCSI_MAX_KEY_VALUE_PAIRS	8192
     77 
     78 /* text separtor between key value pairs exhanged in login */
     79 #define	ISCSI_TEXT_SEPARATOR	'='
     80 
     81 /* reserved text constants for Text Mode Negotiation */
     82 #define	ISCSI_TEXT_NONE			"None"
     83 #define	ISCSI_TEXT_REJECT		"Reject"
     84 #define	ISCSI_TEXT_IRRELEVANT		"Irrelevant"
     85 #define	ISCSI_TEXT_NOTUNDERSTOOD	"NotUnderstood"
     86 
     87 /* Reserved value for initiator/target task tag */
     88 #define	ISCSI_RSVD_TASK_TAG	0xffffffff
     89 
     90 /* maximum length for text keys/values */
     91 #define	KEY_MAXLEN 64
     92 #define	VALUE_MAXLEN 255
     93 #define	TARGET_NAME_MAXLEN    VALUE_MAXLEN
     94 
     95 /* most PDU types have a final bit */
     96 #define	ISCSI_FLAG_FINAL		0x80
     97 
     98 /*
     99  * Strings used during SendTargets requests
    100  */
    101 #define	ISCSI_TEXT_SEPARATOR	'='
    102 #define	TARGETNAME "TargetName="
    103 #define	TARGETADDRESS "TargetAddress="
    104 
    105 /* iSCSI Template Message Header */
    106 typedef struct _iscsi_hdr {
    107 	uint8_t opcode;
    108 	uint8_t flags;	/* Final bit */
    109 	uint8_t rsvd2[2];
    110 	uint8_t hlength;	/* AHSs total length */
    111 	uint8_t dlength[3];	/* Data length */
    112 	uint8_t lun[8];
    113 	uint32_t itt;	/* Initiator Task Tag */
    114 	uint8_t		rsvd3[8];
    115 	uint32_t	expstatsn;
    116 	uint8_t		other[16];
    117 } iscsi_hdr_t;
    118 
    119 typedef struct _iscsi_rsp_hdr {
    120 	uint8_t		opcode;
    121 	uint8_t		flags;
    122 	uint8_t		rsvd1[3];
    123 	uint8_t		dlength[3];
    124 	uint8_t		rsvd2[8];
    125 	uint32_t	itt;
    126 	uint8_t		rsvd3[4];
    127 	uint32_t	statsn;
    128 	uint32_t	expcmdsn;
    129 	uint32_t	maxcmdsn;
    130 	uint8_t		rsvd4[12];
    131 } iscsi_rsp_hdr_t;
    132 
    133 /* Opcode encoding bits */
    134 #define	ISCSI_OP_RETRY			0x80
    135 #define	ISCSI_OP_IMMEDIATE		0x40
    136 #define	ISCSI_OPCODE_MASK		0x3F
    137 
    138 /* Client to Server Message Opcode values */
    139 #define	ISCSI_OP_NOOP_OUT		0x00
    140 #define	ISCSI_OP_SCSI_CMD		0x01
    141 #define	ISCSI_OP_SCSI_TASK_MGT_MSG	0x02
    142 #define	ISCSI_OP_LOGIN_CMD		0x03
    143 #define	ISCSI_OP_TEXT_CMD		0x04
    144 #define	ISCSI_OP_SCSI_DATA		0x05
    145 #define	ISCSI_OP_LOGOUT_CMD		0x06
    146 #define	ISCSI_OP_SNACK_CMD		0x10
    147 
    148 /* Server to Client Message Opcode values */
    149 #define	ISCSI_OP_NOOP_IN		0x20
    150 #define	ISCSI_OP_SCSI_RSP		0x21
    151 #define	ISCSI_OP_SCSI_TASK_MGT_RSP	0x22
    152 #define	ISCSI_OP_LOGIN_RSP		0x23
    153 #define	ISCSI_OP_TEXT_RSP		0x24
    154 #define	ISCSI_OP_SCSI_DATA_RSP		0x25
    155 #define	ISCSI_OP_LOGOUT_RSP		0x26
    156 #define	ISCSI_OP_RTT_RSP		0x31
    157 #define	ISCSI_OP_ASYNC_EVENT		0x32
    158 #define	ISCSI_OP_REJECT_MSG		0x3f
    159 
    160 
    161 /* SCSI Command Header */
    162 typedef struct _iscsi_scsi_cmd_hdr {
    163 	uint8_t opcode;
    164 	uint8_t flags;
    165 	uint8_t rsvd[2];
    166 	uint8_t hlength;
    167 	uint8_t dlength[3];
    168 	uint8_t lun[8];
    169 	uint32_t itt;	/* Initiator Task Tag */
    170 	uint32_t data_length;
    171 	uint32_t cmdsn;
    172 	uint32_t expstatsn;
    173 	uint8_t scb[16];	/* SCSI Command Block */
    174 	/*
    175 	 * Additional Data (Command Dependent)
    176 	 */
    177 } iscsi_scsi_cmd_hdr_t;
    178 
    179 /* Command PDU flags */
    180 #define	ISCSI_FLAG_CMD_READ		0x40
    181 #define	ISCSI_FLAG_CMD_WRITE		0x20
    182 #define	ISCSI_FLAG_CMD_ATTR_MASK	0x07	/* 3 bits */
    183 
    184 /* SCSI Command Attribute values */
    185 #define	ISCSI_ATTR_UNTAGGED		0
    186 #define	ISCSI_ATTR_SIMPLE		1
    187 #define	ISCSI_ATTR_ORDERED		2
    188 #define	ISCSI_ATTR_HEAD_OF_QUEUE	3
    189 #define	ISCSI_ATTR_ACA			4
    190 
    191 
    192 /* SCSI Response Header */
    193 typedef struct _iscsi_scsi_rsp_hdr {
    194 	uint8_t opcode;
    195 	uint8_t flags;
    196 	uint8_t response;
    197 	uint8_t cmd_status;
    198 	uint8_t hlength;
    199 	uint8_t dlength[3];
    200 	uint8_t rsvd[8];
    201 	uint32_t itt;	/* Initiator Task Tag */
    202 	uint32_t rsvd1;
    203 	uint32_t statsn;
    204 	uint32_t expcmdsn;
    205 	uint32_t maxcmdsn;
    206 	uint32_t expdatasn;
    207 	uint32_t bi_residual_count;
    208 	uint32_t residual_count;
    209 	/*
    210 	 * Response or Sense Data (optional)
    211 	 */
    212 } iscsi_scsi_rsp_hdr_t;
    213 
    214 /* 10.2.2.3 - Extended CDB Additional Header Segment */
    215 
    216 typedef struct _iscsi_addl_hdr {
    217 	iscsi_scsi_cmd_hdr_t ahs_isch;
    218 	uint8_t ahs_hlen_hi;
    219 	uint8_t ahs_hlen_lo;
    220 	uint8_t ahs_key;
    221 	uint8_t ahs_resv;
    222 	uint8_t ahs_extscb[4];
    223 } iscsi_addl_hdr_t;
    224 
    225 /* Command Response PDU flags */
    226 #define	ISCSI_FLAG_CMD_BIDI_OVERFLOW	0x10
    227 #define	ISCSI_FLAG_CMD_BIDI_UNDERFLOW	0x08
    228 #define	ISCSI_FLAG_CMD_OVERFLOW		0x04
    229 #define	ISCSI_FLAG_CMD_UNDERFLOW	0x02
    230 
    231 /* iSCSI Status values. Valid if Rsp Selector bit is not set */
    232 #define	ISCSI_STATUS_CMD_COMPLETED	0
    233 #define	ISCSI_STATUS_TARGET_FAILURE	1
    234 #define	ISCSI_STATUS_SUBSYS_FAILURE	2
    235 
    236 
    237 /* Asynchronous Event Header */
    238 typedef struct _iscsi_async_evt_hdr {
    239 	uint8_t opcode;
    240 	uint8_t flags;
    241 	uint8_t rsvd2[2];
    242 	uint8_t rsvd3;
    243 	uint8_t dlength[3];
    244 	uint8_t lun[8];
    245 	uint8_t rsvd4[8];
    246 	uint32_t statsn;
    247 	uint32_t expcmdsn;
    248 	uint32_t maxcmdsn;
    249 	uint8_t async_event;
    250 	uint8_t async_vcode;
    251 	uint16_t param1;
    252 	uint16_t param2;
    253 	uint16_t param3;
    254 	uint8_t rsvd5[4];
    255 } iscsi_async_evt_hdr_t;
    256 
    257 /* iSCSI Event Indicator values */
    258 #define	ISCSI_ASYNC_EVENT_SCSI_EVENT			0
    259 #define	ISCSI_ASYNC_EVENT_REQUEST_LOGOUT		1
    260 #define	ISCSI_ASYNC_EVENT_DROPPING_CONNECTION		2
    261 #define	ISCSI_ASYNC_EVENT_DROPPING_ALL_CONNECTIONS	3
    262 #define	ISCSI_ASYNC_EVENT_PARAM_NEGOTIATION		4
    263 #define	ISCSI_ASYNC_EVENT_VENDOR_SPECIFIC		255
    264 
    265 
    266 /* NOP-Out Message */
    267 typedef struct _iscsi_nop_out_hdr {
    268 	uint8_t opcode;
    269 	uint8_t flags;
    270 	uint16_t rsvd2;
    271 	uint8_t rsvd3;
    272 	uint8_t dlength[3];
    273 	uint8_t lun[8];
    274 	uint32_t itt;	/* Initiator Task Tag */
    275 	uint32_t ttt;	/* Target Transfer Tag */
    276 	uint32_t cmdsn;
    277 	uint32_t expstatsn;
    278 	uint8_t rsvd4[16];
    279 } iscsi_nop_out_hdr_t;
    280 
    281 
    282 /* NOP-In Message */
    283 typedef struct _iscsi_nop_in_hdr {
    284 	uint8_t opcode;
    285 	uint8_t flags;
    286 	uint16_t rsvd2;
    287 	uint8_t rsvd3;
    288 	uint8_t dlength[3];
    289 	uint8_t lun[8];
    290 	uint32_t itt;	/* Initiator Task Tag */
    291 	uint32_t ttt;	/* Target Transfer Tag */
    292 	uint32_t statsn;
    293 	uint32_t expcmdsn;
    294 	uint32_t maxcmdsn;
    295 	uint8_t rsvd4[12];
    296 } iscsi_nop_in_hdr_t;
    297 
    298 /* SCSI Task Management Message Header */
    299 typedef struct _iscsi_scsi_task_mgt_hdr {
    300 	uint8_t opcode;
    301 	uint8_t function;
    302 	uint8_t rsvd1[2];
    303 	uint8_t hlength;
    304 	uint8_t dlength[3];
    305 	uint8_t lun[8];
    306 	uint32_t itt;	/* Initiator Task Tag */
    307 	uint32_t rtt;	/* Reference Task Tag */
    308 	uint32_t cmdsn;
    309 	uint32_t expstatsn;
    310 	uint32_t refcmdsn;
    311 	uint32_t expdatasn;
    312 	uint8_t rsvd2[8];
    313 } iscsi_scsi_task_mgt_hdr_t;
    314 
    315 #define	ISCSI_FLAG_TASK_MGMT_FUNCTION_MASK  0x7F
    316 
    317 /* Function values */
    318 #define	ISCSI_TM_FUNC_ABORT_TASK		1
    319 #define	ISCSI_TM_FUNC_ABORT_TASK_SET		2
    320 #define	ISCSI_TM_FUNC_CLEAR_ACA			3
    321 #define	ISCSI_TM_FUNC_CLEAR_TASK_SET		4
    322 #define	ISCSI_TM_FUNC_LOGICAL_UNIT_RESET	5
    323 #define	ISCSI_TM_FUNC_TARGET_WARM_RESET		6
    324 #define	ISCSI_TM_FUNC_TARGET_COLD_RESET		7
    325 #define	ISCSI_TM_FUNC_TASK_REASSIGN		8
    326 
    327 
    328 /* SCSI Task Management Response Header */
    329 typedef struct _iscsi_scsi_task_mgt_rsp_hdr {
    330 	uint8_t opcode;
    331 	uint8_t flags;
    332 	uint8_t response;	/* see Response values below */
    333 	uint8_t qualifier;
    334 	uint8_t hlength;
    335 	uint8_t dlength[3];
    336 	uint8_t rsvd2[8];
    337 	uint32_t itt;	/* Initiator Task Tag */
    338 	uint32_t rtt;	/* Reference Task Tag */
    339 	uint32_t statsn;
    340 	uint32_t expcmdsn;
    341 	uint32_t maxcmdsn;
    342 	uint8_t rsvd3[12];
    343 } iscsi_scsi_task_mgt_rsp_hdr_t;
    344 
    345 
    346 /* Response values */
    347 #define	SCSI_TCP_TM_RESP_COMPLETE	0x00
    348 #define	SCSI_TCP_TM_RESP_NO_TASK	0x01
    349 #define	SCSI_TCP_TM_RESP_NO_LUN		0x02
    350 #define	SCSI_TCP_TM_RESP_TASK_ALLEGIANT	0x03
    351 #define	SCSI_TCP_TM_RESP_NO_ALLG_REASSN	0x04
    352 #define	SCSI_TCP_TM_RESP_FUNC_NOT_SUPP	0x05
    353 #define	SCSI_TCP_TM_RESP_FUNC_AUTH_FAIL	0x06
    354 #define	SCSI_TCP_TM_RESP_REJECTED	0xff
    355 
    356 /*
    357  * Maintained for backward compatibility.
    358  */
    359 
    360 #define	SCSI_TCP_TM_RESP_NO_FAILOVER	SCSI_TCP_TM_RESP_NO_ALLG_REASSN
    361 #define	SCSI_TCP_TM_RESP_IN_PRGRESS	SCSI_TCP_TM_RESP_FUNC_NOT_SUPP
    362 
    363 /* Ready To Transfer Header */
    364 typedef struct _iscsi_rtt_hdr {
    365 	uint8_t opcode;
    366 	uint8_t flags;
    367 	uint8_t rsvd2[2];
    368 	uint8_t rsvd3[12];
    369 	uint32_t itt;	/* Initiator Task Tag */
    370 	uint32_t ttt;	/* Target Transfer Tag */
    371 	uint32_t statsn;
    372 	uint32_t expcmdsn;
    373 	uint32_t maxcmdsn;
    374 	uint32_t rttsn;
    375 	uint32_t data_offset;
    376 	uint32_t data_length;
    377 } iscsi_rtt_hdr_t;
    378 
    379 
    380 /* SCSI Data Hdr */
    381 typedef struct _iscsi_data_hdr {
    382 	uint8_t opcode;
    383 	uint8_t flags;
    384 	uint8_t rsvd2[2];
    385 	uint8_t rsvd3;
    386 	uint8_t dlength[3];
    387 	uint8_t lun[8];
    388 	uint32_t itt;
    389 	uint32_t ttt;
    390 	uint32_t rsvd4;
    391 	uint32_t expstatsn;
    392 	uint32_t rsvd5;
    393 	uint32_t datasn;
    394 	uint32_t offset;
    395 	uint32_t rsvd6;
    396 	/*
    397 	 * Payload
    398 	 */
    399 } iscsi_data_hdr_t;
    400 
    401 /* SCSI Data Response Hdr */
    402 typedef struct _iscsi_data_rsp_hdr {
    403 	uint8_t opcode;
    404 	uint8_t flags;
    405 	uint8_t rsvd2;
    406 	uint8_t cmd_status;
    407 	uint8_t hlength;
    408 	uint8_t dlength[3];
    409 	uint8_t lun[8];
    410 	uint32_t itt;
    411 	uint32_t ttt;
    412 	uint32_t statsn;
    413 	uint32_t expcmdsn;
    414 	uint32_t maxcmdsn;
    415 	uint32_t datasn;
    416 	uint32_t offset;
    417 	uint32_t residual_count;
    418 } iscsi_data_rsp_hdr_t;
    419 
    420 /* Data Response PDU flags */
    421 #define	ISCSI_FLAG_DATA_ACK		0x40
    422 #define	ISCSI_FLAG_DATA_OVERFLOW	0x04
    423 #define	ISCSI_FLAG_DATA_UNDERFLOW	0x02
    424 #define	ISCSI_FLAG_DATA_STATUS		0x01
    425 
    426 
    427 /* Text Header */
    428 typedef struct _iscsi_text_hdr {
    429 	uint8_t opcode;
    430 	uint8_t flags;
    431 	uint8_t rsvd2[2];
    432 	uint8_t hlength;
    433 	uint8_t dlength[3];
    434 	uint8_t rsvd4[8];
    435 	uint32_t itt;
    436 	uint32_t ttt;
    437 	uint32_t cmdsn;
    438 	uint32_t expstatsn;
    439 	uint8_t rsvd5[16];
    440 	/*
    441 	 * Text - key=value pairs
    442 	 */
    443 } iscsi_text_hdr_t;
    444 
    445 #define	ISCSI_FLAG_TEXT_CONTINUE	0x40
    446 
    447 /* Text Response Header */
    448 typedef struct _iscsi_text_rsp_hdr {
    449 	uint8_t opcode;
    450 	uint8_t flags;
    451 	uint8_t rsvd2[2];
    452 	uint8_t hlength;
    453 	uint8_t dlength[3];
    454 	uint8_t rsvd4[8];
    455 	uint32_t itt;
    456 	uint32_t ttt;
    457 	uint32_t statsn;
    458 	uint32_t expcmdsn;
    459 	uint32_t maxcmdsn;
    460 	uint8_t rsvd5[12];
    461 	/*
    462 	 * Text Response - key:value pairs
    463 	 */
    464 } iscsi_text_rsp_hdr_t;
    465 
    466 #define	ISCSI_ISID_LEN	6
    467 
    468 /* Login Header */
    469 typedef struct _iscsi_login_hdr {
    470 	uint8_t opcode;
    471 	uint8_t flags;
    472 	uint8_t max_version;	/* Max. version supported */
    473 	uint8_t min_version;	/* Min. version supported */
    474 	uint8_t hlength;
    475 	uint8_t dlength[3];
    476 	uint8_t isid[ISCSI_ISID_LEN];	/* Initiator Session ID */
    477 	uint16_t tsid;	/* Target Session ID */
    478 	uint32_t itt;	/* Initiator Task Tag */
    479 	uint16_t cid;
    480 	uint16_t rsvd3;
    481 	uint32_t cmdsn;
    482 	uint32_t expstatsn;
    483 	uint8_t rsvd5[16];
    484 } iscsi_login_hdr_t;
    485 
    486 /* Login PDU flags */
    487 #define	ISCSI_FLAG_LOGIN_TRANSIT		0x80
    488 #define	ISCSI_FLAG_LOGIN_CONTINUE		0x40
    489 #define	ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK	0x0C	/* 2 bits */
    490 #define	ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK	0x03	/* 2 bits */
    491 
    492 #define	ISCSI_LOGIN_CURRENT_STAGE(flags) \
    493 	((flags & ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK) >> 2)
    494 #define	ISCSI_LOGIN_NEXT_STAGE(flags) \
    495 	(flags & ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK)
    496 
    497 
    498 /* Login Response Header */
    499 typedef struct _iscsi_login_rsp_hdr {
    500 	uint8_t opcode;
    501 	uint8_t flags;
    502 	uint8_t max_version;	/* Max. version supported */
    503 	uint8_t active_version;	/* Active version */
    504 	uint8_t hlength;
    505 	uint8_t dlength[3];
    506 	uint8_t isid[ISCSI_ISID_LEN];	/* Initiator Session ID */
    507 	uint16_t tsid;	/* Target Session ID */
    508 	uint32_t itt;	/* Initiator Task Tag */
    509 	uint32_t rsvd3;
    510 	uint32_t statsn;
    511 	uint32_t expcmdsn;
    512 	uint32_t maxcmdsn;
    513 	uint8_t status_class;	/* see Login RSP ststus classes below */
    514 	uint8_t status_detail;	/* see Login RSP Status details below */
    515 	uint8_t rsvd4[10];
    516 } iscsi_login_rsp_hdr_t;
    517 
    518 /* Login stage (phase) codes for CSG, NSG */
    519 #define	ISCSI_SECURITY_NEGOTIATION_STAGE	0
    520 #define	ISCSI_OP_PARMS_NEGOTIATION_STAGE	1
    521 #define	ISCSI_FULL_FEATURE_PHASE		3
    522 
    523 /* Login Status response classes */
    524 #define	ISCSI_STATUS_CLASS_SUCCESS		0x00
    525 #define	ISCSI_STATUS_CLASS_REDIRECT		0x01
    526 #define	ISCSI_STATUS_CLASS_INITIATOR_ERR	0x02
    527 #define	ISCSI_STATUS_CLASS_TARGET_ERR		0x03
    528 
    529 /* Login Status response detail codes */
    530 /* Class-0 (Success) */
    531 #define	ISCSI_LOGIN_STATUS_ACCEPT		0x00
    532 
    533 /* Class-1 (Redirection) */
    534 #define	ISCSI_LOGIN_STATUS_TGT_MOVED_TEMP	0x01
    535 #define	ISCSI_LOGIN_STATUS_TGT_MOVED_PERM	0x02
    536 
    537 /* Class-2 (Initiator Error) */
    538 #define	ISCSI_LOGIN_STATUS_INIT_ERR		0x00
    539 #define	ISCSI_LOGIN_STATUS_AUTH_FAILED		0x01
    540 #define	ISCSI_LOGIN_STATUS_TGT_FORBIDDEN	0x02
    541 #define	ISCSI_LOGIN_STATUS_TGT_NOT_FOUND	0x03
    542 #define	ISCSI_LOGIN_STATUS_TGT_REMOVED		0x04
    543 #define	ISCSI_LOGIN_STATUS_NO_VERSION		0x05
    544 #define	ISCSI_LOGIN_STATUS_ISID_ERROR		0x06
    545 #define	ISCSI_LOGIN_STATUS_MISSING_FIELDS	0x07
    546 #define	ISCSI_LOGIN_STATUS_CONN_ADD_FAILED	0x08
    547 #define	ISCSI_LOGIN_STATUS_NO_SESSION_TYPE	0x09
    548 #define	ISCSI_LOGIN_STATUS_NO_SESSION		0x0a
    549 #define	ISCSI_LOGIN_STATUS_INVALID_REQUEST	0x0b
    550 
    551 /* Class-3 (Target Error) */
    552 #define	ISCSI_LOGIN_STATUS_TARGET_ERROR		0x00
    553 #define	ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE	0x01
    554 #define	ISCSI_LOGIN_STATUS_NO_RESOURCES		0x02
    555 
    556 /* Logout Header */
    557 typedef struct _iscsi_logout_hdr {
    558 	uint8_t opcode;
    559 	uint8_t flags;
    560 	uint8_t rsvd1[2];
    561 	uint8_t hlength;
    562 	uint8_t dlength[3];
    563 	uint8_t rsvd2[8];
    564 	uint32_t itt;	/* Initiator Task Tag */
    565 	uint16_t cid;
    566 	uint8_t rsvd3[2];
    567 	uint32_t cmdsn;
    568 	uint32_t expstatsn;
    569 	uint8_t rsvd4[16];
    570 } iscsi_logout_hdr_t;
    571 
    572 /* Logout PDU flags */
    573 #define	ISCSI_FLAG_LOGOUT_REASON_MASK		0x7F
    574 
    575 /* logout reason_code values */
    576 
    577 #define	ISCSI_LOGOUT_REASON_CLOSE_SESSION	0
    578 #define	ISCSI_LOGOUT_REASON_CLOSE_CONNECTION	1
    579 #define	ISCSI_LOGOUT_REASON_RECOVERY		2
    580 #define	ISCSI_LOGOUT_REASON_AEN_REQUEST		3
    581 
    582 /* Logout Response Header */
    583 typedef struct _iscsi_logout_rsp_hdr {
    584 	uint8_t opcode;
    585 	uint8_t flags;
    586 	uint8_t response;	/* see Logout response values below */
    587 	uint8_t rsvd2;
    588 	uint8_t hlength;
    589 	uint8_t dlength[3];
    590 	uint8_t rsvd3[8];
    591 	uint32_t itt;	/* Initiator Task Tag */
    592 	uint32_t rsvd4;
    593 	uint32_t statsn;
    594 	uint32_t expcmdsn;
    595 	uint32_t maxcmdsn;
    596 	uint32_t rsvd5;
    597 	uint16_t t2wait;
    598 	uint16_t t2retain;
    599 	uint32_t rsvd6;
    600 } iscsi_logout_rsp_hdr_t;
    601 
    602 /* logout response status values */
    603 
    604 #define	ISCSI_LOGOUT_SUCCESS		  0
    605 #define	ISCSI_LOGOUT_CID_NOT_FOUND	  1
    606 #define	ISCSI_LOGOUT_RECOVERY_UNSUPPORTED 2
    607 #define	ISCSI_LOGOUT_CLEANUP_FAILED	  3
    608 
    609 
    610 /* SNACK Header */
    611 typedef struct _iscsi_snack_hdr {
    612 	uint8_t opcode;
    613 	uint8_t flags;
    614 	uint8_t rsvd2[14];
    615 	uint32_t itt;
    616 	uint32_t begrun;
    617 	uint32_t runlength;
    618 	uint32_t expstatsn;
    619 	uint32_t rsvd3;
    620 	uint32_t expdatasn;
    621 	uint8_t rsvd6[8];
    622 } iscsi_snack_hdr_t;
    623 
    624 /* SNACK PDU flags */
    625 #define	ISCSI_FLAG_SNACK_TYPE_MASK	0x0F	/* 4 bits */
    626 
    627 /* Reject Message Header */
    628 typedef struct _iscsi_reject_rsp_hdr {
    629 	uint8_t opcode;
    630 	uint8_t flags;
    631 	uint8_t reason;
    632 	uint8_t rsvd2;
    633 	uint8_t rsvd3;
    634 	uint8_t dlength[3];
    635 	uint8_t rsvd4[8];
    636 	uint8_t	must_be_ff[4];
    637 	uint8_t	rsvd4a[4];
    638 	uint32_t statsn;
    639 	uint32_t expcmdsn;
    640 	uint32_t maxcmdsn;
    641 	uint32_t datasn;
    642 	uint8_t rsvd5[8];
    643 	/*
    644 	 * Text - Rejected hdr
    645 	 */
    646 } iscsi_reject_rsp_hdr_t;
    647 
    648 /* Reason for Reject */
    649 #define	ISCSI_REJECT_CMD_BEFORE_LOGIN		1
    650 #define	ISCSI_REJECT_DATA_DIGEST_ERROR		2
    651 #define	ISCSI_REJECT_SNACK_REJECT		3
    652 #define	ISCSI_REJECT_PROTOCOL_ERROR		4
    653 #define	ISCSI_REJECT_CMD_NOT_SUPPORTED		5
    654 #define	ISCSI_REJECT_IMM_CMD_REJECT		6
    655 #define	ISCSI_REJECT_TASK_IN_PROGRESS		7
    656 #define	ISCSI_REJECT_INVALID_DATA_ACK		8
    657 #define	ISCSI_REJECT_INVALID_PDU_FIELD		9
    658 #define	ISCSI_REJECT_LONG_OPERATION_REJECT	10
    659 #define	ISCSI_REJECT_NEGOTIATION_RESET		11
    660 #define	ISCSI_REJECT_WAITING_FOR_LOGOUT		12
    661 
    662 /* Defaults as defined by the iSCSI specification */
    663 #define	ISCSI_DEFAULT_IMMEDIATE_DATA		TRUE
    664 #define	ISCSI_DEFAULT_INITIALR2T		TRUE
    665 #define	ISCSI_DEFAULT_FIRST_BURST_LENGTH	(64 * 1024) /* 64kbytes */
    666 #define	ISCSI_DEFAULT_MAX_BURST_LENGTH		(256 * 1024) /* 256kbytes */
    667 #define	ISCSI_DEFAULT_DATA_PDU_IN_ORDER		TRUE
    668 #define	ISCSI_DEFAULT_DATA_SEQUENCE_IN_ORDER	TRUE
    669 #define	ISCSI_DEFAULT_TIME_TO_WAIT		2 /* 2 seconds */
    670 #define	ISCSI_DEFAULT_TIME_TO_RETAIN		20 /* 20 seconds */
    671 #define	ISCSI_DEFAULT_HEADER_DIGEST		ISCSI_DIGEST_NONE
    672 #define	ISCSI_DEFAULT_DATA_DIGEST		ISCSI_DIGEST_NONE
    673 #define	ISCSI_DEFAULT_MAX_RECV_SEG_LEN		(8 * 1024)
    674 #define	ISCSI_DEFAULT_MAX_XMIT_SEG_LEN		(8 * 1024)
    675 #define	ISCSI_DEFAULT_MAX_CONNECTIONS		1
    676 #define	ISCSI_DEFAULT_MAX_OUT_R2T		1
    677 #define	ISCSI_DEFAULT_ERROR_RECOVERY_LEVEL	0
    678 #define	ISCSI_DEFAULT_IFMARKER			FALSE
    679 #define	ISCSI_DEFAULT_OFMARKER			FALSE
    680 
    681 /*
    682  * Minimum values from the iSCSI specification
    683  */
    684 
    685 #define	ISCSI_MIN_TIME2RETAIN			0
    686 #define	ISCSI_MIN_TIME2WAIT			0
    687 #define	ISCSI_MIN_ERROR_RECOVERY_LEVEL		0
    688 #define	ISCSI_MIN_RECV_DATA_SEGMENT_LENGTH	0x200
    689 #define	ISCSI_MIN_FIRST_BURST_LENGTH		0x200
    690 #define	ISCSI_MIN_MAX_BURST_LENGTH		0x200
    691 #define	ISCSI_MIN_CONNECTIONS			1
    692 #define	ISCSI_MIN_MAX_OUTSTANDING_R2T		1
    693 
    694 /*
    695  * Maximum values from the iSCSI specification
    696  */
    697 #define	ISCSI_MAX_HEADER_DIGEST			3
    698 #define	ISCSI_MAX_DATA_DIGEST			3
    699 #define	ISCSI_MAX_TIME2RETAIN			3600
    700 #define	ISCSI_MAX_TIME2WAIT			3600
    701 #define	ISCSI_MAX_ERROR_RECOVERY_LEVEL		2
    702 #define	ISCSI_MAX_FIRST_BURST_LENGTH		0xffffff
    703 #define	ISCSI_MAX_BURST_LENGTH			0xffffff
    704 #define	ISCSI_MAX_CONNECTIONS			65535
    705 #define	ISCSI_MAX_OUTSTANDING_R2T		65535
    706 #define	ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH	0xffffff
    707 #define	ISCSI_MAX_TPGT_VALUE			65535 /* 16 bit numeric */
    708 
    709 /*
    710  * iqn and eui name prefixes and related defines
    711  */
    712 #define	ISCSI_IQN_NAME_PREFIX			"iqn"
    713 #define	ISCSI_EUI_NAME_PREFIX			"eui"
    714 #define	ISCSI_EUI_NAME_LEN			20 /* eui. plus 16 octets */
    715 
    716 #ifdef __cplusplus
    717 }
    718 #endif
    719 
    720 #endif /* _ISCSI_PROTOCOL_H */
    721