]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c
Use Mde library and definition instead of some native definitions in NetLib, to simpl...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Tcp4Dxe / Tcp4Dispatcher.c
index 9039905be655fc573bd46774d186e307c64bd5d8..c6108e25149bf6a1223bfe7d5d407ff545f0d264 100644 (file)
@@ -104,7 +104,7 @@ Tcp4GetMode (
   }\r
 \r
   if (Mode->Tcp4State) {\r
-    *(Mode->Tcp4State) = Tcb->State;\r
+    *(Mode->Tcp4State) = (EFI_TCP4_CONNECTION_STATE) Tcb->State;\r
   }\r
 \r
   if (Mode->Tcp4ConfigData) {\r
@@ -118,11 +118,11 @@ Tcp4GetMode (
 \r
     AccessPoint->UseDefaultAddress  = Tcb->UseDefaultAddr;\r
 \r
-    EFI_IP4 (AccessPoint->StationAddress) = Tcb->LocalEnd.Ip;\r
+    CopyMem (&AccessPoint->StationAddress, &Tcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
     AccessPoint->SubnetMask         = Tcb->SubnetMask;\r
     AccessPoint->StationPort        = NTOHS (Tcb->LocalEnd.Port);\r
 \r
-    EFI_IP4 (AccessPoint->RemoteAddress) = Tcb->RemoteEnd.Ip;\r
+    CopyMem (&AccessPoint->RemoteAddress, &Tcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
     AccessPoint->RemotePort         = NTOHS (Tcb->RemoteEnd.Port);\r
     AccessPoint->ActiveFlag         = (BOOLEAN) (Tcb->State != TCP_LISTEN);\r
 \r
@@ -139,9 +139,10 @@ Tcp4GetMode (
       Option->KeepAliveTime           = Tcb->KeepAliveIdle / TCP_TICK_HZ;\r
       Option->KeepAliveInterval       = Tcb->KeepAlivePeriod / TCP_TICK_HZ;\r
 \r
-      Option->EnableNagle      = !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE);\r
-      Option->EnableTimeStamp     = !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS);\r
-      Option->EnableWindowScaling = !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS);\r
+      Option->EnableNagle         = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE));\r
+      Option->EnableTimeStamp     = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS));\r
+      Option->EnableWindowScaling = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS))\r
+;\r
 \r
       Option->EnableSelectiveAck      = FALSE;\r
       Option->EnablePathMtuDiscovery  = FALSE;\r
