MdeModulePkg: Delete IScsiDxe in MdeModulePkg.

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1278

This patch is to delete the IScsiDxe driver in MdeModulePkg. The driver
will not be maintained and can't co-work with the dual-stack IScsiDxe in
NetworkPkg.

People should use below NetworkPkg drivers instead:
  NetworkPkg/IScsiDxe/IScsiDxe.inf
Which is actively maintained with more bug fixes and new feature support.

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Hao Wu <hao.a.wu@intel.com>
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Jiaxin Wu <jiaxin.wu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Siyuan Fu <siyuan.fu@intel.com>
Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
This commit is contained in:
Siyuan Fu 2018-12-20 09:24:38 +08:00
parent a19b336204
commit dff73e4c73
33 changed files with 0 additions and 11846 deletions

View File

@ -354,7 +354,6 @@
MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf
MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf
MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf
MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf
MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf
MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf

View File

@ -1,283 +0,0 @@
/** @file
UEFI Component Name(2) protocol implementation for iSCSI.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include "IScsiImpl.h"
//
// EFI Component Name Protocol
//
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName = {
IScsiComponentNameGetDriverName,
IScsiComponentNameGetControllerName,
"eng"
};
//
// EFI Component Name 2 Protocol
//
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2 = {
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) IScsiComponentNameGetDriverName,
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) IScsiComponentNameGetControllerName,
"en"
};
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mIScsiDriverNameTable[] = {
{"eng;en", L"iSCSI Driver"},
{NULL, NULL}
};
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *mIScsiControllerNameTable = NULL;
/**
Retrieves a Unicode string that is the user readable name of the EFI Driver.
This function retrieves the user readable name of a driver in the form of a
Unicode string. If the driver specified by This has a user readable name in
the language specified by Language, then a pointer to the driver name is
returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
by This does not support the language specified by Language,
then EFI_UNSUPPORTED is returned.
@param[in] This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
@param[in] Language A pointer to a three character ISO 639-2 language identifier.
This is the language of the driver name that that the caller
is requesting, and it must match one of the languages specified
in SupportedLanguages. The number of languages supported by a
driver is up to the driver writer.
@param[out] DriverName A pointer to the Unicode string to return. This Unicode string
is the name of the driver specified by This in the language
specified by Language.
@retval EFI_SUCCESS The Unicode string for the Driver specified by This
and the language specified by Language was returned
in DriverName.
@retval EFI_INVALID_PARAMETER Language is NULL.
@retval EFI_INVALID_PARAMETER DriverName is NULL.
@retval EFI_UNSUPPORTED The driver specified by This does not support the
language specified by Language.
**/
EFI_STATUS
EFIAPI
IScsiComponentNameGetDriverName (
IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN CHAR8 *Language,
OUT CHAR16 **DriverName
)
{
return LookupUnicodeString2 (
Language,
This->SupportedLanguages,
mIScsiDriverNameTable,
DriverName,
(BOOLEAN)(This == &gIScsiComponentName)
);
}
/**
Update the component name for the iSCSI instance.
@param[in] IScsiExtScsiPassThru A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
@retval EFI_SUCCESS Update the ControllerNameTable of this instance successfully.
@retval EFI_INVALID_PARAMETER The input parameter is invalid.
@retval EFI_UNSUPPORTED Can't get the corresponding NIC info from the Controller handle.
**/
EFI_STATUS
UpdateName (
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru
)
{
EFI_STATUS Status;
CHAR16 HandleName[150];
ISCSI_DRIVER_DATA *Private;
EFI_MAC_ADDRESS MacAddress;
UINTN HwAddressSize;
UINT16 VlanId;
CHAR16 MacString[70];
if (IScsiExtScsiPassThru == NULL) {
return EFI_INVALID_PARAMETER;
}
Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (IScsiExtScsiPassThru);
//
// Get the mac string, it's the name of various variable
//
Status = NetLibGetMacAddress (Private->Controller, &MacAddress, &HwAddressSize);
if (EFI_ERROR (Status)) {
return Status;
}
VlanId = NetLibGetVlanId (Private->Controller);
IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString);
UnicodeSPrint (
HandleName,
sizeof (HandleName),
L"iSCSI IPv4 (MacString=%s)",
MacString
);
if (mIScsiControllerNameTable != NULL) {
FreeUnicodeStringTable (mIScsiControllerNameTable);
mIScsiControllerNameTable = NULL;
}
Status = AddUnicodeString2 (
"eng",
gIScsiComponentName.SupportedLanguages,
&mIScsiControllerNameTable,
HandleName,
TRUE
);
if (EFI_ERROR (Status)) {
return Status;
}
return AddUnicodeString2 (
"en",
gIScsiComponentName2.SupportedLanguages,
&mIScsiControllerNameTable,
HandleName,
FALSE
);
}
/**
Retrieves a Unicode string that is the user readable name of the controller
that is being managed by an EFI Driver.Currently not implemented.
@param[in] This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
@param[in] ControllerHandle The handle of a controller that the driver specified by
This is managing. This handle specifies the controller
whose name is to be returned.
@param[in] ChildHandle The handle of the child controller to retrieve the name
of. This is an optional parameter that may be NULL. It
will be NULL for device drivers. It will also be NULL
for a bus drivers that wish to retrieve the name of the
bus controller. It will not be NULL for a bus driver
that wishes to retrieve the name of a child controller.
@param[in] Language A pointer to a three character ISO 639-2 language
identifier. This is the language of the controller name
that that the caller is requesting, and it must match one
of the languages specified in SupportedLanguages. The
number of languages supported by a driver is up to the
driver writer.
@param[out] ControllerName A pointer to the Unicode string to return. This Unicode
string is the name of the controller specified by
ControllerHandle and ChildHandle in the language specified
by Language from the point of view of the driver specified
by This.
@retval EFI_SUCCESS The Unicode string for the user readable name in the
language specified by Language for the driver
specified by This was returned in DriverName.
@retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
@retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid EFI_HANDLE.
@retval EFI_INVALID_PARAMETER Language is NULL.
@retval EFI_INVALID_PARAMETER ControllerName is NULL.
@retval EFI_UNSUPPORTED The driver specified by This is not currently managing
the controller specified by ControllerHandle and
ChildHandle.
@retval EFI_UNSUPPORTED The driver specified by This does not support the
language specified by Language.
**/
EFI_STATUS
EFIAPI
IScsiComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language,
OUT CHAR16 **ControllerName
)
{
EFI_STATUS Status;
EFI_HANDLE IScsiController;
ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru;
if (ControllerHandle == NULL) {
return EFI_UNSUPPORTED;
}
//
// Get the handle of the controller we are controling.
//
IScsiController = NetLibGetNicHandle (ControllerHandle, &gEfiTcp4ProtocolGuid);
if (IScsiController == NULL) {
return EFI_UNSUPPORTED;
}
Status = gBS->OpenProtocol (
IScsiController,
&gEfiCallerIdGuid,
(VOID **)&IScsiIdentifier,
NULL,
NULL,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
if (EFI_ERROR (Status)) {
return Status;
}
if (ChildHandle != NULL) {
//
// Make sure this driver produced ChildHandle
//
Status = EfiTestChildHandle (
ControllerHandle,
ChildHandle,
&gEfiTcp4ProtocolGuid
);
if (!EFI_ERROR (Status)) {
//
// Retrieve an instance of a produced protocol from ChildHandle
//
Status = gBS->OpenProtocol (
ChildHandle,
&gEfiExtScsiPassThruProtocolGuid,
(VOID **)&IScsiExtScsiPassThru,
NULL,
NULL,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Update the component name for this child handle.
//
Status = UpdateName (IScsiExtScsiPassThru);
if (EFI_ERROR (Status)) {
return Status;
}
} else {
return Status;
}
}
return LookupUnicodeString2 (
Language,
This->SupportedLanguages,
mIScsiControllerNameTable,
ControllerName,
(BOOLEAN)(This == &gIScsiComponentName)
);
}

View File

@ -1,165 +0,0 @@
/** @file
The header file of UEFI Component Name(2) protocol.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _COMPONENT_NAME_H_
#define _COMPONENT_NAME_H_
#include <Protocol/ComponentName.h>
#include <Protocol/ComponentName2.h>
extern EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2;
extern EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName;
//
// EFI Component Name Protocol for iSCSI driver.
//
/**
Retrieves a Unicode string that is the user readable name of the EFI Driver.
This function retrieves the user readable name of a driver in the form of a
Unicode string. If the driver specified by This has a user readable name in
the language specified by Language, then a pointer to the driver name is
returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
by This does not support the language specified by Language,
then EFI_UNSUPPORTED is returned.
@param[in] This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
@param[in] Language A pointer to a three characters ISO 639-2 language identifier.
This is the language of the driver name that that the caller
is requesting, and it must match one of the languages specified
in SupportedLanguages. The number of languages supported by a
driver is up to the driver writer.
@param[out] DriverName A pointer to the Unicode string to return. This Unicode string
is the name of the driver specified by This in the language
specified by Language.
@retval EFI_SUCCESS The Unicode string for the Driver specified by This
and the language specified by Language was returned
in DriverName.
@retval EFI_INVALID_PARAMETER Language is NULL.
@retval EFI_INVALID_PARAMETER DriverName is NULL.
@retval EFI_UNSUPPORTED The driver specified by This does not support the
language specified by Language.
**/
EFI_STATUS
EFIAPI
IScsiComponentNameGetDriverName (
IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN CHAR8 *Language,
OUT CHAR16 **DriverName
);
/**
Retrieves a Unicode string that is the user readable name of the controller
that is being managed by an EFI Driver. Currently not implemented.
@param[in] This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
@param[in] ControllerHandle The handle of a controller that the driver specified by
This is managing. This handle specifies the controller
whose name is to be returned.
@param[in] ChildHandle The handle of the child controller to retrieve the name
of. This is an optional parameter that may be NULL. It
will be NULL for device drivers. It will also be NULL
for a bus drivers that wish to retrieve the name of the
bus controller. It will not be NULL for a bus driver
that wishes to retrieve the name of a child controller.
@param[in] Language A pointer to a three characters ISO 639-2 language
identifier. This is the language of the controller name
that that the caller is requesting, and it must match one
of the languages specified in SupportedLanguages. The
number of languages supported by a driver is up to the
driver writer.
@param[out] ControllerName A pointer to the Unicode string to return. This Unicode
string is the name of the controller specified by
ControllerHandle and ChildHandle in the language specified
by Language from the point of view of the driver specified
by This.
@retval EFI_SUCCESS The Unicode string for the user readable name in the
language specified by Language for the driver
specified by This was returned in DriverName.
@retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
@retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid EFI_HANDLE.
@retval EFI_INVALID_PARAMETER Language is NULL.
@retval EFI_INVALID_PARAMETER ControllerName is NULL.
@retval EFI_UNSUPPORTED The driver specified by This is not currently managing
the controller specified by ControllerHandle and
ChildHandle.
@retval EFI_UNSUPPORTED The driver specified by This does not support the
language specified by Language.
**/
EFI_STATUS
EFIAPI
IScsiComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language,
OUT CHAR16 **ControllerName
);
//
// EFI iSCSI Initiator Name Protocol for IScsi driver.
//
/**
Retrieves the current set value of iSCSI Initiator Name.
@param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
@param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer / Actual size of the
variable data buffer.
@param[out] Buffer Pointer to the buffer for data to be read.
@retval EFI_SUCCESS Data was successfully retrieved into the provided buffer and the
BufferSize was sufficient to handle the iSCSI initiator name
@retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result.
@retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
@retval EFI_DEVICE_ERROR The iSCSI initiator name could not be retrieved due to a hardware error.
@retval Others Other errors as indicated.
**/
EFI_STATUS
EFIAPI
IScsiGetInitiatorName (
IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
IN OUT UINTN *BufferSize,
OUT VOID *Buffer
);
/**
Sets the iSCSI Initiator Name.
@param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
@param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer.
@param[in] Buffer Pointer to the buffer for data to be written.
@retval EFI_SUCCESS Data was successfully stored by the protocol.
@retval EFI_UNSUPPORTED Platform policies do not allow for data to be written.
Currently not implemented.
@retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize exceeds the maximum allowed limit.
@retval EFI_DEVICE_ERROR The data could not be stored due to a hardware error.
@retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the data.
@retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not adhere to RFC 3720
(and other related protocols)
@retval Others Other errors as indicated.
**/
EFI_STATUS
EFIAPI
IScsiSetInitiatorName (
IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
IN OUT UINTN *BufferSize,
IN VOID *Buffer
);
#endif

View File

@ -1,25 +0,0 @@
// /** @file
// This module produces EFI iSCSI Initiator Name Protocol.
//
// This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol
// and EFI DHCPv4 Protocol, to provide the capability to do the transport for SCSI
// data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide
// one way to configurate the iSCSI setting.
//
// Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
//
// This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License
// which accompanies this distribution. The full text of the license may be found at
// http://opensource.org/licenses/bsd-license.php
//
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
// **/
#string STR_MODULE_ABSTRACT #language en-US "Produces EFI iSCSI Initiator Name Protocol"
#string STR_MODULE_DESCRIPTION #language en-US "This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol and EFI DHCPv4 Protocol, to provide the capability to do the transport for SCSI data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide a way to configure the iSCSI setting."

View File

@ -1,20 +0,0 @@
// /** @file
// IScsi4Dxe Localized Strings and Content
//
// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
//
// This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License
// which accompanies this distribution. The full text of the license may be found at
// http://opensource.org/licenses/bsd-license.php
//
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
// **/
#string STR_PROPERTIES_MODULE_NAME
#language en-US
"iSCSI DXE Driver"

View File

@ -1,430 +0,0 @@
/** @file
This file is for Challenge-Handshake Authentication Protocol (CHAP) Configuration.
Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include "IScsiImpl.h"
#include "Md5.h"
/**
Initator calculates its own expected hash value.
@param[in] ChapIdentifier iSCSI CHAP identifier sent by authenticator.
@param[in] ChapSecret iSCSI CHAP secret of the authenticator.
@param[in] SecretLength The length of iSCSI CHAP secret.
@param[in] ChapChallenge The challenge message sent by authenticator.
@param[in] ChallengeLength The length of iSCSI CHAP challenge message.
@param[out] ChapResponse The calculation of the expected hash value.
@retval EFI_SUCCESS The expected hash value was calculatedly successfully.
@retval EFI_PROTOCOL_ERROR The length of the secret should be at least the
length of the hash value for the hashing algorithm chosen.
@retval Others Other errors as indicated.
**/
EFI_STATUS
IScsiCHAPCalculateResponse (
IN UINT32 ChapIdentifier,
IN CHAR8 *ChapSecret,
IN UINT32 SecretLength,
IN UINT8 *ChapChallenge,
IN UINT32 ChallengeLength,
OUT UINT8 *ChapResponse
)
{
MD5_CTX Md5Ctx;
CHAR8 IdByte[1];
EFI_STATUS Status;
Status = MD5Init (&Md5Ctx);
//
// Hash Identifier - Only calculate 1 byte data (RFC1994)
//
IdByte[0] = (CHAR8) ChapIdentifier;
MD5Update (&Md5Ctx, IdByte, 1);
//
// Hash Secret
//
if (SecretLength < ISCSI_CHAP_SECRET_MIN_LEN - 1) {
return EFI_PROTOCOL_ERROR;
}
MD5Update (&Md5Ctx, ChapSecret, SecretLength);
//
// Hash Challenge received from Target
//
MD5Update (&Md5Ctx, ChapChallenge, ChallengeLength);
Status = MD5Final (&Md5Ctx, ChapResponse);
return Status;
}
/**
The initator checks the CHAP response replied by target against its own
calculation of the expected hash value.
@param[in] AuthData iSCSI CHAP authentication data.
@param[in] TargetResponse The response from target.
@retval EFI_SUCCESS The response from target passed authentication.
@retval EFI_SECURITY_VIOLATION The response from target was not expected value.
@retval Others Other errors as indicated.
**/
EFI_STATUS
IScsiCHAPAuthTarget (
IN ISCSI_CHAP_AUTH_DATA *AuthData,
IN UINT8 *TargetResponse
)
{
EFI_STATUS Status;
UINT32 SecretSize;
UINT8 VerifyRsp[ISCSI_CHAP_RSP_LEN];
Status = EFI_SUCCESS;
SecretSize = (UINT32) AsciiStrLen (AuthData->AuthConfig.ReverseCHAPSecret);
Status = IScsiCHAPCalculateResponse (
AuthData->OutIdentifier,
AuthData->AuthConfig.ReverseCHAPSecret,
SecretSize,
AuthData->OutChallenge,
AuthData->OutChallengeLength,
VerifyRsp
);
if (CompareMem (VerifyRsp, TargetResponse, ISCSI_CHAP_RSP_LEN) != 0) {
Status = EFI_SECURITY_VIOLATION;
}
return Status;
}
/**
This function checks the received iSCSI Login Response during the security
negotiation stage.
@param[in] Conn The iSCSI connection.
@retval EFI_SUCCESS The Login Response passed the CHAP validation.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
@retval EFI_PROTOCOL_ERROR Some kind of protocol error happend.
@retval Others Other errors as indicated.
**/
EFI_STATUS
IScsiCHAPOnRspReceived (
IN ISCSI_CONNECTION *Conn
)
{
EFI_STATUS Status;
ISCSI_SESSION *Session;
ISCSI_CHAP_AUTH_DATA *AuthData;
CHAR8 *Value;
UINT8 *Data;
UINT32 Len;
LIST_ENTRY *KeyValueList;
UINTN Algorithm;
CHAR8 *Identifier;
CHAR8 *Challenge;
CHAR8 *Name;
CHAR8 *Response;
UINT8 TargetRsp[ISCSI_CHAP_RSP_LEN];
UINT32 RspLen;
ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION);
ASSERT (Conn->RspQue.BufNum != 0);
Session = Conn->Session;
AuthData = &Session->AuthData;
Len = Conn->RspQue.BufSize;
Data = AllocatePool (Len);
if (Data == NULL) {
return EFI_OUT_OF_RESOURCES;
}
//
// Copy the data in case the data spans over multiple PDUs.
//
NetbufQueCopy (&Conn->RspQue, 0, Len, Data);
//
// Build the key-value list from the data segment of the Login Response.
//
KeyValueList = IScsiBuildKeyValueList ((CHAR8 *) Data, Len);
if (KeyValueList == NULL) {
FreePool (Data);
return EFI_OUT_OF_RESOURCES;
}
Status = EFI_PROTOCOL_ERROR;
switch (Conn->CHAPStep) {
case ISCSI_CHAP_INITIAL:
//
// The first Login Response.
//
Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_PORTAL_GROUP_TAG);
if (Value == NULL) {
goto ON_EXIT;
}
Session->TargetPortalGroupTag = (UINT16) AsciiStrDecimalToUintn (Value);
Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_AUTH_METHOD);
if (Value == NULL) {
goto ON_EXIT;
}
//
// Initiator mandates CHAP authentication but target replies without "CHAP" or
// initiator suggets "None" but target replies with some kind of auth method.
//
if (AsciiStrCmp (Value, ISCSI_AUTH_METHOD_CHAP) == 0) {
if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) {
goto ON_EXIT;
}
} else {
if (AuthData->AuthConfig.CHAPType != ISCSI_CHAP_NONE) {
goto ON_EXIT;
}
}
//
// Transit to CHAP step one.
//
Conn->CHAPStep = ISCSI_CHAP_STEP_ONE;
Status = EFI_SUCCESS;
break;
case ISCSI_CHAP_STEP_TWO:
//
// The Target replies with CHAP_A=<A> CHAP_I=<I> CHAP_C=<C>
//
Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_ALGORITHM);
if (Value == NULL) {
goto ON_EXIT;
}
Algorithm = AsciiStrDecimalToUintn (Value);
if (Algorithm != ISCSI_CHAP_ALGORITHM_MD5) {
//
// Unsupported algorithm is chosen by target.
//
goto ON_EXIT;
}
Identifier = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_IDENTIFIER);
if (Identifier == NULL) {
goto ON_EXIT;
}
Challenge = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_CHALLENGE);
if (Challenge == NULL) {
goto ON_EXIT;
}
//
// Process the CHAP identifier and CHAP Challenge from Target
// Calculate Response value
//
AuthData->InIdentifier = (UINT32) AsciiStrDecimalToUintn (Identifier);
AuthData->InChallengeLength = ISCSI_CHAP_AUTH_MAX_LEN;
IScsiHexToBin ((UINT8 *) AuthData->InChallenge, &AuthData->InChallengeLength, Challenge);
Status = IScsiCHAPCalculateResponse (
AuthData->InIdentifier,
AuthData->AuthConfig.CHAPSecret,
(UINT32) AsciiStrLen (AuthData->AuthConfig.CHAPSecret),
AuthData->InChallenge,
AuthData->InChallengeLength,
AuthData->CHAPResponse
);
//
// Transit to next step.
//
Conn->CHAPStep = ISCSI_CHAP_STEP_THREE;
break;
case ISCSI_CHAP_STEP_THREE:
//
// one way CHAP authentication and the target would like to
// authenticate us.
//
Status = EFI_SUCCESS;
break;
case ISCSI_CHAP_STEP_FOUR:
ASSERT (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL);
//
// The forth step, CHAP_N=<N> CHAP_R=<R> is received from Target.
//
Name = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_NAME);
if (Name == NULL) {
goto ON_EXIT;
}
Response = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_RESPONSE);
if (Response == NULL) {
goto ON_EXIT;
}
RspLen = ISCSI_CHAP_RSP_LEN;
IScsiHexToBin (TargetRsp, &RspLen, Response);
//
// Check the CHAP Response replied by Target.
//
Status = IScsiCHAPAuthTarget (AuthData, TargetRsp);
break;
default:
break;
}
ON_EXIT:
IScsiFreeKeyValueList (KeyValueList);
FreePool (Data);
return Status;
}
/**
This function fills the CHAP authentication information into the login PDU
during the security negotiation stage in the iSCSI connection login.
@param[in] Conn The iSCSI connection.
@param[in, out] Pdu The PDU to send out.
@retval EFI_SUCCESS All check passed and the phase-related CHAP
authentication info is filled into the iSCSI PDU.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
@retval EFI_PROTOCOL_ERROR Some kind of protocol error happend.
**/
EFI_STATUS
IScsiCHAPToSendReq (
IN ISCSI_CONNECTION *Conn,
IN OUT NET_BUF *Pdu
)
{
EFI_STATUS Status;
ISCSI_SESSION *Session;
ISCSI_LOGIN_REQUEST *LoginReq;
ISCSI_CHAP_AUTH_DATA *AuthData;
CHAR8 *Value;
CHAR8 ValueStr[256];
CHAR8 *Response;
UINT32 RspLen;
CHAR8 *Challenge;
UINT32 ChallengeLen;
ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION);
Session = Conn->Session;
AuthData = &Session->AuthData;
LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, 0);
if (LoginReq == NULL) {
return EFI_PROTOCOL_ERROR;
}
Status = EFI_SUCCESS;
RspLen = 2 * ISCSI_CHAP_RSP_LEN + 3;
Response = AllocatePool (RspLen);
if (Response == NULL) {
return EFI_OUT_OF_RESOURCES;
}
ChallengeLen = 2 * ISCSI_CHAP_RSP_LEN + 3;
Challenge = AllocatePool (ChallengeLen);
if (Challenge == NULL) {
return EFI_OUT_OF_RESOURCES;
}
switch (Conn->CHAPStep) {
case ISCSI_CHAP_INITIAL:
//
// It's the initial Login Request. Fill in the key=value pairs mandatory
// for the initial Login Request.
//
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIATOR_NAME, Session->InitiatorName);
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_SESSION_TYPE, "Normal");
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_TARGET_NAME, Session->ConfigData.NvData.TargetName);
if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) {
Value = ISCSI_KEY_VALUE_NONE;
ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
} else {
Value = ISCSI_AUTH_METHOD_CHAP;
}
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_AUTH_METHOD, Value);
break;
case ISCSI_CHAP_STEP_ONE:
//
// First step, send the Login Request with CHAP_A=<A1,A2...> key-value pair.
//
AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", ISCSI_CHAP_ALGORITHM_MD5);
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_ALGORITHM, ValueStr);
Conn->CHAPStep = ISCSI_CHAP_STEP_TWO;
break;
case ISCSI_CHAP_STEP_THREE:
//
// Third step, send the Login Request with CHAP_N=<N> CHAP_R=<R> or
// CHAP_N=<N> CHAP_R=<R> CHAP_I=<I> CHAP_C=<C> if target ahtentication is
// required too.
//
// CHAP_N=<N>
//
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_NAME, (CHAR8 *) &AuthData->AuthConfig.CHAPName);
//
// CHAP_R=<R>
//
IScsiBinToHex ((UINT8 *) AuthData->CHAPResponse, ISCSI_CHAP_RSP_LEN, Response, &RspLen);
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_RESPONSE, Response);
if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL) {
//
// CHAP_I=<I>
//
IScsiGenRandom ((UINT8 *) &AuthData->OutIdentifier, 1);
AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData->OutIdentifier);
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr);
//
// CHAP_C=<C>
//
IScsiGenRandom ((UINT8 *) AuthData->OutChallenge, ISCSI_CHAP_RSP_LEN);
AuthData->OutChallengeLength = ISCSI_CHAP_RSP_LEN;
IScsiBinToHex ((UINT8 *) AuthData->OutChallenge, ISCSI_CHAP_RSP_LEN, Challenge, &ChallengeLen);
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_CHALLENGE, Challenge);
Conn->CHAPStep = ISCSI_CHAP_STEP_FOUR;
}
//
// set the stage transition flag.
//
ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
break;
default:
Status = EFI_PROTOCOL_ERROR;
break;
}
FreePool (Response);
FreePool (Challenge);
return Status;
}

