* [edk2-redfish-client][PATCH 2/6] RedfishClientPkg: Introduce Redfish version library
@ 2023-05-09 13:58 Nickle Wang
2023-05-10 1:29 ` Chang, Abner
0 siblings, 1 reply; 2+ messages in thread
From: Nickle Wang @ 2023-05-09 13:58 UTC (permalink / raw)
To: devel; +Cc: Abner Chang, Igor Kulchytskyy
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 <nicklew@nvidia.com>
Cc: Abner Chang <abner.chang@amd.com>
Cc: Igor Kulchytskyy <igork@ami.com>
---
RedfishClientPkg/RedfishClientPkg.dec | 4 +-
RedfishClientPkg/RedfishClientLibs.dsc.inc | 1 +
.../RedfishVersionLib/RedfishVersionLib.inf | 50 +++++
.../Include/Library/RedfishVersionLib.h | 30 +++
RedfishClientPkg/Include/RedfishBase.h | 22 ++
.../RedfishVersionLib/RedfishVersionLib.c | 202 ++++++++++++++++++
6 files changed, 308 insertions(+), 1 deletion(-)
create mode 100644 RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.inf
create mode 100644 RedfishClientPkg/Include/Library/RedfishVersionLib.h
create mode 100644 RedfishClientPkg/Include/RedfishBase.h
create mode 100644 RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.c
diff --git a/RedfishClientPkg/RedfishClientPkg.dec b/RedfishClientPkg/RedfishClientPkg.dec
index 39b2f5ba..2ce51d14 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.PcdEdkIIRedfishFeatureDriverStartupEventGuid|{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
diff --git a/RedfishClientPkg/RedfishClientLibs.dsc.inc b/RedfishClientPkg/RedfishClientLibs.dsc.inc
index ce1c27d8..1cf04069 100644
--- a/RedfishClientPkg/RedfishClientLibs.dsc.inc
+++ b/RedfishClientPkg/RedfishClientLibs.dsc.inc
@@ -29,3 +29,4 @@
ConverterCommonLib|RedfishClientPkg/ConverterLib/edk2library/ConverterCommonLib/ConverterCommonLib.inf
RedfishEventLib|RedfishClientPkg/Library/RedfishEventLib/RedfishEventLib.inf
+ RedfishVersionLib|RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.inf
diff --git a/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.inf b/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.inf
new file mode 100644
index 00000000..34d13d64
--- /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/Include/Library/RedfishVersionLib.h b/RedfishClientPkg/Include/Library/RedfishVersionLib.h
new file mode 100644
index 00000000..319f22bd
--- /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 00000000..1abe9517
--- /dev/null
+++ b/RedfishClientPkg/Include/RedfishBase.h
@@ -0,0 +1,22 @@
+/** @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 00000000..1fd76d7f
--- /dev/null
+++ b/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.c
@@ -0,0 +1,202 @@
+/** @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;
+}
--
2.17.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [edk2-redfish-client][PATCH 2/6] RedfishClientPkg: Introduce Redfish version library
2023-05-09 13:58 [edk2-redfish-client][PATCH 2/6] RedfishClientPkg: Introduce Redfish version library Nickle Wang
@ 2023-05-10 1:29 ` Chang, Abner
0 siblings, 0 replies; 2+ messages in thread
From: Chang, Abner @ 2023-05-10 1:29 UTC (permalink / raw)
To: Nickle Wang, devel@edk2.groups.io; +Cc: Igor Kulchytskyy
[AMD Official Use Only - General]
Reviewed-by: Abner Chang <abner.chang@amd.com>
> -----Original Message-----
> From: Nickle Wang <nicklew@nvidia.com>
> Sent: Tuesday, May 9, 2023 9:59 PM
> To: devel@edk2.groups.io
> Cc: Chang, Abner <Abner.Chang@amd.com>; Igor Kulchytskyy
> <igork@ami.com>
> Subject: [edk2-redfish-client][PATCH 2/6] RedfishClientPkg: Introduce
> Redfish version library
>
> Caution: This message originated from an External Source. Use proper
> caution when opening attachments, clicking links, or responding.
>
>
> 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 <nicklew@nvidia.com>
> Cc: Abner Chang <abner.chang@amd.com>
> Cc: Igor Kulchytskyy <igork@ami.com>
> ---
> RedfishClientPkg/RedfishClientPkg.dec | 4 +-
> RedfishClientPkg/RedfishClientLibs.dsc.inc | 1 +
> .../RedfishVersionLib/RedfishVersionLib.inf | 50 +++++
> .../Include/Library/RedfishVersionLib.h | 30 +++
> RedfishClientPkg/Include/RedfishBase.h | 22 ++
> .../RedfishVersionLib/RedfishVersionLib.c | 202 ++++++++++++++++++
> 6 files changed, 308 insertions(+), 1 deletion(-) create mode 100644
> RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.inf
> create mode 100644 RedfishClientPkg/Include/Library/RedfishVersionLib.h
> create mode 100644 RedfishClientPkg/Include/RedfishBase.h
> create mode 100644
> RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.c
>
> diff --git a/RedfishClientPkg/RedfishClientPkg.dec
> b/RedfishClientPkg/RedfishClientPkg.dec
> index 39b2f5ba..2ce51d14 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
> diff --git a/RedfishClientPkg/RedfishClientLibs.dsc.inc
> b/RedfishClientPkg/RedfishClientLibs.dsc.inc
> index ce1c27d8..1cf04069 100644
> --- a/RedfishClientPkg/RedfishClientLibs.dsc.inc
> +++ b/RedfishClientPkg/RedfishClientLibs.dsc.inc
> @@ -29,3 +29,4 @@
>
> ConverterCommonLib|RedfishClientPkg/ConverterLib/edk2library/Converte
> rCommonLib/ConverterCommonLib.inf
>
>
> RedfishEventLib|RedfishClientPkg/Library/RedfishEventLib/RedfishEventLib.i
> nf
> +
> + RedfishVersionLib|RedfishClientPkg/Library/RedfishVersionLib/RedfishVe
> + rsionLib.inf
> diff --git a/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.inf
> b/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.inf
> new file mode 100644
> index 00000000..34d13d64
> --- /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/Include/Library/RedfishVersionLib.h
> b/RedfishClientPkg/Include/Library/RedfishVersionLib.h
> new file mode 100644
> index 00000000..319f22bd
> --- /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 00000000..1abe9517
> --- /dev/null
> +++ b/RedfishClientPkg/Include/RedfishBase.h
> @@ -0,0 +1,22 @@
> +/** @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 00000000..1fd76d7f
> --- /dev/null
> +++ b/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.c
> @@ -0,0 +1,202 @@
> +/** @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;
> +}
> --
> 2.17.1
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2023-05-10 1:29 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-09 13:58 [edk2-redfish-client][PATCH 2/6] RedfishClientPkg: Introduce Redfish version library Nickle Wang
2023-05-10 1:29 ` Chang, Abner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox