--- /dev/null
+/** @file\r
+ Definitions for the web server.\r
+\r
+ Copyright (c) 2011, Intel Corporation\r
+ All rights reserved. This program and the accompanying materials\r
+ are licensed and made available under the terms and conditions of the BSD License\r
+ which accompanies this distribution. The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _WEB_SERVER_H_\r
+#define _WEB_SERVER_H_\r
+\r
+#include <errno.h>\r
+#include <Uefi.h>\r
+\r
+#include <Guid/EventGroup.h>\r
+\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/PcdLib.h>\r
+#include <Library/UefiApplicationEntryPoint.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Protocol/BlockIo.h>\r
+\r
+#include <netinet/in.h>\r
+\r
+#include <sys/EfiSysCall.h>\r
+#include <sys/poll.h>\r
+#include <sys/socket.h>\r
+\r
+#pragma warning ( disable : 4054 )\r
+#pragma warning ( disable : 4152 )\r
+\r
+//------------------------------------------------------------------------------\r
+// Pages\r
+//------------------------------------------------------------------------------\r
+\r
+#define PAGE_ACPI_DSDT L"/DSDT"\r
+#define PAGE_ACPI_FADT L"/FADT"\r
+#define PAGE_ACPI_RSDP_10B L"/RSDP1.0b"\r
+#define PAGE_ACPI_RSDP_30 L"/RSDP3.0"\r
+#define PAGE_ACPI_RSDT L"/RSDT"\r
+#define PAGE_BOOT_SERVICES_TABLE L"/BootServicesTable"\r
+#define PAGE_CONFIGURATION_TABLE L"/ConfigurationTable"\r
+#define PAGE_DXE_SERVICES_TABLE L"/DxeServicesTable"\r
+#define PAGE_RUNTIME_SERVICES_TABLE L"/RuntimeServicesTable"\r
+\r
+//------------------------------------------------------------------------------\r
+// Signatures\r
+//------------------------------------------------------------------------------\r
+\r
+#define DSDT_SIGNATURE 0x54445344\r
+#define FADT_SIGNATURE 0x50434146\r
+\r
+//------------------------------------------------------------------------------\r
+// Macros\r
+//------------------------------------------------------------------------------\r
+\r
+#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */\r
+#define DBG_ENTER() DEBUG (( DEBUG_INFO, "Entering " __FUNCTION__ "\n" )) ///< Display routine entry\r
+#define DBG_EXIT() DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ "\n" )) ///< Display routine exit\r
+#define DBG_EXIT_DEC(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: %d\n", Status )) ///< Display routine exit with decimal value\r
+#define DBG_EXIT_HEX(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: 0x%08x\n", Status )) ///< Display routine exit with hex value\r
+#define DBG_EXIT_STATUS(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: %r\n", Status )) ///< Display routine exit with status value\r
+#define DBG_EXIT_TF(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", returning %s\n", (FALSE == Status) ? L"FALSE" : L"TRUE" )) ///< Display routine with TRUE/FALSE value\r
+#else // _MSC_VER\r
+#define DBG_ENTER()\r
+#define DBG_EXIT()\r
+#define DBG_EXIT_DEC(Status)\r
+#define DBG_EXIT_HEX(Status)\r
+#define DBG_EXIT_STATUS(Status)\r
+#define DBG_EXIT_TF(Status)\r
+#endif // _MSC_VER\r
+\r
+#define DIM(x) ( sizeof ( x ) / sizeof ( x[0] )) ///< Compute the number of entries in an array\r
+\r
+//------------------------------------------------------------------------------\r
+// Constants\r
+//------------------------------------------------------------------------------\r
+\r
+#define DEBUG_SOCKET_POLL 0x00080000 ///< Display the socket poll messages\r
+#define DEBUG_PORT_WORK 0x00040000 ///< Display the port work messages\r
+#define DEBUG_SERVER_TIMER 0x00020000 ///< Display the socket poll messages\r
+#define DEBUG_HTTP_PORT 0x00010000 ///< Display HTTP port related messages\r
+#define DEBUG_REQUEST 0x00008000 ///< Display the HTTP request messages\r
+\r
+#define HTTP_PORT_POLL_DELAY ( 2 * 1000 ) ///< Delay in milliseconds for attempts to open the HTTP port\r
+#define CLIENT_POLL_DELAY 50 ///< Delay in milliseconds between client polls\r
+\r
+#define TPL_WEB_SERVER TPL_CALLBACK ///< TPL for routine synchronization\r
+\r
+/**\r
+ Verify new TPL value\r
+\r
+ This macro which is enabled when debug is enabled verifies that\r
+ the new TPL value is >= the current TPL value.\r
+**/\r
+#ifdef VERIFY_TPL\r
+#undef VERIFY_TPL\r
+#endif // VERIFY_TPL\r
+\r
+#if !defined(MDEPKG_NDEBUG)\r
+\r
+#define VERIFY_TPL(tpl) \\r
+{ \\r
+ EFI_TPL PreviousTpl; \\r
+ \\r
+ PreviousTpl = gBS->RaiseTPL ( TPL_HIGH_LEVEL ); \\r
+ gBS->RestoreTPL ( PreviousTpl ); \\r
+ if ( PreviousTpl > tpl ) { \\r
+ DEBUG (( DEBUG_ERROR, "Current TPL: %d, New TPL: %d\r\n", PreviousTpl, tpl )); \\r
+ ASSERT ( PreviousTpl <= tpl ); \\r
+ } \\r
+}\r
+\r
+#else // MDEPKG_NDEBUG\r
+\r
+#define VERIFY_TPL(tpl)\r
+\r
+#endif // MDEPKG_NDEBUG\r
+\r
+#define WEB_SERVER_SIGNATURE SIGNATURE_32('W','e','b','S') ///< DT_WEB_SERVER memory signature\r
+\r
+#define SPACES_ADDRESS_TO_DATA 2\r
+#define BYTES_ON_A_LINE 16\r
+#define SPACES_BETWEEN_BYTES 1\r
+#define SPACES_DATA_TO_ASCII 2\r
+\r
+\r
+//------------------------------------------------------------------------------\r
+// Protocol Declarations\r
+//------------------------------------------------------------------------------\r
+\r
+extern EFI_COMPONENT_NAME_PROTOCOL gComponentName; ///< Component name protocol declaration\r
+extern EFI_COMPONENT_NAME2_PROTOCOL gComponentName2; ///< Component name 2 protocol declaration\r
+extern EFI_DRIVER_BINDING_PROTOCOL gDriverBinding; ///< Driver binding protocol declaration\r
+\r
+//------------------------------------------------------------------------------\r
+// Data Types\r
+//------------------------------------------------------------------------------\r
+\r
+/**\r
+ Port control structure\r
+**/\r
+typedef struct {\r
+ //\r
+ // Buffer management\r
+ //\r
+ size_t RequestLength; ///< Request length in bytes\r
+ size_t TxBytes; ///< Bytes in the TX buffer\r
+ UINT8 Request [ 65536 ]; ///< Page request\r
+ UINT8 RxBuffer [ 65536 ]; ///< Receive buffer\r
+ UINT8 TxBuffer [ 65536 ]; ///< Transmit buffer\r
+} WSDT_PORT;\r
+\r
+/**\r
+ Web server control structure\r
+**/\r
+typedef struct {\r
+ UINTN Signature; ///< Structure identification\r
+\r
+ //\r
+ // Image attributes\r
+ //\r
+ EFI_HANDLE ImageHandle; ///< Image handle\r
+\r
+ //\r
+ // HTTP port management\r
+ //\r
+ BOOLEAN bTimerRunning; ///< Port creation timer status\r
+ EFI_EVENT TimerEvent; ///< Timer to open HTTP port\r
+ int HttpListenPort; ///< File descriptor for the HTTP listen port\r
+\r
+ //\r
+ // Client port management\r
+ //\r
+ nfds_t MaxEntries; ///< Maximum entries in the PortList array\r
+ nfds_t Entries; ///< The current number of entries in the PortList array\r
+ struct pollfd * pFdList; ///< List of socket file descriptors\r
+ WSDT_PORT ** ppPortList; ///< List of port management structures\r
+} DT_WEB_SERVER;\r
+\r
+//#define SERVER_FROM_SERVICE(a) CR(a, DT_WEB_SERVER, ServiceBinding, WEB_SERVER_SIGNATURE) ///< Locate DT_LAYER from service binding\r
+\r
+extern DT_WEB_SERVER mWebServer;\r
+\r
+/**\r
+ Process an HTTP request\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(* PFN_RESPONSE) (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Data structure to delcare page support routines\r
+**/\r
+typedef struct {\r
+ UINT16 * pPageName; ///< Name of the page\r
+ PFN_RESPONSE pfnResponse; ///< Routine to generate the response\r
+ UINT16 * pDescription; ///< Description of the page\r
+} DT_PAGE;\r
+\r
+extern CONST DT_PAGE mPageList []; ///< List of pages\r
+extern CONST UINTN mPageCount; ///< Number of pages\r
+\r
+//------------------------------------------------------------------------------\r
+// Web Pages\r
+//------------------------------------------------------------------------------\r
+\r
+/**\r
+ Respond with the ACPI DSDT table\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+AcpiDsdtPage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Respond with the ACPI FADT table\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+AcpiFadtPage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Respond with the ACPI RSDP 1.0b table\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+AcpiRsdp10Page (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Respond with the ACPI RSDP 3.0 table\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+AcpiRsdp30Page (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Respond with the ACPI RSDT table\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+AcpiRsdtPage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Respond with the boot services table\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+BootServicesTablePage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Respond with the configuration tables\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+ConfigurationTablePage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Respond with the DHCP options\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+DhcpOptionsPage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Respond with the DXE services table\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+DxeServicesTablePage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Respond with the firmware status\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+FirmwarePage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Respond with the handles in the system\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+HandlePage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Respond with the Hello World page\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+HelloPage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Respond with the list of known pages\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+IndexPage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Page to reboot the system\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+RebootPage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Respond with the runtime services table\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+RuntimeSservicesTablePage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Respond with the system table\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+SystemTablePage (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN * pbDone\r
+ );\r
+\r
+//------------------------------------------------------------------------------\r
+// Support routines\r
+//------------------------------------------------------------------------------\r
+\r
+/**\r
+ Display the EFI Table Header\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] pHeader Address of the EFI_TABLE_HEADER structure\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+EfiTableHeader (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN EFI_TABLE_HEADER * pHeader\r
+ );\r
+\r
+/**\r
+ Buffer the HTTP page header\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] pTitle A zero terminated Unicode title string\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+HttpPageHeader (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN CONST CHAR16 * pTitle\r
+ );\r
+\r
+/**\r
+ Buffer and send the HTTP page trailer\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+HttpPageTrailer (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Process an HTTP request\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+HttpRequest (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN BOOLEAN * pbDone\r
+ );\r
+\r
+/**\r
+ Buffer data for sending\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] LengthInBytes Length of valid data in the buffer\r
+ @param [in] pBuffer Buffer of data to send\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+HttpSend (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN size_t LengthInBytes,\r
+ IN CONST UINT8 * pBuffer\r
+ );\r
+\r
+/**\r
+ Send an ANSI string\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] pString A zero terminated Unicode string\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+HttpSendAnsiString (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN CONST char * pString\r
+ );\r
+\r
+/**\r
+ Buffer a single byte\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] Data The data byte to send\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+HttpSendByte (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN UINT8 Data\r
+ );\r
+\r
+/**\r
+ Display a character\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] Character Character to display\r
+ @param [in] pReplacement Replacement character string\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+HttpSendCharacter (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN CHAR8 Character,\r
+ IN CHAR8 * pReplacement\r
+ );\r
+\r
+/**\r
+ Send a buffer dump\r
+ \r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] ByteCount The number of bytes to display\r
+ @param [in] pData Address of the byte array\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+HttpSendDump (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN UINTN ByteCount,\r
+ IN CONST UINT8 * pData\r
+ );\r
+\r
+/**\r
+ Display a row containing a GUID value\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] pGuid Address of the GUID to display\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+HttpSendGuid (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN CONST EFI_GUID * pGuid\r
+ );\r
+\r
+/**\r
+ Output a hex value to the HTML page\r
+\r
+ @param [in] SocketFD Socket file descriptor\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] Bits Number of bits to display\r
+ @param [in] Value Value to display\r
+\r
+ @retval EFI_SUCCESS Successfully displayed the address\r
+**/\r
+EFI_STATUS\r
+HttpSendHexBits (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN INT32 Bits,\r
+ IN UINT64 Value\r
+ );\r
+\r
+/**\r
+ Output a hex value to the HTML page\r
+\r
+ @param [in] SocketFD Socket file descriptor\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] Value Value to display\r
+\r
+ @retval EFI_SUCCESS Successfully displayed the address\r
+**/\r
+EFI_STATUS\r
+HttpSendHexValue (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN UINT64 Value\r
+ );\r
+\r
+/**\r
+ Output an IP address to the HTML page\r
+\r
+ @param [in] SocketFD Socket file descriptor\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] pAddress Address of the socket address\r
+\r
+ @retval EFI_SUCCESS Successfully displayed the address\r
+**/\r
+EFI_STATUS\r
+HttpSendIpAddress (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN struct sockaddr_in * pAddress\r
+ );\r
+\r
+/**\r
+ Send a Unicode string\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] pString A zero terminated Unicode string\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+HttpSendUnicodeString (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN CONST UINT16 * pString\r
+ );\r
+\r
+/**\r
+ Output a value to the HTML page\r
+\r
+ @param [in] SocketFD Socket file descriptor\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] Value Value to display\r
+\r
+ @retval EFI_SUCCESS Successfully displayed the address\r
+**/\r
+EFI_STATUS\r
+HttpSendValue (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN UINT64 Value\r
+ );\r
+\r
+/**\r
+ Display a row containing a decimal value\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] pName Address of a zero terminated name string\r
+ @param [in] Value The value to display\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+RowDecimalValue (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN CONST CHAR8 * pName,\r
+ IN UINT64 Value\r
+ );\r
+\r
+/**\r
+ Display a row containing a GUID value\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] pName Address of a zero terminated name string\r
+ @param [in] pGuid Address of the GUID to display\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+RowGuid (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN CONST CHAR8 * pName,\r
+ IN CONST EFI_GUID * pGuid\r
+ );\r
+\r
+/**\r
+ Display a row containing a hex value\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] pName Address of a zero terminated name string\r
+ @param [in] Value The value to display\r
+ @param [in] pWebPage Address of a zero terminated web page name\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+RowHexValue (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN CONST CHAR8 * pName,\r
+ IN UINT64 Value,\r
+ IN CONST CHAR16 * pWebPage\r
+ );\r
+\r
+/**\r
+ Display a row containing a pointer\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] pName Address of a zero terminated name string\r
+ @param [in] pAddress The address to display\r
+ @param [in] pWebPage Address of a zero terminated web page name\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+RowPointer (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN CONST CHAR8 * pName,\r
+ IN CONST VOID * pAddress,\r
+ IN CONST CHAR16 * pWebPage\r
+ );\r
+\r
+/**\r
+ Display a row containing a revision\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] pName Address of a zero terminated name string\r
+ @param [in] Revision The revision to display\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+RowRevision (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN CONST CHAR8 * pName,\r
+ IN UINT32 Revision\r
+ );\r
+\r
+/**\r
+ Display a row containing a unicode string\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] pName Address of a zero terminated name string\r
+ @param [in] pString Address of a zero terminated unicode string\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+RowUnicodeString (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN CONST CHAR8 * pName,\r
+ IN CONST CHAR16 * pString\r
+ );\r
+\r
+/**\r
+ Start the table page\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [in] pName Address of a zero terminated name string\r
+ @param [in] pTable Address of the table\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+TableHeader (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ IN CONST CHAR16 * pName,\r
+ IN CONST VOID * pTable\r
+ );\r
+\r
+/**\r
+ End the table page\r
+\r
+ @param [in] SocketFD The socket's file descriptor to add to the list.\r
+ @param [in] pPort The WSDT_PORT structure address\r
+ @param [out] pbDone Address to receive the request completion status\r
+\r
+ @retval EFI_SUCCESS The request was successfully processed\r
+\r
+**/\r
+EFI_STATUS\r
+TableTrailer (\r
+ IN int SocketFD,\r
+ IN WSDT_PORT * pPort,\r
+ OUT BOOLEAN *pbDone\r
+ );\r
+\r
+/**\r
+ HTTP port creation timer routine\r
+\r
+ This routine polls the socket layer waiting for the initial network connection\r
+ which will enable the creation of the HTTP port. The socket layer will manage\r
+ the coming and going of the network connections after that until the last network\r
+ connection is broken.\r
+\r
+ @param [in] pWebServer The web server control structure address.\r
+\r
+**/\r
+VOID\r
+WebServerTimer (\r
+ IN DT_WEB_SERVER * pWebServer\r
+ );\r
+\r
+/**\r
+ Start the web server port creation timer\r
+\r
+ @param [in] pWebServer The web server control structure address.\r
+\r
+ @retval EFI_SUCCESS The timer was successfully started.\r
+ @retval EFI_ALREADY_STARTED The timer is already running.\r
+ @retval Other The timer failed to start.\r
+\r
+**/\r
+EFI_STATUS\r
+WebServerTimerStart (\r
+ IN DT_WEB_SERVER * pWebServer\r
+ );\r
+\r
+/**\r
+ Stop the web server port creation timer\r
+\r
+ @param [in] pWebServer The web server control structure address.\r
+\r
+ @retval EFI_SUCCESS The HTTP port timer is stopped\r
+ @retval Other Failed to stop the HTTP port timer\r
+\r
+**/\r
+EFI_STATUS\r
+WebServerTimerStop (\r
+ IN DT_WEB_SERVER * pWebServer\r
+ );\r
+\r
+//------------------------------------------------------------------------------\r
+// Driver Binding Protocol Support\r
+//------------------------------------------------------------------------------\r
+\r
+/**\r
+ Stop this driver on Controller by removing NetworkInterfaceIdentifier protocol and\r
+ closing the DevicePath and PciIo protocols on Controller.\r
+\r
+ @param [in] pThis Protocol instance pointer.\r
+ @param [in] Controller Handle of device to stop driver on.\r
+ @param [in] NumberOfChildren How many children need to be stopped.\r
+ @param [in] pChildHandleBuffer Not used.\r
+\r
+ @retval EFI_SUCCESS This driver is removed Controller.\r
+ @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error.\r
+ @retval other This driver was not removed from this device.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DriverStop (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL * pThis,\r
+ IN EFI_HANDLE Controller,\r
+ IN UINTN NumberOfChildren,\r
+ IN EFI_HANDLE * pChildHandleBuffer\r
+ );\r
+\r
+//------------------------------------------------------------------------------\r
+// EFI Component Name Protocol Support\r
+//------------------------------------------------------------------------------\r
+\r
+/**\r
+ Retrieves a Unicode string that is the user readable name of the driver.\r
+\r
+ This function retrieves the user readable name of a driver in the form of a\r
+ Unicode string. If the driver specified by This has a user readable name in\r
+ the language specified by Language, then a pointer to the driver name is\r
+ returned in DriverName, and EFI_SUCCESS is returned. If the driver specified\r
+ by This does not support the language specified by Language,\r
+ then EFI_UNSUPPORTED is returned.\r
+\r
+ @param [in] pThis A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
+ EFI_COMPONENT_NAME_PROTOCOL instance.\r
+ @param [in] pLanguage A pointer to a Null-terminated ASCII string\r
+ array indicating the language. This is the\r
+ language of the driver name that the caller is\r
+ requesting, and it must match one of the\r
+ languages specified in SupportedLanguages. The\r
+ number of languages supported by a driver is up\r
+ to the driver writer. Language is specified\r
+ in RFC 3066 or ISO 639-2 language code format.\r
+ @param [out] ppDriverName A pointer to the Unicode string to return.\r
+ This Unicode string is the name of the\r
+ driver specified by This in the language\r
+ specified by Language.\r
+\r
+ @retval EFI_SUCCESS The Unicode string for the Driver specified by\r
+ This and the language specified by Language was\r
+ returned in DriverName.\r
+ @retval EFI_INVALID_PARAMETER Language is NULL.\r
+ @retval EFI_INVALID_PARAMETER DriverName is NULL.\r
+ @retval EFI_UNSUPPORTED The driver specified by This does not support\r
+ the language specified by Language.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetDriverName (\r
+ IN EFI_COMPONENT_NAME_PROTOCOL * pThis,\r
+ IN CHAR8 * pLanguage,\r
+ OUT CHAR16 ** ppDriverName\r
+ );\r
+\r
+\r
+/**\r
+ Retrieves a Unicode string that is the user readable name of the controller\r
+ that is being managed by a driver.\r
+\r
+ This function retrieves the user readable name of the controller specified by\r
+ ControllerHandle and ChildHandle in the form of a Unicode string. If the\r
+ driver specified by This has a user readable name in the language specified by\r
+ Language, then a pointer to the controller name is returned in ControllerName,\r
+ and EFI_SUCCESS is returned. If the driver specified by This is not currently\r
+ managing the controller specified by ControllerHandle and ChildHandle,\r
+ then EFI_UNSUPPORTED is returned. If the driver specified by This does not\r
+ support the language specified by Language, then EFI_UNSUPPORTED is returned.\r
+\r
+ @param [in] pThis A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
+ EFI_COMPONENT_NAME_PROTOCOL instance.\r
+ @param [in] ControllerHandle The handle of a controller that the driver\r
+ specified by This is managing. This handle\r
+ specifies the controller whose name is to be\r
+ returned.\r
+ @param [in] ChildHandle The handle of the child controller to retrieve\r
+ the name of. This is an optional parameter that\r
+ may be NULL. It will be NULL for device\r
+ drivers. It will also be NULL for a bus drivers\r
+ that wish to retrieve the name of the bus\r
+ controller. It will not be NULL for a bus\r
+ driver that wishes to retrieve the name of a\r
+ child controller.\r
+ @param [in] pLanguage A pointer to a Null-terminated ASCII string\r
+ array indicating the language. This is the\r
+ language of the driver name that the caller is\r
+ requesting, and it must match one of the\r
+ languages specified in SupportedLanguages. The\r
+ number of languages supported by a driver is up\r
+ to the driver writer. Language is specified in\r
+ RFC 3066 or ISO 639-2 language code format.\r
+ @param [out] ppControllerName A pointer to the Unicode string to return.\r
+ This Unicode string is the name of the\r
+ controller specified by ControllerHandle and\r
+ ChildHandle in the language specified by\r
+ Language from the point of view of the driver\r
+ specified by This.\r
+\r
+ @retval EFI_SUCCESS The Unicode string for the user readable name in\r
+ the language specified by Language for the\r
+ driver specified by This was returned in\r
+ DriverName.\r
+ @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.\r
+ @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid\r
+ EFI_HANDLE.\r
+ @retval EFI_INVALID_PARAMETER Language is NULL.\r
+ @retval EFI_INVALID_PARAMETER ControllerName is NULL.\r
+ @retval EFI_UNSUPPORTED The driver specified by This is not currently\r
+ managing the controller specified by\r
+ ControllerHandle and ChildHandle.\r
+ @retval EFI_UNSUPPORTED The driver specified by This does not support\r
+ the language specified by Language.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetControllerName (\r
+ IN EFI_COMPONENT_NAME_PROTOCOL * pThis,\r
+ IN EFI_HANDLE ControllerHandle,\r
+ IN OPTIONAL EFI_HANDLE ChildHandle,\r
+ IN CHAR8 * pLanguage,\r
+ OUT CHAR16 ** ppControllerName\r
+ );\r
+\r
+//------------------------------------------------------------------------------\r
+\r
+#endif // _WEB_SERVER_H_\r