]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/Udp6Dxe/Udp6Driver.c
NetworkPkg/Udp6Dxe: Fix various typos
[mirror_edk2.git] / NetworkPkg / Udp6Dxe / Udp6Driver.c
index 1cfd5f1b4d5889cb0d0bf91b1dfaa3c2be591c5f..6021bb36993ab0df91f1d4460b1416dc0d36e3bf 100644 (file)
@@ -1,15 +1,9 @@
 /** @file\r
   Driver Binding functions and Service Binding functions for the Network driver module.\r
 \r
-  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
 \r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php.\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -123,7 +117,7 @@ Udp6DriverBindingSupported (
   @param[in]  RemainingDevicePath    Optional parameter use to pick a specific child\r
                                      device to start.\r
 \r
-  @retval EFI_SUCCES             This driver is added to ControllerHandle.\r
+  @retval EFI_SUCCESS            This driver is added to ControllerHandle.\r
   @retval EFI_OUT_OF_RESOURCES   The required system resource can't be allocated.\r
   @retval other                  This driver does not support this device.\r
 \r
@@ -164,9 +158,6 @@ Udp6DriverBindingStart (
                   );\r
   if (EFI_ERROR (Status)) {\r
     Udp6CleanService (Udp6Service);\r
-    goto EXIT;\r
-  } else {\r
-    Status = Udp6SetVariableData (Udp6Service);\r
   }\r
 \r
 EXIT:\r
@@ -178,6 +169,45 @@ EXIT:
   return Status;\r
 }\r
 \r
+/**\r
+  Callback function which provided by user to remove one node in NetDestroyLinkList process.\r
+\r
+  @param[in]    Entry           The entry to be removed.\r
+  @param[in]    Context         Pointer to the callback context corresponds to the Context in NetDestroyLinkList.\r
+\r
+  @retval EFI_INVALID_PARAMETER  Entry is NULL or Context is NULL.\r
+  @retval EFI_SUCCESS            The entry has been removed successfully.\r
+  @retval Others                 Fail to remove the entry.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+Udp6DestroyChildEntryInHandleBuffer (\r
+  IN LIST_ENTRY         *Entry,\r
+  IN VOID               *Context\r
+  )\r
+{\r
+  UDP6_INSTANCE_DATA            *Instance;\r
+  EFI_SERVICE_BINDING_PROTOCOL  *ServiceBinding;\r
+  UINTN                         NumberOfChildren;\r
+  EFI_HANDLE                    *ChildHandleBuffer;\r
+\r
+  if (Entry == NULL || Context == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Instance = NET_LIST_USER_STRUCT_S (Entry, UDP6_INSTANCE_DATA, Link, UDP6_INSTANCE_DATA_SIGNATURE);\r
+  ServiceBinding    = ((UDP6_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ServiceBinding;\r
+  NumberOfChildren  = ((UDP6_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->NumberOfChildren;\r
+  ChildHandleBuffer = ((UDP6_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ChildHandleBuffer;\r
+\r
+  if (!NetIsInHandleBuffer (Instance->ChildHandle, NumberOfChildren, ChildHandleBuffer)) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  return ServiceBinding->DestroyChild (ServiceBinding, Instance->ChildHandle);\r
+}\r
+\r
 /**\r
   Stop this driver on ControllerHandle.\r
 \r
@@ -193,7 +223,7 @@ EXIT:
                                      of children is zero stop the entire bus driver.\r
   @param[in]  ChildHandleBuffer      List of Child Handles to Stop. It is optional.\r
 \r
-  @retval EFI_SUCCES             This driver is removed ControllerHandle.\r
+  @retval EFI_SUCCESS            This driver is removed ControllerHandle.\r
   @retval EFI_DEVICE_ERROR       Can't find the NicHandle from the ControllerHandle and specified GUID.\r
   @retval other                  This driver was not removed from this device.\r
 \r
@@ -207,18 +237,19 @@ Udp6DriverBindingStop (
   IN  EFI_HANDLE                   *ChildHandleBuffer OPTIONAL\r
   )\r
 {\r
-  EFI_STATUS                    Status;\r
-  EFI_HANDLE                    NicHandle;\r
-  EFI_SERVICE_BINDING_PROTOCOL  *ServiceBinding;\r
-  UDP6_SERVICE_DATA             *Udp6Service;\r
-  UDP6_INSTANCE_DATA            *Instance;\r
+  EFI_STATUS                                Status;\r
+  EFI_HANDLE                                NicHandle;\r
+  EFI_SERVICE_BINDING_PROTOCOL              *ServiceBinding;\r
+  UDP6_SERVICE_DATA                         *Udp6Service;\r
+  LIST_ENTRY                                *List;\r
+  UDP6_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT  Context;\r
 \r
   //\r
   // Find the NicHandle where UDP6 ServiceBinding Protocol is installed.\r
   //\r
   NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp6ProtocolGuid);\r
   if (NicHandle == NULL) {\r
-    return EFI_DEVICE_ERROR;\r
+    return EFI_SUCCESS;\r
   }\r
 \r
   //\r
@@ -238,27 +269,30 @@ Udp6DriverBindingStop (
 \r
   Udp6Service = UDP6_SERVICE_DATA_FROM_THIS (ServiceBinding);\r
 \r
-  if (NumberOfChildren == 0) {\r
-\r
-    gBS->UninstallMultipleProtocolInterfaces (\r
-           NicHandle,\r
-           &gEfiUdp6ServiceBindingProtocolGuid,\r
-           &Udp6Service->ServiceBinding,\r
-           NULL\r
-           );\r
-\r
-    Udp6ClearVariableData (Udp6Service);\r
+  if (NumberOfChildren != 0) {\r
+    //\r
+    // NumberOfChildren is not zero, destroy the children instances in ChildHandleBuffer.\r
+    //\r
+    List = &Udp6Service->ChildrenList;\r
+    Context.ServiceBinding    = ServiceBinding;\r
+    Context.NumberOfChildren  = NumberOfChildren;\r
+    Context.ChildHandleBuffer = ChildHandleBuffer;\r
+    Status = NetDestroyLinkList (\r
+               List,\r
+               Udp6DestroyChildEntryInHandleBuffer,\r
+               &Context,\r
+               NULL\r
+               );\r
+  } else if (IsListEmpty (&Udp6Service->ChildrenList)) {\r
+    Status = gBS->UninstallMultipleProtocolInterfaces (\r
+               NicHandle,\r
+               &gEfiUdp6ServiceBindingProtocolGuid,\r
+               &Udp6Service->ServiceBinding,\r
+               NULL\r
+               );\r
 \r
     Udp6CleanService (Udp6Service);\r
-\r
     FreePool (Udp6Service);\r
-  } else {\r
-\r
-    while (!IsListEmpty (&Udp6Service->ChildrenList)) {\r
-      Instance = NET_LIST_HEAD (&Udp6Service->ChildrenList, UDP6_INSTANCE_DATA, Link);\r
-\r
-      Status = ServiceBinding->DestroyChild (ServiceBinding, Instance->ChildHandle);\r
-    }\r
   }\r
 \r
   return Status;\r
@@ -276,9 +310,9 @@ Udp6DriverBindingStop (
                                then a new handle is created. If it is a pointer to an existing UEFI handle,\r
                                then the protocol is added to the existing UEFI handle.\r
 \r
-  @retval EFI_SUCCES            The protocol was added to ChildHandle.\r
+  @retval EFI_SUCCESS           The protocol was added to ChildHandle.\r
   @retval EFI_INVALID_PARAMETER This is NULL or ChildHandle is NULL.\r
-  @retval EFI_OUT_OF_RESOURCES  There are not enough resources availabe to create\r
+  @retval EFI_OUT_OF_RESOURCES  There are not enough resources available to create\r
                                 the child.\r
   @retval other                 The child handle was not created.\r
 \r
@@ -351,6 +385,21 @@ Udp6ServiceBindingCreateChild (
     goto ON_ERROR;\r
   }\r
 \r
+  //\r
+  // Open this instance's Ip6 protocol in the IpInfo BY_CHILD.\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  Instance->IpInfo->ChildHandle,\r
+                  &gEfiIp6ProtocolGuid,\r
+                  (VOID **) &Ip6,\r
+                  gUdp6DriverBinding.DriverBindingHandle,\r
+                  Instance->ChildHandle,\r
+                  EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    goto ON_ERROR;\r
+  }\r
+\r
   OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
   //\r
@@ -394,11 +443,11 @@ ON_ERROR:
   @param[in]  This               Protocol instance pointer.\r
   @param[in]  ChildHandle        Handle of the child to destroy.\r
 \r
-  @retval EFI_SUCCES             The I/O services were removed from the child\r
+  @retval EFI_SUCCESS            The I/O services were removed from the child\r
                                  handle.\r
   @retval EFI_UNSUPPORTED        The child handle does not support the I/O services\r
                                  that are being removed.\r
-  @retval EFI_INVALID_PARAMETER  Child handle is not a valid EFI Handle.\r
+  @retval EFI_INVALID_PARAMETER  Child handle is NULL.\r
   @retval EFI_ACCESS_DENIED      The child handle could not be destroyed because\r
                                  its  I/O services are being used.\r
   @retval other                  The child handle was not destroyed.\r
@@ -440,24 +489,42 @@ Udp6ServiceBindingDestroyChild (
 \r
   Instance = UDP6_INSTANCE_DATA_FROM_THIS (Udp6Proto);\r
 \r
-  if (Instance->Destroyed) {\r
+  if (Instance->InDestroy) {\r
     return EFI_SUCCESS;\r
   }\r
 \r
   //\r
   // Use the Destroyed flag to avoid the re-entering of the following code.\r
   //\r
-  Instance->Destroyed = TRUE;\r
+  Instance->InDestroy = TRUE;\r
 \r
   //\r
-  // Close the Ip6 protocol.\r
+  // Close the Ip6 protocol on the default IpIo.\r
   //\r
-  gBS->CloseProtocol (\r
-         Udp6Service->IpIo->ChildHandle,\r
-         &gEfiIp6ProtocolGuid,\r
-         gUdp6DriverBinding.DriverBindingHandle,\r
-         Instance->ChildHandle\r
-         );\r
+  Status = gBS->CloseProtocol (\r
+             Udp6Service->IpIo->ChildHandle,\r
+             &gEfiIp6ProtocolGuid,\r
+             gUdp6DriverBinding.DriverBindingHandle,\r
+             Instance->ChildHandle\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    Instance->InDestroy = FALSE;\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Close the Ip6 protocol on this instance's IpInfo.\r
+  //\r
+  Status = gBS->CloseProtocol (\r
+             Instance->IpInfo->ChildHandle,\r
+             &gEfiIp6ProtocolGuid,\r
+             gUdp6DriverBinding.DriverBindingHandle,\r
+             Instance->ChildHandle\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    Instance->InDestroy = FALSE;\r
+    return Status;\r
+  }\r
 \r
   //\r
   // Uninstall the Udp6Protocol previously installed on the ChildHandle.\r
@@ -469,7 +536,7 @@ Udp6ServiceBindingDestroyChild (
                   NULL\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    Instance->Destroyed = FALSE;\r
+    Instance->InDestroy = FALSE;\r
     return Status;\r
   }\r
 \r