1c942fddfSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 239e84790SAlex Aizman /* 339e84790SAlex Aizman * RFC 3720 (iSCSI) protocol data types 439e84790SAlex Aizman * 539e84790SAlex Aizman * Copyright (C) 2005 Dmitry Yusupov 639e84790SAlex Aizman * Copyright (C) 2005 Alex Aizman 739e84790SAlex Aizman * maintained by open-iscsi@googlegroups.com 839e84790SAlex Aizman * 939e84790SAlex Aizman * See the file COPYING included with this distribution for more details. 1039e84790SAlex Aizman */ 1139e84790SAlex Aizman 1239e84790SAlex Aizman #ifndef ISCSI_PROTO_H 1339e84790SAlex Aizman #define ISCSI_PROTO_H 1439e84790SAlex Aizman 1526974789SMike Christie #include <linux/types.h> 1630e9ba9fSBoaz Harrosh #include <scsi/scsi.h> 1726974789SMike Christie 1839e84790SAlex Aizman #define ISCSI_DRAFT20_VERSION 0x00 1939e84790SAlex Aizman 2039e84790SAlex Aizman /* default iSCSI listen port for incoming connections */ 2139e84790SAlex Aizman #define ISCSI_LISTEN_PORT 3260 2239e84790SAlex Aizman 238304bbceSNicholas Bellinger /* iSCSI header length */ 248304bbceSNicholas Bellinger #define ISCSI_HDR_LEN 48 258304bbceSNicholas Bellinger 268304bbceSNicholas Bellinger /* iSCSI CRC32C length */ 278304bbceSNicholas Bellinger #define ISCSI_CRC_LEN 4 288304bbceSNicholas Bellinger 2939e84790SAlex Aizman /* Padding word length */ 30004d6530SBoaz Harrosh #define ISCSI_PAD_LEN 4 3139e84790SAlex Aizman 3239e84790SAlex Aizman /* 338304bbceSNicholas Bellinger * Serial Number Arithmetic, 32 bits, RFC1982 348304bbceSNicholas Bellinger */ 358304bbceSNicholas Bellinger 368304bbceSNicholas Bellinger static inline int iscsi_sna_lt(u32 n1, u32 n2) 378304bbceSNicholas Bellinger { 388304bbceSNicholas Bellinger return (s32)(n1 - n2) < 0; 398304bbceSNicholas Bellinger } 408304bbceSNicholas Bellinger 418304bbceSNicholas Bellinger static inline int iscsi_sna_lte(u32 n1, u32 n2) 428304bbceSNicholas Bellinger { 438304bbceSNicholas Bellinger return (s32)(n1 - n2) <= 0; 448304bbceSNicholas Bellinger } 458304bbceSNicholas Bellinger 468304bbceSNicholas Bellinger static inline int iscsi_sna_gt(u32 n1, u32 n2) 478304bbceSNicholas Bellinger { 488304bbceSNicholas Bellinger return (s32)(n1 - n2) > 0; 498304bbceSNicholas Bellinger } 508304bbceSNicholas Bellinger 518304bbceSNicholas Bellinger static inline int iscsi_sna_gte(u32 n1, u32 n2) 528304bbceSNicholas Bellinger { 538304bbceSNicholas Bellinger return (s32)(n1 - n2) >= 0; 548304bbceSNicholas Bellinger } 558304bbceSNicholas Bellinger 568304bbceSNicholas Bellinger /* 5739e84790SAlex Aizman * useful common(control and data pathes) macro 5839e84790SAlex Aizman */ 5939e84790SAlex Aizman #define ntoh24(p) (((p)[0] << 16) | ((p)[1] << 8) | ((p)[2])) 6039e84790SAlex Aizman #define hton24(p, v) { \ 6139e84790SAlex Aizman p[0] = (((v) >> 16) & 0xFF); \ 6239e84790SAlex Aizman p[1] = (((v) >> 8) & 0xFF); \ 6339e84790SAlex Aizman p[2] = ((v) & 0xFF); \ 6439e84790SAlex Aizman } 6539e84790SAlex Aizman #define zero_data(p) {p[0]=0;p[1]=0;p[2]=0;} 6639e84790SAlex Aizman 67b4377356SAl Viro /* initiator tags; opaque for target */ 689efeccacSMichael S. Tsirkin typedef uint32_t __bitwise itt_t; 69b4377356SAl Viro /* below makes sense only for initiator that created this tag */ 708b1d0343SMike Christie #define build_itt(itt, age) ((__force itt_t)\ 718b1d0343SMike Christie ((itt) | ((age) << ISCSI_AGE_SHIFT))) 72b4377356SAl Viro #define get_itt(itt) ((__force uint32_t)(itt_t)(itt) & ISCSI_ITT_MASK) 73b4377356SAl Viro #define RESERVED_ITT ((__force itt_t)0xffffffff) 74b4377356SAl Viro 7539e84790SAlex Aizman /* 7639e84790SAlex Aizman * iSCSI Template Message Header 7739e84790SAlex Aizman */ 7839e84790SAlex Aizman struct iscsi_hdr { 7939e84790SAlex Aizman uint8_t opcode; 8039e84790SAlex Aizman uint8_t flags; /* Final bit */ 8139e84790SAlex Aizman uint8_t rsvd2[2]; 8239e84790SAlex Aizman uint8_t hlength; /* AHSs total length */ 8339e84790SAlex Aizman uint8_t dlength[3]; /* Data length */ 8455bdabdfSAndy Grover struct scsi_lun lun; 85b4377356SAl Viro itt_t itt; /* Initiator Task Tag, opaque for target */ 8639e84790SAlex Aizman __be32 ttt; /* Target Task Tag */ 8739e84790SAlex Aizman __be32 statsn; 8839e84790SAlex Aizman __be32 exp_statsn; 89baebc497SMike Christie __be32 max_statsn; 90baebc497SMike Christie uint8_t other[12]; 9139e84790SAlex Aizman }; 9239e84790SAlex Aizman 9339e84790SAlex Aizman /************************* RFC 3720 Begin *****************************/ 9439e84790SAlex Aizman 9539e84790SAlex Aizman #define ISCSI_RESERVED_TAG 0xffffffff 9639e84790SAlex Aizman 9739e84790SAlex Aizman /* Opcode encoding bits */ 9839e84790SAlex Aizman #define ISCSI_OP_RETRY 0x80 9939e84790SAlex Aizman #define ISCSI_OP_IMMEDIATE 0x40 10039e84790SAlex Aizman #define ISCSI_OPCODE_MASK 0x3F 10139e84790SAlex Aizman 10239e84790SAlex Aizman /* Initiator Opcode values */ 10339e84790SAlex Aizman #define ISCSI_OP_NOOP_OUT 0x00 10439e84790SAlex Aizman #define ISCSI_OP_SCSI_CMD 0x01 10539e84790SAlex Aizman #define ISCSI_OP_SCSI_TMFUNC 0x02 10639e84790SAlex Aizman #define ISCSI_OP_LOGIN 0x03 10739e84790SAlex Aizman #define ISCSI_OP_TEXT 0x04 10839e84790SAlex Aizman #define ISCSI_OP_SCSI_DATA_OUT 0x05 10939e84790SAlex Aizman #define ISCSI_OP_LOGOUT 0x06 11039e84790SAlex Aizman #define ISCSI_OP_SNACK 0x10 11139e84790SAlex Aizman 112baebc497SMike Christie #define ISCSI_OP_VENDOR1_CMD 0x1c 113baebc497SMike Christie #define ISCSI_OP_VENDOR2_CMD 0x1d 114baebc497SMike Christie #define ISCSI_OP_VENDOR3_CMD 0x1e 115baebc497SMike Christie #define ISCSI_OP_VENDOR4_CMD 0x1f 116baebc497SMike Christie 11739e84790SAlex Aizman /* Target Opcode values */ 11839e84790SAlex Aizman #define ISCSI_OP_NOOP_IN 0x20 11939e84790SAlex Aizman #define ISCSI_OP_SCSI_CMD_RSP 0x21 12039e84790SAlex Aizman #define ISCSI_OP_SCSI_TMFUNC_RSP 0x22 12139e84790SAlex Aizman #define ISCSI_OP_LOGIN_RSP 0x23 12239e84790SAlex Aizman #define ISCSI_OP_TEXT_RSP 0x24 12339e84790SAlex Aizman #define ISCSI_OP_SCSI_DATA_IN 0x25 12439e84790SAlex Aizman #define ISCSI_OP_LOGOUT_RSP 0x26 12539e84790SAlex Aizman #define ISCSI_OP_R2T 0x31 12639e84790SAlex Aizman #define ISCSI_OP_ASYNC_EVENT 0x32 12739e84790SAlex Aizman #define ISCSI_OP_REJECT 0x3f 12839e84790SAlex Aizman 129baebc497SMike Christie struct iscsi_ahs_hdr { 130baebc497SMike Christie __be16 ahslength; 131baebc497SMike Christie uint8_t ahstype; 132baebc497SMike Christie uint8_t ahspec[5]; 133baebc497SMike Christie }; 134baebc497SMike Christie 135baebc497SMike Christie #define ISCSI_AHSTYPE_CDB 1 136baebc497SMike Christie #define ISCSI_AHSTYPE_RLENGTH 2 13738d1c069SBoaz Harrosh #define ISCSI_CDB_SIZE 16 138baebc497SMike Christie 13939e84790SAlex Aizman /* iSCSI PDU Header */ 14012352183SNicholas Bellinger struct iscsi_scsi_req { 14139e84790SAlex Aizman uint8_t opcode; 14239e84790SAlex Aizman uint8_t flags; 143baebc497SMike Christie __be16 rsvd2; 14439e84790SAlex Aizman uint8_t hlength; 14539e84790SAlex Aizman uint8_t dlength[3]; 14655bdabdfSAndy Grover struct scsi_lun lun; 147b4377356SAl Viro itt_t itt; /* Initiator Task Tag */ 14839e84790SAlex Aizman __be32 data_length; 14939e84790SAlex Aizman __be32 cmdsn; 15039e84790SAlex Aizman __be32 exp_statsn; 15138d1c069SBoaz Harrosh uint8_t cdb[ISCSI_CDB_SIZE]; /* SCSI Command Block */ 15239e84790SAlex Aizman /* Additional Data (Command Dependent) */ 15339e84790SAlex Aizman }; 15439e84790SAlex Aizman 15539e84790SAlex Aizman /* Command PDU flags */ 15639e84790SAlex Aizman #define ISCSI_FLAG_CMD_FINAL 0x80 15739e84790SAlex Aizman #define ISCSI_FLAG_CMD_READ 0x40 15839e84790SAlex Aizman #define ISCSI_FLAG_CMD_WRITE 0x20 15939e84790SAlex Aizman #define ISCSI_FLAG_CMD_ATTR_MASK 0x07 /* 3 bits */ 16039e84790SAlex Aizman 16139e84790SAlex Aizman /* SCSI Command Attribute values */ 16239e84790SAlex Aizman #define ISCSI_ATTR_UNTAGGED 0 16339e84790SAlex Aizman #define ISCSI_ATTR_SIMPLE 1 16439e84790SAlex Aizman #define ISCSI_ATTR_ORDERED 2 16539e84790SAlex Aizman #define ISCSI_ATTR_HEAD_OF_QUEUE 3 16639e84790SAlex Aizman #define ISCSI_ATTR_ACA 4 16739e84790SAlex Aizman 168baebc497SMike Christie struct iscsi_rlength_ahdr { 169baebc497SMike Christie __be16 ahslength; 170baebc497SMike Christie uint8_t ahstype; 171baebc497SMike Christie uint8_t reserved; 172baebc497SMike Christie __be32 read_length; 173baebc497SMike Christie }; 174baebc497SMike Christie 175004d6530SBoaz Harrosh /* Extended CDB AHS */ 176004d6530SBoaz Harrosh struct iscsi_ecdb_ahdr { 177004d6530SBoaz Harrosh __be16 ahslength; /* CDB length - 15, including reserved byte */ 178004d6530SBoaz Harrosh uint8_t ahstype; 179004d6530SBoaz Harrosh uint8_t reserved; 18038d1c069SBoaz Harrosh /* 4-byte aligned extended CDB spillover */ 18130e9ba9fSBoaz Harrosh uint8_t ecdb[SCSI_MAX_VARLEN_CDB_SIZE - ISCSI_CDB_SIZE]; 182004d6530SBoaz Harrosh }; 183004d6530SBoaz Harrosh 18439e84790SAlex Aizman /* SCSI Response Header */ 18512352183SNicholas Bellinger struct iscsi_scsi_rsp { 18639e84790SAlex Aizman uint8_t opcode; 18739e84790SAlex Aizman uint8_t flags; 18839e84790SAlex Aizman uint8_t response; 18939e84790SAlex Aizman uint8_t cmd_status; 19039e84790SAlex Aizman uint8_t hlength; 19139e84790SAlex Aizman uint8_t dlength[3]; 19239e84790SAlex Aizman uint8_t rsvd[8]; 193b4377356SAl Viro itt_t itt; /* Initiator Task Tag */ 19439e84790SAlex Aizman __be32 rsvd1; 19539e84790SAlex Aizman __be32 statsn; 19639e84790SAlex Aizman __be32 exp_cmdsn; 19739e84790SAlex Aizman __be32 max_cmdsn; 19839e84790SAlex Aizman __be32 exp_datasn; 19939e84790SAlex Aizman __be32 bi_residual_count; 20039e84790SAlex Aizman __be32 residual_count; 20139e84790SAlex Aizman /* Response or Sense Data (optional) */ 20239e84790SAlex Aizman }; 20339e84790SAlex Aizman 20439e84790SAlex Aizman /* Command Response PDU flags */ 20539e84790SAlex Aizman #define ISCSI_FLAG_CMD_BIDI_OVERFLOW 0x10 20639e84790SAlex Aizman #define ISCSI_FLAG_CMD_BIDI_UNDERFLOW 0x08 20739e84790SAlex Aizman #define ISCSI_FLAG_CMD_OVERFLOW 0x04 20839e84790SAlex Aizman #define ISCSI_FLAG_CMD_UNDERFLOW 0x02 20939e84790SAlex Aizman 21039e84790SAlex Aizman /* iSCSI Status values. Valid if Rsp Selector bit is not set */ 21139e84790SAlex Aizman #define ISCSI_STATUS_CMD_COMPLETED 0 21239e84790SAlex Aizman #define ISCSI_STATUS_TARGET_FAILURE 1 21339e84790SAlex Aizman #define ISCSI_STATUS_SUBSYS_FAILURE 2 21439e84790SAlex Aizman 21539e84790SAlex Aizman /* Asynchronous Event Header */ 21639e84790SAlex Aizman struct iscsi_async { 21739e84790SAlex Aizman uint8_t opcode; 21839e84790SAlex Aizman uint8_t flags; 21939e84790SAlex Aizman uint8_t rsvd2[2]; 22039e84790SAlex Aizman uint8_t rsvd3; 22139e84790SAlex Aizman uint8_t dlength[3]; 22255bdabdfSAndy Grover struct scsi_lun lun; 22339e84790SAlex Aizman uint8_t rsvd4[8]; 22439e84790SAlex Aizman __be32 statsn; 22539e84790SAlex Aizman __be32 exp_cmdsn; 22639e84790SAlex Aizman __be32 max_cmdsn; 22739e84790SAlex Aizman uint8_t async_event; 22839e84790SAlex Aizman uint8_t async_vcode; 22939e84790SAlex Aizman __be16 param1; 23039e84790SAlex Aizman __be16 param2; 23139e84790SAlex Aizman __be16 param3; 23239e84790SAlex Aizman uint8_t rsvd5[4]; 23339e84790SAlex Aizman }; 23439e84790SAlex Aizman 23539e84790SAlex Aizman /* iSCSI Event Codes */ 23639e84790SAlex Aizman #define ISCSI_ASYNC_MSG_SCSI_EVENT 0 23739e84790SAlex Aizman #define ISCSI_ASYNC_MSG_REQUEST_LOGOUT 1 23839e84790SAlex Aizman #define ISCSI_ASYNC_MSG_DROPPING_CONNECTION 2 23939e84790SAlex Aizman #define ISCSI_ASYNC_MSG_DROPPING_ALL_CONNECTIONS 3 24039e84790SAlex Aizman #define ISCSI_ASYNC_MSG_PARAM_NEGOTIATION 4 24139e84790SAlex Aizman #define ISCSI_ASYNC_MSG_VENDOR_SPECIFIC 255 24239e84790SAlex Aizman 24339e84790SAlex Aizman /* NOP-Out Message */ 24439e84790SAlex Aizman struct iscsi_nopout { 24539e84790SAlex Aizman uint8_t opcode; 24639e84790SAlex Aizman uint8_t flags; 24739e84790SAlex Aizman __be16 rsvd2; 24839e84790SAlex Aizman uint8_t rsvd3; 24939e84790SAlex Aizman uint8_t dlength[3]; 25055bdabdfSAndy Grover struct scsi_lun lun; 251b4377356SAl Viro itt_t itt; /* Initiator Task Tag */ 25239e84790SAlex Aizman __be32 ttt; /* Target Transfer Tag */ 25339e84790SAlex Aizman __be32 cmdsn; 25439e84790SAlex Aizman __be32 exp_statsn; 25539e84790SAlex Aizman uint8_t rsvd4[16]; 25639e84790SAlex Aizman }; 25739e84790SAlex Aizman 25839e84790SAlex Aizman /* NOP-In Message */ 25939e84790SAlex Aizman struct iscsi_nopin { 26039e84790SAlex Aizman uint8_t opcode; 26139e84790SAlex Aizman uint8_t flags; 26239e84790SAlex Aizman __be16 rsvd2; 26339e84790SAlex Aizman uint8_t rsvd3; 26439e84790SAlex Aizman uint8_t dlength[3]; 26555bdabdfSAndy Grover struct scsi_lun lun; 266b4377356SAl Viro itt_t itt; /* Initiator Task Tag */ 26739e84790SAlex Aizman __be32 ttt; /* Target Transfer Tag */ 26839e84790SAlex Aizman __be32 statsn; 26939e84790SAlex Aizman __be32 exp_cmdsn; 27039e84790SAlex Aizman __be32 max_cmdsn; 27139e84790SAlex Aizman uint8_t rsvd4[12]; 27239e84790SAlex Aizman }; 27339e84790SAlex Aizman 27439e84790SAlex Aizman /* SCSI Task Management Message Header */ 27539e84790SAlex Aizman struct iscsi_tm { 27639e84790SAlex Aizman uint8_t opcode; 27739e84790SAlex Aizman uint8_t flags; 27839e84790SAlex Aizman uint8_t rsvd1[2]; 27939e84790SAlex Aizman uint8_t hlength; 28039e84790SAlex Aizman uint8_t dlength[3]; 28155bdabdfSAndy Grover struct scsi_lun lun; 282b4377356SAl Viro itt_t itt; /* Initiator Task Tag */ 283b4377356SAl Viro itt_t rtt; /* Reference Task Tag */ 28439e84790SAlex Aizman __be32 cmdsn; 28539e84790SAlex Aizman __be32 exp_statsn; 28639e84790SAlex Aizman __be32 refcmdsn; 28739e84790SAlex Aizman __be32 exp_datasn; 28839e84790SAlex Aizman uint8_t rsvd2[8]; 28939e84790SAlex Aizman }; 29039e84790SAlex Aizman 291baebc497SMike Christie #define ISCSI_FLAG_TM_FUNC_MASK 0x7F 29239e84790SAlex Aizman 29339e84790SAlex Aizman /* Function values */ 29439e84790SAlex Aizman #define ISCSI_TM_FUNC_ABORT_TASK 1 29539e84790SAlex Aizman #define ISCSI_TM_FUNC_ABORT_TASK_SET 2 29639e84790SAlex Aizman #define ISCSI_TM_FUNC_CLEAR_ACA 3 29739e84790SAlex Aizman #define ISCSI_TM_FUNC_CLEAR_TASK_SET 4 29839e84790SAlex Aizman #define ISCSI_TM_FUNC_LOGICAL_UNIT_RESET 5 29939e84790SAlex Aizman #define ISCSI_TM_FUNC_TARGET_WARM_RESET 6 30039e84790SAlex Aizman #define ISCSI_TM_FUNC_TARGET_COLD_RESET 7 30139e84790SAlex Aizman #define ISCSI_TM_FUNC_TASK_REASSIGN 8 30239e84790SAlex Aizman 3035d12c05eSMike Christie #define ISCSI_TM_FUNC_VALUE(hdr) ((hdr)->flags & ISCSI_FLAG_TM_FUNC_MASK) 3045d12c05eSMike Christie 30539e84790SAlex Aizman /* SCSI Task Management Response Header */ 30639e84790SAlex Aizman struct iscsi_tm_rsp { 30739e84790SAlex Aizman uint8_t opcode; 30839e84790SAlex Aizman uint8_t flags; 30939e84790SAlex Aizman uint8_t response; /* see Response values below */ 31039e84790SAlex Aizman uint8_t qualifier; 31139e84790SAlex Aizman uint8_t hlength; 31239e84790SAlex Aizman uint8_t dlength[3]; 31339e84790SAlex Aizman uint8_t rsvd2[8]; 314b4377356SAl Viro itt_t itt; /* Initiator Task Tag */ 315b4377356SAl Viro itt_t rtt; /* Reference Task Tag */ 31639e84790SAlex Aizman __be32 statsn; 31739e84790SAlex Aizman __be32 exp_cmdsn; 31839e84790SAlex Aizman __be32 max_cmdsn; 31939e84790SAlex Aizman uint8_t rsvd3[12]; 32039e84790SAlex Aizman }; 32139e84790SAlex Aizman 32239e84790SAlex Aizman /* Response values */ 323baebc497SMike Christie #define ISCSI_TMF_RSP_COMPLETE 0x00 324baebc497SMike Christie #define ISCSI_TMF_RSP_NO_TASK 0x01 325baebc497SMike Christie #define ISCSI_TMF_RSP_NO_LUN 0x02 326baebc497SMike Christie #define ISCSI_TMF_RSP_TASK_ALLEGIANT 0x03 327baebc497SMike Christie #define ISCSI_TMF_RSP_NO_FAILOVER 0x04 328baebc497SMike Christie #define ISCSI_TMF_RSP_NOT_SUPPORTED 0x05 329baebc497SMike Christie #define ISCSI_TMF_RSP_AUTH_FAILED 0x06 330baebc497SMike Christie #define ISCSI_TMF_RSP_REJECTED 0xff 33139e84790SAlex Aizman 33239e84790SAlex Aizman /* Ready To Transfer Header */ 33339e84790SAlex Aizman struct iscsi_r2t_rsp { 33439e84790SAlex Aizman uint8_t opcode; 33539e84790SAlex Aizman uint8_t flags; 33639e84790SAlex Aizman uint8_t rsvd2[2]; 33739e84790SAlex Aizman uint8_t hlength; 33839e84790SAlex Aizman uint8_t dlength[3]; 33955bdabdfSAndy Grover struct scsi_lun lun; 340b4377356SAl Viro itt_t itt; /* Initiator Task Tag */ 34139e84790SAlex Aizman __be32 ttt; /* Target Transfer Tag */ 34239e84790SAlex Aizman __be32 statsn; 34339e84790SAlex Aizman __be32 exp_cmdsn; 34439e84790SAlex Aizman __be32 max_cmdsn; 34539e84790SAlex Aizman __be32 r2tsn; 34639e84790SAlex Aizman __be32 data_offset; 34739e84790SAlex Aizman __be32 data_length; 34839e84790SAlex Aizman }; 34939e84790SAlex Aizman 35039e84790SAlex Aizman /* SCSI Data Hdr */ 35139e84790SAlex Aizman struct iscsi_data { 35239e84790SAlex Aizman uint8_t opcode; 35339e84790SAlex Aizman uint8_t flags; 35439e84790SAlex Aizman uint8_t rsvd2[2]; 35539e84790SAlex Aizman uint8_t rsvd3; 35639e84790SAlex Aizman uint8_t dlength[3]; 35755bdabdfSAndy Grover struct scsi_lun lun; 358b4377356SAl Viro itt_t itt; 35939e84790SAlex Aizman __be32 ttt; 36039e84790SAlex Aizman __be32 rsvd4; 36139e84790SAlex Aizman __be32 exp_statsn; 36239e84790SAlex Aizman __be32 rsvd5; 36339e84790SAlex Aizman __be32 datasn; 36439e84790SAlex Aizman __be32 offset; 36539e84790SAlex Aizman __be32 rsvd6; 36639e84790SAlex Aizman /* Payload */ 36739e84790SAlex Aizman }; 36839e84790SAlex Aizman 36939e84790SAlex Aizman /* SCSI Data Response Hdr */ 37039e84790SAlex Aizman struct iscsi_data_rsp { 37139e84790SAlex Aizman uint8_t opcode; 37239e84790SAlex Aizman uint8_t flags; 37339e84790SAlex Aizman uint8_t rsvd2; 37439e84790SAlex Aizman uint8_t cmd_status; 37539e84790SAlex Aizman uint8_t hlength; 37639e84790SAlex Aizman uint8_t dlength[3]; 37755bdabdfSAndy Grover struct scsi_lun lun; 378b4377356SAl Viro itt_t itt; 37939e84790SAlex Aizman __be32 ttt; 38039e84790SAlex Aizman __be32 statsn; 38139e84790SAlex Aizman __be32 exp_cmdsn; 38239e84790SAlex Aizman __be32 max_cmdsn; 38339e84790SAlex Aizman __be32 datasn; 38439e84790SAlex Aizman __be32 offset; 38539e84790SAlex Aizman __be32 residual_count; 38639e84790SAlex Aizman }; 38739e84790SAlex Aizman 38839e84790SAlex Aizman /* Data Response PDU flags */ 38939e84790SAlex Aizman #define ISCSI_FLAG_DATA_ACK 0x40 39039e84790SAlex Aizman #define ISCSI_FLAG_DATA_OVERFLOW 0x04 39139e84790SAlex Aizman #define ISCSI_FLAG_DATA_UNDERFLOW 0x02 39239e84790SAlex Aizman #define ISCSI_FLAG_DATA_STATUS 0x01 39339e84790SAlex Aizman 39439e84790SAlex Aizman /* Text Header */ 39539e84790SAlex Aizman struct iscsi_text { 39639e84790SAlex Aizman uint8_t opcode; 39739e84790SAlex Aizman uint8_t flags; 39839e84790SAlex Aizman uint8_t rsvd2[2]; 39939e84790SAlex Aizman uint8_t hlength; 40039e84790SAlex Aizman uint8_t dlength[3]; 40139e84790SAlex Aizman uint8_t rsvd4[8]; 402b4377356SAl Viro itt_t itt; 40339e84790SAlex Aizman __be32 ttt; 40439e84790SAlex Aizman __be32 cmdsn; 40539e84790SAlex Aizman __be32 exp_statsn; 40639e84790SAlex Aizman uint8_t rsvd5[16]; 40739e84790SAlex Aizman /* Text - key=value pairs */ 40839e84790SAlex Aizman }; 40939e84790SAlex Aizman 41039e84790SAlex Aizman #define ISCSI_FLAG_TEXT_CONTINUE 0x40 41139e84790SAlex Aizman 41239e84790SAlex Aizman /* Text Response Header */ 41339e84790SAlex Aizman struct iscsi_text_rsp { 41439e84790SAlex Aizman uint8_t opcode; 41539e84790SAlex Aizman uint8_t flags; 41639e84790SAlex Aizman uint8_t rsvd2[2]; 41739e84790SAlex Aizman uint8_t hlength; 41839e84790SAlex Aizman uint8_t dlength[3]; 41939e84790SAlex Aizman uint8_t rsvd4[8]; 420b4377356SAl Viro itt_t itt; 42139e84790SAlex Aizman __be32 ttt; 42239e84790SAlex Aizman __be32 statsn; 42339e84790SAlex Aizman __be32 exp_cmdsn; 42439e84790SAlex Aizman __be32 max_cmdsn; 42539e84790SAlex Aizman uint8_t rsvd5[12]; 42639e84790SAlex Aizman /* Text Response - key:value pairs */ 42739e84790SAlex Aizman }; 42839e84790SAlex Aizman 42939e84790SAlex Aizman /* Login Header */ 43012352183SNicholas Bellinger struct iscsi_login_req { 43139e84790SAlex Aizman uint8_t opcode; 43239e84790SAlex Aizman uint8_t flags; 43339e84790SAlex Aizman uint8_t max_version; /* Max. version supported */ 43439e84790SAlex Aizman uint8_t min_version; /* Min. version supported */ 43539e84790SAlex Aizman uint8_t hlength; 43639e84790SAlex Aizman uint8_t dlength[3]; 43739e84790SAlex Aizman uint8_t isid[6]; /* Initiator Session ID */ 43839e84790SAlex Aizman __be16 tsih; /* Target Session Handle */ 439b4377356SAl Viro itt_t itt; /* Initiator Task Tag */ 44039e84790SAlex Aizman __be16 cid; 44139e84790SAlex Aizman __be16 rsvd3; 44239e84790SAlex Aizman __be32 cmdsn; 44339e84790SAlex Aizman __be32 exp_statsn; 44439e84790SAlex Aizman uint8_t rsvd5[16]; 44539e84790SAlex Aizman }; 44639e84790SAlex Aizman 44739e84790SAlex Aizman /* Login PDU flags */ 44839e84790SAlex Aizman #define ISCSI_FLAG_LOGIN_TRANSIT 0x80 44939e84790SAlex Aizman #define ISCSI_FLAG_LOGIN_CONTINUE 0x40 45039e84790SAlex Aizman #define ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK 0x0C /* 2 bits */ 45112352183SNicholas Bellinger #define ISCSI_FLAG_LOGIN_CURRENT_STAGE1 0x04 45212352183SNicholas Bellinger #define ISCSI_FLAG_LOGIN_CURRENT_STAGE2 0x08 45312352183SNicholas Bellinger #define ISCSI_FLAG_LOGIN_CURRENT_STAGE3 0x0C 45439e84790SAlex Aizman #define ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK 0x03 /* 2 bits */ 45512352183SNicholas Bellinger #define ISCSI_FLAG_LOGIN_NEXT_STAGE1 0x01 45612352183SNicholas Bellinger #define ISCSI_FLAG_LOGIN_NEXT_STAGE2 0x02 45712352183SNicholas Bellinger #define ISCSI_FLAG_LOGIN_NEXT_STAGE3 0x03 45839e84790SAlex Aizman 45939e84790SAlex Aizman #define ISCSI_LOGIN_CURRENT_STAGE(flags) \ 46039e84790SAlex Aizman ((flags & ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK) >> 2) 46139e84790SAlex Aizman #define ISCSI_LOGIN_NEXT_STAGE(flags) \ 46239e84790SAlex Aizman (flags & ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK) 46339e84790SAlex Aizman 46439e84790SAlex Aizman /* Login Response Header */ 46539e84790SAlex Aizman struct iscsi_login_rsp { 46639e84790SAlex Aizman uint8_t opcode; 46739e84790SAlex Aizman uint8_t flags; 46839e84790SAlex Aizman uint8_t max_version; /* Max. version supported */ 46939e84790SAlex Aizman uint8_t active_version; /* Active version */ 47039e84790SAlex Aizman uint8_t hlength; 47139e84790SAlex Aizman uint8_t dlength[3]; 47239e84790SAlex Aizman uint8_t isid[6]; /* Initiator Session ID */ 47339e84790SAlex Aizman __be16 tsih; /* Target Session Handle */ 474b4377356SAl Viro itt_t itt; /* Initiator Task Tag */ 47539e84790SAlex Aizman __be32 rsvd3; 47639e84790SAlex Aizman __be32 statsn; 47739e84790SAlex Aizman __be32 exp_cmdsn; 47839e84790SAlex Aizman __be32 max_cmdsn; 47939e84790SAlex Aizman uint8_t status_class; /* see Login RSP ststus classes below */ 48039e84790SAlex Aizman uint8_t status_detail; /* see Login RSP Status details below */ 48139e84790SAlex Aizman uint8_t rsvd4[10]; 48239e84790SAlex Aizman }; 48339e84790SAlex Aizman 48439e84790SAlex Aizman /* Login stage (phase) codes for CSG, NSG */ 48539e84790SAlex Aizman #define ISCSI_INITIAL_LOGIN_STAGE -1 48639e84790SAlex Aizman #define ISCSI_SECURITY_NEGOTIATION_STAGE 0 48739e84790SAlex Aizman #define ISCSI_OP_PARMS_NEGOTIATION_STAGE 1 48839e84790SAlex Aizman #define ISCSI_FULL_FEATURE_PHASE 3 48939e84790SAlex Aizman 49039e84790SAlex Aizman /* Login Status response classes */ 49139e84790SAlex Aizman #define ISCSI_STATUS_CLS_SUCCESS 0x00 49239e84790SAlex Aizman #define ISCSI_STATUS_CLS_REDIRECT 0x01 49339e84790SAlex Aizman #define ISCSI_STATUS_CLS_INITIATOR_ERR 0x02 49439e84790SAlex Aizman #define ISCSI_STATUS_CLS_TARGET_ERR 0x03 49539e84790SAlex Aizman 49639e84790SAlex Aizman /* Login Status response detail codes */ 49739e84790SAlex Aizman /* Class-0 (Success) */ 49839e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_ACCEPT 0x00 49939e84790SAlex Aizman 50039e84790SAlex Aizman /* Class-1 (Redirection) */ 50139e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_TGT_MOVED_TEMP 0x01 50239e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_TGT_MOVED_PERM 0x02 50339e84790SAlex Aizman 50439e84790SAlex Aizman /* Class-2 (Initiator Error) */ 50539e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_INIT_ERR 0x00 50639e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_AUTH_FAILED 0x01 50739e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_TGT_FORBIDDEN 0x02 50839e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_TGT_NOT_FOUND 0x03 50939e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_TGT_REMOVED 0x04 51039e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_NO_VERSION 0x05 51139e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_ISID_ERROR 0x06 51239e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_MISSING_FIELDS 0x07 51339e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_CONN_ADD_FAILED 0x08 51439e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_NO_SESSION_TYPE 0x09 51539e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_NO_SESSION 0x0a 51639e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_INVALID_REQUEST 0x0b 51739e84790SAlex Aizman 51839e84790SAlex Aizman /* Class-3 (Target Error) */ 51939e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_TARGET_ERROR 0x00 52039e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE 0x01 52139e84790SAlex Aizman #define ISCSI_LOGIN_STATUS_NO_RESOURCES 0x02 52239e84790SAlex Aizman 52339e84790SAlex Aizman /* Logout Header */ 52439e84790SAlex Aizman struct iscsi_logout { 52539e84790SAlex Aizman uint8_t opcode; 52639e84790SAlex Aizman uint8_t flags; 52739e84790SAlex Aizman uint8_t rsvd1[2]; 52839e84790SAlex Aizman uint8_t hlength; 52939e84790SAlex Aizman uint8_t dlength[3]; 53039e84790SAlex Aizman uint8_t rsvd2[8]; 531b4377356SAl Viro itt_t itt; /* Initiator Task Tag */ 53239e84790SAlex Aizman __be16 cid; 53339e84790SAlex Aizman uint8_t rsvd3[2]; 53439e84790SAlex Aizman __be32 cmdsn; 53539e84790SAlex Aizman __be32 exp_statsn; 53639e84790SAlex Aizman uint8_t rsvd4[16]; 53739e84790SAlex Aizman }; 53839e84790SAlex Aizman 53939e84790SAlex Aizman /* Logout PDU flags */ 54039e84790SAlex Aizman #define ISCSI_FLAG_LOGOUT_REASON_MASK 0x7F 54139e84790SAlex Aizman 54239e84790SAlex Aizman /* logout reason_code values */ 54339e84790SAlex Aizman 54439e84790SAlex Aizman #define ISCSI_LOGOUT_REASON_CLOSE_SESSION 0 54539e84790SAlex Aizman #define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION 1 54639e84790SAlex Aizman #define ISCSI_LOGOUT_REASON_RECOVERY 2 54739e84790SAlex Aizman #define ISCSI_LOGOUT_REASON_AEN_REQUEST 3 54839e84790SAlex Aizman 54939e84790SAlex Aizman /* Logout Response Header */ 55039e84790SAlex Aizman struct iscsi_logout_rsp { 55139e84790SAlex Aizman uint8_t opcode; 55239e84790SAlex Aizman uint8_t flags; 55339e84790SAlex Aizman uint8_t response; /* see Logout response values below */ 55439e84790SAlex Aizman uint8_t rsvd2; 55539e84790SAlex Aizman uint8_t hlength; 55639e84790SAlex Aizman uint8_t dlength[3]; 55739e84790SAlex Aizman uint8_t rsvd3[8]; 558b4377356SAl Viro itt_t itt; /* Initiator Task Tag */ 55939e84790SAlex Aizman __be32 rsvd4; 56039e84790SAlex Aizman __be32 statsn; 56139e84790SAlex Aizman __be32 exp_cmdsn; 56239e84790SAlex Aizman __be32 max_cmdsn; 56339e84790SAlex Aizman __be32 rsvd5; 56439e84790SAlex Aizman __be16 t2wait; 56539e84790SAlex Aizman __be16 t2retain; 56639e84790SAlex Aizman __be32 rsvd6; 56739e84790SAlex Aizman }; 56839e84790SAlex Aizman 56939e84790SAlex Aizman /* logout response status values */ 57039e84790SAlex Aizman 57139e84790SAlex Aizman #define ISCSI_LOGOUT_SUCCESS 0 57239e84790SAlex Aizman #define ISCSI_LOGOUT_CID_NOT_FOUND 1 57339e84790SAlex Aizman #define ISCSI_LOGOUT_RECOVERY_UNSUPPORTED 2 57439e84790SAlex Aizman #define ISCSI_LOGOUT_CLEANUP_FAILED 3 57539e84790SAlex Aizman 57639e84790SAlex Aizman /* SNACK Header */ 57739e84790SAlex Aizman struct iscsi_snack { 57839e84790SAlex Aizman uint8_t opcode; 57939e84790SAlex Aizman uint8_t flags; 58012352183SNicholas Bellinger uint8_t rsvd2[2]; 58112352183SNicholas Bellinger uint8_t hlength; 58212352183SNicholas Bellinger uint8_t dlength[3]; 58312352183SNicholas Bellinger uint8_t lun[8]; 584b4377356SAl Viro itt_t itt; 58512352183SNicholas Bellinger __be32 ttt; 58612352183SNicholas Bellinger uint8_t rsvd3[4]; 58712352183SNicholas Bellinger __be32 exp_statsn; 58812352183SNicholas Bellinger uint8_t rsvd4[8]; 58939e84790SAlex Aizman __be32 begrun; 59039e84790SAlex Aizman __be32 runlength; 59139e84790SAlex Aizman }; 59239e84790SAlex Aizman 59339e84790SAlex Aizman /* SNACK PDU flags */ 59412352183SNicholas Bellinger #define ISCSI_FLAG_SNACK_TYPE_DATA 0 59512352183SNicholas Bellinger #define ISCSI_FLAG_SNACK_TYPE_R2T 0 59612352183SNicholas Bellinger #define ISCSI_FLAG_SNACK_TYPE_STATUS 1 59712352183SNicholas Bellinger #define ISCSI_FLAG_SNACK_TYPE_DATA_ACK 2 59812352183SNicholas Bellinger #define ISCSI_FLAG_SNACK_TYPE_RDATA 3 59939e84790SAlex Aizman #define ISCSI_FLAG_SNACK_TYPE_MASK 0x0F /* 4 bits */ 60039e84790SAlex Aizman 60139e84790SAlex Aizman /* Reject Message Header */ 60239e84790SAlex Aizman struct iscsi_reject { 60339e84790SAlex Aizman uint8_t opcode; 60439e84790SAlex Aizman uint8_t flags; 60539e84790SAlex Aizman uint8_t reason; 60639e84790SAlex Aizman uint8_t rsvd2; 607fa0a6957SMike Christie uint8_t hlength; 60839e84790SAlex Aizman uint8_t dlength[3]; 609fa0a6957SMike Christie uint8_t rsvd3[8]; 610fa0a6957SMike Christie __be32 ffffffff; 611fa0a6957SMike Christie uint8_t rsvd4[4]; 61239e84790SAlex Aizman __be32 statsn; 61339e84790SAlex Aizman __be32 exp_cmdsn; 61439e84790SAlex Aizman __be32 max_cmdsn; 61539e84790SAlex Aizman __be32 datasn; 61639e84790SAlex Aizman uint8_t rsvd5[8]; 61739e84790SAlex Aizman /* Text - Rejected hdr */ 61839e84790SAlex Aizman }; 61939e84790SAlex Aizman 62039e84790SAlex Aizman /* Reason for Reject */ 621fa0a6957SMike Christie #define ISCSI_REASON_CMD_BEFORE_LOGIN 1 622fa0a6957SMike Christie #define ISCSI_REASON_DATA_DIGEST_ERROR 2 623fa0a6957SMike Christie #define ISCSI_REASON_DATA_SNACK_REJECT 3 624fa0a6957SMike Christie #define ISCSI_REASON_PROTOCOL_ERROR 4 625fa0a6957SMike Christie #define ISCSI_REASON_CMD_NOT_SUPPORTED 5 626fa0a6957SMike Christie #define ISCSI_REASON_IMM_CMD_REJECT 6 627fa0a6957SMike Christie #define ISCSI_REASON_TASK_IN_PROGRESS 7 628fa0a6957SMike Christie #define ISCSI_REASON_INVALID_SNACK 8 629fa0a6957SMike Christie #define ISCSI_REASON_BOOKMARK_INVALID 9 630fa0a6957SMike Christie #define ISCSI_REASON_BOOKMARK_NO_RESOURCES 10 631fa0a6957SMike Christie #define ISCSI_REASON_NEGOTIATION_RESET 11 63239e84790SAlex Aizman 63339e84790SAlex Aizman /* Max. number of Key=Value pairs in a text message */ 63439e84790SAlex Aizman #define MAX_KEY_VALUE_PAIRS 8192 63539e84790SAlex Aizman 63639e84790SAlex Aizman /* maximum length for text keys/values */ 63739e84790SAlex Aizman #define KEY_MAXLEN 64 63839e84790SAlex Aizman #define VALUE_MAXLEN 255 63939e84790SAlex Aizman #define TARGET_NAME_MAXLEN VALUE_MAXLEN 64039e84790SAlex Aizman 641bf32ed33SMike Christie #define ISCSI_DEF_MAX_RECV_SEG_LEN 8192 642bf32ed33SMike Christie #define ISCSI_MIN_MAX_RECV_SEG_LEN 512 643bf32ed33SMike Christie #define ISCSI_MAX_MAX_RECV_SEG_LEN 16777215 644bf32ed33SMike Christie 645bf32ed33SMike Christie #define ISCSI_DEF_FIRST_BURST_LEN 65536 646bf32ed33SMike Christie #define ISCSI_MIN_FIRST_BURST_LEN 512 647bf32ed33SMike Christie #define ISCSI_MAX_FIRST_BURST_LEN 16777215 648bf32ed33SMike Christie 649bf32ed33SMike Christie #define ISCSI_DEF_MAX_BURST_LEN 262144 650bf32ed33SMike Christie #define ISCSI_MIN_MAX_BURST_LEN 512 651bf32ed33SMike Christie #define ISCSI_MAX_MAX_BURST_LEN 16777215 65239e84790SAlex Aizman 653843c0a8aSMike Christie #define ISCSI_DEF_TIME2WAIT 2 654843c0a8aSMike Christie 6552177199dSJohn Soni Jose #define ISCSI_NAME_LEN 224 6562177199dSJohn Soni Jose 65739e84790SAlex Aizman /************************* RFC 3720 End *****************************/ 65839e84790SAlex Aizman 65939e84790SAlex Aizman #endif /* ISCSI_PROTO_H */ 660