mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-29 16:44:10 +02:00
NetworkPkg: Add DNS feature support over IPv4 and IPv6.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: jiaxinwu <jiaxin.wu@intel.com> Reviewed-by: Fu Siyuan <siyuan.fu@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17854 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
1f6729ffe9
commit
99c048ef4a
443
NetworkPkg/DnsDxe/ComponentName.c
Normal file
443
NetworkPkg/DnsDxe/ComponentName.c
Normal file
@ -0,0 +1,443 @@
|
|||||||
|
/** @file
|
||||||
|
Implementation of EFI_COMPONENT_NAME_PROTOCOL and EFI_COMPONENT_NAME2_PROTOCOL protocol.
|
||||||
|
|
||||||
|
Copyright (c) 2015, 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.php
|
||||||
|
|
||||||
|
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 "DnsImpl.h"
|
||||||
|
|
||||||
|
//
|
||||||
|
// EFI Component Name Functions
|
||||||
|
//
|
||||||
|
/**
|
||||||
|
Retrieves a Unicode string that is the user-readable name of the EFI Driver.
|
||||||
|
|
||||||
|
@param This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
|
||||||
|
@param Language A pointer to a three-character ISO 639-2 language identifier.
|
||||||
|
This is the language of the driver name that that the caller
|
||||||
|
is requesting, and it must match one of the languages specified
|
||||||
|
in SupportedLanguages. The number of languages supported by a
|
||||||
|
driver is up to the driver writer.
|
||||||
|
@param DriverName A pointer to the Unicode string to return. This Unicode string
|
||||||
|
is the name of the driver specified by This in the language
|
||||||
|
specified by Language.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The Unicode string for the Driver specified by This
|
||||||
|
and the language specified by Language was returned
|
||||||
|
in DriverName.
|
||||||
|
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||||
|
@retval EFI_INVALID_PARAMETER DriverName is NULL.
|
||||||
|
@retval EFI_UNSUPPORTED The driver specified by This does not support the
|
||||||
|
language specified by Language.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
DnsComponentNameGetDriverName (
|
||||||
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
|
IN CHAR8 *Language,
|
||||||
|
OUT CHAR16 **DriverName
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Retrieves a Unicode string that is the user readable name of the controller
|
||||||
|
that is being managed by an EFI Driver.
|
||||||
|
|
||||||
|
@param This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
|
||||||
|
@param ControllerHandle The handle of a controller that the driver specified by
|
||||||
|
This is managing. This handle specifies the controller
|
||||||
|
whose name is to be returned.
|
||||||
|
@param ChildHandle The handle of the child controller to retrieve the name
|
||||||
|
of. This is an optional parameter that may be NULL. It
|
||||||
|
will be NULL for device drivers. It will also be NULL
|
||||||
|
for a bus drivers that wish to retrieve the name of the
|
||||||
|
bus controller. It will not be NULL for a bus driver
|
||||||
|
that wishes to retrieve the name of a child controller.
|
||||||
|
@param Language A pointer to a three character ISO 639-2 language
|
||||||
|
identifier. This is the language of the controller name
|
||||||
|
that the caller is requesting, and it must match one
|
||||||
|
of the languages specified in SupportedLanguages. The
|
||||||
|
number of languages supported by a driver is up to the
|
||||||
|
driver writer.
|
||||||
|
@param ControllerName A pointer to the Unicode string to return. This Unicode
|
||||||
|
string is the name of the controller specified by
|
||||||
|
ControllerHandle and ChildHandle in the language specified
|
||||||
|
by Language, from the point of view of the driver specified
|
||||||
|
by This.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The Unicode string for the user-readable name in the
|
||||||
|
language specified by Language for the driver
|
||||||
|
specified by This was returned in DriverName.
|
||||||
|
@retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
|
||||||
|
@retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid EFI_HANDLE.
|
||||||
|
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||||
|
@retval EFI_INVALID_PARAMETER ControllerName is NULL.
|
||||||
|
@retval EFI_UNSUPPORTED The driver specified by This is not currently managing
|
||||||
|
the controller specified by ControllerHandle and
|
||||||
|
ChildHandle.
|
||||||
|
@retval EFI_UNSUPPORTED The driver specified by This does not support the
|
||||||
|
language specified by Language.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
DnsComponentNameGetControllerName (
|
||||||
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
|
IN CHAR8 *Language,
|
||||||
|
OUT CHAR16 **ControllerName
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Component Name Protocol instance
|
||||||
|
///
|
||||||
|
GLOBAL_REMOVE_IF_UNREFERENCED
|
||||||
|
EFI_COMPONENT_NAME_PROTOCOL gDnsComponentName = {
|
||||||
|
DnsComponentNameGetDriverName,
|
||||||
|
DnsComponentNameGetControllerName,
|
||||||
|
"eng"
|
||||||
|
};
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Component Name 2 Protocol instance
|
||||||
|
///
|
||||||
|
GLOBAL_REMOVE_IF_UNREFERENCED
|
||||||
|
EFI_COMPONENT_NAME2_PROTOCOL gDnsComponentName2 = {
|
||||||
|
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) DnsComponentNameGetDriverName,
|
||||||
|
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) DnsComponentNameGetControllerName,
|
||||||
|
"en"
|
||||||
|
};
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Table of driver names
|
||||||
|
///
|
||||||
|
GLOBAL_REMOVE_IF_UNREFERENCED
|
||||||
|
EFI_UNICODE_STRING_TABLE mDnsDriverNameTable[] = {
|
||||||
|
{ "eng;en", (CHAR16 *)L"DNS Network Service Driver" },
|
||||||
|
{ NULL, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gDnsControllerNameTable = NULL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Retrieves a Unicode string that is the user-readable name of the EFI Driver.
|
||||||
|
|
||||||
|
@param This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
|
||||||
|
@param Language A pointer to a three-character ISO 639-2 language identifier.
|
||||||
|
This is the language of the driver name that that the caller
|
||||||
|
is requesting, and it must match one of the languages specified
|
||||||
|
in SupportedLanguages. The number of languages supported by a
|
||||||
|
driver is up to the driver writer.
|
||||||
|
@param DriverName A pointer to the Unicode string to return. This Unicode string
|
||||||
|
is the name of the driver specified by This in the language
|
||||||
|
specified by Language.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The Unicode string for the Driver specified by This
|
||||||
|
and the language specified by Language was returned
|
||||||
|
in DriverName.
|
||||||
|
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||||
|
@retval EFI_INVALID_PARAMETER DriverName is NULL.
|
||||||
|
@retval EFI_UNSUPPORTED The driver specified by This does not support the
|
||||||
|
language specified by Language.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
DnsComponentNameGetDriverName (
|
||||||
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
|
IN CHAR8 *Language,
|
||||||
|
OUT CHAR16 **DriverName
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return LookupUnicodeString2 (
|
||||||
|
Language,
|
||||||
|
This->SupportedLanguages,
|
||||||
|
mDnsDriverNameTable,
|
||||||
|
DriverName,
|
||||||
|
(BOOLEAN)(This == &gDnsComponentName)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Update the component name for the Dns4 child handle.
|
||||||
|
|
||||||
|
@param Dns4 A pointer to the EFI_DNS4_PROTOCOL.
|
||||||
|
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Update the ControllerNameTable of this instance successfully.
|
||||||
|
@retval EFI_INVALID_PARAMETER The input parameter is invalid.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
UpdateDns4Name (
|
||||||
|
EFI_DNS4_PROTOCOL *Dns4
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
CHAR16 HandleName[80];
|
||||||
|
EFI_DNS4_MODE_DATA ModeData;
|
||||||
|
|
||||||
|
if (Dns4 == NULL) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Format the child name into the string buffer as:
|
||||||
|
// DNSv4 (StationIp=?, LocalPort=?)
|
||||||
|
//
|
||||||
|
Status = Dns4->GetModeData (Dns4, &ModeData);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
UnicodeSPrint (
|
||||||
|
HandleName,
|
||||||
|
sizeof (HandleName),
|
||||||
|
L"DNSv4 (StationIp=%d.%d.%d.%d, LocalPort=%d)",
|
||||||
|
ModeData.DnsConfigData.StationIp.Addr[0],
|
||||||
|
ModeData.DnsConfigData.StationIp.Addr[1],
|
||||||
|
ModeData.DnsConfigData.StationIp.Addr[2],
|
||||||
|
ModeData.DnsConfigData.StationIp.Addr[3],
|
||||||
|
ModeData.DnsConfigData.LocalPort
|
||||||
|
);
|
||||||
|
|
||||||
|
if (gDnsControllerNameTable != NULL) {
|
||||||
|
FreeUnicodeStringTable (gDnsControllerNameTable);
|
||||||
|
gDnsControllerNameTable = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = AddUnicodeString2 (
|
||||||
|
"eng",
|
||||||
|
gDnsComponentName.SupportedLanguages,
|
||||||
|
&gDnsControllerNameTable,
|
||||||
|
HandleName,
|
||||||
|
TRUE
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
return AddUnicodeString2 (
|
||||||
|
"en",
|
||||||
|
gDnsComponentName2.SupportedLanguages,
|
||||||
|
&gDnsControllerNameTable,
|
||||||
|
HandleName,
|
||||||
|
FALSE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Update the component name for the Dns6 child handle.
|
||||||
|
|
||||||
|
@param Dns6 A pointer to the EFI_DNS6_PROTOCOL.
|
||||||
|
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS Update the ControllerNameTable of this instance successfully.
|
||||||
|
@retval EFI_INVALID_PARAMETER The input parameter is invalid.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
UpdateDns6Name (
|
||||||
|
EFI_DNS6_PROTOCOL *Dns6
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
CHAR16 HandleName[128];
|
||||||
|
EFI_DNS6_MODE_DATA ModeData;
|
||||||
|
CHAR16 Address[sizeof"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"];
|
||||||
|
|
||||||
|
if (Dns6 == NULL) {
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Format the child name into the string buffer as:
|
||||||
|
// DNSv6 (StationIp=?, LocalPort=?)
|
||||||
|
//
|
||||||
|
Status = Dns6->GetModeData (Dns6, &ModeData);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = NetLibIp6ToStr (&ModeData.DnsConfigData.StationIp, Address, sizeof (Address));
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
UnicodeSPrint (
|
||||||
|
HandleName,
|
||||||
|
sizeof (HandleName),
|
||||||
|
L"DNSv6 (StationIp=%s, LocalPort=%d)",
|
||||||
|
Address,
|
||||||
|
ModeData.DnsConfigData.LocalPort
|
||||||
|
);
|
||||||
|
|
||||||
|
if (gDnsControllerNameTable != NULL) {
|
||||||
|
FreeUnicodeStringTable (gDnsControllerNameTable);
|
||||||
|
gDnsControllerNameTable = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = AddUnicodeString2 (
|
||||||
|
"eng",
|
||||||
|
gDnsComponentName.SupportedLanguages,
|
||||||
|
&gDnsControllerNameTable,
|
||||||
|
HandleName,
|
||||||
|
TRUE
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
return AddUnicodeString2 (
|
||||||
|
"en",
|
||||||
|
gDnsComponentName2.SupportedLanguages,
|
||||||
|
&gDnsControllerNameTable,
|
||||||
|
HandleName,
|
||||||
|
FALSE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Retrieves a Unicode string that is the user readable name of the controller
|
||||||
|
that is being managed by an EFI Driver.
|
||||||
|
|
||||||
|
@param This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
|
||||||
|
@param ControllerHandle The handle of a controller that the driver specified by
|
||||||
|
This is managing. This handle specifies the controller
|
||||||
|
whose name is to be returned.
|
||||||
|
@param ChildHandle The handle of the child controller to retrieve the name
|
||||||
|
of. This is an optional parameter that may be NULL. It
|
||||||
|
will be NULL for device drivers. It will also be NULL
|
||||||
|
for a bus drivers that wish to retrieve the name of the
|
||||||
|
bus controller. It will not be NULL for a bus driver
|
||||||
|
that wishes to retrieve the name of a child controller.
|
||||||
|
@param Language A pointer to a three character ISO 639-2 language
|
||||||
|
identifier. This is the language of the controller name
|
||||||
|
that the caller is requesting, and it must match one
|
||||||
|
of the languages specified in SupportedLanguages. The
|
||||||
|
number of languages supported by a driver is up to the
|
||||||
|
driver writer.
|
||||||
|
@param ControllerName A pointer to the Unicode string to return. This Unicode
|
||||||
|
string is the name of the controller specified by
|
||||||
|
ControllerHandle and ChildHandle in the language specified
|
||||||
|
by Language, from the point of view of the driver specified
|
||||||
|
by This.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The Unicode string for the user-readable name in the
|
||||||
|
language specified by Language for the driver
|
||||||
|
specified by This was returned in DriverName.
|
||||||
|
@retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
|
||||||
|
@retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid EFI_HANDLE.
|
||||||
|
@retval EFI_INVALID_PARAMETER Language is NULL.
|
||||||
|
@retval EFI_INVALID_PARAMETER ControllerName is NULL.
|
||||||
|
@retval EFI_UNSUPPORTED The driver specified by This is not currently managing
|
||||||
|
the controller specified by ControllerHandle and
|
||||||
|
ChildHandle.
|
||||||
|
@retval EFI_UNSUPPORTED The driver specified by This does not support the
|
||||||
|
language specified by Language.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
DnsComponentNameGetControllerName (
|
||||||
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
|
IN CHAR8 *Language,
|
||||||
|
OUT CHAR16 **ControllerName
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_DNS4_PROTOCOL *Dns4;
|
||||||
|
EFI_DNS6_PROTOCOL *Dns6;
|
||||||
|
|
||||||
|
//
|
||||||
|
// ChildHandle must be NULL for a Device Driver
|
||||||
|
//
|
||||||
|
if (ChildHandle == NULL) {
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Make sure this driver produced ChildHandle
|
||||||
|
//
|
||||||
|
Status = EfiTestChildHandle (
|
||||||
|
ControllerHandle,
|
||||||
|
ChildHandle,
|
||||||
|
&gEfiUdp6ProtocolGuid
|
||||||
|
);
|
||||||
|
if (!EFI_ERROR (Status)) {
|
||||||
|
//
|
||||||
|
// Retrieve an instance of a produced protocol from ChildHandle
|
||||||
|
//
|
||||||
|
Status = gBS->OpenProtocol (
|
||||||
|
ChildHandle,
|
||||||
|
&gEfiDns6ProtocolGuid,
|
||||||
|
(VOID **)&Dns6,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Update the component name for this child handle.
|
||||||
|
//
|
||||||
|
Status = UpdateDns6Name (Dns6);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Make sure this driver produced ChildHandle
|
||||||
|
//
|
||||||
|
Status = EfiTestChildHandle (
|
||||||
|
ControllerHandle,
|
||||||
|
ChildHandle,
|
||||||
|
&gEfiUdp4ProtocolGuid
|
||||||
|
);
|
||||||
|
if (!EFI_ERROR (Status)) {
|
||||||
|
//
|
||||||
|
// Retrieve an instance of a produced protocol from ChildHandle
|
||||||
|
//
|
||||||
|
Status = gBS->OpenProtocol (
|
||||||
|
ChildHandle,
|
||||||
|
&gEfiDns4ProtocolGuid,
|
||||||
|
(VOID **)&Dns4,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Update the component name for this child handle.
|
||||||
|
//
|
||||||
|
Status = UpdateDns4Name (Dns4);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return LookupUnicodeString2 (
|
||||||
|
Language,
|
||||||
|
This->SupportedLanguages,
|
||||||
|
gDnsControllerNameTable,
|
||||||
|
ControllerName,
|
||||||
|
(BOOLEAN)(This == &gDnsComponentName)
|
||||||
|
);
|
||||||
|
}
|
762
NetworkPkg/DnsDxe/DnsDhcp.c
Normal file
762
NetworkPkg/DnsDxe/DnsDhcp.c
Normal file
@ -0,0 +1,762 @@
|
|||||||
|
/** @file
|
||||||
|
Functions implementation related with DHCPv4/v6 for DNS driver.
|
||||||
|
|
||||||
|
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
|
||||||
|
This software and associated documentation (if any) is furnished
|
||||||
|
under a license and may only be used or copied in accordance
|
||||||
|
with the terms of the license. Except as permitted by such
|
||||||
|
license, no part of this software or documentation may be
|
||||||
|
reproduced, stored in a retrieval system, or transmitted in any
|
||||||
|
form or by any means without the express written consent of
|
||||||
|
Intel Corporation.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#include "DnsImpl.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
This function initialize the DHCP4 message instance.
|
||||||
|
|
||||||
|
This function will pad each item of dhcp4 message packet.
|
||||||
|
|
||||||
|
@param Seed Pointer to the message instance of the DHCP4 packet.
|
||||||
|
@param InterfaceInfo Pointer to the EFI_IP4_CONFIG2_INTERFACE_INFO instance.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
DnsInitSeedPacket (
|
||||||
|
OUT EFI_DHCP4_PACKET *Seed,
|
||||||
|
IN EFI_IP4_CONFIG2_INTERFACE_INFO *InterfaceInfo
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_DHCP4_HEADER *Header;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get IfType and HwAddressSize from SNP mode data.
|
||||||
|
//
|
||||||
|
Seed->Size = sizeof (EFI_DHCP4_PACKET);
|
||||||
|
Seed->Length = sizeof (Seed->Dhcp4);
|
||||||
|
Header = &Seed->Dhcp4.Header;
|
||||||
|
ZeroMem (Header, sizeof (EFI_DHCP4_HEADER));
|
||||||
|
Header->OpCode = DHCP4_OPCODE_REQUEST;
|
||||||
|
Header->HwType = InterfaceInfo->IfType;
|
||||||
|
Header->HwAddrLen = (UINT8) InterfaceInfo->HwAddressSize;
|
||||||
|
CopyMem (Header->ClientHwAddr, &(InterfaceInfo->HwAddress), Header->HwAddrLen);
|
||||||
|
|
||||||
|
Seed->Dhcp4.Magik = DHCP4_MAGIC;
|
||||||
|
Seed->Dhcp4.Option[0] = DHCP4_TAG_EOP;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
The common notify function.
|
||||||
|
|
||||||
|
@param[in] Event The event signaled.
|
||||||
|
@param[in] Context The context.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
EFIAPI
|
||||||
|
DhcpCommonNotify (
|
||||||
|
IN EFI_EVENT Event,
|
||||||
|
IN VOID *Context
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if ((Event == NULL) || (Context == NULL)) {
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
*((BOOLEAN *) Context) = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Parse the ACK to get required information
|
||||||
|
|
||||||
|
@param Dhcp4 The DHCP4 protocol.
|
||||||
|
@param Packet Packet waiting for parse.
|
||||||
|
@param DnsServerInfor The required Dns4 server information.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
|
||||||
|
@retval EFI_NO_MAPPING DHCP failed to acquire address and other information.
|
||||||
|
@retval EFI_DEVICE_ERROR Other errors as indicated.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
ParseDhcp4Ack (
|
||||||
|
IN EFI_DHCP4_PROTOCOL *Dhcp4,
|
||||||
|
IN EFI_DHCP4_PACKET *Packet,
|
||||||
|
IN DNS4_SERVER_INFOR *DnsServerInfor
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINT32 OptionCount;
|
||||||
|
EFI_DHCP4_PACKET_OPTION **OptionList;
|
||||||
|
UINT32 ServerCount;
|
||||||
|
EFI_IPv4_ADDRESS *ServerList;
|
||||||
|
UINT32 Index;
|
||||||
|
UINT32 Count;
|
||||||
|
|
||||||
|
ServerCount = 0;
|
||||||
|
ServerList = NULL;
|
||||||
|
|
||||||
|
OptionCount = 0;
|
||||||
|
OptionList = NULL;
|
||||||
|
|
||||||
|
Status = Dhcp4->Parse (Dhcp4, Packet, &OptionCount, OptionList);
|
||||||
|
if (Status != EFI_BUFFER_TOO_SMALL) {
|
||||||
|
return EFI_DEVICE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
OptionList = AllocatePool (OptionCount * sizeof (EFI_DHCP4_PACKET_OPTION *));
|
||||||
|
if (OptionList == NULL) {
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = Dhcp4->Parse (Dhcp4, Packet, &OptionCount, OptionList);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
gBS->FreePool (OptionList);
|
||||||
|
return EFI_DEVICE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = EFI_NOT_FOUND;
|
||||||
|
|
||||||
|
for (Index = 0; Index < OptionCount; Index++) {
|
||||||
|
//
|
||||||
|
// Get DNS server addresses
|
||||||
|
//
|
||||||
|
if (OptionList[Index]->OpCode == DHCP4_TAG_DNS_SERVER) {
|
||||||
|
|
||||||
|
if (((OptionList[Index]->Length & 0x3) != 0) || (OptionList[Index]->Length == 0)) {
|
||||||
|
Status = EFI_DEVICE_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ServerCount = OptionList[Index]->Length/4;
|
||||||
|
ServerList = AllocatePool (ServerCount * sizeof (EFI_IPv4_ADDRESS));
|
||||||
|
if (ServerList == NULL) {
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Count=0; Count < ServerCount; Count++){
|
||||||
|
CopyMem (ServerList + Count, &OptionList[Index]->Data[4 * Count], sizeof (EFI_IPv4_ADDRESS));
|
||||||
|
}
|
||||||
|
|
||||||
|
*(DnsServerInfor->ServerCount) = ServerCount;
|
||||||
|
DnsServerInfor->ServerList = ServerList;
|
||||||
|
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gBS->FreePool (OptionList);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
EFI_DHCP6_INFO_CALLBACK is provided by the consumer of the EFI DHCPv6 Protocol
|
||||||
|
instance to intercept events that occurs in the DHCPv6 Information Request
|
||||||
|
exchange process.
|
||||||
|
|
||||||
|
@param This Pointer to the EFI_DHCP6_PROTOCOL instance that
|
||||||
|
is used to configure this callback function.
|
||||||
|
@param Context Pointer to the context that is initialized in
|
||||||
|
the EFI_DHCP6_PROTOCOL.InfoRequest().
|
||||||
|
@param Packet Pointer to Reply packet that has been received.
|
||||||
|
The EFI DHCPv6 Protocol instance is responsible
|
||||||
|
for freeing the buffer.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
|
||||||
|
@retval EFI_DEVICE_ERROR Other errors as indicated.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ParseDhcp6Ack (
|
||||||
|
IN EFI_DHCP6_PROTOCOL *This,
|
||||||
|
IN VOID *Context,
|
||||||
|
IN EFI_DHCP6_PACKET *Packet
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINT32 OptionCount;
|
||||||
|
EFI_DHCP6_PACKET_OPTION **OptionList;
|
||||||
|
DNS6_SERVER_INFOR *DnsServerInfor;
|
||||||
|
UINT32 ServerCount;
|
||||||
|
EFI_IPv6_ADDRESS *ServerList;
|
||||||
|
UINT32 Index;
|
||||||
|
UINT32 Count;
|
||||||
|
|
||||||
|
OptionCount = 0;
|
||||||
|
ServerCount = 0;
|
||||||
|
ServerList = NULL;
|
||||||
|
|
||||||
|
Status = This->Parse (This, Packet, &OptionCount, NULL);
|
||||||
|
if (Status != EFI_BUFFER_TOO_SMALL) {
|
||||||
|
return EFI_DEVICE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
OptionList = AllocateZeroPool (OptionCount * sizeof (EFI_DHCP6_PACKET_OPTION *));
|
||||||
|
if (OptionList == NULL) {
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = This->Parse (This, Packet, &OptionCount, OptionList);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
gBS->FreePool (OptionList);
|
||||||
|
return EFI_DEVICE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
DnsServerInfor = (DNS6_SERVER_INFOR *) Context;
|
||||||
|
|
||||||
|
for (Index = 0; Index < OptionCount; Index++) {
|
||||||
|
OptionList[Index]->OpCode = NTOHS (OptionList[Index]->OpCode);
|
||||||
|
OptionList[Index]->OpLen = NTOHS (OptionList[Index]->OpLen);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get DNS server addresses from this reply packet.
|
||||||
|
//
|
||||||
|
if (OptionList[Index]->OpCode == DHCP6_TAG_DNS_SERVER) {
|
||||||
|
|
||||||
|
if (((OptionList[Index]->OpLen & 0xf) != 0) || (OptionList[Index]->OpLen == 0)) {
|
||||||
|
Status = EFI_DEVICE_ERROR;
|
||||||
|
gBS->FreePool (OptionList);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
ServerCount = OptionList[Index]->OpLen/16;
|
||||||
|
ServerList = AllocatePool (ServerCount * sizeof (EFI_IPv6_ADDRESS));
|
||||||
|
if (ServerList == NULL) {
|
||||||
|
gBS->FreePool (OptionList);
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Count=0; Count < ServerCount; Count++){
|
||||||
|
CopyMem (ServerList + Count, &OptionList[Index]->Data[16 * Count], sizeof (EFI_IPv6_ADDRESS));
|
||||||
|
}
|
||||||
|
|
||||||
|
*(DnsServerInfor->ServerCount) = ServerCount;
|
||||||
|
DnsServerInfor->ServerList = ServerList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gBS->FreePool (OptionList);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Parse the DHCP ACK to get Dns4 server information.
|
||||||
|
|
||||||
|
@param Instance The DNS instance.
|
||||||
|
@param DnsServerCount Retrieved Dns4 server Ip count.
|
||||||
|
@param DnsServerList Retrieved Dns4 server Ip list.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The Dns4 information is got from the DHCP ACK.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
|
||||||
|
@retval EFI_NO_MEDIA There was a media error.
|
||||||
|
@retval Others Other errors as indicated.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
GetDns4ServerFromDhcp4 (
|
||||||
|
IN DNS_INSTANCE *Instance,
|
||||||
|
OUT UINT32 *DnsServerCount,
|
||||||
|
OUT EFI_IPv4_ADDRESS **DnsServerList
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_HANDLE Image;
|
||||||
|
EFI_HANDLE Controller;
|
||||||
|
BOOLEAN MediaPresent;
|
||||||
|
EFI_HANDLE MnpChildHandle;
|
||||||
|
EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
|
||||||
|
EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData;
|
||||||
|
EFI_HANDLE Dhcp4Handle;
|
||||||
|
EFI_DHCP4_PROTOCOL *Dhcp4;
|
||||||
|
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
||||||
|
UINTN DataSize;
|
||||||
|
VOID *Data;
|
||||||
|
EFI_IP4_CONFIG2_INTERFACE_INFO *InterfaceInfo;
|
||||||
|
EFI_DHCP4_PACKET SeedPacket;
|
||||||
|
EFI_DHCP4_PACKET_OPTION *ParaList[2];
|
||||||
|
DNS4_SERVER_INFOR DnsServerInfor;
|
||||||
|
|
||||||
|
EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN Token;
|
||||||
|
BOOLEAN IsDone;
|
||||||
|
UINTN Index;
|
||||||
|
|
||||||
|
Image = Instance->Service->ImageHandle;
|
||||||
|
Controller = Instance->Service->ControllerHandle;
|
||||||
|
|
||||||
|
MnpChildHandle = NULL;
|
||||||
|
Mnp = NULL;
|
||||||
|
|
||||||
|
Dhcp4Handle = NULL;
|
||||||
|
Dhcp4 = NULL;
|
||||||
|
|
||||||
|
Ip4Config2 = NULL;
|
||||||
|
DataSize = 0;
|
||||||
|
Data = NULL;
|
||||||
|
InterfaceInfo = NULL;
|
||||||
|
|
||||||
|
ZeroMem (&MnpConfigData, sizeof (EFI_MANAGED_NETWORK_CONFIG_DATA));
|
||||||
|
|
||||||
|
ZeroMem (&DnsServerInfor, sizeof (DNS4_SERVER_INFOR));
|
||||||
|
|
||||||
|
ZeroMem (&Token, sizeof (EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN));
|
||||||
|
|
||||||
|
DnsServerInfor.ServerCount = DnsServerCount;
|
||||||
|
|
||||||
|
IsDone = FALSE;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check media.
|
||||||
|
//
|
||||||
|
MediaPresent = TRUE;
|
||||||
|
NetLibDetectMedia (Controller, &MediaPresent);
|
||||||
|
if (!MediaPresent) {
|
||||||
|
return EFI_NO_MEDIA;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create a Mnp child instance, get the protocol and config for it.
|
||||||
|
//
|
||||||
|
Status = NetLibCreateServiceChild (
|
||||||
|
Controller,
|
||||||
|
Image,
|
||||||
|
&gEfiManagedNetworkServiceBindingProtocolGuid,
|
||||||
|
&MnpChildHandle
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = gBS->OpenProtocol (
|
||||||
|
MnpChildHandle,
|
||||||
|
&gEfiManagedNetworkProtocolGuid,
|
||||||
|
(VOID **) &Mnp,
|
||||||
|
Image,
|
||||||
|
Controller,
|
||||||
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
MnpConfigData.ReceivedQueueTimeoutValue = 0;
|
||||||
|
MnpConfigData.TransmitQueueTimeoutValue = 0;
|
||||||
|
MnpConfigData.ProtocolTypeFilter = IP4_ETHER_PROTO;
|
||||||
|
MnpConfigData.EnableUnicastReceive = TRUE;
|
||||||
|
MnpConfigData.EnableMulticastReceive = TRUE;
|
||||||
|
MnpConfigData.EnableBroadcastReceive = TRUE;
|
||||||
|
MnpConfigData.EnablePromiscuousReceive = FALSE;
|
||||||
|
MnpConfigData.FlushQueuesOnReset = TRUE;
|
||||||
|
MnpConfigData.EnableReceiveTimestamps = FALSE;
|
||||||
|
MnpConfigData.DisableBackgroundPolling = FALSE;
|
||||||
|
|
||||||
|
Status = Mnp->Configure(Mnp, &MnpConfigData);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create a DHCP4 child instance and get the protocol.
|
||||||
|
//
|
||||||
|
Status = NetLibCreateServiceChild (
|
||||||
|
Controller,
|
||||||
|
Image,
|
||||||
|
&gEfiDhcp4ServiceBindingProtocolGuid,
|
||||||
|
&Dhcp4Handle
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = gBS->OpenProtocol (
|
||||||
|
Dhcp4Handle,
|
||||||
|
&gEfiDhcp4ProtocolGuid,
|
||||||
|
(VOID **) &Dhcp4,
|
||||||
|
Image,
|
||||||
|
Controller,
|
||||||
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get Ip4Config2 instance info.
|
||||||
|
//
|
||||||
|
Status = gBS->HandleProtocol (Controller, &gEfiIp4Config2ProtocolGuid, (VOID **) &Ip4Config2);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = Ip4Config2->GetData (Ip4Config2, Ip4Config2DataTypeInterfaceInfo, &DataSize, Data);
|
||||||
|
if (EFI_ERROR (Status) && Status != EFI_BUFFER_TOO_SMALL) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
Data = AllocateZeroPool (DataSize);
|
||||||
|
if (Data == NULL) {
|
||||||
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = Ip4Config2->GetData (Ip4Config2, Ip4Config2DataTypeInterfaceInfo, &DataSize, Data);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
InterfaceInfo = (EFI_IP4_CONFIG2_INTERFACE_INFO *)Data;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Build required Token.
|
||||||
|
//
|
||||||
|
Status = gBS->CreateEvent (
|
||||||
|
EVT_NOTIFY_SIGNAL,
|
||||||
|
TPL_NOTIFY,
|
||||||
|
DhcpCommonNotify,
|
||||||
|
&IsDone,
|
||||||
|
&Token.CompletionEvent
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetMem (&Token.RemoteAddress, sizeof (EFI_IPv4_ADDRESS), 0xff);
|
||||||
|
|
||||||
|
Token.RemotePort = 67;
|
||||||
|
|
||||||
|
Token.ListenPointCount = 1;
|
||||||
|
|
||||||
|
Token.ListenPoints = AllocateZeroPool (Token.ListenPointCount * sizeof (EFI_DHCP4_LISTEN_POINT));
|
||||||
|
if (Token.ListenPoints == NULL) {
|
||||||
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Instance->Dns4CfgData.UseDefaultSetting) {
|
||||||
|
CopyMem (&(Token.ListenPoints[0].ListenAddress), &(InterfaceInfo->StationAddress), sizeof (EFI_IPv4_ADDRESS));
|
||||||
|
CopyMem (&(Token.ListenPoints[0].SubnetMask), &(InterfaceInfo->SubnetMask), sizeof (EFI_IPv4_ADDRESS));
|
||||||
|
} else {
|
||||||
|
CopyMem (&(Token.ListenPoints[0].ListenAddress), &(Instance->Dns4CfgData.StationIp), sizeof (EFI_IPv4_ADDRESS));
|
||||||
|
CopyMem (&(Token.ListenPoints[0].SubnetMask), &(Instance->Dns4CfgData.SubnetMask), sizeof (EFI_IPv4_ADDRESS));
|
||||||
|
}
|
||||||
|
|
||||||
|
Token.ListenPoints[0].ListenPort = 68;
|
||||||
|
|
||||||
|
Token.TimeoutValue = DNS_TIME_TO_GETMAP;
|
||||||
|
|
||||||
|
DnsInitSeedPacket (&SeedPacket, InterfaceInfo);
|
||||||
|
|
||||||
|
ParaList[0] = AllocateZeroPool (sizeof (EFI_DHCP4_PACKET_OPTION));
|
||||||
|
if (ParaList[0] == NULL) {
|
||||||
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
ParaList[0]->OpCode = DHCP4_TAG_TYPE;
|
||||||
|
ParaList[0]->Length = 1;
|
||||||
|
ParaList[0]->Data[0] = DHCP4_MSG_INFORM;
|
||||||
|
|
||||||
|
ParaList[1] = AllocateZeroPool (sizeof (EFI_DHCP4_PACKET_OPTION));
|
||||||
|
if (ParaList[1] == NULL) {
|
||||||
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
ParaList[1]->OpCode = DHCP4_TAG_PARA_LIST;
|
||||||
|
ParaList[1]->Length = 1;
|
||||||
|
ParaList[1]->Data[0] = DHCP4_TAG_DNS_SERVER;
|
||||||
|
|
||||||
|
Status = Dhcp4->Build (Dhcp4, &SeedPacket, 0, NULL, 2, ParaList, &Token.Packet);
|
||||||
|
|
||||||
|
Token.Packet->Dhcp4.Header.Xid = HTONL(NET_RANDOM (NetRandomInitSeed ()));
|
||||||
|
|
||||||
|
Token.Packet->Dhcp4.Header.Reserved = HTONS ((UINT16)0x8000);
|
||||||
|
|
||||||
|
if (Instance->Dns4CfgData.UseDefaultSetting) {
|
||||||
|
CopyMem (&(Token.Packet->Dhcp4.Header.ClientAddr), &(InterfaceInfo->StationAddress), sizeof (EFI_IPv4_ADDRESS));
|
||||||
|
} else {
|
||||||
|
CopyMem (&(Token.Packet->Dhcp4.Header.ClientAddr), &(Instance->Dns4CfgData.StationIp), sizeof (EFI_IPv4_ADDRESS));
|
||||||
|
}
|
||||||
|
|
||||||
|
CopyMem (Token.Packet->Dhcp4.Header.ClientHwAddr, &(InterfaceInfo->HwAddress), InterfaceInfo->HwAddressSize);
|
||||||
|
|
||||||
|
Token.Packet->Dhcp4.Header.HwAddrLen = (UINT8)(InterfaceInfo->HwAddressSize);
|
||||||
|
|
||||||
|
//
|
||||||
|
// TransmitReceive Token
|
||||||
|
//
|
||||||
|
Status = Dhcp4->TransmitReceive (Dhcp4, &Token);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Poll the packet
|
||||||
|
//
|
||||||
|
do {
|
||||||
|
Status = Mnp->Poll (Mnp);
|
||||||
|
} while (!IsDone);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Parse the ACK to get required information if received done.
|
||||||
|
//
|
||||||
|
if (IsDone && !EFI_ERROR (Token.Status)) {
|
||||||
|
for (Index = 0; Index < Token.ResponseCount; Index++) {
|
||||||
|
Status = ParseDhcp4Ack (Dhcp4, &Token.ResponseList[Index], &DnsServerInfor);
|
||||||
|
if (!EFI_ERROR (Status)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*DnsServerList = DnsServerInfor.ServerList;
|
||||||
|
} else {
|
||||||
|
Status = Token.Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
ON_EXIT:
|
||||||
|
|
||||||
|
if (Data != NULL) {
|
||||||
|
FreePool (Data);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Index = 0; Index < 2; Index++) {
|
||||||
|
if (ParaList[Index] != NULL) {
|
||||||
|
FreePool (ParaList[Index]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Token.ListenPoints) {
|
||||||
|
FreePool (Token.ListenPoints);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Token.Packet) {
|
||||||
|
FreePool (Token.Packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Token.ResponseList != NULL) {
|
||||||
|
FreePool (Token.ResponseList);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Token.CompletionEvent != NULL) {
|
||||||
|
gBS->CloseEvent (Token.CompletionEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Dhcp4 != NULL) {
|
||||||
|
Dhcp4->Stop (Dhcp4);
|
||||||
|
Dhcp4->Configure (Dhcp4, NULL);
|
||||||
|
|
||||||
|
gBS->CloseProtocol (
|
||||||
|
Dhcp4Handle,
|
||||||
|
&gEfiDhcp4ProtocolGuid,
|
||||||
|
Image,
|
||||||
|
Controller
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Dhcp4Handle != NULL) {
|
||||||
|
NetLibDestroyServiceChild (
|
||||||
|
Controller,
|
||||||
|
Image,
|
||||||
|
&gEfiDhcp4ServiceBindingProtocolGuid,
|
||||||
|
Dhcp4Handle
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Mnp != NULL) {
|
||||||
|
Mnp->Configure (Mnp, NULL);
|
||||||
|
|
||||||
|
gBS->CloseProtocol (
|
||||||
|
MnpChildHandle,
|
||||||
|
&gEfiManagedNetworkProtocolGuid,
|
||||||
|
Image,
|
||||||
|
Controller
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
NetLibDestroyServiceChild (
|
||||||
|
Controller,
|
||||||
|
Image,
|
||||||
|
&gEfiManagedNetworkServiceBindingProtocolGuid,
|
||||||
|
MnpChildHandle
|
||||||
|
);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Parse the DHCP ACK to get Dns6 server information.
|
||||||
|
|
||||||
|
@param Image The handle of the driver image.
|
||||||
|
@param Controller The handle of the controller.
|
||||||
|
@param DnsServerCount Retrieved Dns6 server Ip count.
|
||||||
|
@param DnsServerList Retrieved Dns6 server Ip list.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The Dns6 information is got from the DHCP ACK.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
|
||||||
|
@retval EFI_NO_MEDIA There was a media error.
|
||||||
|
@retval Others Other errors as indicated.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
GetDns6ServerFromDhcp6 (
|
||||||
|
IN EFI_HANDLE Image,
|
||||||
|
IN EFI_HANDLE Controller,
|
||||||
|
OUT UINT32 *DnsServerCount,
|
||||||
|
OUT EFI_IPv6_ADDRESS **DnsServerList
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_HANDLE Dhcp6Handle;
|
||||||
|
EFI_DHCP6_PROTOCOL *Dhcp6;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_STATUS TimerStatus;
|
||||||
|
EFI_DHCP6_PACKET_OPTION *Oro;
|
||||||
|
EFI_DHCP6_RETRANSMISSION InfoReqReXmit;
|
||||||
|
EFI_EVENT Timer;
|
||||||
|
BOOLEAN MediaPresent;
|
||||||
|
DNS6_SERVER_INFOR DnsServerInfor;
|
||||||
|
|
||||||
|
Dhcp6Handle = NULL;
|
||||||
|
Dhcp6 = NULL;
|
||||||
|
Oro = NULL;
|
||||||
|
Timer = NULL;
|
||||||
|
|
||||||
|
ZeroMem (&DnsServerInfor, sizeof (DNS6_SERVER_INFOR));
|
||||||
|
|
||||||
|
DnsServerInfor.ServerCount = DnsServerCount;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check media status before doing DHCP.
|
||||||
|
//
|
||||||
|
MediaPresent = TRUE;
|
||||||
|
NetLibDetectMedia (Controller, &MediaPresent);
|
||||||
|
if (!MediaPresent) {
|
||||||
|
return EFI_NO_MEDIA;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Create a DHCP6 child instance and get the protocol.
|
||||||
|
//
|
||||||
|
Status = NetLibCreateServiceChild (
|
||||||
|
Controller,
|
||||||
|
Image,
|
||||||
|
&gEfiDhcp6ServiceBindingProtocolGuid,
|
||||||
|
&Dhcp6Handle
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = gBS->OpenProtocol (
|
||||||
|
Dhcp6Handle,
|
||||||
|
&gEfiDhcp6ProtocolGuid,
|
||||||
|
(VOID **) &Dhcp6,
|
||||||
|
Image,
|
||||||
|
Controller,
|
||||||
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
|
);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
Oro = AllocateZeroPool (sizeof (EFI_DHCP6_PACKET_OPTION) + 1);
|
||||||
|
if (Oro == NULL) {
|
||||||
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Ask the server to reply with DNS options.
|
||||||
|
// All members in EFI_DHCP6_PACKET_OPTION are in network order.
|
||||||
|
//
|
||||||
|
Oro->OpCode = HTONS (DHCP6_TAG_DNS_REQUEST);
|
||||||
|
Oro->OpLen = HTONS (2);
|
||||||
|
Oro->Data[1] = DHCP6_TAG_DNS_SERVER;
|
||||||
|
|
||||||
|
InfoReqReXmit.Irt = 4;
|
||||||
|
InfoReqReXmit.Mrc = 1;
|
||||||
|
InfoReqReXmit.Mrt = 10;
|
||||||
|
InfoReqReXmit.Mrd = 30;
|
||||||
|
|
||||||
|
Status = Dhcp6->InfoRequest (
|
||||||
|
Dhcp6,
|
||||||
|
TRUE,
|
||||||
|
Oro,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
&InfoReqReXmit,
|
||||||
|
NULL,
|
||||||
|
ParseDhcp6Ack,
|
||||||
|
&DnsServerInfor
|
||||||
|
);
|
||||||
|
if (Status == EFI_NO_MAPPING) {
|
||||||
|
Status = gBS->CreateEvent (EVT_TIMER, TPL_CALLBACK, NULL, NULL, &Timer);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = gBS->SetTimer (
|
||||||
|
Timer,
|
||||||
|
TimerRelative,
|
||||||
|
DNS_TIME_TO_GETMAP * TICKS_PER_SECOND
|
||||||
|
);
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
TimerStatus = gBS->CheckEvent (Timer);
|
||||||
|
if (!EFI_ERROR (TimerStatus)) {
|
||||||
|
Status = Dhcp6->InfoRequest (
|
||||||
|
Dhcp6,
|
||||||
|
TRUE,
|
||||||
|
Oro,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
&InfoReqReXmit,
|
||||||
|
NULL,
|
||||||
|
ParseDhcp6Ack,
|
||||||
|
&DnsServerInfor
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} while (TimerStatus == EFI_NOT_READY);
|
||||||
|
}
|
||||||
|
|
||||||
|
*DnsServerList = DnsServerInfor.ServerList;
|
||||||
|
|
||||||
|
ON_EXIT:
|
||||||
|
|
||||||
|
if (Oro != NULL) {
|
||||||
|
FreePool (Oro);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Timer != NULL) {
|
||||||
|
gBS->CloseEvent (Timer);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Dhcp6 != NULL) {
|
||||||
|
gBS->CloseProtocol (
|
||||||
|
Dhcp6Handle,
|
||||||
|
&gEfiDhcp6ProtocolGuid,
|
||||||
|
Image,
|
||||||
|
Controller
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
NetLibDestroyServiceChild (
|
||||||
|
Controller,
|
||||||
|
Image,
|
||||||
|
&gEfiDhcp6ServiceBindingProtocolGuid,
|
||||||
|
Dhcp6Handle
|
||||||
|
);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
145
NetworkPkg/DnsDxe/DnsDhcp.h
Normal file
145
NetworkPkg/DnsDxe/DnsDhcp.h
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
/** @file
|
||||||
|
Functions implementation related with DHCPv4/v6 for DNS driver.
|
||||||
|
|
||||||
|
Copyright (c) 2015, 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.php
|
||||||
|
|
||||||
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _DNS_DHCP_H_
|
||||||
|
#define _DNS_DHCP_H_
|
||||||
|
|
||||||
|
//
|
||||||
|
// DHCP DNS related
|
||||||
|
//
|
||||||
|
#pragma pack(1)
|
||||||
|
|
||||||
|
#define IP4_ETHER_PROTO 0x0800
|
||||||
|
|
||||||
|
#define DHCP4_OPCODE_REQUEST 1
|
||||||
|
#define DHCP4_MAGIC 0x63538263 /// network byte order
|
||||||
|
#define DHCP4_TAG_EOP 255 /// End Option
|
||||||
|
|
||||||
|
#define DHCP4_TAG_TYPE 53
|
||||||
|
#define DHCP4_MSG_REQUEST 3
|
||||||
|
#define DHCP4_MSG_INFORM 8
|
||||||
|
|
||||||
|
#define DHCP4_TAG_PARA_LIST 55
|
||||||
|
#define DHCP4_TAG_DNS_SERVER 6
|
||||||
|
|
||||||
|
|
||||||
|
#define DHCP6_TAG_DNS_REQUEST 6
|
||||||
|
#define DHCP6_TAG_DNS_SERVER 23
|
||||||
|
|
||||||
|
//
|
||||||
|
// The required Dns4 server information.
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
UINT32 *ServerCount;
|
||||||
|
EFI_IPv4_ADDRESS *ServerList;
|
||||||
|
} DNS4_SERVER_INFOR;
|
||||||
|
|
||||||
|
//
|
||||||
|
// The required Dns6 server information.
|
||||||
|
//
|
||||||
|
typedef struct {
|
||||||
|
UINT32 *ServerCount;
|
||||||
|
EFI_IPv6_ADDRESS *ServerList;
|
||||||
|
} DNS6_SERVER_INFOR;
|
||||||
|
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
/**
|
||||||
|
Parse the ACK to get required information
|
||||||
|
|
||||||
|
@param Dhcp4 The DHCP4 protocol.
|
||||||
|
@param Packet Packet waiting for parse.
|
||||||
|
@param DnsServerInfor The required Dns4 server information.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
|
||||||
|
@retval EFI_NO_MAPPING DHCP failed to acquire address and other information.
|
||||||
|
@retval EFI_DEVICE_ERROR Other errors as indicated.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
ParseDhcp4Ack (
|
||||||
|
IN EFI_DHCP4_PROTOCOL *Dhcp4,
|
||||||
|
IN EFI_DHCP4_PACKET *Packet,
|
||||||
|
IN DNS4_SERVER_INFOR *DnsServerInfor
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
EFI_DHCP6_INFO_CALLBACK is provided by the consumer of the EFI DHCPv6 Protocol
|
||||||
|
instance to intercept events that occurs in the DHCPv6 Information Request
|
||||||
|
exchange process.
|
||||||
|
|
||||||
|
@param This Pointer to the EFI_DHCP6_PROTOCOL instance that
|
||||||
|
is used to configure this callback function.
|
||||||
|
@param Context Pointer to the context that is initialized in
|
||||||
|
the EFI_DHCP6_PROTOCOL.InfoRequest().
|
||||||
|
@param Packet Pointer to Reply packet that has been received.
|
||||||
|
The EFI DHCPv6 Protocol instance is responsible
|
||||||
|
for freeing the buffer.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
|
||||||
|
@retval EFI_DEVICE_ERROR Other errors as indicated.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
ParseDhcp6Ack (
|
||||||
|
IN EFI_DHCP6_PROTOCOL *This,
|
||||||
|
IN VOID *Context,
|
||||||
|
IN EFI_DHCP6_PACKET *Packet
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Parse the DHCP ACK to get Dns4 server information.
|
||||||
|
|
||||||
|
@param Instance The DNS instance.
|
||||||
|
@param DnsServerCount Retrieved Dns4 server Ip count.
|
||||||
|
@param DnsServerList Retrieved Dns4 server Ip list.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The Dns4 information is got from the DHCP ACK.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
|
||||||
|
@retval EFI_NO_MEDIA There was a media error.
|
||||||
|
@retval Others Other errors as indicated.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
GetDns4ServerFromDhcp4 (
|
||||||
|
IN DNS_INSTANCE *Instance,
|
||||||
|
OUT UINT32 *DnsServerCount,
|
||||||
|
OUT EFI_IPv4_ADDRESS **DnsServerList
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Parse the DHCP ACK to get Dns6 server information.
|
||||||
|
|
||||||
|
@param Image The handle of the driver image.
|
||||||
|
@param Controller The handle of the controller.
|
||||||
|
@param DnsServerCount Retrieved Dns6 server Ip count.
|
||||||
|
@param DnsServerList Retrieved Dns6 server Ip list.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The Dns6 information is got from the DHCP ACK.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
|
||||||
|
@retval EFI_NO_MEDIA There was a media error.
|
||||||
|
@retval Others Other errors as indicated.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
GetDns6ServerFromDhcp6 (
|
||||||
|
IN EFI_HANDLE Image,
|
||||||
|
IN EFI_HANDLE Controller,
|
||||||
|
OUT UINT32 *DnsServerCount,
|
||||||
|
OUT EFI_IPv6_ADDRESS **DnsServerList
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif
|
1554
NetworkPkg/DnsDxe/DnsDriver.c
Normal file
1554
NetworkPkg/DnsDxe/DnsDriver.c
Normal file
File diff suppressed because it is too large
Load Diff
606
NetworkPkg/DnsDxe/DnsDriver.h
Normal file
606
NetworkPkg/DnsDxe/DnsDriver.h
Normal file
@ -0,0 +1,606 @@
|
|||||||
|
/** @file
|
||||||
|
The header files of the driver binding and service binding protocol for DnsDxe driver.
|
||||||
|
|
||||||
|
Copyright (c) 2015, 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.php
|
||||||
|
|
||||||
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
#ifndef _DNS_DRIVER_H_
|
||||||
|
#define _DNS_DRIVER_H_
|
||||||
|
|
||||||
|
#include <Protocol/DriverBinding.h>
|
||||||
|
#include <Protocol/ServiceBinding.h>
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Dns service block
|
||||||
|
///
|
||||||
|
typedef struct _DNS_DRIVER_DATA DNS_DRIVER_DATA;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Dns service block
|
||||||
|
///
|
||||||
|
typedef struct _DNS_SERVICE DNS_SERVICE;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Dns instance block
|
||||||
|
///
|
||||||
|
typedef struct _DNS_INSTANCE DNS_INSTANCE;
|
||||||
|
|
||||||
|
#define DNS_SERVICE_SIGNATURE SIGNATURE_32 ('D', 'N', 'S', 'S')
|
||||||
|
|
||||||
|
#define DNS_INSTANCE_SIGNATURE SIGNATURE_32 ('D', 'N', 'S', 'I')
|
||||||
|
|
||||||
|
struct _DNS_DRIVER_DATA {
|
||||||
|
EFI_EVENT Timer; /// Ticking timer for DNS cache update.
|
||||||
|
|
||||||
|
LIST_ENTRY Dns4CacheList;
|
||||||
|
LIST_ENTRY Dns4ServerList;
|
||||||
|
|
||||||
|
LIST_ENTRY Dns6CacheList;
|
||||||
|
LIST_ENTRY Dns6ServerList;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _DNS_SERVICE {
|
||||||
|
UINT32 Signature;
|
||||||
|
EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
|
||||||
|
|
||||||
|
UINT16 Dns4ChildrenNum;
|
||||||
|
LIST_ENTRY Dns4ChildrenList;
|
||||||
|
|
||||||
|
UINT16 Dns6ChildrenNum;
|
||||||
|
LIST_ENTRY Dns6ChildrenList;
|
||||||
|
|
||||||
|
EFI_HANDLE ControllerHandle;
|
||||||
|
EFI_HANDLE ImageHandle;
|
||||||
|
|
||||||
|
EFI_EVENT TimerToGetMap;
|
||||||
|
|
||||||
|
EFI_EVENT Timer; /// Ticking timer for packet retransmission.
|
||||||
|
|
||||||
|
UINT8 IpVersion;
|
||||||
|
UDP_IO *ConnectUdp;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _DNS_INSTANCE {
|
||||||
|
UINT32 Signature;
|
||||||
|
LIST_ENTRY Link;
|
||||||
|
|
||||||
|
EFI_DNS4_PROTOCOL Dns4;
|
||||||
|
EFI_DNS6_PROTOCOL Dns6;
|
||||||
|
|
||||||
|
INTN State;
|
||||||
|
BOOLEAN InDestroy;
|
||||||
|
|
||||||
|
DNS_SERVICE *Service;
|
||||||
|
EFI_HANDLE ChildHandle;
|
||||||
|
|
||||||
|
EFI_DNS4_CONFIG_DATA Dns4CfgData;
|
||||||
|
EFI_DNS6_CONFIG_DATA Dns6CfgData;
|
||||||
|
|
||||||
|
EFI_IP_ADDRESS SessionDnsServer;
|
||||||
|
|
||||||
|
NET_MAP Dns4TxTokens;
|
||||||
|
NET_MAP Dns6TxTokens;
|
||||||
|
|
||||||
|
UINT32 MaxRetry;
|
||||||
|
|
||||||
|
UDP_IO *UdpIo;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||||
|
UINTN NumberOfChildren;
|
||||||
|
EFI_HANDLE *ChildHandleBuffer;
|
||||||
|
} DNS_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT;
|
||||||
|
|
||||||
|
extern DNS_DRIVER_DATA *mDriverData;
|
||||||
|
|
||||||
|
#define DNS_SERVICE_FROM_THIS(a) \
|
||||||
|
CR (a, DNS_SERVICE, ServiceBinding, DNS_SERVICE_SIGNATURE)
|
||||||
|
|
||||||
|
#define DNS_INSTANCE_FROM_THIS_PROTOCOL4(a) \
|
||||||
|
CR (a, DNS_INSTANCE, Dns4, DNS_INSTANCE_SIGNATURE)
|
||||||
|
|
||||||
|
#define DNS_INSTANCE_FROM_THIS_PROTOCOL6(a) \
|
||||||
|
CR (a, DNS_INSTANCE, Dns6, DNS_INSTANCE_SIGNATURE)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Destroy the DNS instance and recycle the resources.
|
||||||
|
|
||||||
|
@param[in] Instance The pointer to the DNS instance.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
DnsDestroyInstance (
|
||||||
|
IN DNS_INSTANCE *Instance
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Create the DNS instance and initialize it.
|
||||||
|
|
||||||
|
@param[in] Service The pointer to the DNS service.
|
||||||
|
@param[out] Instance The pointer to the DNS instance.
|
||||||
|
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
|
||||||
|
@retval EFI_SUCCESS The DNS instance is created.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
DnsCreateInstance (
|
||||||
|
IN DNS_SERVICE *Service,
|
||||||
|
OUT DNS_INSTANCE **Instance
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Callback function which provided by user to remove one node in NetDestroyLinkList process.
|
||||||
|
|
||||||
|
@param[in] Entry The entry to be removed.
|
||||||
|
@param[in] Context Pointer to the callback context corresponds to the Context in NetDestroyLinkList.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The entry has been removed successfully.
|
||||||
|
@retval Others Fail to remove the entry.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
DnsDestroyChildEntryInHandleBuffer (
|
||||||
|
IN LIST_ENTRY *Entry,
|
||||||
|
IN VOID *Context
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Config a NULL UDP that is used to keep the connection between UDP and DNS.
|
||||||
|
|
||||||
|
Just leave the Udp child unconfigured. When UDP is unloaded,
|
||||||
|
DNS will be informed with DriverBinding Stop.
|
||||||
|
|
||||||
|
@param UdpIo The UDP_IO to configure
|
||||||
|
@param Context The opaque parameter to the callback
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS It always return EFI_SUCCESS directly.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
DnsConfigNullUdp (
|
||||||
|
IN UDP_IO *UdpIo,
|
||||||
|
IN VOID *Context
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Release all the resource used the DNS service binding instance.
|
||||||
|
|
||||||
|
@param DnsSb The Dns service binding instance.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID
|
||||||
|
DnsDestroyService (
|
||||||
|
IN DNS_SERVICE *DnsSb
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Create then initialize a Dns service binding instance.
|
||||||
|
|
||||||
|
@param Controller The controller to install the DNS service
|
||||||
|
binding on
|
||||||
|
@param Image The driver binding image of the DNS driver
|
||||||
|
@param IpVersion IpVersion for this service
|
||||||
|
@param Service The variable to receive the created service
|
||||||
|
binding instance.
|
||||||
|
|
||||||
|
@retval EFI_OUT_OF_RESOURCES Failed to allocate resource to create the instance.
|
||||||
|
@retval EFI_DEVICE_ERROR Failed to create a NULL UDP port to keep
|
||||||
|
connection with UDP.
|
||||||
|
@retval EFI_SUCCESS The service instance is created for the
|
||||||
|
controller.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
DnsCreateService (
|
||||||
|
IN EFI_HANDLE Controller,
|
||||||
|
IN EFI_HANDLE Image,
|
||||||
|
IN UINT8 IpVersion,
|
||||||
|
OUT DNS_SERVICE **Service
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Unloads an image.
|
||||||
|
|
||||||
|
@param ImageHandle Handle that identifies the image to be unloaded.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The image has been unloaded.
|
||||||
|
@retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
DnsUnload (
|
||||||
|
IN EFI_HANDLE ImageHandle
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
This is the declaration of an EFI image entry point. This entry point is
|
||||||
|
the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
|
||||||
|
both device drivers and bus drivers.
|
||||||
|
|
||||||
|
@param ImageHandle The firmware allocated handle for the UEFI image.
|
||||||
|
@param SystemTable A pointer to the EFI System Table.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The operation completed successfully.
|
||||||
|
@retval Others An unexpected error occurred.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
DnsDriverEntryPoint (
|
||||||
|
IN EFI_HANDLE ImageHandle,
|
||||||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Tests to see if this driver supports a given controller. If a child device is provided,
|
||||||
|
it further tests to see if this driver supports creating a handle for the specified child device.
|
||||||
|
|
||||||
|
This function checks to see if the driver specified by This supports the device specified by
|
||||||
|
ControllerHandle. Drivers will typically use the device path attached to
|
||||||
|
ControllerHandle and/or the services from the bus I/O abstraction attached to
|
||||||
|
ControllerHandle to determine if the driver supports ControllerHandle. This function
|
||||||
|
may be called many times during platform initialization. In order to reduce boot times, the tests
|
||||||
|
performed by this function must be very small, and take as little time as possible to execute. This
|
||||||
|
function must not change the state of any hardware devices, and this function must be aware that the
|
||||||
|
device specified by ControllerHandle may already be managed by the same driver or a
|
||||||
|
different driver. This function must match its calls to AllocatePages() with FreePages(),
|
||||||
|
AllocatePool() with FreePool(), and OpenProtocol() with CloseProtocol().
|
||||||
|
Because ControllerHandle may have been previously started by the same driver, if a protocol is
|
||||||
|
already in the opened state, then it must not be closed with CloseProtocol(). This is required
|
||||||
|
to guarantee the state of ControllerHandle is not modified by this function.
|
||||||
|
|
||||||
|
@param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
|
||||||
|
@param[in] ControllerHandle The handle of the controller to test. This handle
|
||||||
|
must support a protocol interface that supplies
|
||||||
|
an I/O abstraction to the driver.
|
||||||
|
@param[in] RemainingDevicePath A pointer to the remaining portion of a device path. This
|
||||||
|
parameter is ignored by device drivers, and is optional for bus
|
||||||
|
drivers. For bus drivers, if this parameter is not NULL, then
|
||||||
|
the bus driver must determine if the bus controller specified
|
||||||
|
by ControllerHandle and the child controller specified
|
||||||
|
by RemainingDevicePath are both supported by this
|
||||||
|
bus driver.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The device specified by ControllerHandle and
|
||||||
|
RemainingDevicePath is supported by the driver specified by This.
|
||||||
|
@retval EFI_ALREADY_STARTED The device specified by ControllerHandle and
|
||||||
|
RemainingDevicePath is already being managed by the driver
|
||||||
|
specified by This.
|
||||||
|
@retval EFI_ACCESS_DENIED The device specified by ControllerHandle and
|
||||||
|
RemainingDevicePath is already being managed by a different
|
||||||
|
driver or an application that requires exclusive access.
|
||||||
|
Currently not implemented.
|
||||||
|
@retval EFI_UNSUPPORTED The device specified by ControllerHandle and
|
||||||
|
RemainingDevicePath is not supported by the driver specified by This.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Dns4DriverBindingSupported (
|
||||||
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Starts a device controller or a bus controller.
|
||||||
|
|
||||||
|
The Start() function is designed to be invoked from the EFI boot service ConnectController().
|
||||||
|
As a result, much of the error checking on the parameters to Start() has been moved into this
|
||||||
|
common boot service. It is legal to call Start() from other locations,
|
||||||
|
but the following calling restrictions must be followed, or the system behavior will not be deterministic.
|
||||||
|
1. ControllerHandle must be a valid EFI_HANDLE.
|
||||||
|
2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally aligned
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL.
|
||||||
|
3. Prior to calling Start(), the Supported() function for the driver specified by This must
|
||||||
|
have been called with the same calling parameters, and Supported() must have returned EFI_SUCCESS.
|
||||||
|
|
||||||
|
@param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
|
||||||
|
@param[in] ControllerHandle The handle of the controller to start. This handle
|
||||||
|
must support a protocol interface that supplies
|
||||||
|
an I/O abstraction to the driver.
|
||||||
|
@param[in] RemainingDevicePath A pointer to the remaining portion of a device path. This
|
||||||
|
parameter is ignored by device drivers, and is optional for bus
|
||||||
|
drivers. For a bus driver, if this parameter is NULL, then handles
|
||||||
|
for all the children of Controller are created by this driver.
|
||||||
|
If this parameter is not NULL and the first Device Path Node is
|
||||||
|
not the End of Device Path Node, then only the handle for the
|
||||||
|
child device specified by the first Device Path Node of
|
||||||
|
RemainingDevicePath is created by this driver.
|
||||||
|
If the first Device Path Node of RemainingDevicePath is
|
||||||
|
the End of Device Path Node, no child handle is created by this
|
||||||
|
driver.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The device was started.
|
||||||
|
@retval EFI_DEVICE_ERROR The device could not be started due to a device error.Currently not implemented.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
|
||||||
|
@retval Others The driver failded to start the device.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Dns4DriverBindingStart (
|
||||||
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Stops a device controller or a bus controller.
|
||||||
|
|
||||||
|
The Stop() function is designed to be invoked from the EFI boot service DisconnectController().
|
||||||
|
As a result, much of the error checking on the parameters to Stop() has been moved
|
||||||
|
into this common boot service. It is legal to call Stop() from other locations,
|
||||||
|
but the following calling restrictions must be followed, or the system behavior will not be deterministic.
|
||||||
|
1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call to this
|
||||||
|
same driver's Start() function.
|
||||||
|
2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid
|
||||||
|
EFI_HANDLE. In addition, all of these handles must have been created in this driver's
|
||||||
|
Start() function, and the Start() function must have called OpenProtocol() on
|
||||||
|
ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
|
||||||
|
|
||||||
|
@param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
|
||||||
|
@param[in] ControllerHandle A handle to the device being stopped. The handle must
|
||||||
|
support a bus specific I/O protocol for the driver
|
||||||
|
to use to stop the device.
|
||||||
|
@param[in] NumberOfChildren The number of child device handles in ChildHandleBuffer.
|
||||||
|
@param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL
|
||||||
|
if NumberOfChildren is 0.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The device was stopped.
|
||||||
|
@retval EFI_DEVICE_ERROR The device could not be stopped due to a device error.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Dns4DriverBindingStop (
|
||||||
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN UINTN NumberOfChildren,
|
||||||
|
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Tests to see if this driver supports a given controller. If a child device is provided,
|
||||||
|
it further tests to see if this driver supports creating a handle for the specified child device.
|
||||||
|
|
||||||
|
This function checks to see if the driver specified by This supports the device specified by
|
||||||
|
ControllerHandle. Drivers will typically use the device path attached to
|
||||||
|
ControllerHandle and/or the services from the bus I/O abstraction attached to
|
||||||
|
ControllerHandle to determine if the driver supports ControllerHandle. This function
|
||||||
|
may be called many times during platform initialization. In order to reduce boot times, the tests
|
||||||
|
performed by this function must be very small, and take as little time as possible to execute. This
|
||||||
|
function must not change the state of any hardware devices, and this function must be aware that the
|
||||||
|
device specified by ControllerHandle may already be managed by the same driver or a
|
||||||
|
different driver. This function must match its calls to AllocatePages() with FreePages(),
|
||||||
|
AllocatePool() with FreePool(), and OpenProtocol() with CloseProtocol().
|
||||||
|
Because ControllerHandle may have been previously started by the same driver, if a protocol is
|
||||||
|
already in the opened state, then it must not be closed with CloseProtocol(). This is required
|
||||||
|
to guarantee the state of ControllerHandle is not modified by this function.
|
||||||
|
|
||||||
|
@param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
|
||||||
|
@param[in] ControllerHandle The handle of the controller to test. This handle
|
||||||
|
must support a protocol interface that supplies
|
||||||
|
an I/O abstraction to the driver.
|
||||||
|
@param[in] RemainingDevicePath A pointer to the remaining portion of a device path. This
|
||||||
|
parameter is ignored by device drivers, and is optional for bus
|
||||||
|
drivers. For bus drivers, if this parameter is not NULL, then
|
||||||
|
the bus driver must determine if the bus controller specified
|
||||||
|
by ControllerHandle and the child controller specified
|
||||||
|
by RemainingDevicePath are both supported by this
|
||||||
|
bus driver.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The device specified by ControllerHandle and
|
||||||
|
RemainingDevicePath is supported by the driver specified by This.
|
||||||
|
@retval EFI_ALREADY_STARTED The device specified by ControllerHandle and
|
||||||
|
RemainingDevicePath is already being managed by the driver
|
||||||
|
specified by This.
|
||||||
|
@retval EFI_ACCESS_DENIED The device specified by ControllerHandle and
|
||||||
|
RemainingDevicePath is already being managed by a different
|
||||||
|
driver or an application that requires exclusive access.
|
||||||
|
Currently not implemented.
|
||||||
|
@retval EFI_UNSUPPORTED The device specified by ControllerHandle and
|
||||||
|
RemainingDevicePath is not supported by the driver specified by This.
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Dns6DriverBindingSupported (
|
||||||
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Starts a device controller or a bus controller.
|
||||||
|
|
||||||
|
The Start() function is designed to be invoked from the EFI boot service ConnectController().
|
||||||
|
As a result, much of the error checking on the parameters to Start() has been moved into this
|
||||||
|
common boot service. It is legal to call Start() from other locations,
|
||||||
|
but the following calling restrictions must be followed, or the system behavior will not be deterministic.
|
||||||
|
1. ControllerHandle must be a valid EFI_HANDLE.
|
||||||
|
2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally aligned
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL.
|
||||||
|
3. Prior to calling Start(), the Supported() function for the driver specified by This must
|
||||||
|
have been called with the same calling parameters, and Supported() must have returned EFI_SUCCESS.
|
||||||
|
|
||||||
|
@param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
|
||||||
|
@param[in] ControllerHandle The handle of the controller to start. This handle
|
||||||
|
must support a protocol interface that supplies
|
||||||
|
an I/O abstraction to the driver.
|
||||||
|
@param[in] RemainingDevicePath A pointer to the remaining portion of a device path. This
|
||||||
|
parameter is ignored by device drivers, and is optional for bus
|
||||||
|
drivers. For a bus driver, if this parameter is NULL, then handles
|
||||||
|
for all the children of Controller are created by this driver.
|
||||||
|
If this parameter is not NULL and the first Device Path Node is
|
||||||
|
not the End of Device Path Node, then only the handle for the
|
||||||
|
child device specified by the first Device Path Node of
|
||||||
|
RemainingDevicePath is created by this driver.
|
||||||
|
If the first Device Path Node of RemainingDevicePath is
|
||||||
|
the End of Device Path Node, no child handle is created by this
|
||||||
|
driver.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The device was started.
|
||||||
|
@retval EFI_DEVICE_ERROR The device could not be started due to a device error.Currently not implemented.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
|
||||||
|
@retval Others The driver failded to start the device.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Dns6DriverBindingStart (
|
||||||
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Stops a device controller or a bus controller.
|
||||||
|
|
||||||
|
The Stop() function is designed to be invoked from the EFI boot service DisconnectController().
|
||||||
|
As a result, much of the error checking on the parameters to Stop() has been moved
|
||||||
|
into this common boot service. It is legal to call Stop() from other locations,
|
||||||
|
but the following calling restrictions must be followed, or the system behavior will not be deterministic.
|
||||||
|
1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call to this
|
||||||
|
same driver's Start() function.
|
||||||
|
2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid
|
||||||
|
EFI_HANDLE. In addition, all of these handles must have been created in this driver's
|
||||||
|
Start() function, and the Start() function must have called OpenProtocol() on
|
||||||
|
ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
|
||||||
|
|
||||||
|
@param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
|
||||||
|
@param[in] ControllerHandle A handle to the device being stopped. The handle must
|
||||||
|
support a bus specific I/O protocol for the driver
|
||||||
|
to use to stop the device.
|
||||||
|
@param[in] NumberOfChildren The number of child device handles in ChildHandleBuffer.
|
||||||
|
@param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL
|
||||||
|
if NumberOfChildren is 0.
|
||||||
|
|
||||||
|
@retval EFI_SUCCESS The device was stopped.
|
||||||
|
@retval EFI_DEVICE_ERROR The device could not be stopped due to a device error.
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Dns6DriverBindingStop (
|
||||||
|
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||||
|
IN EFI_HANDLE ControllerHandle,
|
||||||
|
IN UINTN NumberOfChildren,
|
||||||
|
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Creates a child handle and installs a protocol.
|
||||||
|
|
||||||
|
The CreateChild() function installs a protocol on ChildHandle.
|
||||||
|
If ChildHandle is a pointer to NULL, then a new handle is created and returned in ChildHandle.
|
||||||
|
If ChildHandle is not a pointer to NULL, then the protocol installs on the existing ChildHandle.
|
||||||
|
|
||||||
|
@param[in] This Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance.
|
||||||
|
@param[in] ChildHandle Pointer to the handle of the child to create. If it is NULL,
|
||||||
|
then a new handle is created. If it is a pointer to an existing UEFI handle,
|
||||||
|
then the protocol is added to the existing UEFI handle.
|
||||||
|
|
||||||
|
@retval EFI_SUCCES The protocol was added to ChildHandle.
|
||||||
|
@retval EFI_INVALID_PARAMETER ChildHandle is NULL.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES There are not enough resources availabe to create
|
||||||
|
the child
|
||||||
|
@retval other The child handle was not created
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Dns4ServiceBindingCreateChild (
|
||||||
|
IN EFI_SERVICE_BINDING_PROTOCOL *This,
|
||||||
|
IN EFI_HANDLE *ChildHandle
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Destroys a child handle with a protocol installed on it.
|
||||||
|
|
||||||
|
The DestroyChild() function does the opposite of CreateChild(). It removes a protocol
|
||||||
|
that was installed by CreateChild() from ChildHandle. If the removed protocol is the
|
||||||
|
last protocol on ChildHandle, then ChildHandle is destroyed.
|
||||||
|
|
||||||
|
@param[in] This Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance.
|
||||||
|
@param[in] ChildHandle Handle of the child to destroy
|
||||||
|
|
||||||
|
@retval EFI_SUCCES The protocol was removed from ChildHandle.
|
||||||
|
@retval EFI_UNSUPPORTED ChildHandle does not support the protocol that is being removed.
|
||||||
|
@retval EFI_INVALID_PARAMETER Child handle is NULL.
|
||||||
|
@retval EFI_ACCESS_DENIED The protocol could not be removed from the ChildHandle
|
||||||
|
because its services are being used.
|
||||||
|
@retval other The child handle was not destroyed
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Dns4ServiceBindingDestroyChild (
|
||||||
|
IN EFI_SERVICE_BINDING_PROTOCOL *This,
|
||||||
|
IN EFI_HANDLE ChildHandle
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Creates a child handle and installs a protocol.
|
||||||
|
|
||||||
|
The CreateChild() function installs a protocol on ChildHandle.
|
||||||
|
If ChildHandle is a pointer to NULL, then a new handle is created and returned in ChildHandle.
|
||||||
|
If ChildHandle is not a pointer to NULL, then the protocol installs on the existing ChildHandle.
|
||||||
|
|
||||||
|
@param[in] This Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance.
|
||||||
|
@param[in] ChildHandle Pointer to the handle of the child to create. If it is NULL,
|
||||||
|
then a new handle is created. If it is a pointer to an existing UEFI handle,
|
||||||
|
then the protocol is added to the existing UEFI handle.
|
||||||
|
|
||||||
|
@retval EFI_SUCCES The protocol was added to ChildHandle.
|
||||||
|
@retval EFI_INVALID_PARAMETER ChildHandle is NULL.
|
||||||
|
@retval EFI_OUT_OF_RESOURCES There are not enough resources availabe to create
|
||||||
|
the child
|
||||||
|
@retval other The child handle was not created
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Dns6ServiceBindingCreateChild (
|
||||||
|
IN EFI_SERVICE_BINDING_PROTOCOL *This,
|
||||||
|
IN EFI_HANDLE *ChildHandle
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Destroys a child handle with a protocol installed on it.
|
||||||
|
|
||||||
|
The DestroyChild() function does the opposite of CreateChild(). It removes a protocol
|
||||||
|
that was installed by CreateChild() from ChildHandle. If the removed protocol is the
|
||||||
|
last protocol on ChildHandle, then ChildHandle is destroyed.
|
||||||
|
|
||||||
|
@param[in] This Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance.
|
||||||
|
@param[in] ChildHandle Handle of the child to destroy
|
||||||
|
|
||||||
|
@retval EFI_SUCCES The protocol was removed from ChildHandle.
|
||||||
|
@retval EFI_UNSUPPORTED ChildHandle does not support the protocol that is being removed.
|
||||||
|
@retval EFI_INVALID_PARAMETER Child handle is NULL.
|
||||||
|
@retval EFI_ACCESS_DENIED The protocol could not be removed from the ChildHandle
|
||||||
|
because its services are being used.
|
||||||
|
@retval other The child handle was not destroyed
|
||||||
|
|
||||||
|
**/
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
Dns6ServiceBindingDestroyChild (
|
||||||
|
IN EFI_SERVICE_BINDING_PROTOCOL *This,
|
||||||
|
IN EFI_HANDLE ChildHandle
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
76
NetworkPkg/DnsDxe/DnsDxe.inf
Normal file
76
NetworkPkg/DnsDxe/DnsDxe.inf
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
## @file
|
||||||
|
# Implementation of EFI_DNS4_PROTOCOL and EFI_DNS6_PROTOCOL interfaces.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2015, 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.php
|
||||||
|
#
|
||||||
|
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
##
|
||||||
|
|
||||||
|
[Defines]
|
||||||
|
INF_VERSION = 0x00010005
|
||||||
|
BASE_NAME = DnsDxe
|
||||||
|
FILE_GUID = b219e140-dffc-11e3-b956-0022681e6906
|
||||||
|
MODULE_TYPE = UEFI_DRIVER
|
||||||
|
VERSION_STRING = 1.0
|
||||||
|
ENTRY_POINT = DnsDriverEntryPoint
|
||||||
|
UNLOAD_IMAGE = DnsUnload
|
||||||
|
|
||||||
|
[Packages]
|
||||||
|
MdePkg/MdePkg.dec
|
||||||
|
MdeModulePkg/MdeModulePkg.dec
|
||||||
|
|
||||||
|
[Sources]
|
||||||
|
ComponentName.c
|
||||||
|
DnsDriver.h
|
||||||
|
DnsDriver.c
|
||||||
|
DnsImpl.h
|
||||||
|
DnsImpl.c
|
||||||
|
DnsProtocol.c
|
||||||
|
DnsDhcp.h
|
||||||
|
DnsDhcp.c
|
||||||
|
|
||||||
|
|
||||||
|
[LibraryClasses]
|
||||||
|
BaseLib
|
||||||
|
UefiLib
|
||||||
|
UefiBootServicesTableLib
|
||||||
|
UefiDriverEntryPoint
|
||||||
|
UefiRuntimeServicesTableLib
|
||||||
|
BaseMemoryLib
|
||||||
|
MemoryAllocationLib
|
||||||
|
NetLib
|
||||||
|
DebugLib
|
||||||
|
DpcLib
|
||||||
|
PrintLib
|
||||||
|
UdpIoLib
|
||||||
|
|
||||||
|
|
||||||
|
[Protocols]
|
||||||
|
gEfiDns4ServiceBindingProtocolGuid ## BY_START
|
||||||
|
gEfiDns4ProtocolGuid ## BY_START
|
||||||
|
gEfiUdp4ServiceBindingProtocolGuid ## TO_START
|
||||||
|
gEfiUdp4ProtocolGuid ## BY_START
|
||||||
|
gEfiDhcp4ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
|
||||||
|
gEfiDhcp4ProtocolGuid ## SOMETIMES_CONSUMES
|
||||||
|
gEfiIp4Config2ProtocolGuid ## SOMETIMES_CONSUMES
|
||||||
|
gEfiManagedNetworkServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
|
||||||
|
gEfiManagedNetworkProtocolGuid ## SOMETIMES_CONSUMES
|
||||||
|
|
||||||
|
gEfiDns6ServiceBindingProtocolGuid ## BY_START
|
||||||
|
gEfiDns6ProtocolGuid ## BY_START
|
||||||
|
gEfiUdp6ServiceBindingProtocolGuid ## TO_START
|
||||||
|
gEfiUdp6ProtocolGuid ## TO_START
|
||||||
|
gEfiDhcp6ServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
|
||||||
|
gEfiDhcp6ProtocolGuid ## SOMETIMES_CONSUMES
|
||||||
|
|
||||||
|
|
||||||
|
[Guids]
|
||||||
|
|
1875
NetworkPkg/DnsDxe/DnsImpl.c
Normal file
1875
NetworkPkg/DnsDxe/DnsImpl.c
Normal file
File diff suppressed because it is too large
Load Diff
1139
NetworkPkg/DnsDxe/DnsImpl.h
Normal file
1139
NetworkPkg/DnsDxe/DnsImpl.h
Normal file
File diff suppressed because it is too large
Load Diff
1344
NetworkPkg/DnsDxe/DnsProtocol.c
Normal file
1344
NetworkPkg/DnsDxe/DnsProtocol.c
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user