@@ -202,7 +203,7 @@ Tcp4Bind (
       if (mTcp4RandomPort <= TCP4_PORT_KNOWN) {\r
 \r
         if (Cycle) {\r
-          TCP4_DEBUG_ERROR (("Tcp4Bind: no port can be allocated "\r
+          DEBUG ((EFI_D_ERROR, "Tcp4Bind: no port can be allocated "\r
             "for this pcb\n"));\r
 \r
           return EFI_OUT_OF_RESOURCES;\r
@@ -245,7 +246,17 @@ Tcp4FlushPcb (
   TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;\r
 \r
   if (SOCK_IS_CONFIGURED (Sock)) {\r
-    NetListRemoveEntry (&Tcb->List);\r
+    RemoveEntryList (&Tcb->List);\r
+\r
+    //\r
+    // Uninstall the device path protocl.\r
+    //\r
+    gBS->UninstallProtocolInterface (\r
+           Sock->SockHandle,\r
+           &gEfiDevicePathProtocolGuid,\r
+           Sock->DevicePath\r
+           );\r
+    gBS->FreePool (Sock->DevicePath);\r
 \r
     TcpSetVariableData (TcpProto->TcpService);\r
   }\r
@@ -264,11 +275,11 @@ Tcp4AttachPcb (
   TCP4_PROTO_DATA   *ProtoData;\r
   IP_IO             *IpIo;\r
 \r
-  Tcb = NetAllocateZeroPool (sizeof (TCP_CB));\r
+  Tcb = AllocateZeroPool (sizeof (TCP_CB));\r
 \r
   if (Tcb == NULL) {\r
 \r
-    TCP4_DEBUG_ERROR (("Tcp4ConfigurePcb: failed to allocate a TCB\n"));\r
+    DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: failed to allocate a TCB\n"));\r
 \r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
@@ -282,13 +293,13 @@ Tcp4AttachPcb (
   Tcb->IpInfo = IpIoAddIp (IpIo);\r
   if (Tcb->IpInfo == NULL) {\r
 \r
-    NetFreePool (Tcb);\r
+    gBS->FreePool (Tcb);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  NetListInit (&Tcb->List);\r
-  NetListInit (&Tcb->SndQue);\r
-  NetListInit (&Tcb->RcvQue);\r
+  InitializeListHead (&Tcb->List);\r
+  InitializeListHead (&Tcb->SndQue);\r
+  InitializeListHead (&Tcb->RcvQue);\r
 \r
   Tcb->State        = TCP_CLOSED;\r
   Tcb->Sk           = Sk;\r
@@ -315,7 +326,7 @@ Tcp4DetachPcb (
 \r
   IpIoRemoveIp (ProtoData->TcpService->IpIo, Tcb->IpInfo);\r
 \r
-  NetFreePool (Tcb);\r
+  gBS->FreePool (Tcb);\r
 \r
   ProtoData->TcpPcb = NULL;\r
 }\r
@@ -341,7 +352,6 @@ Tcp4ConfigurePcb (
   IN EFI_TCP4_CONFIG_DATA *CfgData\r
   )\r
 {\r
-  IP_IO               *IpIo;\r
   EFI_IP4_CONFIG_DATA IpCfgData;\r
   EFI_STATUS          Status;\r
   EFI_TCP4_OPTION     *Option;\r
@@ -352,14 +362,13 @@ Tcp4ConfigurePcb (
 \r
   TcpProto = (TCP4_PROTO_DATA *) Sk->ProtoReserved;\r
   Tcb      = TcpProto->TcpPcb;\r
-  IpIo     = TcpProto->TcpService->IpIo;\r
 \r
   ASSERT (Tcb != NULL);\r
 \r
   //\r
   // Add Ip for send pkt to the peer\r
   //\r
-  IpCfgData                   = mIpIoDefaultIpConfigData;\r
+  CopyMem (&IpCfgData, &mIpIoDefaultIpConfigData, sizeof (IpCfgData));\r
   IpCfgData.DefaultProtocol   = EFI_IP_PROTO_TCP;\r
   IpCfgData.UseDefaultAddress = CfgData->AccessPoint.UseDefaultAddress;\r
   IpCfgData.StationAddress    = CfgData->AccessPoint.StationAddress;\r
@@ -388,7 +397,7 @@ Tcp4ConfigurePcb (
   Status = Tcp4Bind (&(CfgData->AccessPoint));\r
 \r
   if (EFI_ERROR (Status)) {\r
-    TCP4_DEBUG_ERROR (("Tcp4ConfigurePcb: Bind endpoint failed "\r
+    DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: Bind endpoint failed "\r
       "with %r\n", Status));\r
 \r
     goto OnExit;\r
@@ -398,8 +407,8 @@ Tcp4ConfigurePcb (
   // Initalize the operating information in this Tcb\r
   //\r
   ASSERT (Tcb->State == TCP_CLOSED &&\r
-    NetListIsEmpty (&Tcb->SndQue) &&\r
-    NetListIsEmpty (&Tcb->RcvQue));\r
+    IsListEmpty (&Tcb->SndQue) &&\r
+    IsListEmpty (&Tcb->RcvQue));\r
 \r
   TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE);\r
   Tcb->State            = TCP_CLOSED;\r
@@ -429,37 +438,53 @@ Tcp4ConfigurePcb (
   Tcb->TTL            = CfgData->TimeToLive;\r
   Tcb->TOS            = CfgData->TypeOfService;\r
 \r
-  Tcb->LocalEnd.Ip    = EFI_IP4 (CfgData->AccessPoint.StationAddress);\r
+  Tcb->UseDefaultAddr = CfgData->AccessPoint.UseDefaultAddress;\r
+\r
+  CopyMem (&Tcb->LocalEnd.Ip, &CfgData->AccessPoint.StationAddress, sizeof (IP4_ADDR));\r
   Tcb->LocalEnd.Port  = HTONS (CfgData->AccessPoint.StationPort);\r
   Tcb->SubnetMask     = CfgData->AccessPoint.SubnetMask;\r
 \r
-  Tcb->RemoteEnd.Ip   = EFI_IP4 (CfgData->AccessPoint.RemoteAddress);\r
-  Tcb->RemoteEnd.Port = HTONS (CfgData->AccessPoint.RemotePort);\r
+  if (CfgData->AccessPoint.ActiveFlag) {\r
+    CopyMem (&Tcb->RemoteEnd.Ip, &CfgData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR));\r
+    Tcb->RemoteEnd.Port = HTONS (CfgData->AccessPoint.RemotePort);\r
+  } else {\r
+    Tcb->RemoteEnd.Ip   = 0;\r
+    Tcb->RemoteEnd.Port = 0;\r
+  }\r
 \r
   Option              = CfgData->ControlOption;\r
 \r
   if (Option != NULL) {\r
     SET_RCV_BUFFSIZE (\r
       Sk,\r
-      TCP_COMP_VAL (TCP_RCV_BUF_SIZE_MIN,\r
-      TCP_RCV_BUF_SIZE,\r
-      TCP_RCV_BUF_SIZE,\r
-      Option->ReceiveBufferSize)\r
+      (UINT32) (TCP_COMP_VAL (\r
+                  TCP_RCV_BUF_SIZE_MIN,\r
+                  TCP_RCV_BUF_SIZE,\r
+                  TCP_RCV_BUF_SIZE,\r
+                  Option->ReceiveBufferSize\r
+                  )\r
+               )\r
       );\r
     SET_SND_BUFFSIZE (\r
       Sk,\r
-      TCP_COMP_VAL (TCP_SND_BUF_SIZE_MIN,\r
-      TCP_SND_BUF_SIZE,\r
-      TCP_SND_BUF_SIZE,\r
-      Option->SendBufferSize)\r
+      (UINT32) (TCP_COMP_VAL (\r
+                  TCP_SND_BUF_SIZE_MIN,\r
+                  TCP_SND_BUF_SIZE,\r
+                  TCP_SND_BUF_SIZE,\r
+                  Option->SendBufferSize\r
+                  )\r
+               )\r
       );\r
 \r
     SET_BACKLOG (\r
       Sk,\r
-      TCP_COMP_VAL (TCP_BACKLOG_MIN,\r
-      TCP_BACKLOG,\r
-      TCP_BACKLOG,\r
-      Option->MaxSynBackLog)\r
+      (UINT32) (TCP_COMP_VAL (\r
+                  TCP_BACKLOG_MIN,\r
+                  TCP_BACKLOG,\r
+                  TCP_BACKLOG,\r
+                  Option->MaxSynBackLog\r
+                  )\r
+               )\r
       );\r
 \r
     Tcb->MaxRexmit = (UINT16) TCP_COMP_VAL (\r
@@ -472,7 +497,7 @@ Tcp4ConfigurePcb (
                               TCP_FIN_WAIT2_TIME,\r
                               TCP_FIN_WAIT2_TIME_MAX,\r
                               TCP_FIN_WAIT2_TIME,\r
-                              Option->FinTimeout * TCP_TICK_HZ\r
+                              (UINT32) (Option->FinTimeout * TCP_TICK_HZ)\r
                               );\r
 \r
     if (Option->TimeWaitTimeout != 0) {\r
@@ -480,7 +505,7 @@ Tcp4ConfigurePcb (
                                TCP_TIME_WAIT_TIME,\r
                                TCP_TIME_WAIT_TIME_MAX,\r
                                TCP_TIME_WAIT_TIME,\r
-                               Option->TimeWaitTimeout * TCP_TICK_HZ\r
+                               (UINT32) (Option->TimeWaitTimeout * TCP_TICK_HZ)\r
                                );\r
     } else {\r
       Tcb->TimeWaitTimeout = 0;\r
@@ -499,13 +524,13 @@ Tcp4ConfigurePcb (
                              TCP_KEEPALIVE_IDLE_MIN,\r
                              TCP_KEEPALIVE_IDLE_MAX,\r
                              TCP_KEEPALIVE_IDLE_MIN,\r
-                             Option->KeepAliveTime * TCP_TICK_HZ\r
+                             (UINT32) (Option->KeepAliveTime * TCP_TICK_HZ)\r
                              );\r
       Tcb->KeepAlivePeriod = TCP_COMP_VAL (\r
                                TCP_KEEPALIVE_PERIOD_MIN,\r
                                TCP_KEEPALIVE_PERIOD,\r
                                TCP_KEEPALIVE_PERIOD,\r
-                               Option->KeepAliveInterval * TCP_TICK_HZ\r
+                               (UINT32) (Option->KeepAliveInterval * TCP_TICK_HZ)\r
                                );\r
     }\r
 \r
@@ -513,7 +538,7 @@ Tcp4ConfigurePcb (
                             TCP_CONNECT_TIME_MIN,\r
                             TCP_CONNECT_TIME,\r
                             TCP_CONNECT_TIME,\r
-                            Option->ConnectionTimeout * TCP_TICK_HZ\r
+                            (UINT32) (Option->ConnectionTimeout * TCP_TICK_HZ)\r
                             );\r
 \r
     if (Option->EnableNagle == FALSE) {\r
@@ -529,6 +554,15 @@ Tcp4ConfigurePcb (
     }\r
   }\r
 \r
+  //\r
+  // The socket is bound, the <SrcIp, SrcPort, DstIp, DstPort> is\r
+  // determined, construct the IP device path and install it.\r
+  //\r
+  Status = TcpInstallDevicePath (Sk);\r
+  if (EFI_ERROR (Status)) {\r
+    goto OnExit;\r
+  }\r
+\r
   //\r
   // update state of Tcb and socket\r
   //\r
@@ -673,6 +707,8 @@ Tcp4Dispatcher (
 \r
     return Tcp4Route (Tcb, (TCP4_ROUTE_INFO *) Data);\r
 \r
+  default:\r
+    return EFI_UNSUPPORTED;\r
   }\r
 \r
   return EFI_SUCCESS;\r