root/usr/src/uts/common/sys/iscsi_protocol.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
 */

#ifndef _ISCSI_PROTOCOL_H
#define _ISCSI_PROTOCOL_H

#ifdef __cplusplus
extern "C" {
#endif

/*
 * iSCSI connection daemon
 * Copyright (C) 2001 Cisco Systems, Inc.
 * All rights reserved.
 *
 * This file sets up definitions of messages and constants used by the
 * iSCSI protocol.
 *
 */

#include <sys/types.h>
#include <sys/isa_defs.h>

#define ISCSI_MAX_NAME_LEN      224
#define ISCSI_MAX_C_USER_LEN    512

/* iSCSI listen port for incoming connections */
#define ISCSI_LISTEN_PORT 3260

/* assumes a pointer to a 3-byte array */
#define ntoh24(p) (((p)[0] << 16) | ((p)[1] << 8) | ((p)[2]))

/* assumes a pointer to a 3 byte array, and an integer value */
#define hton24(p, v) {\
        p[0] = (((v) >> 16) & 0xFF); \
        p[1] = (((v) >> 8) & 0xFF); \
        p[2] = ((v) & 0xFF); \
}


/* for Login min, max, active version fields */
#define ISCSI_MIN_VERSION       0x00
#define ISCSI_DRAFT8_VERSION    0x02
#define ISCSI_DRAFT20_VERSION   0x00
#define ISCSI_MAX_VERSION       0x02

/* Min. and Max. length of a PDU we can support */
#define ISCSI_MIN_PDU_LENGTH    (8 << 9)        /* 4KB */
#define ISCSI_MAX_PDU_LENGTH    (0xffffffff)    /* Huge */

/* Padding word length */
#define ISCSI_PAD_WORD_LEN              4

/* Max. number of Key=Value pairs in a text message */
#define ISCSI_MAX_KEY_VALUE_PAIRS       8192

/* text separtor between key value pairs exhanged in login */
#define ISCSI_TEXT_SEPARATOR    '='

/* reserved text constants for Text Mode Negotiation */
#define ISCSI_TEXT_NONE                 "None"
#define ISCSI_TEXT_REJECT               "Reject"
#define ISCSI_TEXT_IRRELEVANT           "Irrelevant"
#define ISCSI_TEXT_NOTUNDERSTOOD        "NotUnderstood"

/* Reserved value for initiator/target task tag */
#define ISCSI_RSVD_TASK_TAG     0xffffffff

/* maximum length for text keys/values */
#define KEY_MAXLEN 64
#define VALUE_MAXLEN 255
#define TARGET_NAME_MAXLEN    VALUE_MAXLEN

/* most PDU types have a final bit */
#define ISCSI_FLAG_FINAL                0x80

/*
 * Strings used during SendTargets requests
 */
#define ISCSI_TEXT_SEPARATOR    '='
#define TARGETNAME "TargetName="
#define TARGETADDRESS "TargetAddress="

/* iSCSI Template Message Header */
typedef struct _iscsi_hdr {
        uint8_t opcode;
        uint8_t flags;  /* Final bit */
        uint8_t rsvd2[2];
        uint8_t hlength;        /* AHSs total length */
        uint8_t dlength[3];     /* Data length */
        uint8_t lun[8];
        uint32_t itt;   /* Initiator Task Tag */
        uint8_t         rsvd3[8];
        uint32_t        expstatsn;
        uint8_t         other[16];
} iscsi_hdr_t;

typedef struct _iscsi_rsp_hdr {
        uint8_t         opcode;
        uint8_t         flags;
        uint8_t         rsvd1[3];
        uint8_t         dlength[3];
        uint8_t         rsvd2[8];
        uint32_t        itt;
        uint8_t         rsvd3[4];
        uint32_t        statsn;
        uint32_t        expcmdsn;
        uint32_t        maxcmdsn;
        uint8_t         rsvd4[12];
} iscsi_rsp_hdr_t;

/* Opcode encoding bits */
#define ISCSI_OP_RETRY                  0x80
#define ISCSI_OP_IMMEDIATE              0x40
#define ISCSI_OPCODE_MASK               0x3F

