cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

iscsi_proto.h (15915B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * RFC 3720 (iSCSI) protocol data types
      4 *
      5 * Copyright (C) 2005 Dmitry Yusupov
      6 * Copyright (C) 2005 Alex Aizman
      7 * maintained by open-iscsi@googlegroups.com
      8 */
      9
     10#ifndef ISCSI_PROTO_H
     11#define ISCSI_PROTO_H
     12
     13#include <linux/types.h>
     14#include <scsi/scsi.h>
     15
     16#define ISCSI_DRAFT20_VERSION	0x00
     17
     18/* default iSCSI listen port for incoming connections */
     19#define ISCSI_LISTEN_PORT	3260
     20
     21/* iSCSI header length */
     22#define ISCSI_HDR_LEN		48
     23
     24/* iSCSI CRC32C length */
     25#define ISCSI_CRC_LEN		4
     26
     27/* Padding word length */
     28#define ISCSI_PAD_LEN		4
     29
     30/*
     31 * Serial Number Arithmetic, 32 bits, RFC1982
     32 */
     33
     34static inline int iscsi_sna_lt(u32 n1, u32 n2)
     35{
     36	return (s32)(n1 - n2) < 0;
     37}
     38
     39static inline int iscsi_sna_lte(u32 n1, u32 n2)
     40{
     41	return (s32)(n1 - n2) <= 0;
     42}
     43
     44static inline int iscsi_sna_gt(u32 n1, u32 n2)
     45{
     46	return (s32)(n1 - n2) > 0;
     47}
     48
     49static inline int iscsi_sna_gte(u32 n1, u32 n2)
     50{
     51	return (s32)(n1 - n2) >= 0;
     52}
     53
     54/*
     55 * useful common(control and data paths) macro
     56 */
     57#define ntoh24(p) (((p)[0] << 16) | ((p)[1] << 8) | ((p)[2]))
     58#define hton24(p, v) { \
     59        p[0] = (((v) >> 16) & 0xFF); \
     60        p[1] = (((v) >> 8) & 0xFF); \
     61        p[2] = ((v) & 0xFF); \
     62}
     63#define zero_data(p) {p[0]=0;p[1]=0;p[2]=0;}
     64
     65/* initiator tags; opaque for target */
     66typedef uint32_t __bitwise itt_t;
     67/* below makes sense only for initiator that created this tag */
     68#define build_itt(itt, age) ((__force itt_t)\
     69	((itt) | ((age) << ISCSI_AGE_SHIFT)))
     70#define get_itt(itt) ((__force uint32_t)(itt_t)(itt) & ISCSI_ITT_MASK)
     71#define RESERVED_ITT ((__force itt_t)0xffffffff)
     72
     73/*
     74 * iSCSI Template Message Header
     75 */
     76struct iscsi_hdr {
     77	uint8_t		opcode;
     78	uint8_t		flags;		/* Final bit */
     79	uint8_t		rsvd2[2];
     80	uint8_t		hlength;	/* AHSs total length */
     81	uint8_t		dlength[3];	/* Data length */
     82	struct scsi_lun	lun;
     83	itt_t		itt;		/* Initiator Task Tag, opaque for target */
     84	__be32		ttt;		/* Target Task Tag */
     85	__be32		statsn;
     86	__be32		exp_statsn;
     87	__be32		max_statsn;
     88	uint8_t		other[12];
     89};
     90
     91/************************* RFC 3720 Begin *****************************/
     92
     93#define ISCSI_RESERVED_TAG		0xffffffff
     94
     95/* Opcode encoding bits */
     96#define ISCSI_OP_RETRY			0x80
     97#define ISCSI_OP_IMMEDIATE		0x40
     98#define ISCSI_OPCODE_MASK		0x3F
     99
    100/* Initiator Opcode values */
    101#define ISCSI_OP_NOOP_OUT		0x00
    102#define ISCSI_OP_SCSI_CMD		0x01
    103#define ISCSI_OP_SCSI_TMFUNC		0x02
    104#define ISCSI_OP_LOGIN			0x03
    105#define ISCSI_OP_TEXT			0x04
    106#define ISCSI_OP_SCSI_DATA_OUT		0x05
    107#define ISCSI_OP_LOGOUT			0x06
    108#define ISCSI_OP_SNACK			0x10
    109
    110#define ISCSI_OP_VENDOR1_CMD		0x1c
    111#define ISCSI_OP_VENDOR2_CMD		0x1d
    112#define ISCSI_OP_VENDOR3_CMD		0x1e
    113#define ISCSI_OP_VENDOR4_CMD		0x1f
    114
    115/* Target Opcode values */
    116#define ISCSI_OP_NOOP_IN		0x20
    117#define ISCSI_OP_SCSI_CMD_RSP		0x21
    118#define ISCSI_OP_SCSI_TMFUNC_RSP	0x22
    119#define ISCSI_OP_LOGIN_RSP		0x23
    120#define ISCSI_OP_TEXT_RSP		0x24
    121#define ISCSI_OP_SCSI_DATA_IN		0x25
    122#define ISCSI_OP_LOGOUT_RSP		0x26
    123#define ISCSI_OP_R2T			0x31
    124#define ISCSI_OP_ASYNC_EVENT		0x32
    125#define ISCSI_OP_REJECT			0x3f
    126
    127struct iscsi_ahs_hdr {
    128	__be16 ahslength;
    129	uint8_t ahstype;
    130	uint8_t ahspec[5];
    131};
    132
    133#define ISCSI_AHSTYPE_CDB		1
    134#define ISCSI_AHSTYPE_RLENGTH		2
    135#define ISCSI_CDB_SIZE			16
    136
    137/* iSCSI PDU Header */
    138struct iscsi_scsi_req {
    139	uint8_t opcode;
    140	uint8_t flags;
    141	__be16 rsvd2;
    142	uint8_t hlength;
    143	uint8_t dlength[3];
    144	struct scsi_lun lun;
    145	itt_t	 itt;	/* Initiator Task Tag */
    146	__be32 data_length;
    147	__be32 cmdsn;
    148	__be32 exp_statsn;
    149	uint8_t cdb[ISCSI_CDB_SIZE];	/* SCSI Command Block */
    150	/* Additional Data (Command Dependent) */
    151};
    152
    153/* Command PDU flags */
    154#define ISCSI_FLAG_CMD_FINAL		0x80
    155#define ISCSI_FLAG_CMD_READ		0x40
    156#define ISCSI_FLAG_CMD_WRITE		0x20
    157#define ISCSI_FLAG_CMD_ATTR_MASK	0x07	/* 3 bits */
    158
    159/* SCSI Command Attribute values */
    160#define ISCSI_ATTR_UNTAGGED		0
    161#define ISCSI_ATTR_SIMPLE		1
    162#define ISCSI_ATTR_ORDERED		2
    163#define ISCSI_ATTR_HEAD_OF_QUEUE	3
    164#define ISCSI_ATTR_ACA			4
    165
    166struct iscsi_rlength_ahdr {
    167	__be16 ahslength;
    168	uint8_t ahstype;
    169	uint8_t reserved;
    170	__be32 read_length;
    171};
    172
    173/* Extended CDB AHS */
    174struct iscsi_ecdb_ahdr {
    175	__be16 ahslength;	/* CDB length - 15, including reserved byte */
    176	uint8_t ahstype;
    177	uint8_t reserved;
    178	/* 4-byte aligned extended CDB spillover */
    179	uint8_t ecdb[SCSI_MAX_VARLEN_CDB_SIZE - ISCSI_CDB_SIZE];
    180};
    181
    182/* SCSI Response Header */
    183struct iscsi_scsi_rsp {
    184	uint8_t opcode;
    185	uint8_t flags;
    186	uint8_t response;
    187	uint8_t cmd_status;
    188	uint8_t hlength;
    189	uint8_t dlength[3];
    190	uint8_t rsvd[8];
    191	itt_t	 itt;	/* Initiator Task Tag */
    192	__be32	rsvd1;
    193	__be32	statsn;
    194	__be32	exp_cmdsn;
    195	__be32	max_cmdsn;
    196	__be32	exp_datasn;
    197	__be32	bi_residual_count;
    198	__be32	residual_count;
    199	/* Response or Sense Data (optional) */
    200};
    201
    202/* Command Response PDU flags */
    203#define ISCSI_FLAG_CMD_BIDI_OVERFLOW	0x10
    204#define ISCSI_FLAG_CMD_BIDI_UNDERFLOW	0x08
    205#define ISCSI_FLAG_CMD_OVERFLOW		0x04
    206#define ISCSI_FLAG_CMD_UNDERFLOW	0x02
    207
    208/* iSCSI Status values. Valid if Rsp Selector bit is not set */
    209#define ISCSI_STATUS_CMD_COMPLETED	0
    210#define ISCSI_STATUS_TARGET_FAILURE	1
    211#define ISCSI_STATUS_SUBSYS_FAILURE	2
    212
    213/* Asynchronous Event Header */
    214struct iscsi_async {
    215	uint8_t opcode;
    216	uint8_t flags;
    217	uint8_t rsvd2[2];
    218	uint8_t rsvd3;
    219	uint8_t dlength[3];
    220	struct scsi_lun	lun;
    221	uint8_t rsvd4[8];
    222	__be32	statsn;
    223	__be32	exp_cmdsn;
    224	__be32	max_cmdsn;
    225	uint8_t async_event;
    226	uint8_t async_vcode;
    227	__be16	param1;
    228	__be16	param2;
    229	__be16	param3;
    230	uint8_t rsvd5[4];
    231};
    232
    233/* iSCSI Event Codes */
    234#define ISCSI_ASYNC_MSG_SCSI_EVENT			0
    235#define ISCSI_ASYNC_MSG_REQUEST_LOGOUT			1
    236#define ISCSI_ASYNC_MSG_DROPPING_CONNECTION		2
    237#define ISCSI_ASYNC_MSG_DROPPING_ALL_CONNECTIONS	3
    238#define ISCSI_ASYNC_MSG_PARAM_NEGOTIATION		4
    239#define ISCSI_ASYNC_MSG_VENDOR_SPECIFIC			255
    240
    241/* NOP-Out Message */
    242struct iscsi_nopout {
    243	uint8_t opcode;
    244	uint8_t flags;
    245	__be16	rsvd2;
    246	uint8_t rsvd3;
    247	uint8_t dlength[3];
    248	struct scsi_lun	lun;
    249	itt_t	 itt;	/* Initiator Task Tag */
    250	__be32	ttt;	/* Target Transfer Tag */
    251	__be32	cmdsn;
    252	__be32	exp_statsn;
    253	uint8_t rsvd4[16];
    254};
    255
    256/* NOP-In Message */
    257struct iscsi_nopin {
    258	uint8_t opcode;
    259	uint8_t flags;
    260	__be16	rsvd2;
    261	uint8_t rsvd3;
    262	uint8_t dlength[3];
    263	struct scsi_lun	lun;
    264	itt_t	 itt;	/* Initiator Task Tag */
    265	__be32	ttt;	/* Target Transfer Tag */
    266	__be32	statsn;
    267	__be32	exp_cmdsn;
    268	__be32	max_cmdsn;
    269	uint8_t rsvd4[12];
    270};
    271
    272/* SCSI Task Management Message Header */
    273struct iscsi_tm {
    274	uint8_t opcode;
    275	uint8_t flags;
    276	uint8_t rsvd1[2];
    277	uint8_t hlength;
    278	uint8_t dlength[3];
    279	struct scsi_lun lun;
    280	itt_t	 itt;	/* Initiator Task Tag */
    281	itt_t	 rtt;	/* Reference Task Tag */
    282	__be32	cmdsn;
    283	__be32	exp_statsn;
    284	__be32	refcmdsn;
    285	__be32	exp_datasn;
    286	uint8_t rsvd2[8];
    287};
    288
    289#define ISCSI_FLAG_TM_FUNC_MASK			0x7F
    290
    291/* Function values */
    292#define ISCSI_TM_FUNC_ABORT_TASK		1
    293#define ISCSI_TM_FUNC_ABORT_TASK_SET		2
    294#define ISCSI_TM_FUNC_CLEAR_ACA			3
    295#define ISCSI_TM_FUNC_CLEAR_TASK_SET		4
    296#define ISCSI_TM_FUNC_LOGICAL_UNIT_RESET	5
    297#define ISCSI_TM_FUNC_TARGET_WARM_RESET		6
    298#define ISCSI_TM_FUNC_TARGET_COLD_RESET		7
    299#define ISCSI_TM_FUNC_TASK_REASSIGN		8
    300
    301#define ISCSI_TM_FUNC_VALUE(hdr) ((hdr)->flags & ISCSI_FLAG_TM_FUNC_MASK)
    302
    303/* SCSI Task Management Response Header */
    304struct iscsi_tm_rsp {
    305	uint8_t opcode;
    306	uint8_t flags;
    307	uint8_t response;	/* see Response values below */
    308	uint8_t qualifier;
    309	uint8_t hlength;
    310	uint8_t dlength[3];
    311	uint8_t rsvd2[8];
    312	itt_t	 itt;	/* Initiator Task Tag */
    313	itt_t	 rtt;	/* Reference Task Tag */
    314	__be32	statsn;
    315	__be32	exp_cmdsn;
    316	__be32	max_cmdsn;
    317	uint8_t rsvd3[12];
    318};
    319
    320/* Response values */
    321#define ISCSI_TMF_RSP_COMPLETE		0x00
    322#define ISCSI_TMF_RSP_NO_TASK		0x01
    323#define ISCSI_TMF_RSP_NO_LUN		0x02
    324#define ISCSI_TMF_RSP_TASK_ALLEGIANT	0x03
    325#define ISCSI_TMF_RSP_NO_FAILOVER	0x04
    326#define ISCSI_TMF_RSP_NOT_SUPPORTED	0x05
    327#define ISCSI_TMF_RSP_AUTH_FAILED	0x06
    328#define ISCSI_TMF_RSP_REJECTED		0xff
    329
    330/* Ready To Transfer Header */
    331struct iscsi_r2t_rsp {
    332	uint8_t opcode;
    333	uint8_t flags;
    334	uint8_t rsvd2[2];
    335	uint8_t	hlength;
    336	uint8_t	dlength[3];
    337	struct scsi_lun	lun;
    338	itt_t	 itt;	/* Initiator Task Tag */
    339	__be32	ttt;	/* Target Transfer Tag */
    340	__be32	statsn;
    341	__be32	exp_cmdsn;
    342	__be32	max_cmdsn;
    343	__be32	r2tsn;
    344	__be32	data_offset;
    345	__be32	data_length;
    346};
    347
    348/* SCSI Data Hdr */
    349struct iscsi_data {
    350	uint8_t opcode;
    351	uint8_t flags;
    352	uint8_t rsvd2[2];
    353	uint8_t rsvd3;
    354	uint8_t dlength[3];
    355	struct scsi_lun lun;
    356	itt_t	 itt;
    357	__be32	ttt;
    358	__be32	rsvd4;
    359	__be32	exp_statsn;
    360	__be32	rsvd5;
    361	__be32	datasn;
    362	__be32	offset;
    363	__be32	rsvd6;
    364	/* Payload */
    365};
    366
    367/* SCSI Data Response Hdr */
    368struct iscsi_data_rsp {
    369	uint8_t opcode;
    370	uint8_t flags;
    371	uint8_t rsvd2;
    372	uint8_t cmd_status;
    373	uint8_t hlength;
    374	uint8_t dlength[3];
    375	struct scsi_lun	lun;
    376	itt_t	 itt;
    377	__be32	ttt;
    378	__be32	statsn;
    379	__be32	exp_cmdsn;
    380	__be32	max_cmdsn;
    381	__be32	datasn;
    382	__be32	offset;
    383	__be32	residual_count;
    384};
    385
    386/* Data Response PDU flags */
    387#define ISCSI_FLAG_DATA_ACK		0x40
    388#define ISCSI_FLAG_DATA_OVERFLOW	0x04
    389#define ISCSI_FLAG_DATA_UNDERFLOW	0x02
    390#define ISCSI_FLAG_DATA_STATUS		0x01
    391
    392/* Text Header */
    393struct iscsi_text {
    394	uint8_t opcode;
    395	uint8_t flags;
    396	uint8_t rsvd2[2];
    397	uint8_t hlength;
    398	uint8_t dlength[3];
    399	uint8_t rsvd4[8];
    400	itt_t	 itt;
    401	__be32	ttt;
    402	__be32	cmdsn;
    403	__be32	exp_statsn;
    404	uint8_t rsvd5[16];
    405	/* Text - key=value pairs */
    406};
    407
    408#define ISCSI_FLAG_TEXT_CONTINUE	0x40
    409
    410/* Text Response Header */
    411struct iscsi_text_rsp {
    412	uint8_t opcode;
    413	uint8_t flags;
    414	uint8_t rsvd2[2];
    415	uint8_t hlength;
    416	uint8_t dlength[3];
    417	uint8_t rsvd4[8];
    418	itt_t	 itt;
    419	__be32	ttt;
    420	__be32	statsn;
    421	__be32	exp_cmdsn;
    422	__be32	max_cmdsn;
    423	uint8_t rsvd5[12];
    424	/* Text Response - key:value pairs */
    425};
    426
    427/* Login Header */
    428struct iscsi_login_req {
    429	uint8_t opcode;
    430	uint8_t flags;
    431	uint8_t max_version;	/* Max. version supported */
    432	uint8_t min_version;	/* Min. version supported */
    433	uint8_t hlength;
    434	uint8_t dlength[3];
    435	uint8_t isid[6];	/* Initiator Session ID */
    436	__be16	tsih;	/* Target Session Handle */
    437	itt_t	 itt;	/* Initiator Task Tag */
    438	__be16	cid;
    439	__be16	rsvd3;
    440	__be32	cmdsn;
    441	__be32	exp_statsn;
    442	uint8_t rsvd5[16];
    443};
    444
    445/* Login PDU flags */
    446#define ISCSI_FLAG_LOGIN_TRANSIT		0x80
    447#define ISCSI_FLAG_LOGIN_CONTINUE		0x40
    448#define ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK	0x0C	/* 2 bits */
    449#define ISCSI_FLAG_LOGIN_CURRENT_STAGE1		0x04
    450#define ISCSI_FLAG_LOGIN_CURRENT_STAGE2		0x08
    451#define ISCSI_FLAG_LOGIN_CURRENT_STAGE3		0x0C
    452#define ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK	0x03	/* 2 bits */
    453#define ISCSI_FLAG_LOGIN_NEXT_STAGE1		0x01
    454#define ISCSI_FLAG_LOGIN_NEXT_STAGE2		0x02
    455#define ISCSI_FLAG_LOGIN_NEXT_STAGE3		0x03
    456
    457#define ISCSI_LOGIN_CURRENT_STAGE(flags) \
    458	((flags & ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK) >> 2)
    459#define ISCSI_LOGIN_NEXT_STAGE(flags) \
    460	(flags & ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK)
    461
    462/* Login Response Header */
    463struct iscsi_login_rsp {
    464	uint8_t opcode;
    465	uint8_t flags;
    466	uint8_t max_version;	/* Max. version supported */
    467	uint8_t active_version;	/* Active version */
    468	uint8_t hlength;
    469	uint8_t dlength[3];
    470	uint8_t isid[6];	/* Initiator Session ID */
    471	__be16	tsih;	/* Target Session Handle */
    472	itt_t	 itt;	/* Initiator Task Tag */
    473	__be32	rsvd3;
    474	__be32	statsn;
    475	__be32	exp_cmdsn;
    476	__be32	max_cmdsn;
    477	uint8_t status_class;	/* see Login RSP ststus classes below */
    478	uint8_t status_detail;	/* see Login RSP Status details below */
    479	uint8_t rsvd4[10];
    480};
    481
    482/* Login stage (phase) codes for CSG, NSG */
    483#define ISCSI_INITIAL_LOGIN_STAGE		-1
    484#define ISCSI_SECURITY_NEGOTIATION_STAGE	0
    485#define ISCSI_OP_PARMS_NEGOTIATION_STAGE	1
    486#define ISCSI_FULL_FEATURE_PHASE		3
    487
    488/* Login Status response classes */
    489#define ISCSI_STATUS_CLS_SUCCESS		0x00
    490#define ISCSI_STATUS_CLS_REDIRECT		0x01
    491#define ISCSI_STATUS_CLS_INITIATOR_ERR		0x02
    492#define ISCSI_STATUS_CLS_TARGET_ERR		0x03
    493
    494/* Login Status response detail codes */
    495/* Class-0 (Success) */
    496#define ISCSI_LOGIN_STATUS_ACCEPT		0x00
    497
    498/* Class-1 (Redirection) */
    499#define ISCSI_LOGIN_STATUS_TGT_MOVED_TEMP	0x01
    500#define ISCSI_LOGIN_STATUS_TGT_MOVED_PERM	0x02
    501
    502/* Class-2 (Initiator Error) */
    503#define ISCSI_LOGIN_STATUS_INIT_ERR		0x00
    504#define ISCSI_LOGIN_STATUS_AUTH_FAILED		0x01
    505#define ISCSI_LOGIN_STATUS_TGT_FORBIDDEN	0x02
    506#define ISCSI_LOGIN_STATUS_TGT_NOT_FOUND	0x03
    507#define ISCSI_LOGIN_STATUS_TGT_REMOVED		0x04
    508#define ISCSI_LOGIN_STATUS_NO_VERSION		0x05
    509#define ISCSI_LOGIN_STATUS_ISID_ERROR		0x06
    510#define ISCSI_LOGIN_STATUS_MISSING_FIELDS	0x07
    511#define ISCSI_LOGIN_STATUS_CONN_ADD_FAILED	0x08
    512#define ISCSI_LOGIN_STATUS_NO_SESSION_TYPE	0x09
    513#define ISCSI_LOGIN_STATUS_NO_SESSION		0x0a
    514#define ISCSI_LOGIN_STATUS_INVALID_REQUEST	0x0b
    515
    516/* Class-3 (Target Error) */
    517#define ISCSI_LOGIN_STATUS_TARGET_ERROR		0x00
    518#define ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE	0x01
    519#define ISCSI_LOGIN_STATUS_NO_RESOURCES		0x02
    520
    521/* Logout Header */
    522struct iscsi_logout {
    523	uint8_t opcode;
    524	uint8_t flags;
    525	uint8_t rsvd1[2];
    526	uint8_t hlength;
    527	uint8_t dlength[3];
    528	uint8_t rsvd2[8];
    529	itt_t	 itt;	/* Initiator Task Tag */
    530	__be16	cid;
    531	uint8_t rsvd3[2];
    532	__be32	cmdsn;
    533	__be32	exp_statsn;
    534	uint8_t rsvd4[16];
    535};
    536
    537/* Logout PDU flags */
    538#define ISCSI_FLAG_LOGOUT_REASON_MASK	0x7F
    539
    540/* logout reason_code values */
    541
    542#define ISCSI_LOGOUT_REASON_CLOSE_SESSION	0
    543#define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION	1
    544#define ISCSI_LOGOUT_REASON_RECOVERY		2
    545#define ISCSI_LOGOUT_REASON_AEN_REQUEST		3
    546
    547/* Logout Response Header */
    548struct iscsi_logout_rsp {
    549	uint8_t opcode;
    550	uint8_t flags;
    551	uint8_t response;	/* see Logout response values below */
    552	uint8_t rsvd2;
    553	uint8_t hlength;
    554	uint8_t dlength[3];
    555	uint8_t rsvd3[8];
    556	itt_t	 itt;	/* Initiator Task Tag */
    557	__be32	rsvd4;
    558	__be32	statsn;
    559	__be32	exp_cmdsn;
    560	__be32	max_cmdsn;
    561	__be32	rsvd5;
    562	__be16	t2wait;
    563	__be16	t2retain;
    564	__be32	rsvd6;
    565};
    566
    567/* logout response status values */
    568
    569#define ISCSI_LOGOUT_SUCCESS			0
    570#define ISCSI_LOGOUT_CID_NOT_FOUND		1
    571#define ISCSI_LOGOUT_RECOVERY_UNSUPPORTED	2
    572#define ISCSI_LOGOUT_CLEANUP_FAILED		3
    573
    574/* SNACK Header */
    575struct iscsi_snack {
    576	uint8_t opcode;
    577	uint8_t flags;
    578	uint8_t rsvd2[2];
    579	uint8_t hlength;
    580	uint8_t dlength[3];
    581	uint8_t lun[8];
    582	itt_t	 itt;
    583	__be32  ttt;
    584	uint8_t rsvd3[4];
    585	__be32  exp_statsn;
    586	uint8_t rsvd4[8];
    587	__be32	begrun;
    588	__be32	runlength;
    589};
    590
    591/* SNACK PDU flags */
    592#define ISCSI_FLAG_SNACK_TYPE_DATA		0
    593#define ISCSI_FLAG_SNACK_TYPE_R2T		0
    594#define ISCSI_FLAG_SNACK_TYPE_STATUS		1
    595#define ISCSI_FLAG_SNACK_TYPE_DATA_ACK		2
    596#define ISCSI_FLAG_SNACK_TYPE_RDATA		3
    597#define ISCSI_FLAG_SNACK_TYPE_MASK	0x0F	/* 4 bits */
    598
    599/* Reject Message Header */
    600struct iscsi_reject {
    601	uint8_t opcode;
    602	uint8_t flags;
    603	uint8_t reason;
    604	uint8_t rsvd2;
    605	uint8_t hlength;
    606	uint8_t dlength[3];
    607	uint8_t rsvd3[8];
    608	__be32  ffffffff;
    609	uint8_t rsvd4[4];
    610	__be32	statsn;
    611	__be32	exp_cmdsn;
    612	__be32	max_cmdsn;
    613	__be32	datasn;
    614	uint8_t rsvd5[8];
    615	/* Text - Rejected hdr */
    616};
    617
    618/* Reason for Reject */
    619#define ISCSI_REASON_CMD_BEFORE_LOGIN	1
    620#define ISCSI_REASON_DATA_DIGEST_ERROR	2
    621#define ISCSI_REASON_DATA_SNACK_REJECT	3
    622#define ISCSI_REASON_PROTOCOL_ERROR	4
    623#define ISCSI_REASON_CMD_NOT_SUPPORTED	5
    624#define ISCSI_REASON_IMM_CMD_REJECT		6
    625#define ISCSI_REASON_TASK_IN_PROGRESS	7
    626#define ISCSI_REASON_INVALID_SNACK		8
    627#define ISCSI_REASON_BOOKMARK_INVALID	9
    628#define ISCSI_REASON_BOOKMARK_NO_RESOURCES	10
    629#define ISCSI_REASON_NEGOTIATION_RESET	11
    630
    631/* Max. number of Key=Value pairs in a text message */
    632#define MAX_KEY_VALUE_PAIRS	8192
    633
    634/* maximum length for text keys/values */
    635#define KEY_MAXLEN		64
    636#define VALUE_MAXLEN		255
    637#define TARGET_NAME_MAXLEN	VALUE_MAXLEN
    638
    639#define ISCSI_DEF_MAX_RECV_SEG_LEN		8192
    640#define ISCSI_MIN_MAX_RECV_SEG_LEN		512
    641#define ISCSI_MAX_MAX_RECV_SEG_LEN		16777215
    642
    643#define ISCSI_DEF_FIRST_BURST_LEN		65536
    644#define ISCSI_MIN_FIRST_BURST_LEN		512
    645#define ISCSI_MAX_FIRST_BURST_LEN		16777215
    646
    647#define ISCSI_DEF_MAX_BURST_LEN			262144
    648#define ISCSI_MIN_MAX_BURST_LEN			512
    649#define ISCSI_MAX_MAX_BURST_LEN			16777215
    650
    651#define ISCSI_DEF_TIME2WAIT			2
    652
    653#define ISCSI_NAME_LEN				224
    654
    655/************************* RFC 3720 End *****************************/
    656
    657#endif /* ISCSI_PROTO_H */