From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (NAM12-BN8-obe.outbound.protection.outlook.com [40.107.237.80]) by mx.groups.io with SMTP id smtpd.web10.33275.1683640745345311892 for ; Tue, 09 May 2023 06:59:05 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@nvidia.com header.s=selector2 header.b=BB9r0Mbd; spf=permerror, err=parse error for token &{10 18 %{i}._ip.%{h}._ehlo.%{d}._spf.vali.email}: invalid domain name (domain: nvidia.com, ip: 40.107.237.80, mailfrom: nicklew@nvidia.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=FOJ8BQxdzipT4azOxd4NwB9OR0al8zt8FrdS4Ln8b2qvr/6hsVYstRzcSXhS0kdScHxTdtP0Z8dCr8yCp3h5q3yV9A3NZG1guLOsXTX5HqMlsCU1KBRO3eWn5Xh5hYK2ncVnEvCH+CZViF3lzKkH/eIw/f/ojRw71LJpSMBJFM11dlFcIBWrbNjK7DpCxZtrWCTd2XbtwiwPiWi+31jkzuY/lTWsvEouuTSQHHsuxbTqZelbFQE50fiAV9qqh1nnwHyMJcdEkVgx3gQfsjmlRB+AiShHIa2qYNvwzx9LiyWtryXOvSNS2ezVMXdjgolDvDSXz4xKhJuQhlJmjMMD+A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=LsDq80LG0TXRDeDeknIPUuJ7ewG659zHff07oqO96Fs=; b=gXgj+yHj94DnIuUpMSjYZb9xFzKjG/DkqC8dDImQMYzsWUroB5CZbTxQsgqT1yAkmZF96VZP3NE5cco6SeF9fpjPCikuU2dGbxkoKX5+hlbGP0pI7E63bmFMPfY4hZwj5jPtdVIJi1cFl7hyOy+tlnNP/RQzdSEqfM/nju1co3PGcVwCCgRUsQArZHgNnyja16lWigwy2FT5NovQoaiqgPg0H6VewWwgvMXb1ny5WHtnmN5e3KLRsF0/sryJUyv3u6f4XhI0Khe+fFLAXw1A3JPdDchsDZ5jXae7gHFkSYkk6x3ZlvHruQ8UAlaEVG7VfJbgUcuj2RKgeKzv+UJ3Qg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=edk2.groups.io smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=LsDq80LG0TXRDeDeknIPUuJ7ewG659zHff07oqO96Fs=; b=BB9r0MbdrNMxdopvn6aoXvSOKe9fdb2Ztae04i6yP3sO4fIYwLllEEX6qJLDwUViSEJLtBheKFda0nq11HpJjorBKsYjtGnv03ciwx8d9rV9jZTZGBgm0cvtS8k2VLZbkDCZixtJXdW5p+a24QhMH7j2Eg/MVyrosZZkfQgdFzv8566nxYhvcfUd06RZWGd5m8ymfkULGYqcAtFuIc6b6k/11ofqvDM+PY+W1n9QzyRI4/DFQrvMv3Hp/hrasuvOfTuALlv+dxH17yOE9YYYQmKbOHDcCiYg5I6GDLhs1jhHz5JOIYuxxOH9MAyFGrGMnlA2LelFWrWp0i6vIqYNOA== Received: from MW4PR04CA0183.namprd04.prod.outlook.com (2603:10b6:303:86::8) by MW4PR12MB7439.namprd12.prod.outlook.com (2603:10b6:303:22b::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6363.33; Tue, 9 May 2023 13:59:02 +0000 Received: from CO1NAM11FT059.eop-nam11.prod.protection.outlook.com (2603:10b6:303:86:cafe::91) by MW4PR04CA0183.outlook.office365.com (2603:10b6:303:86::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6387.18 via Frontend Transport; Tue, 9 May 2023 13:59:02 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by CO1NAM11FT059.mail.protection.outlook.com (10.13.174.160) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6363.33 via Frontend Transport; Tue, 9 May 2023 13:59:00 +0000 Received: from rnnvmail202.nvidia.com (10.129.68.7) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.5; Tue, 9 May 2023 06:58:44 -0700 Received: from rnnvmail202.nvidia.com (10.129.68.7) by rnnvmail202.nvidia.com (10.129.68.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.37; Tue, 9 May 2023 06:58:44 -0700 Received: from NV-CL38DL3.nvidia.com (10.127.8.10) by mail.nvidia.com (10.129.68.7) with Microsoft SMTP Server id 15.2.986.37 via Frontend Transport; Tue, 9 May 2023 06:58:43 -0700 From: "Nickle Wang" To: CC: Abner Chang , Igor Kulchytskyy Subject: [edk2-redfish-client][PATCH 2/6] RedfishClientPkg: Introduce Redfish version library Date: Tue, 9 May 2023 21:58:43 +0800 Message-ID: <20230509135843.6956-1-nicklew@nvidia.com> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 Return-Path: nicklew@nvidia.com X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1NAM11FT059:EE_|MW4PR12MB7439:EE_ X-MS-Office365-Filtering-Correlation-Id: e78a9503-dae2-43f5-6354-08db50958a3d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: y7RV8mEsSrvWYznrIaDRfZyfsmkHEKCkO8/ikhXartznR8wSuqPip2xw+DtWXsLz/athW+7FHefktCFiDxOU3WL7mnQOUjnxh+cp3wyoqq02k1k7FpKmuQlVNYnnnSB9cEOedZhv5Xloi8PSGfCrAu1j8jJ2y0gofb/cEYkOSQzVYldKNX8DNsNdMcfwXU0O4OQBh2tn+4uzr2df1klbpFfYYZ5ZKrEQArTzhCuFSMCRVdWKjFqczTJod+t68B5IEnm9ci8NBsOd+Y1x5j3HuxWKEzt9WcX1qdondtCiKbZe4sTllli1PnvdmYtIlXUbI05H/JpiSy/DEXN35lEwMLMx4lYfB4gFKFSEFIiCSvmrqfTJydX0uKCHyaxhcs+Ay1jMH2YscyBQwRAMOmjd6b5YySFts+CqcZus5IuECFh0z7gjHdrCEj5n6sRHnKXZY1MY/kn4oU6F5iOTvLDpyPSHG2O2ZkZCVyVyjH/eFkPJUWyHq6T10NFGrCcpEnYd6MU8AOLbn/+FHUmTap8YGXWia6+4rEfdTceVq02g3h6Q42EIjM8oEMe0Xwv/NDqO674Igh7AFuFb73CVrxxbovamf0iHv6GwExAyfYSExX56vmXqArl/QnIGYh+ItuVkM/L0rO7U59ZPns8AkW63CBsZxiY0PDzCcl7XdhvrQpCCMlP4nVtWYEjnkvJyLNVFT2B8d9O9UddFXX+qYwrZsg== X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230028)(4636009)(396003)(376002)(346002)(136003)(39860400002)(451199021)(36840700001)(40470700004)(46966006)(316002)(41300700001)(6916009)(8936002)(8676002)(356005)(82740400003)(2906002)(40460700003)(478600001)(36756003)(30864003)(70206006)(54906003)(5660300002)(40480700001)(86362001)(4326008)(7636003)(7696005)(26005)(1076003)(2616005)(83380400001)(82310400005)(426003)(336012)(186003)(36860700001)(47076005)(70586007);DIR:OUT;SFP:1101; X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 May 2023 13:59:00.1747 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e78a9503-dae2-43f5-6354-08db50958a3d X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: CO1NAM11FT059.eop-nam11.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB7439 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain 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: Igor Kulchytskyy --- 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/RedfishVersi= onLib.inf create mode 100644 RedfishClientPkg/Include/Library/RedfishVersionLib.h create mode 100644 RedfishClientPkg/Include/RedfishBase.h create mode 100644 RedfishClientPkg/Library/RedfishVersionLib/RedfishVersi= onLib.c diff --git a/RedfishClientPkg/RedfishClientPkg.dec b/RedfishClientPkg/Redfi= shClientPkg.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 =20 [LibraryClasses.Common.Private] ## @libraryclass Redfish Helper Library @@ -52,4 +53,5 @@ # { 0x7CE88FB3, 0x4BD7, 0x4679, { 0x87, 0xA8, 0xA8, 0xD8, 0xDE, 0xE5, 0x= 0D, 0x2B }} # gEfiRedfishClientPkgTokenSpaceGuid.PcdEdkIIRedfishFeatureDriverStartupEv= entGuid|{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/ConverterCo= mmonLib/ConverterCommonLib.inf =20 RedfishEventLib|RedfishClientPkg/Library/RedfishEventLib/RedfishEventLib= .inf + RedfishVersionLib|RedfishClientPkg/Library/RedfishVersionLib/RedfishVers= ionLib.inf diff --git a/RedfishClientPkg/Library/RedfishVersionLib/RedfishVersionLib.i= nf 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
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION =3D 0x00010006 + BASE_NAME =3D RedfishVersionLib + FILE_GUID =3D 396A7508-B611-49F7-9C81-DAD96B526B61 + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + LIBRARY_CLASS =3D RedfishVersionLib| DXE_DRIVER + CONSTRUCTOR =3D RedfishVersionLibConstructor + DESTRUCTOR =3D RedfishVersionLibDestructor + +# +# VALID_ARCHITECTURES =3D 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 =3D /wd4706 diff --git a/RedfishClientPkg/Include/Library/RedfishVersionLib.h b/Redfish= ClientPkg/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
+ + 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/Incl= ude/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
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef EFI_REDFISH_BASE_H_ +#define EFI_REDFISH_BASE_H_ + +#define IS_EMPTY_STRING(a) ((a) =3D=3D NULL || (a)[0] =3D=3D '\0') +#define REDFISH_DEBUG_TRACE DEBUG_INFO + +/// +/// This GUID is used for an EFI Variable that stores the Redfish data. +/// +EFI_GUID mRedfishVariableGuid =3D { 0x91c46a3d, 0xed1a, 0x477b, { 0xa5, 0= x33, 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
+ + 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 quer= y + 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 =3D=3D NULL) || IS_EMPTY_STRING (Version)) { + return EFI_INVALID_PARAMETER; + } + + if (mCacheService =3D=3D Service) { + return EFI_ALREADY_STARTED; + } + + mCacheService =3D Service; + if (mVersionCache !=3D NULL) { + FreePool (mVersionCache); + } + + mVersionStringSize =3D StrSize (Version); + mVersionCache =3D AllocateCopyPool (mVersionStringSize, Version); + if (mVersionCache =3D=3D NULL) { + mCacheService =3D 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 =3D NULL; + + if (Service =3D=3D NULL) { + goto ON_ERROR; + } + + // + // Use cache to prevent HTTP connection. + // + if (Service =3D=3D mCacheService) { + return AllocateCopyPool (mVersionStringSize, mVersionCache); + } + + // + // Get resource from redfish service. + // + Status =3D RedfishGetByUri ( + Service, + REDFISH_ROOT_URI, + &Response + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a, RedfishGetByService to %a failed: %r\n", __F= UNCTION__, REDFISH_ROOT_URI, Status)); + if (Response.Payload !=3D NULL) { + RedfishDumpPayload (Response.Payload); + RedfishFreeResponse ( + NULL, + 0, + NULL, + Response.Payload + ); + Response.Payload =3D NULL; + } + + goto ON_ERROR; + } + + JsonValue =3D RedfishJsonInPayload (Response.Payload); + if ((JsonValue =3D=3D NULL) || !JsonValueIsObject (JsonValue)) { + goto ON_ERROR; + } + + EDKII_JSON_OBJECT_FOREACH_SAFE (JsonValue, N, Key, Value) { + if ((Key[0] =3D=3D 'v') && JsonValueIsString (Value)) { + VersionString =3D JsonValueGetUnicodeString (Value); + break; + } + } + + if (VersionString !=3D NULL) { + CacheVersion (Service, VersionString); + return VersionString; + } + +ON_ERROR: + + VersionString =3D (CHAR16 *)PcdGetPtr (PcdDefaultRedfishVersion); + if (VersionString =3D=3D NULL) { + VersionString =3D 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 =3D NULL; + mVersionCache =3D NULL; + mVersionStringSize =3D 0; + + return EFI_SUCCESS; +} + +/** + Release allocated resource. + + @param[in] ImageHandle Handle that identifies the image to be unlo= aded. + @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 !=3D NULL) { + FreePool (mVersionCache); + } + + return EFI_SUCCESS; +} --=20 2.17.1