/* Client to Server Message Opcode values */
#define ISCSI_OP_NOOP_OUT               0x00
#define ISCSI_OP_SCSI_CMD               0x01
#define ISCSI_OP_SCSI_TASK_MGT_MSG      0x02
#define ISCSI_OP_LOGIN_CMD              0x03
#define ISCSI_OP_TEXT_CMD               0x04
#define ISCSI_OP_SCSI_DATA              0x05
#define ISCSI_OP_LOGOUT_CMD             0x06
#define ISCSI_OP_SNACK_CMD              0x10

/* Server to Client Message Opcode values */
#define ISCSI_OP_NOOP_IN                0x20
#define ISCSI_OP_SCSI_RSP               0x21
#define ISCSI_OP_SCSI_TASK_MGT_RSP      0x22
#define ISCSI_OP_LOGIN_RSP              0x23
#define ISCSI_OP_TEXT_RSP               0x24
#define ISCSI_OP_SCSI_DATA_RSP          0x25
#define ISCSI_OP_LOGOUT_RSP             0x26
#define ISCSI_OP_RTT_RSP                0x31
#define ISCSI_OP_ASYNC_EVENT            0x32
#define ISCSI_OP_REJECT_MSG             0x3f


/* SCSI Command Header */
typedef struct _iscsi_scsi_cmd_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint8_t rsvd[2];
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t lun[8];
        uint32_t itt;   /* Initiator Task Tag */
        uint32_t data_length;
        uint32_t cmdsn;
        uint32_t expstatsn;
        uint8_t scb[16];        /* SCSI Command Block */
        /*
         * Additional Data (Command Dependent)
         */
} iscsi_scsi_cmd_hdr_t;

/* Command PDU flags */
#define ISCSI_FLAG_CMD_READ             0x40
#define ISCSI_FLAG_CMD_WRITE            0x20
#define ISCSI_FLAG_CMD_ATTR_MASK        0x07    /* 3 bits */

/* SCSI Command Attribute values */
#define ISCSI_ATTR_UNTAGGED             0
#define ISCSI_ATTR_SIMPLE               1
#define ISCSI_ATTR_ORDERED              2
#define ISCSI_ATTR_HEAD_OF_QUEUE        3
#define ISCSI_ATTR_ACA                  4


/* SCSI Response Header */
typedef struct _iscsi_scsi_rsp_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint8_t response;
        uint8_t cmd_status;
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t rsvd[8];
        uint32_t itt;   /* Initiator Task Tag */
        uint32_t rsvd1;
        uint32_t statsn;
        uint32_t expcmdsn;
        uint32_t maxcmdsn;
        uint32_t expdatasn;
        uint32_t bi_residual_count;
        uint32_t residual_count;
        /*
         * Response or Sense Data (optional)
         */
} iscsi_scsi_rsp_hdr_t;

/* 10.2.2.3 - Extended CDB Additional Header Segment */

typedef struct _iscsi_addl_hdr {
        iscsi_scsi_cmd_hdr_t ahs_isch;
        uint8_t ahs_hlen_hi;
        uint8_t ahs_hlen_lo;
        uint8_t ahs_key;
        uint8_t ahs_resv;
        uint8_t ahs_extscb[4];
} iscsi_addl_hdr_t;

/* Command Response PDU flags */
#define ISCSI_FLAG_CMD_BIDI_OVERFLOW    0x10
#define ISCSI_FLAG_CMD_BIDI_UNDERFLOW   0x08
#define ISCSI_FLAG_CMD_OVERFLOW         0x04
#define ISCSI_FLAG_CMD_UNDERFLOW        0x02

/* iSCSI Status values. Valid if Rsp Selector bit is not set */
#define ISCSI_STATUS_CMD_COMPLETED      0
#define ISCSI_STATUS_TARGET_FAILURE     1
#define ISCSI_STATUS_SUBSYS_FAILURE     2


/* Asynchronous Event Header */
typedef struct _iscsi_async_evt_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint8_t rsvd2[2];
        uint8_t rsvd3;
        uint8_t dlength[3];
        uint8_t lun[8];
        uint8_t rsvd4[8];
        uint32_t statsn;
        uint32_t expcmdsn;
        uint32_t maxcmdsn;
        uint8_t async_event;
        uint8_t async_vcode;
        uint16_t param1;
        uint16_t param2;
        uint16_t param3;
        uint8_t rsvd5[4];
} iscsi_async_evt_hdr_t;

