From nobody Sun May 5 13:42:57 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+92182+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+92182+1787277+3901457@groups.io; arc=fail (BodyHash is different from the expected one) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1659875459140955.0448793959947; Sun, 7 Aug 2022 05:30:59 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id hFtYYY1788612xoqPfJ1sBlc; Sun, 07 Aug 2022 05:30:58 -0700 X-Received: from NAM10-MW2-obe.outbound.protection.outlook.com (NAM10-MW2-obe.outbound.protection.outlook.com [40.107.94.84]) by mx.groups.io with SMTP id smtpd.web12.13192.1659875457202349195 for ; Sun, 07 Aug 2022 05:30:58 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=cDbmT9QfgjmnJO9V+4TUcIoEobNviN4yYxRV3bJ8gcqMmsbP4AOKJmZKcAW7WXQhe5NHXf9lrVcVG6PI5dVGZHDOJENwT9Lfdal15y9ec1A+QqeLaFRE1Bncf6nOTHwaK0OIEBBWHWUQ1OkGDK5JhaRLgcjM2QJA9qxXz2ZA42PuhHBBgP+65jZ7FqRkGmx9VKPdbE8bLbsLho22VbG6Km63A6LoFCimhww+0H3QJpuGERpVi3ASahuoyI8opjhqOgnRt9AXdo55kTWKhPVwtFAd6R97KnAGoFXFFmxXTx6g0sjrV207ryUbWhD+F71y0C41EIblnlXGzOQuIQKupA== 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=860DfBwyfX4B1n+zb9Ny1uv7CiPvpVH8uPe71ip9pq0=; b=d+5idehkT+Rds/diz5Ho4ke2Fze+Aq1oQrWoAXq7PcY16TzmGZHCEKwv0JTEQuJG+nsN8zE3uWcBShBoU7lh8gDFxfRUaSoIpg14IMO1RPJQBkckNrSbWaKs82yc30VSl6GUK/7JPHt3F69spkg3yAFlf+gsZjC8qp30i6fLcmPyBitJq9tKJMYVOz1NGfmNxVvKqQQIVbTmyxWFGakZs4Jljtu8GpvqJjCwUaP20qCePPzEcCwwubPxwbdrdIKYsM/OORmP1+XdjkROCHgj8Bs2z9yS8nZAk0DTUK1t3vFqQTIGtmGNcM7HmnbMw0vf+cZd5aDEbdDLKC63PXe60g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=ami.com; dmarc=pass action=none header.from=ami.com; dkim=pass header.d=ami.com; arc=none X-Received: from BLAPR10MB5185.namprd10.prod.outlook.com (2603:10b6:208:328::16) by BN6PR10MB1908.namprd10.prod.outlook.com (2603:10b6:404:106::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5504.14; Sun, 7 Aug 2022 12:30:51 +0000 X-Received: from BLAPR10MB5185.namprd10.prod.outlook.com ([fe80::9da7:b02b:d292:d57c]) by BLAPR10MB5185.namprd10.prod.outlook.com ([fe80::9da7:b02b:d292:d57c%7]) with mapi id 15.20.5504.019; Sun, 7 Aug 2022 12:30:51 +0000 From: "Igor Kulchytskyy via groups.io" To: "devel@edk2.groups.io" CC: "Abner.Chang@amd.com" , "nickle.wang@hpe.com" , Igor Kulchytskyy Subject: [edk2-devel] [PATCH] RedfishPkg: Redfish library functions to send POST and DELETE requests do not allow to use all spec defined parameters Thread-Topic: [PATCH] RedfishPkg: Redfish library functions to send POST and DELETE requests do not allow to use all spec defined parameters Thread-Index: AQHYqlmH1fGdIWstrEmYyqf90n+Glg== Date: Sun, 7 Aug 2022 12:30:51 +0000 Message-ID: <1659875444-9820-1-git-send-email-igork@ami.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: de2b1231-b67d-4146-86ca-08da7870aa14 x-ms-traffictypediagnostic: BN6PR10MB1908:EE_ x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam-message-info: ZDE8eTEzuIag3Mbs/vkTtkdYoh4S7s1CQwTicDEgyGXmk9Y1x/X/61c1mRizJ6lJ0vZiUzyW6ZR+/L1FE5tL/NWE6NmR5RaF/OLF480xygv9F3r8R/+WzQzNQz0PatUpOHz3F3lT2IM4x5oYOhbqaYflfDZdFJc3URMjVELRbzEni9MSgsTwTUIOPENqaRL+6KmylQynqrod424mAY+WQ/ceGwjaJWQqrAz3s6cTGB4DZMzqjl2JHJZb+HqU0tOIjdh5TNGfmukub/BvoduF8YnysuOn7eRhvasmfxoz7GJ9QacPhcYoqYAH+5y4Ovd6KxzwCDSGJwLJ9WiDayRyTi3mk1yKzJKEaMrO5T+HHLZjPlg7M5WO0mmOB2fJfUTo+dSCVmBMG54D3pRzBzdPi0pHJUS/A66qJuO/eXak1fXpzWwokDzT1rHiRCVAnzawD7XU+F19GrD60Ir3YRey3tDb7U1Uhdjcha9rAzFg7zaEVMdXqEiwSJOsFWiimW4vbyKaGwMOzH/SOomIIBZdeRhTvpRssNoFuqEqxGt38hpu8UlTBAwOm6aDFNSTMU3xPPCCqOJyHYNJDV+Ccs/EdsuvHKjKXe2JQqTLUkQD0H/N27P5AZoOBRThsiohwgn6t1gqNbd9GhdxL0zc6e8CmlYVrcImKYdytl847GH3mtibw/E4JR31XP2yEpfeSu9K/QnX/AoZxxZiGDBiMioN6Fo2WlqVv+8C5AWJq2utA6bdjzfZta+fHse5ZxgVXac4dwVUCaG3KuBaBERRbpHuZZUZ5mOlOCPLHEg18FArgBYqp7LPeP7sYb3StlJD0M75kZdOPKXCnh+BHcxdoQkVzmri1LgmGJnFr2eTu+OnUJ1okJE7PbK2WrUoEdAIpP+fKRHhEsFOGLg3ACLgItJ01g== x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?M5B389zeuUaS7lGQGJ6tOupCyPUgluXRXRhc1+hchb4hLacepelSWm/1Bk?= =?iso-8859-1?Q?rNUl1n5QdSvWFNuj/Kn7f3Vl1rN/QpZrfuNJy1oxDjw3OWbgl1i5fKH1MX?= =?iso-8859-1?Q?J6B9x6yl+RzIHXj+njipI3OasXu5usvv8bqGYQGT2KC8rg+HXJIwKVizTG?= =?iso-8859-1?Q?WYpBhnglqggtiVcfWVk7+eOhfs9TfCdcjtjS3wUzopW0mIJUV0AO82aajK?= =?iso-8859-1?Q?VQzqYP2fpHldjvBDGnKhs8deHFcXd8hA/0kq4edfsdHdk/mCW63QdYlJeL?= =?iso-8859-1?Q?A76cuUYXwOlem2TMg15Lmmonws7fOTMvexVgN6BiFHozEap1rWfcvHtF6H?= =?iso-8859-1?Q?Gwb178bccgHuNW+htxe1t0Z8nENmYLLyGPEPxDklYBkeDYtxsiGZnXNd9G?= =?iso-8859-1?Q?rX++p63rl+PBPImDZwmOUuvie98UW5zScZbe/c15bCgX/yIXELjQNDuxTn?= =?iso-8859-1?Q?oTkDZImaWdJVQOb3t6vh9M1Dx20QItw8HBfhPi8Z5rvzK2xnb88Kzd6JzS?= =?iso-8859-1?Q?1Q12dCo9LNvYtbAYuA2eB+A8qhjQAL7IP1bPedb3ZWStQ93nh4HtLRRNNn?= =?iso-8859-1?Q?CBgg1Y1+diF0hSZGyqHrYAaYX60M6gvqVh5R88oCXrplkruTEMLYZX4sbl?= =?iso-8859-1?Q?uGmX1Onwd5jl8ZNDT8pRs0OI/7JBXKafstNsFxfvV8lexPPkhbPvm7sxSC?= =?iso-8859-1?Q?Zeo9atYLNbZv5lYmWqZShOvJ3cvKPUIVVSJQ04PBN4EdxmEItRTmKRhIYD?= =?iso-8859-1?Q?qK//wz7xlfgXU7VXKpvIg1JS1YZlk2luB5GiOLxJR6SjAaebkaAM3wJ1k/?= =?iso-8859-1?Q?z2JkiFLWSMicMy/TH7D11nbmwpXEcp9jZL5Ov7QVHpE9TC/6ysHYtwGsm0?= =?iso-8859-1?Q?UD3jNZDOudjV3uIq4G05Rv9N/eUIWxMBH8332HHXU9vY7GUIAxDLy56vkU?= =?iso-8859-1?Q?wBtKSOLqIdPqB0P8GzHNyoKnqEbV2oCQXt4UVtzKLac1EINKNMfPUJnKVv?= =?iso-8859-1?Q?ODys2kWqaP8KdbyFunGAv5BCsCMAI8I4eWwkKGU2tnU8/CcQzCEwQ9F5t3?= =?iso-8859-1?Q?cTmBCQAoQnRx5ko9PjDGmUyb6TUj7PYFpUhXmlNhFyEDszOzRu8rqwrBew?= =?iso-8859-1?Q?pO+snjiZ7aF6se9Xg/jIYAAoTGXIUTeViP/NYXVlyjbuzfss3oMgSNk0ve?= =?iso-8859-1?Q?WTYDYfJOUd1Zu/+VgtoK8QLm6SA0vCAVQLcdrKA/hyxmY5WoyB5xc3cgxS?= =?iso-8859-1?Q?qaw/oWYIrLA29xMDJC4Ubt+B5MniBNm40H88AGgZANy1lPy50p4k4bkbg0?= =?iso-8859-1?Q?kB4nBAkkWLFeclXg7tuj0t+Ug80SDqPX7Ziu0VDZ7LcX5s/NJw8eOsT5C9?= =?iso-8859-1?Q?A5UXjvPYZkjpsXTh9umtjdHEeNLzEgbmgB5Cif5ZqJ7cWwFF8JiVyF2jCV?= =?iso-8859-1?Q?iTGzwbFez4sKLViGKZxOhh5b0eKRMPX2KmxCjHwvED3OiFIqAwFaQphyAW?= =?iso-8859-1?Q?k+oz8+e1Hprc6MCEflALwKLg8Mvb1bl/WiNzkvKtmwmR4n5RkxgznHLGLO?= =?iso-8859-1?Q?3MQyuYgzCS8kfKc2IoGxrtcdN0Ck2w4uu9o7T5CwAJi+xXQllYUjcH42iD?= =?iso-8859-1?Q?JdEDXnaJNjdHxrxwiwaD7ylKZOhHX2Go2P?= MIME-Version: 1.0 X-OriginatorOrg: ami.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: BLAPR10MB5185.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: de2b1231-b67d-4146-86ca-08da7870aa14 X-MS-Exchange-CrossTenant-originalarrivaltime: 07 Aug 2022 12:30:51.1163 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 27e97857-e15f-486c-b58e-86c2b3040f93 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: A9Op/kffmSyGT4slk7cgkpWyE+hSocsACikksLXfQD8nki5+nZSDTfzSOmF2VOby X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR10MB1908 Precedence: Bulk List-Unsubscribe: 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,igork@ami.com X-Gm-Message-State: WLdu1Fp9133RkVB2k6uTDBQkx1787277AA= Content-Language: en-US Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1659875458; bh=EeTp+HT0uR7DIf191LIcHWk6Z4pzkdV2hdtjRjbNMzg=; h=CC:Content-Type:Date:From:Reply-To:Subject:To; b=qLLDBViAtk7vzUfIVeBkN+xFDtWO7fOZNWfUK3wU2Ae61ujWxFPA2XsmF5mjgC2+fPb PgviEYeAeGCQlQ3Th1NmaDRN+dRsba/5/Z7BCGMsWV9VF2CuKGpIXVxo4fj6lWt1pEkoF noKWccGa0gCJW80EyBP2GeRSejSRctsJE9w= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1659875460222100001 Content-Type: text/plain; charset="utf-8" There is no function to send POST requets with the ContetntType different from "application/json". There is no function to send DELETE request with the body. Cc: Abner Chang Cc: Nickle Wang Signed-off-by: Igor Kulchytskyy --- RedfishPkg/Include/Library/RedfishLib.h = | 696 ++++++++++++++++++++ RedfishPkg/PrivateInclude/Library/RedfishLib.h = | 616 ----------------- RedfishPkg/PrivateLibrary/RedfishLib/RedfishLib.c = | 189 ++++++ RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishService= .h | 8 + RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c = | 43 +- RedfishPkg/RedfishPkg.dec = | 2 +- 6 files changed, 934 insertions(+), 620 deletions(-) diff --git a/RedfishPkg/Include/Library/RedfishLib.h b/RedfishPkg/Include/L= ibrary/RedfishLib.h new file mode 100644 index 0000000..d4b3246 --- /dev/null +++ b/RedfishPkg/Include/Library/RedfishLib.h @@ -0,0 +1,696 @@ +/** @file + This library provides a set of utility APIs that allow to create/read/up= date/delete + (CRUD) Redfish resources and provide basic query abilities by using [URI= /RedPath] + (https://github.com/DMTF/libredfish). + + The query language is based on XPath (https://www.w3.org/TR/1999/REC-xpa= th-19991116/). + This library and query language essentially treat the entire Redfish Ser= vice like it + was a single JSON document. In other words whenever it encounters an oda= ta.id in JSON + document, it will retrieve the new JSON document (if needed). We name th= e path as + RedPath: + + Expression Description + + nodename Selects the JSON entity with the name "nodename". + If the value of nodename is an object with "@odata.id", + it will continue get the value from "@odata.id". + + / Selects from the root node + + [index] Selects the index number JSON entity from an array or + object. If the JSON entity is one collection (has + Members & Members@odata.count), means to get the index + member in "Members". Index number >=3D1, 1 means to ret= urn + the first instance. + + [XXX] Operation on JSON entity. + If the JSON entity is one collection (has Members & + Members@odata.count), means to get all elements in + "Members". If the JSON entity is one array, means to + get all elements in array. Others will match the nodena= me + directly (e.g. JSON_OBJECT, JSON_STRING, JSON_TRUE, + JSON_FALSE, JSON_INTEGER). + + [nodename] Selects all the elements from an JSON entity that + contain a property named "nodename" + + [name=3Dvalue] Selects all the elements from an JSON entity where + the property "name" is equal to "value" + + [name~value] Selects all the elements from an JSON entity where + the string property "name" is equal to "value" using + case insensitive comparison. + + [namevalue] Selects all the elements from an JSON entity where + the property "name" is greater than "value" + + [name>=3Dvalue] Selects all the elements from an JSON entity where + the property "name" is greater than or equal to "value" + + Some examples: + + /v1/Chassis[1] - Will return the first Chassis instance. + /v1/Chassis[SKU=3D1234] - Will return all Chassis instances with a SKU= field equal to 1234. + /v1/Systems[Storage] - Will return all the System instances that have= Storage field populated. + + Copyright (c) 2019, Intel Corporation. All rights reserved.
+ (C) Copyright 2021 Hewlett Packard Enterprise Development LP
+ + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef REDFISH_LIB_H_ +#define REDFISH_LIB_H_ + +#include + +#include +#include + +#define ODATA_TYPE_NAME_MAX_SIZE 128 +#define ODATA_TYPE_MAX_SIZE 128 + +/// +/// Library class public defines +/// +typedef VOID *REDFISH_SERVICE; +typedef VOID *REDFISH_PAYLOAD; + +/// +/// Library class public structures/unions +/// +typedef struct { + EFI_HTTP_STATUS_CODE *StatusCode; + UINTN HeaderCount; + EFI_HTTP_HEADER *Headers; + REDFISH_PAYLOAD Payload; +} REDFISH_RESPONSE; + +/// +/// Odata type-name mapping structure. +/// +typedef struct { + CONST CHAR8 OdataTypeName[ODATA_TYPE_NAME_MAX_SIZE]; + CONST CHAR8 OdataType[ODATA_TYPE_MAX_SIZE]; +} REDFISH_ODATA_TYPE_MAPPING; + +/** + This function uses REST EX protocol provided in RedfishConfigServiceInfo. + The service enumerator will also handle the authentication flow automati= cally + if HTTP basic auth or Redfish session login is configured to use. + + Callers are responsible for freeing the returned service by RedfishClean= upService(). + + @param[in] RedfishConfigServiceInfo Redfish service information the EFI= Redfish + feature driver communicates with. + + @return New created Redfish Service, or NULL if error happens. + +**/ +REDFISH_SERVICE +EFIAPI +RedfishCreateService ( + IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo + ); + +/** + Free the Service and all its related resources. + + @param[in] RedfishService The Service to access the Redfish resou= rces. + +**/ +VOID +EFIAPI +RedfishCleanupService ( + IN REDFISH_SERVICE RedfishService + ); + +/** + Create REDFISH_PAYLOAD instance in local with JSON represented resource = value and + the Redfish Service. + + The returned REDFISH_PAYLOAD can be used to create or update Redfish res= ource in + server side. + + Callers are responsible for freeing the returned payload by RedfishClean= upPayload(). + + @param[in] Value JSON Value of the redfish resource. + @param[in] RedfishService The Service to access the Redfish re= sources. + + @return REDFISH_PAYLOAD instance of the resource, or NULL if error h= appens. + +**/ +REDFISH_PAYLOAD +EFIAPI +RedfishCreatePayload ( + IN EDKII_JSON_VALUE Value, + IN REDFISH_SERVICE RedfishService + ); + +/** + Free the RedfishPayload and all its related resources. + + @param[in] Payload Payload to be freed. + +**/ +VOID +EFIAPI +RedfishCleanupPayload ( + IN REDFISH_PAYLOAD Payload + ); + +/** + This function returns the decoded JSON value of a REDFISH_PAYLOAD. + + Caller doesn't need to free the returned JSON value because it will be r= eleased + in corresponding RedfishCleanupPayload() function. + + @param[in] Payload A REDFISH_PAYLOAD instance. + + @return Decoded JSON value of the payload. + +**/ +EDKII_JSON_VALUE +EFIAPI +RedfishJsonInPayload ( + IN REDFISH_PAYLOAD Payload + ); + +/** + Fill the input RedPath string with system UUID from SMBIOS table or use = the customized + ID if FromSmbios =3D=3D FALSE. + + This is a helper function to build a RedPath string which can be used to= address + a Redfish resource for this computer system. The input PathString must h= ave a Systems + note in format of "Systems[UUID=3D%g]" or "Systems[UUID~%g]" to fill the= UUID value. + + Example: + Use "/v1/Systems[UUID=3D%g]/Bios" to build a RedPath to address the "B= ios" resource + for this computer system. + + @param[in] RedPath RedPath format to be build. + @param[in] FromSmbios Get system UUID from SMBIOS as computer sys= tem instance ID. + @param[in] IdString The computer system instance ID. + + @return Full RedPath with system UUID inside, or NULL if error happe= ns. + +**/ +CHAR8 * +EFIAPI +RedfishBuildPathWithSystemUuid ( + IN CONST CHAR8 *RedPath, + IN BOOLEAN FromSmbios, + IN CHAR8 *IdString OPTIONAL + ); + +/** + Get a redfish response addressed by a RedPath string, including HTTP Sta= tusCode, Headers + and Payload which record any HTTP response messages. + + Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in + redfish response data. + + @param[in] RedfishService The Service to access the Redfish re= sources. + @param[in] RedPath RedPath string to address a resource= , must start + from the root node. + @param[out] RedResponse Pointer to the Redfish response data. + + @retval EFI_SUCCESS The opeartion is successful, indicates t= he HTTP StatusCode is not + NULL and the value is 2XX. The correspon= ding redfish resource has + been returned in Payload within RedRespo= nse. + @retval EFI_INVALID_PARAMETER RedfishService, RedPath, or RedResponse = is NULL. + @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get + more error info from returned HTTP Statu= sCode, Headers and Payload + within RedResponse: + 1. If the returned Payload is NULL, indi= cates any error happen. + 2. If the returned StatusCode is NULL, i= ndicates any error happen. + 3. If the returned StatusCode is not 2XX= , indicates any error happen. +**/ +EFI_STATUS +EFIAPI +RedfishGetByService ( + IN REDFISH_SERVICE RedfishService, + IN CONST CHAR8 *RedPath, + OUT REDFISH_RESPONSE *RedResponse + ); + +/** + Get a redfish response addressed by URI, including HTTP StatusCode, Head= ers + and Payload which record any HTTP response messages. + + Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in + redfish response data. + + @param[in] RedfishService The Service to access the URI resources. + @param[in] URI String to address a resource. + @param[out] RedResponse Pointer to the Redfish response data. + + @retval EFI_SUCCESS The opeartion is successful, indicates t= he HTTP StatusCode is not + NULL and the value is 2XX. The correspon= ding redfish resource has + been returned in Payload within RedRespo= nse. + @retval EFI_INVALID_PARAMETER RedfishService, RedPath, or RedResponse = is NULL. + @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get + more error info from returned HTTP Statu= sCode, Headers and Payload + within RedResponse: + 1. If the returned Payload is NULL, indi= cates any error happen. + 2. If the returned StatusCode is NULL, i= ndicates any error happen. + 3. If the returned StatusCode is not 2XX= , indicates any error happen. +**/ +EFI_STATUS +EFIAPI +RedfishGetByUri ( + IN REDFISH_SERVICE RedfishService, + IN CONST CHAR8 *Uri, + OUT REDFISH_RESPONSE *RedResponse + ); + +/** + Get a redfish response addressed by the input Payload and relative RedPa= th string, + including HTTP StatusCode, Headers and Payload which record any HTTP res= ponse messages. + + Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in + redfish response data. + + @param[in] Payload A existing REDFISH_PAYLOAD instance. + @param[in] RedPath Relative RedPath string to address a res= ource inside Payload. + @param[out] RedResponse Pointer to the Redfish response data. + + @retval EFI_SUCCESS The opeartion is successful: + 1. The HTTP StatusCode is NULL and the r= eturned Payload in + RedResponse is not NULL, indicates the R= edfish resource has + been parsed from the input payload direc= tly. + 2. The HTTP StatusCode is not NULL and t= he value is 2XX, + indicates the corresponding redfish reso= urce has been returned + in Payload within RedResponse. + @retval EFI_INVALID_PARAMETER Payload, RedPath, or RedResponse is NULL. + @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get + more error info from returned HTTP Statu= sCode, Headers and Payload + within RedResponse: + 1. If the returned Payload is NULL, indi= cates any error happen. + 2. If StatusCode is not NULL and the ret= urned value of StatusCode + is not 2XX, indicates any error happe= n. +**/ +EFI_STATUS +EFIAPI +RedfishGetByPayload ( + IN REDFISH_PAYLOAD Payload, + IN CONST CHAR8 *RedPath, + OUT REDFISH_RESPONSE *RedResponse + ); + +/** + Use HTTP PATCH to perform updates on pre-existing Redfish resource. + + This function uses the RedfishService to patch a Redfish resource addres= sed by + Uri (only the relative path is required). Changes to one or more propert= ies within + the target resource are represented in the input Content, properties not= specified + in Content won't be changed by this request. The corresponding redfish r= esponse will + returned, including HTTP StatusCode, Headers and Payload which record an= y HTTP response + messages. + + Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in + redfish response data. + + @param[in] RedfishService The Service to access the Redfish re= sources. + @param[in] Uri Relative path to address the resourc= e. + @param[in] Content JSON represented properties to be up= date. + @param[out] RedResponse Pointer to the Redfish response data. + + @retval EFI_SUCCESS The opeartion is successful, indicates t= he HTTP StatusCode is not + NULL and the value is 2XX. The Redfish r= esource will be returned + in Payload within RedResponse if server = send it back in the HTTP + response message body. + @retval EFI_INVALID_PARAMETER RedfishService, Uri, Content, or RedResp= onse is NULL. + @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get + more error info from returned HTTP Statu= sCode, Headers and Payload + within RedResponse: + 1. If the returned StatusCode is NULL, i= ndicates any error happen. + 2. If the returned StatusCode is not NUL= L and the value is not 2XX, + indicates any error happen. +**/ +EFI_STATUS +EFIAPI +RedfishPatchToUri ( + IN REDFISH_SERVICE RedfishService, + IN CONST CHAR8 *Uri, + IN CONST CHAR8 *Content, + OUT REDFISH_RESPONSE *RedResponse + ); + +/** + Use HTTP PATCH to perform updates on target payload. Patch to odata.id i= n Payload directly. + + This function uses the Payload to patch the Target. Changes to one or mo= re properties + within the target resource are represented in the input Payload, propert= ies not specified + in Payload won't be changed by this request. The corresponding redfish r= esponse will + returned, including HTTP StatusCode, Headers and Payload which record an= y HTTP response + messages. + + Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in + redfish response data. + + @param[in] Target The target payload to be updated. + @param[in] Payload Palyoad with properties to be changed. + @param[out] RedResponse Pointer to the Redfish response data. + + @retval EFI_SUCCESS The opeartion is successful, indicates t= he HTTP StatusCode is not + NULL and the value is 2XX. The Redfish r= esource will be returned + in Payload within RedResponse if server = send it back in the HTTP + response message body. + @retval EFI_INVALID_PARAMETER Target, Payload, or RedResponse is NULL. + @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get + more error info from returned HTTP Statu= sCode, Headers and Payload + within RedResponse: + 1. If the returned StatusCode is NULL, i= ndicates any error happen. + 2. If the returned StatusCode is not NUL= L and the value is not 2XX, + indicates any error happen. +**/ +EFI_STATUS +EFIAPI +RedfishPatchToPayload ( + IN REDFISH_PAYLOAD Target, + IN REDFISH_PAYLOAD Payload, + OUT REDFISH_RESPONSE *RedResponse + ); + + +/** + Use HTTP POST to create new Redfish resource in the Resource Collection. + + The POST request should be submitted to the Resource Collection in which= the new resource + is to belong. The Resource Collection is addressed by URI. The Redfish m= ay + ignore any service controlled properties. The corresponding redfish resp= onse will returned, + including HTTP StatusCode, Headers and Payload which record any HTTP res= ponse messages. + + Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in + redfish response data. + + @param[in] RedfishService The Service to access the Redfish re= sources. + @param[in] Uri Relative path to address the resourc= e. + @param[in] Content JSON represented properties to be up= date. + @param[in] ContentSize Size of the Content to be send to Re= dfish service + @param[in] ContentType Type of the Content to be send to Re= dfish service + @param[out] RedResponse Pointer to the Redfish response data. + + @retval EFI_SUCCESS The opeartion is successful, indicates t= he HTTP StatusCode is not + NULL and the value is 2XX. The Redfish r= esource will be returned + in Payload within RedResponse if server = send it back in the HTTP + response message body. + @retval EFI_INVALID_PARAMETER RedfishService, Uri, Content, or RedResp= onse is NULL. + @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get + more error info from returned HTTP Statu= sCode, Headers and Payload + within RedResponse: + 1. If the returned StatusCode is NULL, i= ndicates any error happen. + 2. If the returned StatusCode is not NUL= L and the value is not 2XX, + indicates any error happen. +**/ +EFI_STATUS +EFIAPI +RedfishPostToUriEx ( + IN REDFISH_SERVICE RedfishService, + IN CONST CHAR8 *Uri, + IN CONST CHAR8 *Content, + IN UINTN ContentSize, + IN CONST CHAR8 *ContentType, + OUT REDFISH_RESPONSE *RedResponse + ); + + +/** + Use HTTP POST to create a new resource in target payload. + + The POST request should be submitted to the Resource Collection in which= the new resource + is to belong. The Resource Collection is addressed by Target payload. Th= e Redfish may + ignore any service controlled properties. The corresponding redfish resp= onse will returned, + including HTTP StatusCode, Headers and Payload which record any HTTP res= ponse messages. + + Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in + redfish response data. + + @param[in] Target Target payload of the Resource Collection. + @param[in] Payload The new resource to be created. + @param[out] RedResponse Pointer to the Redfish response data. + + @retval EFI_SUCCESS The opeartion is successful, indicates t= he HTTP StatusCode is not + NULL and the value is 2XX. The Redfish r= esource will be returned + in Payload within RedResponse if server = send it back in the HTTP + response message body. + @retval EFI_INVALID_PARAMETER Target, Payload, or RedResponse is NULL. + @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get + more error info from returned HTTP Statu= sCode, Headers and Payload + within RedResponse: + 1. If the returned StatusCode is NULL, i= ndicates any error happen. + 2. If the returned StatusCode is not NUL= L and the value is not 2XX, + indicates any error happen. +**/ +EFI_STATUS +EFIAPI +RedfishPostToPayload ( + IN REDFISH_PAYLOAD Target, + IN REDFISH_PAYLOAD Payload, + OUT REDFISH_RESPONSE *RedResponse + ); + +/** + Use HTTP DELETE to remove a resource. + + This function uses the RedfishService to remove a Redfish resource which= is addressed + by input Uri (only the relative path is required). The corresponding red= fish response will + returned, including HTTP StatusCode, Headers and Payload which record an= y HTTP response + messages. + + Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in + redfish response data. + + @param[in] RedfishService The Service to access the Redfish re= sources. + @param[in] Uri Relative path to address the resourc= e. + @param[out] RedResponse Pointer to the Redfish response data. + + @retval EFI_SUCCESS The opeartion is successful, indicates t= he HTTP StatusCode is not + NULL and the value is 2XX, the Redfish r= esource has been removed. + If there is any message returned from se= rver, it will be returned + in Payload within RedResponse. + @retval EFI_INVALID_PARAMETER RedfishService, Uri, or RedResponse is N= ULL. + @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get + more error info from returned HTTP Statu= sCode, Headers and Payload + within RedResponse: + 1. If the returned StatusCode is NULL, i= ndicates any error happen. + 2. If the returned StatusCode is not NUL= L and the value is not 2XX, + indicates any error happen. +**/ +EFI_STATUS +EFIAPI +RedfishDeleteByUri ( + IN REDFISH_SERVICE RedfishService, + IN CONST CHAR8 *Uri, + OUT REDFISH_RESPONSE *RedResponse + ); + +/** + Use HTTP DELETE to remove a resource. + + This function uses the RedfishService to remove a Redfish resource which= is addressed + by input Uri (only the relative path is required). The corresponding red= fish response will + returned, including HTTP StatusCode, Headers and Payload which record an= y HTTP response + messages. + + Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in + redfish response data. + + @param[in] RedfishService The Service to access the Redfish re= sources. + @param[in] Uri Relative path to address the resourc= e. + @param[in] Content JSON represented properties to be de= leted. + @param[out] RedResponse Pointer to the Redfish response data. + + @retval EFI_SUCCESS The opeartion is successful, indicates t= he HTTP StatusCode is not + NULL and the value is 2XX, the Redfish r= esource has been removed. + If there is any message returned from se= rver, it will be returned + in Payload within RedResponse. + @retval EFI_INVALID_PARAMETER RedfishService, Uri, or RedResponse is N= ULL. + @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get + more error info from returned HTTP Statu= sCode, Headers and Payload + within RedResponse: + 1. If the returned StatusCode is NULL, i= ndicates any error happen. + 2. If the returned StatusCode is not NUL= L and the value is not 2XX, + indicates any error happen. +**/ +EFI_STATUS +EFIAPI +RedfishDeleteByUriEx ( + IN REDFISH_SERVICE RedfishService, + IN CONST CHAR8 *Uri, + IN CONST CHAR8 *Content, + OUT REDFISH_RESPONSE *RedResponse + ); + +/** + Dump text in fractions. + + @param[in] String ASCII string to dump. + +**/ +VOID +RedfishDumpJsonStringFractions ( + IN CHAR8 *String + ); + +/** + Extract the JSON text content from REDFISH_PAYLOAD and dump to debug con= sole. + + @param[in] Payload The Redfish payload to dump. + +**/ +VOID +RedfishDumpPayload ( + IN REDFISH_PAYLOAD Payload + ); + +/** + Dump text in JSON value. + + @param[in] JsonValue The Redfish JSON value to dump. + +**/ +VOID +RedfishDumpJson ( + IN EDKII_JSON_VALUE JsonValue + ); + +/** + This function will cleanup the HTTP header and Redfish payload resources. + + @param[in] StatusCode The status code in HTTP response message. + @param[in] HeaderCount Number of HTTP header structures in Header= s list. + @param[in] Headers Array containing list of HTTP headers. + @param[in] Payload The Redfish payload to dump. + +**/ +VOID +RedfishFreeResponse ( + IN EFI_HTTP_STATUS_CODE *StatusCode, + IN UINTN HeaderCount, + IN EFI_HTTP_HEADER *Headers, + IN REDFISH_PAYLOAD Payload + ); + +/** + Check if the "@odata.type" in Payload is valid or not. + + @param[in] Payload The Redfish payload to be checked. + @param[in] OdataTypeName OdataType will be retrived from map= ping list. + @param[in] OdataTypeMappingList The list of OdataType. + @param[in] OdataTypeMappingListSize The number of mapping list + + @return TRUE if the "@odata.type" in Payload is valid, otherwise FALSE. + +**/ +BOOLEAN +RedfishIsValidOdataType ( + IN REDFISH_PAYLOAD Payload, + IN CONST CHAR8 *OdataTypeName, + IN REDFISH_ODATA_TYPE_MAPPING *OdataTypeMappingList, + IN UINTN OdataTypeMappingListSize + ); + +/** + Check if the payload is collection + + @param[in] Payload The Redfish payload to be checked. + + @return TRUE if the payload is collection. + +**/ +BOOLEAN +RedfishIsPayloadCollection ( + IN REDFISH_PAYLOAD Payload + ); + +/** + Get collection size. + + @param[in] Payload The Redfish collection payload + @param[in] CollectionSize Size of this collection + + @return EFI_SUCCESS Coolection size is returned in Collecti= onSize + @return EFI_INVALID_PARAMETER The payload is not a collection. +**/ +EFI_STATUS +RedfishGetCollectionSize ( + IN REDFISH_PAYLOAD Payload, + IN UINTN *CollectionSize + ); + +/** + Get Redfish payload of collection member + + @param[in] Payload The Redfish collection payload + @param[in] Index Index of collection member + + @return NULL Fail to get collection member. + @return Non NULL Payload is returned. +**/ +REDFISH_PAYLOAD +RedfishGetPayloadByIndex ( + IN REDFISH_PAYLOAD Payload, + IN UINTN Index + ); + +/** + Check and return Redfish resource of the given Redpath. + + @param[in] RedfishService Pointer to REDFISH_SERVICE + @param[in] Redpath Redpath of the resource. + @param[in] Response Optional return the resource. + + @return EFI_STATUS +**/ +EFI_STATUS +RedfishCheckIfRedpathExist ( + IN REDFISH_SERVICE RedfishService, + IN CHAR8 *Redpath, + IN REDFISH_RESPONSE *Response OPTIONAL + ); + +/** + This function returns the string of Redfish service version. + + @param[in] RedfishService Redfish service instance. + @param[out] ServiceVersionStr Redfish service string. + + @return EFI_STATUS + +**/ +EFI_STATUS +RedfishGetServiceVersion ( + IN REDFISH_SERVICE RedfishService, + OUT CHAR8 **ServiceVersionStr + ); + +/** + This function returns the string of Redfish service version. + + @param[in] ServiceVerisonStr The string of Redfish service version. + @param[in] Url The URL to build Redpath with ID. + Start with "/", for example "/Registries" + @param[in] Id ID string + @param[out] Redpath Pointer to retrive Redpath, caller has to= free + the memory allocated for this string. + @return EFI_STATUS + +**/ +EFI_STATUS +RedfishBuildRedpathUseId ( + IN CHAR8 *ServiceVerisonStr, + IN CHAR8 *Url, + IN CHAR8 *Id, + OUT CHAR8 **Redpath + ); + +#endif diff --git a/RedfishPkg/PrivateInclude/Library/RedfishLib.h b/RedfishPkg/Pr= ivateInclude/Library/RedfishLib.h deleted file mode 100644 index b2488ab..0000000 --- a/RedfishPkg/PrivateInclude/Library/RedfishLib.h +++ /dev/null @@ -1,616 +0,0 @@ -/** @file - This library provides a set of utility APIs that allow to create/read/up= date/delete - (CRUD) Redfish resources and provide basic query abilities by using [URI= /RedPath] - (https://github.com/DMTF/libredfish). - - The query language is based on XPath (https://www.w3.org/TR/1999/REC-xpa= th-19991116/). - This library and query language essentially treat the entire Redfish Ser= vice like it - was a single JSON document. In other words whenever it encounters an oda= ta.id in JSON - document, it will retrieve the new JSON document (if needed). We name th= e path as - RedPath: - - Expression Description - - nodename Selects the JSON entity with the name "nodename". - If the value of nodename is an object with "@odata.id", - it will continue get the value from "@odata.id". - - / Selects from the root node - - [index] Selects the index number JSON entity from an array or - object. If the JSON entity is one collection (has - Members & Members@odata.count), means to get the index - member in "Members". Index number >=3D1, 1 means to ret= urn - the first instance. - - [XXX] Operation on JSON entity. - If the JSON entity is one collection (has Members & - Members@odata.count), means to get all elements in - "Members". If the JSON entity is one array, means to - get all elements in array. Others will match the nodena= me - directly (e.g. JSON_OBJECT, JSON_STRING, JSON_TRUE, - JSON_FALSE, JSON_INTEGER). - - [nodename] Selects all the elements from an JSON entity that - contain a property named "nodename" - - [name=3Dvalue] Selects all the elements from an JSON entity where - the property "name" is equal to "value" - - [name~value] Selects all the elements from an JSON entity where - the string property "name" is equal to "value" using - case insensitive comparison. - - [namevalue] Selects all the elements from an JSON entity where - the property "name" is greater than "value" - - [name>=3Dvalue] Selects all the elements from an JSON entity where - the property "name" is greater than or equal to "value" - - Some examples: - - /v1/Chassis[1] - Will return the first Chassis instance. - /v1/Chassis[SKU=3D1234] - Will return all Chassis instances with a SKU= field equal to 1234. - /v1/Systems[Storage] - Will return all the System instances that have= Storage field populated. - - Copyright (c) 2019, Intel Corporation. All rights reserved.
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP
- - SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - -#ifndef REDFISH_LIB_H_ -#define REDFISH_LIB_H_ - -#include - -#include -#include - -#define ODATA_TYPE_NAME_MAX_SIZE 128 -#define ODATA_TYPE_MAX_SIZE 128 - -/// -/// Library class public defines -/// -typedef VOID *REDFISH_SERVICE; -typedef VOID *REDFISH_PAYLOAD; - -/// -/// Library class public structures/unions -/// -typedef struct { - EFI_HTTP_STATUS_CODE *StatusCode; - UINTN HeaderCount; - EFI_HTTP_HEADER *Headers; - REDFISH_PAYLOAD Payload; -} REDFISH_RESPONSE; - -/// -/// Odata type-name mapping structure. -/// -typedef struct { - CONST CHAR8 OdataTypeName[ODATA_TYPE_NAME_MAX_SIZE]; - CONST CHAR8 OdataType[ODATA_TYPE_MAX_SIZE]; -} REDFISH_ODATA_TYPE_MAPPING; - -/** - This function uses REST EX protocol provided in RedfishConfigServiceInfo. - The service enumerator will also handle the authentication flow automati= cally - if HTTP basic auth or Redfish session login is configured to use. - - Callers are responsible for freeing the returned service by RedfishClean= upService(). - - @param[in] RedfishConfigServiceInfo Redfish service information the EFI= Redfish - feature driver communicates with. - - @return New created Redfish Service, or NULL if error happens. - -**/ -REDFISH_SERVICE -EFIAPI -RedfishCreateService ( - IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo - ); - -/** - Free the Service and all its related resources. - - @param[in] RedfishService The Service to access the Redfish resou= rces. - -**/ -VOID -EFIAPI -RedfishCleanupService ( - IN REDFISH_SERVICE RedfishService - ); - -/** - Create REDFISH_PAYLOAD instance in local with JSON represented resource = value and - the Redfish Service. - - The returned REDFISH_PAYLOAD can be used to create or update Redfish res= ource in - server side. - - Callers are responsible for freeing the returned payload by RedfishClean= upPayload(). - - @param[in] Value JSON Value of the redfish resource. - @param[in] RedfishService The Service to access the Redfish re= sources. - - @return REDFISH_PAYLOAD instance of the resource, or NULL if error h= appens. - -**/ -REDFISH_PAYLOAD -EFIAPI -RedfishCreatePayload ( - IN EDKII_JSON_VALUE Value, - IN REDFISH_SERVICE RedfishService - ); - -/** - Free the RedfishPayload and all its related resources. - - @param[in] Payload Payload to be freed. - -**/ -VOID -EFIAPI -RedfishCleanupPayload ( - IN REDFISH_PAYLOAD Payload - ); - -/** - This function returns the decoded JSON value of a REDFISH_PAYLOAD. - - Caller doesn't need to free the returned JSON value because it will be r= eleased - in corresponding RedfishCleanupPayload() function. - - @param[in] Payload A REDFISH_PAYLOAD instance. - - @return Decoded JSON value of the payload. - -**/ -EDKII_JSON_VALUE -EFIAPI -RedfishJsonInPayload ( - IN REDFISH_PAYLOAD Payload - ); - -/** - Fill the input RedPath string with system UUID from SMBIOS table or use = the customized - ID if FromSmbios =3D=3D FALSE. - - This is a helper function to build a RedPath string which can be used to= address - a Redfish resource for this computer system. The input PathString must h= ave a Systems - note in format of "Systems[UUID=3D%g]" or "Systems[UUID~%g]" to fill the= UUID value. - - Example: - Use "/v1/Systems[UUID=3D%g]/Bios" to build a RedPath to address the "B= ios" resource - for this computer system. - - @param[in] RedPath RedPath format to be build. - @param[in] FromSmbios Get system UUID from SMBIOS as computer sys= tem instance ID. - @param[in] IdString The computer system instance ID. - - @return Full RedPath with system UUID inside, or NULL if error happe= ns. - -**/ -CHAR8 * -EFIAPI -RedfishBuildPathWithSystemUuid ( - IN CONST CHAR8 *RedPath, - IN BOOLEAN FromSmbios, - IN CHAR8 *IdString OPTIONAL - ); - -/** - Get a redfish response addressed by a RedPath string, including HTTP Sta= tusCode, Headers - and Payload which record any HTTP response messages. - - Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in - redfish response data. - - @param[in] RedfishService The Service to access the Redfish re= sources. - @param[in] RedPath RedPath string to address a resource= , must start - from the root node. - @param[out] RedResponse Pointer to the Redfish response data. - - @retval EFI_SUCCESS The opeartion is successful, indicates t= he HTTP StatusCode is not - NULL and the value is 2XX. The correspon= ding redfish resource has - been returned in Payload within RedRespo= nse. - @retval EFI_INVALID_PARAMETER RedfishService, RedPath, or RedResponse = is NULL. - @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get - more error info from returned HTTP Statu= sCode, Headers and Payload - within RedResponse: - 1. If the returned Payload is NULL, indi= cates any error happen. - 2. If the returned StatusCode is NULL, i= ndicates any error happen. - 3. If the returned StatusCode is not 2XX= , indicates any error happen. -**/ -EFI_STATUS -EFIAPI -RedfishGetByService ( - IN REDFISH_SERVICE RedfishService, - IN CONST CHAR8 *RedPath, - OUT REDFISH_RESPONSE *RedResponse - ); - -/** - Get a redfish response addressed by URI, including HTTP StatusCode, Head= ers - and Payload which record any HTTP response messages. - - Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in - redfish response data. - - @param[in] RedfishService The Service to access the URI resources. - @param[in] URI String to address a resource. - @param[out] RedResponse Pointer to the Redfish response data. - - @retval EFI_SUCCESS The opeartion is successful, indicates t= he HTTP StatusCode is not - NULL and the value is 2XX. The correspon= ding redfish resource has - been returned in Payload within RedRespo= nse. - @retval EFI_INVALID_PARAMETER RedfishService, RedPath, or RedResponse = is NULL. - @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get - more error info from returned HTTP Statu= sCode, Headers and Payload - within RedResponse: - 1. If the returned Payload is NULL, indi= cates any error happen. - 2. If the returned StatusCode is NULL, i= ndicates any error happen. - 3. If the returned StatusCode is not 2XX= , indicates any error happen. -**/ -EFI_STATUS -EFIAPI -RedfishGetByUri ( - IN REDFISH_SERVICE RedfishService, - IN CONST CHAR8 *Uri, - OUT REDFISH_RESPONSE *RedResponse - ); - -/** - Get a redfish response addressed by the input Payload and relative RedPa= th string, - including HTTP StatusCode, Headers and Payload which record any HTTP res= ponse messages. - - Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in - redfish response data. - - @param[in] Payload A existing REDFISH_PAYLOAD instance. - @param[in] RedPath Relative RedPath string to address a res= ource inside Payload. - @param[out] RedResponse Pointer to the Redfish response data. - - @retval EFI_SUCCESS The opeartion is successful: - 1. The HTTP StatusCode is NULL and the r= eturned Payload in - RedResponse is not NULL, indicates the R= edfish resource has - been parsed from the input payload direc= tly. - 2. The HTTP StatusCode is not NULL and t= he value is 2XX, - indicates the corresponding redfish reso= urce has been returned - in Payload within RedResponse. - @retval EFI_INVALID_PARAMETER Payload, RedPath, or RedResponse is NULL. - @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get - more error info from returned HTTP Statu= sCode, Headers and Payload - within RedResponse: - 1. If the returned Payload is NULL, indi= cates any error happen. - 2. If StatusCode is not NULL and the ret= urned value of StatusCode - is not 2XX, indicates any error happe= n. -**/ -EFI_STATUS -EFIAPI -RedfishGetByPayload ( - IN REDFISH_PAYLOAD Payload, - IN CONST CHAR8 *RedPath, - OUT REDFISH_RESPONSE *RedResponse - ); - -/** - Use HTTP PATCH to perform updates on pre-existing Redfish resource. - - This function uses the RedfishService to patch a Redfish resource addres= sed by - Uri (only the relative path is required). Changes to one or more propert= ies within - the target resource are represented in the input Content, properties not= specified - in Content won't be changed by this request. The corresponding redfish r= esponse will - returned, including HTTP StatusCode, Headers and Payload which record an= y HTTP response - messages. - - Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in - redfish response data. - - @param[in] RedfishService The Service to access the Redfish re= sources. - @param[in] Uri Relative path to address the resourc= e. - @param[in] Content JSON represented properties to be up= date. - @param[out] RedResponse Pointer to the Redfish response data. - - @retval EFI_SUCCESS The opeartion is successful, indicates t= he HTTP StatusCode is not - NULL and the value is 2XX. The Redfish r= esource will be returned - in Payload within RedResponse if server = send it back in the HTTP - response message body. - @retval EFI_INVALID_PARAMETER RedfishService, Uri, Content, or RedResp= onse is NULL. - @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get - more error info from returned HTTP Statu= sCode, Headers and Payload - within RedResponse: - 1. If the returned StatusCode is NULL, i= ndicates any error happen. - 2. If the returned StatusCode is not NUL= L and the value is not 2XX, - indicates any error happen. -**/ -EFI_STATUS -EFIAPI -RedfishPatchToUri ( - IN REDFISH_SERVICE RedfishService, - IN CONST CHAR8 *Uri, - IN CONST CHAR8 *Content, - OUT REDFISH_RESPONSE *RedResponse - ); - -/** - Use HTTP PATCH to perform updates on target payload. Patch to odata.id i= n Payload directly. - - This function uses the Payload to patch the Target. Changes to one or mo= re properties - within the target resource are represented in the input Payload, propert= ies not specified - in Payload won't be changed by this request. The corresponding redfish r= esponse will - returned, including HTTP StatusCode, Headers and Payload which record an= y HTTP response - messages. - - Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in - redfish response data. - - @param[in] Target The target payload to be updated. - @param[in] Payload Palyoad with properties to be changed. - @param[out] RedResponse Pointer to the Redfish response data. - - @retval EFI_SUCCESS The opeartion is successful, indicates t= he HTTP StatusCode is not - NULL and the value is 2XX. The Redfish r= esource will be returned - in Payload within RedResponse if server = send it back in the HTTP - response message body. - @retval EFI_INVALID_PARAMETER Target, Payload, or RedResponse is NULL. - @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get - more error info from returned HTTP Statu= sCode, Headers and Payload - within RedResponse: - 1. If the returned StatusCode is NULL, i= ndicates any error happen. - 2. If the returned StatusCode is not NUL= L and the value is not 2XX, - indicates any error happen. -**/ -EFI_STATUS -EFIAPI -RedfishPatchToPayload ( - IN REDFISH_PAYLOAD Target, - IN REDFISH_PAYLOAD Payload, - OUT REDFISH_RESPONSE *RedResponse - ); - -/** - Use HTTP POST to create a new resource in target payload. - - The POST request should be submitted to the Resource Collection in which= the new resource - is to belong. The Resource Collection is addressed by Target payload. Th= e Redfish may - ignore any service controlled properties. The corresponding redfish resp= onse will returned, - including HTTP StatusCode, Headers and Payload which record any HTTP res= ponse messages. - - Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in - redfish response data. - - @param[in] Target Target payload of the Resource Collection. - @param[in] Payload The new resource to be created. - @param[out] RedResponse Pointer to the Redfish response data. - - @retval EFI_SUCCESS The opeartion is successful, indicates t= he HTTP StatusCode is not - NULL and the value is 2XX. The Redfish r= esource will be returned - in Payload within RedResponse if server = send it back in the HTTP - response message body. - @retval EFI_INVALID_PARAMETER Target, Payload, or RedResponse is NULL. - @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get - more error info from returned HTTP Statu= sCode, Headers and Payload - within RedResponse: - 1. If the returned StatusCode is NULL, i= ndicates any error happen. - 2. If the returned StatusCode is not NUL= L and the value is not 2XX, - indicates any error happen. -**/ -EFI_STATUS -EFIAPI -RedfishPostToPayload ( - IN REDFISH_PAYLOAD Target, - IN REDFISH_PAYLOAD Payload, - OUT REDFISH_RESPONSE *RedResponse - ); - -/** - Use HTTP DELETE to remove a resource. - - This function uses the RedfishService to remove a Redfish resource which= is addressed - by input Uri (only the relative path is required). The corresponding red= fish response will - returned, including HTTP StatusCode, Headers and Payload which record an= y HTTP response - messages. - - Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in - redfish response data. - - @param[in] RedfishService The Service to access the Redfish re= sources. - @param[in] Uri Relative path to address the resourc= e. - @param[out] RedResponse Pointer to the Redfish response data. - - @retval EFI_SUCCESS The opeartion is successful, indicates t= he HTTP StatusCode is not - NULL and the value is 2XX, the Redfish r= esource has been removed. - If there is any message returned from se= rver, it will be returned - in Payload within RedResponse. - @retval EFI_INVALID_PARAMETER RedfishService, Uri, or RedResponse is N= ULL. - @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get - more error info from returned HTTP Statu= sCode, Headers and Payload - within RedResponse: - 1. If the returned StatusCode is NULL, i= ndicates any error happen. - 2. If the returned StatusCode is not NUL= L and the value is not 2XX, - indicates any error happen. -**/ -EFI_STATUS -EFIAPI -RedfishDeleteByUri ( - IN REDFISH_SERVICE RedfishService, - IN CONST CHAR8 *Uri, - OUT REDFISH_RESPONSE *RedResponse - ); - -/** - Dump text in fractions. - - @param[in] String ASCII string to dump. - -**/ -VOID -RedfishDumpJsonStringFractions ( - IN CHAR8 *String - ); - -/** - Extract the JSON text content from REDFISH_PAYLOAD and dump to debug con= sole. - - @param[in] Payload The Redfish payload to dump. - -**/ -VOID -RedfishDumpPayload ( - IN REDFISH_PAYLOAD Payload - ); - -/** - Dump text in JSON value. - - @param[in] JsonValue The Redfish JSON value to dump. - -**/ -VOID -RedfishDumpJson ( - IN EDKII_JSON_VALUE JsonValue - ); - -/** - This function will cleanup the HTTP header and Redfish payload resources. - - @param[in] StatusCode The status code in HTTP response message. - @param[in] HeaderCount Number of HTTP header structures in Header= s list. - @param[in] Headers Array containing list of HTTP headers. - @param[in] Payload The Redfish payload to dump. - -**/ -VOID -RedfishFreeResponse ( - IN EFI_HTTP_STATUS_CODE *StatusCode, - IN UINTN HeaderCount, - IN EFI_HTTP_HEADER *Headers, - IN REDFISH_PAYLOAD Payload - ); - -/** - Check if the "@odata.type" in Payload is valid or not. - - @param[in] Payload The Redfish payload to be checked. - @param[in] OdataTypeName OdataType will be retrived from map= ping list. - @param[in] OdataTypeMappingList The list of OdataType. - @param[in] OdataTypeMappingListSize The number of mapping list - - @return TRUE if the "@odata.type" in Payload is valid, otherwise FALSE. - -**/ -BOOLEAN -RedfishIsValidOdataType ( - IN REDFISH_PAYLOAD Payload, - IN CONST CHAR8 *OdataTypeName, - IN REDFISH_ODATA_TYPE_MAPPING *OdataTypeMappingList, - IN UINTN OdataTypeMappingListSize - ); - -/** - Check if the payload is collection - - @param[in] Payload The Redfish payload to be checked. - - @return TRUE if the payload is collection. - -**/ -BOOLEAN -RedfishIsPayloadCollection ( - IN REDFISH_PAYLOAD Payload - ); - -/** - Get collection size. - - @param[in] Payload The Redfish collection payload - @param[in] CollectionSize Size of this collection - - @return EFI_SUCCESS Coolection size is returned in Collecti= onSize - @return EFI_INVALID_PARAMETER The payload is not a collection. -**/ -EFI_STATUS -RedfishGetCollectionSize ( - IN REDFISH_PAYLOAD Payload, - IN UINTN *CollectionSize - ); - -/** - Get Redfish payload of collection member - - @param[in] Payload The Redfish collection payload - @param[in] Index Index of collection member - - @return NULL Fail to get collection member. - @return Non NULL Payload is returned. -**/ -REDFISH_PAYLOAD -RedfishGetPayloadByIndex ( - IN REDFISH_PAYLOAD Payload, - IN UINTN Index - ); - -/** - Check and return Redfish resource of the given Redpath. - - @param[in] RedfishService Pointer to REDFISH_SERVICE - @param[in] Redpath Redpath of the resource. - @param[in] Response Optional return the resource. - - @return EFI_STATUS -**/ -EFI_STATUS -RedfishCheckIfRedpathExist ( - IN REDFISH_SERVICE RedfishService, - IN CHAR8 *Redpath, - IN REDFISH_RESPONSE *Response OPTIONAL - ); - -/** - This function returns the string of Redfish service version. - - @param[in] RedfishService Redfish service instance. - @param[out] ServiceVersionStr Redfish service string. - - @return EFI_STATUS - -**/ -EFI_STATUS -RedfishGetServiceVersion ( - IN REDFISH_SERVICE RedfishService, - OUT CHAR8 **ServiceVersionStr - ); - -/** - This function returns the string of Redfish service version. - - @param[in] ServiceVerisonStr The string of Redfish service version. - @param[in] Url The URL to build Redpath with ID. - Start with "/", for example "/Registries" - @param[in] Id ID string - @param[out] Redpath Pointer to retrive Redpath, caller has to= free - the memory allocated for this string. - @return EFI_STATUS - -**/ -EFI_STATUS -RedfishBuildRedpathUseId ( - IN CHAR8 *ServiceVerisonStr, - IN CHAR8 *Url, - IN CHAR8 *Id, - OUT CHAR8 **Redpath - ); - -#endif diff --git a/RedfishPkg/PrivateLibrary/RedfishLib/RedfishLib.c b/RedfishPkg= /PrivateLibrary/RedfishLib/RedfishLib.c index 9f9d377..c52a518 100644 --- a/RedfishPkg/PrivateLibrary/RedfishLib/RedfishLib.c +++ b/RedfishPkg/PrivateLibrary/RedfishLib/RedfishLib.c @@ -583,6 +583,104 @@ RedfishPatchToPayload ( return EFI_SUCCESS; } + +/** + Use HTTP POST to create new Redfish resource in the Resource Collection. + + The POST request should be submitted to the Resource Collection in which= the new resource + is to belong. The Resource Collection is addressed by URI. The Redfish m= ay + ignore any service controlled properties. The corresponding redfish resp= onse will returned, + including HTTP StatusCode, Headers and Payload which record any HTTP res= ponse messages. + + Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in + redfish response data. + + @param[in] RedfishService The Service to access the Redfish re= sources. + @param[in] Uri Relative path to address the resourc= e. + @param[in] Content JSON represented properties to be up= date. + @param[in] ContentSize Size of the Content to be send to Re= dfish service + @param[in] ContentType Type of the Content to be send to Re= dfish service + @param[out] RedResponse Pointer to the Redfish response data. + + @retval EFI_SUCCESS The opeartion is successful, indicates t= he HTTP StatusCode is not + NULL and the value is 2XX. The Redfish r= esource will be returned + in Payload within RedResponse if server = send it back in the HTTP + response message body. + @retval EFI_INVALID_PARAMETER RedfishService, Uri, Content, or RedResp= onse is NULL. + @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get + more error info from returned HTTP Statu= sCode, Headers and Payload + within RedResponse: + 1. If the returned StatusCode is NULL, i= ndicates any error happen. + 2. If the returned StatusCode is not NUL= L and the value is not 2XX, + indicates any error happen. +**/ +EFI_STATUS +EFIAPI +RedfishPostToUriEx ( + IN REDFISH_SERVICE RedfishService, + IN CONST CHAR8 *Uri, + IN CONST CHAR8 *Content, + IN UINTN ContentSize, + IN CONST CHAR8 *ContentType, + OUT REDFISH_RESPONSE *RedResponse + ) +{ + EFI_STATUS Status; + EDKII_JSON_VALUE JsonValue; + + Status =3D EFI_SUCCESS; + JsonValue =3D NULL; + + if ((RedfishService =3D=3D NULL) || (Uri =3D=3D NULL) || (Content =3D=3D= NULL) || (RedResponse =3D=3D NULL)) { + return EFI_INVALID_PARAMETER; + } + + ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE)); + + JsonValue =3D (EDKII_JSON_VALUE)postUriFromService ( + RedfishService, + Uri, + Content, + ContentSize, + ContentType, + &(RedResponse->StatusCode) + ); + + // + // 1. If the returned StatusCode is NULL, indicates any error happen. + // + if (RedResponse->StatusCode =3D=3D NULL) { + Status =3D EFI_DEVICE_ERROR; + goto ON_EXIT; + } + + // + // 2. If the returned StatusCode is not NULL and the value is not 2XX, i= ndicates any error happen. + // NOTE: If there is any error message returned from server, it will = be returned in + // Payload within RedResponse. + // + if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \ + (*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT)) + { + Status =3D EFI_DEVICE_ERROR; + } + +ON_EXIT: + if (JsonValue !=3D NULL) { + RedResponse->Payload =3D createRedfishPayload (JsonValue, RedfishServi= ce); + if (RedResponse->Payload =3D=3D NULL) { + // + // Ignore the error when create RedfishPayload, just free the JsonVa= lue since it's not what + // we care about if the returned StatusCode is 2XX. + // + JsonValueFree (JsonValue); + } + } + + return Status; +} + + /** Use HTTP POST to create a new resource in target payload. @@ -738,6 +836,97 @@ ON_EXIT: return Status; } + +/** + Use HTTP DELETE to remove a resource. + + This function uses the RedfishService to remove a Redfish resource which= is addressed + by input Uri (only the relative path is required). The corresponding red= fish response will + returned, including HTTP StatusCode, Headers and Payload which record an= y HTTP response + messages. + + Callers are responsible for freeing the HTTP StatusCode, Headers and Pay= load returned in + redfish response data. + + @param[in] RedfishService The Service to access the Redfish re= sources. + @param[in] Uri Relative path to address the resourc= e. + @param[in] Content JSON represented properties to be de= leted. + @param[out] RedResponse Pointer to the Redfish response data. + + @retval EFI_SUCCESS The opeartion is successful, indicates t= he HTTP StatusCode is not + NULL and the value is 2XX, the Redfish r= esource has been removed. + If there is any message returned from se= rver, it will be returned + in Payload within RedResponse. + @retval EFI_INVALID_PARAMETER RedfishService, Uri, or RedResponse is N= ULL. + @retval EFI_DEVICE_ERROR An unexpected system or network error oc= curred. Callers can get + more error info from returned HTTP Statu= sCode, Headers and Payload + within RedResponse: + 1. If the returned StatusCode is NULL, i= ndicates any error happen. + 2. If the returned StatusCode is not NUL= L and the value is not 2XX, + indicates any error happen. +**/ +EFI_STATUS +EFIAPI +RedfishDeleteByUriEx ( + IN REDFISH_SERVICE RedfishService, + IN CONST CHAR8 *Uri, + IN CONST CHAR8 *Content, + OUT REDFISH_RESPONSE *RedResponse + ) +{ + EFI_STATUS Status; + EDKII_JSON_VALUE JsonValue; + + Status =3D EFI_SUCCESS; + JsonValue =3D NULL; + + if ((RedfishService =3D=3D NULL) || (Content =3D=3D NULL) || (Uri =3D=3D= NULL) || (RedResponse =3D=3D NULL)) { + return EFI_INVALID_PARAMETER; + } + + ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE)); + + JsonValue =3D (EDKII_JSON_VALUE)deleteUriFromServiceEx ( + RedfishService, + Uri, + Content, + &(RedResponse->StatusCode) + ); + + // + // 1. If the returned StatusCode is NULL, indicates any error happen. + // + if (RedResponse->StatusCode =3D=3D NULL) { + Status =3D EFI_DEVICE_ERROR; + goto ON_EXIT; + } + + // + // 2. If the returned StatusCode is not NULL and the value is not 2XX, i= ndicates any error happen. + // NOTE: If there is any error message returned from server, it will = be returned in + // Payload within RedResponse. + // + if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \ + (*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT)) + { + Status =3D EFI_DEVICE_ERROR; + } + +ON_EXIT: + if (JsonValue !=3D NULL) { + RedResponse->Payload =3D createRedfishPayload (JsonValue, RedfishServi= ce); + if (RedResponse->Payload =3D=3D NULL) { + // + // Ignore the error when create RedfishPayload, just free the JsonVa= lue since it's not what + // we care about if the returned StatusCode is 2XX. + // + JsonValueFree (JsonValue); + } + } + + return Status; +} + /** Dump text in fractions. diff --git a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/re= dfishService.h b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/includ= e/redfishService.h index 5c13b68..75afadc 100644 --- a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishSe= rvice.h +++ b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishSe= rvice.h @@ -129,6 +129,14 @@ deleteUriFromService ( EFI_HTTP_STATUS_CODE **StatusCode ); +json_t * +deleteUriFromServiceEx ( + redfishService *service, + const char *uri, + const char *content, + EFI_HTTP_STATUS_CODE **StatusCode + ); + redfishPayload * getRedfishServiceRoot ( redfishService *service, diff --git a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/servic= e.c b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c index afa172b..b8bfabe 100644 --- a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c +++ b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c @@ -923,10 +923,12 @@ ON_EXIT: return ret; } + json_t * -deleteUriFromService ( +deleteUriFromServiceEx ( redfishService *service, const char *uri, + const char *content, EFI_HTTP_STATUS_CODE **StatusCode ) { @@ -937,6 +939,8 @@ deleteUriFromService ( EFI_HTTP_REQUEST_DATA *RequestData =3D NULL; EFI_HTTP_MESSAGE *RequestMsg =3D NULL; EFI_HTTP_MESSAGE ResponseMsg; + CHAR8 ContentLengthStr[80]; + size_t contentLength; ret =3D NULL; @@ -956,7 +960,7 @@ deleteUriFromService ( // // Step 1: Create HTTP request message with 4 headers: // - HttpIoHeader =3D HttpIoCreateHeader ((service->sessionToken || service->= basicAuthStr) ? 5 : 4); + HttpIoHeader =3D HttpIoCreateHeader ((service->sessionToken || service->= basicAuthStr) ? 8 : 7); if (HttpIoHeader =3D=3D NULL) { ret =3D NULL; goto ON_EXIT; @@ -979,6 +983,23 @@ deleteUriFromService ( Status =3D HttpIoSetHeader (HttpIoHeader, "Connection", "Keep-Alive"); ASSERT_EFI_ERROR (Status); + Status =3D HttpIoSetHeader (HttpIoHeader, "Content-Type", "application/j= son"); + ASSERT_EFI_ERROR (Status); + + if(content !=3D NULL){ + contentLength =3D strlen (content); + AsciiSPrint ( + ContentLengthStr, + sizeof (ContentLengthStr), + "%lu", + (UINT64)contentLength + ); + Status =3D HttpIoSetHeader (HttpIoHeader, "Content-Length", ContentL= engthStr); + ASSERT_EFI_ERROR (Status); + Status =3D HttpIoSetHeader (HttpIoHeader, "OData-Version", "4.0"); + ASSERT_EFI_ERROR (Status); + } + // // Step 2: build the rest of HTTP request info. // @@ -1003,7 +1024,12 @@ deleteUriFromService ( RequestMsg->Data.Request =3D RequestData; RequestMsg->HeaderCount =3D HttpIoHeader->HeaderCount; RequestMsg->Headers =3D HttpIoHeader->Headers; - + + if(content !=3D NULL){ + RequestMsg->BodyLength =3D contentLength; + RequestMsg->Body =3D (VOID *)content; + } + ZeroMem (&ResponseMsg, sizeof (ResponseMsg)); // @@ -1057,6 +1083,17 @@ ON_EXIT: return ret; } +json_t * +deleteUriFromService ( + redfishService *service, + const char *uri, + EFI_HTTP_STATUS_CODE **StatusCode + ) +{ + return deleteUriFromServiceEx(service, uri, NULL, StatusCode); +} + + redfishPayload * getRedfishServiceRoot ( redfishService *service, diff --git a/RedfishPkg/RedfishPkg.dec b/RedfishPkg/RedfishPkg.dec index 9886502..0aa2688 100644 --- a/RedfishPkg/RedfishPkg.dec +++ b/RedfishPkg/RedfishPkg.dec @@ -64,7 +64,7 @@ ## @libraryclass Redfish Helper Library # Library provides Redfish helper functions. - RedfishLib|PrivateInclude/Library/RedfishLib.h + RedfishLib|Include/Library/RedfishLib.h [Protocols] ## Include/Protocol/EdkIIRedfishCredential.h -- 2.6.1.windows.1 -The information contained in this message may be confidential and propriet= ary to American Megatrends (AMI). This communication is intended to be read= only by the individual or entity to whom it is addressed or by their desig= nee. If the reader of this message is not the intended recipient, you are o= n notice that any distribution of this message, in any form, is strictly pr= ohibited. Please promptly notify the sender by reply e-mail or by telephone= at 770-246-8600, and then delete or destroy all copies of the transmission. -=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 (#92182): https://edk2.groups.io/g/devel/message/92182 Mute This Topic: https://groups.io/mt/92870589/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-