ore: RAID5 Write
[linux-2.6.git] / include / scsi / iscsi_proto.h
index 6c08551..988ba06 100644 (file)
 #ifndef ISCSI_PROTO_H
 #define ISCSI_PROTO_H
 
-#define ISCSI_VERSION_STR      "0.3"
-#define ISCSI_DATE_STR         "22-Apr-2005"
+#include <linux/types.h>
+#include <scsi/scsi.h>
+
 #define ISCSI_DRAFT20_VERSION  0x00
 
 /* default iSCSI listen port for incoming connections */
 #define ISCSI_LISTEN_PORT      3260
 
+/* iSCSI header length */
+#define ISCSI_HDR_LEN          48
+
+/* iSCSI CRC32C length */
+#define ISCSI_CRC_LEN          4
+
 /* Padding word length */
-#define PAD_WORD_LEN           4
+#define ISCSI_PAD_LEN          4
+
+/*
+ * Serial Number Arithmetic, 32 bits, RFC1982
+ */
+
+static inline int iscsi_sna_lt(u32 n1, u32 n2)
+{
+       return (s32)(n1 - n2) < 0;
+}
+
+static inline int iscsi_sna_lte(u32 n1, u32 n2)
+{
+       return (s32)(n1 - n2) <= 0;
+}
+
+static inline int iscsi_sna_gt(u32 n1, u32 n2)
+{
+       return (s32)(n1 - n2) > 0;
+}
+
+static inline int iscsi_sna_gte(u32 n1, u32 n2)
+{
+       return (s32)(n1 - n2) >= 0;
+}
 
 /*
  * useful common(control and data pathes) macro
 }
 #define zero_data(p) {p[0]=0;p[1]=0;p[2]=0;}
 
+/* initiator tags; opaque for target */
+typedef uint32_t __bitwise__ itt_t;
+/* below makes sense only for initiator that created this tag */
+#define build_itt(itt, age) ((__force itt_t)\
+       ((itt) | ((age) << ISCSI_AGE_SHIFT)))
+#define get_itt(itt) ((__force uint32_t)(itt_t)(itt) & ISCSI_ITT_MASK)
+#define RESERVED_ITT ((__force itt_t)0xffffffff)
+
 /*
  * iSCSI Template Message Header
  */
@@ -51,12 +90,13 @@ struct iscsi_hdr {
        uint8_t         rsvd2[2];
        uint8_t         hlength;        /* AHSs total length */
        uint8_t         dlength[3];     /* Data length */
-       uint8_t         lun[8];
-       __be32          itt;            /* Initiator Task Tag */
+       struct scsi_lun lun;
+       itt_t           itt;            /* Initiator Task Tag, opaque for target */
        __be32          ttt;            /* Target Task Tag */
        __be32          statsn;
        __be32          exp_statsn;
-       uint8_t         other[16];
+       __be32          max_statsn;
+       uint8_t         other[12];
 };
 
 /************************* RFC 3720 Begin *****************************/