/* iSCSI Event Indicator values */
#define ISCSI_ASYNC_EVENT_SCSI_EVENT                    0
#define ISCSI_ASYNC_EVENT_REQUEST_LOGOUT                1
#define ISCSI_ASYNC_EVENT_DROPPING_CONNECTION           2
#define ISCSI_ASYNC_EVENT_DROPPING_ALL_CONNECTIONS      3
#define ISCSI_ASYNC_EVENT_PARAM_NEGOTIATION             4
#define ISCSI_ASYNC_EVENT_VENDOR_SPECIFIC               255


/* NOP-Out Message */
typedef struct _iscsi_nop_out_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint16_t rsvd2;
        uint8_t rsvd3;
        uint8_t dlength[3];
        uint8_t lun[8];
        uint32_t itt;   /* Initiator Task Tag */
        uint32_t ttt;   /* Target Transfer Tag */
        uint32_t cmdsn;
        uint32_t expstatsn;
        uint8_t rsvd4[16];
} iscsi_nop_out_hdr_t;


/* NOP-In Message */
typedef struct _iscsi_nop_in_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint16_t rsvd2;
        uint8_t rsvd3;
        uint8_t dlength[3];
        uint8_t lun[8];
        uint32_t itt;   /* Initiator Task Tag */
        uint32_t ttt;   /* Target Transfer Tag */
        uint32_t statsn;
        uint32_t expcmdsn;
        uint32_t maxcmdsn;
        uint8_t rsvd4[12];
} iscsi_nop_in_hdr_t;

/* SCSI Task Management Message Header */
typedef struct _iscsi_scsi_task_mgt_hdr {
        uint8_t opcode;
        uint8_t function;
        uint8_t rsvd1[2];
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t lun[8];
        uint32_t itt;   /* Initiator Task Tag */
        uint32_t rtt;   /* Reference Task Tag */
        uint32_t cmdsn;
        uint32_t expstatsn;
        uint32_t refcmdsn;
        uint32_t expdatasn;
        uint8_t rsvd2[8];
} iscsi_scsi_task_mgt_hdr_t;

#define ISCSI_FLAG_TASK_MGMT_FUNCTION_MASK  0x7F

/* Function values */
#define ISCSI_TM_FUNC_ABORT_TASK                1
#define ISCSI_TM_FUNC_ABORT_TASK_SET            2
#define ISCSI_TM_FUNC_CLEAR_ACA                 3
#define ISCSI_TM_FUNC_CLEAR_TASK_SET            4
#define ISCSI_TM_FUNC_LOGICAL_UNIT_RESET        5
#define ISCSI_TM_FUNC_TARGET_WARM_RESET         6
#define ISCSI_TM_FUNC_TARGET_COLD_RESET         7
#define ISCSI_TM_FUNC_TASK_REASSIGN             8


/* SCSI Task Management Response Header */
typedef struct _iscsi_scsi_task_mgt_rsp_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint8_t response;       /* see Response values below */
        uint8_t qualifier;
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t rsvd2[8];
        uint32_t itt;   /* Initiator Task Tag */
        uint32_t rtt;   /* Reference Task Tag */
        uint32_t statsn;
        uint32_t expcmdsn;
        uint32_t maxcmdsn;
        uint8_t rsvd3[12];
} iscsi_scsi_task_mgt_rsp_hdr_t;


/* 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_ALLG_REASSN 0x04
#define SCSI_TCP_TM_RESP_FUNC_NOT_SUPP  0x05
#define SCSI_TCP_TM_RESP_FUNC_AUTH_FAIL 0x06
#define SCSI_TCP_TM_RESP_REJECTED       0xff

/*
 * Maintained for backward compatibility.
 */

#define SCSI_TCP_TM_RESP_NO_FAILOVER    SCSI_TCP_TM_RESP_NO_ALLG_REASSN
#define SCSI_TCP_TM_RESP_IN_PRGRESS     SCSI_TCP_TM_RESP_FUNC_NOT_SUPP

/* Ready To Transfer Header */
typedef struct _iscsi_rtt_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint8_t rsvd2[2];
        uint8_t rsvd3[12];
        uint32_t itt;   /* Initiator Task Tag */
        uint32_t ttt;   /* Target Transfer Tag */
        uint32_t statsn;
        uint32_t expcmdsn;
        uint32_t maxcmdsn;
        uint32_t rttsn;
        uint32_t data_offset;
        uint32_t data_length;
} iscsi_rtt_hdr_t;


