02f6e4b9e6932c407481d7c6ae5814b3ac4187f9
[linux-2.6.git] / include / scsi / iscsi_proto.h
1 /*
2  * RFC 3720 (iSCSI) protocol data types
3  *
4  * Copyright (C) 2005 Dmitry Yusupov
5  * Copyright (C) 2005 Alex Aizman
6  * maintained by open-iscsi@googlegroups.com
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published
10  * by the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * General Public License for more details.
17  *
18  * See the file COPYING included with this distribution for more details.
19  */
20
21 #ifndef ISCSI_PROTO_H
22 #define ISCSI_PROTO_H
23
24 #define ISCSI_DRAFT20_VERSION   0x00
25
26 /* default iSCSI listen port for incoming connections */
27 #define ISCSI_LISTEN_PORT       3260
28
29 /* Padding word length */
30 #define PAD_WORD_LEN            4
31
32 /*
33  * useful common(control and data pathes) macro
34  */
35 #define ntoh24(p) (((p)[0] << 16) | ((p)[1] << 8) | ((p)[2]))
36 #define hton24(p, v) { \
37         p[0] = (((v) >> 16) & 0xFF); \
38         p[1] = (((v) >> 8) & 0xFF); \
39         p[2] = ((v) & 0xFF); \
40 }
41 #define zero_data(p) {p[0]=0;p[1]=0;p[2]=0;}
42
43 /*
44  * iSCSI Template Message Header
45  */
46 struct iscsi_hdr {
47         uint8_t         opcode;
48         uint8_t         flags;          /* Final bit */
49         uint8_t         rsvd2[2];
50         uint8_t         hlength;        /* AHSs total length */
51         uint8_t         dlength[3];     /* Data length */
52         uint8_t         lun[8];
53         __be32          itt;            /* Initiator Task Tag */
54         __be32          ttt;            /* Target Task Tag */
55         __be32          statsn;
56         __be32          exp_statsn;
57         __be32          max_statsn;
58         uint8_t         other[12];
59 };
60
61 /************************* RFC 3720 Begin *****************************/
62
63 #define ISCSI_RESERVED_TAG              0xffffffff
64
65 /* Opcode encoding bits */
66 #define ISCSI_OP_RETRY                  0x80
67 #define ISCSI_OP_IMMEDIATE              0x40
68 #define ISCSI_OPCODE_MASK               0x3F
69
70 /* Initiator Opcode values */
71 #define ISCSI_OP_NOOP_OUT               0x00
72 #define ISCSI_OP_SCSI_CMD               0x01
73 #define ISCSI_OP_SCSI_TMFUNC            0x02
74 #define ISCSI_OP_LOGIN                  0x03
75 #define ISCSI_OP_TEXT                   0x04
76 #define ISCSI_OP_SCSI_DATA_OUT          0x05
77 #define ISCSI_OP_LOGOUT                 0x06
78 #define ISCSI_OP_SNACK                  0x10
79
80 #define ISCSI_OP_VENDOR1_CMD            0x1c
81 #define ISCSI_OP_VENDOR2_CMD            0x1d
82 #define ISCSI_OP_VENDOR3_CMD            0x1e
83 #define ISCSI_OP_VENDOR4_CMD            0x1f
84
85 /* Target Opcode values */
86 #define ISCSI_OP_NOOP_IN                0x20
87 #define ISCSI_OP_SCSI_CMD_RSP           0x21
88 #define ISCSI_OP_SCSI_TMFUNC_RSP        0x22
89 #define ISCSI_OP_LOGIN_RSP              0x23
90 #define ISCSI_OP_TEXT_RSP               0x24
91 #define ISCSI_OP_SCSI_DATA_IN           0x25
92 #define ISCSI_OP_LOGOUT_RSP             0x26
93 #define ISCSI_OP_R2T                    0x31
94 #define ISCSI_OP_ASYNC_EVENT            0x32
95 #define ISCSI_OP_REJECT                 0x3f
96
97 struct iscsi_ahs_hdr {
98         __be16 ahslength;
99         uint8_t ahstype;
100         uint8_t ahspec[5];
101 };
102
103 #define ISCSI_AHSTYPE_CDB               1
104 #define ISCSI_AHSTYPE_RLENGTH           2
105
106 /* iSCSI PDU Header */
107 struct iscsi_cmd {
108         uint8_t opcode;
109         uint8_t flags;
110         __be16 rsvd2;
111         uint8_t hlength;
112         uint8_t dlength[3];
113         uint8_t lun[8];
114         __be32 itt;     /* Initiator Task Tag */
115         __be32 data_length;
116         __be32 cmdsn;
117         __be32 exp_statsn;
118         uint8_t cdb[16];        /* SCSI Command Block */
119         /* Additional Data (Command Dependent) */
120 };
121
122 /* Command PDU flags */
123 #define ISCSI_FLAG_CMD_FINAL            0x80
124 #define ISCSI_FLAG_CMD_READ             0x40
125 #define ISCSI_FLAG_CMD_WRITE            0x20
126 #define ISCSI_FLAG_CMD_ATTR_MASK        0x07    /* 3 bits */
127
128 /* SCSI Command Attribute values */
129 #define ISCSI_ATTR_UNTAGGED             0
130 #define ISCSI_ATTR_SIMPLE               1
131 #define ISCSI_ATTR_ORDERED              2
132 #define ISCSI_ATTR_HEAD_OF_QUEUE        3
133 #define ISCSI_ATTR_ACA                  4
134
135 struct iscsi_rlength_ahdr {
136         __be16 ahslength;
137         uint8_t ahstype;
138         uint8_t reserved;
139         __be32 read_length;
140 };
141
142 /* SCSI Response Header */
143 struct iscsi_cmd_rsp {
144         uint8_t opcode;
145         uint8_t flags;
146         uint8_t response;
147         uint8_t cmd_status;
148         uint8_t hlength;
149         uint8_t dlength[3];
150         uint8_t rsvd[8];
151         __be32  itt;    /* Initiator Task Tag */
152         __be32  rsvd1;
153         __be32  statsn;
154         __be32  exp_cmdsn;
155         __be32  max_cmdsn;
156         __be32  exp_datasn;
157         __be32  bi_residual_count;
158         __be32  residual_count;
159         /* Response or Sense Data (optional) */
160 };
161
162 /* Command Response PDU flags */
163 #define ISCSI_FLAG_CMD_BIDI_OVERFLOW    0x10
164 #define ISCSI_FLAG_CMD_BIDI_UNDERFLOW   0x08
165 #define ISCSI_FLAG_CMD_OVERFLOW         0x04
166 #define ISCSI_FLAG_CMD_UNDERFLOW        0x02
167
168 /* iSCSI Status values. Valid if Rsp Selector bit is not set */
169 #define ISCSI_STATUS_CMD_COMPLETED      0
170 #define ISCSI_STATUS_TARGET_FAILURE     1
171 #define ISCSI_STATUS_SUBSYS_FAILURE     2
172
173 /* Asynchronous Event Header */
174 struct iscsi_async {
175         uint8_t opcode;
176         uint8_t flags;
177         uint8_t rsvd2[2];
178         uint8_t rsvd3;
179         uint8_t dlength[3];
180         uint8_t lun[8];
181         uint8_t rsvd4[8];
182         __be32  statsn;
183         __be32  exp_cmdsn;
184         __be32  max_cmdsn;
185         uint8_t async_event;
186         uint8_t async_vcode;
187         __be16  param1;
188         __be16  param2;
189         __be16  param3;
190         uint8_t rsvd5[4];
191 };
192
193 /* iSCSI Event Codes */
194 #define ISCSI_ASYNC_MSG_SCSI_EVENT                      0
195 #define ISCSI_ASYNC_MSG_REQUEST_LOGOUT                  1
196 #define ISCSI_ASYNC_MSG_DROPPING_CONNECTION             2
197 #define ISCSI_ASYNC_MSG_DROPPING_ALL_CONNECTIONS        3
198 #define ISCSI_ASYNC_MSG_PARAM_NEGOTIATION               4
199 #define ISCSI_ASYNC_MSG_VENDOR_SPECIFIC                 255
200
201 /* NOP-Out Message */
202 struct iscsi_nopout {
203         uint8_t opcode;
204         uint8_t flags;
205         __be16  rsvd2;
206         uint8_t rsvd3;
207         uint8_t dlength[3];
208         uint8_t lun[8];
209         __be32  itt;    /* Initiator Task Tag */
210         __be32  ttt;    /* Target Transfer Tag */
211         __be32  cmdsn;
212         __be32  exp_statsn;
213         uint8_t rsvd4[16];
214 };
215
216 /* NOP-In Message */
217 struct iscsi_nopin {
218         uint8_t opcode;
219         uint8_t flags;
220         __be16  rsvd2;
221         uint8_t rsvd3;
222         uint8_t dlength[3];
223         uint8_t lun[8];
224         __be32  itt;    /* Initiator Task Tag */
225         __be32  ttt;    /* Target Transfer Tag */
226         __be32  statsn;
227         __be32  exp_cmdsn;
228         __be32  max_cmdsn;
229         uint8_t rsvd4[12];
230 };
231
232 /* SCSI Task Management Message Header */
233 struct iscsi_tm {
234         uint8_t opcode;
235         uint8_t flags;
236         uint8_t rsvd1[2];
237         uint8_t hlength;
238         uint8_t dlength[3];
239         uint8_t lun[8];
240         __be32  itt;    /* Initiator Task Tag */
241         __be32  rtt;    /* Reference Task Tag */
242         __be32  cmdsn;
243         __be32  exp_statsn;
244         __be32  refcmdsn;
245         __be32  exp_datasn;
246         uint8_t rsvd2[8];
247 };
248
249 #define ISCSI_FLAG_TM_FUNC_MASK                 0x7F
250
251 /* Function values */
252 #define ISCSI_TM_FUNC_ABORT_TASK                1
253 #define ISCSI_TM_FUNC_ABORT_TASK_SET            2
254 #define ISCSI_TM_FUNC_CLEAR_ACA                 3
255 #define ISCSI_TM_FUNC_CLEAR_TASK_SET            4
256 #define ISCSI_TM_FUNC_LOGICAL_UNIT_RESET        5
257 #define ISCSI_TM_FUNC_TARGET_WARM_RESET         6
258 #define ISCSI_TM_FUNC_TARGET_COLD_RESET         7
259 #define ISCSI_TM_FUNC_TASK_REASSIGN             8
260
261 /* SCSI Task Management Response Header */
262 struct iscsi_tm_rsp {
263         uint8_t opcode;
264         uint8_t flags;
265         uint8_t response;       /* see Response values below */
266         uint8_t qualifier;
267         uint8_t hlength;
268         uint8_t dlength[3];
269         uint8_t rsvd2[8];
270         __be32  itt;    /* Initiator Task Tag */
271         __be32  rtt;    /* Reference Task Tag */
272         __be32  statsn;
273         __be32  exp_cmdsn;
274         __be32  max_cmdsn;
275         uint8_t rsvd3[12];
276 };
277
278 /* Response values */
279 #define ISCSI_TMF_RSP_COMPLETE          0x00
280 #define ISCSI_TMF_RSP_NO_TASK           0x01
281 #define ISCSI_TMF_RSP_NO_LUN            0x02
282 #define ISCSI_TMF_RSP_TASK_ALLEGIANT    0x03
283 #define ISCSI_TMF_RSP_NO_FAILOVER       0x04
284 #define ISCSI_TMF_RSP_NOT_SUPPORTED     0x05
285 #define ISCSI_TMF_RSP_AUTH_FAILED       0x06
286 #define ISCSI_TMF_RSP_REJECTED          0xff
287
288 /* Ready To Transfer Header */
289 struct iscsi_r2t_rsp {
290         uint8_t opcode;
291         uint8_t flags;
292         uint8_t rsvd2[2];
293         uint8_t hlength;
294         uint8_t dlength[3];
295         uint8_t lun[8];
296         __be32  itt;    /* Initiator Task Tag */
297         __be32  ttt;    /* Target Transfer Tag */
298         __be32  statsn;
299         __be32  exp_cmdsn;
300         __be32  max_cmdsn;
301         __be32  r2tsn;
302         __be32  data_offset;
303         __be32  data_length;
304 };
305
306 /* SCSI Data Hdr */
307 struct iscsi_data {
308         uint8_t opcode;
309         uint8_t flags;
310         uint8_t rsvd2[2];
311         uint8_t rsvd3;
312         uint8_t dlength[3];
313         uint8_t lun[8];
314         __be32  itt;
315         __be32  ttt;
316         __be32  rsvd4;
317         __be32  exp_statsn;
318         __be32  rsvd5;
319         __be32  datasn;
320         __be32  offset;
321         __be32  rsvd6;
322         /* Payload */
323 };
324
325 /* SCSI Data Response Hdr */
326 struct iscsi_data_rsp {
327         uint8_t opcode;
328         uint8_t flags;
329         uint8_t rsvd2;
330         uint8_t cmd_status;
331         uint8_t hlength;
332         uint8_t dlength[3];
333         uint8_t lun[8];
334         __be32  itt;
335         __be32  ttt;
336         __be32  statsn;
337         __be32  exp_cmdsn;
338         __be32  max_cmdsn;
339         __be32  datasn;
340         __be32  offset;
341         __be32  residual_count;
342 };
343
344 /* Data Response PDU flags */
345 #define ISCSI_FLAG_DATA_ACK             0x40
346 #define ISCSI_FLAG_DATA_OVERFLOW        0x04
347 #define ISCSI_FLAG_DATA_UNDERFLOW       0x02
348 #define ISCSI_FLAG_DATA_STATUS          0x01
349
350 /* Text Header */
351 struct iscsi_text {
352         uint8_t opcode;
353         uint8_t flags;
354         uint8_t rsvd2[2];
355         uint8_t hlength;
356         uint8_t dlength[3];
357         uint8_t rsvd4[8];
358         __be32  itt;
359         __be32  ttt;
360         __be32  cmdsn;
361         __be32  exp_statsn;
362         uint8_t rsvd5[16];
363         /* Text - key=value pairs */
364 };
365
366 #define ISCSI_FLAG_TEXT_CONTINUE        0x40
367
368 /* Text Response Header */
369 struct iscsi_text_rsp {
370         uint8_t opcode;
371         uint8_t flags;
372         uint8_t rsvd2[2];
373         uint8_t hlength;
374         uint8_t dlength[3];
375         uint8_t rsvd4[8];
376         __be32  itt;
377         __be32  ttt;
378         __be32  statsn;
379         __be32  exp_cmdsn;
380         __be32  max_cmdsn;
381         uint8_t rsvd5[12];
382         /* Text Response - key:value pairs */
383 };
384
385 /* Login Header */
386 struct iscsi_login {
387         uint8_t opcode;
388         uint8_t flags;
389         uint8_t max_version;    /* Max. version supported */
390         uint8_t min_version;    /* Min. version supported */
391         uint8_t hlength;
392         uint8_t dlength[3];
393         uint8_t isid[6];        /* Initiator Session ID */
394         __be16  tsih;   /* Target Session Handle */
395         __be32  itt;    /* Initiator Task Tag */
396         __be16  cid;
397         __be16  rsvd3;
398         __be32  cmdsn;
399         __be32  exp_statsn;
400         uint8_t rsvd5[16];
401 };
402
403 /* Login PDU flags */
404 #define ISCSI_FLAG_LOGIN_TRANSIT                0x80
405 #define ISCSI_FLAG_LOGIN_CONTINUE               0x40
406 #define ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK     0x0C    /* 2 bits */
407 #define ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK        0x03    /* 2 bits */
408
409 #define ISCSI_LOGIN_CURRENT_STAGE(flags) \
410         ((flags & ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK) >> 2)
411 #define ISCSI_LOGIN_NEXT_STAGE(flags) \
412         (flags & ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK)
413
414 /* Login Response Header */
415 struct iscsi_login_rsp {
416         uint8_t opcode;
417         uint8_t flags;
418         uint8_t max_version;    /* Max. version supported */
419         uint8_t active_version; /* Active version */
420         uint8_t hlength;
421         uint8_t dlength[3];
422         uint8_t isid[6];        /* Initiator Session ID */
423         __be16  tsih;   /* Target Session Handle */
424         __be32  itt;    /* Initiator Task Tag */
425         __be32  rsvd3;
426         __be32  statsn;
427         __be32  exp_cmdsn;
428         __be32  max_cmdsn;
429         uint8_t status_class;   /* see Login RSP ststus classes below */
430         uint8_t status_detail;  /* see Login RSP Status details below */
431         uint8_t rsvd4[10];
432 };
433
434 /* Login stage (phase) codes for CSG, NSG */
435 #define ISCSI_INITIAL_LOGIN_STAGE               -1
436 #define ISCSI_SECURITY_NEGOTIATION_STAGE        0
437 #define ISCSI_OP_PARMS_NEGOTIATION_STAGE        1
438 #define ISCSI_FULL_FEATURE_PHASE                3
439
440 /* Login Status response classes */
441 #define ISCSI_STATUS_CLS_SUCCESS                0x00
442 #define ISCSI_STATUS_CLS_REDIRECT               0x01
443 #define ISCSI_STATUS_CLS_INITIATOR_ERR          0x02
444 #define ISCSI_STATUS_CLS_TARGET_ERR             0x03
445
446 /* Login Status response detail codes */
447 /* Class-0 (Success) */
448 #define ISCSI_LOGIN_STATUS_ACCEPT               0x00
449
450 /* Class-1 (Redirection) */
451 #define ISCSI_LOGIN_STATUS_TGT_MOVED_TEMP       0x01
452 #define ISCSI_LOGIN_STATUS_TGT_MOVED_PERM       0x02
453
454 /* Class-2 (Initiator Error) */
455 #define ISCSI_LOGIN_STATUS_INIT_ERR             0x00
456 #define ISCSI_LOGIN_STATUS_AUTH_FAILED          0x01
457 #define ISCSI_LOGIN_STATUS_TGT_FORBIDDEN        0x02
458 #define ISCSI_LOGIN_STATUS_TGT_NOT_FOUND        0x03
459 #define ISCSI_LOGIN_STATUS_TGT_REMOVED          0x04
460 #define ISCSI_LOGIN_STATUS_NO_VERSION           0x05
461 #define ISCSI_LOGIN_STATUS_ISID_ERROR           0x06
462 #define ISCSI_LOGIN_STATUS_MISSING_FIELDS       0x07
463 #define ISCSI_LOGIN_STATUS_CONN_ADD_FAILED      0x08
464 #define ISCSI_LOGIN_STATUS_NO_SESSION_TYPE      0x09
465 #define ISCSI_LOGIN_STATUS_NO_SESSION           0x0a
466 #define ISCSI_LOGIN_STATUS_INVALID_REQUEST      0x0b
467
468 /* Class-3 (Target Error) */
469 #define ISCSI_LOGIN_STATUS_TARGET_ERROR         0x00
470 #define ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE      0x01
471 #define ISCSI_LOGIN_STATUS_NO_RESOURCES         0x02
472
473 /* Logout Header */
474 struct iscsi_logout {
475         uint8_t opcode;
476         uint8_t flags;
477         uint8_t rsvd1[2];
478         uint8_t hlength;
479         uint8_t dlength[3];
480         uint8_t rsvd2[8];
481         __be32  itt;    /* Initiator Task Tag */
482         __be16  cid;
483         uint8_t rsvd3[2];
484         __be32  cmdsn;
485         __be32  exp_statsn;
486         uint8_t rsvd4[16];
487 };
488
489 /* Logout PDU flags */
490 #define ISCSI_FLAG_LOGOUT_REASON_MASK   0x7F
491
492 /* logout reason_code values */
493
494 #define ISCSI_LOGOUT_REASON_CLOSE_SESSION       0
495 #define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION    1
496 #define ISCSI_LOGOUT_REASON_RECOVERY            2
497 #define ISCSI_LOGOUT_REASON_AEN_REQUEST         3
498
499 /* Logout Response Header */
500 struct iscsi_logout_rsp {
501         uint8_t opcode;
502         uint8_t flags;
503         uint8_t response;       /* see Logout response values below */
504         uint8_t rsvd2;
505         uint8_t hlength;
506         uint8_t dlength[3];
507         uint8_t rsvd3[8];
508         __be32  itt;    /* Initiator Task Tag */
509         __be32  rsvd4;
510         __be32  statsn;
511         __be32  exp_cmdsn;
512         __be32  max_cmdsn;
513         __be32  rsvd5;
514         __be16  t2wait;
515         __be16  t2retain;
516         __be32  rsvd6;
517 };
518
519 /* logout response status values */
520
521 #define ISCSI_LOGOUT_SUCCESS                    0
522 #define ISCSI_LOGOUT_CID_NOT_FOUND              1
523 #define ISCSI_LOGOUT_RECOVERY_UNSUPPORTED       2
524 #define ISCSI_LOGOUT_CLEANUP_FAILED             3
525
526 /* SNACK Header */
527 struct iscsi_snack {
528         uint8_t opcode;
529         uint8_t flags;
530         uint8_t rsvd2[14];
531         __be32  itt;
532         __be32  begrun;
533         __be32  runlength;
534         __be32  exp_statsn;
535         __be32  rsvd3;
536         __be32  exp_datasn;
537         uint8_t rsvd6[8];
538 };
539
540 /* SNACK PDU flags */
541 #define ISCSI_FLAG_SNACK_TYPE_MASK      0x0F    /* 4 bits */
542
543 /* Reject Message Header */
544 struct iscsi_reject {
545         uint8_t opcode;
546         uint8_t flags;
547         uint8_t reason;
548         uint8_t rsvd2;
549         uint8_t hlength;
550         uint8_t dlength[3];
551         uint8_t rsvd3[8];
552         __be32  ffffffff;
553         uint8_t rsvd4[4];
554         __be32  statsn;
555         __be32  exp_cmdsn;
556         __be32  max_cmdsn;
557         __be32  datasn;
558         uint8_t rsvd5[8];
559         /* Text - Rejected hdr */
560 };
561
562 /* Reason for Reject */
563 #define ISCSI_REASON_CMD_BEFORE_LOGIN   1
564 #define ISCSI_REASON_DATA_DIGEST_ERROR  2
565 #define ISCSI_REASON_DATA_SNACK_REJECT  3
566 #define ISCSI_REASON_PROTOCOL_ERROR     4
567 #define ISCSI_REASON_CMD_NOT_SUPPORTED  5
568 #define ISCSI_REASON_IMM_CMD_REJECT             6
569 #define ISCSI_REASON_TASK_IN_PROGRESS   7
570 #define ISCSI_REASON_INVALID_SNACK              8
571 #define ISCSI_REASON_BOOKMARK_INVALID   9
572 #define ISCSI_REASON_BOOKMARK_NO_RESOURCES      10
573 #define ISCSI_REASON_NEGOTIATION_RESET  11
574
575 /* Max. number of Key=Value pairs in a text message */
576 #define MAX_KEY_VALUE_PAIRS     8192
577
578 /* maximum length for text keys/values */
579 #define KEY_MAXLEN              64
580 #define VALUE_MAXLEN            255
581 #define TARGET_NAME_MAXLEN      VALUE_MAXLEN
582
583 #define DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH    8192
584
585 /************************* RFC 3720 End *****************************/
586
587 #endif /* ISCSI_PROTO_H */