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