/* SCSI Data Hdr */
typedef struct _iscsi_data_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint8_t rsvd2[2];
        uint8_t rsvd3;
        uint8_t dlength[3];
        uint8_t lun[8];
        uint32_t itt;
        uint32_t ttt;
        uint32_t rsvd4;
        uint32_t expstatsn;
        uint32_t rsvd5;
        uint32_t datasn;
        uint32_t offset;
        uint32_t rsvd6;
        /*
         * Payload
         */
} iscsi_data_hdr_t;

/* SCSI Data Response Hdr */
typedef struct _iscsi_data_rsp_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint8_t rsvd2;
        uint8_t cmd_status;
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t lun[8];
        uint32_t itt;
        uint32_t ttt;
        uint32_t statsn;
        uint32_t expcmdsn;
        uint32_t maxcmdsn;
        uint32_t datasn;
        uint32_t offset;
        uint32_t residual_count;
} iscsi_data_rsp_hdr_t;

/* Data Response PDU flags */
#define ISCSI_FLAG_DATA_ACK             0x40
#define ISCSI_FLAG_DATA_OVERFLOW        0x04
#define ISCSI_FLAG_DATA_UNDERFLOW       0x02
#define ISCSI_FLAG_DATA_STATUS          0x01


/* Text Header */
typedef struct _iscsi_text_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint8_t rsvd2[2];
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t rsvd4[8];
        uint32_t itt;
        uint32_t ttt;
        uint32_t cmdsn;
        uint32_t expstatsn;
        uint8_t rsvd5[16];
        /*
         * Text - key=value pairs
         */
} iscsi_text_hdr_t;

#define ISCSI_FLAG_TEXT_CONTINUE        0x40

/* Text Response Header */
typedef struct _iscsi_text_rsp_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint8_t rsvd2[2];
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t rsvd4[8];
        uint32_t itt;
        uint32_t ttt;
        uint32_t statsn;
        uint32_t expcmdsn;
        uint32_t maxcmdsn;
        uint8_t rsvd5[12];
        /*
         * Text Response - key:value pairs
         */
} iscsi_text_rsp_hdr_t;

#define ISCSI_ISID_LEN  6

/* Login Header */
typedef struct _iscsi_login_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint8_t max_version;    /* Max. version supported */
        uint8_t min_version;    /* Min. version supported */
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t isid[ISCSI_ISID_LEN];   /* Initiator Session ID */
        uint16_t tsid;  /* Target Session ID */
        uint32_t itt;   /* Initiator Task Tag */
        uint16_t cid;
        uint16_t rsvd3;
        uint32_t cmdsn;
        uint32_t expstatsn;
        uint8_t rsvd5[16];
} iscsi_login_hdr_t;

/* Login PDU flags */
#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_NEXT_STAGE_MASK        0x03    /* 2 bits */

#define ISCSI_LOGIN_CURRENT_STAGE(flags) \
        ((flags & ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK) >> 2)
#define ISCSI_LOGIN_NEXT_STAGE(flags) \
        (flags & ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK)


/* Login Response Header */
typedef struct _iscsi_login_rsp_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint8_t max_version;    /* Max. version supported */
        uint8_t active_version; /* Active version */
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t isid[ISCSI_ISID_LEN];   /* Initiator Session ID */
        uint16_t tsid;  /* Target Session ID */
        uint32_t itt;   /* Initiator Task Tag */
        uint32_t rsvd3;
        uint32_t statsn;
        uint32_t expcmdsn;
        uint32_t maxcmdsn;
        uint8_t status_class;   /* see Login RSP ststus classes below */
        uint8_t status_detail;  /* see Login RSP Status details below */
        uint8_t rsvd4[10];
} iscsi_login_rsp_hdr_t;

/* Login stage (phase) codes for CSG, NSG */
#define ISCSI_SECURITY_NEGOTIATION_STAGE        0
#define ISCSI_OP_PARMS_NEGOTIATION_STAGE        1
#define ISCSI_FULL_FEATURE_PHASE                3

/* Login Status response classes */
#define ISCSI_STATUS_CLASS_SUCCESS              0x00
#define ISCSI_STATUS_CLASS_REDIRECT             0x01
#define ISCSI_STATUS_CLASS_INITIATOR_ERR        0x02
#define ISCSI_STATUS_CLASS_TARGET_ERR           0x03

/* Login Status response detail codes */
/* Class-0 (Success) */
#define ISCSI_LOGIN_STATUS_ACCEPT               0x00

