/** @file
  The header file of iSCSI Protocol that defines many specific data structures.

Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef _ISCSI_PROTO_H_
#define _ISCSI_PROTO_H_

//
// RFC 1982 Serial Number Arithmetic, SERIAL_BITS = 32
//
#define ISCSI_SEQ_EQ(s1, s2)  ((s1) == (s2))
#define ISCSI_SEQ_LT(s1, s2) \
    ( \
      (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) < ((UINT32) 1 << 31)) || \
      (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) > ((UINT32) 1 << 31)) \
    )
#define ISCSI_SEQ_GT(s1, s2) \
    ( \
      (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) > ((UINT32) 1 << 31)) || \
      (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) < ((UINT32) 1 << 31)) \
    )

#define ISCSI_WELL_KNOWN_PORT                   3260
#define ISCSI_MAX_CONNS_PER_SESSION             1

#define DEFAULT_MAX_RECV_DATA_SEG_LEN           8192
#define MAX_RECV_DATA_SEG_LEN_IN_FFP            65536
#define DEFAULT_MAX_OUTSTANDING_R2T             1

#define ISCSI_VERSION_MAX                       0x00
#define ISCSI_VERSION_MIN                       0x00

#define ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME       EFI_TIMER_PERIOD_SECONDS(20)
#define ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME    EFI_TIMER_PERIOD_SECONDS(20)

#define ISCSI_REDIRECT_ADDR_START_DELIMITER     '['
#define ISCSI_REDIRECT_ADDR_END_DELIMITER       ']'

#define ISCSI_KEY_AUTH_METHOD                   "AuthMethod"
#define ISCSI_KEY_HEADER_DIGEST                 "HeaderDigest"
#define ISCSI_KEY_DATA_DIGEST                   "DataDigest"
#define ISCSI_KEY_MAX_CONNECTIONS               "MaxConnections"
#define ISCSI_KEY_TARGET_NAME                   "TargetName"
#define ISCSI_KEY_INITIATOR_NAME                "InitiatorName"
#define ISCSI_KEY_TARGET_ALIAS                  "TargetAlias"
#define ISCSI_KEY_INITIATOR_ALIAS               "InitiatorAlias"
#define ISCSI_KEY_TARGET_ADDRESS                "TargetAddress"
#define ISCSI_KEY_INITIAL_R2T                   "InitialR2T"
#define ISCSI_KEY_IMMEDIATE_DATA                "ImmediateData"
#define ISCSI_KEY_TARGET_PORTAL_GROUP_TAG       "TargetPortalGroupTag"
#define ISCSI_KEY_MAX_BURST_LENGTH              "MaxBurstLength"
#define ISCSI_KEY_FIRST_BURST_LENGTH            "FirstBurstLength"
#define ISCSI_KEY_DEFAULT_TIME2WAIT             "DefaultTime2Wait"
#define ISCSI_KEY_DEFAULT_TIME2RETAIN           "DefaultTime2Retain"
#define ISCSI_KEY_MAX_OUTSTANDING_R2T           "MaxOutstandingR2T"
#define ISCSI_KEY_DATA_PDU_IN_ORDER             "DataPDUInOrder"
#define ISCSI_KEY_DATA_SEQUENCE_IN_ORDER        "DataSequenceInOrder"
#define ISCSI_KEY_ERROR_RECOVERY_LEVEL          "ErrorRecoveryLevel"
#define ISCSI_KEY_SESSION_TYPE                  "SessionType"
#define ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH  "MaxRecvDataSegmentLength"

#define ISCSI_KEY_VALUE_NONE                    "None"

///
/// connection state for initiator
///

#define CONN_STATE_FREE                         0
#define CONN_STATE_XPT_WAIT                     1
#define CONN_STATE_IN_LOGIN                     2
#define CONN_STATE_LOGGED_IN                    3
#define CONN_STATE_IN_LOGOUT                    4
#define CONN_STATE_LOGOUT_REQUESTED             5
#define CONN_STATE_CLEANUP_WAIT                 6
#define CONN_STATE_IN_CLEANUP                   7

///
/// session state for initiator
///
#define SESSION_STATE_FREE                      0
#define SESSION_STATE_LOGGED_IN                 1
#define SESSION_STATE_FAILED                    2

#define ISCSI_RESERVED_TAG                      0xffffffff

#define ISCSI_REQ_IMMEDIATE                     0x40
#define ISCSI_OPCODE_MASK                       0x3F

#define ISCSI_SET_OPCODE(PduHdr, Op, Flgs)  ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) = ((Op) | (Flgs)))
#define ISCSI_GET_OPCODE(PduHdr)            ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) & ISCSI_OPCODE_MASK)
#define ISCSI_CHECK_OPCODE(PduHdr, Op)      ((((PduHdr)->OpCode) & ISCSI_OPCODE_MASK) == (Op))
#define ISCSI_IMMEDIATE_ON(PduHdr)          ((PduHdr)->OpCode & ISCSI_REQ_IMMEDIATE)
#define ISCSI_SET_FLAG(PduHdr, Flag)        (((ISCSI_BASIC_HEADER *) (PduHdr))->Flags |= (BOOLEAN)(Flag))
#define ISCSI_CLEAR_FLAG(PduHdr, Flag)      (((ISCSI_BASIC_HEADER *) (PduHdr))->Flags &= ~(Flag))
#define ISCSI_FLAG_ON(PduHdr, Flag)         ((BOOLEAN) ((((ISCSI_BASIC_HEADER *) (PduHdr))->Flags & (Flag)) == (Flag)))
#define ISCSI_SET_STAGES(PduHdr, Cur, Nxt)  ((PduHdr)->Flags = (UINT8) ((PduHdr)->Flags | ((Cur) << 2 | (Nxt))))
#define ISCSI_GET_CURRENT_STAGE(PduHdr)     ((UINT8) (((PduHdr)->Flags >> 2) & 0x3))
#define ISCSI_GET_NEXT_STAGE(PduHdr)        ((UINT8) (((PduHdr)->Flags) & 0x3))

#define ISCSI_GET_PAD_LEN(DataLen)          ((~(DataLen) + 1) & 0x3)
#define ISCSI_ROUNDUP(DataLen)              (((DataLen) + 3) &~(0x3))

#define HTON24(Dst, Src) \
  do { \
    (Dst)[0]  = (UINT8) ((UINT8) ((Src) >> 16) & 0xFF); \
    (Dst)[1]  = (UINT8) ((UINT8) ((Src) >> 8) & 0xFF); \
    (Dst)[2]  = (UINT8) ((UINT8) (Src) & 0xFF); \
  } while (0);

#define NTOH24(src)                         (((src)[0] << 16) | ((src)[1] << 8) | ((src)[2]))

#define ISCSI_GET_DATASEG_LEN(PduHdr)       NTOH24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength)
#define ISCSI_SET_DATASEG_LEN(PduHdr, Len)  HTON24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength, (Len))
#define ISCSI_GET_BUFFER_OFFSET(PduHdr)     NTOHL  (((ISCSI_SCSI_DATA_IN *) (PduHdr))->BufferOffset)

//
// Initiator opcodes.
//
#define ISCSI_OPCODE_NOP_OUT        0x00
#define ISCSI_OPCODE_SCSI_CMD       0x01
#define ISCSI_OPCODE_SCSI_TMF_REQ   0x02
#define ISCSI_OPCODE_LOGIN_REQ      0x03
#define ISCSI_OPCODE_TEXT_REQ       0x04
#define ISCSI_OPCODE_SCSI_DATA_OUT  0x05
#define ISCSI_OPCODE_LOGOUT_REQ     0x06
#define ISCSI_OPCODE_SNACK_REQ      0x10
#define ISCSI_OPCODE_VENDOR_I0      0x1c
#define ISCSI_OPCODE_VENDOR_I1      0x1d
#define ISCSI_OPCODE_VENDOR_I2      0x1e

//
// Target opcodes.
//
#define ISCSI_OPCODE_NOP_IN       0x20
#define ISCSI_OPCODE_SCSI_RSP     0x21
#define ISCSI_OPCODE_SCSI_TMF_RSP 0x22
#define ISCSI_OPCODE_LOGIN_RSP    0x23
#define ISCSI_OPCODE_TEXT_RSP     0x24
#define ISCSI_OPCODE_SCSI_DATA_IN 0x25
#define ISCSI_OPCODE_LOGOUT_RSP   0x26
#define ISCSI_OPCODE_R2T          0x31
#define ISCSI_OPCODE_ASYNC_MSG    0x32
#define ISCSI_OPCODE_VENDOR_T0    0x3c
#define ISCSI_OPCODE_VENDOR_T1    0x3d
#define ISCSI_OPCODE_VENDOR_T2    0x3e
#define ISCSI_OPCODE_REJECT       0x3f

#define ISCSI_BHS_FLAG_FINAL      0x80

//
// Defined AHS types, others are reserved.
//
#define ISCSI_AHS_TYPE_EXT_CDB              0x1
#define ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN 0x2

#define SCSI_CMD_PDU_FLAG_READ        0x40
#define SCSI_CMD_PDU_FLAG_WRITE       0x20

#define ISCSI_CMD_PDU_TASK_ATTR_MASK  0x07

//
// task attributes
//
#define ISCSI_TASK_ATTR_UNTAGGED  0x00
#define ISCSI_TASK_ATTR_SIMPLE    0x01
#define ISCSI_TASK_ATTR_ORDERD    0x02
#define ISCSI_TASK_ATTR_HOQ       0x03
#define ISCSI_TASK_ATTR_ACA       0x04

//
// Flag bit definitions in SCSI response.
//
#define SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW  0x10
#define SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW 0x08
#define SCSI_RSP_PDU_FLAG_OVERFLOW          0x04
#define SCSI_RSP_PDU_FLAG_UNDERFLOW         0x02

//
// iSCSI service response codes.
//
#define ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET  0x00
#define ISCSI_SERVICE_RSP_TARGET_FAILURE              0x01

#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_COMPLETE           0
#define ISCSI_TMF_RSP_PDU_RSP_TASK_NOT_EXIST              1
#define ISCSI_TMF_RSP_PDU_RSP_LUN_NOT_EXIST               2
#define ISCSI_TMF_RSP_PDU_RSP_TASK_STILL_ALLEGIANT        3
#define ISCSI_TMF_RSP_PDU_RSP_TASK_REASSGIN_NOT_SUPPORTED 4
#define ISCSI_TMF_RSP_PDU_RSP_NOT_SUPPORTED               5
#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_AHTH_FAILED        6
#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_REJECTED           255

#define SCSI_DATA_IN_PDU_FLAG_ACKKNOWLEDGE  0x40
#define SCSI_DATA_IN_PDU_FLAG_OVERFLOW      SCSI_RSP_PDU_FLAG_OVERFLOW
#define SCSI_DATA_IN_PDU_FLAG_UNDERFLOW     SCSI_RSP_PDU_FLAG_UNDERFLOW
#define SCSI_DATA_IN_PDU_FLAG_STATUS_VALID  0x01

#define ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT  0x80
#define ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE 0x40

#define ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT    ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT
#define ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE   ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE

#define ISCSI_LOGIN_STATUS_SUCCESS          0
#define ISCSI_LOGIN_STATUS_REDIRECTION      1
#define ISCSI_LOGIN_STATUS_INITIATOR_ERROR  2
#define ISCSI_LOGIN_STATUS_TARGET_ERROR     3

#define ISCSI_LOGOUT_REASON_CLOSE_SESSION                   0
#define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION                1
#define ISCSI_LOGOUT_REASON_REMOVE_CONNECTION_FOR_RECOVERY  2

#define ISCSI_LOGOUT_RESPONSE_SESSION_CLOSED_SUCCESS  0
#define ISCSI_LOGOUT_RESPONSE_CID_NOT_FOUND           1
#define ISCSI_LOGOUT_RESPONSE_RECOVERY_NOT_SUPPORTED  2
#define ISCSI_LOGOUT_RESPONSE_CLEANUP_FAILED          3

#define ISCSI_SNACK_REQUEST_TYPE_DATA_OR_R2T  0
#define ISCSI_SNACK_REQUEST_TYPE_STATUS       1
#define ISCSI_SNACK_REQUEST_TYPE_DATA_ACK     2
#define ISCSI_SNACK_REQUEST_TYPE_RDATA        3

#define ISCSI_SECURITY_NEGOTIATION          0
#define ISCSI_LOGIN_OPERATIONAL_NEGOTIATION 1
#define ISCSI_FULL_FEATURE_PHASE            3

typedef struct _ISCSI_SESSION               ISCSI_SESSION;
typedef struct _ISCSI_CONNECTION            ISCSI_CONNECTION;

typedef enum {
  DataIn  = 0,
  DataOut = 1,
  DataBi  = 2
} DATA_DIRECTION;

///
/// iSCSI Basic Header Segment
///
typedef struct _ISCSI_BASIC_HEADER {
  UINT8   OpCode;
  UINT8   Flags;
  UINT16  OpCodeSpecific1;
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT8   Lun[8];
  UINT32  InitiatorTaskTag;
  UINT32  OpCodeSpecific2[7];
} ISCSI_BASIC_HEADER;

typedef struct _ISCSI_ADDTIONAL_HEADER {
  UINT16  Length;
  UINT8   Type;
  UINT8   TypeSpecific[1];
} ISCSI_ADDITIONAL_HEADER;

typedef struct _ISCSI_BI_EXP_READ_DATA_LEN_AHS {
  UINT16  Length;
  UINT8   Type;
  UINT8   Reserved;
  UINT32  ExpReadDataLength;
} ISCSI_BI_EXP_READ_DATA_LEN_AHS;

///
/// SCSI Command
///
typedef struct _SCSI_COMMAND {
  UINT8   OpCode;
  UINT8   Flags;
  UINT16  Reserved;
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT8   Lun[8];
  UINT32  InitiatorTaskTag;
  UINT32  ExpDataXferLength;
  UINT32  CmdSN;
  UINT32  ExpStatSN;
  UINT8   Cdb[16];
} SCSI_COMMAND;

///
/// SCSI Response
///
typedef struct _SCSI_RESPONSE {
  UINT8   OpCode;
  UINT8   Flags;
  UINT8   Response;
  UINT8   Status;
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT8   Reserved[8];
  UINT32  InitiatorTaskTag;
  UINT32  SNACKTag;
  UINT32  StatSN;
  UINT32  ExpCmdSN;
  UINT32  MaxCmdSN;
  UINT32  ExpDataSN;
  UINT32  BiReadResidualCount;
  UINT32  ResidualCount;
} SCSI_RESPONSE;

typedef struct _ISCSI_SENSE_DATA {
  UINT16  Length;
  UINT8   Data[2];
} ISCSI_SENSE_DATA;

///
/// iSCSI Task Management Function Request.
///
typedef struct _ISCSI_TMF_REQUEST {
  UINT8   OpCode;
  UINT8   Fuction;
  UINT16  Reserved1;
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT8   Lun[8];
  UINT32  InitiatorTaskTag;
  UINT32  ReferencedTaskTag;
  UINT32  CmdSN;
  UINT32  ExpStatSN;
  UINT32  RefCmdSN;
  UINT32  ExpDataSN;
  UINT32  Reserved2[2];
} ISCSI_TMF_REQUEST;

///
/// iSCSI Task Management Function Response.
///
typedef struct _ISCSI_TMF_RESPONSE {
  UINT8   OpCode;
  UINT8   Reserved1;
  UINT8   Response;
  UINT8   Reserved2;
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT32  Reserver3[2];
  UINT32  InitiatorTaskTag;
  UINT32  Reserved4;
  UINT32  StatSN;
  UINT32  ExpCmdSN;
  UINT32  MaxCmdSN;
  UINT32  Reserved[3];
} ISCSI_TMF_RESPONSE;

///
/// SCSI Data-Out
///
typedef struct _ISCSI_SCSI_DATA_OUT {
  UINT8   OpCode;
  UINT8   Reserved1[3];
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT8   Lun[8];
  UINT32  InitiatorTaskTag;
  UINT32  TargetTransferTag;
  UINT32  Reserved2;
  UINT32  ExpStatSN;
  UINT32  Reserved3;
  UINT32  DataSN;
  UINT32  BufferOffset;
  UINT32  Reserved4;
} ISCSI_SCSI_DATA_OUT;

///
/// SCSI Data-In
///
typedef struct _ISCSI_SCSI_DATA_IN {
  UINT8   OpCode;
  UINT8   Flags;
  UINT8   Reserved1;
  UINT8   Status;
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT8   Lun[8];
  UINT32  InitiatorTaskTag;
  UINT32  TargetTransferTag;
  UINT32  StatSN;
  UINT32  ExpCmdSN;
  UINT32  MaxCmdSN;
  UINT32  DataSN;
  UINT32  BufferOffset;
  UINT32  ResidualCount;
} ISCSI_SCSI_DATA_IN;

///
/// Ready To Transfer.
///
typedef struct _ISCSI_READY_TO_TRANSFER {
  UINT8   OpCode;
  UINT8   Reserved1[3];
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT8   Lun[8];
  UINT32  InitiatorTaskTag;
  UINT32  TargetTransferTag;
  UINT32  StatSN;
  UINT32  ExpCmdSN;
  UINT32  MaxCmdSN;
  UINT32  R2TSeqNum;
  UINT32  BufferOffset;
  UINT32  DesiredDataTransferLength;
} ISCSI_READY_TO_TRANSFER;

typedef struct _ISCSI_ASYNC_MESSAGE {
  UINT8   OpCode;
  UINT8   Reserved1[8];
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT8   Lun[8];
  UINT32  InitiatorTaskTag;
  UINT32  Reserved2;
  UINT32  StatSN;
  UINT32  ExpCmdSN;
  UINT32  MaxCmdSN;
  UINT8   AsyncEvent;
  UINT8   AsyncVCode;
  UINT16  Parameter1;
  UINT16  Parameter2;
  UINT16  Parameter3;
  UINT32  Reserved3;
} ISCSI_ASYNC_MESSAGE;

///
/// Login Request.
///
typedef struct _ISCSI_LOGIN_REQUEST {
  UINT8   OpCode;
  UINT8   Flags;
  UINT8   VersionMax;
  UINT8   VersionMin;
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT8   Isid[6];
  UINT16  Tsih;
  UINT32  InitiatorTaskTag;
  UINT16  Cid;
  UINT16  Reserved1;
  UINT32  CmdSN;
  UINT32  ExpStatSN;
  UINT32  Reserved2[4];
} ISCSI_LOGIN_REQUEST;

///
/// Login Response.
///
typedef struct _ISCSI_LOGIN_RESPONSE {
  UINT8   OpCode;
  UINT8   Flags;
  UINT8   VersionMax;
  UINT8   VersionActive;
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT8   Isid[6];
  UINT16  Tsih;
  UINT32  InitiatorTaskTag;
  UINT32  Reserved1;
  UINT32  StatSN;
  UINT32  ExpCmdSN;
  UINT32  MaxCmdSN;
  UINT8   StatusClass;
  UINT8   StatusDetail;
  UINT8   Reserved2[10];
} ISCSI_LOGIN_RESPONSE;

///
/// Logout Request.
///
typedef struct _ISCSI_LOGOUT_REQUEST {
  UINT8   OpCode;
  UINT8   ReasonCode;
  UINT16  Reserved1;
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT32  Reserved2[2];
  UINT32  InitiatorTaskTag;
  UINT16  Cid;
  UINT16  Reserved3;
  UINT32  CmdSN;
  UINT32  ExpStatSN;
  UINT32  Reserved4[4];
} ISCSI_LOGOUT_REQUEST;

///
/// Logout Response.
///
typedef struct _ISCSI_LOGOUT_RESPONSE {
  UINT8   OpCode;
  UINT8   Reserved1;
  UINT8   Response;
  UINT8   Reserved2;
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT32  Reserved3[2];
  UINT32  InitiatorTaskTag;
  UINT32  Reserved4;
  UINT32  StatSN;
  UINT32  ExpCmdSN;
  UINT32  MaxCmdSN;
  UINT32  Reserved5;
  UINT16  Time2Wait;
  UINT16  Time2Retain;
  UINT32  Reserved6;
} ISCSI_LOGOUT_RESPONSE;

///
/// SNACK Request.
///
typedef struct _ISCSI_SNACK_REQUEST {
  UINT8   OpCode;
  UINT8   Type;
  UINT16  Reserved1;
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT8   Lun[8];
  UINT32  InitiatorTaskTag;
  UINT32  TargetTransferTag;
  UINT32  Reserved2;
  UINT32  ExpStatSN;
  UINT32  Reserved[2];
  UINT32  BegRun;
  UINT32  RunLength;
} ISCSI_SNACK_REQUEST;

///
/// Reject.
///
typedef struct _ISCSI_REJECT {
  UINT8   OpCode;
  UINT8   Reserved1;
  UINT8   Reason;
  UINT8   Reserved2;
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT32  Reserved3[2];
  UINT32  InitiatorTaskTag;
  UINT32  Reserved4;
  UINT32  StatSN;
  UINT32  ExpCmdSN;
  UINT32  MaxCmdSN;
  UINT32  DataSN;
  UINT32  Reserved5[2];
} ISCSI_REJECT;

///
/// NOP-Out.
///
typedef struct _ISCSI_NOP_OUT {
  UINT8   OpCode;
  UINT8   Reserved1[3];
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT8   Lun[8];
  UINT32  InitiatorTaskTag;
  UINT32  TargetTransferTag;
  UINT32  CmdSN;
  UINT32  ExpStatSN;
  UINT32  Reserved2[4];
} ISCSI_NOP_OUT;

///
/// NOP-In.
///
typedef struct _ISCSI_NOP_IN {
  UINT8   OpCode;
  UINT8   Reserved1[3];
  UINT8   TotalAHSLength;
  UINT8   DataSegmentLength[3];
  UINT8   Lun[8];
  UINT32  InitiatorTaskTag;
  UINT32  TargetTransferTag;
  UINT32  StatSN;
  UINT32  ExpCmdSN;
  UINT32  MaxCmdSN;
  UINT32  Reserved2[3];
} ISCSI_NOP_IN;

typedef enum {
  IScsiDigestNone,
  IScsiDigestCRC32
} ISCSI_DIGEST_TYPE;

typedef struct _ISCSI_XFER_CONTEXT {
  UINT32  TargetTransferTag;
  UINT32  Offset;
  UINT32  DesiredLength;
  UINT32  ExpDataSN;
} ISCSI_XFER_CONTEXT;

typedef struct _ISCSI_IN_BUFFER_CONTEXT {
  UINT8   *InData;
  UINT32  InDataLen;
} ISCSI_IN_BUFFER_CONTEXT;

typedef struct _ISCSI_TCB {
  LIST_ENTRY          Link;

  BOOLEAN             SoFarInOrder;
  UINT32              ExpDataSN;
  BOOLEAN             FbitReceived;
  BOOLEAN             StatusXferd;
  UINT32              ActiveR2Ts;
  UINT32              Response;
  CHAR8               *Reason;
  UINT32              InitiatorTaskTag;
  UINT32              CmdSN;
  UINT32              SNACKTag;

  ISCSI_XFER_CONTEXT  XferContext;

  ISCSI_CONNECTION    *Conn;
} ISCSI_TCB;

typedef struct _ISCSI_KEY_VALUE_PAIR {
  LIST_ENTRY      List;

  CHAR8           *Key;
  CHAR8           *Value;
} ISCSI_KEY_VALUE_PAIR;

/**
  Attach the iSCSI connection to the iSCSI session.

  @param[in, out]  Session The iSCSI session.
  @param[in, out]  Conn    The iSCSI connection.

**/
VOID
IScsiAttatchConnection (
  IN OUT ISCSI_SESSION     *Session,
  IN OUT ISCSI_CONNECTION  *Conn
  );

