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