/* Class-1 (Redirection) */
#define ISCSI_LOGIN_STATUS_TGT_MOVED_TEMP       0x01
#define ISCSI_LOGIN_STATUS_TGT_MOVED_PERM       0x02

/* Class-2 (Initiator Error) */
#define ISCSI_LOGIN_STATUS_INIT_ERR             0x00
#define ISCSI_LOGIN_STATUS_AUTH_FAILED          0x01
#define ISCSI_LOGIN_STATUS_TGT_FORBIDDEN        0x02
#define ISCSI_LOGIN_STATUS_TGT_NOT_FOUND        0x03
#define ISCSI_LOGIN_STATUS_TGT_REMOVED          0x04
#define ISCSI_LOGIN_STATUS_NO_VERSION           0x05
#define ISCSI_LOGIN_STATUS_ISID_ERROR           0x06
#define ISCSI_LOGIN_STATUS_MISSING_FIELDS       0x07
#define ISCSI_LOGIN_STATUS_CONN_ADD_FAILED      0x08
#define ISCSI_LOGIN_STATUS_NO_SESSION_TYPE      0x09
#define ISCSI_LOGIN_STATUS_NO_SESSION           0x0a
#define ISCSI_LOGIN_STATUS_INVALID_REQUEST      0x0b

/* Class-3 (Target Error) */
#define ISCSI_LOGIN_STATUS_TARGET_ERROR         0x00
#define ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE      0x01
#define ISCSI_LOGIN_STATUS_NO_RESOURCES         0x02

/* Logout Header */
typedef struct _iscsi_logout_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint8_t rsvd1[2];
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t rsvd2[8];
        uint32_t itt;   /* Initiator Task Tag */
        uint16_t cid;
        uint8_t rsvd3[2];
        uint32_t cmdsn;
        uint32_t expstatsn;
        uint8_t rsvd4[16];
} iscsi_logout_hdr_t;

/* Logout PDU flags */
#define ISCSI_FLAG_LOGOUT_REASON_MASK           0x7F

/* logout reason_code values */

#define ISCSI_LOGOUT_REASON_CLOSE_SESSION       0
#define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION    1
#define ISCSI_LOGOUT_REASON_RECOVERY            2
#define ISCSI_LOGOUT_REASON_AEN_REQUEST         3

/* Logout Response Header */
typedef struct _iscsi_logout_rsp_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint8_t response;       /* see Logout response values below */
        uint8_t rsvd2;
        uint8_t hlength;
        uint8_t dlength[3];
        uint8_t rsvd3[8];
        uint32_t itt;   /* Initiator Task Tag */
        uint32_t rsvd4;
        uint32_t statsn;
        uint32_t expcmdsn;
        uint32_t maxcmdsn;
        uint32_t rsvd5;
        uint16_t t2wait;
        uint16_t t2retain;
        uint32_t rsvd6;
} iscsi_logout_rsp_hdr_t;

/* logout response status values */

#define ISCSI_LOGOUT_SUCCESS              0
#define ISCSI_LOGOUT_CID_NOT_FOUND        1
#define ISCSI_LOGOUT_RECOVERY_UNSUPPORTED 2
#define ISCSI_LOGOUT_CLEANUP_FAILED       3


/* SNACK Header */
typedef struct _iscsi_snack_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint8_t rsvd2[14];
        uint32_t itt;
        uint32_t begrun;
        uint32_t runlength;
        uint32_t expstatsn;
        uint32_t rsvd3;
        uint32_t expdatasn;
        uint8_t rsvd6[8];
} iscsi_snack_hdr_t;

/* SNACK PDU flags */
#define ISCSI_FLAG_SNACK_TYPE_MASK      0x0F    /* 4 bits */

/* Reject Message Header */
typedef struct _iscsi_reject_rsp_hdr {
        uint8_t opcode;
        uint8_t flags;
        uint8_t reason;
        uint8_t rsvd2;
        uint8_t rsvd3;
        uint8_t dlength[3];
        uint8_t rsvd4[8];
        uint8_t must_be_ff[4];
        uint8_t rsvd4a[4];
        uint32_t statsn;
        uint32_t expcmdsn;
        uint32_t maxcmdsn;
        uint32_t datasn;
        uint8_t rsvd5[8];
        /*
         * Text - Rejected hdr
         */
} iscsi_reject_rsp_hdr_t;

