]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c
MdeModulePkg: Source fixes and cleanup for ARMGCC compiles
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Tcp4Dxe / Tcp4Dispatcher.c
index dbc82b51c155573252dc4a4b183654ab4d3c26a5..5b327af721c48ddb7b6db58c3abb3baba3298754 100644 (file)
@@ -1,7 +1,9 @@
 /** @file\r
+  Tcp request dispatcher implementation.\r
 \r
-Copyright (c) 2005 - 2006, Intel Corporation<BR>\r
-All rights reserved. This program and the accompanying materials\r
+(C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>\r
+Copyright (c) 2005 - 2014, 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<BR>\r
@@ -38,20 +40,20 @@ Tcp4Route (
   IN TCP4_ROUTE_INFO  *RouteInfo\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 != NULL);\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
               RouteInfo->GatewayAddress\r
               );\r
-              \r
+\r
 }\r
 \r
 \r
@@ -95,16 +97,16 @@ Tcp4GetMode (
     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
-    CopyMem (&AccessPoint->StationAddress, &Tcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
-    AccessPoint->SubnetMask         = Tcb->SubnetMask;\r
+    IP4_COPY_ADDRESS (&AccessPoint->StationAddress, &Tcb->LocalEnd.Ip);\r
+    IP4_COPY_ADDRESS (&AccessPoint->SubnetMask, &Tcb->SubnetMask);\r
     AccessPoint->StationPort        = NTOHS (Tcb->LocalEnd.Port);\r
 \r
-    CopyMem (&AccessPoint->RemoteAddress, &Tcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
+    IP4_COPY_ADDRESS (&AccessPoint->RemoteAddress, &Tcb->RemoteEnd.Ip);\r
     AccessPoint->RemotePort         = NTOHS (Tcb->RemoteEnd.Port);\r
     AccessPoint->ActiveFlag         = (BOOLEAN) (Tcb->State != TCP_LISTEN);\r
 \r
@@ -130,7 +132,7 @@ Tcp4GetMode (
     }\r
   }\r
 \r
-  Ip = Tcb->IpInfo->Ip;\r
+  Ip = Tcb->IpInfo->Ip.Ip4;\r
   ASSERT (Ip != NULL);\r
 \r
   return Ip->GetModeData (Ip, Mode->Ip4ModeData, Mode->MnpConfigData, Mode->SnpModeData);\r
@@ -215,38 +217,37 @@ Tcp4FlushPcb (
   )\r
 {\r
   SOCKET           *Sock;\r
-  TCP4_PROTO_DATA  *TcpProto;\r
 \r
   IpIoConfigIp (Tcb->IpInfo, NULL);\r
 \r
   Sock     = Tcb->Sk;\r
-  TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;\r
 \r
   if (SOCK_IS_CONFIGURED (Sock)) {\r
     RemoveEntryList (&Tcb->List);\r
 \r
     //\r
-    // Uninstall the device path protocl.\r
+    // Uninstall the device path protocol.\r
     //\r
-    gBS->UninstallProtocolInterface (\r
-           Sock->SockHandle,\r
-           &gEfiDevicePathProtocolGuid,\r
-           Sock->DevicePath\r
-           );\r
-    gBS->FreePool (Sock->DevicePath);\r
-\r
-    TcpSetVariableData (TcpProto->TcpService);\r
+    if (Sock->DevicePath != NULL) {\r
+      gBS->UninstallProtocolInterface (\r
+             Sock->SockHandle,\r
+             &gEfiDevicePathProtocolGuid,\r
+             Sock->DevicePath\r
+             );\r
+      FreePool (Sock->DevicePath);\r
+    }\r
   }\r
 \r
   NetbufFreeList (&Tcb->SndQue);\r
   NetbufFreeList (&Tcb->RcvQue);\r
+  Tcb->State = TCP_CLOSED;\r
 }\r
 \r
 /**\r
   Attach a Pcb to the socket.\r
 \r
   @param  Sk                     Pointer to the socket of this TCP instance.\r
-  \r
+\r
   @retval EFI_SUCCESS            The operation is completed successfully.\r
   @retval EFI_OUT_OF_RESOURCES   Failed due to resource limit.\r
 \r
@@ -259,6 +260,8 @@ Tcp4AttachPcb (
   TCP_CB            *Tcb;\r
   TCP4_PROTO_DATA   *ProtoData;\r
   IP_IO             *IpIo;\r
+  EFI_STATUS        Status;\r
+  VOID              *Ip;\r
 \r
   Tcb = AllocateZeroPool (sizeof (TCP_CB));\r
 \r
@@ -278,10 +281,26 @@ Tcp4AttachPcb (
   Tcb->IpInfo = IpIoAddIp (IpIo);\r
   if (Tcb->IpInfo == NULL) {\r
 \r
-    gBS->FreePool (Tcb);\r
+    FreePool (Tcb);\r
     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
+                  &gEfiIp4ProtocolGuid,\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
@@ -297,7 +316,7 @@ Tcp4AttachPcb (
   Detach the Pcb of the socket.\r
 \r
   @param  Sk                     Pointer to the socket of this TCP instance.\r
-  \r
+\r
 **/\r
 VOID\r
 Tcp4DetachPcb (\r
@@ -314,9 +333,19 @@ Tcp4DetachPcb (
 \r
   Tcp4FlushPcb (Tcb);\r
 \r
+  //\r
+  // Close the IP protocol.\r
+  //\r
+  gBS->CloseProtocol (\r
+         Tcb->IpInfo->ChildHandle,\r
+         &gEfiIp4ProtocolGuid,\r
+         ProtoData->TcpService->IpIo->Image,\r
+         Sk->SockHandle\r
+         );\r
+  \r
   IpIoRemoveIp (ProtoData->TcpService->IpIo, Tcb->IpInfo);\r
 \r
-  gBS->FreePool (Tcb);\r
+  FreePool (Tcb);\r
 \r
   ProtoData->TcpPcb = NULL;\r
 }\r
@@ -356,7 +385,7 @@ Tcp4ConfigurePcb (
   //\r
   // Add Ip for send pkt to the peer\r
   //\r
-  CopyMem (&IpCfgData, &mIpIoDefaultIpConfigData, sizeof (IpCfgData));\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
@@ -423,14 +452,14 @@ 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
   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
+  IP4_COPY_ADDRESS (&Tcb->SubnetMask, &CfgData->AccessPoint.SubnetMask);\r
 \r
   if (CfgData->AccessPoint.ActiveFlag) {\r
     CopyMem (&Tcb->RemoteEnd.Ip, &CfgData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR));\r
@@ -529,15 +558,15 @@ 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
@@ -554,7 +583,7 @@ Tcp4ConfigurePcb (
   //\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
@@ -591,7 +620,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
@@ -604,7 +633,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
@@ -658,8 +687,6 @@ Tcp4Dispatcher (
 \r
     return Tcp4AttachPcb (Sock);\r
 \r
-    break;\r
-\r
   case SOCK_FLUSH:\r
 \r
     Tcp4FlushPcb (Tcb);\r
@@ -679,16 +706,12 @@ Tcp4Dispatcher (
             (EFI_TCP4_CONFIG_DATA *) Data\r
             );\r
 \r
-    break;\r
-\r
   case SOCK_MODE:\r
 \r
     ASSERT ((Data != NULL) && (Tcb != NULL));\r
 \r
     return Tcp4GetMode (Tcb, (TCP4_MODE_DATA *) Data);\r
 \r
-    break;\r
-\r
   case SOCK_ROUTE:\r
 \r
     ASSERT ((Data != NULL) && (Tcb != NULL));\r