View File

@ -1,106 +0,0 @@
/** @file
The header file of CHAP configuration.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _ISCSI_CHAP_H_
#define _ISCSI_CHAP_H_
#define ISCSI_AUTH_METHOD_CHAP "CHAP"
#define ISCSI_KEY_CHAP_ALGORITHM "CHAP_A"
#define ISCSI_KEY_CHAP_IDENTIFIER "CHAP_I"
#define ISCSI_KEY_CHAP_CHALLENGE "CHAP_C"
#define ISCSI_KEY_CHAP_NAME "CHAP_N"
#define ISCSI_KEY_CHAP_RESPONSE "CHAP_R"
#define ISCSI_CHAP_ALGORITHM_MD5 5
#define ISCSI_CHAP_AUTH_MAX_LEN 1024
///
/// MD5_HASHSIZE
///
#define ISCSI_CHAP_RSP_LEN 16
#define ISCSI_CHAP_INITIAL 0
#define ISCSI_CHAP_STEP_ONE 1
#define ISCSI_CHAP_STEP_TWO 2
#define ISCSI_CHAP_STEP_THREE 3
#define ISCSI_CHAP_STEP_FOUR 4
#pragma pack(1)
typedef struct _ISCSI_CHAP_AUTH_CONFIG_NVDATA {
UINT8 CHAPType;
CHAR8 CHAPName[ISCSI_CHAP_NAME_STORAGE];
CHAR8 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
CHAR8 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
CHAR8 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
} ISCSI_CHAP_AUTH_CONFIG_NVDATA;
#pragma pack()
///
/// ISCSI CHAP Authentication Data
///
typedef struct _ISCSI_CHAP_AUTH_DATA {
ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfig;
UINT32 InIdentifier;
UINT8 InChallenge[ISCSI_CHAP_AUTH_MAX_LEN];
UINT32 InChallengeLength;
//
// Calculated CHAP Response (CHAP_R) value
//
UINT8 CHAPResponse[ISCSI_CHAP_RSP_LEN];
//
// Auth-data to be sent out for mutual authentication
//
UINT32 OutIdentifier;
UINT8 OutChallenge[ISCSI_CHAP_AUTH_MAX_LEN];
UINT32 OutChallengeLength;
} ISCSI_CHAP_AUTH_DATA;
/**
This function checks the received iSCSI Login Response during the security
negotiation stage.
@param[in] Conn The iSCSI connection.
@retval EFI_SUCCESS The Login Response passed the CHAP validation.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
@retval EFI_PROTOCOL_ERROR Some kind of protocol error happend.
@retval Others Other errors as indicated.
**/
EFI_STATUS
IScsiCHAPOnRspReceived (
IN ISCSI_CONNECTION *Conn
);
/**
This function fills the CHAP authentication information into the login PDU
during the security negotiation stage in the iSCSI connection login.
@param[in] Conn The iSCSI connection.
@param[in, out] Pdu The PDU to send out.
@retval EFI_SUCCESS All check passed and the phase-related CHAP
authentication info is filled into the iSCSI PDU.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
@retval EFI_PROTOCOL_ERROR Some kind of protocol error happend.
**/
EFI_STATUS
IScsiCHAPToSendReq (
IN ISCSI_CONNECTION *Conn,
IN OUT NET_BUF *Pdu
);
#endif

View File

@ -1,22 +0,0 @@
/** @file
The common header file of Iscsi.
Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _ISCSI_COMMON_H_
#define _ISCSI_COMMON_H_
typedef struct _ISCSI_SESSION ISCSI_SESSION;
typedef struct _ISCSI_CONNECTION ISCSI_CONNECTION;
typedef struct _ISCSI_DRIVER_DATA ISCSI_DRIVER_DATA;
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,166 +0,0 @@
/** @file
The header file of IScsiConfig.c.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _ISCSI_CONFIG_H_
#define _ISCSI_CONFIG_H_
#include <Guid/MdeModuleHii.h>
#include <Protocol/HiiConfigRouting.h>
#include <Library/HiiLib.h>
#include <Library/DevicePathLib.h>
#include <Library/DebugLib.h>
#include <Library/BaseLib.h>
#include <Library/NetLib.h>
extern UINT8 IScsiConfigDxeBin[];
extern UINT8 IScsi4DxeStrings[];
#define ISCSI_INITATOR_NAME_VAR_NAME L"I_NAME"
#define ISCSI_CONFIG_VAR_ATTR (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE)
#define ISCSI_FORM_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('I', 'f', 'c', 'i')
/**
If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear,
then this macro return a pointer to a data structure ISCSI_FORM_CALLBACK_INFO.
If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set,
The Signature field of the data structure ISCSI_FORM_CALLBACK_INFO
is compared to TestSignature. If the signatures match, then a pointer
to the pointer to a data structure ISCSI_FORM_CALLBACK_INFO is returned.
If the signatures do not match, then DebugAssert() is called with a description
of "CR has a bad signature" and Callback is returned.
If the data type ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not contain the field
specified by Callback, then the module will not compile.
If ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not contain a field called Signature,
then the module will not compile.
@param Callback Pointer to the specified field within the data
structure ISCSI_FORM_CALLBACK_INFO.
@return A pointer to the pointer to a data structure ISCSI_FORM_CALLBACK_INFO.
@retval Others Some unexpected error happened.
**/
#define ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK(Callback) \
CR ( \
Callback, \
ISCSI_FORM_CALLBACK_INFO, \
ConfigAccess, \
ISCSI_FORM_CALLBACK_INFO_SIGNATURE \
)
#pragma pack(1)
typedef struct _ISCSI_MAC_INFO {
EFI_MAC_ADDRESS Mac;
UINT8 Len;
UINT16 VlanId;
} ISCSI_MAC_INFO;
typedef struct _ISCSI_DEVICE_LIST {
UINT8 NumDevice;
ISCSI_MAC_INFO MacInfo[1];
} ISCSI_DEVICE_LIST;
#pragma pack()
typedef struct _ISCSI_CONFIG_FORM_ENTRY {
LIST_ENTRY Link;
EFI_HANDLE Controller;
CHAR16 MacString[95];
EFI_STRING_ID PortTitleToken;
EFI_STRING_ID PortTitleHelpToken;
ISCSI_SESSION_CONFIG_NVDATA SessionConfigData;
ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfigData;
} ISCSI_CONFIG_FORM_ENTRY;
typedef struct _ISCSI_FORM_CALLBACK_INFO {
UINTN Signature;
EFI_HANDLE DriverHandle;
EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
EFI_HII_DATABASE_PROTOCOL *HiiDatabase;
EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting;
UINT16 *KeyList;
VOID *FormBuffer;
EFI_HII_HANDLE RegisteredHandle;
ISCSI_CONFIG_FORM_ENTRY *Current;
} ISCSI_FORM_CALLBACK_INFO;
#pragma pack(1)
///
/// HII specific Vendor Device Path definition.
///
typedef struct {
VENDOR_DEVICE_PATH VendorDevicePath;
EFI_DEVICE_PATH_PROTOCOL End;
} HII_VENDOR_DEVICE_PATH;
#pragma pack()
/**
Updates the iSCSI configuration form to add/delete an entry for the iSCSI
device specified by the Controller.
@param[in] DriverBindingHandle The driverbinding handle.
@param[in] Controller The controller handle of the iSCSI device.
@param[in] AddForm Whether to add or delete a form entry.
@retval EFI_SUCCESS The iSCSI configuration form is updated.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
@retval Others Other errors as indicated.
**/
EFI_STATUS
IScsiConfigUpdateForm (
IN EFI_HANDLE DriverBindingHandle,
IN EFI_HANDLE Controller,
IN BOOLEAN AddForm
);
/**
Initialize the iSCSI configuration form.
@param[in] DriverBindingHandle The iSCSI driverbinding handle.
@retval EFI_SUCCESS The iSCSI configuration form is initialized.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
@retval Others Other errors as indicated.
**/
EFI_STATUS
IScsiConfigFormInit (
VOID
);
/**
Unload the iSCSI configuration form, this includes: delete all the iSCSI
device configuration entries, uninstall the form callback protocol and
free the resources used.
@param[in] DriverBindingHandle The iSCSI driverbinding handle.
@retval EFI_SUCCESS The iSCSI configuration form is unloaded.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
**/
EFI_STATUS
IScsiConfigFormUnload (
IN EFI_HANDLE DriverBindingHandle
);
#endif

View File

@ -1,219 +0,0 @@
/** @file
Vfr file for iSCSI config.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include "IScsiConfigNVDataStruc.h"
#define EFI_NETWORK_DEVICE_CLASS 0x04
formset
guid = IP4_ISCSI_CONFIG_GUID,
title = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_TITLE),
help = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_HELP),
varstore ISCSI_CONFIG_IFR_NVDATA,
name = ISCSI_CONFIG_IFR_NVDATA,
guid = IP4_ISCSI_CONFIG_GUID;
form formid = FORMID_MAIN_FORM,
title = STRING_TOKEN(STR_ISCSI_MAIN_FORM_TITLE);
string varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorName,
prompt = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME),
help = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME_HELP),
flags = INTERACTIVE,
key = KEY_INITIATOR_NAME,
minsize = ISCSI_NAME_IFR_MIN_SIZE,
maxsize = ISCSI_NAME_IFR_MAX_SIZE,
endstring;
label DEVICE_ENTRY_LABEL;
label LABEL_END;
endform;
form formid = FORMID_DEVICE_FORM,
title = STRING_TOKEN(STR_ISCSI_DEVICE_FORM_TITLE);
checkbox varid = ISCSI_CONFIG_IFR_NVDATA.Enabled,
prompt = STRING_TOKEN(STR_ISCSI_DEVICE_ENABLE),
help = STRING_TOKEN(STR_NULL),
flags = 0,
endcheckbox;
checkbox varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp,
prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP),
help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP),
flags = INTERACTIVE,
key = KEY_DHCP_ENABLE,
endcheckbox;
suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == 0x01;
string varid = ISCSI_CONFIG_IFR_NVDATA.LocalIp,
prompt = STRING_TOKEN(STR_ISCSI_LOCAL_IP_ADDRESS),
help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
flags = INTERACTIVE,
key = KEY_LOCAL_IP,
minsize = IP_MIN_SIZE,
maxsize = IP_MAX_SIZE,
endstring;
string varid = ISCSI_CONFIG_IFR_NVDATA.SubnetMask,
prompt = STRING_TOKEN(STR_ISCSI_LOCAL_MASK),
help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
flags = INTERACTIVE,
key = KEY_SUBNET_MASK,
minsize = IP_MIN_SIZE,
maxsize = IP_MAX_SIZE,
endstring;
string varid = ISCSI_CONFIG_IFR_NVDATA.Gateway,
prompt = STRING_TOKEN(STR_ISCSI_LOCAL_GATEWAY),
help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
flags = INTERACTIVE,
key = KEY_GATE_WAY,
minsize = IP_MIN_SIZE,
maxsize = IP_MAX_SIZE,
endstring;
endif;
subtitle text = STRING_TOKEN(STR_NULL);
suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == 0x00;
checkbox varid = ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp,
prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET),
help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET),
flags = 0,
endcheckbox;
endif;
suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp == 0x01;
string varid = ISCSI_CONFIG_IFR_NVDATA.TargetName,
prompt = STRING_TOKEN(STR_ISCSI_TARGET_NAME),
help = STRING_TOKEN(STR_ISCSI_TARGET_NAME),
flags = INTERACTIVE,
key = KEY_TARGET_NAME,
minsize = ISCSI_NAME_IFR_MIN_SIZE,
maxsize = ISCSI_NAME_IFR_MAX_SIZE,
endstring;
string varid = ISCSI_CONFIG_IFR_NVDATA.TargetIp,
prompt = STRING_TOKEN(STR_ISCSI_TARGET_IP_ADDRESS),
help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
flags = INTERACTIVE,
key = KEY_TARGET_IP,
minsize = IP_MIN_SIZE,
maxsize = IP_MAX_SIZE,
endstring;
numeric varid = ISCSI_CONFIG_IFR_NVDATA.TargetPort,
prompt = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
help = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
flags = 0,
minimum = TARGET_PORT_MIN_NUM,
maximum = TARGET_PORT_MAX_NUM,
step = 0,
endnumeric;
string varid = ISCSI_CONFIG_IFR_NVDATA.BootLun,
prompt = STRING_TOKEN(STR_ISCSI_BOOT_LUN),
help = STRING_TOKEN(STR_ISCSI_BOOT_LUN_HELP),
flags = INTERACTIVE,
key = KEY_BOOT_LUN,
minsize = LUN_MIN_SIZE,
maxsize = LUN_MAX_SIZE,
endstring;
endif;
subtitle text = STRING_TOKEN(STR_NULL);
oneof varid = ISCSI_CONFIG_IFR_NVDATA.CHAPType,
prompt = STRING_TOKEN(STR_CHAP_TYPE_PROMPT),
help = STRING_TOKEN(STR_CHAP_TYPE_HELP),
option text = STRING_TOKEN(STR_CHAP_TYPE_NONE), value = ISCSI_CHAP_NONE, flags = DEFAULT;
option text = STRING_TOKEN(STR_CHAP_TYPE_UNI), value = ISCSI_CHAP_UNI, flags = 0;
option text = STRING_TOKEN(STR_CHAP_TYPE_MUTUAL), value = ISCSI_CHAP_MUTUAL, flags = 0;
endoneof;
suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == ISCSI_CHAP_NONE;
string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPName,
prompt = STRING_TOKEN(STR_ISCSI_CHAP_NAME),
help = STRING_TOKEN(STR_ISCSI_CHAP_NAME),
flags = INTERACTIVE,
key = KEY_CHAP_NAME,
minsize = 0,
maxsize = ISCSI_CHAP_NAME_MAX_LEN,
endstring;
string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPSecret,
prompt = STRING_TOKEN(STR_ISCSI_CHAP_SECRET),
help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP),
flags = INTERACTIVE,
key = KEY_CHAP_SECRET,
minsize = ISCSI_CHAP_SECRET_MIN_LEN,
maxsize = ISCSI_CHAP_SECRET_MAX_LEN,
endstring;
endif;
suppressif NOT ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == ISCSI_CHAP_MUTUAL;
string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPName,
prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME),
help = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME),
flags = INTERACTIVE,
key = KEY_REVERSE_CHAP_NAME,
minsize = 0,
maxsize = ISCSI_CHAP_NAME_MAX_LEN,
endstring;
string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPSecret,
prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_SECRET),
help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP),
flags = INTERACTIVE,
key = KEY_REVERSE_CHAP_SECRET,
minsize = ISCSI_CHAP_SECRET_MIN_LEN,
maxsize = ISCSI_CHAP_SECRET_MAX_LEN,
endstring;
endif;
subtitle text = STRING_TOKEN(STR_NULL);
string varid = ISCSI_CONFIG_IFR_NVDATA.IsId,
prompt = STRING_TOKEN(STR_ISCSI_CONFIG_ISID),
help = STRING_TOKEN(STR_ISCSI_CONFIG_ISID_HELP),
flags = INTERACTIVE,
key = KEY_CONFIG_ISID,
minsize = ISID_CONFIGURABLE_MIN_LEN,
maxsize = ISID_CONFIGURABLE_MAX_LEN,
endstring;
subtitle text = STRING_TOKEN(STR_NULL);
text
help = STRING_TOKEN (STR_SAVE_CHANGES),
text = STRING_TOKEN (STR_SAVE_CHANGES),
flags = INTERACTIVE,
key = KEY_SAVE_CHANGES;
goto FORMID_MAIN_FORM,
prompt = STRING_TOKEN (STR_RETURN_MAIN_FORM),
help = STRING_TOKEN (STR_RETURN_MAIN_FORM),
flags = 0;
endform;
endformset;

View File

@ -1,62 +0,0 @@
// *++
//
// Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
// This program and the accompanying materials
// are licensed and made available under the terms and conditions of the BSD License
// which accompanies this distribution. The full text of the license may be found at
// http://opensource.org/licenses/bsd-license.php
//
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
// Module Name:
//
// IScsiConfigStrings.uni
//
// Abstract:
//
// String definitions for iSCSI configuration.
//
// Revision History:
//
// --*/
/=#
#langdef en-US "English"
#string STR_ISCSI_CONFIG_FORM_TITLE #language en-US "iSCSI Configuration"
#string STR_ISCSI_CONFIG_FORM_HELP #language en-US "Configure the iSCSI parameters."
#string STR_ISCSI_MAIN_FORM_TITLE #language en-US "iSCSI Configuration"
#string STR_ISCSI_CONFIG_INIT_NAME #language en-US "iSCSI Initiator Name"
#string STR_ISCSI_CONFIG_INIT_NAME_HELP #language en-US "The worldwide unique name of the initiator. Only iqn. format is accepted."
#string STR_ISCSI_DEVICE_FORM_TITLE #language en-US ""
#string STR_ISCSI_DEVICE_ENABLE #language en-US "Enable iSCSI"
#string STR_ISCSI_LOCAL_IP_ADDRESS #language en-US " Initiator IP Address"
#string STR_ISCSI_LOCAL_MASK #language en-US " Initiator Subnet Mask"
#string STR_ISCSI_LOCAL_GATEWAY #language en-US " Gateway"
#string STR_ISCSI_IP_ADDRESS_HELP #language en-US "Enter IP address in dotted-decimal notation."
#string STR_ISCSI_TARGET_NAME #language en-US " Target Name"
#string STR_ISCSI_TARGET_IP_ADDRESS #language en-US " Target IP Address"
#string STR_ISCSI_TARGET_PORT #language en-US " Target Port"
#string STR_ISCSI_BOOT_LUN #language en-US " Boot LUN"
#string STR_ISCSI_BOOT_LUN_HELP #language en-US "Hexadecimal representation of the LU number. Examples are: 4752-3A4F-6b7e-2F99, 6734-9-156f-127, 4186-9"
#string STR_ISCSI_ENABLE_DHCP #language en-US "Enable DHCP"
#string STR_ISCSI_ENABLE_DHCP_ON_TARGET #language en-US "Get target info via DHCP"
#string STR_CHAP_TYPE_PROMPT #language en-US "CHAP Type"
#string STR_CHAP_TYPE_HELP #language en-US "None, One way CHAP or mutual CHAP"
#string STR_CHAP_TYPE_NONE #language en-US "None"
#string STR_CHAP_TYPE_UNI #language en-US "One way"
#string STR_CHAP_TYPE_MUTUAL #language en-US "Mutual"
#string STR_ISCSI_CHAP_NAME #language en-US " CHAP Name"
#string STR_ISCSI_CHAP_SECRET #language en-US " CHAP Secret"
#string STR_ISCSI_CHAP_SECRET_HELP #language en-US "The minimum length is 12 bytes and the maximum length is 16 bytes."
#string STR_ISCSI_REVERSE_CHAP_NAME #language en-US " Reverse CHAP Name"
#string STR_ISCSI_REVERSE_CHAP_SECRET #language en-US " Reverse CHAP Secret"
#string STR_ISCSI_CONFIG_ISID #language en-US "ISID"
#string STR_ISCSI_CONFIG_ISID_HELP #language en-US "OUI-format ISID in 6 bytes, default value are derived from MAC address. Only last 3 bytes are configurable. Example: update 0ABBCCDDEEFF to 0ABBCCF07901 by input F07901."
#string STR_RETURN_MAIN_FORM #language en-US "Back to Previous Page"
#string STR_SAVE_CHANGES #language en-US "Save Changes"
#string STR_NULL #language en-US ""

View File