/**
  Detach the iSCSI connection from the session it belongs to.

  @param[in, out]  Conn The iSCSI connection.

**/
VOID
IScsiDetatchConnection (
  IN OUT ISCSI_CONNECTION  *Conn
  );

/**
  This function performs the iSCSI connection login.

  @param[in, out]  Conn      The iSCSI connection to login.
  @param           Timeout   The timeout value in milliseconds.

  @retval EFI_SUCCESS        The iSCSI connection is logged into the iSCSI target.
  @retval EFI_TIMEOUT        Timeout occurred during the login procedure.
  @retval Others             Other errors as indicated.

**/
EFI_STATUS
IScsiConnLogin (
  IN OUT ISCSI_CONNECTION    *Conn,
  IN     UINT16              Timeout
  );

/**
  Create a TCP connection for the iSCSI session.

  @param[in]  Session Points to the iSCSI session.

  @return The newly created iSCSI connection.

**/
ISCSI_CONNECTION *
IScsiCreateConnection (
  IN ISCSI_SESSION      *Session
  );

/**
  Destroy an iSCSI connection.

  @param[in]  Conn The connection to destroy.

**/
VOID
IScsiDestroyConnection (
  IN ISCSI_CONNECTION  *Conn
  );

/**
  Login the iSCSI session.

  @param[in]  Session           The iSCSI session

  @retval EFI_SUCCESS           The iSCSI session login procedure finished.
  @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory.
  @retval EFI_NO_MEDIA          There was a media error.
  @retval Others                Other errors as indicated.

**/
EFI_STATUS
IScsiSessionLogin (
  IN ISCSI_SESSION  *Session
  );

