This library provides help functions for REST EX Protocol.\r
\r
(C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>\r
+ Copyright (c) 2023, Ampere Computing LLC. All rights reserved.<BR>\r
\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
\r
#include <Uefi.h>\r
#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
#include <Library/MemoryAllocationLib.h>\r
#include <Library/NetLib.h>\r
#include <Library/UefiBootServicesTableLib.h>\r
This function allows the caller to create child handle for specific\r
REST server.\r
\r
+ @param[in] Controller The controller handle used of selected interface.\r
@param[in] Image The image handle used to open service.\r
@param[in] AccessMode Access mode of REST server.\r
@param[in] ConfigType Underlying configuration to communicate with REST server.\r
**/\r
EFI_STATUS\r
RestExLibCreateChild (\r
+ IN EFI_HANDLE Controller,\r
IN EFI_HANDLE Image,\r
IN EFI_REST_EX_SERVICE_ACCESS_MODE AccessMode,\r
IN EFI_REST_EX_CONFIG_TYPE ConfigType,\r
)\r
{\r
EFI_STATUS Status;\r
- UINTN NoBuffer;\r
- EFI_HANDLE *Handle;\r
EFI_HANDLE ChildHandle;\r
EFI_REST_EX_PROTOCOL *RestEx;\r
EFI_REST_EX_SERVICE_INFO *RestExServiceInfo;\r
}\r
\r
*ChildInstanceHandle = NULL;\r
- //\r
- // Locate all REST EX binding service.\r
- //\r
- Handle = NULL;\r
- NoBuffer = 0;\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiRestExServiceBindingProtocolGuid,\r
- NULL,\r
- &NoBuffer,\r
- &Handle\r
- );\r
- if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
- return Status;\r
- }\r
\r
- Handle = (EFI_HANDLE *)AllocateZeroPool (sizeof (EFI_HANDLE) * NoBuffer);\r
- if (Handle == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
+ ChildHandle = NULL;\r
+ Status = NetLibCreateServiceChild (\r
+ Controller,\r
+ Image,\r
+ &gEfiRestExServiceBindingProtocolGuid,\r
+ &ChildHandle\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "%a: Failed to create service child - %r \n",\r
+ __func__,\r
+ Status\r
+ ));\r
+ return Status;\r
}\r
\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiRestExServiceBindingProtocolGuid,\r
+ Status = gBS->OpenProtocol (\r
+ ChildHandle,\r
+ &gEfiRestExProtocolGuid,\r
+ (VOID **)&RestEx,\r
+ Image,\r
NULL,\r
- &NoBuffer,\r
- &Handle\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
);\r
if (EFI_ERROR (Status)) {\r
- FreePool (Handle);\r
- return Status;\r
+ goto ON_ERROR;\r
+ }\r
+\r
+ //\r
+ // Get the information of REST service provided by this EFI REST EX driver\r
+ //\r
+ Status = RestEx->GetService (\r
+ RestEx,\r
+ &RestExServiceInfo\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto ON_ERROR;\r
}\r
\r
//\r
- // Search for the proper REST EX instance.\r
+ // Check REST EX property.\r
//\r
- while (NoBuffer != 0) {\r
- ChildHandle = NULL;\r
- Status = NetLibCreateServiceChild (\r
- *(Handle + (NoBuffer - 1)),\r
- Image,\r
- &gEfiRestExServiceBindingProtocolGuid,\r
- &ChildHandle\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- Status = gBS->OpenProtocol (\r
- ChildHandle,\r
- &gEfiRestExProtocolGuid,\r
- (VOID **)&RestEx,\r
- Image,\r
- NULL,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- //\r
- // Get the information of REST service provided by this EFI REST EX driver\r
- //\r
- Status = RestEx->GetService (\r
- RestEx,\r
- &RestExServiceInfo\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- //\r
- // Check REST EX property.\r
- //\r
- switch (ConfigType) {\r
- case EfiRestExConfigHttp:\r
- LenOfConfig = sizeof (EFI_REST_EX_HTTP_CONFIG_DATA);\r
- break;\r
-\r
- case EfiRestExConfigUnspecific:\r
- LenOfConfig = REST_EX_CONFIG_DATA_LEN_UNKNOWN;\r
- break;\r
-\r
- default:\r
- goto ON_ERROR;\r
- }\r
-\r
- if ((RestExServiceInfo->EfiRestExServiceInfoV10.RestServiceAccessMode != AccessMode) ||\r
- (RestExServiceInfo->EfiRestExServiceInfoV10.RestServiceType != ServiceType) ||\r
- (RestExServiceInfo->EfiRestExServiceInfoV10.RestExConfigType != ConfigType) ||\r
- ((LenOfConfig != REST_EX_CONFIG_DATA_LEN_UNKNOWN) && (RestExServiceInfo->EfiRestExServiceInfoV10.RestExConfigDataLength != LenOfConfig)))\r
- {\r
- goto ON_ERROR;\r
- }\r
- }\r
-\r
- //\r
- // This is proper REST EX instance.\r
- //\r
- *ChildInstanceHandle = ChildHandle;\r
- FreePool (Handle);\r
- return EFI_SUCCESS;\r
+ switch (ConfigType) {\r
+ case EfiRestExConfigHttp:\r
+ LenOfConfig = sizeof (EFI_REST_EX_HTTP_CONFIG_DATA);\r
+ break;\r
\r
-ON_ERROR:;\r
- NetLibDestroyServiceChild (\r
- *(Handle + (NoBuffer - 1)),\r
- Image,\r
- &gEfiRestExServiceBindingProtocolGuid,\r
- ChildHandle\r
- );\r
- NoBuffer--;\r
+ case EfiRestExConfigUnspecific:\r
+ LenOfConfig = REST_EX_CONFIG_DATA_LEN_UNKNOWN;\r
+ break;\r
+\r
+ default:\r
+ goto ON_ERROR;\r
+ }\r
+\r
+ if ((RestExServiceInfo->EfiRestExServiceInfoV10.RestServiceAccessMode != AccessMode) ||\r
+ (RestExServiceInfo->EfiRestExServiceInfoV10.RestServiceType != ServiceType) ||\r
+ (RestExServiceInfo->EfiRestExServiceInfoV10.RestExConfigType != ConfigType) ||\r
+ ((LenOfConfig != REST_EX_CONFIG_DATA_LEN_UNKNOWN) && (RestExServiceInfo->EfiRestExServiceInfoV10.RestExConfigDataLength != LenOfConfig)))\r
+ {\r
+ goto ON_ERROR;\r
}\r
\r
- FreePool (Handle);\r
+ //\r
+ // This is proper REST EX instance.\r
+ //\r
+ *ChildInstanceHandle = ChildHandle;\r
+ return EFI_SUCCESS;\r
+\r
+ON_ERROR:;\r
+ NetLibDestroyServiceChild (\r
+ Controller,\r
+ Image,\r
+ &gEfiRestExServiceBindingProtocolGuid,\r
+ ChildHandle\r
+ );\r
return EFI_NOT_FOUND;\r
}\r