@ -1,109 +0,0 @@
/** @file
Define NVData structures used by the iSCSI configuration component
Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _ISCSI_NVDATASTRUC_H_
#define _ISCSI_NVDATASTRUC_H_
#include <Guid/Ip4IScsiConfigHii.h>
#define VAR_EQ_TEST_NAME 0x100
#define FORMID_MAIN_FORM 1
#define FORMID_DEVICE_FORM 2
#define ISCSI_NAME_MAX_SIZE 224
//
// Vfr has a limit on the size, it's 255 bytes.
//
#define ISCSI_NAME_IFR_MIN_SIZE 4
#define ISCSI_NAME_IFR_MAX_SIZE 223
#define IP_MIN_SIZE 7
#define IP_MAX_SIZE 15
#define IP4_STR_MAX_SIZE 16
#define LUN_MIN_SIZE 1
#define LUN_MAX_SIZE 20
#define ISCSI_CHAP_NONE 0
#define ISCSI_CHAP_UNI 1
#define ISCSI_CHAP_MUTUAL 2
#define TARGET_PORT_MIN_NUM 0
#define TARGET_PORT_MAX_NUM 65535
#define DEVICE_ENTRY_LABEL 0x1234
#define LABEL_END 0xffff
#define KEY_INITIATOR_NAME 0x101
#define KEY_DHCP_ENABLE 0x102
#define KEY_LOCAL_IP 0x103
#define KEY_SUBNET_MASK 0x104
#define KEY_GATE_WAY 0x105
#define KEY_TARGET_IP 0x106
#define KEY_CHAP_NAME 0x107
#define KEY_CHAP_SECRET 0x108
#define KEY_REVERSE_CHAP_NAME 0x109
#define KEY_REVERSE_CHAP_SECRET 0x10a
#define KEY_SAVE_CHANGES 0x10b
#define KEY_TARGET_NAME 0x10c
#define KEY_BOOT_LUN 0x10d
#define KEY_CONFIG_ISID 0x10e
#define KEY_DEVICE_ENTRY_BASE 0x1000
#define ISCSI_LUN_STR_MAX_LEN 21
#define ISCSI_CHAP_SECRET_MIN_LEN 12
#define ISCSI_CHAP_SECRET_MAX_LEN 16
//
// ISCSI_CHAP_SECRET_STORAGE = ISCSI_CHAP_SECRET_MAX_LEN + sizeof (NULL-Terminator)
//
#define ISCSI_CHAP_SECRET_STORAGE 17
#define ISCSI_CHAP_NAME_MAX_LEN 126
#define ISCSI_CHAP_NAME_STORAGE 127
#define ISID_CONFIGURABLE_MIN_LEN 6
#define ISID_CONFIGURABLE_MAX_LEN 12
#define ISID_CONFIGURABLE_STORAGE 13
#pragma pack(1)
typedef struct {
CHAR16 InitiatorName[ISCSI_NAME_MAX_SIZE];
UINT8 Enabled;
UINT8 InitiatorInfoFromDhcp;
CHAR16 LocalIp[IP4_STR_MAX_SIZE];
CHAR16 SubnetMask[IP4_STR_MAX_SIZE];
CHAR16 Gateway[IP4_STR_MAX_SIZE];
CHAR16 TargetName[ISCSI_NAME_MAX_SIZE];
CHAR16 TargetIp[IP4_STR_MAX_SIZE];
UINT16 TargetPort;
CHAR16 BootLun[ISCSI_LUN_STR_MAX_LEN];
UINT8 TargetInfoFromDhcp;
UINT8 CHAPType;
CHAR16 CHAPName[ISCSI_CHAP_NAME_STORAGE];
CHAR16 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
CHAR16 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
CHAR16 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
CHAR16 IsId[ISID_CONFIGURABLE_STORAGE];
} ISCSI_CONFIG_IFR_NVDATA;
#pragma pack()
#endif

View File

@ -1,472 +0,0 @@
/** @file
iSCSI DHCP related configuration routines.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include "IScsiImpl.h"
/**
Extract the Root Path option and get the required target information.
@param[in] RootPath The RootPath.
@param[in] Length Length of the RootPath option payload.
@param[in, out] ConfigNvData The iSCSI session configuration data read from nonvolatile device.
@retval EFI_SUCCESS All required information is extracted from the RootPath option.
@retval EFI_NOT_FOUND The RootPath is not an iSCSI RootPath.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
@retval EFI_INVALID_PARAMETER The RootPath is mal-formatted.
**/
EFI_STATUS
IScsiDhcpExtractRootPath (
IN CHAR8 *RootPath,
IN UINT8 Length,
IN OUT ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData
)
{
EFI_STATUS Status;
UINT8 IScsiRootPathIdLen;
CHAR8 *TmpStr;
ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX];
ISCSI_ROOT_PATH_FIELD *Field;
UINT32 FieldIndex;
UINT8 Index;
//
// "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname>
//
IScsiRootPathIdLen = (UINT8) AsciiStrLen (ISCSI_ROOT_PATH_ID);
if ((Length <= IScsiRootPathIdLen) || (CompareMem (RootPath, ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) {
return EFI_NOT_FOUND;
}
//
// Skip the iSCSI RootPath ID "iscsi:".
//
RootPath += IScsiRootPathIdLen;
Length = (UINT8) (Length - IScsiRootPathIdLen);
TmpStr = (CHAR8 *) AllocatePool (Length + 1);
if (TmpStr == NULL) {
return EFI_OUT_OF_RESOURCES;
}
CopyMem (TmpStr, RootPath, Length);
TmpStr[Length] = '\0';
Index = 0;
FieldIndex = RP_FIELD_IDX_SERVERNAME;
ZeroMem (&Fields[0], sizeof (Fields));
//
// Extract the fields in the Root Path option string.
//
for (FieldIndex = RP_FIELD_IDX_SERVERNAME; (FieldIndex < RP_FIELD_IDX_MAX) && (Index < Length); FieldIndex++) {
if (TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) {
Fields[FieldIndex].Str = &TmpStr[Index];
}
while ((TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) && (Index < Length)) {
Index++;
}
if (TmpStr[Index] == ISCSI_ROOT_PATH_FIELD_DELIMITER) {
if (FieldIndex != RP_FIELD_IDX_TARGETNAME) {
TmpStr[Index] = '\0';
Index++;
}
if (Fields[FieldIndex].Str != NULL) {
Fields[FieldIndex].Len = (UINT8) AsciiStrLen (Fields[FieldIndex].Str);
}
}
}
if (FieldIndex != RP_FIELD_IDX_MAX) {
Status = EFI_INVALID_PARAMETER;
goto ON_EXIT;
}
if ((Fields[RP_FIELD_IDX_SERVERNAME].Str == NULL) ||
(Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) ||
(Fields[RP_FIELD_IDX_PROTOCOL].Len > 1)
) {
Status = EFI_INVALID_PARAMETER;
goto ON_EXIT;
}
//
// Get the IP address of the target.
//
Field = &Fields[RP_FIELD_IDX_SERVERNAME];
Status = IScsiAsciiStrToIp (Field->Str, &ConfigNvData->TargetIp);
if (EFI_ERROR (Status)) {
goto ON_EXIT;
}
//
// Check the protocol type.
//
Field = &Fields[RP_FIELD_IDX_PROTOCOL];
if ((Field->Str != NULL) && ((*(Field->Str) - '0') != EFI_IP_PROTO_TCP)) {
Status = EFI_INVALID_PARAMETER;
goto ON_EXIT;
}
//
// Get the port of the iSCSI target.
//
Field = &Fields[RP_FIELD_IDX_PORT];
if (Field->Str != NULL) {
ConfigNvData->TargetPort = (UINT16) AsciiStrDecimalToUintn (Field->Str);
} else {
ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT;
}
//
// Get the LUN.
//
Field = &Fields[RP_FIELD_IDX_LUN];
if (Field->Str != NULL) {
Status = IScsiAsciiStrToLun (Field->Str, ConfigNvData->BootLun);
if (EFI_ERROR (Status)) {
goto ON_EXIT;
}
} else {
ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun));
}
//
// Get the target iSCSI Name.
//
Field = &Fields[RP_FIELD_IDX_TARGETNAME];
if (AsciiStrLen (Field->Str) > ISCSI_NAME_MAX_SIZE - 1) {
Status = EFI_INVALID_PARAMETER;
goto ON_EXIT;
}
//
// Validate the iSCSI name.
//
Status = IScsiNormalizeName (Field->Str, AsciiStrLen (Field->Str));
if (EFI_ERROR (Status)) {
goto ON_EXIT;
}
AsciiStrCpyS (ConfigNvData->TargetName, ISCSI_NAME_MAX_SIZE, Field->Str);
ON_EXIT:
FreePool (TmpStr);
return Status;
}
/**
The callback function registerd to the DHCP4 instance which is used to select
the qualified DHCP OFFER.
@param[in] This The DHCP4 protocol.
@param[in] Context The context set when configuring the DHCP4 protocol.
@param[in] CurrentState The current state of the DHCP4 protocol.
@param[in] Dhcp4Event The event occurs in the current state.
@param[in] Packet The DHCP packet that is to be sent or already received.
@param[out] NewPacket The packet used to replace the above Packet.
@retval EFI_SUCCESS Either the DHCP OFFER is qualified or we're not intereseted
in the Dhcp4Event.
@retval EFI_NOT_READY The DHCP OFFER packet doesn't match our requirements.
@retval Others Other errors as indicated.
**/
EFI_STATUS
EFIAPI
IScsiDhcpSelectOffer (
IN EFI_DHCP4_PROTOCOL * This,
IN VOID *Context,
IN EFI_DHCP4_STATE CurrentState,
IN EFI_DHCP4_EVENT Dhcp4Event,
IN EFI_DHCP4_PACKET * Packet, OPTIONAL
OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL
)
{
EFI_STATUS Status;
UINT32 OptionCount;
EFI_DHCP4_PACKET_OPTION **OptionList;
UINT32 Index;
if ((Dhcp4Event != Dhcp4RcvdOffer) && (Dhcp4Event != Dhcp4SelectOffer)) {
return EFI_SUCCESS;
}
OptionCount = 0;
Status = This->Parse (This, Packet, &OptionCount, NULL);
if (Status != EFI_BUFFER_TOO_SMALL) {
return EFI_NOT_READY;
}
OptionList = AllocatePool (OptionCount * sizeof (EFI_DHCP4_PACKET_OPTION *));
if (OptionList == NULL) {
return EFI_NOT_READY;
}
Status = This->Parse (This, Packet, &OptionCount, OptionList);
if (EFI_ERROR (Status)) {
FreePool (OptionList);
return EFI_NOT_READY;
}
for (Index = 0; Index < OptionCount; Index++) {
if (OptionList[Index]->OpCode != DHCP4_TAG_ROOTPATH) {
continue;
}
Status = IScsiDhcpExtractRootPath (
(CHAR8 *) &OptionList[Index]->Data[0],
OptionList[Index]->Length,
(ISCSI_SESSION_CONFIG_NVDATA *) Context
);
break;
}
if (Index == OptionCount) {
Status = EFI_NOT_READY;
}
FreePool (OptionList);
return Status;
}
/**
Parse the DHCP ACK to get the address configuration and DNS information.
@param[in] Dhcp4 The DHCP4 protocol.
@param[in, out] ConfigData The session configuration data.
@retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
@retval EFI_NO_MAPPING DHCP failed to acquire address and other information.
@retval EFI_INVALID_PARAMETER The DHCP ACK's DNS option is mal-formatted.
@retval EFI_DEVICE_ERROR Other errors as indicated.
**/
EFI_STATUS
IScsiParseDhcpAck (
IN EFI_DHCP4_PROTOCOL *Dhcp4,
IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData
)
{
EFI_STATUS Status;
EFI_DHCP4_MODE_DATA Dhcp4ModeData;
UINT32 OptionCount;
EFI_DHCP4_PACKET_OPTION **OptionList;
UINT32 Index;
Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4ModeData);
if (EFI_ERROR (Status)) {
return Status;
}
if (Dhcp4ModeData.State != Dhcp4Bound) {
return EFI_NO_MAPPING;
}
CopyMem (&ConfigData->NvData.LocalIp, &Dhcp4ModeData.ClientAddress, sizeof (EFI_IPv4_ADDRESS));
CopyMem (&ConfigData->NvData.SubnetMask, &Dhcp4ModeData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
CopyMem (&ConfigData->NvData.Gateway, &Dhcp4ModeData.RouterAddress, sizeof (EFI_IPv4_ADDRESS));
OptionCount = 0;
OptionList = NULL;
Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, &OptionCount, OptionList);
if (Status != EFI_BUFFER_TOO_SMALL) {
return EFI_DEVICE_ERROR;
}
OptionList = AllocatePool (OptionCount * sizeof (EFI_DHCP4_PACKET_OPTION *));
if (OptionList == NULL) {
return EFI_OUT_OF_RESOURCES;
}
Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, &OptionCount, OptionList);
if (EFI_ERROR (Status)) {
FreePool (OptionList);
return EFI_DEVICE_ERROR;
}
for (Index = 0; Index < OptionCount; Index++) {
//
// Get DNS server addresses and DHCP server address from this offer.
//
if (OptionList[Index]->OpCode == DHCP4_TAG_DNS_SERVER) {
if (((OptionList[Index]->Length & 0x3) != 0) || (OptionList[Index]->Length == 0)) {
Status = EFI_INVALID_PARAMETER;
break;
}
//
// Primary DNS server address.
//
CopyMem (&ConfigData->PrimaryDns, &OptionList[Index]->Data[0], sizeof (EFI_IPv4_ADDRESS));
if (OptionList[Index]->Length > 4) {
//
// Secondary DNS server address
//
CopyMem (&ConfigData->SecondaryDns, &OptionList[Index]->Data[4], sizeof (EFI_IPv4_ADDRESS));
}
} else if (OptionList[Index]->OpCode == DHCP4_TAG_SERVER_ID) {
if (OptionList[Index]->Length != 4) {
Status = EFI_INVALID_PARAMETER;
break;
}
CopyMem (&ConfigData->DhcpServer, &OptionList[Index]->Data[0], sizeof (EFI_IPv4_ADDRESS));
}
}
FreePool (OptionList);
return Status;
}
/**
Parse the DHCP ACK to get the address configuration and DNS information.
@param[in] Image The handle of the driver image.
@param[in] Controller The handle of the controller;
@param[in, out] ConfigData The session configuration data.
@retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
@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
IScsiDoDhcp (
IN EFI_HANDLE Image,
IN EFI_HANDLE Controller,
IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData
)
{
EFI_HANDLE Dhcp4Handle;
EFI_DHCP4_PROTOCOL *Dhcp4;
EFI_STATUS Status;
EFI_DHCP4_PACKET_OPTION *ParaList;
EFI_DHCP4_CONFIG_DATA Dhcp4ConfigData;
EFI_STATUS MediaStatus;
UINT8 *Data;
Dhcp4Handle = NULL;
Dhcp4 = NULL;
ParaList = NULL;
//
// Check media status before do DHCP
//
MediaStatus = EFI_SUCCESS;
NetLibDetectMediaWaitTimeout (Controller, ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME, &MediaStatus);
if (MediaStatus != EFI_SUCCESS) {
return EFI_NO_MEDIA;
}
//
// Create a DHCP4 child instance and get the protocol.
//
Status = NetLibCreateServiceChild (
Controller,
Image,
&gEfiDhcp4ServiceBindingProtocolGuid,
&Dhcp4Handle
);
if (EFI_ERROR (Status)) {
return Status;
}
Status = gBS->OpenProtocol (
Dhcp4Handle,
&gEfiDhcp4ProtocolGuid,
(VOID **)&Dhcp4,
Image,
Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER
);
if (EFI_ERROR (Status)) {
goto ON_EXIT;
}
ParaList = AllocatePool (sizeof (EFI_DHCP4_PACKET_OPTION) + 3);
if (ParaList == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto ON_EXIT;
}
//
// Ask the server to reply with Netmask, Router, DNS and RootPath options.
//
ParaList->OpCode = DHCP4_TAG_PARA_LIST;
ParaList->Length = (UINT8) (ConfigData->NvData.TargetInfoFromDhcp ? 4 : 3);
Data = &ParaList->Data[0];
Data[0] = DHCP4_TAG_NETMASK;
Data[1] = DHCP4_TAG_ROUTER;
Data[2] = DHCP4_TAG_DNS_SERVER;
Data[3] = DHCP4_TAG_ROOTPATH;
ZeroMem (&Dhcp4ConfigData, sizeof (EFI_DHCP4_CONFIG_DATA));
Dhcp4ConfigData.OptionCount = 1;
Dhcp4ConfigData.OptionList = &ParaList;
if (ConfigData->NvData.TargetInfoFromDhcp) {
//
// Use callback to select an offer which contains target information.
//
Dhcp4ConfigData.Dhcp4Callback = IScsiDhcpSelectOffer;
Dhcp4ConfigData.CallbackContext = &ConfigData->NvData;
}
Status = Dhcp4->Configure (Dhcp4, &Dhcp4ConfigData);
if (EFI_ERROR (Status)) {
goto ON_EXIT;
}
Status = Dhcp4->Start (Dhcp4, NULL);
if (EFI_ERROR (Status)) {
goto ON_EXIT;
}
//
// Parse the ACK to get required information.
//
Status = IScsiParseDhcpAck (Dhcp4, ConfigData);
ON_EXIT:
if (ParaList != NULL) {
FreePool (ParaList);
}
if (Dhcp4 != NULL) {
Dhcp4->Stop (Dhcp4);
Dhcp4->Configure (Dhcp4, NULL);
gBS->CloseProtocol (
Dhcp4Handle,
&gEfiDhcp4ProtocolGuid,
Image,
Controller
);
}
NetLibDestroyServiceChild (
Controller,
Image,
&gEfiDhcp4ServiceBindingProtocolGuid,
Dhcp4Handle
);
return Status;
}

View File

@ -1,55 +0,0 @@
/** @file
The header file of IScsiDhcp.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _ISCSI_DHCP_H_
#define _ISCSI_DHCP_H_
#include <Protocol/Dhcp4.h>
#define ISCSI_ROOT_PATH_ID "iscsi:"
#define ISCSI_ROOT_PATH_FIELD_DELIMITER ':'
#define RP_FIELD_IDX_SERVERNAME 0
#define RP_FIELD_IDX_PROTOCOL 1
#define RP_FIELD_IDX_PORT 2
#define RP_FIELD_IDX_LUN 3
#define RP_FIELD_IDX_TARGETNAME 4
#define RP_FIELD_IDX_MAX 5
typedef struct _ISCSI_ROOT_PATH_FIELD {
CHAR8 *Str;
UINT8 Len;
} ISCSI_ROOT_PATH_FIELD;
/**
Parse the DHCP ACK to get the address configuration and DNS information.
@param[in] Image The handle of the driver image.
@param[in] Controller The handle of the controller;
@param[in, out] ConfigData The session configuration data.
@retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
@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
IScsiDoDhcp (
IN EFI_HANDLE Image,
IN EFI_HANDLE Controller,
IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData
);
#endif

View File

@ -1,676 +0,0 @@
/** @file
The entry point of IScsi driver.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include "IScsiImpl.h"
EFI_DRIVER_BINDING_PROTOCOL gIScsiDriverBinding = {
IScsiDriverBindingSupported,
IScsiDriverBindingStart,
IScsiDriverBindingStop,
0xa,
NULL,
NULL
};
/**
Tests to see if this driver supports the RemainingDevicePath.
@param[in] RemainingDevicePath A pointer to the remaining portion of a device path. This
parameter is ignored by device drivers, and is optional for bus
drivers. For bus drivers, if this parameter is not NULL, then
the bus driver must determine if the bus controller specified
by ControllerHandle and the child controller specified
by RemainingDevicePath are both supported by this
bus driver.
@retval EFI_SUCCESS The RemainingDevicePath is supported or NULL.
@retval EFI_UNSUPPORTED The device specified by ControllerHandle and
RemainingDevicePath is not supported by the driver specified by This.
**/
EFI_STATUS
IScsiIsDevicePathSupported (
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
)
{
EFI_DEVICE_PATH_PROTOCOL *CurrentDevicePath;
CurrentDevicePath = RemainingDevicePath;
if (CurrentDevicePath != NULL) {
while (!IsDevicePathEnd (CurrentDevicePath)) {
if ((CurrentDevicePath->Type == MESSAGING_DEVICE_PATH) && (CurrentDevicePath->SubType == MSG_ISCSI_DP)) {
return EFI_SUCCESS;
}
CurrentDevicePath = NextDevicePathNode (CurrentDevicePath);
}
return EFI_UNSUPPORTED;
}
return EFI_SUCCESS;
}
/**
Tests to see if this driver supports a given controller. If a child device is provided,
it further tests to see if this driver supports creating a handle for the specified child device.
@param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
@param[in] ControllerHandle The handle of the controller to test. This handle
must support a protocol interface that supplies
an I/O abstraction to the driver.
@param[in] RemainingDevicePath A pointer to the remaining portion of a device path.
This parameter is ignored by device drivers, and is optional for bus drivers.
@retval EFI_SUCCESS The device specified by ControllerHandle and
RemainingDevicePath is supported by the driver specified by This.
@retval EFI_ALREADY_STARTED The device specified by ControllerHandle and
RemainingDevicePath is already being managed by the driver
specified by This.
@retval EFI_ACCESS_DENIED The device specified by ControllerHandle and
RemainingDevicePath is already being managed by a different
driver or an application that requires exclusive acces.
Currently not implemented.
@retval EFI_UNSUPPORTED The device specified by ControllerHandle and
RemainingDevicePath is not supported by the driver specified by This.
**/
EFI_STATUS
EFIAPI
IScsiDriverBindingSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
)
{
EFI_STATUS Status;
Status = gBS->OpenProtocol (
ControllerHandle,
&gEfiCallerIdGuid,
NULL,
This->DriverBindingHandle,
ControllerHandle,
EFI_OPEN_PROTOCOL_TEST_PROTOCOL
);
if (!EFI_ERROR (Status)) {
return EFI_ALREADY_STARTED;
}
Status = gBS->OpenProtocol (
ControllerHandle,
&gEfiTcp4ServiceBindingProtocolGuid,
NULL,
This->DriverBindingHandle,
ControllerHandle,
EFI_OPEN_PROTOCOL_TEST_PROTOCOL
);
if (EFI_ERROR (Status)) {
return EFI_UNSUPPORTED;
}
Status = IScsiIsDevicePathSupported (RemainingDevicePath);
if (EFI_ERROR (Status)) {
return EFI_UNSUPPORTED;
}
if (IScsiDhcpIsConfigured (ControllerHandle)) {
Status = gBS->OpenProtocol (
ControllerHandle,
&gEfiDhcp4ServiceBindingProtocolGuid,
NULL,
This->DriverBindingHandle,
ControllerHandle,
EFI_OPEN_PROTOCOL_TEST_PROTOCOL
);
if (EFI_ERROR (Status)) {
return EFI_UNSUPPORTED;
}
}
return EFI_SUCCESS;
}
/**
Start this driver on ControllerHandle.
The Start() function is designed to be invoked from the EFI boot service ConnectController().
As a result, much of the error checking on the parameters to Start() has been moved into this
common boot service. It is legal to call Start() from other locations, but the following calling
restrictions must be followed or the system behavior will not be deterministic.
1. ControllerHandle must be a valid EFI_HANDLE.
2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally aligned
EFI_DEVICE_PATH_PROTOCOL.
3. Prior to calling Start(), the Supported() function for the driver specified by This must
have been called with the same calling parameters, and Supported() must have returned EFI_SUCCESS.
@param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
@param[in] ControllerHandle The handle of the controller to start. This handle
must support a protocol interface that supplies
an I/O abstraction to the driver.
@param[in] RemainingDevicePath A pointer to the remaining portion of a device path.
This parameter is ignored by device drivers, and is optional for bus drivers.
@retval EFI_SUCCESS The device was started.
@retval EFI_DEVICE_ERROR The device could not be started due to a device error.
Currently not implemented.
@retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
@retval Others The driver failded to start the device.
**/
EFI_STATUS
EFIAPI
IScsiDriverBindingStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
)
{
EFI_STATUS Status;
ISCSI_DRIVER_DATA *Private;
VOID *Interface;
Private = IScsiCreateDriverData (This->DriverBindingHandle, ControllerHandle);
if (Private == NULL) {
return EFI_OUT_OF_RESOURCES;
}
//
// Create a underlayer child instance, but not need to configure it. Just open ChildHandle
// via BY_DRIVER. That is, establishing the relationship between ControllerHandle and ChildHandle.
// Therefore, when DisconnectController(), especially VLAN virtual controller handle,
// IScsiDriverBindingStop() will be called.
//
Status = NetLibCreateServiceChild (
ControllerHandle,
This->DriverBindingHandle,
&gEfiTcp4ServiceBindingProtocolGuid,
&Private->ChildHandle
);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
Status = gBS->OpenProtocol (
Private->ChildHandle,
&gEfiTcp4ProtocolGuid,
&Interface,
This->DriverBindingHandle,
ControllerHandle,
EFI_OPEN_PROTOCOL_BY_DRIVER
);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
//
// Always install private protocol no matter what happens later. We need to
// keep the relationship between ControllerHandle and ChildHandle.
//
Status = gBS->InstallProtocolInterface (
&ControllerHandle,
&gEfiCallerIdGuid,
EFI_NATIVE_INTERFACE,
&Private->IScsiIdentifier
);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
//
// Try to add a port configuration page for this controller.
//
IScsiConfigUpdateForm (This->DriverBindingHandle, ControllerHandle, TRUE);
//
// Get the iSCSI configuration data of this controller.
//
Status = IScsiGetConfigData (Private);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
//
// Try to login and create an iSCSI session according to the configuration.
//
Status = IScsiSessionLogin (Private);
if (Status == EFI_MEDIA_CHANGED) {
//
// The specified target is not available and the redirection information is
// got, login the session again with the updated target address.
//
Status = IScsiSessionLogin (Private);
}
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
//
// Duplicate the Session's tcp connection device path. The source port field
// will be set to zero as one iSCSI session is comprised of several iSCSI
// connections.
//
Private->DevicePath = IScsiGetTcpConnDevicePath (Private);
if (Private->DevicePath == NULL) {
goto ON_ERROR;
}
//
// Install the updated device path onto the ExtScsiPassThruHandle.
//
Status = gBS->InstallProtocolInterface (
&Private->ExtScsiPassThruHandle,
&gEfiDevicePathProtocolGuid,
EFI_NATIVE_INTERFACE,
Private->DevicePath
);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
//
// ISCSI children should share the default Tcp child, just open the default Tcp child via BY_CHILD_CONTROLLER.
//
Status = gBS->OpenProtocol (
Private->ChildHandle, /// Default Tcp child
&gEfiTcp4ProtocolGuid,
&Interface,
This->DriverBindingHandle,
Private->ExtScsiPassThruHandle,
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
);
if (EFI_ERROR (Status)) {
gBS->UninstallMultipleProtocolInterfaces (
Private->ExtScsiPassThruHandle,
&gEfiExtScsiPassThruProtocolGuid,
&Private->IScsiExtScsiPassThru,
&gEfiDevicePathProtocolGuid,
Private->DevicePath,
NULL
);
goto ON_ERROR;
}
//
// Update/Publish the iSCSI Boot Firmware Table.
//
IScsiPublishIbft ();
return EFI_SUCCESS;
ON_ERROR:
IScsiSessionAbort (&Private->Session);
return Status;
}
/**
Stop this driver on ControllerHandle.
Release the control of this controller and remove the IScsi functions. The Stop()
function is designed to be invoked from the EFI boot service DisconnectController().
As a result, much of the error checking on the parameters to Stop() has been moved
into this common boot service. It is legal to call Stop() from other locations,
but the following calling restrictions must be followed or the system behavior will not be deterministic.
1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call to this
same driver's Start() function.
2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid
EFI_HANDLE. In addition, all of these handles must have been created in this driver's
Start() function, and the Start() function must have called OpenProtocol() on
ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
@param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
@param[in] ControllerHandle A handle to the device being stopped. The handle must
support a bus specific I/O protocol for the driver
to use to stop the device.
@param[in] NumberOfChildren The number of child device handles in ChildHandleBuffer.Not used.
@param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL
if NumberOfChildren is 0.Not used.
@retval EFI_SUCCESS The device was stopped.
@retval EFI_DEVICE_ERROR The device could not be stopped due to a device error.
@retval EFI_INVALID_PARAMETER Child handle is NULL.
@retval EFI_ACCESS_DENIED The protocol could not be removed from the Handle
because its interfaces are being used.
**/
EFI_STATUS
EFIAPI
IScsiDriverBindingStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
)
{
EFI_HANDLE IScsiController;
EFI_STATUS Status;
ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
ISCSI_DRIVER_DATA *Private;
EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru;
ISCSI_CONNECTION *Conn;
if (NumberOfChildren != 0) {
//
// We should have only one child.
//
Status = gBS->OpenProtocol (
ChildHandleBuffer[0],
&gEfiExtScsiPassThruProtocolGuid,
(VOID **) &PassThru,
This->DriverBindingHandle,
ControllerHandle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
if (EFI_ERROR (Status)) {
return EFI_DEVICE_ERROR;
}
Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru);
Conn = NET_LIST_HEAD (&Private->Session.Conns, ISCSI_CONNECTION, Link);
//
// Previously the TCP4 protocol is opened BY_CHILD_CONTROLLER. Just close
// the protocol here but not uninstall the device path protocol and
// EXT SCSI PASS THRU protocol installed on ExtScsiPassThruHandle.
//
gBS->CloseProtocol (
Private->ChildHandle,
&gEfiTcp4ProtocolGuid,
Private->Image,
Private->ExtScsiPassThruHandle
);
gBS->CloseProtocol (
Conn->Tcp4Io.Handle,
&gEfiTcp4ProtocolGuid,
Private->Image,
Private->ExtScsiPassThruHandle
);
return EFI_SUCCESS;
}
//
// Get the handle of the controller we are controling.
//
IScsiController = NetLibGetNicHandle (ControllerHandle, &gEfiTcp4ProtocolGuid);
Status = gBS->OpenProtocol (
IScsiController,
&gEfiCallerIdGuid,
(VOID **)&IScsiIdentifier,
This->DriverBindingHandle,
ControllerHandle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
if (EFI_ERROR (Status)) {
return EFI_DEVICE_ERROR;
}
Private = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
if (Private->ChildHandle != NULL) {
Status = gBS->CloseProtocol (
Private->ChildHandle,
&gEfiTcp4ProtocolGuid,
This->DriverBindingHandle,
IScsiController
);
ASSERT (!EFI_ERROR (Status));
Status = NetLibDestroyServiceChild (
IScsiController,
This->DriverBindingHandle,
&gEfiTcp4ServiceBindingProtocolGuid,
Private->ChildHandle
);
ASSERT (!EFI_ERROR (Status));
}
IScsiConfigUpdateForm (This->DriverBindingHandle, IScsiController, FALSE);
//
// Uninstall the private protocol.
//
gBS->UninstallProtocolInterface (
IScsiController,
&gEfiCallerIdGuid,
&Private->IScsiIdentifier
);
//
// Update the iSCSI Boot Firware Table.
//
IScsiPublishIbft ();
IScsiSessionAbort (&Private->Session);
Status = IScsiCleanDriverData (Private);
if (EFI_ERROR (Status)) {
return Status;
}
return EFI_SUCCESS;
}
/**
Unloads an image(the iSCSI driver).
@param[in] ImageHandle Handle that identifies the image to be unloaded.
@retval EFI_SUCCESS The image has been unloaded.
@retval Others Other errors as indicated.
**/
EFI_STATUS
EFIAPI
EfiIScsiUnload (
IN EFI_HANDLE ImageHandle
)
{
EFI_STATUS Status;
UINTN DeviceHandleCount;
EFI_HANDLE *DeviceHandleBuffer;
UINTN Index;
EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
//
// Try to disonnect the driver from the devices it's controlling.
//
Status = gBS->LocateHandleBuffer (
AllHandles,
NULL,
NULL,
&DeviceHandleCount,
&DeviceHandleBuffer
);
if (EFI_ERROR (Status)) {
return Status;
}
for (Index = 0; Index < DeviceHandleCount; Index++) {
Status = IScsiTestManagedDevice (
DeviceHandleBuffer[Index],
gIScsiDriverBinding.DriverBindingHandle,
&gEfiTcp4ProtocolGuid
);
if (EFI_ERROR (Status)) {
continue;
}
Status = gBS->DisconnectController (
DeviceHandleBuffer[Index],
gIScsiDriverBinding.DriverBindingHandle,
NULL
);
if (EFI_ERROR (Status)) {
goto ON_EXIT;
}
}
//
// Unload the iSCSI configuration form.
//
Status = IScsiConfigFormUnload (gIScsiDriverBinding.DriverBindingHandle);
if (EFI_ERROR (Status)) {
goto ON_EXIT;
}
//
// Uninstall the ComponentName and ComponentName2 protocol from iSCSI4 driver binding handle
// if it has been installed.
//
Status = gBS->HandleProtocol (
gIScsiDriverBinding.DriverBindingHandle,
&gEfiComponentNameProtocolGuid,
(VOID **) &ComponentName
);
if (!EFI_ERROR (Status)) {
Status = gBS->UninstallMultipleProtocolInterfaces (
gIScsiDriverBinding.DriverBindingHandle,
&gEfiComponentNameProtocolGuid,
ComponentName,
NULL
);
if (EFI_ERROR (Status)) {
goto ON_EXIT;
}
}
Status = gBS->HandleProtocol (
gIScsiDriverBinding.DriverBindingHandle,
&gEfiComponentName2ProtocolGuid,
(VOID **) &ComponentName2
);
if (!EFI_ERROR (Status)) {
gBS->UninstallMultipleProtocolInterfaces (
gIScsiDriverBinding.DriverBindingHandle,
&gEfiComponentName2ProtocolGuid,
ComponentName2,
NULL
);
if (EFI_ERROR (Status)) {
goto ON_EXIT;
}
}
Status = gBS->UninstallMultipleProtocolInterfaces (
ImageHandle,
&gEfiDriverBindingProtocolGuid,
&gIScsiDriverBinding,
&gEfiIScsiInitiatorNameProtocolGuid,
&gIScsiInitiatorName,
NULL
);
ON_EXIT:
if (DeviceHandleBuffer != NULL) {
FreePool (DeviceHandleBuffer);
}
return Status;
}
/**
This is the declaration of an EFI image entry point. This entry point is
the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
both device drivers and bus drivers. It initialize the global variables and
publish the driver binding protocol.
@param[in] ImageHandle The firmware allocated handle for the UEFI image.
@param[in] SystemTable A pointer to the EFI System Table.
@retval EFI_SUCCESS The operation completed successfully.
@retval EFI_ACCESS_DENIED EFI_ISCSI_INITIATOR_NAME_PROTOCOL was installed unexpectedly.
@retval Others Other errors as indicated.
**/
EFI_STATUS
EFIAPI
IScsiDriverEntryPoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_ISCSI_INITIATOR_NAME_PROTOCOL *IScsiInitiatorName;
//
// There should be only one EFI_ISCSI_INITIATOR_NAME_PROTOCOL.
//
Status = gBS->LocateProtocol (
&gEfiIScsiInitiatorNameProtocolGuid,
NULL,
(VOID**) &IScsiInitiatorName
);
if (!EFI_ERROR (Status)) {
return EFI_ACCESS_DENIED;
}
//
// Initialize the EFI Driver Library
//
Status = EfiLibInstallDriverBindingComponentName2 (
ImageHandle,
SystemTable,
&gIScsiDriverBinding,
ImageHandle,
&gIScsiComponentName,
&gIScsiComponentName2
);
if (!EFI_ERROR (Status)) {
//
// Install the iSCSI Initiator Name Protocol.
//
Status = gBS->InstallProtocolInterface (
&ImageHandle,
&gEfiIScsiInitiatorNameProtocolGuid,
EFI_NATIVE_INTERFACE,
&gIScsiInitiatorName
);
if (EFI_ERROR (Status)) {
gBS->UninstallMultipleProtocolInterfaces (
ImageHandle,
&gEfiDriverBindingProtocolGuid,
&gIScsiDriverBinding,
&gEfiComponentName2ProtocolGuid,
&gIScsiComponentName2,
&gEfiComponentNameProtocolGuid,
&gIScsiComponentName,
NULL
);
return Status;
}
//
// Initialize the configuration form of iSCSI.
//
Status = IScsiConfigFormInit ();
if (EFI_ERROR (Status)) {
gBS->UninstallMultipleProtocolInterfaces (
ImageHandle,
&gEfiDriverBindingProtocolGuid,
&gIScsiDriverBinding,
&gEfiComponentName2ProtocolGuid,
&gIScsiComponentName2,
&gEfiComponentNameProtocolGuid,
&gIScsiComponentName,
&gEfiIScsiInitiatorNameProtocolGuid,
&gIScsiInitiatorName,
NULL
);
}
}
return Status;
}

