From: "Nickle Wang" <nicklew@nvidia.com>
To: <devel@edk2.groups.io>
Cc: Abner Chang <abner.chang@amd.com>, Igor Kulchytskyy <igork@ami.com>
Subject: [edk2-redfish-client][PATCH 2/6] RedfishClientPkg: Introduce Redfish version library
Date: Tue, 9 May 2023 21:58:43 +0800 [thread overview]
Message-ID: <20230509135843.6956-1-nicklew@nvidia.com> (raw)
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
next reply other threads:[~2023-05-09 13:59 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-09 13:58 Nickle Wang [this message]
2023-05-10 1:29 ` [edk2-redfish-client][PATCH 2/6] RedfishClientPkg: Introduce Redfish version library Chang, Abner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230509135843.6956-1-nicklew@nvidia.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox