IP4_CONFIG2_DHCP4_OPTION ParaList;\r
EFI_STATUS Status;\r
\r
-\r
IpSb = IP4_SERVICE_FROM_IP4_CONFIG2_INSTANCE (Instance);\r
\r
if (IpSb->State > IP4_SERVICE_UNSTARTED) {\r
IpSb->Controller,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
);\r
- ASSERT_EFI_ERROR (Status);\r
+ if (EFI_ERROR (Status)) {\r
+ NetLibDestroyServiceChild (\r
+ IpSb->Controller,\r
+ IpSb->Image,\r
+ &gEfiDhcp4ServiceBindingProtocolGuid,\r
+ Instance->Dhcp4Handle\r
+ );\r
\r
+ Instance->Dhcp4Handle = NULL;\r
+ \r
+ return Status;\r
+ }\r
\r
//\r
// Check the current DHCP status, if the DHCP process has\r
//\r
Dhcp4 = Instance->Dhcp4;\r
Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4Mode);\r
-\r
if (Dhcp4Mode.State == Dhcp4Bound) {\r
Ip4Config2OnDhcp4Complete (NULL, Instance);\r
+ \r
return EFI_SUCCESS;\r
-\r
}\r
\r
//\r
Dhcp4Mode.ConfigData.OptionList = OptionList;\r
\r
Status = Dhcp4->Configure (Dhcp4, &Dhcp4Mode.ConfigData);\r
-\r
if (EFI_ERROR (Status)) {\r
+ gBS->CloseProtocol (\r
+ Instance->Dhcp4Handle,\r
+ &gEfiDhcp4ProtocolGuid,\r
+ IpSb->Image,\r
+ IpSb->Controller\r
+ );\r
+\r
+ NetLibDestroyServiceChild (\r
+ IpSb->Controller,\r
+ IpSb->Image,\r
+ &gEfiDhcp4ServiceBindingProtocolGuid,\r
+ Instance->Dhcp4Handle\r
+ );\r
+ \r
+ Instance->Dhcp4 = NULL;\r
+ \r
+ Instance->Dhcp4Handle = NULL;\r
+ \r
return Status;\r
}\r
\r
Instance,\r
&Instance->Dhcp4Event\r
);\r
-\r
if (EFI_ERROR (Status)) {\r
+ Ip4Config2DestroyDhcp4 (Instance);\r
return Status;\r
}\r
\r
Status = Dhcp4->Start (Dhcp4, Instance->Dhcp4Event);\r
-\r
if (EFI_ERROR (Status)) {\r
+ Ip4Config2DestroyDhcp4 (Instance);\r
+ gBS->CloseEvent (Instance->Dhcp4Event);\r
+ Instance->Dhcp4Event = NULL;\r
+ \r
return Status;\r
}\r
\r
- IpSb->State = IP4_SERVICE_STARTED;\r
+ IpSb->State = IP4_SERVICE_STARTED;\r
DispatchDpc ();\r
+ \r
return EFI_SUCCESS;\r
-\r
}\r
\r
\r