View File

@ -1,140 +0,0 @@
/** @file
The header file of IScsiDriver.c.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _ISCSI_DRIVER_H_
#define _ISCSI_DRIVER_H_
#include <Uefi.h>
#include <Protocol/DevicePath.h>
#include <Protocol/LoadedImage.h>
#include <Protocol/HiiConfigAccess.h>
#include <Protocol/HiiDatabase.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
#include <Library/DevicePathLib.h>
#include <Protocol/DriverBinding.h>
#include <Protocol/ScsiPassThruExt.h>
#define ISCSI_INITIATOR_NAME_VAR_NAME L"I_NAME"
typedef struct _ISCSI_PRIVATE_PROTOCOL {
UINT32 Reserved;
} ISCSI_PRIVATE_PROTOCOL;
//
// EFI Driver Binding Protocol for iSCSI driver.
//
/**
Tests to see if this driver supports a given controller. If a child device is provided,
it further tests to see if this driver supports creating a handle for the specified child device.
@param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
@param[in] ControllerHandle The handle of the controller to test. This handle
must support a protocol interface that supplies
an I/O abstraction to the driver.
@param[in] RemainingDevicePath A pointer to the remaining portion of a device path.
This parameter is ignored by device drivers, and is optional for bus drivers.
@retval EFI_SUCCESS The device specified by ControllerHandle and
RemainingDevicePath is supported by the driver specified by This.
@retval EFI_ALREADY_STARTED The device specified by ControllerHandle and
RemainingDevicePath is already being managed by the driver
specified by This.
@retval EFI_ACCESS_DENIED The device specified by ControllerHandle and
RemainingDevicePath is already being managed by a different
driver or an application that requires exclusive acces.
Currently not implemented.
@retval EFI_UNSUPPORTED The device specified by ControllerHandle and
RemainingDevicePath is not supported by the driver specified by This.
**/
EFI_STATUS
EFIAPI
IScsiDriverBindingSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
);
/**
Start this driver on ControllerHandle. The Start() function is designed to be
invoked from the EFI boot service ConnectController(). As a result, much of
the error checking on the parameters to Start() has been moved into this
common boot service. It is legal to call Start() from other locations,
but the following calling restrictions must be followed or the system behavior will not be deterministic.
1. ControllerHandle must be a valid EFI_HANDLE.
2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally aligned
EFI_DEVICE_PATH_PROTOCOL.
3. Prior to calling Start(), the Supported() function for the driver specified by This must
have been called with the same calling parameters, and Supported() must have returned EFI_SUCCESS.
@param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
@param[in] ControllerHandle The handle of the controller to start. This handle
must support a protocol interface that supplies
an I/O abstraction to the driver.
@param[in] RemainingDevicePath A pointer to the remaining portion of a device path.
This parameter is ignored by device drivers, and is optional for bus drivers.
@retval EFI_SUCCESS The device was started.
@retval EFI_DEVICE_ERROR The device could not be started due to a device error.
Currently not implemented.
@retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
@retval Others The driver failded to start the device.
**/
EFI_STATUS
EFIAPI
IScsiDriverBindingStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
);
/**
Stop this driver on ControllerHandle.
Release the control of this controller and remove the IScsi functions. The Stop()
function is designed to be invoked from the EFI boot service DisconnectController().
As a result, much of the error checking on the parameters to Stop() has been moved
into this common boot service. It is legal to call Stop() from other locations,
but the following calling restrictions must be followed or the system behavior will not be deterministic.
1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call to this
same driver's Start() function.
2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid
EFI_HANDLE. In addition, all of these handles must have been created in this driver's
Start() function, and the Start() function must have called OpenProtocol() on
ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
@param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
@param[in] ControllerHandle A handle to the device being stopped. The handle must
support a bus specific I/O protocol for the driver
to use to stop the device.
@param[in] NumberOfChildren The number of child device handles in ChildHandleBuffer.Not used.
@param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL
if NumberOfChildren is 0.Not used.
@retval EFI_SUCCESS The device was stopped.
@retval EFI_DEVICE_ERROR The device could not be stopped due to a device error.
**/
EFI_STATUS
EFIAPI
IScsiDriverBindingStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
);
#endif

View File

@ -1,134 +0,0 @@
## @file
# This module produces EFI iSCSI Initiator Name Protocol.
#
# This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol
# and EFI DHCPv4 Protocol, to provide the capability to do the transport for SCSI
# data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide
# one way to configurate the iSCSI setting. This driver only supports IPv4 network
# stack.
#
# Notes:
# 1) This driver can't co-work with the IScsiDxe driver in NetworkPkg.
# 2) This driver might have some issues that have been fixed in the IScsiDxe driver
# in NetworkPkg.
# 3) This driver supports fewer features than the IScsiDxe driver in NetworkPkg
# (e.g. IPv6, Dns support for target URL configuration, iSCSI keyword support).
# 4) IScsiDxe driver in NetworkPkg is recommended for use instead of this one even
# though both of them can be used.
#
# Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
##
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = IScsi4Dxe
MODULE_UNI_FILE = IScsi4Dxe.uni
FILE_GUID = 4579B72D-7EC4-4dd4-8486-083C86B182A7
MODULE_TYPE = UEFI_DRIVER
VERSION_STRING = 1.0
ENTRY_POINT = IScsiDriverEntryPoint
UNLOAD_IMAGE = EfiIScsiUnload
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64 EBC
#
# DRIVER_BINDING = gIScsiDriverBinding
# COMPONENT_NAME = gIScsiComponentName
# COMPONENT_NAME2 = gIScsiComponentName2
#
[Sources]
IScsiTcp4Io.h
IScsiProto.h
IScsiMisc.h
IScsiIbft.h
IScsiExtScsiPassThru.h
IScsiDriver.h
IScsiDhcp.h
IScsiCommon.h
IScsiCHAP.h
IScsiInitiatorName.h
ComponentName.h
Md5.h
IScsiTcp4Io.c
IScsiProto.c
IScsiMisc.c
IScsiInitiatorName.c
IScsiIbft.c
IScsiExtScsiPassThru.c
IScsiDriver.c
IScsiDhcp.c
IScsiCHAP.c
ComponentName.c
Md5.c
IScsiConfigDxeStrings.uni
IScsiConfigDxe.vfr
IScsiConfig.c
IScsiConfig.h
IScsiImpl.h
IScsiConfigNVDataStruc.h
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
[LibraryClasses]
UefiDriverEntryPoint
UefiLib
BaseLib
UefiBootServicesTableLib
UefiRuntimeServicesTableLib
BaseMemoryLib
MemoryAllocationLib
DevicePathLib
DebugLib
PrintLib
HiiLib
NetLib
[Protocols]
## PRODUCES
## UNDEFINED # Variable
gEfiIScsiInitiatorNameProtocolGuid
gEfiExtScsiPassThruProtocolGuid ## BY_START
gEfiTcp4ProtocolGuid ## TO_START
gEfiTcp4ServiceBindingProtocolGuid ## TO_START
gEfiDhcp4ProtocolGuid ## TO_START
gEfiDhcp4ServiceBindingProtocolGuid ## TO_START
## TO_START
## PRODUCES
gEfiDevicePathProtocolGuid
gEfiHiiConfigAccessProtocolGuid ## PRODUCES
gEfiHiiDatabaseProtocolGuid ## CONSUMES
gEfiPciIoProtocolGuid ## SOMETIMES_CONSUMES
gEfiAcpiTableProtocolGuid ## SOMETIMES_CONSUMES
[Guids]
gEfiEventExitBootServicesGuid ## SOMETIMES_CONSUMES ## Event
gEfiIfrTianoGuid ## SOMETIMES_PRODUCES ## UNDEFINED
gEfiAcpiTableGuid ## SOMETIMES_CONSUMES ## SystemTable
gEfiAcpi10TableGuid ## SOMETIMES_CONSUMES ## SystemTable
## SOMETIMES_PRODUCES ## Variable:L"iSCSIDeviceList"
## SOMETIMES_CONSUMES ## Variable:L"iSCSIDeviceList"
## SOMETIMES_CONSUMES ## UNDEFINED # HiiIsConfigHdrMatch mVendorStorageName
## SOMETIMES_PRODUCES ## UNDEFINED # HiiConstructConfigHdr mVendorStorageName
## SOMETIMES_PRODUCES ## UNDEFINED # HiiGetBrowserData mVendorStorageName
## SOMETIMES_CONSUMES ## UNDEFINED # HiiSetBrowserData mVendorStorageName
## SOMETIMES_CONSUMES ## HII
gIp4IScsiConfigGuid
## SOMETIMES_PRODUCES ## Variable
## SOMETIMES_CONSUMES ## Variable
gIScsiCHAPAuthInfoGuid
[UserExtensions.TianoCore."ExtraFiles"]
IScsi4DxeExtra.uni

View File

@ -1,412 +0,0 @@
/** @file
The IScsi's EFI_EXT_SCSI_PASS_THRU_PROTOCOL driver.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include "IScsiImpl.h"
/**
Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI channel. This function
supports both blocking I/O and nonblocking I/O. The blocking I/O functionality is required, and the
nonblocking I/O functionality is optional.
@param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
@param[in] Target The Target is an array of size TARGET_MAX_BYTES and it represents
the id of the SCSI device to send the SCSI Request Packet. Each
transport driver may chose to utilize a subset of this size to suit the needs
of transport target representation. For example, a Fibre Channel driver
may use only 8 bytes (WWN) to represent an FC target.
@param[in] Lun The LUN of the SCSI device to send the SCSI Request Packet.
@param[in, out] Packet A pointer to the SCSI Request Packet to send to the SCSI device
specified by Target and Lun.
@param[in] Event If nonblocking I/O is not supported then Event is ignored, and blocking
I/O is performed. If Event is NULL, then blocking I/O is performed. If
Event is not NULL and non blocking I/O is supported, then
nonblocking I/O is performed, and Event will be signaled when the
SCSI Request Packet completes.
@retval EFI_SUCCESS The SCSI Request Packet was sent by the host. For bi-directional
commands, InTransferLength bytes were transferred from
InDataBuffer. For write and bi-directional commands,
OutTransferLength bytes were transferred by
OutDataBuffer.
@retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was not executed. The number of bytes that
could be transferred is returned in InTransferLength. For write
and bi-directional commands, OutTransferLength bytes were
transferred by OutDataBuffer. Currently not implemeted.
@retval EFI_NOT_READY The SCSI Request Packet could not be sent because there are too many
SCSI Request Packets already queued. The caller may retry again later.
@retval EFI_DEVICE_ERROR A device error occurred while attempting to send the SCSI Request
Packet.
@retval EFI_INVALID_PARAMETER Target, Lun, or the contents of ScsiRequestPacket are invalid.
@retval EFI_UNSUPPORTED The command described by the SCSI Request Packet is not supported
by the host adapter. This includes the case of Bi-directional SCSI
commands not supported by the implementation. The SCSI Request
Packet was not sent, so no additional status information is available.
Currently not implemeted.
@retval EFI_TIMEOUT A timeout occurred while waiting for the SCSI Request Packet to execute.
**/
EFI_STATUS
EFIAPI
IScsiExtScsiPassThruFunction (
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
IN UINT8 *Target,
IN UINT64 Lun,
IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
IN EFI_EVENT Event OPTIONAL
)
{
ISCSI_DRIVER_DATA *Private;
ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
EFI_STATUS Status;
Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
ConfigNvData = &Private->Session.ConfigData.NvData;
if (Target[0] != 0 || (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0)) {
return EFI_INVALID_PARAMETER;
}
if ((Packet == NULL) || (Packet->Cdb == NULL)) {
return EFI_INVALID_PARAMETER;
}
Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet);
if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_READY)) {
//
// Try to reinstate the session and re-execute the Scsi command.
//
if (EFI_ERROR (IScsiSessionReinstatement (Private))) {
return EFI_DEVICE_ERROR;
}
Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet);
}
return Status;
}
/**
Used to retrieve the list of legal Target IDs and LUNs for SCSI devices on a SCSI channel. These
can either be the list SCSI devices that are actually present on the SCSI channel, or the list of legal
Target Ids and LUNs for the SCSI channel. Regardless, the caller of this function must probe the
Target ID and LUN returned to see if a SCSI device is actually present at that location on the SCSI
channel.
@param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
@param[in, out] Target On input, a pointer to the Target ID (an array of size
TARGET_MAX_BYTES) of a SCSI device present on the SCSI channel.
On output, a pointer to the Target ID (an array of
TARGET_MAX_BYTES) of the next SCSI device present on a SCSI
channel. An input value of 0xF(all bytes in the array are 0xF) in the
Target array retrieves the Target ID of the first SCSI device present on a
SCSI channel.
@param[in, out] Lun On input, a pointer to the LUN of a SCSI device present on the SCSI
channel. On output, a pointer to the LUN of the next SCSI device present
on a SCSI channel.
@retval EFI_SUCCESS The Target ID and LUN of the next SCSI device on the SCSI
channel was returned in Target and Lun.
@retval EFI_INVALID_PARAMETER Target array is not all 0xF, and Target and Lun were
not returned on a previous call to GetNextTargetLun().
@retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI channel.
**/
EFI_STATUS
EFIAPI
IScsiExtScsiPassThruGetNextTargetLun (
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
IN OUT UINT8 **Target,
IN OUT UINT64 *Lun
)
{
ISCSI_DRIVER_DATA *Private;
ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
UINT8 TargetId[TARGET_MAX_BYTES];
Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
ConfigNvData = &Private->Session.ConfigData.NvData;
if ((*Target)[0] == 0 && (CompareMem (Lun, ConfigNvData->BootLun, sizeof (UINT64)) == 0)) {
//
// Only one <Target, Lun> pair per iSCSI Driver instance.
//
return EFI_NOT_FOUND;
}
SetMem (TargetId, TARGET_MAX_BYTES, 0xFF);
if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) {
(*Target)[0] = 0;
CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64));
return EFI_SUCCESS;
}
return EFI_INVALID_PARAMETER;
}
/**
Used to allocate and build a device path node for a SCSI device on a SCSI channel.
@param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
@param[in] Target The Target is an array of size TARGET_MAX_BYTES and it specifies the
Target ID of the SCSI device for which a device path node is to be
allocated and built. Transport drivers may chose to utilize a subset of
this size to suit the representation of targets. For example, a Fibre
Channel driver may use only 8 bytes (WWN) in the array to represent a
FC target.
@param[in] Lun The LUN of the SCSI device for which a device path node is to be
allocated and built.
@param[in, out] DevicePath A pointer to a single device path node that describes the SCSI device
specified by Target and Lun. This function is responsible for
allocating the buffer DevicePath with the boot service
AllocatePool(). It is the caller's responsibility to free
DevicePath when the caller is finished with DevicePath.
@retval EFI_SUCCESS The device path node that describes the SCSI device specified by
Target and Lun was allocated and returned in
DevicePath.
@retval EFI_INVALID_PARAMETER DevicePath is NULL.
@retval EFI_NOT_FOUND The SCSI devices specified by Target and Lun does not exist
on the SCSI channel.
@retval EFI_OUT_OF_RESOURCES There are not enough resources to allocate DevicePath.
**/
EFI_STATUS
EFIAPI
IScsiExtScsiPassThruBuildDevicePath (
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
IN UINT8 *Target,
IN UINT64 Lun,
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
)
{
ISCSI_DRIVER_DATA *Private;
ISCSI_SESSION *Session;
ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig;
EFI_DEV_PATH *Node;
UINTN DevPathNodeLen;
if (DevicePath == NULL) {
return EFI_INVALID_PARAMETER;
}
if (Target[0] != 0) {
return EFI_NOT_FOUND;
}
Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
Session = &Private->Session;
ConfigNvData = &Session->ConfigData.NvData;
AuthConfig = &Session->AuthData.AuthConfig;
if (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0) {
return EFI_NOT_FOUND;
}
DevPathNodeLen = sizeof (ISCSI_DEVICE_PATH) + AsciiStrLen (ConfigNvData->TargetName) + 1;
Node = AllocatePool (DevPathNodeLen);
if (Node == NULL) {
return EFI_OUT_OF_RESOURCES;
}
Node->DevPath.Type = MESSAGING_DEVICE_PATH;
Node->DevPath.SubType = MSG_ISCSI_DP;
SetDevicePathNodeLength (&Node->DevPath, (UINT16)DevPathNodeLen);
//
// 0 for TCP, others are reserved.
//
Node->Iscsi.NetworkProtocol = 0;
Node->Iscsi.LoginOption = 0;
switch (AuthConfig->CHAPType) {
case ISCSI_CHAP_NONE:
Node->Iscsi.LoginOption |= 0x0800;
break;
case ISCSI_CHAP_UNI:
Node->Iscsi.LoginOption |= 0x1000;
break;
default:
break;
}
CopyMem (&Node->Iscsi.Lun, ConfigNvData->BootLun, sizeof (UINT64));
Node->Iscsi.TargetPortalGroupTag = Session->TargetPortalGroupTag;
AsciiStrCpyS ((CHAR8 *) Node + sizeof (ISCSI_DEVICE_PATH), AsciiStrLen (ConfigNvData->TargetName) + 1, ConfigNvData->TargetName);
*DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Node;
return EFI_SUCCESS;
}
/**
Used to translate a device path node to a Target ID and LUN.
@param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
@param[in] DevicePath A pointer to a single device path node that describes the SCSI device
on the SCSI channel.
@param[out] Target A pointer to the Target Array which represents the ID of a SCSI device
on the SCSI channel.
@param[out] Lun A pointer to the LUN of a SCSI device on the SCSI channel.
@retval EFI_SUCCESS DevicePath was successfully translated to a Target ID and
LUN, and they were returned in Target and Lun.
@retval EFI_INVALID_PARAMETER DevicePath or Target or Lun is NULL.
@retval EFI_NOT_FOUND A valid translation from DevicePath to a Target ID and LUN
does not exist.Currently not implemented.
@retval EFI_UNSUPPORTED This driver does not support the device path node type in
DevicePath.
**/
EFI_STATUS
EFIAPI
IScsiExtScsiPassThruGetTargetLun (
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
OUT UINT8 **Target,
OUT UINT64 *Lun
)
{
ISCSI_DRIVER_DATA *Private;
ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
if ((DevicePath == NULL) || (Target == NULL) || (Lun == NULL)) {
return EFI_INVALID_PARAMETER;
}
if ((DevicePath->Type != MESSAGING_DEVICE_PATH) ||
(DevicePath->SubType != MSG_ISCSI_DP) ||
(DevicePathNodeLength (DevicePath) <= sizeof (ISCSI_DEVICE_PATH))
) {
return EFI_UNSUPPORTED;
}
Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
ConfigNvData = &Private->Session.ConfigData.NvData;
SetMem (*Target, TARGET_MAX_BYTES, 0xFF);
(*Target)[0] = 0;
if (AsciiStrCmp (ConfigNvData->TargetName, (CHAR8 *) DevicePath + sizeof (ISCSI_DEVICE_PATH)) != 0) {
return EFI_UNSUPPORTED;
}
CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64));
return EFI_SUCCESS;
}
/**
Resets a SCSI channel. This operation resets all the SCSI devices connected to the SCSI channel.
Currently not implemented.
@param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
@retval EFI_SUCCESS The SCSI channel was reset.
@retval EFI_DEVICE_ERROR A device error occurred while attempting to reset the SCSI channel.
@retval EFI_TIMEOUT A timeout occurred while attempting to reset the SCSI channel.
@retval EFI_UNSUPPORTED The SCSI channel does not support a channel reset operation.
**/
EFI_STATUS
EFIAPI
IScsiExtScsiPassThruResetChannel (
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This
)
{
return EFI_UNSUPPORTED;
}
/**
Resets a SCSI logical unit that is connected to a SCSI channel. Currently not implemented.
@param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
@param[in] Target The Target is an array of size TARGET_MAX_BYTE and it represents the
target port ID of the SCSI device containing the SCSI logical unit to
reset. Transport drivers may chose to utilize a subset of this array to suit
the representation of their targets.
@param[in] Lun The LUN of the SCSI device to reset.
@retval EFI_SUCCESS The SCSI device specified by Target and Lun was reset.
@retval EFI_INVALID_PARAMETER Target or Lun is NULL.
@retval EFI_TIMEOUT A timeout occurred while attempting to reset the SCSI device
specified by Target and Lun.
@retval EFI_UNSUPPORTED The SCSI channel does not support a target reset operation.
@retval EFI_DEVICE_ERROR A device error occurred while attempting to reset the SCSI device
specified by Target and Lun.
**/
EFI_STATUS
EFIAPI
IScsiExtScsiPassThruResetTargetLun (
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
IN UINT8 *Target,
IN UINT64 Lun
)
{
return EFI_UNSUPPORTED;
}
/**
Used to retrieve the list of legal Target IDs for SCSI devices on a SCSI channel. These can either
be the list SCSI devices that are actually present on the SCSI channel, or the list of legal Target IDs
for the SCSI channel. Regardless, the caller of this function must probe the Target ID returned to
see if a SCSI device is actually present at that location on the SCSI channel.
@param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
@param[in, out] Target (TARGET_MAX_BYTES) of a SCSI device present on the SCSI channel.
On output, a pointer to the Target ID (an array of
TARGET_MAX_BYTES) of the next SCSI device present on a SCSI
channel. An input value of 0xF(all bytes in the array are 0xF) in the
Target array retrieves the Target ID of the first SCSI device present on a
SCSI channel.
@retval EFI_SUCCESS The Target ID of the next SCSI device on the SCSI
channel was returned in Target.
@retval EFI_INVALID_PARAMETER Target or Lun is NULL.
@retval EFI_TIMEOUT Target array is not all 0xF, and Target were not
returned on a previous call to GetNextTarget().
Currently not implemented.
@retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI channel.
**/
EFI_STATUS
EFIAPI
IScsiExtScsiPassThruGetNextTarget (
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
IN OUT UINT8 **Target
)
{
UINT8 TargetId[TARGET_MAX_BYTES];
SetMem (TargetId, TARGET_MAX_BYTES, 0xFF);
if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) {
(*Target)[0] = 0;
return EFI_SUCCESS;
} else if ((*Target)[0] == 0) {
return EFI_NOT_FOUND;
} else {
return EFI_INVALID_PARAMETER;
}
}
EFI_EXT_SCSI_PASS_THRU_PROTOCOL gIScsiExtScsiPassThruProtocolTemplate = {
NULL,
IScsiExtScsiPassThruFunction,
IScsiExtScsiPassThruGetNextTargetLun,
IScsiExtScsiPassThruBuildDevicePath,
IScsiExtScsiPassThruGetTargetLun,
IScsiExtScsiPassThruResetChannel,
IScsiExtScsiPassThruResetTargetLun,
IScsiExtScsiPassThruGetNextTarget
};

View File

@ -1,22 +0,0 @@
/** @file
The header file of IScsiExtScsiPassThru.c.
Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _ISCSI_EXT_SCSI_PASS_THRU_H_
#define _ISCSI_EXT_SCSI_PASS_THRU_H_
#include <Protocol/ScsiPassThruExt.h>
extern EFI_EXT_SCSI_PASS_THRU_PROTOCOL gIScsiExtScsiPassThruProtocolTemplate;
#endif

View File

@ -1,539 +0,0 @@
/** @file
Implementation for iSCSI Boot Firmware Table publication.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include "IScsiImpl.h"
BOOLEAN mIbftInstalled = FALSE;
UINTN mTableKey;
/**
Initialize the header of the iSCSI Boot Firmware Table.
@param[out] Header The header of the iSCSI Boot Firmware Table.
@param[in] OemId The OEM ID.
@param[in] OemTableId The OEM table ID for the iBFT.
**/
VOID
IScsiInitIbfTableHeader (
OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Header,
IN UINT8 *OemId,
IN UINT64 *OemTableId
)
{
ZeroMem (Header, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER));
Header->Signature = EFI_ACPI_3_0_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE;
Header->Length = IBFT_HEAP_OFFSET;
Header->Revision = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_REVISION;
Header->Checksum = 0;
CopyMem (Header->OemId, OemId, sizeof (Header->OemId));
CopyMem (&Header->OemTableId, OemTableId, sizeof (UINT64));
}
/**
Initialize the control section of the iSCSI Boot Firmware Table.
@param[in] Table The ACPI table.
@param[in] HandleCount The number of the handles associated with iSCSI sessions, it's
equal to the number of iSCSI sessions.
**/
VOID
IScsiInitControlSection (
IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table,
IN UINTN HandleCount
)
{
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control;
UINTN NumOffset;
Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1);
ZeroMem (Control, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE));
Control->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_ID;
Control->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_VERSION;
Control->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE);
//
// Each session occupies two offsets, one for the NIC section,
// the other for the Target section.
//
NumOffset = 2 * HandleCount;
if (NumOffset > 4) {
//
// Need expand the control section if more than 2 NIC/Target sections
// exist.
//
Control->Header.Length = (UINT16) (Control->Header.Length + (NumOffset - 4) * sizeof (UINT16));
}
}
/**
Add one item into the heap.
@param[in, out] Heap On input, the current address of the heap; On output, the address of
the heap after the item is added.
@param[in] Data The data to add into the heap.
@param[in] Len Length of the Data in byte.
**/
VOID
IScsiAddHeapItem (
IN OUT UINT8 **Heap,
IN VOID *Data,
IN UINTN Len
)
{
//
// Add one byte for the NULL delimiter.
//
*Heap -= Len + 1;
CopyMem (*Heap, Data, Len);
*(*Heap + Len) = 0;
}
/**
Fill the Initiator section of the iSCSI Boot Firmware Table.
@param[in] Table The ACPI table.
@param[in, out] Heap The heap.
@param[in] Handle The handle associated with the iSCSI session.
**/
VOID
IScsiFillInitiatorSection (
IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table,
IN OUT UINT8 **Heap,
IN EFI_HANDLE Handle
)
{
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control;
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *Initiator;
ISCSI_DRIVER_DATA *DriverData;
ISCSI_SESSION *Session;
ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
EFI_STATUS Status;
Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1);
//
// Initiator section immediately follows the control section.
//
Initiator = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *) ((UINT8 *) Control + IBFT_ROUNDUP (Control->Header.Length));
Control->InitiatorOffset = (UINT16) ((UINTN) Initiator - (UINTN) Table);
ZeroMem (Initiator, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE));
Initiator->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_ID;
Initiator->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_VERSION;
Initiator->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE);
Initiator->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BLOCK_VALID | EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BOOT_SELECTED;
//
// Get the identifier from the handle.
//
Status = gBS->HandleProtocol (Handle, &gEfiCallerIdGuid, (VOID **) &IScsiIdentifier);
if (EFI_ERROR (Status)) {
ASSERT (FALSE);
return ;
}
DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
Session = &DriverData->Session;
//
// Fill the iSCSI Initiator Name into the heap.
//
IScsiAddHeapItem (Heap, Session->InitiatorName, Session->InitiatorNameLength - 1);
Initiator->IScsiNameLength = (UINT16) (Session->InitiatorNameLength - 1);
Initiator->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
}
/**
Map the v4 IP address into v6 IP address.
@param[in] V4 The v4 IP address.
@param[out] V6 The v6 IP address.
**/
VOID
IScsiMapV4ToV6Addr (
IN EFI_IPv4_ADDRESS *V4,
OUT EFI_IPv6_ADDRESS *V6
)
{
UINTN Index;
ZeroMem (V6, sizeof (EFI_IPv6_ADDRESS));
V6->Addr[10] = 0xff;
V6->Addr[11] = 0xff;
for (Index = 0; Index < 4; Index++) {
V6->Addr[12 + Index] = V4->Addr[Index];
}
}
/**
Get the NIC's PCI location and return it according to the composited
format defined in iSCSI Boot Firmware Table.
@param[in] Controller The handle of the controller.
@return UINT16 The composited representation of the NIC PCI location.
@retval 0 Other errors as indicated.
**/
UINT16
IScsiGetNICPciLocation (
IN EFI_HANDLE Controller
)
{
EFI_STATUS Status;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
EFI_HANDLE PciIoHandle;
EFI_PCI_IO_PROTOCOL *PciIo;
UINTN Segment;
UINTN Bus;
UINTN Device;
UINTN Function;
Status = gBS->HandleProtocol (
Controller,
&gEfiDevicePathProtocolGuid,
(VOID **)&DevicePath
);
if (EFI_ERROR (Status)) {
return 0;
}
Status = gBS->LocateDevicePath (
&gEfiPciIoProtocolGuid,
&DevicePath,
&PciIoHandle
);
if (EFI_ERROR (Status)) {
return 0;
}
Status = gBS->HandleProtocol (PciIoHandle, &gEfiPciIoProtocolGuid, (VOID **)&PciIo);
if (EFI_ERROR (Status)) {
return 0;
}
Status = PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function);
if (EFI_ERROR (Status)) {
return 0;
}
return (UINT16) ((Bus << 8) | (Device << 3) | Function);
}
/**
Fill the NIC and target sections in iSCSI Boot Firmware Table.
@param[in] Table The buffer of the ACPI table.
@param[in, out] Heap The heap buffer used to store the variable length parameters such as iSCSI name.
@param[in] HandleCount Count The number of handles having iSCSI private protocol installed.
@param[in] Handles The handle buffer.
**/
VOID
IScsiFillNICAndTargetSections (
IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table,
IN OUT UINT8 **Heap,
IN UINTN HandleCount,
IN EFI_HANDLE *Handles
)
{
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control;
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *Nic;
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *Target;
ISCSI_DRIVER_DATA *DriverData;
ISCSI_SESSION_CONFIG_DATA *SessionConfigData;
ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig;
UINT16 *SectionOffset;
UINTN Index;
UINT16 Length;
EFI_MAC_ADDRESS MacAddress;
UINTN HwAddressSize;
ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
EFI_STATUS Status;
//
// Get the offset of the first Nic and Target section.
//
Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1);
Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) ((UINTN) Table +
Control->InitiatorOffset + IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE)));
Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *) ((UINTN) Nic +
IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));
SectionOffset = &Control->NIC0Offset;
for (Index = 0; Index < HandleCount; Index++) {
Status = gBS->HandleProtocol (Handles[Index], &gEfiCallerIdGuid, (VOID **)&IScsiIdentifier);
if (EFI_ERROR (Status)) {
ASSERT (FALSE);
return ;
}
DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
SessionConfigData = &DriverData->Session.ConfigData;
AuthConfig = &DriverData->Session.AuthData.AuthConfig;
//
// Fill the Nic section.
//
ZeroMem (Nic, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE));
Nic->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_ID;
Nic->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_VERSION;
Nic->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE);
Nic->Header.Index = (UINT8) Index;
Nic->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BLOCK_VALID |
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BOOT_SELECTED |
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_GLOBAL;
//
// Get the subnet mask prefix length.
//
Nic->SubnetMaskPrefixLength = IScsiGetSubnetMaskPrefixLength (&SessionConfigData->NvData.SubnetMask);
if (SessionConfigData->NvData.InitiatorInfoFromDhcp) {
Nic->Origin = IpPrefixOriginDhcp;
} else {
Nic->Origin = IpPrefixOriginManual;
}
//
// Map the various v4 addresses into v6 addresses.
//
IScsiMapV4ToV6Addr (&SessionConfigData->NvData.LocalIp, &Nic->Ip);
IScsiMapV4ToV6Addr (&SessionConfigData->NvData.Gateway, &Nic->Gateway);
IScsiMapV4ToV6Addr (&SessionConfigData->PrimaryDns, &Nic->PrimaryDns);
IScsiMapV4ToV6Addr (&SessionConfigData->SecondaryDns, &Nic->SecondaryDns);
IScsiMapV4ToV6Addr (&SessionConfigData->DhcpServer, &Nic->DhcpServer);
Nic->VLanTag = NetLibGetVlanId (DriverData->Controller);
Status = NetLibGetMacAddress (DriverData->Controller, &MacAddress, &HwAddressSize);
ASSERT (Status == EFI_SUCCESS);
CopyMem (Nic->Mac, MacAddress.Addr, sizeof (Nic->Mac));
//
// Get the PCI location of the Nic.
//
Nic->PciLocation = IScsiGetNICPciLocation (DriverData->Controller);
*SectionOffset = (UINT16) ((UINTN) Nic - (UINTN) Table);
SectionOffset++;
//
// Fill the Target section.
//
ZeroMem (Target, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE));
Target->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_ID;
Target->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_VERSION;
Target->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE);
Target->Header.Index = (UINT8) Index;
Target->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BLOCK_VALID | EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BOOT_SELECTED;
Target->Port = SessionConfigData->NvData.TargetPort;
Target->NicIndex = (UINT8) Index;
if (AuthConfig->CHAPType == ISCSI_CHAP_NONE) {
Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_NO_CHAP;
} if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) {
Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_CHAP;
} else if (AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL) {
Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_MUTUAL_CHAP;
}
IScsiMapV4ToV6Addr (&SessionConfigData->NvData.TargetIp, &Target->Ip);
CopyMem (Target->BootLun, SessionConfigData->NvData.BootLun, sizeof (Target->BootLun));
//
// Target iSCSI Name, CHAP name/secret, reverse CHAP name/secret.
//
Length = (UINT16) AsciiStrLen (SessionConfigData->NvData.TargetName);
IScsiAddHeapItem (Heap, SessionConfigData->NvData.TargetName, Length);
Target->IScsiNameLength = Length;
Target->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
if (Target->CHAPType != EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_NO_CHAP) {
//
// CHAP Name
//
Length = (UINT16) AsciiStrLen (AuthConfig->CHAPName);
IScsiAddHeapItem (Heap, AuthConfig->CHAPName, Length);
Target->CHAPNameLength = Length;
Target->CHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
//
// CHAP Secret
//
Length = (UINT16) AsciiStrLen (AuthConfig->CHAPSecret);
IScsiAddHeapItem (Heap, AuthConfig->CHAPSecret, Length);
Target->CHAPSecretLength = Length;
Target->CHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
if (Target->CHAPType == EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_MUTUAL_CHAP) {
//
// Reverse CHAP Name
//
Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPName);
IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPName, Length);
Target->ReverseCHAPNameLength = Length;
Target->ReverseCHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
//
// Reverse CHAP Secret
//
Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPSecret);
IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPSecret, Length);
Target->ReverseCHAPSecretLength = Length;
Target->ReverseCHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
}
}
*SectionOffset = (UINT16) ((UINTN) Target - (UINTN) Table);
SectionOffset++;
//
// Advance to the next NIC/Target pair
//
Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) ((UINTN) Target +
IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE)));
Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *) ((UINTN) Nic +
IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));
}
}
/**
Publish and remove the iSCSI Boot Firmware Table according to the iSCSI
session status.
**/
VOID
IScsiPublishIbft (
VOID
)
{
EFI_STATUS Status;
EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol;
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table;
UINTN HandleCount;
EFI_HANDLE *HandleBuffer;
UINT8 *Heap;
UINT8 Checksum;
EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;
EFI_ACPI_DESCRIPTION_HEADER *Rsdt;
EFI_ACPI_DESCRIPTION_HEADER *Xsdt;
Rsdt = NULL;
Xsdt = NULL;
Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **)&AcpiTableProtocol);
if (EFI_ERROR (Status)) {
return ;
}
//
// Find ACPI table RSD_PTR from system table
//
Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **) &Rsdp);
if (EFI_ERROR (Status)) {
Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **) &Rsdp);
}
if (EFI_ERROR (Status) || (Rsdp == NULL)) {
return ;
} else if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION && Rsdp->XsdtAddress != 0) {
Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress;
} else if (Rsdp->RsdtAddress != 0) {
Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress;
}
if ((Xsdt == NULL) && (Rsdt == NULL)) {
return ;
}
if (mIbftInstalled) {
Status = AcpiTableProtocol->UninstallAcpiTable (
AcpiTableProtocol,
mTableKey
);
if (EFI_ERROR (Status)) {
return ;
}
mIbftInstalled = FALSE;
}
//
// Get all iSCSI private protocols.
//
Status = gBS->LocateHandleBuffer (
ByProtocol,
&gEfiCallerIdGuid,
NULL,
&HandleCount,
&HandleBuffer
);
if (EFI_ERROR (Status)) {
return ;
}
//
// Allocate 4k bytes to hold the ACPI table.
//
Table = AllocateZeroPool (IBFT_MAX_SIZE);
if (Table == NULL) {
return ;
}
Heap = (UINT8 *) Table + IBFT_HEAP_OFFSET;
//
// Fill in the various section of the iSCSI Boot Firmware Table.
//
if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) {
IScsiInitIbfTableHeader (Table, Xsdt->OemId, &Xsdt->OemTableId);
} else {
IScsiInitIbfTableHeader (Table, Rsdt->OemId, &Rsdt->OemTableId);
}
IScsiInitControlSection (Table, HandleCount);
IScsiFillInitiatorSection (Table, &Heap, HandleBuffer[0]);
IScsiFillNICAndTargetSections (Table, &Heap, HandleCount, HandleBuffer);
Checksum = CalculateCheckSum8((UINT8 *)Table, Table->Length);
Table->Checksum = Checksum;
FreePool (HandleBuffer);
//
// Install or update the iBFT table.
//
Status = AcpiTableProtocol->InstallAcpiTable (
AcpiTableProtocol,
Table,
Table->Length,
&mTableKey
);
if (EFI_ERROR(Status)) {
return;
}
mIbftInstalled = TRUE;
FreePool (Table);
}

