]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c
Use Mde library and definition instead of some native definitions in NetLib, to simpl...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Tcp4Dxe / Tcp4Misc.c
index 1cc84881118e2c043de0595deb52d80bafb7931d..82e3a600db0ea86326b601bbc8ef315f20df3b33 100644 (file)
@@ -23,19 +23,21 @@ Abstract:
 \r
 #include "Tcp4Main.h"\r
 \r
-NET_LIST_ENTRY  mTcpRunQue = {\r
+#include <Library/DevicePathLib.h>\r
+\r
+LIST_ENTRY      mTcpRunQue = {\r
   &mTcpRunQue,\r
   &mTcpRunQue\r
 };\r
 \r
-NET_LIST_ENTRY  mTcpListenQue = {\r
+LIST_ENTRY      mTcpListenQue = {\r
   &mTcpListenQue,\r
   &mTcpListenQue\r
 };\r
 \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 = (UINT16) 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
@@ -191,7 +193,7 @@ TcpLocateListenTcb (
   IN TCP_PEER *Remote\r
   )\r
 {\r
-  NET_LIST_ENTRY  *Entry;\r
+  LIST_ENTRY      *Entry;\r
   TCP_CB          *Node;\r
   TCP_CB          *Match;\r
   INTN            Last;\r
@@ -257,7 +259,7 @@ TcpFindTcbByPeer (
   )\r
 {\r
   TCP_PORTNO      LocalPort;\r
-  NET_LIST_ENTRY  *Entry;\r
+  LIST_ENTRY      *Entry;\r
   TCP_CB          *Tcb;\r
 \r
   ASSERT ((Addr != NULL) && (Port != 0));\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_EQUAL (*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_EQUAL (*Addr, Tcb->LocalEnd.Ip) &&\r
+    if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) &&\r
       (LocalPort == Tcb->LocalEnd.Port)) {\r
 \r
       return TRUE;\r
@@ -312,7 +314,7 @@ TcpLocateTcb (
 {\r
   TCP_PEER        Local;\r
   TCP_PEER        Remote;\r
-  NET_LIST_ENTRY  *Entry;\r
+  LIST_ENTRY      *Entry;\r
   TCP_CB          *Tcb;\r
 \r
   Local.Port  = LocalPort;\r
@@ -330,8 +332,8 @@ TcpLocateTcb (
     if (TCP_PEER_EQUAL (&Remote, &Tcb->RemoteEnd) &&\r
         TCP_PEER_EQUAL (&Local, &Tcb->LocalEnd)) {\r
 \r
-      NetListRemoveEntry (&Tcb->List);\r
-      NetListInsertHead (&mTcpRunQue, &Tcb->List);\r
+      RemoveEntryList (&Tcb->List);\r
+      InsertHeadList (&mTcpRunQue, &Tcb->List);\r
 \r
       return Tcb;\r
     }\r
@@ -362,8 +364,8 @@ TcpInsertTcb (
   IN TCP_CB *Tcb\r
   )\r
 {\r
-  NET_LIST_ENTRY   *Entry;\r
-  NET_LIST_ENTRY   *Head;\r
+  LIST_ENTRY       *Entry;\r
+  LIST_ENTRY       *Head;\r
   TCP_CB           *Node;\r
   TCP4_PROTO_DATA  *TcpProto;\r
 \r
@@ -400,7 +402,7 @@ TcpInsertTcb (
     }\r
   }\r
 \r
-  NetListInsertHead (Head, &Tcb->List);\r
+  InsertHeadList (Head, &Tcb->List);\r
 \r
   TcpProto = (TCP4_PROTO_DATA *) Tcb->Sk->ProtoReserved;\r
   TcpSetVariableData (TcpProto->TcpService);\r
@@ -424,28 +426,28 @@ TcpCloneTcb (
 {\r
   TCP_CB               *Clone;\r
 \r
-  Clone = NetAllocatePool (sizeof (TCP_CB));\r
+  Clone = AllocatePool (sizeof (TCP_CB));\r
 \r
   if (Clone == NULL) {\r
     return NULL;\r
 \r
   }\r
 \r
-  NetCopyMem (Clone, Tcb, sizeof (TCP_CB));\r
+  CopyMem (Clone, Tcb, sizeof (TCP_CB));\r
 \r
   //\r
   // Increate the reference count of the shared IpInfo.\r
   //\r
   NET_GET_REF (Tcb->IpInfo);\r
 \r
-  NetListInit (&Clone->List);\r
-  NetListInit (&Clone->SndQue);\r
-  NetListInit (&Clone->RcvQue);\r
+  InitializeListHead (&Clone->List);\r
+  InitializeListHead (&Clone->SndQue);\r
+  InitializeListHead (&Clone->RcvQue);\r
 \r
   Clone->Sk = SockClone (Tcb->Sk);\r
   if (Clone->Sk == NULL) {\r
-    TCP4_DEBUG_ERROR (("TcpCloneTcb: failed to clone a sock\n"));\r
-    NetFreePool (Clone);\r
+    DEBUG ((EFI_D_ERROR, "TcpCloneTcb: failed to clone a sock\n"));\r
+    gBS->FreePool (Clone);\r
     return NULL;\r
   }\r
 \r
@@ -517,8 +519,9 @@ TcpSetState (
   IN UINT8  State\r
   )\r
 {\r
-  TCP4_DEBUG_TRACE (\r
-    ("Tcb (%x) state %s --> %s\n",\r
+  DEBUG (\r
+    (EFI_D_INFO,\r
+    "Tcb (%x) state %s --> %s\n",\r
     Tcb,\r
     mTcpStateName[Tcb->State],\r
     mTcpStateName[State])\r
@@ -530,6 +533,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
@@ -711,9 +723,9 @@ TcpOnAppClose (
 {\r
   ASSERT (Tcb);\r
 \r
-  if (!NetListIsEmpty (&Tcb->RcvQue) || GET_RCV_DATASIZE (Tcb->Sk)) {\r
+  if (!IsListEmpty (&Tcb->RcvQue) || GET_RCV_DATASIZE (Tcb->Sk)) {\r
 \r
-    TCP4_DEBUG_WARN (("TcpOnAppClose: connection reset "\r
+    DEBUG ((EFI_D_WARN, "TcpOnAppClose: connection reset "\r
       "because data is lost for TCB %x\n", Tcb));\r
 \r
     TcpResetConnection (Tcb);\r
@@ -828,13 +840,13 @@ TcpOnAppConsume (
 \r
       if (TcpOld < Tcb->RcvMss) {\r
 \r
-        TCP4_DEBUG_TRACE (("TcpOnAppConsume: send a window"\r
+        DEBUG ((EFI_D_INFO, "TcpOnAppConsume: send a window"\r
           " update for a window closed Tcb(%x)\n", Tcb));\r
 \r
         TcpSendAck (Tcb);\r
       } else if (Tcb->DelayedAck == 0) {\r
 \r
-        TCP4_DEBUG_TRACE (("TcpOnAppConsume: scheduled a delayed"\r
+        DEBUG ((EFI_D_INFO, "TcpOnAppConsume: scheduled a delayed"\r
           " ACK to update window for Tcb(%x)\n", Tcb));\r
 \r
         Tcb->DelayedAck = 1;\r
@@ -874,7 +886,7 @@ TcpOnAppAbort (
   IN TCP_CB *Tcb\r
   )\r
 {\r
-  TCP4_DEBUG_WARN (("TcpOnAppAbort: connection reset "\r
+  DEBUG ((EFI_D_WARN, "TcpOnAppAbort: connection reset "\r
     "issued by application for TCB %x\n", Tcb));\r
 \r
   switch (Tcb->State) {\r
@@ -906,7 +918,7 @@ TcpSetVariableData (
   )\r
 {\r
   UINT32                  NumConfiguredInstance;\r
-  NET_LIST_ENTRY          *Entry;\r
+  LIST_ENTRY              *Entry;\r
   TCP_CB                  *TcpPcb;\r
   TCP4_PROTO_DATA         *TcpProto;\r
   UINTN                   VariableDataSize;\r
@@ -960,7 +972,7 @@ TcpSetVariableData (
     VariableDataSize += sizeof (EFI_TCP4_SERVICE_POINT) * (NumConfiguredInstance - 1);\r
   }\r
 \r
-  Tcp4VariableData = NetAllocatePool (VariableDataSize);\r
+  Tcp4VariableData = AllocatePool (VariableDataSize);\r
   if (Tcp4VariableData == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
@@ -983,9 +995,9 @@ TcpSetVariableData (
       // This tcp instance belongs to the Tcp4Service.\r
       //\r
       Tcp4ServicePoint->InstanceHandle          = TcpPcb->Sk->SockHandle;\r
-      NetCopyMem (&Tcp4ServicePoint->LocalAddress, &TcpPcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
+      CopyMem (&Tcp4ServicePoint->LocalAddress, &TcpPcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
       Tcp4ServicePoint->LocalPort               = NTOHS (TcpPcb->LocalEnd.Port);\r
-      NetCopyMem (&Tcp4ServicePoint->RemoteAddress, &TcpPcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
+      CopyMem (&Tcp4ServicePoint->RemoteAddress, &TcpPcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
       Tcp4ServicePoint->RemotePort              = NTOHS (TcpPcb->RemoteEnd.Port);\r
 \r
       Tcp4ServicePoint++;\r
@@ -1005,9 +1017,9 @@ TcpSetVariableData (
       // This tcp instance belongs to the Tcp4Service.\r
       //\r
       Tcp4ServicePoint->InstanceHandle          = TcpPcb->Sk->SockHandle;\r
-      NetCopyMem (&Tcp4ServicePoint->LocalAddress, &TcpPcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
+      CopyMem (&Tcp4ServicePoint->LocalAddress, &TcpPcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
       Tcp4ServicePoint->LocalPort               = NTOHS (TcpPcb->LocalEnd.Port);\r
-      NetCopyMem (&Tcp4ServicePoint->RemoteAddress, &TcpPcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
+      CopyMem (&Tcp4ServicePoint->RemoteAddress, &TcpPcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
       Tcp4ServicePoint->RemotePort              = NTOHS (TcpPcb->RemoteEnd.Port);\r
 \r
       Tcp4ServicePoint++;\r
@@ -1043,7 +1055,7 @@ TcpSetVariableData (
              );\r
     }\r
 \r
-    NetFreePool (Tcp4Service->MacString);\r
+    gBS->FreePool (Tcp4Service->MacString);\r
   }\r
 \r
   Tcp4Service->MacString = NewMacString;\r
@@ -1058,7 +1070,7 @@ TcpSetVariableData (
 \r
 ON_ERROR:\r
 \r
-  NetFreePool (Tcp4VariableData);\r
+  gBS->FreePool (Tcp4VariableData);\r
 \r
   return Status;\r
 }\r
@@ -1087,7 +1099,69 @@ TcpClearVariableData (
          NULL\r
          );\r
 \r
-  NetFreePool (Tcp4Service->MacString);\r
+  gBS->FreePool (Tcp4Service->MacString);\r
   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
+    gBS->FreePool (Sock->DevicePath);\r
+  }\r
+\r
+  return Status;\r
+}\r