]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c
Sync the latest version from R8.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Tcp4Dxe / Tcp4Driver.c
index 1eefb38f915309e29b5ca723f56a0be26e9c425b..e2a78b7a9dd25c229e6c1202435caf7c587f7a24 100644 (file)
@@ -22,7 +22,8 @@ Abstract:
 \r
 \r
 UINT16                               mTcp4RandomPort;\r
-extern EFI_COMPONENT_NAME_PROTOCOL   gTcp4ComponentName;\r
+extern EFI_COMPONENT_NAME_PROTOCOL    gTcp4ComponentName;\r
+extern EFI_COMPONENT_NAME2_PROTOCOL   gTcp4ComponentName2;\r
 \r
 TCP4_HEARTBEAT_TIMER  mTcp4Timer = {\r
   NULL,\r
@@ -92,7 +93,7 @@ Tcp4CreateTimer (
 \r
     Status = gBS->CreateEvent (\r
                     EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
-                    NET_TPL_TIMER,\r
+                    NET_TPL_EVENT,\r
                     TcpTicking,\r
                     NULL,\r
                     &mTcp4Timer.TimerEvent\r
@@ -176,16 +177,15 @@ Returns:
   //\r
   // Install the TCP4 Driver Binding Protocol\r
   //\r
-  Status = NetLibInstallAllDriverProtocols (\r
+  Status = EfiLibInstallDriverBindingComponentName2 (\r
              ImageHandle,\r
              SystemTable,\r
              &mTcp4DriverBinding,\r
              ImageHandle,\r
              &gTcp4ComponentName,\r
-             NULL,\r
-             NULL\r
+             &gTcp4ComponentName2\r
              );\r
-\r
+  ASSERT_EFI_ERROR (Status);\r
   //\r
   // Initialize ISS and random port.\r
   //\r
@@ -297,7 +297,7 @@ Tcp4DriverBindingStart (
       " resource to create an Ip Io!\n"));\r
 \r
     Status = EFI_OUT_OF_RESOURCES;\r
-    goto ReleaseServiceData;\r
+    goto ON_ERROR;\r
   }\r
 \r
   //\r
@@ -312,7 +312,7 @@ Tcp4DriverBindingStart (
   Status                 = IpIoOpen (TcpServiceData->IpIo, &OpenData);\r
 \r
   if (EFI_ERROR (Status)) {\r
-      goto ReleaseServiceData;\r
+    goto ON_ERROR;\r
   }\r
 \r
   //\r
@@ -324,7 +324,7 @@ Tcp4DriverBindingStart (
     TCP4_DEBUG_ERROR (("Tcp4DriverBindingStart: Create TcpTimer"\r
       " Event failed with %r\n", Status));\r
 \r
-    goto ReleaseIpIo;\r
+    goto ON_ERROR;\r
   }\r
 \r
   //\r
@@ -344,7 +344,8 @@ Tcp4DriverBindingStart (
     TCP4_DEBUG_ERROR (("Tcp4DriverBindingStart: Install Tcp4 Service Binding"\r
       " Protocol failed for %r\n", Status));\r
 \r
-    goto ReleaseTimer;\r
+    Tcp4DestroyTimer ();\r
+    goto ON_ERROR;\r
   }\r
 \r
   //\r
@@ -354,19 +355,17 @@ Tcp4DriverBindingStart (
   TcpServiceData->Signature           = TCP4_DRIVER_SIGNATURE;\r
   TcpServiceData->DriverBindingHandle = This->DriverBindingHandle;\r
 \r
+  NetListInit (&TcpServiceData->SocketList);\r
+\r
   TcpSetVariableData (TcpServiceData);\r
 \r
   return EFI_SUCCESS;\r
 \r
-ReleaseTimer:\r
-\r
-  Tcp4DestroyTimer ();\r
+ON_ERROR:\r
 \r
-ReleaseIpIo:\r
-\r
-  IpIoDestroy (TcpServiceData->IpIo);\r
-\r
-ReleaseServiceData:\r
+  if (TcpServiceData->IpIo != NULL) {\r
+    IpIoDestroy (TcpServiceData->IpIo);\r
+  }\r
 \r
   NetFreePool (TcpServiceData);\r
 \r
@@ -398,19 +397,15 @@ Tcp4DriverBindingStop (
 {\r
   EFI_STATUS                          Status;\r
   EFI_HANDLE                          NicHandle;\r
-  EFI_SERVICE_BINDING_PROTOCOL        *Tcp4ServiceBinding;\r
+  EFI_SERVICE_BINDING_PROTOCOL        *ServiceBinding;\r
   TCP4_SERVICE_DATA                   *TcpServiceData;\r
-  TCP_CB                              *TcpPcb;\r
   SOCKET                              *Sock;\r
-  TCP4_PROTO_DATA                     *TcpProto;\r
-  NET_LIST_ENTRY                      *Entry;\r
-  NET_LIST_ENTRY                      *NextEntry;\r
 \r
   // Find the NicHandle where Tcp4 ServiceBinding Protocol is installed.\r
   //\r
   NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);\r
   if (NicHandle == NULL) {\r
-    return EFI_SUCCESS;\r
+    return EFI_DEVICE_ERROR;\r
   }\r
 \r
   //\r
@@ -419,7 +414,7 @@ Tcp4DriverBindingStop (
   Status = gBS->OpenProtocol (\r
                   NicHandle,\r
                   &gEfiTcp4ServiceBindingProtocolGuid,\r
-                  (VOID **) &Tcp4ServiceBinding,\r
+                  (VOID **) &ServiceBinding,\r
                   This->DriverBindingHandle,\r
                   ControllerHandle,\r
                   EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
@@ -429,95 +424,53 @@ Tcp4DriverBindingStop (
     TCP4_DEBUG_ERROR (("Tcp4DriverBindingStop: Locate Tcp4 Service "\r
       " Binding Protocol failed with %r\n", Status));\r
 \r
-    return Status;\r
+    return EFI_DEVICE_ERROR;\r
   }\r
 \r
-  TcpServiceData = TCP4_FROM_THIS (Tcp4ServiceBinding);\r
-\r
-  //\r
-  // Kill TCP driver\r
-  //\r
-  NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &mTcpRunQue) {\r
-    TcpPcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);\r
+  TcpServiceData = TCP4_FROM_THIS (ServiceBinding);\r
 \r
+  if (NumberOfChildren == 0) {\r
     //\r
-    // Try to destroy this child\r
+    // Uninstall TCP servicebinding protocol\r
     //\r
-    Sock     = TcpPcb->Sk;\r
-    TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;\r
-\r
-    if (TcpProto->TcpService == TcpServiceData) {\r
-      Status = SockDestroyChild (Sock);\r
+    gBS->UninstallMultipleProtocolInterfaces (\r
+           NicHandle,\r
+           &gEfiTcp4ServiceBindingProtocolGuid,\r
+           ServiceBinding,\r
+           NULL\r
+           );\r
 \r
-      if (EFI_ERROR (Status)) {\r
+    //\r
+    // Destroy the IpIO consumed by TCP driver\r
+    //\r
+    IpIoDestroy (TcpServiceData->IpIo);\r
 \r
-        TCP4_DEBUG_ERROR (("Tcp4DriverBindingStop: Destroy Tcp "\r
-          "instance failed with %r\n", Status));\r
-        return Status;\r
-      }\r
-    }\r
-  }\r
+    //\r
+    // Destroy the heartbeat timer.\r
+    //\r
+    Tcp4DestroyTimer ();\r
 \r
-  NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &mTcpListenQue) {\r
-    TcpPcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);\r
+    //\r
+    // Clear the variable.\r
+    //\r
+    TcpClearVariableData (TcpServiceData);\r
 \r
     //\r
-    // Try to destroy this child\r
+    // Release the TCP service data\r
     //\r
-    Sock     = TcpPcb->Sk;\r
-    TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;\r
+    NetFreePool (TcpServiceData);\r
+  } else {\r
 \r
-    if (TcpProto->TcpService == TcpServiceData) {\r
-      Status = SockDestroyChild (TcpPcb->Sk);\r
-      if (EFI_ERROR (Status)) {\r
+    while (!NetListIsEmpty (&TcpServiceData->SocketList)) {\r
+      Sock = NET_LIST_HEAD (&TcpServiceData->SocketList, SOCKET, Link);\r
 \r
-        TCP4_DEBUG_ERROR (("Tcp4DriverBindingStop: Destroy Tcp "\r
-          "instance failed with %r\n", Status));\r
-        return Status;\r
-      }\r
+      ServiceBinding->DestroyChild (ServiceBinding, Sock->SockHandle);\r
     }\r
   }\r
 \r
-  //\r
-  // Uninstall TCP servicebinding protocol\r
-  //\r
-  Status = gBS->UninstallMultipleProtocolInterfaces (\r
-                  NicHandle,\r
-                  &gEfiTcp4ServiceBindingProtocolGuid,\r
-                  Tcp4ServiceBinding,\r
-                  NULL\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-\r
-    TCP4_DEBUG_ERROR (("Tcp4DriverBindingStop: Uninstall TCP service "\r
-      "binding protocol failed with %r\n", Status));\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Destroy the IpIO consumed by TCP driver\r
-  //\r
-  Status = IpIoDestroy (TcpServiceData->IpIo);\r
-\r
-  //\r
-  // Destroy the heartbeat timer.\r
-  //\r
-  Tcp4DestroyTimer ();\r
-\r
-  //\r
-  // Clear the variable.\r
-  //\r
-  TcpClearVariableData (TcpServiceData);\r
-\r
-  //\r
-  // Release the TCP service data\r
-  //\r
-  NetFreePool (TcpServiceData);\r
-\r
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Creates a child handle with a set of TCP4 services.\r
 \r
@@ -608,9 +561,12 @@ Tcp4ServiceBindingCreateChild (
            Sock->SockHandle\r
            );\r
     SockDestroyChild (Sock);\r
+  } else {\r
+    NetListInsertTail (&TcpServiceData->SocketList, &Sock->Link);\r
   }\r
 \r
 ON_EXIT:\r
+\r
   NET_RESTORE_TPL (OldTpl);\r
   return Status;\r
 }\r
@@ -672,7 +628,9 @@ Tcp4ServiceBindingDestroyChild (
   TcpProtoData   = (TCP4_PROTO_DATA *) Sock->ProtoReserved;\r
   TcpServiceData = TcpProtoData->TcpService;\r
 \r
-  Status = SockDestroyChild (Sock);\r
+  NetListRemoveEntry (&Sock->Link);\r
+\r
+  SockDestroyChild (Sock);\r
 \r
   //\r
   // Close the device path protocol\r