xref: /openbsd/sys/scsi/iscsi.h (revision 404b540a)
1 /*	$OpenBSD: iscsi.h,v 1.6 2009/08/27 14:12:27 claudio Exp $ */
2 
3 /*
4  * Copyright (c) 2008 David Gwynne <dlg@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #ifndef _SYS_SCSI_ISCSI_H
20 #define _SYS_SCSI_ISCSI_H
21 
22 struct iscsi_pdu {
23 	u_int8_t	opcode;
24 	u_int8_t	flags;
25 	u_int8_t	_reserved1[2];
26 
27 	u_int8_t	ahslen;
28 	u_int8_t	datalen[3];
29 
30 	u_int8_t	lun[8];
31 
32 	u_int32_t	itt;
33 
34 	u_int8_t	_reserved2[4];
35 
36 	u_int32_t	cmdsn;
37 
38 	u_int32_t	expstatsn;
39 
40 	u_int8_t	_reserved3[16];
41 } __packed;
42 
43 /*
44  * Initiator opcodes
45  */
46 
47 #define ISCSI_OP_I_NOP			0x00
48 #define ISCSI_OP_SCSI_REQUEST		0x01
49 #define ISCSI_OP_TASK_REQUEST		0x02
50 #define ISCSI_OP_LOGIN_REQUEST		0x03
51 #define ISCSI_OP_TEXT_REQUEST		0x04
52 #define ISCSI_OP_DATA_OUT		0x05
53 #define ISCSI_OP_LOGOUT_REQUEST		0x06
54 #define ISCSI_OP_SNACK_REQUEST		0x10
55 
56 /*
57  * Target opcodes
58  */
59 
60 #define ISCSI_OP_T_NOP			0x20
61 #define ISCSI_OP_SCSI_RESPONSE		0x21
62 #define ISCSI_OP_TASK_RESPONSE		0x22
63 #define ISCSI_OP_LOGIN_RESPONSE		0x23
64 #define ISCSI_OP_TEXT_RESPONSE		0x24
65 #define ISCSI_OP_DATA_IN		0x25
66 #define ISCSI_OP_LOGOUT_RESPONSE	0x26
67 #define ISCSI_OP_R2T			0x31
68 #define ISCSI_OP_ASYNC			0x32
69 #define ISCSI_OP_REJECT			0x3f
70 
71 #define ISCSI_PDU_OPCODE(_o)		((_o) & 0x3f)
72 #define ISCSI_PDU_I(_h)			((_h)->opcode & 0x40)
73 #define ISCSI_PDU_F(_h)			((_h)->flags & 0x80)
74 
75 #define ISCSI_OP_F_IMMEDIATE		0x40
76 
77 /*
78  * various other flags and values
79  */
80 #define ISCSI_ISID_OUI			0x00000000
81 #define ISCSI_ISID_EN			0x40000000
82 #define ISCSI_ISID_RAND			0x80000000
83 
84 struct iscsi_pdu_scsi_request {
85 	u_int8_t	opcode;
86 	u_int8_t	flags;
87 	u_int8_t	_reserved[2];
88 
89 	u_int8_t	ahslen;
90 	u_int8_t	datalen[3];
91 
92 	u_int8_t	lun[8];
93 
94 	u_int32_t	itt;
95 
96 	u_int32_t	bytes;
97 
98 	u_int32_t	cmdsn;
99 
100 	u_int32_t	expstatsn;
101 
102 	u_int8_t	cdb[16];
103 } __packed;
104 
105 struct iscsi_pdu_scsi_response {
106 	u_int8_t	opcode;
107 	u_int8_t	flags;
108 	u_int8_t	response;
109 	u_int8_t	status;
110 
111 	u_int8_t	ahslen;
112 	u_int8_t	datalen[3];
113 
114 	u_int8_t	_reserved[8];
115 
116 	u_int32_t	itt;
117 
118 	u_int32_t	snack;
119 
120 	u_int32_t	statsn;
121 
122 	u_int32_t	expcmdsn;
123 
124 	u_int32_t	maxcmdsn;
125 
126 	u_int32_t	expdatasn;
127 } __packed;
128 
129 #define ISCSI_SCSI_F_F			0x80
130 #define ISCSI_SCSI_F_R			0x40
131 #define ISCSI_SCSI_F_W			0x20
132 
133 #define ISCSI_SCSI_ATTR_UNTAGGED	0
134 #define ISCSI_SCSI_ATTR_SIMPLE		1
135 #define ISCSI_SCSI_ATTR_ORDERED		2
136 #define ISCSI_SCSI_ATTR_HEAD_OF_Q	3
137 #define ISCSI_SCSI_ATTR_ACA		4
138 
139 #define ISCSI_SCSI_STAT_GOOD		0x00
140 #define ISCSI_SCSI_STAT_CHCK_COND	0x02
141 /* we don't care about the type of the other error conditions */
142 
143 struct iscsi_pdu_task_request {
144 	u_int8_t	opcode;
145 	u_int8_t	flags;
146 	u_int8_t	reserved[2];
147 
148 	u_int8_t	ahslen;
149 	u_int8_t	datalen[3];
150 
151 	u_int8_t	lun[8];
152 
153 	u_int32_t	itt;
154 
155 	u_int32_t	tag;
156 
157 	u_int32_t	cmdsn;
158 
159 	u_int32_t	expstatsn;
160 
161 	u_int32_t	refcmdsn;
162 
163 	u_int32_t	expdatasn;
164 
165 	u_int8_t	_reserved[8];
166 } __packed;
167 
168 struct iscsi_pdu_task_response {
169 	u_int8_t	opcode;
170 	u_int8_t	flags;
171 	u_int8_t	response;
172 	u_int8_t	_reserved1;
173 
174 	u_int8_t	ahslen;
175 	u_int8_t	datalen[3];
176 
177 	u_int8_t	_reserved2[4];
178 
179 	u_int32_t	statsn;
180 
181 	u_int32_t	expcmdsn;
182 
183 	u_int32_t	maxcmdsn;
184 
185 	u_int8_t	_reserved3[12];
186 } __packed;
187 
188 struct iscsi_pdu_data_out {
189 	u_int8_t	opcode;
190 	u_int8_t	flags;
191 	u_int8_t	_reserved1[2];
192 
193 	u_int8_t	ahslen;
194 	u_int8_t	datalen[3];
195 
196 	u_int8_t	lun[8];
197 
198 	u_int32_t	itt;
199 
200 	u_int32_t	ttt;
201 
202 	u_int8_t	_reserved2[4];
203 
204 	u_int32_t	expstatsn;
205 
206 	u_int8_t	_reserved3[4];
207 
208 	u_int32_t	datasn;
209 
210 	u_int32_t	buffer_offs;
211 
212 	u_int8_t	_reserved4[4];
213 } __packed;
214 
215 struct iscsi_pdu_data_in {
216 	u_int8_t	opcode;
217 	u_int8_t	flags;
218 	u_int8_t	_reserved;
219 	u_int8_t	status;
220 
221 	u_int8_t	ahslen;
222 	u_int8_t	datalen[3];
223 
224 	u_int8_t	lun[8];
225 
226 	u_int32_t	itt;
227 
228 	u_int32_t	ttt;
229 
230 	u_int32_t	statsn;
231 
232 	u_int32_t	expcmdsn;
233 
234 	u_int32_t	maxcmdsn;
235 
236 	u_int32_t	datasn;
237 
238 	u_int32_t	buffer_offs;
239 
240 	u_int32_t	residual;
241 } __packed;
242 
243 struct iscsi_pdu_rt2 {
244 	u_int8_t	opcode;
245 	u_int8_t	flags;
246 	u_int8_t	_reserved1[2];
247 
248 	u_int8_t	ahslen;
249 	u_int8_t	datalen[3];
250 
251 	u_int8_t	lun[8];
252 
253 	u_int32_t	itt;
254 
255 	u_int32_t	ttt;
256 
257 	u_int32_t	statsn;
258 
259 	u_int32_t	expcmdsn;
260 
261 	u_int32_t	maxcmdsn;
262 
263 	u_int32_t	r2tsn;
264 
265 	u_int32_t	buffer_offs;
266 
267 	u_int32_t	desired_datalen;
268 } __packed;
269 
270 struct iscsi_pdu_async {
271 	u_int8_t	opcode;
272 	u_int8_t	flags;
273 	u_int8_t	_reserved1[2];
274 
275 	u_int8_t	ahslen;
276 	u_int8_t	datalen[3];
277 
278 	u_int8_t	lun[8];
279 
280 	u_int32_t	ffffffff;
281 
282 	u_int8_t	_reserved2[4];
283 
284 	u_int32_t	statsn;
285 
286 	u_int32_t	expstatsn;
287 
288 	u_int32_t	maxstatsn;
289 
290 	u_int8_t	event;
291 	u_int8_t	vcode;
292 	u_int32_t	param[3];
293 
294 	u_int8_t	_reserved3[4];
295 } __packed;
296 
297 struct iscsi_pdu_text_request {
298 	u_int8_t	opcode;
299 	u_int8_t	flags;
300 	u_int8_t	_reserved1[2];
301 
302 	u_int8_t	ahslen;
303 	u_int8_t	datalen[3];
304 
305 	u_int8_t	lun[8];
306 
307 	u_int32_t	itt;
308 
309 	u_int32_t	ttt;
310 
311 	u_int32_t	cmdsn;
312 
313 	u_int32_t	expstatsn;
314 
315 	u_int8_t	_reserved2[16];
316 } __packed;
317 
318 struct iscsi_pdu_text_response {
319 	u_int8_t	opcode;
320 	u_int8_t	flags;
321 	u_int8_t	_reserved1[2];
322 
323 	u_int8_t	ahslen;
324 	u_int8_t	datalen[3];
325 
326 	u_int8_t	lun[8];
327 
328 	u_int32_t	itt;
329 
330 	u_int32_t	ttt;
331 
332 	u_int32_t	cmdsn;
333 
334 	u_int32_t	expcmdsn;
335 
336 	u_int32_t	maxcmdsn;
337 
338 	u_int8_t	_reserved2[12];
339 } __packed;
340 
341 #define ISCSI_TEXT_F_F	0x80
342 #define ISCSI_TEXT_F_C	0x40
343 
344 struct iscsi_pdu_login_request {
345 	u_int8_t	opcode;
346 	u_int8_t	flags;
347 	u_int8_t	version_max;
348 	u_int8_t	version_min;
349 
350 	u_int8_t	ahslen;
351 	u_int8_t	datalen[3];
352 
353 	u_int32_t	isid_base;
354 	u_int16_t	isid_qual;
355 	u_int16_t	tsih;
356 
357 	u_int32_t	itt;
358 
359 	u_int16_t	cid;
360 	u_int8_t	_reserved1[2];
361 
362 	u_int32_t	cmdsn;
363 
364 	u_int32_t	expstatsn;
365 
366 	u_int8_t	_reserved2[16];
367 } __packed;
368 
369 #define ISCSI_LOGIN_F_T		0x80
370 #define ISCSI_LOGIN_F_C		0x40
371 #define ISCSI_LOGIN_F_CSG(x)	(((x) & 0x3) << 2)
372 #define ISCSI_LOGIN_F_NSG(x)	((x) & 0x3)
373 #define ISCSI_LOGIN_STG_SECNEG	0
374 #define ISCSI_LOGIN_STG_OPNEG	1
375 #define ISCSI_LOGIN_STG_FULL	3
376 
377 struct iscsi_pdu_login_response {
378 	u_int8_t	opcode;
379 	u_int8_t	flags;
380 	u_int8_t	version_max;
381 	u_int8_t	version_active;
382 
383 	u_int8_t	ahslen;
384 	u_int8_t	datalen[3];
385 
386 	u_int32_t	isid_base;
387 	u_int16_t	isid_qual;
388 	u_int16_t	tsih;
389 
390 	u_int32_t	itt;
391 
392 	u_int8_t	_reserved1[4];
393 
394 	u_int32_t	statsn;
395 
396 	u_int32_t	expcmdsn;
397 
398 	u_int32_t	maxcmdsn;
399 
400 	u_int8_t	status_class;
401 	u_int8_t	status_detail;
402 
403 	u_int8_t	_reserved2[10];
404 } __packed;
405 
406 struct iscsi_pdu_logout_request {
407 	u_int8_t	opcode;
408 	u_int8_t	flags;
409 	u_int8_t	_reserved1[2];
410 
411 	u_int8_t	ahslen;
412 	u_int8_t	datalen[3];
413 
414 	u_int8_t	_reserved2[8];
415 
416 	u_int32_t	itt;
417 
418 	u_int16_t	cid;
419 	u_int8_t	_reserved3[2];
420 
421 	u_int32_t	cmdsn;
422 
423 	u_int32_t	expstatsn;
424 
425 	u_int8_t	_reserved4[16];
426 } __packed;
427 
428 struct iscsi_pdu_logout_response {
429 	u_int8_t	opcode;
430 	u_int8_t	flags;
431 	u_int8_t	_reserved1[2];
432 
433 	u_int8_t	ahslen;
434 	u_int8_t	datalen[3];
435 
436 	u_int8_t	_reserved2[8];
437 
438 	u_int32_t	itt;
439 
440 	u_int8_t	_reserved3[4];
441 
442 	u_int32_t	statsn;
443 
444 	u_int32_t	expcmdsn;
445 
446 	u_int32_t	maxcmdsn;
447 
448 	u_int8_t	_reserved4[4];
449 
450 	u_int16_t	time2wait;
451 	u_int16_t	time2retain;
452 
453 	u_int8_t	_reserved5[4];
454 } __packed;
455 
456 struct iscsi_pdu_snack_request {
457 	u_int8_t	opcode;
458 	u_int8_t	flags;
459 	u_int8_t	_reserved1[2];
460 
461 	u_int8_t	ahslen;
462 	u_int8_t	datalen[3];
463 
464 	u_int8_t	lun[8];
465 
466 	u_int32_t	itt;
467 
468 	u_int32_t	ttt;
469 
470 	u_int8_t	_reserved2[4];
471 
472 	u_int32_t	expstatsn;
473 
474 	u_int8_t	_reserved3[8];
475 
476 	u_int32_t	begrun;
477 
478 	u_int32_t	runlength;
479 } __packed;
480 
481 struct iscsi_pdu_reject {
482 	u_int8_t	opcode;
483 	u_int8_t	flags;
484 	u_int8_t	reason;
485 	u_int8_t	_reserved1;
486 
487 	u_int8_t	ahslen;
488 	u_int8_t	datalen[3];
489 
490 	u_int8_t	_reserved2[8];
491 
492 	u_int32_t	ffffffff;
493 
494 	u_int8_t	_reserved3[4];
495 
496 	u_int32_t	statsn;
497 
498 	u_int32_t	expcmdsn;
499 
500 	u_int32_t	maxcmdsn;
501 
502 	u_int32_t	datasn_r2tsn;
503 
504 	u_int8_t	_reserved4[8];
505 } __packed;
506 
507 struct iscsi_pdu_nop_out {
508 	u_int8_t	opcode;
509 	u_int8_t	flags;
510 	u_int8_t	_reserved1[2];
511 
512 	u_int8_t	ahslen;
513 	u_int8_t	datalen[3];
514 
515 	u_int8_t	lun[8];
516 
517 	u_int32_t	itt;
518 
519 	u_int32_t	ttt;
520 
521 	u_int32_t	cmdsn;
522 
523 	u_int32_t	expstatsn;
524 
525 	u_int8_t	_reserved2[16];
526 } __packed;
527 
528 struct iscsi_pdu_nop_in {
529 	u_int8_t	opcode;
530 	u_int8_t	flags;
531 	u_int8_t	_reserved1[2];
532 
533 	u_int8_t	ahslen;
534 	u_int8_t	datalen[3];
535 
536 	u_int8_t	lun[8];
537 
538 	u_int32_t	itt;
539 
540 	u_int32_t	ttt;
541 
542 	u_int32_t	statsn;
543 
544 	u_int32_t	expcmdsn;
545 
546 	u_int32_t	maxcmdsn;
547 
548 	u_int8_t	_reserved2[12];
549 } __packed;
550 
551 #endif /* _SYS_SCSI_ISCSI_H */
552