]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c
Add a UNION definition (IP_IO_IP_PROTOOCL) for EFI_IP4/6_PROTOCOL and change IP_IO...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Tcp4Dxe / Tcp4Dispatcher.c
index 536a01a1d5391a59c376c1205e68a8d5206f6a6a..536a16a16cd02afaf637e09518c324f26a872e74 100644 (file)
@@ -1,21 +1,15 @@
 /** @file\r
+  Tcp request dispatcher implementation.\r
 \r
-Copyright (c) 2005 - 2006, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
+http://opensource.org/licenses/bsd-license.php<BR>\r
 \r
 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
-Module Name:\r
-\r
-  Tcp4Dispatcher.c\r
-\r
-Abstract:\r
-\r
-\r
 **/\r
 \r
 #include "Tcp4Main.h"\r
@@ -23,46 +17,36 @@ Abstract:
 #define TCP_COMP_VAL(Min, Max, Default, Val) \\r
   ((((Val) <= (Max)) && ((Val) >= (Min))) ? (Val) : (Default))\r
 \r
-STATIC\r
+/**\r
+  Add or remove a route entry in the IP route table associated with this TCP instance.\r
+\r
+  @param  Tcb                   Pointer to the TCP_CB of this TCP instance.\r
+  @param  RouteInfo             Pointer to the route info to be processed.\r
+\r
+  @retval EFI_SUCCESS           The operation completed successfully.\r
+  @retval EFI_NOT_STARTED       The driver instance has not been started.\r
+  @retval EFI_NO_MAPPING        When using the default address, configuration(DHCP,\r
+                                BOOTP, RARP, etc.) is not finished yet.\r
+  @retval EFI_OUT_OF_RESOURCES  Could not add the entry to the routing table.\r
+  @retval EFI_NOT_FOUND         This route is not in the routing table\r
+                                (when RouteInfo->DeleteRoute is TRUE).\r
+  @retval EFI_ACCESS_DENIED     The route is already defined in the routing table\r
+                                (when RouteInfo->DeleteRoute is FALSE).\r
+**/\r
 EFI_STATUS\r
 Tcp4Route (\r
   IN TCP_CB           *Tcb,\r
   IN TCP4_ROUTE_INFO  *RouteInfo\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Add or remove a route entry in the IP route table associated\r
-  with this TCP instance.\r
-\r
-Arguments:\r
-\r
-  Tcb       - Pointer to the TCP_CB of this TCP instance.\r
-  RouteInfo - Pointer to the route info to be processed.\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS          - The operation completed successfully.\r
-  EFI_NOT_STARTED      - The driver instance has not been started.\r
-  EFI_NO_MAPPING       - When using the default address, configuration(DHCP,\r
-                         BOOTP, RARP, etc.) is not finished yet.\r
-  EFI_OUT_OF_RESOURCES - Could not add the entry to the routing table.\r
-  EFI_NOT_FOUND        - This route is not in the routing table\r
-                         (when RouteInfo->DeleteRoute is TRUE).\r
-  EFI_ACCESS_DENIED    - The route is already defined in the routing table\r
-                         (when RouteInfo->DeleteRoute is FALSE).\r
-\r
---*/\r
 {\r
-  EFI_IP4_PROTOCOL  *Ip;\r
+  EFI_IP4_PROTOCOL  *Ip4;\r
 \r
-  Ip = Tcb->IpInfo->Ip;\r
+  Ip4 = Tcb->IpInfo->Ip.Ip4;\r
 \r
-  ASSERT (Ip);\r
+  ASSERT (Ip4 != NULL);\r
 \r
-  return Ip->Routes (\r
-              Ip,\r
+  return Ip4->Routes (\r
+              Ip4,\r
               RouteInfo->DeleteRoute,\r
               RouteInfo->SubnetAddress,\r
               RouteInfo->SubnetMask,\r
@@ -84,11 +68,10 @@ Returns:
                                  instance hasn't been started.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 Tcp4GetMode (\r
-  IN TCP_CB         *Tcb,\r
-  IN TCP4_MODE_DATA *Mode\r
+  IN     TCP_CB         *Tcb,\r
+  IN OUT TCP4_MODE_DATA *Mode\r
   )\r
 {\r
   SOCKET                *Sock;\r
@@ -103,26 +86,26 @@ Tcp4GetMode (
     return EFI_NOT_STARTED;\r
   }\r
 \r
-  if (Mode->Tcp4State) {\r
+  if (Mode->Tcp4State != NULL) {\r
     *(Mode->Tcp4State) = (EFI_TCP4_CONNECTION_STATE) Tcb->State;\r
   }\r
 \r
-  if (Mode->Tcp4ConfigData) {\r
+  if (Mode->Tcp4ConfigData != NULL) {\r
 \r
     ConfigData                      = Mode->Tcp4ConfigData;\r
     AccessPoint                     = &(ConfigData->AccessPoint);\r
     Option                          = ConfigData->ControlOption;\r
 \r
-    ConfigData->TypeOfService       = Tcb->TOS;\r
-    ConfigData->TimeToLive          = Tcb->TTL;\r
+    ConfigData->TypeOfService       = Tcb->Tos;\r
+    ConfigData->TimeToLive          = Tcb->Ttl;\r
 \r
     AccessPoint->UseDefaultAddress  = Tcb->UseDefaultAddr;\r
 \r
-    NetCopyMem (&AccessPoint->StationAddress, &Tcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\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
-    NetCopyMem (&AccessPoint->RemoteAddress, &Tcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\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
@@ -141,16 +124,15 @@ Tcp4GetMode (
 \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
+      Option->EnableWindowScaling = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS));\r
 \r
       Option->EnableSelectiveAck      = FALSE;\r
       Option->EnablePathMtuDiscovery  = FALSE;\r
     }\r
   }\r
 \r
-  Ip = Tcb->IpInfo->Ip;\r
-  ASSERT (Ip);\r
+  Ip = Tcb->IpInfo->Ip.Ip4;\r
+  ASSERT (Ip != NULL);\r
 \r
   return Ip->GetModeData (Ip, Mode->Ip4ModeData, Mode->MnpConfigData, Mode->SnpModeData);\r
 }\r
@@ -168,7 +150,6 @@ Tcp4GetMode (
   @retval EFI_OUT_OF_RESOURCES   No port can be allocated.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 Tcp4Bind (\r
   IN EFI_TCP4_ACCESS_POINT *AP\r
@@ -203,7 +184,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
@@ -224,14 +205,11 @@ Tcp4Bind (
 \r
 \r
 /**\r
-  Flush the Tcb add its associated protocols..\r
+  Flush the Tcb add its associated protocols.\r
 \r
   @param  Tcb                    Pointer to the TCP_CB to be flushed.\r
 \r
-  @retval EFI_SUCCESS            The operation is completed successfully.\r
-\r
 **/\r
-STATIC\r
 VOID\r
 Tcp4FlushPcb (\r
   IN TCP_CB *Tcb\r
@@ -246,7 +224,19 @@ 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 protocol.\r
+    //\r
+    if (Sock->DevicePath != NULL) {\r
+      gBS->UninstallProtocolInterface (\r
+             Sock->SockHandle,\r
+             &gEfiDevicePathProtocolGuid,\r
+             Sock->DevicePath\r
+             );\r
+      FreePool (Sock->DevicePath);\r
+    }\r
 \r
     TcpSetVariableData (TcpProto->TcpService);\r
   }\r
@@ -255,7 +245,15 @@ Tcp4FlushPcb (
   NetbufFreeList (&Tcb->RcvQue);\r
 }\r
 \r
-STATIC\r
+/**\r
+  Attach a Pcb to the socket.\r
+\r
+  @param  Sk                     Pointer to the socket of this TCP instance.\r
+\r
+  @retval EFI_SUCCESS            The operation is completed successfully.\r
+  @retval EFI_OUT_OF_RESOURCES   Failed due to resource limit.\r
+\r
+**/\r
 EFI_STATUS\r
 Tcp4AttachPcb (\r
   IN SOCKET  *Sk\r
@@ -265,11 +263,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
@@ -283,13 +281,13 @@ Tcp4AttachPcb (
   Tcb->IpInfo = IpIoAddIp (IpIo);\r
   if (Tcb->IpInfo == NULL) {\r
 \r
-    NetFreePool (Tcb);\r
+    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
@@ -298,7 +296,12 @@ Tcp4AttachPcb (
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
+/**\r
+  Detach the Pcb of the socket.\r
+\r
+  @param  Sk                     Pointer to the socket of this TCP instance.\r
+\r
+**/\r
 VOID\r
 Tcp4DetachPcb (\r
   IN SOCKET  *Sk\r
@@ -316,17 +319,16 @@ Tcp4DetachPcb (
 \r
   IpIoRemoveIp (ProtoData->TcpService->IpIo, Tcb->IpInfo);\r
 \r
-  NetFreePool (Tcb);\r
+  FreePool (Tcb);\r
 \r
   ProtoData->TcpPcb = NULL;\r
 }\r
 \r
 \r
 /**\r
-  Configure the Tcb using CfgData.\r
+  Configure the Pcb using CfgData.\r
 \r
   @param  Sk                     Pointer to the socket of this TCP instance.\r
-  @param  SkTcb                  Pointer to the TCP_CB of this TCP instance.\r
   @param  CfgData                Pointer to the TCP configuration data.\r
 \r
   @retval EFI_SUCCESS            The operation is completed successfully.\r
@@ -335,7 +337,6 @@ Tcp4DetachPcb (
   @retval EFI_OUT_OF_RESOURCES   Failed due to resource limit.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 Tcp4ConfigurePcb (\r
   IN SOCKET               *Sk,\r
@@ -348,7 +349,7 @@ Tcp4ConfigurePcb (
   TCP4_PROTO_DATA     *TcpProto;\r
   TCP_CB              *Tcb;\r
 \r
-  ASSERT (CfgData && Sk && Sk->SockHandle);\r
+  ASSERT ((CfgData != NULL) && (Sk != NULL) && (Sk->SockHandle != NULL));\r
 \r
   TcpProto = (TCP4_PROTO_DATA *) Sk->ProtoReserved;\r
   Tcb      = TcpProto->TcpPcb;\r
@@ -358,7 +359,7 @@ Tcp4ConfigurePcb (
   //\r
   // Add Ip for send pkt to the peer\r
   //\r
-  CopyMem (&IpCfgData, &mIpIoDefaultIpConfigData, sizeof (EFI_IP4_CONFIG_DATA));\r
+  CopyMem (&IpCfgData, &mIp4IoDefaultIpConfigData, sizeof (IpCfgData));\r
   IpCfgData.DefaultProtocol   = EFI_IP_PROTO_TCP;\r
   IpCfgData.UseDefaultAddress = CfgData->AccessPoint.UseDefaultAddress;\r
   IpCfgData.StationAddress    = CfgData->AccessPoint.StationAddress;\r
@@ -387,7 +388,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
@@ -397,8 +398,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
@@ -425,15 +426,22 @@ Tcp4ConfigurePcb (
   //\r
   // initialize Tcb in the light of CfgData\r
   //\r
-  Tcb->TTL            = CfgData->TimeToLive;\r
-  Tcb->TOS            = CfgData->TypeOfService;\r
+  Tcb->Ttl            = CfgData->TimeToLive;\r
+  Tcb->Tos            = CfgData->TypeOfService;\r
+\r
+  Tcb->UseDefaultAddr = CfgData->AccessPoint.UseDefaultAddress;\r
 \r
-  NetCopyMem (&Tcb->LocalEnd.Ip, &CfgData->AccessPoint.StationAddress, sizeof (IP4_ADDR));\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
-  NetCopyMem (&Tcb->RemoteEnd.Ip, &CfgData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR));\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
@@ -524,23 +532,32 @@ Tcp4ConfigurePcb (
                             (UINT32) (Option->ConnectionTimeout * TCP_TICK_HZ)\r
                             );\r
 \r
-    if (Option->EnableNagle == FALSE) {\r
+    if (!Option->EnableNagle) {\r
       TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE);\r
     }\r
 \r
-    if (Option->EnableTimeStamp == FALSE) {\r
+    if (!Option->EnableTimeStamp) {\r
       TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_TS);\r
     }\r
 \r
-    if (Option->EnableWindowScaling == FALSE) {\r
+    if (!Option->EnableWindowScaling) {\r
       TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_WS);\r
     }\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
-  if (CfgData->AccessPoint.ActiveFlag == FALSE) {\r
+  if (!CfgData->AccessPoint.ActiveFlag) {\r
 \r
     TcpSetState (Tcb, TCP_LISTEN);\r
     SockSetState (Sk, SO_LISTENING);\r
@@ -577,7 +594,7 @@ OnExit:
 EFI_STATUS\r
 Tcp4Dispatcher (\r
   IN SOCKET                  *Sock,\r
-  IN SOCK_REQUEST            Request,\r
+  IN UINT8                   Request,\r
   IN VOID                    *Data    OPTIONAL\r
   )\r
 {\r
@@ -590,7 +607,7 @@ Tcp4Dispatcher (
 \r
   switch (Request) {\r
   case SOCK_POLL:\r
-    Ip = ProtoData->TcpService->IpIo->Ip;\r
+    Ip = ProtoData->TcpService->IpIo->Ip.Ip4;\r
     Ip->Poll (Ip);\r
     break;\r
 \r
@@ -600,13 +617,13 @@ Tcp4Dispatcher (
     // notify TCP using this message to give it a chance to send out\r
     // window update information\r
     //\r
-    ASSERT (Tcb);\r
+    ASSERT (Tcb != NULL);\r
     TcpOnAppConsume (Tcb);\r
     break;\r
 \r
   case SOCK_SND:\r
 \r
-    ASSERT (Tcb);\r
+    ASSERT (Tcb != NULL);\r
     TcpOnAppSend (Tcb);\r
     break;\r
 \r
@@ -669,7 +686,7 @@ Tcp4Dispatcher (
 \r
   case SOCK_MODE:\r
 \r
-    ASSERT (Data && Tcb);\r
+    ASSERT ((Data != NULL) && (Tcb != NULL));\r
 \r
     return Tcp4GetMode (Tcb, (TCP4_MODE_DATA *) Data);\r
 \r
@@ -677,10 +694,12 @@ Tcp4Dispatcher (
 \r
   case SOCK_ROUTE:\r
 \r
-    ASSERT (Data && Tcb);\r
+    ASSERT ((Data != NULL) && (Tcb != NULL));\r
 \r
     return Tcp4Route (Tcb, (TCP4_ROUTE_INFO *) Data);\r
 \r
+  default:\r
+    return EFI_UNSUPPORTED;\r
   }\r
 \r
   return EFI_SUCCESS;\r