public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Nickle Wang via groups.io" <nicklew=nvidia.com@groups.io>
To: "Chang, Abner" <Abner.Chang@amd.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: Igor Kulchytskyy <igork@ami.com>, Nick Ramirez <nramirez@nvidia.com>
Subject: Re: [edk2-devel] [edk2-redfish-client][PATCH 3/6] RedfishClientPkg: feature driver enhancement.
Date: Tue, 28 Nov 2023 06:44:04 +0000	[thread overview]
Message-ID: <MW4PR12MB7031DE86C5149E530F129952D9BCA@MW4PR12MB7031.namprd12.prod.outlook.com> (raw)
In-Reply-To: <MN2PR12MB396605CD3F8C08C689E6D034EABCA@MN2PR12MB3966.namprd12.prod.outlook.com>

Hi Abner,

Thanks for your review. Please find my comment below.

> This may spend some time on network to get the whole resource from URI if the
> resource size is big, but we just need the information of ETAG header. We can
> think of using HEAD HTTP method.
> However, this seems fine for now as the following code gets the pending settings
> from the same HTTP response body retrieved above.
> The worst case would be there is no pending setting, however we waste network
> bandwidth to get the whole response body. Not sure if HTTP query $select can
> improve this or not for retrieving pending setting annotation.

Yes, it is good idea to use HTTP HEAD method to get ETag and save the bandwidth. "$select" may reduce the data size but it may increase the loading of BMC while BMC is doing filtering.

HTTP HEAD relies on BMC support, and it seems to me that OpenBMC does not support HTTP HEAD yet. Let's put this to our to-do list and implement HTTP HEAD function while we have this support in BMC.

Thanks,
Nickle

