summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--RedfishPkg/Include/Library/RestExLib.h3
-rw-r--r--RedfishPkg/Library/DxeRestExLib/DxeRestExLib.c169
-rw-r--r--RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c1
3 files changed, 73 insertions, 100 deletions
diff --git a/RedfishPkg/Include/Library/RestExLib.h b/RedfishPkg/Include/Library/RestExLib.h
index bc4e4ca6ca..2c32c3684c 100644
--- a/RedfishPkg/Include/Library/RestExLib.h
+++ b/RedfishPkg/Include/Library/RestExLib.h
@@ -2,6 +2,7 @@
This library provides help functions for REST EX Protocol.
(C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+ Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -20,6 +21,7 @@
This function allows the caller to create child handle for specific
REST server.
+ @param[in] Controller The controller handle used of selected interface.
@param[in] Image The image handle used to open service.
@param[in] AccessMode Access mode of REST server.
@param[in] ConfigType Underlying configuration to communicate with REST server.
@@ -32,6 +34,7 @@
**/
EFI_STATUS
RestExLibCreateChild (
+ IN EFI_HANDLE Controller,
IN EFI_HANDLE Image,
IN EFI_REST_EX_SERVICE_ACCESS_MODE AccessMode,
IN EFI_REST_EX_CONFIG_TYPE ConfigType,
diff --git a/RedfishPkg/Library/DxeRestExLib/DxeRestExLib.c b/RedfishPkg/Library/DxeRestExLib/DxeRestExLib.c
index d9acad24de..96533a6eb3 100644
--- a/RedfishPkg/Library/DxeRestExLib/DxeRestExLib.c
+++ b/RedfishPkg/Library/DxeRestExLib/DxeRestExLib.c
@@ -2,6 +2,7 @@
This library provides help functions for REST EX Protocol.
(C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+ Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -9,6 +10,7 @@
#include <Uefi.h>
#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/NetLib.h>
#include <Library/UefiBootServicesTableLib.h>
@@ -21,6 +23,7 @@
This function allows the caller to create child handle for specific
REST server.
+ @param[in] Controller The controller handle used of selected interface.
@param[in] Image The image handle used to open service.
@param[in] AccessMode Access mode of REST server.
@param[in] ConfigType Underlying configuration to communicate with REST server.
@@ -33,6 +36,7 @@
**/
EFI_STATUS
RestExLibCreateChild (
+ IN EFI_HANDLE Controller,
IN EFI_HANDLE Image,
IN EFI_REST_EX_SERVICE_ACCESS_MODE AccessMode,
IN EFI_REST_EX_CONFIG_TYPE ConfigType,
@@ -41,8 +45,6 @@ RestExLibCreateChild (
)
{
EFI_STATUS Status;
- UINTN NoBuffer;
- EFI_HANDLE *Handle;
EFI_HANDLE ChildHandle;
EFI_REST_EX_PROTOCOL *RestEx;
EFI_REST_EX_SERVICE_INFO *RestExServiceInfo;
@@ -59,116 +61,83 @@ RestExLibCreateChild (
}
*ChildInstanceHandle = NULL;
- //
- // Locate all REST EX binding service.
- //
- Handle = NULL;
- NoBuffer = 0;
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiRestExServiceBindingProtocolGuid,
- NULL,
- &NoBuffer,
- &Handle
- );
- if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {
- return Status;
- }
- Handle = (EFI_HANDLE *)AllocateZeroPool (sizeof (EFI_HANDLE) * NoBuffer);
- if (Handle == NULL) {
- return EFI_OUT_OF_RESOURCES;
+ ChildHandle = NULL;
+ Status = NetLibCreateServiceChild (
+ Controller,
+ Image,
+ &gEfiRestExServiceBindingProtocolGuid,
+ &ChildHandle
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "%a: Failed to create service child - %r \n",
+ __func__,
+ Status
+ ));
+ return Status;
}
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiRestExServiceBindingProtocolGuid,
+ Status = gBS->OpenProtocol (
+ ChildHandle,
+ &gEfiRestExProtocolGuid,
+ (VOID **)&RestEx,
+ Image,
NULL,
- &NoBuffer,
- &Handle
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
if (EFI_ERROR (Status)) {
- FreePool (Handle);
- return Status;
+ goto ON_ERROR;
+ }
+
+ //
+ // Get the information of REST service provided by this EFI REST EX driver
+ //
+ Status = RestEx->GetService (
+ RestEx,
+ &RestExServiceInfo
+ );
+ if (EFI_ERROR (Status)) {
+ goto ON_ERROR;
}
//
- // Search for the proper REST EX instance.
+ // Check REST EX property.
//
- while (NoBuffer != 0) {
- ChildHandle = NULL;
- Status = NetLibCreateServiceChild (
- *(Handle + (NoBuffer - 1)),
- Image,
- &gEfiRestExServiceBindingProtocolGuid,
- &ChildHandle
- );
- if (!EFI_ERROR (Status)) {
- Status = gBS->OpenProtocol (
- ChildHandle,
- &gEfiRestExProtocolGuid,
- (VOID **)&RestEx,
- Image,
- NULL,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- //
- // Get the information of REST service provided by this EFI REST EX driver
- //
- Status = RestEx->GetService (
- RestEx,
- &RestExServiceInfo
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- //
- // Check REST EX property.
- //
- switch (ConfigType) {
- case EfiRestExConfigHttp:
- LenOfConfig = sizeof (EFI_REST_EX_HTTP_CONFIG_DATA);
- break;
-
- case EfiRestExConfigUnspecific:
- LenOfConfig = REST_EX_CONFIG_DATA_LEN_UNKNOWN;
- break;
-
- default:
- goto ON_ERROR;
- }
-
- if ((RestExServiceInfo->EfiRestExServiceInfoV10.RestServiceAccessMode != AccessMode) ||
- (RestExServiceInfo->EfiRestExServiceInfoV10.RestServiceType != ServiceType) ||
- (RestExServiceInfo->EfiRestExServiceInfoV10.RestExConfigType != ConfigType) ||
- ((LenOfConfig != REST_EX_CONFIG_DATA_LEN_UNKNOWN) && (RestExServiceInfo->EfiRestExServiceInfoV10.RestExConfigDataLength != LenOfConfig)))
- {
- goto ON_ERROR;
- }
- }
-
- //
- // This is proper REST EX instance.
- //
- *ChildInstanceHandle = ChildHandle;
- FreePool (Handle);
- return EFI_SUCCESS;
+ switch (ConfigType) {
+ case EfiRestExConfigHttp:
+ LenOfConfig = sizeof (EFI_REST_EX_HTTP_CONFIG_DATA);
+ break;
-ON_ERROR:;
- NetLibDestroyServiceChild (
- *(Handle + (NoBuffer - 1)),
- Image,
- &gEfiRestExServiceBindingProtocolGuid,
- ChildHandle
- );
- NoBuffer--;
+ case EfiRestExConfigUnspecific:
+ LenOfConfig = REST_EX_CONFIG_DATA_LEN_UNKNOWN;
+ break;
+
+ default:
+ goto ON_ERROR;
+ }
+
+ if ((RestExServiceInfo->EfiRestExServiceInfoV10.RestServiceAccessMode != AccessMode) ||
+ (RestExServiceInfo->EfiRestExServiceInfoV10.RestServiceType != ServiceType) ||
+ (RestExServiceInfo->EfiRestExServiceInfoV10.RestExConfigType != ConfigType) ||
+ ((LenOfConfig != REST_EX_CONFIG_DATA_LEN_UNKNOWN) && (RestExServiceInfo->EfiRestExServiceInfoV10.RestExConfigDataLength != LenOfConfig)))
+ {
+ goto ON_ERROR;
}
- FreePool (Handle);
+ //
+ // This is proper REST EX instance.
+ //
+ *ChildInstanceHandle = ChildHandle;
+ return EFI_SUCCESS;
+
+ON_ERROR:;
+ NetLibDestroyServiceChild (
+ Controller,
+ Image,
+ &gEfiRestExServiceBindingProtocolGuid,
+ ChildHandle
+ );
return EFI_NOT_FOUND;
}
diff --git a/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c b/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c
index 1470274881..0b86a7b5cc 100644
--- a/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c
+++ b/RedfishPkg/RedfishDiscoverDxe/RedfishDiscoverDxe.c
@@ -87,6 +87,7 @@ CreateRestExInstance (
EFI_STATUS Status;
Status = RestExLibCreateChild (
+ Instance->NetworkInterface->OpenDriverControllerHandle,
Instance->Owner,
FixedPcdGetBool (PcdRedfishDiscoverAccessModeInBand) ? EfiRestExServiceInBandAccess : EfiRestExServiceOutOfBandAccess,
EfiRestExConfigHttp,