View File

@ -1,38 +0,0 @@
/** @file
Some extra definitions for iBFT.
Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _ISCSI_IBFT_H_
#define _ISCSI_IBFT_H_
#include <IndustryStandard/Acpi.h>
#include <IndustryStandard/IScsiBootFirmwareTable.h>
#include <Protocol/AcpiTable.h>
#include <Protocol/PciIo.h>
#define IBFT_TABLE_VAR_NAME L"iBFT"
#define IBFT_MAX_SIZE 4096
#define IBFT_HEAP_OFFSET 2048
#define IBFT_ROUNDUP(size) NET_ROUNDUP ((size), EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_STRUCTURE_ALIGNMENT)
/**
Publish and remove the iSCSI Boot Firmware Table according to the iSCSI
session status.
**/
VOID
IScsiPublishIbft (
VOID
);
#endif

View File

@ -1,168 +0,0 @@
/** @file
The header file of IScsiImpl.c.
Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _ISCSI_IMPL_H_
#define _ISCSI_IMPL_H_
#include <Uefi.h>
#include <IndustryStandard/Dhcp.h>
#include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/NetLib.h>
#include <Library/PrintLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Guid/EventGroup.h>
#include "IScsiCommon.h"
#include "IScsiDriver.h"
#include "IScsiInitiatorName.h"
#include "ComponentName.h"
#include "IScsiConfigNVDataStruc.h"
#include "IScsiExtScsiPassThru.h"
#include "IScsiProto.h"
#include "IScsiMisc.h"
#include "IScsiCHAP.h"
#include "IScsiConfig.h"
#include "IScsiDhcp.h"
#include "IScsiTcp4Io.h"
#include "IScsiIbft.h"
#define ISCSI_SESSION_SIGNATURE SIGNATURE_32 ('I', 'S', 'S', 'N')
struct _ISCSI_SESSION {
UINT32 Signature;
ISCSI_SESSION_CONFIG_DATA ConfigData;
ISCSI_CHAP_AUTH_DATA AuthData;
CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE];
UINTN InitiatorNameLength;
UINT8 State;
UINT8 Isid[6];
UINT16 Tsih;
UINT32 CmdSN;
UINT32 ExpCmdSN;
UINT32 MaxCmdSN;
UINT32 InitiatorTaskTag;
UINT16 NextCid;
LIST_ENTRY Conns;
UINT32 NumConns;
LIST_ENTRY TcbList;
//
// session-wide parameters
//
UINT16 TargetPortalGroupTag;
UINT32 MaxConnections;
BOOLEAN InitialR2T;
BOOLEAN ImmediateData;
UINT32 MaxBurstLength;
UINT32 FirstBurstLength;
UINT32 DefaultTime2Wait;
UINT32 DefaultTime2Retain;
UINT16 MaxOutstandingR2T;
BOOLEAN DataPDUInOrder;
BOOLEAN DataSequenceInOrder;
UINT8 ErrorRecoveryLevel;
};
#define ISCSI_CONNECTION_SIGNATURE SIGNATURE_32 ('I', 'S', 'C', 'N')
struct _ISCSI_CONNECTION {
UINT32 Signature;
LIST_ENTRY Link;
EFI_EVENT TimeoutEvent;
ISCSI_SESSION *Session;
UINT8 State;
UINT8 CurrentStage;
UINT8 NextStage;
UINT8 CHAPStep;
BOOLEAN PartialReqSent;
BOOLEAN PartialRspRcvd;
BOOLEAN TransitInitiated;
UINT16 Cid;
UINT32 ExpStatSN;
//
// queues...
//
NET_BUF_QUEUE RspQue;
TCP4_IO Tcp4Io;
//
// connection-only parameters
//
UINT32 MaxRecvDataSegmentLength;
ISCSI_DIGEST_TYPE HeaderDigest;
ISCSI_DIGEST_TYPE DataDigest;
};
#define ISCSI_DRIVER_DATA_SIGNATURE SIGNATURE_32 ('I', 'S', 'D', 'A')
#define ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU(PassThru) \
CR ( \
PassThru, \
ISCSI_DRIVER_DATA, \
IScsiExtScsiPassThru, \
ISCSI_DRIVER_DATA_SIGNATURE \
)
#define ISCSI_DRIVER_DATA_FROM_IDENTIFIER(Identifier) \
CR ( \
Identifier, \
ISCSI_DRIVER_DATA, \
IScsiIdentifier, \
ISCSI_DRIVER_DATA_SIGNATURE \
)
#define ISCSI_DRIVER_DATA_FROM_SESSION(s) \
CR ( \
s, \
ISCSI_DRIVER_DATA, \
Session, \
ISCSI_DRIVER_DATA_SIGNATURE \
)
struct _ISCSI_DRIVER_DATA {
UINT32 Signature;
EFI_HANDLE Image;
EFI_HANDLE Controller;
ISCSI_PRIVATE_PROTOCOL IScsiIdentifier;
EFI_HANDLE ChildHandle;
EFI_EVENT ExitBootServiceEvent;
EFI_EXT_SCSI_PASS_THRU_PROTOCOL IScsiExtScsiPassThru;
EFI_EXT_SCSI_PASS_THRU_MODE ExtScsiPassThruMode;
EFI_HANDLE ExtScsiPassThruHandle;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
ISCSI_SESSION Session;
};
#endif

View File

@ -1,116 +0,0 @@
/** @file
Implementation for EFI iSCSI Initiator Name Protocol.
Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include "IScsiImpl.h"
EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName = {
IScsiGetInitiatorName,
IScsiSetInitiatorName
};
/**
Retrieves the current set value of iSCSI Initiator Name.
@param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
@param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer / Actual size of the
variable data buffer.
@param[out] Buffer Pointer to the buffer for data to be read. The data is a null-terminated UTF-8 encoded string.
The maximum length is 223 characters, including the null-terminator.
@retval EFI_SUCCESS Data was successfully retrieved into the provided buffer and the
BufferSize was sufficient to handle the iSCSI initiator name.
@retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result.
@retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
@retval EFI_DEVICE_ERROR The iSCSI initiator name could not be retrieved due to a hardware error.
@retval Others Other errors as indicated.
**/
EFI_STATUS
EFIAPI
IScsiGetInitiatorName (
IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
IN OUT UINTN *BufferSize,
OUT VOID *Buffer
)
{
EFI_STATUS Status;
if ((BufferSize == NULL) || (Buffer == NULL)) {
return EFI_INVALID_PARAMETER;
}
Status = gRT->GetVariable (
ISCSI_INITIATOR_NAME_VAR_NAME,
&gEfiIScsiInitiatorNameProtocolGuid,
NULL,
BufferSize,
Buffer
);
return Status;
}
/**
Sets the iSCSI Initiator Name.
@param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
@param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer.
@param[in] Buffer Pointer to the buffer for data to be written. The data is a null-terminated UTF-8 encoded string.
The maximum length is 223 characters, including the null-terminator.
@retval EFI_SUCCESS Data was successfully stored by the protocol.
@retval EFI_UNSUPPORTED Platform policies do not allow for data to be written.
Currently not implemented.
@retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize exceeds the maximum allowed limit.
@retval EFI_DEVICE_ERROR The data could not be stored due to a hardware error.
@retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the data.
@retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not adhere to RFC 3720
(and other related protocols).
@retval Others Other errors as indicated.
**/
EFI_STATUS
EFIAPI
IScsiSetInitiatorName (
IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
IN OUT UINTN *BufferSize,
IN VOID *Buffer
)
{
EFI_STATUS Status;
if ((BufferSize == NULL) || (Buffer == NULL)) {
return EFI_INVALID_PARAMETER;
}
if (*BufferSize > ISCSI_NAME_MAX_SIZE) {
*BufferSize = ISCSI_NAME_MAX_SIZE;
return EFI_INVALID_PARAMETER;
}
//
// only support iqn iSCSI names.
//
Status = IScsiNormalizeName ((CHAR8 *) Buffer, *BufferSize - 1);
if (EFI_ERROR (Status)) {
return Status;
}
Status = gRT->SetVariable (
ISCSI_INITIATOR_NAME_VAR_NAME,
&gEfiIScsiInitiatorNameProtocolGuid,
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
*BufferSize,
Buffer
);
return Status;
}

View File

@ -1,74 +0,0 @@
/** @file
The header file for EFI iSCSI Initiator Name Protocol.
Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _ISCSI_INITIATOR_NAME_H_
#define _ISCSI_INITIATOR_NAME_H_
#include <Protocol/IScsiInitiatorName.h>
extern EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName;
//
// EFI iSCSI Initiator Name Protocol for IScsi driver.
//
/**
Retrieves the current set value of iSCSI Initiator Name.
@param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
@param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer / Actual size of the
variable data buffer.
@param[out] Buffer Pointer to the buffer for data to be read.
@retval EFI_SUCCESS Data was successfully retrieved into the provided buffer and the
BufferSize was sufficient to handle the iSCSI initiator name.
@retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result.
@retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
@retval EFI_DEVICE_ERROR The iSCSI initiator name could not be retrieved due to a hardware error.
@retval Others Other errors as indicated.
**/
EFI_STATUS
EFIAPI
IScsiGetInitiatorName (
IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
IN OUT UINTN *BufferSize,
OUT VOID *Buffer
);
/**
Sets the iSCSI Initiator Name.
@param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
@param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer.
@param[in] Buffer Pointer to the buffer for data to be written.
@retval EFI_SUCCESS Data was successfully stored by the protocol.
@retval EFI_UNSUPPORTED Platform policies do not allow for data to be written.
Currently not implemented.
@retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize exceeds the maximum allowed limit.
@retval EFI_DEVICE_ERROR The data could not be stored due to a hardware error.
@retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the data.
@retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not adhere to RFC 3720
(and other related protocols).
@retval Others Other errors as indicated.
**/
EFI_STATUS
EFIAPI
IScsiSetInitiatorName (
IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
IN OUT UINTN *BufferSize,
IN VOID *Buffer
);
#endif

View File

@ -1,948 +0,0 @@
/** @file
Miscellaneous routines for iSCSI driver.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include "IScsiImpl.h"
GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 IScsiHexString[] = "0123456789ABCDEFabcdef";
/**
Removes (trims) specified leading and trailing characters from a string.
@param[in, out] Str Pointer to the null-terminated string to be trimmed. On return,
Str will hold the trimmed string.
@param[in] CharC Character will be trimmed from str.
**/
VOID
StrTrim (
IN OUT CHAR16 *Str,
IN CHAR16 CharC
)
{
CHAR16 *Pointer1;
CHAR16 *Pointer2;
if (*Str == 0) {
return;
}
//
// Trim off the leading and trailing characters c
//
for (Pointer1 = Str; (*Pointer1 != 0) && (*Pointer1 == CharC); Pointer1++) {
;
}
Pointer2 = Str;
if (Pointer2 == Pointer1) {
while (*Pointer1 != 0) {
Pointer2++;
Pointer1++;
}
} else {
while (*Pointer1 != 0) {
*Pointer2 = *Pointer1;
Pointer1++;
Pointer2++;
}
*Pointer2 = 0;
}
for (Pointer1 = Str + StrLen(Str) - 1; Pointer1 >= Str && *Pointer1 == CharC; Pointer1--) {
;
}
if (Pointer1 != Str + StrLen(Str) - 1) {
*(Pointer1 + 1) = 0;
}
}
/**
Calculate the prefix length of the IPv4 subnet mask.
@param[in] SubnetMask The IPv4 subnet mask.
@return The prefix length of the subnet mask.
@retval 0 Other errors as indicated.
**/
UINT8
IScsiGetSubnetMaskPrefixLength (
IN EFI_IPv4_ADDRESS *SubnetMask
)
{
UINT8 Len;
UINT32 ReverseMask;
//
// The SubnetMask is in network byte order.
//
ReverseMask = (SubnetMask->Addr[0] << 24) | (SubnetMask->Addr[1] << 16) | (SubnetMask->Addr[2] << 8) | (SubnetMask->Addr[3]);
//
// Reverse it.
//
ReverseMask = ~ReverseMask;
if ((ReverseMask & (ReverseMask + 1)) != 0) {
return 0;
}
Len = 0;
while (ReverseMask != 0) {
ReverseMask = ReverseMask >> 1;
Len++;
}
return (UINT8) (32 - Len);
}
/**
Convert the hexadecimal encoded LUN string into the 64-bit LUN.
@param[in] Str The hexadecimal encoded LUN string.
@param[out] Lun Storage to return the 64-bit LUN.
@retval EFI_SUCCESS The 64-bit LUN is stored in Lun.
@retval EFI_INVALID_PARAMETER The string is malformatted.
**/
EFI_STATUS
IScsiAsciiStrToLun (
IN CHAR8 *Str,
OUT UINT8 *Lun
)
{
UINTN Index, IndexValue, IndexNum, SizeStr;
CHAR8 TemStr[2];
UINT8 TemValue;
UINT16 Value[4];
ZeroMem (Lun, 8);
ZeroMem (TemStr, 2);
ZeroMem ((UINT8 *) Value, sizeof (Value));
SizeStr = AsciiStrLen (Str);
IndexValue = 0;
IndexNum = 0;
for (Index = 0; Index < SizeStr; Index ++) {
TemStr[0] = Str[Index];
TemValue = (UINT8) AsciiStrHexToUint64 (TemStr);
if (TemValue == 0 && TemStr[0] != '0') {
if ((TemStr[0] != '-') || (IndexNum == 0)) {
//
// Invalid Lun Char
//
return EFI_INVALID_PARAMETER;
}
}
if ((TemValue == 0) && (TemStr[0] == '-')) {
//
// Next Lun value
//
if (++IndexValue >= 4) {
//
// Max 4 Lun value
//
return EFI_INVALID_PARAMETER;
}
//
// Restart str index for the next lun value
//
IndexNum = 0;
continue;
}
if (++IndexNum > 4) {
//
// Each Lun Str can't exceed size 4, because it will be as UINT16 value
//
return EFI_INVALID_PARAMETER;
}
//
// Combine UINT16 value
//
Value[IndexValue] = (UINT16) ((Value[IndexValue] << 4) + TemValue);
}
for (Index = 0; Index <= IndexValue; Index ++) {
*((UINT16 *) &Lun[Index * 2]) = HTONS (Value[Index]);
}
return EFI_SUCCESS;
}
/**
Convert the 64-bit LUN into the hexadecimal encoded LUN string.
@param[in] Lun The 64-bit LUN.
@param[out] Str The storage to return the hexadecimal encoded LUN string.
**/
VOID
IScsiLunToUnicodeStr (
IN UINT8 *Lun,
OUT CHAR16 *Str
)
{
UINTN Index;
CHAR16 *TempStr;
TempStr = Str;
for (Index = 0; Index < 4; Index++) {
if ((Lun[2 * Index] | Lun[2 * Index + 1]) == 0) {
CopyMem(TempStr, L"0-", sizeof (L"0-"));
} else {
TempStr[0] = (CHAR16) IScsiHexString[Lun[2 * Index] >> 4];
TempStr[1] = (CHAR16) IScsiHexString[Lun[2 * Index] & 0x0F];
TempStr[2] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] >> 4];
TempStr[3] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] & 0x0F];
TempStr[4] = L'-';
TempStr[5] = 0;
StrTrim (TempStr, L'0');
}
TempStr += StrLen (TempStr);
}
ASSERT (StrLen(Str) >= 1);
Str[StrLen (Str) - 1] = 0;
for (Index = StrLen (Str) - 1; Index > 1; Index = Index - 2) {
if ((Str[Index] == L'0') && (Str[Index - 1] == L'-')) {
Str[Index - 1] = 0;
} else {
break;
}
}
}
/**
Convert the ASCII string into a UNICODE string.
@param[in] Source The ASCII string.
@param[out] Destination The storage to return the UNICODE string.
@return CHAR16 * Pointer to the UNICODE string.
**/
CHAR16 *
IScsiAsciiStrToUnicodeStr (
IN CHAR8 *Source,
OUT CHAR16 *Destination
)
{
ASSERT (Destination != NULL);
ASSERT (Source != NULL);
while (*Source != '\0') {
*(Destination++) = (CHAR16) *(Source++);
}
*Destination = '\0';
return Destination;
}
/**
Convert the UNICODE string into an ASCII string.
@param[in] Source The UNICODE string.
@param[out] Destination The storage to return the ASCII string.
@return CHAR8 * Pointer to the ASCII string.
**/
CHAR8 *
IScsiUnicodeStrToAsciiStr (
IN CHAR16 *Source,
OUT CHAR8 *Destination
)
{
ASSERT (Destination != NULL);
ASSERT (Source != NULL);
while (*Source != '\0') {
//
// If any Unicode characters in Source contain
// non-zero value in the upper 8 bits, then ASSERT().
//
ASSERT (*Source < 0x100);
*(Destination++) = (CHAR8) *(Source++);
}
*Destination = '\0';
return Destination;
}
/**
Convert the decimal dotted IPv4 address into the binary IPv4 address.
@param[in] Str The UNICODE string.
@param[out] Ip The storage to return the ASCII string.
@retval EFI_SUCCESS The binary IP address is returned in Ip.
@retval EFI_INVALID_PARAMETER The IP string is malformatted.
**/
EFI_STATUS
IScsiAsciiStrToIp (
IN CHAR8 *Str,
OUT EFI_IPv4_ADDRESS *Ip
)
{
UINTN Index;
UINTN Number;
Index = 0;
while (*Str != 0) {
if (Index > 3) {
return EFI_INVALID_PARAMETER;
}
Number = 0;
while (NET_IS_DIGIT (*Str)) {
Number = Number * 10 + (*Str - '0');
Str++;
}
if (Number > 0xFF) {
return EFI_INVALID_PARAMETER;
}
Ip->Addr[Index] = (UINT8) Number;
if ((*Str != '\0') && (*Str != '.')) {
//
// The current character should be either the NULL terminator or
// the dot delimiter.
//
return EFI_INVALID_PARAMETER;
}
if (*Str == '.') {
//
// Skip the delimiter.
//
Str++;
}
Index++;
}
if (Index != 4) {
return EFI_INVALID_PARAMETER;
}
return EFI_SUCCESS;
}
/**
Convert the mac address into a hexadecimal encoded "-" seperated string.
@param[in] Mac The mac address.
@param[in] Len Length in bytes of the mac address.
@param[in] VlanId VLAN ID of the network device.
@param[out] Str The storage to return the mac string.
**/
VOID
IScsiMacAddrToStr (
IN EFI_MAC_ADDRESS *Mac,
IN UINT32 Len,
IN UINT16 VlanId,
OUT CHAR16 *Str
)
{
UINT32 Index;
CHAR16 *String;
for (Index = 0; Index < Len; Index++) {
Str[3 * Index] = (CHAR16) IScsiHexString[(Mac->Addr[Index] >> 4) & 0x0F];
Str[3 * Index + 1] = (CHAR16) IScsiHexString[Mac->Addr[Index] & 0x0F];
Str[3 * Index + 2] = L'-';
}
String = &Str[3 * Index - 1] ;
if (VlanId != 0) {
String += UnicodeSPrint (String, 6 * sizeof (CHAR16), L"\\%04x", (UINTN) VlanId);
}
*String = L'\0';
}
/**
Convert the binary encoded buffer into a hexadecimal encoded string.
@param[in] BinBuffer The buffer containing the binary data.
@param[in] BinLength Length of the binary buffer.
@param[in, out] HexStr Pointer to the string.
@param[in, out] HexLength The length of the string.
@retval EFI_SUCCESS The binary data is converted to the hexadecimal string
and the length of the string is updated.
@retval EFI_BUFFER_TOO_SMALL The string is too small.
@retval EFI_INVALID_PARAMETER The IP string is malformatted.
**/
EFI_STATUS
IScsiBinToHex (
IN UINT8 *BinBuffer,
IN UINT32 BinLength,
IN OUT CHAR8 *HexStr,
IN OUT UINT32 *HexLength
)
{
UINTN Index;
if ((HexStr == NULL) || (BinBuffer == NULL) || (BinLength == 0)) {
return EFI_INVALID_PARAMETER;
}
if (((*HexLength) - 3) < BinLength * 2) {
*HexLength = BinLength * 2 + 3;
return EFI_BUFFER_TOO_SMALL;
}
*HexLength = BinLength * 2 + 3;
//
// Prefix for Hex String
//
HexStr[0] = '0';
HexStr[1] = 'x';
for (Index = 0; Index < BinLength; Index++) {
HexStr[Index * 2 + 2] = IScsiHexString[BinBuffer[Index] >> 4];
HexStr[Index * 2 + 3] = IScsiHexString[BinBuffer[Index] & 0x0F];
}
HexStr[Index * 2 + 2] = '\0';
return EFI_SUCCESS;
}
/**
Convert the hexadecimal string into a binary encoded buffer.
@param[in, out] BinBuffer The binary buffer.
@param[in, out] BinLength Length of the binary buffer.
@param[in] HexStr The hexadecimal string.
@retval EFI_SUCCESS The hexadecimal string is converted into a binary
encoded buffer.
@retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the converted data.
**/
EFI_STATUS
IScsiHexToBin (
IN OUT UINT8 *BinBuffer,
IN OUT UINT32 *BinLength,
IN CHAR8 *HexStr
)
{
UINTN Index;
UINTN Length;
UINT8 Digit;
CHAR8 TemStr[2];
ZeroMem (TemStr, sizeof (TemStr));
//
// Find out how many hex characters the string has.
//
if ((HexStr[0] == '0') && ((HexStr[1] == 'x') || (HexStr[1] == 'X'))) {
HexStr += 2;
}
Length = AsciiStrLen (HexStr);
for (Index = 0; Index < Length; Index ++) {
TemStr[0] = HexStr[Index];
Digit = (UINT8) AsciiStrHexToUint64 (TemStr);
if (Digit == 0 && TemStr[0] != '0') {
//
// Invalid Lun Char
//
break;
}
if ((Index & 1) == 0) {
BinBuffer [Index/2] = Digit;
} else {
BinBuffer [Index/2] = (UINT8) ((BinBuffer [Index/2] << 4) + Digit);
}
}
*BinLength = (UINT32) ((Index + 1)/2);
return EFI_SUCCESS;
}
/**
Generate random numbers.
@param[in, out] Rand The buffer to contain random numbers.
@param[in] RandLength The length of the Rand buffer.
**/
VOID
IScsiGenRandom (
IN OUT UINT8 *Rand,
IN UINTN RandLength
)
{
UINT32 Random;
while (RandLength > 0) {
Random = NET_RANDOM (NetRandomInitSeed ());
*Rand++ = (UINT8) (Random);
RandLength--;
}
}
/**
Create the iSCSI driver data..
@param[in] Image The handle of the driver image.
@param[in] Controller The handle of the controller.
@return The iSCSI driver data created.
@retval NULL Other errors as indicated.
**/
ISCSI_DRIVER_DATA *
IScsiCreateDriverData (
IN EFI_HANDLE Image,
IN EFI_HANDLE Controller
)
{
ISCSI_DRIVER_DATA *Private;
EFI_STATUS Status;
Private = AllocateZeroPool (sizeof (ISCSI_DRIVER_DATA));
if (Private == NULL) {
return NULL;
}
Private->Signature = ISCSI_DRIVER_DATA_SIGNATURE;
Private->Image = Image;
Private->Controller = Controller;
//
// Create an event to be signal when the BS to RT transition is triggerd so
// as to abort the iSCSI session.
//
Status = gBS->CreateEventEx (
EVT_NOTIFY_SIGNAL,
TPL_CALLBACK,
IScsiOnExitBootService,
Private,
&gEfiEventExitBootServicesGuid,
&Private->ExitBootServiceEvent
);
if (EFI_ERROR (Status)) {
FreePool (Private);
return NULL;
}
CopyMem(&Private->IScsiExtScsiPassThru, &gIScsiExtScsiPassThruProtocolTemplate, sizeof(EFI_EXT_SCSI_PASS_THRU_PROTOCOL));
//
// 0 is designated to the TargetId, so use another value for the AdapterId.
//
Private->ExtScsiPassThruMode.AdapterId = 2;
Private->ExtScsiPassThruMode.Attributes = EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL | EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL;
Private->ExtScsiPassThruMode.IoAlign = 4;
Private->IScsiExtScsiPassThru.Mode = &Private->ExtScsiPassThruMode;
//
// Install the Ext SCSI PASS THRU protocol.
//
Status = gBS->InstallProtocolInterface (
&Private->ExtScsiPassThruHandle,
&gEfiExtScsiPassThruProtocolGuid,
EFI_NATIVE_INTERFACE,
&Private->IScsiExtScsiPassThru
);
if (EFI_ERROR (Status)) {
gBS->CloseEvent (Private->ExitBootServiceEvent);
FreePool (Private);
return NULL;
}
IScsiSessionInit (&Private->Session, FALSE);
return Private;
}
/**
Clean the iSCSI driver data.
@param[in] Private The iSCSI driver data.
@retval EFI_SUCCESS The clean operation is successful.
@retval Others Other errors as indicated.
**/
EFI_STATUS
IScsiCleanDriverData (
IN ISCSI_DRIVER_DATA *Private
)
{
EFI_STATUS Status;
Status = EFI_SUCCESS;
if (Private->DevicePath != NULL) {
Status = gBS->UninstallProtocolInterface (
Private->ExtScsiPassThruHandle,
&gEfiDevicePathProtocolGuid,
Private->DevicePath
);
if (EFI_ERROR (Status)) {
goto EXIT;
}
FreePool (Private->DevicePath);
}
if (Private->ExtScsiPassThruHandle != NULL) {
Status = gBS->UninstallProtocolInterface (
Private->ExtScsiPassThruHandle,
&gEfiExtScsiPassThruProtocolGuid,
&Private->IScsiExtScsiPassThru
);
}
EXIT:
if (Private->ExitBootServiceEvent != NULL) {
gBS->CloseEvent (Private->ExitBootServiceEvent);
}
FreePool (Private);
return Status;
}
/**
Check wheather the Controller is configured to use DHCP protocol.
@param[in] Controller The handle of the controller.
@retval TRUE The handle of the controller need the Dhcp protocol.
@retval FALSE The handle of the controller does not need the Dhcp protocol.
**/
BOOLEAN
IScsiDhcpIsConfigured (
IN EFI_HANDLE Controller
)
{
EFI_STATUS Status;
EFI_MAC_ADDRESS MacAddress;
UINTN HwAddressSize;
UINT16 VlanId;
CHAR16 MacString[70];
ISCSI_SESSION_CONFIG_NVDATA *ConfigDataTmp;
//
// Get the mac string, it's the name of various variable
//
Status = NetLibGetMacAddress (Controller, &MacAddress, &HwAddressSize);
if (EFI_ERROR (Status)) {
return FALSE;
}
VlanId = NetLibGetVlanId (Controller);
IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString);
//
// Get the normal configuration.
//
Status = GetVariable2 (
MacString,
&gEfiIScsiInitiatorNameProtocolGuid,
(VOID**)&ConfigDataTmp,
NULL
);
if (ConfigDataTmp == NULL || EFI_ERROR (Status)) {
return FALSE;
}
if (ConfigDataTmp->Enabled && ConfigDataTmp->InitiatorInfoFromDhcp) {
FreePool (ConfigDataTmp);
return TRUE;
}
FreePool (ConfigDataTmp);
return FALSE;
}
/**
Get the various configuration data of this iSCSI instance.
@param[in] Private The iSCSI driver data.
@retval EFI_SUCCESS The configuration of this instance is got.
@retval EFI_ABORTED The operation was aborted.
@retval Others Other errors as indicated.
**/
EFI_STATUS
IScsiGetConfigData (
IN ISCSI_DRIVER_DATA *Private
)
{
EFI_STATUS Status;
ISCSI_SESSION *Session;
UINTN BufferSize;
EFI_MAC_ADDRESS MacAddress;
UINTN HwAddressSize;
UINT16 VlanId;
CHAR16 MacString[70];
//
// get the iSCSI Initiator Name
//
Session = &Private->Session;
Session->InitiatorNameLength = ISCSI_NAME_MAX_SIZE;
Status = gIScsiInitiatorName.Get (
&gIScsiInitiatorName,
&Session->InitiatorNameLength,
Session->InitiatorName
);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Get the mac string, it's the name of various variable
//
Status = NetLibGetMacAddress (Private->Controller, &MacAddress, &HwAddressSize);
ASSERT (Status == EFI_SUCCESS);
VlanId = NetLibGetVlanId (Private->Controller);
IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString);
//
// Get the normal configuration.
//
BufferSize = sizeof (Session->ConfigData.NvData);
Status = gRT->GetVariable (
MacString,
&gEfiIScsiInitiatorNameProtocolGuid,
NULL,
&BufferSize,
&Session->ConfigData.NvData
);
if (EFI_ERROR (Status)) {
return Status;
}
if (!Session->ConfigData.NvData.Enabled) {
return EFI_ABORTED;
}
//
// Get the CHAP Auth information.
//
BufferSize = sizeof (Session->AuthData.AuthConfig);
Status = gRT->GetVariable (
MacString,
&gIScsiCHAPAuthInfoGuid,
NULL,
&BufferSize,
&Session->AuthData.AuthConfig
);
if (!EFI_ERROR (Status) && Session->ConfigData.NvData.InitiatorInfoFromDhcp) {
//
// Start dhcp.
//
Status = IScsiDoDhcp (Private->Image, Private->Controller, &Session->ConfigData);
}
return Status;
}
/**
Get the device path of the iSCSI tcp connection and update it.
@param[in] Private The iSCSI driver data.
@return The updated device path.
@retval NULL Other errors as indicated.
**/
EFI_DEVICE_PATH_PROTOCOL *
IScsiGetTcpConnDevicePath (
IN ISCSI_DRIVER_DATA *Private
)
{
ISCSI_SESSION *Session;
ISCSI_CONNECTION *Conn;
TCP4_IO *Tcp4Io;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
EFI_STATUS Status;
EFI_DEV_PATH *DPathNode;
Session = &Private->Session;
if (Session->State != SESSION_STATE_LOGGED_IN) {
return NULL;
}
Conn = NET_LIST_USER_STRUCT_S (
Session->Conns.ForwardLink,
ISCSI_CONNECTION,
Link,
ISCSI_CONNECTION_SIGNATURE
);
Tcp4Io = &Conn->Tcp4Io;
Status = gBS->HandleProtocol (
Tcp4Io->Handle,
&gEfiDevicePathProtocolGuid,
(VOID **)&DevicePath
);
if (EFI_ERROR (Status)) {
return NULL;
}
//
// Duplicate it.
//
DevicePath = DuplicateDevicePath (DevicePath);
if (DevicePath == NULL) {
return NULL;
}
DPathNode = (EFI_DEV_PATH *) DevicePath;
while (!IsDevicePathEnd (&DPathNode->DevPath)) {
if ((DevicePathType (&DPathNode->DevPath) == MESSAGING_DEVICE_PATH) &&
(DevicePathSubType (&DPathNode->DevPath) == MSG_IPv4_DP)
) {
DPathNode->Ipv4.LocalPort = 0;
DPathNode->Ipv4.StaticIpAddress =
(BOOLEAN) (!Session->ConfigData.NvData.InitiatorInfoFromDhcp);
//
// Add a judgement here to support previous versions of IPv4_DEVICE_PATH.
// In previous versions of IPv4_DEVICE_PATH, GatewayIpAddress and SubnetMask
// do not exist.
// In new version of IPv4_DEVICE_PATH, structcure length is 27.
//
if (DevicePathNodeLength (&DPathNode->Ipv4) == IP4_NODE_LEN_NEW_VERSIONS) {
IP4_COPY_ADDRESS (
&DPathNode->Ipv4.GatewayIpAddress,
&Session->ConfigData.NvData.Gateway
);
IP4_COPY_ADDRESS (
&DPathNode->Ipv4.SubnetMask,
&Session->ConfigData.NvData.SubnetMask
);
}
break;
}
DPathNode = (EFI_DEV_PATH *) NextDevicePathNode (&DPathNode->DevPath);
}
return DevicePath;
}
/**
Abort the session when the transition from BS to RT is initiated.
@param[in] Event The event signaled.
@param[in] Context The iSCSI driver data.
**/
VOID
EFIAPI
IScsiOnExitBootService (
IN EFI_EVENT Event,
IN VOID *Context
)
{
ISCSI_DRIVER_DATA *Private;
Private = (ISCSI_DRIVER_DATA *) Context;
gBS->CloseEvent (Private->ExitBootServiceEvent);
Private->ExitBootServiceEvent = NULL;
IScsiSessionAbort (&Private->Session);
}
/**
Tests whether a controller handle is being managed by IScsi driver.
This function tests whether the driver specified by DriverBindingHandle is
currently managing the controller specified by ControllerHandle. This test
is performed by evaluating if the the protocol specified by ProtocolGuid is
present on ControllerHandle and is was opened by DriverBindingHandle and Nic
Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER.
If ProtocolGuid is NULL, then ASSERT().
@param ControllerHandle A handle for a controller to test.
@param DriverBindingHandle Specifies the driver binding handle for the
driver.
@param ProtocolGuid Specifies the protocol that the driver specified
by DriverBindingHandle opens in its Start()
function.
@retval EFI_SUCCESS ControllerHandle is managed by the driver
specified by DriverBindingHandle.
@retval EFI_UNSUPPORTED ControllerHandle is not managed by the driver
specified by DriverBindingHandle.
**/
EFI_STATUS
EFIAPI
IScsiTestManagedDevice (
IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE DriverBindingHandle,
IN EFI_GUID *ProtocolGuid
)
{
EFI_STATUS Status;
VOID *ManagedInterface;
EFI_HANDLE NicControllerHandle;
ASSERT (ProtocolGuid != NULL);
NicControllerHandle = NetLibGetNicHandle (ControllerHandle, ProtocolGuid);
if (NicControllerHandle == NULL) {
return EFI_UNSUPPORTED;
}
Status = gBS->OpenProtocol (
ControllerHandle,
(EFI_GUID *) ProtocolGuid,
&ManagedInterface,
DriverBindingHandle,
NicControllerHandle,
EFI_OPEN_PROTOCOL_BY_DRIVER
);
if (!EFI_ERROR (Status)) {
gBS->CloseProtocol (
ControllerHandle,
(EFI_GUID *) ProtocolGuid,
DriverBindingHandle,
NicControllerHandle
);
return EFI_UNSUPPORTED;
}
if (Status != EFI_ALREADY_STARTED) {
return EFI_UNSUPPORTED;
}
return EFI_SUCCESS;
}

