mirror of https://github.com/acidanthera/audk.git
223 lines
6.9 KiB
C
223 lines
6.9 KiB
C
/** @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;
|
|
}
|