From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id C3C40740046 for ; Wed, 3 Jan 2024 13:01:47 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=QeTCxjFVwcNpn1ssg+RrM1QgXRj/6v+qrBVUs6gpWj0=; c=relaxed/simple; d=groups.io; h=ARC-Seal:ARC-Message-Signature:ARC-Authentication-Results:From:To:CC:Subject:Thread-Topic:Thread-Index:Date:Message-ID:References:In-Reply-To:Accept-Language:msip_labels:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Language:Content-Type:Content-Transfer-Encoding; s=20140610; t=1704286906; v=1; b=tmCABZCaY2hRMfZHKQLNqeJfp4gA8F2+GO6TtYPIAcVs4kfTRYShbQ4PVFmzqqs2O9M7soh1 Ohdog2fi+G5SRtmUqDWMvJsHbQb9SGUmxKSCbl+Lxm7yIb0UXiOZdIzb2/TUdKZHlI4/+Oiy6OW qM4wCJiP7jgthfPOjMRKsh8c= X-Received: by 127.0.0.2 with SMTP id PZ7QYY7687511xBmn7SHE4zE; Wed, 03 Jan 2024 05:01:46 -0800 X-Received: from NAM02-SN1-obe.outbound.protection.outlook.com (NAM02-SN1-obe.outbound.protection.outlook.com [40.107.96.88]) by mx.groups.io with SMTP id smtpd.web11.16778.1704286905557037278 for ; Wed, 03 Jan 2024 05:01:45 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=h0zLhglFUBI2bQBsVzsS0oKL0c6rsKExj/0V4y8zo5trpmeRGZRzgPnZ3MCagRTTxEI8/0NcAyqv9/MEA9Epw3Tmakz00kwQLqeOndMZ9UV6rSwdGyebLIYAecXGEE9mBbDWQ4GBPLuhlaUOu3EUQtI7tbqJJKHERaj9BavMyAkrLoZHFrucmyTaP1zJBbVgOAymbHJJEl9H1IKCJ+K3LO1Xb/ddTso1x8f5GiwBYShPm8CyQpzCZl7xxrpUEnMAsZ7DVYwkmu/kPXXEhBXOBdalMhTc0EG8V7ugcGhE7ziEIFxdmU9Ug5TWmNOcXF0cWeF8uvFdkUFkxtwZ9vB3Nw== 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=d6JTupg3d+is0n5ZIi8N4PzNN7flalj4NJVZPuvEMfw=; b=lqEAdhdMYXlWrH81d8LF0Pxsz/63mITbbjVOq02dkuiIO2ghHkpGPHqXpYz2Ip1kANGHFqQilBb2dPOu9S459TEdPT6Oi1eW62Y9Wvi6lXjIOzRbmseasBa7Dp2ilsY9IUtk80gHmZwsfImwBIR7mEax0euwFIMSJG13gZZopuzLbOh7r3lBIk5ke1wuo+r5w3iUvpO5DYKeSPzkEygrP2lQNCWq2YN5k+HinY3cRtDVbuB0tXFfpLojq/eNEr4aWqxxXdv7afTMGW1MpZDexmOQeIRbhgF+YVPjHYaJC8w51VDjZANTdk8s4GjD+ehTjMPu5a/Fk8pg/xp0VzMX4Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none X-Received: from MN2PR12MB3966.namprd12.prod.outlook.com (2603:10b6:208:165::18) by BL1PR12MB5378.namprd12.prod.outlook.com (2603:10b6:208:31d::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7159.13; Wed, 3 Jan 2024 13:01:42 +0000 X-Received: from MN2PR12MB3966.namprd12.prod.outlook.com ([fe80::91d9:e679:32a3:dd05]) by MN2PR12MB3966.namprd12.prod.outlook.com ([fe80::91d9:e679:32a3:dd05%5]) with mapi id 15.20.7159.013; Wed, 3 Jan 2024 13:01:41 +0000 From: "Chang, Abner via groups.io" To: Nickle Wang , "devel@edk2.groups.io" CC: Igor Kulchytskyy , Nick Ramirez Subject: Re: [edk2-devel] [edk2-redfish-client][PATCH 01/10] RedfishClientPkg: introduce Redfish HTTP cache library Thread-Topic: [edk2-redfish-client][PATCH 01/10] RedfishClientPkg: introduce Redfish HTTP cache library Thread-Index: AQHaPjxpzKdB3AI9nkK4Lj+TFlGhkbDIC+sg Date: Wed, 3 Jan 2024 13:01:41 +0000 Message-ID: References: <20240103115955.61695-1-nicklew@nvidia.com> In-Reply-To: <20240103115955.61695-1-nicklew@nvidia.com> Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: msip_labels: MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_ActionId=4ee4c91c-cf0c-4a49-89a6-f8a5c4852071;MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_ContentBits=0;MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Enabled=true;MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Method=Standard;MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_Name=General;MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_SetDate=2024-01-03T12:55:57Z;MSIP_Label_4342314e-0df4-4b58-84bf-38bed6170a0f_SiteId=3dd8961f-e488-4e60-8e11-a82d994e183d; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: MN2PR12MB3966:EE_|BL1PR12MB5378:EE_ x-ms-office365-filtering-correlation-id: 8f3b9078-f908-4cbb-730c-08dc0c5c2175 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam-message-info: Z271AUSCzH27EJJzEHkKqJI+W1Xbh4IgIee6vrf3REUbEFfxZl54oGMR8QjlaF623A3yXIuQsdedRzhkILzwICjxIIATTZHql1Der0E0j05sjmuo0r6yERHgx1GLyUwrOKNmjw4/VM/jN7lEFcFJ5sRbqyQ5OJ+OHlG72wN4jfdB/BOY4JApGONNNxg3k6Apfrrkb00J8nueLIjCVcf3HeLmrftRzd6BpusbTi3wvLL5Wb2F488rbUvDN/ZCujHtNF07fm0LlZyqI87tLJdYpBeiISsbFGt2ESyeNcVL6y4ncgwC4RBUVCLiJ7V+Ih6Ht0g6J9RCEC2ae+YOarfyr/j0kZMdtxLP7hgkF28RVv8SIl+vsgfuUmIxhToAhmZjtZGRep2RfWSWbV6GcEq2MJGCD7qY5hRgxTstpsYXH0q1kale4CWhAhfapXAUMkvwJbPRt0UXyDsdXAWksPKh1AQzxyz4nGczN+607hIos1tKHmsl9UCXdHHHY/7AADsGexk4GJ31OwkAq1nYYLkmVnJQSKf3Y/dkNdTUyenSV7ZHLP16fASJ1AFJ12+1zx6zYcO1pm/r7RrEAhojYKQOBfchmGQ7spRB2q7wHvcWn5FWL/bYgHoUEQDeHnRQmmL3gALBDWvha9YsZnoz/zMFecZfkZCGiSKOFJPKPMR/Vl0= x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?dMD8idAEvIQ/+tCUxsrBsFu9qtv64I0C8xQnT83366vNSZh2n2NcySL/y+T6?= =?us-ascii?Q?54I/ZD7biK8jh74Dqpy9lj4cYT4LItzTFipC1k1ht43w+zKE4XS1viYyVfBM?= =?us-ascii?Q?KwwPJjxAGxQYU7TT23c2d4jOn2JmEygJ4XVsE/8oar9dADJtQ3EhtpxjjNl6?= =?us-ascii?Q?iq5op/u7pokR+3BYVnJ5XpWi/+5xsNnDWEQhQwev8LroHa0htKCzxYOOFWof?= =?us-ascii?Q?QOzsRUteihVOrki90oyW4J7s4NCu/Bv140pEP5UyJ3odhq7B3ZmG3E+5CdiO?= =?us-ascii?Q?hy9ra8490xKKC5NUhe/sNQkjQprL7FaVZOEI9272KLb83oBf8jzrnReMKSih?= =?us-ascii?Q?mUeSKibQK4sg20Ic0LhWuhblbDzlzUu9Hm+e4QRLnhbqK3Fg6O93c+HcRZaH?= =?us-ascii?Q?8BwLYoSg/2ZXQ2+BFqwULwHLZgH0yvhvQONDIkYhCbWDY0NqXRzOTzOlX7D+?= =?us-ascii?Q?WsRUFmvXP3KI4dl/OwhFs+rBX2AVYswdE5+YqoMEwjO3Dz3nSrGues7+83hF?= =?us-ascii?Q?lKN2LzhvqBSs9HRKi0H12CXwv8rmeAxpmOI34LPwK3fpNDcfwGShvwC3zC0a?= =?us-ascii?Q?hApfd9/PfZHJuUAMi08wyqew/pjeQaXwcDN3HJuqATC24mz3lLAxbvj4ickv?= =?us-ascii?Q?ZL/zB/5iysc4YWwbMI8Umi5Ux8VxAlMyL4QsbycbkWP8Gu+dx6etK1scgUc6?= =?us-ascii?Q?XMKlMBagrCha8HqMkryVueY4QmrxGYs3v7WwQEHOMsUUs4J4EJoN5CQ5GiAG?= =?us-ascii?Q?MYpDRl+VK8rGMAiZ3TWyKIj446LLkzh9ksLN9vQJGEiAaa0+70/NYQxd/7F5?= =?us-ascii?Q?hjQgpopD6SMOf1adFUkgpCQn2J7kPG8AEhWBUXfTXCmIVuQleAU3AOzrQcgp?= =?us-ascii?Q?Wve7CPJ3Svz9R1+0vQglBTsuallhTpaXsu3siwkrvW7Igi2cGqj87X+sRcNb?= =?us-ascii?Q?aQXHX3reiTqu5SQA8B5BtCAhYwi46HdWCjIqnEnd+5QgSRvvOpHmv1cPVTPf?= =?us-ascii?Q?hiZXh90Unt2VHQ6l0DrJHAawR/8aydWZnqQQ/5zMjIKWUYeU4pF7kTj7eiG6?= =?us-ascii?Q?rJR4RD9mstae9JDILPS4s0t592TzvqegC66rJ0EA4baHxDhyYeHKpXwLFcvp?= =?us-ascii?Q?S/cTz6Hmz7/gGFP2DxQUGcfCOusH+Qg4cws56ol9jlQIWg2CKD11G+RVzw3s?= =?us-ascii?Q?IHz2MxZmhCr4LTq/0sTZj5UY4r9eTbpr3uddJVl+J76nPvdiCLlwH7cPpI73?= =?us-ascii?Q?cKQ0OtJ534kNI8jmZ/7uM911/bEplqHuPYXQqJHPiDjJig3yPa3ZLhRh65bH?= =?us-ascii?Q?ILVkzRXS8CD4VhVdkwT6wRmQrRBsqYL3hCLmMykJuweY9dlikKUjmawpn77e?= =?us-ascii?Q?d2la+S2CSslq0pyHFl8usZ9aO68FtlcEnuxau9vC1QeFVDammhGblukaQwOY?= =?us-ascii?Q?bj8RKdtz3qKMHprcfNDEloYCT/rQUob2SovUl0w0h2PFy3Q4z+8CmOgg/tci?= =?us-ascii?Q?fI6Ic07+wUjVZcd5XaV4I12ANDmUjmrI9cmUstHUmiO0EG6/oRf4Mqeya4sR?= =?us-ascii?Q?07niq4BPOahXe7nD6mw=3D?= MIME-Version: 1.0 X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3966.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8f3b9078-f908-4cbb-730c-08dc0c5c2175 X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Jan 2024 13:01:41.7078 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: Nkq/gPgPJtFd+vb5wg99b3X8XLQ378wK5drtMW1Z35rhuGs0laaik1fj9A+VEZnoOBb1S7YNE59DVCpFTeDwbg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL1PR12MB5378 Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,abner.chang@amd.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: 2SzXKB5WB0yBTFFbdWOuwDisx7686176AA= Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=tmCABZCa; dmarc=none; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io; arc=reject ("signature check failed: fail, {[1] = sig:microsoft.com:reject}") [AMD Official Use Only - General] Hi Nickle, I have no problem with this feature as we have been using this for a while.= Per discussion off line, HttpCacheLibrary would be replaced with protocol= version later. I would just give my RB to this patch as this patch is sent= for cleaning up the backlogs we are going to upstream. But before we merging this patch, could you please replace all "BMC" term i= n these files with either Redfish service or service? Thanks. Abner > -----Original Message----- > From: Nickle Wang > Sent: Wednesday, January 3, 2024 8:00 PM > To: devel@edk2.groups.io > Cc: Chang, Abner ; Igor Kulchytskyy > ; Nick Ramirez > Subject: [edk2-redfish-client][PATCH 01/10] RedfishClientPkg: introduce > Redfish HTTP cache library > > Caution: This message originated from an External Source. Use proper caut= ion > when opening attachments, clicking links, or responding. > > > Introduce RedfishHttpCacheLib to improve HTTP GET performance > in Redfish feature drivers. Feature drivers often query same > Redfish resource multiple times for different purpose. Add > HTTP cache mechanism to improve the performance. > > Signed-off-by: Nickle Wang > Cc: Abner Chang > Cc: Igor Kulchytskyy > Cc: Nick Ramirez > --- > RedfishClientPkg/RedfishClientPkg.dec | 3 +- > RedfishClientPkg/RedfishClientLibs.dsc.inc | 3 +- > RedfishClientPkg/RedfishClientPkg.dsc | 3 +- > .../RedfishHttpCacheLib.inf | 48 ++ > .../Include/Library/RedfishHttpCacheLib.h | 59 ++ > .../RedfishHttpCacheLibInternal.h | 63 ++ > .../RedfishHttpCacheLib/RedfishHttpCacheLib.c | 774 ++++++++++++++++++ > 7 files changed, 950 insertions(+), 3 deletions(-) > create mode 100644 > RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.inf > create mode 100644 > RedfishClientPkg/Include/Library/RedfishHttpCacheLib.h > create mode 100644 > RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLibInternal.= h > create mode 100644 > RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.c > > diff --git a/RedfishClientPkg/RedfishClientPkg.dec > b/RedfishClientPkg/RedfishClientPkg.dec > index 5f8a0350..b350faca 100644 > --- a/RedfishClientPkg/RedfishClientPkg.dec > +++ b/RedfishClientPkg/RedfishClientPkg.dec > @@ -2,7 +2,7 @@ > # Redfish Client Package > # > # (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP
> -# Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights > reserved. > +# Copyright (c) 2022-2024, NVIDIA CORPORATION & AFFILIATES. All rights > reserved. > # > # SPDX-License-Identifier: BSD-2-Clause-Patent > ## > @@ -26,6 +26,7 @@ > > EdkIIRedfishResourceConfigLib|Include/Library/EdkIIRedfishResourceConfigL= i > b.h > RedfishEventLib|Include/Library/RedfishEventLib.h > RedfishVersionLib|Include/Library/RedfishVersionLib.h > + RedfishHttpCacheLib|Include/Library/RedfishHttpCacheLib.h > > [LibraryClasses.Common.Private] > ## @libraryclass Redfish Helper Library > diff --git a/RedfishClientPkg/RedfishClientLibs.dsc.inc > b/RedfishClientPkg/RedfishClientLibs.dsc.inc > index 5eae6711..572f426e 100644 > --- a/RedfishClientPkg/RedfishClientLibs.dsc.inc > +++ b/RedfishClientPkg/RedfishClientLibs.dsc.inc > @@ -6,7 +6,7 @@ > # of EDKII network library classes. > # > # (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP
> -# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights > reserved. > +# Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights > reserved. > # > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > @@ -40,3 +40,4 @@ > > RedfishVersionLib|RedfishClientPkg/Library/RedfishVersionLib/RedfishVersi= o > nLib.inf > > RedfishAddendumLib|RedfishClientPkg/Library/RedfishAddendumLib/Redfis > hAddendumLib.inf > RedfishDebugLib|RedfishPkg/Library/RedfishDebugLib/RedfishDebugLib.inf > + > RedfishHttpCacheLib|RedfishClientPkg/Library/RedfishHttpCacheLib/Redfish > HttpCacheLib.inf > diff --git a/RedfishClientPkg/RedfishClientPkg.dsc > b/RedfishClientPkg/RedfishClientPkg.dsc > index e16c91b8..0e3ef1ac 100644 > --- a/RedfishClientPkg/RedfishClientPkg.dsc > +++ b/RedfishClientPkg/RedfishClientPkg.dsc > @@ -2,7 +2,7 @@ > # Redfish Client Package > # > # (C) Copyright 2021 Hewlett-Packard Enterprise Development LP. > -# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights > reserved. > +# Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights > reserved. > # > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > @@ -61,5 +61,6 @@ > > RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLi= b.inf > RedfishClientPkg/PrivateLibrary/RedfishLib/RedfishLib.inf > RedfishClientPkg/Library/RedfishAddendumLib/RedfishAddendumLib.inf > + RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.inf > > !include RedfishClientPkg/RedfishClient.dsc.inc > diff --git > a/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.inf > b/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.inf > new file mode 100644 > index 00000000..32da4f83 > --- /dev/null > +++ > b/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.inf > @@ -0,0 +1,48 @@ > +## @file > +# Redfish HTTP cache library helps Redfish application to get Redfish > resource > +# from BMC with cache mechanism enabled. > +# > +# Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights > reserved. > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION =3D 0x00010006 > + BASE_NAME =3D RedfishHttpCacheLib > + FILE_GUID =3D 21F8FEEC-023C-451D-824D-823058FD948= 1 > + MODULE_TYPE =3D DXE_DRIVER > + VERSION_STRING =3D 1.0 > + LIBRARY_CLASS =3D RedfishHttpCacheLib| DXE_DRIVER UEF= I_DRIVER > + CONSTRUCTOR =3D RedfishHttpCacheConstructor > + DESTRUCTOR =3D RedfishHttpCacheDestructor > + > +# > +# VALID_ARCHITECTURES =3D IA32 X64 EBC > +# > + > +[Sources] > + RedfishHttpCacheLibInternal.h > + RedfishHttpCacheLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + RedfishPkg/RedfishPkg.dec > + RedfishClientPkg/RedfishClientPkg.dec > + > +[LibraryClasses] > + BaseLib > + DebugLib > + UefiBootServicesTableLib > + MemoryAllocationLib > + RedfishLib > + UefiLib > + RedfishDebugLib > + ReportStatusCodeLib > + PrintLib > + > +[depex] > + TRUE > + > diff --git a/RedfishClientPkg/Include/Library/RedfishHttpCacheLib.h > b/RedfishClientPkg/Include/Library/RedfishHttpCacheLib.h > new file mode 100644 > index 00000000..1277b981 > --- /dev/null > +++ b/RedfishClientPkg/Include/Library/RedfishHttpCacheLib.h > @@ -0,0 +1,59 @@ > +/** @file > + This file defines the Redfish HTTP cache library interface. > + > + Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights > reserved. > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef REDFISH_HTTP_CACHE_LIB_H_ > +#define REDFISH_HTTP_CACHE_LIB_H_ > + > +#include > +#include > + > +/** > + Get redfish resource from given resource URI with cache mechanism > + supported. It's caller's responsibility to Response by calling > + RedfishFreeResponse (). > + > + @param[in] Service Redfish service instance to make query. > + @param[in] Uri Target resource URI. > + @param[out] Response HTTP response from redfish service. > + @param[in] UseCache If it is TRUE, this function will search for > + cache first. If it is FALSE, this function > + will query Redfish URI directly. > + > + @retval EFI_SUCCESS Resrouce is returned successfully. > + @retval Others Errors occur. > + > +**/ > +EFI_STATUS > +RedfishHttpGetResource ( > + IN REDFISH_SERVICE Service, > + IN EFI_STRING Uri, > + OUT REDFISH_RESPONSE *Response, > + IN BOOLEAN UseCache > + ); > + > +/** > + Reset the cached data specified by given URI. When response data > + returned by RedfishHttpResetResource() is modified, the response > + data can not be used by other caller. Application calls this > + function to make this data to be stale data and > + RedfishHttpResetResource() will get latest data from remote server > + again. > + > + @param[in] Uri Target resource URI. > + > + @retval EFI_SUCCESS Resrouce is reset successfully. > + @retval Others Errors occur. > + > +**/ > +EFI_STATUS > +RedfishHttpResetResource ( > + IN EFI_STRING Uri > + ); > + > +#endif > diff --git > a/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLibInterna > l.h > b/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLibInterna > l.h > new file mode 100644 > index 00000000..2549335d > --- /dev/null > +++ > b/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLibInterna > l.h > @@ -0,0 +1,63 @@ > +/** @file > + This file defines the Redfish HTTP cache library internal headers. > + > + Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights > reserved. > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef REDFISH_HTTP_CACHE_INTERNAL_LIB_H_ > +#define REDFISH_HTTP_CACHE_INTERNAL_LIB_H_ > + > +#include > +#include > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define REDFISH_HTTP_CACHE_LIST_SIZE 0x0F > +#define REDFISH_HTTP_GET_RETRY_MAX 0x0F > +#define REDFISH_HTTP_RETRY_WAIT (2 * 1000000U) ///< 1 second > +#define REDFISH_ERROR_MSG_MAX 128 > +#define REDFISH_HTTP_ERROR_REPORT "Redfish HTTP failure(0x%x): %a" > +#define REDFISH_HTTP_CACHE_DEBUG DEBUG_VERBOSE > +#define REDFISH_HTTP_CACHE_DEBUG_DUMP DEBUG_VERBOSE > + > +/// > +/// Definition of REDFISH_HTTP_CACHE_DATA > +/// > +typedef struct { > + LIST_ENTRY List; > + EFI_STRING Uri; > + UINTN HitCount; > + REDFISH_RESPONSE *Response; > +} REDFISH_HTTP_CACHE_DATA; > + > +#define REDFISH_HTTP_CACHE_FROM_LIST(a) BASE_CR (a, > REDFISH_HTTP_CACHE_DATA, List) > + > +/// > +/// Definition of REDFISH_HTTP_CACHE_LIST > +/// > +typedef struct { > + LIST_ENTRY Head; > + UINTN Count; > + UINTN Capacity; > +} REDFISH_HTTP_CACHE_LIST; > + > +/// > +/// Definition of REDFISH_HTTP_CACHE_PRIVATE > +/// > +typedef struct { > + REDFISH_HTTP_CACHE_LIST CacheList; > +} REDFISH_HTTP_CACHE_PRIVATE; > + > +#endif > diff --git > a/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.c > b/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.c > new file mode 100644 > index 00000000..c751e608 > --- /dev/null > +++ b/RedfishClientPkg/Library/RedfishHttpCacheLib/RedfishHttpCacheLib.c > @@ -0,0 +1,774 @@ > +/** @file > + Redfish HTTP cache library helps Redfish application to get Redfish re= source > + from BMC with cache mechanism enabled. > + > + Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights > reserved. > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include "RedfishHttpCacheLibInternal.h" > + > +REDFISH_HTTP_CACHE_PRIVATE *mRedfishHttpCachePrivate =3D NULL; > + > +/** > + This function copy the data in SrcResponse to DstResponse. > + > + @param[in] SrcResponse Source Response to copy. > + @param[out] DstResponse Destination Response. > + > + @retval EFI_SUCCESS Response is copied successfully. > + @retval Others Error occurs. > + > +**/ > +EFI_STATUS > +CopyRedfishResponse ( > + IN REDFISH_RESPONSE *SrcResponse, > + OUT REDFISH_RESPONSE *DstResponse > + ) > +{ > + EDKII_JSON_VALUE JsonValue; > + REDFISH_SERVICE Service; > + UINTN Index; > + > + if ((SrcResponse =3D=3D NULL) || (DstResponse =3D=3D NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (SrcResponse =3D=3D DstResponse) { > + return EFI_SUCCESS; > + } > + > + // > + // Status code > + // > + if (SrcResponse->StatusCode !=3D NULL) { > + DstResponse->StatusCode =3D AllocateCopyPool (sizeof > (EFI_HTTP_STATUS_CODE), SrcResponse->StatusCode); > + if (DstResponse->StatusCode =3D=3D NULL) { > + goto ON_ERROR; > + } > + } > + > + // > + // Header > + // > + if ((SrcResponse->HeaderCount > 0) && (SrcResponse->Headers !=3D NULL)= ) { > + DstResponse->HeaderCount =3D 0; > + DstResponse->Headers =3D AllocateZeroPool (sizeof (EFI_HTTP_HEAD= ER) * > SrcResponse->HeaderCount); > + if (DstResponse->Headers =3D=3D NULL) { > + goto ON_ERROR; > + } > + > + for (Index =3D 0; Index < SrcResponse->HeaderCount; Index++) { > + DstResponse->Headers[Index].FieldName =3D AllocateCopyPool (AsciiS= trSize > (SrcResponse->Headers[Index].FieldName), SrcResponse- > >Headers[Index].FieldName); > + if (DstResponse->Headers[Index].FieldName =3D=3D NULL) { > + goto ON_ERROR; > + } > + > + DstResponse->Headers[Index].FieldValue =3D AllocateCopyPool (Ascii= StrSize > (SrcResponse->Headers[Index].FieldValue), SrcResponse- > >Headers[Index].FieldValue); > + if (DstResponse->Headers[Index].FieldValue =3D=3D NULL) { > + goto ON_ERROR; > + } > + > + DstResponse->HeaderCount +=3D 1; > + } > + } > + > + // > + // Payload > + // > + if (SrcResponse->Payload !=3D NULL) { > + Service =3D RedfishServiceInPayload (SrcResponse->Paylo= ad); > + JsonValue =3D RedfishJsonInPayload (SrcResponse->Payload)= ; > + DstResponse->Payload =3D RedfishCreatePayload (JsonValue, Service); > + if (DstResponse->Payload =3D=3D NULL) { > + goto ON_ERROR; > + } > + } > + > + return EFI_SUCCESS; > + > +ON_ERROR: > + > + RedfishFreeResponse ( > + DstResponse->StatusCode, > + DstResponse->HeaderCount, > + DstResponse->Headers, > + DstResponse->Payload > + ); > + > + return EFI_OUT_OF_RESOURCES; > +} > + > +/** > + This function clone input response and return to caller > + > + @param[in] Response Response to clone. > + > + @retval REDFISH_RESPONSE * Response is cloned. > + @retval NULL Errors occur. > + > +**/ > +REDFISH_RESPONSE * > +CloneRedfishResponse ( > + IN REDFISH_RESPONSE *Response > + ) > +{ > + EFI_STATUS Status; > + REDFISH_RESPONSE *NewResponse; > + > + if (Response =3D=3D NULL) { > + return NULL; > + } > + > + NewResponse =3D AllocateZeroPool (sizeof (REDFISH_RESPONSE)); > + if (NewResponse =3D=3D NULL) { > + return NULL; > + } > + > + Status =3D CopyRedfishResponse (Response, NewResponse); > + if (EFI_ERROR (Status)) { > + FreePool (NewResponse); > + return NULL; > + } > + > + return NewResponse; > +} > + > +/** > + > + Convert Unicode string to ASCII string. It's call responsibility to re= lease > returned buffer. > + > + @param[in] UnicodeStr Unicode string to convert. > + > + @retval CHAR8 * ASCII string returned. > + @retval NULL Errors occur. > + > +**/ > +CHAR8 * > +StringUnicodeToAscii ( > + IN EFI_STRING UnicodeStr > + ) > +{ > + CHAR8 *AsciiStr; > + UINTN AsciiStrSize; > + EFI_STATUS Status; > + > + if (IS_EMPTY_STRING (UnicodeStr)) { > + return NULL; > + } > + > + AsciiStrSize =3D StrLen (UnicodeStr) + 1; > + AsciiStr =3D AllocatePool (AsciiStrSize); > + if (AsciiStr =3D=3D NULL) { > + return NULL; > + } > + > + Status =3D UnicodeStrToAsciiStrS (UnicodeStr, AsciiStr, AsciiStrSize); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "UnicodeStrToAsciiStrS failed: %r\n", Status)); > + FreePool (AsciiStr); > + return NULL; > + } > + > + return AsciiStr; > +} > + > +/** > + Release REDFISH_HTTP_CACHE_DATA resource > + > + @param[in] Data Pointer to REDFISH_HTTP_CACHE_DATA instance > + > + @retval EFI_SUCCESS REDFISH_HTTP_CACHE_DATA is released > successfully. > + @retval EFI_INVALID_PARAMETER Data is NULL > + > +**/ > +EFI_STATUS > +ReleaseHttpCacheData ( > + IN REDFISH_HTTP_CACHE_DATA *Data > + ) > +{ > + if (Data =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (Data->Uri !=3D NULL) { > + FreePool (Data->Uri); > + } > + > + if (Data->Response !=3D NULL) { > + if (Data->Response->Payload !=3D NULL) { > + RedfishFreeResponse ( > + Data->Response->StatusCode, > + Data->Response->HeaderCount, > + Data->Response->Headers, > + Data->Response->Payload > + ); > + FreePool (Data->Response); > + } > + } > + > + FreePool (Data); > + > + return EFI_SUCCESS; > +} > + > +/** > + Create new cache data. > + > + @param[in] Uri The URI string matching to this cache data. > + @param[in] Response HTTP response. > + > + @retval REDFISH_HTTP_CACHE_DATA * Pointer to newly created cache > data. > + @retval NULL No memory available. > + > +**/ > +REDFISH_HTTP_CACHE_DATA * > +NewHttpCacheData ( > + IN EFI_STRING Uri, > + IN REDFISH_RESPONSE *Response > + ) > +{ > + REDFISH_HTTP_CACHE_DATA *NewData; > + UINTN Size; > + > + if (IS_EMPTY_STRING (Uri) || (Response =3D=3D NULL)) { > + return NULL; > + } > + > + NewData =3D AllocateZeroPool (sizeof (REDFISH_HTTP_CACHE_DATA)); > + if (NewData =3D=3D NULL) { > + return NULL; > + } > + > + Size =3D StrSize (Uri); > + NewData->Uri =3D AllocateCopyPool (Size, Uri); > + if (NewData->Uri =3D=3D NULL) { > + goto ON_ERROR; > + } > + > + NewData->Response =3D Response; > + NewData->HitCount =3D 1; > + > + return NewData; > + > +ON_ERROR: > + > + if (NewData !=3D NULL) { > + ReleaseHttpCacheData (NewData); > + } > + > + return NULL; > +} > + > +/** > + Search on given ListHeader for given URI string. > + > + @param[in] ListHeader Target list to search. > + @param[in] Uri Target URI to search. > + > + @retval REDFISH_HTTP_CACHE_DATA Target cache data is found. > + @retval NULL No cache data with given URI is foun= d. > + > +**/ > +REDFISH_HTTP_CACHE_DATA * > +FindHttpCacheData ( > + IN LIST_ENTRY *ListHeader, > + IN EFI_STRING Uri > + ) > +{ > + LIST_ENTRY *List; > + REDFISH_HTTP_CACHE_DATA *Data; > + > + if (IS_EMPTY_STRING (Uri)) { > + return NULL; > + } > + > + if (IsListEmpty (ListHeader)) { > + return NULL; > + } > + > + Data =3D NULL; > + List =3D GetFirstNode (ListHeader); > + while (!IsNull (ListHeader, List)) { > + Data =3D REDFISH_HTTP_CACHE_FROM_LIST (List); > + > + if (StrCmp (Data->Uri, Uri) =3D=3D 0) { > + return Data; > + } > + > + List =3D GetNextNode (ListHeader, List); > + } > + > + return NULL; > +} > + > +/** > + Search on given ListHeader and return cache data with minimum hit coun= t. > + > + @param[in] ListHeader Target list to search. > + > + @retval REDFISH_HTTP_CACHE_DATA Target cache data is returned. > + @retval NULL No cache data is found. > + > +**/ > +REDFISH_HTTP_CACHE_DATA * > +FindUnusedHttpCacheData ( > + IN LIST_ENTRY *ListHeader > + ) > +{ > + LIST_ENTRY *List; > + REDFISH_HTTP_CACHE_DATA *Data; > + REDFISH_HTTP_CACHE_DATA *UnusedData; > + UINTN HitCount; > + > + if (IsListEmpty (ListHeader)) { > + return NULL; > + } > + > + Data =3D NULL; > + UnusedData =3D NULL; > + HitCount =3D 0; > + > + List =3D GetFirstNode (ListHeader); > + Data =3D REDFISH_HTTP_CACHE_FROM_LIST (List); > + UnusedData =3D Data; > + HitCount =3D Data->HitCount; > + List =3D GetNextNode (ListHeader, List); > + > + while (!IsNull (ListHeader, List)) { > + Data =3D REDFISH_HTTP_CACHE_FROM_LIST (List); > + > + if (Data->HitCount < HitCount) { > + HitCount =3D Data->HitCount; > + UnusedData =3D Data; > + } > + > + List =3D GetNextNode (ListHeader, List); > + } > + > + return UnusedData; > +} > + > +/** > + Delete a cache data by given cache instance. > + > + @param[in] List Target cache list to be removed. > + @param[in] Data Pointer to the instance to be deleted. > + > + @retval EFI_SUCCESS Cache data is removed. > + @retval Others Fail to remove cache data. > + > +**/ > +EFI_STATUS > +DeleteHttpCacheData ( > + IN REDFISH_HTTP_CACHE_LIST *List, > + IN REDFISH_HTTP_CACHE_DATA *Data > + ) > +{ > + if ((List =3D=3D NULL) || (Data =3D=3D NULL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + DEBUG ((REDFISH_HTTP_CACHE_DEBUG, "%a: delete: %s\n", __func__, > Data->Uri)); > + > + RemoveEntryList (&Data->List); > + --List->Count; > + > + return ReleaseHttpCacheData (Data); > +} > + > +/** > + Add new cache by given URI and HTTP response to specify List. > + > + @param[in] List Target cache list to add. > + @param[in] Uri The URI string matching to this cache data. > + @param[in] Response HTTP response. > + > + @retval EFI_SUCCESS Cache data is added. > + @retval Others Fail to add cache data. > + > +**/ > +EFI_STATUS > +AddHttpCacheData ( > + IN REDFISH_HTTP_CACHE_LIST *List, > + IN EFI_STRING Uri, > + IN REDFISH_RESPONSE *Response > + ) > +{ > + REDFISH_HTTP_CACHE_DATA *NewData; > + REDFISH_HTTP_CACHE_DATA *OldData; > + REDFISH_HTTP_CACHE_DATA *UnusedData; > + REDFISH_RESPONSE *NewResponse; > + > + if ((List =3D=3D NULL) || IS_EMPTY_STRING (Uri) || (Response =3D=3D NU= LL)) { > + return EFI_INVALID_PARAMETER; > + } > + > + // > + // If same cache data exist, replace it with latest one. > + // > + OldData =3D FindHttpCacheData (&List->Head, Uri); > + if (OldData !=3D NULL) { > + DeleteHttpCacheData (List, OldData); > + } > + > + // > + // Check capacity > + // > + if (List->Count >=3D List->Capacity) { > + DEBUG ((REDFISH_HTTP_CACHE_DEBUG, "%a: list is full and retire unuse= d > cache\n", __func__)); > + UnusedData =3D FindUnusedHttpCacheData (&List->Head); > + if (UnusedData =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + DeleteHttpCacheData (List, UnusedData); > + } > + > + // > + // Clone a local copy > + // > + NewResponse =3D CloneRedfishResponse (Response); > + if (NewResponse =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + NewData =3D NewHttpCacheData (Uri, NewResponse); > + if (NewData =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + InsertTailList (&List->Head, &NewData->List); > + ++List->Count; > + > + DEBUG ((REDFISH_HTTP_CACHE_DEBUG, "%a: cache(%d/%d) %s\n", > __func__, List->Count, List->Capacity, NewData->Uri)); > + > + return EFI_SUCCESS; > +} > + > +/** > + Release all cache from list. > + > + @param[in] CacheList The list to be released. > + > + @retval EFI_SUCCESS All cache data are released. > + @retval EFI_INVALID_PARAMETER CacheList is NULL. > + > +**/ > +EFI_STATUS > +ReleaseCacheList ( > + IN REDFISH_HTTP_CACHE_LIST *CacheList > + ) > +{ > + LIST_ENTRY *List; > + LIST_ENTRY *Next; > + REDFISH_HTTP_CACHE_DATA *Data; > + > + if (CacheList =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (IsListEmpty (&CacheList->Head)) { > + return EFI_SUCCESS; > + } > + > + Data =3D NULL; > + Next =3D NULL; > + List =3D GetFirstNode (&CacheList->Head); > + while (!IsNull (&CacheList->Head, List)) { > + Data =3D REDFISH_HTTP_CACHE_FROM_LIST (List); > + Next =3D GetNextNode (&CacheList->Head, List); > + > + DeleteHttpCacheData (CacheList, Data); > + > + List =3D Next; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Debug output the cache list. > + > + @param[in] Msg Debug message string. > + @param[in] ErrorLevel Output error level. > + @param[in] CacheList Target list to dump. > + > + @retval EFI_SUCCESS Debug dump finished. > + @retval EFI_INVALID_PARAMETER HttpCacheList is NULL. > + > +**/ > +EFI_STATUS > +DumpHttpCacheList ( > + IN CONST CHAR8 *Msg, > + IN UINTN ErrorLevel, > + IN REDFISH_HTTP_CACHE_LIST *CacheList > + ) > +{ > + LIST_ENTRY *List; > + REDFISH_HTTP_CACHE_DATA *Data; > + UINTN Index; > + > + if (CacheList =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (!IS_EMPTY_STRING (Msg)) { > + DEBUG ((ErrorLevel, "%a\n", Msg)); > + } > + > + if (IsListEmpty (&CacheList->Head)) { > + DEBUG ((ErrorLevel, "list is empty\n")); > + return EFI_NOT_FOUND; > + } > + > + DEBUG ((ErrorLevel, "list count: %d capacity: %d\n", CacheList->Count, > CacheList->Capacity)); > + Data =3D NULL; > + Index =3D 0; > + List =3D GetFirstNode (&CacheList->Head); > + while (!IsNull (&CacheList->Head, List)) { > + Data =3D REDFISH_HTTP_CACHE_FROM_LIST (List); > + > + DEBUG ((ErrorLevel, "%d) Uri: %s Hit: %d\n", ++Index, Data->Uri, Dat= a- > >HitCount)); > + > + List =3D GetNextNode (&CacheList->Head, List); > + } > + > + return EFI_SUCCESS; > +} > + > +/** > + Get redfish resource from given resource URI with cache mechanism > + supported. It's caller's responsibility to Response by calling > + RedfishFreeResponse (). > + > + @param[in] Service Redfish service instance to make query. > + @param[in] Uri Target resource URI. > + @param[out] Response HTTP response from redfish service. > + @param[in] UseCache If it is TRUE, this function will search for > + cache first. If it is FALSE, this function > + will query Redfish URI directly. > + > + @retval EFI_SUCCESS Resrouce is returned successfully. > + @retval Others Errors occur. > + > +**/ > +EFI_STATUS > +RedfishHttpGetResource ( > + IN REDFISH_SERVICE Service, > + IN EFI_STRING Uri, > + OUT REDFISH_RESPONSE *Response, > + IN BOOLEAN UseCache > + ) > +{ > + EFI_STATUS Status; > + CHAR8 *AsciiUri; > + REDFISH_HTTP_CACHE_DATA *CacheData; > + UINTN RetryCount; > + > + if ((Service =3D=3D NULL) || (Response =3D=3D NULL) || IS_EMPTY_STRING= (Uri)) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (mRedfishHttpCachePrivate =3D=3D NULL) { > + return EFI_NOT_READY; > + } > + > + AsciiUri =3D NULL; > + CacheData =3D NULL; > + RetryCount =3D 0; > + > + // > + // Search for cache list. > + // > + if (UseCache) { > + CacheData =3D FindHttpCacheData (&mRedfishHttpCachePrivate- > >CacheList.Head, Uri); > + if (CacheData !=3D NULL) { > + DEBUG ((REDFISH_HTTP_CACHE_DEBUG, "%a: cache hit! %s\n", > __func__, Uri)); > + > + // > + // Copy cached response to caller's buffer. > + // > + Status =3D CopyRedfishResponse (CacheData->Response,= Response); > + CacheData->HitCount +=3D 1; > + return Status; > + } > + } > + > + AsciiUri =3D StringUnicodeToAscii (Uri); > + if (AsciiUri =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + // > + // Get resource from redfish service. > + // > + do { > + RetryCount +=3D 1; > + Status =3D RedfishGetByUri ( > + Service, > + AsciiUri, > + Response > + ); > + if (!EFI_ERROR (Status) || (RetryCount >=3D > REDFISH_HTTP_GET_RETRY_MAX)) { > + break; > + } > + > + // > + // Retry when BMC is not ready. > + // > + if ((Response->StatusCode !=3D NULL)) { > + DEBUG_CODE ( > + DumpRedfishResponse (NULL, DEBUG_ERROR, Response); > + ); > + > + if (*Response->StatusCode !=3D > HTTP_STATUS_500_INTERNAL_SERVER_ERROR) { > + break; > + } > + > + FreePool (Response->StatusCode); > + Response->StatusCode =3D NULL; > + } > + > + DEBUG ((DEBUG_WARN, "%a: RedfishGetByUri failed, retry (%d/%d)\n", > __func__, RetryCount, REDFISH_HTTP_GET_RETRY_MAX)); > + gBS->Stall (REDFISH_HTTP_RETRY_WAIT); > + } while (TRUE); > + > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: get %a failed (%d/%d): %r\n", __func__, > AsciiUri, RetryCount, REDFISH_HTTP_GET_RETRY_MAX, Status)); > + if (Response->Payload !=3D NULL) { > + RedfishFreeResponse ( > + NULL, > + 0, > + NULL, > + Response->Payload > + ); > + Response->Payload =3D NULL; > + } > + > + goto ON_RELEASE; > + } > + > + // > + // Keep response in cache list > + // > + Status =3D AddHttpCacheData (&mRedfishHttpCachePrivate->CacheList, Uri= , > Response); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "%a: failed to cache %s: %r\n", __func__, Uri, > Status)); > + goto ON_RELEASE; > + } > + > + DEBUG_CODE ( > + DumpHttpCacheList (__func__, REDFISH_HTTP_CACHE_DEBUG_DUMP, > &mRedfishHttpCachePrivate->CacheList); > + ); > + > +ON_RELEASE: > + > + if (AsciiUri !=3D NULL) { > + FreePool (AsciiUri); > + } > + > + return Status; > +} > + > +/** > + Reset the cached data specified by given URI. When response data > + returned by RedfishHttpResetResource() is modified, the response > + data can not be used by other caller. Application calls this > + function to make this data to be stale data and > + RedfishHttpResetResource() will get latest data from remote server > + again. > + > + @param[in] Uri Target resource URI. > + > + @retval EFI_SUCCESS Resrouce is reset successfully. > + @retval Others Errors occur. > + > +**/ > +EFI_STATUS > +RedfishHttpResetResource ( > + IN EFI_STRING Uri > + ) > +{ > + REDFISH_HTTP_CACHE_DATA *CacheData; > + > + if (IS_EMPTY_STRING (Uri)) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (mRedfishHttpCachePrivate =3D=3D NULL) { > + return EFI_NOT_READY; > + } > + > + CacheData =3D FindHttpCacheData (&mRedfishHttpCachePrivate- > >CacheList.Head, Uri); > + if (CacheData =3D=3D NULL) { > + return EFI_NOT_FOUND; > + } > + > + DeleteHttpCacheData (&mRedfishHttpCachePrivate->CacheList, CacheData); > + > + return EFI_SUCCESS; > +} > + > +/** > + > + Initial HTTP cache library instance. > + > + @param[in] ImageHandle The image handle. > + @param[in] SystemTable The system table. > + > + @retval EFI_SUCCESS Initial library successfully. > + @retval Other Return error status. > + > +**/ > +EFI_STATUS > +EFIAPI > +RedfishHttpCacheConstructor ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + mRedfishHttpCachePrivate =3D AllocateZeroPool (sizeof > (REDFISH_HTTP_CACHE_PRIVATE)); > + if (mRedfishHttpCachePrivate =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + // > + // Initial cache list > + // > + mRedfishHttpCachePrivate->CacheList.Capacity =3D > REDFISH_HTTP_CACHE_LIST_SIZE; > + mRedfishHttpCachePrivate->CacheList.Count =3D 0x00; > + InitializeListHead (&mRedfishHttpCachePrivate->CacheList.Head); > + > + 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 > +RedfishHttpCacheDestructor ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + if (mRedfishHttpCachePrivate !=3D NULL) { > + if (!IsListEmpty (&mRedfishHttpCachePrivate->CacheList.Head)) { > + ReleaseCacheList (&mRedfishHttpCachePrivate->CacheList); > + } > + > + FreePool (mRedfishHttpCachePrivate); > + mRedfishHttpCachePrivate =3D NULL; > + } > + > + return EFI_SUCCESS; > +} > -- > 2.34.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#113085): https://edk2.groups.io/g/devel/message/113085 Mute This Topic: https://groups.io/mt/103500371/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-