public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Chang, Abner via groups.io" <abner.chang=amd.com@groups.io>
To: Nickle Wang <nicklew@nvidia.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 07:08:33 +0000	[thread overview]
Message-ID: <MN2PR12MB396602F5C3F38708BCA4F397EABCA@MN2PR12MB3966.namprd12.prod.outlook.com> (raw)
In-Reply-To: <MW4PR12MB7031DE86C5149E530F129952D9BCA@MW4PR12MB7031.namprd12.prod.outlook.com>

[AMD Official Use Only - General]

Thanks Nickle, I just created BZ #4608 to track this TODO item.

For this patch,
Reviewed-by: Abner Chang <abner.chang@amd.com>

> -----Original Message-----
> From: Nickle Wang <nicklew@nvidia.com>
> Sent: Tuesday, November 28, 2023 2:44 PM
> To: Chang, Abner <Abner.Chang@amd.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.
>
> [AMD Official Use Only - General]
>
> Caution: This message originated from an External Source. Use proper caution
> when opening attachments, clicking links, or responding.
>
>
> 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 (#111798): https://edk2.groups.io/g/devel/message/111798
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  7:08 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
2023-11-28  7:08     ` Chang, Abner via groups.io [this message]

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=MN2PR12MB396602F5C3F38708BCA4F397EABCA@MN2PR12MB3966.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