@@ -78,6 +118,11 @@ struct iscsi_hdr {
 #define ISCSI_OP_LOGOUT                        0x06
 #define ISCSI_OP_SNACK                 0x10
 
+#define ISCSI_OP_VENDOR1_CMD           0x1c
+#define ISCSI_OP_VENDOR2_CMD           0x1d
+#define ISCSI_OP_VENDOR3_CMD           0x1e
+#define ISCSI_OP_VENDOR4_CMD           0x1f
+
 /* Target Opcode values */
 #define ISCSI_OP_NOOP_IN               0x20
 #define ISCSI_OP_SCSI_CMD_RSP          0x21
@@ -90,20 +135,29 @@ struct iscsi_hdr {
 #define ISCSI_OP_ASYNC_EVENT           0x32
 #define ISCSI_OP_REJECT                        0x3f
 
+struct iscsi_ahs_hdr {
+       __be16 ahslength;
+       uint8_t ahstype;
+       uint8_t ahspec[5];
+};
+
+#define ISCSI_AHSTYPE_CDB              1
+#define ISCSI_AHSTYPE_RLENGTH          2
+#define ISCSI_CDB_SIZE                 16
+
 /* iSCSI PDU Header */
-struct iscsi_cmd {
+struct iscsi_scsi_req {
        uint8_t opcode;
        uint8_t flags;
-       uint8_t rsvd2;
-       uint8_t cmdrn;
+       __be16 rsvd2;
        uint8_t hlength;
        uint8_t dlength[3];
-       uint8_t lun[8];
-       __be32 itt;     /* Initiator Task Tag */
+       struct scsi_lun lun;
+       itt_t    itt;   /* Initiator Task Tag */
        __be32 data_length;
        __be32 cmdsn;
        __be32 exp_statsn;
-       uint8_t cdb[16];        /* SCSI Command Block */
+       uint8_t cdb[ISCSI_CDB_SIZE];    /* SCSI Command Block */
        /* Additional Data (Command Dependent) */
 };
 
@@ -120,8 +174,24 @@ struct iscsi_cmd {
 #define ISCSI_ATTR_HEAD_OF_QUEUE       3
 #define ISCSI_ATTR_ACA                 4
 
+struct iscsi_rlength_ahdr {
+       __be16 ahslength;
+       uint8_t ahstype;
+       uint8_t reserved;
+       __be32 read_length;
+};
+
+/* Extended CDB AHS */
+struct iscsi_ecdb_ahdr {
+       __be16 ahslength;       /* CDB length - 15, including reserved byte */
+       uint8_t ahstype;
+       uint8_t reserved;
+       /* 4-byte aligned extended CDB spillover */
+       uint8_t ecdb[SCSI_MAX_VARLEN_CDB_SIZE - ISCSI_CDB_SIZE];
+};
+
 /* SCSI Response Header */
-struct iscsi_cmd_rsp {
+struct iscsi_scsi_rsp {
        uint8_t opcode;
        uint8_t flags;
        uint8_t response;
@@ -129,7 +199,7 @@ struct iscsi_cmd_rsp {
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t rsvd[8];
-       __be32  itt;    /* Initiator Task Tag */
+       itt_t    itt;   /* Initiator Task Tag */
        __be32  rsvd1;
        __be32  statsn;
        __be32  exp_cmdsn;
@@ -158,7 +228,7 @@ struct iscsi_async {
        uint8_t rsvd2[2];
        uint8_t rsvd3;
        uint8_t dlength[3];
-       uint8_t lun[8];
+       struct scsi_lun lun;
        uint8_t rsvd4[8];
        __be32  statsn;
        __be32  exp_cmdsn;
@@ -186,8 +256,8 @@ struct iscsi_nopout {
        __be16  rsvd2;
        uint8_t rsvd3;
        uint8_t dlength[3];
-       uint8_t lun[8];
-       __be32  itt;    /* Initiator Task Tag */
+       struct scsi_lun lun;
+       itt_t    itt;   /* Initiator Task Tag */
        __be32  ttt;    /* Target Transfer Tag */
        __be32  cmdsn;
        __be32  exp_statsn;
@@ -201,8 +271,8 @@ struct iscsi_nopin {
        __be16  rsvd2;
        uint8_t rsvd3;
        uint8_t dlength[3];
-       uint8_t lun[8];
-       __be32  itt;    /* Initiator Task Tag */
+       struct scsi_lun lun;
+       itt_t    itt;   /* Initiator Task Tag */
        __be32  ttt;    /* Target Transfer Tag */
        __be32  statsn;
        __be32  exp_cmdsn;
@@ -217,9 +287,9 @@ struct iscsi_tm {
        uint8_t rsvd1[2];
        uint8_t hlength;
        uint8_t dlength[3];
-       uint8_t lun[8];
-       __be32  itt;    /* Initiator Task Tag */
-       __be32  rtt;    /* Reference Task Tag */
+       struct scsi_lun lun;
+       itt_t    itt;   /* Initiator Task Tag */
+       itt_t    rtt;   /* Reference Task Tag */
        __be32  cmdsn;
        __be32  exp_statsn;
        __be32  refcmdsn;
@@ -227,7 +297,7 @@ struct iscsi_tm {
        uint8_t rsvd2[8];
 };
 
-#define ISCSI_FLAG_TASK_MGMT_FUNCTION_MASK     0x7F
+#define ISCSI_FLAG_TM_FUNC_MASK                        0x7F
 
 /* Function values */
 #define ISCSI_TM_FUNC_ABORT_TASK               1
@@ -239,6 +309,8 @@ struct iscsi_tm {
 #define ISCSI_TM_FUNC_TARGET_COLD_RESET                7
 #define ISCSI_TM_FUNC_TASK_REASSIGN            8
 
+#define ISCSI_TM_FUNC_VALUE(hdr) ((hdr)->flags & ISCSI_FLAG_TM_FUNC_MASK)
+
 /* SCSI Task Management Response Header */
 struct iscsi_tm_rsp {
        uint8_t opcode;
@@ -248,8 +320,8 @@ struct iscsi_tm_rsp {
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t rsvd2[8];
-       __be32  itt;    /* Initiator Task Tag */
-       __be32  rtt;    /* Reference Task Tag */
+       itt_t    itt;   /* Initiator Task Tag */
+       itt_t    rtt;   /* Reference Task Tag */
        __be32  statsn;
        __be32  exp_cmdsn;
        __be32  max_cmdsn;
@@ -257,14 +329,14 @@ struct iscsi_tm_rsp {
 };
 
 /* Response values */
-#define SCSI_TCP_TM_RESP_COMPLETE      0x00
-#define SCSI_TCP_TM_RESP_NO_TASK       0x01
-#define SCSI_TCP_TM_RESP_NO_LUN                0x02
-#define SCSI_TCP_TM_RESP_TASK_ALLEGIANT        0x03
-#define SCSI_TCP_TM_RESP_NO_FAILOVER   0x04
-#define SCSI_TCP_TM_RESP_NOT_SUPPORTED 0x05
-#define SCSI_TCP_TM_RESP_AUTH_FAILED   0x06
-#define SCSI_TCP_TM_RESP_REJECTED      0xff
+#define ISCSI_TMF_RSP_COMPLETE         0x00
+#define ISCSI_TMF_RSP_NO_TASK          0x01
+#define ISCSI_TMF_RSP_NO_LUN           0x02
+#define ISCSI_TMF_RSP_TASK_ALLEGIANT   0x03
+#define ISCSI_TMF_RSP_NO_FAILOVER      0x04
+#define ISCSI_TMF_RSP_NOT_SUPPORTED    0x05
+#define ISCSI_TMF_RSP_AUTH_FAILED      0x06
+#define ISCSI_TMF_RSP_REJECTED         0xff
 
 /* Ready To Transfer Header */
 struct iscsi_r2t_rsp {
@@ -273,8 +345,8 @@ struct iscsi_r2t_rsp {
        uint8_t rsvd2[2];
        uint8_t hlength;
        uint8_t dlength[3];
-       uint8_t lun[8];
-       __be32  itt;    /* Initiator Task Tag */
+       struct scsi_lun lun;
+       itt_t    itt;   /* Initiator Task Tag */
        __be32  ttt;    /* Target Transfer Tag */
        __be32  statsn;
        __be32  exp_cmdsn;
@@ -291,8 +363,8 @@ struct iscsi_data {
        uint8_t rsvd2[2];
        uint8_t rsvd3;
        uint8_t dlength[3];
-       uint8_t lun[8];
-       __be32  itt;
+       struct scsi_lun lun;
+       itt_t    itt;
        __be32  ttt;
        __be32  rsvd4;
        __be32  exp_statsn;
@@ -311,8 +383,8 @@ struct iscsi_data_rsp {
        uint8_t cmd_status;
        uint8_t hlength;
        uint8_t dlength[3];
-       uint8_t lun[8];
-       __be32  itt;
+       struct scsi_lun lun;
+       itt_t    itt;
        __be32  ttt;
        __be32  statsn;
        __be32  exp_cmdsn;
@@ -336,7 +408,7 @@ struct iscsi_text {
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t rsvd4[8];
-       __be32  itt;
+       itt_t    itt;
        __be32  ttt;
        __be32  cmdsn;
        __be32  exp_statsn;
@@ -354,7 +426,7 @@ struct iscsi_text_rsp {
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t rsvd4[8];
-       __be32  itt;
+       itt_t    itt;
        __be32  ttt;
        __be32  statsn;
        __be32  exp_cmdsn;
@@ -364,7 +436,7 @@ struct iscsi_text_rsp {
 };
 
 /* Login Header */
-struct iscsi_login {
+struct iscsi_login_req {
        uint8_t opcode;
        uint8_t flags;
        uint8_t max_version;    /* Max. version supported */
@@ -373,7 +445,7 @@ struct iscsi_login {
        uint8_t dlength[3];
        uint8_t isid[6];        /* Initiator Session ID */
        __be16  tsih;   /* Target Session Handle */
-       __be32  itt;    /* Initiator Task Tag */
+       itt_t    itt;   /* Initiator Task Tag */
        __be16  cid;
        __be16  rsvd3;
        __be32  cmdsn;
@@ -385,7 +457,13 @@ struct iscsi_login {
 #define ISCSI_FLAG_LOGIN_TRANSIT               0x80
 #define ISCSI_FLAG_LOGIN_CONTINUE              0x40
 #define ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK    0x0C    /* 2 bits */
+#define ISCSI_FLAG_LOGIN_CURRENT_STAGE1                0x04
+#define ISCSI_FLAG_LOGIN_CURRENT_STAGE2                0x08
+#define ISCSI_FLAG_LOGIN_CURRENT_STAGE3                0x0C
 #define ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK       0x03    /* 2 bits */
+#define ISCSI_FLAG_LOGIN_NEXT_STAGE1           0x01
+#define ISCSI_FLAG_LOGIN_NEXT_STAGE2           0x02
+#define ISCSI_FLAG_LOGIN_NEXT_STAGE3           0x03
 
 #define ISCSI_LOGIN_CURRENT_STAGE(flags) \
        ((flags & ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK) >> 2)
@@ -402,7 +480,7 @@ struct iscsi_login_rsp {
        uint8_t dlength[3];
        uint8_t isid[6];        /* Initiator Session ID */
        __be16  tsih;   /* Target Session Handle */
-       __be32  itt;    /* Initiator Task Tag */
+       itt_t    itt;   /* Initiator Task Tag */
        __be32  rsvd3;
        __be32  statsn;
        __be32  exp_cmdsn;
@@ -459,7 +537,7 @@ struct iscsi_logout {
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t rsvd2[8];
-       __be32  itt;    /* Initiator Task Tag */
+       itt_t    itt;   /* Initiator Task Tag */
        __be16  cid;
        uint8_t rsvd3[2];
        __be32  cmdsn;
@@ -486,7 +564,7 @@ struct iscsi_logout_rsp {
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t rsvd3[8];
-       __be32  itt;    /* Initiator Task Tag */
+       itt_t    itt;   /* Initiator Task Tag */
        __be32  rsvd4;
        __be32  statsn;
        __be32  exp_cmdsn;
@@ -508,17 +586,25 @@ struct iscsi_logout_rsp {
 struct iscsi_snack {
        uint8_t opcode;
        uint8_t flags;
-       uint8_t rsvd2[14];
-       __be32  itt;
+       uint8_t rsvd2[2];
+       uint8_t hlength;
+       uint8_t dlength[3];
+       uint8_t lun[8];
+       itt_t    itt;
+       __be32  ttt;
+       uint8_t rsvd3[4];
+       __be32  exp_statsn;
+       uint8_t rsvd4[8];
        __be32  begrun;
        __be32  runlength;
-       __be32  exp_statsn;
-       __be32  rsvd3;
-       __be32  exp_datasn;
-       uint8_t rsvd6[8];
 };
 
 /* SNACK PDU flags */
+#define ISCSI_FLAG_SNACK_TYPE_DATA             0
+#define ISCSI_FLAG_SNACK_TYPE_R2T              0
+#define ISCSI_FLAG_SNACK_TYPE_STATUS           1
+#define ISCSI_FLAG_SNACK_TYPE_DATA_ACK         2
+#define ISCSI_FLAG_SNACK_TYPE_RDATA            3
 #define ISCSI_FLAG_SNACK_TYPE_MASK     0x0F    /* 4 bits */
 
 /* Reject Message Header */
@@ -527,9 +613,11 @@ struct iscsi_reject {
        uint8_t flags;
        uint8_t reason;
        uint8_t rsvd2;
-       uint8_t rsvd3;
+       uint8_t hlength;
        uint8_t dlength[3];
-       uint8_t rsvd4[16];
+       uint8_t rsvd3[8];
+       __be32  ffffffff;
+       uint8_t rsvd4[4];
        __be32  statsn;
        __be32  exp_cmdsn;
        __be32  max_cmdsn;
@@ -539,17 +627,17 @@ struct iscsi_reject {
 };
 
 /* Reason for Reject */
-#define CMD_BEFORE_LOGIN       1
-#define DATA_DIGEST_ERROR      2
-#define DATA_SNACK_REJECT      3
-#define ISCSI_PROTOCOL_ERROR   4
-#define CMD_NOT_SUPPORTED      5
-#define IMM_CMD_REJECT         6
-#define TASK_IN_PROGRESS       7
-#define INVALID_SNACK          8
-#define BOOKMARK_REJECTED      9
-#define BOOKMARK_NO_RESOURCES  10
-#define NEGOTIATION_RESET      11
+#define ISCSI_REASON_CMD_BEFORE_LOGIN  1
+#define ISCSI_REASON_DATA_DIGEST_ERROR 2
+#define ISCSI_REASON_DATA_SNACK_REJECT 3
+#define ISCSI_REASON_PROTOCOL_ERROR    4
+#define ISCSI_REASON_CMD_NOT_SUPPORTED 5
+#define ISCSI_REASON_IMM_CMD_REJECT            6
+#define ISCSI_REASON_TASK_IN_PROGRESS  7
+#define ISCSI_REASON_INVALID_SNACK             8
+#define ISCSI_REASON_BOOKMARK_INVALID  9
+#define ISCSI_REASON_BOOKMARK_NO_RESOURCES     10
+#define ISCSI_REASON_NEGOTIATION_RESET 11
 
 /* Max. number of Key=Value pairs in a text message */
 #define MAX_KEY_VALUE_PAIRS    8192
@@ -559,7 +647,19 @@ struct iscsi_reject {
 #define VALUE_MAXLEN           255
 #define TARGET_NAME_MAXLEN     VALUE_MAXLEN
 
-#define DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH   8192
+#define ISCSI_DEF_MAX_RECV_SEG_LEN             8192
+#define ISCSI_MIN_MAX_RECV_SEG_LEN             512
+#define ISCSI_MAX_MAX_RECV_SEG_LEN             16777215
+
+#define ISCSI_DEF_FIRST_BURST_LEN              65536
+#define ISCSI_MIN_FIRST_BURST_LEN              512
+#define ISCSI_MAX_FIRST_BURST_LEN              16777215
+
+#define ISCSI_DEF_MAX_BURST_LEN                        262144
+#define ISCSI_MIN_MAX_BURST_LEN                        512
+#define ISCSI_MAX_MAX_BURST_LEN                        16777215
+
+#define ISCSI_DEF_TIME2WAIT                    2
 
 /************************* RFC 3720 End *****************************/