> -----Original Message-----
> From: Chang, Abner <Abner.Chang@amd.com>
> Sent: Tuesday, November 28, 2023 12:05 PM
> To: Nickle Wang <nicklew@nvidia.com>; devel@edk2.groups.io
> Cc: Igor Kulchytskyy <igork@ami.com>; Nick Ramirez <nramirez@nvidia.com>
> Subject: RE: [edk2-redfish-client][PATCH 3/6] RedfishClientPkg: feature driver
> enhancement.
> 
> External email: Use caution opening links or attachments
> 
> 
> [AMD Official Use Only - General]
> 
> > -----Original Message-----
> > From: Nickle Wang <nicklew@nvidia.com>
> > Sent: Thursday, November 23, 2023 10:34 PM
> > To: devel@edk2.groups.io
> > Cc: Chang, Abner <Abner.Chang@amd.com>; Igor Kulchytskyy
> > <igork@ami.com>; Nick Ramirez <nramirez@nvidia.com>
> > Subject: [edk2-redfish-client][PATCH 3/6] RedfishClientPkg: feature
> > driver enhancement.
> >
> > Caution: This message originated from an External Source. Use proper
> > caution when opening attachments, clicking links, or responding.
> >
> >
> > -Fix typo (include function RedfisSetRedfishUri and parameter
> > MaxLengthConfigLang)
> > -Add more debug message.
> > -Do not save ETag to variable every time when new ETag is created in
> > SetEtagWithUri().
> > -Introduce SetEtagFromUri() to get ETag from BMC and save it in
> > variable.
> > -Introduce GetPendingSettings() to check and see if Redfish pending
> > settings is supported or not.
> >
> > Signed-off-by: Nickle Wang <nicklew@nvidia.com>
> > Cc: Abner Chang <abner.chang@amd.com>
> > Cc: Igor Kulchytskyy <igork@ami.com>
> > Cc: Nick Ramirez <nramirez@nvidia.com>
> > ---
> >  .../Library/RedfishFeatureUtilityLib.h        |  81 ++++++--
> >  .../Features/Bios/v1_0_9/Common/BiosCommon.c  |   4 +-
> >  .../v1_5_0/Common/ComputerSystemCommon.c      |   4 +-
> >  .../Memory/V1_7_1/Common/MemoryCommon.c       |   4 +-
> >  .../RedfishFeatureUtilityLib.c                | 192 +++++++++++++++++-
> >  5 files changed, 253 insertions(+), 32 deletions(-)
> >
> > diff --git
> > a/RedfishClientPkg/Include/Library/RedfishFeatureUtilityLib.h
> > b/RedfishClientPkg/Include/Library/RedfishFeatureUtilityLib.h
> > index e2f728b2..6347585c 100644
> > --- a/RedfishClientPkg/Include/Library/RedfishFeatureUtilityLib.h
> > +++ b/RedfishClientPkg/Include/Library/RedfishFeatureUtilityLib.h
> > @@ -22,7 +22,7 @@
> >
> >    Read redfish resource by given resource URI.
> >
> > -  @param[in]  Service       Redfish srvice instacne to make query.
> > +  @param[in]  Service       Redfish service instance to make query.
> >    @param[in]  ResourceUri   Target resource URI.
> >    @param[out] Response      HTTP response from redfish service.
> >
> > @@ -47,7 +47,7 @@ GetResourceByUri (
> >    @param[out] ArraySignatureClose       String to the close of array signature.
> >
> >    @retval     EFI_SUCCESS            Index is found.
> > -  @retval     EFI_NOT_FOUND          The non-array configure language string is
> > retured.
> > +  @retval     EFI_NOT_FOUND          The non-array configure language string is
> > returned.
> >    @retval     EFI_INVALID_PARAMETER  The format of input ConfigureLang is
> > wrong.
> >    @retval     Others                 Errors occur.
> >
> > @@ -118,10 +118,10 @@ GetNumberOfRedpathNodes (
> >
> >    @param[in]  NodeString             The node string to parse.
> >    @param[in]  Index                  Index of the node.
> > -  @param[out] EndOfNodePtr           Pointer to receive the poitner to
> > +  @param[out] EndOfNodePtr           Pointer to receive the pointer to
> >                                       the last character of node string.
> >
> > -  @retval     EFI_STRING             the begining of the node string.
> > +  @retval     EFI_STRING             the beginning of the node string.
> >
> >  **/
> >  EFI_STRING
> > @@ -140,7 +140,7 @@ GetRedpathNodeByIndex (
> >    @param[out] Index                 The array index number.
> >
> >    @retval     EFI_SUCCESS            Index is found.
> > -  @retval     EFI_NOT_FOUND          The non-array configure language string is
> > retured.
> > +  @retval     EFI_NOT_FOUND          The non-array configure language string is
> > returned.
> >    @retval     EFI_INVALID_PARAMETER  The format of input ConfigureLang is
> > wrong.
> >    @retval     Others                 Errors occur.
> >
> > @@ -188,9 +188,9 @@ DestroyConfiglanguageList (
> >
> >    @param[in]  DestConfigLang        Pointer to the node's configure language
> > string.
> >                                      The memory pointed by ConfigLang must be allocated
> > -                                    through memory allocation interface. Becasue we will
> > replace
> > +                                    through memory allocation
> > + interface. Because we will
> > replace
> >                                      the pointer in this function.
> > -  @param[in]  MaxtLengthConfigLang  The maximum length of ConfigLang.
> > +  @param[in]  MaxLengthConfigLang   The maximum length of ConfigLang.
> >    @param[in]  ConfigLangInstance    Pointer to Collection member instance.
> >
> >    @retval     EFI_SUCCESS     The instance is inserted to the configure language.
> > @@ -200,7 +200,7 @@ DestroyConfiglanguageList (  EFI_STATUS
> > SetResourceConfigLangMemberInstance (
> >    IN EFI_STRING                              *DestConfigLang,
> > -  IN UINTN                                   MaxtLengthConfigLang,
> > +  IN UINTN                                   MaxLengthConfigLang,
> >    IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG  *ConfigLangInstance
> >    );
> >
> > @@ -244,7 +244,7 @@ ApplyFeatureSettingsStringType (
> >
> >  /**
> >
> > -  Apply property value to UEFI HII database in numric type.
> > +  Apply property value to UEFI HII database in numeric type.
> >
> >    @param[in]  Schema        Property schema.
> >    @param[in]  Version       Property schema version.
> > @@ -356,7 +356,7 @@ ApplyFeatureSettingsNumericArrayType (
> >    @param[in]  Schema        Property schema.
> >    @param[in]  Version       Property schema version.
> >    @param[in]  ConfigureLang Configure language refers to this property.
> > -  @param[in]  ArrayHead     Head of Redfich CS boolean array value.
> > +  @param[in]  ArrayHead     Head of Redfish CS boolean array value.
> >
> >    @retval     EFI_SUCCESS     New value is applied successfully.
> >    @retval     Others          Errors occur.
> > @@ -421,19 +421,19 @@ CreatePayloadToPatchResource (
> >    @param[in]    ConfigLang        ConfigLang to save
> >    @param[in]    Uri               Redfish Uri to save
> >
> > -  @retval  EFI_INVALID_PARAMETR   SystemId is NULL or EMPTY
> > +  @retval  EFI_INVALID_PARAMETER  SystemId is NULL or EMPTY
> >    @retval  EFI_SUCCESS            Redfish uri is saved
> >
> >  **/
> >  EFI_STATUS
> > -RedfisSetRedfishUri (
> > +RedfishSetRedfishUri (
> >    IN    EFI_STRING  ConfigLang,
> >    IN    EFI_STRING  Uri
> >    );
> >
> >  /**
> >
> > -  Get the property name by given Configure Langauge.
> > +  Get the property name by given Configure Language.
> >
> >    @param[in]  ResourceUri              URI of root of resource.
> >    @param[in]  ConfigureLang            Configure Language string.
> > @@ -527,6 +527,25 @@ PropertyChecker (
> >    IN BOOLEAN  ProvisionMode
> >    );
> >
> > +/**
> > +  This function query ETag from given URI string and keep it in database.
> > +
> > +  @param[in]  Service               Redfish service instance to make query.
> > +  @param[in]  Uri                   URI to query ETag.
> > +  @param[in]  CheckPendingSettings  Set this to true and
> > + @Redfish.Settings
> > will
> > +                                    be handled together. FALSE otherwise.
> > +
> > +  @retval     EFI_SUCCESS     ETAG and URI are applied successfully.
> > +  @retval     Others          Errors occur.
> > +
> > +**/
> > +EFI_STATUS
> > +SetEtagFromUri (
> > +  IN  REDFISH_SERVICE  *RedfishService,
> > +  IN  EFI_STRING       Uri,
> > +  IN  BOOLEAN          CheckPendingSettings
> > +  );
> > +
> >  /**
> >
> >    Keep ETAG string and URI string in database.
> > @@ -576,7 +595,7 @@ GetOdataId (
> >
> >  /**
> >
> > -  Return config language from given URI and prperty name. It's call
> > responsibility to release returned buffer.
> > +  Return config language from given URI and property name. It's call
> > responsibility to release returned buffer.
> >
> >    @param[in] Uri            The URI to match
> >    @param[in] PropertyName   The property name of resource. This is optional.
> > @@ -790,7 +809,7 @@ MatchPropertyWithJsonContext (
> >
> >  /**
> >
> > -  Create string array and append to arry node in Redfish JSON convert format.
> > +  Create string array and append to array node in Redfish JSON
> > + convert
> > format.
> >
> >    @param[in,out]  Head          The head of string array.
> >    @param[in]      StringArray   Input string array.
> > @@ -809,7 +828,7 @@ AddRedfishCharArray (
> >
> >  /**
> >
> > -  Create numeric array and append to arry node in Redfish JSON
> > convert format.
> > +  Create numeric array and append to array node in Redfish JSON
> > + convert
> > format.
> >
> >    @param[in,out]  Head           The head of string array.
> >    @param[in]      NumericArray   Input numeric array.
> > @@ -828,7 +847,7 @@ AddRedfishNumericArray (
> >
> >  /**
> >
> > -  Create boolean array and append to arry node in Redfish JSON
> > convert format.
> > +  Create boolean array and append to array node in Redfish JSON
> > + convert
> > format.
> >
> >    @param[in,out]  Head           The head of string array.
> >    @param[in]      BooleanArray   Input boolean array.
> > @@ -871,7 +890,7 @@ CompareRedfishStringArrayValues (
> >    Check and see if value in Redfish numeric array are all the same as the one
> >    from HII configuration.
> >
> > -  @param[in]  Head          The head of Redfish CS numeraic array.
> > +  @param[in]  Head          The head of Redfish CS numeric array.
> >    @param[in]  NumericArray  Input numeric array.
> >    @param[in]  ArraySize     The size of NumericArray.
> >
> > @@ -914,9 +933,9 @@ CompareRedfishBooleanArrayValues (
> >    This is just a simple check.
> >
> >    @param[in]  RedfishVagueKeyValuePtr     The vague key value sets on
> > Redfish service.
> > -  @param[in]  RedfishVagueKeyValueNumber  The numebr of vague key
> > value sets
> > +  @param[in]  RedfishVagueKeyValueNumber  The number of vague key
> > value sets
> >    @param[in]  ConfigVagueKeyValuePtr      The vague configuration on
> > platform.
> > -  @param[in]  ConfigVagueKeyValueNumber   The numebr of vague key value
> > sets
> > +  @param[in]  ConfigVagueKeyValueNumber   The number of vague key value
> > sets
> >
> >    @retval     TRUE          All values are the same.
> >                FALSE         There is some difference.
> > @@ -949,4 +968,26 @@ GetEtagAndLocation (
> >    OUT EFI_STRING        *Location    OPTIONAL
> >    );
> >
> > +/**
> > +
> > +  Check and see if "@Redfish.Settings" exist in given Payload. If
> > + found, return
> > the
> > +  payload and URI to pending settings. Caller has to release "SettingPayload"
> > and
> > +  "SettingUri".
> > +
> 
> > +  @param[in]  Payload         Payload that may contain "@Redfish.Settings"
> > +  @param[out] SettingPayload  Payload keeps pending settings.
> > +  @param[out] SettingUri      URI to pending settings.
> 
> 
> Missed Doxgen tag for RedfishService.
> Please also update the function header of GetPendingSettings in C source file.
> 
> > +
> > +  @retval     EFI_SUCCESS     Pending settings is found and returned.
> > +  @retval     Others          Error happens
> > +
> > +**/
> > +EFI_STATUS
> > +GetPendingSettings (
> > +  IN  REDFISH_SERVICE   RedfishService,
> > +  IN  REDFISH_PAYLOAD   Payload,
> > +  OUT REDFISH_RESPONSE  *SettingResponse,
> > +  OUT EFI_STRING        *SettingUri
> > +  );
> > +
> >  #endif
> > diff --git a/RedfishClientPkg/Features/Bios/v1_0_9/Common/BiosCommon.c
> > b/RedfishClientPkg/Features/Bios/v1_0_9/Common/BiosCommon.c
> > index f96c90cc..98288d66 100644
> > --- a/RedfishClientPkg/Features/Bios/v1_0_9/Common/BiosCommon.c
> > +++ b/RedfishClientPkg/Features/Bios/v1_0_9/Common/BiosCommon.c
> > @@ -338,7 +338,7 @@ ProvisioningBiosResource (
> >    // Keep location of new resource.
> >    //
> >    if (NewResourceLocation != NULL) {
> > -    RedfisSetRedfishUri (ConfigureLang, NewResourceLocation);
> > +    RedfishSetRedfishUri (ConfigureLang, NewResourceLocation);
> >    }
> >
> >    //
> > @@ -745,7 +745,7 @@ RedfishIdentifyResourceCommon (
> >      //
> >      // Keep URI and ConfigLang mapping
> >      //
> > -    RedfisSetRedfishUri (ConfigLangList.List[0].ConfigureLang, Private->Uri);
> > +    RedfishSetRedfishUri (ConfigLangList.List[0].ConfigureLang,
> > + Private->Uri);
> >      //
> >      // Set the configuration language in the
> > RESOURCE_INFORMATION_EXCHANGE.
> >      // This information is sent back to the parent resource (e.g. the
> > collection driver).
> > diff --git
> > a/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Common/Computer
> > SystemCommon.c
> > b/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Common/Computer
> > SystemCommon.c
> > index 7ed1bd55..1ffb7d1d 100644
> > ---
> > a/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Common/Computer
> > SystemCommon.c
> > +++
> > b/RedfishClientPkg/Features/ComputerSystem/v1_5_0/Common/Computer
> > SystemCommon.c
> > @@ -1274,7 +1274,7 @@ ProvisioningComputerSystemResource (
> >    // Keep location of new resource.
> >    //
> >    if (NewResourceLocation != NULL) {
> > -    RedfisSetRedfishUri (ConfigureLang, NewResourceLocation);
> > +    RedfishSetRedfishUri (ConfigureLang, NewResourceLocation);
> >    }
> >
> >    //
> > @@ -1621,7 +1621,7 @@ RedfishIdentifyResourceCommon (
> >      //
> >      // Keep URI and ConfigLang mapping
> >      //
> > -    RedfisSetRedfishUri (ConfigLangList.List[0].ConfigureLang, Private->Uri);
> > +    RedfishSetRedfishUri (ConfigLangList.List[0].ConfigureLang,
> > + Private->Uri);
> >      //
> >      // Set the configuration language in the
> > RESOURCE_INFORMATION_EXCHANGE.
> >      // This information is sent back to the parent resource (e.g. the
> > collection driver).
> > diff --git
> > a/RedfishClientPkg/Features/Memory/V1_7_1/Common/MemoryCommon.c
> > b/RedfishClientPkg/Features/Memory/V1_7_1/Common/MemoryCommon.
> > c
> > index b7434036..4c41f16b 100644
> > ---
> > a/RedfishClientPkg/Features/Memory/V1_7_1/Common/MemoryCommon.c
> > +++
> > b/RedfishClientPkg/Features/Memory/V1_7_1/Common/MemoryCommon.
> > c
> > @@ -2190,7 +2190,7 @@ ProvisioningMemoryResource (
> >    // Keep location of new resource.
> >    //
> >    if (NewResourceLocation != NULL) {
> > -    RedfisSetRedfishUri (ConfigureLang, NewResourceLocation);
> > +    RedfishSetRedfishUri (ConfigureLang, NewResourceLocation);
> >    }
> >
> >    //
> > @@ -2537,7 +2537,7 @@ RedfishIdentifyResourceCommon (
> >      //
> >      // Keep URI and ConfigLang mapping
> >      //
> > -    RedfisSetRedfishUri (ConfigLangList.List[0].ConfigureLang, Private->Uri);
> > +    RedfishSetRedfishUri (ConfigLangList.List[0].ConfigureLang,
> > + Private->Uri);
> >      //
> >      // Set the configuration language in the
> > RESOURCE_INFORMATION_EXCHANGE.
> >      // This information is sent back to the parent resource (e.g. the
> > collection driver).
> > diff --git
> > a/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.
> > c
> > b/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.
> > c
> > index 13e29902..753cd7b2 100644
> > ---
> > a/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.
> > c
> > +++
> > b/RedfishClientPkg/Library/RedfishFeatureUtilityLib/RedfishFeatureUtilityLib.
> > c
> > @@ -107,6 +107,119 @@ GetArraykeyFromUri (
> >    return EFI_SUCCESS;
> >  }
> >
> > +/**
> > +
> > +  This function query ETag from given URI string and keep it in database.
> > +
> > +  @param[in]  Service               Redfish service instance to make query.
> > +  @param[in]  Uri                   URI to query ETag.
> > +  @param[in]  CheckPendingSettings  Set this to true and
> > + @Redfish.Settings
> > will
> > +                                    be handled together. FALSE otherwise.
> > +
> > +  @retval     EFI_SUCCESS     ETAG and URI are applied successfully.
> > +  @retval     Others          Errors occur.
> > +
> > +**/
> > +EFI_STATUS
> > +SetEtagFromUri (
> > +  IN  REDFISH_SERVICE  *RedfishService,
> > +  IN  EFI_STRING       Uri,
> > +  IN  BOOLEAN          CheckPendingSettings
> > +  )
> > +{
> > +  EFI_STATUS        Status;
> > +  CHAR8             *Etag;
> > +  CHAR8             *AsciiUri;
> > +  REDFISH_RESPONSE  Response;
> > +  EFI_STRING        PendingSettingUri;
> > +
> > +  if ((RedfishService == NULL) || IS_EMPTY_STRING (Uri)) {
> > +    return EFI_INVALID_PARAMETER;
> > +  }
> > +
> > +  AsciiUri          = NULL;
> > +  Etag              = NULL;
> > +  PendingSettingUri = NULL;
> > +
> > +  Status = RedfishLocateProtocol ((VOID **)&mEtagProtocol,
> > &gEdkIIRedfishETagProtocolGuid);
> > +  if (EFI_ERROR (Status)) {
> > +    DEBUG ((DEBUG_ERROR, "%a: fail to locate
> > gEdkIIRedfishETagProtocolGuid: %r\n", __func__, Status));
> > +    return Status;
> > +  }
> > +
> > +  Status = GetResourceByUri (RedfishService, Uri, &Response);
> This may spend some time on network to get the whole resource from URI if the
> resource size is big, but we just need the information of ETAG header. We can
> think of using HEAD HTTP method.
> However, this seems fine for now as the following code gets the pending settings
> from the same HTTP response body retrieved above.
> The worst case would be there is no pending setting, however we waste network
> bandwidth to get the whole response body. Not sure if HTTP query $select can
> improve this or not for retrieving pending setting annotation.
> 
> Abner
> 
> 
> > +  if (EFI_ERROR (Status)) {
> > +    DEBUG ((DEBUG_ERROR, "%a: get resource from: %s failed\n",
> > + __func__,
> > Uri));
> > +    return Status;
> > +  }
> > +
> > +  //
> > +  // 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 = EFI_NOT_FOUND;
> > +    goto ON_RELEASE;
> > +  }
> > +
> > +  AsciiUri = StrUnicodeToAscii (Uri);  if (AsciiUri == NULL) {
> > +    Status = EFI_OUT_OF_RESOURCES;
> > +    goto ON_RELEASE;
> > +  }
> > +
> > +  //
> > +  // Save ETag to variable.
> > +  //
> > +  Status = mEtagProtocol->Set (mEtagProtocol, AsciiUri, Etag);  if
> > + (EFI_ERROR (Status)) {
> > +    DEBUG ((DEBUG_ERROR, "%a: failed to set ETag %a -> %a\n",
> > + __func__,
> > Etag, AsciiUri));
> > +  }
> > +
> > +  if (CheckPendingSettings && (Response.Payload != NULL)) {
> > +    //
> > +    // Check to see if there is @Redfish.Settings
> > +    //
> > +    Status = GetPendingSettings (
> > +               RedfishService,
> > +               Response.Payload,
> > +               NULL,
> > +               &PendingSettingUri
> > +               );
> > +    if (!EFI_ERROR (Status)) {
> > +      DEBUG ((REDFISH_DEBUG_TRACE, "%a: @Redfish.Settings found:
> > + %s\n",
> > __func__, PendingSettingUri));
> > +
> > +      Status = SetEtagFromUri (RedfishService, PendingSettingUri, FALSE);
> > +    }
> > +  }
> > +
> > +ON_RELEASE:
> > +
> > +  if (AsciiUri != NULL) {
> > +    FreePool (AsciiUri);
> > +  }
> > +
> > +  if (Etag != NULL) {
> > +    FreePool (Etag);
> > +  }
> > +
> > +  if (PendingSettingUri != NULL) {
> > +    FreePool (PendingSettingUri);
> > +  }
> > +
> > +  if (Response.Payload != NULL) {
> > +    RedfishFreeResponse (
> > +      Response.StatusCode,
> > +      Response.HeaderCount,
> > +      Response.Headers,
> > +      Response.Payload
> > +      );
> > +  }
> > +
> > +  return Status;
> > +}
> > +
> >  /**
> >
> >    Keep ETAG string and URI string in database.
> > @@ -143,7 +256,6 @@ SetEtagWithUri (
> >    }
> >
> >    mEtagProtocol->Set (mEtagProtocol, AsciiUri, EtagStr);
> > -  mEtagProtocol->Flush (mEtagProtocol);
> >
> >    FreePool (AsciiUri);
> >
> > @@ -505,6 +617,8 @@ ApplyFeatureSettingsVagueType (
> >      return EFI_INVALID_PARAMETER;
> >    }
> >
> > +  DEBUG ((REDFISH_DEBUG_TRACE, "%a: schema: %a %a config lang: %s
> > NumberOfVagueValues: %d\n", __func__, Schema, Version, ConfigureLang,
> > NumberOfVagueValues));
> > +
> >    ConfigureLangAscii = AllocatePool (StrLen (ConfigureLang) + 1);
> >    if (ConfigureLangAscii == NULL) {
> >      Status = EFI_OUT_OF_RESOURCES;
> > @@ -1473,7 +1587,7 @@ DestroyConfiglanguageList (
> >                                      The memory pointed by ConfigLang must be allocated
> >                                      through memory allocation
> > interface. Because we will replace
> >                                      the pointer in this function.
> > -  @param[in]  MaxtLengthConfigLang  The maximum length of ConfigLang.
> > +  @param[in]  MaxLengthConfigLang   The maximum length of ConfigLang.
> >    @param[in]  ConfigLangInstance    Pointer to Collection member instance.
> >
> >    @retval     EFI_SUCCESS     The instance is inserted to the configure language.
> > @@ -1483,7 +1597,7 @@ DestroyConfiglanguageList (  EFI_STATUS
> > SetResourceConfigLangMemberInstance (
> >    IN EFI_STRING                              *DestConfigLang,
> > -  IN UINTN                                   MaxtLengthConfigLang,
> > +  IN UINTN                                   MaxLengthConfigLang,
> >    IN REDFISH_FEATURE_ARRAY_TYPE_CONFIG_LANG  *ConfigLangInstance
> >    )
> >  {
> > @@ -1508,14 +1622,14 @@ SetResourceConfigLangMemberInstance (
> >      if (ConfigLangInstance->ConfigureLang == NULL) {
> >        return EFI_INVALID_PARAMETER;
> >      } else {
> > -      StrCatS (*DestConfigLang, MaxtLengthConfigLang, ConfigLangInstance-
> > >ConfigureLang);
> > +      StrCatS (*DestConfigLang, MaxLengthConfigLang,
> > + ConfigLangInstance-
> > >ConfigureLang);
> >        return EFI_SUCCESS;
> >      }
> >    }
> >
> >    MaxStrLength  = StrSize (ThisConfigLang) + StrSize
> > ((EFI_STRING)&InstanceStr);
> >    NewConfigLang = ThisConfigLang;
> > -  if (MaxtLengthConfigLang < MaxStrLength) {
> > +  if (MaxLengthConfigLang < MaxStrLength) {
> >      NewConfigLang = (EFI_STRING)AllocateZeroPool (MaxStrLength);
> >      if (NewConfigLang == NULL) {
> >        DEBUG ((DEBUG_ERROR, "%a: Fail to allocate memory for
> > NewConfigLang.\n", __func__)); @@ -2191,7 +2305,7 @@ GetConfigureLang
> > (
> >
> >  **/
> >  EFI_STATUS
> > -RedfisSetRedfishUri (
> > +RedfishSetRedfishUri (
> >    IN    EFI_STRING  ConfigLang,
> >    IN    EFI_STRING  Uri
> >    )
> > @@ -3524,6 +3638,72 @@ CompareRedfishBooleanArrayValues (
> >    return TRUE;
> >  }
> >
> > +/**
> > +
> > +  Check and see if "@Redfish.Settings" exist in given Payload. If
> > + found, return
> > the
> > +  payload and URI to pending settings. Caller has to release "SettingPayload"
> > and
> > +  "SettingUri".
> > +
> > +  @param[in]  Payload         Payload that may contain "@Redfish.Settings"
> > +  @param[out] SettingPayload  Payload keeps pending settings.
> > +  @param[out] SettingUri      URI to pending settings.
> > +
> > +  @retval     EFI_SUCCESS     Pending settings is found and returned.
> > +  @retval     Others          Error happens
> > +
> > +**/
> > +EFI_STATUS
> > +GetPendingSettings (
> > +  IN  REDFISH_SERVICE   RedfishService,
> > +  IN  REDFISH_PAYLOAD   Payload,
> > +  OUT REDFISH_RESPONSE  *SettingResponse,
> > +  OUT EFI_STRING        *SettingUri
> > +  )
> > +{
> > +  CONST CHAR8       *RedfishSettingsUriKeys[] = { "@Redfish.Settings",
> > "SettingsObject", "@odata.id" };
> > +  EDKII_JSON_VALUE  JsonValue;
> > +  UINTN             Index;
> > +  EFI_STATUS        Status;
> > +
> > +  if ((RedfishService == NULL) || (Payload == NULL) ||
> > + (SettingResponse ==
> > NULL) || (SettingUri == NULL)) {
> > +    return EFI_INVALID_PARAMETER;
> > +  }
> > +
> > +  *SettingUri = NULL;
> > +  JsonValue   = RedfishJsonInPayload (Payload);
> > +
> > +  //
> > +  // Seeking RedfishSettings URI link.
> > +  //
> > +  for (Index = 0; Index < ARRAY_SIZE (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.
> > +    //
> > +    *SettingUri = JsonValueGetUnicodeString (JsonValue);
> > +    if (*SettingUri == NULL) {
> > +      return EFI_NOT_FOUND;
> > +    }
> > +
> > +    Status = GetResourceByUri (RedfishService, *SettingUri, SettingResponse);
> > +    if (EFI_ERROR (Status)) {
> > +      DEBUG ((DEBUG_ERROR, "%a: @Redfish.Settings exists, get
> > + resource
> > from: %s failed: %r\n", __func__, *SettingUri, Status));
> > +      return Status;
> > +    }
> > +
> > +    return EFI_SUCCESS;
> > +  }
> > +
> > +  return EFI_NOT_FOUND;
> > +}
> > +
> >  /**
> >
> >    Check and see if any difference between two vague value set.
> > --
> > 2.17.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#111797): https://edk2.groups.io/g/devel/message/111797
Mute This Topic: https://groups.io/mt/102767544/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



  reply	other threads:[~2023-11-28  6:44 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-23 14:34 [edk2-devel] [edk2-redfish-client][PATCH 3/6] RedfishClientPkg: feature driver enhancement Nickle Wang via groups.io
2023-11-28  4:04 ` Chang, Abner via groups.io
2023-11-28  6:44   ` Nickle Wang via groups.io [this message]
2023-11-28  7:08     ` Chang, Abner via groups.io

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=MW4PR12MB7031DE86C5149E530F129952D9BCA@MW4PR12MB7031.namprd12.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox