]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c
Sync the bug that list node is free before it is removed from the list. That made...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Tcp4Dxe / Tcp4Misc.c
index 7f1f141bc8c0d89a5b501d67c1a533fbaecfb5ee..863ebc1ea0e014066cd70c22d6d22eb94a7e1855 100644 (file)
@@ -23,6 +23,8 @@ Abstract:
 \r
 #include "Tcp4Main.h"\r
 \r
+#include <Library/DevicePathLib.h>\r
+\r
 NET_LIST_ENTRY  mTcpRunQue = {\r
   &mTcpRunQue,\r
   &mTcpRunQue\r
@@ -35,7 +37,7 @@ NET_LIST_ENTRY  mTcpListenQue = {
 \r
 TCP_SEQNO       mTcpGlobalIss = 0x4d7e980b;\r
 \r
-STATIC CHAR16   *mTcpStateName[] = {\r
+CHAR16   *mTcpStateName[] = {\r
   L"TCP_CLOSED",\r
   L"TCP_LISTEN",\r
   L"TCP_SYN_SENT",\r
@@ -123,7 +125,7 @@ TcpInitTcbPeer (
   }\r
 \r
   if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_MSS)) {\r
-    Tcb->SndMss = NET_MAX (64, Opt->Mss);\r
+    Tcb->SndMss = (UINT16) MAX (64, Opt->Mss);\r
 \r
     RcvMss = TcpGetRcvMss (Tcb->Sk);\r
     if (Tcb->SndMss > RcvMss) {\r
@@ -267,7 +269,7 @@ TcpFindTcbByPeer (
   NET_LIST_FOR_EACH (Entry, &mTcpListenQue) {\r
     Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);\r
 \r
-    if ((EFI_IP4 (*Addr) == Tcb->LocalEnd.Ip) &&\r
+    if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) &&\r
       (LocalPort == Tcb->LocalEnd.Port)) {\r
 \r
       return TRUE;\r
@@ -277,7 +279,7 @@ TcpFindTcbByPeer (
   NET_LIST_FOR_EACH (Entry, &mTcpRunQue) {\r
     Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);\r
 \r
-    if (((EFI_IP4 (*Addr) == Tcb->LocalEnd.Ip)) &&\r
+    if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) &&\r
       (LocalPort == Tcb->LocalEnd.Port)) {\r
 \r
       return TRUE;\r
@@ -530,6 +532,15 @@ TcpSetState (
   case TCP_ESTABLISHED:\r
 \r
     SockConnEstablished (Tcb->Sk);\r
+\r
+    if (Tcb->Parent != NULL) {\r
+      //\r
+      // A new connection is accepted by a listening socket, install\r
+      // the device path.\r
+      //\r
+      TcpInstallDevicePath (Tcb->Sk);\r
+    }\r
+\r
     break;\r
 \r
   case TCP_CLOSED:\r
@@ -568,7 +579,7 @@ TcpChecksum (
               HTONS ((UINT16) Nbuf->TotalSize)\r
               );\r
 \r
-  return ~Checksum;\r
+  return (UINT16) ~Checksum;\r
 }\r
 \r
 \r
@@ -806,6 +817,7 @@ TcpOnAppConsume (
   IN TCP_CB *Tcb\r
   )\r
 {\r
+  UINT32 TcpOld;\r
 \r
   switch (Tcb->State) {\r
   case TCP_CLOSED:\r
@@ -822,9 +834,10 @@ TcpOnAppConsume (
     break;\r
 \r
   case TCP_ESTABLISHED:\r
-    if (TcpRcvWinNow (Tcb) > TcpRcvWinOld (Tcb)) {\r
+    TcpOld = TcpRcvWinOld (Tcb);\r
+    if (TcpRcvWinNow (Tcb) > TcpOld) {\r
 \r
-      if (TcpRcvWinOld (Tcb) < Tcb->RcvMss) {\r
+      if (TcpOld < Tcb->RcvMss) {\r
 \r
         TCP4_DEBUG_TRACE (("TcpOnAppConsume: send a window"\r
           " update for a window closed Tcb(%x)\n", Tcb));\r
@@ -981,9 +994,9 @@ TcpSetVariableData (
       // This tcp instance belongs to the Tcp4Service.\r
       //\r
       Tcp4ServicePoint->InstanceHandle          = TcpPcb->Sk->SockHandle;\r
-      EFI_IP4 (Tcp4ServicePoint->LocalAddress)  = TcpPcb->LocalEnd.Ip;\r
+      NetCopyMem (&Tcp4ServicePoint->LocalAddress, &TcpPcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
       Tcp4ServicePoint->LocalPort               = NTOHS (TcpPcb->LocalEnd.Port);\r
-      EFI_IP4 (Tcp4ServicePoint->RemoteAddress) = TcpPcb->RemoteEnd.Ip;\r
+      NetCopyMem (&Tcp4ServicePoint->RemoteAddress, &TcpPcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
       Tcp4ServicePoint->RemotePort              = NTOHS (TcpPcb->RemoteEnd.Port);\r
 \r
       Tcp4ServicePoint++;\r
@@ -1003,9 +1016,9 @@ TcpSetVariableData (
       // This tcp instance belongs to the Tcp4Service.\r
       //\r
       Tcp4ServicePoint->InstanceHandle          = TcpPcb->Sk->SockHandle;\r
-      EFI_IP4 (Tcp4ServicePoint->LocalAddress)  = TcpPcb->LocalEnd.Ip;\r
+      NetCopyMem (&Tcp4ServicePoint->LocalAddress, &TcpPcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
       Tcp4ServicePoint->LocalPort               = NTOHS (TcpPcb->LocalEnd.Port);\r
-      EFI_IP4 (Tcp4ServicePoint->RemoteAddress) = TcpPcb->RemoteEnd.Ip;\r
+      NetCopyMem (&Tcp4ServicePoint->RemoteAddress, &TcpPcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
       Tcp4ServicePoint->RemotePort              = NTOHS (TcpPcb->RemoteEnd.Port);\r
 \r
       Tcp4ServicePoint++;\r
@@ -1089,3 +1102,65 @@ TcpClearVariableData (
   Tcp4Service->MacString = NULL;\r
 }\r
 \r
+EFI_STATUS\r
+TcpInstallDevicePath (\r
+  IN SOCKET *Sock\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Install the device path protocol on the TCP instance.\r
+\r
+Arguments:\r
+\r
+  Sock - Pointer to the socket representing the TCP instance.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS - The device path protocol is installed.\r
+  other       - Failed to install the device path protocol.\r
+\r
+--*/\r
+{\r
+  TCP4_PROTO_DATA    *TcpProto;\r
+  TCP4_SERVICE_DATA  *TcpService;\r
+  TCP_CB             *Tcb;\r
+  IPv4_DEVICE_PATH   Ip4DPathNode;\r
+  EFI_STATUS         Status;\r
+\r
+  TcpProto   = (TCP4_PROTO_DATA *) Sock->ProtoReserved;\r
+  TcpService = TcpProto->TcpService;\r
+  Tcb        = TcpProto->TcpPcb;\r
+\r
+  NetLibCreateIPv4DPathNode (\r
+    &Ip4DPathNode,\r
+    TcpService->ControllerHandle,\r
+    Tcb->LocalEnd.Ip,\r
+    NTOHS (Tcb->LocalEnd.Port),\r
+    Tcb->RemoteEnd.Ip,\r
+    NTOHS (Tcb->RemoteEnd.Port),\r
+    EFI_IP_PROTO_TCP,\r
+    Tcb->UseDefaultAddr\r
+    );\r
+\r
+  Sock->DevicePath = AppendDevicePathNode (\r
+                     Sock->ParentDevicePath,\r
+                     (EFI_DEVICE_PATH_PROTOCOL *) &Ip4DPathNode\r
+                     );\r
+  if (Sock->DevicePath == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  Status = gBS->InstallProtocolInterface (\r
+                  &Sock->SockHandle,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  EFI_NATIVE_INTERFACE,\r
+                  Sock->DevicePath\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    NetFreePool (Sock->DevicePath);\r
+  }\r
+\r
+  return Status;\r
+}\r