/**
  Wait for IPsec negotiation, then try to login the iSCSI session again.

  @param[in]  Session           The iSCSI session

  @retval EFI_SUCCESS           The iSCSI session login procedure finished.
  @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory.
  @retval EFI_PROTOCOL_ERROR    Some kind of iSCSI protocol error happened.

**/
EFI_STATUS
IScsiSessionReLogin (
  IN ISCSI_SESSION  *Session
  );

/**
  Build and send the iSCSI login request to the iSCSI target according to
  the current login stage.

  @param[in]  Conn             The connection in the iSCSI login phase.

  @retval EFI_SUCCESS          The iSCSI login request PDU is built and sent on this
                               connection.
  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
  @retval EFI_DEVICE_ERROR     Some kind of device error happened.

**/
EFI_STATUS
IScsiSendLoginReq (
  IN ISCSI_CONNECTION  *Conn
  );

/**
  Receive and process the iSCSI login response.

  @param[in]  Conn             The connection in the iSCSI login phase.

  @retval EFI_SUCCESS          The iSCSI login response PDU is received and processed.
  @retval Others               Other errors as indicated.

**/
EFI_STATUS
IScsiReceiveLoginRsp (
  IN ISCSI_CONNECTION  *Conn
  );

/**
  Add an iSCSI key-value pair as a string into the data segment of the Login Request PDU.
  The DataSegmentLength and the actual size of the net buffer containing this PDU will be
  updated.

  @param[in, out]  Pdu         The iSCSI PDU whose data segment the key-value pair will
                               be added to.
  @param[in]       Key         The key name string.
  @param[in]       Value       The value string.

  @retval EFI_SUCCESS          The key-valu pair is added to the PDU's datasegment and
                               the correspondence length fields are updated.
  @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to add the key-value
                               pair.
**/
EFI_STATUS
IScsiAddKeyValuePair (
  IN OUT NET_BUF      *Pdu,
  IN CHAR8            *Key,
  IN CHAR8            *Value
  );

