BIOS feature driver cannot recognize "@Redfish.Settings", decode it and get pending setting URI. So BIOS feature driver can consume pending setting from correct place.
Signed-off-by: Simon Wang <simow...@nvidia.com> Cc: Nickle Wang <nick...@nvidia.com> Cc: Abner Chang <abner.ch...@amd.com> Cc: Igor Kulchytskyy <ig...@ami.com> --- .../Features/Bios/v1_0_9/Dxe/BiosDxe.c | 65 ++++++++++++++++--- 1 file changed, 57 insertions(+), 8 deletions(-) diff --git a/RedfishClientPkg/Features/Bios/v1_0_9/Dxe/BiosDxe.c b/RedfishClientPkg/Features/Bios/v1_0_9/Dxe/BiosDxe.c index 15ec208d..125e4eda 100644 --- a/RedfishClientPkg/Features/Bios/v1_0_9/Dxe/BiosDxe.c +++ b/RedfishClientPkg/Features/Bios/v1_0_9/Dxe/BiosDxe.c @@ -2,6 +2,7 @@ Redfish feature driver implementation - Bios (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP<BR> + Copyright (c) 2022, NVIDIA CORPORATION. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @@ -101,7 +102,13 @@ RedfishResourceConsumeResource ( REDFISH_RESOURCE_COMMON_PRIVATE *Private; EFI_STATUS Status; REDFISH_RESPONSE Response; + REDFISH_RESPONSE *ExpectedResponse; + REDFISH_RESPONSE RedfishSettingsResponse; CHAR8 *Etag; + UINTN Index; + EDKII_JSON_VALUE JsonValue; + EFI_STRING RedfishSettingsUri; + CONST CHAR8 *RedfishSettingsUriKeys[] = { "@Redfish.Settings", "SettingsObject", "@odata.id" }; if ((This == NULL) || IS_EMPTY_STRING (Uri)) { return EFI_INVALID_PARAMETER; @@ -119,8 +126,38 @@ RedfishResourceConsumeResource ( return Status; } + ExpectedResponse = &Response; + RedfishSettingsUri = NULL; + JsonValue = RedfishJsonInPayload (Response.Payload); + + // + // Seeking RedfishSettings URI link. + // + for (Index = 0; Index < sizeof (RedfishSettingsUriKeys) / sizeof (*RedfishSettingsUriKeys); Index++) { + if (JsonValue == NULL) { + break; + } + + JsonValue = JsonObjectGetValue (JsonValueGetObject (JsonValue), RedfishSettingsUriKeys[Index]); + } + + if (JsonValue != NULL) { + // + // Verify RedfishSettings URI link is valid to retrieve resource or not. + // + RedfishSettingsUri = JsonValueGetUnicodeString (JsonValue); + + Status = GetResourceByUri (Private->RedfishService, RedfishSettingsUri, &RedfishSettingsResponse); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a, @Redfish.Settings exists, get resource from: %s failed\n", __FUNCTION__, RedfishSettingsUri)); + } else { + Uri = RedfishSettingsUri; + ExpectedResponse = &RedfishSettingsResponse; + } + } + Private->Uri = Uri; - Private->Payload = Response.Payload; + Private->Payload = ExpectedResponse->Payload; ASSERT (Private->Payload != NULL); Private->Json = JsonDumpString (RedfishJsonInPayload (Private->Payload), EDKII_JSON_COMPACT); @@ -130,7 +167,7 @@ RedfishResourceConsumeResource ( // Find etag in HTTP response header // Etag = NULL; - Status = GetEtagAndLocation (&Response, &Etag, NULL); + Status = GetEtagAndLocation (ExpectedResponse, &Etag, NULL); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "%a, failed to get ETag from HTTP header\n", __FUNCTION__)); } @@ -153,12 +190,24 @@ RedfishResourceConsumeResource ( // Release resource // if (Private->Payload != NULL) { - RedfishFreeResponse ( - Response.StatusCode, - Response.HeaderCount, - Response.Headers, - Response.Payload - ); + if (Response.Payload != NULL) { + RedfishFreeResponse ( + Response.StatusCode, + Response.HeaderCount, + Response.Headers, + Response.Payload + ); + } + + if (RedfishSettingsResponse.Payload != NULL) { + RedfishFreeResponse ( + RedfishSettingsResponse.StatusCode, + RedfishSettingsResponse.HeaderCount, + RedfishSettingsResponse.Headers, + RedfishSettingsResponse.Payload + ); + } + Private->Payload = NULL; } -- 2.17.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#104747): https://edk2.groups.io/g/devel/message/104747 Mute This Topic: https://groups.io/mt/98842834/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-