Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * RFC 3720 (iSCSI) protocol data types
0004  *
0005  * Copyright (C) 2005 Dmitry Yusupov
0006  * Copyright (C) 2005 Alex Aizman
0007  * maintained by open-iscsi@googlegroups.com
0008  */
0009 
0010 #ifndef ISCSI_PROTO_H
0011 #define ISCSI_PROTO_H
0012 
0013 #include <linux/types.h>
0014 #include <scsi/scsi.h>
0015 
0016 #define ISCSI_DRAFT20_VERSION   0x00
0017 
0018 /* default iSCSI listen port for incoming connections */
0019 #define ISCSI_LISTEN_PORT   3260
0020 
0021 /* iSCSI header length */
0022 #define ISCSI_HDR_LEN       48
0023 
0024 /* iSCSI CRC32C length */
0025 #define ISCSI_CRC_LEN       4
0026 
0027 /* Padding word length */
0028 #define ISCSI_PAD_LEN       4
0029 
0030 /*
0031  * Serial Number Arithmetic, 32 bits, RFC1982
0032  */
0033 
0034 static inline int iscsi_sna_lt(u32 n1, u32 n2)
0035 {
0036     return (s32)(n1 - n2) < 0;
0037 }
0038 
0039 static inline int iscsi_sna_lte(u32 n1, u32 n2)
0040 {
0041     return (s32)(n1 - n2) <= 0;
0042 }
0043 
0044 static inline int iscsi_sna_gt(u32 n1, u32 n2)
0045 {
0046     return (s32)(n1 - n2) > 0;
0047 }
0048 
0049 static inline int iscsi_sna_gte(u32 n1, u32 n2)
0050 {
0051     return (s32)(n1 - n2) >= 0;
0052 }
0053 
0054 /*
0055  * useful common(control and data paths) macro
0056  */
0057 #define ntoh24(p) (((p)[0] << 16) | ((p)[1] << 8) | ((p)[2]))
0058 #define hton24(p, v) { \
0059         p[0] = (((v) >> 16) & 0xFF); \
0060         p[1] = (((v) >> 8) & 0xFF); \
0061         p[2] = ((v) & 0xFF); \
0062 }
0063 #define zero_data(p) {p[0]=0;p[1]=0;p[2]=0;}
0064 
0065 /* initiator tags; opaque for target */
0066 typedef uint32_t __bitwise itt_t;
0067 /* below makes sense only for initiator that created this tag */
0068 #define build_itt(itt, age) ((__force itt_t)\
0069     ((itt) | ((age) << ISCSI_AGE_SHIFT)))
0070 #define get_itt(itt) ((__force uint32_t)(itt_t)(itt) & ISCSI_ITT_MASK)
0071 #define RESERVED_ITT ((__force itt_t)0xffffffff)
0072 
0073 /*
0074  * iSCSI Template Message Header
0075  */
0076 struct iscsi_hdr {
0077     uint8_t     opcode;
0078     uint8_t     flags;      /* Final bit */
0079     uint8_t     rsvd2[2];
0080     uint8_t     hlength;    /* AHSs total length */
0081     uint8_t     dlength[3]; /* Data length */
0082     struct scsi_lun lun;
0083     itt_t       itt;        /* Initiator Task Tag, opaque for target */
0084     __be32      ttt;        /* Target Task Tag */
0085     __be32      statsn;
0086     __be32      exp_statsn;
0087     __be32      max_statsn;
0088     uint8_t     other[12];
0089 };
0090 
0091 /************************* RFC 3720 Begin *****************************/
0092 
0093 #define ISCSI_RESERVED_TAG      0xffffffff
0094 
0095 /* Opcode encoding bits */
0096 #define ISCSI_OP_RETRY          0x80
0097 #define ISCSI_OP_IMMEDIATE      0x40
0098 #define ISCSI_OPCODE_MASK       0x3F
0099 
0100 /* Initiator Opcode values */
0101 #define ISCSI_OP_NOOP_OUT       0x00
0102 #define ISCSI_OP_SCSI_CMD       0x01
0103 #define ISCSI_OP_SCSI_TMFUNC        0x02
0104 #define ISCSI_OP_LOGIN          0x03
0105 #define ISCSI_OP_TEXT           0x04
0106 #define ISCSI_OP_SCSI_DATA_OUT      0x05
0107 #define ISCSI_OP_LOGOUT         0x06
0108 #define ISCSI_OP_SNACK          0x10
0109 
0110 #define ISCSI_OP_VENDOR1_CMD        0x1c
0111 #define ISCSI_OP_VENDOR2_CMD        0x1d
0112 #define ISCSI_OP_VENDOR3_CMD        0x1e
0113 #define ISCSI_OP_VENDOR4_CMD        0x1f
0114 
0115 /* Target Opcode values */
0116 #define ISCSI_OP_NOOP_IN        0x20
0117 #define ISCSI_OP_SCSI_CMD_RSP       0x21
0118 #define ISCSI_OP_SCSI_TMFUNC_RSP    0x22
0119 #define ISCSI_OP_LOGIN_RSP      0x23
0120 #define ISCSI_OP_TEXT_RSP       0x24
0121 #define ISCSI_OP_SCSI_DATA_IN       0x25
0122 #define ISCSI_OP_LOGOUT_RSP     0x26
0123 #define ISCSI_OP_R2T            0x31
0124 #define ISCSI_OP_ASYNC_EVENT        0x32
0125 #define ISCSI_OP_REJECT         0x3f
0126 
0127 struct iscsi_ahs_hdr {
0128     __be16 ahslength;
0129     uint8_t ahstype;
0130     uint8_t ahspec[5];
0131 };
0132 
0133 #define ISCSI_AHSTYPE_CDB       1
0134 #define ISCSI_AHSTYPE_RLENGTH       2
0135 #define ISCSI_CDB_SIZE          16
0136 
0137 /* iSCSI PDU Header */
0138 struct iscsi_scsi_req {
0139     uint8_t opcode;
0140     uint8_t flags;
0141     __be16 rsvd2;
0142     uint8_t hlength;
0143     uint8_t dlength[3];
0144     struct scsi_lun lun;
0145     itt_t    itt;   /* Initiator Task Tag */
0146     __be32 data_length;
0147     __be32 cmdsn;
0148     __be32 exp_statsn;
0149     uint8_t cdb[ISCSI_CDB_SIZE];    /* SCSI Command Block */
0150     /* Additional Data (Command Dependent) */
0151 };
0152 
0153 /* Command PDU flags */
0154 #define ISCSI_FLAG_CMD_FINAL        0x80
0155 #define ISCSI_FLAG_CMD_READ     0x40
0156 #define ISCSI_FLAG_CMD_WRITE        0x20
0157 #define ISCSI_FLAG_CMD_ATTR_MASK    0x07    /* 3 bits */
0158 
0159 /* SCSI Command Attribute values */
0160 #define ISCSI_ATTR_UNTAGGED     0
0161 #define ISCSI_ATTR_SIMPLE       1
0162 #define ISCSI_ATTR_ORDERED      2
0163 #define ISCSI_ATTR_HEAD_OF_QUEUE    3
0164 #define ISCSI_ATTR_ACA          4
0165 
0166 struct iscsi_rlength_ahdr {
0167     __be16 ahslength;
0168     uint8_t ahstype;
0169     uint8_t reserved;
0170     __be32 read_length;
0171 };
0172 
0173 /* Extended CDB AHS */
0174 struct iscsi_ecdb_ahdr {
0175     __be16 ahslength;   /* CDB length - 15, including reserved byte */
0176     uint8_t ahstype;
0177     uint8_t reserved;
0178     /* 4-byte aligned extended CDB spillover */
0179     uint8_t ecdb[SCSI_MAX_VARLEN_CDB_SIZE - ISCSI_CDB_SIZE];
0180 };
0181 
0182 /* SCSI Response Header */
0183 struct iscsi_scsi_rsp {
0184     uint8_t opcode;
0185     uint8_t flags;
0186     uint8_t response;
0187     uint8_t cmd_status;
0188     uint8_t hlength;
0189     uint8_t dlength[3];
0190     uint8_t rsvd[8];
0191     itt_t    itt;   /* Initiator Task Tag */
0192     __be32  rsvd1;
0193     __be32  statsn;
0194     __be32  exp_cmdsn;
0195     __be32  max_cmdsn;
0196     __be32  exp_datasn;
0197     __be32  bi_residual_count;
0198     __be32  residual_count;
0199     /* Response or Sense Data (optional) */
0200 };
0201 
0202 /* Command Response PDU flags */
0203 #define ISCSI_FLAG_CMD_BIDI_OVERFLOW    0x10
0204 #define ISCSI_FLAG_CMD_BIDI_UNDERFLOW   0x08
0205 #define ISCSI_FLAG_CMD_OVERFLOW     0x04
0206 #define ISCSI_FLAG_CMD_UNDERFLOW    0x02
0207 
0208 /* iSCSI Status values. Valid if Rsp Selector bit is not set */
0209 #define ISCSI_STATUS_CMD_COMPLETED  0
0210 #define ISCSI_STATUS_TARGET_FAILURE 1
0211 #define ISCSI_STATUS_SUBSYS_FAILURE 2
0212 
0213 /* Asynchronous Event Header */
0214 struct iscsi_async {
0215     uint8_t opcode;
0216     uint8_t flags;
0217     uint8_t rsvd2[2];
0218     uint8_t rsvd3;
0219     uint8_t dlength[3];
0220     struct scsi_lun lun;
0221     uint8_t rsvd4[8];
0222     __be32  statsn;
0223     __be32  exp_cmdsn;
0224     __be32  max_cmdsn;
0225     uint8_t async_event;
0226     uint8_t async_vcode;
0227     __be16  param1;
0228     __be16  param2;
0229     __be16  param3;
0230     uint8_t rsvd5[4];
0231 };
0232 
0233 /* iSCSI Event Codes */
0234 #define ISCSI_ASYNC_MSG_SCSI_EVENT          0
0235 #define ISCSI_ASYNC_MSG_REQUEST_LOGOUT          1
0236 #define ISCSI_ASYNC_MSG_DROPPING_CONNECTION     2
0237 #define ISCSI_ASYNC_MSG_DROPPING_ALL_CONNECTIONS    3
0238 #define ISCSI_ASYNC_MSG_PARAM_NEGOTIATION       4
0239 #define ISCSI_ASYNC_MSG_VENDOR_SPECIFIC         255
0240 
0241 /* NOP-Out Message */
0242 struct iscsi_nopout {
0243     uint8_t opcode;
0244     uint8_t flags;
0245     __be16  rsvd2;
0246     uint8_t rsvd3;
0247     uint8_t dlength[3];
0248     struct scsi_lun lun;
0249     itt_t    itt;   /* Initiator Task Tag */
0250     __be32  ttt;    /* Target Transfer Tag */
0251     __be32  cmdsn;
0252     __be32  exp_statsn;
0253     uint8_t rsvd4[16];
0254 };
0255 
0256 /* NOP-In Message */
0257 struct iscsi_nopin {
0258     uint8_t opcode;
0259     uint8_t flags;
0260     __be16  rsvd2;
0261     uint8_t rsvd3;
0262     uint8_t dlength[3];
0263     struct scsi_lun lun;
0264     itt_t    itt;   /* Initiator Task Tag */
0265     __be32  ttt;    /* Target Transfer Tag */
0266     __be32  statsn;
0267     __be32  exp_cmdsn;
0268     __be32  max_cmdsn;
0269     uint8_t rsvd4[12];
0270 };
0271 
0272 /* SCSI Task Management Message Header */
0273 struct iscsi_tm {
0274     uint8_t opcode;
0275     uint8_t flags;
0276     uint8_t rsvd1[2];
0277     uint8_t hlength;
0278     uint8_t dlength[3];
0279     struct scsi_lun lun;
0280     itt_t    itt;   /* Initiator Task Tag */
0281     itt_t    rtt;   /* Reference Task Tag */
0282     __be32  cmdsn;
0283     __be32  exp_statsn;
0284     __be32  refcmdsn;
0285     __be32  exp_datasn;
0286     uint8_t rsvd2[8];
0287 };
0288 
0289 #define ISCSI_FLAG_TM_FUNC_MASK         0x7F
0290 
0291 /* Function values */
0292 #define ISCSI_TM_FUNC_ABORT_TASK        1
0293 #define ISCSI_TM_FUNC_ABORT_TASK_SET        2
0294 #define ISCSI_TM_FUNC_CLEAR_ACA         3
0295 #define ISCSI_TM_FUNC_CLEAR_TASK_SET        4
0296 #define ISCSI_TM_FUNC_LOGICAL_UNIT_RESET    5
0297 #define ISCSI_TM_FUNC_TARGET_WARM_RESET     6
0298 #define ISCSI_TM_FUNC_TARGET_COLD_RESET     7
0299 #define ISCSI_TM_FUNC_TASK_REASSIGN     8
0300 
0301 #define ISCSI_TM_FUNC_VALUE(hdr) ((hdr)->flags & ISCSI_FLAG_TM_FUNC_MASK)
0302 
0303 /* SCSI Task Management Response Header */
0304 struct iscsi_tm_rsp {
0305     uint8_t opcode;
0306     uint8_t flags;
0307     uint8_t response;   /* see Response values below */
0308     uint8_t qualifier;
0309     uint8_t hlength;
0310     uint8_t dlength[3];
0311     uint8_t rsvd2[8];
0312     itt_t    itt;   /* Initiator Task Tag */
0313     itt_t    rtt;   /* Reference Task Tag */
0314     __be32  statsn;
0315     __be32  exp_cmdsn;
0316     __be32  max_cmdsn;
0317     uint8_t rsvd3[12];
0318 };
0319 
0320 /* Response values */
0321 #define ISCSI_TMF_RSP_COMPLETE      0x00
0322 #define ISCSI_TMF_RSP_NO_TASK       0x01
0323 #define ISCSI_TMF_RSP_NO_LUN        0x02
0324 #define ISCSI_TMF_RSP_TASK_ALLEGIANT    0x03
0325 #define ISCSI_TMF_RSP_NO_FAILOVER   0x04
0326 #define ISCSI_TMF_RSP_NOT_SUPPORTED 0x05
0327 #define ISCSI_TMF_RSP_AUTH_FAILED   0x06
0328 #define ISCSI_TMF_RSP_REJECTED      0xff
0329 
0330 /* Ready To Transfer Header */
0331 struct iscsi_r2t_rsp {
0332     uint8_t opcode;
0333     uint8_t flags;
0334     uint8_t rsvd2[2];
0335     uint8_t hlength;
0336     uint8_t dlength[3];
0337     struct scsi_lun lun;
0338     itt_t    itt;   /* Initiator Task Tag */
0339     __be32  ttt;    /* Target Transfer Tag */
0340     __be32  statsn;
0341     __be32  exp_cmdsn;
0342     __be32  max_cmdsn;
0343     __be32  r2tsn;
0344     __be32  data_offset;
0345     __be32  data_length;
0346 };
0347 
0348 /* SCSI Data Hdr */
0349 struct iscsi_data {
0350     uint8_t opcode;
0351     uint8_t flags;
0352     uint8_t rsvd2[2];
0353     uint8_t rsvd3;
0354     uint8_t dlength[3];
0355     struct scsi_lun lun;
0356     itt_t    itt;
0357     __be32  ttt;
0358     __be32  rsvd4;
0359     __be32  exp_statsn;
0360     __be32  rsvd5;
0361     __be32  datasn;
0362     __be32  offset;
0363     __be32  rsvd6;
0364     /* Payload */
0365 };
0366 
0367 /* SCSI Data Response Hdr */
0368 struct iscsi_data_rsp {
0369     uint8_t opcode;
0370     uint8_t flags;
0371     uint8_t rsvd2;
0372     uint8_t cmd_status;
0373     uint8_t hlength;
0374     uint8_t dlength[3];
0375     struct scsi_lun lun;
0376     itt_t    itt;
0377     __be32  ttt;
0378     __be32  statsn;
0379     __be32  exp_cmdsn;
0380     __be32  max_cmdsn;
0381     __be32  datasn;
0382     __be32  offset;
0383     __be32  residual_count;
0384 };
0385 
0386 /* Data Response PDU flags */
0387 #define ISCSI_FLAG_DATA_ACK     0x40
0388 #define ISCSI_FLAG_DATA_OVERFLOW    0x04
0389 #define ISCSI_FLAG_DATA_UNDERFLOW   0x02
0390 #define ISCSI_FLAG_DATA_STATUS      0x01
0391 
0392 /* Text Header */
0393 struct iscsi_text {
0394     uint8_t opcode;
0395     uint8_t flags;
0396     uint8_t rsvd2[2];
0397     uint8_t hlength;
0398     uint8_t dlength[3];
0399     uint8_t rsvd4[8];
0400     itt_t    itt;
0401     __be32  ttt;
0402     __be32  cmdsn;
0403     __be32  exp_statsn;
0404     uint8_t rsvd5[16];
0405     /* Text - key=value pairs */
0406 };
0407 
0408 #define ISCSI_FLAG_TEXT_CONTINUE    0x40
0409 
0410 /* Text Response Header */
0411 struct iscsi_text_rsp {
0412     uint8_t opcode;
0413     uint8_t flags;
0414     uint8_t rsvd2[2];
0415     uint8_t hlength;
0416     uint8_t dlength[3];
0417     uint8_t rsvd4[8];
0418     itt_t    itt;
0419     __be32  ttt;
0420     __be32  statsn;
0421     __be32  exp_cmdsn;
0422     __be32  max_cmdsn;
0423     uint8_t rsvd5[12];
0424     /* Text Response - key:value pairs */
0425 };
0426 
0427 /* Login Header */
0428 struct iscsi_login_req {
0429     uint8_t opcode;
0430     uint8_t flags;
0431     uint8_t max_version;    /* Max. version supported */
0432     uint8_t min_version;    /* Min. version supported */
0433     uint8_t hlength;
0434     uint8_t dlength[3];
0435     uint8_t isid[6];    /* Initiator Session ID */
0436     __be16  tsih;   /* Target Session Handle */
0437     itt_t    itt;   /* Initiator Task Tag */
0438     __be16  cid;
0439     __be16  rsvd3;
0440     __be32  cmdsn;
0441     __be32  exp_statsn;
0442     uint8_t rsvd5[16];
0443 };
0444 
0445 /* Login PDU flags */
0446 #define ISCSI_FLAG_LOGIN_TRANSIT        0x80
0447 #define ISCSI_FLAG_LOGIN_CONTINUE       0x40
0448 #define ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK 0x0C    /* 2 bits */
0449 #define ISCSI_FLAG_LOGIN_CURRENT_STAGE1     0x04
0450 #define ISCSI_FLAG_LOGIN_CURRENT_STAGE2     0x08
0451 #define ISCSI_FLAG_LOGIN_CURRENT_STAGE3     0x0C
0452 #define ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK    0x03    /* 2 bits */
0453 #define ISCSI_FLAG_LOGIN_NEXT_STAGE1        0x01
0454 #define ISCSI_FLAG_LOGIN_NEXT_STAGE2        0x02
0455 #define ISCSI_FLAG_LOGIN_NEXT_STAGE3        0x03
0456 
0457 #define ISCSI_LOGIN_CURRENT_STAGE(flags) \
0458     ((flags & ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK) >> 2)
0459 #define ISCSI_LOGIN_NEXT_STAGE(flags) \
0460     (flags & ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK)
0461 
0462 /* Login Response Header */
0463 struct iscsi_login_rsp {
0464     uint8_t opcode;
0465     uint8_t flags;
0466     uint8_t max_version;    /* Max. version supported */
0467     uint8_t active_version; /* Active version */
0468     uint8_t hlength;
0469     uint8_t dlength[3];
0470     uint8_t isid[6];    /* Initiator Session ID */
0471     __be16  tsih;   /* Target Session Handle */
0472     itt_t    itt;   /* Initiator Task Tag */
0473     __be32  rsvd3;
0474     __be32  statsn;
0475     __be32  exp_cmdsn;
0476     __be32  max_cmdsn;
0477     uint8_t status_class;   /* see Login RSP ststus classes below */
0478     uint8_t status_detail;  /* see Login RSP Status details below */
0479     uint8_t rsvd4[10];
0480 };
0481 
0482 /* Login stage (phase) codes for CSG, NSG */
0483 #define ISCSI_INITIAL_LOGIN_STAGE       -1
0484 #define ISCSI_SECURITY_NEGOTIATION_STAGE    0
0485 #define ISCSI_OP_PARMS_NEGOTIATION_STAGE    1
0486 #define ISCSI_FULL_FEATURE_PHASE        3
0487 
0488 /* Login Status response classes */
0489 #define ISCSI_STATUS_CLS_SUCCESS        0x00
0490 #define ISCSI_STATUS_CLS_REDIRECT       0x01
0491 #define ISCSI_STATUS_CLS_INITIATOR_ERR      0x02
0492 #define ISCSI_STATUS_CLS_TARGET_ERR     0x03
0493 
0494 /* Login Status response detail codes */
0495 /* Class-0 (Success) */
0496 #define ISCSI_LOGIN_STATUS_ACCEPT       0x00
0497 
0498 /* Class-1 (Redirection) */
0499 #define ISCSI_LOGIN_STATUS_TGT_MOVED_TEMP   0x01
0500 #define ISCSI_LOGIN_STATUS_TGT_MOVED_PERM   0x02
0501 
0502 /* Class-2 (Initiator Error) */
0503 #define ISCSI_LOGIN_STATUS_INIT_ERR     0x00
0504 #define ISCSI_LOGIN_STATUS_AUTH_FAILED      0x01
0505 #define ISCSI_LOGIN_STATUS_TGT_FORBIDDEN    0x02
0506 #define ISCSI_LOGIN_STATUS_TGT_NOT_FOUND    0x03
0507 #define ISCSI_LOGIN_STATUS_TGT_REMOVED      0x04
0508 #define ISCSI_LOGIN_STATUS_NO_VERSION       0x05
0509 #define ISCSI_LOGIN_STATUS_ISID_ERROR       0x06
0510 #define ISCSI_LOGIN_STATUS_MISSING_FIELDS   0x07
0511 #define ISCSI_LOGIN_STATUS_CONN_ADD_FAILED  0x08
0512 #define ISCSI_LOGIN_STATUS_NO_SESSION_TYPE  0x09
0513 #define ISCSI_LOGIN_STATUS_NO_SESSION       0x0a
0514 #define ISCSI_LOGIN_STATUS_INVALID_REQUEST  0x0b
0515 
0516 /* Class-3 (Target Error) */
0517 #define ISCSI_LOGIN_STATUS_TARGET_ERROR     0x00
0518 #define ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE  0x01
0519 #define ISCSI_LOGIN_STATUS_NO_RESOURCES     0x02
0520 
0521 /* Logout Header */
0522 struct iscsi_logout {
0523     uint8_t opcode;
0524     uint8_t flags;
0525     uint8_t rsvd1[2];
0526     uint8_t hlength;
0527     uint8_t dlength[3];
0528     uint8_t rsvd2[8];
0529     itt_t    itt;   /* Initiator Task Tag */
0530     __be16  cid;
0531     uint8_t rsvd3[2];
0532     __be32  cmdsn;
0533     __be32  exp_statsn;
0534     uint8_t rsvd4[16];
0535 };
0536 
0537 /* Logout PDU flags */
0538 #define ISCSI_FLAG_LOGOUT_REASON_MASK   0x7F
0539 
0540 /* logout reason_code values */
0541 
0542 #define ISCSI_LOGOUT_REASON_CLOSE_SESSION   0
0543 #define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION    1
0544 #define ISCSI_LOGOUT_REASON_RECOVERY        2
0545 #define ISCSI_LOGOUT_REASON_AEN_REQUEST     3
0546 
0547 /* Logout Response Header */
0548 struct iscsi_logout_rsp {
0549     uint8_t opcode;
0550     uint8_t flags;
0551     uint8_t response;   /* see Logout response values below */
0552     uint8_t rsvd2;
0553     uint8_t hlength;
0554     uint8_t dlength[3];
0555     uint8_t rsvd3[8];
0556     itt_t    itt;   /* Initiator Task Tag */
0557     __be32  rsvd4;
0558     __be32  statsn;
0559     __be32  exp_cmdsn;
0560     __be32  max_cmdsn;
0561     __be32  rsvd5;
0562     __be16  t2wait;
0563     __be16  t2retain;
0564     __be32  rsvd6;
0565 };
0566 
0567 /* logout response status values */
0568 
0569 #define ISCSI_LOGOUT_SUCCESS            0
0570 #define ISCSI_LOGOUT_CID_NOT_FOUND      1
0571 #define ISCSI_LOGOUT_RECOVERY_UNSUPPORTED   2
0572 #define ISCSI_LOGOUT_CLEANUP_FAILED     3
0573 
0574 /* SNACK Header */
0575 struct iscsi_snack {
0576     uint8_t opcode;
0577     uint8_t flags;
0578     uint8_t rsvd2[2];
0579     uint8_t hlength;
0580     uint8_t dlength[3];
0581     uint8_t lun[8];
0582     itt_t    itt;
0583     __be32  ttt;
0584     uint8_t rsvd3[4];
0585     __be32  exp_statsn;
0586     uint8_t rsvd4[8];
0587     __be32  begrun;
0588     __be32  runlength;
0589 };
0590 
0591 /* SNACK PDU flags */
0592 #define ISCSI_FLAG_SNACK_TYPE_DATA      0
0593 #define ISCSI_FLAG_SNACK_TYPE_R2T       0
0594 #define ISCSI_FLAG_SNACK_TYPE_STATUS        1
0595 #define ISCSI_FLAG_SNACK_TYPE_DATA_ACK      2
0596 #define ISCSI_FLAG_SNACK_TYPE_RDATA     3
0597 #define ISCSI_FLAG_SNACK_TYPE_MASK  0x0F    /* 4 bits */
0598 
0599 /* Reject Message Header */
0600 struct iscsi_reject {
0601     uint8_t opcode;
0602     uint8_t flags;
0603     uint8_t reason;
0604     uint8_t rsvd2;
0605     uint8_t hlength;
0606     uint8_t dlength[3];
0607     uint8_t rsvd3[8];
0608     __be32  ffffffff;
0609     uint8_t rsvd4[4];
0610     __be32  statsn;
0611     __be32  exp_cmdsn;
0612     __be32  max_cmdsn;
0613     __be32  datasn;
0614     uint8_t rsvd5[8];
0615     /* Text - Rejected hdr */
0616 };
0617 
0618 /* Reason for Reject */
0619 #define ISCSI_REASON_CMD_BEFORE_LOGIN   1
0620 #define ISCSI_REASON_DATA_DIGEST_ERROR  2
0621 #define ISCSI_REASON_DATA_SNACK_REJECT  3
0622 #define ISCSI_REASON_PROTOCOL_ERROR 4
0623 #define ISCSI_REASON_CMD_NOT_SUPPORTED  5
0624 #define ISCSI_REASON_IMM_CMD_REJECT     6
0625 #define ISCSI_REASON_TASK_IN_PROGRESS   7
0626 #define ISCSI_REASON_INVALID_SNACK      8
0627 #define ISCSI_REASON_BOOKMARK_INVALID   9
0628 #define ISCSI_REASON_BOOKMARK_NO_RESOURCES  10
0629 #define ISCSI_REASON_NEGOTIATION_RESET  11
0630 
0631 /* Max. number of Key=Value pairs in a text message */
0632 #define MAX_KEY_VALUE_PAIRS 8192
0633 
0634 /* maximum length for text keys/values */
0635 #define KEY_MAXLEN      64
0636 #define VALUE_MAXLEN        255
0637 #define TARGET_NAME_MAXLEN  VALUE_MAXLEN
0638 
0639 #define ISCSI_DEF_MAX_RECV_SEG_LEN      8192
0640 #define ISCSI_MIN_MAX_RECV_SEG_LEN      512
0641 #define ISCSI_MAX_MAX_RECV_SEG_LEN      16777215
0642 
0643 #define ISCSI_DEF_FIRST_BURST_LEN       65536
0644 #define ISCSI_MIN_FIRST_BURST_LEN       512
0645 #define ISCSI_MAX_FIRST_BURST_LEN       16777215
0646 
0647 #define ISCSI_DEF_MAX_BURST_LEN         262144
0648 #define ISCSI_MIN_MAX_BURST_LEN         512
0649 #define ISCSI_MAX_MAX_BURST_LEN         16777215
0650 
0651 #define ISCSI_DEF_TIME2WAIT         2
0652 
0653 #define ISCSI_NAME_LEN              224
0654 
0655 /************************* RFC 3720 End *****************************/
0656 
0657 #endif /* ISCSI_PROTO_H */