/**
  Prepare the iSCSI login request to be sent according to the current login status.

  @param[in, out]  Conn The connection in the iSCSI login phase.

  @return The pointer to the net buffer containing the iSCSI login request built.
  @retval NULL     Other errors as indicated.

**/
NET_BUF *
IScsiPrepareLoginReq (
  IN OUT ISCSI_CONNECTION  *Conn
  );

/**
  Process the iSCSI Login Response.

  @param[in, out]  Conn The connection on which the iSCSI login response is received.
  @param[in, out]  Pdu  The iSCSI login response PDU.

  @retval EFI_SUCCESS        The iSCSI login response PDU is processed and all check are passed.
  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
  @retval EFI_MEDIA_CHANGED  Target is redirected.
  @retval Others             Other errors as indicated.

**/
EFI_STATUS
IScsiProcessLoginRsp (
  IN OUT ISCSI_CONNECTION  *Conn,
  IN OUT NET_BUF           *Pdu
  );

/**
  Updated the target information according the data received in the iSCSI
  login response with an target redirection status.

  @param[in, out] Session      The iSCSI session.
  @param[in]      Data         The data segment which should contain the
                               TargetAddress key-value list.
  @param[in]      Len          Length of the data.

  @retval EFI_SUCCESS          The target address is updated.
  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
  @retval EFI_NOT_FOUND        The TargetAddress key is not found.
  @retval Others               Other errors as indicated.

**/
EFI_STATUS
IScsiUpdateTargetAddress (
  IN OUT ISCSI_SESSION         *Session,
  IN     CHAR8                 *Data,
  IN     UINT32                Len
  );

