--- /dev/null
+/** @file\r
+ This file defines the Redfish debug library interface.\r
+\r
+ Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\r
+\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#ifndef REDFISH_DEBUG_LIB_H_\r
+#define REDFISH_DEBUG_LIB_H_\r
+\r
+#include <Uefi.h>\r
+#include <Library/JsonLib.h>\r
+#include <Library/RedfishLib.h>\r
+\r
+#define DEBUG_REDFISH_NETWORK DEBUG_INFO ///< Debug error level for Redfish networking function\r
+\r
+/**\r
+\r
+ This function dump the Json string in given error level.\r
+\r
+ @param[in] ErrorLevel DEBUG macro error level\r
+ @param[in] JsonValue Json value to dump.\r
+\r
+ @retval EFI_SUCCESS Json string is printed.\r
+ @retval Others Errors occur.\r
+\r
+**/\r
+EFI_STATUS\r
+DumpJsonValue (\r
+ IN UINTN ErrorLevel,\r
+ IN EDKII_JSON_VALUE JsonValue\r
+ );\r
+\r
+/**\r
+\r
+ This function dump the status code, header and body in given\r
+ Redfish payload.\r
+\r
+ @param[in] ErrorLevel DEBUG macro error level\r
+ @param[in] Payload Redfish payload to dump\r
+\r
+ @retval EFI_SUCCESS Redfish payload is printed.\r
+ @retval Others Errors occur.\r
+\r
+**/\r
+EFI_STATUS\r
+DumpRedfishPayload (\r
+ IN UINTN ErrorLevel,\r
+ IN REDFISH_PAYLOAD Payload\r
+ );\r
+\r
+/**\r
+\r
+ This function dump the status code, header and body in given\r
+ Redfish response.\r
+\r
+ @param[in] Message Message string\r
+ @param[in] ErrorLevel DEBUG macro error level\r
+ @param[in] Response Redfish response to dump\r
+\r
+ @retval EFI_SUCCESS Redfish response is printed.\r
+ @retval Others Errors occur.\r
+\r
+**/\r
+EFI_STATUS\r
+DumpRedfishResponse (\r
+ IN CONST CHAR8 *Message,\r
+ IN UINTN ErrorLevel,\r
+ IN REDFISH_RESPONSE *Response\r
+ );\r
+\r
+/**\r
+\r
+ This function dump the HTTP status code.\r
+\r
+ @param[in] ErrorLevel DEBUG macro error level\r
+ @param[in] HttpStatusCode HTTP status code\r
+\r
+ @retval EFI_SUCCESS HTTP status code is printed\r
+\r
+**/\r
+EFI_STATUS\r
+DumpHttpStatusCode (\r
+ IN UINTN ErrorLevel,\r
+ IN EFI_HTTP_STATUS_CODE HttpStatusCode\r
+ );\r
+\r
+#endif\r
--- /dev/null
+/** @file\r
+ Redfish debug library to debug Redfish application.\r
+\r
+ Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\r
+\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include <Uefi.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/RedfishDebugLib.h>\r
+#include <Library/UefiLib.h>\r
+\r
+#ifndef IS_EMPTY_STRING\r
+#define IS_EMPTY_STRING(a) ((a) == NULL || (a)[0] == '\0')\r
+#endif\r
+\r
+#define REDFISH_JSON_STRING_LENGTH 200\r
+#define REDFISH_JSON_OUTPUT_FORMAT (EDKII_JSON_COMPACT | EDKII_JSON_INDENT(2))\r
+\r
+/**\r
+\r
+ This function dump the Json string in given error level.\r
+\r
+ @param[in] ErrorLevel DEBUG macro error level\r
+ @param[in] JsonValue Json value to dump.\r
+\r
+ @retval EFI_SUCCESS Json string is printed.\r
+ @retval Others Errors occur.\r
+\r
+**/\r
+EFI_STATUS\r
+DumpJsonValue (\r
+ IN UINTN ErrorLevel,\r
+ IN EDKII_JSON_VALUE JsonValue\r
+ )\r
+{\r
+ CHAR8 *String;\r
+ CHAR8 *Runner;\r
+ CHAR8 Buffer[REDFISH_JSON_STRING_LENGTH + 1];\r
+ UINTN StrLen;\r
+ UINTN Count;\r
+ UINTN Index;\r
+\r
+ if (JsonValue == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ String = JsonDumpString (JsonValue, REDFISH_JSON_OUTPUT_FORMAT);\r
+ if (String == NULL) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ StrLen = AsciiStrLen (String);\r
+ if (StrLen == 0) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ Count = StrLen / REDFISH_JSON_STRING_LENGTH;\r
+ Runner = String;\r
+ for (Index = 0; Index < Count; Index++) {\r
+ AsciiStrnCpyS (Buffer, (REDFISH_JSON_STRING_LENGTH + 1), Runner, REDFISH_JSON_STRING_LENGTH);\r
+ Buffer[REDFISH_JSON_STRING_LENGTH] = '\0';\r
+ DEBUG ((ErrorLevel, "%a", Buffer));\r
+ Runner += REDFISH_JSON_STRING_LENGTH;\r
+ }\r
+\r
+ Count = StrLen % REDFISH_JSON_STRING_LENGTH;\r
+ if (Count > 0) {\r
+ DEBUG ((ErrorLevel, "%a", Runner));\r
+ }\r
+\r
+ DEBUG ((ErrorLevel, "\n"));\r
+\r
+ FreePool (String);\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+\r
+ This function dump the status code, header and body in given\r
+ Redfish payload.\r
+\r
+ @param[in] ErrorLevel DEBUG macro error level\r
+ @param[in] Payload Redfish payload to dump\r
+\r
+ @retval EFI_SUCCESS Redfish payload is printed.\r
+ @retval Others Errors occur.\r
+\r
+**/\r
+EFI_STATUS\r
+DumpRedfishPayload (\r
+ IN UINTN ErrorLevel,\r
+ IN REDFISH_PAYLOAD Payload\r
+ )\r
+{\r
+ EDKII_JSON_VALUE JsonValue;\r
+\r
+ if (Payload == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ JsonValue = RedfishJsonInPayload (Payload);\r
+ if (JsonValue != NULL) {\r
+ DEBUG ((ErrorLevel, "Payload:\n"));\r
+ DumpJsonValue (ErrorLevel, JsonValue);\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+\r
+ This function dump the HTTP status code.\r
+\r
+ @param[in] ErrorLevel DEBUG macro error level\r
+ @param[in] HttpStatusCode HTTP status code\r
+\r
+ @retval EFI_SUCCESS HTTP status code is printed\r
+\r
+**/\r
+EFI_STATUS\r
+DumpHttpStatusCode (\r
+ IN UINTN ErrorLevel,\r
+ IN EFI_HTTP_STATUS_CODE HttpStatusCode\r
+ )\r
+{\r
+ switch (HttpStatusCode) {\r
+ case HTTP_STATUS_100_CONTINUE:\r
+ DEBUG ((ErrorLevel, "Status code: 100 CONTINUE\n"));\r
+ break;\r
+ case HTTP_STATUS_200_OK:\r
+ DEBUG ((ErrorLevel, "Status code: 200 OK\n"));\r
+ break;\r
+ case HTTP_STATUS_201_CREATED:\r
+ DEBUG ((ErrorLevel, "Status code: 201 CREATED\n"));\r
+ break;\r
+ case HTTP_STATUS_202_ACCEPTED:\r
+ DEBUG ((ErrorLevel, "Status code: 202 ACCEPTED\n"));\r
+ break;\r
+ case HTTP_STATUS_304_NOT_MODIFIED:\r
+ DEBUG ((ErrorLevel, "Status code: 304 NOT MODIFIED\n"));\r
+ break;\r
+ case HTTP_STATUS_400_BAD_REQUEST:\r
+ DEBUG ((ErrorLevel, "Status code: 400 BAD REQUEST\n"));\r
+ break;\r
+ case HTTP_STATUS_401_UNAUTHORIZED:\r
+ DEBUG ((ErrorLevel, "Status code: 401 UNAUTHORIZED\n"));\r
+ break;\r
+ case HTTP_STATUS_403_FORBIDDEN:\r
+ DEBUG ((ErrorLevel, "Status code: 403 FORBIDDEN\n"));\r
+ break;\r
+ case HTTP_STATUS_404_NOT_FOUND:\r
+ DEBUG ((ErrorLevel, "Status code: 404 NOT FOUND\n"));\r
+ break;\r
+ case HTTP_STATUS_405_METHOD_NOT_ALLOWED:\r
+ DEBUG ((ErrorLevel, "Status code: 405 METHOD NOT ALLOWED\n"));\r
+ break;\r
+ case HTTP_STATUS_500_INTERNAL_SERVER_ERROR:\r
+ DEBUG ((ErrorLevel, "Status code: 500 INTERNAL SERVER ERROR\n"));\r
+ break;\r
+ default:\r
+ DEBUG ((ErrorLevel, "Status code: 0x%x\n", HttpStatusCode));\r
+ break;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+\r
+ This function dump the status code, header and body in given\r
+ Redfish response.\r
+\r
+ @param[in] Message Message string\r
+ @param[in] ErrorLevel DEBUG macro error level\r
+ @param[in] Response Redfish response to dump\r
+\r
+ @retval EFI_SUCCESS Redfish response is printed.\r
+ @retval Others Errors occur.\r
+\r
+**/\r
+EFI_STATUS\r
+DumpRedfishResponse (\r
+ IN CONST CHAR8 *Message,\r
+ IN UINTN ErrorLevel,\r
+ IN REDFISH_RESPONSE *Response\r
+ )\r
+{\r
+ UINTN Index;\r
+\r
+ if (Response == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if (!IS_EMPTY_STRING (Message)) {\r
+ DEBUG ((ErrorLevel, "%a\n", Message));\r
+ }\r
+\r
+ //\r
+ // status code\r
+ //\r
+ if (Response->StatusCode != NULL) {\r
+ DumpHttpStatusCode (ErrorLevel, *(Response->StatusCode));\r
+ }\r
+\r
+ //\r
+ // header\r
+ //\r
+ if (Response->HeaderCount > 0) {\r
+ DEBUG ((ErrorLevel, "Header: %d\n", Response->HeaderCount));\r
+ for (Index = 0; Index < Response->HeaderCount; Index++) {\r
+ DEBUG ((ErrorLevel, " %a: %a\n", Response->Headers[Index].FieldName, Response->Headers[Index].FieldValue));\r
+ }\r
+ }\r
+\r
+ //\r
+ // Body\r
+ //\r
+ if (Response->Payload != NULL) {\r
+ DumpRedfishPayload (ErrorLevel, Response->Payload);\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
--- /dev/null
+## @file\r
+# INF file for Redfish debug library.\r
+#\r
+# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\r
+#\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
+#\r
+##\r
+\r
+[Defines]\r
+ INF_VERSION = 0x00010006\r
+ BASE_NAME = RedfishDebugLib\r
+ FILE_GUID = 7F64C79F-ABD0-4446-86B5-2C1AE36168AD\r
+ MODULE_TYPE = DXE_DRIVER\r
+ VERSION_STRING = 1.0\r
+ LIBRARY_CLASS = RedfishDebugLib| DXE_DRIVER UEFI_DRIVER\r
+\r
+#\r
+# VALID_ARCHITECTURES = IA32 X64 EBC\r
+#\r
+\r
+[Sources]\r
+ RedfishDebugLib.c\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+ MdeModulePkg/MdeModulePkg.dec\r
+ RedfishPkg/RedfishPkg.dec\r
+\r
+[LibraryClasses]\r
+ BaseLib\r
+ DebugLib\r
+ JsonLib\r
+ MemoryAllocationLib\r
+ RedfishLib\r
+ UefiLib\r
+\r
+[Depex]\r
+ TRUE\r
# of EDKII network library classes.\r
#\r
# (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>\r
+# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\r
#\r
# SPDX-License-Identifier: BSD-2-Clause-Patent\r
#\r
RedfishCrtLib|RedfishPkg/PrivateLibrary/RedfishCrtLib/RedfishCrtLib.inf\r
JsonLib|RedfishPkg/Library/JsonLib/JsonLib.inf\r
RedfishLib|RedfishPkg/PrivateLibrary/RedfishLib/RedfishLib.inf\r
+ RedfishDebugLib|RedfishPkg/Library/RedfishDebugLib/RedfishDebugLib.inf\r
!endif\r
\r
# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>\r
# (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>\r
# Copyright (c) 2023, American Megatrends International LLC.\r
+# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\r
#\r
# SPDX-License-Identifier: BSD-2-Clause-Patent\r
##\r
#\r
RedfishContentCodingLib|Include/Library/RedfishContentCodingLib.h\r
\r
+ ## @libraryclass Redfish Debug Library\r
+ # Library provides Redfish debug functions.\r
+ RedfishDebugLib|Include/Library/RedfishDebugLib.h\r
+\r
[LibraryClasses.Common.Private]\r
## @libraryclass Provides the private C runtime library functions.\r
# CRT library is currently used by edk2 JsonLib (open source\r
RedfishPkg/PrivateLibrary/RedfishCrtLib/RedfishCrtLib.inf\r
RedfishPkg/Library/JsonLib/JsonLib.inf\r
RedfishPkg/PrivateLibrary/RedfishLib/RedfishLib.inf\r
+ RedfishPkg/Library/RedfishDebugLib/RedfishDebugLib.inf\r
\r
!include RedfishPkg/Redfish.dsc.inc\r
# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>\r
# (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>\r
# Copyright (c) 2023, American Megatrends International LLC.\r
+# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\r
#\r
# SPDX-License-Identifier: BSD-2-Clause-Patent\r
#\r
PrintLib\r
MemoryAllocationLib\r
NetLib\r
+ RedfishDebugLib\r
UefiLib\r
UefiBootServicesTableLib\r
UefiDriverEntryPoint\r
\r
Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>\r
(C) Copyright 2019-2020 Hewlett Packard Enterprise Development LP<BR>\r
+ Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\r
\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
#include <Library/HttpIoLib.h>\r
#include <Library/MemoryAllocationLib.h>\r
#include <Library/NetLib.h>\r
+#include <Library/RedfishDebugLib.h>\r
#include <Library/UefiLib.h>\r
#include <Library/UefiBootServicesTableLib.h>\r
#include <Library/UefiDriverEntryPoint.h>\r
Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>\r
(C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>\r
Copyright (c) 2023, American Megatrends International LLC.\r
+ Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\r
\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
MediaPresent = TRUE;\r
NetLibDetectMedia (Instance->Service->ControllerHandle, &MediaPresent);\r
if (!MediaPresent) {\r
- DEBUG ((DEBUG_INFO, "RedfishRestExSendReceive(): No MediaPresent.\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "RedfishRestExSendReceive(): No MediaPresent.\n"));\r
return EFI_NO_MEDIA;\r
}\r
\r
- DEBUG ((DEBUG_INFO, "\nRedfishRestExSendReceive():\n"));\r
- DEBUG ((DEBUG_INFO, "*** Perform HTTP Request Method - %d, URL: %s\n", RequestMessage->Data.Request->Method, RequestMessage->Data.Request->Url));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "\nRedfishRestExSendReceive():\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "*** Perform HTTP Request Method - %d, URL: %s\n", RequestMessage->Data.Request->Method, RequestMessage->Data.Request->Url));\r
\r
if (FixedPcdGetBool (PcdRedfishRestExChunkRequestMode)) {\r
//\r
goto ON_EXIT;\r
}\r
\r
- DEBUG ((DEBUG_INFO, "Receiving HTTP response and headers...\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "Receiving HTTP response and headers...\n"));\r
Status = RedfishCheckHttpReceiveStatus (\r
Instance,\r
HttpIoRecvResponse (\r
RequestMessage->HeaderCount--; // Minus one header count for "Expect".\r
}\r
\r
- DEBUG ((DEBUG_INFO, "HTTP Response StatusCode - %d:", ResponseData->Response.StatusCode));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "HTTP Response StatusCode - %d:", ResponseData->Response.StatusCode));\r
if (ResponseData->Response.StatusCode == HTTP_STATUS_200_OK) {\r
- DEBUG ((DEBUG_INFO, "HTTP_STATUS_200_OK\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "HTTP_STATUS_200_OK\n"));\r
\r
if (FixedPcdGetBool (PcdRedfishRestExChunkRequestMode) && (SendChunkProcess == HttpIoSendChunkHeaderZeroContent)) {\r
- DEBUG ((DEBUG_INFO, "This is chunk transfer, start to send all chunks - %d.", ResponseData->Response.StatusCode));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "This is chunk transfer, start to send all chunks - %d.", ResponseData->Response.StatusCode));\r
SendChunkProcess++;\r
goto ReSendRequest;\r
}\r
} else if (ResponseData->Response.StatusCode == HTTP_STATUS_202_ACCEPTED) {\r
DEBUG ((DEBUG_INFO, "HTTP_STATUS_202_ACCEPTED\n"));\r
} else if (ResponseData->Response.StatusCode == HTTP_STATUS_413_REQUEST_ENTITY_TOO_LARGE) {\r
- DEBUG ((DEBUG_INFO, "HTTP_STATUS_413_REQUEST_ENTITY_TOO_LARGE\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "HTTP_STATUS_413_REQUEST_ENTITY_TOO_LARGE\n"));\r
\r
Status = EFI_BAD_BUFFER_SIZE;\r
goto ON_EXIT;\r
Status = EFI_ACCESS_DENIED;\r
goto ON_EXIT;\r
} else if (ResponseData->Response.StatusCode == HTTP_STATUS_400_BAD_REQUEST) {\r
- DEBUG ((DEBUG_INFO, "HTTP_STATUS_400_BAD_REQUEST\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "HTTP_STATUS_400_BAD_REQUEST\n"));\r
if (FixedPcdGetBool (PcdRedfishRestExChunkRequestMode) && (SendChunkProcess == HttpIoSendChunkHeaderZeroContent)) {\r
- DEBUG ((DEBUG_INFO, "Bad request may caused by zero length chunk. Try to send all chunks...\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "Bad request may caused by zero length chunk. Try to send all chunks...\n"));\r
SendChunkProcess++;\r
goto ReSendRequest;\r
}\r
} else if (ResponseData->Response.StatusCode == HTTP_STATUS_100_CONTINUE) {\r
- DEBUG ((DEBUG_INFO, "HTTP_STATUS_100_CONTINUE\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "HTTP_STATUS_100_CONTINUE\n"));\r
if (FixedPcdGetBool (PcdRedfishRestExChunkRequestMode) && (SendChunkProcess == HttpIoSendChunkHeaderZeroContent)) {\r
//\r
// We get HTTP_STATUS_100_CONTINUE to send the body using chunk transfer.\r
//\r
- DEBUG ((DEBUG_INFO, "HTTP_STATUS_100_CONTINUE for chunk transfer...\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "HTTP_STATUS_100_CONTINUE for chunk transfer...\n"));\r
SendChunkProcess++;\r
goto ReSendRequest;\r
}\r
\r
if (FixedPcdGetBool (PcdRedfishRestExChunkRequestMode) && (SendNonChunkProcess == HttpIoSendNonChunkHeaderZeroContent)) {\r
- DEBUG ((DEBUG_INFO, "HTTP_STATUS_100_CONTINUE for non chunk transfer...\n"));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "HTTP_STATUS_100_CONTINUE for non chunk transfer...\n"));\r
SendNonChunkProcess++;\r
goto ReSendRequest;\r
}\r
}\r
} else {\r
DEBUG ((DEBUG_ERROR, "This HTTP Status is not handled!\n"));\r
+ DumpHttpStatusCode (DEBUG_REDFISH_NETWORK, ResponseData->Response.StatusCode);\r
Status = EFI_UNSUPPORTED;\r
goto ON_EXIT;\r
}\r
TotalReceivedSize += ResponseData->BodyLength;\r
}\r
\r
- DEBUG ((DEBUG_INFO, "Total of length of Response :%d\n", TotalReceivedSize));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "Total of length of Response :%d\n", TotalReceivedSize));\r
}\r
\r
- DEBUG ((DEBUG_INFO, "RedfishRestExSendReceive()- EFI_STATUS: %r\n", Status));\r
+ DEBUG ((DEBUG_REDFISH_NETWORK, "RedfishRestExSendReceive()- EFI_STATUS: %r\n", Status));\r
\r
ON_EXIT:\r
\r