]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/TcpDxe/SockInterface.c
NetworkPkg: Fix service binding issue in TCP dxe.
[mirror_edk2.git] / NetworkPkg / TcpDxe / SockInterface.c
index 21ce643a5481b62b6439408b4f8002ccca3d6b61..b4ba40afcef620f9e6889c5866f10b4c9408aae4 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Interface function of the Socket.\r
 \r
-  Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2017, 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
@@ -142,7 +142,12 @@ SockDestroyChild (
   IN OUT SOCKET *Sock\r
   )\r
 {\r
-  EFI_STATUS  Status;\r
+  EFI_STATUS       Status;\r
+  TCP_PROTO_DATA   *ProtoData;\r
+  TCP_CB           *Tcb;\r
+  EFI_GUID         *IpProtocolGuid;\r
+  EFI_GUID         *TcpProtocolGuid;\r
+  VOID             *SockProtocol;\r
 \r
   ASSERT ((Sock != NULL) && (Sock->ProtoHandler != NULL));\r
 \r
@@ -152,6 +157,18 @@ SockDestroyChild (
 \r
   Sock->InDestroy = TRUE;\r
 \r
+  if (Sock->IpVersion == IP_VERSION_4) {\r
+    IpProtocolGuid = &gEfiIp4ProtocolGuid;\r
+    TcpProtocolGuid = &gEfiTcp4ProtocolGuid;\r
+  } else {\r
+    IpProtocolGuid = &gEfiIp6ProtocolGuid;\r
+    TcpProtocolGuid = &gEfiTcp6ProtocolGuid;\r
+  }\r
+  ProtoData = (TCP_PROTO_DATA *) Sock->ProtoReserved;\r
+  Tcb       = ProtoData->TcpPcb;\r
+\r
+  ASSERT (Tcb != NULL);\r
+\r
   Status            = EfiAcquireLockOrFail (&(Sock->Lock));\r
   if (EFI_ERROR (Status)) {\r
 \r
@@ -164,6 +181,51 @@ SockDestroyChild (
     return EFI_ACCESS_DENIED;\r
   }\r
 \r
+  //\r
+  // Close the IP protocol.\r
+  //\r
+  gBS->CloseProtocol (\r
+         Tcb->IpInfo->ChildHandle,\r
+         IpProtocolGuid,\r
+         ProtoData->TcpService->IpIo->Image,\r
+         Sock->SockHandle\r
+         );\r
+\r
+  if (Sock->DestroyCallback != NULL) {\r
+    Sock->DestroyCallback (Sock, Sock->Context);\r
+  }\r
+\r
+  //\r
+  // Retrieve the protocol installed on this sock\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  Sock->SockHandle,\r
+                  TcpProtocolGuid,\r
+                  &SockProtocol,\r
+                  Sock->DriverBinding,\r
+                  Sock->SockHandle,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+\r
+    DEBUG (\r
+      (EFI_D_ERROR,\r
+      "SockDestroyChild: Open protocol installed on socket failed with %r\n",\r
+      Status)\r
+      );\r
+  }\r
+\r
+  //\r
+  // Uninstall the protocol installed on this sock\r
+  //\r
+  gBS->UninstallMultipleProtocolInterfaces (\r
+        Sock->SockHandle,\r
+        TcpProtocolGuid,\r
+        SockProtocol,\r
+        NULL\r
+        );\r
+\r
   //\r
   // force protocol layer to detach the PCB\r
   //\r
@@ -213,6 +275,8 @@ SockCreateChild (
 {\r
   SOCKET      *Sock;\r
   EFI_STATUS  Status;\r
+  VOID        *SockProtocol;\r
+  EFI_GUID    *TcpProtocolGuid;\r
 \r
   //\r
   // create a new socket\r
@@ -236,9 +300,7 @@ SockCreateChild (
       "SockCreateChild: Get the lock to access socket failed with %r\n",\r
       Status)\r
       );\r
-\r
-    SockDestroy (Sock);\r
-    return NULL;\r
+    goto ERROR;\r
   }\r
   //\r
   // inform the protocol layer to attach the socket\r
@@ -253,12 +315,42 @@ SockCreateChild (
       "SockCreateChild: Protocol failed to attach a socket with %r\n",\r
       Status)\r
       );\r
-\r
-    SockDestroy (Sock);\r
-    Sock = NULL;\r
+    goto ERROR;\r
   }\r
 \r
   return Sock;\r
+\r
+ERROR:\r
+\r
+  if (Sock->DestroyCallback != NULL) {\r
+    Sock->DestroyCallback (Sock, Sock->Context);\r
+  }\r
+\r
+  if (Sock->IpVersion == IP_VERSION_4) {\r
+    TcpProtocolGuid = &gEfiTcp4ProtocolGuid;\r
+  } else {\r
+    TcpProtocolGuid = &gEfiTcp6ProtocolGuid;\r
+  }\r
+\r
+  gBS->OpenProtocol (\r
+         Sock->SockHandle,\r
+         TcpProtocolGuid,\r
+         &SockProtocol,\r
+         Sock->DriverBinding,\r
+         Sock->SockHandle,\r
+         EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+         );\r
+  //\r
+  // Uninstall the protocol installed on this sock\r
+  //\r
+  gBS->UninstallMultipleProtocolInterfaces (\r
+        Sock->SockHandle,\r
+        TcpProtocolGuid,\r
+        SockProtocol,\r
+        NULL\r
+        );\r
+   SockDestroy (Sock);\r
+   return NULL;\r
 }\r
 \r
 /**\r