/**
  The callback function to free the net buffer list.

  @param[in]  Arg The opaque parameter.

**/
VOID
EFIAPI
IScsiFreeNbufList (
  VOID *Arg
  );

/**
  Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI PDU header and
  an optional data segment. The two parts will be put into two blocks of buffers in the
  net buffer. The digest check will be conducted in this function if needed and the digests
  will be trimmed from the PDU buffer.

  @param[in]  Conn         The iSCSI connection to receive data from.
  @param[out] Pdu          The received iSCSI pdu.
  @param[in]  Context      The context used to describe information on the caller provided
                           buffer to receive data segment of the iSCSI pdu, it's optional.
  @param[in]  HeaderDigest Whether there will be header digest received.
  @param[in]  DataDigest   Whether there will be data digest.
  @param[in]  TimeoutEvent The timeout event, it's optional.

  @retval EFI_SUCCESS          An iSCSI pdu is received.
  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
  @retval EFI_PROTOCOL_ERROR   Some kind of iSCSI protocol error occurred.
  @retval Others               Other errors as indicated.

**/
EFI_STATUS
IScsiReceivePdu (
  IN ISCSI_CONNECTION                      *Conn,
  OUT NET_BUF                              **Pdu,
  IN ISCSI_IN_BUFFER_CONTEXT               *Context, OPTIONAL
  IN BOOLEAN                               HeaderDigest,
  IN BOOLEAN                               DataDigest,
  IN EFI_EVENT                             TimeoutEvent OPTIONAL
  );

/**
  Check and get the result of the parameter negotiation.

  @param[in, out]  Conn          The connection in iSCSI login.

  @retval EFI_SUCCESS          The parameter check is passed and negotiation is finished.
  @retval EFI_PROTOCOL_ERROR   Some kind of iSCSI protocol error occurred.
  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.

**/
EFI_STATUS
IScsiCheckOpParams (
  IN OUT ISCSI_CONNECTION  *Conn
  );

/**
  Fill the operational parameters.

  @param[in]       Conn    The connection in iSCSI login.
  @param[in, out]  Pdu     The iSCSI login request PDU to fill the parameters.

**/
VOID
IScsiFillOpParams (
  IN     ISCSI_CONNECTION  *Conn,
  IN OUT NET_BUF           *Pdu
  );

/**
  Pad the iSCSI AHS or data segment to an integer number of 4 byte words.

  @param[in, out]  Pdu         The iSCSI pdu which contains segments to pad.
  @param[in]       Len         The length of the last segment in the PDU.

  @retval EFI_SUCCESS          The segment is padded or no need to pad it.
  @retval EFI_OUT_OF_RESOURCES There is not enough remaining free space to add the
                               padding bytes.
**/
EFI_STATUS
IScsiPadSegment (
  IN OUT NET_BUF      *Pdu,
  IN     UINT32       Len
  );

