xref: /openbsd-src/sys/scsi/iscsi.h (revision dd0887e4137741a7e717f435f13fe9bb651f33c0)
1*dd0887e4Skrw /*	$OpenBSD: iscsi.h,v 1.9 2019/09/27 23:07:42 krw Exp $ */
243cf88e5Sdlg 
343cf88e5Sdlg /*
443cf88e5Sdlg  * Copyright (c) 2008 David Gwynne <dlg@openbsd.org>
543cf88e5Sdlg  *
643cf88e5Sdlg  * Permission to use, copy, modify, and distribute this software for any
743cf88e5Sdlg  * purpose with or without fee is hereby granted, provided that the above
843cf88e5Sdlg  * copyright notice and this permission notice appear in all copies.
943cf88e5Sdlg  *
1043cf88e5Sdlg  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1143cf88e5Sdlg  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1243cf88e5Sdlg  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1343cf88e5Sdlg  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1443cf88e5Sdlg  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1543cf88e5Sdlg  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1643cf88e5Sdlg  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1743cf88e5Sdlg  */
1843cf88e5Sdlg 
19*dd0887e4Skrw #ifndef _SCSI_ISCSI_H
20*dd0887e4Skrw #define _SCSI_ISCSI_H
2143cf88e5Sdlg 
2243cf88e5Sdlg struct iscsi_pdu {
2343cf88e5Sdlg 	u_int8_t	opcode;
2443cf88e5Sdlg 	u_int8_t	flags;
2543cf88e5Sdlg 	u_int8_t	_reserved1[2];
2643cf88e5Sdlg 
2743cf88e5Sdlg 	u_int8_t	ahslen;
2843cf88e5Sdlg 	u_int8_t	datalen[3];
2943cf88e5Sdlg 
3043cf88e5Sdlg 	u_int8_t	lun[8];
3143cf88e5Sdlg 
3243cf88e5Sdlg 	u_int32_t	itt;
3343cf88e5Sdlg 
34e740f298Sclaudio 	u_int8_t	_reserved2[4];
35e740f298Sclaudio 
36e740f298Sclaudio 	u_int32_t	cmdsn;
37e740f298Sclaudio 
38dfa1edcaSclaudio 	u_int32_t	expstatsn;
39dfa1edcaSclaudio 
40dfa1edcaSclaudio 	u_int8_t	_reserved3[16];
4143cf88e5Sdlg } __packed;
4243cf88e5Sdlg 
4343cf88e5Sdlg /*
4443cf88e5Sdlg  * Initiator opcodes
4543cf88e5Sdlg  */
4643cf88e5Sdlg 
4743cf88e5Sdlg #define ISCSI_OP_I_NOP			0x00
4843cf88e5Sdlg #define ISCSI_OP_SCSI_REQUEST		0x01
4943cf88e5Sdlg #define ISCSI_OP_TASK_REQUEST		0x02
5043cf88e5Sdlg #define ISCSI_OP_LOGIN_REQUEST		0x03
5143cf88e5Sdlg #define ISCSI_OP_TEXT_REQUEST		0x04
5243cf88e5Sdlg #define ISCSI_OP_DATA_OUT		0x05
5343cf88e5Sdlg #define ISCSI_OP_LOGOUT_REQUEST		0x06
5443cf88e5Sdlg #define ISCSI_OP_SNACK_REQUEST		0x10
5543cf88e5Sdlg 
5643cf88e5Sdlg /*
5743cf88e5Sdlg  * Target opcodes
5843cf88e5Sdlg  */
5943cf88e5Sdlg 
6043cf88e5Sdlg #define ISCSI_OP_T_NOP			0x20
6143cf88e5Sdlg #define ISCSI_OP_SCSI_RESPONSE		0x21
6243cf88e5Sdlg #define ISCSI_OP_TASK_RESPONSE		0x22
6343cf88e5Sdlg #define ISCSI_OP_LOGIN_RESPONSE		0x23
6443cf88e5Sdlg #define ISCSI_OP_TEXT_RESPONSE		0x24
6543cf88e5Sdlg #define ISCSI_OP_DATA_IN		0x25
6643cf88e5Sdlg #define ISCSI_OP_LOGOUT_RESPONSE	0x26
67fe0615c6Sdlg #define ISCSI_OP_R2T			0x31
68fe0615c6Sdlg #define ISCSI_OP_ASYNC			0x32
69fe0615c6Sdlg #define ISCSI_OP_REJECT			0x3f
7043cf88e5Sdlg 
7143cf88e5Sdlg #define ISCSI_PDU_OPCODE(_o)		((_o) & 0x3f)
7243cf88e5Sdlg #define ISCSI_PDU_I(_h)			((_h)->opcode & 0x40)
7343cf88e5Sdlg #define ISCSI_PDU_F(_h)			((_h)->flags & 0x80)
7443cf88e5Sdlg 
75e740f298Sclaudio #define ISCSI_OP_F_IMMEDIATE		0x40
76e740f298Sclaudio 
77e740f298Sclaudio /*
78e740f298Sclaudio  * various other flags and values
79e740f298Sclaudio  */
80e740f298Sclaudio #define ISCSI_ISID_OUI			0x00000000
81e740f298Sclaudio #define ISCSI_ISID_EN			0x40000000
82e740f298Sclaudio #define ISCSI_ISID_RAND			0x80000000
83e740f298Sclaudio 
8443cf88e5Sdlg struct iscsi_pdu_scsi_request {
8543cf88e5Sdlg 	u_int8_t	opcode;
8643cf88e5Sdlg 	u_int8_t	flags;
8743cf88e5Sdlg 	u_int8_t	_reserved[2];
8843cf88e5Sdlg 
8943cf88e5Sdlg 	u_int8_t	ahslen;
9043cf88e5Sdlg 	u_int8_t	datalen[3];
9143cf88e5Sdlg 
9243cf88e5Sdlg 	u_int8_t	lun[8];
9343cf88e5Sdlg 
9443cf88e5Sdlg 	u_int32_t	itt;
9543cf88e5Sdlg 
9643cf88e5Sdlg 	u_int32_t	bytes;
9743cf88e5Sdlg 
9843cf88e5Sdlg 	u_int32_t	cmdsn;
9943cf88e5Sdlg 
10043cf88e5Sdlg 	u_int32_t	expstatsn;
10143cf88e5Sdlg 
10243cf88e5Sdlg 	u_int8_t	cdb[16];
10343cf88e5Sdlg } __packed;
10443cf88e5Sdlg 
10543cf88e5Sdlg struct iscsi_pdu_scsi_response {
10643cf88e5Sdlg 	u_int8_t	opcode;
10743cf88e5Sdlg 	u_int8_t	flags;
10843cf88e5Sdlg 	u_int8_t	response;
10943cf88e5Sdlg 	u_int8_t	status;
11043cf88e5Sdlg 
11143cf88e5Sdlg 	u_int8_t	ahslen;
11243cf88e5Sdlg 	u_int8_t	datalen[3];
11343cf88e5Sdlg 
11443cf88e5Sdlg 	u_int8_t	_reserved[8];
11543cf88e5Sdlg 
11643cf88e5Sdlg 	u_int32_t	itt;
11743cf88e5Sdlg 
11843cf88e5Sdlg 	u_int32_t	snack;
11943cf88e5Sdlg 
12043cf88e5Sdlg 	u_int32_t	statsn;
12143cf88e5Sdlg 
12243cf88e5Sdlg 	u_int32_t	expcmdsn;
12343cf88e5Sdlg 
12443cf88e5Sdlg 	u_int32_t	maxcmdsn;
12543cf88e5Sdlg 
12643cf88e5Sdlg 	u_int32_t	expdatasn;
127c3f5b1d1Sjordan 
128c3f5b1d1Sjordan 	u_int32_t	birescount;
129c3f5b1d1Sjordan 
130c3f5b1d1Sjordan 	u_int32_t	rescount;
13143cf88e5Sdlg } __packed;
13243cf88e5Sdlg 
1330f034227Sclaudio #define ISCSI_SCSI_F_F			0x80
1340f034227Sclaudio #define ISCSI_SCSI_F_R			0x40
1350f034227Sclaudio #define ISCSI_SCSI_F_W			0x20
1360f034227Sclaudio 
1370f034227Sclaudio #define ISCSI_SCSI_ATTR_UNTAGGED	0
1380f034227Sclaudio #define ISCSI_SCSI_ATTR_SIMPLE		1
1390f034227Sclaudio #define ISCSI_SCSI_ATTR_ORDERED		2
1400f034227Sclaudio #define ISCSI_SCSI_ATTR_HEAD_OF_Q	3
1410f034227Sclaudio #define ISCSI_SCSI_ATTR_ACA		4
1420f034227Sclaudio 
1430f034227Sclaudio #define ISCSI_SCSI_STAT_GOOD		0x00
1440f034227Sclaudio #define ISCSI_SCSI_STAT_CHCK_COND	0x02
1450f034227Sclaudio /* we don't care about the type of the other error conditions */
1460f034227Sclaudio 
14743cf88e5Sdlg struct iscsi_pdu_task_request {
14843cf88e5Sdlg 	u_int8_t	opcode;
14943cf88e5Sdlg 	u_int8_t	flags;
15043cf88e5Sdlg 	u_int8_t	reserved[2];
15143cf88e5Sdlg 
15243cf88e5Sdlg 	u_int8_t	ahslen;
15343cf88e5Sdlg 	u_int8_t	datalen[3];
15443cf88e5Sdlg 
15543cf88e5Sdlg 	u_int8_t	lun[8];
15643cf88e5Sdlg 
15743cf88e5Sdlg 	u_int32_t	itt;
15843cf88e5Sdlg 
15943cf88e5Sdlg 	u_int32_t	tag;
16043cf88e5Sdlg 
16143cf88e5Sdlg 	u_int32_t	cmdsn;
16243cf88e5Sdlg 
16343cf88e5Sdlg 	u_int32_t	expstatsn;
16443cf88e5Sdlg 
16543cf88e5Sdlg 	u_int32_t	refcmdsn;
16643cf88e5Sdlg 
16743cf88e5Sdlg 	u_int32_t	expdatasn;
16843cf88e5Sdlg 
16943cf88e5Sdlg 	u_int8_t	_reserved[8];
17043cf88e5Sdlg } __packed;
17143cf88e5Sdlg 
17243cf88e5Sdlg struct iscsi_pdu_task_response {
17343cf88e5Sdlg 	u_int8_t	opcode;
17443cf88e5Sdlg 	u_int8_t	flags;
17543cf88e5Sdlg 	u_int8_t	response;
17643cf88e5Sdlg 	u_int8_t	_reserved1;
17743cf88e5Sdlg 
17843cf88e5Sdlg 	u_int8_t	ahslen;
17943cf88e5Sdlg 	u_int8_t	datalen[3];
18043cf88e5Sdlg 
181c3f5b1d1Sjordan 	u_int8_t	_reserved[8];
182c3f5b1d1Sjordan 
183c3f5b1d1Sjordan 	u_int32_t	itt;
184c3f5b1d1Sjordan 
18543cf88e5Sdlg 	u_int8_t	_reserved2[4];
18643cf88e5Sdlg 
18743cf88e5Sdlg 	u_int32_t	statsn;
18843cf88e5Sdlg 
18943cf88e5Sdlg 	u_int32_t	expcmdsn;
19043cf88e5Sdlg 
19143cf88e5Sdlg 	u_int32_t	maxcmdsn;
19243cf88e5Sdlg 
19343cf88e5Sdlg 	u_int8_t	_reserved3[12];
19443cf88e5Sdlg } __packed;
19543cf88e5Sdlg 
19643cf88e5Sdlg struct iscsi_pdu_data_out {
19743cf88e5Sdlg 	u_int8_t	opcode;
19843cf88e5Sdlg 	u_int8_t	flags;
19943cf88e5Sdlg 	u_int8_t	_reserved1[2];
20043cf88e5Sdlg 
20143cf88e5Sdlg 	u_int8_t	ahslen;
20243cf88e5Sdlg 	u_int8_t	datalen[3];
20343cf88e5Sdlg 
20443cf88e5Sdlg 	u_int8_t	lun[8];
20543cf88e5Sdlg 
20643cf88e5Sdlg 	u_int32_t	itt;
20743cf88e5Sdlg 
20843cf88e5Sdlg 	u_int32_t	ttt;
20943cf88e5Sdlg 
21043cf88e5Sdlg 	u_int8_t	_reserved2[4];
21143cf88e5Sdlg 
21243cf88e5Sdlg 	u_int32_t	expstatsn;
21343cf88e5Sdlg 
21443cf88e5Sdlg 	u_int8_t	_reserved3[4];
21543cf88e5Sdlg 
21643cf88e5Sdlg 	u_int32_t	datasn;
21743cf88e5Sdlg 
21843cf88e5Sdlg 	u_int32_t	buffer_offs;
21943cf88e5Sdlg 
22043cf88e5Sdlg 	u_int8_t	_reserved4[4];
22143cf88e5Sdlg } __packed;
22243cf88e5Sdlg 
22343cf88e5Sdlg struct iscsi_pdu_data_in {
22443cf88e5Sdlg 	u_int8_t	opcode;
22543cf88e5Sdlg 	u_int8_t	flags;
22643cf88e5Sdlg 	u_int8_t	_reserved;
22743cf88e5Sdlg 	u_int8_t	status;
22843cf88e5Sdlg 
22943cf88e5Sdlg 	u_int8_t	ahslen;
23043cf88e5Sdlg 	u_int8_t	datalen[3];
23143cf88e5Sdlg 
23243cf88e5Sdlg 	u_int8_t	lun[8];
23343cf88e5Sdlg 
23443cf88e5Sdlg 	u_int32_t	itt;
23543cf88e5Sdlg 
23643cf88e5Sdlg 	u_int32_t	ttt;
23743cf88e5Sdlg 
238e740f298Sclaudio 	u_int32_t	statsn;
23943cf88e5Sdlg 
240e740f298Sclaudio 	u_int32_t	expcmdsn;
24143cf88e5Sdlg 
242e740f298Sclaudio 	u_int32_t	maxcmdsn;
24343cf88e5Sdlg 
244e740f298Sclaudio 	u_int32_t	datasn;
24543cf88e5Sdlg 
246e740f298Sclaudio 	u_int32_t	buffer_offs;
24743cf88e5Sdlg 
248e740f298Sclaudio 	u_int32_t	residual;
24943cf88e5Sdlg } __packed;
25043cf88e5Sdlg 
25143cf88e5Sdlg struct iscsi_pdu_rt2 {
25243cf88e5Sdlg 	u_int8_t	opcode;
25343cf88e5Sdlg 	u_int8_t	flags;
25443cf88e5Sdlg 	u_int8_t	_reserved1[2];
25543cf88e5Sdlg 
25643cf88e5Sdlg 	u_int8_t	ahslen;
25743cf88e5Sdlg 	u_int8_t	datalen[3];
25843cf88e5Sdlg 
25943cf88e5Sdlg 	u_int8_t	lun[8];
26043cf88e5Sdlg 
26143cf88e5Sdlg 	u_int32_t	itt;
26243cf88e5Sdlg 
26343cf88e5Sdlg 	u_int32_t	ttt;
26443cf88e5Sdlg 
26543cf88e5Sdlg 	u_int32_t	statsn;
26643cf88e5Sdlg 
26743cf88e5Sdlg 	u_int32_t	expcmdsn;
26843cf88e5Sdlg 
26943cf88e5Sdlg 	u_int32_t	maxcmdsn;
27043cf88e5Sdlg 
27143cf88e5Sdlg 	u_int32_t	r2tsn;
27243cf88e5Sdlg 
27343cf88e5Sdlg 	u_int32_t	buffer_offs;
27443cf88e5Sdlg 
27543cf88e5Sdlg 	u_int32_t	desired_datalen;
27643cf88e5Sdlg } __packed;
27743cf88e5Sdlg 
27843cf88e5Sdlg struct iscsi_pdu_async {
27943cf88e5Sdlg 	u_int8_t	opcode;
28043cf88e5Sdlg 	u_int8_t	flags;
28143cf88e5Sdlg 	u_int8_t	_reserved1[2];
28243cf88e5Sdlg 
28343cf88e5Sdlg 	u_int8_t	ahslen;
28443cf88e5Sdlg 	u_int8_t	datalen[3];
28543cf88e5Sdlg 
28643cf88e5Sdlg 	u_int8_t	lun[8];
28743cf88e5Sdlg 
28843cf88e5Sdlg 	u_int32_t	ffffffff;
28943cf88e5Sdlg 
29043cf88e5Sdlg 	u_int8_t	_reserved2[4];
29143cf88e5Sdlg 
29243cf88e5Sdlg 	u_int32_t	statsn;
29343cf88e5Sdlg 
294c3f5b1d1Sjordan 	u_int32_t	expcmdsn;
29543cf88e5Sdlg 
296c3f5b1d1Sjordan 	u_int32_t	maxcmdsn;
29743cf88e5Sdlg 
29843cf88e5Sdlg 	u_int8_t	event;
29943cf88e5Sdlg 	u_int8_t	vcode;
300c3f5b1d1Sjordan 	u_int16_t	param[3];
30143cf88e5Sdlg 
30243cf88e5Sdlg 	u_int8_t	_reserved3[4];
30343cf88e5Sdlg } __packed;
30443cf88e5Sdlg 
30543cf88e5Sdlg struct iscsi_pdu_text_request {
30643cf88e5Sdlg 	u_int8_t	opcode;
30743cf88e5Sdlg 	u_int8_t	flags;
30843cf88e5Sdlg 	u_int8_t	_reserved1[2];
30943cf88e5Sdlg 
31043cf88e5Sdlg 	u_int8_t	ahslen;
31143cf88e5Sdlg 	u_int8_t	datalen[3];
31243cf88e5Sdlg 
31343cf88e5Sdlg 	u_int8_t	lun[8];
31443cf88e5Sdlg 
31543cf88e5Sdlg 	u_int32_t	itt;
31643cf88e5Sdlg 
31743cf88e5Sdlg 	u_int32_t	ttt;
31843cf88e5Sdlg 
31943cf88e5Sdlg 	u_int32_t	cmdsn;
32043cf88e5Sdlg 
32143cf88e5Sdlg 	u_int32_t	expstatsn;
32243cf88e5Sdlg 
32343cf88e5Sdlg 	u_int8_t	_reserved2[16];
32443cf88e5Sdlg } __packed;
32543cf88e5Sdlg 
32643cf88e5Sdlg struct iscsi_pdu_text_response {
32743cf88e5Sdlg 	u_int8_t	opcode;
32843cf88e5Sdlg 	u_int8_t	flags;
32943cf88e5Sdlg 	u_int8_t	_reserved1[2];
33043cf88e5Sdlg 
33143cf88e5Sdlg 	u_int8_t	ahslen;
33243cf88e5Sdlg 	u_int8_t	datalen[3];
33343cf88e5Sdlg 
33443cf88e5Sdlg 	u_int8_t	lun[8];
33543cf88e5Sdlg 
33643cf88e5Sdlg 	u_int32_t	itt;
33743cf88e5Sdlg 
33843cf88e5Sdlg 	u_int32_t	ttt;
33943cf88e5Sdlg 
34043cf88e5Sdlg 	u_int32_t	cmdsn;
34143cf88e5Sdlg 
34243cf88e5Sdlg 	u_int32_t	expcmdsn;
34343cf88e5Sdlg 
34443cf88e5Sdlg 	u_int32_t	maxcmdsn;
34543cf88e5Sdlg 
34643cf88e5Sdlg 	u_int8_t	_reserved2[12];
34743cf88e5Sdlg } __packed;
34843cf88e5Sdlg 
349dfa1edcaSclaudio #define ISCSI_TEXT_F_F	0x80
350dfa1edcaSclaudio #define ISCSI_TEXT_F_C	0x40
351dfa1edcaSclaudio 
35243cf88e5Sdlg struct iscsi_pdu_login_request {
35343cf88e5Sdlg 	u_int8_t	opcode;
35443cf88e5Sdlg 	u_int8_t	flags;
35543cf88e5Sdlg 	u_int8_t	version_max;
35643cf88e5Sdlg 	u_int8_t	version_min;
35743cf88e5Sdlg 
35843cf88e5Sdlg 	u_int8_t	ahslen;
35943cf88e5Sdlg 	u_int8_t	datalen[3];
36043cf88e5Sdlg 
3613507dc17Sclaudio 	u_int32_t	isid_base;
3623507dc17Sclaudio 	u_int16_t	isid_qual;
3633507dc17Sclaudio 	u_int16_t	tsih;
36443cf88e5Sdlg 
36543cf88e5Sdlg 	u_int32_t	itt;
36643cf88e5Sdlg 
36743cf88e5Sdlg 	u_int16_t	cid;
36843cf88e5Sdlg 	u_int8_t	_reserved1[2];
36943cf88e5Sdlg 
37043cf88e5Sdlg 	u_int32_t	cmdsn;
37143cf88e5Sdlg 
37243cf88e5Sdlg 	u_int32_t	expstatsn;
37343cf88e5Sdlg 
37443cf88e5Sdlg 	u_int8_t	_reserved2[16];
37543cf88e5Sdlg } __packed;
37643cf88e5Sdlg 
377e740f298Sclaudio #define ISCSI_LOGIN_F_T		0x80
378e740f298Sclaudio #define ISCSI_LOGIN_F_C		0x40
379e740f298Sclaudio #define ISCSI_LOGIN_F_CSG(x)	(((x) & 0x3) << 2)
380e740f298Sclaudio #define ISCSI_LOGIN_F_NSG(x)	((x) & 0x3)
381e740f298Sclaudio #define ISCSI_LOGIN_STG_SECNEG	0
382e740f298Sclaudio #define ISCSI_LOGIN_STG_OPNEG	1
383e740f298Sclaudio #define ISCSI_LOGIN_STG_FULL	3
384e740f298Sclaudio 
38543cf88e5Sdlg struct iscsi_pdu_login_response {
38643cf88e5Sdlg 	u_int8_t	opcode;
38743cf88e5Sdlg 	u_int8_t	flags;
38843cf88e5Sdlg 	u_int8_t	version_max;
38943cf88e5Sdlg 	u_int8_t	version_active;
39043cf88e5Sdlg 
39143cf88e5Sdlg 	u_int8_t	ahslen;
39243cf88e5Sdlg 	u_int8_t	datalen[3];
39343cf88e5Sdlg 
3943507dc17Sclaudio 	u_int32_t	isid_base;
3953507dc17Sclaudio 	u_int16_t	isid_qual;
3963507dc17Sclaudio 	u_int16_t	tsih;
39743cf88e5Sdlg 
39843cf88e5Sdlg 	u_int32_t	itt;
39943cf88e5Sdlg 
40043cf88e5Sdlg 	u_int8_t	_reserved1[4];
40143cf88e5Sdlg 
40243cf88e5Sdlg 	u_int32_t	statsn;
40343cf88e5Sdlg 
40443cf88e5Sdlg 	u_int32_t	expcmdsn;
40543cf88e5Sdlg 
40643cf88e5Sdlg 	u_int32_t	maxcmdsn;
40743cf88e5Sdlg 
40843cf88e5Sdlg 	u_int8_t	status_class;
40943cf88e5Sdlg 	u_int8_t	status_detail;
41043cf88e5Sdlg 
41143cf88e5Sdlg 	u_int8_t	_reserved2[10];
41243cf88e5Sdlg } __packed;
41343cf88e5Sdlg 
41443cf88e5Sdlg struct iscsi_pdu_logout_request {
41543cf88e5Sdlg 	u_int8_t	opcode;
41643cf88e5Sdlg 	u_int8_t	flags;
41743cf88e5Sdlg 	u_int8_t	_reserved1[2];
41843cf88e5Sdlg 
41943cf88e5Sdlg 	u_int8_t	ahslen;
42043cf88e5Sdlg 	u_int8_t	datalen[3];
42143cf88e5Sdlg 
42243cf88e5Sdlg 	u_int8_t	_reserved2[8];
42343cf88e5Sdlg 
42443cf88e5Sdlg 	u_int32_t	itt;
42543cf88e5Sdlg 
42643cf88e5Sdlg 	u_int16_t	cid;
42743cf88e5Sdlg 	u_int8_t	_reserved3[2];
42843cf88e5Sdlg 
42943cf88e5Sdlg 	u_int32_t	cmdsn;
43043cf88e5Sdlg 
43143cf88e5Sdlg 	u_int32_t	expstatsn;
43243cf88e5Sdlg 
43343cf88e5Sdlg 	u_int8_t	_reserved4[16];
43443cf88e5Sdlg } __packed;
43543cf88e5Sdlg 
436661c88cfSclaudio #define ISCSI_LOGOUT_F		0x80
437661c88cfSclaudio #define ISCSI_LOGOUT_CLOSE_SESS	0
438661c88cfSclaudio #define ISCSI_LOGOUT_CLOSE_CONN	1
439661c88cfSclaudio #define ISCSI_LOGOUT_RCVRY_CONN	2
440661c88cfSclaudio 
441661c88cfSclaudio #define ISCSI_LOGOUT_RESP_SUCCESS	0
442661c88cfSclaudio #define ISCSI_LOGOUT_RESP_UNKN_CID	1
443661c88cfSclaudio #define ISCSI_LOGOUT_RESP_NO_SUPPORT	2
444661c88cfSclaudio #define ISCSI_LOGOUT_RESP_ERROR		3
445661c88cfSclaudio 
44643cf88e5Sdlg struct iscsi_pdu_logout_response {
44743cf88e5Sdlg 	u_int8_t	opcode;
44843cf88e5Sdlg 	u_int8_t	flags;
449661c88cfSclaudio 	u_int8_t	response;
450661c88cfSclaudio 	u_int8_t	_reserved1;
45143cf88e5Sdlg 
45243cf88e5Sdlg 	u_int8_t	ahslen;
45343cf88e5Sdlg 	u_int8_t	datalen[3];
45443cf88e5Sdlg 
45543cf88e5Sdlg 	u_int8_t	_reserved2[8];
45643cf88e5Sdlg 
45743cf88e5Sdlg 	u_int32_t	itt;
45843cf88e5Sdlg 
45943cf88e5Sdlg 	u_int8_t	_reserved3[4];
46043cf88e5Sdlg 
46143cf88e5Sdlg 	u_int32_t	statsn;
46243cf88e5Sdlg 
46343cf88e5Sdlg 	u_int32_t	expcmdsn;
46443cf88e5Sdlg 
46543cf88e5Sdlg 	u_int32_t	maxcmdsn;
46643cf88e5Sdlg 
46743cf88e5Sdlg 	u_int8_t	_reserved4[4];
46843cf88e5Sdlg 
46943cf88e5Sdlg 	u_int16_t	time2wait;
47043cf88e5Sdlg 	u_int16_t	time2retain;
47143cf88e5Sdlg 
47243cf88e5Sdlg 	u_int8_t	_reserved5[4];
47343cf88e5Sdlg } __packed;
47443cf88e5Sdlg 
47543cf88e5Sdlg struct iscsi_pdu_snack_request {
47643cf88e5Sdlg 	u_int8_t	opcode;
47743cf88e5Sdlg 	u_int8_t	flags;
47843cf88e5Sdlg 	u_int8_t	_reserved1[2];
47943cf88e5Sdlg 
48043cf88e5Sdlg 	u_int8_t	ahslen;
48143cf88e5Sdlg 	u_int8_t	datalen[3];
48243cf88e5Sdlg 
48343cf88e5Sdlg 	u_int8_t	lun[8];
48443cf88e5Sdlg 
48543cf88e5Sdlg 	u_int32_t	itt;
48643cf88e5Sdlg 
48743cf88e5Sdlg 	u_int32_t	ttt;
48843cf88e5Sdlg 
48943cf88e5Sdlg 	u_int8_t	_reserved2[4];
49043cf88e5Sdlg 
49143cf88e5Sdlg 	u_int32_t	expstatsn;
49243cf88e5Sdlg 
49343cf88e5Sdlg 	u_int8_t	_reserved3[8];
49443cf88e5Sdlg 
49543cf88e5Sdlg 	u_int32_t	begrun;
49643cf88e5Sdlg 
49743cf88e5Sdlg 	u_int32_t	runlength;
49843cf88e5Sdlg } __packed;
49943cf88e5Sdlg 
50043cf88e5Sdlg struct iscsi_pdu_reject {
50143cf88e5Sdlg 	u_int8_t	opcode;
50243cf88e5Sdlg 	u_int8_t	flags;
50343cf88e5Sdlg 	u_int8_t	reason;
50443cf88e5Sdlg 	u_int8_t	_reserved1;
50543cf88e5Sdlg 
50643cf88e5Sdlg 	u_int8_t	ahslen;
50743cf88e5Sdlg 	u_int8_t	datalen[3];
50843cf88e5Sdlg 
50943cf88e5Sdlg 	u_int8_t	_reserved2[8];
51043cf88e5Sdlg 
51143cf88e5Sdlg 	u_int32_t	ffffffff;
51243cf88e5Sdlg 
51343cf88e5Sdlg 	u_int8_t	_reserved3[4];
51443cf88e5Sdlg 
51543cf88e5Sdlg 	u_int32_t	statsn;
51643cf88e5Sdlg 
51743cf88e5Sdlg 	u_int32_t	expcmdsn;
51843cf88e5Sdlg 
51943cf88e5Sdlg 	u_int32_t	maxcmdsn;
52043cf88e5Sdlg 
52143cf88e5Sdlg 	u_int32_t	datasn_r2tsn;
52243cf88e5Sdlg 
52343cf88e5Sdlg 	u_int8_t	_reserved4[8];
52443cf88e5Sdlg } __packed;
52543cf88e5Sdlg 
52643cf88e5Sdlg struct iscsi_pdu_nop_out {
52743cf88e5Sdlg 	u_int8_t	opcode;
52843cf88e5Sdlg 	u_int8_t	flags;
52943cf88e5Sdlg 	u_int8_t	_reserved1[2];
53043cf88e5Sdlg 
53143cf88e5Sdlg 	u_int8_t	ahslen;
53243cf88e5Sdlg 	u_int8_t	datalen[3];
53343cf88e5Sdlg 
53443cf88e5Sdlg 	u_int8_t	lun[8];
53543cf88e5Sdlg 
53643cf88e5Sdlg 	u_int32_t	itt;
53743cf88e5Sdlg 
53843cf88e5Sdlg 	u_int32_t	ttt;
53943cf88e5Sdlg 
54043cf88e5Sdlg 	u_int32_t	cmdsn;
54143cf88e5Sdlg 
54243cf88e5Sdlg 	u_int32_t	expstatsn;
54343cf88e5Sdlg 
54443cf88e5Sdlg 	u_int8_t	_reserved2[16];
54543cf88e5Sdlg } __packed;
54643cf88e5Sdlg 
54743cf88e5Sdlg struct iscsi_pdu_nop_in {
54843cf88e5Sdlg 	u_int8_t	opcode;
54943cf88e5Sdlg 	u_int8_t	flags;
55043cf88e5Sdlg 	u_int8_t	_reserved1[2];
55143cf88e5Sdlg 
55243cf88e5Sdlg 	u_int8_t	ahslen;
55343cf88e5Sdlg 	u_int8_t	datalen[3];
55443cf88e5Sdlg 
55543cf88e5Sdlg 	u_int8_t	lun[8];
55643cf88e5Sdlg 
55743cf88e5Sdlg 	u_int32_t	itt;
55843cf88e5Sdlg 
55943cf88e5Sdlg 	u_int32_t	ttt;
56043cf88e5Sdlg 
56143cf88e5Sdlg 	u_int32_t	statsn;
56243cf88e5Sdlg 
56343cf88e5Sdlg 	u_int32_t	expcmdsn;
56443cf88e5Sdlg 
56543cf88e5Sdlg 	u_int32_t	maxcmdsn;
56643cf88e5Sdlg 
56743cf88e5Sdlg 	u_int8_t	_reserved2[12];
56843cf88e5Sdlg } __packed;
56943cf88e5Sdlg 
570*dd0887e4Skrw #endif /* _SCSI_ISCSI_H */
571