From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0b-002e3701.pphosted.com (mx0b-002e3701.pphosted.com [148.163.143.35]) by mx.groups.io with SMTP id smtpd.web11.23175.1658712964473961430 for ; Sun, 24 Jul 2022 18:36:04 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@hpe.com header.s=pps0720 header.b=boH/oTo2; spf=permerror, err=parse error for token &{10 18 %{ir}.%{v}.%{d}.spf.has.pphosted.com}: invalid domain name (domain: hpe.com, ip: 148.163.143.35, mailfrom: prvs=0205fca832=nickle.wang@hpe.com) Received: from pps.filterd (m0150245.ppops.net [127.0.0.1]) by mx0b-002e3701.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 26OLCcOY003737; Mon, 25 Jul 2022 01:36:02 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hpe.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=pps0720; bh=elLVvDhEbL4DXYiaWjMRFgyYYJ/Sj61UQON62/Wvebs=; b=boH/oTo2l8IaelA/XjxEu4wUjtb+285H9xGZC0wBtMkfpEfDuwfzYa8klx9YSXP/N7aP psFKofoJ75X9ZrFBEDacgPAgTu+aWEeB54WICHwjykKrU4yWIFB1v9hleD4AhXT4cNZ0 mfpv8la/dsTVxtRputD2zGY4g+24fUOmw03b/BsVf6VunIBCyKWdY8kyRU53b3QNTviv cCFFV0BGHy3Lw0h9BDQ5vQL7cfvbye/QKJE9VEQTOjR4FNG3XmA6r951Aa084wvERrgN H7eD+zfaOV2TTXdO/ilJdwA9Lcvv+5k3pWn78ue+YWPpl6z9ZTEb3nRGhSosB6wZubj0 wg== Received: from p1lg14879.it.hpe.com (p1lg14879.it.hpe.com [16.230.97.200]) by mx0b-002e3701.pphosted.com (PPS) with ESMTPS id 3hhdsn14jf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 25 Jul 2022 01:36:01 +0000 Received: from p1lg14886.dc01.its.hpecorp.net (unknown [10.119.18.237]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by p1lg14879.it.hpe.com (Postfix) with ESMTPS id E54E3D2E0; Mon, 25 Jul 2022 01:36:00 +0000 (UTC) Received: from WAFM3XJD5N.asiapacific.hpqcorp.net (unknown [16.231.227.36]) by p1lg14886.dc01.its.hpecorp.net (Postfix) with ESMTP id 93F16800EC6; Mon, 25 Jul 2022 01:35:59 +0000 (UTC) From: "Nickle Wang" To: devel@edk2.groups.io Cc: Abner Chang , Yang Atom , Nick Ramirez Subject: [edk2-staging][PATCH v2 02/15] edk2-staging/RedfishClientPkg: Introduce Redfish version library Date: Mon, 25 Jul 2022 09:35:42 +0800 Message-Id: <20220725013555.926-3-nickle.wang@hpe.com> X-Mailer: git-send-email 2.32.0.windows.2 In-Reply-To: <20220725013555.926-1-nickle.wang@hpe.com> References: <20220725013555.926-1-nickle.wang@hpe.com> MIME-Version: 1.0 X-Proofpoint-GUID: EEkLsR6bI9yGQMg83nSiYFWPapt-aQv4 X-Proofpoint-ORIG-GUID: EEkLsR6bI9yGQMg83nSiYFWPapt-aQv4 X-HPE-SCL: -1 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.883,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-07-23_02,2022-07-21_02,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 mlxlogscore=623 adultscore=0 impostorscore=0 phishscore=0 mlxscore=0 suspectscore=0 priorityscore=1501 lowpriorityscore=0 bulkscore=0 malwarescore=0 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2206140000 definitions=main-2207250005 Content-Transfer-Encoding: 8bit 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 Cc: Abner Chang Cc: Yang Atom Cc: Nick Ramirez --- .../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
+ + 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
+ + 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
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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
+# +# 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/ConverterCommonLib/ConverterCommonLib.inf RedfishEventLib|RedfishClientPkg/Library/RedfishEventLib/RedfishEventLib.inf + RedfishVersionLib|RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.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.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 -- 2.32.0.windows.2