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