]> git.proxmox.com Git - mirror_edk2.git/commitdiff
RedfishPkg/DxeRestExLib: DxeRestExLib
authorAbner Chang <abner.chang@hpe.com>
Thu, 17 Dec 2020 14:38:54 +0000 (22:38 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 24 Dec 2020 14:30:43 +0000 (14:30 +0000)
Add EFI REST EX helper library to create child instance of
REST EX service.

Signed-off-by: Abner Chang <abner.chang@hpe.com>
Cc: Jiaxin Wu <jiaxin.wu@intel.com>
Cc: Siyuan Fu <siyuan.fu@intel.com>
Cc: Fan Wang <fan.wang@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Nickle Wang <nickle.wang@hpe.com>
Cc: Peter O'Hanley <peter.ohanley@hpe.com>
Reviewed-by: Nickle Wang <nickle.wang@hpe.com>
RedfishPkg/Include/Library/RestExLib.h [new file with mode: 0644]
RedfishPkg/Library/DxeRestExLib/DxeRestExLib.c [new file with mode: 0644]
RedfishPkg/Library/DxeRestExLib/DxeRestExLib.inf [new file with mode: 0644]
RedfishPkg/RedfishLibs.dsc.inc
RedfishPkg/RedfishPkg.dec
RedfishPkg/RedfishPkg.dsc

diff --git a/RedfishPkg/Include/Library/RestExLib.h b/RedfishPkg/Include/Library/RestExLib.h
new file mode 100644 (file)
index 0000000..80233fb
--- /dev/null
@@ -0,0 +1,42 @@
+/** @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
diff --git a/RedfishPkg/Library/DxeRestExLib/DxeRestExLib.c b/RedfishPkg/Library/DxeRestExLib/DxeRestExLib.c
new file mode 100644 (file)
index 0000000..05c70c2
--- /dev/null
@@ -0,0 +1,166 @@
+/** @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
diff --git a/RedfishPkg/Library/DxeRestExLib/DxeRestExLib.inf b/RedfishPkg/Library/DxeRestExLib/DxeRestExLib.inf
new file mode 100644 (file)
index 0000000..ab87224
--- /dev/null
@@ -0,0 +1,44 @@
+##  @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
index e780b5c270c1d85a2f87750fe0b1865c281640cf..df21664f4e503a688fcb1be268aad158099a90bc 100644 (file)
@@ -11,5 +11,6 @@
 #\r
 ##\r
 !if $(REDFISH_ENABLE) == TRUE\r
+  RestExLib|RedfishPkg/Library/DxeRestExLib/DxeRestExLib.inf\r
 !endif\r
 \r
index fc56b4fefbebf393f614908a24fa3e6a8e0516f8..89a2a6de1e82abed82eaacc23ba5c2e03cfc6aa2 100644 (file)
   #   Platform implementation-specific Redfish Credential Interface.\r
   RedfishPlatformCredentialLib|Include/Library/RedfishCredentialLib.h\r
 \r
+  ##  @libraryclass  The helper routines to access REST EX service.\r
+  #   This library is only intended to be used by UEFI network stack modules.\r
+  RestExLib|Include/Library/RestExLib.h\r
+\r
 [Protocols]\r
   ## Include/Protocol/RedfishDiscover.h\r
   gEfiRedfishDiscoverProtocolGuid      = { 0x5db12509, 0x4550, 0x4347, { 0x96, 0xb3, 0x73, 0xc0, 0xff, 0x6e, 0x86, 0x9f }}\r
index 0b5d8cdd4eae6a30998f461b9b3dd6c25573ad67..5d9476bc79f7af92503544c4dbc0b1ea3619f5bf 100644 (file)
@@ -49,5 +49,6 @@
 [Components]\r
   RedfishPkg/Library/PlatformHostInterfaceLibNull/PlatformHostInterfaceLibNull.inf\r
   RedfishPkg/Library/PlatformCredentialLibNull/PlatformCredentialLibNull.inf\r
+  RedfishPkg/Library/DxeRestExLib/DxeRestExLib.inf\r
 \r
   !include RedfishPkg/Redfish.dsc.inc\r