* [RestJsonStructureDxe PATCH v3 0/3] EFI REST JSON Structure Protocol @ 2020-10-15 15:33 Abner Chang 2020-10-15 15:33 ` [RestJsonStructureDxe PATCH v3 1/3] MdePkg/Include: Definitions of " Abner Chang ` (2 more replies) 0 siblings, 3 replies; 7+ messages in thread From: Abner Chang @ 2020-10-15 15:33 UTC (permalink / raw) To: devel Cc: Michael D Kinney, Liming Gao, Zhiguang Liu, Jiaxin Wu, Siyuan Fu, Fan Wang, Jiewen Yao, Nickle Wang This is the implementation of EFI_REST_JSON_STRUCTURE_PROTOCOL, refer to UEFI spec 2.8 Section 29.7.3 EFI REST JSON Resource to C Structure Converter. In v3: Fix CI test errors, - Add RedfishPkg dependence in RedfishPkg.i.yaml. - Add ARM instrinsic libraries to RedfishPkg.dsc for ARM/AARCH64. In v2: - Couple feedbacks given by Liming on patch 1/2 were addressed. - Cosmetics on the source code in patch 2/2. Signed-off-by: Abner Chang <abner.chang@hpe.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Zhiguang Liu <zhiguang.liu@intel.com> Cc: Jiaxin Wu <jiaxin.wu@intel.com> Cc: Siyuan Fu <siyuan.fu@intel.com> Cc: Fan Wang <fan.wang@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Nickle Wang <nickle.wang@hpe.com> Abner Chang (3): MdePkg/Include: Definitions of EFI REST JSON Structure Protocol RedfishPkg/RestJsonStructureDxe: EFI REST JSON Structure Protocol RedfishPkg: Changes on RedfishPkg for CI test MdePkg/Include/Protocol/RestJsonStructure.h | 161 +++++ MdePkg/MdePkg.dec | 3 + RedfishPkg/RedfishPkg.ci.yaml | 3 +- RedfishPkg/RedfishPkg.dsc | 11 + .../RestJsonStructureDxe.c | 585 ++++++++++++++++++ .../RestJsonStructureDxe.inf | 40 ++ .../RestJsonStructureInternal.h | 33 + 7 files changed, 835 insertions(+), 1 deletion(-) create mode 100644 MdePkg/Include/Protocol/RestJsonStructure.h create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h -- 2.17.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [RestJsonStructureDxe PATCH v3 1/3] MdePkg/Include: Definitions of EFI REST JSON Structure Protocol 2020-10-15 15:33 [RestJsonStructureDxe PATCH v3 0/3] EFI REST JSON Structure Protocol Abner Chang @ 2020-10-15 15:33 ` Abner Chang 2020-10-15 15:33 ` [RestJsonStructureDxe PATCH v3 2/3] RedfishPkg/RestJsonStructureDxe: " Abner Chang 2020-10-15 15:33 ` [RestJsonStructureDxe PATCH v3 3/3] RedfishPkg: Changes on RedfishPkg for CI test Abner Chang 2 siblings, 0 replies; 7+ messages in thread From: Abner Chang @ 2020-10-15 15:33 UTC (permalink / raw) To: devel Cc: Michael D Kinney, Liming Gao, Zhiguang Liu, Jiaxin Wu, Siyuan Fu, Fan Wang, Jiewen Yao, Nickle Wang Add definitions of EFI REST JSON Structure according to UEFI spec 2.8 Section 29.7.3 EFI REST JSON Resource to C Structure Converter. Signed-off-by: Abner Chang <abner.chang@hpe.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Zhiguang Liu <zhiguang.liu@intel.com> Cc: Jiaxin Wu <jiaxin.wu@intel.com> Cc: Siyuan Fu <siyuan.fu@intel.com> Cc: Fan Wang <fan.wang@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Nickle Wang <nickle.wang@hpe.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn> --- MdePkg/Include/Protocol/RestJsonStructure.h | 161 ++++++++++++++++++++ MdePkg/MdePkg.dec | 3 + 2 files changed, 164 insertions(+) create mode 100644 MdePkg/Include/Protocol/RestJsonStructure.h diff --git a/MdePkg/Include/Protocol/RestJsonStructure.h b/MdePkg/Include/Protocol/RestJsonStructure.h new file mode 100644 index 0000000000..adaf148f71 --- /dev/null +++ b/MdePkg/Include/Protocol/RestJsonStructure.h @@ -0,0 +1,161 @@ +/** @file + This file defines the EFI REST JSON Structure Protocol interface. + + (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Revision Reference: + This Protocol is introduced in UEFI Specification 2.8 + +**/ + +#ifndef EFI_REST_JSON_STRUCTURE_PROTOCOL_H_ +#define EFI_REST_JSON_STRUCTURE_PROTOCOL_H_ + +/// +/// GUID definitions +/// +#define EFI_REST_JSON_STRUCTURE_PROTOCOL_GUID \ + { \ + 0xa9a048f6, 0x48a0, 0x4714, {0xb7, 0xda, 0xa9, 0xad,0x87, 0xd4, 0xda, 0xc9 } \ + } + +typedef struct _EFI_REST_JSON_STRUCTURE_PROTOCOL EFI_REST_JSON_STRUCTURE_PROTOCOL; +typedef CHAR8 * EFI_REST_JSON_RESOURCE_TYPE_DATATYPE; + +/// +/// Structure defintions of resource name space. +/// +/// The fields declared in this structure define the +/// name and revision of payload delievered throught +/// REST API. +/// +typedef struct _EFI_REST_JSON_RESOURCE_TYPE_NAMESPACE { + CHAR8 *ResourceTypeName; ///< Resource type name + CHAR8 *MajorVersion; ///< Resource major version + CHAR8 *MinorVersion; ///< Resource minor version + CHAR8 *ErrataVersion; ///< Resource errata version +} EFI_REST_JSON_RESOURCE_TYPE_NAMESPACE; + +/// +/// REST resource type identifier +/// +/// REST resource type consists of name space and data type. +/// +typedef struct _EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER { + EFI_REST_JSON_RESOURCE_TYPE_NAMESPACE NameSpace; ///< Namespace of this resource type. + EFI_REST_JSON_RESOURCE_TYPE_DATATYPE DataType; ///< Name of data type declared in this + ///< resource type. +} EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER; + +/// +/// List of JSON to C structure conversions which this convertor supports. +/// +typedef struct _EFI_REST_JSON_STRUCTURE_SUPPORTED { + LIST_ENTRY NextSupportedRsrcInterp; ///< Linklist to next supported conversion. + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER RestResourceInterp; ///< JSON resource type this convertor supports. +} EFI_REST_JSON_STRUCTURE_SUPPORTED; + +/// +/// The header file of JSON C structure +/// +typedef struct _EFI_REST_JSON_STRUCTURE_HEADER { + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER JsonRsrcIdentifier; ///< Resource identifier which use to + ///< choice the proper interpreter. + ///< Follow by a pointer points to JSON structure, the content in the + ///< JSON structure is implementation-specific according to converter producer. + VOID *JsonStructurePointer; +} EFI_REST_JSON_STRUCTURE_HEADER; + +/** + JSON-IN C Structure-OUT function. Convert the given REST JSON resource into structure. + + @param[in] This This is the EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] JsonRsrcIdentifier This indicates the resource type and version is given in + ResourceJsonText. + @param[in] ResourceJsonText REST JSON resource in text format. + @param[out] JsonStructure Pointer to receive the pointer to EFI_REST_JSON_STRUCTURE_HEADER + + @retval EFI_SUCCESS + @retval Others +--*/ +typedef +EFI_STATUS +(EFIAPI *EFI_REST_JSON_STRUCTURE_TO_STRUCTURE)( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *JsonRsrcIdentifier OPTIONAL, + IN CHAR8 *ResourceJsonText, + OUT EFI_REST_JSON_STRUCTURE_HEADER **JsonStructure +); + +/** + Convert the given REST JSON structure into JSON text. + + @param[in] This This is the EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] JsonStructureHeader The point to EFI_REST_JSON_STRUCTURE_HEADER structure. + @param[out] ResourceJsonText Pointer to receive REST JSON resource in text format. + + @retval EFI_SUCCESS + @retval Others + +--*/ +typedef +EFI_STATUS +(EFIAPI *EFI_REST_JSON_STRUCTURE_TO_JSON)( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN EFI_REST_JSON_STRUCTURE_HEADER *JsonStructureHeader, + OUT CHAR8 **ResourceJsonText +); + +/** + This function destroys the REST JSON structure. + + @param[in] This This is the EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] JsonStructureHeader JSON structure to destroy. + + @retval EFI_SUCCESS + @retval Others + +--*/ +typedef +EFI_STATUS +(EFIAPI *EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE)( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN EFI_REST_JSON_STRUCTURE_HEADER *JsonStructureHeader +); +/** + This function provides REST JSON resource to structure converter registration. + + @param[in] This This is the EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] JsonStructureSupported The type and version of REST JSON resource which this converter + supports. + @param[in] ToStructure The function to convert REST JSON resource to structure. + @param[in] ToJson The function to convert REST JSON structure to JSON in text format. + @param[out] DestroyStructure Destroy REST JSON structure returned in ToStructure() function. + + @retval EFI_SUCCESS Register successfully. + @retval Others Fail to register. + +--*/ +typedef +EFI_STATUS +(EFIAPI *EFI_REST_JSON_STRUCTURE_REGISTER)( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN EFI_REST_JSON_STRUCTURE_SUPPORTED *JsonStructureSupported, + IN EFI_REST_JSON_STRUCTURE_TO_STRUCTURE ToStructure, + IN EFI_REST_JSON_STRUCTURE_TO_JSON ToJson, + IN EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE DestroyStructure +); + +/// +/// EFI REST JSON to C structure protocol definition. +/// +struct _EFI_REST_JSON_STRUCTURE_PROTOCOL { + EFI_REST_JSON_STRUCTURE_REGISTER Register; ///< Register JSON to C structure convertor + EFI_REST_JSON_STRUCTURE_TO_STRUCTURE ToStructure; ///< The function to convert JSON to C structure + EFI_REST_JSON_STRUCTURE_TO_JSON ToJson; ///< The function to convert C structure to JSON + EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE DestoryStructure; ///< Destory C structure. +}; + +#endif diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index 5205374d62..645f61b80e 100644 --- a/MdePkg/MdePkg.dec +++ b/MdePkg/MdePkg.dec @@ -1855,6 +1855,9 @@ gEfiRestExProtocolGuid = { 0x55648b91, 0xe7d, 0x40a3, { 0xa9, 0xb3, 0xa8, 0x15, 0xd7, 0xea, 0xdf, 0x97 }} gEfiRestExServiceBindingProtocolGuid = { 0x456bbe01, 0x99d0, 0x45ea, { 0xbb, 0x5f, 0x16, 0xd8, 0x4b, 0xed, 0xc5, 0x59 }} + ## Include/Protocol/RestJsonStructure.h + gEfiRestJsonStructureProtocolGuid = { 0xa9a048f6, 0x48a0, 0x4714, {0xb7, 0xda, 0xa9, 0xad,0x87, 0xd4, 0xda, 0xc9 }} + # # Protocols defined in Shell2.0 # -- 2.17.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [RestJsonStructureDxe PATCH v3 2/3] RedfishPkg/RestJsonStructureDxe: EFI REST JSON Structure Protocol 2020-10-15 15:33 [RestJsonStructureDxe PATCH v3 0/3] EFI REST JSON Structure Protocol Abner Chang 2020-10-15 15:33 ` [RestJsonStructureDxe PATCH v3 1/3] MdePkg/Include: Definitions of " Abner Chang @ 2020-10-15 15:33 ` Abner Chang 2020-10-15 15:33 ` [RestJsonStructureDxe PATCH v3 3/3] RedfishPkg: Changes on RedfishPkg for CI test Abner Chang 2 siblings, 0 replies; 7+ messages in thread From: Abner Chang @ 2020-10-15 15:33 UTC (permalink / raw) To: devel; +Cc: Jiaxin Wu, Siyuan Fu, Fan Wang, Jiewen Yao, Nickle Wang Implementation of EFI_REST_JSON_STRUCTURE_PROTOCOL, refer to UEFI spec 2.8 Section 29.7.3 EFI REST JSON Resource to C Structure Converter. Signed-off-by: Abner Chang <abner.chang@hpe.com> Cc: Jiaxin Wu <jiaxin.wu@intel.com> Cc: Siyuan Fu <siyuan.fu@intel.com> Cc: Fan Wang <fan.wang@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Nickle Wang <nickle.wang@hpe.com> --- RedfishPkg/RedfishPkg.dsc | 11 + .../RestJsonStructureDxe.c | 585 ++++++++++++++++++ .../RestJsonStructureDxe.inf | 40 ++ .../RestJsonStructureInternal.h | 33 + 4 files changed, 669 insertions(+) create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h diff --git a/RedfishPkg/RedfishPkg.dsc b/RedfishPkg/RedfishPkg.dsc index 8acadddefc..f0c6740fac 100644 --- a/RedfishPkg/RedfishPkg.dsc +++ b/RedfishPkg/RedfishPkg.dsc @@ -38,3 +38,14 @@ DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf + +[LibraryClasses.ARM, LibraryClasses.AARCH64] + # + # This library provides the instrinsic functions generated by a given compiler. + # + NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf + NULL|MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf + ArmSoftFloatLib|ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.inf + +[Components] + RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c new file mode 100644 index 0000000000..03fbecf993 --- /dev/null +++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c @@ -0,0 +1,585 @@ +/** @file + + The implementation of EFI REST Resource JSON to C structure convertor + Protocol. + + (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Protocol/RestJsonStructure.h> +#include "RestJsonStructureInternal.h" + +LIST_ENTRY mRestJsonStructureList; +EFI_HANDLE mProtocolHandle; + +/** + This function registers Restful resource interpreter for the + specific schema. + + @param[in] This This is the EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] JsonStructureSupported The type and version of REST JSON resource which this converter + supports. + @param[in] ToStructure The function to convert REST JSON resource to structure. + @param[in] ToJson The function to convert REST JSON structure to JSON in text format. + @param[in] DestroyStructure Destroy REST JSON structure returned in ToStructure() function. + + @retval EFI_SUCCESS Register successfully. + @retval Others Fail to register. + +**/ +EFI_STATUS +EFIAPI +RestJsonStructureRegister ( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN EFI_REST_JSON_STRUCTURE_SUPPORTED *JsonStructureSupported, + IN EFI_REST_JSON_STRUCTURE_TO_STRUCTURE ToStructure, + IN EFI_REST_JSON_STRUCTURE_TO_JSON ToJson, + IN EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE DestroyStructure +) +{ + UINTN NumberOfNS; + UINTN Index; + LIST_ENTRY *ThisList; + REST_JSON_STRUCTURE_INSTANCE *Instance; + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *CloneSupportedInterpId; + EFI_REST_JSON_STRUCTURE_SUPPORTED *ThisSupportedInterp; + + if (This == NULL || + ToStructure == NULL || + ToJson == NULL || + DestroyStructure == NULL || + JsonStructureSupported == NULL + ) { + return EFI_INVALID_PARAMETER; + } + + // + // Check how many name space interpreter can interpret. + // + ThisList = &JsonStructureSupported->NextSupportedRsrcInterp; + NumberOfNS = 1; + while (TRUE) { + if (ThisList->ForwardLink == &JsonStructureSupported->NextSupportedRsrcInterp) { + break; + } else { + ThisList = ThisList->ForwardLink; + NumberOfNS ++; + } + }; + + Instance = + (REST_JSON_STRUCTURE_INSTANCE *)AllocateZeroPool (sizeof (REST_JSON_STRUCTURE_INSTANCE) + NumberOfNS * sizeof (EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER)); + if (Instance == NULL) { + return EFI_OUT_OF_RESOURCES; + } + InitializeListHead (&Instance->NextRestJsonStructureInstance); + Instance->NumberOfNameSpaceToConvert = NumberOfNS; + Instance->SupportedRsrcIndentifier = (EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *)((REST_JSON_STRUCTURE_INSTANCE *)Instance + 1); + // + // Copy supported resource identifer interpreter. + // + CloneSupportedInterpId = Instance->SupportedRsrcIndentifier; + ThisSupportedInterp = JsonStructureSupported; + for (Index = 0; Index < NumberOfNS; Index ++) { + CopyMem ((VOID *)CloneSupportedInterpId, (VOID *)&ThisSupportedInterp->RestResourceInterp, sizeof (EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER)); + ThisSupportedInterp = (EFI_REST_JSON_STRUCTURE_SUPPORTED *)ThisSupportedInterp->NextSupportedRsrcInterp.ForwardLink; + CloneSupportedInterpId ++; + } + Instance->JsonToStructure = ToStructure; + Instance->StructureToJson = ToJson; + Instance->DestroyStructure = DestroyStructure; + InsertTailList (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); + return EFI_SUCCESS; +} + +/** + This function check if this interpreter instance support the given namesapce. + + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] InterpreterInstance REST_JSON_STRUCTURE_INSTANCE + @param[in] RsrcTypeIdentifier Resource type identifier. + @param[in] ResourceRaw Given Restful resource. + @param[out] RestJSonHeader Property interpreted from given ResourceRaw. + + @retval EFI_SUCCESS + @retval Others. + +**/ +EFI_STATUS +InterpreterInstanceToStruct ( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN REST_JSON_STRUCTURE_INSTANCE *InterpreterInstance, + IN EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *RsrcTypeIdentifier OPTIONAL, + IN CHAR8 *ResourceRaw, + OUT EFI_REST_JSON_STRUCTURE_HEADER **RestJSonHeader + ) +{ + UINTN Index; + EFI_STATUS Status; + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *ThisSupportedRsrcTypeId; + + if (This == NULL || + InterpreterInstance == NULL || + ResourceRaw == NULL || + RestJSonHeader == NULL + ) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_UNSUPPORTED; + if (RsrcTypeIdentifier == NULL) { + // + // No resource type identifier, send to intepreter anyway. + // Interpreter may recognize this resource. + // + Status = InterpreterInstance->JsonToStructure ( + This, + NULL, + ResourceRaw, + RestJSonHeader + ); + } else { + // + // Check if the namesapce and version is supported by this interpreter. + // + ThisSupportedRsrcTypeId = InterpreterInstance->SupportedRsrcIndentifier; + for (Index = 0; Index < InterpreterInstance->NumberOfNameSpaceToConvert; Index ++){ + if (AsciiStrCmp ( + RsrcTypeIdentifier->NameSpace.ResourceTypeName, + ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0){ + if ((RsrcTypeIdentifier->NameSpace.MajorVersion == NULL) && + (RsrcTypeIdentifier->NameSpace.MinorVersion == NULL) && + (RsrcTypeIdentifier->NameSpace.ErrataVersion == NULL) + ) { + // + // Don't check version of this resource type identifier. + // + Status = InterpreterInstance->JsonToStructure ( + This, + RsrcTypeIdentifier, + ResourceRaw, + RestJSonHeader + ); + break; + } else { + // + // Check version. + // + if ((AsciiStrCmp ( + RsrcTypeIdentifier->NameSpace.MajorVersion, + ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) && + (AsciiStrCmp ( + RsrcTypeIdentifier->NameSpace.MinorVersion, + ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) && + (AsciiStrCmp ( + RsrcTypeIdentifier->NameSpace.ErrataVersion, + ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) { + Status = InterpreterInstance->JsonToStructure ( + This, + RsrcTypeIdentifier, + ResourceRaw, + RestJSonHeader + ); + break; + } + } + } + ThisSupportedRsrcTypeId ++; + } + } + return Status; +} +/** + This function converts JSON C structure to JSON property. + + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] InterpreterInstance REST_JSON_STRUCTURE_INSTANCE + @param[in] RestJSonHeader Resource type identifier. + @param[out] ResourceRaw Output in JSON text format. + + @retval EFI_SUCCESS + @retval Others. + +**/ +EFI_STATUS +InterpreterEfiStructToInstance ( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN REST_JSON_STRUCTURE_INSTANCE *InterpreterInstance, + IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader, + OUT CHAR8 **ResourceRaw +) +{ + UINTN Index; + EFI_STATUS Status; + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *ThisSupportedRsrcTypeId; + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *RsrcTypeIdentifier; + + if (This == NULL || + InterpreterInstance == NULL || + RestJSonHeader == NULL || + ResourceRaw == NULL + ) { + return EFI_INVALID_PARAMETER; + } + RsrcTypeIdentifier = &RestJSonHeader->JsonRsrcIdentifier; + if (RsrcTypeIdentifier == NULL || + RsrcTypeIdentifier->NameSpace.ResourceTypeName == NULL || + RsrcTypeIdentifier->NameSpace.MajorVersion == NULL || + RsrcTypeIdentifier->NameSpace.MinorVersion == NULL || + RsrcTypeIdentifier->NameSpace.ErrataVersion == NULL + ) { + return EFI_INVALID_PARAMETER; + } + + // + // Check if the namesapce and version is supported by this interpreter. + // + Status = EFI_UNSUPPORTED; + ThisSupportedRsrcTypeId = InterpreterInstance->SupportedRsrcIndentifier; + for (Index = 0; Index < InterpreterInstance->NumberOfNameSpaceToConvert; Index ++){ + if (AsciiStrCmp ( + RsrcTypeIdentifier->NameSpace.ResourceTypeName, + ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0){ + // + // Check version. + // + if ((AsciiStrCmp ( + RsrcTypeIdentifier->NameSpace.MajorVersion, + ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) && + (AsciiStrCmp ( + RsrcTypeIdentifier->NameSpace.MinorVersion, + ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) && + (AsciiStrCmp ( + RsrcTypeIdentifier->NameSpace.ErrataVersion, + ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) { + Status = InterpreterInstance->StructureToJson ( + This, + RestJSonHeader, + ResourceRaw + ); + break; + } + } + ThisSupportedRsrcTypeId ++; + } + return Status; +} + +/** + This function destory REST property structure. + + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] InterpreterInstance REST_JSON_STRUCTURE_INSTANCE + @param[in] RestJSonHeader Property interpreted from given ResourceRaw. + + @retval EFI_SUCCESS + @retval Others. + +**/ +EFI_STATUS +InterpreterInstanceDestoryJsonStruct ( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN REST_JSON_STRUCTURE_INSTANCE *InterpreterInstance, + IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader + ) +{ + UINTN Index; + EFI_STATUS Status; + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *ThisSupportedRsrcTypeId; + + if (This == NULL || + InterpreterInstance == NULL || + RestJSonHeader == NULL + ) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_UNSUPPORTED; + // + // Check if the namesapce and version is supported by this interpreter. + // + ThisSupportedRsrcTypeId = InterpreterInstance->SupportedRsrcIndentifier; + for (Index = 0; Index < InterpreterInstance->NumberOfNameSpaceToConvert; Index ++){ + if (AsciiStrCmp ( + RestJSonHeader->JsonRsrcIdentifier.NameSpace.ResourceTypeName, + ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0) { + if ((RestJSonHeader->JsonRsrcIdentifier.NameSpace.MajorVersion == NULL) && + (RestJSonHeader->JsonRsrcIdentifier.NameSpace.MinorVersion == NULL) && + (RestJSonHeader->JsonRsrcIdentifier.NameSpace.ErrataVersion == NULL) + ) { + // + // Don't check version of this resource type identifier. + // + Status = InterpreterInstance->DestroyStructure ( + This, + RestJSonHeader + ); + break; + } else { + // + // Check version. + // + if ((AsciiStrCmp ( + RestJSonHeader->JsonRsrcIdentifier.NameSpace.MajorVersion, + ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) && + (AsciiStrCmp ( + RestJSonHeader->JsonRsrcIdentifier.NameSpace.MinorVersion, + ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) && + (AsciiStrCmp ( + RestJSonHeader->JsonRsrcIdentifier.NameSpace.ErrataVersion, + ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) { + Status = InterpreterInstance->DestroyStructure ( + This, + RestJSonHeader + ); + break; + } + } + } + ThisSupportedRsrcTypeId ++; + } + return Status; +} + +/** + This function translates the given JSON text to JSON C Structure. + + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] RsrcTypeIdentifier Resource type identifier. + @param[in] ResourceJsonText Given Restful resource. + @param[out] JsonStructure Property interpreted from given ResourceRaw. + + @retval EFI_SUCCESS + @retval Others. + +**/ +EFI_STATUS +EFIAPI +RestJsonStructureToStruct ( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *RsrcTypeIdentifier OPTIONAL, + IN CHAR8 *ResourceJsonText, + OUT EFI_REST_JSON_STRUCTURE_HEADER **JsonStructure +) +{ + EFI_STATUS Status; + REST_JSON_STRUCTURE_INSTANCE *Instance; + + if (This == NULL || + ResourceJsonText == NULL || + JsonStructure == NULL + ) { + return EFI_INVALID_PARAMETER; + } + + if (IsListEmpty (&mRestJsonStructureList)) { + return EFI_UNSUPPORTED; + } + Status = EFI_SUCCESS; + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode (&mRestJsonStructureList); + while (TRUE) { + Status = InterpreterInstanceToStruct ( + This, + Instance, + RsrcTypeIdentifier, + ResourceJsonText, + JsonStructure + ); + if (!EFI_ERROR (Status)) { + break; + } + if (IsNodeAtEnd(&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance)) { + Status = EFI_UNSUPPORTED; + break; + } + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); + }; + return Status; +} + +/** + This function destory REST property EFI structure which returned in + JsonToStructure(). + + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] RestJSonHeader Property to destory. + + @retval EFI_SUCCESS + @retval Others + +**/ +EFI_STATUS +EFIAPI +RestJsonStructureDestroyStruct ( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader +) +{ + EFI_STATUS Status; + REST_JSON_STRUCTURE_INSTANCE *Instance; + + if (This == NULL || RestJSonHeader == NULL) { + return EFI_INVALID_PARAMETER; + } + + if (IsListEmpty (&mRestJsonStructureList)) { + return EFI_UNSUPPORTED; + } + Status = EFI_SUCCESS; + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode (&mRestJsonStructureList); + while (TRUE) { + Status = InterpreterInstanceDestoryJsonStruct ( + This, + Instance, + RestJSonHeader + ); + if (!EFI_ERROR (Status)) { + break; + } + if (IsNodeAtEnd(&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance)) { + Status = EFI_UNSUPPORTED; + break; + } + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); + }; + return Status; +} + +/** + This function translates the given JSON C Structure to JSON text. + + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] RestJSonHeader Given Restful resource. + @param[out] ResourceRaw Resource in RESTfuls service oriented. + + @retval EFI_SUCCESS + @retval Others Fail to remove the entry + +**/ +EFI_STATUS +EFIAPI +RestJsonStructureToJson ( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader, + OUT CHAR8 **ResourceRaw +) +{ + EFI_STATUS Status; + REST_JSON_STRUCTURE_INSTANCE *Instance; + + if (This == NULL || RestJSonHeader == NULL || ResourceRaw == NULL) { + return EFI_INVALID_PARAMETER; + } + + if (IsListEmpty (&mRestJsonStructureList)) { + return EFI_UNSUPPORTED; + } + Status = EFI_SUCCESS; + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode (&mRestJsonStructureList); + while (TRUE) { + Status = InterpreterEfiStructToInstance ( + This, + Instance, + RestJSonHeader, + ResourceRaw + ); + if (!EFI_ERROR (Status)) { + break; + } + if (IsNodeAtEnd(&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance)) { + Status = EFI_UNSUPPORTED; + break; + } + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); + }; + return Status; +} + +EFI_REST_JSON_STRUCTURE_PROTOCOL mRestJsonStructureProtocol = { + RestJsonStructureRegister, + RestJsonStructureToStruct, + RestJsonStructureToJson, + RestJsonStructureDestroyStruct +}; + +/** + This is the declaration of an EFI image entry point. + + @param ImageHandle The firmware allocated handle for the UEFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The operation completed successfully. + @retval Others An unexpected error occurred. +**/ +EFI_STATUS +EFIAPI +RestJsonStructureEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + InitializeListHead (&mRestJsonStructureList); + // + // Install the Restful Resource Interpreter Protocol. + // + mProtocolHandle = NULL; + Status = gBS->InstallProtocolInterface ( + &mProtocolHandle, + &gEfiRestJsonStructureProtocolGuid, + EFI_NATIVE_INTERFACE, + (VOID *)&mRestJsonStructureProtocol + ); + return Status; +} + +/** + This is the unload handle for Redfish discover module. + + Disconnect the driver specified by ImageHandle from all the devices in the handle database. + Uninstall all the protocols installed in the driver entry point. + + @param[in] ImageHandle The drivers' driver image. + + @retval EFI_SUCCESS The image is unloaded. + @retval Others Failed to unload the image. + +**/ +EFI_STATUS +EFIAPI +RestJsonStructureUnload ( + IN EFI_HANDLE ImageHandle + ) +{ + EFI_STATUS Status; + REST_JSON_STRUCTURE_INSTANCE *Instance; + REST_JSON_STRUCTURE_INSTANCE *NextInstance; + + if (IsListEmpty (&mRestJsonStructureList)) { + return EFI_SUCCESS; + } + // + // Free memory of REST_JSON_STRUCTURE_INSTANCE instance. + // + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode (&mRestJsonStructureList); + do { + NextInstance = NULL; + if (!IsNodeAtEnd(&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance)) { + NextInstance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); + } + FreePool ((VOID *)Instance); + Instance = NextInstance; + } while (Instance != NULL); + + Status = gBS->UninstallProtocolInterface ( + mProtocolHandle, + &gEfiRestJsonStructureProtocolGuid, + (VOID *)&mRestJsonStructureProtocol + ); + return Status; +} diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf new file mode 100644 index 0000000000..2ab1e3bc45 --- /dev/null +++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf @@ -0,0 +1,40 @@ +## @file +# Implementation of EFI REST JSON Structure Protocol. +# +# (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = RestJsonStructureDxe + FILE_GUID = 83FAAFBF-FC4B-469F-892A-798E66A6F50A + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = RestJsonStructureEntryPoint + UNLOAD_IMAGE = RestJsonStructureUnload + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + RedfishPkg/RedfishPkg.dec + +[Sources] + RestJsonStructureDxe.c + RestJsonStructureInternal.h + +[LibraryClasses] + BaseLib + BaseMemoryLib + MemoryAllocationLib + UefiBootServicesTableLib + UefiDriverEntryPoint + UefiLib + +[Protocols] + gEfiRestJsonStructureProtocolGuid ## Producing + +[Depex] + TRUE + diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h new file mode 100644 index 0000000000..e8a3408404 --- /dev/null +++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h @@ -0,0 +1,33 @@ +/** @file + The internal definitions of EFI REST Resource JSON to C structure convertor + Protocol. + + (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef EFI_REST_JSON_STRUCTURE_INTERNAL_H_ +#define EFI_REST_JSON_STRUCTURE_INTERNAL_H_ + +#include <Library/BaseLib.h> +#include <Library/UefiLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiDriverEntryPoint.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> + +/// +/// Internal structure to maintain the information of JSON to +/// C structure convertor. +/// +typedef struct _REST_JSON_STRUCTURE_INSTANCE { + LIST_ENTRY NextRestJsonStructureInstance; ///< Next convertor instance + UINTN NumberOfNameSpaceToConvert; ///< Number of resource type this convertor supports. + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *SupportedRsrcIndentifier; ///< The resource type linklist + EFI_REST_JSON_STRUCTURE_TO_STRUCTURE JsonToStructure; ///< JSON to C structure function + EFI_REST_JSON_STRUCTURE_TO_JSON StructureToJson; ///< C structure to JSON function + EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE DestroyStructure; ///< Destory C struture function. +} REST_JSON_STRUCTURE_INSTANCE; +#endif -- 2.17.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [RestJsonStructureDxe PATCH v3 3/3] RedfishPkg: Changes on RedfishPkg for CI test 2020-10-15 15:33 [RestJsonStructureDxe PATCH v3 0/3] EFI REST JSON Structure Protocol Abner Chang 2020-10-15 15:33 ` [RestJsonStructureDxe PATCH v3 1/3] MdePkg/Include: Definitions of " Abner Chang 2020-10-15 15:33 ` [RestJsonStructureDxe PATCH v3 2/3] RedfishPkg/RestJsonStructureDxe: " Abner Chang @ 2020-10-15 15:33 ` Abner Chang 2 siblings, 0 replies; 7+ messages in thread From: Abner Chang @ 2020-10-15 15:33 UTC (permalink / raw) To: devel; +Cc: Jiaxin Wu, Siyuan Fu, Fan Wang, Jiewen Yao, Nickle Wang - Add accepted dependency of RedfishPkg in RedfishPkg CI yaml file. - Add NO-TARGET in RedfishPkg.dsc for CI test. Signed-off-by: Abner Chang <abner.chang@hpe.com> Cc: Jiaxin Wu <jiaxin.wu@intel.com> Cc: Siyuan Fu <siyuan.fu@intel.com> Cc: Fan Wang <fan.wang@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Nickle Wang <nickle.wang@hpe.com> --- RedfishPkg/RedfishPkg.ci.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/RedfishPkg/RedfishPkg.ci.yaml b/RedfishPkg/RedfishPkg.ci.yaml index 75c3b6a8ad..bb3b8b6746 100644 --- a/RedfishPkg/RedfishPkg.ci.yaml +++ b/RedfishPkg/RedfishPkg.ci.yaml @@ -29,7 +29,8 @@ "AcceptableDependencies": [ "MdePkg/MdePkg.dec", "MdeModulePkg/MdeModulePkg.dec", - "NetworkPkg/NetworkPkg.dec" + "NetworkPkg/NetworkPkg.dec", + "RedfishPkg/RedfishPkg.dec" ], # For host based unit tests "AcceptableDependencies-HOST_APPLICATION":[], -- 2.17.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [RestJsonStructureDxe PATCH v3 0/3] EFI REST JSON Structure Protocol @ 2020-10-15 15:49 Abner Chang 2020-10-15 15:49 ` [RestJsonStructureDxe PATCH v3 2/3] RedfishPkg/RestJsonStructureDxe: " Abner Chang 0 siblings, 1 reply; 7+ messages in thread From: Abner Chang @ 2020-10-15 15:49 UTC (permalink / raw) To: devel Cc: Michael D Kinney, Liming Gao, Zhiguang Liu, Jiaxin Wu, Siyuan Fu, Fan Wang, Jiewen Yao, Nickle Wang This is the implementation of EFI_REST_JSON_STRUCTURE_PROTOCOL, refer to UEFI spec 2.8 Section 29.7.3 EFI REST JSON Resource to C Structure Converter. In v3: Fix CI test errors, - Add RedfishPkg dependence in RedfishPkg.i.yaml. - Add ARM instrinsic libraries to RedfishPkg.dsc for ARM/AARCH64. In v2: - Couple feedbacks given by Liming on patch 1/2 were addressed. - Cosmetics on the source code in patch 2/2. Signed-off-by: Abner Chang <abner.chang@hpe.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Zhiguang Liu <zhiguang.liu@intel.com> Cc: Jiaxin Wu <jiaxin.wu@intel.com> Cc: Siyuan Fu <siyuan.fu@intel.com> Cc: Fan Wang <fan.wang@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Nickle Wang <nickle.wang@hpe.com> Abner Chang (3): MdePkg/Include: Definitions of EFI REST JSON Structure Protocol RedfishPkg/RestJsonStructureDxe: EFI REST JSON Structure Protocol RedfishPkg: Changes on RedfishPkg for CI test MdePkg/Include/Protocol/RestJsonStructure.h | 161 +++++ MdePkg/MdePkg.dec | 3 + RedfishPkg/RedfishPkg.ci.yaml | 3 +- RedfishPkg/RedfishPkg.dsc | 11 + .../RestJsonStructureDxe.c | 585 ++++++++++++++++++ .../RestJsonStructureDxe.inf | 40 ++ .../RestJsonStructureInternal.h | 33 + 7 files changed, 835 insertions(+), 1 deletion(-) create mode 100644 MdePkg/Include/Protocol/RestJsonStructure.h create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h -- 2.17.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [RestJsonStructureDxe PATCH v3 2/3] RedfishPkg/RestJsonStructureDxe: EFI REST JSON Structure Protocol 2020-10-15 15:49 [RestJsonStructureDxe PATCH v3 0/3] EFI REST JSON Structure Protocol Abner Chang @ 2020-10-15 15:49 ` Abner Chang 2020-10-29 6:57 ` Nickle Wang 0 siblings, 1 reply; 7+ messages in thread From: Abner Chang @ 2020-10-15 15:49 UTC (permalink / raw) To: devel; +Cc: Jiaxin Wu, Siyuan Fu, Fan Wang, Jiewen Yao, Nickle Wang Implementation of EFI_REST_JSON_STRUCTURE_PROTOCOL, refer to UEFI spec 2.8 Section 29.7.3 EFI REST JSON Resource to C Structure Converter. Signed-off-by: Abner Chang <abner.chang@hpe.com> Cc: Jiaxin Wu <jiaxin.wu@intel.com> Cc: Siyuan Fu <siyuan.fu@intel.com> Cc: Fan Wang <fan.wang@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Nickle Wang <nickle.wang@hpe.com> --- RedfishPkg/RedfishPkg.dsc | 11 + .../RestJsonStructureDxe.c | 585 ++++++++++++++++++ .../RestJsonStructureDxe.inf | 40 ++ .../RestJsonStructureInternal.h | 33 + 4 files changed, 669 insertions(+) create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h diff --git a/RedfishPkg/RedfishPkg.dsc b/RedfishPkg/RedfishPkg.dsc index 8acadddefc..f0c6740fac 100644 --- a/RedfishPkg/RedfishPkg.dsc +++ b/RedfishPkg/RedfishPkg.dsc @@ -38,3 +38,14 @@ DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf + +[LibraryClasses.ARM, LibraryClasses.AARCH64] + # + # This library provides the instrinsic functions generated by a given compiler. + # + NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf + NULL|MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf + ArmSoftFloatLib|ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.inf + +[Components] + RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c new file mode 100644 index 0000000000..03fbecf993 --- /dev/null +++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c @@ -0,0 +1,585 @@ +/** @file + + The implementation of EFI REST Resource JSON to C structure convertor + Protocol. + + (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <Uefi.h> +#include <Protocol/RestJsonStructure.h> +#include "RestJsonStructureInternal.h" + +LIST_ENTRY mRestJsonStructureList; +EFI_HANDLE mProtocolHandle; + +/** + This function registers Restful resource interpreter for the + specific schema. + + @param[in] This This is the EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] JsonStructureSupported The type and version of REST JSON resource which this converter + supports. + @param[in] ToStructure The function to convert REST JSON resource to structure. + @param[in] ToJson The function to convert REST JSON structure to JSON in text format. + @param[in] DestroyStructure Destroy REST JSON structure returned in ToStructure() function. + + @retval EFI_SUCCESS Register successfully. + @retval Others Fail to register. + +**/ +EFI_STATUS +EFIAPI +RestJsonStructureRegister ( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN EFI_REST_JSON_STRUCTURE_SUPPORTED *JsonStructureSupported, + IN EFI_REST_JSON_STRUCTURE_TO_STRUCTURE ToStructure, + IN EFI_REST_JSON_STRUCTURE_TO_JSON ToJson, + IN EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE DestroyStructure +) +{ + UINTN NumberOfNS; + UINTN Index; + LIST_ENTRY *ThisList; + REST_JSON_STRUCTURE_INSTANCE *Instance; + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *CloneSupportedInterpId; + EFI_REST_JSON_STRUCTURE_SUPPORTED *ThisSupportedInterp; + + if (This == NULL || + ToStructure == NULL || + ToJson == NULL || + DestroyStructure == NULL || + JsonStructureSupported == NULL + ) { + return EFI_INVALID_PARAMETER; + } + + // + // Check how many name space interpreter can interpret. + // + ThisList = &JsonStructureSupported->NextSupportedRsrcInterp; + NumberOfNS = 1; + while (TRUE) { + if (ThisList->ForwardLink == &JsonStructureSupported->NextSupportedRsrcInterp) { + break; + } else { + ThisList = ThisList->ForwardLink; + NumberOfNS ++; + } + }; + + Instance = + (REST_JSON_STRUCTURE_INSTANCE *)AllocateZeroPool (sizeof (REST_JSON_STRUCTURE_INSTANCE) + NumberOfNS * sizeof (EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER)); + if (Instance == NULL) { + return EFI_OUT_OF_RESOURCES; + } + InitializeListHead (&Instance->NextRestJsonStructureInstance); + Instance->NumberOfNameSpaceToConvert = NumberOfNS; + Instance->SupportedRsrcIndentifier = (EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *)((REST_JSON_STRUCTURE_INSTANCE *)Instance + 1); + // + // Copy supported resource identifer interpreter. + // + CloneSupportedInterpId = Instance->SupportedRsrcIndentifier; + ThisSupportedInterp = JsonStructureSupported; + for (Index = 0; Index < NumberOfNS; Index ++) { + CopyMem ((VOID *)CloneSupportedInterpId, (VOID *)&ThisSupportedInterp->RestResourceInterp, sizeof (EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER)); + ThisSupportedInterp = (EFI_REST_JSON_STRUCTURE_SUPPORTED *)ThisSupportedInterp->NextSupportedRsrcInterp.ForwardLink; + CloneSupportedInterpId ++; + } + Instance->JsonToStructure = ToStructure; + Instance->StructureToJson = ToJson; + Instance->DestroyStructure = DestroyStructure; + InsertTailList (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); + return EFI_SUCCESS; +} + +/** + This function check if this interpreter instance support the given namesapce. + + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] InterpreterInstance REST_JSON_STRUCTURE_INSTANCE + @param[in] RsrcTypeIdentifier Resource type identifier. + @param[in] ResourceRaw Given Restful resource. + @param[out] RestJSonHeader Property interpreted from given ResourceRaw. + + @retval EFI_SUCCESS + @retval Others. + +**/ +EFI_STATUS +InterpreterInstanceToStruct ( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN REST_JSON_STRUCTURE_INSTANCE *InterpreterInstance, + IN EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *RsrcTypeIdentifier OPTIONAL, + IN CHAR8 *ResourceRaw, + OUT EFI_REST_JSON_STRUCTURE_HEADER **RestJSonHeader + ) +{ + UINTN Index; + EFI_STATUS Status; + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *ThisSupportedRsrcTypeId; + + if (This == NULL || + InterpreterInstance == NULL || + ResourceRaw == NULL || + RestJSonHeader == NULL + ) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_UNSUPPORTED; + if (RsrcTypeIdentifier == NULL) { + // + // No resource type identifier, send to intepreter anyway. + // Interpreter may recognize this resource. + // + Status = InterpreterInstance->JsonToStructure ( + This, + NULL, + ResourceRaw, + RestJSonHeader + ); + } else { + // + // Check if the namesapce and version is supported by this interpreter. + // + ThisSupportedRsrcTypeId = InterpreterInstance->SupportedRsrcIndentifier; + for (Index = 0; Index < InterpreterInstance->NumberOfNameSpaceToConvert; Index ++){ + if (AsciiStrCmp ( + RsrcTypeIdentifier->NameSpace.ResourceTypeName, + ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0){ + if ((RsrcTypeIdentifier->NameSpace.MajorVersion == NULL) && + (RsrcTypeIdentifier->NameSpace.MinorVersion == NULL) && + (RsrcTypeIdentifier->NameSpace.ErrataVersion == NULL) + ) { + // + // Don't check version of this resource type identifier. + // + Status = InterpreterInstance->JsonToStructure ( + This, + RsrcTypeIdentifier, + ResourceRaw, + RestJSonHeader + ); + break; + } else { + // + // Check version. + // + if ((AsciiStrCmp ( + RsrcTypeIdentifier->NameSpace.MajorVersion, + ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) && + (AsciiStrCmp ( + RsrcTypeIdentifier->NameSpace.MinorVersion, + ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) && + (AsciiStrCmp ( + RsrcTypeIdentifier->NameSpace.ErrataVersion, + ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) { + Status = InterpreterInstance->JsonToStructure ( + This, + RsrcTypeIdentifier, + ResourceRaw, + RestJSonHeader + ); + break; + } + } + } + ThisSupportedRsrcTypeId ++; + } + } + return Status; +} +/** + This function converts JSON C structure to JSON property. + + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] InterpreterInstance REST_JSON_STRUCTURE_INSTANCE + @param[in] RestJSonHeader Resource type identifier. + @param[out] ResourceRaw Output in JSON text format. + + @retval EFI_SUCCESS + @retval Others. + +**/ +EFI_STATUS +InterpreterEfiStructToInstance ( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN REST_JSON_STRUCTURE_INSTANCE *InterpreterInstance, + IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader, + OUT CHAR8 **ResourceRaw +) +{ + UINTN Index; + EFI_STATUS Status; + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *ThisSupportedRsrcTypeId; + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *RsrcTypeIdentifier; + + if (This == NULL || + InterpreterInstance == NULL || + RestJSonHeader == NULL || + ResourceRaw == NULL + ) { + return EFI_INVALID_PARAMETER; + } + RsrcTypeIdentifier = &RestJSonHeader->JsonRsrcIdentifier; + if (RsrcTypeIdentifier == NULL || + RsrcTypeIdentifier->NameSpace.ResourceTypeName == NULL || + RsrcTypeIdentifier->NameSpace.MajorVersion == NULL || + RsrcTypeIdentifier->NameSpace.MinorVersion == NULL || + RsrcTypeIdentifier->NameSpace.ErrataVersion == NULL + ) { + return EFI_INVALID_PARAMETER; + } + + // + // Check if the namesapce and version is supported by this interpreter. + // + Status = EFI_UNSUPPORTED; + ThisSupportedRsrcTypeId = InterpreterInstance->SupportedRsrcIndentifier; + for (Index = 0; Index < InterpreterInstance->NumberOfNameSpaceToConvert; Index ++){ + if (AsciiStrCmp ( + RsrcTypeIdentifier->NameSpace.ResourceTypeName, + ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0){ + // + // Check version. + // + if ((AsciiStrCmp ( + RsrcTypeIdentifier->NameSpace.MajorVersion, + ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) && + (AsciiStrCmp ( + RsrcTypeIdentifier->NameSpace.MinorVersion, + ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) && + (AsciiStrCmp ( + RsrcTypeIdentifier->NameSpace.ErrataVersion, + ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) { + Status = InterpreterInstance->StructureToJson ( + This, + RestJSonHeader, + ResourceRaw + ); + break; + } + } + ThisSupportedRsrcTypeId ++; + } + return Status; +} + +/** + This function destory REST property structure. + + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] InterpreterInstance REST_JSON_STRUCTURE_INSTANCE + @param[in] RestJSonHeader Property interpreted from given ResourceRaw. + + @retval EFI_SUCCESS + @retval Others. + +**/ +EFI_STATUS +InterpreterInstanceDestoryJsonStruct ( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN REST_JSON_STRUCTURE_INSTANCE *InterpreterInstance, + IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader + ) +{ + UINTN Index; + EFI_STATUS Status; + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *ThisSupportedRsrcTypeId; + + if (This == NULL || + InterpreterInstance == NULL || + RestJSonHeader == NULL + ) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_UNSUPPORTED; + // + // Check if the namesapce and version is supported by this interpreter. + // + ThisSupportedRsrcTypeId = InterpreterInstance->SupportedRsrcIndentifier; + for (Index = 0; Index < InterpreterInstance->NumberOfNameSpaceToConvert; Index ++){ + if (AsciiStrCmp ( + RestJSonHeader->JsonRsrcIdentifier.NameSpace.ResourceTypeName, + ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0) { + if ((RestJSonHeader->JsonRsrcIdentifier.NameSpace.MajorVersion == NULL) && + (RestJSonHeader->JsonRsrcIdentifier.NameSpace.MinorVersion == NULL) && + (RestJSonHeader->JsonRsrcIdentifier.NameSpace.ErrataVersion == NULL) + ) { + // + // Don't check version of this resource type identifier. + // + Status = InterpreterInstance->DestroyStructure ( + This, + RestJSonHeader + ); + break; + } else { + // + // Check version. + // + if ((AsciiStrCmp ( + RestJSonHeader->JsonRsrcIdentifier.NameSpace.MajorVersion, + ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) && + (AsciiStrCmp ( + RestJSonHeader->JsonRsrcIdentifier.NameSpace.MinorVersion, + ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) && + (AsciiStrCmp ( + RestJSonHeader->JsonRsrcIdentifier.NameSpace.ErrataVersion, + ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) { + Status = InterpreterInstance->DestroyStructure ( + This, + RestJSonHeader + ); + break; + } + } + } + ThisSupportedRsrcTypeId ++; + } + return Status; +} + +/** + This function translates the given JSON text to JSON C Structure. + + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] RsrcTypeIdentifier Resource type identifier. + @param[in] ResourceJsonText Given Restful resource. + @param[out] JsonStructure Property interpreted from given ResourceRaw. + + @retval EFI_SUCCESS + @retval Others. + +**/ +EFI_STATUS +EFIAPI +RestJsonStructureToStruct ( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *RsrcTypeIdentifier OPTIONAL, + IN CHAR8 *ResourceJsonText, + OUT EFI_REST_JSON_STRUCTURE_HEADER **JsonStructure +) +{ + EFI_STATUS Status; + REST_JSON_STRUCTURE_INSTANCE *Instance; + + if (This == NULL || + ResourceJsonText == NULL || + JsonStructure == NULL + ) { + return EFI_INVALID_PARAMETER; + } + + if (IsListEmpty (&mRestJsonStructureList)) { + return EFI_UNSUPPORTED; + } + Status = EFI_SUCCESS; + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode (&mRestJsonStructureList); + while (TRUE) { + Status = InterpreterInstanceToStruct ( + This, + Instance, + RsrcTypeIdentifier, + ResourceJsonText, + JsonStructure + ); + if (!EFI_ERROR (Status)) { + break; + } + if (IsNodeAtEnd(&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance)) { + Status = EFI_UNSUPPORTED; + break; + } + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); + }; + return Status; +} + +/** + This function destory REST property EFI structure which returned in + JsonToStructure(). + + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] RestJSonHeader Property to destory. + + @retval EFI_SUCCESS + @retval Others + +**/ +EFI_STATUS +EFIAPI +RestJsonStructureDestroyStruct ( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader +) +{ + EFI_STATUS Status; + REST_JSON_STRUCTURE_INSTANCE *Instance; + + if (This == NULL || RestJSonHeader == NULL) { + return EFI_INVALID_PARAMETER; + } + + if (IsListEmpty (&mRestJsonStructureList)) { + return EFI_UNSUPPORTED; + } + Status = EFI_SUCCESS; + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode (&mRestJsonStructureList); + while (TRUE) { + Status = InterpreterInstanceDestoryJsonStruct ( + This, + Instance, + RestJSonHeader + ); + if (!EFI_ERROR (Status)) { + break; + } + if (IsNodeAtEnd(&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance)) { + Status = EFI_UNSUPPORTED; + break; + } + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); + }; + return Status; +} + +/** + This function translates the given JSON C Structure to JSON text. + + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL instance. + @param[in] RestJSonHeader Given Restful resource. + @param[out] ResourceRaw Resource in RESTfuls service oriented. + + @retval EFI_SUCCESS + @retval Others Fail to remove the entry + +**/ +EFI_STATUS +EFIAPI +RestJsonStructureToJson ( + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, + IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader, + OUT CHAR8 **ResourceRaw +) +{ + EFI_STATUS Status; + REST_JSON_STRUCTURE_INSTANCE *Instance; + + if (This == NULL || RestJSonHeader == NULL || ResourceRaw == NULL) { + return EFI_INVALID_PARAMETER; + } + + if (IsListEmpty (&mRestJsonStructureList)) { + return EFI_UNSUPPORTED; + } + Status = EFI_SUCCESS; + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode (&mRestJsonStructureList); + while (TRUE) { + Status = InterpreterEfiStructToInstance ( + This, + Instance, + RestJSonHeader, + ResourceRaw + ); + if (!EFI_ERROR (Status)) { + break; + } + if (IsNodeAtEnd(&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance)) { + Status = EFI_UNSUPPORTED; + break; + } + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); + }; + return Status; +} + +EFI_REST_JSON_STRUCTURE_PROTOCOL mRestJsonStructureProtocol = { + RestJsonStructureRegister, + RestJsonStructureToStruct, + RestJsonStructureToJson, + RestJsonStructureDestroyStruct +}; + +/** + This is the declaration of an EFI image entry point. + + @param ImageHandle The firmware allocated handle for the UEFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The operation completed successfully. + @retval Others An unexpected error occurred. +**/ +EFI_STATUS +EFIAPI +RestJsonStructureEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + InitializeListHead (&mRestJsonStructureList); + // + // Install the Restful Resource Interpreter Protocol. + // + mProtocolHandle = NULL; + Status = gBS->InstallProtocolInterface ( + &mProtocolHandle, + &gEfiRestJsonStructureProtocolGuid, + EFI_NATIVE_INTERFACE, + (VOID *)&mRestJsonStructureProtocol + ); + return Status; +} + +/** + This is the unload handle for Redfish discover module. + + Disconnect the driver specified by ImageHandle from all the devices in the handle database. + Uninstall all the protocols installed in the driver entry point. + + @param[in] ImageHandle The drivers' driver image. + + @retval EFI_SUCCESS The image is unloaded. + @retval Others Failed to unload the image. + +**/ +EFI_STATUS +EFIAPI +RestJsonStructureUnload ( + IN EFI_HANDLE ImageHandle + ) +{ + EFI_STATUS Status; + REST_JSON_STRUCTURE_INSTANCE *Instance; + REST_JSON_STRUCTURE_INSTANCE *NextInstance; + + if (IsListEmpty (&mRestJsonStructureList)) { + return EFI_SUCCESS; + } + // + // Free memory of REST_JSON_STRUCTURE_INSTANCE instance. + // + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode (&mRestJsonStructureList); + do { + NextInstance = NULL; + if (!IsNodeAtEnd(&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance)) { + NextInstance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); + } + FreePool ((VOID *)Instance); + Instance = NextInstance; + } while (Instance != NULL); + + Status = gBS->UninstallProtocolInterface ( + mProtocolHandle, + &gEfiRestJsonStructureProtocolGuid, + (VOID *)&mRestJsonStructureProtocol + ); + return Status; +} diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf new file mode 100644 index 0000000000..2ab1e3bc45 --- /dev/null +++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf @@ -0,0 +1,40 @@ +## @file +# Implementation of EFI REST JSON Structure Protocol. +# +# (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = RestJsonStructureDxe + FILE_GUID = 83FAAFBF-FC4B-469F-892A-798E66A6F50A + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = RestJsonStructureEntryPoint + UNLOAD_IMAGE = RestJsonStructureUnload + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + RedfishPkg/RedfishPkg.dec + +[Sources] + RestJsonStructureDxe.c + RestJsonStructureInternal.h + +[LibraryClasses] + BaseLib + BaseMemoryLib + MemoryAllocationLib + UefiBootServicesTableLib + UefiDriverEntryPoint + UefiLib + +[Protocols] + gEfiRestJsonStructureProtocolGuid ## Producing + +[Depex] + TRUE + diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h new file mode 100644 index 0000000000..e8a3408404 --- /dev/null +++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h @@ -0,0 +1,33 @@ +/** @file + The internal definitions of EFI REST Resource JSON to C structure convertor + Protocol. + + (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef EFI_REST_JSON_STRUCTURE_INTERNAL_H_ +#define EFI_REST_JSON_STRUCTURE_INTERNAL_H_ + +#include <Library/BaseLib.h> +#include <Library/UefiLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiDriverEntryPoint.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> + +/// +/// Internal structure to maintain the information of JSON to +/// C structure convertor. +/// +typedef struct _REST_JSON_STRUCTURE_INSTANCE { + LIST_ENTRY NextRestJsonStructureInstance; ///< Next convertor instance + UINTN NumberOfNameSpaceToConvert; ///< Number of resource type this convertor supports. + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *SupportedRsrcIndentifier; ///< The resource type linklist + EFI_REST_JSON_STRUCTURE_TO_STRUCTURE JsonToStructure; ///< JSON to C structure function + EFI_REST_JSON_STRUCTURE_TO_JSON StructureToJson; ///< C structure to JSON function + EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE DestroyStructure; ///< Destory C struture function. +} REST_JSON_STRUCTURE_INSTANCE; +#endif -- 2.17.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [RestJsonStructureDxe PATCH v3 2/3] RedfishPkg/RestJsonStructureDxe: EFI REST JSON Structure Protocol 2020-10-15 15:49 ` [RestJsonStructureDxe PATCH v3 2/3] RedfishPkg/RestJsonStructureDxe: " Abner Chang @ 2020-10-29 6:57 ` Nickle Wang 2020-10-30 1:37 ` Abner Chang 0 siblings, 1 reply; 7+ messages in thread From: Nickle Wang @ 2020-10-29 6:57 UTC (permalink / raw) To: Chang, Abner (HPS SW/FW Technologist), devel@edk2.groups.io Cc: Jiaxin Wu, Siyuan Fu, Fan Wang, Jiewen Yao Hi Abner, I have comment for function RestJsonStructureUnload(). Please check my inline comment below. Thanks, Nickle > -----Original Message----- > From: Chang, Abner (HPS SW/FW Technologist) <abner.chang@hpe.com> > Sent: Thursday, October 15, 2020 11:49 PM > To: devel@edk2.groups.io > Cc: Jiaxin Wu <jiaxin.wu@intel.com>; Siyuan Fu <siyuan.fu@intel.com>; Fan > Wang <fan.wang@intel.com>; Jiewen Yao <jiewen.yao@intel.com>; Wang, > Nickle (HPS SW) <nickle.wang@hpe.com> > Subject: [RestJsonStructureDxe PATCH v3 2/3] > RedfishPkg/RestJsonStructureDxe: EFI REST JSON Structure Protocol > > Implementation of EFI_REST_JSON_STRUCTURE_PROTOCOL, refer to UEFI > spec > 2.8 Section 29.7.3 EFI REST JSON Resource to C Structure Converter. > > Signed-off-by: Abner Chang <abner.chang@hpe.com> > > Cc: Jiaxin Wu <jiaxin.wu@intel.com> > Cc: Siyuan Fu <siyuan.fu@intel.com> > Cc: Fan Wang <fan.wang@intel.com> > Cc: Jiewen Yao <jiewen.yao@intel.com> > Cc: Nickle Wang <nickle.wang@hpe.com> > --- > RedfishPkg/RedfishPkg.dsc | 11 + > .../RestJsonStructureDxe.c | 585 ++++++++++++++++++ > .../RestJsonStructureDxe.inf | 40 ++ > .../RestJsonStructureInternal.h | 33 + > 4 files changed, 669 insertions(+) > create mode 100644 > RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c > create mode 100644 > RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf > create mode 100644 > RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h > > diff --git a/RedfishPkg/RedfishPkg.dsc b/RedfishPkg/RedfishPkg.dsc > index 8acadddefc..f0c6740fac 100644 > --- a/RedfishPkg/RedfishPkg.dsc > +++ b/RedfishPkg/RedfishPkg.dsc > @@ -38,3 +38,14 @@ > > DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTabl > eLib.inf > DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/Dx > eReportStatusCodeLib.inf > + > +[LibraryClasses.ARM, LibraryClasses.AARCH64] > + # > + # This library provides the instrinsic functions generated by a given > compiler. > + # > + NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf > + NULL|MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf > + ArmSoftFloatLib|ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.inf > + > +[Components] > + RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf > diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c > b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c > new file mode 100644 > index 0000000000..03fbecf993 > --- /dev/null > +++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c > @@ -0,0 +1,585 @@ > +/** @file > + > + The implementation of EFI REST Resource JSON to C structure convertor > + Protocol. > + > + (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include <Uefi.h> > +#include <Protocol/RestJsonStructure.h> > +#include "RestJsonStructureInternal.h" > + > +LIST_ENTRY mRestJsonStructureList; > +EFI_HANDLE mProtocolHandle; > + > +/** > + This function registers Restful resource interpreter for the > + specific schema. > + > + @param[in] This This is the > EFI_REST_JSON_STRUCTURE_PROTOCOL instance. > + @param[in] JsonStructureSupported The type and version of REST JSON > resource which this converter > + supports. > + @param[in] ToStructure The function to convert REST JSON > resource to structure. > + @param[in] ToJson The function to convert REST JSON structure > to JSON in text format. > + @param[in] DestroyStructure Destroy REST JSON structure returned > in ToStructure() function. > + > + @retval EFI_SUCCESS Register successfully. > + @retval Others Fail to register. > + > +**/ > +EFI_STATUS > +EFIAPI > +RestJsonStructureRegister ( > + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, > + IN EFI_REST_JSON_STRUCTURE_SUPPORTED *JsonStructureSupported, > + IN EFI_REST_JSON_STRUCTURE_TO_STRUCTURE ToStructure, > + IN EFI_REST_JSON_STRUCTURE_TO_JSON ToJson, > + IN EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE DestroyStructure > +) > +{ > + UINTN NumberOfNS; > + UINTN Index; > + LIST_ENTRY *ThisList; > + REST_JSON_STRUCTURE_INSTANCE *Instance; > + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *CloneSupportedInterpId; > + EFI_REST_JSON_STRUCTURE_SUPPORTED *ThisSupportedInterp; > + > + if (This == NULL || > + ToStructure == NULL || > + ToJson == NULL || > + DestroyStructure == NULL || > + JsonStructureSupported == NULL > + ) { > + return EFI_INVALID_PARAMETER; > + } > + > + // > + // Check how many name space interpreter can interpret. > + // > + ThisList = &JsonStructureSupported->NextSupportedRsrcInterp; > + NumberOfNS = 1; > + while (TRUE) { > + if (ThisList->ForwardLink == &JsonStructureSupported- > >NextSupportedRsrcInterp) { > + break; > + } else { > + ThisList = ThisList->ForwardLink; > + NumberOfNS ++; > + } > + }; > + > + Instance = > + (REST_JSON_STRUCTURE_INSTANCE *)AllocateZeroPool (sizeof > (REST_JSON_STRUCTURE_INSTANCE) + NumberOfNS * sizeof > (EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER)); > + if (Instance == NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + InitializeListHead (&Instance->NextRestJsonStructureInstance); > + Instance->NumberOfNameSpaceToConvert = NumberOfNS; > + Instance->SupportedRsrcIndentifier = > (EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER > *)((REST_JSON_STRUCTURE_INSTANCE *)Instance + 1); > + // > + // Copy supported resource identifer interpreter. > + // > + CloneSupportedInterpId = Instance->SupportedRsrcIndentifier; > + ThisSupportedInterp = JsonStructureSupported; > + for (Index = 0; Index < NumberOfNS; Index ++) { > + CopyMem ((VOID *)CloneSupportedInterpId, (VOID > *)&ThisSupportedInterp->RestResourceInterp, sizeof > (EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER)); > + ThisSupportedInterp = (EFI_REST_JSON_STRUCTURE_SUPPORTED > *)ThisSupportedInterp->NextSupportedRsrcInterp.ForwardLink; > + CloneSupportedInterpId ++; > + } > + Instance->JsonToStructure = ToStructure; > + Instance->StructureToJson = ToJson; > + Instance->DestroyStructure = DestroyStructure; > + InsertTailList (&mRestJsonStructureList, &Instance- > >NextRestJsonStructureInstance); > + return EFI_SUCCESS; > +} > + > +/** > + This function check if this interpreter instance support the given > namesapce. > + > + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL > instance. > + @param[in] InterpreterInstance REST_JSON_STRUCTURE_INSTANCE > + @param[in] RsrcTypeIdentifier Resource type identifier. > + @param[in] ResourceRaw Given Restful resource. > + @param[out] RestJSonHeader Property interpreted from given > ResourceRaw. > + > + @retval EFI_SUCCESS > + @retval Others. > + > +**/ > +EFI_STATUS > +InterpreterInstanceToStruct ( > + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, > + IN REST_JSON_STRUCTURE_INSTANCE *InterpreterInstance, > + IN EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *RsrcTypeIdentifier > OPTIONAL, > + IN CHAR8 *ResourceRaw, > + OUT EFI_REST_JSON_STRUCTURE_HEADER **RestJSonHeader > + ) > +{ > + UINTN Index; > + EFI_STATUS Status; > + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *ThisSupportedRsrcTypeId; > + > + if (This == NULL || > + InterpreterInstance == NULL || > + ResourceRaw == NULL || > + RestJSonHeader == NULL > + ) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_UNSUPPORTED; > + if (RsrcTypeIdentifier == NULL) { > + // > + // No resource type identifier, send to intepreter anyway. > + // Interpreter may recognize this resource. > + // > + Status = InterpreterInstance->JsonToStructure ( > + This, > + NULL, > + ResourceRaw, > + RestJSonHeader > + ); > + } else { > + // > + // Check if the namesapce and version is supported by this interpreter. > + // > + ThisSupportedRsrcTypeId = InterpreterInstance- > >SupportedRsrcIndentifier; > + for (Index = 0; Index < InterpreterInstance- > >NumberOfNameSpaceToConvert; Index ++){ > + if (AsciiStrCmp ( > + RsrcTypeIdentifier->NameSpace.ResourceTypeName, > + ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0){ > + if ((RsrcTypeIdentifier->NameSpace.MajorVersion == NULL) && > + (RsrcTypeIdentifier->NameSpace.MinorVersion == NULL) && > + (RsrcTypeIdentifier->NameSpace.ErrataVersion == NULL) > + ) { > + // > + // Don't check version of this resource type identifier. > + // > + Status = InterpreterInstance->JsonToStructure ( > + This, > + RsrcTypeIdentifier, > + ResourceRaw, > + RestJSonHeader > + ); > + break; > + } else { > + // > + // Check version. > + // > + if ((AsciiStrCmp ( > + RsrcTypeIdentifier->NameSpace.MajorVersion, > + ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) && > + (AsciiStrCmp ( > + RsrcTypeIdentifier->NameSpace.MinorVersion, > + ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) && > + (AsciiStrCmp ( > + RsrcTypeIdentifier->NameSpace.ErrataVersion, > + ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) { > + Status = InterpreterInstance->JsonToStructure ( > + This, > + RsrcTypeIdentifier, > + ResourceRaw, > + RestJSonHeader > + ); > + break; > + } > + } > + } > + ThisSupportedRsrcTypeId ++; > + } > + } > + return Status; > +} > +/** > + This function converts JSON C structure to JSON property. > + > + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL > instance. > + @param[in] InterpreterInstance REST_JSON_STRUCTURE_INSTANCE > + @param[in] RestJSonHeader Resource type identifier. > + @param[out] ResourceRaw Output in JSON text format. > + > + @retval EFI_SUCCESS > + @retval Others. > + > +**/ > +EFI_STATUS > +InterpreterEfiStructToInstance ( > + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, > + IN REST_JSON_STRUCTURE_INSTANCE *InterpreterInstance, > + IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader, > + OUT CHAR8 **ResourceRaw > +) > +{ > + UINTN Index; > + EFI_STATUS Status; > + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *ThisSupportedRsrcTypeId; > + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *RsrcTypeIdentifier; > + > + if (This == NULL || > + InterpreterInstance == NULL || > + RestJSonHeader == NULL || > + ResourceRaw == NULL > + ) { > + return EFI_INVALID_PARAMETER; > + } > + RsrcTypeIdentifier = &RestJSonHeader->JsonRsrcIdentifier; > + if (RsrcTypeIdentifier == NULL || > + RsrcTypeIdentifier->NameSpace.ResourceTypeName == NULL || > + RsrcTypeIdentifier->NameSpace.MajorVersion == NULL || > + RsrcTypeIdentifier->NameSpace.MinorVersion == NULL || > + RsrcTypeIdentifier->NameSpace.ErrataVersion == NULL > + ) { > + return EFI_INVALID_PARAMETER; > + } > + > + // > + // Check if the namesapce and version is supported by this interpreter. > + // > + Status = EFI_UNSUPPORTED; > + ThisSupportedRsrcTypeId = InterpreterInstance- > >SupportedRsrcIndentifier; > + for (Index = 0; Index < InterpreterInstance- > >NumberOfNameSpaceToConvert; Index ++){ > + if (AsciiStrCmp ( > + RsrcTypeIdentifier->NameSpace.ResourceTypeName, > + ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0){ > + // > + // Check version. > + // > + if ((AsciiStrCmp ( > + RsrcTypeIdentifier->NameSpace.MajorVersion, > + ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) && > + (AsciiStrCmp ( > + RsrcTypeIdentifier->NameSpace.MinorVersion, > + ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) && > + (AsciiStrCmp ( > + RsrcTypeIdentifier->NameSpace.ErrataVersion, > + ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) { > + Status = InterpreterInstance->StructureToJson ( > + This, > + RestJSonHeader, > + ResourceRaw > + ); > + break; > + } > + } > + ThisSupportedRsrcTypeId ++; > + } > + return Status; > +} > + > +/** > + This function destory REST property structure. > + > + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL > instance. > + @param[in] InterpreterInstance REST_JSON_STRUCTURE_INSTANCE > + @param[in] RestJSonHeader Property interpreted from given > ResourceRaw. > + > + @retval EFI_SUCCESS > + @retval Others. > + > +**/ > +EFI_STATUS > +InterpreterInstanceDestoryJsonStruct ( > + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, > + IN REST_JSON_STRUCTURE_INSTANCE *InterpreterInstance, > + IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader > + ) > +{ > + UINTN Index; > + EFI_STATUS Status; > + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *ThisSupportedRsrcTypeId; > + > + if (This == NULL || > + InterpreterInstance == NULL || > + RestJSonHeader == NULL > + ) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status = EFI_UNSUPPORTED; > + // > + // Check if the namesapce and version is supported by this interpreter. > + // > + ThisSupportedRsrcTypeId = InterpreterInstance- > >SupportedRsrcIndentifier; > + for (Index = 0; Index < InterpreterInstance- > >NumberOfNameSpaceToConvert; Index ++){ > + if (AsciiStrCmp ( > + RestJSonHeader->JsonRsrcIdentifier.NameSpace.ResourceTypeName, > + ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0) { > + if ((RestJSonHeader->JsonRsrcIdentifier.NameSpace.MajorVersion == > NULL) && > + (RestJSonHeader->JsonRsrcIdentifier.NameSpace.MinorVersion == > NULL) && > + (RestJSonHeader->JsonRsrcIdentifier.NameSpace.ErrataVersion == > NULL) > + ) { > + // > + // Don't check version of this resource type identifier. > + // > + Status = InterpreterInstance->DestroyStructure ( > + This, > + RestJSonHeader > + ); > + break; > + } else { > + // > + // Check version. > + // > + if ((AsciiStrCmp ( > + RestJSonHeader->JsonRsrcIdentifier.NameSpace.MajorVersion, > + ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) && > + (AsciiStrCmp ( > + RestJSonHeader->JsonRsrcIdentifier.NameSpace.MinorVersion, > + ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) && > + (AsciiStrCmp ( > + RestJSonHeader->JsonRsrcIdentifier.NameSpace.ErrataVersion, > + ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) { > + Status = InterpreterInstance->DestroyStructure ( > + This, > + RestJSonHeader > + ); > + break; > + } > + } > + } > + ThisSupportedRsrcTypeId ++; > + } > + return Status; > +} > + > +/** > + This function translates the given JSON text to JSON C Structure. > + > + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL > instance. > + @param[in] RsrcTypeIdentifier Resource type identifier. > + @param[in] ResourceJsonText Given Restful resource. > + @param[out] JsonStructure Property interpreted from given > ResourceRaw. > + > + @retval EFI_SUCCESS > + @retval Others. > + > +**/ > +EFI_STATUS > +EFIAPI > +RestJsonStructureToStruct ( > + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, > + IN EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *RsrcTypeIdentifier > OPTIONAL, > + IN CHAR8 *ResourceJsonText, > + OUT EFI_REST_JSON_STRUCTURE_HEADER **JsonStructure > +) > +{ > + EFI_STATUS Status; > + REST_JSON_STRUCTURE_INSTANCE *Instance; > + > + if (This == NULL || > + ResourceJsonText == NULL || > + JsonStructure == NULL > + ) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (IsListEmpty (&mRestJsonStructureList)) { > + return EFI_UNSUPPORTED; > + } > + Status = EFI_SUCCESS; > + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode > (&mRestJsonStructureList); > + while (TRUE) { > + Status = InterpreterInstanceToStruct ( > + This, > + Instance, > + RsrcTypeIdentifier, > + ResourceJsonText, > + JsonStructure > + ); > + if (!EFI_ERROR (Status)) { > + break; > + } > + if (IsNodeAtEnd(&mRestJsonStructureList, &Instance- > >NextRestJsonStructureInstance)) { > + Status = EFI_UNSUPPORTED; > + break; > + } > + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode > (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); > + }; > + return Status; > +} > + > +/** > + This function destory REST property EFI structure which returned in > + JsonToStructure(). > + > + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL instance. > + @param[in] RestJSonHeader Property to destory. > + > + @retval EFI_SUCCESS > + @retval Others > + > +**/ > +EFI_STATUS > +EFIAPI > +RestJsonStructureDestroyStruct ( > + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, > + IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader > +) > +{ > + EFI_STATUS Status; > + REST_JSON_STRUCTURE_INSTANCE *Instance; > + > + if (This == NULL || RestJSonHeader == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (IsListEmpty (&mRestJsonStructureList)) { > + return EFI_UNSUPPORTED; > + } > + Status = EFI_SUCCESS; > + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode > (&mRestJsonStructureList); > + while (TRUE) { > + Status = InterpreterInstanceDestoryJsonStruct ( > + This, > + Instance, > + RestJSonHeader > + ); > + if (!EFI_ERROR (Status)) { > + break; > + } > + if (IsNodeAtEnd(&mRestJsonStructureList, &Instance- > >NextRestJsonStructureInstance)) { > + Status = EFI_UNSUPPORTED; > + break; > + } > + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode > (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); > + }; > + return Status; > +} > + > +/** > + This function translates the given JSON C Structure to JSON text. > + > + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL instance. > + @param[in] RestJSonHeader Given Restful resource. > + @param[out] ResourceRaw Resource in RESTfuls service oriented. > + > + @retval EFI_SUCCESS > + @retval Others Fail to remove the entry > + > +**/ > +EFI_STATUS > +EFIAPI > +RestJsonStructureToJson ( > + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, > + IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader, > + OUT CHAR8 **ResourceRaw > +) > +{ > + EFI_STATUS Status; > + REST_JSON_STRUCTURE_INSTANCE *Instance; > + > + if (This == NULL || RestJSonHeader == NULL || ResourceRaw == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (IsListEmpty (&mRestJsonStructureList)) { > + return EFI_UNSUPPORTED; > + } > + Status = EFI_SUCCESS; > + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode > (&mRestJsonStructureList); > + while (TRUE) { > + Status = InterpreterEfiStructToInstance ( > + This, > + Instance, > + RestJSonHeader, > + ResourceRaw > + ); > + if (!EFI_ERROR (Status)) { > + break; > + } > + if (IsNodeAtEnd(&mRestJsonStructureList, &Instance- > >NextRestJsonStructureInstance)) { > + Status = EFI_UNSUPPORTED; > + break; > + } > + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode > (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); > + }; > + return Status; > +} > + > +EFI_REST_JSON_STRUCTURE_PROTOCOL mRestJsonStructureProtocol = { > + RestJsonStructureRegister, > + RestJsonStructureToStruct, > + RestJsonStructureToJson, > + RestJsonStructureDestroyStruct > +}; > + > +/** > + This is the declaration of an EFI image entry point. > + > + @param ImageHandle The firmware allocated handle for the UEFI > image. > + @param SystemTable A pointer to the EFI System Table. > + > + @retval EFI_SUCCESS The operation completed successfully. > + @retval Others An unexpected error occurred. > +**/ > +EFI_STATUS > +EFIAPI > +RestJsonStructureEntryPoint ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + EFI_STATUS Status; > + > + InitializeListHead (&mRestJsonStructureList); > + // > + // Install the Restful Resource Interpreter Protocol. > + // > + mProtocolHandle = NULL; > + Status = gBS->InstallProtocolInterface ( > + &mProtocolHandle, > + &gEfiRestJsonStructureProtocolGuid, > + EFI_NATIVE_INTERFACE, > + (VOID *)&mRestJsonStructureProtocol > + ); > + return Status; > +} > + > +/** > + This is the unload handle for Redfish discover module. > + > + Disconnect the driver specified by ImageHandle from all the devices in the > handle database. > + Uninstall all the protocols installed in the driver entry point. > + > + @param[in] ImageHandle The drivers' driver image. > + > + @retval EFI_SUCCESS The image is unloaded. > + @retval Others Failed to unload the image. > + > +**/ > +EFI_STATUS > +EFIAPI > +RestJsonStructureUnload ( > + IN EFI_HANDLE ImageHandle > + ) > +{ > + EFI_STATUS Status; > + REST_JSON_STRUCTURE_INSTANCE *Instance; > + REST_JSON_STRUCTURE_INSTANCE *NextInstance; > + > + if (IsListEmpty (&mRestJsonStructureList)) { > + return EFI_SUCCESS; > + } We still need to uninstall REST Json Structure Protocol when list is empty, right? The protocol is installed on driver entry when list is empty. > + // > + // Free memory of REST_JSON_STRUCTURE_INSTANCE instance. > + // > + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode > (&mRestJsonStructureList); > + do { > + NextInstance = NULL; > + if (!IsNodeAtEnd(&mRestJsonStructureList, &Instance- > >NextRestJsonStructureInstance)) { > + NextInstance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode > (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); > + } > + FreePool ((VOID *)Instance); > + Instance = NextInstance; > + } while (Instance != NULL); > + > + Status = gBS->UninstallProtocolInterface ( > + mProtocolHandle, > + &gEfiRestJsonStructureProtocolGuid, > + (VOID *)&mRestJsonStructureProtocol > + ); > + return Status; > +} > diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf > b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf > new file mode 100644 > index 0000000000..2ab1e3bc45 > --- /dev/null > +++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf > @@ -0,0 +1,40 @@ > +## @file > +# Implementation of EFI REST JSON Structure Protocol. > +# > +# (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = RestJsonStructureDxe > + FILE_GUID = 83FAAFBF-FC4B-469F-892A-798E66A6F50A > + MODULE_TYPE = DXE_DRIVER > + VERSION_STRING = 1.0 > + ENTRY_POINT = RestJsonStructureEntryPoint > + UNLOAD_IMAGE = RestJsonStructureUnload > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + RedfishPkg/RedfishPkg.dec > + > +[Sources] > + RestJsonStructureDxe.c > + RestJsonStructureInternal.h > + > +[LibraryClasses] > + BaseLib > + BaseMemoryLib > + MemoryAllocationLib > + UefiBootServicesTableLib > + UefiDriverEntryPoint > + UefiLib > + > +[Protocols] > + gEfiRestJsonStructureProtocolGuid ## Producing > + > +[Depex] > + TRUE > + > diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h > b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h > new file mode 100644 > index 0000000000..e8a3408404 > --- /dev/null > +++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h > @@ -0,0 +1,33 @@ > +/** @file > + The internal definitions of EFI REST Resource JSON to C structure convertor > + Protocol. > + > + (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef EFI_REST_JSON_STRUCTURE_INTERNAL_H_ > +#define EFI_REST_JSON_STRUCTURE_INTERNAL_H_ > + > +#include <Library/BaseLib.h> > +#include <Library/UefiLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/UefiDriverEntryPoint.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/MemoryAllocationLib.h> > + > +/// > +/// Internal structure to maintain the information of JSON to > +/// C structure convertor. > +/// > +typedef struct _REST_JSON_STRUCTURE_INSTANCE { > + LIST_ENTRY NextRestJsonStructureInstance; ///< Next convertor instance > + UINTN NumberOfNameSpaceToConvert; ///< Number of resource > type this convertor supports. > + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER > *SupportedRsrcIndentifier; ///< The resource type linklist > + EFI_REST_JSON_STRUCTURE_TO_STRUCTURE JsonToStructure; > ///< JSON to C structure function > + EFI_REST_JSON_STRUCTURE_TO_JSON StructureToJson; ///< C > structure to JSON function > + EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE DestroyStructure; > ///< Destory C struture function. > +} REST_JSON_STRUCTURE_INSTANCE; > +#endif > -- > 2.17.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RestJsonStructureDxe PATCH v3 2/3] RedfishPkg/RestJsonStructureDxe: EFI REST JSON Structure Protocol 2020-10-29 6:57 ` Nickle Wang @ 2020-10-30 1:37 ` Abner Chang 0 siblings, 0 replies; 7+ messages in thread From: Abner Chang @ 2020-10-30 1:37 UTC (permalink / raw) To: Wang, Nickle (HPS SW), devel@edk2.groups.io Cc: Jiaxin Wu, Siyuan Fu, Fan Wang, Jiewen Yao > -----Original Message----- > From: Wang, Nickle (HPS SW) > Sent: Thursday, October 29, 2020 2:58 PM > To: Chang, Abner (HPS SW/FW Technologist) <abner.chang@hpe.com>; > devel@edk2.groups.io > Cc: Jiaxin Wu <jiaxin.wu@intel.com>; Siyuan Fu <siyuan.fu@intel.com>; Fan > Wang <fan.wang@intel.com>; Jiewen Yao <jiewen.yao@intel.com> > Subject: RE: [RestJsonStructureDxe PATCH v3 2/3] > RedfishPkg/RestJsonStructureDxe: EFI REST JSON Structure Protocol > > Hi Abner, > > I have comment for function RestJsonStructureUnload(). Please check my > inline comment below. > > Thanks, > Nickle > > > -----Original Message----- > > From: Chang, Abner (HPS SW/FW Technologist) <abner.chang@hpe.com> > > Sent: Thursday, October 15, 2020 11:49 PM > > To: devel@edk2.groups.io > > Cc: Jiaxin Wu <jiaxin.wu@intel.com>; Siyuan Fu <siyuan.fu@intel.com>; > > Fan Wang <fan.wang@intel.com>; Jiewen Yao <jiewen.yao@intel.com>; > > Wang, Nickle (HPS SW) <nickle.wang@hpe.com> > > Subject: [RestJsonStructureDxe PATCH v3 2/3] > > RedfishPkg/RestJsonStructureDxe: EFI REST JSON Structure Protocol > > > > Implementation of EFI_REST_JSON_STRUCTURE_PROTOCOL, refer to UEFI > spec > > 2.8 Section 29.7.3 EFI REST JSON Resource to C Structure Converter. > > > > Signed-off-by: Abner Chang <abner.chang@hpe.com> > > > > Cc: Jiaxin Wu <jiaxin.wu@intel.com> > > Cc: Siyuan Fu <siyuan.fu@intel.com> > > Cc: Fan Wang <fan.wang@intel.com> > > Cc: Jiewen Yao <jiewen.yao@intel.com> > > Cc: Nickle Wang <nickle.wang@hpe.com> > > --- > > RedfishPkg/RedfishPkg.dsc | 11 + > > .../RestJsonStructureDxe.c | 585 ++++++++++++++++++ > > .../RestJsonStructureDxe.inf | 40 ++ > > .../RestJsonStructureInternal.h | 33 + > > 4 files changed, 669 insertions(+) > > create mode 100644 > > RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c > > create mode 100644 > > RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf > > create mode 100644 > > RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h > > > > diff --git a/RedfishPkg/RedfishPkg.dsc b/RedfishPkg/RedfishPkg.dsc > > index 8acadddefc..f0c6740fac 100644 > > --- a/RedfishPkg/RedfishPkg.dsc > > +++ b/RedfishPkg/RedfishPkg.dsc > > @@ -38,3 +38,14 @@ > > > > > DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTabl > > eLib.inf > > DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf > > > > > ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/Dx > > eReportStatusCodeLib.inf > > + > > +[LibraryClasses.ARM, LibraryClasses.AARCH64] > > + # > > + # This library provides the instrinsic functions generated by a > > +given > > compiler. > > + # > > + NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf > > + NULL|MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf > > + ArmSoftFloatLib|ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.inf > > + > > +[Components] > > + RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf > > diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c > > b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c > > new file mode 100644 > > index 0000000000..03fbecf993 > > --- /dev/null > > +++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c > > @@ -0,0 +1,585 @@ > > +/** @file > > + > > + The implementation of EFI REST Resource JSON to C structure > > + convertor Protocol. > > + > > + (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> > > + > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > +**/ > > + > > +#include <Uefi.h> > > +#include <Protocol/RestJsonStructure.h> #include > > +"RestJsonStructureInternal.h" > > + > > +LIST_ENTRY mRestJsonStructureList; > > +EFI_HANDLE mProtocolHandle; > > + > > +/** > > + This function registers Restful resource interpreter for the > > + specific schema. > > + > > + @param[in] This This is the > > EFI_REST_JSON_STRUCTURE_PROTOCOL instance. > > + @param[in] JsonStructureSupported The type and version of REST > JSON > > resource which this converter > > + supports. > > + @param[in] ToStructure The function to convert REST JSON > > resource to structure. > > + @param[in] ToJson The function to convert REST JSON > structure > > to JSON in text format. > > + @param[in] DestroyStructure Destroy REST JSON structure > returned > > in ToStructure() function. > > + > > + @retval EFI_SUCCESS Register successfully. > > + @retval Others Fail to register. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RestJsonStructureRegister ( > > + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, > > + IN EFI_REST_JSON_STRUCTURE_SUPPORTED > *JsonStructureSupported, > > + IN EFI_REST_JSON_STRUCTURE_TO_STRUCTURE ToStructure, > > + IN EFI_REST_JSON_STRUCTURE_TO_JSON ToJson, > > + IN EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE DestroyStructure > > +) > > +{ > > + UINTN NumberOfNS; > > + UINTN Index; > > + LIST_ENTRY *ThisList; > > + REST_JSON_STRUCTURE_INSTANCE *Instance; > > + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *CloneSupportedInterpId; > > + EFI_REST_JSON_STRUCTURE_SUPPORTED *ThisSupportedInterp; > > + > > + if (This == NULL || > > + ToStructure == NULL || > > + ToJson == NULL || > > + DestroyStructure == NULL || > > + JsonStructureSupported == NULL > > + ) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + // > > + // Check how many name space interpreter can interpret. > > + // > > + ThisList = &JsonStructureSupported->NextSupportedRsrcInterp; > > + NumberOfNS = 1; > > + while (TRUE) { > > + if (ThisList->ForwardLink == &JsonStructureSupported- > > >NextSupportedRsrcInterp) { > > + break; > > + } else { > > + ThisList = ThisList->ForwardLink; > > + NumberOfNS ++; > > + } > > + }; > > + > > + Instance = > > + (REST_JSON_STRUCTURE_INSTANCE *)AllocateZeroPool (sizeof > > (REST_JSON_STRUCTURE_INSTANCE) + NumberOfNS * sizeof > > (EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER)); > > + if (Instance == NULL) { > > + return EFI_OUT_OF_RESOURCES; > > + } > > + InitializeListHead (&Instance->NextRestJsonStructureInstance); > > + Instance->NumberOfNameSpaceToConvert = NumberOfNS; > > + Instance->SupportedRsrcIndentifier = > > (EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER > > *)((REST_JSON_STRUCTURE_INSTANCE *)Instance + 1); > > + // > > + // Copy supported resource identifer interpreter. > > + // > > + CloneSupportedInterpId = Instance->SupportedRsrcIndentifier; > > + ThisSupportedInterp = JsonStructureSupported; for (Index = 0; > > + Index < NumberOfNS; Index ++) { > > + CopyMem ((VOID *)CloneSupportedInterpId, (VOID > > *)&ThisSupportedInterp->RestResourceInterp, sizeof > > (EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER)); > > + ThisSupportedInterp = (EFI_REST_JSON_STRUCTURE_SUPPORTED > > *)ThisSupportedInterp->NextSupportedRsrcInterp.ForwardLink; > > + CloneSupportedInterpId ++; > > + } > > + Instance->JsonToStructure = ToStructure; Instance->StructureToJson > > + = ToJson; Instance->DestroyStructure = DestroyStructure; > > + InsertTailList (&mRestJsonStructureList, &Instance- > > >NextRestJsonStructureInstance); > > + return EFI_SUCCESS; > > +} > > + > > +/** > > + This function check if this interpreter instance support the given > > namesapce. > > + > > + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL > > instance. > > + @param[in] InterpreterInstance REST_JSON_STRUCTURE_INSTANCE > > + @param[in] RsrcTypeIdentifier Resource type identifier. > > + @param[in] ResourceRaw Given Restful resource. > > + @param[out] RestJSonHeader Property interpreted from given > > ResourceRaw. > > + > > + @retval EFI_SUCCESS > > + @retval Others. > > + > > +**/ > > +EFI_STATUS > > +InterpreterInstanceToStruct ( > > + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, > > + IN REST_JSON_STRUCTURE_INSTANCE *InterpreterInstance, > > + IN EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *RsrcTypeIdentifier > > OPTIONAL, > > + IN CHAR8 *ResourceRaw, > > + OUT EFI_REST_JSON_STRUCTURE_HEADER **RestJSonHeader > > + ) > > +{ > > + UINTN Index; > > + EFI_STATUS Status; > > + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER > *ThisSupportedRsrcTypeId; > > + > > + if (This == NULL || > > + InterpreterInstance == NULL || > > + ResourceRaw == NULL || > > + RestJSonHeader == NULL > > + ) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + Status = EFI_UNSUPPORTED; > > + if (RsrcTypeIdentifier == NULL) { > > + // > > + // No resource type identifier, send to intepreter anyway. > > + // Interpreter may recognize this resource. > > + // > > + Status = InterpreterInstance->JsonToStructure ( > > + This, > > + NULL, > > + ResourceRaw, > > + RestJSonHeader > > + ); > > + } else { > > + // > > + // Check if the namesapce and version is supported by this interpreter. > > + // > > + ThisSupportedRsrcTypeId = InterpreterInstance- > > >SupportedRsrcIndentifier; > > + for (Index = 0; Index < InterpreterInstance- > > >NumberOfNameSpaceToConvert; Index ++){ > > + if (AsciiStrCmp ( > > + RsrcTypeIdentifier->NameSpace.ResourceTypeName, > > + ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0){ > > + if ((RsrcTypeIdentifier->NameSpace.MajorVersion == NULL) && > > + (RsrcTypeIdentifier->NameSpace.MinorVersion == NULL) && > > + (RsrcTypeIdentifier->NameSpace.ErrataVersion == NULL) > > + ) { > > + // > > + // Don't check version of this resource type identifier. > > + // > > + Status = InterpreterInstance->JsonToStructure ( > > + This, > > + RsrcTypeIdentifier, > > + ResourceRaw, > > + RestJSonHeader > > + ); > > + break; > > + } else { > > + // > > + // Check version. > > + // > > + if ((AsciiStrCmp ( > > + RsrcTypeIdentifier->NameSpace.MajorVersion, > > + ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) && > > + (AsciiStrCmp ( > > + RsrcTypeIdentifier->NameSpace.MinorVersion, > > + ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) && > > + (AsciiStrCmp ( > > + RsrcTypeIdentifier->NameSpace.ErrataVersion, > > + ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) { > > + Status = InterpreterInstance->JsonToStructure ( > > + This, > > + RsrcTypeIdentifier, > > + ResourceRaw, > > + RestJSonHeader > > + ); > > + break; > > + } > > + } > > + } > > + ThisSupportedRsrcTypeId ++; > > + } > > + } > > + return Status; > > +} > > +/** > > + This function converts JSON C structure to JSON property. > > + > > + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL > > instance. > > + @param[in] InterpreterInstance REST_JSON_STRUCTURE_INSTANCE > > + @param[in] RestJSonHeader Resource type identifier. > > + @param[out] ResourceRaw Output in JSON text format. > > + > > + @retval EFI_SUCCESS > > + @retval Others. > > + > > +**/ > > +EFI_STATUS > > +InterpreterEfiStructToInstance ( > > + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, > > + IN REST_JSON_STRUCTURE_INSTANCE *InterpreterInstance, > > + IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader, > > + OUT CHAR8 **ResourceRaw > > +) > > +{ > > + UINTN Index; > > + EFI_STATUS Status; > > + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER > *ThisSupportedRsrcTypeId; > > + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *RsrcTypeIdentifier; > > + > > + if (This == NULL || > > + InterpreterInstance == NULL || > > + RestJSonHeader == NULL || > > + ResourceRaw == NULL > > + ) { > > + return EFI_INVALID_PARAMETER; > > + } > > + RsrcTypeIdentifier = &RestJSonHeader->JsonRsrcIdentifier; > > + if (RsrcTypeIdentifier == NULL || > > + RsrcTypeIdentifier->NameSpace.ResourceTypeName == NULL || > > + RsrcTypeIdentifier->NameSpace.MajorVersion == NULL || > > + RsrcTypeIdentifier->NameSpace.MinorVersion == NULL || > > + RsrcTypeIdentifier->NameSpace.ErrataVersion == NULL > > + ) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + // > > + // Check if the namesapce and version is supported by this interpreter. > > + // > > + Status = EFI_UNSUPPORTED; > > + ThisSupportedRsrcTypeId = InterpreterInstance- > > >SupportedRsrcIndentifier; > > + for (Index = 0; Index < InterpreterInstance- > > >NumberOfNameSpaceToConvert; Index ++){ > > + if (AsciiStrCmp ( > > + RsrcTypeIdentifier->NameSpace.ResourceTypeName, > > + ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0){ > > + // > > + // Check version. > > + // > > + if ((AsciiStrCmp ( > > + RsrcTypeIdentifier->NameSpace.MajorVersion, > > + ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) && > > + (AsciiStrCmp ( > > + RsrcTypeIdentifier->NameSpace.MinorVersion, > > + ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) && > > + (AsciiStrCmp ( > > + RsrcTypeIdentifier->NameSpace.ErrataVersion, > > + ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) { > > + Status = InterpreterInstance->StructureToJson ( > > + This, > > + RestJSonHeader, > > + ResourceRaw > > + ); > > + break; > > + } > > + } > > + ThisSupportedRsrcTypeId ++; > > + } > > + return Status; > > +} > > + > > +/** > > + This function destory REST property structure. > > + > > + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL > > instance. > > + @param[in] InterpreterInstance REST_JSON_STRUCTURE_INSTANCE > > + @param[in] RestJSonHeader Property interpreted from given > > ResourceRaw. > > + > > + @retval EFI_SUCCESS > > + @retval Others. > > + > > +**/ > > +EFI_STATUS > > +InterpreterInstanceDestoryJsonStruct ( > > + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, > > + IN REST_JSON_STRUCTURE_INSTANCE *InterpreterInstance, > > + IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader > > + ) > > +{ > > + UINTN Index; > > + EFI_STATUS Status; > > + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER > *ThisSupportedRsrcTypeId; > > + > > + if (This == NULL || > > + InterpreterInstance == NULL || > > + RestJSonHeader == NULL > > + ) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + Status = EFI_UNSUPPORTED; > > + // > > + // Check if the namesapce and version is supported by this interpreter. > > + // > > + ThisSupportedRsrcTypeId = InterpreterInstance- > > >SupportedRsrcIndentifier; > > + for (Index = 0; Index < InterpreterInstance- > > >NumberOfNameSpaceToConvert; Index ++){ > > + if (AsciiStrCmp ( > > + RestJSonHeader- > >JsonRsrcIdentifier.NameSpace.ResourceTypeName, > > + ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0) { > > + if ((RestJSonHeader->JsonRsrcIdentifier.NameSpace.MajorVersion > > + == > > NULL) && > > + (RestJSonHeader->JsonRsrcIdentifier.NameSpace.MinorVersion > > + == > > NULL) && > > + (RestJSonHeader->JsonRsrcIdentifier.NameSpace.ErrataVersion > > + == > > NULL) > > + ) { > > + // > > + // Don't check version of this resource type identifier. > > + // > > + Status = InterpreterInstance->DestroyStructure ( > > + This, > > + RestJSonHeader > > + ); > > + break; > > + } else { > > + // > > + // Check version. > > + // > > + if ((AsciiStrCmp ( > > + RestJSonHeader->JsonRsrcIdentifier.NameSpace.MajorVersion, > > + ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) && > > + (AsciiStrCmp ( > > + RestJSonHeader->JsonRsrcIdentifier.NameSpace.MinorVersion, > > + ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) && > > + (AsciiStrCmp ( > > + RestJSonHeader->JsonRsrcIdentifier.NameSpace.ErrataVersion, > > + ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) { > > + Status = InterpreterInstance->DestroyStructure ( > > + This, > > + RestJSonHeader > > + ); > > + break; > > + } > > + } > > + } > > + ThisSupportedRsrcTypeId ++; > > + } > > + return Status; > > +} > > + > > +/** > > + This function translates the given JSON text to JSON C Structure. > > + > > + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL > > instance. > > + @param[in] RsrcTypeIdentifier Resource type identifier. > > + @param[in] ResourceJsonText Given Restful resource. > > + @param[out] JsonStructure Property interpreted from given > > ResourceRaw. > > + > > + @retval EFI_SUCCESS > > + @retval Others. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RestJsonStructureToStruct ( > > + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, > > + IN EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *RsrcTypeIdentifier > > OPTIONAL, > > + IN CHAR8 *ResourceJsonText, > > + OUT EFI_REST_JSON_STRUCTURE_HEADER **JsonStructure > > +) > > +{ > > + EFI_STATUS Status; > > + REST_JSON_STRUCTURE_INSTANCE *Instance; > > + > > + if (This == NULL || > > + ResourceJsonText == NULL || > > + JsonStructure == NULL > > + ) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + if (IsListEmpty (&mRestJsonStructureList)) { > > + return EFI_UNSUPPORTED; > > + } > > + Status = EFI_SUCCESS; > > + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode > > (&mRestJsonStructureList); > > + while (TRUE) { > > + Status = InterpreterInstanceToStruct ( > > + This, > > + Instance, > > + RsrcTypeIdentifier, > > + ResourceJsonText, > > + JsonStructure > > + ); > > + if (!EFI_ERROR (Status)) { > > + break; > > + } > > + if (IsNodeAtEnd(&mRestJsonStructureList, &Instance- > > >NextRestJsonStructureInstance)) { > > + Status = EFI_UNSUPPORTED; > > + break; > > + } > > + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode > > (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); > > + }; > > + return Status; > > +} > > + > > +/** > > + This function destory REST property EFI structure which returned in > > + JsonToStructure(). > > + > > + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL > instance. > > + @param[in] RestJSonHeader Property to destory. > > + > > + @retval EFI_SUCCESS > > + @retval Others > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RestJsonStructureDestroyStruct ( > > + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, > > + IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader > > +) > > +{ > > + EFI_STATUS Status; > > + REST_JSON_STRUCTURE_INSTANCE *Instance; > > + > > + if (This == NULL || RestJSonHeader == NULL) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + if (IsListEmpty (&mRestJsonStructureList)) { > > + return EFI_UNSUPPORTED; > > + } > > + Status = EFI_SUCCESS; > > + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode > > (&mRestJsonStructureList); > > + while (TRUE) { > > + Status = InterpreterInstanceDestoryJsonStruct ( > > + This, > > + Instance, > > + RestJSonHeader > > + ); > > + if (!EFI_ERROR (Status)) { > > + break; > > + } > > + if (IsNodeAtEnd(&mRestJsonStructureList, &Instance- > > >NextRestJsonStructureInstance)) { > > + Status = EFI_UNSUPPORTED; > > + break; > > + } > > + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode > > (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); > > + }; > > + return Status; > > +} > > + > > +/** > > + This function translates the given JSON C Structure to JSON text. > > + > > + @param[in] This EFI_REST_JSON_STRUCTURE_PROTOCOL > instance. > > + @param[in] RestJSonHeader Given Restful resource. > > + @param[out] ResourceRaw Resource in RESTfuls service oriented. > > + > > + @retval EFI_SUCCESS > > + @retval Others Fail to remove the entry > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RestJsonStructureToJson ( > > + IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This, > > + IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader, > > + OUT CHAR8 **ResourceRaw > > +) > > +{ > > + EFI_STATUS Status; > > + REST_JSON_STRUCTURE_INSTANCE *Instance; > > + > > + if (This == NULL || RestJSonHeader == NULL || ResourceRaw == NULL) { > > + return EFI_INVALID_PARAMETER; > > + } > > + > > + if (IsListEmpty (&mRestJsonStructureList)) { > > + return EFI_UNSUPPORTED; > > + } > > + Status = EFI_SUCCESS; > > + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode > > (&mRestJsonStructureList); > > + while (TRUE) { > > + Status = InterpreterEfiStructToInstance ( > > + This, > > + Instance, > > + RestJSonHeader, > > + ResourceRaw > > + ); > > + if (!EFI_ERROR (Status)) { > > + break; > > + } > > + if (IsNodeAtEnd(&mRestJsonStructureList, &Instance- > > >NextRestJsonStructureInstance)) { > > + Status = EFI_UNSUPPORTED; > > + break; > > + } > > + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode > > (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); > > + }; > > + return Status; > > +} > > + > > +EFI_REST_JSON_STRUCTURE_PROTOCOL mRestJsonStructureProtocol = { > > + RestJsonStructureRegister, > > + RestJsonStructureToStruct, > > + RestJsonStructureToJson, > > + RestJsonStructureDestroyStruct > > +}; > > + > > +/** > > + This is the declaration of an EFI image entry point. > > + > > + @param ImageHandle The firmware allocated handle for the UEFI > > image. > > + @param SystemTable A pointer to the EFI System Table. > > + > > + @retval EFI_SUCCESS The operation completed successfully. > > + @retval Others An unexpected error occurred. > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RestJsonStructureEntryPoint ( > > + IN EFI_HANDLE ImageHandle, > > + IN EFI_SYSTEM_TABLE *SystemTable > > + ) > > +{ > > + EFI_STATUS Status; > > + > > + InitializeListHead (&mRestJsonStructureList); > > + // > > + // Install the Restful Resource Interpreter Protocol. > > + // > > + mProtocolHandle = NULL; > > + Status = gBS->InstallProtocolInterface ( > > + &mProtocolHandle, > > + &gEfiRestJsonStructureProtocolGuid, > > + EFI_NATIVE_INTERFACE, > > + (VOID *)&mRestJsonStructureProtocol > > + ); > > + return Status; > > +} > > + > > +/** > > + This is the unload handle for Redfish discover module. > > + > > + Disconnect the driver specified by ImageHandle from all the devices > > + in the > > handle database. > > + Uninstall all the protocols installed in the driver entry point. > > + > > + @param[in] ImageHandle The drivers' driver image. > > + > > + @retval EFI_SUCCESS The image is unloaded. > > + @retval Others Failed to unload the image. > > + > > +**/ > > +EFI_STATUS > > +EFIAPI > > +RestJsonStructureUnload ( > > + IN EFI_HANDLE ImageHandle > > + ) > > +{ > > + EFI_STATUS Status; > > + REST_JSON_STRUCTURE_INSTANCE *Instance; > > + REST_JSON_STRUCTURE_INSTANCE *NextInstance; > > + > > + if (IsListEmpty (&mRestJsonStructureList)) { > > + return EFI_SUCCESS; > > + } > We still need to uninstall REST Json Structure Protocol when list is empty, > right? The protocol is installed on driver entry when list is empty. [Chang, Abner] Thanks for catching this. That issue is fixed in V4 (just sent) of patches set. Abner > > > + // > > + // Free memory of REST_JSON_STRUCTURE_INSTANCE instance. > > + // > > + Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode > > (&mRestJsonStructureList); > > + do { > > + NextInstance = NULL; > > + if (!IsNodeAtEnd(&mRestJsonStructureList, &Instance- > > >NextRestJsonStructureInstance)) { > > + NextInstance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode > > (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance); > > + } > > + FreePool ((VOID *)Instance); > > + Instance = NextInstance; > > + } while (Instance != NULL); > > + > > + Status = gBS->UninstallProtocolInterface ( > > + mProtocolHandle, > > + &gEfiRestJsonStructureProtocolGuid, > > + (VOID *)&mRestJsonStructureProtocol > > + ); > > + return Status; > > +} > > diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf > > b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf > > new file mode 100644 > > index 0000000000..2ab1e3bc45 > > --- /dev/null > > +++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf > > @@ -0,0 +1,40 @@ > > +## @file > > +# Implementation of EFI REST JSON Structure Protocol. > > +# > > +# (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> # > > +SPDX-License-Identifier: BSD-2-Clause-Patent # ## > > + > > +[Defines] > > + INF_VERSION = 0x00010005 > > + BASE_NAME = RestJsonStructureDxe > > + FILE_GUID = 83FAAFBF-FC4B-469F-892A-798E66A6F50A > > + MODULE_TYPE = DXE_DRIVER > > + VERSION_STRING = 1.0 > > + ENTRY_POINT = RestJsonStructureEntryPoint > > + UNLOAD_IMAGE = RestJsonStructureUnload > > + > > +[Packages] > > + MdePkg/MdePkg.dec > > + MdeModulePkg/MdeModulePkg.dec > > + RedfishPkg/RedfishPkg.dec > > + > > +[Sources] > > + RestJsonStructureDxe.c > > + RestJsonStructureInternal.h > > + > > +[LibraryClasses] > > + BaseLib > > + BaseMemoryLib > > + MemoryAllocationLib > > + UefiBootServicesTableLib > > + UefiDriverEntryPoint > > + UefiLib > > + > > +[Protocols] > > + gEfiRestJsonStructureProtocolGuid ## Producing > > + > > +[Depex] > > + TRUE > > + > > diff --git > > a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h > > b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h > > new file mode 100644 > > index 0000000000..e8a3408404 > > --- /dev/null > > +++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h > > @@ -0,0 +1,33 @@ > > +/** @file > > + The internal definitions of EFI REST Resource JSON to C structure > > +convertor > > + Protocol. > > + > > + (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> > > + > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > + > > +**/ > > + > > +#ifndef EFI_REST_JSON_STRUCTURE_INTERNAL_H_ > > +#define EFI_REST_JSON_STRUCTURE_INTERNAL_H_ > > + > > +#include <Library/BaseLib.h> > > +#include <Library/UefiLib.h> > > +#include <Library/UefiBootServicesTableLib.h> > > +#include <Library/UefiDriverEntryPoint.h> #include > > +<Library/BaseMemoryLib.h> #include <Library/MemoryAllocationLib.h> > > + > > +/// > > +/// Internal structure to maintain the information of JSON to /// C > > +structure convertor. > > +/// > > +typedef struct _REST_JSON_STRUCTURE_INSTANCE { > > + LIST_ENTRY NextRestJsonStructureInstance; ///< Next convertor > instance > > + UINTN NumberOfNameSpaceToConvert; ///< Number of resource > > type this convertor supports. > > + EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER > > *SupportedRsrcIndentifier; ///< The resource type linklist > > + EFI_REST_JSON_STRUCTURE_TO_STRUCTURE JsonToStructure; > > ///< JSON to C structure function > > + EFI_REST_JSON_STRUCTURE_TO_JSON StructureToJson; ///< > C > > structure to JSON function > > + EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE DestroyStructure; > > ///< Destory C struture function. > > +} REST_JSON_STRUCTURE_INSTANCE; > > +#endif > > -- > > 2.17.1 ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2020-10-30 1:37 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-10-15 15:33 [RestJsonStructureDxe PATCH v3 0/3] EFI REST JSON Structure Protocol Abner Chang 2020-10-15 15:33 ` [RestJsonStructureDxe PATCH v3 1/3] MdePkg/Include: Definitions of " Abner Chang 2020-10-15 15:33 ` [RestJsonStructureDxe PATCH v3 2/3] RedfishPkg/RestJsonStructureDxe: " Abner Chang 2020-10-15 15:33 ` [RestJsonStructureDxe PATCH v3 3/3] RedfishPkg: Changes on RedfishPkg for CI test Abner Chang -- strict thread matches above, loose matches on Subject: below -- 2020-10-15 15:49 [RestJsonStructureDxe PATCH v3 0/3] EFI REST JSON Structure Protocol Abner Chang 2020-10-15 15:49 ` [RestJsonStructureDxe PATCH v3 2/3] RedfishPkg/RestJsonStructureDxe: " Abner Chang 2020-10-29 6:57 ` Nickle Wang 2020-10-30 1:37 ` Abner Chang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox