]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c
Use Mde library and definition instead of some native definitions in NetLib, to simpl...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Ip4Dxe / Ip4Driver.c
index 0d308c05211c98867622e060eb6cbbd181031f47..85cc6afb50fc876d313afaf930169cd6f5cf0889 100644 (file)
@@ -161,7 +161,7 @@ Ip4CreateService (
   // empty resources, so if any thing goes wrong when allocating\r
   // resources, Ip4CleanService can be called to clean it up.\r
   //\r
-  IpSb = NetAllocatePool (sizeof (IP4_SERVICE));\r
+  IpSb = AllocatePool (sizeof (IP4_SERVICE));\r
 \r
   if (IpSb == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
@@ -174,16 +174,16 @@ Ip4CreateService (
   IpSb->InDestory                   = FALSE;\r
 \r
   IpSb->NumChildren                 = 0;\r
-  NetListInit (&IpSb->Children);\r
+  InitializeListHead (&IpSb->Children);\r
 \r
-  NetListInit (&IpSb->Interfaces);\r
+  InitializeListHead (&IpSb->Interfaces);\r
   IpSb->DefaultInterface            = NULL;\r
   IpSb->DefaultRouteTable           = NULL;\r
 \r
   Ip4InitAssembleTable (&IpSb->Assemble);\r
 \r
   IpSb->IgmpCtrl.Igmpv1QuerySeen    = 0;\r
-  NetListInit (&IpSb->IgmpCtrl.Groups);\r
+  InitializeListHead (&IpSb->IgmpCtrl.Groups);\r
 \r
   IpSb->Image                       = ImageHandle;\r
   IpSb->Controller                  = Controller;\r
@@ -202,12 +202,13 @@ Ip4CreateService (
   IpSb->MnpConfigData.EnableReceiveTimestamps   = FALSE;\r
   IpSb->MnpConfigData.DisableBackgroundPolling  = FALSE;\r
 \r
-  NetZeroMem (&IpSb->SnpMode, sizeof (EFI_SIMPLE_NETWORK_MODE));\r
+  ZeroMem (&IpSb->SnpMode, sizeof (EFI_SIMPLE_NETWORK_MODE));\r
 \r
   IpSb->Timer                       = NULL;\r
   IpSb->Ip4Config                   = NULL;\r
   IpSb->DoneEvent                   = NULL;\r
   IpSb->ReconfigEvent               = NULL;\r
+  IpSb->ActiveEvent                 = NULL;\r
 \r
   //\r
   // Create various resources. First create the route table, timer\r
@@ -282,7 +283,7 @@ Ip4CreateService (
     goto ON_ERROR;\r
   }\r
 \r
-  NetListInsertHead (&IpSb->Interfaces, &IpSb->DefaultInterface->Link);\r
+  InsertHeadList (&IpSb->Interfaces, &IpSb->DefaultInterface->Link);\r
 \r
   IpSb->MacString = NULL;\r
 \r
@@ -291,7 +292,7 @@ Ip4CreateService (
 \r
 ON_ERROR:\r
   Ip4CleanService (IpSb);\r
-  NetFreePool (IpSb);\r
+  gBS->FreePool (IpSb);\r
 \r
   return Status;\r
 }\r
@@ -375,6 +376,7 @@ Ip4CleanService (
 \r
     gBS->CloseEvent (IpSb->DoneEvent);\r
     gBS->CloseEvent (IpSb->ReconfigEvent);\r
+    IpSb->ActiveEvent = NULL;\r
     IpSb->Ip4Config = NULL;\r
   }\r
 \r
@@ -475,7 +477,7 @@ UNINSTALL_PROTOCOL:
 \r
 FREE_SERVICE:\r
   Ip4CleanService (IpSb);\r
-  NetFreePool (IpSb);\r
+  gBS->FreePool (IpSb);\r
 \r
   return Status;\r
 }\r
@@ -510,6 +512,7 @@ Ip4DriverBindingStop (
   EFI_STATUS                    Status;\r
   EFI_TPL                       OldTpl;\r
   INTN                          State;\r
+  BOOLEAN                       IsArp;\r
 \r
   //\r
   // IP4 driver opens the MNP child, ARP children or the IP4_CONFIG protocol\r
@@ -547,12 +550,12 @@ Ip4DriverBindingStop (
                     );\r
 \r
     if (EFI_ERROR (Status)) {\r
-      return EFI_SUCCESS;\r
+      return EFI_DEVICE_ERROR;\r
     }\r
 \r
     IpSb = IP4_SERVICE_FROM_PROTOCOL (ServiceBinding);\r
 \r
-    OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+    OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
     if (IpSb->Ip4Config && (IpSb->State != IP4_SERVICE_DESTORY)) {\r
 \r
@@ -566,7 +569,7 @@ Ip4DriverBindingStop (
                       );\r
 \r
       if (EFI_ERROR (Status)) {\r
-        NET_RESTORE_TPL (OldTpl);\r
+        gBS->RestoreTPL (OldTpl);\r
         return Status;\r
       }\r
 \r
@@ -582,7 +585,7 @@ Ip4DriverBindingStop (
       gBS->CloseEvent (IpSb->ReconfigEvent);\r
     }\r
 \r
-    NET_RESTORE_TPL (OldTpl);\r
+    gBS->RestoreTPL (OldTpl);\r
     return EFI_SUCCESS;\r
   }\r
 \r
@@ -592,14 +595,16 @@ Ip4DriverBindingStop (
   // service binding is installed on the NIC handle. So, need to open\r
   // the protocol info to find the NIC handle.\r
   //\r
+  IsArp     = FALSE;\r
   NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiManagedNetworkProtocolGuid);\r
 \r
   if (NicHandle == NULL) {\r
     NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);\r
+    IsArp     = TRUE;\r
   }\r
 \r
   if (NicHandle == NULL) {\r
-    return EFI_SUCCESS;\r
+    return EFI_DEVICE_ERROR;\r
   }\r
 \r
   //\r
@@ -620,70 +625,96 @@ Ip4DriverBindingStop (
 \r
   IpSb   = IP4_SERVICE_FROM_PROTOCOL (ServiceBinding);\r
 \r
-  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
   if (IpSb->InDestory) {\r
-    NET_RESTORE_TPL (OldTpl);\r
+    gBS->RestoreTPL (OldTpl);\r
     return EFI_SUCCESS;\r
   }\r
 \r
-  IpSb->InDestory = TRUE;\r
+  if (IsArp) {\r
+    while (!IsListEmpty (&IpSb->Children)) {\r
+      IpInstance = NET_LIST_HEAD (&IpSb->Children, IP4_PROTOCOL, Link);\r
 \r
-  State           = IpSb->State;\r
-  IpSb->State     = IP4_SERVICE_DESTORY;\r
+      ServiceBinding->DestroyChild (ServiceBinding, IpInstance->Handle);\r
+    }\r
 \r
-  //\r
-  // Destory all the children first. If not all children are destoried,\r
-  // the IP driver can operate correctly, so restore it state. Don't\r
-  // use NET_LIST_FOR_EACH_SAFE here, because it will cache the next\r
-  // pointer, which may point to the child that has already been destoried.\r
-  // For example, if there are two child in the list, the first is UDP\r
-  // listen child, the send is the MTFTP's child. When Udp child is\r
-  // destoried, it will destory the MTFTP's child. Then Next point to\r
-  // a invalid child.\r
-  //\r
-  while (!NetListIsEmpty (&IpSb->Children)) {\r
-    IpInstance = NET_LIST_HEAD (&IpSb->Children, IP4_PROTOCOL, Link);\r
-    Ip4ServiceBindingDestroyChild (ServiceBinding, IpInstance->Handle);\r
-  }\r
+    if (IpSb->NumChildren != 0) {\r
+      Status = EFI_DEVICE_ERROR;\r
+      goto ON_ERROR;\r
+    }\r
 \r
-  if (IpSb->NumChildren != 0) {\r
-    IpSb->State = State;\r
-    Status      = EFI_DEVICE_ERROR;\r
-    goto ON_ERROR;\r
-  }\r
+    IpSb->InDestory = TRUE;\r
 \r
-  //\r
-  // Clear the variable data.\r
-  //\r
-  Ip4ClearVariableData (IpSb);\r
+    State           = IpSb->State;\r
+    IpSb->State     = IP4_SERVICE_DESTORY;\r
 \r
-  //\r
-  // OK, clean other resources then uninstall the service binding protocol.\r
-  //\r
-  Status = Ip4CleanService (IpSb);\r
+    //\r
+    // Clear the variable data.\r
+    //\r
+    Ip4ClearVariableData (IpSb);\r
 \r
-  if (EFI_ERROR (Status)) {\r
-    goto ON_ERROR;\r
-  }\r
+    //\r
+    // OK, clean other resources then uninstall the service binding protocol.\r
+    //\r
+    Status = Ip4CleanService (IpSb);\r
 \r
-  Status = gBS->UninstallProtocolInterface (\r
-                  NicHandle,\r
-                  &gEfiIp4ServiceBindingProtocolGuid,\r
-                  ServiceBinding\r
-                  );\r
+    if (EFI_ERROR (Status)) {\r
+      IpSb->State = State;\r
+      goto ON_ERROR;\r
+    }\r
 \r
-  if (EFI_ERROR (Status)) {\r
-    goto ON_ERROR;\r
-  }\r
+    gBS->UninstallProtocolInterface (\r
+           NicHandle,\r
+           &gEfiIp4ServiceBindingProtocolGuid,\r
+           ServiceBinding\r
+           );\r
 \r
-  NET_RESTORE_TPL (OldTpl);\r
-  NetFreePool (IpSb);\r
-  return EFI_SUCCESS;\r
+    gBS->FreePool (IpSb);\r
+  } else if (NumberOfChildren == 0) {\r
+    IpSb->InDestory = TRUE;\r
+\r
+    State           = IpSb->State;\r
+    IpSb->State     = IP4_SERVICE_DESTORY;\r
+\r
+    //\r
+    // Clear the variable data.\r
+    //\r
+    Ip4ClearVariableData (IpSb);\r
+\r
+    //\r
+    // OK, clean other resources then uninstall the service binding protocol.\r
+    //\r
+    Status = Ip4CleanService (IpSb);\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      IpSb->State = State;\r
+      goto ON_ERROR;\r
+    }\r
+\r
+    gBS->UninstallProtocolInterface (\r
+           NicHandle,\r
+           &gEfiIp4ServiceBindingProtocolGuid,\r
+           ServiceBinding\r
+           );\r
+\r
+    gBS->FreePool (IpSb);\r
+  } else {\r
+\r
+    while (!IsListEmpty (&IpSb->Children)) {\r
+      IpInstance = NET_LIST_HEAD (&IpSb->Children, IP4_PROTOCOL, Link);\r
+\r
+      ServiceBinding->DestroyChild (ServiceBinding, IpInstance->Handle);\r
+    }\r
+\r
+    if (IpSb->NumChildren != 0) {\r
+      Status = EFI_DEVICE_ERROR;\r
+    }\r
+  }\r
 \r
 ON_ERROR:\r
-  IpSb->InDestory = FALSE;\r
-  NET_RESTORE_TPL (OldTpl);\r
+\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
@@ -721,7 +752,7 @@ Ip4ServiceBindingCreateChild (
   }\r
 \r
   IpSb       = IP4_SERVICE_FROM_PROTOCOL (This);\r
-  IpInstance = NetAllocatePool (sizeof (IP4_PROTOCOL));\r
+  IpInstance = AllocatePool (sizeof (IP4_PROTOCOL));\r
 \r
   if (IpInstance == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
@@ -770,12 +801,12 @@ Ip4ServiceBindingCreateChild (
   //\r
   // Insert it into the service binding instance.\r
   //\r
-  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
-  NetListInsertTail (&IpSb->Children, &IpInstance->Link);\r
+  InsertTailList (&IpSb->Children, &IpInstance->Link);\r
   IpSb->NumChildren++;\r
 \r
-  NET_RESTORE_TPL (OldTpl);\r
+  gBS->RestoreTPL (OldTpl);\r
 \r
 ON_ERROR:\r
 \r
@@ -783,7 +814,7 @@ ON_ERROR:
 \r
     Ip4CleanProtocol (IpInstance);\r
 \r
-    NetFreePool (IpInstance);\r
+    gBS->FreePool (IpInstance);\r
   }\r
 \r
   return Status;\r
@@ -848,7 +879,7 @@ Ip4ServiceBindingDestroyChild (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
   //\r
   // A child can be destoried more than once. For example,\r
@@ -857,7 +888,7 @@ Ip4ServiceBindingDestroyChild (
   // the IP child it opens.\r
   //\r
   if (IpInstance->State == IP4_STATE_DESTORY) {\r
-    NET_RESTORE_TPL (OldTpl);\r
+    gBS->RestoreTPL (OldTpl);\r
     return EFI_SUCCESS;\r
   }\r
 \r
@@ -913,17 +944,17 @@ Ip4ServiceBindingDestroyChild (
     goto ON_ERROR;\r
   }\r
 \r
-  NetListRemoveEntry (&IpInstance->Link);\r
+  RemoveEntryList (&IpInstance->Link);\r
   IpSb->NumChildren--;\r
 \r
-  NET_RESTORE_TPL (OldTpl);\r
+  gBS->RestoreTPL (OldTpl);\r
 \r
-  NetFreePool (IpInstance);\r
+  gBS->FreePool (IpInstance);\r
   return EFI_SUCCESS;\r
 \r
 ON_ERROR:\r
   IpInstance->State = State;\r
-  NET_RESTORE_TPL (OldTpl);\r
+  gBS->RestoreTPL (OldTpl);\r
 \r
   return Status;\r
 }\r