139e84790SAlex Aizman /* 239e84790SAlex Aizman * RFC 3720 (iSCSI) protocol data types 339e84790SAlex Aizman * 439e84790SAlex Aizman * Copyright (C) 2005 Dmitry Yusupov 539e84790SAlex Aizman * Copyright (C) 2005 Alex Aizman 639e84790SAlex Aizman * maintained by open-iscsi@googlegroups.com 739e84790SAlex Aizman * 839e84790SAlex Aizman * This program is free software; you can redistribute it and/or modify 939e84790SAlex Aizman * it under the terms of the GNU General Public License as published 1039e84790SAlex Aizman * by the Free Software Foundation; either version 2 of the License, or 1139e84790SAlex Aizman * (at your option) any later version. 1239e84790SAlex Aizman * 1339e84790SAlex Aizman * This program is distributed in the hope that it will be useful, but 1439e84790SAlex Aizman * WITHOUT ANY WARRANTY; without even the implied warranty of 1539e84790SAlex Aizman * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1639e84790SAlex Aizman * General Public License for more details. 1739e84790SAlex Aizman * 1839e84790SAlex Aizman * See the file COPYING included with this distribution for more details. 1939e84790SAlex Aizman */ 2039e84790SAlex Aizman 2139e84790SAlex Aizman #ifndef ISCSI_PROTO_H 2239e84790SAlex Aizman #define ISCSI_PROTO_H 2339e84790SAlex Aizman 2439e84790SAlex Aizman #define ISCSI_VERSION_STR "0.3" 2539e84790SAlex Aizman #define ISCSI_DATE_STR "22-Apr-2005" 2639e84790SAlex Aizman #define ISCSI_DRAFT20_VERSION 0x00 2739e84790SAlex Aizman 2839e84790SAlex Aizman /* default iSCSI listen port for incoming connections */ 2939e84790SAlex Aizman #define ISCSI_LISTEN_PORT 3260 3039e84790SAlex Aizman 3139e84790SAlex Aizman /* Padding word length */ 3239e84790SAlex Aizman #define PAD_WORD_LEN 4 3339e84790SAlex Aizman 3439e84790SAlex Aizman /* 3539e84790SAlex Aizman * useful common(control and data pathes) macro 3639e84790SAlex Aizman */ 3739e84790SAlex Aizman #define ntoh24(p) (((p)[0] << 16) | ((p)[1] << 8) | ((p)[2])) 3839e84790SAlex Aizman #define hton24(p, v) { \ 3939e84790SAlex Aizman p[0] = (((v) >> 16) & 0xFF); \ 4039e84790SAlex Aizman p[1] = (((v) >> 8) & 0xFF); \ 4139e84790SAlex Aizman p[2] = ((v) & 0xFF); \ 4239e84790SAlex Aizman } 4339e84790SAlex Aizman #define zero_data(p) {p[0]=0;p[1]=0;p[2]=0;} 4439e84790SAlex Aizman 4539e84790SAlex Aizman /* 4639e84790SAlex Aizman * iSCSI Template Message Header 4739e84790SAlex Aizman */ 4839e84790SAlex Aizman struct iscsi_hdr { 4939e84790SAlex Aizman uint8_t opcode; 5039e84790SAlex Aizman uint8_t flags; /* Final bit */ 5139e84790SAlex Aizman uint8_t rsvd2[2]; 5239e84790SAlex Aizman uint8_t hlength; /* AHSs total length */ 5339e84790SAlex Aizman uint8_t dlength[3]; /* Data length */ 5439e84790SAlex Aizman uint8_t lun[8]; 5539e84790SAlex Aizman __be32 itt; /* Initiator Task Tag */ 5639e84790SAlex Aizman __be32 ttt; /* Target Task Tag */ 5739e84790SAlex Aizman __be32 statsn; 5839e84790SAlex Aizman __be32 exp_statsn; 59baebc497SMike Christie __be32 max_statsn; 60baebc497SMike Christie uint8_t other[12]; 6139e84790SAlex Aizman }; 6239e84790SAlex Aizman 6339e84790SAlex Aizman /************************* RFC 3720 Begin *****************************/ 6439e84790SAlex Aizman 6539e84790SAlex Aizman #define ISCSI_RESERVED_TAG 0xffffffff 6639e84790SAlex Aizman 6739e84790SAlex Aizman /* Opcode encoding bits */ 6839e84790SAlex Aizman #define ISCSI_OP_RETRY 0x80 6939e84790SAlex Aizman #define ISCSI_OP_IMMEDIATE 0x40 7039e84790SAlex Aizman #define ISCSI_OPCODE_MASK 0x3F 7139e84790SAlex Aizman 7239e84790SAlex Aizman /* Initiator Opcode values */ 7339e84790SAlex Aizman #define ISCSI_OP_NOOP_OUT 0x00 7439e84790SAlex Aizman #define ISCSI_OP_SCSI_CMD 0x01 7539e84790SAlex Aizman #define ISCSI_OP_SCSI_TMFUNC 0x02 7639e84790SAlex Aizman #define ISCSI_OP_LOGIN 0x03 7739e84790SAlex Aizman #define ISCSI_OP_TEXT 0x04 7839e84790SAlex Aizman #define ISCSI_OP_SCSI_DATA_OUT 0x05 7939e84790SAlex Aizman #define ISCSI_OP_LOGOUT 0x06 8039e84790SAlex Aizman #define ISCSI_OP_SNACK 0x10 8139e84790SAlex Aizman 82baebc497SMike Christie #define ISCSI_OP_VENDOR1_CMD 0x1c 83baebc497SMike Christie #define ISCSI_OP_VENDOR2_CMD 0x1d 84baebc497SMike Christie #define ISCSI_OP_VENDOR3_CMD 0x1e 85baebc497SMike Christie #define ISCSI_OP_VENDOR4_CMD 0x1f 86baebc497SMike Christie 8739e84790SAlex Aizman /* Target Opcode values */ 8839e84790SAlex Aizman #define ISCSI_OP_NOOP_IN 0x20 8939e84790SAlex Aizman #define ISCSI_OP_SCSI_CMD_RSP 0x21 9039e84790SAlex Aizman #define ISCSI_OP_SCSI_TMFUNC_RSP 0x22 9139e84790SAlex Aizman #define ISCSI_OP_LOGIN_RSP 0x23 9239e84790SAlex Aizman #define ISCSI_OP_TEXT_RSP 0x24 9339e84790SAlex Aizman #define ISCSI_OP_SCSI_DATA_IN 0x25 9439e84790SAlex Aizman #define ISCSI_OP_LOGOUT_RSP 0x26 9539e84790SAlex Aizman #define ISCSI_OP_R2T 0x31 9639e84790SAlex Aizman #define ISCSI_OP_ASYNC_EVENT 0x32 9739e84790SAlex Aizman #define ISCSI_OP_REJECT 0x3f 9839e84790SAlex Aizman 99baebc497SMike Christie struct iscsi_ahs_hdr { 100baebc497SMike Christie __be16 ahslength; 101baebc497SMike Christie uint8_t ahstype; 102baebc497SMike Christie uint8_t ahspec[5]; 103baebc497SMike Christie }; 104baebc497SMike Christie 105baebc497SMike Christie #define ISCSI_AHSTYPE_CDB 1 106baebc497SMike Christie #define ISCSI_AHSTYPE_RLENGTH 2 107baebc497SMike Christie 10839e84790SAlex Aizman /* iSCSI PDU Header */ 10939e84790SAlex Aizman struct iscsi_cmd { 11039e84790SAlex Aizman uint8_t opcode; 11139e84790SAlex Aizman uint8_t flags; 112baebc497SMike Christie __be16 rsvd2; 11339e84790SAlex Aizman uint8_t hlength; 11439e84790SAlex Aizman uint8_t dlength[3]; 11539e84790SAlex Aizman uint8_t lun[8]; 11639e84790SAlex Aizman __be32 itt; /* Initiator Task Tag */ 11739e84790SAlex Aizman __be32 data_length; 11839e84790SAlex Aizman __be32 cmdsn; 11939e84790SAlex Aizman __be32 exp_statsn; 12039e84790SAlex Aizman uint8_t cdb[16]; /* SCSI Command Block */ 12139e84790SAlex Aizman /* Additional Data (Command Dependent) */ 12239e84790SAlex Aizman }; 12339e84790SAlex Aizman 12439e84790SAlex Aizman /* Command PDU flags */ 12539e84790SAlex Aizman #define ISCSI_FLAG_CMD_FINAL 0x80 12639e84790SAlex Aizman #define ISCSI_FLAG_CMD_READ 0x40 12739e84790SAlex Aizman #define ISCSI_FLAG_CMD_WRITE 0x20 12839e84790SAlex Aizman #define ISCSI_FLAG_CMD_ATTR_MASK 0x07 /* 3 bits */ 12939e84790SAlex Aizman 13039e84790SAlex Aizman /* SCSI Command Attribute values */ 13139e84790SAlex Aizman #define ISCSI_ATTR_UNTAGGED 0 13239e84790SAlex Aizman #define ISCSI_ATTR_SIMPLE 1 13339e84790SAlex Aizman #define ISCSI_ATTR_ORDERED 2 13439e84790SAlex Aizman #define ISCSI_ATTR_HEAD_OF_QUEUE 3 13539e84790SAlex Aizman #define ISCSI_ATTR_ACA 4 13639e84790SAlex Aizman 137baebc497SMike Christie struct iscsi_rlength_ahdr { 138baebc497SMike Christie __be16 ahslength; 139baebc497SMike Christie uint8_t ahstype; 140baebc497SMike Christie uint8_t reserved; 141baebc497SMike Christie __be32 read_length; 142baebc497SMike Christie }; 143baebc497SMike Christie 14439e84790SAlex Aizman /* SCSI Response Header */ 14539e84790SAlex Aizman struct iscsi_cmd_rsp { 14639e84790SAlex Aizman uint8_t opcode; 14739e84790SAlex Aizman uint8_t flags; 14839e84790SAlex Aizman uint8_t response; 14939e84790SAlex Aizman uint8_t cmd_status; 15039e84790SAlex Aizman uint8_t hlength; 15139e84790SAlex Aizman uint8_t dlength[3]; 15239e84790SAlex Aizman uint8_t rsvd[8]; 15339e84790SAlex Aizman __be32 itt; /* Initiator Task Tag */ 15439e84790SAlex Aizman __be32 rsvd1; 15539e84790SAlex Aizman __be32 statsn; 15639e84790SAlex Aizman __be32 exp_cmdsn; 15739e84790SAlex Aizman __be32 max_cmdsn; 15839e84790SAlex Aizman __be32 exp_datasn; 15939e84790SAlex Aizman __be32 bi_residual_count; 16039e84790SAlex Aizman __be32 residual_count; 16139e84790SAlex Aizman /* Response or Sense Data (optional) */ 16239e84790SAlex Aizman }; 16339e84790SAlex Aizman 16439e84790SAlex Aizman /* Command Response PDU flags */ 16539e84790SAlex Aizman #define ISCSI_FLAG_CMD_BIDI_OVERFLOW 0x10 16639e84790SAlex Aizman #define ISCSI_FLAG_CMD_BIDI_UNDERFLOW 0x08 16739e84790SAlex Aizman #define ISCSI_FLAG_CMD_OVERFLOW 0x04 16839e84790SAlex Aizman #define ISCSI_FLAG_CMD_UNDERFLOW 0x02 16939e84790SAlex Aizman 17039e84790SAlex Aizman /* iSCSI Status values. Valid if Rsp Selector bit is not set */ 17139e84790SAlex Aizman #define ISCSI_STATUS_CMD_COMPLETED 0 17239e84790SAlex Aizman #define ISCSI_STATUS_TARGET_FAILURE 1 17339e84790SAlex Aizman #define ISCSI_STATUS_SUBSYS_FAILURE 2 17439e84790SAlex Aizman 17539e84790SAlex Aizman /* Asynchronous Event Header */ 17639e84790SAlex Aizman struct iscsi_async { 17739e84790SAlex Aizman uint8_t opcode; 17839e84790SAlex Aizman uint8_t flags; 17939e84790SAlex Aizman uint8_t rsvd2[2]; 18039e84790SAlex Aizman uint8_t rsvd3; 18139e84790SAlex Aizman uint8_t dlength[3]; 18239e84790SAlex Aizman uint8_t lun[8]; 18339e84790SAlex Aizman uint8_t rsvd4[8]; 18439e84790SAlex Aizman __be32 statsn; 18539e84790SAlex Aizman __be32 exp_cmdsn; 18639e84790SAlex Aizman __be32 max_cmdsn; 18739e84790SAlex Aizman uint8_t async_event; 18839e84790SAlex Aizman uint8_t async_vcode; 18939e84790SAlex Aizman __be16 param1; 19039e84790SAlex Aizman __be16 param2; 19139e84790SAlex Aizman __be16 param3; 19239e84790SAlex Aizman uint8_t rsvd5[4]; 19339e84790SAlex Aizman }; 19439e84790SAlex Aizman 19539e84790SAlex Aizman /* iSCSI Event Codes */ 19639e84790SAlex Aizman #define ISCSI_ASYNC_MSG_SCSI_EVENT 0 19739e84790SAlex Aizman #define ISCSI_ASYNC_MSG_REQUEST_LOGOUT 1 19839e84790SAlex Aizman #define ISCSI_ASYNC_MSG_DROPPING_CONNECTION 2 19939e84790SAlex Aizman #define ISCSI_ASYNC_MSG_DROPPING_ALL_CONNECTIONS 3 20039e84790SAlex Aizman #define ISCSI_ASYNC_MSG_PARAM_NEGOTIATION 4 20139e84790SAlex Aizman #define ISCSI_ASYNC_MSG_VENDOR_SPECIFIC 255 20239e84790SAlex Aizman 20339e84790SAlex Aizman /* NOP-Out Message */ 20439e84790SAlex Aizman struct iscsi_nopout { 20539e84790SAlex Aizman uint8_t opcode; 20639e84790SAlex Aizman uint8_t flags; 20739e84790SAlex Aizman __be16 rsvd2; 20839e84790SAlex Aizman uint8_t rsvd3; 20939e84790SAlex Aizman uint8_t dlength[3]; 21039e84790SAlex Aizman uint8_t lun[8]; 21139e84790SAlex Aizman __be32 itt; /* Initiator Task Tag */ 21239e84790SAlex Aizman __be32 ttt; /* Target Transfer Tag */ 21339e84790SAlex Aizman __be32 cmdsn; 21439e84790SAlex Aizman __be32 exp_statsn; 21539e84790SAlex Aizman uint8_t rsvd4[16]; 21639e84790SAlex Aizman }; 21739e84790SAlex Aizman 21839e84790SAlex Aizman /* NOP-In Message */ 21939e84790SAlex Aizman struct iscsi_nopin { 22039e84790SAlex Aizman uint8_t opcode; 22139e84790SAlex Aizman uint8_t flags; 22239e84790SAlex Aizman __be16 rsvd2; 22339e84790SAlex Aizman uint8_t rsvd3; 22439e84790SAlex Aizman uint8_t dlength[3]; 22539e84790SAlex Aizman uint8_t lun[8]; 22639e84790SAlex Aizman __be32 itt; /* Initiator Task Tag */ 22739e84790SAlex Aizman __be32 ttt; /* Target Transfer Tag */ 22839e84790SAlex Aizman __be32 statsn; 22939e84790SAlex Aizman __be32 exp_cmdsn; 23039e84790SAlex Aizman __be32 max_cmdsn; 23139e84790SAlex Aizman uint8_t rsvd4[12]; 23239e84790SAlex Aizman }; 23339e84790SAlex Aizman 23439e84790SAlex Aizman /* SCSI Task Management Message Header */ 23539e84790SAlex Aizman struct iscsi_tm { 23639e84790SAlex Aizman uint8_t opcode; 23739e84790SAlex Aizman uint8_t flags; 23839e84790SAlex Aizman uint8_t rsvd1[2]; 23939e84790SAlex Aizman uint8_t hlength; 24039e84790SAlex Aizman uint8_t dlength[3]; 24139e84790SAlex Aizman uint8_t lun[8]; 24239e84790SAlex Aizman __be32 itt; /* Initiator Task Tag */ 24339e84790SAlex Aizman __be32 rtt; /* Reference Task Tag */ 24439e84790SAlex Aizman __be32 cmdsn; 24539e84790SAlex Aizman __be32 exp_statsn; 24639e84790SAlex Aizman __be32 refcmdsn; 24739e84790SAlex Aizman __be32 exp_datasn; 24839e84790SAlex Aizman uint8_t rsvd2[8]; 24939e84790SAlex Aizman }; 25039e84790SAlex Aizman 251baebc497SMike Christie #define ISCSI_FLAG_TM_FUNC_MASK 0x7F 25239e84790SAlex Aizman 25339e84790SAlex Aizman /* Function values */ 25439e84790SAlex Aizman #define ISCSI_TM_FUNC_ABORT_TASK 1 25539e84790SAlex Aizman #define ISCSI_TM_FUNC_ABORT_TASK_SET 2 25639e84790SAlex Aizman #define ISCSI_TM_FUNC_CLEAR_ACA 3 25739e84790SAlex Aizman #define ISCSI_TM_FUNC_CLEAR_TASK_SET 4 25839e84790SAlex Aizman #define ISCSI_TM_FUNC_LOGICAL_UNIT_RESET 5 25939e84790SAlex Aizman #define ISCSI_TM_FUNC_TARGET_WARM_RESET 6 26039e84790SAlex Aizman #define ISCSI_TM_FUNC_TARGET_COLD_RESET 7 26139e84790SAlex Aizman #define ISCSI_TM_FUNC_TASK_REASSIGN 8 26239e84790SAlex Aizman 26339e84790SAlex Aizman /* SCSI Task Management Response Header */ 26439e84790SAlex Aizman struct iscsi_tm_rsp { 26539e84790SAlex Aizman uint8_t opcode; 26639e84790SAlex Aizman uint8_t flags; 26739e84790SAlex Aizman uint8_t response; /* see Response values below */ 26839e84790SAlex Aizman uint8_t qualifier; 26939e84790SAlex Aizman uint8_t hlength; 27039e84790SAlex Aizman uint8_t dlength[3]; 27139e84790SAlex Aizman uint8_t rsvd2[8]; 27239e84790SAlex Aizman __be32 itt; /* Initiator Task Tag */ 27339e84790SAlex Aizman __be32 rtt; /* Reference Task Tag */ 27439e84790SAlex Aizman __be32 statsn; 27539e84790SAlex Aizman __be32 exp_cmdsn; 27639e84790SAlex Aizman __be32 max_cmdsn; 27739e84790SAlex Aizman uint8_t rsvd3[12]; 27839e84790SAlex Aizman }; 27939e84790SAlex Aizman 28039e84790SAlex Aizman /* Response values */ 281baebc497SMike Christie #define ISCSI_TMF_RSP_COMPLETE 0x00 282baebc497SMike Christie #define ISCSI_TMF_RSP_NO_TASK 0x01 283baebc497SMike Christie #define ISCSI_TMF_RSP_NO_LUN 0x02 284baebc497SMike Christie #define ISCSI_TMF_RSP_TASK_ALLEGIANT 0x03 285baebc497SMike Christie #define ISCSI_TMF_RSP_NO_FAILOVER 0x04 286baebc497SMike Christie #define ISCSI_TMF_RSP_NOT_SUPPORTED 0x05 287baebc497SMike Christie #define ISCSI_TMF_RSP_AUTH_FAILED 0x06 288baebc497SMike Christie #define ISCSI_TMF_RSP_REJECTED 0xff 28939e84790SAlex Aizman 29039e84790SAlex Aizman /* Ready To Transfer Header */ 29139e84790SAlex Aizman struct iscsi_r2t_rsp { 29239e84790SAlex Aizman uint8_t opcode; 29339e84790SAlex Aizman uint8_t flags; 29439e84790SAlex Aizman uint8_t rsvd2[2]; 29539e84790SAlex Aizman uint8_t hlength; 29639e84790SAlex Aizman uint8_t dlength[3]; 29739e84790SAlex Aizman uint8_t lun[8]; 29839e84790SAlex Aizman __be32 itt; /* Initiator Task Tag */ 29939e84790SAlex Aizman __be32 ttt; /* Target Transfer Tag */ 30039e84790SAlex Aizman __be32 statsn; 30139e84790SAlex Aizman __be32 exp_cmdsn; 30239e84790SAlex Aizman __be32 max_cmdsn; 30339e84790SAlex Aizman __be32 r2tsn; 30439e84790SAlex Aizman __be32 data_offset; 30539e84790SAlex Aizman __be32 data_length; 30639e84790SAlex Aizman }; 30739e84790SAlex Aizman 30839e84790SAlex Aizman /* SCSI Data Hdr */ 30939e84790SAlex Aizman struct iscsi_data { 31039e84790SAlex Aizman uint8_t opcode; 31139e84790SAlex Aizman uint8_t flags; 31239e84790SAlex Aizman uint8_t rsvd2[2]; 31339e84790SAlex Aizman uint8_t rsvd3; 31439e84790SAlex Aizman uint8_t dlength[3]; 31539e84790SAlex Aizman uint8_t lun[8]; 31639e84790SAlex Aizman __be32 itt; 31739e84790SAlex Aizman __be32 ttt; 31839e84790SAlex Aizman __be32 rsvd4; 31939e84790SAlex Aizman __be32 exp_statsn; 32039e84790SAlex Aizman __be32 rsvd5; 32139e84790SAlex Aizman __be32 datasn; 32239e84790SAlex Aizman __be32 offset; 32339e84790SAlex Aizman __be32 rsvd6; 32439e84790SAlex Aizman /* Payload */ 32539e84790SAlex Aizman }; 32639e84790SAlex Aizman 32739e84790SAlex Aizman /* SCSI Data Response Hdr */ 32839e84790SAlex Aizman struct iscsi_data_rsp { 32939e84790SAlex Aizman uint8_t opcode; 33039e84790SAlex Aizman uint8_t flags; 33139e84790SAlex Aizman uint8_t rsvd2; 33239e84790SAlex Aizman uint8_t cmd_status; 33339e84790SAlex Aizman uint8_t hlength; 33439e84790SAlex Aizman uint8_t dlength[3]; 33539e84790SAlex Aizman uint8_t lun[8]; 33639e84790SAlex Aizman __be32 itt; 33739e84790SAlex Aizman __be32 ttt; 33839e84790SAlex Aizman __be32 statsn; 33939e84790SAlex Aizman __be32 exp_cmdsn; 34039e84790SAlex Aizman __be32 max_cmdsn; 34139e84790SAlex Aizman __be32 datasn; 34239e84790SAlex Aizman __be32 offset; 34339e84790SAlex Aizman __be32 residual_count; 34439e84790SAlex Aizman }; 34539e84790SAlex Aizman 34639e84790SAlex Aizman /* Data Response PDU flags */ 34739e84790SAlex Aizman #define ISCSI_FLAG_DATA_ACK 0x40 34839e84790SAlex Aizman #define ISCSI_FLAG_DATA_OVERFLOW 0x04 34939e84790SAlex Aizman #define ISCSI_FLAG_DATA_UNDERFLOW 0x02 35039e84790SAlex Aizman #define ISCSI_FLAG_DATA_STATUS 0x01 35139e84790SAlex Aizman 35239e84790SAlex Aizman /* Text Header */ 35339e84790SAlex Aizman struct iscsi_text { 35439e84790SAlex Aizman uint8_t opcode; 35539e84790SAlex Aizman uint8_t flags; 35639e84790SAlex Aizman uint8_t rsvd2[2]; 35739e84790SAlex Aizman uint8_t hlength; 35839e84790SAlex Aizman uint8_t dlength[3]; 35939e84790SAlex Aizman uint8_t rsvd4[8]; 36039e84790SAlex Aizman __be32 itt; 36139e84790SAlex Aizman __be32 ttt; 36239e84790SAlex Aizman __be32 cmdsn; 36339e84790SAlex Aizman __be32 exp_statsn; 36439e84790SAlex Aizman uint8_t rsvd5[16]; 36539e84790SAlex Aizman /* Text - key=value pairs */ 36639e84790SAlex Aizman }; 36739e84790SAlex Aizman 36839e84790SAlex Aizman #define ISCSI_FLAG_TEXT_CONTINUE 0x40 36939e84790SAlex Aizman 37039e84790SAlex Aizman /* Text Response Header */ 37139e84790SAlex Aizman struct iscsi_text_rsp { 37239e84790SAlex Aizman uint8_t opcode; 37339e84790SAlex Aizman uint8_t flags; 37439e84790SAlex Aizman uint8_t rsvd2[2]; 37539e84790SAlex Aizman uint8_t hlength; 37639e84790SAlex Aizman uint8_t dlength[3]; 37739e84790SAlex Aizman uint8_t rsvd4[8]; 37839e84790SAlex Aizman __be32 itt; 37939e84790SAlex Aizman __be32 ttt; 38039e84790SAlex Aizman __be32 statsn; 38139e84790SAlex Aizman __be32 exp_cmdsn; 38239e84790SAlex Aizman __be32 max_cmdsn; 38339e84790SAlex Aizman uint8_t rsvd5[12]; 38439e84790SAlex Aizman /* Text Response - key:value pairs */ 38539e84790SAlex Aizman }; 38639e84790SAlex Aizman 38739e84790SAlex Aizman /* Login Header */ 38839e84790SAlex Aizman struct iscsi_login { 38939e84790SAlex Aizman uint8_t opcode; 39039e84790SAlex Aizman uint8_t flags; 39139e84790SAlex Aizman uint8_t max_version; /* Max. version supported */ 39239e84790SAlex Aizman uint8_t min_version; /* Min. version supported */ 39339e84790SAlex Aizman uint8_t hlength; 39439e84790SAlex Aizman uint8_t dlength[3]; 39539e84790SAlex Aizman uint8_t isid[6]; /* Initiator Session ID */ 39639e84790SAlex Aizman __be16 tsih; /* Target Session Handle */ 39739e84790SAlex Aizman __be32 itt; /* Initiator Task Tag */ 39839e84790SAlex Aizman __be16 cid; 39939e84790SAlex Aizman __be16 rsvd3; 40039e84790SAlex Aizman __be32 cmdsn; 40139e84790SAlex Aizman __be32 exp_statsn; 40239e84790SAlex Aizman uint8_t rsvd5[16]; 40339e84790SAlex Aizman }; 40439e84790SAlex Aizman 40539e84790SAlex Aizman /* Login PDU flags */ 40639e84790SAlex Aizman #define ISCSI_FLAG_LOGIN_TRANSIT 0x80 40739e84790SAlex Aizman #define ISCSI_FLAG_LOGIN_CONTINUE 0x40 40839e84790SAlex Aizman #define ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK 0x0C /* 2 bits */ 40939e84790SAlex Aizman #define ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK 0x03 /* 2 bits */ 41039e84790SAlex Aizman 41139e84790SAlex Aizman #define ISCSI_LOGIN_CURRENT_STAGE(flags) \ 41239e84790SAlex Aizman ((flags & ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK) >> 2) 41339e84790SAlex Aizman #define ISCSI_LOGIN_NEXT_STAGE(flags) \ 41439e84790SAlex Aizman (flags & ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK) 41539e84790SAlex Aizman 41639e84790SAlex Aizman /* Login Response Header */ 41739e84790SAlex Aizman struct iscsi_login_rsp { 41839e84790SAlex Aizman uint8_t opcode; 41939e84790SAlex Aizman uint8_t flags; 42039e84790SAlex Aizman uint8_t max_version; /* Max. version supported */ 42139e84790SAlex Aizman uint8_t active_version; /* Active version */ 42239e84790SAlex Aizman uint8_t hlength; 42339e84790SAlex Aizman uint8_t dlength[3]; 42439e84790SAlex Aizman uint8_t isid[6]; /* Initiator Session ID */ 42539e84790SAlex Aizman __be16 tsih; /* Target Session Handle */ 42639e84790SAlex Aizman __be32 itt; /* Initiator Task Tag */ 42739e84790SAlex Aizman __be32 rsvd3; 42839e84790SAlex Aizman __be32 statsn; 42939e84790SAlex Aizman __be32 exp_cmdsn; 43039e84790SAlex Aizman __be32 max_cmdsn; 43139e84790SAlex Aizman uint8_t status_class; /* see Login RSP ststus classes below */ 43239e84790SAlex Aizman uint8_t status_detail; /* see Login RSP Status details below */ 43339e84790SAlex Aizman uint8_t rsvd4[10]; 43439e84790SAlex Aizman }; 43539e84790SAlex Aizman 43639e84790SAlex Aizman /* Login stage (phase) codes for CSG, NSG */ 43739e84790SAlex Aizman #define ISCSI_INITIAL_LOGIN_STAGE -1 43839e84790SAlex Aizman #define ISCSI_SECURITY_NEGOTIATION_STAGE 0 43939e84790SAlex Aizman #define ISCSI_OP_PARMS_NEGOTIATION_STAGE 1 44039e84790SAlex Aizman #define ISCSI_FULL_FEATURE_PHASE 3 44139e84790SAlex Aizman 44239e84790SAlex Aizman /* Login Status response classes */ 44339e84790SAlex Aizman #define ISCSI_STATUS_CLS_SUCCESS 0x00 44439e84790SAlex Aizman #define ISCSI_STATUS_CLS_REDIRECT 0x01 44539e84790SAlex Aizman #define ISCSI_STATUS_CLS_INITIATOR_ERR 0x02 44639e84790SAlex Aizman #define ISCSI_STATUS_CLS_TARGET_ERR 0x03 44739e84790SAlex Aizman 44839e84790SAlex Aizman /* Login Status response detail codes */ 44939e84790SAlex Aizman /* Class-0 (Success) */ 45039e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_ACCEPT 0x00 45139e84790SAlex Aizman 45239e84790SAlex Aizman /* Class-1 (Redirection) */ 45339e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_TGT_MOVED_TEMP 0x01 45439e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_TGT_MOVED_PERM 0x02 45539e84790SAlex Aizman 45639e84790SAlex Aizman /* Class-2 (Initiator Error) */ 45739e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_INIT_ERR 0x00 45839e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_AUTH_FAILED 0x01 45939e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_TGT_FORBIDDEN 0x02 46039e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_TGT_NOT_FOUND 0x03 46139e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_TGT_REMOVED 0x04 46239e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_NO_VERSION 0x05 46339e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_ISID_ERROR 0x06 46439e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_MISSING_FIELDS 0x07 46539e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_CONN_ADD_FAILED 0x08 46639e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_NO_SESSION_TYPE 0x09 46739e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_NO_SESSION 0x0a 46839e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_INVALID_REQUEST 0x0b 46939e84790SAlex Aizman 47039e84790SAlex Aizman /* Class-3 (Target Error) */ 47139e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_TARGET_ERROR 0x00 47239e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE 0x01 47339e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_NO_RESOURCES 0x02 47439e84790SAlex Aizman 47539e84790SAlex Aizman /* Logout Header */ 47639e84790SAlex Aizman struct iscsi_logout { 47739e84790SAlex Aizman uint8_t opcode; 47839e84790SAlex Aizman uint8_t flags; 47939e84790SAlex Aizman uint8_t rsvd1[2]; 48039e84790SAlex Aizman uint8_t hlength; 48139e84790SAlex Aizman uint8_t dlength[3]; 48239e84790SAlex Aizman uint8_t rsvd2[8]; 48339e84790SAlex Aizman __be32 itt; /* Initiator Task Tag */ 48439e84790SAlex Aizman __be16 cid; 48539e84790SAlex Aizman uint8_t rsvd3[2]; 48639e84790SAlex Aizman __be32 cmdsn; 48739e84790SAlex Aizman __be32 exp_statsn; 48839e84790SAlex Aizman uint8_t rsvd4[16]; 48939e84790SAlex Aizman }; 49039e84790SAlex Aizman 49139e84790SAlex Aizman /* Logout PDU flags */ 49239e84790SAlex Aizman #define ISCSI_FLAG_LOGOUT_REASON_MASK 0x7F 49339e84790SAlex Aizman 49439e84790SAlex Aizman /* logout reason_code values */ 49539e84790SAlex Aizman 49639e84790SAlex Aizman #define ISCSI_LOGOUT_REASON_CLOSE_SESSION 0 49739e84790SAlex Aizman #define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION 1 49839e84790SAlex Aizman #define ISCSI_LOGOUT_REASON_RECOVERY 2 49939e84790SAlex Aizman #define ISCSI_LOGOUT_REASON_AEN_REQUEST 3 50039e84790SAlex Aizman 50139e84790SAlex Aizman /* Logout Response Header */ 50239e84790SAlex Aizman struct iscsi_logout_rsp { 50339e84790SAlex Aizman uint8_t opcode; 50439e84790SAlex Aizman uint8_t flags; 50539e84790SAlex Aizman uint8_t response; /* see Logout response values below */ 50639e84790SAlex Aizman uint8_t rsvd2; 50739e84790SAlex Aizman uint8_t hlength; 50839e84790SAlex Aizman uint8_t dlength[3]; 50939e84790SAlex Aizman uint8_t rsvd3[8]; 51039e84790SAlex Aizman __be32 itt; /* Initiator Task Tag */ 51139e84790SAlex Aizman __be32 rsvd4; 51239e84790SAlex Aizman __be32 statsn; 51339e84790SAlex Aizman __be32 exp_cmdsn; 51439e84790SAlex Aizman __be32 max_cmdsn; 51539e84790SAlex Aizman __be32 rsvd5; 51639e84790SAlex Aizman __be16 t2wait; 51739e84790SAlex Aizman __be16 t2retain; 51839e84790SAlex Aizman __be32 rsvd6; 51939e84790SAlex Aizman }; 52039e84790SAlex Aizman 52139e84790SAlex Aizman /* logout response status values */ 52239e84790SAlex Aizman 52339e84790SAlex Aizman #define ISCSI_LOGOUT_SUCCESS 0 52439e84790SAlex Aizman #define ISCSI_LOGOUT_CID_NOT_FOUND 1 52539e84790SAlex Aizman #define ISCSI_LOGOUT_RECOVERY_UNSUPPORTED 2 52639e84790SAlex Aizman #define ISCSI_LOGOUT_CLEANUP_FAILED 3 52739e84790SAlex Aizman 52839e84790SAlex Aizman /* SNACK Header */ 52939e84790SAlex Aizman struct iscsi_snack { 53039e84790SAlex Aizman uint8_t opcode; 53139e84790SAlex Aizman uint8_t flags; 53239e84790SAlex Aizman uint8_t rsvd2[14]; 53339e84790SAlex Aizman __be32 itt; 53439e84790SAlex Aizman __be32 begrun; 53539e84790SAlex Aizman __be32 runlength; 53639e84790SAlex Aizman __be32 exp_statsn; 53739e84790SAlex Aizman __be32 rsvd3; 53839e84790SAlex Aizman __be32 exp_datasn; 53939e84790SAlex Aizman uint8_t rsvd6[8]; 54039e84790SAlex Aizman }; 54139e84790SAlex Aizman 54239e84790SAlex Aizman /* SNACK PDU flags */ 54339e84790SAlex Aizman #define ISCSI_FLAG_SNACK_TYPE_MASK 0x0F /* 4 bits */ 54439e84790SAlex Aizman 54539e84790SAlex Aizman /* Reject Message Header */ 54639e84790SAlex Aizman struct iscsi_reject { 54739e84790SAlex Aizman uint8_t opcode; 54839e84790SAlex Aizman uint8_t flags; 54939e84790SAlex Aizman uint8_t reason; 55039e84790SAlex Aizman uint8_t rsvd2; 55139e84790SAlex Aizman uint8_t rsvd3; 55239e84790SAlex Aizman uint8_t dlength[3]; 55339e84790SAlex Aizman uint8_t rsvd4[16]; 55439e84790SAlex Aizman __be32 statsn; 55539e84790SAlex Aizman __be32 exp_cmdsn; 55639e84790SAlex Aizman __be32 max_cmdsn; 55739e84790SAlex Aizman __be32 datasn; 55839e84790SAlex Aizman uint8_t rsvd5[8]; 55939e84790SAlex Aizman /* Text - Rejected hdr */ 56039e84790SAlex Aizman }; 56139e84790SAlex Aizman 56239e84790SAlex Aizman /* Reason for Reject */ 56339e84790SAlex Aizman #define CMD_BEFORE_LOGIN 1 56439e84790SAlex Aizman #define DATA_DIGEST_ERROR 2 56539e84790SAlex Aizman #define DATA_SNACK_REJECT 3 56639e84790SAlex Aizman #define ISCSI_PROTOCOL_ERROR 4 56739e84790SAlex Aizman #define CMD_NOT_SUPPORTED 5 56839e84790SAlex Aizman #define IMM_CMD_REJECT 6 56939e84790SAlex Aizman #define TASK_IN_PROGRESS 7 57039e84790SAlex Aizman #define INVALID_SNACK 8 57139e84790SAlex Aizman #define BOOKMARK_REJECTED 9 57239e84790SAlex Aizman #define BOOKMARK_NO_RESOURCES 10 57339e84790SAlex Aizman #define NEGOTIATION_RESET 11 57439e84790SAlex Aizman 57539e84790SAlex Aizman /* Max. number of Key=Value pairs in a text message */ 57639e84790SAlex Aizman #define MAX_KEY_VALUE_PAIRS 8192 57739e84790SAlex Aizman 57839e84790SAlex Aizman /* maximum length for text keys/values */ 57939e84790SAlex Aizman #define KEY_MAXLEN 64 58039e84790SAlex Aizman #define VALUE_MAXLEN 255 58139e84790SAlex Aizman #define TARGET_NAME_MAXLEN VALUE_MAXLEN 58239e84790SAlex Aizman 58339e84790SAlex Aizman #define DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH 8192 58439e84790SAlex Aizman 58539e84790SAlex Aizman /************************* RFC 3720 End *****************************/ 58639e84790SAlex Aizman 58739e84790SAlex Aizman #endif /* ISCSI_PROTO_H */ 588