View File

@ -1,317 +0,0 @@
/** @file
Miscellaneous definitions for iSCSI driver.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _ISCSI_MISC_H_
#define _ISCSI_MISC_H_
#include <Library/BaseLib.h>
typedef struct _ISCSI_SESSION_CONFIG_DATA ISCSI_SESSION_CONFIG_DATA;
///
/// IPv4 Device Path Node Length
///
#define IP4_NODE_LEN_NEW_VERSIONS 27
#pragma pack(1)
typedef struct {
BOOLEAN Enabled;
BOOLEAN InitiatorInfoFromDhcp;
EFI_IPv4_ADDRESS LocalIp;
EFI_IPv4_ADDRESS SubnetMask;
EFI_IPv4_ADDRESS Gateway;
BOOLEAN TargetInfoFromDhcp;
CHAR8 TargetName[ISCSI_NAME_MAX_SIZE];
EFI_IPv4_ADDRESS TargetIp;
UINT16 TargetPort;
UINT8 BootLun[8];
UINT8 IsId[6];
} ISCSI_SESSION_CONFIG_NVDATA;
#pragma pack()
struct _ISCSI_SESSION_CONFIG_DATA {
ISCSI_SESSION_CONFIG_NVDATA NvData;
EFI_IPv4_ADDRESS PrimaryDns;
EFI_IPv4_ADDRESS SecondaryDns;
EFI_IPv4_ADDRESS DhcpServer;
};
/**
Calculate the prefix length of the IPv4 subnet mask.
@param[in] SubnetMask The IPv4 subnet mask.
@return The prefix length of the subnet mask.
@retval 0 Other errors as indicated.
**/
UINT8
IScsiGetSubnetMaskPrefixLength (
IN EFI_IPv4_ADDRESS *SubnetMask
);
/**
Convert the hexadecimal encoded LUN string into the 64-bit LUN.
@param[in] Str The hexadecimal encoded LUN string.
@param[out] Lun Storage to return the 64-bit LUN.
@retval EFI_SUCCESS The 64-bit LUN is stored in Lun.
@retval EFI_INVALID_PARAMETER The string is malformatted.
**/
EFI_STATUS
IScsiAsciiStrToLun (
IN CHAR8 *Str,
OUT UINT8 *Lun
);
/**
Convert the 64-bit LUN into the hexadecimal encoded LUN string.
@param[in] Lun The 64-bit LUN.
@param[out] Str The storage to return the hexadecimal encoded LUN string.
**/
VOID
IScsiLunToUnicodeStr (
IN UINT8 *Lun,
OUT CHAR16 *Str
);
/**
Convert the ASCII string into a UNICODE string.
@param[in] Source The ASCII string.
@param[out] Destination The storage to return the UNICODE string.
@return CHAR16 * Pointer to the UNICODE string.
**/
CHAR16 *
IScsiAsciiStrToUnicodeStr (
IN CHAR8 *Source,
OUT CHAR16 *Destination
);
/**
Convert the UNICODE string into an ASCII string.
@param[in] Source The UNICODE string.
@param[out] Destination The storage to return the ASCII string.
@return CHAR8 * Pointer to the ASCII string.
**/
CHAR8 *
IScsiUnicodeStrToAsciiStr (
IN CHAR16 *Source,
OUT CHAR8 *Destination
);
/**
Convert the mac address into a hexadecimal encoded "-" seperated string.
@param[in] Mac The mac address.
@param[in] Len Length in bytes of the mac address.
@param[in] VlanId VLAN ID of the network device.
@param[out] Str The storage to return the mac string.
**/
VOID
IScsiMacAddrToStr (
IN EFI_MAC_ADDRESS *Mac,
IN UINT32 Len,
IN UINT16 VlanId,
OUT CHAR16 *Str
);
/**
Convert the decimal dotted IPv4 address into the binary IPv4 address.
@param[in] Str The UNICODE string.
@param[out] Ip The storage to return the ASCII string.
@retval EFI_SUCCESS The binary IP address is returned in Ip.
@retval EFI_INVALID_PARAMETER The IP string is malformatted.
**/
EFI_STATUS
IScsiAsciiStrToIp (
IN CHAR8 *Str,
OUT EFI_IPv4_ADDRESS *Ip
);
/**
Convert the binary encoded buffer into a hexadecimal encoded string.
@param[in] BinBuffer The buffer containing the binary data.
@param[in] BinLength Length of the binary buffer.
@param[in, out] HexStr Pointer to the string.
@param[in, out] HexLength The length of the string.
@retval EFI_SUCCESS The binary data is converted to the hexadecimal string
and the length of the string is updated.
@retval EFI_BUFFER_TOO_SMALL The string is too small.
@retval EFI_INVALID_PARAMETER The IP string is malformatted.
**/
EFI_STATUS
IScsiBinToHex (
IN UINT8 *BinBuffer,
IN UINT32 BinLength,
IN OUT CHAR8 *HexStr,
IN OUT UINT32 *HexLength
);
/**
Convert the hexadecimal string into a binary encoded buffer.
@param[in, out] BinBuffer The binary buffer.
@param[in, out] BinLength Length of the binary buffer.
@param[in] HexStr The hexadecimal string.
@retval EFI_SUCCESS The hexadecimal string is converted into a binary
encoded buffer.
@retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the converted data.
**/
EFI_STATUS
IScsiHexToBin (
IN OUT UINT8 *BinBuffer,
IN OUT UINT32 *BinLength,
IN CHAR8 *HexStr
);
/**
Generate random numbers.
@param[in, out] Rand The buffer to contain random numbers.
@param[in] RandLength The length of the Rand buffer.
**/
VOID
IScsiGenRandom (
IN OUT UINT8 *Rand,
IN UINTN RandLength
);
/**
Create the iSCSI driver data..
@param[in] Image The handle of the driver image.
@param[in] Controller The handle of the controller.
@return The iSCSI driver data created.
@retval NULL Other errors as indicated.
**/
ISCSI_DRIVER_DATA *
IScsiCreateDriverData (
IN EFI_HANDLE Image,
IN EFI_HANDLE Controller
);
/**
Clean the iSCSI driver data.
@param[in] Private The iSCSI driver data.
@retval EFI_SUCCES The clean operation is successful.
@retval Others Other errors as indicated.
**/
EFI_STATUS
IScsiCleanDriverData (
IN ISCSI_DRIVER_DATA *Private
);
/**
Check wheather the Controller is configured to use DHCP protocol.
@param[in] Controller The handle of the controller.
@retval TRUE The handle of the controller need the Dhcp protocol.
@retval FALSE The handle of the controller does not need the Dhcp protocol.
**/
BOOLEAN
IScsiDhcpIsConfigured (
IN EFI_HANDLE Controller
);
/**
Get the various configuration data of this iSCSI instance.
@param[in] Private The iSCSI driver data.
@retval EFI_SUCCESS The configuration of this instance is got.
@retval EFI_ABORTED The operation was aborted.
@retval Others Other errors as indicated.
**/
EFI_STATUS
IScsiGetConfigData (
IN ISCSI_DRIVER_DATA *Private
);
/**
Get the device path of the iSCSI tcp connection and update it.
@param[in] Private The iSCSI driver data.
@return The updated device path.
@retval NULL Other errors as indicated.
**/
EFI_DEVICE_PATH_PROTOCOL *
IScsiGetTcpConnDevicePath (
IN ISCSI_DRIVER_DATA *Private
);
/**
Abort the session when the transition from BS to RT is initiated.
@param[in] Event The event signaled.
@param[in] Context The iSCSI driver data.
**/
VOID
EFIAPI
IScsiOnExitBootService (
IN EFI_EVENT Event,
IN VOID *Context
);
/**
Tests whether a controller handle is being managed by IScsi driver.
This function tests whether the driver specified by DriverBindingHandle is
currently managing the controller specified by ControllerHandle. This test
is performed by evaluating if the the protocol specified by ProtocolGuid is
present on ControllerHandle and is was opened by DriverBindingHandle and Nic
Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER.
If ProtocolGuid is NULL, then ASSERT().
@param ControllerHandle A handle for a controller to test.
@param DriverBindingHandle Specifies the driver binding handle for the
driver.
@param ProtocolGuid Specifies the protocol that the driver specified
by DriverBindingHandle opens in its Start()
function.
@retval EFI_SUCCESS ControllerHandle is managed by the driver
specified by DriverBindingHandle.
@retval EFI_UNSUPPORTED ControllerHandle is not managed by the driver
specified by DriverBindingHandle.
**/
EFI_STATUS
EFIAPI
IScsiTestManagedDevice (
IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE DriverBindingHandle,
IN EFI_GUID *ProtocolGuid
);
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,487 +0,0 @@
/** @file
The wrap of TCP/IP Socket interface.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include "IScsiImpl.h"
/**
The common notify function associated with various Tcp4Io events.
@param[in] Event The event signaled.
@param[in] Context The context.
**/
VOID
EFIAPI
Tcp4IoCommonNotify (
IN EFI_EVENT Event,
IN VOID *Context
)
{
*((BOOLEAN *) Context) = TRUE;
}
/**
Create a TCP socket with the specified configuration data.
@param[in] Image The handle of the driver image.
@param[in] Controller The handle of the controller.
@param[in] ConfigData The Tcp4 configuration data.
@param[in] Tcp4Io The Tcp4Io.
@retval EFI_SUCCESS The TCP socket is created and configured.
@retval Others Failed to create the TCP socket or configure it.
**/
EFI_STATUS
Tcp4IoCreateSocket (
IN EFI_HANDLE Image,
IN EFI_HANDLE Controller,
IN TCP4_IO_CONFIG_DATA *ConfigData,
IN TCP4_IO *Tcp4Io
)
{
EFI_STATUS Status;
EFI_TCP4_PROTOCOL *Tcp4;
EFI_TCP4_CONFIG_DATA Tcp4ConfigData;
EFI_TCP4_OPTION ControlOption;
EFI_TCP4_ACCESS_POINT *AccessPoint;
Tcp4Io->Handle = NULL;
Tcp4Io->ConnToken.CompletionToken.Event = NULL;
Tcp4Io->TxToken.CompletionToken.Event = NULL;
Tcp4Io->RxToken.CompletionToken.Event = NULL;
Tcp4Io->CloseToken.CompletionToken.Event = NULL;
Tcp4 = NULL;
//
// Create the TCP4 child instance and get the TCP4 protocol.
//
Status = NetLibCreateServiceChild (
Controller,
Image,
&gEfiTcp4ServiceBindingProtocolGuid,
&Tcp4Io->Handle
);
if (EFI_ERROR (Status)) {
return Status;
}
Status = gBS->OpenProtocol (
Tcp4Io->Handle,
&gEfiTcp4ProtocolGuid,
(VOID **)&Tcp4Io->Tcp4,
Image,
Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER
);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
Tcp4Io->Image = Image;
Tcp4Io->Controller = Controller;
Tcp4 = Tcp4Io->Tcp4;
//
// Set the configuration parameters.
//
ControlOption.ReceiveBufferSize = 0x200000;
ControlOption.SendBufferSize = 0x200000;
ControlOption.MaxSynBackLog = 0;
ControlOption.ConnectionTimeout = 0;
ControlOption.DataRetries = 6;
ControlOption.FinTimeout = 0;
ControlOption.TimeWaitTimeout = 0;
ControlOption.KeepAliveProbes = 4;
ControlOption.KeepAliveTime = 0;
ControlOption.KeepAliveInterval = 0;
ControlOption.EnableNagle = FALSE;
ControlOption.EnableTimeStamp = FALSE;
ControlOption.EnableWindowScaling = TRUE;
ControlOption.EnableSelectiveAck = FALSE;
ControlOption.EnablePathMtuDiscovery = FALSE;
Tcp4ConfigData.TypeOfService = 8;
Tcp4ConfigData.TimeToLive = 255;
Tcp4ConfigData.ControlOption = &ControlOption;
AccessPoint = &Tcp4ConfigData.AccessPoint;
AccessPoint->UseDefaultAddress = FALSE;
AccessPoint->StationPort = 0;
AccessPoint->RemotePort = ConfigData->RemotePort;
AccessPoint->ActiveFlag = TRUE;
CopyMem (&AccessPoint->StationAddress, &ConfigData->LocalIp, sizeof (EFI_IPv4_ADDRESS));
CopyMem (&AccessPoint->SubnetMask, &ConfigData->SubnetMask, sizeof (EFI_IPv4_ADDRESS));
CopyMem (&AccessPoint->RemoteAddress, &ConfigData->RemoteIp, sizeof (EFI_IPv4_ADDRESS));
//
// Configure the TCP4 protocol.
//
Status = Tcp4->Configure (Tcp4, &Tcp4ConfigData);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
if (!EFI_IP4_EQUAL (&ConfigData->Gateway, &mZeroIp4Addr)) {
//
// the gateway is not zero, add the default route by hand
//
Status = Tcp4->Routes (Tcp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, &ConfigData->Gateway);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
}
//
// Create events for variuos asynchronous operations.
//
Status = gBS->CreateEvent (
EVT_NOTIFY_SIGNAL,
TPL_NOTIFY,
Tcp4IoCommonNotify,
&Tcp4Io->IsConnDone,
&Tcp4Io->ConnToken.CompletionToken.Event
);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
Status = gBS->CreateEvent (
EVT_NOTIFY_SIGNAL,
TPL_NOTIFY,
Tcp4IoCommonNotify,
&Tcp4Io->IsTxDone,
&Tcp4Io->TxToken.CompletionToken.Event
);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
Status = gBS->CreateEvent (
EVT_NOTIFY_SIGNAL,
TPL_NOTIFY,
Tcp4IoCommonNotify,
&Tcp4Io->IsRxDone,
&Tcp4Io->RxToken.CompletionToken.Event
);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
Status = gBS->CreateEvent (
EVT_NOTIFY_SIGNAL,
TPL_NOTIFY,
Tcp4IoCommonNotify,
&Tcp4Io->IsCloseDone,
&Tcp4Io->CloseToken.CompletionToken.Event
);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
Tcp4Io->IsTxDone = FALSE;
Tcp4Io->IsRxDone = FALSE;
return EFI_SUCCESS;
ON_ERROR:
if (Tcp4Io->RxToken.CompletionToken.Event != NULL) {
gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event);
}
if (Tcp4Io->TxToken.CompletionToken.Event != NULL) {
gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event);
}
if (Tcp4Io->ConnToken.CompletionToken.Event != NULL) {
gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event);
}
if (Tcp4 != NULL) {
Tcp4->Configure (Tcp4, NULL);
gBS->CloseProtocol (
Tcp4Io->Handle,
&gEfiTcp4ProtocolGuid,
Image,
Controller
);
}
NetLibDestroyServiceChild (
Controller,
Image,
&gEfiTcp4ServiceBindingProtocolGuid,
Tcp4Io->Handle
);
return Status;
}
/**
Destroy the socket.
@param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyeds.
**/
VOID
Tcp4IoDestroySocket (
IN TCP4_IO *Tcp4Io
)
{
EFI_TCP4_PROTOCOL *Tcp4;
Tcp4 = Tcp4Io->Tcp4;
Tcp4->Configure (Tcp4, NULL);
gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event);
gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event);
gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event);
gBS->CloseProtocol (
Tcp4Io->Handle,
&gEfiTcp4ProtocolGuid,
Tcp4Io->Image,
Tcp4Io->Controller
);
NetLibDestroyServiceChild (
Tcp4Io->Controller,
Tcp4Io->Image,
&gEfiTcp4ServiceBindingProtocolGuid,
Tcp4Io->Handle
);
}
/**
Connect to the other endpoint of the TCP socket.
@param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket.
@param[in] Timeout The time to wait for connection done.
@retval EFI_SUCCESS Connect to the other endpoint of the TCP socket successfully.
@retval EFI_TIMEOUT Failed to connect to the other endpoint of the TCP socket in the specified time period.
@retval Others Other errors as indicated.
**/
EFI_STATUS
Tcp4IoConnect (
IN OUT TCP4_IO *Tcp4Io,
IN EFI_EVENT Timeout
)
{
EFI_TCP4_PROTOCOL *Tcp4;
EFI_STATUS Status;
Tcp4Io->IsConnDone = FALSE;
Tcp4 = Tcp4Io->Tcp4;
Status = Tcp4->Connect (Tcp4, &Tcp4Io->ConnToken);
if (EFI_ERROR (Status)) {
return Status;
}
while (!Tcp4Io->IsConnDone && EFI_ERROR (gBS->CheckEvent (Timeout))) {
Tcp4->Poll (Tcp4);
}
if (!Tcp4Io->IsConnDone) {
Status = EFI_TIMEOUT;
} else {
Status = Tcp4Io->ConnToken.CompletionToken.Status;
}
return Status;
}
/**
Reset the socket.
@param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket.
**/
VOID
Tcp4IoReset (
IN OUT TCP4_IO *Tcp4Io
)
{
EFI_STATUS Status;
EFI_TCP4_PROTOCOL *Tcp4;
Tcp4Io->CloseToken.AbortOnClose = TRUE;
Tcp4Io->IsCloseDone = FALSE;
Tcp4 = Tcp4Io->Tcp4;
Status = Tcp4->Close (Tcp4, &Tcp4Io->CloseToken);
if (EFI_ERROR (Status)) {
return ;
}
while (!Tcp4Io->IsCloseDone) {
Tcp4->Poll (Tcp4);
}
}
/**
Transmit the Packet to the other endpoint of the socket.
@param[in] Tcp4Io The Tcp4Io wrapping the TCP socket.
@param[in] Packet The packet to transmit.
@retval EFI_SUCCESS The packet is trasmitted.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
@retval Others Other errors as indicated.
**/
EFI_STATUS
Tcp4IoTransmit (
IN TCP4_IO *Tcp4Io,
IN NET_BUF *Packet
)
{
EFI_TCP4_TRANSMIT_DATA *TxData;
EFI_TCP4_PROTOCOL *Tcp4;
EFI_STATUS Status;
TxData = AllocatePool (sizeof (EFI_TCP4_TRANSMIT_DATA) + (Packet->BlockOpNum - 1) * sizeof (EFI_TCP4_FRAGMENT_DATA));
if (TxData == NULL) {
return EFI_OUT_OF_RESOURCES;
}
TxData->Push = TRUE;
TxData->Urgent = FALSE;
TxData->DataLength = Packet->TotalSize;
//
// Build the fragment table.
//
TxData->FragmentCount = Packet->BlockOpNum;
NetbufBuildExt (Packet, (NET_FRAGMENT *) &TxData->FragmentTable[0], &TxData->FragmentCount);
Tcp4Io->TxToken.Packet.TxData = TxData;
//
// Trasnmit the packet.
//
Tcp4 = Tcp4Io->Tcp4;
Status = Tcp4->Transmit (Tcp4, &Tcp4Io->TxToken);
if (EFI_ERROR (Status)) {
goto ON_EXIT;
}
while (!Tcp4Io->IsTxDone) {
Tcp4->Poll (Tcp4);
}
Tcp4Io->IsTxDone = FALSE;
Status = Tcp4Io->TxToken.CompletionToken.Status;
ON_EXIT:
FreePool (TxData);
return Status;
}
/**
Receive data from the socket.
@param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyed.
@param[in] Packet The buffer to hold the data copy from the soket rx buffer.
@param[in] AsyncMode Is this receive asyncronous or not.
@param[in] Timeout The time to wait for receiving the amount of data the Packet
can hold.
@retval EFI_SUCCESS The required amount of data is received from the socket.
@retval EFI_OUT_OF_RESOURCES Failed to allocate momery.
@retval EFI_TIMEOUT Failed to receive the required amount of data in the
specified time period.
@retval Others Other errors as indicated.
**/
EFI_STATUS
Tcp4IoReceive (
IN TCP4_IO *Tcp4Io,
IN NET_BUF *Packet,
IN BOOLEAN AsyncMode,
IN EFI_EVENT Timeout
)
{
EFI_TCP4_PROTOCOL *Tcp4;
EFI_TCP4_RECEIVE_DATA RxData;
EFI_STATUS Status;
NET_FRAGMENT *Fragment;
UINT32 FragmentCount;
UINT32 CurrentFragment;
FragmentCount = Packet->BlockOpNum;
Fragment = AllocatePool (FragmentCount * sizeof (NET_FRAGMENT));
if (Fragment == NULL) {
return EFI_OUT_OF_RESOURCES;
}
//
// Build the fragment table.
//
NetbufBuildExt (Packet, Fragment, &FragmentCount);
RxData.FragmentCount = 1;
Tcp4Io->RxToken.Packet.RxData = &RxData;
CurrentFragment = 0;
Tcp4 = Tcp4Io->Tcp4;
Status = EFI_SUCCESS;
while (CurrentFragment < FragmentCount) {
RxData.DataLength = Fragment[CurrentFragment].Len;
RxData.FragmentTable[0].FragmentLength = Fragment[CurrentFragment].Len;
RxData.FragmentTable[0].FragmentBuffer = Fragment[CurrentFragment].Bulk;
Status = Tcp4->Receive (Tcp4, &Tcp4Io->RxToken);
if (EFI_ERROR (Status)) {
goto ON_EXIT;
}
while (!Tcp4Io->IsRxDone && ((Timeout == NULL) || EFI_ERROR (gBS->CheckEvent (Timeout)))) {
//
// Poll until some data is received or something error happens.
//
Tcp4->Poll (Tcp4);
}
if (!Tcp4Io->IsRxDone) {
//
// Timeout occurs, cancel the receive request.
//
Tcp4->Cancel (Tcp4, &Tcp4Io->RxToken.CompletionToken);
Status = EFI_TIMEOUT;
goto ON_EXIT;
} else {
Tcp4Io->IsRxDone = FALSE;
}
if (EFI_ERROR (Tcp4Io->RxToken.CompletionToken.Status)) {
Status = Tcp4Io->RxToken.CompletionToken.Status;
goto ON_EXIT;
}
Fragment[CurrentFragment].Len -= RxData.FragmentTable[0].FragmentLength;
if (Fragment[CurrentFragment].Len == 0) {
CurrentFragment++;
} else {
Fragment[CurrentFragment].Bulk += RxData.FragmentTable[0].FragmentLength;
}
}
ON_EXIT:
Tcp4Io->RxToken.Packet.RxData = NULL;
FreePool (Fragment);
return Status;
}

