--- /dev/null
+/** @file\r
+ This library provides help functions for REST EX Protocol.\r
+\r
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>\r
+\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#ifndef REST_EX_LIB_H_\r
+#define REST_EX_LIB_H_\r
+\r
+#include <Protocol/RestEx.h>\r
+\r
+///\r
+/// Library class public functions\r
+///\r
+\r
+/**\r
+ This function allows the caller to create child handle for specific\r
+ REST server.\r
+\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
+ @param[in] ServiceType REST service type.\r
+ @param[out] ChildInstanceHandle The handle to receive the create child.\r
+\r
+ @retval EFI_SUCCESS Can't create the corresponding REST EX child instance.\r
+ @retval EFI_INVALID_PARAMETERS Any of input parameters is improper.\r
+\r
+**/\r
+EFI_STATUS\r
+RestExLibCreateChild (\r
+ IN EFI_HANDLE Image,\r
+ IN EFI_REST_EX_SERVICE_ACCESS_MODE AccessMode,\r
+ IN EFI_REST_EX_CONFIG_TYPE ConfigType,\r
+ IN EFI_REST_EX_SERVICE_TYPE ServiceType,\r
+ OUT EFI_HANDLE *ChildInstanceHandle\r
+);\r
+\r
+#endif\r
--- /dev/null
+/** @file\r
+ This library provides help functions for REST EX Protocol.\r
+\r
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>\r
+\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include <Uefi.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/NetLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Protocol/Http.h>\r
+#include <Protocol/RestEx.h>\r
+\r
+#define REST_EX_CONFIG_DATA_LEN_UNKNOWN 0xff\r
+\r
+/**\r
+ This function allows the caller to create child handle for specific\r
+ REST server.\r
+\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
+ @param[in] ServiceType REST service type.\r
+ @param[out] ChildInstanceHandle The handle to receive the create child.\r
+\r
+ @retval EFI_SUCCESS Can't create the corresponding REST EX child instance.\r
+ @retval EFI_INVALID_PARAMETERS Any of input parameters is improper.\r
+\r
+**/\r
+EFI_STATUS\r
+RestExLibCreateChild (\r
+ IN EFI_HANDLE Image,\r
+ IN EFI_REST_EX_SERVICE_ACCESS_MODE AccessMode,\r
+ IN EFI_REST_EX_CONFIG_TYPE ConfigType,\r
+ IN EFI_REST_EX_SERVICE_TYPE ServiceType,\r
+ OUT EFI_HANDLE *ChildInstanceHandle\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
+ UINT8 LenOfConfig;\r
+\r
+ if (Image == NULL ||\r
+ AccessMode >= EfiRestExServiceModeMax ||\r
+ ConfigType >= EfiRestExConfigTypeMax ||\r
+ ServiceType >= EfiRestExServiceTypeMax ||\r
+ ChildInstanceHandle == NULL\r
+ ) {\r
+ return EFI_INVALID_PARAMETER;\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
+ Handle = (EFI_HANDLE *)AllocateZeroPool (sizeof(EFI_HANDLE) * NoBuffer);\r
+ if (Handle == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ Status = gBS->LocateHandleBuffer (\r
+ ByProtocol,\r
+ &gEfiRestExServiceBindingProtocolGuid,\r
+ NULL,\r
+ &NoBuffer,\r
+ &Handle\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (Handle);\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Search for the proper REST EX instance.\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
+ // 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
+ 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
+ goto ON_ERROR;\r
+ }\r
+ }\r
+ //\r
+ // This is proper REST EX instance.\r
+ //\r
+ *ChildInstanceHandle = ChildHandle;\r
+ FreePool (Handle);\r
+ return EFI_SUCCESS;\r
+\r
+ON_ERROR:;\r
+ NetLibDestroyServiceChild (\r
+ *(Handle + (NoBuffer - 1)),\r
+ Image,\r
+ &gEfiRestExServiceBindingProtocolGuid,\r
+ ChildHandle\r
+ );\r
+ NoBuffer --;\r
+ };\r
+ FreePool (Handle);\r
+ return EFI_NOT_FOUND;\r
+}\r
--- /dev/null
+## @file\r
+# Library for REST EX Protocol\r
+#\r
+# (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
+#\r
+##\r
+\r
+[Defines]\r
+ INF_VERSION = 0x0001001b\r
+ BASE_NAME = DxeRestExLib\r
+ FILE_GUID = E9CBF727-8AF3-4602-9DBD-A3942869B5AE\r
+ MODULE_TYPE = DXE_DRIVER\r
+ VERSION_STRING = 1.0\r
+ LIBRARY_CLASS = RestExLib | DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_APPLICATION UEFI_DRIVER\r
+\r
+#\r
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC RISCV64\r
+#\r
+\r
+[Sources.common]\r
+ DxeRestExLib.c\r
+\r
+[Packages]\r
+ NetworkPkg/NetworkPkg.dec\r
+ MdePkg/MdePkg.dec\r
+ MdeModulePkg/MdeModulePkg.dec\r
+\r
+[LibraryClasses]\r
+ BaseLib\r
+ BaseMemoryLib\r
+ DebugLib\r
+ DevicePathLib\r
+ MemoryAllocationLib\r
+ NetLib\r
+ PrintLib\r
+ UefiLib\r
+ UefiBootServicesTableLib\r
+ UefiRuntimeServicesTableLib\r
+\r
+[Protocols]\r
+ gEfiRestExServiceBindingProtocolGuid ## PROTOCOL ALWAYS_CONSUMED\r
+ gEfiRestExProtocolGuid ## PROTOCOL ALWAYS_CONSUMED\r
+\r