\r
Status = Udp4CreateService (Udp4Service, This->DriverBindingHandle, ControllerHandle);\r
if (EFI_ERROR (Status)) {\r
- goto FREE_SERVICE;\r
+ NetFreePool (Udp4Service);\r
+ return Status;\r
}\r
\r
//\r
NULL\r
);\r
if (EFI_ERROR (Status)) {\r
- goto CLEAN_SERVICE;\r
+ Udp4CleanService (Udp4Service);\r
+ NetFreePool (Udp4Service);\r
+ } else {\r
+ Udp4SetVariableData (Udp4Service);\r
}\r
\r
- Udp4SetVariableData (Udp4Service);\r
-\r
- return Status;\r
-\r
-CLEAN_SERVICE:\r
-\r
- Udp4CleanService (Udp4Service);\r
-\r
-FREE_SERVICE:\r
-\r
- NetFreePool (Udp4Service);\r
-\r
return Status;\r
}\r
\r
//\r
NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);\r
if (NicHandle == NULL) {\r
- return EFI_SUCCESS;\r
+ return EFI_DEVICE_ERROR;\r
}\r
\r
//\r
\r
Udp4Service = UDP4_SERVICE_DATA_FROM_THIS (ServiceBinding);\r
\r
- //\r
- // Uninstall the UDP4 ServiceBinding Protocol.\r
- //\r
- Status = gBS->UninstallMultipleProtocolInterfaces (\r
- NicHandle,\r
- &gEfiUdp4ServiceBindingProtocolGuid,\r
- &Udp4Service->ServiceBinding,\r
- NULL\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
+ if (NumberOfChildren == 0) {\r
\r
- while (!NetListIsEmpty (&Udp4Service->ChildrenList)) {\r
- //\r
- // Destroy all instances.\r
- //\r
- Instance = NET_LIST_HEAD (&Udp4Service->ChildrenList, UDP4_INSTANCE_DATA, Link);\r
+ gBS->UninstallMultipleProtocolInterfaces (\r
+ NicHandle,\r
+ &gEfiUdp4ServiceBindingProtocolGuid,\r
+ &Udp4Service->ServiceBinding,\r
+ NULL\r
+ );\r
\r
- ServiceBinding->DestroyChild (ServiceBinding, Instance->ChildHandle);\r
- }\r
+ Udp4ClearVariableData (Udp4Service);\r
\r
- Udp4ClearVariableData (Udp4Service);\r
+ Udp4CleanService (Udp4Service);\r
\r
- Udp4CleanService (Udp4Service);\r
+ NetFreePool (Udp4Service);\r
+ } else {\r
\r
- NetFreePool (Udp4Service);\r
+ while (!NetListIsEmpty (&Udp4Service->ChildrenList)) {\r
+ Instance = NET_LIST_HEAD (&Udp4Service->ChildrenList, UDP4_INSTANCE_DATA, Link);\r
\r
- return EFI_SUCCESS;\r
+ ServiceBinding->DestroyChild (ServiceBinding, Instance->ChildHandle);\r
+ }\r
+ }\r
+\r
+ return Status;\r
}\r
\r
\r
//\r
// Allocate the instance private data structure.\r
//\r
- Instance = NetAllocatePool (sizeof (UDP4_INSTANCE_DATA));\r
+ Instance = NetAllocateZeroPool (sizeof (UDP4_INSTANCE_DATA));\r
if (Instance == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
Instance->IpInfo = IpIoAddIp (Udp4Service->IpIo);\r
if (Instance->IpInfo == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
- goto FREE_INSTANCE;\r
+ goto ON_ERROR;\r
}\r
\r
//\r
NULL\r
);\r
if (EFI_ERROR (Status)) {\r
- goto REMOVE_IPINFO;\r
+ goto ON_ERROR;\r
}\r
\r
Instance->ChildHandle = *ChildHandle;\r
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
);\r
if (EFI_ERROR (Status)) {\r
- goto UNINSTALL_PROTOCOL;\r
+ goto ON_ERROR;\r
}\r
\r
OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
\r
NET_RESTORE_TPL (OldTpl);\r
\r
- return Status;\r
-\r
-UNINSTALL_PROTOCOL:\r
-\r
- gBS->UninstallMultipleProtocolInterfaces (\r
- Instance->ChildHandle,\r
- &gEfiUdp4ProtocolGuid,\r
- &Instance->Udp4Proto,\r
- NULL\r
- );\r
+ return EFI_SUCCESS;\r
\r
-REMOVE_IPINFO:\r
+ON_ERROR:\r
\r
- IpIoRemoveIp (Udp4Service->IpIo, Instance->IpInfo);\r
+ if (Instance->ChildHandle != NULL) {\r
+ gBS->UninstallMultipleProtocolInterfaces (\r
+ Instance->ChildHandle,\r
+ &gEfiUdp4ProtocolGuid,\r
+ &Instance->Udp4Proto,\r
+ NULL\r
+ );\r
+ }\r
\r
-FREE_INSTANCE:\r
+ if (Instance->IpInfo != NULL) {\r
+ IpIoRemoveIp (Udp4Service->IpIo, Instance->IpInfo);\r
+ }\r
\r
Udp4CleanInstance (Instance);\r
\r