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