xref: /freebsd/sys/dev/iscsi/iscsi_proto.h (revision 4d846d260e2b9a3d4d0a701462568268cbfe7a5b)
1009ea47eSEdward Tomasz Napierala /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3718cf2ccSPedro F. Giffuni  *
4009ea47eSEdward Tomasz Napierala  * Copyright (c) 2012 The FreeBSD Foundation
5009ea47eSEdward Tomasz Napierala  *
6009ea47eSEdward Tomasz Napierala  * This software was developed by Edward Tomasz Napierala under sponsorship
7009ea47eSEdward Tomasz Napierala  * from the FreeBSD Foundation.
8009ea47eSEdward Tomasz Napierala  *
9009ea47eSEdward Tomasz Napierala  * Redistribution and use in source and binary forms, with or without
10009ea47eSEdward Tomasz Napierala  * modification, are permitted provided that the following conditions
11009ea47eSEdward Tomasz Napierala  * are met:
12009ea47eSEdward Tomasz Napierala  * 1. Redistributions of source code must retain the above copyright
13009ea47eSEdward Tomasz Napierala  *    notice, this list of conditions and the following disclaimer.
14009ea47eSEdward Tomasz Napierala  * 2. Redistributions in binary form must reproduce the above copyright
15009ea47eSEdward Tomasz Napierala  *    notice, this list of conditions and the following disclaimer in the
16009ea47eSEdward Tomasz Napierala  *    documentation and/or other materials provided with the distribution.
17009ea47eSEdward Tomasz Napierala  *
18009ea47eSEdward Tomasz Napierala  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19009ea47eSEdward Tomasz Napierala  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20009ea47eSEdward Tomasz Napierala  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21009ea47eSEdward Tomasz Napierala  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22009ea47eSEdward Tomasz Napierala  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23009ea47eSEdward Tomasz Napierala  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24009ea47eSEdward Tomasz Napierala  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25009ea47eSEdward Tomasz Napierala  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26009ea47eSEdward Tomasz Napierala  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27009ea47eSEdward Tomasz Napierala  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28009ea47eSEdward Tomasz Napierala  * SUCH DAMAGE.
29009ea47eSEdward Tomasz Napierala  *
30009ea47eSEdward Tomasz Napierala  * $FreeBSD$
31009ea47eSEdward Tomasz Napierala  */
32009ea47eSEdward Tomasz Napierala 
33009ea47eSEdward Tomasz Napierala #ifndef ISCSI_PROTO_H
34009ea47eSEdward Tomasz Napierala #define	ISCSI_PROTO_H
35009ea47eSEdward Tomasz Napierala 
36009ea47eSEdward Tomasz Napierala #ifndef CTASSERT
37009ea47eSEdward Tomasz Napierala #define CTASSERT(x)		_CTASSERT(x, __LINE__)
38009ea47eSEdward Tomasz Napierala #define _CTASSERT(x, y)		__CTASSERT(x, y)
39009ea47eSEdward Tomasz Napierala #define __CTASSERT(x, y)	typedef char __assert_ ## y [(x) ? 1 : -1]
40009ea47eSEdward Tomasz Napierala #endif
41009ea47eSEdward Tomasz Napierala 
422124e3b0SAlexander Motin #define	ISCSI_SNGT(x, y)	((int32_t)(x) - (int32_t)(y) > 0)
432124e3b0SAlexander Motin #define	ISCSI_SNLT(x, y)	((int32_t)(x) - (int32_t)(y) < 0)
442124e3b0SAlexander Motin 
45009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_SIZE			48
46009ea47eSEdward Tomasz Napierala #define	ISCSI_HEADER_DIGEST_SIZE	4
47009ea47eSEdward Tomasz Napierala #define	ISCSI_DATA_DIGEST_SIZE		4
48009ea47eSEdward Tomasz Napierala 
49009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_IMMEDIATE	0x40
50009ea47eSEdward Tomasz Napierala 
51009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_NOP_OUT	0x00
52009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_SCSI_COMMAND	0x01
53009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_TASK_REQUEST	0x02
54009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_LOGIN_REQUEST	0x03
55009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_TEXT_REQUEST	0x04
56009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_SCSI_DATA_OUT	0x05
57009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_LOGOUT_REQUEST	0x06
58009ea47eSEdward Tomasz Napierala 
59009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_NOP_IN		0x20
60009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_SCSI_RESPONSE	0x21
61009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_TASK_RESPONSE	0x22
62009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_LOGIN_RESPONSE	0x23
63009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_TEXT_RESPONSE	0x24
64009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_SCSI_DATA_IN	0x25
65009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_LOGOUT_RESPONSE	0x26
66009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_R2T		0x31
67009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_ASYNC_MESSAGE	0x32
68009ea47eSEdward Tomasz Napierala #define	ISCSI_BHS_OPCODE_REJECT		0x3f
69009ea47eSEdward Tomasz Napierala 
70009ea47eSEdward Tomasz Napierala struct iscsi_bhs {
71009ea47eSEdward Tomasz Napierala 	uint8_t		bhs_opcode;
72009ea47eSEdward Tomasz Napierala 	uint8_t		bhs_opcode_specific1[3];
73009ea47eSEdward Tomasz Napierala 	uint8_t		bhs_total_ahs_len;
74009ea47eSEdward Tomasz Napierala 	uint8_t		bhs_data_segment_len[3];
75009ea47eSEdward Tomasz Napierala 	uint64_t	bhs_lun;
76009ea47eSEdward Tomasz Napierala 	uint8_t		bhs_inititator_task_tag[4];
77009ea47eSEdward Tomasz Napierala 	uint8_t		bhs_opcode_specific4[28];
78009ea47eSEdward Tomasz Napierala };
79009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs) == ISCSI_BHS_SIZE);
80009ea47eSEdward Tomasz Napierala 
81009ea47eSEdward Tomasz Napierala #define	BHSSC_FLAGS_F		0x80
82009ea47eSEdward Tomasz Napierala #define	BHSSC_FLAGS_R		0x40
83009ea47eSEdward Tomasz Napierala #define	BHSSC_FLAGS_W		0x20
84009ea47eSEdward Tomasz Napierala #define	BHSSC_FLAGS_ATTR	0x07
85009ea47eSEdward Tomasz Napierala 
86009ea47eSEdward Tomasz Napierala #define	BHSSC_FLAGS_ATTR_UNTAGGED	0
87009ea47eSEdward Tomasz Napierala #define	BHSSC_FLAGS_ATTR_SIMPLE		1
88009ea47eSEdward Tomasz Napierala #define	BHSSC_FLAGS_ATTR_ORDERED	2
89009ea47eSEdward Tomasz Napierala #define	BHSSC_FLAGS_ATTR_HOQ		3
90009ea47eSEdward Tomasz Napierala #define	BHSSC_FLAGS_ATTR_ACA		4
91009ea47eSEdward Tomasz Napierala 
927dbbd1aeSAlexander Motin #define	BHSSC_PRI_MASK		0xf0
937dbbd1aeSAlexander Motin #define	BHSSC_PRI_SHIFT		4
947dbbd1aeSAlexander Motin 
95009ea47eSEdward Tomasz Napierala struct iscsi_bhs_scsi_command {
96009ea47eSEdward Tomasz Napierala 	uint8_t		bhssc_opcode;
97009ea47eSEdward Tomasz Napierala 	uint8_t		bhssc_flags;
987dbbd1aeSAlexander Motin 	uint8_t		bhssc_pri;
997dbbd1aeSAlexander Motin 	uint8_t		bhssc_reserved;
100009ea47eSEdward Tomasz Napierala 	uint8_t		bhssc_total_ahs_len;
101009ea47eSEdward Tomasz Napierala 	uint8_t		bhssc_data_segment_len[3];
102009ea47eSEdward Tomasz Napierala 	uint64_t	bhssc_lun;
103009ea47eSEdward Tomasz Napierala 	uint32_t	bhssc_initiator_task_tag;
104009ea47eSEdward Tomasz Napierala 	uint32_t	bhssc_expected_data_transfer_length;
105009ea47eSEdward Tomasz Napierala 	uint32_t	bhssc_cmdsn;
106009ea47eSEdward Tomasz Napierala 	uint32_t	bhssc_expstatsn;
107009ea47eSEdward Tomasz Napierala 	uint8_t		bhssc_cdb[16];
108009ea47eSEdward Tomasz Napierala };
109009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_scsi_command) == ISCSI_BHS_SIZE);
110009ea47eSEdward Tomasz Napierala 
111009ea47eSEdward Tomasz Napierala #define	BHSSR_FLAGS_RESIDUAL_UNDERFLOW		0x02
112009ea47eSEdward Tomasz Napierala #define	BHSSR_FLAGS_RESIDUAL_OVERFLOW		0x04
113009ea47eSEdward Tomasz Napierala 
114009ea47eSEdward Tomasz Napierala #define	BHSSR_RESPONSE_COMMAND_COMPLETED	0x00
115009ea47eSEdward Tomasz Napierala 
116009ea47eSEdward Tomasz Napierala struct iscsi_bhs_scsi_response {
117009ea47eSEdward Tomasz Napierala 	uint8_t		bhssr_opcode;
118009ea47eSEdward Tomasz Napierala 	uint8_t		bhssr_flags;
119009ea47eSEdward Tomasz Napierala 	uint8_t		bhssr_response;
120009ea47eSEdward Tomasz Napierala 	uint8_t		bhssr_status;
121009ea47eSEdward Tomasz Napierala 	uint8_t		bhssr_total_ahs_len;
122009ea47eSEdward Tomasz Napierala 	uint8_t		bhssr_data_segment_len[3];
123bebf6a85SAlexander Motin 	uint16_t	bhssr_status_qualifier;
124bebf6a85SAlexander Motin 	uint16_t	bhssr_reserved;
125bebf6a85SAlexander Motin 	uint32_t	bhssr_reserved2;
126009ea47eSEdward Tomasz Napierala 	uint32_t	bhssr_initiator_task_tag;
127009ea47eSEdward Tomasz Napierala 	uint32_t	bhssr_snack_tag;
128009ea47eSEdward Tomasz Napierala 	uint32_t	bhssr_statsn;
129009ea47eSEdward Tomasz Napierala 	uint32_t	bhssr_expcmdsn;
130009ea47eSEdward Tomasz Napierala 	uint32_t	bhssr_maxcmdsn;
131009ea47eSEdward Tomasz Napierala 	uint32_t	bhssr_expdatasn;
132009ea47eSEdward Tomasz Napierala 	uint32_t	bhssr_bidirectional_read_residual_count;
133009ea47eSEdward Tomasz Napierala 	uint32_t	bhssr_residual_count;
134009ea47eSEdward Tomasz Napierala };
135009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_scsi_response) == ISCSI_BHS_SIZE);
136009ea47eSEdward Tomasz Napierala 
137009ea47eSEdward Tomasz Napierala #define	BHSTMR_FUNCTION_ABORT_TASK		1
138009ea47eSEdward Tomasz Napierala #define	BHSTMR_FUNCTION_ABORT_TASK_SET		2
139009ea47eSEdward Tomasz Napierala #define	BHSTMR_FUNCTION_CLEAR_ACA		3
140009ea47eSEdward Tomasz Napierala #define	BHSTMR_FUNCTION_CLEAR_TASK_SET		4
141009ea47eSEdward Tomasz Napierala #define	BHSTMR_FUNCTION_LOGICAL_UNIT_RESET	5
142009ea47eSEdward Tomasz Napierala #define	BHSTMR_FUNCTION_TARGET_WARM_RESET	6
143009ea47eSEdward Tomasz Napierala #define	BHSTMR_FUNCTION_TARGET_COLD_RESET	7
144009ea47eSEdward Tomasz Napierala #define	BHSTMR_FUNCTION_TASK_REASSIGN		8
145bebf6a85SAlexander Motin #define	BHSTMR_FUNCTION_QUERY_TASK		9
146bebf6a85SAlexander Motin #define	BHSTMR_FUNCTION_QUERY_TASK_SET		10
147bebf6a85SAlexander Motin #define	BHSTMR_FUNCTION_I_T_NEXUS_RESET		11
148bebf6a85SAlexander Motin #define	BHSTMR_FUNCTION_QUERY_ASYNC_EVENT	12
149009ea47eSEdward Tomasz Napierala 
150009ea47eSEdward Tomasz Napierala struct iscsi_bhs_task_management_request {
151009ea47eSEdward Tomasz Napierala 	uint8_t		bhstmr_opcode;
152009ea47eSEdward Tomasz Napierala 	uint8_t		bhstmr_function;
153009ea47eSEdward Tomasz Napierala 	uint8_t		bhstmr_reserved[2];
154009ea47eSEdward Tomasz Napierala 	uint8_t		bhstmr_total_ahs_len;
155009ea47eSEdward Tomasz Napierala 	uint8_t		bhstmr_data_segment_len[3];
156009ea47eSEdward Tomasz Napierala 	uint64_t	bhstmr_lun;
157009ea47eSEdward Tomasz Napierala 	uint32_t	bhstmr_initiator_task_tag;
158009ea47eSEdward Tomasz Napierala 	uint32_t	bhstmr_referenced_task_tag;
159009ea47eSEdward Tomasz Napierala 	uint32_t	bhstmr_cmdsn;
160009ea47eSEdward Tomasz Napierala 	uint32_t	bhstmr_expstatsn;
161009ea47eSEdward Tomasz Napierala 	uint32_t	bhstmr_refcmdsn;
162009ea47eSEdward Tomasz Napierala 	uint32_t	bhstmr_expdatasn;
163009ea47eSEdward Tomasz Napierala 	uint64_t	bhstmr_reserved2;
164009ea47eSEdward Tomasz Napierala };
165009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_task_management_request) == ISCSI_BHS_SIZE);
166009ea47eSEdward Tomasz Napierala 
167009ea47eSEdward Tomasz Napierala #define	BHSTMR_RESPONSE_FUNCTION_COMPLETE	0
168bebf6a85SAlexander Motin #define	BHSTMR_RESPONSE_TASK_DOES_NOT_EXIST	1
169bebf6a85SAlexander Motin #define	BHSTMR_RESPONSE_LUN_DOES_NOT_EXIST	2
170bebf6a85SAlexander Motin #define	BHSTMR_RESPONSE_TASK_STILL_ALLEGIANT	3
171bebf6a85SAlexander Motin #define	BHSTMR_RESPONSE_TASK_ALL_REASS_NOT_SUPP	4
172009ea47eSEdward Tomasz Napierala #define	BHSTMR_RESPONSE_FUNCTION_NOT_SUPPORTED	5
173bebf6a85SAlexander Motin #define	BHSTMR_RESPONSE_FUNCTION_AUTH_FAIL	6
174bebf6a85SAlexander Motin #define	BHSTMR_RESPONSE_FUNCTION_SUCCEEDED	7
175bebf6a85SAlexander Motin #define	BHSTMR_RESPONSE_FUNCTION_REJECTED	255
176009ea47eSEdward Tomasz Napierala 
177009ea47eSEdward Tomasz Napierala struct iscsi_bhs_task_management_response {
178009ea47eSEdward Tomasz Napierala 	uint8_t		bhstmr_opcode;
179009ea47eSEdward Tomasz Napierala 	uint8_t		bhstmr_flags;
180009ea47eSEdward Tomasz Napierala 	uint8_t		bhstmr_response;
181009ea47eSEdward Tomasz Napierala 	uint8_t		bhstmr_reserved;
182009ea47eSEdward Tomasz Napierala 	uint8_t		bhstmr_total_ahs_len;
183009ea47eSEdward Tomasz Napierala 	uint8_t		bhstmr_data_segment_len[3];
1844b0e5c9eSAlexander Motin 	uint8_t		bhstmr_additional_reponse_information[3];
1854b0e5c9eSAlexander Motin 	uint8_t		bhstmr_reserved2[5];
186009ea47eSEdward Tomasz Napierala 	uint32_t	bhstmr_initiator_task_tag;
187009ea47eSEdward Tomasz Napierala 	uint32_t	bhstmr_reserved3;
188009ea47eSEdward Tomasz Napierala 	uint32_t	bhstmr_statsn;
189009ea47eSEdward Tomasz Napierala 	uint32_t	bhstmr_expcmdsn;
190009ea47eSEdward Tomasz Napierala 	uint32_t	bhstmr_maxcmdsn;
191009ea47eSEdward Tomasz Napierala 	uint8_t		bhstmr_reserved4[12];
192009ea47eSEdward Tomasz Napierala };
193009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_task_management_response) == ISCSI_BHS_SIZE);
194009ea47eSEdward Tomasz Napierala 
195009ea47eSEdward Tomasz Napierala #define	BHSLR_FLAGS_TRANSIT		0x80
196009ea47eSEdward Tomasz Napierala #define	BHSLR_FLAGS_CONTINUE		0x40
197009ea47eSEdward Tomasz Napierala 
198009ea47eSEdward Tomasz Napierala #define	BHSLR_STAGE_SECURITY_NEGOTIATION	0
199009ea47eSEdward Tomasz Napierala #define	BHSLR_STAGE_OPERATIONAL_NEGOTIATION	1
200009ea47eSEdward Tomasz Napierala #define	BHSLR_STAGE_FULL_FEATURE_PHASE		3 /* Yes, 3. */
201009ea47eSEdward Tomasz Napierala 
202009ea47eSEdward Tomasz Napierala struct iscsi_bhs_login_request {
203009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_opcode;
204009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_flags;
205009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_version_max;
206009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_version_min;
207009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_total_ahs_len;
208009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_data_segment_len[3];
209009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_isid[6];
210009ea47eSEdward Tomasz Napierala 	uint16_t	bhslr_tsih;
211009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_initiator_task_tag;
212009ea47eSEdward Tomasz Napierala 	uint16_t	bhslr_cid;
213009ea47eSEdward Tomasz Napierala 	uint16_t	bhslr_reserved;
214009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_cmdsn;
215009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_expstatsn;
216009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_reserved2[16];
217009ea47eSEdward Tomasz Napierala };
218009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_login_request) == ISCSI_BHS_SIZE);
219009ea47eSEdward Tomasz Napierala 
220009ea47eSEdward Tomasz Napierala struct iscsi_bhs_login_response {
221009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_opcode;
222009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_flags;
223009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_version_max;
224009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_version_active;
225009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_total_ahs_len;
226009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_data_segment_len[3];
227009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_isid[6];
228009ea47eSEdward Tomasz Napierala 	uint16_t	bhslr_tsih;
229009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_initiator_task_tag;
230009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_reserved;
231009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_statsn;
232009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_expcmdsn;
233009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_maxcmdsn;
234009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_status_class;
235009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_status_detail;
236009ea47eSEdward Tomasz Napierala 	uint16_t	bhslr_reserved2;
237009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_reserved3[8];
238009ea47eSEdward Tomasz Napierala };
239009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_login_response) == ISCSI_BHS_SIZE);
240009ea47eSEdward Tomasz Napierala 
241009ea47eSEdward Tomasz Napierala #define	BHSTR_FLAGS_FINAL		0x80
242009ea47eSEdward Tomasz Napierala #define	BHSTR_FLAGS_CONTINUE		0x40
243009ea47eSEdward Tomasz Napierala 
244009ea47eSEdward Tomasz Napierala struct iscsi_bhs_text_request {
245009ea47eSEdward Tomasz Napierala 	uint8_t		bhstr_opcode;
246009ea47eSEdward Tomasz Napierala 	uint8_t		bhstr_flags;
247009ea47eSEdward Tomasz Napierala 	uint16_t	bhstr_reserved;
248009ea47eSEdward Tomasz Napierala 	uint8_t		bhstr_total_ahs_len;
249009ea47eSEdward Tomasz Napierala 	uint8_t		bhstr_data_segment_len[3];
250009ea47eSEdward Tomasz Napierala 	uint64_t	bhstr_lun;
251009ea47eSEdward Tomasz Napierala 	uint32_t	bhstr_initiator_task_tag;
252009ea47eSEdward Tomasz Napierala 	uint32_t	bhstr_target_transfer_tag;
253009ea47eSEdward Tomasz Napierala 	uint32_t	bhstr_cmdsn;
254009ea47eSEdward Tomasz Napierala 	uint32_t	bhstr_expstatsn;
255009ea47eSEdward Tomasz Napierala 	uint8_t		bhstr_reserved2[16];
256009ea47eSEdward Tomasz Napierala };
257009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_text_request) == ISCSI_BHS_SIZE);
258009ea47eSEdward Tomasz Napierala 
259009ea47eSEdward Tomasz Napierala struct iscsi_bhs_text_response {
260009ea47eSEdward Tomasz Napierala 	uint8_t		bhstr_opcode;
261009ea47eSEdward Tomasz Napierala 	uint8_t		bhstr_flags;
262009ea47eSEdward Tomasz Napierala 	uint16_t	bhstr_reserved;
263009ea47eSEdward Tomasz Napierala 	uint8_t		bhstr_total_ahs_len;
264009ea47eSEdward Tomasz Napierala 	uint8_t		bhstr_data_segment_len[3];
265009ea47eSEdward Tomasz Napierala 	uint64_t	bhstr_lun;
266009ea47eSEdward Tomasz Napierala 	uint32_t	bhstr_initiator_task_tag;
267009ea47eSEdward Tomasz Napierala 	uint32_t	bhstr_target_transfer_tag;
268009ea47eSEdward Tomasz Napierala 	uint32_t	bhstr_statsn;
269009ea47eSEdward Tomasz Napierala 	uint32_t	bhstr_expcmdsn;
270009ea47eSEdward Tomasz Napierala 	uint32_t	bhstr_maxcmdsn;
271009ea47eSEdward Tomasz Napierala 	uint8_t		bhstr_reserved2[12];
272009ea47eSEdward Tomasz Napierala };
273009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_text_response) == ISCSI_BHS_SIZE);
274009ea47eSEdward Tomasz Napierala 
275009ea47eSEdward Tomasz Napierala #define	BHSDO_FLAGS_F	0x80
276009ea47eSEdward Tomasz Napierala 
277009ea47eSEdward Tomasz Napierala struct iscsi_bhs_data_out {
278009ea47eSEdward Tomasz Napierala 	uint8_t		bhsdo_opcode;
279009ea47eSEdward Tomasz Napierala 	uint8_t		bhsdo_flags;
280009ea47eSEdward Tomasz Napierala 	uint8_t		bhsdo_reserved[2];
281009ea47eSEdward Tomasz Napierala 	uint8_t		bhsdo_total_ahs_len;
282009ea47eSEdward Tomasz Napierala 	uint8_t		bhsdo_data_segment_len[3];
283009ea47eSEdward Tomasz Napierala 	uint64_t	bhsdo_lun;
284009ea47eSEdward Tomasz Napierala 	uint32_t	bhsdo_initiator_task_tag;
285009ea47eSEdward Tomasz Napierala 	uint32_t	bhsdo_target_transfer_tag;
286009ea47eSEdward Tomasz Napierala 	uint32_t	bhsdo_reserved2;
287009ea47eSEdward Tomasz Napierala 	uint32_t	bhsdo_expstatsn;
288009ea47eSEdward Tomasz Napierala 	uint32_t	bhsdo_reserved3;
289009ea47eSEdward Tomasz Napierala 	uint32_t	bhsdo_datasn;
290009ea47eSEdward Tomasz Napierala 	uint32_t	bhsdo_buffer_offset;
291009ea47eSEdward Tomasz Napierala 	uint32_t	bhsdo_reserved4;
292009ea47eSEdward Tomasz Napierala };
293009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_data_out) == ISCSI_BHS_SIZE);
294009ea47eSEdward Tomasz Napierala 
295009ea47eSEdward Tomasz Napierala #define	BHSDI_FLAGS_F	0x80
296009ea47eSEdward Tomasz Napierala #define	BHSDI_FLAGS_A	0x40
297009ea47eSEdward Tomasz Napierala #define	BHSDI_FLAGS_O	0x04
298009ea47eSEdward Tomasz Napierala #define	BHSDI_FLAGS_U	0x02
299009ea47eSEdward Tomasz Napierala #define	BHSDI_FLAGS_S	0x01
300009ea47eSEdward Tomasz Napierala 
301009ea47eSEdward Tomasz Napierala struct iscsi_bhs_data_in {
302009ea47eSEdward Tomasz Napierala 	uint8_t		bhsdi_opcode;
303009ea47eSEdward Tomasz Napierala 	uint8_t		bhsdi_flags;
304009ea47eSEdward Tomasz Napierala 	uint8_t		bhsdi_reserved;
305009ea47eSEdward Tomasz Napierala 	uint8_t		bhsdi_status;
306009ea47eSEdward Tomasz Napierala 	uint8_t		bhsdi_total_ahs_len;
307009ea47eSEdward Tomasz Napierala 	uint8_t		bhsdi_data_segment_len[3];
308009ea47eSEdward Tomasz Napierala 	uint64_t	bhsdi_lun;
309009ea47eSEdward Tomasz Napierala 	uint32_t	bhsdi_initiator_task_tag;
310009ea47eSEdward Tomasz Napierala 	uint32_t	bhsdi_target_transfer_tag;
311009ea47eSEdward Tomasz Napierala 	uint32_t	bhsdi_statsn;
312009ea47eSEdward Tomasz Napierala 	uint32_t	bhsdi_expcmdsn;
313009ea47eSEdward Tomasz Napierala 	uint32_t	bhsdi_maxcmdsn;
314009ea47eSEdward Tomasz Napierala 	uint32_t	bhsdi_datasn;
315009ea47eSEdward Tomasz Napierala 	uint32_t	bhsdi_buffer_offset;
316009ea47eSEdward Tomasz Napierala 	uint32_t	bhsdi_residual_count;
317009ea47eSEdward Tomasz Napierala };
318009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_data_in) == ISCSI_BHS_SIZE);
319009ea47eSEdward Tomasz Napierala 
320009ea47eSEdward Tomasz Napierala struct iscsi_bhs_r2t {
321009ea47eSEdward Tomasz Napierala 	uint8_t		bhsr2t_opcode;
322009ea47eSEdward Tomasz Napierala 	uint8_t		bhsr2t_flags;
323009ea47eSEdward Tomasz Napierala 	uint16_t	bhsr2t_reserved;
324009ea47eSEdward Tomasz Napierala 	uint8_t		bhsr2t_total_ahs_len;
325009ea47eSEdward Tomasz Napierala 	uint8_t		bhsr2t_data_segment_len[3];
326009ea47eSEdward Tomasz Napierala 	uint64_t	bhsr2t_lun;
327009ea47eSEdward Tomasz Napierala 	uint32_t	bhsr2t_initiator_task_tag;
328009ea47eSEdward Tomasz Napierala 	uint32_t	bhsr2t_target_transfer_tag;
329009ea47eSEdward Tomasz Napierala 	uint32_t	bhsr2t_statsn;
330009ea47eSEdward Tomasz Napierala 	uint32_t	bhsr2t_expcmdsn;
331009ea47eSEdward Tomasz Napierala 	uint32_t	bhsr2t_maxcmdsn;
332009ea47eSEdward Tomasz Napierala 	uint32_t	bhsr2t_r2tsn;
333009ea47eSEdward Tomasz Napierala 	uint32_t	bhsr2t_buffer_offset;
334009ea47eSEdward Tomasz Napierala 	uint32_t	bhsr2t_desired_data_transfer_length;
335009ea47eSEdward Tomasz Napierala };
336009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_r2t) == ISCSI_BHS_SIZE);
337009ea47eSEdward Tomasz Napierala 
338009ea47eSEdward Tomasz Napierala struct iscsi_bhs_nop_out {
339009ea47eSEdward Tomasz Napierala 	uint8_t		bhsno_opcode;
340009ea47eSEdward Tomasz Napierala 	uint8_t		bhsno_flags;
341009ea47eSEdward Tomasz Napierala 	uint16_t	bhsno_reserved;
342009ea47eSEdward Tomasz Napierala 	uint8_t		bhsno_total_ahs_len;
343009ea47eSEdward Tomasz Napierala 	uint8_t		bhsno_data_segment_len[3];
344009ea47eSEdward Tomasz Napierala 	uint64_t	bhsno_lun;
345009ea47eSEdward Tomasz Napierala 	uint32_t	bhsno_initiator_task_tag;
346009ea47eSEdward Tomasz Napierala 	uint32_t	bhsno_target_transfer_tag;
347009ea47eSEdward Tomasz Napierala 	uint32_t	bhsno_cmdsn;
348009ea47eSEdward Tomasz Napierala 	uint32_t	bhsno_expstatsn;
349009ea47eSEdward Tomasz Napierala 	uint8_t		bhsno_reserved2[16];
350009ea47eSEdward Tomasz Napierala };
351009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_nop_out) == ISCSI_BHS_SIZE);
352009ea47eSEdward Tomasz Napierala 
353009ea47eSEdward Tomasz Napierala struct iscsi_bhs_nop_in {
354009ea47eSEdward Tomasz Napierala 	uint8_t		bhsni_opcode;
355009ea47eSEdward Tomasz Napierala 	uint8_t		bhsni_flags;
356009ea47eSEdward Tomasz Napierala 	uint16_t	bhsni_reserved;
357009ea47eSEdward Tomasz Napierala 	uint8_t		bhsni_total_ahs_len;
358009ea47eSEdward Tomasz Napierala 	uint8_t		bhsni_data_segment_len[3];
359009ea47eSEdward Tomasz Napierala 	uint64_t	bhsni_lun;
360009ea47eSEdward Tomasz Napierala 	uint32_t	bhsni_initiator_task_tag;
361009ea47eSEdward Tomasz Napierala 	uint32_t	bhsni_target_transfer_tag;
362009ea47eSEdward Tomasz Napierala 	uint32_t	bhsni_statsn;
363009ea47eSEdward Tomasz Napierala 	uint32_t	bhsni_expcmdsn;
364009ea47eSEdward Tomasz Napierala 	uint32_t	bhsni_maxcmdsn;
365009ea47eSEdward Tomasz Napierala 	uint8_t		bhsno_reserved2[12];
366009ea47eSEdward Tomasz Napierala };
367009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_nop_in) == ISCSI_BHS_SIZE);
368009ea47eSEdward Tomasz Napierala 
369009ea47eSEdward Tomasz Napierala #define	BHSLR_REASON_CLOSE_SESSION		0
370009ea47eSEdward Tomasz Napierala #define	BHSLR_REASON_CLOSE_CONNECTION		1
371009ea47eSEdward Tomasz Napierala #define	BHSLR_REASON_REMOVE_FOR_RECOVERY	2
372009ea47eSEdward Tomasz Napierala 
373009ea47eSEdward Tomasz Napierala struct iscsi_bhs_logout_request {
374009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_opcode;
375009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_reason;
376009ea47eSEdward Tomasz Napierala 	uint16_t	bhslr_reserved;
377009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_total_ahs_len;
378009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_data_segment_len[3];
379009ea47eSEdward Tomasz Napierala 	uint64_t	bhslr_reserved2;
380009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_initiator_task_tag;
381009ea47eSEdward Tomasz Napierala 	uint16_t	bhslr_cid;
382009ea47eSEdward Tomasz Napierala 	uint16_t	bhslr_reserved3;
383009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_cmdsn;
384009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_expstatsn;
385009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_reserved4[16];
386009ea47eSEdward Tomasz Napierala };
387009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_logout_request) == ISCSI_BHS_SIZE);
388009ea47eSEdward Tomasz Napierala 
389009ea47eSEdward Tomasz Napierala #define	BHSLR_RESPONSE_CLOSED_SUCCESSFULLY	0
390009ea47eSEdward Tomasz Napierala #define	BHSLR_RESPONSE_RECOVERY_NOT_SUPPORTED	2
391009ea47eSEdward Tomasz Napierala 
392009ea47eSEdward Tomasz Napierala struct iscsi_bhs_logout_response {
393009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_opcode;
394009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_flags;
395009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_response;
396009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_reserved;
397009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_total_ahs_len;
398009ea47eSEdward Tomasz Napierala 	uint8_t		bhslr_data_segment_len[3];
399009ea47eSEdward Tomasz Napierala 	uint64_t	bhslr_reserved2;
400009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_initiator_task_tag;
401009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_reserved3;
402009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_statsn;
403009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_expcmdsn;
404009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_maxcmdsn;
405009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_reserved4;
406009ea47eSEdward Tomasz Napierala 	uint16_t	bhslr_time2wait;
407009ea47eSEdward Tomasz Napierala 	uint16_t	bhslr_time2retain;
408009ea47eSEdward Tomasz Napierala 	uint32_t	bhslr_reserved5;
409009ea47eSEdward Tomasz Napierala };
410009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_logout_response) == ISCSI_BHS_SIZE);
411009ea47eSEdward Tomasz Napierala 
412009ea47eSEdward Tomasz Napierala #define	BHSAM_EVENT_TARGET_REQUESTS_LOGOUT		1
413009ea47eSEdward Tomasz Napierala #define	BHSAM_EVENT_TARGET_TERMINATES_CONNECTION	2
414009ea47eSEdward Tomasz Napierala #define	BHSAM_EVENT_TARGET_TERMINATES_SESSION		3
415009ea47eSEdward Tomasz Napierala 
416009ea47eSEdward Tomasz Napierala struct iscsi_bhs_asynchronous_message {
417009ea47eSEdward Tomasz Napierala 	uint8_t		bhsam_opcode;
418009ea47eSEdward Tomasz Napierala 	uint8_t		bhsam_flags;
419009ea47eSEdward Tomasz Napierala 	uint16_t	bhsam_reserved;
420009ea47eSEdward Tomasz Napierala 	uint8_t		bhsam_total_ahs_len;
421009ea47eSEdward Tomasz Napierala 	uint8_t		bhsam_data_segment_len[3];
422009ea47eSEdward Tomasz Napierala 	uint64_t	bhsam_lun;
423009ea47eSEdward Tomasz Napierala 	uint32_t	bhsam_0xffffffff;
424009ea47eSEdward Tomasz Napierala 	uint32_t	bhsam_reserved2;
425009ea47eSEdward Tomasz Napierala 	uint32_t	bhsam_statsn;
426009ea47eSEdward Tomasz Napierala 	uint32_t	bhsam_expcmdsn;
427009ea47eSEdward Tomasz Napierala 	uint32_t	bhsam_maxcmdsn;
428009ea47eSEdward Tomasz Napierala 	uint8_t		bhsam_async_event;
429009ea47eSEdward Tomasz Napierala 	uint8_t		bhsam_async_vcode;
430009ea47eSEdward Tomasz Napierala 	uint16_t	bhsam_parameter1;
431009ea47eSEdward Tomasz Napierala 	uint16_t	bhsam_parameter2;
432009ea47eSEdward Tomasz Napierala 	uint16_t	bhsam_parameter3;
433009ea47eSEdward Tomasz Napierala 	uint32_t	bhsam_reserved3;
434009ea47eSEdward Tomasz Napierala };
435009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_asynchronous_message) == ISCSI_BHS_SIZE);
436009ea47eSEdward Tomasz Napierala 
437009ea47eSEdward Tomasz Napierala #define BHSSR_REASON_DATA_DIGEST_ERROR	0x02
438009ea47eSEdward Tomasz Napierala #define BHSSR_PROTOCOL_ERROR		0x04
439009ea47eSEdward Tomasz Napierala #define BHSSR_COMMAND_NOT_SUPPORTED	0x05
440009ea47eSEdward Tomasz Napierala #define BHSSR_INVALID_PDU_FIELD		0x09
441009ea47eSEdward Tomasz Napierala 
442009ea47eSEdward Tomasz Napierala struct iscsi_bhs_reject {
443009ea47eSEdward Tomasz Napierala 	uint8_t		bhsr_opcode;
444009ea47eSEdward Tomasz Napierala 	uint8_t		bhsr_flags;
445009ea47eSEdward Tomasz Napierala 	uint8_t		bhsr_reason;
446009ea47eSEdward Tomasz Napierala 	uint8_t		bhsr_reserved;
447009ea47eSEdward Tomasz Napierala 	uint8_t		bhsr_total_ahs_len;
448009ea47eSEdward Tomasz Napierala 	uint8_t		bhsr_data_segment_len[3];
449009ea47eSEdward Tomasz Napierala 	uint64_t	bhsr_reserved2;
450009ea47eSEdward Tomasz Napierala 	uint32_t	bhsr_0xffffffff;
451009ea47eSEdward Tomasz Napierala 	uint32_t	bhsr_reserved3;
452009ea47eSEdward Tomasz Napierala 	uint32_t	bhsr_statsn;
453009ea47eSEdward Tomasz Napierala 	uint32_t	bhsr_expcmdsn;
454009ea47eSEdward Tomasz Napierala 	uint32_t	bhsr_maxcmdsn;
455009ea47eSEdward Tomasz Napierala 	uint32_t	bhsr_datasn_r2tsn;
456009ea47eSEdward Tomasz Napierala 	uint32_t	bhsr_reserved4;
457009ea47eSEdward Tomasz Napierala 	uint32_t	bhsr_reserved5;
458009ea47eSEdward Tomasz Napierala };
459009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_reject) == ISCSI_BHS_SIZE);
460009ea47eSEdward Tomasz Napierala 
461009ea47eSEdward Tomasz Napierala #endif /* !ISCSI_PROTO_H */
462