/* Reason for Reject */
#define ISCSI_REJECT_CMD_BEFORE_LOGIN           1
#define ISCSI_REJECT_DATA_DIGEST_ERROR          2
#define ISCSI_REJECT_SNACK_REJECT               3
#define ISCSI_REJECT_PROTOCOL_ERROR             4
#define ISCSI_REJECT_CMD_NOT_SUPPORTED          5
#define ISCSI_REJECT_IMM_CMD_REJECT             6
#define ISCSI_REJECT_TASK_IN_PROGRESS           7
#define ISCSI_REJECT_INVALID_DATA_ACK           8
#define ISCSI_REJECT_INVALID_PDU_FIELD          9
#define ISCSI_REJECT_LONG_OPERATION_REJECT      10
#define ISCSI_REJECT_NEGOTIATION_RESET          11
#define ISCSI_REJECT_WAITING_FOR_LOGOUT         12

/* Defaults as defined by the iSCSI specification */
#define ISCSI_DEFAULT_IMMEDIATE_DATA            TRUE
#define ISCSI_DEFAULT_INITIALR2T                TRUE
#define ISCSI_DEFAULT_FIRST_BURST_LENGTH        (64 * 1024) /* 64kbytes */
#define ISCSI_DEFAULT_MAX_BURST_LENGTH          (256 * 1024) /* 256kbytes */
#define ISCSI_DEFAULT_DATA_PDU_IN_ORDER         TRUE
#define ISCSI_DEFAULT_DATA_SEQUENCE_IN_ORDER    TRUE
#define ISCSI_DEFAULT_TIME_TO_WAIT              2 /* 2 seconds */
#define ISCSI_DEFAULT_TIME_TO_RETAIN            20 /* 20 seconds */
#define ISCSI_DEFAULT_HEADER_DIGEST             ISCSI_DIGEST_NONE
#define ISCSI_DEFAULT_DATA_DIGEST               ISCSI_DIGEST_NONE
#define ISCSI_DEFAULT_MAX_RECV_SEG_LEN          (8 * 1024)
#define ISCSI_DEFAULT_MAX_XMIT_SEG_LEN          (8 * 1024)
#define ISCSI_DEFAULT_MAX_CONNECTIONS           1
#define ISCSI_DEFAULT_MAX_OUT_R2T               1
#define ISCSI_DEFAULT_ERROR_RECOVERY_LEVEL      0
#define ISCSI_DEFAULT_IFMARKER                  FALSE
#define ISCSI_DEFAULT_OFMARKER                  FALSE

/*
 * Minimum values from the iSCSI specification
 */

#define ISCSI_MIN_TIME2RETAIN                   0
#define ISCSI_MIN_TIME2WAIT                     0
#define ISCSI_MIN_ERROR_RECOVERY_LEVEL          0
#define ISCSI_MIN_RECV_DATA_SEGMENT_LENGTH      0x200
#define ISCSI_MIN_FIRST_BURST_LENGTH            0x200
#define ISCSI_MIN_MAX_BURST_LENGTH              0x200
#define ISCSI_MIN_CONNECTIONS                   1
#define ISCSI_MIN_MAX_OUTSTANDING_R2T           1

/*
 * Maximum values from the iSCSI specification
 */
#define ISCSI_MAX_HEADER_DIGEST                 3
#define ISCSI_MAX_DATA_DIGEST                   3
#define ISCSI_MAX_TIME2RETAIN                   3600
#define ISCSI_MAX_TIME2WAIT                     3600
#define ISCSI_MAX_ERROR_RECOVERY_LEVEL          2
#define ISCSI_MAX_FIRST_BURST_LENGTH            0xffffff
#define ISCSI_MAX_BURST_LENGTH                  0xffffff
#define ISCSI_MAX_CONNECTIONS                   65535
#define ISCSI_MAX_OUTSTANDING_R2T               65535
#define ISCSI_MAX_RECV_DATA_SEGMENT_LENGTH      0xffffff
#define ISCSI_MAX_TPGT_VALUE                    65535 /* 16 bit numeric */

/*
 * iqn and eui name prefixes and related defines
 */
#define ISCSI_IQN_NAME_PREFIX                   "iqn"
#define ISCSI_EUI_NAME_PREFIX                   "eui"
#define ISCSI_EUI_NAME_LEN                      20 /* eui. plus 16 octets */

#ifdef __cplusplus
}
#endif

#endif /* _ISCSI_PROTOCOL_H */