\r
#include "DnsImpl.h"\r
\r
-/**\r
- The callback function for the timer event used to get map.\r
-\r
- @param[in] Event The event this function is registered to.\r
- @param[in] Context The context registered to the event.\r
-**/\r
-VOID\r
-EFIAPI\r
-TimeoutToGetMap (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
- )\r
-{\r
- *((BOOLEAN *) Context) = TRUE;\r
- return ;\r
-}\r
-\r
-/**\r
- Create an IP child, use it to start the auto configuration, then destroy it.\r
-\r
- @param[in] Controller The controller which has the service installed.\r
- @param[in] Image The image handle used to open service.\r
-\r
- @retval EFI_SUCCESS The configuration is done.\r
- @retval Others Other errors as indicated.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-DnsStartIp4(\r
- IN EFI_HANDLE Controller,\r
- IN EFI_HANDLE Image\r
- )\r
-{\r
- EFI_IP4_PROTOCOL *Ip4;\r
- EFI_HANDLE Ip4Handle;\r
- EFI_EVENT TimerToGetMap;\r
- EFI_IP4_CONFIG_DATA Ip4ConfigData;\r
- EFI_IP4_MODE_DATA Ip4Mode;\r
- EFI_STATUS Status;\r
-\r
- BOOLEAN Timeout;\r
-\r
- //\r
- // Get the Ip4ServiceBinding Protocol\r
- //\r
- Ip4Handle = NULL;\r
- Ip4 = NULL;\r
- TimerToGetMap = NULL;\r
- \r
- Timeout = FALSE;\r
-\r
- Status = NetLibCreateServiceChild (\r
- Controller,\r
- Image,\r
- &gEfiIp4ServiceBindingProtocolGuid,\r
- &Ip4Handle\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- Status = gBS->OpenProtocol (\r
- Ip4Handle,\r
- &gEfiIp4ProtocolGuid,\r
- (VOID **) &Ip4,\r
- Controller,\r
- Image,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- goto ON_EXIT;\r
- }\r
-\r
- Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP;\r
- Ip4ConfigData.AcceptAnyProtocol = FALSE;\r
- Ip4ConfigData.AcceptIcmpErrors = FALSE;\r
- Ip4ConfigData.AcceptBroadcast = FALSE;\r
- Ip4ConfigData.AcceptPromiscuous = FALSE;\r
- Ip4ConfigData.UseDefaultAddress = TRUE;\r
- ZeroMem (&Ip4ConfigData.StationAddress, sizeof (EFI_IPv4_ADDRESS));\r
- ZeroMem (&Ip4ConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
- Ip4ConfigData.TypeOfService = 0;\r
- Ip4ConfigData.TimeToLive = 1;\r
- Ip4ConfigData.DoNotFragment = FALSE;\r
- Ip4ConfigData.RawData = FALSE;\r
- Ip4ConfigData.ReceiveTimeout = 0;\r
- Ip4ConfigData.TransmitTimeout = 0;\r
-\r
- Status = Ip4->Configure (Ip4, &Ip4ConfigData);\r
-\r
- if (Status == EFI_NO_MAPPING) {\r
- Status = gBS->CreateEvent (\r
- EVT_NOTIFY_SIGNAL | EVT_TIMER,\r
- TPL_CALLBACK,\r
- TimeoutToGetMap,\r
- &Timeout,\r
- &TimerToGetMap\r
- );\r
- \r
- if (EFI_ERROR (Status)) {\r
- goto ON_EXIT;\r
- }\r
- \r
- Status = gBS->SetTimer (\r
- TimerToGetMap,\r
- TimerRelative,\r
- MultU64x32 (10000000, 5)\r
- );\r
- \r
- if (EFI_ERROR (Status)) {\r
- goto ON_EXIT;\r
- }\r
- \r
- while (!Timeout) {\r
- Ip4->Poll (Ip4);\r
- \r
- if (!EFI_ERROR (Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL)) && \r
- Ip4Mode.IsConfigured) { \r
- break;\r
- }\r
- }\r
-\r
- if (Timeout) {\r
- Status = EFI_DEVICE_ERROR;\r
- }\r
- }\r
- \r
-ON_EXIT: \r
-\r
- if (TimerToGetMap != NULL) {\r
- gBS->SetTimer (TimerToGetMap, TimerCancel, 0);\r
- gBS->CloseEvent (TimerToGetMap);\r
- }\r
-\r
- NetLibDestroyServiceChild (\r
- Controller,\r
- Image,\r
- &gEfiIp4ServiceBindingProtocolGuid,\r
- Ip4Handle\r
- );\r
- \r
- return Status;\r
-}\r
-\r
/**\r
This function initialize the DHCP4 message instance.\r
\r
return EFI_NO_MEDIA;\r
}\r
\r
- //\r
- // Start the auto configuration if UseDefaultSetting.\r
- //\r
- if (Instance->Dns4CfgData.UseDefaultSetting) {\r
- Status = DnsStartIp4 (Controller, Image);\r
- if (EFI_ERROR(Status)) {\r
- return Status;\r
- }\r
- }\r
- \r
//\r
// Create a Mnp child instance, get the protocol and config for it.\r
//\r