]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Driver.c
Sync the latest version from R8.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Udp4Dxe / Udp4Driver.c
index 7e2bc451ae2e85082224408f142eb535fc43704a..7a7c184498688cbebe59654bb95e41a5dde47059 100644 (file)
@@ -123,7 +123,8 @@ Udp4DriverBindingStart (
 \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
@@ -136,21 +137,12 @@ Udp4DriverBindingStart (
                   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
@@ -188,7 +180,7 @@ Udp4DriverBindingStop (
   //\r
   NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);\r
   if (NicHandle == NULL) {\r
-    return EFI_SUCCESS;\r
+    return EFI_DEVICE_ERROR;\r
   }\r
 \r
   //\r
@@ -208,35 +200,30 @@ Udp4DriverBindingStop (
 \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
@@ -277,7 +264,7 @@ Udp4ServiceBindingCreateChild (
   //\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
@@ -290,7 +277,7 @@ Udp4ServiceBindingCreateChild (
   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
@@ -303,7 +290,7 @@ Udp4ServiceBindingCreateChild (
                   NULL\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    goto REMOVE_IPINFO;\r
+    goto ON_ERROR;\r
   }\r
 \r
   Instance->ChildHandle = *ChildHandle;\r
@@ -320,7 +307,7 @@ Udp4ServiceBindingCreateChild (
                   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
@@ -333,22 +320,22 @@ Udp4ServiceBindingCreateChild (
 \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