[AMD Official Use Only - General]

Reviewed-by: Abner Chang <abner.ch...@amd.com>

> -----Original Message-----
> From: Nickle Wang <nickle.w...@hpe.com>
> Sent: Monday, July 25, 2022 9:36 AM
> To: devel@edk2.groups.io
> Cc: Chang, Abner <abner.ch...@amd.com>; Yang, Atom
> <atom.y...@amd.com>; Nick Ramirez <nrami...@nvidia.com>
> Subject: [edk2-staging][PATCH v2 02/15] edk2-staging/RedfishClientPkg:
> Introduce Redfish version library
> 
> [CAUTION: External Email]
> 
> Add RedfishVersionLib in order to get Redfish version hosted at BMC.
> When there is trouble to get Redfish support version, the default version is
> retrieved from pre-defined PCD value.
> 
> Signed-off-by: Nickle Wang <nickle.w...@hpe.com>
> Cc: Abner Chang <abner.ch...@amd.com>
> Cc: Yang Atom <atom.y...@amd.com>
> Cc: Nick Ramirez <nrami...@nvidia.com>
> ---
>  .../Include/Library/RedfishVersionLib.h       |  30 +++
>  RedfishClientPkg/Include/RedfishBase.h        |  21 ++
>  .../RedfishVersionLib/RedfishVersionLib.c     | 203 ++++++++++++++++++
>  .../RedfishVersionLib/RedfishVersionLib.inf   |  50 +++++
>  RedfishClientPkg/RedfishClientLibs.dsc.inc    |   1 +
>  RedfishClientPkg/RedfishClientPkg.dec         |   4 +-
>  6 files changed, 308 insertions(+), 1 deletion(-)  create mode 100644
> RedfishClientPkg/Include/Library/RedfishVersionLib.h
>  create mode 100644 RedfishClientPkg/Include/RedfishBase.h
>  create mode 100644
> RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.c
>  create mode 100644
> RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.inf
> 
> diff --git a/RedfishClientPkg/Include/Library/RedfishVersionLib.h
> b/RedfishClientPkg/Include/Library/RedfishVersionLib.h
> new file mode 100644
> index 0000000000..319f22bd37
> --- /dev/null
> +++ b/RedfishClientPkg/Include/Library/RedfishVersionLib.h
> @@ -0,0 +1,30 @@
> +/** @file
> +  This file defines the Redfish version Library interface.
> +
> +  (C) Copyright 2022 Hewlett Packard Enterprise Development LP<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#ifndef REDFISH_VERSION_LIB_H_
> +#define REDFISH_VERSION_LIB_H_
> +
> +/**
> +  Query HTTP request to BMC with given redfish service and return
> +redfish
> +  version information. If there is troulbe to get Redfish version on
> +BMC,
> +  The value of PcdDefaultRedfishVersion is returned.
> +
> +  It's call responsibility to release returned buffer.
> +
> +  @param[in]   Service  Redfish service instance
> +
> +  @retval EFI_STRING  Redfish version string. NULL while error occurs.
> +
> +**/
> +EFI_STRING
> +RedfishGetVersion (
> +  IN REDFISH_SERVICE  *Service
> +  );
> +
> +#endif
> diff --git a/RedfishClientPkg/Include/RedfishBase.h
> b/RedfishClientPkg/Include/RedfishBase.h
> new file mode 100644
> index 0000000000..cf320bb0eb
> --- /dev/null
> +++ b/RedfishClientPkg/Include/RedfishBase.h
> @@ -0,0 +1,21 @@
> +/** @file
> +  Redfish base header file.
> +
> +  (C) Copyright 2022 Hewlett Packard Enterprise Development LP<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#ifndef EFI_REDFISH_BASE_H_
> +#define EFI_REDFISH_BASE_H_
> +
> +#define IS_EMPTY_STRING(a)    ((a) == NULL || (a)[0] == '\0')
> +#define REDFISH_DEBUG_TRACE   DEBUG_INFO
> +
> +///
> +/// This GUID is used for an EFI Variable that stores the Redfish data.
> +///
> +EFI_GUID mRedfishVariableGuid = {0x91c46a3d, 0xed1a, 0x477b, {0xa5,
> +0x33, 0x87, 0x2d, 0xcd, 0xb0, 0xfc, 0xc1}};
> +
> +#endif
> diff --git a/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.c
> b/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.c
> new file mode 100644
> index 0000000000..0a2ace7726
> --- /dev/null
> +++ b/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.c
> @@ -0,0 +1,203 @@
> +/** @file
> +  Redfish version library implementation
> +
> +  (C) Copyright 2022 Hewlett Packard Enterprise Development LP<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include <Uefi.h>
> +#include <RedfishBase.h>
> +#include <Library/BaseLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/RedfishLib.h>
> +#include <Library/JsonLib.h>
> +#include <Library/MemoryAllocationLib.h> #include
> +<Library/RedfishVersionLib.h>
> +
> +#define REDFISH_VERSION_DEFAULT_STRING L"v1"
> +#define REDFISH_ROOT_URI               "/redfish"
> +
> +REDFISH_SERVICE *mCacheService;
> +EFI_STRING      mVersionCache;
> +UINTN           mVersionStringSize;
> +
> +/**
> +  Cache the redfish service version for later use so we don't have to
> +query
> +  HTTP request everytime.
> +
> +  @param[in]   Service  Redfish service instance
> +  @param[in]   Version  Version string to cache
> +
> +  @retval EFI_SUCCESS   Version is saved in cache successfully.
> +  @retval Others
> +
> +**/
> +EFI_STATUS
> +CacheVersion (
> +  IN REDFISH_SERVICE  *Service,
> +  IN EFI_STRING       Version
> +  )
> +{
> +  if (Service == NULL || IS_EMPTY_STRING (Version)) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  if (mCacheService == Service) {
> +    return EFI_ALREADY_STARTED;
> +  }
> +
> +  mCacheService = Service;
> +  if (mVersionCache != NULL) {
> +    FreePool (mVersionCache);
> +  }
> +
> +  mVersionStringSize = StrSize (Version);  mVersionCache =
> + AllocateCopyPool (mVersionStringSize, Version);  if (mVersionCache ==
> + NULL) {
> +    mCacheService = NULL;
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Query HTTP request to BMC with given redfish service and return
> +redfish
> +  version information. If there is troulbe to get Redfish version on
> +BMC,
> +  The value of PcdDefaultRedfishVersion is returned.
> +
> +  It's call responsibility to release returned buffer.
> +
> +  @param[in]   Service  Redfish service instance
> +
> +  @retval EFI_STRING  Redfish version string. NULL while error occurs.
> +
> +**/
> +EFI_STRING
> +RedfishGetVersion (
> +  IN REDFISH_SERVICE  *Service
> +  )
> +{
> +  EFI_STATUS        Status;
> +  EFI_STRING        VersionString;
> +  REDFISH_RESPONSE  Response;
> +  EDKII_JSON_VALUE  JsonValue;
> +  EDKII_JSON_VALUE  N;
> +  CHAR8             *Key;
> +  EDKII_JSON_VALUE  Value;
> +
> +  VersionString = NULL;
> +
> +  if (Service == NULL) {
> +    goto ON_ERROR;
> +  }
> +
> +  //
> +  // Use cache to prevent HTTP connection.
> +  //
> +  if (Service == mCacheService) {
> +    return AllocateCopyPool (mVersionStringSize, mVersionCache);  }
> +
> +  //
> +  // Get resource from redfish service.
> +  //
> +  Status = RedfishGetByUri (
> +             Service,
> +             REDFISH_ROOT_URI,
> +             &Response
> +             );
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "%a, RedfishGetByService to %a failed: %r\n",
> __FUNCTION__, REDFISH_ROOT_URI, Status));
> +    if (Response.Payload != NULL) {
> +      RedfishDumpPayload (Response.Payload);
> +      RedfishFreeResponse (
> +        NULL,
> +        0,
> +        NULL,
> +        Response.Payload
> +        );
> +      Response.Payload = NULL;
> +    }
> +
> +    goto ON_ERROR;
> +  }
> +
> +  JsonValue = RedfishJsonInPayload (Response.Payload);  if (JsonValue
> + == NULL || !JsonValueIsObject (JsonValue)) {
> +    goto ON_ERROR;
> +  }
> +
> +  EDKII_JSON_OBJECT_FOREACH_SAFE (JsonValue, N, Key, Value) {
> +    if (Key[0] == 'v' && JsonValueIsString (Value)) {
> +      VersionString = JsonValueGetUnicodeString (Value);
> +      break;
> +    }
> +  }
> +
> +  if (VersionString != NULL) {
> +    CacheVersion (Service, VersionString);
> +    return VersionString;
> +  }
> +
> +ON_ERROR:
> +
> +  VersionString = (CHAR16 *)PcdGetPtr (PcdDefaultRedfishVersion);  if
> + (VersionString == NULL) {
> +    VersionString = REDFISH_VERSION_DEFAULT_STRING;  }
> +
> +  return AllocateCopyPool (StrSize (VersionString), VersionString); }
> +
> +/**
> +
> +  Initial redfish version library instace.
> +
> +  @param[in] ImageHandle     The image handle.
> +  @param[in] SystemTable     The system table.
> +
> +  @retval  EFI_SUCEESS  Install Boot manager menu success.
> +  @retval  Other        Return error status.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +RedfishVersionLibConstructor (
> +  IN EFI_HANDLE                            ImageHandle,
> +  IN EFI_SYSTEM_TABLE                      *SystemTable
> +  )
> +{
> +  mCacheService = NULL;
> +  mVersionCache = NULL;
> +  mVersionStringSize = 0;
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> +/**
> +  Release allocated resource.
> +
> +  @param[in] ImageHandle       Handle that identifies the image to be 
> unloaded.
> +  @param[in] SystemTable      The system table.
> +
> +  @retval EFI_SUCCESS      The image has been unloaded.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +RedfishVersionLibDestructor (
> +  IN EFI_HANDLE                            ImageHandle,
> +  IN EFI_SYSTEM_TABLE                      *SystemTable
> +  )
> +{
> +  if (mVersionCache != NULL) {
> +    FreePool (mVersionCache);
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> diff --git a/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.inf
> b/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.inf
> new file mode 100644
> index 0000000000..34d13d64f1
> --- /dev/null
> +++ b/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.inf
> @@ -0,0 +1,50 @@
> +## @file
> +#
> +#  (C) Copyright 2022 Hewlett Packard Enterprise Development LP<BR> # #
> +SPDX-License-Identifier: BSD-2-Clause-Patent # ##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010006
> +  BASE_NAME                      = RedfishVersionLib
> +  FILE_GUID                      = 396A7508-B611-49F7-9C81-DAD96B526B61
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = RedfishVersionLib| DXE_DRIVER
> +  CONSTRUCTOR                    = RedfishVersionLibConstructor
> +  DESTRUCTOR                     = RedfishVersionLibDestructor
> +
> +#
> +#  VALID_ARCHITECTURES           = IA32 X64 EBC
> +#
> +
> +[Sources]
> +  RedfishVersionLib.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  RedfishPkg/RedfishPkg.dec
> +  RedfishClientPkg/RedfishClientPkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  DebugLib
> +  MemoryAllocationLib
> +  PcdLib
> +  RedfishLib
> +  JsonLib
> +
> +[Protocols]
> +
> +[Pcd]
> +  gEfiRedfishClientPkgTokenSpaceGuid.PcdDefaultRedfishVersion
> +
> +[BuildOptions]
> +  #
> +  # NOTE: /wd4706 disables the following Visual Studio compiler warning in
> Jansson:
> +  #       "C4706: assignment within conditional expression"
> +  #
> +  MSFT:*_*_*_CC_FLAGS = /wd4706
> diff --git a/RedfishClientPkg/RedfishClientLibs.dsc.inc
> b/RedfishClientPkg/RedfishClientLibs.dsc.inc
> index ce1c27d884..1cf0406912 100644
> --- a/RedfishClientPkg/RedfishClientLibs.dsc.inc
> +++ b/RedfishClientPkg/RedfishClientLibs.dsc.inc
> @@ -29,3 +29,4 @@
> 
> ConverterCommonLib|RedfishClientPkg/ConverterLib/edk2library/ConverterCo
> mmonLib/ConverterCommonLib.inf
> 
>    
> RedfishEventLib|RedfishClientPkg/Library/RedfishEventLib/RedfishEventLib.inf
> +
> + RedfishVersionLib|RedfishClientPkg/Library/RedfishVersionLib/RedfishVe
> + rsionLib.inf
> diff --git a/RedfishClientPkg/RedfishClientPkg.dec
> b/RedfishClientPkg/RedfishClientPkg.dec
> index 39b2f5baf8..2ce51d14af 100644
> --- a/RedfishClientPkg/RedfishClientPkg.dec
> +++ b/RedfishClientPkg/RedfishClientPkg.dec
> @@ -22,6 +22,7 @@
>  [LibraryClasses]
>    RedfishFeatureUtilityLib|Include/Library/RedfishFeatureUtilityLib.h
>    RedfishEventLib|Include/Library/RedfishEventLib.h
> +  RedfishVersionLib|Include/Library/RedfishVersionLib.h
> 
>  [LibraryClasses.Common.Private]
>    ##  @libraryclass Redfish Helper Library @@ -52,4 +53,5 @@
>    # { 0x7CE88FB3, 0x4BD7, 0x4679, { 0x87, 0xA8, 0xA8, 0xD8, 0xDE, 0xE5, 0x0D,
> 0x2B }}
>    #
> 
> gEfiRedfishClientPkgTokenSpaceGuid.PcdEdkIIRedfishFeatureDriverStartupEvent
> Guid|{0xB3, 0x8F, 0xE8, 0x7C, 0xD7, 0x4B, 0x79, 0x46, 0x87, 0xA8, 0xA8, 0xD8,
> 0xDE, 0xE5, 0x0D, 0x2B}|VOID*|0x10000003
> -
> +  ## Default Redfish version string
> +
> + gEfiRedfishClientPkgTokenSpaceGuid.PcdDefaultRedfishVersion|L"v1"|VOID
> + *|0x10000004
> --
> 2.32.0.windows.2


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#91829): https://edk2.groups.io/g/devel/message/91829
Mute This Topic: https://groups.io/mt/92596782/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to