Reviewed-by: Abner Chang <abner.ch...@hpe.com> > -----Original Message----- > From: Wang, Nickle (Server BIOS) <nickle.w...@hpe.com> > Sent: Wednesday, May 25, 2022 11:14 AM > To: devel@edk2.groups.io > Cc: Wang, Nickle (Server BIOS) <nickle.w...@hpe.com>; Chang, Abner (HPS > SW/FW Technologist) <abner.ch...@hpe.com> > Subject: [edk2-staging][PATCH v2 2/3] edk2-staging/RedfishClientPkg: > Introduce Redfish version library > > Add RedfishVersionLib to Redfish client package. This library provides > interface for Redfish feature drivers to get Redfish version on BMC. > > Signed-off-by: Nickle Wang <nickle.w...@hpe.com> > Cc: Abner Chang <abner.ch...@hpe.com> > --- > .../Include/Library/RedfishVersionLib.h | 30 +++ > RedfishClientPkg/Include/RedfishBase.h | 16 ++ > .../RedfishVersionLib/RedfishVersionLib.c | 211 ++++++++++++++++++ > .../RedfishVersionLib/RedfishVersionLib.inf | 44 ++++ > RedfishClientPkg/RedfishClientLibs.dsc.inc | 1 + > RedfishClientPkg/RedfishClientPkg.dec | 4 +- > 6 files changed, 305 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..5076c2ce9f > --- /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..60d585c54a > --- /dev/null > +++ b/RedfishClientPkg/Include/RedfishBase.h > @@ -0,0 +1,16 @@ > +/** @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_VERBOSE > > + > > +#endif > > diff --git a/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.c > b/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.c > new file mode 100644 > index 0000000000..0fe2dd1bd0 > --- /dev/null > +++ b/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.c > @@ -0,0 +1,211 @@ > +/** @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) { > > + // > > + // According to Redfish specification "Protocol version" seciton, > > + // GET operation on /redfish resource shall return protocol version > > + // like below: > > + // { > > + // "v1": "/redfish/v1/" > > + // } > > + // > > + if (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..61e65e3eca > --- /dev/null > +++ b/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.inf > @@ -0,0 +1,44 @@ > +## @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 > > + JsonLib > > + PcdLib > > + RedfishLib > > + MemoryAllocationLib > > + > > +[Protocols] > > + > > +[Pcd] > > + gEfiRedfishClientPkgTokenSpaceGuid.PcdDefaultRedfishVersion > > + > > diff --git a/RedfishClientPkg/RedfishClientLibs.dsc.inc > b/RedfishClientPkg/RedfishClientLibs.dsc.inc > index 91e5de4296..4f7a8b21f0 100644 > --- a/RedfishClientPkg/RedfishClientLibs.dsc.inc > +++ b/RedfishClientPkg/RedfishClientLibs.dsc.inc > @@ -28,3 +28,4 @@ > > RedfishContentCodingLib|RedfishPkg/Library/RedfishContentCodingLibNull/ > RedfishContentCodingLibNull.inf > > > ConverterCommonLib|RedfishClientPkg/ConverterLib/edk2library/Converte > rCommonLib/ConverterCommonLib.inf > > > RedfishEventLib|RedfishClientPkg/Library/RedfishEventLib/RedfishEventLib.i > nf > > + > RedfishVersionLib|RedfishClientPkg/Library/RedfishVersionLib/RedfishVersi > onLib.inf > > diff --git a/RedfishClientPkg/RedfishClientPkg.dec > b/RedfishClientPkg/RedfishClientPkg.dec > index 56e542f03c..f746b0ec30 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.PcdEdkIIRedfishFeatureDriverStartupE > ventGuid|{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 (#89998): https://edk2.groups.io/g/devel/message/89998 Mute This Topic: https://groups.io/mt/91326502/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-