[AMD Official Use Only - General]

Thanks for catching that, Igor. Will send out V4 for this change.

Abner

> -----Original Message-----
> From: Igor Kulchytskyy <ig...@ami.com>
> Sent: Thursday, January 4, 2024 10:59 PM
> To: Chang, Abner <abner.ch...@amd.com>; devel@edk2.groups.io
> Cc: Nickle Wang <nick...@nvidia.com>; Mike Maslenkin
> <mike.maslen...@gmail.com>
> Subject: RE: [EXTERNAL] [edk2-redfish-client][PATCH V3] RedfishClientPkg:
> Add ETag PCD and revise Redfish ETag functions
>
> Caution: This message originated from an External Source. Use proper caution
> when opening attachments, clicking links, or responding.
>
>
> Hi Abner,
> Some small correction in comments syntax (see below).
> Thank you,
> Igor
>
> -----Original Message-----
> From: abner.ch...@amd.com <abner.ch...@amd.com>
> Sent: Thursday, January 4, 2024 4:09 AM
> To: devel@edk2.groups.io
> Cc: Nickle Wang <nick...@nvidia.com>; Igor Kulchytskyy <ig...@ami.com>;
> Mike Maslenkin <mike.maslen...@gmail.com>
> Subject: [EXTERNAL] [edk2-redfish-client][PATCH V3] RedfishClientPkg: Add
> ETag PCD and revise Redfish ETag functions
>
>
> **CAUTION: The e-mail below is from an external source. Please exercise
> caution before opening attachments, clicking links, or following guidance.**
>
> From: Abner Chang <abner.ch...@amd.com>
>
> Add PCD to disable ETag capability for the case Redfish
> service doesn't support ETag.
>
> Signed-off-by: Abner Chang <abner.ch...@amd.com>
> Cc: Nickle Wang <nick...@nvidia.com>
> Cc: Igor Kulchytskyy <ig...@ami.com>
> Cc: Mike Maslenkin <mike.maslen...@gmail.com>
> ---
>  RedfishClientPkg/RedfishClientPkg.dec         |   3 +
>  .../RedfishFeatureUtilityLib.inf              |   2 +
>  .../Library/RedfishFeatureUtilityLib.h        |  47 +++-
>  .../Features/Bios/v1_0_9/Dxe/BiosDxe.c        |  19 +-
>  .../v1_0_4/Common/BootOptionCommon.c          |   5 +-
>  .../BootOption/v1_0_4/Dxe/BootOptionDxe.c     |  17 +-
>  .../v1_5_0/Dxe/ComputerSystemDxe.c            |  13 +-
>  .../Features/Memory/V1_7_1/Dxe/MemoryDxe.c    |  17 +-
>  .../RedfishFeatureUtilityLib.c                | 209 ++++++++++++------
>  9 files changed, 204 insertions(+), 128 deletions(-)
>
> diff --git a/RedfishClientPkg/RedfishClientPkg.dec
> b/RedfishClientPkg/RedfishClientPkg.dec
> index b350facae0..ce3b6d9752 100644
> --- a/RedfishClientPkg/RedfishClientPkg.dec
> +++ b/RedfishClientPkg/RedfishClientPkg.dec
> @@ -3,6 +3,7 @@
>  #
>  # (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
>  # Copyright (c) 2022-2024, NVIDIA CORPORATION & AFFILIATES. All rights
> reserved.
> +# Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
>  #
>  # SPDX-License-Identifier: BSD-2-Clause-Patent
>  ##
> @@ -76,6 +77,8 @@
>
> gEfiRedfishClientPkgTokenSpaceGuid.PcdDefaultRedfishVersion|L"v1"|VOID*
> |0x10000004
>    ## The number of seconds that the firmware will wait before system reboot
>
> gEfiRedfishClientPkgTokenSpaceGuid.PcdRedfishSystemRebootTimeout|5|UI
> NT16|0x20000002
> +  ## Default capability of Redfish service side ETAG support
> +
> gEfiRedfishClientPkgTokenSpaceGuid.PcdRedfishServiceEtagSupported|TRUE|
> BOOLEAN|0x10000005
>
>  [PcdsDynamicEx]
>    ## The flag used to indicate that system reboot is required due to system
> configuration change
> diff --git
> a/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.i
> nf
> b/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.i
> nf
> index 718273b248..63330c8e9d 100644
> ---
> a/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.i
> nf
> +++
> b/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.i
> nf
> @@ -3,6 +3,7 @@
>  #
>  #  (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP<BR>
>  #  Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights
> reserved.
> +#  Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
>  #
>  #  SPDX-License-Identifier: BSD-2-Clause-Patent
>  #
> @@ -54,6 +55,7 @@
>
>  [Pcd]
>    gEfiRedfishClientPkgTokenSpaceGuid.PcdRedfishSystemRebootRequired
> +  gEfiRedfishClientPkgTokenSpaceGuid.PcdRedfishServiceEtagSupported
>
>  [Guids]
>
> diff --git a/RedfishClientPkg/Include/Library/RedfishFeatureUtilityLib.h
> b/RedfishClientPkg/Include/Library/RedfishFeatureUtilityLib.h
> index 9513a65617..0f8aede5c4 100644
> --- a/RedfishClientPkg/Include/Library/RedfishFeatureUtilityLib.h
> +++ b/RedfishClientPkg/Include/Library/RedfishFeatureUtilityLib.h
> @@ -3,6 +3,7 @@
>
>    (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP<BR>
>    Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights
> reserved.
> +  Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
>
> @@ -81,7 +82,7 @@ CopyConfiglanguageList (
>
>  /**
>
> -  Get number of node from the string. Node is seperated by '/'.
> +  Get number of node from the string. Node is separated by '/'.
>
>    @param[in]  NodeString             The node string to parse.
>
> @@ -559,6 +560,19 @@ GetEtagWithUri (
>    IN  EFI_STRING  Uri
>    );
>
> +/**
> +
> +  This function returns a boolean of ETAG support on Redfish service side.
> +
> +  @retval     TRUE    ETAG is supported on Redfish service.
> +  @retval     FALSE   ETAG is not supported on Redfish service.
> +
> +**/
> +BOOLEAN
> +CheckIsServerEtagSupported (
> +  VOID
> +  );
> +
>  /**
>
>    Get @odata.id from give HTTP payload. It's call responsibility to release
> returned buffer.
> @@ -931,22 +945,33 @@ CompareRedfishPropertyVagueValues (
>    );
>
>  /**
> +  Find "ETag" from either HTTP header or Redfish response.
>
> -  Find "ETag" and "Location" from either HTTP header or Redfish response.
> +  @param[in]  Response        HTTP response
> +  @param[out] Etag            String buffer to return ETag
>
> -  @param[in]  Response    HTTP response
> -  @param[out] Etag        String buffer to return ETag
> -  @param[out] Location    String buffer to return Location
> +  @retval  EFI_SUCCESS            ETag is returned in Etag
> +  @retval  EFI_UNSUPPORTED        ETag is unsupported
> +  @retval  EFI_INVALID_PARAMETER  Response, Etag or both are NULL.
>
> -  @retval     EFI_SUCCESS     Data is found and returned.
> -  @retval     Others          Errors occur.
> +**/
> +EFI_STATUS
> +GetHttpResponseEtag (
> +  IN  REDFISH_RESPONSE  *Response,
> +  OUT CHAR8             **Etag
> +  );
> +
> +/**
> +  Find "Location" from either HTTP header or Redfish response.
> +
> +  @param[in]  Response        HTTP response
> +  @param[out] Location        String buffer to return Location
>
>  **/
>  EFI_STATUS
> -GetEtagAndLocation (
> -  IN  REDFISH_RESPONSE *Response,
> -  OUT CHAR8 **Etag, OPTIONAL
> -  OUT EFI_STRING        *Location    OPTIONAL
> +GetHttpResponseLocation (
> +  IN  REDFISH_RESPONSE  *Response,
> +  OUT EFI_STRING        *Location
>    );
>
>  /**
> diff --git a/RedfishClientPkg/Features/Bios/v1_0_9/Dxe/BiosDxe.c
> b/RedfishClientPkg/Features/Bios/v1_0_9/Dxe/BiosDxe.c
> index 2a49c5cd22..f40f2d85af 100644
> --- a/RedfishClientPkg/Features/Bios/v1_0_9/Dxe/BiosDxe.c
> +++ b/RedfishClientPkg/Features/Bios/v1_0_9/Dxe/BiosDxe.c
> @@ -3,6 +3,7 @@
>
>    (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP<BR>
>    Copyright (c) 2022-2024, NVIDIA CORPORATION. All rights reserved.
> +  Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
>
> @@ -153,14 +154,10 @@ RedfishResourceConsumeResource (
>    ASSERT (Private->Json != NULL);
>
>    //
> -  // Find etag in HTTP response header
> +  // Searching for etag in HTTP response header
>    //
> -  Etag   = NULL;
> -  Status = GetEtagAndLocation (ExpectedResponse, &Etag, NULL);
> -  if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, failed to get ETag from HTTP header\n",
> __func__));
> -  }
> -
> +  Etag = NULL;
> +  GetHttpResponseEtag (ExpectedResponse, &Etag);
>    Status = RedfishConsumeResourceCommon (Private, Private->Json, Etag);
>    if (EFI_ERROR (Status)) {
>      if (Status != EFI_ALREADY_STARTED) {
> @@ -365,12 +362,8 @@ RedfishResourceCheck (
>    //
>    // Find etag in HTTP response header
>    //
> -  Etag   = NULL;
> -  Status = GetEtagAndLocation (&Response, &Etag, NULL);
> -  if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a: failed to get ETag from HTTP header\n",
> __func__));
> -  }
> -
> +  Etag = NULL;
> +  GetHttpResponseEtag (&Response, &Etag);
>    Status = RedfishCheckResourceCommon (Private, Private->Json, Etag);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a, failed to check resource from: %s: %r\n",
> __func__, Uri, Status));
> diff --git
> a/RedfishClientPkg/Features/BootOption/v1_0_4/Common/BootOptionCom
> mon.c
> b/RedfishClientPkg/Features/BootOption/v1_0_4/Common/BootOptionCom
> mon.c
> index 0d4c2162c6..0b9f2bf284 100644
> ---
> a/RedfishClientPkg/Features/BootOption/v1_0_4/Common/BootOptionCom
> mon.c
> +++
> b/RedfishClientPkg/Features/BootOption/v1_0_4/Common/BootOptionCom
> mon.c
> @@ -3,6 +3,7 @@
>
>    (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP<BR>
>    Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> +  Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
>
> @@ -455,9 +456,9 @@ RedfishProvisioningResourceCommon (
>    }
>
>    //
> -  // per Redfish spec. the URL of new resource will be returned in "Location"
> header.
> +  // Per Redfish spec. the URL of new resource will be returned in "Location"
> header.
>    //
> -  Status = GetEtagAndLocation (&Response, NULL, &NewResourceLocation);
> +  Status = GetHttpResponseLocation (&Response, &NewResourceLocation);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a: cannot find new location: %r\n", __func__,
> Status));
>      goto RELEASE_RESOURCE;
> diff --git
> a/RedfishClientPkg/Features/BootOption/v1_0_4/Dxe/BootOptionDxe.c
> b/RedfishClientPkg/Features/BootOption/v1_0_4/Dxe/BootOptionDxe.c
> index ba090c51d3..dc2bd9da85 100644
> --- a/RedfishClientPkg/Features/BootOption/v1_0_4/Dxe/BootOptionDxe.c
> +++ b/RedfishClientPkg/Features/BootOption/v1_0_4/Dxe/BootOptionDxe.c
> @@ -3,6 +3,7 @@
>
>    (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP<BR>
>    Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
> +  Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
>
> @@ -154,12 +155,8 @@ RedfishResourceConsumeResource (
>    //
>    // Find etag in HTTP response header
>    //
> -  Etag   = NULL;
> -  Status = GetEtagAndLocation (ExpectedResponse, &Etag, NULL);
> -  if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a: failed to get ETag from HTTP header\n",
> __func__));
> -  }
> -
> +  Etag = NULL;
> +  GetHttpResponseEtag (ExpectedResponse, &Etag);
>    Status = RedfishConsumeResourceCommon (Private, Private->Json, Etag);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a: failed to consume resource from: %s: %r\n",
> __func__, Private->Uri, Status));
> @@ -358,12 +355,8 @@ RedfishResourceCheck (
>    //
>    // Find etag in HTTP response header
>    //
> -  Etag   = NULL;
> -  Status = GetEtagAndLocation (&Response, &Etag, NULL);
> -  if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a: failed to get ETag from HTTP header\n",
> __func__));
> -  }
> -
> +  Etag = NULL;
> +  GetHttpResponseEtag (&Response, &Etag);
>    Status = RedfishCheckResourceCommon (Private, Private->Json, Etag);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((REDFISH_BOOT_OPTION_DEBUG_TRACE, "%a: failed to check
> resource from: %s: %r\n", __func__, Uri, Status));
> diff --git
> a/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSyste
> mDxe.c
> b/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSyste
> mDxe.c
> index 0bbaa92bf4..5927b5fa7a 100644
> ---
> a/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSyste
> mDxe.c
> +++
> b/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Dxe/ComputerSyste
> mDxe.c
> @@ -3,6 +3,7 @@
>
>    (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP<BR>
>    Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights
> reserved.
> +  Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
>
> @@ -150,11 +151,7 @@ RedfishResourceConsumeResource (
>    // Find etag in HTTP response header
>    //
>    Etag   = NULL;
> -  Status = GetEtagAndLocation (ExpectedResponse, &Etag, NULL);
> -  if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, failed to get ETag from HTTP header\n",
> __func__));
> -  }
> -
> +  GetHttpResponseEtag (ExpectedResponse, &Etag);
>    Status = RedfishConsumeResourceCommon (Private, Private->Json, Etag);
>    if (EFI_ERROR (Status)) {
>      if (Status != EFI_ALREADY_STARTED) {
> @@ -360,11 +357,7 @@ RedfishResourceCheck (
>    // Find etag in HTTP response header
>    //
>    Etag   = NULL;
> -  Status = GetEtagAndLocation (&Response, &Etag, NULL);
> -  if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a: failed to get ETag from HTTP header\n",
> __func__));
> -  }
> -
> +  GetHttpResponseEtag (&Response, &Etag);
>    Status = RedfishCheckResourceCommon (Private, Private->Json, Etag);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a, failed to check resource from: %s: %r\n",
> __func__, Uri, Status));
> diff --git a/RedfishClientPkg/Features/Memory/V1_7_1/Dxe/MemoryDxe.c
> b/RedfishClientPkg/Features/Memory/V1_7_1/Dxe/MemoryDxe.c
> index 9230078051..4a6e342879 100644
> --- a/RedfishClientPkg/Features/Memory/V1_7_1/Dxe/MemoryDxe.c
> +++ b/RedfishClientPkg/Features/Memory/V1_7_1/Dxe/MemoryDxe.c
> @@ -3,6 +3,7 @@
>
>    (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP<BR>
>    Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights
> reserved.
> +  Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
>
> @@ -149,12 +150,8 @@ RedfishResourceConsumeResource (
>    //
>    // Find etag in HTTP response header
>    //
> -  Etag   = NULL;
> -  Status = GetEtagAndLocation (ExpectedResponse, &Etag, NULL);
> -  if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a, failed to get ETag from HTTP header\n",
> __func__));
> -  }
> -
> +  Etag = NULL;
> +  GetHttpResponseEtag (ExpectedResponse, &Etag);
>    Status = RedfishConsumeResourceCommon (Private, Private->Json, Etag);
>    if (EFI_ERROR (Status)) {
>      if (Status != EFI_ALREADY_STARTED) {
> @@ -359,12 +356,8 @@ RedfishResourceCheck (
>    //
>    // Find etag in HTTP response header
>    //
> -  Etag   = NULL;
> -  Status = GetEtagAndLocation (&Response, &Etag, NULL);
> -  if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a: failed to get ETag from HTTP header\n",
> __func__));
> -  }
> -
> +  Etag = NULL;
> +  GetHttpResponseEtag (&Response, &Etag);
>    Status = RedfishCheckResourceCommon (Private, Private->Json, Etag);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a, failed to check resource from: %s: %r\n",
> __func__, Uri, Status));
> diff --git
> a/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.
> c
> b/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.
> c
> index 1c2d40f622..f767b4d875 100644
> ---
> a/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.
> c
> +++
> b/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.
> c
> @@ -3,6 +3,7 @@
>
>    (C) Copyright 2020-2022 Hewlett Packard Enterprise Development LP<BR>
>    Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights
> reserved.
> +  Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
>
> @@ -133,6 +134,11 @@ SetEtagFromUri (
>    REDFISH_RESPONSE  Response;
>    EFI_STRING        PendingSettingUri;
>
> +  if (!CheckIsServerEtagSupported ()) {
> +    DEBUG ((DEBUG_INFO, "%a: WARNING - ETAG is not supported\n",
> __func__));
> +    return EFI_SUCCESS;
> +  }
> +
>    if ((RedfishService == NULL) || IS_EMPTY_STRING (Uri)) {
>      return EFI_INVALID_PARAMETER;
>    }
> @@ -157,9 +163,9 @@ SetEtagFromUri (
>    //
>    // Find etag in HTTP response header
>    //
> -  Status = GetEtagAndLocation (&Response, &Etag, NULL);
> -  if (EFI_ERROR (Status)) {
> -    DEBUG ((DEBUG_ERROR, "%a: failed to get ETag from HTTP header\n",
> __func__));
> +  Status = GetHttpResponseEtag (&Response, &Etag);
> +  if (EFI_ERROR (Status) && (Status != EFI_UNSUPPORTED)) {
> +    DEBUG ((DEBUG_ERROR, "%a: Failed to get ETag from HTTP header\n",
> __func__));
>      Status = EFI_NOT_FOUND;
>      goto ON_RELEASE;
>    }
> @@ -241,6 +247,11 @@ SetEtagWithUri (
>    EFI_STATUS  Status;
>    CHAR8       *AsciiUri;
>
> +  if (!CheckIsServerEtagSupported ()) {
> +    DEBUG ((DEBUG_INFO, "%a: WARNING - ETAG is not supported\n",
> __func__));
> +    return EFI_SUCCESS;
> +  }
> +
>    if (IS_EMPTY_STRING (EtagStr) || IS_EMPTY_STRING (Uri)) {
>      return EFI_INVALID_PARAMETER;
>    }
> @@ -286,6 +297,11 @@ GetEtagWithUri (
>      return NULL;
>    }
>
> +  if (!CheckIsServerEtagSupported ()) {
> +    DEBUG ((DEBUG_INFO, "%a: WARNING - ETAG is not supported\n",
> __func__));
> +    return NULL;
> +  }
> +
>    Status = RedfishLocateProtocol ((VOID **)&mEtagProtocol,
> &gEdkIIRedfishETagProtocolGuid);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a: fail to locate gEdkIIRedfishETagProtocolGuid:
> %r\n", __func__, Status));
> @@ -1726,44 +1742,39 @@
> RedfishFeatureGetUnifiedArrayTypeConfigureLang (
>  }
>
>  /**
> +  Find "ETag" from either HTTP header or Redfish response.
>
> -  Find "ETag" and "Location" from either HTTP header or Redfish response.
> +  @param[in]  Response        HTTP response
> +  @param[out] Etag            String buffer to return ETag
>
> -  @param[in]  Response    HTTP response
> -  @param[out] Etag        String buffer to return ETag
> -  @param[out] Location    String buffer to return Location
> -
> -  @retval     EFI_SUCCESS     Data is found and returned.
> -  @retval     Others          Errors occur.
> +  @retval  EFI_SUCCESS            ETag is returned in Etag
> +  @retval  EFI_UNSUPPORTED        ETag is unsupported
> +  @retval  EFI_INVALID_PARAMETER  Response, Etag or both are NULL.
>
>  **/
>  EFI_STATUS
> -GetEtagAndLocation (
> -  IN  REDFISH_RESPONSE *Response,
> -  OUT CHAR8 **Etag, OPTIONAL
> -  OUT EFI_STRING        *Location    OPTIONAL
> +GetHttpResponseEtag (
> +  IN  REDFISH_RESPONSE  *Response,
> +  OUT CHAR8             **Etag
>    )
>  {
> +  EFI_STATUS        Status;
>    EDKII_JSON_VALUE  JsonValue;
>    EDKII_JSON_VALUE  OdataValue;
>    CHAR8             *OdataString;
> -  CHAR8             *AsciiLocation;
>    EFI_HTTP_HEADER   *Header;
> -  EFI_STATUS        Status;
>
> -  if (Response == NULL) {
> +  if ((Response == NULL) || (Etag == NULL)) {
>      return EFI_INVALID_PARAMETER;
>    }
>
> -  if ((Etag == NULL) && (Location == NULL)) {
> -    return EFI_SUCCESS;
> -  }
> -
>    Status = EFI_SUCCESS;
> -
> -  if (Etag != NULL) {
> -    *Etag = NULL;
> -
> +  *Etag  = NULL;
> +  if (!CheckIsServerEtagSupported ()) {
> +    // Don't look for ETAG header or property in this case.
> +    DEBUG ((DEBUG_INFO, "%a: WARNING - No ETag support on Redfish
> service.\n", __func__));
> +    return EFI_UNSUPPORTED;
> +  } else {
>      if (*(Response->StatusCode) == HTTP_STATUS_200_OK) {
>        Header = HttpFindHeader (Response->HeaderCount, Response->Headers,
> HTTP_HEADER_ETAG);
>        if (Header != NULL) {
> @@ -1793,51 +1804,94 @@ GetEtagAndLocation (
>
>      if (*Etag == NULL) {
>        Status = EFI_NOT_FOUND;
> +      DEBUG ((DEBUG_ERROR, "%a: Failed to retrieve ETag from HTTP response
> paylaod.\n", __func__));
>      }
>    }
>
> -  if (Location != NULL) {
> -    *Location     = NULL;
> -    AsciiLocation = NULL;
> +  return Status;
> +}
>
> -    if (*(Response->StatusCode) == HTTP_STATUS_200_OK) {
> -      Header = HttpFindHeader (Response->HeaderCount, Response->Headers,
> HTTP_HEADER_LOCATION);
> -      if (Header != NULL) {
> -        AsciiLocation = AllocateCopyPool (AsciiStrSize (Header->FieldValue),
> Header->FieldValue);
> -        ASSERT (AsciiLocation != NULL);
> -      }
> +/**
> +  Find "Location" from either HTTP header or Redfish response.
> +
> +  @param[in]  Response        HTTP response
> +  @param[out] Location        String buffer to return Location
> +
> +**/
> +EFI_STATUS
> +GetHttpResponseLocation (
> +  IN  REDFISH_RESPONSE  *Response,
> +  OUT EFI_STRING        *Location
> +  )
> +{
> +  EFI_STATUS        Status;
> +  EDKII_JSON_VALUE  JsonValue;
> +  EDKII_JSON_VALUE  OdataValue;
> +  CHAR8             *OdataString;
> +  CHAR8             *AsciiLocation;
> +  EFI_HTTP_HEADER   *Header;
> +
> +  if ((Response == NULL) || (Location == NULL)) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Status        = EFI_SUCCESS;
> +  *Location     = NULL;
> +  AsciiLocation = NULL;
> +  if (*(Response->StatusCode) == HTTP_STATUS_200_OK) {
> +    Header = HttpFindHeader (Response->HeaderCount, Response->Headers,
> HTTP_HEADER_LOCATION);
> +    if (Header != NULL) {
> +      AsciiLocation = AllocateCopyPool (AsciiStrSize (Header->FieldValue),
> Header->FieldValue);
> +      ASSERT (AsciiLocation != NULL);
>      }
> +  }
>
> -    //
> -    // No header is returned. Search payload for location.
> -    //
> -    if ((*Location == NULL) && (Response->Payload != NULL)) {
> -      JsonValue = RedfishJsonInPayload (Response->Payload);
> -      if (JsonValue != NULL) {
> -        OdataValue = JsonObjectGetValue (JsonValueGetObject (JsonValue),
> "@odata.id");
> -        if (OdataValue != NULL) {
> -          OdataString = (CHAR8 *)JsonValueGetAsciiString (OdataValue);
> -          if (OdataString != NULL) {
> -            AsciiLocation = AllocateCopyPool (AsciiStrSize (OdataString),
> OdataString);
> -            ASSERT (AsciiLocation != NULL);
> -          }
> +  //
> +  // No header is returned. Search payload for location.
> +  //
> +  if ((*Location == NULL) && (Response->Payload != NULL)) {
> +    JsonValue = RedfishJsonInPayload (Response->Payload);
> +    if (JsonValue != NULL) {
> +      OdataValue = JsonObjectGetValue (JsonValueGetObject (JsonValue),
> "@odata.id");
> +      if (OdataValue != NULL) {
> +        OdataString = (CHAR8 *)JsonValueGetAsciiString (OdataValue);
> +        if (OdataString != NULL) {
> +          AsciiLocation = AllocateCopyPool (AsciiStrSize (OdataString),
> OdataString);
> +          ASSERT (AsciiLocation != NULL);
>          }
> -
> -        JsonValueFree (JsonValue);
>        }
> -    }
>
> -    if (AsciiLocation != NULL) {
> -      *Location = StrAsciiToUnicode (AsciiLocation);
> -      FreePool (AsciiLocation);
> -    } else {
> -      Status = EFI_NOT_FOUND;
> +      JsonValueFree (JsonValue);
>      }
>    }
>
> +  if (AsciiLocation != NULL) {
> +    *Location = StrAsciiToUnicode (AsciiLocation);
> +    FreePool (AsciiLocation);
> +  } else {
> +    Status = EFI_NOT_FOUND;
> +    DEBUG ((DEBUG_ERROR, "%a: Failed to retrieve Location from HTTP
> response paylaod.\n", __func__));
> +  }
> +
>    return Status;
>  }
>
> +/**
> +
> +  This function returns a boolean of ETAG support on Redfish service side.
> +
> +  @retval     TRUE    ETAG is supported on Redfish service.
> +  @retval     FALSE   ETAG is not supported on Redfish service.
> +
> +**/
> +BOOLEAN
> +CheckIsServerEtagSupported (
> +  VOID
> +  )
> +{
> +  return FixedPcdGetBool (PcdRedfishServiceEtagSupported);
> +}
> +
>  /**
>
>    Create HTTP payload and send them to redfish service with PATCH method.
> @@ -1861,7 +1915,7 @@ CreatePayloadToPatchResource (
>  {
>    REDFISH_PAYLOAD   Payload;
>    EDKII_JSON_VALUE  ResourceJsonValue;
> -  REDFISH_RESPONSE  PostResponse;
> +  REDFISH_RESPONSE  PatchResponse;
>    EFI_STATUS        Status;
>
>    if ((Service == NULL) || (TargetPayload == NULL) || IS_EMPTY_STRING
> (Json)) {
> @@ -1876,8 +1930,8 @@ CreatePayloadToPatchResource (
>      goto EXIT_FREE_JSON_VALUE;
>    }
>
> -  ZeroMem (&PostResponse, sizeof (REDFISH_RESPONSE));
> -  Status = RedfishPatchToPayload (TargetPayload, Payload, &PostResponse);
> +  ZeroMem (&PatchResponse, sizeof (REDFISH_RESPONSE));
> +  Status = RedfishPatchToPayload (TargetPayload, Payload, &PatchResponse);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "%a:%d Failed to PATCH payload to Redfish
> service.\n", __func__, __LINE__));
>
> @@ -1885,7 +1939,7 @@ CreatePayloadToPatchResource (
>      DEBUG ((DEBUG_ERROR, "%a: Request:\n", __func__));
>      DumpRedfishPayload (DEBUG_ERROR, Payload);
>      DEBUG ((DEBUG_ERROR, "%a: Response:\n", __func__));
> -    DumpRedfishResponse (__func__, DEBUG_ERROR, &PostResponse);
> +    DumpRedfishResponse (__func__, DEBUG_ERROR, &PatchResponse);
>      DEBUG_CODE_END ();
>      goto EXIT_FREE_JSON_VALUE;
>    }
> @@ -1893,16 +1947,20 @@ CreatePayloadToPatchResource (
>    //
>    // Find ETag
>    //
> -  Status = GetEtagAndLocation (&PostResponse, Etag, NULL);
> -  if (EFI_ERROR (Status)) {
> +  Status = GetHttpResponseEtag (&PatchResponse, Etag);
> +  if (Status == EFI_UNSUPPORTED) {
> +    Status = EFI_SUCCESS;
> +    DEBUG ((DEBUG_INFO, "%a: WARNING - ETAG is not supported on Redfish
> service.\n", __func__));
> +  } else {
>      Status = EFI_DEVICE_ERROR;
> +    DEBUG ((DEBUG_ERROR, "%a: Fail to get Location header nor proerty from
> HTTP response payload.\n", __func__));
> Igor:
>     DEBUG ((DEBUG_ERROR, "%a: Fail to get Location header nor Location
> property from HTTP response payload.\n", __func__));
>
>    }
>
>    RedfishFreeResponse (
> -    PostResponse.StatusCode,
> -    PostResponse.HeaderCount,
> -    PostResponse.Headers,
> -    PostResponse.Payload
> +    PatchResponse.StatusCode,
> +    PatchResponse.HeaderCount,
> +    PatchResponse.Headers,
> +    PatchResponse.Payload
>      );
>
>  EXIT_FREE_JSON_VALUE:
> @@ -1935,7 +1993,7 @@ CreatePayloadToPostResource (
>    IN  REDFISH_PAYLOAD  *TargetPayload,
>    IN  CHAR8            *Json,
>    OUT EFI_STRING       *Location,
> -  OUT CHAR8            **Etag
> +  OUT CHAR8            **Etag OPTIONAL
>    )
>  {
>    REDFISH_PAYLOAD   Payload;
> @@ -1943,7 +2001,7 @@ CreatePayloadToPostResource (
>    REDFISH_RESPONSE  PostResponse;
>    EFI_STATUS        Status;
>
> -  if ((Service == NULL) || (TargetPayload == NULL) || IS_EMPTY_STRING (Json)
> || (Location == NULL) || (Etag == NULL)) {
> +  if ((Service == NULL) || (TargetPayload == NULL) || IS_EMPTY_STRING
> (Json) || (Location == NULL)) {
>      return EFI_INVALID_PARAMETER;
>    }
>
> @@ -1970,12 +2028,22 @@ CreatePayloadToPostResource (
>      goto EXIT_FREE_JSON_VALUE;
>    }
>
> +  Status = GetHttpResponseEtag (&PostResponse, Etag);
> +  if (Status == EFI_UNSUPPORTED) {
> +    Status = EFI_SUCCESS;
> +    DEBUG ((DEBUG_INFO, "%a: WARNING - ETAG is not supported on Redfish
> service.\n", __func__));
> +  } else if (EFI_ERROR (Status)) {
> +    Status = EFI_DEVICE_ERROR;
> +    DEBUG ((DEBUG_ERROR, "%a: Fail to get ETAG header nor ETAG
> propertyfrom HTTP response payload.\n", __func__));
> Igor:
>     DEBUG ((DEBUG_ERROR, "%a: Fail to get ETAG header nor ETAG property
> from HTTP response payload.\n", __func__));
> +  }
> +
>    //
>    // per Redfish spec. the URL of new resource will be returned in "Location"
> header.
>    //
> -  Status = GetEtagAndLocation (&PostResponse, Etag, Location);
> +  Status = GetHttpResponseLocation (&PostResponse, Location);
>    if (EFI_ERROR (Status)) {
>      Status = EFI_DEVICE_ERROR;
> +    DEBUG ((DEBUG_ERROR, "%a: Fail to get Location header nor proerty from
> HTTP response payload.\n", __func__));
> Igor:
> DEBUG ((DEBUG_ERROR, "%a: Fail to get Location header nor Location
> property from HTTP response payload.\n", __func__));
>    }
>
>    RedfishFreeResponse (
> @@ -3117,6 +3185,11 @@ CheckEtag (
>  {
>    CHAR8  *EtagInDb;
>
> +  if (!CheckIsServerEtagSupported ()) {
> +    DEBUG ((DEBUG_INFO, "%a: WARNING - ETAG is not supported, always
> returns FALSE to consume resource (Performance would be reduced).\n",
> __func__));
> +    return FALSE;
> +  }
> +
>    if (IS_EMPTY_STRING (Uri)) {
>      return FALSE;
>    }
> --
> 2.37.1.windows.1
>
> -The information contained in this message may be confidential and
> proprietary 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
> designee. If the reader of this message is not the intended recipient, you are
> on notice that any distribution of this message, in any form, is strictly
> prohibited. 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.


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#113343): https://edk2.groups.io/g/devel/message/113343
Mute This Topic: https://groups.io/mt/103519370/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-



Reply via email to