/** @file | |
Display the DHCP options | |
Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR> | |
This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license. | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#include <WebServer.h> | |
#include <Guid/DxeServices.h> | |
#include <Pi/PiDxeCis.h> | |
#include <Protocol/Dhcp4.h> | |
#include <Protocol/ServiceBinding.h> | |
/** | |
Respond with the DHCP options | |
@param[in] SocketFD The socket's file descriptor to add to the list. | |
@param[in] pPort The WSDT_PORT structure address | |
@param[out] pbDone Address to receive the request completion status | |
@retval EFI_SUCCESS The request was successfully processed | |
**/ | |
EFI_STATUS | |
DhcpOptionsPage ( | |
IN int SocketFD, | |
IN WSDT_PORT * pPort, | |
OUT BOOLEAN * pbDone | |
) | |
{ | |
// EFI_HANDLE Dhcp4Handle; | |
EFI_DHCP4_MODE_DATA Dhcp4Mode; | |
UINTN HandleCount; | |
EFI_DHCP4_PROTOCOL * pDhcp4; | |
EFI_DHCP4_PACKET * pDhcp4Packet; | |
EFI_HANDLE * pEnd; | |
EFI_HANDLE * pHandle; | |
// EFI_SERVICE_BINDING_PROTOCOL * pService; | |
EFI_STATUS Status; | |
DBG_ENTER ( ); | |
// | |
// Send the DHCP options | |
// | |
for ( ; ; ) { | |
// | |
// Send the page header | |
// | |
Status = HttpPageHeader ( SocketFD, pPort, L"DHCP Options" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Build the header | |
// | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"<h1>" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = HttpSendUnicodeString ( SocketFD, | |
pPort, | |
L"DHCP Options" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"</h1>\r\n" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Attempt to locate DHCP clients | |
// | |
Status = gBS->LocateHandleBuffer ( ByProtocol, | |
// &gEfiDhcp4ServiceBindingProtocolGuid, | |
&gEfiDhcp4ProtocolGuid, | |
NULL, | |
&HandleCount, | |
&pHandle ); | |
if ( EFI_ERROR ( Status )) { | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"DHCP not in use" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
} | |
else { | |
// | |
// Walk the list of handles | |
// | |
pEnd = &pHandle [ HandleCount ]; | |
while ( pEnd > pHandle ) { | |
/* | |
// | |
// Get the DHCP service binding | |
// | |
Status = gBS->OpenProtocol ( *pHandle, | |
&gEfiDhcp4ServiceBindingProtocolGuid, | |
&pService, | |
NULL, | |
gImageHandle, | |
EFI_OPEN_PROTOCOL_GET_PROTOCOL ); | |
if ( EFI_ERROR ( Status )) { | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"Failed to open gEfiDhcp4ServiceBindingProtocolGuid" ); | |
break; | |
} | |
// | |
// Get the DHCP handle | |
// | |
Status = pService->CreateChild ( pService, | |
&Dhcp4Handle ); | |
if ( EFI_ERROR ( Status )) { | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"Failed to create DHCP4 child" ); | |
} | |
else { | |
*/ | |
// | |
// Get the DHCP protocol | |
// | |
Status = gBS->OpenProtocol ( *pHandle, | |
// Dhcp4Handle, | |
&gEfiDhcp4ProtocolGuid, | |
(VOID **)&pDhcp4, | |
NULL, | |
gImageHandle, | |
EFI_OPEN_PROTOCOL_GET_PROTOCOL ); | |
if ( EFI_ERROR ( Status )) { | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"Failed to open gEfiDhcp4ProtocolGuid" ); | |
} | |
else { | |
// | |
// Get the DHCP packet | |
// | |
Status = pDhcp4->GetModeData ( pDhcp4, | |
&Dhcp4Mode ); | |
if ( EFI_ERROR ( Status )) { | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"Failed to get DHCP4 mode" ); | |
} | |
else { | |
// | |
// Get the last packet | |
// | |
pDhcp4Packet = Dhcp4Mode.ReplyPacket; | |
if ( NULL == pDhcp4Packet ) { | |
Status = HttpSendAnsiString ( SocketFD, | |
pPort, | |
"No DHCP reply received!<br/>DHCP Mode:<br/>" ); | |
if ( EFI_ERROR ( Status )) { | |
break; | |
} | |
// | |
// Display the DHCP mode data | |
// | |
Status = HttpSendDump ( SocketFD, | |
pPort, | |
sizeof ( Dhcp4Mode ), | |
(UINT8 *)&Dhcp4Mode ); | |
} | |
else { | |
// | |
// Display the DHCP packet | |
// | |
Status = HttpSendDump ( SocketFD, | |
pPort, | |
pDhcp4Packet->Length, | |
(UINT8 *)&pDhcp4Packet->Dhcp4 ); | |
} | |
} | |
/* | |
} | |
// | |
// Done with the DHCP protocol | |
// | |
pService->DestroyChild ( pService, | |
Dhcp4Handle ); | |
*/ | |
} | |
// | |
// Set the next service binding | |
// | |
pHandle += 1; | |
} | |
} | |
// | |
// Send the page trailer | |
// | |
Status = HttpPageTrailer ( SocketFD, pPort, pbDone ); | |
break; | |
} | |
// | |
// Return the operation status | |
// | |
DBG_EXIT_STATUS ( Status ); | |
return Status; | |
} |