]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/TcpDxe/TcpDispatcher.c
Re-execute the failed SCSI command if iSCSI driver could reinstates the session succe...
[mirror_edk2.git] / NetworkPkg / TcpDxe / TcpDispatcher.c
index eaa75a4ec49f7d578d1d25af2bb2530571c0f44a..d3d2cb1c3a7d0359c9daef4d2589deccefd77ecd 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   The implementation of a dispatch routine for processing TCP requests.\r
 \r
-  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2012, 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
@@ -334,6 +334,7 @@ TcpFlushPcb (
   NetbufFreeList (&Tcb->SndQue);\r
   NetbufFreeList (&Tcb->RcvQue);\r
   Tcb->State = TCP_CLOSED;\r
+  Tcb->RemoteIpZero = FALSE;\r
 }\r
 \r
 /**\r
@@ -353,7 +354,16 @@ TcpAttachPcb (
   TCP_CB          *Tcb;\r
   TCP_PROTO_DATA  *ProtoData;\r
   IP_IO           *IpIo;\r
+  EFI_STATUS      Status;\r
+  VOID            *Ip;\r
+  EFI_GUID        *IpProtocolGuid;\r
 \r
+  if (Sk->IpVersion == IP_VERSION_4) {\r
+    IpProtocolGuid = &gEfiIp4ProtocolGuid;\r
+  } else {\r
+    IpProtocolGuid = &gEfiIp6ProtocolGuid;\r
+  }\r
+  \r
   Tcb = AllocateZeroPool (sizeof (TCP_CB));\r
 \r
   if (Tcb == NULL) {\r
@@ -376,6 +386,22 @@ TcpAttachPcb (
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
+  //\r
+  // Open the new created IP instance BY_CHILD.\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  Tcb->IpInfo->ChildHandle,\r
+                  IpProtocolGuid,\r
+                  &Ip,\r
+                  IpIo->Image,\r
+                  Sk->SockHandle,\r
+                  EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    IpIoRemoveIp (IpIo, Tcb->IpInfo);\r
+    return Status;\r
+  }\r
+  \r
   InitializeListHead (&Tcb->List);\r
   InitializeListHead (&Tcb->SndQue);\r
   InitializeListHead (&Tcb->RcvQue);\r
@@ -400,7 +426,14 @@ TcpDetachPcb (
 {\r
   TCP_PROTO_DATA   *ProtoData;\r
   TCP_CB           *Tcb;\r
+  EFI_GUID         *IpProtocolGuid;\r
 \r
+  if (Sk->IpVersion == IP_VERSION_4) {\r
+    IpProtocolGuid = &gEfiIp4ProtocolGuid;\r
+  } else {\r
+    IpProtocolGuid = &gEfiIp6ProtocolGuid;\r
+  }\r
+  \r
   ProtoData = (TCP_PROTO_DATA *) Sk->ProtoReserved;\r
   Tcb       = ProtoData->TcpPcb;\r
 \r
@@ -408,6 +441,16 @@ TcpDetachPcb (
 \r
   TcpFlushPcb (Tcb);\r
 \r
+  //\r
+  // Close the IP protocol.\r
+  //\r
+  gBS->CloseProtocol (\r
+         Tcb->IpInfo->ChildHandle,\r
+         IpProtocolGuid,\r
+         ProtoData->TcpService->IpIo->Image,\r
+         Sk->SockHandle\r
+         );\r
+  \r
   IpIoRemoveIp (ProtoData->TcpService->IpIo, Tcb->IpInfo);\r
 \r
   FreePool (Tcb);\r
@@ -711,6 +754,10 @@ TcpConfigurePcb (
 \r
   if (Sk->IpVersion == IP_VERSION_6) {\r
     Tcb->Tick          = TCP6_REFRESH_NEIGHBOR_TICK;\r
+\r
+    if (NetIp6IsUnspecifiedAddr (&Tcb->RemoteEnd.Ip.v6)) {\r
+      Tcb->RemoteIpZero = TRUE;\r
+    }\r
   }\r
 \r
   TcpInsertTcb (Tcb);\r