1 /** @file 2 Definitions for the web server. 3 4 Copyright (c) 2011-2012, Intel Corporation 5 All rights reserved. This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #ifndef _WEB_SERVER_H_ 16 #define _WEB_SERVER_H_ 17 18 #include <errno.h> 19 #include <Uefi.h> 20 21 #include <Guid/EventGroup.h> 22 23 #include <Library/BaseMemoryLib.h> 24 #include <Library/DebugLib.h> 25 #include <Library/MemoryAllocationLib.h> 26 #include <Library/PcdLib.h> 27 #include <Library/UefiApplicationEntryPoint.h> 28 #include <Library/UefiBootServicesTableLib.h> 29 #include <Library/UefiLib.h> 30 #include <Protocol/BlockIo.h> 31 32 #include <netinet/in.h> 33 34 #include <sys/EfiSysCall.h> 35 #include <sys/poll.h> 36 #include <sys/socket.h> 37 38 #if defined(_MSC_VER) // Handle Microsoft VC++ compiler specifics. 39 #pragma warning ( disable : 4054 ) 40 #pragma warning ( disable : 4152 ) 41 #endif // defined(_MSC_VER) 42 43 //------------------------------------------------------------------------------ 44 // Pages 45 //------------------------------------------------------------------------------ 46 47 #define PAGE_ACPI_APIC L"/APIC" 48 #define PAGE_ACPI_BGRT L"/BGRT" 49 #define PAGE_ACPI_DSDT L"/DSDT" 50 #define PAGE_ACPI_FADT L"/FADT" 51 #define PAGE_ACPI_HPET L"/HPET" 52 #define PAGE_ACPI_MCFG L"/MCFG" 53 #define PAGE_ACPI_RSDP_10B L"/RSDP1.0b" 54 #define PAGE_ACPI_RSDP_30 L"/RSDP3.0" 55 #define PAGE_ACPI_RSDT L"/RSDT" 56 #define PAGE_ACPI_SSDT L"/SSDT" 57 #define PAGE_ACPI_TCPA L"/TCPA" 58 #define PAGE_ACPI_UEFI L"/UEFI" 59 #define PAGE_BOOT_SERVICES_TABLE L"/BootServicesTable" 60 #define PAGE_CONFIGURATION_TABLE L"/ConfigurationTable" 61 #define PAGE_DXE_SERVICES_TABLE L"/DxeServicesTable" 62 #define PAGE_RUNTIME_SERVICES_TABLE L"/RuntimeServicesTable" 63 64 //------------------------------------------------------------------------------ 65 // Signatures 66 //------------------------------------------------------------------------------ 67 68 #define APIC_SIGNATURE 0x43495041 69 #define BGRT_SIGNATURE 0x54524742 70 #define DSDT_SIGNATURE 0x54445344 71 #define FADT_SIGNATURE 0x50434146 72 #define HPET_SIGNATURE 0x54455048 73 #define MCFG_SIGNATURE 0x4746434d 74 #define SSDT_SIGNATURE 0x54445353 75 #define TCPA_SIGNATURE 0x41504354 76 #define UEFI_SIGNATURE 0x49464555 77 78 //------------------------------------------------------------------------------ 79 // Macros 80 //------------------------------------------------------------------------------ 81 82 #if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ 83 #define DBG_ENTER() DEBUG (( DEBUG_INFO, "Entering " __FUNCTION__ "\n" )) ///< Display routine entry 84 #define DBG_EXIT() DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ "\n" )) ///< Display routine exit 85 #define DBG_EXIT_DEC(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: %d\n", Status )) ///< Display routine exit with decimal value 86 #define DBG_EXIT_HEX(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: 0x%08x\n", Status )) ///< Display routine exit with hex value 87 #define DBG_EXIT_STATUS(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: %r\n", Status )) ///< Display routine exit with status value 88 #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 89 #else // _MSC_VER 90 #define DBG_ENTER() 91 #define DBG_EXIT() 92 #define DBG_EXIT_DEC(Status) 93 #define DBG_EXIT_HEX(Status) 94 #define DBG_EXIT_STATUS(Status) 95 #define DBG_EXIT_TF(Status) 96 #endif // _MSC_VER 97 98 #define DIM(x) ( sizeof ( x ) / sizeof ( x[0] )) ///< Compute the number of entries in an array 99 100 //------------------------------------------------------------------------------ 101 // Constants 102 //------------------------------------------------------------------------------ 103 104 #define DEBUG_SOCKET_POLL 0x00080000 ///< Display the socket poll messages 105 #define DEBUG_PORT_WORK 0x00040000 ///< Display the port work messages 106 #define DEBUG_SERVER_LISTEN 0x00020000 ///< Display the socket poll messages 107 #define DEBUG_HTTP_PORT 0x00010000 ///< Display HTTP port related messages 108 #define DEBUG_REQUEST 0x00008000 ///< Display the HTTP request messages 109 110 #define HTTP_PORT_POLL_DELAY ( 2 * 1000 ) ///< Delay in milliseconds for attempts to open the HTTP port 111 #define CLIENT_POLL_DELAY 50 ///< Delay in milliseconds between client polls 112 113 #define TPL_WEB_SERVER TPL_CALLBACK ///< TPL for routine synchronization 114 115 /** 116 Verify new TPL value 117 118 This macro which is enabled when debug is enabled verifies that 119 the new TPL value is >= the current TPL value. 120 **/ 121 #ifdef VERIFY_TPL 122 #undef VERIFY_TPL 123 #endif // VERIFY_TPL 124 125 #if !defined(MDEPKG_NDEBUG) 126 127 #define VERIFY_TPL(tpl) \ 128 { \ 129 EFI_TPL PreviousTpl; \ 130 \ 131 PreviousTpl = gBS->RaiseTPL ( TPL_HIGH_LEVEL ); \ 132 gBS->RestoreTPL ( PreviousTpl ); \ 133 if ( PreviousTpl > tpl ) { \ 134 DEBUG (( DEBUG_ERROR, "Current TPL: %d, New TPL: %d\r\n", PreviousTpl, tpl )); \ 135 ASSERT ( PreviousTpl <= tpl ); \ 136 } \ 137 } 138 139 #else // MDEPKG_NDEBUG 140 141 #define VERIFY_TPL(tpl) 142 143 #endif // MDEPKG_NDEBUG 144 145 #define WEB_SERVER_SIGNATURE SIGNATURE_32 ('W','e','b','S') ///< DT_WEB_SERVER memory signature 146 147 #define SPACES_ADDRESS_TO_DATA 2 148 #define BYTES_ON_A_LINE 16 149 #define SPACES_BETWEEN_BYTES 1 150 #define SPACES_DATA_TO_ASCII 2 151 152 153 //------------------------------------------------------------------------------ 154 // Protocol Declarations 155 //------------------------------------------------------------------------------ 156 157 extern EFI_COMPONENT_NAME_PROTOCOL gComponentName; ///< Component name protocol declaration 158 extern EFI_COMPONENT_NAME2_PROTOCOL gComponentName2; ///< Component name 2 protocol declaration 159 extern EFI_DRIVER_BINDING_PROTOCOL gDriverBinding; ///< Driver binding protocol declaration 160 161 //------------------------------------------------------------------------------ 162 // Data Types 163 //------------------------------------------------------------------------------ 164 165 /** 166 Port control structure 167 **/ 168 typedef struct { 169 // 170 // Buffer management 171 // 172 size_t RequestLength; ///< Request length in bytes 173 size_t TxBytes; ///< Bytes in the TX buffer 174 UINT8 Request[ 65536 ]; ///< Page request 175 UINT8 RxBuffer[ 65536 ]; ///< Receive buffer 176 UINT8 TxBuffer[ 65536 ]; ///< Transmit buffer 177 } WSDT_PORT; 178 179 /** 180 Web server control structure 181 **/ 182 typedef struct { 183 UINTN Signature; ///< Structure identification 184 185 // 186 // Image attributes 187 // 188 EFI_HANDLE ImageHandle; ///< Image handle 189 190 // 191 // HTTP port management 192 // 193 BOOLEAN bRunning; ///< Web server running 194 EFI_EVENT TimerEvent; ///< Timer to open HTTP port 195 int HttpListenPort; ///< File descriptor for the HTTP listen port over TCP4 196 int HttpListenPort6; ///< File descriptor for the HTTP listen port over TCP6 197 198 // 199 // Client port management 200 // 201 nfds_t MaxEntries; ///< Maximum entries in the PortList array 202 nfds_t Entries; ///< The current number of entries in the PortList array 203 struct pollfd * pFdList; ///< List of socket file descriptors 204 WSDT_PORT ** ppPortList; ///< List of port management structures 205 } DT_WEB_SERVER; 206 207 //#define SERVER_FROM_SERVICE(a) CR (a, DT_WEB_SERVER, ServiceBinding, WEB_SERVER_SIGNATURE) ///< Locate DT_LAYER from service binding 208 209 extern DT_WEB_SERVER mWebServer; 210 211 /** 212 Process an HTTP request 213 214 @param [in] SocketFD The socket's file descriptor to add to the list. 215 @param [in] pPort The WSDT_PORT structure address 216 @param [out] pbDone Address to receive the request completion status 217 218 @retval EFI_SUCCESS The request was successfully processed 219 220 **/ 221 typedef 222 EFI_STATUS 223 (* PFN_RESPONSE) ( 224 IN int SocketFD, 225 IN WSDT_PORT * pPort, 226 IN BOOLEAN * pbDone 227 ); 228 229 /** 230 Data structure to delcare page support routines 231 **/ 232 typedef struct { 233 UINT16 * pPageName; ///< Name of the page 234 PFN_RESPONSE pfnResponse; ///< Routine to generate the response 235 UINT16 * pDescription; ///< Description of the page 236 } DT_PAGE; 237 238 extern CONST DT_PAGE mPageList[]; ///< List of pages 239 extern CONST UINTN mPageCount; ///< Number of pages 240 241 //------------------------------------------------------------------------------ 242 // Web Pages 243 //------------------------------------------------------------------------------ 244 245 /** 246 Respond with the APIC table 247 248 @param [in] SocketFD The socket's file descriptor to add to the list. 249 @param [in] pPort The WSDT_PORT structure address 250 @param [out] pbDone Address to receive the request completion status 251 252 @retval EFI_SUCCESS The request was successfully processed 253 254 **/ 255 EFI_STATUS 256 AcpiApicPage ( 257 IN int SocketFD, 258 IN WSDT_PORT * pPort, 259 OUT BOOLEAN * pbDone 260 ); 261 262 /** 263 Respond with the BGRT table 264 265 @param [in] SocketFD The socket's file descriptor to add to the list. 266 @param [in] pPort The WSDT_PORT structure address 267 @param [out] pbDone Address to receive the request completion status 268 269 @retval EFI_SUCCESS The request was successfully processed 270 271 **/ 272 EFI_STATUS 273 AcpiBgrtPage ( 274 IN int SocketFD, 275 IN WSDT_PORT * pPort, 276 OUT BOOLEAN * pbDone 277 ); 278 279 /** 280 Respond with the ACPI DSDT table 281 282 @param [in] SocketFD The socket's file descriptor to add to the list. 283 @param [in] pPort The WSDT_PORT structure address 284 @param [out] pbDone Address to receive the request completion status 285 286 @retval EFI_SUCCESS The request was successfully processed 287 288 **/ 289 EFI_STATUS 290 AcpiDsdtPage ( 291 IN int SocketFD, 292 IN WSDT_PORT * pPort, 293 OUT BOOLEAN * pbDone 294 ); 295 296 /** 297 Respond with the ACPI FADT table 298 299 @param [in] SocketFD The socket's file descriptor to add to the list. 300 @param [in] pPort The WSDT_PORT structure address 301 @param [out] pbDone Address to receive the request completion status 302 303 @retval EFI_SUCCESS The request was successfully processed 304 305 **/ 306 EFI_STATUS 307 AcpiFadtPage ( 308 IN int SocketFD, 309 IN WSDT_PORT * pPort, 310 OUT BOOLEAN * pbDone 311 ); 312 313 /** 314 Respond with the HPET table 315 316 @param [in] SocketFD The socket's file descriptor to add to the list. 317 @param [in] pPort The WSDT_PORT structure address 318 @param [out] pbDone Address to receive the request completion status 319 320 @retval EFI_SUCCESS The request was successfully processed 321 322 **/ 323 EFI_STATUS 324 AcpiHpetPage ( 325 IN int SocketFD, 326 IN WSDT_PORT * pPort, 327 OUT BOOLEAN * pbDone 328 ); 329 330 /** 331 Respond with the MCFG table 332 333 @param [in] SocketFD The socket's file descriptor to add to the list. 334 @param [in] pPort The WSDT_PORT structure address 335 @param [out] pbDone Address to receive the request completion status 336 337 @retval EFI_SUCCESS The request was successfully processed 338 339 **/ 340 EFI_STATUS 341 AcpiMcfgPage ( 342 IN int SocketFD, 343 IN WSDT_PORT * pPort, 344 OUT BOOLEAN * pbDone 345 ); 346 347 /** 348 Respond with the ACPI RSDP 1.0b table 349 350 @param [in] SocketFD The socket's file descriptor to add to the list. 351 @param [in] pPort The WSDT_PORT structure address 352 @param [out] pbDone Address to receive the request completion status 353 354 @retval EFI_SUCCESS The request was successfully processed 355 356 **/ 357 EFI_STATUS 358 AcpiRsdp10Page ( 359 IN int SocketFD, 360 IN WSDT_PORT * pPort, 361 OUT BOOLEAN * pbDone 362 ); 363 364 /** 365 Respond with the ACPI RSDP 3.0 table 366 367 @param [in] SocketFD The socket's file descriptor to add to the list. 368 @param [in] pPort The WSDT_PORT structure address 369 @param [out] pbDone Address to receive the request completion status 370 371 @retval EFI_SUCCESS The request was successfully processed 372 373 **/ 374 EFI_STATUS 375 AcpiRsdp30Page ( 376 IN int SocketFD, 377 IN WSDT_PORT * pPort, 378 OUT BOOLEAN * pbDone 379 ); 380 381 /** 382 Respond with the ACPI RSDT table 383 384 @param [in] SocketFD The socket's file descriptor to add to the list. 385 @param [in] pPort The WSDT_PORT structure address 386 @param [out] pbDone Address to receive the request completion status 387 388 @retval EFI_SUCCESS The request was successfully processed 389 390 **/ 391 EFI_STATUS 392 AcpiRsdtPage ( 393 IN int SocketFD, 394 IN WSDT_PORT * pPort, 395 OUT BOOLEAN * pbDone 396 ); 397 398 /** 399 Respond with the SSDT table 400 401 @param [in] SocketFD The socket's file descriptor to add to the list. 402 @param [in] pPort The WSDT_PORT structure address 403 @param [out] pbDone Address to receive the request completion status 404 405 @retval EFI_SUCCESS The request was successfully processed 406 407 **/ 408 EFI_STATUS 409 AcpiSsdtPage ( 410 IN int SocketFD, 411 IN WSDT_PORT * pPort, 412 OUT BOOLEAN * pbDone 413 ); 414 415 /** 416 Respond with the TCPA table 417 418 @param [in] SocketFD The socket's file descriptor to add to the list. 419 @param [in] pPort The WSDT_PORT structure address 420 @param [out] pbDone Address to receive the request completion status 421 422 @retval EFI_SUCCESS The request was successfully processed 423 424 **/ 425 EFI_STATUS 426 AcpiTcpaPage ( 427 IN int SocketFD, 428 IN WSDT_PORT * pPort, 429 OUT BOOLEAN * pbDone 430 ); 431 432 /** 433 Respond with the UEFI table 434 435 @param [in] SocketFD The socket's file descriptor to add to the list. 436 @param [in] pPort The WSDT_PORT structure address 437 @param [out] pbDone Address to receive the request completion status 438 439 @retval EFI_SUCCESS The request was successfully processed 440 441 **/ 442 EFI_STATUS 443 AcpiUefiPage ( 444 IN int SocketFD, 445 IN WSDT_PORT * pPort, 446 OUT BOOLEAN * pbDone 447 ); 448 449 /** 450 Respond with the boot services table 451 452 @param [in] SocketFD The socket's file descriptor to add to the list. 453 @param [in] pPort The WSDT_PORT structure address 454 @param [out] pbDone Address to receive the request completion status 455 456 @retval EFI_SUCCESS The request was successfully processed 457 458 **/ 459 EFI_STATUS 460 BootServicesTablePage ( 461 IN int SocketFD, 462 IN WSDT_PORT * pPort, 463 OUT BOOLEAN * pbDone 464 ); 465 466 /** 467 Respond with the configuration tables 468 469 @param [in] SocketFD The socket's file descriptor to add to the list. 470 @param [in] pPort The WSDT_PORT structure address 471 @param [out] pbDone Address to receive the request completion status 472 473 @retval EFI_SUCCESS The request was successfully processed 474 475 **/ 476 EFI_STATUS 477 ConfigurationTablePage ( 478 IN int SocketFD, 479 IN WSDT_PORT * pPort, 480 OUT BOOLEAN * pbDone 481 ); 482 483 /** 484 Respond with the DHCP options 485 486 @param [in] SocketFD The socket's file descriptor to add to the list. 487 @param [in] pPort The WSDT_PORT structure address 488 @param [out] pbDone Address to receive the request completion status 489 490 @retval EFI_SUCCESS The request was successfully processed 491 492 **/ 493 EFI_STATUS 494 DhcpOptionsPage ( 495 IN int SocketFD, 496 IN WSDT_PORT * pPort, 497 OUT BOOLEAN * pbDone 498 ); 499 500 /** 501 Respond with the DXE services table 502 503 @param [in] SocketFD The socket's file descriptor to add to the list. 504 @param [in] pPort The WSDT_PORT structure address 505 @param [out] pbDone Address to receive the request completion status 506 507 @retval EFI_SUCCESS The request was successfully processed 508 509 **/ 510 EFI_STATUS 511 DxeServicesTablePage ( 512 IN int SocketFD, 513 IN WSDT_PORT * pPort, 514 OUT BOOLEAN * pbDone 515 ); 516 517 /** 518 Respond with the Exit page 519 520 @param [in] SocketFD The socket's file descriptor to add to the list. 521 @param [in] pPort The WSDT_PORT structure address 522 @param [out] pbDone Address to receive the request completion status 523 524 @retval EFI_SUCCESS The request was successfully processed 525 526 **/ 527 EFI_STATUS 528 ExitPage ( 529 IN int SocketFD, 530 IN WSDT_PORT * pPort, 531 OUT BOOLEAN * pbDone 532 ); 533 534 /** 535 Respond with the firmware status 536 537 @param [in] SocketFD The socket's file descriptor to add to the list. 538 @param [in] pPort The WSDT_PORT structure address 539 @param [out] pbDone Address to receive the request completion status 540 541 @retval EFI_SUCCESS The request was successfully processed 542 543 **/ 544 EFI_STATUS 545 FirmwarePage ( 546 IN int SocketFD, 547 IN WSDT_PORT * pPort, 548 OUT BOOLEAN * pbDone 549 ); 550 551 /** 552 Respond with the handles in the system 553 554 @param [in] SocketFD The socket's file descriptor to add to the list. 555 @param [in] pPort The WSDT_PORT structure address 556 @param [out] pbDone Address to receive the request completion status 557 558 @retval EFI_SUCCESS The request was successfully processed 559 560 **/ 561 EFI_STATUS 562 HandlePage ( 563 IN int SocketFD, 564 IN WSDT_PORT * pPort, 565 OUT BOOLEAN * pbDone 566 ); 567 568 /** 569 Respond with the Hello World page 570 571 @param [in] SocketFD The socket's file descriptor to add to the list. 572 @param [in] pPort The WSDT_PORT structure address 573 @param [out] pbDone Address to receive the request completion status 574 575 @retval EFI_SUCCESS The request was successfully processed 576 577 **/ 578 EFI_STATUS 579 HelloPage ( 580 IN int SocketFD, 581 IN WSDT_PORT * pPort, 582 OUT BOOLEAN * pbDone 583 ); 584 585 /** 586 Respond with the list of known pages 587 588 @param [in] SocketFD The socket's file descriptor to add to the list. 589 @param [in] pPort The WSDT_PORT structure address 590 @param [out] pbDone Address to receive the request completion status 591 592 @retval EFI_SUCCESS The request was successfully processed 593 594 **/ 595 EFI_STATUS 596 IndexPage ( 597 IN int SocketFD, 598 IN WSDT_PORT * pPort, 599 OUT BOOLEAN * pbDone 600 ); 601 602 /** 603 Page to display the memory map 604 605 @param [in] SocketFD The socket's file descriptor to add to the list. 606 @param [in] pPort The WSDT_PORT structure address 607 @param [out] pbDone Address to receive the request completion status 608 609 @retval EFI_SUCCESS The request was successfully processed 610 611 **/ 612 EFI_STATUS 613 MemoryMapPage ( 614 IN int SocketFD, 615 IN WSDT_PORT * pPort, 616 OUT BOOLEAN * pbDone 617 ); 618 619 /** 620 Display the memory type registers 621 622 @param [in] SocketFD The socket's file descriptor to add to the list. 623 @param [in] pPort The WSDT_PORT structure address 624 @param [out] pbDone Address to receive the request completion status 625 626 @retval EFI_SUCCESS The request was successfully processed 627 628 **/ 629 EFI_STATUS 630 MemoryTypeRegistersPage ( 631 IN int SocketFD, 632 IN WSDT_PORT * pPort, 633 OUT BOOLEAN * pbDone 634 ); 635 636 /** 637 Respond with the Ports page 638 639 @param [in] SocketFD The socket's file descriptor to add to the list. 640 @param [in] pPort The WSDT_PORT structure address 641 @param [out] pbDone Address to receive the request completion status 642 643 @retval EFI_SUCCESS The request was successfully processed 644 645 **/ 646 EFI_STATUS 647 PortsPage ( 648 IN int SocketFD, 649 IN WSDT_PORT * pPort, 650 OUT BOOLEAN * pbDone 651 ); 652 653 /** 654 Page to reboot the system 655 656 @param [in] SocketFD The socket's file descriptor to add to the list. 657 @param [in] pPort The WSDT_PORT structure address 658 @param [out] pbDone Address to receive the request completion status 659 660 @retval EFI_SUCCESS The request was successfully processed 661 662 **/ 663 EFI_STATUS 664 RebootPage ( 665 IN int SocketFD, 666 IN WSDT_PORT * pPort, 667 OUT BOOLEAN * pbDone 668 ); 669 670 /** 671 Respond with the runtime services table 672 673 @param [in] SocketFD The socket's file descriptor to add to the list. 674 @param [in] pPort The WSDT_PORT structure address 675 @param [out] pbDone Address to receive the request completion status 676 677 @retval EFI_SUCCESS The request was successfully processed 678 679 **/ 680 EFI_STATUS 681 RuntimeSservicesTablePage ( 682 IN int SocketFD, 683 IN WSDT_PORT * pPort, 684 OUT BOOLEAN * pbDone 685 ); 686 687 /** 688 Respond with the system table 689 690 @param [in] SocketFD The socket's file descriptor to add to the list. 691 @param [in] pPort The WSDT_PORT structure address 692 @param [out] pbDone Address to receive the request completion status 693 694 @retval EFI_SUCCESS The request was successfully processed 695 696 **/ 697 EFI_STATUS 698 SystemTablePage ( 699 IN int SocketFD, 700 IN WSDT_PORT * pPort, 701 OUT BOOLEAN * pbDone 702 ); 703 704 //------------------------------------------------------------------------------ 705 // Support routines 706 //------------------------------------------------------------------------------ 707 708 /** 709 Display the EFI Table Header 710 711 @param [in] SocketFD The socket's file descriptor to add to the list. 712 @param [in] pPort The WSDT_PORT structure address 713 @param [in] pHeader Address of the EFI_TABLE_HEADER structure 714 715 @retval EFI_SUCCESS The request was successfully processed 716 717 **/ 718 EFI_STATUS 719 EfiTableHeader ( 720 IN int SocketFD, 721 IN WSDT_PORT * pPort, 722 IN EFI_TABLE_HEADER * pHeader 723 ); 724 725 /** 726 Buffer the HTTP page header 727 728 @param [in] SocketFD The socket's file descriptor to add to the list. 729 @param [in] pPort The WSDT_PORT structure address 730 @param [in] pTitle A zero terminated Unicode title string 731 732 @retval EFI_SUCCESS The request was successfully processed 733 734 **/ 735 EFI_STATUS 736 HttpPageHeader ( 737 IN int SocketFD, 738 IN WSDT_PORT * pPort, 739 IN CONST CHAR16 * pTitle 740 ); 741 742 /** 743 Buffer and send the HTTP page trailer 744 745 @param [in] SocketFD The socket's file descriptor to add to the list. 746 @param [in] pPort The WSDT_PORT structure address 747 @param [out] pbDone Address to receive the request completion status 748 749 @retval EFI_SUCCESS The request was successfully processed 750 751 **/ 752 EFI_STATUS 753 HttpPageTrailer ( 754 IN int SocketFD, 755 IN WSDT_PORT * pPort, 756 IN BOOLEAN * pbDone 757 ); 758 759 /** 760 Process an HTTP request 761 762 @param [in] SocketFD The socket's file descriptor to add to the list. 763 @param [in] pPort The WSDT_PORT structure address 764 @param [out] pbDone Address to receive the request completion status 765 766 @retval EFI_SUCCESS The request was successfully processed 767 768 **/ 769 EFI_STATUS 770 HttpRequest ( 771 IN int SocketFD, 772 IN WSDT_PORT * pPort, 773 IN BOOLEAN * pbDone 774 ); 775 776 /** 777 Buffer data for sending 778 779 @param [in] SocketFD The socket's file descriptor to add to the list. 780 @param [in] pPort The WSDT_PORT structure address 781 @param [in] LengthInBytes Length of valid data in the buffer 782 @param [in] pBuffer Buffer of data to send 783 784 @retval EFI_SUCCESS The request was successfully processed 785 786 **/ 787 EFI_STATUS 788 HttpSend ( 789 IN int SocketFD, 790 IN WSDT_PORT * pPort, 791 IN size_t LengthInBytes, 792 IN CONST UINT8 * pBuffer 793 ); 794 795 /** 796 Send an ANSI string 797 798 @param [in] SocketFD The socket's file descriptor to add to the list. 799 @param [in] pPort The WSDT_PORT structure address 800 @param [in] pString A zero terminated Unicode string 801 802 @retval EFI_SUCCESS The request was successfully processed 803 804 **/ 805 EFI_STATUS 806 HttpSendAnsiString ( 807 IN int SocketFD, 808 IN WSDT_PORT * pPort, 809 IN CONST char * pString 810 ); 811 812 /** 813 Buffer a single byte 814 815 @param [in] SocketFD The socket's file descriptor to add to the list. 816 @param [in] pPort The WSDT_PORT structure address 817 @param [in] Data The data byte to send 818 819 @retval EFI_SUCCESS The request was successfully processed 820 821 **/ 822 EFI_STATUS 823 HttpSendByte ( 824 IN int SocketFD, 825 IN WSDT_PORT * pPort, 826 IN UINT8 Data 827 ); 828 829 /** 830 Display a character 831 832 @param [in] SocketFD The socket's file descriptor to add to the list. 833 @param [in] pPort The WSDT_PORT structure address 834 @param [in] Character Character to display 835 @param [in] pReplacement Replacement character string 836 837 @retval EFI_SUCCESS The request was successfully processed 838 839 **/ 840 EFI_STATUS 841 HttpSendCharacter ( 842 IN int SocketFD, 843 IN WSDT_PORT * pPort, 844 IN CHAR8 Character, 845 IN CHAR8 * pReplacement 846 ); 847 848 /** 849 Send a buffer dump 850 851 @param [in] SocketFD The socket's file descriptor to add to the list. 852 @param [in] pPort The WSDT_PORT structure address 853 @param [in] ByteCount The number of bytes to display 854 @param [in] pData Address of the byte array 855 856 @retval EFI_SUCCESS The request was successfully processed 857 858 **/ 859 EFI_STATUS 860 HttpSendDump ( 861 IN int SocketFD, 862 IN WSDT_PORT * pPort, 863 IN UINTN ByteCount, 864 IN CONST UINT8 * pData 865 ); 866 867 /** 868 Display a row containing a GUID value 869 870 @param [in] SocketFD The socket's file descriptor to add to the list. 871 @param [in] pPort The WSDT_PORT structure address 872 @param [in] pGuid Address of the GUID to display 873 874 @retval EFI_SUCCESS The request was successfully processed 875 876 **/ 877 EFI_STATUS 878 HttpSendGuid ( 879 IN int SocketFD, 880 IN WSDT_PORT * pPort, 881 IN CONST EFI_GUID * pGuid 882 ); 883 884 /** 885 Output a hex value to the HTML page 886 887 @param [in] SocketFD Socket file descriptor 888 @param [in] pPort The WSDT_PORT structure address 889 @param [in] Bits Number of bits to display 890 @param [in] Value Value to display 891 892 @retval EFI_SUCCESS Successfully displayed the address 893 **/ 894 EFI_STATUS 895 HttpSendHexBits ( 896 IN int SocketFD, 897 IN WSDT_PORT * pPort, 898 IN INT32 Bits, 899 IN UINT64 Value 900 ); 901 902 /** 903 Output a hex value to the HTML page 904 905 @param [in] SocketFD Socket file descriptor 906 @param [in] pPort The WSDT_PORT structure address 907 @param [in] Value Value to display 908 909 @retval EFI_SUCCESS Successfully displayed the address 910 **/ 911 EFI_STATUS 912 HttpSendHexValue ( 913 IN int SocketFD, 914 IN WSDT_PORT * pPort, 915 IN UINT64 Value 916 ); 917 918 /** 919 Output an IP address to the HTML page 920 921 @param [in] SocketFD Socket file descriptor 922 @param [in] pPort The WSDT_PORT structure address 923 @param [in] pAddress Address of the socket address 924 925 @retval EFI_SUCCESS Successfully displayed the address 926 **/ 927 EFI_STATUS 928 HttpSendIpAddress ( 929 IN int SocketFD, 930 IN WSDT_PORT * pPort, 931 IN struct sockaddr_in6 * pAddress 932 ); 933 934 /** 935 Send a Unicode string 936 937 @param [in] SocketFD The socket's file descriptor to add to the list. 938 @param [in] pPort The WSDT_PORT structure address 939 @param [in] pString A zero terminated Unicode string 940 941 @retval EFI_SUCCESS The request was successfully processed 942 943 **/ 944 EFI_STATUS 945 HttpSendUnicodeString ( 946 IN int SocketFD, 947 IN WSDT_PORT * pPort, 948 IN CONST UINT16 * pString 949 ); 950 951 /** 952 Output a value to the HTML page 953 954 @param [in] SocketFD Socket file descriptor 955 @param [in] pPort The WSDT_PORT structure address 956 @param [in] Value Value to display 957 958 @retval EFI_SUCCESS Successfully displayed the address 959 **/ 960 EFI_STATUS 961 HttpSendValue ( 962 IN int SocketFD, 963 IN WSDT_PORT * pPort, 964 IN UINT64 Value 965 ); 966 967 /** 968 Display a row containing a decimal value 969 970 @param [in] SocketFD The socket's file descriptor to add to the list. 971 @param [in] pPort The WSDT_PORT structure address 972 @param [in] pName Address of a zero terminated name string 973 @param [in] Value The value to display 974 975 @retval EFI_SUCCESS The request was successfully processed 976 977 **/ 978 EFI_STATUS 979 RowDecimalValue ( 980 IN int SocketFD, 981 IN WSDT_PORT * pPort, 982 IN CONST CHAR8 * pName, 983 IN UINT64 Value 984 ); 985 986 /** 987 Display a row containing a GUID value 988 989 @param [in] SocketFD The socket's file descriptor to add to the list. 990 @param [in] pPort The WSDT_PORT structure address 991 @param [in] pName Address of a zero terminated name string 992 @param [in] pGuid Address of the GUID to display 993 994 @retval EFI_SUCCESS The request was successfully processed 995 996 **/ 997 EFI_STATUS 998 RowGuid ( 999 IN int SocketFD, 1000 IN WSDT_PORT * pPort, 1001 IN CONST CHAR8 * pName, 1002 IN CONST EFI_GUID * pGuid 1003 ); 1004 1005 /** 1006 Display a row containing a hex value 1007 1008 @param [in] SocketFD The socket's file descriptor to add to the list. 1009 @param [in] pPort The WSDT_PORT structure address 1010 @param [in] pName Address of a zero terminated name string 1011 @param [in] Value The value to display 1012 @param [in] pWebPage Address of a zero terminated web page name 1013 1014 @retval EFI_SUCCESS The request was successfully processed 1015 1016 **/ 1017 EFI_STATUS 1018 RowHexValue ( 1019 IN int SocketFD, 1020 IN WSDT_PORT * pPort, 1021 IN CONST CHAR8 * pName, 1022 IN UINT64 Value, 1023 IN CONST CHAR16 * pWebPage 1024 ); 1025 1026 /** 1027 Display a row containing a pointer 1028 1029 @param [in] SocketFD The socket's file descriptor to add to the list. 1030 @param [in] pPort The WSDT_PORT structure address 1031 @param [in] pName Address of a zero terminated name string 1032 @param [in] pAddress The address to display 1033 @param [in] pWebPage Address of a zero terminated web page name 1034 1035 @retval EFI_SUCCESS The request was successfully processed 1036 1037 **/ 1038 EFI_STATUS 1039 RowPointer ( 1040 IN int SocketFD, 1041 IN WSDT_PORT * pPort, 1042 IN CONST CHAR8 * pName, 1043 IN CONST VOID * pAddress, 1044 IN CONST CHAR16 * pWebPage 1045 ); 1046 1047 /** 1048 Display a row containing a revision 1049 1050 @param [in] SocketFD The socket's file descriptor to add to the list. 1051 @param [in] pPort The WSDT_PORT structure address 1052 @param [in] pName Address of a zero terminated name string 1053 @param [in] Revision The revision to display 1054 1055 @retval EFI_SUCCESS The request was successfully processed 1056 1057 **/ 1058 EFI_STATUS 1059 RowRevision ( 1060 IN int SocketFD, 1061 IN WSDT_PORT * pPort, 1062 IN CONST CHAR8 * pName, 1063 IN UINT32 Revision 1064 ); 1065 1066 /** 1067 Display a row containing a unicode string 1068 1069 @param [in] SocketFD The socket's file descriptor to add to the list. 1070 @param [in] pPort The WSDT_PORT structure address 1071 @param [in] pName Address of a zero terminated name string 1072 @param [in] pString Address of a zero terminated unicode string 1073 1074 @retval EFI_SUCCESS The request was successfully processed 1075 1076 **/ 1077 EFI_STATUS 1078 RowUnicodeString ( 1079 IN int SocketFD, 1080 IN WSDT_PORT * pPort, 1081 IN CONST CHAR8 * pName, 1082 IN CONST CHAR16 * pString 1083 ); 1084 1085 /** 1086 Start the table page 1087 1088 @param [in] SocketFD The socket's file descriptor to add to the list. 1089 @param [in] pPort The WSDT_PORT structure address 1090 @param [in] pName Address of a zero terminated name string 1091 @param [in] pTable Address of the table 1092 1093 @retval EFI_SUCCESS The request was successfully processed 1094 1095 **/ 1096 EFI_STATUS 1097 TableHeader ( 1098 IN int SocketFD, 1099 IN WSDT_PORT * pPort, 1100 IN CONST CHAR16 * pName, 1101 IN CONST VOID * pTable 1102 ); 1103 1104 /** 1105 End the table page 1106 1107 @param [in] SocketFD The socket's file descriptor to add to the list. 1108 @param [in] pPort The WSDT_PORT structure address 1109 @param [out] pbDone Address to receive the request completion status 1110 1111 @retval EFI_SUCCESS The request was successfully processed 1112 1113 **/ 1114 EFI_STATUS 1115 TableTrailer ( 1116 IN int SocketFD, 1117 IN WSDT_PORT * pPort, 1118 OUT BOOLEAN *pbDone 1119 ); 1120 1121 /** 1122 HTTP port creation timer routine 1123 1124 This routine polls the socket layer waiting for the initial network connection 1125 which will enable the creation of the HTTP port. The socket layer will manage 1126 the coming and going of the network connections after that until the last network 1127 connection is broken. 1128 1129 @param [in] pWebServer The web server control structure address. 1130 1131 **/ 1132 VOID 1133 WebServerTimer ( 1134 IN DT_WEB_SERVER * pWebServer 1135 ); 1136 1137 /** 1138 Start the web server port creation timer 1139 1140 @param [in] pWebServer The web server control structure address. 1141 1142 @retval EFI_SUCCESS The timer was successfully started. 1143 @retval EFI_ALREADY_STARTED The timer is already running. 1144 @retval Other The timer failed to start. 1145 1146 **/ 1147 EFI_STATUS 1148 WebServerTimerStart ( 1149 IN DT_WEB_SERVER * pWebServer 1150 ); 1151 1152 /** 1153 Stop the web server port creation timer 1154 1155 @param [in] pWebServer The web server control structure address. 1156 1157 @retval EFI_SUCCESS The HTTP port timer is stopped 1158 @retval Other Failed to stop the HTTP port timer 1159 1160 **/ 1161 EFI_STATUS 1162 WebServerTimerStop ( 1163 IN DT_WEB_SERVER * pWebServer 1164 ); 1165 1166 //------------------------------------------------------------------------------ 1167 // Driver Binding Protocol Support 1168 //------------------------------------------------------------------------------ 1169 1170 /** 1171 Stop this driver on Controller by removing NetworkInterfaceIdentifier protocol and 1172 closing the DevicePath and PciIo protocols on Controller. 1173 1174 @param [in] pThis Protocol instance pointer. 1175 @param [in] Controller Handle of device to stop driver on. 1176 @param [in] NumberOfChildren How many children need to be stopped. 1177 @param [in] pChildHandleBuffer Not used. 1178 1179 @retval EFI_SUCCESS This driver is removed Controller. 1180 @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error. 1181 @retval other This driver was not removed from this device. 1182 1183 **/ 1184 EFI_STATUS 1185 EFIAPI 1186 DriverStop ( 1187 IN EFI_DRIVER_BINDING_PROTOCOL * pThis, 1188 IN EFI_HANDLE Controller, 1189 IN UINTN NumberOfChildren, 1190 IN EFI_HANDLE * pChildHandleBuffer 1191 ); 1192 1193 //------------------------------------------------------------------------------ 1194 // EFI Component Name Protocol Support 1195 //------------------------------------------------------------------------------ 1196 1197 /** 1198 Retrieves a Unicode string that is the user readable name of the driver. 1199 1200 This function retrieves the user readable name of a driver in the form of a 1201 Unicode string. If the driver specified by This has a user readable name in 1202 the language specified by Language, then a pointer to the driver name is 1203 returned in DriverName, and EFI_SUCCESS is returned. If the driver specified 1204 by This does not support the language specified by Language, 1205 then EFI_UNSUPPORTED is returned. 1206 1207 @param [in] pThis A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or 1208 EFI_COMPONENT_NAME_PROTOCOL instance. 1209 @param [in] pLanguage A pointer to a Null-terminated ASCII string 1210 array indicating the language. This is the 1211 language of the driver name that the caller is 1212 requesting, and it must match one of the 1213 languages specified in SupportedLanguages. The 1214 number of languages supported by a driver is up 1215 to the driver writer. Language is specified 1216 in RFC 3066 or ISO 639-2 language code format. 1217 @param [out] ppDriverName A pointer to the Unicode string to return. 1218 This Unicode string is the name of the 1219 driver specified by This in the language 1220 specified by Language. 1221 1222 @retval EFI_SUCCESS The Unicode string for the Driver specified by 1223 This and the language specified by Language was 1224 returned in DriverName. 1225 @retval EFI_INVALID_PARAMETER Language is NULL. 1226 @retval EFI_INVALID_PARAMETER DriverName is NULL. 1227 @retval EFI_UNSUPPORTED The driver specified by This does not support 1228 the language specified by Language. 1229 1230 **/ 1231 EFI_STATUS 1232 EFIAPI 1233 GetDriverName ( 1234 IN EFI_COMPONENT_NAME_PROTOCOL * pThis, 1235 IN CHAR8 * pLanguage, 1236 OUT CHAR16 ** ppDriverName 1237 ); 1238 1239 1240 /** 1241 Retrieves a Unicode string that is the user readable name of the controller 1242 that is being managed by a driver. 1243 1244 This function retrieves the user readable name of the controller specified by 1245 ControllerHandle and ChildHandle in the form of a Unicode string. If the 1246 driver specified by This has a user readable name in the language specified by 1247 Language, then a pointer to the controller name is returned in ControllerName, 1248 and EFI_SUCCESS is returned. If the driver specified by This is not currently 1249 managing the controller specified by ControllerHandle and ChildHandle, 1250 then EFI_UNSUPPORTED is returned. If the driver specified by This does not 1251 support the language specified by Language, then EFI_UNSUPPORTED is returned. 1252 1253 @param [in] pThis A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or 1254 EFI_COMPONENT_NAME_PROTOCOL instance. 1255 @param [in] ControllerHandle The handle of a controller that the driver 1256 specified by This is managing. This handle 1257 specifies the controller whose name is to be 1258 returned. 1259 @param [in] ChildHandle The handle of the child controller to retrieve 1260 the name of. This is an optional parameter that 1261 may be NULL. It will be NULL for device 1262 drivers. It will also be NULL for a bus drivers 1263 that wish to retrieve the name of the bus 1264 controller. It will not be NULL for a bus 1265 driver that wishes to retrieve the name of a 1266 child controller. 1267 @param [in] pLanguage A pointer to a Null-terminated ASCII string 1268 array indicating the language. This is the 1269 language of the driver name that the caller is 1270 requesting, and it must match one of the 1271 languages specified in SupportedLanguages. The 1272 number of languages supported by a driver is up 1273 to the driver writer. Language is specified in 1274 RFC 3066 or ISO 639-2 language code format. 1275 @param [out] ppControllerName A pointer to the Unicode string to return. 1276 This Unicode string is the name of the 1277 controller specified by ControllerHandle and 1278 ChildHandle in the language specified by 1279 Language from the point of view of the driver 1280 specified by This. 1281 1282 @retval EFI_SUCCESS The Unicode string for the user readable name in 1283 the language specified by Language for the 1284 driver specified by This was returned in 1285 DriverName. 1286 @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. 1287 @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid 1288 EFI_HANDLE. 1289 @retval EFI_INVALID_PARAMETER Language is NULL. 1290 @retval EFI_INVALID_PARAMETER ControllerName is NULL. 1291 @retval EFI_UNSUPPORTED The driver specified by This is not currently 1292 managing the controller specified by 1293 ControllerHandle and ChildHandle. 1294 @retval EFI_UNSUPPORTED The driver specified by This does not support 1295 the language specified by Language. 1296 1297 **/ 1298 EFI_STATUS 1299 EFIAPI 1300 GetControllerName ( 1301 IN EFI_COMPONENT_NAME_PROTOCOL * pThis, 1302 IN EFI_HANDLE ControllerHandle, 1303 IN OPTIONAL EFI_HANDLE ChildHandle, 1304 IN CHAR8 * pLanguage, 1305 OUT CHAR16 ** ppControllerName 1306 ); 1307 1308 //------------------------------------------------------------------------------ 1309 1310 #endif // _WEB_SERVER_H_ 1311