/** @file\r
Misc support routines for TCP driver.\r
\r
- Copyright (c) 2009 - 2010, 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
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
LIST_ENTRY *Entry;\r
LIST_ENTRY *Head;\r
TCP_CB *Node;\r
- TCP_PROTO_DATA *TcpProto;\r
\r
ASSERT (\r
(Tcb != NULL) &&\r
\r
InsertHeadList (Head, &Tcb->List);\r
\r
- TcpProto = (TCP_PROTO_DATA *) Tcb->Sk->ProtoReserved;\r
- TcpSetVariableData (TcpProto->TcpService);\r
\r
return 0;\r
}\r
} 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
ASSERT (State < (sizeof (mTcpStateName) / sizeof (CHAR16 *)));\r
\r
DEBUG (\r
- (EFI_D_INFO,\r
+ (EFI_D_NET,\r
"Tcb (%p) state %s --> %s\n",\r
Tcb,\r
mTcpStateName[Tcb->State],\r
if (TcpOld < Tcb->RcvMss) {\r
\r
DEBUG (\r
- (EFI_D_INFO,\r
+ (EFI_D_NET,\r
"TcpOnAppConsume: send a window update for a window closed Tcb %p\n",\r
Tcb)\r
);\r
} else if (Tcb->DelayedAck == 0) {\r
\r
DEBUG (\r
- (EFI_D_INFO,\r
+ (EFI_D_NET,\r
"TcpOnAppConsume: scheduled a delayed ACK to update window for Tcb %p\n",\r
Tcb)\r
);\r
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
Tcb->UseDefaultAddr\r
);\r
\r
+ IP4_COPY_ADDRESS (&Ip4DPathNode.SubnetMask, &Tcb->SubnetMask);\r
+\r
DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) &Ip4DPathNode;\r
} else {\r
NetLibCreateIPv6DPathNode (\r