/**
  Build a key-value list from the data segment.

  @param[in]  Data The data segment containing the key-value pairs.
  @param[in]  Len  Length of the data segment.

  @return The key-value list.
  @retval NULL Other errors as indicated.

**/
LIST_ENTRY *
IScsiBuildKeyValueList (
  IN CHAR8  *Data,
  IN UINT32 Len
  );

/**
  Get the value string by the key name from the key-value list. If found,
  the key-value entry will be removed from the list.

  @param[in, out]  KeyValueList  The key-value list.
  @param[in]       Key           The key name to find.

  @return The value string.
  @retval NULL The key value pair can not be found.

**/
CHAR8 *
IScsiGetValueByKeyFromList (
  IN OUT LIST_ENTRY     *KeyValueList,
  IN     CHAR8          *Key
  );

/**
  Free the key-value list.

  @param[in]  KeyValueList The key-value list.

**/
VOID
IScsiFreeKeyValueList (
  IN LIST_ENTRY      *KeyValueList
  );

/**
  Normalize the iSCSI name according to RFC.

  @param[in, out]  Name       The iSCSI name.
  @param[in]       Len        length of the iSCSI name.

  @retval EFI_SUCCESS        The iSCSI name is valid and normalized.
  @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in the IQN format.

**/
EFI_STATUS
IScsiNormalizeName (
  IN OUT CHAR8      *Name,
  IN     UINTN      Len
  );

