]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/TcpDxe/TcpMisc.c
MdeModulePkg-DxeCore: rename CoreGetMemoryMapPropertiesTable
[mirror_edk2.git] / NetworkPkg / TcpDxe / TcpMisc.c
index 21bd9dfec1d1d0561b36f175a04e2e309cb451eb..13b9449906725bec789bd6b0bef6f60fbc28b718 100644 (file)
@@ -1,7 +1,8 @@
 /** @file\r
   Misc support routines for TCP driver.\r
 \r
-  Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>\r
+  Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>\r
 \r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
@@ -160,6 +161,8 @@ TcpInitTcbPeer (
     TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_TS);\r
     TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_TS);\r
 \r
+    Tcb->TsRecent = Opt->TSVal;\r
+\r
     //\r
     // Compute the effective SndMss per RFC1122\r
     // section 4.2.2.6. If timestamp option is\r
@@ -428,7 +431,6 @@ TcpInsertTcb (
   LIST_ENTRY       *Entry;\r
   LIST_ENTRY       *Head;\r
   TCP_CB           *Node;\r
-  TCP_PROTO_DATA  *TcpProto;\r
 \r
   ASSERT (\r
     (Tcb != NULL) &&\r
@@ -466,8 +468,6 @@ TcpInsertTcb (
 \r
   InsertHeadList (Head, &Tcb->List);\r
 \r
-  TcpProto = (TCP_PROTO_DATA *) Tcb->Sk->ProtoReserved;\r
-  TcpSetVariableData (TcpProto->TcpService);\r
 \r
   return 0;\r
 }\r
@@ -566,7 +566,31 @@ TcpGetRcvMss (
   } else {\r
     Ip6 = TcpProto->TcpService->IpIo->Ip.Ip6;\r
     ASSERT (Ip6 != NULL);\r
-    Ip6->GetModeData (Ip6, &Ip6Mode, NULL, NULL);\r
+    if (!EFI_ERROR (Ip6->GetModeData (Ip6, &Ip6Mode, NULL, NULL))) {\r
+      if (Ip6Mode.AddressList != NULL) {\r
+        FreePool (Ip6Mode.AddressList);\r
+      }\r
+\r
+      if (Ip6Mode.GroupTable != NULL) {\r
+        FreePool (Ip6Mode.GroupTable);\r
+      }\r
+\r
+      if (Ip6Mode.RouteTable != NULL) {\r
+        FreePool (Ip6Mode.RouteTable);\r
+      }\r
+\r
+      if (Ip6Mode.NeighborCache != NULL) {\r
+        FreePool (Ip6Mode.NeighborCache);\r
+      }\r
+\r
+      if (Ip6Mode.PrefixTable != NULL) {\r
+        FreePool (Ip6Mode.PrefixTable);\r
+      }\r
+\r
+      if (Ip6Mode.IcmpTypeList != NULL) {\r
+        FreePool (Ip6Mode.IcmpTypeList);\r
+      }\r
+    }\r
 \r
     return (UINT16) (Ip6Mode.MaxPacketSize - sizeof (TCP_HEAD));\r
   }\r
@@ -943,266 +967,6 @@ TcpResetConnection (
   NetbufFree (Nbuf);\r
 }\r
 \r
-/**\r
-  Set the Tcp variable data.\r
-\r
-  @param[in]  TcpService        Tcp service data.\r
-\r
-  @retval EFI_OUT_OF_RESOURCES  There are not enough resources to set the variable.\r
-  @retval other                 Set variable failed.\r
-\r
-**/\r
-EFI_STATUS\r
-TcpSetVariableData (\r
-  IN TCP_SERVICE_DATA  *TcpService\r
-  )\r
-{\r
-  EFI_GUID                *ServiceBindingGuid;\r
-  UINT32                  NumConfiguredInstance;\r
-  LIST_ENTRY              *Entry;\r
-  TCP_CB                  *TcpPcb;\r
-  TCP_PROTO_DATA          *TcpProto;\r
-  UINTN                   VariableDataSize;\r
-  EFI_TCP4_VARIABLE_DATA  *Tcp4VariableData;\r
-  EFI_TCP4_SERVICE_POINT  *Tcp4ServicePoint;\r
-  EFI_TCP6_VARIABLE_DATA  *Tcp6VariableData;\r
-  EFI_TCP6_SERVICE_POINT  *Tcp6ServicePoint;\r
-  VOID                    *VariableData;\r
-  CHAR16                  *NewMacString;\r
-  EFI_STATUS              Status;\r
-\r
-  if (TcpService->IpVersion == IP_VERSION_4) {\r
-    ServiceBindingGuid = &gEfiTcp4ServiceBindingProtocolGuid;\r
-  } else {\r
-    ServiceBindingGuid = &gEfiTcp6ServiceBindingProtocolGuid;\r
-  }\r
-\r
-  NumConfiguredInstance = 0;\r
-  Tcp4VariableData      = NULL;\r
-  Tcp6VariableData      = NULL;\r
-\r
-  //\r
-  // Go through the running queue to count the instances.\r
-  //\r
-  NET_LIST_FOR_EACH (Entry, &mTcpRunQue) {\r
-    TcpPcb    = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);\r
-\r
-    TcpProto  = (TCP_PROTO_DATA *) TcpPcb->Sk->ProtoReserved;\r
-\r
-    if (TcpProto->TcpService == TcpService) {\r
-      //\r
-      // This tcp instance belongs to the TcpService.\r
-      //\r
-      NumConfiguredInstance++;\r
-    }\r
-  }\r
-\r
-  //\r
-  // Go through the listening queue to count the instances.\r
-  //\r
-  NET_LIST_FOR_EACH (Entry, &mTcpListenQue) {\r
-    TcpPcb    = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);\r
-\r
-    TcpProto  = (TCP_PROTO_DATA *) TcpPcb->Sk->ProtoReserved;\r
-\r
-    if (TcpProto->TcpService == TcpService) {\r
-      //\r
-      // This tcp instance belongs to the TcpService.\r
-      //\r
-      NumConfiguredInstance++;\r
-    }\r
-  }\r
-\r
-  Tcp4ServicePoint = NULL;\r
-  Tcp6ServicePoint = NULL;\r
-\r
-  //\r
-  // Calculate the size of the Tcp4VariableData. As there may be no Tcp4 child,\r
-  // we should add extra buffers for the service points only if the number of configured\r
-  // children is more than one.\r
-  //\r
-  if (TcpService->IpVersion == IP_VERSION_4) {\r
-    VariableDataSize = sizeof (EFI_TCP4_VARIABLE_DATA);\r
-\r
-    if (NumConfiguredInstance > 1) {\r
-      VariableDataSize += sizeof (EFI_TCP4_SERVICE_POINT) * (NumConfiguredInstance - 1);\r
-    }\r
-\r
-    Tcp4VariableData = AllocateZeroPool (VariableDataSize);\r
-    if (Tcp4VariableData == NULL) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-\r
-    Tcp4VariableData->DriverHandle  = TcpService->DriverBindingHandle;\r
-    Tcp4VariableData->ServiceCount  = NumConfiguredInstance;\r
-\r
-    Tcp4ServicePoint                = &Tcp4VariableData->Services[0];\r
-    VariableData                    = Tcp4VariableData;\r
-  } else {\r
-    VariableDataSize = sizeof (EFI_TCP6_VARIABLE_DATA);\r
-\r
-    if (NumConfiguredInstance > 1) {\r
-      VariableDataSize += sizeof (EFI_TCP6_SERVICE_POINT) * (NumConfiguredInstance - 1);\r
-    }\r
-\r
-    Tcp6VariableData = AllocateZeroPool (VariableDataSize);\r
-    if (Tcp6VariableData == NULL) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-\r
-    Tcp6VariableData->DriverHandle  = TcpService->DriverBindingHandle;\r
-    Tcp6VariableData->ServiceCount  = NumConfiguredInstance;\r
-\r
-    Tcp6ServicePoint                = &Tcp6VariableData->Services[0];\r
-    VariableData                    = Tcp6VariableData;\r
-  }\r
-\r
-  //\r
-  // Go through the running queue to fill the service points.\r
-  //\r
-  NET_LIST_FOR_EACH (Entry, &mTcpRunQue) {\r
-    TcpPcb    = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);\r
-\r
-    TcpProto  = (TCP_PROTO_DATA *) TcpPcb->Sk->ProtoReserved;\r
-\r
-    if (TcpProto->TcpService == TcpService) {\r
-      //\r
-      // This tcp instance belongs to the TcpService.\r
-      //\r
-      if (TcpService->IpVersion == IP_VERSION_4) {\r
-        Tcp4ServicePoint->InstanceHandle          = TcpPcb->Sk->SockHandle;\r
-        CopyMem (&Tcp4ServicePoint->LocalAddress, &TcpPcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
-        Tcp4ServicePoint->LocalPort               = NTOHS (TcpPcb->LocalEnd.Port);\r
-        CopyMem (&Tcp4ServicePoint->RemoteAddress, &TcpPcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
-        Tcp4ServicePoint->RemotePort              = NTOHS (TcpPcb->RemoteEnd.Port);\r
-\r
-        Tcp4ServicePoint++;\r
-      } else {\r
-        Tcp6ServicePoint->InstanceHandle          = TcpPcb->Sk->SockHandle;\r
-        IP6_COPY_ADDRESS (&Tcp6ServicePoint->LocalAddress, &TcpPcb->LocalEnd.Ip);\r
-        Tcp6ServicePoint->LocalPort               = NTOHS (TcpPcb->LocalEnd.Port);\r
-        IP6_COPY_ADDRESS (&Tcp6ServicePoint->RemoteAddress, &TcpPcb->RemoteEnd.Ip);\r
-        Tcp6ServicePoint->RemotePort              = NTOHS (TcpPcb->RemoteEnd.Port);\r
-\r
-        Tcp6ServicePoint++;\r
-      }\r
-    }\r
-  }\r
-\r
-  //\r
-  // Go through the listening queue to fill the service points.\r
-  //\r
-  NET_LIST_FOR_EACH (Entry, &mTcpListenQue) {\r
-    TcpPcb    = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);\r
-\r
-    TcpProto  = (TCP_PROTO_DATA *) TcpPcb->Sk->ProtoReserved;\r
-\r
-    if (TcpProto->TcpService == TcpService) {\r
-      //\r
-      // This tcp instance belongs to the TcpService.\r
-      //\r
-      if (TcpService->IpVersion == IP_VERSION_4) {\r
-        Tcp4ServicePoint->InstanceHandle          = TcpPcb->Sk->SockHandle;\r
-        CopyMem (&Tcp4ServicePoint->LocalAddress, &TcpPcb->LocalEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
-        Tcp4ServicePoint->LocalPort               = NTOHS (TcpPcb->LocalEnd.Port);\r
-        CopyMem (&Tcp4ServicePoint->RemoteAddress, &TcpPcb->RemoteEnd.Ip, sizeof (EFI_IPv4_ADDRESS));\r
-        Tcp4ServicePoint->RemotePort              = NTOHS (TcpPcb->RemoteEnd.Port);\r
-\r
-        Tcp4ServicePoint++;\r
-      } else {\r
-        Tcp6ServicePoint->InstanceHandle          = TcpPcb->Sk->SockHandle;\r
-        IP6_COPY_ADDRESS (&Tcp6ServicePoint->LocalAddress, &TcpPcb->LocalEnd.Ip);\r
-        Tcp6ServicePoint->LocalPort               = NTOHS (TcpPcb->LocalEnd.Port);\r
-        IP6_COPY_ADDRESS (&Tcp6ServicePoint->RemoteAddress, &TcpPcb->RemoteEnd.Ip);\r
-        Tcp6ServicePoint->RemotePort              = NTOHS (TcpPcb->RemoteEnd.Port);\r
-\r
-        Tcp6ServicePoint++;\r
-      }\r
-    }\r
-  }\r
-\r
-  //\r
-  // Get the mac string.\r
-  //\r
-  Status = NetLibGetMacString (\r
-             TcpService->ControllerHandle,\r
-             TcpService->DriverBindingHandle,\r
-             &NewMacString\r
-             );\r
-  if (EFI_ERROR (Status)) {\r
-    goto ON_ERROR;\r
-  }\r
-\r
-  if (TcpService->MacString != NULL) {\r
-    //\r
-    // The variable is set already. We're going to update it.\r
-    //\r
-    if (StrCmp (TcpService->MacString, NewMacString) != 0) {\r
-      //\r
-      // The mac address is changed. Delete the previous variable first.\r
-      //\r
-      gRT->SetVariable (\r
-             TcpService->MacString,\r
-             ServiceBindingGuid,\r
-             EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
-             0,\r
-             NULL\r
-             );\r
-    }\r
-\r
-    FreePool (TcpService->MacString);\r
-  }\r
-\r
-  TcpService->MacString = NewMacString;\r
-\r
-  Status = gRT->SetVariable (\r
-                  TcpService->MacString,\r
-                  ServiceBindingGuid,\r
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
-                  VariableDataSize,\r
-                  VariableData\r
-                  );\r
-\r
-ON_ERROR:\r
-\r
-  FreePool (VariableData);\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Clear the variable and free the resource.\r
-\r
-  @param[in]  TcpService            Tcp service data.\r
-\r
-**/\r
-VOID\r
-TcpClearVariableData (\r
-  IN TCP_SERVICE_DATA  *TcpService\r
-  )\r
-{\r
-  EFI_GUID  *ServiceBindingGuid;\r
-\r
-  ASSERT (TcpService->MacString != NULL);\r
-\r
-  if (TcpService->IpVersion == IP_VERSION_4) {\r
-    ServiceBindingGuid = &gEfiTcp4ServiceBindingProtocolGuid;\r
-  } else {\r
-    ServiceBindingGuid = &gEfiTcp6ServiceBindingProtocolGuid;\r
-  }\r
-\r
-  gRT->SetVariable (\r
-         TcpService->MacString,\r
-         ServiceBindingGuid,\r
-         EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
-         0,\r
-         NULL\r
-         );\r
-\r
-  FreePool (TcpService->MacString);\r
-  TcpService->MacString = NULL;\r
-}\r
-\r
 /**\r
   Install the device path protocol on the TCP instance.\r
 \r