f0a58d123dee8911ffcda945949ed498914ab1c2
[mirror/scst/.git] / iscsi-scst / kernel / iscsi_hdr.h
1 /*
2  *  Copyright (C) 2002 - 2003 Ardis Technolgies <roman@ardistech.com>
3  *  Copyright (C) 2007 - 2009 Vladislav Bolkhovitin
4  *  Copyright (C) 2007 - 2009 ID7 Ltd.
5  *
6  *  This program is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU General Public License
8  *  as published by the Free Software Foundation, version 2
9  *  of the License.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  *  GNU General Public License for more details.
15  */
16
17 #ifndef __ISCSI_HDR_H__
18 #define __ISCSI_HDR_H__
19
20 #include <linux/types.h>
21 #include <asm/byteorder.h>
22
23 #define ISCSI_VERSION                   0
24
25 #ifndef __packed
26 #define __packed __attribute__ ((packed))
27 #endif
28
29 struct iscsi_hdr {
30         u8  opcode;                     /* 0 */
31         u8  flags;
32         u8  spec1[2];
33 #if defined(__BIG_ENDIAN_BITFIELD)
34         struct {                        /* 4 */
35                 unsigned ahslength:8;
36                 unsigned datalength:24;
37         } length;
38 #elif defined(__LITTLE_ENDIAN_BITFIELD)
39         u32 length;                     /* 4 */
40 #endif
41         u64 lun;                        /* 8 */
42         u32 itt;                        /* 16 */
43         u32 ttt;                        /* 20 */
44         u32 sn;                         /* 24 */
45         u32 exp_sn;                     /* 28 */
46         u32 max_sn;                     /* 32 */
47         u32 spec3[3];                   /* 36 */
48 } __packed;                             /* 48 */
49
50 /* Opcode encoding bits */
51 #define ISCSI_OP_RETRY                  0x80
52 #define ISCSI_OP_IMMEDIATE              0x40
53 #define ISCSI_OPCODE_MASK               0x3F
54
55 /* Client to Server Message Opcode values */
56 #define ISCSI_OP_NOOP_OUT               0x00
57 #define ISCSI_OP_SCSI_CMD               0x01
58 #define ISCSI_OP_SCSI_TASK_MGT_MSG      0x02
59 #define ISCSI_OP_LOGIN_CMD              0x03
60 #define ISCSI_OP_TEXT_CMD               0x04
61 #define ISCSI_OP_SCSI_DATA_OUT          0x05
62 #define ISCSI_OP_LOGOUT_CMD             0x06
63 #define ISCSI_OP_SNACK_CMD              0x10
64
65 /* Server to Client Message Opcode values */
66 #define ISCSI_OP_NOOP_IN                0x20
67 #define ISCSI_OP_SCSI_RSP               0x21
68 #define ISCSI_OP_SCSI_TASK_MGT_RSP      0x22
69 #define ISCSI_OP_LOGIN_RSP              0x23
70 #define ISCSI_OP_TEXT_RSP               0x24
71 #define ISCSI_OP_SCSI_DATA_IN           0x25
72 #define ISCSI_OP_LOGOUT_RSP             0x26
73 #define ISCSI_OP_R2T                    0x31
74 #define ISCSI_OP_ASYNC_MSG              0x32
75 #define ISCSI_OP_REJECT                 0x3f
76
77 struct iscsi_ahs_hdr {
78         u16 ahslength;
79         u8 ahstype;
80 } __packed;
81
82 #define ISCSI_AHSTYPE_CDB               1
83 #define ISCSI_AHSTYPE_RLENGTH           2
84
85 union iscsi_sid {
86         struct {
87                 u8 isid[6];             /* Initiator Session ID */
88                 u16 tsih;               /* Target Session ID */
89         } id;
90         u64 id64;
91 } __packed;
92
93 struct iscsi_scsi_cmd_hdr {
94         u8  opcode;
95         u8  flags;
96         u16 rsvd1;
97         u8  ahslength;
98         u8  datalength[3];
99         u64 lun;
100         u32 itt;
101         u32 data_length;
102         u32 cmd_sn;
103         u32 exp_stat_sn;
104         u8  scb[16];
105 } __packed;
106
107 #define ISCSI_CMD_FINAL         0x80
108 #define ISCSI_CMD_READ          0x40
109 #define ISCSI_CMD_WRITE         0x20
110 #define ISCSI_CMD_ATTR_MASK     0x07
111 #define ISCSI_CMD_UNTAGGED      0x00
112 #define ISCSI_CMD_SIMPLE        0x01
113 #define ISCSI_CMD_ORDERED       0x02
114 #define ISCSI_CMD_HEAD_OF_QUEUE 0x03
115 #define ISCSI_CMD_ACA           0x04
116
117 struct iscsi_cdb_ahdr {
118         u16 ahslength;
119         u8  ahstype;
120         u8  reserved;
121         u8  cdb[0];
122 } __packed;
123
124 struct iscsi_rlength_ahdr {
125         u16 ahslength;
126         u8  ahstype;
127         u8  reserved;
128         u32 read_length;
129 } __packed;
130
131 struct iscsi_scsi_rsp_hdr {
132         u8  opcode;
133         u8  flags;
134         u8  response;
135         u8  cmd_status;
136         u8  ahslength;
137         u8  datalength[3];
138         u32 rsvd1[2];
139         u32 itt;
140         u32 snack;
141         u32 stat_sn;
142         u32 exp_cmd_sn;
143         u32 max_cmd_sn;
144         u32 exp_data_sn;
145         u32 bi_residual_count;
146         u32 residual_count;
147 } __packed;
148
149 #define ISCSI_FLG_RESIDUAL_UNDERFLOW            0x02
150 #define ISCSI_FLG_RESIDUAL_OVERFLOW             0x04
151 #define ISCSI_FLG_BIRESIDUAL_UNDERFLOW          0x08
152 #define ISCSI_FLG_BIRESIDUAL_OVERFLOW           0x10
153
154 #define ISCSI_RESPONSE_COMMAND_COMPLETED        0x00
155 #define ISCSI_RESPONSE_TARGET_FAILURE           0x01
156
157 struct iscsi_sense_data {
158         u16 length;
159         u8  data[0];
160 } __packed;
161
162 struct iscsi_task_mgt_hdr {
163         u8  opcode;
164         u8  function;
165         u16 rsvd1;
166         u8  ahslength;
167         u8  datalength[3];
168         u64 lun;
169         u32 itt;
170         u32 rtt;
171         u32 cmd_sn;
172         u32 exp_stat_sn;
173         u32 ref_cmd_sn;
174         u32 exp_data_sn;
175         u32 rsvd2[2];
176 } __packed;
177
178 #define ISCSI_FUNCTION_MASK                     0x7f
179
180 #define ISCSI_FUNCTION_ABORT_TASK               1
181 #define ISCSI_FUNCTION_ABORT_TASK_SET           2
182 #define ISCSI_FUNCTION_CLEAR_ACA                3
183 #define ISCSI_FUNCTION_CLEAR_TASK_SET           4
184 #define ISCSI_FUNCTION_LOGICAL_UNIT_RESET       5
185 #define ISCSI_FUNCTION_TARGET_WARM_RESET        6
186 #define ISCSI_FUNCTION_TARGET_COLD_RESET        7
187 #define ISCSI_FUNCTION_TASK_REASSIGN            8
188
189 struct iscsi_task_rsp_hdr {
190         u8  opcode;
191         u8  flags;
192         u8  response;
193         u8  rsvd1;
194         u8  ahslength;
195         u8  datalength[3];
196         u32 rsvd2[2];
197         u32 itt;
198         u32 rsvd3;
199         u32 stat_sn;
200         u32 exp_cmd_sn;
201         u32 max_cmd_sn;
202         u32 rsvd4[3];
203 } __packed;
204
205 #define ISCSI_RESPONSE_FUNCTION_COMPLETE        0
206 #define ISCSI_RESPONSE_UNKNOWN_TASK             1
207 #define ISCSI_RESPONSE_UNKNOWN_LUN              2
208 #define ISCSI_RESPONSE_TASK_ALLEGIANT           3
209 #define ISCSI_RESPONSE_ALLEGIANCE_REASSIGNMENT_UNSUPPORTED      4
210 #define ISCSI_RESPONSE_FUNCTION_UNSUPPORTED     5
211 #define ISCSI_RESPONSE_NO_AUTHORIZATION         6
212 #define ISCSI_RESPONSE_FUNCTION_REJECTED        255
213
214 struct iscsi_data_out_hdr {
215         u8  opcode;
216         u8  flags;
217         u16 rsvd1;
218         u8  ahslength;
219         u8  datalength[3];
220         u64 lun;
221         u32 itt;
222         u32 ttt;
223         u32 rsvd2;
224         u32 exp_stat_sn;
225         u32 rsvd3;
226         u32 data_sn;
227         u32 buffer_offset;
228         u32 rsvd4;
229 } __packed;
230
231 struct iscsi_data_in_hdr {
232         u8  opcode;
233         u8  flags;
234         u8  rsvd1;
235         u8  cmd_status;
236         u8  ahslength;
237         u8  datalength[3];
238         u32 rsvd2[2];
239         u32 itt;
240         u32 ttt;
241         u32 stat_sn;
242         u32 exp_cmd_sn;
243         u32 max_cmd_sn;
244         u32 data_sn;
245         u32 buffer_offset;
246         u32 residual_count;
247 } __packed;
248
249 #define ISCSI_FLG_STATUS                0x01
250
251 struct iscsi_r2t_hdr {
252         u8  opcode;
253         u8  flags;
254         u16 rsvd1;
255         u8  ahslength;
256         u8  datalength[3];
257         u64 lun;
258         u32 itt;
259         u32 ttt;
260         u32 stat_sn;
261         u32 exp_cmd_sn;
262         u32 max_cmd_sn;
263         u32 r2t_sn;
264         u32 buffer_offset;
265         u32 data_length;
266 } __packed;
267
268 struct iscsi_async_msg_hdr {
269         u8  opcode;
270         u8  flags;
271         u16 rsvd1;
272         u8  ahslength;
273         u8  datalength[3];
274         u64 lun;
275         u32 ffffffff;
276         u32 rsvd2;
277         u32 stat_sn;
278         u32 exp_cmd_sn;
279         u32 max_cmd_sn;
280         u8  async_event;
281         u8  async_vcode;
282         u16 param1;
283         u16 param2;
284         u16 param3;
285         u32 rsvd3;
286 } __packed;
287
288 #define ISCSI_ASYNC_SCSI                0
289 #define ISCSI_ASYNC_LOGOUT              1
290 #define ISCSI_ASYNC_DROP_CONNECTION     2
291 #define ISCSI_ASYNC_DROP_SESSION        3
292 #define ISCSI_ASYNC_PARAM_REQUEST       4
293 #define ISCSI_ASYNC_VENDOR              255
294
295 struct iscsi_text_req_hdr {
296         u8  opcode;
297         u8  flags;
298         u16 rsvd1;
299         u8  ahslength;
300         u8  datalength[3];
301         u32 rsvd2[2];
302         u32 itt;
303         u32 ttt;
304         u32 cmd_sn;
305         u32 exp_stat_sn;
306         u32 rsvd3[4];
307 } __packed;
308
309 struct iscsi_text_rsp_hdr {
310         u8  opcode;
311         u8  flags;
312         u16 rsvd1;
313         u8  ahslength;
314         u8  datalength[3];
315         u32 rsvd2[2];
316         u32 itt;
317         u32 ttt;
318         u32 stat_sn;
319         u32 exp_cmd_sn;
320         u32 max_cmd_sn;
321         u32 rsvd3[3];
322 } __packed;
323
324 struct iscsi_login_req_hdr {
325         u8  opcode;
326         u8  flags;
327         u8  max_version;                /* Max. version supported */
328         u8  min_version;                /* Min. version supported */
329         u8  ahslength;
330         u8  datalength[3];
331         union iscsi_sid sid;
332         u32 itt;                        /* Initiator Task Tag */
333         u16 cid;                        /* Connection ID */
334         u16 rsvd1;
335         u32 cmd_sn;
336         u32 exp_stat_sn;
337         u32 rsvd2[4];
338 } __packed;
339
340 struct iscsi_login_rsp_hdr {
341         u8  opcode;
342         u8  flags;
343         u8  max_version;                /* Max. version supported */
344         u8  active_version;             /* Active version */
345         u8  ahslength;
346         u8  datalength[3];
347         union iscsi_sid sid;
348         u32 itt;                        /* Initiator Task Tag */
349         u32 rsvd1;
350         u32 stat_sn;
351         u32 exp_cmd_sn;
352         u32 max_cmd_sn;
353         u8  status_class;               /* see Login RSP ststus classes below */
354         u8  status_detail;              /* see Login RSP Status details below */
355         u8  rsvd2[10];
356 } __packed;
357
358 #define ISCSI_FLG_FINAL                 0x80
359 #define ISCSI_FLG_TRANSIT               0x80
360 #define ISCSI_FLG_CSG_SECURITY          0x00
361 #define ISCSI_FLG_CSG_LOGIN             0x04
362 #define ISCSI_FLG_CSG_FULL_FEATURE      0x0c
363 #define ISCSI_FLG_CSG_MASK              0x0c
364 #define ISCSI_FLG_NSG_SECURITY          0x00
365 #define ISCSI_FLG_NSG_LOGIN             0x01
366 #define ISCSI_FLG_NSG_FULL_FEATURE      0x03
367 #define ISCSI_FLG_NSG_MASK              0x03
368
369 /* Login Status response classes */
370 #define ISCSI_STATUS_SUCCESS            0x00
371 #define ISCSI_STATUS_REDIRECT           0x01
372 #define ISCSI_STATUS_INITIATOR_ERR      0x02
373 #define ISCSI_STATUS_TARGET_ERR         0x03
374
375 /* Login Status response detail codes */
376 /* Class-0 (Success) */
377 #define ISCSI_STATUS_ACCEPT             0x00
378
379 /* Class-1 (Redirection) */
380 #define ISCSI_STATUS_TGT_MOVED_TEMP     0x01
381 #define ISCSI_STATUS_TGT_MOVED_PERM     0x02
382
383 /* Class-2 (Initiator Error) */
384 #define ISCSI_STATUS_INIT_ERR           0x00
385 #define ISCSI_STATUS_AUTH_FAILED        0x01
386 #define ISCSI_STATUS_TGT_FORBIDDEN      0x02
387 #define ISCSI_STATUS_TGT_NOT_FOUND      0x03
388 #define ISCSI_STATUS_TGT_REMOVED        0x04
389 #define ISCSI_STATUS_NO_VERSION         0x05
390 #define ISCSI_STATUS_TOO_MANY_CONN      0x06
391 #define ISCSI_STATUS_MISSING_FIELDS     0x07
392 #define ISCSI_STATUS_CONN_ADD_FAILED    0x08
393 #define ISCSI_STATUS_INV_SESSION_TYPE   0x09
394 #define ISCSI_STATUS_SESSION_NOT_FOUND  0x0a
395 #define ISCSI_STATUS_INV_REQ_TYPE       0x0b
396
397 /* Class-3 (Target Error) */
398 #define ISCSI_STATUS_TARGET_ERROR       0x00
399 #define ISCSI_STATUS_SVC_UNAVAILABLE    0x01
400 #define ISCSI_STATUS_NO_RESOURCES       0x02
401
402 struct iscsi_logout_req_hdr {
403         u8  opcode;
404         u8  flags;
405         u16 rsvd1;
406         u8  ahslength;
407         u8  datalength[3];
408         u32 rsvd2[2];
409         u32 itt;
410         u16 cid;
411         u16 rsvd3;
412         u32 cmd_sn;
413         u32 exp_stat_sn;
414         u32 rsvd4[4];
415 } __packed;
416
417 struct iscsi_logout_rsp_hdr {
418         u8  opcode;
419         u8  flags;
420         u8  response;
421         u8  rsvd1;
422         u8  ahslength;
423         u8  datalength[3];
424         u32 rsvd2[2];
425         u32 itt;
426         u32 rsvd3;
427         u32 stat_sn;
428         u32 exp_cmd_sn;
429         u32 max_cmd_sn;
430         u32 rsvd4;
431         u16 time2wait;
432         u16 time2retain;
433         u32 rsvd5;
434 } __packed;
435
436 struct iscsi_snack_req_hdr {
437         u8  opcode;
438         u8  flags;
439         u16 rsvd1;
440         u8  ahslength;
441         u8  datalength[3];
442         u32 rsvd2[2];
443         u32 itt;
444         u32 ttt;
445         u32 rsvd3;
446         u32 exp_stat_sn;
447         u32 rsvd4[2];
448         u32 beg_run;
449         u32 run_length;
450 } __packed;
451
452 struct iscsi_reject_hdr {
453         u8  opcode;
454         u8  flags;
455         u8  reason;
456         u8  rsvd1;
457         u8  ahslength;
458         u8  datalength[3];
459         u32 rsvd2[2];
460         u32 ffffffff;
461         u32 rsvd3;
462         u32 stat_sn;
463         u32 exp_cmd_sn;
464         u32 max_cmd_sn;
465         u32 data_sn;
466         u32 rsvd4[2];
467 } __packed;
468
469 #define ISCSI_REASON_RESERVED                   0x01
470 #define ISCSI_REASON_DATA_DIGEST_ERROR          0x02
471 #define ISCSI_REASON_DATA_SNACK_REJECT          0x03
472 #define ISCSI_REASON_PROTOCOL_ERROR             0x04
473 #define ISCSI_REASON_UNSUPPORTED_COMMAND        0x05
474 #define ISCSI_REASON_IMMEDIATE_COMMAND_REJECT   0x06
475 #define ISCSI_REASON_TASK_IN_PROGRESS           0x07
476 #define ISCSI_REASON_INVALID_DATA_ACK           0x08
477 #define ISCSI_REASON_INVALID_PDU_FIELD          0x09
478 #define ISCSI_REASON_OUT_OF_RESOURCES           0x0a
479 #define ISCSI_REASON_NEGOTIATION_RESET          0x0b
480 #define ISCSI_REASON_WAITING_LOGOUT             0x0c
481
482
483 struct iscsi_nop_out_hdr {
484         u8  opcode;
485         u8  flags;
486         u16 rsvd1;
487         u8  ahslength;
488         u8  datalength[3];
489         u64 lun;
490         u32 itt;
491         u32 ttt;
492         u32 cmd_sn;
493         u32 exp_stat_sn;
494         u32 rsvd2[4];
495 } __packed;
496
497 struct iscsi_nop_in_hdr {
498         u8  opcode;
499         u8  flags;
500         u16 rsvd1;
501         u8  ahslength;
502         u8  datalength[3];
503         u64 lun;
504         u32 itt;
505         u32 ttt;
506         u32 stat_sn;
507         u32 exp_cmd_sn;
508         u32 max_cmd_sn;
509         u32 rsvd2[3];
510 } __packed;
511
512 #define ISCSI_RESERVED_TAG      (0xffffffffU)
513
514 #define cmnd_hdr(cmnd) ((struct iscsi_scsi_cmd_hdr *) (&((cmnd)->pdu.bhs)))
515 #define cmnd_ttt(cmnd) cpu_to_be32((cmnd)->pdu.bhs.ttt)
516 #define cmnd_itt(cmnd) cpu_to_be32((cmnd)->pdu.bhs.itt)
517 #define cmnd_opcode(cmnd) ((cmnd)->pdu.bhs.opcode & ISCSI_OPCODE_MASK)
518 #define cmnd_scsicode(cmnd) (cmnd_hdr((cmnd))->scb[0])
519
520
521 #endif  /* __ISCSI_HDR_H__ */