/**
  Execute the SCSI command issued through the EXT SCSI PASS THRU protocol.

  @param[in]       PassThru  The EXT SCSI PASS THRU protocol.
  @param[in]       Target    The target ID.
  @param[in]       Lun       The LUN.
  @param[in, out]  Packet    The request packet containing IO request, SCSI command
                             buffer and buffers to read/write.

  @retval EFI_SUCCESS          The SCSI command is executed and the result is updated to
                               the Packet.
  @retval EFI_DEVICE_ERROR     Session state was not as required.
  @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
  @retval EFI_NOT_READY        The target can not accept new commands.
  @retval Others               Other errors as indicated.

**/
EFI_STATUS
IScsiExecuteScsiCommand (
  IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL                 *PassThru,
  IN UINT8                                           *Target,
  IN UINT64                                          Lun,
  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET  *Packet
  );

/**
  Reinstate the session on some error.

  @param[in]  Session           The iSCSI session

  @retval EFI_SUCCESS           The session is reinstated from some error.
  @retval Other                 Reinstatement failed.

**/
EFI_STATUS
IScsiSessionReinstatement (
  IN ISCSI_SESSION  *Session
  );

/**
  Initialize some session parameters before login.

  @param[in, out]  Session  The iSCSI session.
  @param[in]       Recovery Whether the request is from a fresh new start or recovery.

**/
VOID
IScsiSessionInit (
  IN OUT ISCSI_SESSION  *Session,
  IN BOOLEAN            Recovery
  );

/**
  Abort the iSCSI session, that is, reset all the connection and free the
  resources.

  @param[in, out]  Session The iSCSI session.

**/
VOID
IScsiSessionAbort (
  IN OUT ISCSI_SESSION  *Session
  );

#endif