View File

@ -1,142 +0,0 @@
/** @file
iSCSI Tcp4 IO related definitions.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _ISCSI_TCP4_IO_H_
#define _ISCSI_TCP4_IO_H_
#include <Library/NetLib.h>
#include <Protocol/Tcp4.h>
typedef struct _TCP4_IO_CONFIG_DATA {
EFI_IPv4_ADDRESS LocalIp;
EFI_IPv4_ADDRESS SubnetMask;
EFI_IPv4_ADDRESS Gateway;
EFI_IPv4_ADDRESS RemoteIp;
UINT16 RemotePort;
} TCP4_IO_CONFIG_DATA;
typedef struct _TCP4_IO {
EFI_HANDLE Image;
EFI_HANDLE Controller;
EFI_HANDLE Handle;
EFI_TCP4_PROTOCOL *Tcp4;
EFI_TCP4_CONNECTION_TOKEN ConnToken;
EFI_TCP4_IO_TOKEN TxToken;
EFI_TCP4_IO_TOKEN RxToken;
EFI_TCP4_CLOSE_TOKEN CloseToken;
BOOLEAN IsConnDone;
BOOLEAN IsTxDone;
BOOLEAN IsRxDone;
BOOLEAN IsCloseDone;
} TCP4_IO;
/**
Create a TCP socket with the specified configuration data.
@param[in] Image The handle of the driver image.
@param[in] Controller The handle of the controller.
@param[in] ConfigData The Tcp4 configuration data.
@param[in] Tcp4Io The Tcp4Io.
@retval EFI_SUCCESS The TCP socket is created and configured.
@retval Others Failed to create the TCP socket or configure it.
**/
EFI_STATUS
Tcp4IoCreateSocket (
IN EFI_HANDLE Image,
IN EFI_HANDLE Controller,
IN TCP4_IO_CONFIG_DATA *ConfigData,
IN TCP4_IO *Tcp4Io
);
/**
Destroy the socket.
@param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyeds.
**/
VOID
Tcp4IoDestroySocket (
IN TCP4_IO *Tcp4Io
);
/**
Connect to the other endpoint of the TCP socket.
@param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket.
@param[in] Timeout The time to wait for connection done.
@retval EFI_SUCCESS Connect to the other endpoint of the TCP socket successfully.
@retval EFI_TIMEOUT Failed to connect to the other endpoint of the TCP socket in the specified time period.
@retval Others Other errors as indicated.
**/
EFI_STATUS
Tcp4IoConnect (
IN OUT TCP4_IO *Tcp4Io,
IN EFI_EVENT Timeout
);
/**
Reset the socket.
@param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket.
**/
VOID
Tcp4IoReset (
IN OUT TCP4_IO *Tcp4Io
);
/**
Transmit the Packet to the other endpoint of the socket.
@param[in] Tcp4Io The Tcp4Io wrapping the TCP socket.
@param[in] Packet The packet to transmit.
@retval EFI_SUCCESS The packet is trasmitted.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
@retval Others Other errors as indicated.
**/
EFI_STATUS
Tcp4IoTransmit (
IN TCP4_IO *Tcp4Io,
IN NET_BUF *Packet
);
/**
Receive data from the socket.
@param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyed.
@param[in] Packet The buffer to hold the data copy from the soket rx buffer.
@param[in] AsyncMode Is this receive asyncronous or not.
@param[in] Timeout The time to wait for receiving the amount of data the Packet
can hold.
@retval EFI_SUCCESS The required amount of data is received from the socket.
@retval EFI_OUT_OF_RESOURCES Failed to allocate momery.
@retval EFI_TIMEOUT Failed to receive the required amount of data in the
specified time period.
@retval Others Other errors as indicated.
**/
EFI_STATUS
Tcp4IoReceive (
IN TCP4_IO *Tcp4Io,
IN NET_BUF *Packet,
IN BOOLEAN AsyncMode,
IN EFI_EVENT Timeout
);
#endif

View File

@ -1,350 +0,0 @@
/** @file
Implementation of MD5 algorithm.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include "Md5.h"
CONST UINT32 Md5_Data[][2] = {
{ 0, 1 },
{ 1, 5 },
{ 5, 3 },
{ 0, 7 }
};
CONST UINT32 Md5_S[][4] = {
{ 7, 22, 17, 12 },
{ 5, 20, 14, 9 },
{ 4, 23, 16 ,11 },
{ 6, 21, 15, 10 },
};
CONST UINT32 Md5_T[] = {
0xD76AA478, 0xE8C7B756, 0x242070DB, 0xC1BDCEEE,
0xF57C0FAF, 0x4787C62A, 0xA8304613, 0xFD469501,
0x698098D8, 0x8B44F7AF, 0xFFFF5BB1, 0x895CD7BE,
0x6B901122, 0xFD987193, 0xA679438E, 0x49B40821,
0xF61E2562, 0xC040B340, 0x265E5A51, 0xE9B6C7AA,
0xD62F105D, 0x02441453, 0xD8A1E681, 0xE7D3FBC8,
0x21E1CDE6, 0xC33707D6, 0xF4D50D87, 0x455A14ED,
0xA9E3E905, 0xFCEFA3F8, 0x676F02D9, 0x8D2A4C8A,
0xFFFA3942, 0x8771F681, 0x6D9D6122, 0xFDE5380C,
0xA4BEEA44, 0x4BDECFA9, 0xF6BB4B60, 0xBEBFBC70,
0x289B7EC6, 0xEAA127FA, 0xD4EF3085, 0x04881D05,
0xD9D4D039, 0xE6DB99E5, 0x1FA27CF8, 0xC4AC5665,
0xF4292244, 0x432AFF97, 0xAB9423A7, 0xFC93A039,
0x655B59C3, 0x8F0CCC92, 0xFFEFF47D, 0x85845DD1,
0x6FA87E4F, 0xFE2CE6E0, 0xA3014314, 0x4E0811A1,
0xF7537E82, 0xBD3AF235, 0x2AD7D2BB, 0xEB86D391
};
CONST UINT8 Md5HashPadding[] =
{
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
//
// ROTATE_LEFT rotates x left n bits.
//
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
#define SA MedStates[Index2 & 3]
#define SB MedStates[(Index2 + 1) & 3]
#define SC MedStates[(Index2 + 2) & 3]
#define SD MedStates[(Index2 + 3) & 3]
/**
Tf1 is one basic MD5 transform function.
@param[in] A A 32-bit quantity.
@param[in] B A 32-bit quantity.
@param[in] C A 32-bit quantity.
@return Output was produced as a 32-bit quantity based on the
three 32-bit input quantity.
**/
UINT32
Tf1 (
IN UINT32 A,
IN UINT32 B,
IN UINT32 C
)
{
return (A & B) | (~A & C);
}
/**
Tf2 is one basic MD5 transform function.
@param[in] A A 32-bit quantity.
@param[in] B A 32-bit quantity.
@param[in] C A 32-bit quantity.
@return Output was produced as a 32-bit quantity based on the
three 32-bit input quantity.
**/
UINT32
Tf2 (
IN UINT32 A,
IN UINT32 B,
IN UINT32 C
)
{
return (A & C) | (B & ~C);
}
/**
Tf3 is one basic MD5 transform function.
@param[in] A A 32-bit quantity.
@param[in] B A 32-bit quantity.
@param[in] C A 32-bit quantity.
@return Output was produced as a 32-bit quantity based on the
three 32-bit input quantity.
**/
UINT32
Tf3 (
IN UINT32 A,
IN UINT32 B,
IN UINT32 C
)
{
return A ^ B ^ C;
}
/**
Tf4 is one basic MD5 transform function.
@param[in] A A 32-bit quantity.
@param[in] B A 32-bit quantity.
@param[in] C A 32-bit quantity.
@return Output was produced as a 32-bit quantity based on the
three 32-bit input quantity.
**/
UINT32
Tf4 (
IN UINT32 A,
IN UINT32 B,
IN UINT32 C
)
{
return B ^ (A | ~C);
}
typedef
UINT32
(*MD5_TRANSFORM_FUNC) (
IN UINT32 A,
IN UINT32 B,
IN UINT32 C
);
CONST MD5_TRANSFORM_FUNC Md5_F[] = {
Tf1,
Tf2,
Tf3,
Tf4
};
/**
Perform the MD5 transform on 64 bytes data segment.
@param[in, out] Md5Ctx It includes the data segment for Md5 transform.
**/
VOID
MD5Transform (
IN OUT MD5_CTX *Md5Ctx
)
{
UINT32 Index1;
UINT32 Index2;
UINT32 MedStates[MD5_HASHSIZE >> 2];
UINT32 *Data;
UINT32 IndexD;
UINT32 IndexT;
Data = (UINT32 *) Md5Ctx->M;
//
// Copy MD5 states to MedStates
//
CopyMem (MedStates, Md5Ctx->States, MD5_HASHSIZE);
IndexT = 0;
for (Index1 = 0; Index1 < 4; Index1++) {
IndexD = Md5_Data[Index1][0];
for (Index2 = 16; Index2 > 0; Index2--) {
SA += (*Md5_F[Index1]) (SB, SC, SD) + Data[IndexD] + Md5_T[IndexT];
SA = ROTATE_LEFT (SA, Md5_S[Index1][Index2 & 3]);
SA += SB;
IndexD += Md5_Data[Index1][1];
IndexD &= 15;
IndexT++;
}
}
for (Index1 = 0; Index1 < 4; Index1++) {
Md5Ctx->States[Index1] += MedStates[Index1];
}
}
/**
Copy data segment into the M field of MD5_CTX structure for later transform.
If the length of data segment is larger than 64 bytes, then does the transform
immediately and the generated Md5 code is stored in the States field of MD5_CTX
data struct for later accumulation.
All of Md5 code generated for the sequential 64-bytes data segaments are be
accumulated in MD5Final() function.
@param[in, out] Md5Ctx The data structure of storing the original data
segment and the final result.
@param[in] Data The data wanted to be transformed.
@param[in] DataLen The length of data.
**/
VOID
MD5UpdateBlock (
IN OUT MD5_CTX *Md5Ctx,
IN CONST UINT8 *Data,
IN UINTN DataLen
)
{
UINTN Limit;
for (Limit = 64 - Md5Ctx->Count; DataLen >= 64 - Md5Ctx->Count; Limit = 64) {
CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, Limit);
MD5Transform (Md5Ctx);
Md5Ctx->Count = 0;
Data += Limit;
DataLen -= Limit;
}
CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, DataLen);
Md5Ctx->Count += DataLen;
}
/**
Initialize four 32-bits chaining variables and use them to do the Md5 transform.
@param[out] Md5Ctx The data structure of Md5.
@retval EFI_SUCCESS Initialization is ok.
**/
EFI_STATUS
MD5Init (
OUT MD5_CTX *Md5Ctx
)
{
ZeroMem (Md5Ctx, sizeof (*Md5Ctx));
//
// Set magic initialization constants.
//
Md5Ctx->States[0] = 0x67452301;
Md5Ctx->States[1] = 0xefcdab89;
Md5Ctx->States[2] = 0x98badcfe;
Md5Ctx->States[3] = 0x10325476;
return EFI_SUCCESS;
}
/**
the external interface of Md5 algorithm
@param[in, out] Md5Ctx The data structure of storing the original data
segment and the final result.
@param[in] Data The data wanted to be transformed.
@param[in] DataLen The length of data.
@retval EFI_SUCCESS The transform is ok.
@retval Others Other errors as indicated.
**/
EFI_STATUS
MD5Update (
IN OUT MD5_CTX *Md5Ctx,
IN VOID *Data,
IN UINTN DataLen
)
{
if (EFI_ERROR (Md5Ctx->Status)) {
return Md5Ctx->Status;
}
MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) Data, DataLen);
Md5Ctx->Length += DataLen;
return EFI_SUCCESS;
}
/**
Accumulate the MD5 value of every data segment and generate the finial
result according to MD5 algorithm.
@param[in, out] Md5Ctx The data structure of storing the original data
segment and the final result.
@param[out] HashVal The final 128-bits output.
@retval EFI_SUCCESS The transform is ok.
@retval Others Other errors as indicated.
**/
EFI_STATUS
MD5Final (
IN OUT MD5_CTX *Md5Ctx,
OUT UINT8 *HashVal
)
{
UINTN PadLength;
if (Md5Ctx->Status == EFI_ALREADY_STARTED) {
//
// Store Hashed value & Zeroize sensitive context information.
//
CopyMem (HashVal, (UINT8 *) Md5Ctx->States, MD5_HASHSIZE);
ZeroMem ((UINT8 *)Md5Ctx, sizeof (*Md5Ctx));
return EFI_SUCCESS;
}
if (EFI_ERROR (Md5Ctx->Status)) {
return Md5Ctx->Status;
}
PadLength = Md5Ctx->Count >= 56 ? 120 : 56;
PadLength -= Md5Ctx->Count;
MD5UpdateBlock (Md5Ctx, Md5HashPadding, PadLength);
Md5Ctx->Length = LShiftU64 (Md5Ctx->Length, 3);
MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) &Md5Ctx->Length, 8);
ZeroMem (Md5Ctx->M, sizeof (Md5Ctx->M));
Md5Ctx->Length = 0;
Md5Ctx->Status = EFI_ALREADY_STARTED;
return MD5Final (Md5Ctx, HashVal);
}

View File

@ -1,80 +0,0 @@
/** @file
Header file for Md5.
Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _MD5_H_
#define _MD5_H_
#include <Uefi.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/NetLib.h>
#define MD5_HASHSIZE 16
typedef struct _MD5_CTX {
EFI_STATUS Status;
UINT64 Length;
UINT32 States[MD5_HASHSIZE / sizeof (UINT32)];
UINT8 M[64];
UINTN Count;
} MD5_CTX;
/**
Initialize four 32-bits chaining variables and use them to do the Md5 transform.
@param[out] Md5Ctx The data structure of Md5.
@retval EFI_SUCCESS Initialization is ok.
**/
EFI_STATUS
MD5Init (
OUT MD5_CTX *Md5Ctx
);
/**
the external interface of Md5 algorithm
@param[in, out] Md5Ctx The data structure of storing the original data
segment and the final result.
@param[in] Data The data wanted to be transformed.
@param[in] DataLen The length of data.
@retval EFI_SUCCESS The transform is ok.
@retval Others Other errors as indicated.
**/
EFI_STATUS
MD5Update (
IN OUT MD5_CTX *Md5Ctx,
IN VOID *Data,
IN UINTN DataLen
);
/**
Accumulate the MD5 value of every data segment and generate the finial
result according to MD5 algorithm.
@param[in, out] Md5Ctx The data structure of storing the original data
segment and the final result.
@param[out] HashVal The final 128-bits output.
@retval EFI_SUCCESS The transform is ok.
@retval Others Other errors as indicated.
**/
EFI_STATUS
MD5Final (
IN OUT MD5_CTX *Md5Ctx,
OUT UINT8 *HashVal
);
#endif