mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-27 07:34:06 +02:00
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:
parent
a19b336204
commit
dff73e4c73
@ -354,7 +354,6 @@
|
|||||||
MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf
|
MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf
|
||||||
MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf
|
MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf
|
||||||
MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf
|
MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf
|
||||||
MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
|
|
||||||
MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf
|
MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf
|
||||||
MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf
|
MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf
|
||||||
MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf
|
MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf
|
||||||
|
@ -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)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
@ -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."
|
|
||||||
|
|
@ -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"
|
|
||||||
|
|
||||||
|
|
@ -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;
|
|
||||||
}
|
|
@ -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
|
|
@ -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
@ -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
|
|
@ -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;
|
|
||||||
|
|
@ -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 ""
|
|
||||||
|
|
@ -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
|
|
@ -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;
|
|
||||||
}
|
|
@ -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
|
|
@ -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;
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
||||||
};
|
|
@ -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
|
|
@ -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);
|
|
||||||
}
|
|
@ -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
|
|
@ -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
|
|
@ -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;
|
|
||||||
}
|
|
@ -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
|
|
@ -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;
|
|
||||||
}
|
|
@ -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
@ -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;
|
|
||||||
}
|
|
@ -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
|
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
Loading…
x
Reference in New Issue
Block a user