summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSiyuan Fu <siyuan.fu@intel.com>2018-12-20 09:22:06 +0800
committerSiyuan Fu <siyuan.fu@intel.com>2018-12-24 15:08:55 +0800
commit376a5dbe97e7702a514c81331f2e2a2f901d4302 (patch)
tree27907fdf6a50e9dc5f578a85d953c6c2fefadce2
parent41203b9ab5d48e029f24e17e9a865e54b7e1643d (diff)
MdeModulePkg: Delete Tcp4Dxe in MdeModulePkg.
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1278 This patch is to delete the Tcp4Dxe driver in MdeModulePkg. The driver will not be maintained and can't co-work with the dual-stack TcpDxe in NetworkPkg. People should use below NetworkPkg drivers instead: NetworkPkg/TcpDxe/TcpDxe.inf Which is actively maintained with more bug fixes and new feature support. Cc: Jian J Wang <jian.j.wang@intel.com> Cc: Hao Wu <hao.a.wu@intel.com> Cc: Ruiyu Ni <ruiyu.ni@intel.com> Cc: Star Zeng <star.zeng@intel.com> Cc: Jiaxin Wu <jiaxin.wu@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Siyuan Fu <siyuan.fu@intel.com> Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
-rw-r--r--MdeModulePkg/MdeModulePkg.dsc1
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c433
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c1201
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h131
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c990
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h954
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c717
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c782
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h342
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf94
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni23
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni20
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h781
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c1497
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c112
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c674
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h494
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c940
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c352
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h130
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c1238
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h357
-rw-r--r--MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c584
23 files changed, 0 insertions, 12847 deletions
diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc
index 2465d39fd7..3529c8d303 100644
--- a/MdeModulePkg/MdeModulePkg.dsc
+++ b/MdeModulePkg/MdeModulePkg.dsc
@@ -359,7 +359,6 @@
MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf
MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf
MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf
MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf
MdeModulePkg/Universal/PcatSingleSegmentPciCfg2Pei/PcatSingleSegmentPciCfg2Pei.inf
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c
deleted file mode 100644
index f1227691ec..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c
+++ /dev/null
@@ -1,433 +0,0 @@
-/** @file
- UEFI Component Name(2) protocol implementation for Tcp4Dxe driver.
-
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Tcp4Main.h"
-
-/**
- Retrieves a Unicode string that is the user readable name of the driver.
-
- This function retrieves the user readable name of a driver in the form of a
- Unicode string. If the driver specified by This has a user readable name in
- the language specified by Language, then a pointer to the driver name is
- returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
- by This does not support the language specified by Language,
- then EFI_UNSUPPORTED is returned.
-
- @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
-
- @param[in] Language A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified
- in RFC 4646 or ISO 639-2 language code format.
-
- @param[out] DriverName A pointer to the Unicode string to return.
- This Unicode string is the name of the
- driver specified by This in the language
- specified by Language.
-
- @retval EFI_SUCCESS The Unicode string for the Driver specified by
- This and the language specified by Language was
- returned in DriverName.
-
- @retval EFI_INVALID_PARAMETER Language is NULL.
-
- @retval EFI_INVALID_PARAMETER DriverName is NULL.
-
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-TcpComponentNameGetDriverName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN CHAR8 *Language,
- OUT CHAR16 **DriverName
- );
-
-
-/**
- Retrieves a Unicode string that is the user readable name of the controller
- that is being managed by a driver.
-
- This function retrieves the user readable name of the controller specified by
- ControllerHandle and ChildHandle in the form of a Unicode string. If the
- driver specified by This has a user readable name in the language specified by
- Language, then a pointer to the controller name is returned in ControllerName,
- and EFI_SUCCESS is returned. If the driver specified by This is not currently
- managing the controller specified by ControllerHandle and ChildHandle,
- then EFI_UNSUPPORTED is returned. If the driver specified by This does not
- support the language specified by Language, then EFI_UNSUPPORTED is returned.
-
- @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
-
- @param[in] ControllerHandle The handle of a controller that the driver
- specified by This is managing. This handle
- specifies the controller whose name is to be
- returned.
-
- @param[in] ChildHandle The handle of the child controller to retrieve
- the name of. This is an optional parameter that
- may be NULL. It will be NULL for device
- drivers. It will also be NULL for a bus drivers
- that wish to retrieve the name of the bus
- controller. It will not be NULL for a bus
- driver that wishes to retrieve the name of a
- child controller.
-
- @param[in] Language A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified in
- RFC 4646 or ISO 639-2 language code format.
-
- @param[out] ControllerName A pointer to the Unicode string to return.
- This Unicode string is the name of the
- controller specified by ControllerHandle and
- ChildHandle in the language specified by
- Language from the point of view of the driver
- specified by This.
-
- @retval EFI_SUCCESS The Unicode string for the user readable name in
- the language specified by Language for the
- driver specified by This was returned in
- DriverName.
-
- @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
-
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
- EFI_HANDLE.
-
- @retval EFI_INVALID_PARAMETER Language is NULL.
-
- @retval EFI_INVALID_PARAMETER ControllerName is NULL.
-
- @retval EFI_UNSUPPORTED The driver specified by This is not currently
- managing the controller specified by
- ControllerHandle and ChildHandle.
-
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-TcpComponentNameGetControllerName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_HANDLE ChildHandle OPTIONAL,
- IN CHAR8 *Language,
- OUT CHAR16 **ControllerName
- );
-
-
-///
-/// EFI Component Name Protocol
-///
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName = {
- TcpComponentNameGetDriverName,
- TcpComponentNameGetControllerName,
- "eng"
-};
-
-///
-/// EFI Component Name 2 Protocol
-///
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2 = {
- (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) TcpComponentNameGetDriverName,
- (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) TcpComponentNameGetControllerName,
- "en"
-};
-
-
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mTcpDriverNameTable[] = {
- {
- "eng;en",
- L"Tcp Network Service Driver"
- },
- {
- NULL,
- NULL
- }
-};
-
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gTcpControllerNameTable = NULL;
-
-/**
- Retrieves a Unicode string that is the user readable name of the driver.
-
- This function retrieves the user readable name of a driver in the form of a
- Unicode string. If the driver specified by This has a user readable name in
- the language specified by Language, then a pointer to the driver name is
- returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
- by This does not support the language specified by Language,
- then EFI_UNSUPPORTED is returned.
-
- @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
-
- @param[in] Language A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified
- in RFC 4646 or ISO 639-2 language code format.
-
- @param[out] DriverName A pointer to the Unicode string to return.
- This Unicode string is the name of the
- driver specified by This in the language
- specified by Language.
-
- @retval EFI_SUCCESS The Unicode string for the Driver specified by
- This and the language specified by Language was
- returned in DriverName.
-
- @retval EFI_INVALID_PARAMETER Language is NULL.
-
- @retval EFI_INVALID_PARAMETER DriverName is NULL.
-
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-TcpComponentNameGetDriverName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN CHAR8 *Language,
- OUT CHAR16 **DriverName
- )
-{
- return LookupUnicodeString2 (
- Language,
- This->SupportedLanguages,
- mTcpDriverNameTable,
- DriverName,
- (BOOLEAN) (This == &gTcp4ComponentName)
- );
-}
-
-/**
- Update the component name for the Tcp4 child handle.
-
- @param Tcp4[in] A pointer to the EFI_TCP4_PROTOCOL.
-
-
- @retval EFI_SUCCESS Update the ControllerNameTable of this instance successfully.
- @retval EFI_INVALID_PARAMETER The input parameter is invalid.
-
-**/
-EFI_STATUS
-UpdateName (
- IN EFI_TCP4_PROTOCOL *Tcp4
- )
-{
- EFI_STATUS Status;
- CHAR16 HandleName[80];
- EFI_TCP4_CONFIG_DATA Tcp4ConfigData;
-
- if (Tcp4 == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Format the child name into the string buffer as:
- // TCPv4 (SrcPort=59, DestPort=60, ActiveFlag=TRUE)
- //
- ZeroMem (&Tcp4ConfigData, sizeof (Tcp4ConfigData));
- Status = Tcp4->GetModeData (Tcp4, NULL, &Tcp4ConfigData, NULL, NULL, NULL);
- if (!EFI_ERROR (Status)) {
- UnicodeSPrint (HandleName, sizeof (HandleName),
- L"TCPv4 (SrcPort=%d, DestPort=%d, ActiveFlag=%s)",
- Tcp4ConfigData.AccessPoint.StationPort,
- Tcp4ConfigData.AccessPoint.RemotePort,
- (Tcp4ConfigData.AccessPoint.ActiveFlag ? L"TRUE" : L"FALSE")
- );
- } else if (Status == EFI_NOT_STARTED) {
- UnicodeSPrint (
- HandleName,
- sizeof (HandleName),
- L"TCPv4 (Not started)"
- );
- } else {
- return Status;
- }
-
- if (gTcpControllerNameTable != NULL) {
- FreeUnicodeStringTable (gTcpControllerNameTable);
- gTcpControllerNameTable = NULL;
- }
-
- Status = AddUnicodeString2 (
- "eng",
- gTcp4ComponentName.SupportedLanguages,
- &gTcpControllerNameTable,
- HandleName,
- TRUE
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- return AddUnicodeString2 (
- "en",
- gTcp4ComponentName2.SupportedLanguages,
- &gTcpControllerNameTable,
- HandleName,
- FALSE
- );
-}
-
-/**
- Retrieves a Unicode string that is the user readable name of the controller
- that is being managed by a driver.
-
- This function retrieves the user readable name of the controller specified by
- ControllerHandle and ChildHandle in the form of a Unicode string. If the
- driver specified by This has a user readable name in the language specified by
- Language, then a pointer to the controller name is returned in ControllerName,
- and EFI_SUCCESS is returned. If the driver specified by This is not currently
- managing the controller specified by ControllerHandle and ChildHandle,
- then EFI_UNSUPPORTED is returned. If the driver specified by This does not
- support the language specified by Language, then EFI_UNSUPPORTED is returned.
-
- @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
- EFI_COMPONENT_NAME_PROTOCOL instance.
-
- @param[in] ControllerHandle The handle of a controller that the driver
- specified by This is managing. This handle
- specifies the controller whose name is to be
- returned.
-
- @param[in] ChildHandle The handle of the child controller to retrieve
- the name of. This is an optional parameter that
- may be NULL. It will be NULL for device
- drivers. It will also be NULL for a bus drivers
- that wish to retrieve the name of the bus
- controller. It will not be NULL for a bus
- driver that wishes to retrieve the name of a
- child controller.
-
- @param[in] Language A pointer to a Null-terminated ASCII string
- array indicating the language. This is the
- language of the driver name that the caller is
- requesting, and it must match one of the
- languages specified in SupportedLanguages. The
- number of languages supported by a driver is up
- to the driver writer. Language is specified in
- RFC 4646 or ISO 639-2 language code format.
-
- @param[out] ControllerName A pointer to the Unicode string to return.
- This Unicode string is the name of the
- controller specified by ControllerHandle and
- ChildHandle in the language specified by
- Language from the point of view of the driver
- specified by This.
-
- @retval EFI_SUCCESS The Unicode string for the user readable name in
- the language specified by Language for the
- driver specified by This was returned in
- DriverName.
-
- @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
-
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
- EFI_HANDLE.
-
- @retval EFI_INVALID_PARAMETER Language is NULL.
-
- @retval EFI_INVALID_PARAMETER ControllerName is NULL.
-
- @retval EFI_UNSUPPORTED The driver specified by This is not currently
- managing the controller specified by
- ControllerHandle and ChildHandle.
-
- @retval EFI_UNSUPPORTED The driver specified by This does not support
- the language specified by Language.
-
-**/
-EFI_STATUS
-EFIAPI
-TcpComponentNameGetControllerName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_HANDLE ChildHandle OPTIONAL,
- IN CHAR8 *Language,
- OUT CHAR16 **ControllerName
- )
-{
- EFI_STATUS Status;
- EFI_TCP4_PROTOCOL *Tcp4;
-
- //
- // Only provide names for child handles.
- //
- if (ChildHandle == NULL) {
- return EFI_UNSUPPORTED;
- }
-
- //
- // Make sure this driver produced ChildHandle
- //
- Status = EfiTestChildHandle (
- ControllerHandle,
- ChildHandle,
- &gEfiIp4ProtocolGuid
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Retrieve an instance of a produced protocol from ChildHandle
- //
- Status = gBS->OpenProtocol (
- ChildHandle,
- &gEfiTcp4ProtocolGuid,
- (VOID **)&Tcp4,
- NULL,
- NULL,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Update the component name for this child handle.
- //
- Status = UpdateName (Tcp4);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- return LookupUnicodeString2 (
- Language,
- This->SupportedLanguages,
- gTcpControllerNameTable,
- ControllerName,
- (BOOLEAN)(This == &gTcp4ComponentName)
- );
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c
deleted file mode 100644
index adb5aa35cd..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c
+++ /dev/null
@@ -1,1201 +0,0 @@
-/** @file
- Implementation of the Socket.
-
-Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "SockImpl.h"
-
-/**
- Get the length of the data that can be retrieved from the socket
- receive buffer.
-
- @param SockBuffer Pointer to the socket receive buffer.
- @param IsUrg Pointer to a BOOLEAN variable. If TRUE the data is
- OOB.
- @param BufLen The maximum length of the data buffer to store the
- received data in socket layer.
-
- @return The length of the data can be retreived.
-
-**/
-UINT32
-SockTcpDataToRcv (
- IN SOCK_BUFFER *SockBuffer,
- OUT BOOLEAN *IsUrg,
- IN UINT32 BufLen
- );
-
-/**
- Process the send token.
-
- @param Sock Pointer to the socket.
-
-**/
-VOID
-SockProcessSndToken (
- IN OUT SOCKET *Sock
- );
-
-/**
- Supporting function for both SockImpl and SockInterface.
-
- @param Event The Event this notify function registered to, ignored.
-
-**/
-VOID
-EFIAPI
-SockFreeFoo (
- IN EFI_EVENT Event
- )
-{
- return ;
-}
-
-
-/**
- Get the length of the data that can be retrieved from the socket
- receive buffer.
-
- @param SockBuffer Pointer to the socket receive buffer.
- @param IsUrg Pointer to a BOOLEAN variable. If TRUE the data is
- OOB.
- @param BufLen The maximum length of the data buffer to store the
- received data in socket layer.
-
- @return The length of the data can be retreived.
-
-**/
-UINT32
-SockTcpDataToRcv (
- IN SOCK_BUFFER *SockBuffer,
- OUT BOOLEAN *IsUrg,
- IN UINT32 BufLen
- )
-{
- NET_BUF *RcvBufEntry;
- UINT32 DataLen;
- TCP_RSV_DATA *TcpRsvData;
- BOOLEAN Urg;
- ASSERT ((SockBuffer != NULL) && (IsUrg != NULL) && (BufLen > 0));
-
- RcvBufEntry = SockBufFirst (SockBuffer);
- ASSERT (RcvBufEntry != NULL);
-
- TcpRsvData = (TCP_RSV_DATA *) RcvBufEntry->ProtoData;
-
- *IsUrg = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE);
-
- if (*IsUrg && TcpRsvData->UrgLen < RcvBufEntry->TotalSize) {
-
- DataLen = MIN (TcpRsvData->UrgLen, BufLen);
-
- if (DataLen < TcpRsvData->UrgLen) {
- TcpRsvData->UrgLen = TcpRsvData->UrgLen - DataLen;
- } else {
- TcpRsvData->UrgLen = 0;
- }
-
- return DataLen;
-
- }
-
- DataLen = RcvBufEntry->TotalSize;
-
- RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry);
-
- while ((BufLen > DataLen) && (RcvBufEntry != NULL)) {
-
- TcpRsvData = (TCP_RSV_DATA *) RcvBufEntry->ProtoData;
-
- Urg = (BOOLEAN) ((TcpRsvData->UrgLen > 0) ? TRUE : FALSE);
-
- if (*IsUrg != Urg) {
- break;
- }
-
- if (*IsUrg && TcpRsvData->UrgLen < RcvBufEntry->TotalSize) {
-
- if (TcpRsvData->UrgLen + DataLen < BufLen) {
- TcpRsvData->UrgLen = 0;
- } else {
- TcpRsvData->UrgLen = TcpRsvData->UrgLen - (BufLen - DataLen);
- }
-
- return MIN (TcpRsvData->UrgLen + DataLen, BufLen);
-
- }
-
- DataLen += RcvBufEntry->TotalSize;
-
- RcvBufEntry = SockBufNext (SockBuffer, RcvBufEntry);
- }
-
- DataLen = MIN (BufLen, DataLen);
- return DataLen;
-}
-
-
-/**
- Copy data from socket buffer to application provided receive buffer.
-
- @param Sock Pointer to the socket.
- @param TcpRxData Pointer to the application provided receive buffer.
- @param RcvdBytes The maximum length of the data can be copied.
- @param IsOOB If TRUE the data is OOB, FALSE the data is normal.
-
-**/
-VOID
-SockSetTcpRxData (
- IN SOCKET *Sock,
- IN VOID *TcpRxData,
- IN UINT32 RcvdBytes,
- IN BOOLEAN IsOOB
- )
-{
- UINT32 Index;
- UINT32 CopyBytes;
- UINT32 OffSet;
- EFI_TCP4_RECEIVE_DATA *RxData;
- EFI_TCP4_FRAGMENT_DATA *Fragment;
-
- RxData = (EFI_TCP4_RECEIVE_DATA *) TcpRxData;
-
- OffSet = 0;
-
- ASSERT (RxData->DataLength >= RcvdBytes);
-
- RxData->DataLength = RcvdBytes;
- RxData->UrgentFlag = IsOOB;
-
- for (Index = 0; (Index < RxData->FragmentCount) && (RcvdBytes > 0); Index++) {
-
- Fragment = &RxData->FragmentTable[Index];
- CopyBytes = MIN ((UINT32) (Fragment->FragmentLength), RcvdBytes);
-
- NetbufQueCopy (
- Sock->RcvBuffer.DataQueue,
- OffSet,
- CopyBytes,
- Fragment->FragmentBuffer
- );
-
- Fragment->FragmentLength = CopyBytes;
- RcvdBytes -= CopyBytes;
- OffSet += CopyBytes;
- }
-}
-
-
-/**
- Get received data from the socket layer to the receive token.
-
- @param Sock Pointer to the socket.
- @param RcvToken Pointer to the application provided receive token.
-
- @return The length of data received in this token.
-
-**/
-UINT32
-SockProcessRcvToken (
- IN SOCKET *Sock,
- IN OUT SOCK_IO_TOKEN *RcvToken
- )
-{
- UINT32 TokenRcvdBytes;
- EFI_TCP4_RECEIVE_DATA *RxData;
- BOOLEAN IsUrg;
-
- ASSERT (Sock != NULL);
-
- ASSERT (SockStream == Sock->Type);
-
- RxData = RcvToken->Packet.RxData;
-
- TokenRcvdBytes = SockTcpDataToRcv (
- &Sock->RcvBuffer,
- &IsUrg,
- (UINT32) RxData->DataLength
- );
-
- //
- // Copy data from RcvBuffer of socket to user
- // provided RxData and set the fields in TCP RxData
- //
- SockSetTcpRxData (Sock, RxData, TokenRcvdBytes, IsUrg);
-
- NetbufQueTrim (Sock->RcvBuffer.DataQueue, TokenRcvdBytes);
- SIGNAL_TOKEN (&(RcvToken->Token), EFI_SUCCESS);
-
- return TokenRcvdBytes;
-}
-
-
-/**
- Process the TCP send data, buffer the tcp txdata and append
- the buffer to socket send buffer,then try to send it.
-
- @param Sock Pointer to the socket.
- @param TcpTxData Pointer to the application provided send buffer.
-
- @retval EFI_SUCCESS The operation is completed successfully.
- @retval EFI_OUT_OF_RESOURCES Failed due to resource limit.
-
-**/
-EFI_STATUS
-SockProcessTcpSndData (
- IN SOCKET *Sock,
- IN VOID *TcpTxData
- )
-{
- NET_BUF *SndData;
- EFI_STATUS Status;
- EFI_TCP4_TRANSMIT_DATA *TxData;
-
- TxData = (EFI_TCP4_TRANSMIT_DATA *) TcpTxData;
-
- //
- // transform this TxData into a NET_BUFFER
- // and insert it into Sock->SndBuffer
- //
- SndData = NetbufFromExt (
- (NET_FRAGMENT *) TxData->FragmentTable,
- (UINT32) TxData->FragmentCount,
- 0,
- 0,
- SockFreeFoo,
- NULL
- );
-
- if (NULL == SndData) {
- DEBUG ((EFI_D_ERROR, "SockKProcessSndData: Failed to"
- " call NetBufferFromExt\n"));
-
- return EFI_OUT_OF_RESOURCES;
- }
-
- NetbufQueAppend (Sock->SndBuffer.DataQueue, SndData);
-
- //
- // notify the low layer protocol to handle this send token
- //
- if (TxData->Urgent) {
- Status = Sock->ProtoHandler (Sock, SOCK_SNDURG, NULL);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
- }
-
- if (TxData->Push) {
- Status = Sock->ProtoHandler (Sock, SOCK_SNDPUSH, NULL);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
- }
-
- //
- // low layer protocol should really handle the sending
- // process when catching SOCK_SND request
- //
- Status = Sock->ProtoHandler (Sock, SOCK_SND, NULL);
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Flush the tokens in the specific token list.
-
- @param Sock Pointer to the socket.
- @param PendingTokenList Pointer to the token list to be flushed.
-
-**/
-VOID
-SockFlushPendingToken (
- IN SOCKET *Sock,
- IN LIST_ENTRY *PendingTokenList
- )
-{
- SOCK_TOKEN *SockToken;
- SOCK_COMPLETION_TOKEN *Token;
-
- ASSERT ((Sock != NULL) && (PendingTokenList != NULL));
-
- while (!IsListEmpty (PendingTokenList)) {
- SockToken = NET_LIST_HEAD (
- PendingTokenList,
- SOCK_TOKEN,
- TokenList
- );
-
- Token = SockToken->Token;
- SIGNAL_TOKEN (Token, Sock->SockError);
-
- RemoveEntryList (&(SockToken->TokenList));
- FreePool (SockToken);
- }
-}
-
-
-/**
- Wake up the connection token while the connection is successfully established,
- then try to process any pending send token.
-
- @param Sock Pointer to the socket.
-
-**/
-VOID
-SockWakeConnToken (
- IN OUT SOCKET *Sock
- )
-{
- ASSERT (Sock->ConnectionToken != NULL);
-
- SIGNAL_TOKEN (Sock->ConnectionToken, EFI_SUCCESS);
- Sock->ConnectionToken = NULL;
-
- //
- // check to see if some pending send token existed?
- //
- SockProcessSndToken (Sock);
- return ;
-}
-
-
-/**
- Wake up the listen token while the connection is established successfully.
-
- @param Sock Pointer to the socket.
-
-**/
-VOID
-SockWakeListenToken (
- IN OUT SOCKET *Sock
- )
-{
- SOCKET *Parent;
- SOCK_TOKEN *SockToken;
- EFI_TCP4_LISTEN_TOKEN *ListenToken;
-
- Parent = Sock->Parent;
-
- ASSERT ((Parent != NULL) && SOCK_IS_LISTENING (Parent) && SOCK_IS_CONNECTED (Sock));
-
- if (!IsListEmpty (&Parent->ListenTokenList)) {
- SockToken = NET_LIST_HEAD (
- &Parent->ListenTokenList,
- SOCK_TOKEN,
- TokenList
- );
-
- ListenToken = (EFI_TCP4_LISTEN_TOKEN *) SockToken->Token;
- ListenToken->NewChildHandle = Sock->SockHandle;
-
- SIGNAL_TOKEN (&(ListenToken->CompletionToken), EFI_SUCCESS);
-
- RemoveEntryList (&SockToken->TokenList);
- FreePool (SockToken);
-
- RemoveEntryList (&Sock->ConnectionList);
-
- Parent->ConnCnt--;
- DEBUG ((EFI_D_NET, "SockWakeListenToken: accept a socket, now conncnt is %d", Parent->ConnCnt));
-
- Sock->Parent = NULL;
- }
-}
-
-
-/**
- Wake up the receive token while some data is received.
-
- @param Sock Pointer to the socket.
-
-**/
-VOID
-SockWakeRcvToken (
- IN SOCKET *Sock
- )
-{
- UINT32 RcvdBytes;
- UINT32 TokenRcvdBytes;
- SOCK_TOKEN *SockToken;
- SOCK_IO_TOKEN *RcvToken;
-
- ASSERT (Sock->RcvBuffer.DataQueue != NULL);
-
- RcvdBytes = (Sock->RcvBuffer.DataQueue)->BufSize;
-
- ASSERT (RcvdBytes > 0);
-
- while (RcvdBytes > 0 && !IsListEmpty (&Sock->RcvTokenList)) {
-
- SockToken = NET_LIST_HEAD (
- &Sock->RcvTokenList,
- SOCK_TOKEN,
- TokenList
- );
-
- RcvToken = (SOCK_IO_TOKEN *) SockToken->Token;
- TokenRcvdBytes = SockProcessRcvToken (Sock, RcvToken);
-
- if (0 == TokenRcvdBytes) {
- return ;
- }
-
- RemoveEntryList (&(SockToken->TokenList));
- FreePool (SockToken);
- RcvdBytes -= TokenRcvdBytes;
- }
-}
-
-
-/**
- Process the send token.
-
- @param Sock Pointer to the socket.
-
-**/
-VOID
-SockProcessSndToken (
- IN OUT SOCKET *Sock
- )
-{
- UINT32 FreeSpace;
- SOCK_TOKEN *SockToken;
- UINT32 DataLen;
- SOCK_IO_TOKEN *SndToken;
- EFI_TCP4_TRANSMIT_DATA *TxData;
- EFI_STATUS Status;
-
- ASSERT ((Sock != NULL) && (SockStream == Sock->Type));
-
- FreeSpace = SockGetFreeSpace (Sock, SOCK_SND_BUF);
-
- //
- // to determine if process a send token using
- // socket layer flow control policy
- //
- while ((FreeSpace >= Sock->SndBuffer.LowWater) &&
- !IsListEmpty (&Sock->SndTokenList)) {
-
- SockToken = NET_LIST_HEAD (
- &(Sock->SndTokenList),
- SOCK_TOKEN,
- TokenList
- );
-
- //
- // process this token
- //
- RemoveEntryList (&(SockToken->TokenList));
- InsertTailList (
- &(Sock->ProcessingSndTokenList),
- &(SockToken->TokenList)
- );
-
- //
- // Proceess it in the light of SockType
- //
- SndToken = (SOCK_IO_TOKEN *) SockToken->Token;
- TxData = SndToken->Packet.TxData;
-
- DataLen = (UINT32) TxData->DataLength;
- Status = SockProcessTcpSndData (Sock, TxData);
-
- if (EFI_ERROR (Status)) {
- goto OnError;
- }
-
- if (DataLen >= FreeSpace) {
- FreeSpace = 0;
-
- } else {
- FreeSpace -= DataLen;
-
- }
- }
-
- return ;
-
-OnError:
-
- RemoveEntryList (&SockToken->TokenList);
- SIGNAL_TOKEN (SockToken->Token, Status);
- FreePool (SockToken);
-}
-
-
-/**
- Create a socket with initial data SockInitData.
-
- @param SockInitData Pointer to the initial data of the socket.
-
- @return Pointer to the newly created socket, return NULL when exception occured.
-
-**/
-SOCKET *
-SockCreate (
- IN SOCK_INIT_DATA *SockInitData
- )
-{
- SOCKET *Sock;
- SOCKET *Parent;
- EFI_STATUS Status;
-
- ASSERT ((SockInitData != NULL) && (SockInitData->ProtoHandler != NULL));
- ASSERT (SockInitData->Type == SockStream);
- ASSERT ((SockInitData->ProtoData != NULL) && (SockInitData->DataSize <= PROTO_RESERVED_LEN));
-
- Parent = SockInitData->Parent;
-
- if ((Parent != NULL) && (Parent->ConnCnt == Parent->BackLog)) {
- DEBUG (
- (EFI_D_ERROR,
- "SockCreate: Socket parent has "
- "reached its connection limit with %d ConnCnt and %d BackLog\n",
- Parent->ConnCnt,
- Parent->BackLog)
- );
-
- return NULL;
- }
-
- Sock = AllocateZeroPool (sizeof (SOCKET));
- if (NULL == Sock) {
-
- DEBUG ((EFI_D_ERROR, "SockCreate: No resource to create a new socket\n"));
- return NULL;
- }
-
- InitializeListHead (&Sock->Link);
- InitializeListHead (&Sock->ConnectionList);
- InitializeListHead (&Sock->ListenTokenList);
- InitializeListHead (&Sock->RcvTokenList);
- InitializeListHead (&Sock->SndTokenList);
- InitializeListHead (&Sock->ProcessingSndTokenList);
-
- EfiInitializeLock (&(Sock->Lock), TPL_CALLBACK);
-
- Sock->SndBuffer.DataQueue = NetbufQueAlloc ();
- if (NULL == Sock->SndBuffer.DataQueue) {
- DEBUG ((EFI_D_ERROR, "SockCreate: No resource to allocate"
- " SndBuffer for new socket\n"));
-
- goto OnError;
- }
-
- Sock->RcvBuffer.DataQueue = NetbufQueAlloc ();
- if (NULL == Sock->RcvBuffer.DataQueue) {
- DEBUG ((EFI_D_ERROR, "SockCreate: No resource to allocate "
- "RcvBuffer for new socket\n"));
-
- goto OnError;
- }
-
- Sock->Signature = SOCK_SIGNATURE;
-
- Sock->Parent = Parent;
- Sock->BackLog = SockInitData->BackLog;
- Sock->ProtoHandler = SockInitData->ProtoHandler;
- Sock->SndBuffer.HighWater = SockInitData->SndBufferSize;
- Sock->RcvBuffer.HighWater = SockInitData->RcvBufferSize;
- Sock->Type = SockInitData->Type;
- Sock->DriverBinding = SockInitData->DriverBinding;
- Sock->State = SockInitData->State;
- Sock->CreateCallback = SockInitData->CreateCallback;
- Sock->DestroyCallback = SockInitData->DestroyCallback;
- Sock->Context = SockInitData->Context;
-
- Sock->SockError = EFI_ABORTED;
- Sock->SndBuffer.LowWater = SOCK_BUFF_LOW_WATER;
- Sock->RcvBuffer.LowWater = SOCK_BUFF_LOW_WATER;
-
- //
- // Install protocol on Sock->SockHandle
- //
- CopyMem (
- &(Sock->NetProtocol.TcpProtocol),
- SockInitData->Protocol,
- sizeof (EFI_TCP4_PROTOCOL)
- );
-
- //
- // copy the protodata into socket
- //
- CopyMem (Sock->ProtoReserved, SockInitData->ProtoData, SockInitData->DataSize);
-
- Status = gBS->InstallMultipleProtocolInterfaces (
- &Sock->SockHandle,
- &gEfiTcp4ProtocolGuid,
- &(Sock->NetProtocol.TcpProtocol),
- NULL
- );
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "SockCreate: Install TCP protocol in "
- "socket failed with %r\n", Status));
-
- goto OnError;
- }
-
- if (Parent != NULL) {
- ASSERT (Parent->BackLog > 0);
- ASSERT (SOCK_IS_LISTENING (Parent));
-
- //
- // need to add it into Parent->ConnectionList
- // if the Parent->ConnCnt < Parent->BackLog
- //
- Parent->ConnCnt++;
-
- DEBUG (
- (EFI_D_NET,
- "SockCreate: Create a new socket and add to parent, now conncnt is %d\n",
- Parent->ConnCnt)
- );
-
- InsertTailList (&Parent->ConnectionList, &Sock->ConnectionList);
- }
-
- if (Sock->CreateCallback != NULL) {
- Status = Sock->CreateCallback (Sock, Sock->Context);
- if (EFI_ERROR (Status)) {
- goto OnError;
- }
- }
-
- return Sock;
-
-OnError:
-
- if (Sock->SockHandle != NULL) {
- gBS->UninstallMultipleProtocolInterfaces (
- Sock->SockHandle,
- &gEfiTcp4ProtocolGuid,
- &(Sock->NetProtocol.TcpProtocol),
- NULL
- );
- }
-
- if (NULL != Sock->SndBuffer.DataQueue) {
- NetbufQueFree (Sock->SndBuffer.DataQueue);
- }
-
- if (NULL != Sock->RcvBuffer.DataQueue) {
- NetbufQueFree (Sock->RcvBuffer.DataQueue);
- }
-
- FreePool (Sock);
-
- return NULL;
-}
-
-
-/**
- Destroy a socket.
-
- @param Sock Pointer to the socket.
-
-**/
-VOID
-SockDestroy (
- IN OUT SOCKET *Sock
- )
-{
- ASSERT (SockStream == Sock->Type);
-
- //
- // Flush the completion token buffered
- // by sock and rcv, snd buffer
- //
- if (!SOCK_IS_UNCONFIGURED (Sock)) {
-
- SockConnFlush (Sock);
- SockSetState (Sock, SO_CLOSED);
- Sock->ConfigureState = SO_UNCONFIGURED;
-
- }
- //
- // Destroy the RcvBuffer Queue and SendBuffer Queue
- //
- NetbufQueFree (Sock->RcvBuffer.DataQueue);
- NetbufQueFree (Sock->SndBuffer.DataQueue);
-
- //
- // Remove it from parent connection list if needed
- //
- if (Sock->Parent != NULL) {
-
- RemoveEntryList (&(Sock->ConnectionList));
- (Sock->Parent->ConnCnt)--;
-
- DEBUG (
- (EFI_D_NET,
- "SockDestroy: Delete a unaccepted socket from parent"
- "now conncnt is %d\n",
- Sock->Parent->ConnCnt)
- );
-
- Sock->Parent = NULL;
- }
-
- FreePool (Sock);
- return ;
-}
-
-
-/**
- Flush the sndBuffer and rcvBuffer of socket.
-
- @param Sock Pointer to the socket.
-
-**/
-VOID
-SockConnFlush (
- IN OUT SOCKET *Sock
- )
-{
- SOCKET *Child;
-
- ASSERT (Sock != NULL);
-
- //
- // Clear the flag in this socket
- //
- Sock->Flag = 0;
-
- //
- // Flush the SndBuffer and RcvBuffer of Sock
- //
- NetbufQueFlush (Sock->SndBuffer.DataQueue);
- NetbufQueFlush (Sock->RcvBuffer.DataQueue);
-
- //
- // Signal the pending token
- //
- if (Sock->ConnectionToken != NULL) {
- SIGNAL_TOKEN (Sock->ConnectionToken, Sock->SockError);
- Sock->ConnectionToken = NULL;
- }
-
- if (Sock->CloseToken != NULL) {
- SIGNAL_TOKEN (Sock->CloseToken, Sock->SockError);
- Sock->CloseToken = NULL;
- }
-
- SockFlushPendingToken (Sock, &(Sock->ListenTokenList));
- SockFlushPendingToken (Sock, &(Sock->RcvTokenList));
- SockFlushPendingToken (Sock, &(Sock->SndTokenList));
- SockFlushPendingToken (Sock, &(Sock->ProcessingSndTokenList));
-
- //
- // Destroy the pending connection, if it is a listening socket
- //
- if (SOCK_IS_LISTENING (Sock)) {
- while (!IsListEmpty (&Sock->ConnectionList)) {
- Child = NET_LIST_HEAD (
- &Sock->ConnectionList,
- SOCKET,
- ConnectionList
- );
-
- SockDestroyChild (Child);
- }
-
- Sock->ConnCnt = 0;
- }
-
- return ;
-}
-
-
-/**
- Set the state of the socket.
-
- @param Sock Pointer to the socket.
- @param State The new socket state to be set.
-
-**/
-VOID
-SockSetState (
- IN OUT SOCKET *Sock,
- IN UINT8 State
- )
-{
- Sock->State = State;
-}
-
-
-/**
- Clone a new socket including its associated protocol control block.
-
- @param Sock Pointer to the socket to be cloned.
-
- @return Pointer to the newly cloned socket. If NULL, error condition occurred.
-
-**/
-SOCKET *
-SockClone (
- IN SOCKET *Sock
- )
-{
- SOCKET *ClonedSock;
- SOCK_INIT_DATA InitData;
-
- InitData.BackLog = Sock->BackLog;
- InitData.Parent = Sock;
- InitData.State = Sock->State;
- InitData.ProtoHandler = Sock->ProtoHandler;
- InitData.Type = Sock->Type;
- InitData.RcvBufferSize = Sock->RcvBuffer.HighWater;
- InitData.SndBufferSize = Sock->SndBuffer.HighWater;
- InitData.DriverBinding = Sock->DriverBinding;
- InitData.Protocol = &(Sock->NetProtocol);
- InitData.CreateCallback = Sock->CreateCallback;
- InitData.DestroyCallback = Sock->DestroyCallback;
- InitData.Context = Sock->Context;
- InitData.ProtoData = Sock->ProtoReserved;
- InitData.DataSize = sizeof (Sock->ProtoReserved);
-
- ClonedSock = SockCreate (&InitData);
-
- if (NULL == ClonedSock) {
- DEBUG ((EFI_D_ERROR, "SockClone: no resource to create a cloned sock\n"));
- return NULL;
- }
-
- SockSetState (ClonedSock, SO_CONNECTING);
- ClonedSock->ConfigureState = Sock->ConfigureState;
-
- return ClonedSock;
-}
-
-
-/**
- Called by the low layer protocol to indicate the socket a connection is
- established.
-
- This function just changes the socket's state to SO_CONNECTED
- and signals the token used for connection establishment.
-
- @param Sock Pointer to the socket associated with the
- established connection.
-**/
-VOID
-SockConnEstablished (
- IN SOCKET *Sock
- )
-{
-
- ASSERT (SO_CONNECTING == Sock->State);
-
- SockSetState (Sock, SO_CONNECTED);
-
- if (NULL == Sock->Parent) {
- SockWakeConnToken (Sock);
- } else {
- SockWakeListenToken (Sock);
- }
-
- return ;
-}
-
-
-/**
- Called by the low layer protocol to indicate the connection is closed.
-
- This function flushes the socket, sets the state to SO_CLOSED and signals
- the close token.
-
- @param Sock Pointer to the socket associated with the closed
- connection.
-
-**/
-VOID
-SockConnClosed (
- IN OUT SOCKET *Sock
- )
-{
- if (Sock->CloseToken != NULL) {
- SIGNAL_TOKEN (Sock->CloseToken, EFI_SUCCESS);
- Sock->CloseToken = NULL;
- }
-
- SockConnFlush (Sock);
- SockSetState (Sock, SO_CLOSED);
-
- if (Sock->Parent != NULL) {
- SockDestroyChild (Sock);
- }
-
-}
-
-
-/**
- Called by low layer protocol to indicate that some data is sent or processed.
-
- This function trims the sent data in the socket send buffer, signals the data
- token if proper.
-
- @param Sock Pointer to the socket.
- @param Count The length of the data processed or sent, in bytes.
-
-**/
-VOID
-SockDataSent (
- IN SOCKET *Sock,
- IN UINT32 Count
- )
-{
- SOCK_TOKEN *SockToken;
- SOCK_COMPLETION_TOKEN *SndToken;
-
- ASSERT (!IsListEmpty (&Sock->ProcessingSndTokenList));
- ASSERT (Count <= (Sock->SndBuffer.DataQueue)->BufSize);
-
- NetbufQueTrim (Sock->SndBuffer.DataQueue, Count);
-
- //
- // To check if we can signal some snd token in this socket
- //
- while (Count > 0) {
- SockToken = NET_LIST_HEAD (
- &(Sock->ProcessingSndTokenList),
- SOCK_TOKEN,
- TokenList
- );
-
- SndToken = SockToken->Token;
-
- if (SockToken->RemainDataLen <= Count) {
-
- RemoveEntryList (&(SockToken->TokenList));
- SIGNAL_TOKEN (SndToken, EFI_SUCCESS);
- Count -= SockToken->RemainDataLen;
- FreePool (SockToken);
- } else {
-
- SockToken->RemainDataLen -= Count;
- Count = 0;
- }
- }
-
- //
- // to judge if we can process some send token in
- // Sock->SndTokenList, if so process those send token
- //
- SockProcessSndToken (Sock);
- return ;
-}
-
-
-/**
- Called by the low layer protocol to copy some data in socket send
- buffer starting from the specific offset to a buffer provided by
- the caller.
-
- @param Sock Pointer to the socket.
- @param Offset The start point of the data to be copied.
- @param Len The length of the data to be copied.
- @param Dest Pointer to the destination to copy the data.
-
- @return The data size copied.
-
-**/
-UINT32
-SockGetDataToSend (
- IN SOCKET *Sock,
- IN UINT32 Offset,
- IN UINT32 Len,
- IN UINT8 *Dest
- )
-{
- ASSERT ((Sock != NULL) && SockStream == Sock->Type);
-
- return NetbufQueCopy (
- Sock->SndBuffer.DataQueue,
- Offset,
- Len,
- Dest
- );
-}
-
-
-/**
- Called by the low layer protocol to deliver received data to socket layer.
-
- This function will append the data to the socket receive buffer, set ther
- urgent data length and then check if any receive token can be signaled.
-
- @param Sock Pointer to the socket.
- @param NetBuffer Pointer to the buffer that contains the received
- data.
- @param UrgLen The length of the urgent data in the received data.
-
-**/
-VOID
-SockDataRcvd (
- IN SOCKET *Sock,
- IN OUT NET_BUF *NetBuffer,
- IN UINT32 UrgLen
- )
-{
- ASSERT ((Sock != NULL) && (Sock->RcvBuffer.DataQueue != NULL) &&
- UrgLen <= NetBuffer->TotalSize);
-
- NET_GET_REF (NetBuffer);
-
- ((TCP_RSV_DATA *) (NetBuffer->ProtoData))->UrgLen = UrgLen;
-
- NetbufQueAppend (Sock->RcvBuffer.DataQueue, NetBuffer);
-
- SockWakeRcvToken (Sock);
- return ;
-}
-
-
-/**
- Get the length of the free space of the specific socket buffer.
-
- @param Sock Pointer to the socket.
- @param Which Flag to indicate which socket buffer to check,
- either send buffer or receive buffer.
-
- @return The length of the free space, in bytes.
-
-**/
-UINT32
-SockGetFreeSpace (
- IN SOCKET *Sock,
- IN UINT32 Which
- )
-{
- UINT32 BufferCC;
- SOCK_BUFFER *SockBuffer;
-
- ASSERT ((Sock != NULL) && ((SOCK_SND_BUF == Which) || (SOCK_RCV_BUF == Which)));
-
- if (SOCK_SND_BUF == Which) {
- SockBuffer = &(Sock->SndBuffer);
- } else {
- SockBuffer = &(Sock->RcvBuffer);
- }
-
- BufferCC = (SockBuffer->DataQueue)->BufSize;
-
- if (BufferCC >= SockBuffer->HighWater) {
-
- return 0;
- }
-
- return SockBuffer->HighWater - BufferCC;
-}
-
-
-
-/**
- Called by the low layer protocol to indicate that there will be no more data
- from the communication peer.
-
- This function set the socket's state to SO_NO_MORE_DATA and signal all queued
- IO tokens with the error status EFI_CONNECTION_FIN.
-
- @param Sock Pointer to the socket.
-
-**/
-VOID
-SockNoMoreData (
- IN OUT SOCKET *Sock
- )
-{
- EFI_STATUS Err;
-
- SOCK_NO_MORE_DATA (Sock);
-
- if (!IsListEmpty (&Sock->RcvTokenList)) {
-
- ASSERT (0 == GET_RCV_DATASIZE (Sock));
-
- Err = Sock->SockError;
-
- SOCK_ERROR (Sock, EFI_CONNECTION_FIN);
-
- SockFlushPendingToken (Sock, &Sock->RcvTokenList);
-
- SOCK_ERROR (Sock, Err);
-
- }
-
-}
-
-
-/**
- Get the first buffer block in the specific socket buffer.
-
- @param Sockbuf Pointer to the socket buffer.
-
- @return Pointer to the first buffer in the queue. NULL if the queue is empty.
-
-**/
-NET_BUF *
-SockBufFirst (
- IN SOCK_BUFFER *Sockbuf
- )
-{
- LIST_ENTRY *NetbufList;
-
- NetbufList = &(Sockbuf->DataQueue->BufList);
-
- if (IsListEmpty (NetbufList)) {
- return NULL;
- }
-
- return NET_LIST_HEAD (NetbufList, NET_BUF, List);
-}
-
-
-/**
- Get the next buffer block in the specific socket buffer.
-
- @param Sockbuf Pointer to the socket buffer.
- @param SockEntry Pointer to the buffer block prior to the required
- one.
-
- @return Pointer to the buffer block next to SockEntry. NULL if SockEntry is
- the tail or head entry.
-
-**/
-NET_BUF *
-SockBufNext (
- IN SOCK_BUFFER *Sockbuf,
- IN NET_BUF *SockEntry
- )
-{
- LIST_ENTRY *NetbufList;
-
- NetbufList = &(Sockbuf->DataQueue->BufList);
-
- if ((SockEntry->List.ForwardLink == NetbufList) ||
- (SockEntry->List.BackLink == &SockEntry->List) ||
- (SockEntry->List.ForwardLink == &SockEntry->List)) {
-
- return NULL;
- }
-
- return NET_LIST_USER_STRUCT (SockEntry->List.ForwardLink, NET_BUF, List);
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h
deleted file mode 100644
index bea7479eb2..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/** @file
- Socket implementation header file.
-
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _SOCK_IMPL_H_
-#define _SOCK_IMPL_H_
-
-#include "Socket.h"
-#include "Tcp4Main.h"
-
-/**
- Signal a event with the given status.
-
- @param Token The token's event is to be signaled.
- @param TokenStatus The status to be sent with the event.
-
-**/
-#define SIGNAL_TOKEN(Token, TokenStatus) \
- do { \
- (Token)->Status = (TokenStatus); \
- gBS->SignalEvent ((Token)->Event); \
- } while (0)
-
-
-/**
- Supporting function for both SockImpl and SockInterface.
-
- @param Event The Event this notify function registered to, ignored.
-
-**/
-VOID
-EFIAPI
-SockFreeFoo (
- IN EFI_EVENT Event
- );
-
-/**
- Process the TCP send data, buffer the tcp txdata and append
- the buffer to socket send buffer,then try to send it.
-
- @param Sock Pointer to the socket.
- @param TcpTxData Pointer to the tcp txdata.
-
- @retval EFI_SUCCESS The operation is completed successfully.
- @retval EFI_OUT_OF_RESOURCES Failed due to resource limit.
-
-**/
-EFI_STATUS
-SockProcessTcpSndData (
- IN SOCKET *Sock,
- IN VOID *TcpTxData
- );
-
-/**
- Copy data from socket buffer to application provided receive buffer.
-
- @param Sock Pointer to the socket.
- @param TcpRxData Pointer to the application provided receive buffer.
- @param RcvdBytes The maximum length of the data can be copied.
- @param IsOOB If TRUE the data is OOB, else the data is normal.
-
-**/
-VOID
-SockSetTcpRxData (
- IN SOCKET *Sock,
- IN VOID *TcpRxData,
- IN UINT32 RcvdBytes,
- IN BOOLEAN IsOOB
- );
-
-/**
- Get received data from the socket layer to the receive token.
-
- @param Sock Pointer to the socket.
- @param RcvToken Pointer to the application provided receive token.
-
- @return The length of data received in this token.
-
-**/
-UINT32
-SockProcessRcvToken (
- IN SOCKET *Sock,
- IN OUT SOCK_IO_TOKEN *RcvToken
- );
-
-/**
- Flush the socket.
-
- @param Sock Pointer to the socket.
-
-**/
-VOID
-SockConnFlush (
- IN OUT SOCKET *Sock
- );
-
-/**
- Create a socket with initial data SockInitData.
-
- @param SockInitData Pointer to the initial data of the socket.
-
- @return Pointer to the newly created socket.
-
-**/
-SOCKET *
-SockCreate (
- IN SOCK_INIT_DATA *SockInitData
- );
-
-/**
- Destroy a socket.
-
- @param Sock Pointer to the socket.
-
-**/
-VOID
-SockDestroy (
- IN OUT SOCKET *Sock
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c
deleted file mode 100644
index cd20b8bcb2..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c
+++ /dev/null
@@ -1,990 +0,0 @@
-/** @file
- Interface function of the Socket.
-
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-
-#include "SockImpl.h"
-
-
-/**
- Check whether the Event is in the List.
-
- @param List Pointer to the token list to be searched.
- @param Event The event to be checked.
-
- @retval TRUE The specific Event exists in the List.
- @retval FALSE The specific Event is not in the List.
-
-**/
-BOOLEAN
-SockTokenExistedInList (
- IN LIST_ENTRY *List,
- IN EFI_EVENT Event
- )
-{
- LIST_ENTRY *ListEntry;
- SOCK_TOKEN *SockToken;
-
- NET_LIST_FOR_EACH (ListEntry, List) {
- SockToken = NET_LIST_USER_STRUCT (
- ListEntry,
- SOCK_TOKEN,
- TokenList
- );
-
- if (Event == SockToken->Token->Event) {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-
-/**
- Call SockTokenExistedInList() to check whether the Event is
- in the related socket's lists.
-
- @param Sock Pointer to the instance's socket.
- @param Event The event to be checked.
-
- @retval TRUE The Event exists in related socket's lists.
- @retval FALSE The Event is not in related socket's lists.
-
-**/
-BOOLEAN
-SockTokenExisted (
- IN SOCKET *Sock,
- IN EFI_EVENT Event
- )
-{
-
- if (SockTokenExistedInList (&Sock->SndTokenList, Event) ||
- SockTokenExistedInList (&Sock->ProcessingSndTokenList, Event) ||
- SockTokenExistedInList (&Sock->RcvTokenList, Event) ||
- SockTokenExistedInList (&Sock->ListenTokenList, Event)) {
-
- return TRUE;
- }
-
- if ((Sock->ConnectionToken != NULL) &&
- (Sock->ConnectionToken->Event == Event)) {
-
- return TRUE;
- }
-
- if ((Sock->CloseToken != NULL) && (Sock->CloseToken->Event == Event)) {
- return TRUE;
- }
-
- return FALSE;
-}
-
-
-/**
- Buffer a token into the specific list of socket Sock.
-
- @param Sock Pointer to the instance's socket.
- @param List Pointer to the list to store the token.
- @param Token Pointer to the token to be buffered.
- @param DataLen The data length of the buffer contained in Token.
-
- @return Pointer to the token that wraps Token. If NULL, error condition occurred.
-
-**/
-SOCK_TOKEN *
-SockBufferToken (
- IN SOCKET *Sock,
- IN LIST_ENTRY *List,
- IN VOID *Token,
- IN UINT32 DataLen
- )
-{
- SOCK_TOKEN *SockToken;
-
- SockToken = AllocatePool (sizeof (SOCK_TOKEN));
- if (NULL == SockToken) {
-
- DEBUG ((EFI_D_ERROR, "SockBufferIOToken: No Memory "
- "to allocate SockToken\n"));
-
- return NULL;
- }
-
- SockToken->Sock = Sock;
- SockToken->Token = (SOCK_COMPLETION_TOKEN *) Token;
- SockToken->RemainDataLen = DataLen;
- InsertTailList (List, &SockToken->TokenList);
-
- return SockToken;
-}
-
-
-/**
- Destroy the socket Sock and its associated protocol control block.
-
- @param Sock The socket to be destroyed.
-
- @retval EFI_SUCCESS The socket Sock is destroyed successfully.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket.
-
-**/
-EFI_STATUS
-SockDestroyChild (
- IN SOCKET *Sock
- )
-{
- EFI_STATUS Status;
- TCP4_PROTO_DATA *ProtoData;
- TCP_CB *Tcb;
- VOID *SockProtocol;
-
- ASSERT ((Sock != NULL) && (Sock->ProtoHandler != NULL));
-
- if (Sock->InDestroy) {
- return EFI_SUCCESS;
- }
-
- Sock->InDestroy = TRUE;
-
- ProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
- Tcb = ProtoData->TcpPcb;
-
- ASSERT (Tcb != NULL);
-
- //
- // Close the IP protocol.
- //
- gBS->CloseProtocol (
- Tcb->IpInfo->ChildHandle,
- &gEfiIp4ProtocolGuid,
- ProtoData->TcpService->IpIo->Image,
- Sock->SockHandle
- );
-
- if (Sock->DestroyCallback != NULL) {
- Sock->DestroyCallback (Sock, Sock->Context);
- }
-
- //
- // Retrieve the protocol installed on this sock
- //
- Status = gBS->OpenProtocol (
- Sock->SockHandle,
- &gEfiTcp4ProtocolGuid,
- &SockProtocol,
- Sock->DriverBinding,
- Sock->SockHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
-
- if (EFI_ERROR (Status)) {
-
- DEBUG ((EFI_D_ERROR, "SockDestroyChild: Open protocol installed "
- "on socket failed with %r\n", Status));
- }
-
- //
- // Uninstall the protocol installed on this sock
- // in the light of Sock->SockType
- //
- gBS->UninstallMultipleProtocolInterfaces (
- Sock->SockHandle,
- &gEfiTcp4ProtocolGuid,
- SockProtocol,
- NULL
- );
-
- Status = EfiAcquireLockOrFail (&(Sock->Lock));
- if (EFI_ERROR (Status)) {
-
- DEBUG ((EFI_D_ERROR, "SockDestroyChild: Get the lock to "
- "access socket failed with %r\n", Status));
-
- return EFI_ACCESS_DENIED;
- }
-
- //
- // force protocol layer to detach the PCB
- //
- Status = Sock->ProtoHandler (Sock, SOCK_DETACH, NULL);
-
- if (EFI_ERROR (Status)) {
-
- DEBUG ((EFI_D_ERROR, "SockDestroyChild: Protocol detach socket"
- " failed with %r\n", Status));
-
- Sock->InDestroy = FALSE;
- } else if (SOCK_IS_CONFIGURED (Sock)) {
-
- SockConnFlush (Sock);
- SockSetState (Sock, SO_CLOSED);
-
- Sock->ConfigureState = SO_UNCONFIGURED;
- }
-
- EfiReleaseLock (&(Sock->Lock));
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- SockDestroy (Sock);
- return EFI_SUCCESS;
-}
-
-
-/**
- Create a socket and its associated protocol control block
- with the intial data SockInitData and protocol specific
- data ProtoData.
-
- @param SockInitData Inital data to setting the socket.
-
- @return Pointer to the newly created socket. If NULL, error condition occured.
-
-**/
-SOCKET *
-SockCreateChild (
- IN SOCK_INIT_DATA *SockInitData
- )
-{
- SOCKET *Sock;
- VOID *SockProtocol;
- EFI_STATUS Status;
-
- //
- // create a new socket
- //
- Sock = SockCreate (SockInitData);
- if (NULL == Sock) {
-
- DEBUG ((EFI_D_ERROR, "SockCreateChild: No resource to "
- "create a new socket\n"));
-
- return NULL;
- }
-
- Status = EfiAcquireLockOrFail (&(Sock->Lock));
- if (EFI_ERROR (Status)) {
-
- DEBUG ((EFI_D_ERROR, "SockCreateChild: Get the lock to "
- "access socket failed with %r\n", Status));
-
- goto ERROR;
- }
- //
- // inform the protocol layer to attach the socket
- // with a new protocol control block
- //
- Status = Sock->ProtoHandler (Sock, SOCK_ATTACH, NULL);
- EfiReleaseLock (&(Sock->Lock));
- if (EFI_ERROR (Status)) {
-
- DEBUG ((EFI_D_ERROR, "SockCreateChild: Protocol failed to"
- " attach a socket with %r\n", Status));
-
- goto ERROR;
- }
-
- return Sock;
-
-ERROR:
-
- if (Sock->DestroyCallback != NULL) {
- Sock->DestroyCallback (Sock, Sock->Context);
- }
-
- gBS->OpenProtocol (
- Sock->SockHandle,
- &gEfiTcp4ProtocolGuid,
- &SockProtocol,
- Sock->DriverBinding,
- Sock->SockHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- //
- // Uninstall the protocol installed on this sock
- //
- gBS->UninstallMultipleProtocolInterfaces (
- Sock->SockHandle,
- &gEfiTcp4ProtocolGuid,
- SockProtocol,
- NULL
- );
- SockDestroy (Sock);
- return NULL;
-}
-
-
-/**
- Configure the specific socket Sock using configuration data ConfigData.
-
- @param Sock Pointer to the socket to be configured.
- @param ConfigData Pointer to the configuration data.
-
- @retval EFI_SUCCESS The socket is configured successfully.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket or the
- socket is already configured.
-
-**/
-EFI_STATUS
-SockConfigure (
- IN SOCKET *Sock,
- IN VOID *ConfigData
- )
-{
- EFI_STATUS Status;
-
- Status = EfiAcquireLockOrFail (&(Sock->Lock));
- if (EFI_ERROR (Status)) {
-
- DEBUG ((EFI_D_ERROR, "SockConfigure: Get the access for "
- "socket failed with %r", Status));
-
- return EFI_ACCESS_DENIED;
- }
-
- if (SOCK_IS_CONFIGURED (Sock)) {
- Status = EFI_ACCESS_DENIED;
- goto OnExit;
- }
-
- ASSERT (Sock->State == SO_CLOSED);
-
- Status = Sock->ProtoHandler (Sock, SOCK_CONFIGURE, ConfigData);
-
-OnExit:
- EfiReleaseLock (&(Sock->Lock));
-
- return Status;
-}
-
-
-/**
- Initiate a connection establishment process.
-
- @param Sock Pointer to the socket to initiate the initate the
- connection.
- @param Token Pointer to the token used for the connection
- operation.
-
- @retval EFI_SUCCESS The connection is initialized successfully.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
- socket is closed, or the socket is not configured to
- be an active one, or the token is already in one of
- this socket's lists.
- @retval EFI_NO_MAPPING The IP address configuration operation is not
- finished.
- @retval EFI_NOT_STARTED The socket is not configured.
-
-**/
-EFI_STATUS
-SockConnect (
- IN SOCKET *Sock,
- IN VOID *Token
- )
-{
- EFI_STATUS Status;
- EFI_EVENT Event;
-
- Status = EfiAcquireLockOrFail (&(Sock->Lock));
- if (EFI_ERROR (Status)) {
-
- DEBUG ((EFI_D_ERROR, "SockConnect: Get the access for "
- "socket failed with %r", Status));
-
- return EFI_ACCESS_DENIED;
- }
-
- if (SOCK_IS_NO_MAPPING (Sock)) {
- Status = EFI_NO_MAPPING;
- goto OnExit;
- }
-
- if (SOCK_IS_UNCONFIGURED (Sock)) {
-
- Status = EFI_NOT_STARTED;
- goto OnExit;
- }
-
- if (!SOCK_IS_CLOSED (Sock) || !SOCK_IS_CONFIGURED_ACTIVE (Sock)) {
-
- Status = EFI_ACCESS_DENIED;
- goto OnExit;
- }
-
- Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event;
-
- if (SockTokenExisted (Sock, Event)) {
-
- Status = EFI_ACCESS_DENIED;
- goto OnExit;
- }
-
- Sock->ConnectionToken = (SOCK_COMPLETION_TOKEN *) Token;
- SockSetState (Sock, SO_CONNECTING);
- Status = Sock->ProtoHandler (Sock, SOCK_CONNECT, NULL);
-
-OnExit:
- EfiReleaseLock (&(Sock->Lock));
- return Status;
-}
-
-
-/**
- Issue a listen token to get an existed connected network instance
- or wait for a connection if there is none.
-
- @param Sock Pointer to the socket to accept connections.
- @param Token The token to accept a connection.
-
- @retval EFI_SUCCESS Either a connection is accpeted or the Token is
- buffered for further acception.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
- socket is closed, or the socket is not configured to
- be a passive one, or the token is already in one of
- this socket's lists.
- @retval EFI_NO_MAPPING The IP address configuration operation is not
- finished.
- @retval EFI_NOT_STARTED The socket is not configured.
- @retval EFI_OUT_OF_RESOURCE Failed to buffer the Token due to memory limit.
-
-**/
-EFI_STATUS
-SockAccept (
- IN SOCKET *Sock,
- IN VOID *Token
- )
-{
- EFI_TCP4_LISTEN_TOKEN *ListenToken;
- LIST_ENTRY *ListEntry;
- EFI_STATUS Status;
- SOCKET *Socket;
- EFI_EVENT Event;
-
- ASSERT (SockStream == Sock->Type);
-
- Status = EfiAcquireLockOrFail (&(Sock->Lock));
- if (EFI_ERROR (Status)) {
-
- DEBUG ((EFI_D_ERROR, "SockAccept: Get the access for socket"
- " failed with %r", Status));
-
- return EFI_ACCESS_DENIED;
- }
-
- if (SOCK_IS_NO_MAPPING (Sock)) {
- Status = EFI_NO_MAPPING;
- goto Exit;
- }
-
- if (SOCK_IS_UNCONFIGURED (Sock)) {
-
- Status = EFI_NOT_STARTED;
- goto Exit;
- }
-
- if (!SOCK_IS_LISTENING (Sock)) {
-
- Status = EFI_ACCESS_DENIED;
- goto Exit;
- }
-
- Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event;
-
- if (SockTokenExisted (Sock, Event)) {
-
- Status = EFI_ACCESS_DENIED;
- goto Exit;
- }
-
- ListenToken = (EFI_TCP4_LISTEN_TOKEN *) Token;
-
- //
- // Check if a connection has already in this Sock->ConnectionList
- //
- NET_LIST_FOR_EACH (ListEntry, &Sock->ConnectionList) {
-
- Socket = NET_LIST_USER_STRUCT (ListEntry, SOCKET, ConnectionList);
-
- if (SOCK_IS_CONNECTED (Socket)) {
- ListenToken->NewChildHandle = Socket->SockHandle;
- SIGNAL_TOKEN (&(ListenToken->CompletionToken), EFI_SUCCESS);
-
- RemoveEntryList (ListEntry);
-
- ASSERT (Socket->Parent != NULL);
-
- Socket->Parent->ConnCnt--;
-
- DEBUG (
- (EFI_D_NET,
- "SockAccept: Accept a socket, now conncount is %d",
- Socket->Parent->ConnCnt)
- );
- Socket->Parent = NULL;
-
- goto Exit;
- }
- }
-
- //
- // Buffer this token for latter incoming connection request
- //
- if (NULL == SockBufferToken (Sock, &(Sock->ListenTokenList), Token, 0)) {
-
- Status = EFI_OUT_OF_RESOURCES;
- }
-
-Exit:
- EfiReleaseLock (&(Sock->Lock));
-
- return Status;
-}
-
-
-/**
- Issue a token with data to the socket to send out.
-
- @param Sock Pointer to the socket to process the token with
- data.
- @param Token The token with data that needs to send out.
-
- @retval EFI_SUCCESS The token is processed successfully.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
- socket is closed, or the socket is not in a
- synchronized state , or the token is already in one
- of this socket's lists.
- @retval EFI_NO_MAPPING The IP address configuration operation is not
- finished.
- @retval EFI_NOT_STARTED The socket is not configured.
- @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to memory limit.
-
-**/
-EFI_STATUS
-SockSend (
- IN SOCKET *Sock,
- IN VOID *Token
- )
-{
- SOCK_IO_TOKEN *SndToken;
- EFI_EVENT Event;
- UINT32 FreeSpace;
- EFI_TCP4_TRANSMIT_DATA *TxData;
- EFI_STATUS Status;
- SOCK_TOKEN *SockToken;
- UINT32 DataLen;
-
- ASSERT (SockStream == Sock->Type);
-
- Status = EfiAcquireLockOrFail (&(Sock->Lock));
- if (EFI_ERROR (Status)) {
-
- DEBUG ((EFI_D_ERROR, "SockSend: Get the access for socket"
- " failed with %r", Status));
-
- return EFI_ACCESS_DENIED;
- }
-
- if (SOCK_IS_NO_MAPPING (Sock)) {
- Status = EFI_NO_MAPPING;
- goto Exit;
- }
-
- SndToken = (SOCK_IO_TOKEN *) Token;
- TxData = (EFI_TCP4_TRANSMIT_DATA *) SndToken->Packet.TxData;
-
- if (SOCK_IS_UNCONFIGURED (Sock)) {
- Status = EFI_NOT_STARTED;
- goto Exit;
- }
-
- if (!(SOCK_IS_CONNECTING (Sock) || SOCK_IS_CONNECTED (Sock))) {
-
- Status = EFI_ACCESS_DENIED;
- goto Exit;
- }
-
- //
- // check if a token is already in the token buffer
- //
- Event = SndToken->Token.Event;
-
- if (SockTokenExisted (Sock, Event)) {
- Status = EFI_ACCESS_DENIED;
- goto Exit;
- }
-
- DataLen = (UINT32) TxData->DataLength;
-
- //
- // process this sending token now or buffer it only?
- //
- FreeSpace = SockGetFreeSpace (Sock, SOCK_SND_BUF);
-
- if ((FreeSpace < Sock->SndBuffer.LowWater) || !SOCK_IS_CONNECTED (Sock)) {
-
- SockToken = SockBufferToken (
- Sock,
- &Sock->SndTokenList,
- SndToken,
- DataLen
- );
-
- if (NULL == SockToken) {
- Status = EFI_OUT_OF_RESOURCES;
- }
- } else {
-
- SockToken = SockBufferToken (
- Sock,
- &Sock->ProcessingSndTokenList,
- SndToken,
- DataLen
- );
-
- if (NULL == SockToken) {
- DEBUG ((EFI_D_ERROR, "SockSend: Failed to buffer IO token into"
- " socket processing SndToken List\n", Status));
-
- Status = EFI_OUT_OF_RESOURCES;
- goto Exit;
- }
-
- Status = SockProcessTcpSndData (Sock, TxData);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "SockSend: Failed to process "
- "Snd Data\n", Status));
-
- RemoveEntryList (&(SockToken->TokenList));
- FreePool (SockToken);
- }
- }
-
-Exit:
- EfiReleaseLock (&(Sock->Lock));
- return Status;
-}
-
-
-/**
- Issue a token to get data from the socket.
-
- @param Sock Pointer to the socket to get data from.
- @param Token The token to store the received data from the
- socket.
-
- @retval EFI_SUCCESS The token is processed successfully.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
- socket is closed, or the socket is not in a
- synchronized state , or the token is already in one
- of this socket's lists.
- @retval EFI_NO_MAPPING The IP address configuration operation is not
- finished.
- @retval EFI_NOT_STARTED The socket is not configured.
- @retval EFI_CONNECTION_FIN The connection is closed and there is no more data.
- @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to memory limit.
-
-**/
-EFI_STATUS
-SockRcv (
- IN SOCKET *Sock,
- IN VOID *Token
- )
-{
- SOCK_IO_TOKEN *RcvToken;
- UINT32 RcvdBytes;
- EFI_STATUS Status;
- EFI_EVENT Event;
-
- ASSERT (SockStream == Sock->Type);
-
- Status = EfiAcquireLockOrFail (&(Sock->Lock));
- if (EFI_ERROR (Status)) {
-
- DEBUG ((EFI_D_ERROR, "SockRcv: Get the access for socket"
- " failed with %r", Status));
-
- return EFI_ACCESS_DENIED;
- }
-
- if (SOCK_IS_NO_MAPPING (Sock)) {
-
- Status = EFI_NO_MAPPING;
- goto Exit;
- }
-
- if (SOCK_IS_UNCONFIGURED (Sock)) {
-
- Status = EFI_NOT_STARTED;
- goto Exit;
- }
-
- if (!(SOCK_IS_CONNECTED (Sock) || SOCK_IS_CONNECTING (Sock))) {
-
- Status = EFI_ACCESS_DENIED;
- goto Exit;
- }
-
- RcvToken = (SOCK_IO_TOKEN *) Token;
-
- //
- // check if a token is already in the token buffer of this socket
- //
- Event = RcvToken->Token.Event;
- if (SockTokenExisted (Sock, Event)) {
- Status = EFI_ACCESS_DENIED;
- goto Exit;
- }
-
- RcvToken = (SOCK_IO_TOKEN *) Token;
- RcvdBytes = GET_RCV_DATASIZE (Sock);
-
- //
- // check whether an error has happened before
- //
- if (EFI_ABORTED != Sock->SockError) {
-
- SIGNAL_TOKEN (&(RcvToken->Token), Sock->SockError);
- Sock->SockError = EFI_ABORTED;
- goto Exit;
- }
-
- //
- // check whether can not receive and there is no any
- // data buffered in Sock->RcvBuffer
- //
- if (SOCK_IS_NO_MORE_DATA (Sock) && (0 == RcvdBytes)) {
-
- Status = EFI_CONNECTION_FIN;
- goto Exit;
- }
-
- if (RcvdBytes != 0) {
- SockProcessRcvToken (Sock, RcvToken);
-
- Status = Sock->ProtoHandler (Sock, SOCK_CONSUMED, NULL);
- } else {
-
- if (NULL == SockBufferToken (Sock, &Sock->RcvTokenList, RcvToken, 0)) {
- Status = EFI_OUT_OF_RESOURCES;
- }
- }
-
-Exit:
- EfiReleaseLock (&(Sock->Lock));
- return Status;
-}
-
-
-/**
- Reset the socket and its associated protocol control block.
-
- @param Sock Pointer to the socket to be flushed.
-
- @retval EFI_SUCCESS The socket is flushed successfully.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket.
-
-**/
-EFI_STATUS
-SockFlush (
- IN SOCKET *Sock
- )
-{
- EFI_STATUS Status;
-
- ASSERT (SockStream == Sock->Type);
-
- Status = EfiAcquireLockOrFail (&(Sock->Lock));
- if (EFI_ERROR (Status)) {
-
- DEBUG ((EFI_D_ERROR, "SockFlush: Get the access for socket"
- " failed with %r", Status));
-
- return EFI_ACCESS_DENIED;
- }
-
- if (!SOCK_IS_CONFIGURED (Sock)) {
- goto Exit;
- }
-
- Status = Sock->ProtoHandler (Sock, SOCK_FLUSH, NULL);
- if (EFI_ERROR (Status)) {
-
- DEBUG ((EFI_D_ERROR, "SockFlush: Protocol failed handling"
- " SOCK_FLUSH with %r", Status));
-
- goto Exit;
- }
-
- SOCK_ERROR (Sock, EFI_ABORTED);
- SockConnFlush (Sock);
- SockSetState (Sock, SO_CLOSED);
-
- Sock->ConfigureState = SO_UNCONFIGURED;
-
-Exit:
- EfiReleaseLock (&(Sock->Lock));
- return Status;
-}
-
-
-/**
- Close or abort the socket associated connection.
-
- @param Sock Pointer to the socket of the connection to close or
- abort.
- @param Token The token for close operation.
- @param OnAbort TRUE for aborting the connection, FALSE to close it.
-
- @retval EFI_SUCCESS The close or abort operation is initialized
- successfully.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
- socket is closed, or the socket is not in a
- synchronized state , or the token is already in one
- of this socket's lists.
- @retval EFI_NO_MAPPING The IP address configuration operation is not
- finished.
- @retval EFI_NOT_STARTED The socket is not configured.
-
-**/
-EFI_STATUS
-SockClose (
- IN SOCKET *Sock,
- IN VOID *Token,
- IN BOOLEAN OnAbort
- )
-{
- EFI_STATUS Status;
- EFI_EVENT Event;
-
- ASSERT (SockStream == Sock->Type);
-
- Status = EfiAcquireLockOrFail (&(Sock->Lock));
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "SockClose: Get the access for socket"
- " failed with %r", Status));
-
- return EFI_ACCESS_DENIED;
- }
-
- if (SOCK_IS_NO_MAPPING (Sock)) {
- Status = EFI_NO_MAPPING;
- goto Exit;
- }
-
- if (SOCK_IS_UNCONFIGURED (Sock)) {
- Status = EFI_NOT_STARTED;
- goto Exit;
- }
-
- if (SOCK_IS_DISCONNECTING (Sock)) {
- Status = EFI_ACCESS_DENIED;
- goto Exit;
- }
-
- Event = ((SOCK_COMPLETION_TOKEN *) Token)->Event;
-
- if (SockTokenExisted (Sock, Event)) {
- Status = EFI_ACCESS_DENIED;
- goto Exit;
- }
-
- Sock->CloseToken = Token;
- SockSetState (Sock, SO_DISCONNECTING);
-
- if (OnAbort) {
- Status = Sock->ProtoHandler (Sock, SOCK_ABORT, NULL);
- } else {
- Status = Sock->ProtoHandler (Sock, SOCK_CLOSE, NULL);
- }
-
-Exit:
- EfiReleaseLock (&(Sock->Lock));
- return Status;
-}
-
-
-/**
- Get the mode data of the low layer protocol.
-
- @param Sock Pointer to the socket to get mode data from.
- @param Mode Pointer to the data to store the low layer mode
- information.
-
- @retval EFI_SUCCESS The mode data is got successfully.
- @retval EFI_NOT_STARTED The socket is not configured.
-
-**/
-EFI_STATUS
-SockGetMode (
- IN SOCKET *Sock,
- IN OUT VOID *Mode
- )
-{
- return Sock->ProtoHandler (Sock, SOCK_MODE, Mode);
-}
-
-
-
-
-
-/**
- Add or remove route information in IP route table associated
- with this socket.
-
- @param Sock Pointer to the socket associated with the IP route
- table to operate on.
- @param RouteInfo Pointer to the route information to be processed.
-
- @retval EFI_SUCCESS The route table is updated successfully.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket.
- @retval EFI_NO_MAPPING The IP address configuration operation is not
- finished.
- @retval EFI_NOT_STARTED The socket is not configured.
-
-**/
-EFI_STATUS
-SockRoute (
- IN SOCKET *Sock,
- IN VOID *RouteInfo
- )
-{
- EFI_STATUS Status;
-
- Status = EfiAcquireLockOrFail (&(Sock->Lock));
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "SockRoute: Get the access for socket"
- " failed with %r", Status));
-
- return EFI_ACCESS_DENIED;
- }
-
- if (SOCK_IS_NO_MAPPING (Sock)) {
- Status = EFI_NO_MAPPING;
- goto Exit;
- }
-
- if (SOCK_IS_UNCONFIGURED (Sock)) {
- Status = EFI_NOT_STARTED;
- goto Exit;
- }
-
- Status = Sock->ProtoHandler (Sock, SOCK_ROUTE, RouteInfo);
-
-Exit:
- EfiReleaseLock (&(Sock->Lock));
- return Status;
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h
deleted file mode 100644
index 650a7dd865..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h
+++ /dev/null
@@ -1,954 +0,0 @@
-/** @file
- Socket header file.
-
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _SOCKET_H_
-#define _SOCKET_H_
-
-#include <Uefi.h>
-
-#include <Protocol/Ip4.h>
-#include <Protocol/Tcp4.h>
-#include <Protocol/Udp4.h>
-
-#include <Library/NetLib.h>
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiLib.h>
-#include <Library/DpcLib.h>
-#include <Library/PrintLib.h>
-
-#define SOCK_SND_BUF 0
-#define SOCK_RCV_BUF 1
-
-#define SOCK_BUFF_LOW_WATER (2 * 1024)
-#define SOCK_RCV_BUFF_SIZE (8 * 1024)
-#define SOCK_SND_BUFF_SIZE (8 * 1024)
-#define SOCK_BACKLOG 5
-
-#define PROTO_RESERVED_LEN 20
-
-#define SO_NO_MORE_DATA 0x0001
-
-//
-//
-//
-// When a socket is created it enters into SO_UNCONFIGURED,
-// no actions can be taken on this socket, only after calling
-// SockConfigure. The state transition diagram of socket is
-// as following:
-//
-// SO_UNCONFIGURED --- SO_CONFIGURED --- SO_CONNECTING
-// ^ | |
-// | ---> SO_LISTENING |
-// | |
-// |------------------SO_DISCONNECTING<-- SO_CONNECTED
-//
-// A passive socket can only go into SO_LISTENING and
-// SO_UNCONFIGURED state. SO_XXXING state is a middle state
-// when a socket is undergoing a protocol procedure such
-// as requesting a TCP connection.
-//
-//
-//
-
-///
-/// Socket state
-///
-#define SO_CLOSED 0
-#define SO_LISTENING 1
-#define SO_CONNECTING 2
-#define SO_CONNECTED 3
-#define SO_DISCONNECTING 4
-
-///
-/// Socket configure state
-///
-#define SO_UNCONFIGURED 0
-#define SO_CONFIGURED_ACTIVE 1
-#define SO_CONFIGURED_PASSIVE 2
-#define SO_NO_MAPPING 3
-
-/**
- Set socket SO_NO_MORE_DATA flag.
-
- @param Sock Pointer to the socket
-
-**/
-#define SOCK_NO_MORE_DATA(Sock) ((Sock)->Flag |= SO_NO_MORE_DATA)
-
-/**
- Check whether the socket is unconfigured.
-
- @param Sock Pointer to the socket
-
- @retval True The socket is unconfigued
- @retval False The socket is not unconfigued
-
-**/
-#define SOCK_IS_UNCONFIGURED(Sock) ((Sock)->ConfigureState == SO_UNCONFIGURED)
-
-/**
- Check whether the socket is configured.
-
- @param Sock Pointer to the socket
-
- @retval True The socket is configued
- @retval False The socket is not configued
-
-**/
-#define SOCK_IS_CONFIGURED(Sock) \
- (((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) || \
- ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE))
-
-/**
- Check whether the socket is configured to active mode.
-
- @param Sock Pointer to the socket
-
- @retval True The socket is configued to active mode
- @retval False The socket is not configued to active mode
-
-**/
-#define SOCK_IS_CONFIGURED_ACTIVE(Sock) \
- ((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE)
-
-/**
- Check whether the socket is configured to passive mode.
-
- @param Sock Pointer to the socket
-
- @retval True The socket is configued to passive mode
- @retval False The socket is not configued to passive mode
-
-**/
-#define SOCK_IS_CONNECTED_PASSIVE(Sock) \
- ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE)
-
-/**
- Check whether the socket is mapped.
-
- @param Sock Pointer to the socket
-
- @retval True The socket is no mapping
- @retval False The socket is mapped
-
-**/
-#define SOCK_IS_NO_MAPPING(Sock) \
- ((Sock)->ConfigureState == SO_NO_MAPPING)
-
-/**
- Check whether the socket is closed.
-
- @param Sock Pointer to the socket
-
- @retval True The socket is closed
- @retval False The socket is not closed
-
-**/
-#define SOCK_IS_CLOSED(Sock) ((Sock)->State == SO_CLOSED)
-
-/**
- Check whether the socket is listening.
-
- @param Sock Pointer to the socket
-
- @retval True The socket is listening
- @retval False The socket is not listening
-
-**/
-#define SOCK_IS_LISTENING(Sock) ((Sock)->State == SO_LISTENING)
-
-/**
- Check whether the socket is connecting.
-
- @param Sock Pointer to the socket
-
- @retval True The socket is connecting
- @retval False The socket is not connecting
-
-**/
-#define SOCK_IS_CONNECTING(Sock) ((Sock)->State == SO_CONNECTING)
-
-/**
- Check whether the socket has connected.
-
- @param Sock Pointer to the socket
-
- @retval True The socket has connected
- @retval False The socket has not connected
-
-**/
-#define SOCK_IS_CONNECTED(Sock) ((Sock)->State == SO_CONNECTED)
-
-/**
- Check whether the socket is disconnecting.
-
- @param Sock Pointer to the socket
-
- @retval True The socket is disconnecting
- @retval False The socket is not disconnecting
-
-**/
-#define SOCK_IS_DISCONNECTING(Sock) ((Sock)->State == SO_DISCONNECTING)
-
-/**
- Check whether the socket is no more data.
-
- @param Sock Pointer to the socket
-
- @retval True The socket is no more data
- @retval False The socket still has data
-
-**/
-#define SOCK_IS_NO_MORE_DATA(Sock) (0 != ((Sock)->Flag & SO_NO_MORE_DATA))
-
-/**
- Set the size of the receive buffer.
-
- @param Sock Pointer to the socket
- @param Size The size to set
-
-**/
-#define SET_RCV_BUFFSIZE(Sock, Size) ((Sock)->RcvBuffer.HighWater = (Size))
-
-/**
- Get the size of the receive buffer.
-
- @param Sock Pointer to the socket
-
- @return The receive buffer size
-
-**/
-#define GET_RCV_BUFFSIZE(Sock) ((Sock)->RcvBuffer.HighWater)
-
-/**
- Get the size of the receive data.
-
- @param Sock Pointer to the socket
-
- @return The received data size
-
-**/
-#define GET_RCV_DATASIZE(Sock) (((Sock)->RcvBuffer.DataQueue)->BufSize)
-
-/**
- Set the size of the send buffer.
-
- @param Sock Pointer to the socket
- @param Size The size to set
-
-**/
-#define SET_SND_BUFFSIZE(Sock, Size) ((Sock)->SndBuffer.HighWater = (Size))
-
-/**
- Get the size of the send buffer.
-
- @param Sock Pointer to the socket
-
- @return The send buffer size
-
-**/
-#define GET_SND_BUFFSIZE(Sock) ((Sock)->SndBuffer.HighWater)
-
-/**
- Get the size of the send data.
-
- @param Sock Pointer to the socket
-
- @return The send data size
-
-**/
-#define GET_SND_DATASIZE(Sock) (((Sock)->SndBuffer.DataQueue)->BufSize)
-
-/**
- Set the backlog value of the socket.
-
- @param Sock Pointer to the socket
- @param Value The value to set
-
-**/
-#define SET_BACKLOG(Sock, Value) ((Sock)->BackLog = (Value))
-
-/**
- Get the backlog value of the socket.
-
- @param Sock Pointer to the socket
-
- @return The backlog value
-
-**/
-#define GET_BACKLOG(Sock) ((Sock)->BackLog)
-
-/**
- Set the socket with error state.
-
- @param Sock Pointer to the socket
- @param Error The error state
-
-**/
-#define SOCK_ERROR(Sock, Error) ((Sock)->SockError = (Error))
-
-#define SND_BUF_HDR_LEN(Sock) \
- ((SockBufFirst (&((Sock)->SndBuffer)))->TotalSize)
-
-#define RCV_BUF_HDR_LEN(Sock) \
- ((SockBufFirst (&((Sock)->RcvBuffer)))->TotalSize)
-
-#define SOCK_SIGNATURE SIGNATURE_32 ('S', 'O', 'C', 'K')
-
-#define SOCK_FROM_THIS(a) CR ((a), SOCKET, NetProtocol, SOCK_SIGNATURE)
-
-#define SOCK_FROM_TOKEN(Token) (((SOCK_TOKEN *) (Token))->Sock)
-
-#define PROTO_TOKEN_FORM_SOCK(SockToken, Type) \
- ((Type *) (((SOCK_TOKEN *) (SockToken))->Token))
-
-typedef struct _SOCKET SOCKET;
-
-///
-/// Socket completion token
-///
-typedef struct _SOCK_COMPLETION_TOKEN {
- EFI_EVENT Event; ///< The event to be issued
- EFI_STATUS Status; ///< The status to be issued
-} SOCK_COMPLETION_TOKEN;
-
-typedef union {
- VOID *RxData;
- VOID *TxData;
-} SOCK_IO_DATA;
-
-///
-/// The application token with data packet
-///
-typedef struct _SOCK_IO_TOKEN {
- SOCK_COMPLETION_TOKEN Token;
- SOCK_IO_DATA Packet;
-} SOCK_IO_TOKEN;
-
-///
-/// The request issued from socket layer to protocol layer.
-///
-#define SOCK_ATTACH 0 ///< Attach current socket to a new PCB
-#define SOCK_DETACH 1 ///< Detach current socket from the PCB
-#define SOCK_CONFIGURE 2 ///< Configure attached PCB
-#define SOCK_FLUSH 3 ///< Flush attached PCB
-#define SOCK_SND 4 ///< Need protocol to send something
-#define SOCK_SNDPUSH 5 ///< Need protocol to send pushed data
-#define SOCK_SNDURG 6 ///< Need protocol to send urgent data
-#define SOCK_CONSUMED 7 ///< Application has retrieved data from socket
-#define SOCK_CONNECT 8 ///< Need to connect to a peer
-#define SOCK_CLOSE 9 ///< Need to close the protocol process
-#define SOCK_ABORT 10 ///< Need to reset the protocol process
-#define SOCK_POLL 11 ///< Need to poll to the protocol layer
-#define SOCK_ROUTE 12 ///< Need to add a route information
-#define SOCK_MODE 13 ///< Need to get the mode data of the protocol
-#define SOCK_GROUP 14 ///< Need to join a mcast group
-
-///
-/// The socket type.
-///
-typedef enum {
- SockDgram, ///< This socket providing datagram service
- SockStream ///< This socket providing stream service
-} SOCK_TYPE;
-
-///
-/// The buffer structure of rcvd data and send data used by socket.
-///
-typedef struct _SOCK_BUFFER {
- UINT32 HighWater; ///< The buffersize upper limit of sock_buffer
- UINT32 LowWater; ///< The low water mark of sock_buffer
- NET_BUF_QUEUE *DataQueue; ///< The queue to buffer data
-} SOCK_BUFFER;
-
-/**
- The handler of protocol for request from socket.
-
- @param Socket The socket issuing the request to protocol
- @param Request The request issued by socket
- @param RequestData The request related data
-
- @retval EFI_SUCCESS The socket request is completed successfully.
- @retval other The error status returned by the corresponding TCP
- layer function.
-
-**/
-typedef
-EFI_STATUS
-(*SOCK_PROTO_HANDLER) (
- IN SOCKET *Socket,
- IN UINT8 Request,
- IN VOID *RequestData
- );
-
-
-//
-// Socket provided oprerations for low layer protocol
-//
-
-//
-// Socket provided operations for user interface
-//
-
-/**
- Set the state of the socket.
-
- @param Sock Pointer to the socket.
- @param State The new socket state to be set.
-
-**/
-VOID
-SockSetState (
- IN OUT SOCKET *Sock,
- IN UINT8 State
- );
-
-/**
- Called by the low layer protocol to indicate the socket a connection is
- established.
-
- This function just changes the socket's state to SO_CONNECTED
- and signals the token used for connection establishment.
-
- @param Sock Pointer to the socket associated with the
- established connection.
-
-**/
-VOID
-SockConnEstablished (
- IN SOCKET *Sock
- );
-
-/**
- Called by the low layer protocol to indicate the connection is closed.
-
- This function flushes the socket, sets the state to SO_CLOSED and signals
- the close token.
-
- @param Sock Pointer to the socket associated with the closed
- connection.
-
-**/
-VOID
-SockConnClosed (
- IN OUT SOCKET *Sock
- );
-
-/**
- Called by low layer protocol to indicate that some data is sent or processed.
-
- This function trims the sent data in the socket send buffer, signals the data
- token if proper.
-
- @param Sock Pointer to the socket.
- @param Count The length of the data processed or sent, in bytes.
-
-**/
-VOID
-SockDataSent (
- IN SOCKET *Sock,
- IN UINT32 Count
- );
-
-/**
- Called by the low layer protocol to copy some data in socket send
- buffer starting from the specific offset to a buffer provided by
- the caller.
-
- @param Sock Pointer to the socket.
- @param Offset The start point of the data to be copied.
- @param Len The length of the data to be copied.
- @param Dest Pointer to the destination to copy the data.
-
- @return The data size copied.
-
-**/
-UINT32
-SockGetDataToSend (
- IN SOCKET *Sock,
- IN UINT32 Offset,
- IN UINT32 Len,
- IN UINT8 *Dest
- );
-
-/**
- Called by the low layer protocol to indicate that there
- will be no more data from the communication peer.
-
- This function set the socket's state to SO_NO_MORE_DATA and
- signal all queued IO tokens with the error status EFI_CONNECTION_FIN.
-
- @param Sock Pointer to the socket.
-
-**/
-VOID
-SockNoMoreData (
- IN OUT SOCKET *Sock
- );
-
-/**
- Called by the low layer protocol to deliver received data to socket layer.
-
- This function will append the data to the socket receive buffer, set ther
- urgent data length and then check if any receive token can be signaled.
-
- @param Sock Pointer to the socket.
- @param NetBuffer Pointer to the buffer that contains the received
- data.
- @param UrgLen The length of the urgent data in the received data.
-
-**/
-VOID
-SockDataRcvd (
- IN SOCKET *Sock,
- IN OUT NET_BUF *NetBuffer,
- IN UINT32 UrgLen
- );
-
-/**
- Get the length of the free space of the specific socket buffer.
-
- @param Sock Pointer to the socket.
- @param Which Flag to indicate which socket buffer to check,
- either send buffer or receive buffer.
-
- @return The length of the free space, in bytes.
-
-**/
-UINT32
-SockGetFreeSpace (
- IN SOCKET *Sock,
- IN UINT32 Which
- );
-
-/**
- Clone a new socket including its associated protocol control block.
-
- @param Sock Pointer to the socket to be cloned.
-
- @return Pointer to the newly cloned socket. If NULL, error condition occurred.
-
-**/
-SOCKET *
-SockClone (
- IN SOCKET *Sock
- );
-
-
-///
-/// Proto type of the create callback
-///
-typedef
-EFI_STATUS
-(*SOCK_CREATE_CALLBACK) (
- IN SOCKET *This,
- IN VOID *Context
- );
-
-///
-/// Proto type of the destroy callback
-///
-typedef
-VOID
-(*SOCK_DESTROY_CALLBACK) (
- IN SOCKET *This,
- IN VOID *Context
- );
-
-///
-/// The initialize data for create a new socket.
-///
-typedef struct _SOCK_INIT_DATA {
- SOCK_TYPE Type;
- UINT8 State;
-
- SOCKET *Parent; ///< The parent of this socket
- UINT32 BackLog; ///< The connection limit for listening socket
- UINT32 SndBufferSize; ///< The high water mark of send buffer
- UINT32 RcvBufferSize; ///< The high water mark of receive buffer
- VOID *Protocol; ///< The pointer to protocol function template
- ///< wanted to install on socket
-
- //
- // Callbacks after socket is created and before socket is to be destroyed.
- //
- SOCK_CREATE_CALLBACK CreateCallback; ///< Callback after created
- SOCK_DESTROY_CALLBACK DestroyCallback; ///< Callback before destroied
- VOID *Context; ///< The context of the callback
-
- //
- // Opaque protocol data.
- //
- VOID *ProtoData;
- UINT32 DataSize;
-
- SOCK_PROTO_HANDLER ProtoHandler; ///< The handler of protocol for socket request
-
- EFI_HANDLE DriverBinding; ///< The driver binding handle
-} SOCK_INIT_DATA;
-
-///
-/// The union type of TCP and UDP protocol.
-///
-typedef union _NET_PROTOCOL {
- EFI_TCP4_PROTOCOL TcpProtocol; ///< Tcp protocol
- EFI_UDP4_PROTOCOL UdpProtocol; ///< Udp protocol
-} NET_PROTOCOL;
-
-///
-/// The socket structure representing a network service access point
-///
-struct _SOCKET {
-
- //
- // Socket description information
- //
- UINT32 Signature; ///< Signature of the socket
- EFI_HANDLE SockHandle; ///< The virtual handle of the socket
- EFI_HANDLE DriverBinding; ///< Socket's driver binding protocol
- EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
- LIST_ENTRY Link;
- UINT8 ConfigureState;
- SOCK_TYPE Type;
- UINT8 State;
- UINT16 Flag;
- EFI_LOCK Lock; ///< The lock of socket
- SOCK_BUFFER SndBuffer; ///< Send buffer of application's data
- SOCK_BUFFER RcvBuffer; ///< Receive buffer of received data
- EFI_STATUS SockError; ///< The error returned by low layer protocol
- BOOLEAN InDestroy;
-
- //
- // Fields used to manage the connection request
- //
- UINT32 BackLog; ///< the limit of connection to this socket
- UINT32 ConnCnt; ///< the current count of connections to it
- SOCKET *Parent; ///< listening parent that accept the connection
- LIST_ENTRY ConnectionList; ///< the connections maintained by this socket
-
- //
- // The queue to buffer application's asynchronous token
- //
- LIST_ENTRY ListenTokenList;
- LIST_ENTRY RcvTokenList;
- LIST_ENTRY SndTokenList;
- LIST_ENTRY ProcessingSndTokenList;
-
- SOCK_COMPLETION_TOKEN *ConnectionToken; ///< app's token to signal if connected
- SOCK_COMPLETION_TOKEN *CloseToken; ///< app's token to signal if closed
-
- //
- // Interface for low level protocol
- //
- SOCK_PROTO_HANDLER ProtoHandler; ///< The request handler of protocol
- UINT8 ProtoReserved[PROTO_RESERVED_LEN]; ///< Data fields reserved for protocol
- NET_PROTOCOL NetProtocol; ///< TCP or UDP protocol socket used
-
- //
- // Callbacks after socket is created and before socket is to be destroyed.
- //
- SOCK_CREATE_CALLBACK CreateCallback; ///< Callback after created
- SOCK_DESTROY_CALLBACK DestroyCallback; ///< Callback before destroied
- VOID *Context; ///< The context of the callback
-};
-
-///
-/// The token structure buffered in socket layer.
-///
-typedef struct _SOCK_TOKEN {
- LIST_ENTRY TokenList; ///< The entry to add in the token list
- SOCK_COMPLETION_TOKEN *Token; ///< The application's token
- UINT32 RemainDataLen; ///< Unprocessed data length
- SOCKET *Sock; ///< The poninter to the socket this token
- ///< belongs to
-} SOCK_TOKEN;
-
-///
-/// Reserved data to access the NET_BUF delivered by UDP driver.
-///
-typedef struct _UDP_RSV_DATA {
- EFI_TIME TimeStamp;
- EFI_UDP4_SESSION_DATA Session;
-} UDP_RSV_DATA;
-
-///
-/// Reserved data to access the NET_BUF delivered by TCP driver.
-///
-typedef struct _TCP_RSV_DATA {
- UINT32 UrgLen;
-} TCP_RSV_DATA;
-
-/**
- Create a socket and its associated protocol control block
- with the intial data SockInitData and protocol specific
- data ProtoData.
-
- @param SockInitData Inital data to setting the socket.
-
- @return Pointer to the newly created socket. If NULL, error condition occured.
-
-**/
-SOCKET *
-SockCreateChild (
- IN SOCK_INIT_DATA *SockInitData
- );
-
-/**
- Destroy the socket Sock and its associated protocol control block.
-
- @param Sock The socket to be destroyed.
-
- @retval EFI_SUCCESS The socket Sock is destroyed successfully.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket.
-
-**/
-EFI_STATUS
-SockDestroyChild (
- IN SOCKET *Sock
- );
-
-/**
- Configure the specific socket Sock using configuration data ConfigData.
-
- @param Sock Pointer to the socket to be configured.
- @param ConfigData Pointer to the configuration data.
-
- @retval EFI_SUCCESS The socket is configured successfully.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket or the
- socket is already configured.
-
-**/
-EFI_STATUS
-SockConfigure (
- IN SOCKET *Sock,
- IN VOID *ConfigData
- );
-
-/**
- Initiate a connection establishment process.
-
- @param Sock Pointer to the socket to initiate the initate the
- connection.
- @param Token Pointer to the token used for the connection
- operation.
-
- @retval EFI_SUCCESS The connection is initialized successfully.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
- socket is closed, or the socket is not configured to
- be an active one, or the token is already in one of
- this socket's lists.
- @retval EFI_NO_MAPPING The IP address configuration operation is not
- finished.
- @retval EFI_NOT_STARTED The socket is not configured.
-
-**/
-EFI_STATUS
-SockConnect (
- IN SOCKET *Sock,
- IN VOID *Token
- );
-
-/**
- Issue a listen token to get an existed connected network instance
- or wait for a connection if there is none.
-
- @param Sock Pointer to the socket to accept connections.
- @param Token The token to accept a connection.
-
- @retval EFI_SUCCESS Either a connection is accpeted or the Token is
- buffered for further acception.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
- socket is closed, or the socket is not configured to
- be a passive one, or the token is already in one of
- this socket's lists.
- @retval EFI_NO_MAPPING The IP address configuration operation is not
- finished.
- @retval EFI_NOT_STARTED The socket is not configured.
- @retval EFI_OUT_OF_RESOURCE Failed to buffer the Token due to memory limit.
-
-**/
-EFI_STATUS
-SockAccept (
- IN SOCKET *Sock,
- IN VOID *Token
- );
-
-/**
- Issue a token with data to the socket to send out.
-
- @param Sock Pointer to the socket to process the token with
- data.
- @param Token The token with data that needs to send out.
-
- @retval EFI_SUCCESS The token is processed successfully.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
- socket is closed, or the socket is not in a
- synchronized state , or the token is already in one
- of this socket's lists.
- @retval EFI_NO_MAPPING The IP address configuration operation is not
- finished.
- @retval EFI_NOT_STARTED The socket is not configured.
- @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to memory limit.
-
-**/
-EFI_STATUS
-SockSend (
- IN SOCKET *Sock,
- IN VOID *Token
- );
-
-/**
- Issue a token to get data from the socket.
-
- @param Sock Pointer to the socket to get data from.
- @param Token The token to store the received data from the
- socket.
-
- @retval EFI_SUCCESS The token is processed successfully.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
- socket is closed, or the socket is not in a
- synchronized state , or the token is already in one
- of this socket's lists.
- @retval EFI_NO_MAPPING The IP address configuration operation is not
- finished.
- @retval EFI_NOT_STARTED The socket is not configured.
- @retval EFI_CONNECTION_FIN The connection is closed and there is no more data.
- @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to memory limit.
-
-**/
-EFI_STATUS
-SockRcv (
- IN SOCKET *Sock,
- IN VOID *Token
- );
-
-/**
- Reset the socket and its associated protocol control block.
-
- @param Sock Pointer to the socket to be flushed.
-
- @retval EFI_SUCCESS The socket is flushed successfully.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket.
-
-**/
-EFI_STATUS
-SockFlush (
- IN SOCKET *Sock
- );
-
-/**
- Close or abort the socket associated connection.
-
- @param Sock Pointer to the socket of the connection to close or
- abort.
- @param Token The token for close operation.
- @param OnAbort TRUE for aborting the connection, FALSE to close it.
-
- @retval EFI_SUCCESS The close or abort operation is initialized
- successfully.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
- socket is closed, or the socket is not in a
- synchronized state , or the token is already in one
- of this socket's lists.
- @retval EFI_NO_MAPPING The IP address configuration operation is not
- finished.
- @retval EFI_NOT_STARTED The socket is not configured.
-
-**/
-EFI_STATUS
-SockClose (
- IN SOCKET *Sock,
- IN VOID *Token,
- IN BOOLEAN OnAbort
- );
-
-/**
- Get the mode data of the low layer protocol.
-
- @param Sock Pointer to the socket to get mode data from.
- @param Mode Pointer to the data to store the low layer mode
- information.
-
- @retval EFI_SUCCESS The mode data is got successfully.
- @retval EFI_NOT_STARTED The socket is not configured.
-
-**/
-EFI_STATUS
-SockGetMode (
- IN SOCKET *Sock,
- IN OUT VOID *Mode
- );
-
-/**
- Add or remove route information in IP route table associated
- with this socket.
-
- @param Sock Pointer to the socket associated with the IP route
- table to operate on.
- @param RouteInfo Pointer to the route information to be processed.
-
- @retval EFI_SUCCESS The route table is updated successfully.
- @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket.
- @retval EFI_NO_MAPPING The IP address configuration operation is not
- finished.
- @retval EFI_NOT_STARTED The socket is not configured.
-
-**/
-EFI_STATUS
-SockRoute (
- IN SOCKET *Sock,
- IN VOID *RouteInfo
- );
-
-//
-// Supporting function to operate on socket buffer
-//
-
-/**
- Get the first buffer block in the specific socket buffer.
-
- @param Sockbuf Pointer to the socket buffer.
-
- @return Pointer to the first buffer in the queue. NULL if the queue is empty.
-
-**/
-NET_BUF *
-SockBufFirst (
- IN SOCK_BUFFER *Sockbuf
- );
-
-/**
- Get the next buffer block in the specific socket buffer.
-
- @param Sockbuf Pointer to the socket buffer.
- @param SockEntry Pointer to the buffer block prior to the required
- one.
-
- @return Pointer to the buffer block next to SockEntry. NULL if SockEntry is
- the tail or head entry.
-
-**/
-NET_BUF *
-SockBufNext (
- IN SOCK_BUFFER *Sockbuf,
- IN NET_BUF *SockEntry
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c
deleted file mode 100644
index a0f97d6031..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c
+++ /dev/null
@@ -1,717 +0,0 @@
-/** @file
- Tcp request dispatcher implementation.
-
-(C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Tcp4Main.h"
-
-#define TCP_COMP_VAL(Min, Max, Default, Val) \
- ((((Val) <= (Max)) && ((Val) >= (Min))) ? (Val) : (Default))
-
-/**
- Add or remove a route entry in the IP route table associated with this TCP instance.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param RouteInfo Pointer to the route info to be processed.
-
- @retval EFI_SUCCESS The operation completed successfully.
- @retval EFI_NOT_STARTED The driver instance has not been started.
- @retval EFI_NO_MAPPING When using the default address, configuration(DHCP,
- BOOTP, RARP, etc.) is not finished yet.
- @retval EFI_OUT_OF_RESOURCES Could not add the entry to the routing table.
- @retval EFI_NOT_FOUND This route is not in the routing table
- (when RouteInfo->DeleteRoute is TRUE).
- @retval EFI_ACCESS_DENIED The route is already defined in the routing table
- (when RouteInfo->DeleteRoute is FALSE).
-**/
-EFI_STATUS
-Tcp4Route (
- IN TCP_CB *Tcb,
- IN TCP4_ROUTE_INFO *RouteInfo
- )
-{
- EFI_IP4_PROTOCOL *Ip4;
-
- Ip4 = Tcb->IpInfo->Ip.Ip4;
-
- ASSERT (Ip4 != NULL);
-
- return Ip4->Routes (
- Ip4,
- RouteInfo->DeleteRoute,
- RouteInfo->SubnetAddress,
- RouteInfo->SubnetMask,
- RouteInfo->GatewayAddress
- );
-
-}
-
-
-/**
- Get the operational settings of this TCP instance.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Mode Pointer to the buffer to store the operational
- settings.
-
- @retval EFI_SUCCESS The mode data is read.
- @retval EFI_NOT_STARTED No configuration data is available because this
- instance hasn't been started.
-
-**/
-EFI_STATUS
-Tcp4GetMode (
- IN TCP_CB *Tcb,
- IN OUT TCP4_MODE_DATA *Mode
- )
-{
- SOCKET *Sock;
- EFI_TCP4_CONFIG_DATA *ConfigData;
- EFI_TCP4_ACCESS_POINT *AccessPoint;
- EFI_TCP4_OPTION *Option;
- EFI_IP4_PROTOCOL *Ip;
-
- Sock = Tcb->Sk;
-
- if (!SOCK_IS_CONFIGURED (Sock) && (Mode->Tcp4ConfigData != NULL)) {
- return EFI_NOT_STARTED;
- }
-
- if (Mode->Tcp4State != NULL) {
- *(Mode->Tcp4State) = (EFI_TCP4_CONNECTION_STATE) Tcb->State;
- }
-
- if (Mode->Tcp4ConfigData != NULL) {
-
- ConfigData = Mode->Tcp4ConfigData;
- AccessPoint = &(ConfigData->AccessPoint);
- Option = ConfigData->ControlOption;
-
- ConfigData->TypeOfService = Tcb->Tos;
- ConfigData->TimeToLive = Tcb->Ttl;
-
- AccessPoint->UseDefaultAddress = Tcb->UseDefaultAddr;
-
- IP4_COPY_ADDRESS (&AccessPoint->StationAddress, &Tcb->LocalEnd.Ip);
- IP4_COPY_ADDRESS (&AccessPoint->SubnetMask, &Tcb->SubnetMask);
- AccessPoint->StationPort = NTOHS (Tcb->LocalEnd.Port);
-
- IP4_COPY_ADDRESS (&AccessPoint->RemoteAddress, &Tcb->RemoteEnd.Ip);
- AccessPoint->RemotePort = NTOHS (Tcb->RemoteEnd.Port);
- AccessPoint->ActiveFlag = (BOOLEAN) (Tcb->State != TCP_LISTEN);
-
- if (Option != NULL) {
- Option->ReceiveBufferSize = GET_RCV_BUFFSIZE (Tcb->Sk);
- Option->SendBufferSize = GET_SND_BUFFSIZE (Tcb->Sk);
- Option->MaxSynBackLog = GET_BACKLOG (Tcb->Sk);
-
- Option->ConnectionTimeout = Tcb->ConnectTimeout / TCP_TICK_HZ;
- Option->DataRetries = Tcb->MaxRexmit;
- Option->FinTimeout = Tcb->FinWait2Timeout / TCP_TICK_HZ;
- Option->TimeWaitTimeout = Tcb->TimeWaitTimeout / TCP_TICK_HZ;
- Option->KeepAliveProbes = Tcb->MaxKeepAlive;
- Option->KeepAliveTime = Tcb->KeepAliveIdle / TCP_TICK_HZ;
- Option->KeepAliveInterval = Tcb->KeepAlivePeriod / TCP_TICK_HZ;
-
- Option->EnableNagle = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE));
- Option->EnableTimeStamp = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS));
- Option->EnableWindowScaling = (BOOLEAN) (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS));
-
- Option->EnableSelectiveAck = FALSE;
- Option->EnablePathMtuDiscovery = FALSE;
- }
- }
-
- Ip = Tcb->IpInfo->Ip.Ip4;
- ASSERT (Ip != NULL);
-
- return Ip->GetModeData (Ip, Mode->Ip4ModeData, Mode->MnpConfigData, Mode->SnpModeData);
-}
-
-
-/**
- If AP->StationPort isn't zero, check whether the access point
- is registered, else generate a random station port for this
- access point.
-
- @param AP Pointer to the access point.
-
- @retval EFI_SUCCESS The check is passed or the port is assigned.
- @retval EFI_INVALID_PARAMETER The non-zero station port is already used.
- @retval EFI_OUT_OF_RESOURCES No port can be allocated.
-
-**/
-EFI_STATUS
-Tcp4Bind (
- IN EFI_TCP4_ACCESS_POINT *AP
- )
-{
- BOOLEAN Cycle;
-
- if (0 != AP->StationPort) {
- //
- // check if a same endpoint is bound
- //
- if (TcpFindTcbByPeer (&AP->StationAddress, AP->StationPort)) {
-
- return EFI_INVALID_PARAMETER;
- }
- } else {
- //
- // generate a random port
- //
- Cycle = FALSE;
-
- if (TCP4_PORT_USER_RESERVED == mTcp4RandomPort) {
- mTcp4RandomPort = TCP4_PORT_KNOWN;
- }
-
- mTcp4RandomPort++;
-
- while (TcpFindTcbByPeer (&AP->StationAddress, mTcp4RandomPort)) {
-
- mTcp4RandomPort++;
-
- if (mTcp4RandomPort <= TCP4_PORT_KNOWN) {
-
- if (Cycle) {
- DEBUG ((EFI_D_ERROR, "Tcp4Bind: no port can be allocated "
- "for this pcb\n"));
-
- return EFI_OUT_OF_RESOURCES;
- }
-
- mTcp4RandomPort = TCP4_PORT_KNOWN + 1;
-
- Cycle = TRUE;
- }
-
- }
-
- AP->StationPort = mTcp4RandomPort;
- }
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Flush the Tcb add its associated protocols.
-
- @param Tcb Pointer to the TCP_CB to be flushed.
-
-**/
-VOID
-Tcp4FlushPcb (
- IN TCP_CB *Tcb
- )
-{
- SOCKET *Sock;
-
- IpIoConfigIp (Tcb->IpInfo, NULL);
-
- Sock = Tcb->Sk;
-
- if (SOCK_IS_CONFIGURED (Sock)) {
- RemoveEntryList (&Tcb->List);
-
- //
- // Uninstall the device path protocol.
- //
- if (Sock->DevicePath != NULL) {
- gBS->UninstallProtocolInterface (
- Sock->SockHandle,
- &gEfiDevicePathProtocolGuid,
- Sock->DevicePath
- );
- FreePool (Sock->DevicePath);
- }
- }
-
- NetbufFreeList (&Tcb->SndQue);
- NetbufFreeList (&Tcb->RcvQue);
- Tcb->State = TCP_CLOSED;
-}
-
-/**
- Attach a Pcb to the socket.
-
- @param Sk Pointer to the socket of this TCP instance.
-
- @retval EFI_SUCCESS The operation is completed successfully.
- @retval EFI_OUT_OF_RESOURCES Failed due to resource limit.
-
-**/
-EFI_STATUS
-Tcp4AttachPcb (
- IN SOCKET *Sk
- )
-{
- TCP_CB *Tcb;
- TCP4_PROTO_DATA *ProtoData;
- IP_IO *IpIo;
- EFI_STATUS Status;
- VOID *Ip;
-
- Tcb = AllocateZeroPool (sizeof (TCP_CB));
-
- if (Tcb == NULL) {
-
- DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: failed to allocate a TCB\n"));
-
- return EFI_OUT_OF_RESOURCES;
- }
-
- ProtoData = (TCP4_PROTO_DATA *) Sk->ProtoReserved;
- IpIo = ProtoData->TcpService->IpIo;
-
- //
- // Create an IpInfo for this Tcb.
- //
- Tcb->IpInfo = IpIoAddIp (IpIo);
- if (Tcb->IpInfo == NULL) {
-
- FreePool (Tcb);
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Open the new created IP instance BY_CHILD.
- //
- Status = gBS->OpenProtocol (
- Tcb->IpInfo->ChildHandle,
- &gEfiIp4ProtocolGuid,
- &Ip,
- IpIo->Image,
- Sk->SockHandle,
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
- );
- if (EFI_ERROR (Status)) {
- IpIoRemoveIp (IpIo, Tcb->IpInfo);
- return Status;
- }
-
- InitializeListHead (&Tcb->List);
- InitializeListHead (&Tcb->SndQue);
- InitializeListHead (&Tcb->RcvQue);
-
- Tcb->State = TCP_CLOSED;
- Tcb->Sk = Sk;
- ProtoData->TcpPcb = Tcb;
-
- return EFI_SUCCESS;
-}
-
-/**
- Detach the Pcb of the socket.
-
- @param Sk Pointer to the socket of this TCP instance.
-
-**/
-VOID
-Tcp4DetachPcb (
- IN SOCKET *Sk
- )
-{
- TCP4_PROTO_DATA *ProtoData;
- TCP_CB *Tcb;
-
- ProtoData = (TCP4_PROTO_DATA *) Sk->ProtoReserved;
- Tcb = ProtoData->TcpPcb;
-
- ASSERT (Tcb != NULL);
-
- Tcp4FlushPcb (Tcb);
-
- IpIoRemoveIp (ProtoData->TcpService->IpIo, Tcb->IpInfo);
-
- FreePool (Tcb);
-
- ProtoData->TcpPcb = NULL;
-}
-
-
-/**
- Configure the Pcb using CfgData.
-
- @param Sk Pointer to the socket of this TCP instance.
- @param CfgData Pointer to the TCP configuration data.
-
- @retval EFI_SUCCESS The operation is completed successfully.
- @retval EFI_INVALID_PARAMETER A same access point has been configured in
- another TCP instance.
- @retval EFI_OUT_OF_RESOURCES Failed due to resource limit.
-
-**/
-EFI_STATUS
-Tcp4ConfigurePcb (
- IN SOCKET *Sk,
- IN EFI_TCP4_CONFIG_DATA *CfgData
- )
-{
- EFI_IP4_CONFIG_DATA IpCfgData;
- EFI_STATUS Status;
- EFI_TCP4_OPTION *Option;
- TCP4_PROTO_DATA *TcpProto;
- TCP_CB *Tcb;
-
- ASSERT ((CfgData != NULL) && (Sk != NULL) && (Sk->SockHandle != NULL));
-
- TcpProto = (TCP4_PROTO_DATA *) Sk->ProtoReserved;
- Tcb = TcpProto->TcpPcb;
-
- ASSERT (Tcb != NULL);
-
- //
- // Add Ip for send pkt to the peer
- //
- CopyMem (&IpCfgData, &mIp4IoDefaultIpConfigData, sizeof (IpCfgData));
- IpCfgData.DefaultProtocol = EFI_IP_PROTO_TCP;
- IpCfgData.UseDefaultAddress = CfgData->AccessPoint.UseDefaultAddress;
- IpCfgData.StationAddress = CfgData->AccessPoint.StationAddress;
- IpCfgData.SubnetMask = CfgData->AccessPoint.SubnetMask;
- IpCfgData.ReceiveTimeout = (UINT32) (-1);
-
- //
- // Configure the IP instance this Tcb consumes.
- //
- Status = IpIoConfigIp (Tcb->IpInfo, &IpCfgData);
- if (EFI_ERROR (Status)) {
- goto OnExit;
- }
-
- //
- // Get the default address info if the instance is configured to use default address.
- //
- if (CfgData->AccessPoint.UseDefaultAddress) {
- CfgData->AccessPoint.StationAddress = IpCfgData.StationAddress;
- CfgData->AccessPoint.SubnetMask = IpCfgData.SubnetMask;
- }
-
- //
- // check if we can bind this endpoint in CfgData
- //
- Status = Tcp4Bind (&(CfgData->AccessPoint));
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "Tcp4ConfigurePcb: Bind endpoint failed "
- "with %r\n", Status));
-
- goto OnExit;
- }
-
- //
- // Initalize the operating information in this Tcb
- //
- ASSERT (Tcb->State == TCP_CLOSED &&
- IsListEmpty (&Tcb->SndQue) &&
- IsListEmpty (&Tcb->RcvQue));
-
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE);
- Tcb->State = TCP_CLOSED;
-
- Tcb->SndMss = 536;
- Tcb->RcvMss = TcpGetRcvMss (Sk);
-
- Tcb->SRtt = 0;
- Tcb->Rto = 3 * TCP_TICK_HZ;
-
- Tcb->CWnd = Tcb->SndMss;
- Tcb->Ssthresh = 0xffffffff;
-
- Tcb->CongestState = TCP_CONGEST_OPEN;
-
- Tcb->KeepAliveIdle = TCP_KEEPALIVE_IDLE_MIN;
- Tcb->KeepAlivePeriod = TCP_KEEPALIVE_PERIOD;
- Tcb->MaxKeepAlive = TCP_MAX_KEEPALIVE;
- Tcb->MaxRexmit = TCP_MAX_LOSS;
- Tcb->FinWait2Timeout = TCP_FIN_WAIT2_TIME;
- Tcb->TimeWaitTimeout = TCP_TIME_WAIT_TIME;
- Tcb->ConnectTimeout = TCP_CONNECT_TIME;
-
- //
- // initialize Tcb in the light of CfgData
- //
- Tcb->Ttl = CfgData->TimeToLive;
- Tcb->Tos = CfgData->TypeOfService;
-
- Tcb->UseDefaultAddr = CfgData->AccessPoint.UseDefaultAddress;
-
- CopyMem (&Tcb->LocalEnd.Ip, &CfgData->AccessPoint.StationAddress, sizeof (IP4_ADDR));
- Tcb->LocalEnd.Port = HTONS (CfgData->AccessPoint.StationPort);
- IP4_COPY_ADDRESS (&Tcb->SubnetMask, &CfgData->AccessPoint.SubnetMask);
-
- if (CfgData->AccessPoint.ActiveFlag) {
- CopyMem (&Tcb->RemoteEnd.Ip, &CfgData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR));
- Tcb->RemoteEnd.Port = HTONS (CfgData->AccessPoint.RemotePort);
- } else {
- Tcb->RemoteEnd.Ip = 0;
- Tcb->RemoteEnd.Port = 0;
- }
-
- Option = CfgData->ControlOption;
-
- if (Option != NULL) {
- SET_RCV_BUFFSIZE (
- Sk,
- (UINT32) (TCP_COMP_VAL (
- TCP_RCV_BUF_SIZE_MIN,
- TCP_RCV_BUF_SIZE,
- TCP_RCV_BUF_SIZE,
- Option->ReceiveBufferSize
- )
- )
- );
- SET_SND_BUFFSIZE (
- Sk,
- (UINT32) (TCP_COMP_VAL (
- TCP_SND_BUF_SIZE_MIN,
- TCP_SND_BUF_SIZE,
- TCP_SND_BUF_SIZE,
- Option->SendBufferSize
- )
- )
- );
-
- SET_BACKLOG (
- Sk,
- (UINT32) (TCP_COMP_VAL (
- TCP_BACKLOG_MIN,
- TCP_BACKLOG,
- TCP_BACKLOG,
- Option->MaxSynBackLog
- )
- )
- );
-
- Tcb->MaxRexmit = (UINT16) TCP_COMP_VAL (
- TCP_MAX_LOSS_MIN,
- TCP_MAX_LOSS,
- TCP_MAX_LOSS,
- Option->DataRetries
- );
- Tcb->FinWait2Timeout = TCP_COMP_VAL (
- TCP_FIN_WAIT2_TIME,
- TCP_FIN_WAIT2_TIME_MAX,
- TCP_FIN_WAIT2_TIME,
- (UINT32) (Option->FinTimeout * TCP_TICK_HZ)
- );
-
- if (Option->TimeWaitTimeout != 0) {
- Tcb->TimeWaitTimeout = TCP_COMP_VAL (
- TCP_TIME_WAIT_TIME,
- TCP_TIME_WAIT_TIME_MAX,
- TCP_TIME_WAIT_TIME,
- (UINT32) (Option->TimeWaitTimeout * TCP_TICK_HZ)
- );
- } else {
- Tcb->TimeWaitTimeout = 0;
- }
-
- if (Option->KeepAliveProbes != 0) {
- TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE);
-
- Tcb->MaxKeepAlive = (UINT8) TCP_COMP_VAL (
- TCP_MAX_KEEPALIVE_MIN,
- TCP_MAX_KEEPALIVE,
- TCP_MAX_KEEPALIVE,
- Option->KeepAliveProbes
- );
- Tcb->KeepAliveIdle = TCP_COMP_VAL (
- TCP_KEEPALIVE_IDLE_MIN,
- TCP_KEEPALIVE_IDLE_MAX,
- TCP_KEEPALIVE_IDLE_MIN,
- (UINT32) (Option->KeepAliveTime * TCP_TICK_HZ)
- );
- Tcb->KeepAlivePeriod = TCP_COMP_VAL (
- TCP_KEEPALIVE_PERIOD_MIN,
- TCP_KEEPALIVE_PERIOD,
- TCP_KEEPALIVE_PERIOD,
- (UINT32) (Option->KeepAliveInterval * TCP_TICK_HZ)
- );
- }
-
- Tcb->ConnectTimeout = TCP_COMP_VAL (
- TCP_CONNECT_TIME_MIN,
- TCP_CONNECT_TIME,
- TCP_CONNECT_TIME,
- (UINT32) (Option->ConnectionTimeout * TCP_TICK_HZ)
- );
-
- if (!Option->EnableNagle) {
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE);
- }
-
- if (!Option->EnableTimeStamp) {
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_TS);
- }
-
- if (!Option->EnableWindowScaling) {
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_NO_WS);
- }
- }
-
- //
- // The socket is bound, the <SrcIp, SrcPort, DstIp, DstPort> is
- // determined, construct the IP device path and install it.
- //
- Status = TcpInstallDevicePath (Sk);
- if (EFI_ERROR (Status)) {
- goto OnExit;
- }
-
- //
- // update state of Tcb and socket
- //
- if (!CfgData->AccessPoint.ActiveFlag) {
-
- TcpSetState (Tcb, TCP_LISTEN);
- SockSetState (Sk, SO_LISTENING);
-
- Sk->ConfigureState = SO_CONFIGURED_PASSIVE;
- } else {
-
- Sk->ConfigureState = SO_CONFIGURED_ACTIVE;
- }
-
- TcpInsertTcb (Tcb);
-
-OnExit:
-
- return Status;
-}
-
-
-/**
- The procotol handler provided to the socket layer, used to
- dispatch the socket level requests by calling the corresponding
- TCP layer functions.
-
- @param Sock Pointer to the socket of this TCP instance.
- @param Request The code of this operation request.
- @param Data Pointer to the operation specific data passed in
- together with the operation request.
-
- @retval EFI_SUCCESS The socket request is completed successfully.
- @retval other The error status returned by the corresponding TCP
- layer function.
-
-**/
-EFI_STATUS
-Tcp4Dispatcher (
- IN SOCKET *Sock,
- IN UINT8 Request,
- IN VOID *Data OPTIONAL
- )
-{
- TCP_CB *Tcb;
- TCP4_PROTO_DATA *ProtoData;
- EFI_IP4_PROTOCOL *Ip;
-
- ProtoData = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
- Tcb = ProtoData->TcpPcb;
-
- switch (Request) {
- case SOCK_POLL:
- Ip = ProtoData->TcpService->IpIo->Ip.Ip4;
- Ip->Poll (Ip);
- break;
-
- case SOCK_CONSUMED:
- //
- // After user received data from socket buffer, socket will
- // notify TCP using this message to give it a chance to send out
- // window update information
- //
- ASSERT (Tcb != NULL);
- TcpOnAppConsume (Tcb);
- break;
-
- case SOCK_SND:
-
- ASSERT (Tcb != NULL);
- TcpOnAppSend (Tcb);
- break;
-
- case SOCK_CLOSE:
-
- TcpOnAppClose (Tcb);
-
- break;
-
- case SOCK_ABORT:
-
- TcpOnAppAbort (Tcb);
-
- break;
-
- case SOCK_SNDPUSH:
- Tcb->SndPsh = TcpGetMaxSndNxt (Tcb) + GET_SND_DATASIZE (Tcb->Sk);
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_PSH);
-
- break;
-
- case SOCK_SNDURG:
- Tcb->SndUp = TcpGetMaxSndNxt (Tcb) + GET_SND_DATASIZE (Tcb->Sk) - 1;
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_URG);
-
- break;
-
- case SOCK_CONNECT:
-
- TcpOnAppConnect (Tcb);
-
- break;
-
- case SOCK_ATTACH:
-
- return Tcp4AttachPcb (Sock);
-
- case SOCK_FLUSH:
-
- Tcp4FlushPcb (Tcb);
-
- break;
-
- case SOCK_DETACH:
-
- Tcp4DetachPcb (Sock);
-
- break;
-
- case SOCK_CONFIGURE:
-
- return Tcp4ConfigurePcb (
- Sock,
- (EFI_TCP4_CONFIG_DATA *) Data
- );
-
- case SOCK_MODE:
-
- ASSERT ((Data != NULL) && (Tcb != NULL));
-
- return Tcp4GetMode (Tcb, (TCP4_MODE_DATA *) Data);
-
- case SOCK_ROUTE:
-
- ASSERT ((Data != NULL) && (Tcb != NULL));
-
- return Tcp4Route (Tcb, (TCP4_ROUTE_INFO *) Data);
-
- default:
- return EFI_UNSUPPORTED;
- }
-
- return EFI_SUCCESS;
-
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c
deleted file mode 100644
index 2ff8eee869..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c
+++ /dev/null
@@ -1,782 +0,0 @@
-/** @file
- Tcp driver function.
-
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Tcp4Main.h"
-
-
-UINT16 mTcp4RandomPort;
-extern EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName;
-extern EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2;
-extern EFI_UNICODE_STRING_TABLE *gTcpControllerNameTable;
-
-TCP4_HEARTBEAT_TIMER mTcp4Timer = {
- NULL,
- 0
-};
-
-EFI_TCP4_PROTOCOL mTcp4ProtocolTemplate = {
- Tcp4GetModeData,
- Tcp4Configure,
- Tcp4Routes,
- Tcp4Connect,
- Tcp4Accept,
- Tcp4Transmit,
- Tcp4Receive,
- Tcp4Close,
- Tcp4Cancel,
- Tcp4Poll
-};
-
-SOCK_INIT_DATA mTcp4DefaultSockData = {
- SockStream,
- 0,
- NULL,
- TCP_BACKLOG,
- TCP_SND_BUF_SIZE,
- TCP_RCV_BUF_SIZE,
- &mTcp4ProtocolTemplate,
- Tcp4CreateSocketCallback,
- Tcp4DestroySocketCallback,
- NULL,
- NULL,
- 0,
- Tcp4Dispatcher,
- NULL,
-};
-
-EFI_DRIVER_BINDING_PROTOCOL mTcp4DriverBinding = {
- Tcp4DriverBindingSupported,
- Tcp4DriverBindingStart,
- Tcp4DriverBindingStop,
- 0xa,
- NULL,
- NULL
-};
-
-EFI_SERVICE_BINDING_PROTOCOL mTcp4ServiceBinding = {
- Tcp4ServiceBindingCreateChild,
- Tcp4ServiceBindingDestroyChild
-};
-
-
-/**
- Create and start the heartbeat timer for TCP driver.
-
- @retval EFI_SUCCESS The timer is successfully created and started.
- @retval other The timer is not created.
-
-**/
-EFI_STATUS
-Tcp4CreateTimer (
- VOID
- )
-{
- EFI_STATUS Status;
-
- Status = EFI_SUCCESS;
-
- if (mTcp4Timer.RefCnt == 0) {
-
- Status = gBS->CreateEvent (
- EVT_TIMER | EVT_NOTIFY_SIGNAL,
- TPL_NOTIFY,
- TcpTicking,
- NULL,
- &mTcp4Timer.TimerEvent
- );
- if (!EFI_ERROR (Status)) {
-
- Status = gBS->SetTimer (
- mTcp4Timer.TimerEvent,
- TimerPeriodic,
- (UINT64) (TICKS_PER_SECOND / TCP_TICK_HZ)
- );
- }
- }
-
- if (!EFI_ERROR (Status)) {
-
- mTcp4Timer.RefCnt++;
- }
-
- return Status;
-}
-
-
-/**
- Stop and destroy the heartbeat timer for TCP driver.
-
-**/
-VOID
-Tcp4DestroyTimer (
- VOID
- )
-{
- ASSERT (mTcp4Timer.RefCnt > 0);
-
- mTcp4Timer.RefCnt--;
-
- if (mTcp4Timer.RefCnt > 0) {
- return;
- }
-
- gBS->SetTimer (mTcp4Timer.TimerEvent, TimerCancel, 0);
- gBS->CloseEvent (mTcp4Timer.TimerEvent);
- mTcp4Timer.TimerEvent = NULL;
-}
-
-/**
- Callback function which provided by user to remove one node in NetDestroyLinkList process.
-
- @param[in] Entry The entry to be removed.
- @param[in] Context Pointer to the callback context corresponds to the Context in NetDestroyLinkList.
-
- @retval EFI_SUCCESS The entry has been removed successfully.
- @retval Others Fail to remove the entry.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4DestroyChildEntryInHandleBuffer (
- IN LIST_ENTRY *Entry,
- IN VOID *Context
- )
-{
- SOCKET *Sock;
- EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
- UINTN NumberOfChildren;
- EFI_HANDLE *ChildHandleBuffer;
-
- if (Entry == NULL || Context == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Sock = NET_LIST_USER_STRUCT_S (Entry, SOCKET, Link, SOCK_SIGNATURE);
- ServiceBinding = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ServiceBinding;
- NumberOfChildren = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->NumberOfChildren;
- ChildHandleBuffer = ((TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ChildHandleBuffer;
-
- if (!NetIsInHandleBuffer (Sock->SockHandle, NumberOfChildren, ChildHandleBuffer)) {
- return EFI_SUCCESS;
- }
-
- return ServiceBinding->DestroyChild (ServiceBinding, Sock->SockHandle);
-}
-
-/**
- The entry point for Tcp4 driver, used to install Tcp4 driver on the ImageHandle.
-
- @param ImageHandle The firmware allocated handle for this
- driver image.
- @param SystemTable Pointer to the EFI system table.
-
- @retval EFI_SUCCESS Driver loaded.
- @retval other Driver not loaded.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4DriverEntryPoint (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-{
- EFI_STATUS Status;
- UINT32 Seed;
-
- //
- // Install the TCP4 Driver Binding Protocol
- //
- Status = EfiLibInstallDriverBindingComponentName2 (
- ImageHandle,
- SystemTable,
- &mTcp4DriverBinding,
- ImageHandle,
- &gTcp4ComponentName,
- &gTcp4ComponentName2
- );
- ASSERT_EFI_ERROR (Status);
- //
- // Initialize ISS and random port.
- //
- Seed = NetRandomInitSeed ();
- mTcpGlobalIss = NET_RANDOM (Seed) % mTcpGlobalIss;
- mTcp4RandomPort = (UINT16) (TCP4_PORT_KNOWN +
- (UINT16) (NET_RANDOM(Seed) % TCP4_PORT_KNOWN));
-
- return Status;
-}
-
-
-/**
- Tests to see if this driver supports a given controller.
-
- If a child device is provided, it further tests to see if this driver supports
- creating a handle for the specified child device.
-
- @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
- @param ControllerHandle The handle of the controller to test. This handle
- must support a protocol interface that supplies
- an I/O abstraction to the driver.
- @param RemainingDevicePath A pointer to the remaining portion of a device path.
- This parameter is ignored by device drivers, and is optional for bus drivers.
-
-
- @retval EFI_SUCCESS The device specified by ControllerHandle and
- RemainingDevicePath is supported by the driver
- specified by This.
- @retval EFI_ALREADY_STARTED The device specified by ControllerHandle and
- RemainingDevicePath is already being managed by
- the driver specified by This.
- @retval EFI_ACCESS_DENIED The device specified by ControllerHandle and
- RemainingDevicePath is already being managed by a
- different driver or an application that requires
- exclusive access.
- @retval EFI_UNSUPPORTED The device specified by ControllerHandle and
- RemainingDevicePath is not supported by the driver
- specified by This.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4DriverBindingSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
- )
-{
- EFI_STATUS Status;
-
- //
- // Test for the Tcp4ServiceBinding Protocol
- //
- Status = gBS->OpenProtocol (
- ControllerHandle,
- &gEfiTcp4ServiceBindingProtocolGuid,
- NULL,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_TEST_PROTOCOL
- );
- if (!EFI_ERROR (Status)) {
- return EFI_ALREADY_STARTED;
- }
-
- //
- // Test for the Ip4 Protocol
- //
- Status = gBS->OpenProtocol (
- ControllerHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- NULL,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_TEST_PROTOCOL
- );
-
- return Status;
-}
-
-
-/**
- Start this driver on ControllerHandle.
-
- The Start() function is designed to be invoked from the EFI boot service
- ConnectController(). As a result, much of the error checking on the parameters
- to Start() has been moved into this common boot service. It is legal to call
- Start() from other locations, but the following calling restrictions must be
- followed or the system behavior will not be deterministic.
- 1. ControllerHandle must be a valid EFI_HANDLE.
- 2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally
- aligned EFI_DEVICE_PATH_PROTOCOL.
- 3. Prior to calling Start(), the Supported() function for the driver specified
- by This must have been called with the same calling parameters, and Supported()
- must have returned EFI_SUCCESS.
-
- @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
- @param ControllerHandle The handle of the controller to start. This handle
- must support a protocol interface that supplies
- an I/O abstraction to the driver.
- @param RemainingDevicePath A pointer to the remaining portion of a device path.
- This parameter is ignored by device drivers, and is
- optional for bus drivers.
-
- @retval EFI_SUCCESS The device was started.
- @retval EFI_ALREADY_STARTED The device could not be started due to a device error.
- @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack
- of resources.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4DriverBindingStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
- )
-{
- EFI_STATUS Status;
- TCP4_SERVICE_DATA *TcpServiceData;
- IP_IO_OPEN_DATA OpenData;
-
- TcpServiceData = AllocateZeroPool (sizeof (TCP4_SERVICE_DATA));
-
- if (NULL == TcpServiceData) {
- DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Have no enough"
- " resource to create a Tcp Servcie Data\n"));
-
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Create a new IP IO to Consume it
- //
- TcpServiceData->IpIo = IpIoCreate (
- This->DriverBindingHandle,
- ControllerHandle,
- IP_VERSION_4
- );
- if (NULL == TcpServiceData->IpIo) {
-
- DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Have no enough"
- " resource to create an Ip Io\n"));
-
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_ERROR;
- }
-
- //
- // Configure and start IpIo.
- //
- ZeroMem (&OpenData, sizeof (IP_IO_OPEN_DATA));
-
- CopyMem (
- &OpenData.IpConfigData.Ip4CfgData,
- &mIp4IoDefaultIpConfigData,
- sizeof (EFI_IP4_CONFIG_DATA)
- );
-
- OpenData.IpConfigData.Ip4CfgData.DefaultProtocol = EFI_IP_PROTO_TCP;
-
- OpenData.PktRcvdNotify = Tcp4RxCallback;
- Status = IpIoOpen (TcpServiceData->IpIo, &OpenData);
-
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- //
- // Create the timer event used by TCP driver
- //
- Status = Tcp4CreateTimer ();
- if (EFI_ERROR (Status)) {
-
- DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Create TcpTimer"
- " Event failed with %r\n", Status));
-
- goto ON_ERROR;
- }
-
- //
- // Install the Tcp4ServiceBinding Protocol on the
- // controller handle
- //
- TcpServiceData->Tcp4ServiceBinding = mTcp4ServiceBinding;
-
- Status = gBS->InstallMultipleProtocolInterfaces (
- &ControllerHandle,
- &gEfiTcp4ServiceBindingProtocolGuid,
- &TcpServiceData->Tcp4ServiceBinding,
- NULL
- );
- if (EFI_ERROR (Status)) {
-
- DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStart: Install Tcp4 Service Binding"
- " Protocol failed for %r\n", Status));
-
- Tcp4DestroyTimer ();
- goto ON_ERROR;
- }
-
- //
- // Initialize member in TcpServiceData
- //
- TcpServiceData->ControllerHandle = ControllerHandle;
- TcpServiceData->Signature = TCP4_DRIVER_SIGNATURE;
- TcpServiceData->DriverBindingHandle = This->DriverBindingHandle;
-
- InitializeListHead (&TcpServiceData->SocketList);
-
- return EFI_SUCCESS;
-
-ON_ERROR:
-
- if (TcpServiceData->IpIo != NULL) {
- IpIoDestroy (TcpServiceData->IpIo);
- TcpServiceData->IpIo = NULL;
- }
-
- FreePool (TcpServiceData);
-
- return Status;
-}
-
-
-/**
- Stop this driver on ControllerHandle.
-
- The Stop() function is designed to be invoked from the EFI boot service
- DisconnectController(). As a result, much of the error checking on the parameters
- to Stop() has been moved into this common boot service. It is legal to call Stop()
- from other locations, but the following calling restrictions must be followed
- or the system behavior will not be deterministic.
- 1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call
- to this same driver's Start() function.
- 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid
- EFI_HANDLE. In addition, all of these handles must have been created in this
- driver's Start() function, and the Start() function must have called OpenProtocol()
- on ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
-
- @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
- @param ControllerHandle A handle to the device being stopped. The handle must
- support a bus specific I/O protocol for the driver
- to use to stop the device.
- @param NumberOfChildren The number of child device handles in ChildHandleBuffer.
- @param ChildHandleBuffer An array of child handles to be freed. May be NULL if
- NumberOfChildren is 0.
-
- @retval EFI_SUCCESS The device was stopped.
- @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4DriverBindingStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- )
-{
- EFI_STATUS Status;
- EFI_HANDLE NicHandle;
- EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
- TCP4_SERVICE_DATA *TcpServiceData;
- LIST_ENTRY *List;
- TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT Context;
-
- // Find the NicHandle where Tcp4 ServiceBinding Protocol is installed.
- //
- NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);
- if (NicHandle == NULL) {
- return EFI_SUCCESS;
- }
-
- //
- // Retrieve the TCP driver Data Structure
- //
- Status = gBS->OpenProtocol (
- NicHandle,
- &gEfiTcp4ServiceBindingProtocolGuid,
- (VOID **) &ServiceBinding,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
-
- DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingStop: Locate Tcp4 Service "
- " Binding Protocol failed with %r\n", Status));
-
- return EFI_DEVICE_ERROR;
- }
-
- TcpServiceData = TCP4_FROM_THIS (ServiceBinding);
-
- if (NumberOfChildren != 0) {
- List = &TcpServiceData->SocketList;
- Context.ServiceBinding = ServiceBinding;
- Context.NumberOfChildren = NumberOfChildren;
- Context.ChildHandleBuffer = ChildHandleBuffer;
- Status = NetDestroyLinkList (
- List,
- Tcp4DestroyChildEntryInHandleBuffer,
- &Context,
- NULL
- );
- } else if (IsListEmpty (&TcpServiceData->SocketList)) {
- //
- // Uninstall TCP servicebinding protocol
- //
- gBS->UninstallMultipleProtocolInterfaces (
- NicHandle,
- &gEfiTcp4ServiceBindingProtocolGuid,
- ServiceBinding,
- NULL
- );
-
- //
- // Destroy the IpIO consumed by TCP driver
- //
- IpIoDestroy (TcpServiceData->IpIo);
- TcpServiceData->IpIo = NULL;
-
- //
- // Destroy the heartbeat timer.
- //
- Tcp4DestroyTimer ();
-
- if (gTcpControllerNameTable != NULL) {
- FreeUnicodeStringTable (gTcpControllerNameTable);
- gTcpControllerNameTable = NULL;
- }
-
- //
- // Release the TCP service data
- //
- FreePool (TcpServiceData);
-
- Status = EFI_SUCCESS;
- }
-
- return Status;
-}
-
-/**
- Open Ip4 and device path protocols for a created socket, and insert it in
- socket list.
-
- @param This Pointer to the socket just created
- @param Context Context of the socket
-
- @retval EFI_SUCCESS This protocol is installed successfully.
- @retval other Some error occured.
-
-**/
-EFI_STATUS
-Tcp4CreateSocketCallback (
- IN SOCKET *This,
- IN VOID *Context
- )
-{
- EFI_STATUS Status;
- TCP4_SERVICE_DATA *TcpServiceData;
- EFI_IP4_PROTOCOL *Ip4;
-
- TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)->TcpService;
-
- //
- // Open the default Ip4 protocol of IP_IO BY_DRIVER.
- //
- Status = gBS->OpenProtocol (
- TcpServiceData->IpIo->ChildHandle,
- &gEfiIp4ProtocolGuid,
- (VOID **) &Ip4,
- TcpServiceData->DriverBindingHandle,
- This->SockHandle,
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Open the device path on the handle where service binding resides on.
- //
- Status = gBS->OpenProtocol (
- TcpServiceData->ControllerHandle,
- &gEfiDevicePathProtocolGuid,
- (VOID **) &This->ParentDevicePath,
- TcpServiceData->DriverBindingHandle,
- This->SockHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- gBS->CloseProtocol (
- TcpServiceData->IpIo->ChildHandle,
- &gEfiIp4ProtocolGuid,
- TcpServiceData->DriverBindingHandle,
- This->SockHandle
- );
- } else {
- //
- // Insert this socket into the SocketList.
- //
- InsertTailList (&TcpServiceData->SocketList, &This->Link);
- }
-
- return Status;
-}
-
-/**
- Close Ip4 and device path protocols for a socket, and remove it from socket list.
-
- @param This Pointer to the socket to be removed
- @param Context Context of the socket
-
-**/
-VOID
-Tcp4DestroySocketCallback (
- IN SOCKET *This,
- IN VOID *Context
- )
-{
- TCP4_SERVICE_DATA *TcpServiceData;
-
- TcpServiceData = ((TCP4_PROTO_DATA *) This->ProtoReserved)->TcpService;
-
- //
- // Remove this node from the list.
- //
- RemoveEntryList (&This->Link);
-
- //
- // Close the Ip4 protocol.
- //
- gBS->CloseProtocol (
- TcpServiceData->IpIo->ChildHandle,
- &gEfiIp4ProtocolGuid,
- TcpServiceData->DriverBindingHandle,
- This->SockHandle
- );
-}
-
-/**
- Creates a child handle and installs a protocol.
-
- The CreateChild() function installs a protocol on ChildHandle. If ChildHandle
- is a pointer to NULL, then a new handle is created and returned in ChildHandle.
- If ChildHandle is not a pointer to NULL, then the protocol installs on the existing
- ChildHandle.
-
- @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance.
- @param ChildHandle Pointer to the handle of the child to create. If it is NULL, then
- a new handle is created. If it is a pointer to an existing UEFI
- handle, then the protocol is added to the existing UEFI handle.
-
- @retval EFI_SUCCES The protocol was added to ChildHandle.
- @retval EFI_INVALID_PARAMETER ChildHandle is NULL.
- @retval EFI_OUT_OF_RESOURCES There are not enough resources available to create
- the child.
- @retval other The child handle was not created.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4ServiceBindingCreateChild (
- IN EFI_SERVICE_BINDING_PROTOCOL *This,
- IN OUT EFI_HANDLE *ChildHandle
- )
-{
- SOCKET *Sock;
- TCP4_SERVICE_DATA *TcpServiceData;
- TCP4_PROTO_DATA TcpProto;
- EFI_STATUS Status;
- EFI_TPL OldTpl;
-
- if (NULL == This || NULL == ChildHandle) {
- return EFI_INVALID_PARAMETER;
- }
-
- OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
- Status = EFI_SUCCESS;
- TcpServiceData = TCP4_FROM_THIS (This);
- TcpProto.TcpService = TcpServiceData;
- TcpProto.TcpPcb = NULL;
-
- //
- // Create a tcp instance with defualt Tcp default
- // sock init data and TcpProto
- //
- mTcp4DefaultSockData.ProtoData = &TcpProto;
- mTcp4DefaultSockData.DataSize = sizeof (TCP4_PROTO_DATA);
- mTcp4DefaultSockData.DriverBinding = TcpServiceData->DriverBindingHandle;
-
- Sock = SockCreateChild (&mTcp4DefaultSockData);
- if (NULL == Sock) {
- DEBUG ((EFI_D_ERROR, "Tcp4DriverBindingCreateChild: "
- "No resource to create a Tcp Child\n"));
-
- Status = EFI_OUT_OF_RESOURCES;
- } else {
- *ChildHandle = Sock->SockHandle;
- }
-
- mTcp4DefaultSockData.ProtoData = NULL;
-
- gBS->RestoreTPL (OldTpl);
- return Status;
-}
-
-
-/**
- Destroys a child handle with a protocol installed on it.
-
- The DestroyChild() function does the opposite of CreateChild(). It removes a protocol
- that was installed by CreateChild() from ChildHandle. If the removed protocol is the
- last protocol on ChildHandle, then ChildHandle is destroyed.
-
- @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance.
- @param ChildHandle Handle of the child to destroy
-
- @retval EFI_SUCCES The protocol was removed from ChildHandle.
- @retval EFI_UNSUPPORTED ChildHandle does not support the protocol that is
- being removed.
- @retval EFI_INVALID_PARAMETER Child handle is NULL.
- @retval EFI_ACCESS_DENIED The protocol could not be removed from the ChildHandle
- because its services are being used.
- @retval other The child handle was not destroyed.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4ServiceBindingDestroyChild (
- IN EFI_SERVICE_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ChildHandle
- )
-{
- EFI_STATUS Status;
- EFI_TCP4_PROTOCOL *Tcp4;
- SOCKET *Sock;
-
- if (NULL == This || NULL == ChildHandle) {
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // retrieve the Tcp4 protocol from ChildHandle
- //
- Status = gBS->OpenProtocol (
- ChildHandle,
- &gEfiTcp4ProtocolGuid,
- (VOID **) &Tcp4,
- mTcp4DriverBinding.DriverBindingHandle,
- ChildHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- Status = EFI_UNSUPPORTED;
- } else {
- //
- // destroy this sock and related Tcp protocol control
- // block
- //
- Sock = SOCK_FROM_THIS (Tcp4);
-
- SockDestroyChild (Sock);
- }
-
- return Status;
-}
-
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h
deleted file mode 100644
index 368f49c4dd..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h
+++ /dev/null
@@ -1,342 +0,0 @@
-/** @file
- Tcp driver function header.
-
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _TCP4_DRIVER_H_
-#define _TCP4_DRIVER_H_
-
-#include <Protocol/ServiceBinding.h>
-#include <Library/IpIoLib.h>
-
-#define TCP4_DRIVER_SIGNATURE SIGNATURE_32 ('T', 'C', 'P', '4')
-
-#define TCP4_PORT_KNOWN 1024
-#define TCP4_PORT_USER_RESERVED 65535
-
-#define TCP4_FROM_THIS(a) \
- CR ( \
- (a), \
- TCP4_SERVICE_DATA, \
- Tcp4ServiceBinding, \
- TCP4_DRIVER_SIGNATURE \
- )
-
-///
-/// TCP heartbeat tick timer.
-///
-typedef struct _TCP4_HEARTBEAT_TIMER {
- EFI_EVENT TimerEvent; ///< The event assoiated with the timer
- INTN RefCnt; ///< Number of reference
-} TCP4_HEARTBEAT_TIMER;
-
-///
-/// TCP service data
-///
-typedef struct _TCP4_SERVICE_DATA {
- UINT32 Signature;
- EFI_HANDLE ControllerHandle;
- IP_IO *IpIo; // IP Io consumed by TCP4
- EFI_SERVICE_BINDING_PROTOCOL Tcp4ServiceBinding;
- EFI_HANDLE DriverBindingHandle;
- LIST_ENTRY SocketList;
-} TCP4_SERVICE_DATA;
-
-///
-/// TCP protocol data
-///
-typedef struct _TCP4_PROTO_DATA {
- TCP4_SERVICE_DATA *TcpService;
- TCP_CB *TcpPcb;
-} TCP4_PROTO_DATA;
-
-
-/**
- Packet receive callback function provided to IP_IO, used to call
- the proper function to handle the packet received by IP.
-
- @param Status Status of the received packet.
- @param IcmpErr ICMP error number.
- @param NetSession Pointer to the net session of this packet.
- @param Pkt Pointer to the recieved packet.
- @param Context Pointer to the context configured in IpIoOpen(), not used
- now.
-
- @return None
-
-**/
-VOID
-EFIAPI
-Tcp4RxCallback (
- IN EFI_STATUS Status,
- IN UINT8 IcmpErr,
- IN EFI_NET_SESSION_DATA *NetSession,
- IN NET_BUF *Pkt,
- IN VOID *Context OPTIONAL
- );
-
-/**
- Send the segment to IP via IpIo function.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Nbuf Pointer to the TCP segment to be sent.
- @param Src Source address of the TCP segment.
- @param Dest Destination address of the TCP segment.
-
- @retval 0 The segment was sent out successfully.
- @retval -1 The segment was failed to send.
-
-**/
-INTN
-TcpSendIpPacket (
- IN TCP_CB *Tcb,
- IN NET_BUF *Nbuf,
- IN UINT32 Src,
- IN UINT32 Dest
- );
-
-/**
- The procotol handler provided to the socket layer, used to
- dispatch the socket level requests by calling the corresponding
- TCP layer functions.
-
- @param Sock Pointer to the socket of this TCP instance.
- @param Request The code of this operation request.
- @param Data Pointer to the operation specific data passed in
- together with the operation request.
-
- @retval EFI_SUCCESS The socket request is completed successfully.
- @retval other The error status returned by the corresponding TCP
- layer function.
-
-**/
-EFI_STATUS
-Tcp4Dispatcher (
- IN SOCKET *Sock,
- IN UINT8 Request,
- IN VOID *Data OPTIONAL
- );
-
-
-/**
- The entry point for Tcp4 driver, used to install Tcp4 driver on the ImageHandle.
-
- @param ImageHandle The firmware allocated handle for this
- driver image.
- @param SystemTable Pointer to the EFI system table.
-
- @retval EFI_SUCCESS Driver loaded.
- @retval other Driver not loaded.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4DriverEntryPoint (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- );
-
-
-/**
- Tests to see if this driver supports a given controller.
-
- If a child device is provided, it further tests to see if this driver supports
- creating a handle for the specified child device.
-
- @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
- @param ControllerHandle The handle of the controller to test. This handle
- must support a protocol interface that supplies
- an I/O abstraction to the driver.
- @param RemainingDevicePath A pointer to the remaining portion of a device path.
- This parameter is ignored by device drivers, and is optional for bus drivers.
-
-
- @retval EFI_SUCCESS The device specified by ControllerHandle and
- RemainingDevicePath is supported by the driver
- specified by This.
- @retval EFI_ALREADY_STARTED The device specified by ControllerHandle and
- RemainingDevicePath is already being managed by
- the driver specified by This.
- @retval EFI_ACCESS_DENIED The device specified by ControllerHandle and
- RemainingDevicePath is already being managed by a
- different driver or an application that requires
- exclusive access.
- @retval EFI_UNSUPPORTED The device specified by ControllerHandle and
- RemainingDevicePath is not supported by the driver
- specified by This.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4DriverBindingSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
- );
-
-/**
- Start this driver on ControllerHandle.
-
- The Start() function is designed to be invoked from the EFI boot service
- ConnectController(). As a result, much of the error checking on the parameters
- to Start() has been moved into this common boot service. It is legal to call
- Start() from other locations, but the following calling restrictions must be
- followed or the system behavior will not be deterministic.
- 1. ControllerHandle must be a valid EFI_HANDLE.
- 2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally
- aligned EFI_DEVICE_PATH_PROTOCOL.
- 3. Prior to calling Start(), the Supported() function for the driver specified
- by This must have been called with the same calling parameters, and Supported()
- must have returned EFI_SUCCESS.
-
- @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
- @param ControllerHandle The handle of the controller to start. This handle
- must support a protocol interface that supplies
- an I/O abstraction to the driver.
- @param RemainingDevicePath A pointer to the remaining portion of a device path.
- This parameter is ignored by device drivers, and is
- optional for bus drivers.
-
- @retval EFI_SUCCESS The device was started.
- @retval EFI_ALREADY_STARTED The device could not be started due to a device error.
- @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack
- of resources.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4DriverBindingStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
- );
-
-/**
- Stop this driver on ControllerHandle.
-
- The Stop() function is designed to be invoked from the EFI boot service
- DisconnectController(). As a result, much of the error checking on the parameters
- to Stop() has been moved into this common boot service. It is legal to call Stop()
- from other locations, but the following calling restrictions must be followed
- or the system behavior will not be deterministic.
- 1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call
- to this same driver's Start() function.
- 2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid
- EFI_HANDLE. In addition, all of these handles must have been created in this
- driver's Start() function, and the Start() function must have called OpenProtocol()
- on ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
-
- @param This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
- @param ControllerHandle A handle to the device being stopped. The handle must
- support a bus specific I/O protocol for the driver
- to use to stop the device.
- @param NumberOfChildren The number of child device handles in ChildHandleBuffer.
- @param ChildHandleBuffer An array of child handles to be freed. May be NULL if
- NumberOfChildren is 0.
-
- @retval EFI_SUCCESS The device was stopped.
- @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4DriverBindingStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- );
-
-/**
- Open Ip4 and device path protocols for a created socket, and insert it in
- socket list.
-
- @param This Pointer to the socket just created
- @param Context Context of the socket
-
- @retval EFI_SUCCESS This protocol is installed successfully.
- @retval other Some error occured.
-
-**/
-EFI_STATUS
-Tcp4CreateSocketCallback (
- IN SOCKET *This,
- IN VOID *Context
- );
-
-/**
- Close Ip4 and device path protocols for a socket, and remove it from socket list.
-
- @param This Pointer to the socket to be removed
- @param Context Context of the socket
-
-**/
-VOID
-Tcp4DestroySocketCallback (
- IN SOCKET *This,
- IN VOID *Context
- );
-
-/**
- Creates a child handle and installs a protocol.
-
- The CreateChild() function installs a protocol on ChildHandle. If ChildHandle
- is a pointer to NULL, then a new handle is created and returned in ChildHandle.
- If ChildHandle is not a pointer to NULL, then the protocol installs on the existing
- ChildHandle.
-
- @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance.
- @param ChildHandle Pointer to the handle of the child to create. If it is NULL, then
- a new handle is created. If it is a pointer to an existing UEFI
- handle, then the protocol is added to the existing UEFI handle.
-
- @retval EFI_SUCCES The protocol was added to ChildHandle.
- @retval EFI_INVALID_PARAMETER ChildHandle is NULL.
- @retval EFI_OUT_OF_RESOURCES There are not enough resources available to create
- the child.
- @retval other The child handle was not created.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4ServiceBindingCreateChild (
- IN EFI_SERVICE_BINDING_PROTOCOL *This,
- IN OUT EFI_HANDLE *ChildHandle
- );
-
-/**
- Destroys a child handle with a protocol installed on it.
-
- The DestroyChild() function does the opposite of CreateChild(). It removes a protocol
- that was installed by CreateChild() from ChildHandle. If the removed protocol is the
- last protocol on ChildHandle, then ChildHandle is destroyed.
-
- @param This Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance.
- @param ChildHandle Handle of the child to destroy
-
- @retval EFI_SUCCES The protocol was removed from ChildHandle.
- @retval EFI_UNSUPPORTED ChildHandle does not support the protocol that is
- being removed.
- @retval EFI_INVALID_PARAMETER Child handle is NULL.
- @retval EFI_ACCESS_DENIED The protocol could not be removed from the ChildHandle
- because its services are being used.
- @retval other The child handle was not destroyed.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4ServiceBindingDestroyChild (
- IN EFI_SERVICE_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ChildHandle
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf
deleted file mode 100644
index 7c0504770b..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf
+++ /dev/null
@@ -1,94 +0,0 @@
-## @file
-# This module produces EFI TCPv4 Protocol and EFI TCPv4 Service Binding Protocol.
-#
-# This module produces EFI TCPv4(Transmission Control Protocol version 4) Protocol
-# upon EFI IPv4 Protocol, to provide basic TCPv4 I/O services. This driver only
-# supports IPv4 network stack.
-#
-# Notes:
-# 1) This driver can't co-work with the TcpDxe driver in NetworkPkg.
-# 2) This driver might have some issues that have been fixed in the TcpDxe driver
-# in NetworkPkg.
-# 3) This driver supports fewer features than the TcpDxe driver in NetworkPkg (e.g. IPv6,
-# TCP Cancel function).
-# 4) TcpDxe driver in NetworkPkg is recommended for use instead of this one even though
-# both of them can be used.
-#
-# Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
-# This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution. The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-#
-##
-
-[Defines]
- INF_VERSION = 0x00010005
- BASE_NAME = Tcp4Dxe
- MODULE_UNI_FILE = Tcp4Dxe.uni
- FILE_GUID = 6d6963ab-906d-4a65-a7ca-bd40e5d6af4d
- MODULE_TYPE = UEFI_DRIVER
- VERSION_STRING = 1.0
- ENTRY_POINT = Tcp4DriverEntryPoint
- UNLOAD_IMAGE = NetLibDefaultUnload
-#
-# The following information is for reference only and not required by the build tools.
-#
-# VALID_ARCHITECTURES = IA32 X64 EBC
-#
-# DRIVER_BINDING = mTcp4DriverBinding
-# COMPONENT_NAME = gTcp4ComponentName
-# COMPONENT_NAME2 = gTcp4ComponentName2
-#
-
-[Sources]
- SockImpl.c
- SockInterface.c
- Tcp4Proto.h
- Tcp4Main.h
- SockImpl.h
- Tcp4Output.c
- Tcp4Timer.c
- Tcp4Option.h
- Tcp4Dispatcher.c
- Tcp4Input.c
- Tcp4Misc.c
- Tcp4Main.c
- Socket.h
- ComponentName.c
- Tcp4Driver.h
- Tcp4Io.c
- Tcp4Driver.c
- Tcp4Func.h
- Tcp4Option.c
-
-
-[Packages]
- MdePkg/MdePkg.dec
- MdeModulePkg/MdeModulePkg.dec
-
-[LibraryClasses]
- UefiLib
- UefiBootServicesTableLib
- UefiDriverEntryPoint
- UefiRuntimeServicesTableLib
- BaseMemoryLib
- MemoryAllocationLib
- DebugLib
- NetLib
- IpIoLib
- DevicePathLib
- DpcLib
-
-[Protocols]
- gEfiTcp4ServiceBindingProtocolGuid ## BY_START
- gEfiIp4ServiceBindingProtocolGuid ## TO_START
- gEfiTcp4ProtocolGuid ## BY_START
- gEfiIp4ProtocolGuid ## TO_START
-
-[UserExtensions.TianoCore."ExtraFiles"]
- Tcp4DxeExtra.uni
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni
deleted file mode 100644
index 1514a39177..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni
+++ /dev/null
@@ -1,23 +0,0 @@
-// /** @file
-// This module produces EFI TCPv4 Protocol and EFI TCPv4 Service Binding Protocol.
-//
-// This module produces EFI TCPv4(Transmission Control Protocol version 4) Protocol
-// upon EFI IPv4 Protocol, to provide basic TCPv4 I/O services.
-//
-// Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
-//
-// This program and the accompanying materials
-// are licensed and made available under the terms and conditions of the BSD License
-// which accompanies this distribution. The full text of the license may be found at
-// http://opensource.org/licenses/bsd-license.php
-//
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-//
-// **/
-
-
-#string STR_MODULE_ABSTRACT #language en-US "Produces EFI TCPv4 Protocol and EFI TCPv4 Service Binding Protocol"
-
-#string STR_MODULE_DESCRIPTION #language en-US "This module produces EFI TCPv4(Transmission Control Protocol version 4) Protocol upon EFI IPv4 Protocol to provide basic TCPv4 I/O services."
-
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni
deleted file mode 100644
index 0e6d2f2896..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni
+++ /dev/null
@@ -1,20 +0,0 @@
-// /** @file
-// Tcp4Dxe Localized Strings and Content
-//
-// Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.<BR>
-//
-// This program and the accompanying materials
-// are licensed and made available under the terms and conditions of the BSD License
-// which accompanies this distribution. The full text of the license may be found at
-// http://opensource.org/licenses/bsd-license.php
-//
-// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-//
-// **/
-
-#string STR_PROPERTIES_MODULE_NAME
-#language en-US
-"TCP v4 DXE Driver"
-
-
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h
deleted file mode 100644
index 53b7aac8ae..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h
+++ /dev/null
@@ -1,781 +0,0 @@
-/** @file
- Tcp function header file.
-
-Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _TCP4_FUNC_H_
-#define _TCP4_FUNC_H_
-
-//
-// Declaration of all the functions in TCP
-// protocol. It is intended to keep tcp.h
-// clear.
-//
-
-//
-// Functions in tcp.c
-//
-
-/**
- Try to find one Tcb whose <Ip, Port> equals to <IN Addr, IN Port>.
-
- @param Addr Pointer to the IP address needs to match.
- @param Port The port number needs to match.
-
- @return The Tcb which matches the <Addr Port> paire exists or not.
-
-**/
-BOOLEAN
-TcpFindTcbByPeer (
- IN EFI_IPv4_ADDRESS *Addr,
- IN TCP_PORTNO Port
- );
-
-/**
- Locate the TCP_CB related to the socket pair.
-
- @param LocalPort The local port number.
- @param LocalIp The local IP address.
- @param RemotePort The remote port number.
- @param RemoteIp The remote IP address.
- @param Syn Whether to search the listen sockets, if TRUE, the
- listen sockets are searched.
-
- @return Pointer to the related TCP_CB, if NULL no match is found.
-
-**/
-TCP_CB *
-TcpLocateTcb (
- IN TCP_PORTNO LocalPort,
- IN UINT32 LocalIp,
- IN TCP_PORTNO RemotePort,
- IN UINT32 RemoteIp,
- IN BOOLEAN Syn
- );
-
-/**
- Insert a Tcb into the proper queue.
-
- @param Tcb Pointer to the TCP_CB to be inserted.
-
- @retval 0 The Tcb is inserted successfully.
- @retval -1 Error condition occurred.
-
-**/
-INTN
-TcpInsertTcb (
- IN TCP_CB *Tcb
- );
-
-/**
- Clone a TCP_CB from Tcb.
-
- @param Tcb Pointer to the TCP_CB to be cloned.
-
- @return Pointer to the new cloned TCP_CB, if NULL error condition occurred.
-
-**/
-TCP_CB *
-TcpCloneTcb (
- IN TCP_CB *Tcb
- );
-
-/**
- Compute an ISS to be used by a new connection.
-
- @return The result ISS.
-
-**/
-TCP_SEQNO
-TcpGetIss (
- VOID
- );
-
-/**
- Initialize the Tcb local related members.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpInitTcbLocal (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Initialize the peer related members.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Seg Pointer to the segment that contains the peer's
- intial info.
- @param Opt Pointer to the options announced by the peer.
-
-**/
-VOID
-TcpInitTcbPeer (
- IN OUT TCP_CB *Tcb,
- IN TCP_SEG *Seg,
- IN TCP_OPTION *Opt
- );
-
-/**
- Get the local mss.
-
- @param Sock Pointer to the socket to get mss
-
- @return The mss size.
-
-**/
-UINT16
-TcpGetRcvMss (
- IN SOCKET *Sock
- );
-
-/**
- Set the Tcb's state.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param State The state to be set.
-
-**/
-VOID
-TcpSetState (
- IN OUT TCP_CB *Tcb,
- IN UINT8 State
- );
-
-//
-// Functions in Tcp4Output.c
-//
-/**
- Send the segment to IP via IpIo function.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Nbuf Pointer to the TCP segment to be sent.
- @param Src Source address of the TCP segment.
- @param Dest Destination address of the TCP segment.
-
- @retval 0 The segment was sent out successfully.
- @retval -1 The segment was failed to send.
-
-**/
-INTN
-TcpSendIpPacket (
- IN TCP_CB *Tcb,
- IN NET_BUF *Nbuf,
- IN UINT32 Src,
- IN UINT32 Dest
- );
-
-/**
- Check whether to send data/SYN/FIN and piggy back an ACK.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Force Whether to ignore the sender's SWS avoidance algorithm and send
- out data by force.
-
- @return The number of bytes sent.
-
-**/
-INTN
-TcpToSendData (
- IN OUT TCP_CB *Tcb,
- IN INTN Force
- );
-
-/**
- Check whether to send an ACK or delayed ACK.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpToSendAck (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Send an ACK immediately.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpSendAck (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Send a zero probe segment. It can be used by keepalive and zero window probe.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
- @retval 0 The zero probe segment was sent out successfully.
- @retval other Error condition occurred.
-
-**/
-INTN
-TcpSendZeroProbe (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Process the data and FIN flag, check whether to deliver
- data to the socket layer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
- @retval 0 No error occurred to deliver data.
- @retval -1 Error condition occurred. Proper response is to reset the
- connection.
-
-**/
-INTN
-TcpDeliverData (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Send a RESET segment in response to the segment received.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance, may be NULL.
- @param Head TCP header of the segment that triggers the reset.
- @param Len Length of the segment that triggers the reset.
- @param Local Local IP address.
- @param Remote Remote peer's IP address.
-
- @retval 0 A reset is sent or no need to send it.
- @retval -1 No reset is sent.
-
-**/
-INTN
-TcpSendReset (
- IN TCP_CB *Tcb,
- IN TCP_HEAD *Head,
- IN INT32 Len,
- IN UINT32 Local,
- IN UINT32 Remote
- );
-
-/**
- Compute the sequence space left in the old receive window.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
- @return The sequence space left in the old receive window.
-
-**/
-UINT32
-TcpRcvWinOld (
- IN TCP_CB *Tcb
- );
-
-/**
- Compute the current receive window.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
- @return The size of the current receive window, in bytes.
-
-**/
-UINT32
-TcpRcvWinNow (
- IN TCP_CB *Tcb
- );
-
-/**
- Retransmit the segment from sequence Seq.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Seq The sequence number of the segment to be retransmitted.
-
- @retval 0 Retransmission succeeded.
- @retval -1 Error condition occurred.
-
-**/
-INTN
-TcpRetransmit (
- IN TCP_CB *Tcb,
- IN TCP_SEQNO Seq
- );
-
-/**
- Compute how much data to send.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Force Whether to ignore the sender's SWS avoidance algorithm and send
- out data by force.
-
- @return The length of the data can be sent, if 0, no data can be sent.
-
-**/
-UINT32
-TcpDataToSend (
- IN TCP_CB *Tcb,
- IN INTN Force
- );
-
-/**
- Verify that the segment is in good shape.
-
- @param Nbuf Buffer that contains the segment to be checked.
-
- @retval 0 The segment is broken.
- @retval 1 The segment is in good shape.
-
-**/
-INTN
-TcpVerifySegment (
- IN NET_BUF *Nbuf
- );
-
-/**
- Verify that all the segments in SndQue are in good shape.
-
- @param Head Pointer to the head node of the SndQue.
-
- @retval 0 At least one segment is broken.
- @retval 1 All segments in the specific queue are in good shape.
-
-**/
-INTN
-TcpCheckSndQue (
- IN LIST_ENTRY *Head
- );
-
-/**
- Get a segment from the Tcb's SndQue.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Seq The sequence number of the segment.
- @param Len The maximum length of the segment.
-
- @return Pointer to the segment, if NULL some error occurred.
-
-**/
-NET_BUF *
-TcpGetSegmentSndQue (
- IN TCP_CB *Tcb,
- IN TCP_SEQNO Seq,
- IN UINT32 Len
- );
-
-/**
- Get a segment from the Tcb's socket buffer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Seq The sequence number of the segment.
- @param Len The maximum length of the segment.
-
- @return Pointer to the segment, if NULL some error occurred.
-
-**/
-NET_BUF *
-TcpGetSegmentSock (
- IN TCP_CB *Tcb,
- IN TCP_SEQNO Seq,
- IN UINT32 Len
- );
-
-/**
- Get a segment starting from sequence Seq of a maximum
- length of Len.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Seq The sequence number of the segment.
- @param Len The maximum length of the segment.
-
- @return Pointer to the segment, if NULL some error occurred.
-
-**/
-NET_BUF *
-TcpGetSegment (
- IN TCP_CB *Tcb,
- IN TCP_SEQNO Seq,
- IN UINT32 Len
- );
-
-/**
- Get the maximum SndNxt.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
- @return The sequence number of the maximum SndNxt.
-
-**/
-TCP_SEQNO
-TcpGetMaxSndNxt (
- IN TCP_CB *Tcb
- );
-
-//
-// Functions from Tcp4Input.c
-//
-/**
- Process the received ICMP error messages for TCP.
-
- @param Nbuf Buffer that contains part of the TCP segment without IP header
- truncated from the ICMP error packet.
- @param IcmpErr The ICMP error code interpreted from ICMP error packet.
- @param Src Source address of the ICMP error message.
- @param Dst Destination address of the ICMP error message.
-
-**/
-VOID
-TcpIcmpInput (
- IN NET_BUF *Nbuf,
- IN UINT8 IcmpErr,
- IN UINT32 Src,
- IN UINT32 Dst
- );
-
-/**
- Process the received TCP segments.
-
- @param Nbuf Buffer that contains received TCP segment without IP header.
- @param Src Source address of the segment, or the peer's IP address.
- @param Dst Destination address of the segment, or the local end's IP
- address.
-
- @retval 0 Segment is processed successfully. It is either accepted or
- discarded. But no connection is reset by the segment.
- @retval -1 A connection is reset by the segment.
-
-**/
-INTN
-TcpInput (
- IN NET_BUF *Nbuf,
- IN UINT32 Src,
- IN UINT32 Dst
- );
-
-/**
- Check whether the sequence number of the incoming segment is acceptable.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Seg Pointer to the incoming segment.
-
- @retval 1 The sequence number is acceptable.
- @retval 0 The sequence number is not acceptable.
-
-**/
-INTN
-TcpSeqAcceptable (
- IN TCP_CB *Tcb,
- IN TCP_SEG *Seg
- );
-
-/**
- NewReno fast recovery, RFC3782.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Seg Segment that triggers the fast recovery.
-
-**/
-VOID
-TcpFastRecover (
- IN OUT TCP_CB *Tcb,
- IN TCP_SEG *Seg
- );
-
-/**
- NewReno fast loss recovery, RFC3792.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Seg Segment that triggers the fast loss recovery.
-
-**/
-VOID
-TcpFastLossRecover (
- IN OUT TCP_CB *Tcb,
- IN TCP_SEG *Seg
- );
-
-/**
- Compute the RTT as specified in RFC2988.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Measure Currently measured RTT in heart beats.
-
-**/
-VOID
-TcpComputeRtt (
- IN OUT TCP_CB *Tcb,
- IN UINT32 Measure
- );
-
-/**
- Trim off the data outside the tcb's receive window.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Nbuf Pointer to the NET_BUF containing the received tcp segment.
-
-**/
-VOID
-TcpTrimInWnd (
- IN TCP_CB *Tcb,
- IN NET_BUF *Nbuf
- );
-
-/**
- Store the data into the reassemble queue.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Nbuf Pointer to the buffer containing the data to be queued.
-
-**/
-VOID
-TcpQueueData (
- IN OUT TCP_CB *Tcb,
- IN NET_BUF *Nbuf
- );
-
-/**
- Ajust the send queue or the retransmit queue.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Ack The acknowledge seuqence number of the received segment.
-
-**/
-VOID
-TcpAdjustSndQue (
- IN TCP_CB *Tcb,
- IN TCP_SEQNO Ack
- );
-
-//
-// Functions from Tcp4Misc.c
-//
-/**
- Compute the TCP segment's checksum.
-
- @param Nbuf Pointer to the buffer that contains the TCP
- segment.
- @param HeadSum The checksum value of the fixed part of pseudo
- header.
-
- @return The checksum value.
-
-**/
-UINT16
-TcpChecksum (
- IN NET_BUF *Nbuf,
- IN UINT16 HeadSum
- );
-
-/**
- Translate the information from the head of the received TCP
- segment Nbuf contains and fill it into a TCP_SEG structure.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Nbuf Pointer to the buffer contains the TCP segment.
-
- @return Pointer to the TCP_SEG that contains the translated TCP head information.
-
-**/
-TCP_SEG *
-TcpFormatNetbuf (
- IN TCP_CB *Tcb,
- IN OUT NET_BUF *Nbuf
- );
-
-/**
- Initialize an active connection.
-
- @param Tcb Pointer to the TCP_CB that wants to initiate a
- connection.
-
-**/
-VOID
-TcpOnAppConnect (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Application has consumed some data, check whether
- to send a window updata ack or a delayed ack.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpOnAppConsume (
- IN TCP_CB *Tcb
- );
-
-/**
- Initiate the connection close procedure, called when
- applications want to close the connection.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpOnAppClose (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Check whether the application's newly delivered data can be sent out.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
- @retval 0 Whether the data is sent out or is buffered for
- further sending.
- @retval -1 The Tcb is not in a state that data is permitted to
- be sent out.
-
-**/
-INTN
-TcpOnAppSend (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Abort the connection by sending a reset segment, called
- when the application wants to abort the connection.
-
- @param Tcb Pointer to the TCP_CB of the TCP instance.
-
-**/
-VOID
-TcpOnAppAbort (
- IN TCP_CB *Tcb
- );
-
-/**
- Reset the connection related with Tcb.
-
- @param Tcb Pointer to the TCP_CB of the connection to be
- reset.
-
-**/
-VOID
-TcpResetConnection (
- IN TCP_CB *Tcb
- );
-
-//
-// Functions in Tcp4Timer.c
-//
-/**
- Close the TCP connection.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpClose (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Heart beat timer handler, queues the DPC at TPL_CALLBACK.
-
- @param Event Timer event signaled, ignored.
- @param Context Context of the timer event, ignored.
-
-**/
-VOID
-EFIAPI
-TcpTicking (
- IN EFI_EVENT Event,
- IN VOID *Context
- );
-
-/**
- Enable a TCP timer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Timer The index of the timer to be enabled.
- @param TimeOut The timeout value of this timer.
-
-**/
-VOID
-TcpSetTimer (
- IN OUT TCP_CB *Tcb,
- IN UINT16 Timer,
- IN UINT32 TimeOut
- );
-
-/**
- Clear one TCP timer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Timer The index of the timer to be cleared.
-
-**/
-VOID
-TcpClearTimer (
- IN OUT TCP_CB *Tcb,
- IN UINT16 Timer
- );
-
-/**
- Clear all TCP timers.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpClearAllTimer (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Enable the window prober timer and set the timeout value.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpSetProbeTimer (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Enable the keepalive timer and set the timeout value.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpSetKeepaliveTimer (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Backoff the RTO.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpBackoffRto (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Install the device path protocol on the TCP instance.
-
- @param Sock Pointer to the socket representing the TCP instance.
-
- @retval EFI_SUCCESS The device path protocol is installed.
- @retval other Failed to install the device path protocol.
-
-**/
-EFI_STATUS
-TcpInstallDevicePath (
- IN SOCKET *Sock
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c
deleted file mode 100644
index f48efdac7c..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c
+++ /dev/null
@@ -1,1497 +0,0 @@
-/** @file
- TCP input process routines.
-
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-
-#include "Tcp4Main.h"
-
-
-/**
- Check whether the sequence number of the incoming segment is acceptable.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Seg Pointer to the incoming segment.
-
- @retval 1 The sequence number is acceptable.
- @retval 0 The sequence number is not acceptable.
-
-**/
-INTN
-TcpSeqAcceptable (
- IN TCP_CB *Tcb,
- IN TCP_SEG *Seg
- )
-{
- return (TCP_SEQ_LEQ (Tcb->RcvNxt, Seg->End) &&
- TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2 + Tcb->RcvWnd));
-}
-
-
-/**
- NewReno fast recovery, RFC3782.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Seg Segment that triggers the fast recovery.
-
-**/
-VOID
-TcpFastRecover (
- IN OUT TCP_CB *Tcb,
- IN TCP_SEG *Seg
- )
-{
- UINT32 FlightSize;
- UINT32 Acked;
-
- //
- // Step 1: Three duplicate ACKs and not in fast recovery
- //
- if (Tcb->CongestState != TCP_CONGEST_RECOVER) {
-
- //
- // Step 1A: Invoking fast retransmission.
- //
- FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna);
-
- Tcb->Ssthresh = MAX (FlightSize >> 1, (UINT32) (2 * Tcb->SndMss));
- Tcb->Recover = Tcb->SndNxt;
-
- Tcb->CongestState = TCP_CONGEST_RECOVER;
- TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);
-
- //
- // Step 2: Entering fast retransmission
- //
- TcpRetransmit (Tcb, Tcb->SndUna);
- Tcb->CWnd = Tcb->Ssthresh + 3 * Tcb->SndMss;
-
- DEBUG ((EFI_D_NET, "TcpFastRecover: enter fast retransmission"
- " for TCB %p, recover point is %d\n", Tcb, Tcb->Recover));
- return;
- }
-
- //
- // During fast recovery, execute Step 3, 4, 5 of RFC3782
- //
- if (Seg->Ack == Tcb->SndUna) {
-
- //
- // Step 3: Fast Recovery,
- // If this is a duplicated ACK, increse Cwnd by SMSS.
- //
-
- // Step 4 is skipped here only to be executed later
- // by TcpToSendData
- //
- Tcb->CWnd += Tcb->SndMss;
- DEBUG ((EFI_D_NET, "TcpFastRecover: received another"
- " duplicated ACK (%d) for TCB %p\n", Seg->Ack, Tcb));
-
- } else {
-
- //
- // New data is ACKed, check whether it is a
- // full ACK or partial ACK
- //
- if (TCP_SEQ_GEQ (Seg->Ack, Tcb->Recover)) {
-
- //
- // Step 5 - Full ACK:
- // deflate the congestion window, and exit fast recovery
- //
- FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna);
-
- Tcb->CWnd = MIN (Tcb->Ssthresh, FlightSize + Tcb->SndMss);
-
- Tcb->CongestState = TCP_CONGEST_OPEN;
- DEBUG ((EFI_D_NET, "TcpFastRecover: received a full ACK(%d)"
- " for TCB %p, exit fast recovery\n", Seg->Ack, Tcb));
-
- } else {
-
- //
- // Step 5 - Partial ACK:
- // fast retransmit the first unacknowledge field
- // , then deflate the CWnd
- //
- TcpRetransmit (Tcb, Seg->Ack);
- Acked = TCP_SUB_SEQ (Seg->Ack, Tcb->SndUna);
-
- //
- // Deflate the CWnd by the amount of new data
- // ACKed by SEG.ACK. If more than one SMSS data
- // is ACKed, add back SMSS byte to CWnd after
- //
- if (Acked >= Tcb->SndMss) {
- Acked -= Tcb->SndMss;
-
- }
-
- Tcb->CWnd -= Acked;
-
- DEBUG ((EFI_D_NET, "TcpFastRecover: received a partial"
- " ACK(%d) for TCB %p\n", Seg->Ack, Tcb));
-
- }
- }
-}
-
-
-/**
- NewReno fast loss recovery, RFC3792.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Seg Segment that triggers the fast loss recovery.
-
-**/
-VOID
-TcpFastLossRecover (
- IN OUT TCP_CB *Tcb,
- IN TCP_SEG *Seg
- )
-{
- if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) {
-
- //
- // New data is ACKed, check whether it is a
- // full ACK or partial ACK
- //
- if (TCP_SEQ_GEQ (Seg->Ack, Tcb->LossRecover)) {
-
- //
- // Full ACK: exit the loss recovery.
- //
- Tcb->LossTimes = 0;
- Tcb->CongestState = TCP_CONGEST_OPEN;
-
- DEBUG ((EFI_D_NET, "TcpFastLossRecover: received a "
- "full ACK(%d) for TCB %p\n", Seg->Ack, Tcb));
-
- } else {
-
- //
- // Partial ACK:
- // fast retransmit the first unacknowledge field.
- //
- TcpRetransmit (Tcb, Seg->Ack);
- DEBUG ((EFI_D_NET, "TcpFastLossRecover: received a "
- "partial ACK(%d) for TCB %p\n", Seg->Ack, Tcb));
- }
- }
-}
-
-
-/**
- Compute the RTT as specified in RFC2988.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Measure Currently measured RTT in heart beats.
-
-**/
-VOID
-TcpComputeRtt (
- IN OUT TCP_CB *Tcb,
- IN UINT32 Measure
- )
-{
- INT32 Var;
-
- //
- // Step 2.3: Compute the RTO for subsequent RTT measurement.
- //
- if (Tcb->SRtt != 0) {
-
- Var = Tcb->SRtt - (Measure << TCP_RTT_SHIFT);
-
- if (Var < 0) {
- Var = -Var;
- }
-
- Tcb->RttVar = (3 * Tcb->RttVar + Var) >> 2;
- Tcb->SRtt = 7 * (Tcb->SRtt >> 3) + Measure;
-
- } else {
- //
- // Step 2.2: compute the first RTT measure
- //
- Tcb->SRtt = Measure << TCP_RTT_SHIFT;
- Tcb->RttVar = Measure << (TCP_RTT_SHIFT - 1);
- }
-
- Tcb->Rto = (Tcb->SRtt + MAX (8, 4 * Tcb->RttVar)) >> TCP_RTT_SHIFT;
-
- //
- // Step 2.4: Limit the RTO to at least 1 second
- // Step 2.5: Limit the RTO to a maxium value that
- // is at least 60 second
- //
- if (Tcb->Rto < TCP_RTO_MIN) {
- Tcb->Rto = TCP_RTO_MIN;
-
- } else if (Tcb->Rto > TCP_RTO_MAX) {
- Tcb->Rto = TCP_RTO_MAX;
-
- }
-
- DEBUG ((EFI_D_NET, "TcpComputeRtt: new RTT for TCB %p"
- " computed SRTT: %d RTTVAR: %d RTO: %d\n",
- Tcb, Tcb->SRtt, Tcb->RttVar, Tcb->Rto));
-
-}
-
-
-/**
- Trim the data, SYN and FIN to fit into the window defined by Left and Right.
-
- @param Nbuf Buffer that contains received TCP segment without IP header.
- @param Left The sequence number of the window's left edge.
- @param Right The sequence number of the window's right edge.
-
-**/
-VOID
-TcpTrimSegment (
- IN NET_BUF *Nbuf,
- IN TCP_SEQNO Left,
- IN TCP_SEQNO Right
- )
-{
- TCP_SEG *Seg;
- TCP_SEQNO Urg;
- UINT32 Drop;
-
- Seg = TCPSEG_NETBUF (Nbuf);
-
- //
- // If the segment is completely out of window,
- // truncate every thing, include SYN and FIN.
- //
- if (TCP_SEQ_LEQ (Seg->End, Left) || TCP_SEQ_LEQ (Right, Seg->Seq)) {
-
- TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_SYN);
- TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_FIN);
-
- Seg->Seq = Seg->End;
- NetbufTrim (Nbuf, Nbuf->TotalSize, NET_BUF_HEAD);
- return;
- }
-
- //
- // Adjust the buffer header
- //
- if (TCP_SEQ_LT (Seg->Seq, Left)) {
-
- Drop = TCP_SUB_SEQ (Left, Seg->Seq);
- Urg = Seg->Seq + Seg->Urg;
- Seg->Seq = Left;
-
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) {
- TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_SYN);
- Drop--;
- }
-
- //
- // Adjust the urgent point
- //
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_URG)) {
-
- if (TCP_SEQ_LT (Urg, Seg->Seq)) {
-
- TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_URG);
- } else {
- Seg->Urg = (UINT16) TCP_SUB_SEQ (Urg, Seg->Seq);
- }
- }
-
- if (Drop != 0) {
- NetbufTrim (Nbuf, Drop, NET_BUF_HEAD);
- }
- }
-
- //
- // Adjust the buffer tail
- //
- if (TCP_SEQ_GT (Seg->End, Right)) {
-
- Drop = TCP_SUB_SEQ (Seg->End, Right);
- Seg->End = Right;
-
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) {
- TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_FIN);
- Drop--;
- }
-
- if (Drop != 0) {
- NetbufTrim (Nbuf, Drop, NET_BUF_TAIL);
- }
- }
-
- ASSERT (TcpVerifySegment (Nbuf) != 0);
-}
-
-
-/**
- Trim off the data outside the tcb's receive window.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Nbuf Pointer to the NET_BUF containing the received tcp segment.
-
-**/
-VOID
-TcpTrimInWnd (
- IN TCP_CB *Tcb,
- IN NET_BUF *Nbuf
- )
-{
- TcpTrimSegment (Nbuf, Tcb->RcvNxt, Tcb->RcvWl2 + Tcb->RcvWnd);
-}
-
-
-/**
- Process the data and FIN flag, check whether to deliver
- data to the socket layer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
- @retval 0 No error occurred to deliver data.
- @retval -1 Error condition occurred. Proper response is to reset the
- connection.
-
-**/
-INTN
-TcpDeliverData (
- IN OUT TCP_CB *Tcb
- )
-{
- LIST_ENTRY *Entry;
- NET_BUF *Nbuf;
- TCP_SEQNO Seq;
- TCP_SEG *Seg;
- UINT32 Urgent;
-
- ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL));
-
- //
- // make sure there is some data queued,
- // and TCP is in a proper state
- //
- if (IsListEmpty (&Tcb->RcvQue) || !TCP_CONNECTED (Tcb->State)) {
-
- return 0;
- }
-
- //
- // Deliver data to the socket layer
- //
- Entry = Tcb->RcvQue.ForwardLink;
- Seq = Tcb->RcvNxt;
-
- while (Entry != &Tcb->RcvQue) {
- Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List);
- Seg = TCPSEG_NETBUF (Nbuf);
-
- ASSERT (TcpVerifySegment (Nbuf) != 0);
- ASSERT (Nbuf->Tcp == NULL);
-
- if (TCP_SEQ_GT (Seg->Seq, Seq)) {
- break;
- }
-
- Entry = Entry->ForwardLink;
- Seq = Seg->End;
- Tcb->RcvNxt = Seq;
-
- RemoveEntryList (&Nbuf->List);
-
- //
- // RFC793 Eighth step: process FIN in sequence
- //
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) {
-
- //
- // The peer sends to us junky data after FIN,
- // reset the connection.
- //
- if (!IsListEmpty (&Tcb->RcvQue)) {
- DEBUG ((EFI_D_ERROR, "TcpDeliverData: data received after"
- " FIN from peer of TCB %p, reset connection\n", Tcb));
-
- NetbufFree (Nbuf);
- return -1;
- }
-
- DEBUG ((EFI_D_NET, "TcpDeliverData: processing FIN "
- "from peer of TCB %p\n", Tcb));
-
- switch (Tcb->State) {
- case TCP_SYN_RCVD:
- case TCP_ESTABLISHED:
-
- TcpSetState (Tcb, TCP_CLOSE_WAIT);
- break;
-
- case TCP_FIN_WAIT_1:
-
- if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) {
-
- TcpSetState (Tcb, TCP_CLOSING);
- break;
- }
-
- //
- // fall through
- //
- case TCP_FIN_WAIT_2:
-
- TcpSetState (Tcb, TCP_TIME_WAIT);
- TcpClearAllTimer (Tcb);
-
- if (Tcb->TimeWaitTimeout != 0) {
-
- TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout);
- } else {
-
- DEBUG ((EFI_D_WARN, "Connection closed immediately "
- "because app disables TIME_WAIT timer for %p\n", Tcb));
-
- TcpSendAck (Tcb);
- TcpClose (Tcb);
- }
- break;
-
- case TCP_CLOSE_WAIT:
- case TCP_CLOSING:
- case TCP_LAST_ACK:
- case TCP_TIME_WAIT:
- //
- // The peer sends to us junk FIN byte. Discard
- // the buffer then reset the connection
- //
- NetbufFree (Nbuf);
- return -1;
- default:
- break;
- }
-
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
-
- Seg->End--;
- }
-
- //
- // Don't delay the ack if PUSH flag is on.
- //
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_PSH)) {
-
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
- }
-
- if (Nbuf->TotalSize != 0) {
- Urgent = 0;
-
- if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG) &&
- TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvUp)) {
-
- if (TCP_SEQ_LEQ (Seg->End, Tcb->RcvUp)) {
- Urgent = Nbuf->TotalSize;
- } else {
- Urgent = TCP_SUB_SEQ (Tcb->RcvUp, Seg->Seq) + 1;
- }
- }
-
- SockDataRcvd (Tcb->Sk, Nbuf, Urgent);
- }
-
- if (TCP_FIN_RCVD (Tcb->State)) {
-
- SockNoMoreData (Tcb->Sk);
- }
-
- NetbufFree (Nbuf);
- }
-
- return 0;
-}
-
-
-/**
- Store the data into the reassemble queue.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Nbuf Pointer to the buffer containing the data to be queued.
-
-**/
-VOID
-TcpQueueData (
- IN OUT TCP_CB *Tcb,
- IN NET_BUF *Nbuf
- )
-{
- TCP_SEG *Seg;
- LIST_ENTRY *Head;
- LIST_ENTRY *Prev;
- LIST_ENTRY *Cur;
- NET_BUF *Node;
-
- ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL));
-
- NET_GET_REF (Nbuf);
-
- Seg = TCPSEG_NETBUF (Nbuf);
- Head = &Tcb->RcvQue;
-
- //
- // Fast path to process normal case. That is,
- // no out-of-order segments are received.
- //
- if (IsListEmpty (Head)) {
-
- InsertTailList (Head, &Nbuf->List);
- return;
- }
-
- //
- // Find the point to insert the buffer
- //
- for (Prev = Head, Cur = Head->ForwardLink;
- Cur != Head;
- Prev = Cur, Cur = Cur->ForwardLink) {
-
- Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List);
-
- if (TCP_SEQ_LT (Seg->Seq, TCPSEG_NETBUF (Node)->Seq)) {
- break;
- }
- }
-
- //
- // Check whether the current segment overlaps with the
- // previous segment.
- //
- if (Prev != Head) {
- Node = NET_LIST_USER_STRUCT (Prev, NET_BUF, List);
-
- if (TCP_SEQ_LT (Seg->Seq, TCPSEG_NETBUF (Node)->End)) {
-
- if (TCP_SEQ_LEQ (Seg->End, TCPSEG_NETBUF (Node)->End)) {
-
- NetbufFree (Nbuf);
- return;
- }
-
- TcpTrimSegment (Nbuf, TCPSEG_NETBUF (Node)->End, Seg->End);
- }
- }
-
- InsertHeadList (Prev, &Nbuf->List);
-
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
-
- //
- // Check the segments after the insert point.
- //
- while (Cur != Head) {
- Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List);
-
- if (TCP_SEQ_LEQ (TCPSEG_NETBUF (Node)->End, Seg->End)) {
-
- Cur = Cur->ForwardLink;
-
- RemoveEntryList (&Node->List);
- NetbufFree (Node);
- continue;
- }
-
- if (TCP_SEQ_LT (TCPSEG_NETBUF (Node)->Seq, Seg->End)) {
-
- if (TCP_SEQ_LEQ (TCPSEG_NETBUF (Node)->Seq, Seg->Seq)) {
-
- RemoveEntryList (&Nbuf->List);
- NetbufFree (Nbuf);
- return ;
- }
-
- TcpTrimSegment (Nbuf, Seg->Seq, TCPSEG_NETBUF (Node)->Seq);
- break;
- }
-
- Cur = Cur->ForwardLink;
- }
-}
-
-
-/**
- Ajust the send queue or the retransmit queue.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Ack The acknowledge seuqence number of the received segment.
-
-**/
-VOID
-TcpAdjustSndQue (
- IN TCP_CB *Tcb,
- IN TCP_SEQNO Ack
- )
-{
- LIST_ENTRY *Head;
- LIST_ENTRY *Cur;
- NET_BUF *Node;
- TCP_SEG *Seg;
-
- Head = &Tcb->SndQue;
- Cur = Head->ForwardLink;
-
- while (Cur != Head) {
- Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List);
- Seg = TCPSEG_NETBUF (Node);
-
- if (TCP_SEQ_GEQ (Seg->Seq, Ack)) {
- break;
- }
-
- //
- // Remove completely ACKed segments
- //
- if (TCP_SEQ_LEQ (Seg->End, Ack)) {
- Cur = Cur->ForwardLink;
-
- RemoveEntryList (&Node->List);
- NetbufFree (Node);
- continue;
- }
-
- TcpTrimSegment (Node, Ack, Seg->End);
- break;
- }
-}
-
-
-/**
- Process the received TCP segments.
-
- @param Nbuf Buffer that contains received TCP segment without IP header.
- @param Src Source address of the segment, or the peer's IP address.
- @param Dst Destination address of the segment, or the local end's IP
- address.
-
- @retval 0 Segment is processed successfully. It is either accepted or
- discarded. But no connection is reset by the segment.
- @retval -1 A connection is reset by the segment.
-
-**/
-INTN
-TcpInput (
- IN NET_BUF *Nbuf,
- IN UINT32 Src,
- IN UINT32 Dst
- )
-{
- TCP_CB *Tcb;
- TCP_CB *Parent;
- TCP_OPTION Option;
- TCP_HEAD *Head;
- INT32 Len;
- TCP_SEG *Seg;
- TCP_SEQNO Right;
- TCP_SEQNO Urg;
- INT32 Usable;
-
- NET_CHECK_SIGNATURE (Nbuf, NET_BUF_SIGNATURE);
-
- Parent = NULL;
- Tcb = NULL;
-
- Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL);
- ASSERT (Head != NULL);
-
- if (Nbuf->TotalSize < sizeof (TCP_HEAD)) {
- DEBUG ((EFI_D_NET, "TcpInput: received a malformed packet\n"));
- goto DISCARD;
- }
-
- Len = Nbuf->TotalSize - (Head->HeadLen << 2);
-
- if ((Head->HeadLen < 5) || (Len < 0) ||
- (TcpChecksum (Nbuf, NetPseudoHeadChecksum (Src, Dst, 6, 0)) != 0)) {
-
- DEBUG ((EFI_D_NET, "TcpInput: received a malformed packet\n"));
- goto DISCARD;
- }
-
- if (TCP_FLG_ON (Head->Flag, TCP_FLG_SYN)) {
- Len++;
- }
-
- if (TCP_FLG_ON (Head->Flag, TCP_FLG_FIN)) {
- Len++;
- }
-
- Tcb = TcpLocateTcb (
- Head->DstPort,
- Dst,
- Head->SrcPort,
- Src,
- (BOOLEAN) TCP_FLG_ON (Head->Flag, TCP_FLG_SYN)
- );
-
- if ((Tcb == NULL) || (Tcb->State == TCP_CLOSED)) {
- DEBUG ((EFI_D_NET, "TcpInput: send reset because no TCB found\n"));
-
- Tcb = NULL;
- goto SEND_RESET;
- }
-
- Seg = TcpFormatNetbuf (Tcb, Nbuf);
-
- //
- // RFC1122 recommended reaction to illegal option
- // (in fact, an illegal option length) is reset.
- //
- if (TcpParseOption (Nbuf->Tcp, &Option) == -1) {
- DEBUG ((EFI_D_ERROR, "TcpInput: reset the peer because"
- " of malformed option for TCB %p\n", Tcb));
-
- goto SEND_RESET;
- }
-
- //
- // From now on, the segment is headless
- //
- NetbufTrim (Nbuf, (Head->HeadLen << 2), NET_BUF_HEAD);
- Nbuf->Tcp = NULL;
-
- //
- // Process the segment in LISTEN state.
- //
- if (Tcb->State == TCP_LISTEN) {
- //
- // First step: Check RST
- //
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) {
- DEBUG ((EFI_D_WARN, "TcpInput: discard a reset segment "
- "for TCB %p in listening\n", Tcb));
-
- goto DISCARD;
- }
-
- //
- // Second step: Check ACK.
- // Any ACK sent to TCP in LISTEN is reseted.
- //
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) {
- DEBUG ((EFI_D_WARN, "TcpInput: send reset because of"
- " segment with ACK for TCB %p in listening\n", Tcb));
-
- goto SEND_RESET;
- }
-
- //
- // Third step: Check SYN
- //
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) {
- //
- // create a child TCB to handle the data
- //
- Parent = Tcb;
-
- Tcb = TcpCloneTcb (Parent);
- if (Tcb == NULL) {
- DEBUG ((EFI_D_ERROR, "TcpInput: discard a segment because"
- " failed to clone a child for TCB %p\n", Tcb));
-
- goto DISCARD;
- }
-
- DEBUG ((EFI_D_NET, "TcpInput: create a child for TCB %p"
- " in listening\n", Tcb));
-
- //
- // init the TCB structure
- //
- Tcb->LocalEnd.Ip = Dst;
- Tcb->LocalEnd.Port = Head->DstPort;
- Tcb->RemoteEnd.Ip = Src;
- Tcb->RemoteEnd.Port = Head->SrcPort;
-
- TcpInitTcbLocal (Tcb);
- TcpInitTcbPeer (Tcb, Seg, &Option);
-
- TcpSetState (Tcb, TCP_SYN_RCVD);
- TcpSetTimer (Tcb, TCP_TIMER_CONNECT, Tcb->ConnectTimeout);
- TcpTrimInWnd (Tcb, Nbuf);
-
- goto StepSix;
- }
-
- goto DISCARD;
-
- } else if (Tcb->State == TCP_SYN_SENT) {
- //
- // First step: Check ACK bit
- //
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK) && (Seg->Ack != Tcb->Iss + 1)) {
-
- DEBUG ((EFI_D_WARN, "TcpInput: send reset because of "
- "wrong ACK received for TCB %p in SYN_SENT\n", Tcb));
-
- goto SEND_RESET;
- }
-
- //
- // Second step: Check RST bit
- //
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) {
-
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) {
-
- DEBUG ((EFI_D_WARN, "TcpInput: connection reset by"
- " peer for TCB %p in SYN_SENT\n", Tcb));
-
- SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET);
- goto DROP_CONNECTION;
- } else {
-
- DEBUG ((EFI_D_WARN, "TcpInput: discard a reset segment "
- "because of no ACK for TCB %p in SYN_SENT\n", Tcb));
-
- goto DISCARD;
- }
- }
-
- //
- // Third step: Check security and precedence. Skipped
- //
-
- //
- // Fourth step: Check SYN. Pay attention to simultaneous open
- //
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) {
-
- TcpInitTcbPeer (Tcb, Seg, &Option);
-
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) {
-
- Tcb->SndUna = Seg->Ack;
- }
-
- TcpClearTimer (Tcb, TCP_TIMER_REXMIT);
-
- if (TCP_SEQ_GT (Tcb->SndUna, Tcb->Iss)) {
-
- TcpSetState (Tcb, TCP_ESTABLISHED);
-
- TcpClearTimer (Tcb, TCP_TIMER_CONNECT);
- TcpDeliverData (Tcb);
-
- if ((Tcb->CongestState == TCP_CONGEST_OPEN) &&
- TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) {
-
- TcpComputeRtt (Tcb, Tcb->RttMeasure);
- TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);
- }
-
- TcpTrimInWnd (Tcb, Nbuf);
-
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
-
- DEBUG ((EFI_D_NET, "TcpInput: connection established"
- " for TCB %p in SYN_SENT\n", Tcb));
-
- goto StepSix;
- } else {
- //
- // Received a SYN segment without ACK, simultaneous open.
- //
- TcpSetState (Tcb, TCP_SYN_RCVD);
-
- ASSERT (Tcb->SndNxt == Tcb->Iss + 1);
- TcpAdjustSndQue (Tcb, Tcb->SndNxt);
-
- TcpTrimInWnd (Tcb, Nbuf);
-
- DEBUG ((EFI_D_WARN, "TcpInput: simultaneous open "
- "for TCB %p in SYN_SENT\n", Tcb));
-
- goto StepSix;
- }
- }
-
- goto DISCARD;
- }
-
- //
- // Process segment in SYN_RCVD or TCP_CONNECTED states
- //
-
- //
- // Clear probe timer since the RecvWindow is opened.
- //
- if (Tcb->ProbeTimerOn && (Seg->Wnd != 0)) {
- TcpClearTimer (Tcb, TCP_TIMER_PROBE);
- Tcb->ProbeTimerOn = FALSE;
- }
-
- //
- // First step: Check whether SEG.SEQ is acceptable
- //
- if (TcpSeqAcceptable (Tcb, Seg) == 0) {
- DEBUG ((EFI_D_WARN, "TcpInput: sequence acceptance"
- " test failed for segment of TCB %p\n", Tcb));
-
- if (!TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) {
- TcpSendAck (Tcb);
- }
-
- goto DISCARD;
- }
-
- if ((TCP_SEQ_LT (Seg->Seq, Tcb->RcvWl2)) &&
- (Tcb->RcvWl2 == Seg->End) &&
- !TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN | TCP_FLG_FIN)) {
-
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
- }
-
- //
- // Second step: Check the RST
- //
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_RST)) {
-
- DEBUG ((EFI_D_WARN, "TcpInput: connection reset for TCB %p\n", Tcb));
-
- if (Tcb->State == TCP_SYN_RCVD) {
-
- SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_REFUSED);
-
- //
- // This TCB comes from either a LISTEN TCB,
- // or active open TCB with simultanous open.
- // Do NOT signal user CONNECTION refused
- // if it comes from a LISTEN TCB.
- //
- } else if ((Tcb->State == TCP_ESTABLISHED) ||
- (Tcb->State == TCP_FIN_WAIT_1) ||
- (Tcb->State == TCP_FIN_WAIT_2) ||
- (Tcb->State == TCP_CLOSE_WAIT)) {
-
- SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET);
-
- } else {
-
- }
-
- goto DROP_CONNECTION;
- }
-
- //
- // Trim the data and flags.
- //
- TcpTrimInWnd (Tcb, Nbuf);
-
- //
- // Third step: Check security and precedence, Ignored
- //
-
- //
- // Fourth step: Check the SYN bit.
- //
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) {
-
- DEBUG ((EFI_D_WARN, "TcpInput: connection reset "
- "because received extra SYN for TCB %p\n", Tcb));
-
- SOCK_ERROR (Tcb->Sk, EFI_CONNECTION_RESET);
- goto RESET_THEN_DROP;
- }
-
- //
- // Fifth step: Check the ACK
- //
- if (!TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) {
- DEBUG ((EFI_D_WARN, "TcpInput: segment discard because"
- " of no ACK for connected TCB %p\n", Tcb));
-
- goto DISCARD;
-
- }
-
- if (Tcb->State == TCP_SYN_RCVD) {
-
- if (TCP_SEQ_LT (Tcb->SndUna, Seg->Ack) &&
- TCP_SEQ_LEQ (Seg->Ack, Tcb->SndNxt)) {
-
- Tcb->SndWnd = Seg->Wnd;
- Tcb->SndWndMax = MAX (Tcb->SndWnd, Tcb->SndWndMax);
- Tcb->SndWl1 = Seg->Seq;
- Tcb->SndWl2 = Seg->Ack;
- TcpSetState (Tcb, TCP_ESTABLISHED);
-
- TcpClearTimer (Tcb, TCP_TIMER_CONNECT);
- TcpDeliverData (Tcb);
-
- DEBUG ((EFI_D_NET, "TcpInput: connection established "
- " for TCB %p in SYN_RCVD\n", Tcb));
-
- //
- // Continue the process as ESTABLISHED state
- //
- } else {
- DEBUG ((EFI_D_WARN, "TcpInput: send reset because of"
- " wrong ACK for TCB %p in SYN_RCVD\n", Tcb));
-
- goto SEND_RESET;
- }
- }
-
- if (TCP_SEQ_LT (Seg->Ack, Tcb->SndUna)) {
-
- DEBUG ((EFI_D_WARN, "TcpInput: ignore the out-of-data"
- " ACK for connected TCB %p\n", Tcb));
-
- goto StepSix;
-
- } else if (TCP_SEQ_GT (Seg->Ack, Tcb->SndNxt)) {
-
- DEBUG ((EFI_D_WARN, "TcpInput: discard segment for "
- "future ACK for connected TCB %p\n", Tcb));
-
- TcpSendAck (Tcb);
- goto DISCARD;
- }
-
- //
- // From now on: SND.UNA <= SEG.ACK <= SND.NXT.
- //
- if (TCP_FLG_ON (Option.Flag, TCP_OPTION_RCVD_TS)) {
- //
- // update TsRecent as specified in page 16 RFC1323.
- // RcvWl2 equals to the variable "LastAckSent"
- // defined there.
- //
- if (TCP_SEQ_LEQ (Seg->Seq, Tcb->RcvWl2) &&
- TCP_SEQ_LT (Tcb->RcvWl2, Seg->End)) {
-
- Tcb->TsRecent = Option.TSVal;
- Tcb->TsRecentAge = mTcpTick;
- }
-
- TcpComputeRtt (Tcb, TCP_SUB_TIME (mTcpTick, Option.TSEcr));
-
- } else if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) {
-
- ASSERT (Tcb->CongestState == TCP_CONGEST_OPEN);
-
- TcpComputeRtt (Tcb, Tcb->RttMeasure);
- TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);
- }
-
- if (Seg->Ack == Tcb->SndNxt) {
-
- TcpClearTimer (Tcb, TCP_TIMER_REXMIT);
- } else {
-
- TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto);
- }
-
- //
- // Count duplicate acks.
- //
- if ((Seg->Ack == Tcb->SndUna) &&
- (Tcb->SndUna != Tcb->SndNxt) &&
- (Seg->Wnd == Tcb->SndWnd) &&
- (0 == Len)) {
-
- Tcb->DupAck++;
- } else {
-
- Tcb->DupAck = 0;
- }
-
- //
- // Congestion avoidance, fast recovery and fast retransmission.
- //
- if (((Tcb->CongestState == TCP_CONGEST_OPEN) && (Tcb->DupAck < 3)) ||
- (Tcb->CongestState == TCP_CONGEST_LOSS)) {
-
- if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) {
-
- if (Tcb->CWnd < Tcb->Ssthresh) {
-
- Tcb->CWnd += Tcb->SndMss;
- } else {
-
- Tcb->CWnd += MAX (Tcb->SndMss * Tcb->SndMss / Tcb->CWnd, 1);
- }
-
- Tcb->CWnd = MIN (Tcb->CWnd, TCP_MAX_WIN << Tcb->SndWndScale);
- }
-
- if (Tcb->CongestState == TCP_CONGEST_LOSS) {
- TcpFastLossRecover (Tcb, Seg);
- }
- } else {
-
- TcpFastRecover (Tcb, Seg);
- }
-
- if (TCP_SEQ_GT (Seg->Ack, Tcb->SndUna)) {
-
- TcpAdjustSndQue (Tcb, Seg->Ack);
- Tcb->SndUna = Seg->Ack;
-
- if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_URG) &&
- TCP_SEQ_LT (Tcb->SndUp, Seg->Ack)) {
-
- TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_URG);
- }
- }
-
- //
- // Update window info
- //
- if (TCP_SEQ_LT (Tcb->SndWl1, Seg->Seq) ||
- ((Tcb->SndWl1 == Seg->Seq) && TCP_SEQ_LEQ (Tcb->SndWl2, Seg->Ack))) {
-
- Right = Seg->Ack + Seg->Wnd;
-
- if (TCP_SEQ_LT (Right, Tcb->SndWl2 + Tcb->SndWnd)) {
-
- if ((Tcb->SndWl1 == Seg->Seq) &&
- (Tcb->SndWl2 == Seg->Ack) &&
- (Len == 0)) {
-
- goto NO_UPDATE;
- }
-
- DEBUG ((EFI_D_WARN, "TcpInput: peer shrinks the"
- " window for connected TCB %p\n", Tcb));
-
- if ((Tcb->CongestState == TCP_CONGEST_RECOVER) &&
- (TCP_SEQ_LT (Right, Tcb->Recover))) {
-
- Tcb->Recover = Right;
- }
-
- if ((Tcb->CongestState == TCP_CONGEST_LOSS) &&
- (TCP_SEQ_LT (Right, Tcb->LossRecover))) {
-
- Tcb->LossRecover = Right;
- }
-
- if (TCP_SEQ_LT (Right, Tcb->SndNxt)) {
- //
- // Check for Window Retraction in RFC7923 section 2.4.
- // The lower n bits of the peer's actual receive window is wiped out if TCP
- // window scale is enabled, it will look like the peer is shrinking the window.
- // Check whether the SndNxt is out of the advertised receive window by more than
- // 2^Rcv.Wind.Shift before moving the SndNxt to the left.
- //
- DEBUG (
- (EFI_D_WARN,
- "TcpInput: peer advise negative useable window for connected TCB %p\n",
- Tcb)
- );
- Usable = TCP_SUB_SEQ (Tcb->SndNxt, Right);
- if ((Usable >> Tcb->SndWndScale) > 0) {
- DEBUG (
- (EFI_D_WARN,
- "TcpInput: SndNxt is out of window by more than window scale for TCB %p\n",
- Tcb)
- );
- Tcb->SndNxt = Right;
- }
- if (Right == Tcb->SndUna) {
-
- TcpClearTimer (Tcb, TCP_TIMER_REXMIT);
- TcpSetProbeTimer (Tcb);
- }
- }
- }
-
- Tcb->SndWnd = Seg->Wnd;
- Tcb->SndWndMax = MAX (Tcb->SndWnd, Tcb->SndWndMax);
- Tcb->SndWl1 = Seg->Seq;
- Tcb->SndWl2 = Seg->Ack;
- }
-
-NO_UPDATE:
-
- if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT) &&
- (Tcb->SndUna == Tcb->SndNxt)) {
-
- DEBUG ((EFI_D_NET, "TcpInput: local FIN is ACKed by"
- " peer for connected TCB %p\n", Tcb));
-
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED);
- }
-
- //
- // Transit the state if proper.
- //
- switch (Tcb->State) {
- case TCP_FIN_WAIT_1:
-
- if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) {
-
- TcpSetState (Tcb, TCP_FIN_WAIT_2);
-
- TcpClearAllTimer (Tcb);
- TcpSetTimer (Tcb, TCP_TIMER_FINWAIT2, Tcb->FinWait2Timeout);
- }
-
- case TCP_FIN_WAIT_2:
-
- break;
-
- case TCP_CLOSE_WAIT:
- break;
-
- case TCP_CLOSING:
-
- if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) {
-
- TcpSetState (Tcb, TCP_TIME_WAIT);
-
- TcpClearAllTimer (Tcb);
-
- if (Tcb->TimeWaitTimeout != 0) {
-
- TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout);
- } else {
-
- DEBUG ((EFI_D_WARN, "Connection closed immediately "
- "because app disables TIME_WAIT timer for %p\n", Tcb));
-
- TcpClose (Tcb);
- }
- }
- break;
-
- case TCP_LAST_ACK:
-
- if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_ACKED)) {
-
- TcpSetState (Tcb, TCP_CLOSED);
- }
-
- break;
-
- case TCP_TIME_WAIT:
-
- TcpSendAck (Tcb);
-
- if (Tcb->TimeWaitTimeout != 0) {
-
- TcpSetTimer (Tcb, TCP_TIMER_2MSL, Tcb->TimeWaitTimeout);
- } else {
-
- DEBUG ((EFI_D_WARN, "Connection closed immediately "
- "because app disables TIME_WAIT timer for %p\n", Tcb));
-
- TcpClose (Tcb);
- }
- break;
-
- default:
- break;
- }
-
- //
- // Sixth step: Check the URG bit.update the Urg point
- // if in TCP_CAN_RECV, otherwise, leave the RcvUp intact.
- //
-StepSix:
-
- Tcb->Idle = 0;
- TcpSetKeepaliveTimer (Tcb);
-
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_URG) &&
- !TCP_FIN_RCVD (Tcb->State))
- {
-
- DEBUG ((EFI_D_NET, "TcpInput: received urgent data "
- "from peer for connected TCB %p\n", Tcb));
-
- Urg = Seg->Seq + Seg->Urg;
-
- if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG) &&
- TCP_SEQ_GT (Urg, Tcb->RcvUp)) {
-
- Tcb->RcvUp = Urg;
- } else {
-
- Tcb->RcvUp = Urg;
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_URG);
- }
- }
-
- //
- // Seventh step: Process the segment data
- //
- if (Seg->End != Seg->Seq) {
-
- if (TCP_FIN_RCVD (Tcb->State)) {
-
- DEBUG ((EFI_D_WARN, "TcpInput: connection reset because"
- " data is lost for connected TCB %p\n", Tcb));
-
- goto RESET_THEN_DROP;
- }
-
- if (TCP_LOCAL_CLOSED (Tcb->State) && (Nbuf->TotalSize != 0)) {
- DEBUG ((EFI_D_WARN, "TcpInput: connection reset because"
- " data is lost for connected TCB %p\n", Tcb));
-
- goto RESET_THEN_DROP;
- }
-
- TcpQueueData (Tcb, Nbuf);
- if (TcpDeliverData (Tcb) == -1) {
- goto RESET_THEN_DROP;
- }
-
- if (!IsListEmpty (&Tcb->RcvQue)) {
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
- }
- }
-
- //
- // Eighth step: check the FIN.
- // This step is moved to TcpDeliverData. FIN will be
- // processed in sequence there. Check the comments in
- // the beginning of the file header for information.
- //
-
- //
- // Tcb is a new child of the listening Parent,
- // commit it.
- //
- if (Parent != NULL) {
- Tcb->Parent = Parent;
- TcpInsertTcb (Tcb);
- }
-
- if ((Tcb->State != TCP_CLOSED) &&
- (TcpToSendData (Tcb, 0) == 0) &&
- (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW) || (Nbuf->TotalSize != 0))) {
-
- TcpToSendAck (Tcb);
- }
-
- NetbufFree (Nbuf);
- return 0;
-
-RESET_THEN_DROP:
- TcpSendReset (Tcb, Head, Len, Dst, Src);
-
-DROP_CONNECTION:
- ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL));
-
- NetbufFree (Nbuf);
- TcpClose (Tcb);
-
- return -1;
-
-SEND_RESET:
-
- TcpSendReset (Tcb, Head, Len, Dst, Src);
-
-DISCARD:
-
- //
- // Tcb is a child of Parent, and it doesn't survive
- //
- DEBUG ((EFI_D_WARN, "Tcp4Input: Discard a packet\n"));
- NetbufFree (Nbuf);
-
- if ((Parent != NULL) && (Tcb != NULL)) {
-
- ASSERT (Tcb->Sk != NULL);
- TcpClose (Tcb);
- }
-
- return 0;
-}
-
-
-/**
- Process the received ICMP error messages for TCP.
-
- @param Nbuf Buffer that contains part of the TCP segment without IP header
- truncated from the ICMP error packet.
- @param IcmpErr The ICMP error code interpreted from ICMP error packet.
- @param Src Source address of the ICMP error message.
- @param Dst Destination address of the ICMP error message.
-
-**/
-VOID
-TcpIcmpInput (
- IN NET_BUF *Nbuf,
- IN UINT8 IcmpErr,
- IN UINT32 Src,
- IN UINT32 Dst
- )
-{
- TCP_HEAD *Head;
- TCP_CB *Tcb;
- TCP_SEQNO Seq;
- EFI_STATUS IcmpErrStatus;
- BOOLEAN IcmpErrIsHard;
- BOOLEAN IcmpErrNotify;
-
- if (Nbuf->TotalSize < sizeof (TCP_HEAD)) {
- goto CLEAN_EXIT;
- }
-
- Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL);
- ASSERT (Head != NULL);
- Tcb = TcpLocateTcb (
- Head->DstPort,
- Dst,
- Head->SrcPort,
- Src,
- FALSE
- );
- if (Tcb == NULL || Tcb->State == TCP_CLOSED) {
-
- goto CLEAN_EXIT;
- }
-
- //
- // Validate the sequence number.
- //
- Seq = NTOHL (Head->Seq);
- if (!(TCP_SEQ_LEQ (Tcb->SndUna, Seq) && TCP_SEQ_LT (Seq, Tcb->SndNxt))) {
-
- goto CLEAN_EXIT;
- }
-
- IcmpErrStatus = IpIoGetIcmpErrStatus (
- IcmpErr,
- IP_VERSION_4,
- &IcmpErrIsHard,
- &IcmpErrNotify
- );
-
- if (IcmpErrNotify) {
-
- SOCK_ERROR (Tcb->Sk, IcmpErrStatus);
- }
-
- if (IcmpErrIsHard) {
-
- TcpClose (Tcb);
- }
-
-CLEAN_EXIT:
- NetbufFree (Nbuf);
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c
deleted file mode 100644
index b98d1e783a..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/** @file
- I/O interfaces between TCP and IpIo.
-
-Copyright (c) 2005 - 2009, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Tcp4Main.h"
-
-
-/**
- Packet receive callback function provided to IP_IO, used to call
- the proper function to handle the packet received by IP.
-
- @param Status Status of the received packet.
- @param IcmpErr ICMP error number.
- @param NetSession Pointer to the net session of this packet.
- @param Pkt Pointer to the recieved packet.
- @param Context Pointer to the context configured in IpIoOpen(), not used
- now.
-
-**/
-VOID
-EFIAPI
-Tcp4RxCallback (
- IN EFI_STATUS Status,
- IN UINT8 IcmpErr,
- IN EFI_NET_SESSION_DATA *NetSession,
- IN NET_BUF *Pkt,
- IN VOID *Context OPTIONAL
- )
-{
- if (EFI_SUCCESS == Status) {
- TcpInput (Pkt, NetSession->Source.Addr[0], NetSession->Dest.Addr[0]);
- } else {
- TcpIcmpInput (Pkt, IcmpErr, NetSession->Source.Addr[0], NetSession->Dest.Addr[0]);
- }
-}
-
-
-/**
- Send the segment to IP via IpIo function.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Nbuf Pointer to the TCP segment to be sent.
- @param Src Source address of the TCP segment.
- @param Dest Destination address of the TCP segment.
-
- @retval 0 The segment was sent out successfully.
- @retval -1 The segment was failed to send.
-
-**/
-INTN
-TcpSendIpPacket (
- IN TCP_CB *Tcb,
- IN NET_BUF *Nbuf,
- IN UINT32 Src,
- IN UINT32 Dest
- )
-{
- EFI_STATUS Status;
- IP_IO *IpIo;
- IP_IO_OVERRIDE Override;
- SOCKET *Sock;
- VOID *IpSender;
- TCP4_PROTO_DATA *TcpProto;
- EFI_IP_ADDRESS Source;
- EFI_IP_ADDRESS Destination;
-
- Source.Addr[0] = Src;
- Destination.Addr[0] = Dest;
-
- if (NULL == Tcb) {
-
- IpIo = NULL;
- IpSender = IpIoFindSender (&IpIo, IP_VERSION_4, &Source);
-
- if (IpSender == NULL) {
- DEBUG ((EFI_D_WARN, "TcpSendIpPacket: No appropriate IpSender.\n"));
- return -1;
- }
- } else {
-
- Sock = Tcb->Sk;
- TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
- IpIo = TcpProto->TcpService->IpIo;
- IpSender = Tcb->IpInfo;
- }
-
- Override.Ip4OverrideData.TypeOfService = 0;
- Override.Ip4OverrideData.TimeToLive = 255;
- Override.Ip4OverrideData.DoNotFragment = FALSE;
- Override.Ip4OverrideData.Protocol = EFI_IP_PROTO_TCP;
- ZeroMem (&Override.Ip4OverrideData.GatewayAddress, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Override.Ip4OverrideData.SourceAddress, &Src, sizeof (EFI_IPv4_ADDRESS));
-
- Status = IpIoSend (IpIo, Nbuf, IpSender, NULL, NULL, &Destination, &Override);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "TcpSendIpPacket: return %r error\n", Status));
- return -1;
- }
-
- return 0;
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c
deleted file mode 100644
index d8fc68c0a9..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c
+++ /dev/null
@@ -1,674 +0,0 @@
-/** @file
- Implementation of TCP4 protocol services.
-
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-
-#include "Tcp4Main.h"
-
-
-/**
- Check the integrity of the data buffer.
-
- @param DataLen The total length of the data buffer.
- @param FragmentCount The fragment count of the fragment table.
- @param FragmentTable Pointer to the fragment table of the data
- buffer.
-
- @retval EFI_SUCCESS The integrity check is passed.
- @retval EFI_INVALID_PARAMETER The integrity check is failed.
-
-**/
-EFI_STATUS
-Tcp4ChkDataBuf (
- IN UINT32 DataLen,
- IN UINT32 FragmentCount,
- IN EFI_TCP4_FRAGMENT_DATA *FragmentTable
- )
-{
- UINT32 Index;
-
- UINT32 Len;
-
- for (Index = 0, Len = 0; Index < FragmentCount; Index++) {
- Len = Len + (UINT32) FragmentTable[Index].FragmentLength;
- }
-
- if (DataLen != Len) {
- return EFI_INVALID_PARAMETER;
- }
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Get the current operational status.
-
- The GetModeData() function copies the current operational settings of this
- EFI TCPv4 Protocol instance into user-supplied buffers. This function can
- also be used to retrieve the operational setting of underlying drivers
- such as IPv4, MNP, or SNP.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance.
- @param Tcp4State Pointer to the buffer to receive the current TCP
- state.
- @param Tcp4ConfigData Pointer to the buffer to receive the current TCP
- configuration.
- @param Ip4ModeData Pointer to the buffer to receive the current IPv4
- configuration data used by the TCPv4 instance.
- @param MnpConfigData Pointer to the buffer to receive the current MNP
- configuration data indirectly used by the TCPv4
- Instance.
- @param SnpModeData Pointer to the buffer to receive the current SNP
- configuration data indirectly used by the TCPv4
- Instance.
-
- @retval EFI_SUCCESS The mode data was read.
- @retval EFI_NOT_STARTED No configuration data is available because this
- instance hasn't been started.
- @retval EFI_INVALID_PARAMETER This is NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4GetModeData (
- IN EFI_TCP4_PROTOCOL *This,
- OUT EFI_TCP4_CONNECTION_STATE *Tcp4State OPTIONAL,
- OUT EFI_TCP4_CONFIG_DATA *Tcp4ConfigData OPTIONAL,
- OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL,
- OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL,
- OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL
- )
-{
- TCP4_MODE_DATA TcpMode;
- SOCKET *Sock;
-
- if (NULL == This) {
- return EFI_INVALID_PARAMETER;
- }
-
- Sock = SOCK_FROM_THIS (This);
-
- TcpMode.Tcp4State = Tcp4State;
- TcpMode.Tcp4ConfigData = Tcp4ConfigData;
- TcpMode.Ip4ModeData = Ip4ModeData;
- TcpMode.MnpConfigData = MnpConfigData;
- TcpMode.SnpModeData = SnpModeData;
-
- return SockGetMode (Sock, &TcpMode);
-}
-
-
-/**
- Initialize or brutally reset the operational parameters for
- this EFI TCPv4 instance.
-
- The Configure() function does the following:
- * Initialize this EFI TCPv4 instance, i.e., initialize the communication end
- setting, specify active open or passive open for an instance.
- * Reset this TCPv4 instance brutally, i.e., cancel all pending asynchronous
- tokens, flush transmission and receiving buffer directly without informing
- the communication peer.
- No other TCPv4 Protocol operation can be executed by this instance
- until it is configured properly. For an active TCP4 instance, after a proper
- configuration it may call Connect() to initiates the three-way handshake.
- For a passive TCP4 instance, its state will transit to Tcp4StateListen after
- configuration, and Accept() may be called to listen the incoming TCP connection
- request. If TcpConfigData is set to NULL, the instance is reset. Resetting
- process will be done brutally, the state machine will be set to Tcp4StateClosed
- directly, the receive queue and transmit queue will be flushed, and no traffic is
- allowed through this instance.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance.
- @param TcpConfigData Pointer to the configure data to configure the
- instance.
-
- @retval EFI_SUCCESS The operational settings are set, changed, or
- reset successfully.
- @retval EFI_NO_MAPPING When using a default address, configuration
- (through DHCP, BOOTP, RARP, etc.) is not
- finished.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_ACCESS_DENIED Configuring TCP instance when it is already
- configured.
- @retval EFI_DEVICE_ERROR An unexpected network or system error occurred.
- @retval EFI_UNSUPPORTED One or more of the control options are not
- supported in the implementation.
- @retval EFI_OUT_OF_RESOURCES Could not allocate enough system resources.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Configure (
- IN EFI_TCP4_PROTOCOL *This,
- IN EFI_TCP4_CONFIG_DATA *TcpConfigData OPTIONAL
- )
-{
- EFI_TCP4_OPTION *Option;
- SOCKET *Sock;
- EFI_STATUS Status;
- IP4_ADDR Ip;
- IP4_ADDR SubnetMask;
-
- if (NULL == This) {
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Tcp protocol related parameter check will be conducted here
- //
- if (NULL != TcpConfigData) {
-
- CopyMem (&Ip, &TcpConfigData->AccessPoint.RemoteAddress, sizeof (IP4_ADDR));
- if (IP4_IS_LOCAL_BROADCAST (NTOHL (Ip))) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (TcpConfigData->AccessPoint.ActiveFlag &&
- (0 == TcpConfigData->AccessPoint.RemotePort || (Ip == 0))) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (!TcpConfigData->AccessPoint.UseDefaultAddress) {
-
- CopyMem (&Ip, &TcpConfigData->AccessPoint.StationAddress, sizeof (IP4_ADDR));
- CopyMem (&SubnetMask, &TcpConfigData->AccessPoint.SubnetMask, sizeof (IP4_ADDR));
- if (!IP4_IS_VALID_NETMASK (NTOHL (SubnetMask)) ||
- (SubnetMask != 0 && !NetIp4IsUnicast (NTOHL (Ip), NTOHL (SubnetMask)))) {
- return EFI_INVALID_PARAMETER;
- }
- }
-
- Option = TcpConfigData->ControlOption;
- if ((NULL != Option) &&
- (Option->EnableSelectiveAck || Option->EnablePathMtuDiscovery)) {
- return EFI_UNSUPPORTED;
- }
- }
-
- Sock = SOCK_FROM_THIS (This);
-
- if (NULL == TcpConfigData) {
- return SockFlush (Sock);
- }
-
- Status = SockConfigure (Sock, TcpConfigData);
-
- if (EFI_NO_MAPPING == Status) {
- Sock->ConfigureState = SO_NO_MAPPING;
- }
-
- return Status;
-}
-
-
-/**
- Add or delete routing entries.
-
- The Routes() function adds or deletes a route from the instance's routing table.
- The most specific route is selected by comparing the SubnetAddress with the
- destination IP address's arithmetical AND to the SubnetMask.
- The default route is added with both SubnetAddress and SubnetMask set to 0.0.0.0.
- The default route matches all destination IP addresses if there is no more specific route.
- Direct route is added with GatewayAddress set to 0.0.0.0. Packets are sent to
- the destination host if its address can be found in the Address Resolution Protocol (ARP)
- cache or it is on the local subnet. If the instance is configured to use default
- address, a direct route to the local network will be added automatically.
- Each TCP instance has its own independent routing table. Instance that uses the
- default IP address will have a copy of the EFI_IP4_CONFIG_PROTOCOL's routing table.
- The copy will be updated automatically whenever the IP driver reconfigures its
- instance. As a result, the previous modification to the instance's local copy
- will be lost. The priority of checking the route table is specific with IP
- implementation and every IP implementation must comply with RFC 1122.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance.
- @param DeleteRoute If TRUE, delete the specified route from routing
- table; if FALSE, add the specified route to
- routing table.
- DestinationAddress and SubnetMask are used as
- the keywords to search route entry.
- @param SubnetAddress The destination network.
- @param SubnetMask The subnet mask for the destination network.
- @param GatewayAddress The gateway address for this route.
- It must be on the same subnet with the station
- address unless a direct route is specified.
-
- @retval EFI_SUCCESS The operation completed successfully.
- @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance has not been
- configured.
- @retval EFI_NO_MAPPING When using a default address, configuration
- (through DHCP, BOOTP, RARP, etc.) is not
- finished.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources to add the
- entry to the routing table.
- @retval EFI_NOT_FOUND This route is not in the routing table.
- @retval EFI_ACCESS_DENIED This route is already in the routing table.
- @retval EFI_UNSUPPORTED The TCP driver does not support this operation.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Routes (
- IN EFI_TCP4_PROTOCOL *This,
- IN BOOLEAN DeleteRoute,
- IN EFI_IPv4_ADDRESS *SubnetAddress,
- IN EFI_IPv4_ADDRESS *SubnetMask,
- IN EFI_IPv4_ADDRESS *GatewayAddress
- )
-{
- SOCKET *Sock;
- TCP4_ROUTE_INFO RouteInfo;
-
- if (NULL == This) {
- return EFI_INVALID_PARAMETER;
- }
-
- Sock = SOCK_FROM_THIS (This);
-
- RouteInfo.DeleteRoute = DeleteRoute;
- RouteInfo.SubnetAddress = SubnetAddress;
- RouteInfo.SubnetMask = SubnetMask;
- RouteInfo.GatewayAddress = GatewayAddress;
-
- return SockRoute (Sock, &RouteInfo);
-}
-
-
-/**
- Initiate a nonblocking TCP connection request for an active TCP instance.
-
- The Connect() function will initiate an active open to the remote peer configured
- in current TCP instance if it is configured active. If the connection succeeds
- or fails due to any error, the ConnectionToken->CompletionToken.Event will be
- signaled and ConnectionToken->CompletionToken.Status will be updated accordingly.
- This function can only be called for the TCP instance in Tcp4StateClosed state.
- The instance will transfer into Tcp4StateSynSent if the function returns EFI_SUCCESS.
- If TCP three way handshake succeeds, its state will become Tcp4StateEstablished,
- otherwise, the state will return to Tcp4StateClosed.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance
- @param ConnectionToken Pointer to the connection token to return when
- the TCP three way handshake finishes.
-
- @retval EFI_SUCCESS The connection request is successfully initiated
- and the state of this TCPv4 instance has
- been changed to Tcp4StateSynSent.
- @retval EFI_NOT_STARTED This EFI_TCP4_PROTOCOL instance hasn't been
- configured.
- @retval EFI_ACCESS_DENIED The instance is not configured as an active one
- or it is not in Tcp4StateClosed state.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_OUT_OF_RESOURCES The driver can't allocate enough resource to
- initiate the active open.
- @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Connect (
- IN EFI_TCP4_PROTOCOL *This,
- IN EFI_TCP4_CONNECTION_TOKEN *ConnectionToken
- )
-{
- SOCKET *Sock;
-
- if (NULL == This ||
- NULL == ConnectionToken ||
- NULL == ConnectionToken->CompletionToken.Event) {
- return EFI_INVALID_PARAMETER;
- }
-
- Sock = SOCK_FROM_THIS (This);
-
- return SockConnect (Sock, ConnectionToken);
-}
-
-
-/**
- Listen on the passive instance to accept an incoming connection request.
-
- The Accept() function initiates an asynchronous accept request to wait for an
- incoming connection on the passive TCP instance. If a remote peer successfully
- establishes a connection with this instance, a new TCP instance will be created
- and its handle will be returned in ListenToken->NewChildHandle. The newly created
- instance is configured by inheriting the passive instance's configuration and is
- ready for use upon return. The instance is in the Tcp4StateEstablished state.
- The ListenToken->CompletionToken.Event will be signaled when a new connection
- is accepted, user aborts the listen or connection is reset. This function only
- can be called when current TCP instance is in Tcp4StateListen state.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance
- @param ListenToken Pointer to the listen token to return when
- operation finishes.
-
- @retval EFI_SUCCESS The listen token has been queued successfully.
- @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been
- configured.
- @retval EFI_ACCESS_DENIED The instatnce is not a passive one or it is not
- in Tcp4StateListen state or a same listen token
- has already existed in the listen token queue of
- this TCP instance.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources to finish
- the operation.
- @retval EFI_DEVICE_ERROR Any unexpected and not belonged to above category error.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Accept (
- IN EFI_TCP4_PROTOCOL *This,
- IN EFI_TCP4_LISTEN_TOKEN *ListenToken
- )
-{
- SOCKET *Sock;
-
- if (NULL == This ||
- NULL == ListenToken ||
- NULL == ListenToken->CompletionToken.Event) {
- return EFI_INVALID_PARAMETER;
- }
-
- Sock = SOCK_FROM_THIS (This);
-
- return SockAccept (Sock, ListenToken);
-}
-
-
-/**
- Queues outgoing data into the transmit queue.
-
- The Transmit() function queues a sending request to this TCPv4 instance along
- with the user data. The status of the token is updated and the event in the token
- will be signaled once the data is sent out or some error occurs.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance
- @param Token Pointer to the completion token to queue to the
- transmit queue
-
- @retval EFI_SUCCESS The data has been queued for transmission.
- @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been
- configured.
- @retval EFI_NO_MAPPING When using a default address, configuration
- (DHCP, BOOTP, RARP, etc.) is not finished yet.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_ACCESS_DENIED One or more of the following conditions is TRUE:
- * A transmit completion token with the same
- Token-> CompletionToken.Event was already in the
- transmission queue.
- * The current instance is in Tcp4StateClosed state
- * The current instance is a passive one and
- it is in Tcp4StateListen state.
- * User has called Close() to disconnect this
- connection.
- @retval EFI_NOT_READY The completion token could not be queued because
- the transmit queue is full.
- @retval EFI_OUT_OF_RESOURCES Could not queue the transmit data because of
- resource shortage.
- @retval EFI_NETWORK_UNREACHABLE There is no route to the destination network or
- address.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Transmit (
- IN EFI_TCP4_PROTOCOL *This,
- IN EFI_TCP4_IO_TOKEN *Token
- )
-{
- SOCKET *Sock;
- EFI_STATUS Status;
-
- if (NULL == This ||
- NULL == Token ||
- NULL == Token->CompletionToken.Event ||
- NULL == Token->Packet.TxData ||
- 0 == Token->Packet.TxData->FragmentCount ||
- 0 == Token->Packet.TxData->DataLength
- ) {
- return EFI_INVALID_PARAMETER;
- }
-
- Status = Tcp4ChkDataBuf (
- (UINT32) Token->Packet.TxData->DataLength,
- (UINT32) Token->Packet.TxData->FragmentCount,
- Token->Packet.TxData->FragmentTable
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Sock = SOCK_FROM_THIS (This);
-
- return SockSend (Sock, Token);
-
-}
-
-
-/**
- Place an asynchronous receive request into the receiving queue.
-
- The Receive() function places a completion token into the receive packet queue.
- This function is always asynchronous. The caller must allocate the
- Token->CompletionToken.Event and the FragmentBuffer used to receive data. He also
- must fill the DataLength which represents the whole length of all FragmentBuffer.
- When the receive operation completes, the EFI TCPv4 Protocol driver updates the
- Token->CompletionToken.Status and Token->Packet.RxData fields and the
- Token->CompletionToken.Event is signaled. If got data the data and its length
- will be copy into the FragmentTable, in the same time the full length of received
- data will be recorded in the DataLength fields. Providing a proper notification
- function and context for the event will enable the user to receive the notification
- and receiving status. That notification function is guaranteed to not be re-entered.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance.
- @param Token Pointer to a token that is associated with the
- receive data descriptor.
-
- @retval EFI_SUCCESS The receive completion token was cached.
- @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been
- configured.
- @retval EFI_NO_MAPPING When using a default address, configuration
- (DHCP, BOOTP, RARP, etc.) is not finished yet.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_OUT_OF_RESOURCES The receive completion token could not be queued
- due to a lack of system resources.
- @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.
- The EFI TCPv4 Protocol instance has been reset
- to startup defaults.
- @retval EFI_ACCESS_DENIED One or more of the following conditions is TRUE:
- * A receive completion token with the same
- Token->CompletionToken.Event was already in
- the receive queue.
- * The current instance is in Tcp4StateClosed state.
- * The current instance is a passive one and it
- is in Tcp4StateListen state.
- * User has called Close() to disconnect this
- connection.
- @retval EFI_CONNECTION_FIN The communication peer has closed the connection
- and there is no any buffered data in the receive
- buffer of this instance.
- @retval EFI_NOT_READY The receive request could not be queued because
- the receive queue is full.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Receive (
- IN EFI_TCP4_PROTOCOL *This,
- IN EFI_TCP4_IO_TOKEN *Token
- )
-{
- SOCKET *Sock;
- EFI_STATUS Status;
-
- if (NULL == This ||
- NULL == Token ||
- NULL == Token->CompletionToken.Event ||
- NULL == Token->Packet.RxData ||
- 0 == Token->Packet.RxData->FragmentCount ||
- 0 == Token->Packet.RxData->DataLength
- ) {
- return EFI_INVALID_PARAMETER;
- }
-
- Status = Tcp4ChkDataBuf (
- (UINT32) Token->Packet.RxData->DataLength,
- (UINT32) Token->Packet.RxData->FragmentCount,
- Token->Packet.RxData->FragmentTable
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Sock = SOCK_FROM_THIS (This);
-
- return SockRcv (Sock, Token);
-
-}
-
-
-/**
- Disconnecting a TCP connection gracefully or reset a TCP connection.
-
- Initiate an asynchronous close token to TCP driver. After Close() is called,
- any buffered transmission data will be sent by TCP driver and the current
- instance will have a graceful close working flow described as RFC 793 if
- AbortOnClose is set to FALSE, otherwise, a rest packet will be sent by TCP
- driver to fast disconnect this connection. When the close operation completes
- successfully the TCP instance is in Tcp4StateClosed state, all pending
- asynchronous operation is signaled and any buffers used for TCP network traffic
- is flushed.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance.
- @param CloseToken Pointer to the close token to return when
- operation finishes.
-
- @retval EFI_SUCCESS The operation completed successfully.
- @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been
- configured.
- @retval EFI_ACCESS_DENIED One or more of the following are TRUE:
- * Configure() has been called with TcpConfigData
- set to NULL and this function has not returned.
- * Previous Close() call on this instance has not
- finished.
- @retval EFI_INVALID_PARAMETER One ore more parameters are invalid.
- @retval EFI_OUT_OF_RESOURCES Could not allocate enough resource to finish the
- operation.
- @retval EFI_DEVICE_ERROR Any unexpected and not belonged to above
- category error.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Close (
- IN EFI_TCP4_PROTOCOL *This,
- IN EFI_TCP4_CLOSE_TOKEN *CloseToken
- )
-{
- SOCKET *Sock;
-
- if (NULL == This ||
- NULL == CloseToken ||
- NULL == CloseToken->CompletionToken.Event) {
- return EFI_INVALID_PARAMETER;
- }
-
- Sock = SOCK_FROM_THIS (This);
-
- return SockClose (Sock, CloseToken, CloseToken->AbortOnClose);
-}
-
-
-/**
- Abort an asynchronous connection, listen, transmission or receive request.
-
- The Cancel() function aborts a pending connection, listen, transmit or receive
- request. If Token is not NULL and the token is in the connection, listen,
- transmission or receive queue when it is being cancelled, its Token->Status
- will be set to EFI_ABORTED and then Token->Event will be signaled. If the token
- is not in one of the queues, which usually means that the asynchronous operation
- has completed, EFI_NOT_FOUND is returned. If Token is NULL all asynchronous token
- issued by Connect(), Accept(), Transmit() and Receive()will be aborted.
- NOTE: It has not been implemented currently.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance.
- @param Token Pointer to a token that has been issued by
- Connect(), Accept(), Transmit() or Receive(). If
- NULL, all pending tokens issued by above four
- functions will be aborted.
-
- @retval EFI_SUCCESS The asynchronous I/O request is aborted and Token->Event
- is signaled.
- @retval EFI_INVALID_PARAMETER This is NULL.
- @retval EFI_NOT_STARTED This instance hasn's been configured.
- @retval EFI_NO_MAPPING When using the default address, configuration
- (DHCP, BOOTP,RARP, etc.) hasn's finished yet.
- @retval EFI_NOT_FOUND The asynchronous I/O request isn's found in the
- transmission or receive queue. It has either
- completed or wasn's issued by Transmit() and Receive().
- @retval EFI_UNSUPPORTED The operation is not supported in current
- implementation.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Cancel (
- IN EFI_TCP4_PROTOCOL *This,
- IN EFI_TCP4_COMPLETION_TOKEN *Token OPTIONAL
- )
-{
- return EFI_UNSUPPORTED;
-}
-
-
-/**
- Poll to receive incoming data and transmit outgoing segments.
-
- The Poll() function increases the rate that data is moved between the network
- and application and can be called when the TCP instance is created successfully.
- Its use is optional. In some implementations, the periodical timer in the MNP
- driver may not poll the underlying communications device fast enough to avoid
- drop packets. Drivers and applications that are experiencing packet loss should
- try calling the Poll() function in a high frequency.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance.
-
- @retval EFI_SUCCESS Incoming or outgoing data was processed.
- @retval EFI_INVALID_PARAMETER This is NULL.
- @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.
- @retval EFI_NOT_READY No incoming or outgoing data was processed.
- @retval EFI_TIMEOUT Data was dropped out of the transmission or
- receive queue. Consider increasing the polling
- rate.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Poll (
- IN EFI_TCP4_PROTOCOL *This
- )
-{
- SOCKET *Sock;
- EFI_STATUS Status;
-
- if (NULL == This) {
- return EFI_INVALID_PARAMETER;
- }
-
- Sock = SOCK_FROM_THIS (This);
-
- Status = Sock->ProtoHandler (Sock, SOCK_POLL, NULL);
-
- return Status;
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h
deleted file mode 100644
index c898a7ee2d..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h
+++ /dev/null
@@ -1,494 +0,0 @@
-/** @file
- TCP4 protocol services header file.
-
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _TCP4_MAIN_H_
-#define _TCP4_MAIN_H_
-
-#include "Socket.h"
-
-#include "Tcp4Proto.h"
-#include "Tcp4Func.h"
-#include "Tcp4Driver.h"
-
-
-extern UINT16 mTcp4RandomPort;
-extern CHAR16 *mTcpStateName[];
-
-//
-// Driver Produced Protocol Prototypes
-//
-
-//
-// Function prototype for the Tcp4 socket request handler
-//
-/**
- The procotol handler provided to the socket layer, used to
- dispatch the socket level requests by calling the corresponding
- TCP layer functions.
-
- @param Sock Pointer to the socket of this TCP instance.
- @param Request The code of this operation request.
- @param Data Pointer to the operation specific data passed in
- together with the operation request.
-
- @retval EFI_SUCCESS The socket request is completed successfully.
- @retval other The error status returned by the corresponding TCP
- layer function.
-
-**/
-EFI_STATUS
-Tcp4Dispatcher (
- IN SOCKET *Sock,
- IN UINT8 Request,
- IN VOID *Data OPTIONAL
- );
-
-///
-/// TCP mode data
-///
-typedef struct _TCP4_MODE_DATA {
- EFI_TCP4_CONNECTION_STATE *Tcp4State;
- EFI_TCP4_CONFIG_DATA *Tcp4ConfigData;
- EFI_IP4_MODE_DATA *Ip4ModeData;
- EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData;
- EFI_SIMPLE_NETWORK_MODE *SnpModeData;
-} TCP4_MODE_DATA;
-
-///
-/// TCP route infomation data
-///
-typedef struct _TCP4_ROUTE_INFO {
- BOOLEAN DeleteRoute;
- EFI_IPv4_ADDRESS *SubnetAddress;
- EFI_IPv4_ADDRESS *SubnetMask;
- EFI_IPv4_ADDRESS *GatewayAddress;
-} TCP4_ROUTE_INFO;
-
-typedef struct {
- EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
- UINTN NumberOfChildren;
- EFI_HANDLE *ChildHandleBuffer;
-} TCP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT;
-
-/**
- Get the current operational status of a TCP instance.
-
- The GetModeData() function copies the current operational settings of this
- EFI TCPv4 Protocol instance into user-supplied buffers. This function can
- also be used to retrieve the operational setting of underlying drivers
- such as IPv4, MNP, or SNP.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance.
- @param Tcp4State Pointer to the buffer to receive the current TCP
- state.
- @param Tcp4ConfigData Pointer to the buffer to receive the current TCP
- configuration.
- @param Ip4ModeData Pointer to the buffer to receive the current IPv4
- configuration data used by the TCPv4 instance.
- @param MnpConfigData Pointer to the buffer to receive the current MNP
- configuration data indirectly used by the TCPv4
- Instance.
- @param SnpModeData Pointer to the buffer to receive the current SNP
- configuration data indirectly used by the TCPv4
- Instance.
-
- @retval EFI_SUCCESS The mode data was read.
- @retval EFI_NOT_STARTED No configuration data is available because this
- instance hasn't been started.
- @retval EFI_INVALID_PARAMETER This is NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4GetModeData (
- IN EFI_TCP4_PROTOCOL *This,
- OUT EFI_TCP4_CONNECTION_STATE *Tcp4State OPTIONAL,
- OUT EFI_TCP4_CONFIG_DATA *Tcp4ConfigData OPTIONAL,
- OUT EFI_IP4_MODE_DATA *Ip4ModeData OPTIONAL,
- OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData OPTIONAL,
- OUT EFI_SIMPLE_NETWORK_MODE *SnpModeData OPTIONAL
- );
-
-
-/**
- Initialize or brutally reset the operational parameters for
- this EFI TCPv4 instance.
-
- The Configure() function does the following:
- * Initialize this EFI TCPv4 instance, i.e., initialize the communication end
- setting, specify active open or passive open for an instance.
- * Reset this TCPv4 instance brutally, i.e., cancel all pending asynchronous
- tokens, flush transmission and receiving buffer directly without informing
- the communication peer.
- No other TCPv4 Protocol operation can be executed by this instance
- until it is configured properly. For an active TCP4 instance, after a proper
- configuration it may call Connect() to initiates the three-way handshake.
- For a passive TCP4 instance, its state will transit to Tcp4StateListen after
- configuration, and Accept() may be called to listen the incoming TCP connection
- request. If TcpConfigData is set to NULL, the instance is reset. Resetting
- process will be done brutally, the state machine will be set to Tcp4StateClosed
- directly, the receive queue and transmit queue will be flushed, and no traffic is
- allowed through this instance.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance.
- @param TcpConfigData Pointer to the configure data to configure the
- instance.
-
- @retval EFI_SUCCESS The operational settings are set, changed, or
- reset successfully.
- @retval EFI_NO_MAPPING When using a default address, configuration
- (through DHCP, BOOTP, RARP, etc.) is not
- finished.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_ACCESS_DENIED Configuring TCP instance when it is already
- configured.
- @retval EFI_DEVICE_ERROR An unexpected network or system error occurred.
- @retval EFI_UNSUPPORTED One or more of the control options are not
- supported in the implementation.
- @retval EFI_OUT_OF_RESOURCES Could not allocate enough system resources.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Configure (
- IN EFI_TCP4_PROTOCOL *This,
- IN EFI_TCP4_CONFIG_DATA *TcpConfigData OPTIONAL
- );
-
-/**
- Add or delete routing entries.
-
- The Routes() function adds or deletes a route from the instance's routing table.
- The most specific route is selected by comparing the SubnetAddress with the
- destination IP address's arithmetical AND to the SubnetMask.
- The default route is added with both SubnetAddress and SubnetMask set to 0.0.0.0.
- The default route matches all destination IP addresses if there is no more specific route.
- Direct route is added with GatewayAddress set to 0.0.0.0. Packets are sent to
- the destination host if its address can be found in the Address Resolution Protocol (ARP)
- cache or it is on the local subnet. If the instance is configured to use default
- address, a direct route to the local network will be added automatically.
- Each TCP instance has its own independent routing table. Instance that uses the
- default IP address will have a copy of the EFI_IP4_CONFIG_PROTOCOL's routing table.
- The copy will be updated automatically whenever the IP driver reconfigures its
- instance. As a result, the previous modification to the instance's local copy
- will be lost. The priority of checking the route table is specific with IP
- implementation and every IP implementation must comply with RFC 1122.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance.
- @param DeleteRoute If TRUE, delete the specified route from routing
- table; if FALSE, add the specified route to
- routing table.
- DestinationAddress and SubnetMask are used as
- the keywords to search route entry.
- @param SubnetAddress The destination network.
- @param SubnetMask The subnet mask for the destination network.
- @param GatewayAddress The gateway address for this route.
- It must be on the same subnet with the station
- address unless a direct route is specified.
-
- @retval EFI_SUCCESS The operation completed successfully.
- @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance has not been
- configured.
- @retval EFI_NO_MAPPING When using a default address, configuration
- (through DHCP, BOOTP, RARP, etc.) is not
- finished.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources to add the
- entry to the routing table.
- @retval EFI_NOT_FOUND This route is not in the routing table.
- @retval EFI_ACCESS_DENIED This route is already in the routing table.
- @retval EFI_UNSUPPORTED The TCP driver does not support this operation.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Routes (
- IN EFI_TCP4_PROTOCOL *This,
- IN BOOLEAN DeleteRoute,
- IN EFI_IPv4_ADDRESS *SubnetAddress,
- IN EFI_IPv4_ADDRESS *SubnetMask,
- IN EFI_IPv4_ADDRESS *GatewayAddress
- );
-
-/**
- Initiate a nonblocking TCP connection request for an active TCP instance.
-
- The Connect() function will initiate an active open to the remote peer configured
- in current TCP instance if it is configured active. If the connection succeeds
- or fails due to any error, the ConnectionToken->CompletionToken.Event will be
- signaled and ConnectionToken->CompletionToken.Status will be updated accordingly.
- This function can only be called for the TCP instance in Tcp4StateClosed state.
- The instance will transfer into Tcp4StateSynSent if the function returns EFI_SUCCESS.
- If TCP three way handshake succeeds, its state will become Tcp4StateEstablished,
- otherwise, the state will return to Tcp4StateClosed.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance
- @param ConnectionToken Pointer to the connection token to return when
- the TCP three way handshake finishes.
-
- @retval EFI_SUCCESS The connection request is successfully initiated
- and the state of this TCPv4 instance has
- been changed to Tcp4StateSynSent.
- @retval EFI_NOT_STARTED This EFI_TCP4_PROTOCOL instance hasn't been
- configured.
- @retval EFI_ACCESS_DENIED The instance is not configured as an active one
- or it is not in Tcp4StateClosed state.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_OUT_OF_RESOURCES The driver can't allocate enough resource to
- initiate the active open.
- @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Connect (
- IN EFI_TCP4_PROTOCOL *This,
- IN EFI_TCP4_CONNECTION_TOKEN *ConnectionToken
- );
-
-/**
- Listen on the passive instance to accept an incoming connection request.
-
- The Accept() function initiates an asynchronous accept request to wait for an
- incoming connection on the passive TCP instance. If a remote peer successfully
- establishes a connection with this instance, a new TCP instance will be created
- and its handle will be returned in ListenToken->NewChildHandle. The newly created
- instance is configured by inheriting the passive instance's configuration and is
- ready for use upon return. The instance is in the Tcp4StateEstablished state.
- The ListenToken->CompletionToken.Event will be signaled when a new connection
- is accepted, user aborts the listen or connection is reset. This function only
- can be called when current TCP instance is in Tcp4StateListen state.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance
- @param ListenToken Pointer to the listen token to return when
- operation finishes.
-
- @retval EFI_SUCCESS The listen token has been queued successfully.
- @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been
- configured.
- @retval EFI_ACCESS_DENIED The instatnce is not a passive one or it is not
- in Tcp4StateListen state or a same listen token
- has already existed in the listen token queue of
- this TCP instance.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_OUT_OF_RESOURCES Could not allocate enough resources to finish
- the operation.
- @retval EFI_DEVICE_ERROR Any unexpected and not belonged to above category error.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Accept (
- IN EFI_TCP4_PROTOCOL *This,
- IN EFI_TCP4_LISTEN_TOKEN *ListenToken
- );
-
-/**
- Queues outgoing data into the transmit queue.
-
- The Transmit() function queues a sending request to this TCPv4 instance along
- with the user data. The status of the token is updated and the event in the token
- will be signaled once the data is sent out or some error occurs.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance
- @param Token Pointer to the completion token to queue to the
- transmit queue
-
- @retval EFI_SUCCESS The data has been queued for transmission.
- @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been
- configured.
- @retval EFI_NO_MAPPING When using a default address, configuration
- (DHCP, BOOTP, RARP, etc.) is not finished yet.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_ACCESS_DENIED One or more of the following conditions is TRUE:
- * A transmit completion token with the same
- Token-> CompletionToken.Event was already in the
- transmission queue.
- * The current instance is in Tcp4StateClosed state
- * The current instance is a passive one and
- it is in Tcp4StateListen state.
- * User has called Close() to disconnect this
- connection.
- @retval EFI_NOT_READY The completion token could not be queued because
- the transmit queue is full.
- @retval EFI_OUT_OF_RESOURCES Could not queue the transmit data because of
- resource shortage.
- @retval EFI_NETWORK_UNREACHABLE There is no route to the destination network or
- address.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Transmit (
- IN EFI_TCP4_PROTOCOL *This,
- IN EFI_TCP4_IO_TOKEN *Token
- );
-
-/**
- Place an asynchronous receive request into the receiving queue.
-
- The Receive() function places a completion token into the receive packet queue.
- This function is always asynchronous. The caller must allocate the
- Token->CompletionToken.Event and the FragmentBuffer used to receive data. He also
- must fill the DataLength which represents the whole length of all FragmentBuffer.
- When the receive operation completes, the EFI TCPv4 Protocol driver updates the
- Token->CompletionToken.Status and Token->Packet.RxData fields and the
- Token->CompletionToken.Event is signaled. If got data the data and its length
- will be copy into the FragmentTable, in the same time the full length of received
- data will be recorded in the DataLength fields. Providing a proper notification
- function and context for the event will enable the user to receive the notification
- and receiving status. That notification function is guaranteed to not be re-entered.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance.
- @param Token Pointer to a token that is associated with the
- receive data descriptor.
-
- @retval EFI_SUCCESS The receive completion token was cached.
- @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been
- configured.
- @retval EFI_NO_MAPPING When using a default address, configuration
- (DHCP, BOOTP, RARP, etc.) is not finished yet.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_OUT_OF_RESOURCES The receive completion token could not be queued
- due to a lack of system resources.
- @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.
- The EFI TCPv4 Protocol instance has been reset
- to startup defaults.
- @retval EFI_ACCESS_DENIED One or more of the following conditions is TRUE:
- * A receive completion token with the same
- Token->CompletionToken.Event was already in
- the receive queue.
- * The current instance is in Tcp4StateClosed state.
- * The current instance is a passive one and it
- is in Tcp4StateListen state.
- * User has called Close() to disconnect this
- connection.
- @retval EFI_CONNECTION_FIN The communication peer has closed the connection
- and there is no any buffered data in the receive
- buffer of this instance.
- @retval EFI_NOT_READY The receive request could not be queued because
- the receive queue is full.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Receive (
- IN EFI_TCP4_PROTOCOL *This,
- IN EFI_TCP4_IO_TOKEN *Token
- );
-
-/**
- Disconnecting a TCP connection gracefully or reset a TCP connection.
-
- Initiate an asynchronous close token to TCP driver. After Close() is called,
- any buffered transmission data will be sent by TCP driver and the current
- instance will have a graceful close working flow described as RFC 793 if
- AbortOnClose is set to FALSE, otherwise, a rest packet will be sent by TCP
- driver to fast disconnect this connection. When the close operation completes
- successfully the TCP instance is in Tcp4StateClosed state, all pending
- asynchronous operation is signaled and any buffers used for TCP network traffic
- is flushed.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance.
- @param CloseToken Pointer to the close token to return when
- operation finishes.
-
- @retval EFI_SUCCESS The operation completed successfully.
- @retval EFI_NOT_STARTED The EFI_TCP4_PROTOCOL instance hasn't been
- configured.
- @retval EFI_ACCESS_DENIED One or more of the following are TRUE:
- * Configure() has been called with TcpConfigData
- set to NULL and this function has not returned.
- * Previous Close() call on this instance has not
- finished.
- @retval EFI_INVALID_PARAMETER One ore more parameters are invalid.
- @retval EFI_OUT_OF_RESOURCES Could not allocate enough resource to finish the
- operation.
- @retval EFI_DEVICE_ERROR Any unexpected and not belonged to above
- category error.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Close (
- IN EFI_TCP4_PROTOCOL *This,
- IN EFI_TCP4_CLOSE_TOKEN *CloseToken
- );
-
-/**
- Abort an asynchronous connection, listen, transmission or receive request.
-
- The Cancel() function aborts a pending connection, listen, transmit or receive
- request. If Token is not NULL and the token is in the connection, listen,
- transmission or receive queue when it is being cancelled, its Token->Status
- will be set to EFI_ABORTED and then Token->Event will be signaled. If the token
- is not in one of the queues, which usually means that the asynchronous operation
- has completed, EFI_NOT_FOUND is returned. If Token is NULL all asynchronous token
- issued by Connect(), Accept(), Transmit() and Receive()will be aborted.
- NOTE: It has not been implemented currently.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance.
- @param Token Pointer to a token that has been issued by
- Connect(), Accept(), Transmit() or Receive(). If
- NULL, all pending tokens issued by above four
- functions will be aborted.
-
- @retval EFI_SUCCESS The asynchronous I/O request is aborted and Token->Event
- is signaled.
- @retval EFI_INVALID_PARAMETER This is NULL.
- @retval EFI_NOT_STARTED This instance hasn's been configured.
- @retval EFI_NO_MAPPING When using the default address, configuration
- (DHCP, BOOTP,RARP, etc.) hasn's finished yet.
- @retval EFI_NOT_FOUND The asynchronous I/O request isn's found in the
- transmission or receive queue. It has either
- completed or wasn's issued by Transmit() and Receive().
- @retval EFI_UNSUPPORTED The operation is not supported in current
- implementation.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Cancel (
- IN EFI_TCP4_PROTOCOL *This,
- IN EFI_TCP4_COMPLETION_TOKEN *Token OPTIONAL
- );
-
-/**
- Poll to receive incoming data and transmit outgoing segments.
-
- The Poll() function increases the rate that data is moved between the network
- and application and can be called when the TCP instance is created successfully.
- Its use is optional. In some implementations, the periodical timer in the MNP
- driver may not poll the underlying communications device fast enough to avoid
- drop packets. Drivers and applications that are experiencing packet loss should
- try calling the Poll() function in a high frequency.
-
- @param This Pointer to the EFI_TCP4_PROTOCOL instance.
-
- @retval EFI_SUCCESS Incoming or outgoing data was processed.
- @retval EFI_INVALID_PARAMETER This is NULL.
- @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.
- @retval EFI_NOT_READY No incoming or outgoing data was processed.
- @retval EFI_TIMEOUT Data was dropped out of the transmission or
- receive queue. Consider increasing the polling
- rate.
-
-**/
-EFI_STATUS
-EFIAPI
-Tcp4Poll (
- IN EFI_TCP4_PROTOCOL *This
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c
deleted file mode 100644
index 7fd8bb1fbe..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c
+++ /dev/null
@@ -1,940 +0,0 @@
-/** @file
- Misc support routines for tcp.
-
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-
-#include "Tcp4Main.h"
-
-#include <Library/DevicePathLib.h>
-
-LIST_ENTRY mTcpRunQue = {
- &mTcpRunQue,
- &mTcpRunQue
-};
-
-LIST_ENTRY mTcpListenQue = {
- &mTcpListenQue,
- &mTcpListenQue
-};
-
-TCP_SEQNO mTcpGlobalIss = 0x4d7e980b;
-
-CHAR16 *mTcpStateName[] = {
- L"TCP_CLOSED",
- L"TCP_LISTEN",
- L"TCP_SYN_SENT",
- L"TCP_SYN_RCVD",
- L"TCP_ESTABLISHED",
- L"TCP_FIN_WAIT_1",
- L"TCP_FIN_WAIT_2",
- L"TCP_CLOSING",
- L"TCP_TIME_WAIT",
- L"TCP_CLOSE_WAIT",
- L"TCP_LAST_ACK"
-};
-
-
-/**
- Initialize the Tcb local related members.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpInitTcbLocal (
- IN OUT TCP_CB *Tcb
- )
-{
- //
- // Compute the checksum of the fixed parts of pseudo header
- //
- Tcb->HeadSum = NetPseudoHeadChecksum (
- Tcb->LocalEnd.Ip,
- Tcb->RemoteEnd.Ip,
- 0x06,
- 0
- );
-
- Tcb->Iss = TcpGetIss ();
- Tcb->SndUna = Tcb->Iss;
- Tcb->SndNxt = Tcb->Iss;
-
- Tcb->SndWl2 = Tcb->Iss;
- Tcb->SndWnd = 536;
-
- Tcb->RcvWnd = GET_RCV_BUFFSIZE (Tcb->Sk);
-
- //
- // First window size is never scaled
- //
- Tcb->RcvWndScale = 0;
- Tcb->RetxmitSeqMax = 0;
-
- Tcb->ProbeTimerOn = FALSE;
-}
-
-
-/**
- Initialize the peer related members.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Seg Pointer to the segment that contains the peer's
- intial info.
- @param Opt Pointer to the options announced by the peer.
-
-**/
-VOID
-TcpInitTcbPeer (
- IN OUT TCP_CB *Tcb,
- IN TCP_SEG *Seg,
- IN TCP_OPTION *Opt
- )
-{
- UINT16 RcvMss;
-
- ASSERT ((Tcb != NULL) && (Seg != NULL) && (Opt != NULL));
- ASSERT (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN));
-
- Tcb->SndWnd = Seg->Wnd;
- Tcb->SndWndMax = Tcb->SndWnd;
- Tcb->SndWl1 = Seg->Seq;
-
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_ACK)) {
- Tcb->SndWl2 = Seg->Ack;
- } else {
- Tcb->SndWl2 = Tcb->Iss + 1;
- }
-
- if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_MSS)) {
- Tcb->SndMss = (UINT16) MAX (64, Opt->Mss);
-
- RcvMss = TcpGetRcvMss (Tcb->Sk);
- if (Tcb->SndMss > RcvMss) {
- Tcb->SndMss = RcvMss;
- }
-
- } else {
- //
- // One end doesn't support MSS option, use default.
- //
- Tcb->RcvMss = 536;
- }
-
- Tcb->CWnd = Tcb->SndMss;
-
- Tcb->Irs = Seg->Seq;
- Tcb->RcvNxt = Tcb->Irs + 1;
-
- Tcb->RcvWl2 = Tcb->RcvNxt;
-
- if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_WS) &&
- !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS)) {
-
- Tcb->SndWndScale = Opt->WndScale;
-
- Tcb->RcvWndScale = TcpComputeScale (Tcb);
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_WS);
-
- } else {
- //
- // One end doesn't support window scale option. use zero.
- //
- Tcb->RcvWndScale = 0;
- }
-
- if (TCP_FLG_ON (Opt->Flag, TCP_OPTION_RCVD_TS) &&
- !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS)) {
-
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_TS);
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RCVD_TS);
-
- Tcb->TsRecent = Opt->TSVal;
-
- //
- // Compute the effective SndMss per RFC1122
- // section 4.2.2.6. If timestamp option is
- // enabled, it will always occupy 12 bytes.
- //
- Tcb->SndMss -= TCP_OPTION_TS_ALIGNED_LEN;
- }
-}
-
-
-/**
- Locate a listen TCB that matchs the Local and Remote.
-
- @param Local Pointer to the local (IP, Port).
- @param Remote Pointer to the remote (IP, Port).
-
- @return Pointer to the TCP_CB with the least number of wildcard,
- if NULL no match is found.
-
-**/
-TCP_CB *
-TcpLocateListenTcb (
- IN TCP_PEER *Local,
- IN TCP_PEER *Remote
- )
-{
- LIST_ENTRY *Entry;
- TCP_CB *Node;
- TCP_CB *Match;
- INTN Last;
- INTN Cur;
-
- Last = 4;
- Match = NULL;
-
- NET_LIST_FOR_EACH (Entry, &mTcpListenQue) {
- Node = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);
-
- if ((Local->Port != Node->LocalEnd.Port) ||
- !TCP_PEER_MATCH (Remote, &Node->RemoteEnd) ||
- !TCP_PEER_MATCH (Local, &Node->LocalEnd)) {
-
- continue;
- }
-
- //
- // Compute the number of wildcard
- //
- Cur = 0;
- if (Node->RemoteEnd.Ip == 0) {
- Cur++;
- }
-
- if (Node->RemoteEnd.Port == 0) {
- Cur++;
- }
-
- if (Node->LocalEnd.Ip == 0) {
- Cur++;
- }
-
- if (Cur < Last) {
- if (Cur == 0) {
- return Node;
- }
-
- Last = Cur;
- Match = Node;
- }
- }
-
- return Match;
-}
-
-
-/**
- Try to find one Tcb whose <Ip, Port> equals to <IN Addr, IN Port>.
-
- @param Addr Pointer to the IP address needs to match.
- @param Port The port number needs to match.
-
- @return The Tcb which matches the <Addr Port> paire exists or not.
-
-**/
-BOOLEAN
-TcpFindTcbByPeer (
- IN EFI_IPv4_ADDRESS *Addr,
- IN TCP_PORTNO Port
- )
-{
- TCP_PORTNO LocalPort;
- LIST_ENTRY *Entry;
- TCP_CB *Tcb;
-
- ASSERT ((Addr != NULL) && (Port != 0));
-
- LocalPort = HTONS (Port);
-
- NET_LIST_FOR_EACH (Entry, &mTcpListenQue) {
- Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);
-
- if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) &&
- (LocalPort == Tcb->LocalEnd.Port)) {
-
- return TRUE;
- }
- }
-
- NET_LIST_FOR_EACH (Entry, &mTcpRunQue) {
- Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);
-
- if (EFI_IP4_EQUAL (Addr, &Tcb->LocalEnd.Ip) &&
- (LocalPort == Tcb->LocalEnd.Port)) {
-
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-
-/**
- Locate the TCP_CB related to the socket pair.
-
- @param LocalPort The local port number.
- @param LocalIp The local IP address.
- @param RemotePort The remote port number.
- @param RemoteIp The remote IP address.
- @param Syn Whether to search the listen sockets, if TRUE, the
- listen sockets are searched.
-
- @return Pointer to the related TCP_CB, if NULL no match is found.
-
-**/
-TCP_CB *
-TcpLocateTcb (
- IN TCP_PORTNO LocalPort,
- IN UINT32 LocalIp,
- IN TCP_PORTNO RemotePort,
- IN UINT32 RemoteIp,
- IN BOOLEAN Syn
- )
-{
- TCP_PEER Local;
- TCP_PEER Remote;
- LIST_ENTRY *Entry;
- TCP_CB *Tcb;
-
- Local.Port = LocalPort;
- Local.Ip = LocalIp;
-
- Remote.Port = RemotePort;
- Remote.Ip = RemoteIp;
-
- //
- // First check for exact match.
- //
- NET_LIST_FOR_EACH (Entry, &mTcpRunQue) {
- Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);
-
- if (TCP_PEER_EQUAL (&Remote, &Tcb->RemoteEnd) &&
- TCP_PEER_EQUAL (&Local, &Tcb->LocalEnd)) {
-
- RemoveEntryList (&Tcb->List);
- InsertHeadList (&mTcpRunQue, &Tcb->List);
-
- return Tcb;
- }
- }
-
- //
- // Only check listen queue when SYN flag is on
- //
- if (Syn) {
- return TcpLocateListenTcb (&Local, &Remote);
- }
-
- return NULL;
-}
-
-
-/**
- Insert a Tcb into the proper queue.
-
- @param Tcb Pointer to the TCP_CB to be inserted.
-
- @retval 0 The Tcb is inserted successfully.
- @retval -1 Error condition occurred.
-
-**/
-INTN
-TcpInsertTcb (
- IN TCP_CB *Tcb
- )
-{
- LIST_ENTRY *Entry;
- LIST_ENTRY *Head;
- TCP_CB *Node;
-
- ASSERT (
- (Tcb != NULL) &&
- ((Tcb->State == TCP_LISTEN) ||
- (Tcb->State == TCP_SYN_SENT) ||
- (Tcb->State == TCP_SYN_RCVD) ||
- (Tcb->State == TCP_CLOSED))
- );
-
- if (Tcb->LocalEnd.Port == 0) {
- return -1;
- }
-
- Head = &mTcpRunQue;
-
- if (Tcb->State == TCP_LISTEN) {
- Head = &mTcpListenQue;
- }
-
- //
- // Check that Tcb isn't already on the list.
- //
- NET_LIST_FOR_EACH (Entry, Head) {
- Node = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);
-
- if (TCP_PEER_EQUAL (&Tcb->LocalEnd, &Node->LocalEnd) &&
- TCP_PEER_EQUAL (&Tcb->RemoteEnd, &Node->RemoteEnd)) {
-
- return -1;
- }
- }
-
- InsertHeadList (Head, &Tcb->List);
-
- return 0;
-}
-
-
-/**
- Clone a TCB_CB from Tcb.
-
- @param Tcb Pointer to the TCP_CB to be cloned.
-
- @return Pointer to the new cloned TCP_CB, if NULL error condition occurred.
-
-**/
-TCP_CB *
-TcpCloneTcb (
- IN TCP_CB *Tcb
- )
-{
- TCP_CB *Clone;
-
- Clone = AllocatePool (sizeof (TCP_CB));
-
- if (Clone == NULL) {
- return NULL;
-
- }
-
- CopyMem (Clone, Tcb, sizeof (TCP_CB));
-
- //
- // Increate the reference count of the shared IpInfo.
- //
- NET_GET_REF (Tcb->IpInfo);
-
- InitializeListHead (&Clone->List);
- InitializeListHead (&Clone->SndQue);
- InitializeListHead (&Clone->RcvQue);
-
- Clone->Sk = SockClone (Tcb->Sk);
- if (Clone->Sk == NULL) {
- DEBUG ((EFI_D_ERROR, "TcpCloneTcb: failed to clone a sock\n"));
- FreePool (Clone);
- return NULL;
- }
-
- ((TCP4_PROTO_DATA *) (Clone->Sk->ProtoReserved))->TcpPcb = Clone;
-
- return Clone;
-}
-
-
-/**
- Compute an ISS to be used by a new connection.
-
- @return The result ISS.
-
-**/
-TCP_SEQNO
-TcpGetIss (
- VOID
- )
-{
- mTcpGlobalIss += 2048;
- return mTcpGlobalIss;
-}
-
-
-/**
- Get the local mss.
-
- @param Sock Pointer to the socket to get mss
-
- @return The mss size.
-
-**/
-UINT16
-TcpGetRcvMss (
- IN SOCKET *Sock
- )
-{
- EFI_IP4_MODE_DATA Ip4Mode;
- TCP4_PROTO_DATA *TcpProto;
- EFI_IP4_PROTOCOL *Ip;
-
- ASSERT (Sock != NULL);
-
- TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
- Ip = TcpProto->TcpService->IpIo->Ip.Ip4;
- ASSERT (Ip != NULL);
-
- Ip->GetModeData (Ip, &Ip4Mode, NULL, NULL);
-
- return (UINT16) (Ip4Mode.MaxPacketSize - sizeof (TCP_HEAD));
-}
-
-
-/**
- Set the Tcb's state.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param State The state to be set.
-
-**/
-VOID
-TcpSetState (
- IN OUT TCP_CB *Tcb,
- IN UINT8 State
- )
-{
- ASSERT (Tcb->State < (sizeof (mTcpStateName) / sizeof (CHAR16 *)));
- ASSERT (State < (sizeof (mTcpStateName) / sizeof (CHAR16 *)));
-
- DEBUG (
- (EFI_D_NET,
- "Tcb (%p) state %s --> %s\n",
- Tcb,
- mTcpStateName[Tcb->State],
- mTcpStateName[State])
- );
-
- Tcb->State = State;
-
- switch (State) {
- case TCP_ESTABLISHED:
-
- SockConnEstablished (Tcb->Sk);
-
- if (Tcb->Parent != NULL) {
- //
- // A new connection is accepted by a listening socket, install
- // the device path.
- //
- TcpInstallDevicePath (Tcb->Sk);
- }
-
- break;
-
- case TCP_CLOSED:
-
- SockConnClosed (Tcb->Sk);
-
- break;
- default:
- break;
- }
-}
-
-
-/**
- Compute the TCP segment's checksum.
-
- @param Nbuf Pointer to the buffer that contains the TCP
- segment.
- @param HeadSum The checksum value of the fixed part of pseudo
- header.
-
- @return The checksum value.
-
-**/
-UINT16
-TcpChecksum (
- IN NET_BUF *Nbuf,
- IN UINT16 HeadSum
- )
-{
- UINT16 Checksum;
-
- Checksum = NetbufChecksum (Nbuf);
- Checksum = NetAddChecksum (Checksum, HeadSum);
-
- Checksum = NetAddChecksum (
- Checksum,
- HTONS ((UINT16) Nbuf->TotalSize)
- );
-
- return (UINT16) ~Checksum;
-}
-
-/**
- Translate the information from the head of the received TCP
- segment Nbuf contains and fill it into a TCP_SEG structure.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Nbuf Pointer to the buffer contains the TCP segment.
-
- @return Pointer to the TCP_SEG that contains the translated TCP head information.
-
-**/
-TCP_SEG *
-TcpFormatNetbuf (
- IN TCP_CB *Tcb,
- IN OUT NET_BUF *Nbuf
- )
-{
- TCP_SEG *Seg;
- TCP_HEAD *Head;
-
- Seg = TCPSEG_NETBUF (Nbuf);
- Head = (TCP_HEAD *) NetbufGetByte (Nbuf, 0, NULL);
- ASSERT (Head != NULL);
- Nbuf->Tcp = Head;
-
- Seg->Seq = NTOHL (Head->Seq);
- Seg->Ack = NTOHL (Head->Ack);
- Seg->End = Seg->Seq + (Nbuf->TotalSize - (Head->HeadLen << 2));
-
- Seg->Urg = NTOHS (Head->Urg);
- Seg->Wnd = (NTOHS (Head->Wnd) << Tcb->SndWndScale);
- Seg->Flag = Head->Flag;
-
- //
- // SYN and FIN flag occupy one sequence space each.
- //
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) {
- //
- // RFC requires that initial window not be scaled
- //
- Seg->Wnd = NTOHS (Head->Wnd);
- Seg->End++;
- }
-
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) {
- Seg->End++;
- }
-
- return Seg;
-}
-
-
-/**
- Reset the connection related with Tcb.
-
- @param Tcb Pointer to the TCP_CB of the connection to be
- reset.
-
-**/
-VOID
-TcpResetConnection (
- IN TCP_CB *Tcb
- )
-{
- NET_BUF *Nbuf;
- TCP_HEAD *Nhead;
-
- Nbuf = NetbufAlloc (TCP_MAX_HEAD);
-
- if (Nbuf == NULL) {
- return ;
- }
-
- Nhead = (TCP_HEAD *) NetbufAllocSpace (
- Nbuf,
- sizeof (TCP_HEAD),
- NET_BUF_TAIL
- );
-
- ASSERT (Nhead != NULL);
-
- Nbuf->Tcp = Nhead;
-
- Nhead->Flag = TCP_FLG_RST;
- Nhead->Seq = HTONL (Tcb->SndNxt);
- Nhead->Ack = HTONL (Tcb->RcvNxt);
- Nhead->SrcPort = Tcb->LocalEnd.Port;
- Nhead->DstPort = Tcb->RemoteEnd.Port;
- Nhead->HeadLen = (UINT8) (sizeof (TCP_HEAD) >> 2);
- Nhead->Res = 0;
- Nhead->Wnd = HTONS (0xFFFF);
- Nhead->Checksum = 0;
- Nhead->Urg = 0;
- Nhead->Checksum = TcpChecksum (Nbuf, Tcb->HeadSum);
-
- TcpSendIpPacket (Tcb, Nbuf, Tcb->LocalEnd.Ip, Tcb->RemoteEnd.Ip);
-
- NetbufFree (Nbuf);
-}
-
-
-/**
- Initialize an active connection.
-
- @param Tcb Pointer to the TCP_CB that wants to initiate a
- connection.
-
-**/
-VOID
-TcpOnAppConnect (
- IN OUT TCP_CB *Tcb
- )
-{
- TcpInitTcbLocal (Tcb);
- TcpSetState (Tcb, TCP_SYN_SENT);
-
- TcpSetTimer (Tcb, TCP_TIMER_CONNECT, Tcb->ConnectTimeout);
- TcpToSendData (Tcb, 1);
-}
-
-
-/**
- Initiate the connection close procedure, called when
- applications want to close the connection.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpOnAppClose (
- IN OUT TCP_CB *Tcb
- )
-{
- ASSERT (Tcb != NULL);
-
- if (!IsListEmpty (&Tcb->RcvQue) || GET_RCV_DATASIZE (Tcb->Sk) != 0) {
-
- DEBUG ((EFI_D_WARN, "TcpOnAppClose: connection reset "
- "because data is lost for TCB %p\n", Tcb));
-
- TcpResetConnection (Tcb);
- TcpClose (Tcb);
- return;
- }
-
- switch (Tcb->State) {
- case TCP_CLOSED:
- case TCP_LISTEN:
- case TCP_SYN_SENT:
- TcpSetState (Tcb, TCP_CLOSED);
- break;
-
- case TCP_SYN_RCVD:
- case TCP_ESTABLISHED:
- TcpSetState (Tcb, TCP_FIN_WAIT_1);
- break;
-
- case TCP_CLOSE_WAIT:
- TcpSetState (Tcb, TCP_LAST_ACK);
- break;
- default:
- break;
- }
-
- TcpToSendData (Tcb, 1);
-}
-
-
-/**
- Check whether the application's newly delivered data can be sent out.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
- @retval 0 Whether the data is sent out or is buffered for
- further sending.
- @retval -1 The Tcb is not in a state that data is permitted to
- be sent out.
-
-**/
-INTN
-TcpOnAppSend (
- IN OUT TCP_CB *Tcb
- )
-{
-
- switch (Tcb->State) {
- case TCP_CLOSED:
- return -1;
-
- case TCP_LISTEN:
- return -1;
-
- case TCP_SYN_SENT:
- case TCP_SYN_RCVD:
- return 0;
-
- case TCP_ESTABLISHED:
- case TCP_CLOSE_WAIT:
- TcpToSendData (Tcb, 0);
- return 0;
-
- case TCP_FIN_WAIT_1:
- case TCP_FIN_WAIT_2:
- case TCP_CLOSING:
- case TCP_LAST_ACK:
- case TCP_TIME_WAIT:
- return -1;
-
- default:
- break;
- }
-
- return 0;
-}
-
-
-/**
- Application has consumed some data, check whether
- to send a window updata ack or a delayed ack.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpOnAppConsume (
- IN TCP_CB *Tcb
- )
-{
- UINT32 TcpOld;
-
- switch (Tcb->State) {
- case TCP_CLOSED:
- return;
-
- case TCP_LISTEN:
- return;
-
- case TCP_SYN_SENT:
- case TCP_SYN_RCVD:
- return;
-
- case TCP_ESTABLISHED:
- TcpOld = TcpRcvWinOld (Tcb);
- if (TcpRcvWinNow (Tcb) > TcpOld) {
-
- if (TcpOld < Tcb->RcvMss) {
-
- DEBUG ((EFI_D_NET, "TcpOnAppConsume: send a window"
- " update for a window closed Tcb %p\n", Tcb));
-
- TcpSendAck (Tcb);
- } else if (Tcb->DelayedAck == 0) {
-
- DEBUG ((EFI_D_NET, "TcpOnAppConsume: scheduled a delayed"
- " ACK to update window for Tcb %p\n", Tcb));
-
- Tcb->DelayedAck = 1;
- }
- }
-
- break;
-
- case TCP_CLOSE_WAIT:
- return;
-
- case TCP_FIN_WAIT_1:
- case TCP_FIN_WAIT_2:
- case TCP_CLOSING:
- case TCP_LAST_ACK:
- case TCP_TIME_WAIT:
- return;
-
- default:
- break;
- }
-}
-
-
-/**
- Abort the connection by sending a reset segment, called
- when the application wants to abort the connection.
-
- @param Tcb Pointer to the TCP_CB of the TCP instance.
-
-**/
-VOID
-TcpOnAppAbort (
- IN TCP_CB *Tcb
- )
-{
- DEBUG ((EFI_D_WARN, "TcpOnAppAbort: connection reset "
- "issued by application for TCB %p\n", Tcb));
-
- switch (Tcb->State) {
- case TCP_SYN_RCVD:
- case TCP_ESTABLISHED:
- case TCP_FIN_WAIT_1:
- case TCP_FIN_WAIT_2:
- case TCP_CLOSE_WAIT:
- TcpResetConnection (Tcb);
- break;
- default:
- break;
- }
-
- TcpSetState (Tcb, TCP_CLOSED);
-}
-
-/**
- Install the device path protocol on the TCP instance.
-
- @param Sock Pointer to the socket representing the TCP instance.
-
- @retval EFI_SUCCESS The device path protocol is installed.
- @retval other Failed to install the device path protocol.
-
-**/
-EFI_STATUS
-TcpInstallDevicePath (
- IN SOCKET *Sock
- )
-{
- TCP4_PROTO_DATA *TcpProto;
- TCP4_SERVICE_DATA *TcpService;
- TCP_CB *Tcb;
- IPv4_DEVICE_PATH Ip4DPathNode;
- EFI_STATUS Status;
- TCP_PORTNO LocalPort;
- TCP_PORTNO RemotePort;
-
- TcpProto = (TCP4_PROTO_DATA *) Sock->ProtoReserved;
- TcpService = TcpProto->TcpService;
- Tcb = TcpProto->TcpPcb;
-
- LocalPort = NTOHS (Tcb->LocalEnd.Port);
- RemotePort = NTOHS (Tcb->RemoteEnd.Port);
- NetLibCreateIPv4DPathNode (
- &Ip4DPathNode,
- TcpService->ControllerHandle,
- Tcb->LocalEnd.Ip,
- LocalPort,
- Tcb->RemoteEnd.Ip,
- RemotePort,
- EFI_IP_PROTO_TCP,
- Tcb->UseDefaultAddr
- );
-
- IP4_COPY_ADDRESS (&Ip4DPathNode.SubnetMask, &Tcb->SubnetMask);
-
- Sock->DevicePath = AppendDevicePathNode (
- Sock->ParentDevicePath,
- (EFI_DEVICE_PATH_PROTOCOL *) &Ip4DPathNode
- );
- if (Sock->DevicePath == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Status = gBS->InstallProtocolInterface (
- &Sock->SockHandle,
- &gEfiDevicePathProtocolGuid,
- EFI_NATIVE_INTERFACE,
- Sock->DevicePath
- );
- if (EFI_ERROR (Status)) {
- FreePool (Sock->DevicePath);
- }
-
- return Status;
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c
deleted file mode 100644
index e84310f6c6..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c
+++ /dev/null
@@ -1,352 +0,0 @@
-/** @file
- Routines to process TCP option.
-
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Tcp4Main.h"
-
-/**
- Get a UINT16 value from buffer.
-
- @param Buf Pointer to input buffer.
-
- @return The UINT16 value get from buffer.
-
-**/
-UINT16
-TcpGetUint16 (
- IN UINT8 *Buf
- )
-{
- UINT16 Value;
- CopyMem (&Value, Buf, sizeof (UINT16));
- return NTOHS (Value);
-}
-
-/**
- Get a UINT32 value from buffer.
-
- @param Buf Pointer to input buffer.
-
- @return The UINT32 value get from buffer.
-
-**/
-UINT32
-TcpGetUint32 (
- IN UINT8 *Buf
- )
-{
- UINT32 Value;
- CopyMem (&Value, Buf, sizeof (UINT32));
- return NTOHL (Value);
-}
-
-/**
- Put a UINT32 value in buffer.
-
- @param Buf Pointer to the buffer.
- @param Data The UINT32 Date to put in buffer
-
-**/
-VOID
-TcpPutUint32 (
- OUT UINT8 *Buf,
- IN UINT32 Data
- )
-{
- Data = HTONL (Data);
- CopyMem (Buf, &Data, sizeof (UINT32));
-}
-
-
-/**
- Compute the window scale value according to the given buffer size.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
- @return The scale value.
-
-**/
-UINT8
-TcpComputeScale (
- IN TCP_CB *Tcb
- )
-{
- UINT8 Scale;
- UINT32 BufSize;
-
- ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL));
-
- BufSize = GET_RCV_BUFFSIZE (Tcb->Sk);
-
- Scale = 0;
- while ((Scale < TCP_OPTION_MAX_WS) &&
- ((UINT32) (TCP_OPTION_MAX_WIN << Scale) < BufSize)) {
-
- Scale++;
- }
-
- return Scale;
-}
-
-
-/**
- Build the TCP option in three-way handshake.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Nbuf Pointer to the buffer to store the options.
-
- @return The total length of the TCP option field.
-
-**/
-UINT16
-TcpSynBuildOption (
- IN TCP_CB *Tcb,
- IN NET_BUF *Nbuf
- )
-{
- UINT8 *Data;
- UINT16 Len;
-
- ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL));
-
- Len = 0;
-
- //
- // Add timestamp option if not disabled by application
- // and it is the first SYN segment or the peer has sent
- // us its timestamp.
- //
- if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_TS) &&
- (!TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_ACK) ||
- TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_TS))) {
-
- Data = NetbufAllocSpace (
- Nbuf,
- TCP_OPTION_TS_ALIGNED_LEN,
- NET_BUF_HEAD
- );
-
- ASSERT (Data != NULL);
- Len += TCP_OPTION_TS_ALIGNED_LEN;
-
- TcpPutUint32 (Data, TCP_OPTION_TS_FAST);
- TcpPutUint32 (Data + 4, mTcpTick);
- TcpPutUint32 (Data + 8, 0);
- }
-
- //
- // Build window scale option, only when are configured
- // to send WS option, and either we are doing active
- // open or we have received WS option from peer.
- //
- if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_WS) &&
- (!TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_ACK) ||
- TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RCVD_WS))) {
-
- Data = NetbufAllocSpace (
- Nbuf,
- TCP_OPTION_WS_ALIGNED_LEN,
- NET_BUF_HEAD
- );
-
- ASSERT (Data != NULL);
-
- Len += TCP_OPTION_WS_ALIGNED_LEN;
- TcpPutUint32 (Data, TCP_OPTION_WS_FAST | TcpComputeScale (Tcb));
- }
-
- //
- // Build MSS option
- //
- Data = NetbufAllocSpace (Nbuf, TCP_OPTION_MSS_LEN, 1);
- ASSERT (Data != NULL);
-
- Len += TCP_OPTION_MSS_LEN;
- TcpPutUint32 (Data, TCP_OPTION_MSS_FAST | Tcb->RcvMss);
-
- return Len;
-}
-
-
-/**
- Build the TCP option in synchronized states.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Nbuf Pointer to the buffer to store the options.
-
- @return The total length of the TCP option field.
-
-**/
-UINT16
-TcpBuildOption (
- IN TCP_CB *Tcb,
- IN NET_BUF *Nbuf
- )
-{
- UINT8 *Data;
- UINT16 Len;
-
- ASSERT ((Tcb != NULL) && (Nbuf != NULL) && (Nbuf->Tcp == NULL));
- Len = 0;
-
- //
- // Build Timestamp option
- //
- if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_TS) &&
- !TCP_FLG_ON (TCPSEG_NETBUF (Nbuf)->Flag, TCP_FLG_RST)) {
-
- Data = NetbufAllocSpace (
- Nbuf,
- TCP_OPTION_TS_ALIGNED_LEN,
- NET_BUF_HEAD
- );
-
- ASSERT (Data != NULL);
- Len += TCP_OPTION_TS_ALIGNED_LEN;
-
- TcpPutUint32 (Data, TCP_OPTION_TS_FAST);
- TcpPutUint32 (Data + 4, mTcpTick);
- TcpPutUint32 (Data + 8, Tcb->TsRecent);
- }
-
- return Len;
-}
-
-
-/**
- Parse the supported options.
-
- @param Tcp Pointer to the TCP_CB of this TCP instance.
- @param Option Pointer to the TCP_OPTION used to store the successfully pasrsed
- options.
-
- @retval 0 The options are successfully pasrsed.
- @retval -1 Ilegal option was found.
-
-**/
-INTN
-TcpParseOption (
- IN TCP_HEAD *Tcp,
- IN OUT TCP_OPTION *Option
- )
-{
- UINT8 *Head;
- UINT8 TotalLen;
- UINT8 Cur;
- UINT8 Type;
- UINT8 Len;
-
- ASSERT ((Tcp != NULL) && (Option != NULL));
-
- Option->Flag = 0;
-
- TotalLen = (UINT8) ((Tcp->HeadLen << 2) - sizeof (TCP_HEAD));
- if (TotalLen <= 0) {
- return 0;
- }
-
- Head = (UINT8 *) (Tcp + 1);
-
- //
- // Fast process of timestamp option
- //
- if ((TotalLen == TCP_OPTION_TS_ALIGNED_LEN) &&
- (TcpGetUint32 (Head) == TCP_OPTION_TS_FAST)) {
-
- Option->TSVal = TcpGetUint32 (Head + 4);
- Option->TSEcr = TcpGetUint32 (Head + 8);
- Option->Flag = TCP_OPTION_RCVD_TS;
-
- return 0;
- }
-
- //
- // Slow path to process the options.
- //
- Cur = 0;
-
- while (Cur < TotalLen) {
- Type = Head[Cur];
-
- switch (Type) {
- case TCP_OPTION_MSS:
- Len = Head[Cur + 1];
-
- if ((Len != TCP_OPTION_MSS_LEN) ||
- (TotalLen - Cur < TCP_OPTION_MSS_LEN)) {
-
- return -1;
- }
-
- Option->Mss = TcpGetUint16 (&Head[Cur + 2]);
- TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_MSS);
-
- Cur += TCP_OPTION_MSS_LEN;
- break;
-
- case TCP_OPTION_WS:
- Len = Head[Cur + 1];
-
- if ((Len != TCP_OPTION_WS_LEN) ||
- (TotalLen - Cur < TCP_OPTION_WS_LEN)) {
-
- return -1;
- }
-
- Option->WndScale = (UINT8) MIN (14, Head[Cur + 2]);
- TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_WS);
-
- Cur += TCP_OPTION_WS_LEN;
- break;
-
- case TCP_OPTION_TS:
- Len = Head[Cur + 1];
-
- if ((Len != TCP_OPTION_TS_LEN) ||
- (TotalLen - Cur < TCP_OPTION_TS_LEN)) {
-
- return -1;
- }
-
- Option->TSVal = TcpGetUint32 (&Head[Cur + 2]);
- Option->TSEcr = TcpGetUint32 (&Head[Cur + 6]);
- TCP_SET_FLG (Option->Flag, TCP_OPTION_RCVD_TS);
-
- Cur += TCP_OPTION_TS_LEN;
- break;
-
- case TCP_OPTION_NOP:
- Cur++;
- break;
-
- case TCP_OPTION_EOP:
- Cur = TotalLen;
- break;
-
- default:
- Len = Head[Cur + 1];
-
- if ((TotalLen - Cur) < Len || Len < 2) {
- return -1;
- }
-
- Cur = (UINT8) (Cur + Len);
- break;
- }
-
- }
-
- return 0;
-}
-
-
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h
deleted file mode 100644
index f9782cb598..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/** @file
- Tcp option's routine header file.
-
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _TCP4_OPTION_H_
-#define _TCP4_OPTION_H_
-
-///
-/// The structure to store the parse option value.
-/// ParseOption only parse the options, don't process them.
-///
-typedef struct _TCP_OPTION {
- UINT8 Flag; ///< Flag such as TCP_OPTION_RCVD_MSS
- UINT8 WndScale; ///< The WndScale received
- UINT16 Mss; ///< The Mss received
- UINT32 TSVal; ///< The TSVal field in a timestamp option
- UINT32 TSEcr; ///< The TSEcr field in a timestamp option
-} TCP_OPTION;
-
-//
-// supported TCP option type and their length
-//
-#define TCP_OPTION_EOP 0 ///< End Of oPtion
-#define TCP_OPTION_NOP 1 ///< No-Option.
-#define TCP_OPTION_MSS 2 ///< Maximum Segment Size
-#define TCP_OPTION_WS 3 ///< Window scale
-#define TCP_OPTION_TS 8 ///< Timestamp
-#define TCP_OPTION_MSS_LEN 4 ///< Length of MSS option
-#define TCP_OPTION_WS_LEN 3 ///< Length of window scale option
-#define TCP_OPTION_TS_LEN 10 ///< Length of timestamp option
-#define TCP_OPTION_WS_ALIGNED_LEN 4 ///< Length of window scale option, aligned
-#define TCP_OPTION_TS_ALIGNED_LEN 12 ///< Length of timestamp option, aligned
-
-//
-// recommend format of timestamp window scale
-// option for fast process.
-//
-#define TCP_OPTION_TS_FAST ((TCP_OPTION_NOP << 24) | \
- (TCP_OPTION_NOP << 16) | \
- (TCP_OPTION_TS << 8) | \
- (TCP_OPTION_TS_LEN))
-
-#define TCP_OPTION_WS_FAST ((TCP_OPTION_NOP << 24) | \
- (TCP_OPTION_WS << 16) | \
- (TCP_OPTION_WS_LEN << 8))
-
-#define TCP_OPTION_MSS_FAST ((TCP_OPTION_MSS << 24) | (TCP_OPTION_MSS_LEN << 16))
-
-//
-// Other misc definations
-//
-#define TCP_OPTION_RCVD_MSS 0x01
-#define TCP_OPTION_RCVD_WS 0x02
-#define TCP_OPTION_RCVD_TS 0x04
-#define TCP_OPTION_MAX_WS 14 ///< Maxium window scale value
-#define TCP_OPTION_MAX_WIN 0xffff ///< Max window size in TCP header
-
-
-/**
- Compute the window scale value according to the given buffer size.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
- @return The scale value.
-
-**/
-UINT8
-TcpComputeScale (
- IN TCP_CB *Tcb
- );
-
-/**
- Build the TCP option in three-way handshake.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Nbuf Pointer to the buffer to store the options.
-
- @return The total length of the TCP option field.
-
-**/
-UINT16
-TcpSynBuildOption (
- IN TCP_CB *Tcb,
- IN NET_BUF *Nbuf
- );
-
-/**
- Build the TCP option in synchronized states.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Nbuf Pointer to the buffer to store the options.
-
- @return The total length of the TCP option field.
-
-**/
-UINT16
-TcpBuildOption (
- IN TCP_CB *Tcb,
- IN NET_BUF *Nbuf
- );
-
-/**
- Parse the supported options.
-
- @param Tcp Pointer to the TCP_CB of this TCP instance.
- @param Option Pointer to the TCP_OPTION used to store the successfully pasrsed
- options.
-
- @retval 0 The options are successfully pasrsed.
- @retval -1 Ilegal option was found.
-
-**/
-INTN
-TcpParseOption (
- IN TCP_HEAD *Tcp,
- IN OUT TCP_OPTION *Option
- );
-
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c
deleted file mode 100644
index 760b09a1ed..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c
+++ /dev/null
@@ -1,1238 +0,0 @@
-/** @file
- TCP output process routines.
-
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Tcp4Main.h"
-
-UINT8 mTcpOutFlag[] = {
- 0, // TCP_CLOSED
- 0, // TCP_LISTEN
- TCP_FLG_SYN, // TCP_SYN_SENT
- TCP_FLG_SYN | TCP_FLG_ACK, // TCP_SYN_RCVD
- TCP_FLG_ACK, // TCP_ESTABLISHED
- TCP_FLG_FIN | TCP_FLG_ACK, // TCP_FIN_WAIT_1
- TCP_FLG_ACK, // TCP_FIN_WAIT_2
- TCP_FLG_ACK | TCP_FLG_FIN, // TCP_CLOSING
- TCP_FLG_ACK, // TCP_TIME_WAIT
- TCP_FLG_ACK, // TCP_CLOSE_WAIT
- TCP_FLG_FIN | TCP_FLG_ACK // TCP_LAST_ACK
-};
-
-
-/**
- Compute the sequence space left in the old receive window.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
- @return The sequence space left in the old receive window.
-
-**/
-UINT32
-TcpRcvWinOld (
- IN TCP_CB *Tcb
- )
-{
- UINT32 OldWin;
-
- OldWin = 0;
-
- if (TCP_SEQ_GT (Tcb->RcvWl2 + Tcb->RcvWnd, Tcb->RcvNxt)) {
-
- OldWin = TCP_SUB_SEQ (
- Tcb->RcvWl2 + Tcb->RcvWnd,
- Tcb->RcvNxt
- );
- }
-
- return OldWin;
-}
-
-
-/**
- Compute the current receive window.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
- @return The size of the current receive window, in bytes.
-
-**/
-UINT32
-TcpRcvWinNow (
- IN TCP_CB *Tcb
- )
-{
- SOCKET *Sk;
- UINT32 Win;
- UINT32 Increase;
- UINT32 OldWin;
-
- Sk = Tcb->Sk;
- ASSERT (Sk != NULL);
-
- OldWin = TcpRcvWinOld (Tcb);
-
- Win = SockGetFreeSpace (Sk, SOCK_RCV_BUF);
-
- Increase = 0;
- if (Win > OldWin) {
- Increase = Win - OldWin;
- }
-
- //
- // Receiver's SWS: don't advertise a bigger window
- // unless it can be increased by at least one Mss or
- // half of the receive buffer.
- //
- if ((Increase > Tcb->SndMss) ||
- (2 * Increase >= GET_RCV_BUFFSIZE (Sk))) {
-
- return Win;
- }
-
- return OldWin;
-}
-
-
-/**
- Compute the value to fill in the window size field of the outgoing segment.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Syn The flag to indicate whether the outgoing segment is a SYN
- segment.
-
- @return The value of the local receive window size used to fill the outing segment.
-
-**/
-UINT16
-TcpComputeWnd (
- IN OUT TCP_CB *Tcb,
- IN BOOLEAN Syn
- )
-{
- UINT32 Wnd;
-
- //
- // RFC requires that initial window not be scaled
- //
- if (Syn) {
-
- Wnd = GET_RCV_BUFFSIZE (Tcb->Sk);
- } else {
-
- Wnd = TcpRcvWinNow (Tcb);
-
- Tcb->RcvWnd = Wnd;
- }
-
- Wnd = MIN (Wnd >> Tcb->RcvWndScale, 0xffff);
- return NTOHS ((UINT16) Wnd);
-}
-
-
-/**
- Get the maximum SndNxt.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
- @return The sequence number of the maximum SndNxt.
-
-**/
-TCP_SEQNO
-TcpGetMaxSndNxt (
- IN TCP_CB *Tcb
- )
-{
- LIST_ENTRY *Entry;
- NET_BUF *Nbuf;
-
- if (IsListEmpty (&Tcb->SndQue)) {
- return Tcb->SndNxt;
- }
-
- Entry = Tcb->SndQue.BackLink;
- Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List);
-
- ASSERT (TCP_SEQ_GEQ (TCPSEG_NETBUF (Nbuf)->End, Tcb->SndNxt));
- return TCPSEG_NETBUF (Nbuf)->End;
-}
-
-
-/**
- Compute how much data to send.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Force Whether to ignore the sender's SWS avoidance algorithm and send
- out data by force.
-
- @return The length of the data can be sent, if 0, no data can be sent.
-
-**/
-UINT32
-TcpDataToSend (
- IN TCP_CB *Tcb,
- IN INTN Force
- )
-{
- SOCKET *Sk;
- UINT32 Win;
- UINT32 Len;
- UINT32 Left;
- UINT32 Limit;
-
- Sk = Tcb->Sk;
- ASSERT (Sk != NULL);
-
- //
- // TCP should NOT send data beyond the send window
- // and congestion window. The right edge of send
- // window is defined as SND.WL2 + SND.WND. The right
- // edge of congestion window is defined as SND.UNA +
- // CWND.
- //
- Win = 0;
- Limit = Tcb->SndWl2 + Tcb->SndWnd;
-
- if (TCP_SEQ_GT (Limit, Tcb->SndUna + Tcb->CWnd)) {
-
- Limit = Tcb->SndUna + Tcb->CWnd;
- }
-
- if (TCP_SEQ_GT (Limit, Tcb->SndNxt)) {
- Win = TCP_SUB_SEQ (Limit, Tcb->SndNxt);
- }
-
- //
- // The data to send contains two parts: the data on the
- // socket send queue, and the data on the TCB's send
- // buffer. The later can be non-zero if the peer shrinks
- // its advertised window.
- //
- Left = GET_SND_DATASIZE (Sk) +
- TCP_SUB_SEQ (TcpGetMaxSndNxt (Tcb), Tcb->SndNxt);
-
- Len = MIN (Win, Left);
-
- if (Len > Tcb->SndMss) {
- Len = Tcb->SndMss;
- }
-
- if ((Force != 0)|| (Len == 0 && Left == 0)) {
- return Len;
- }
-
- if (Len == 0 && Left != 0) {
- goto SetPersistTimer;
- }
-
- //
- // Sender's SWS avoidance: Don't send a small segment unless
- // a)A full-sized segment can be sent,
- // b)at least one-half of the maximum sized windows that
- // the other end has ever advertised.
- // c)It can send everything it has and either it isn't
- // expecting an ACK or the Nagle algorithm is disabled.
- //
- if ((Len == Tcb->SndMss) || (2 * Len >= Tcb->SndWndMax)) {
-
- return Len;
- }
-
- if ((Len == Left) &&
- ((Tcb->SndNxt == Tcb->SndUna) ||
- TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_NAGLE))) {
-
- return Len;
- }
-
- //
- // RFC1122 suggests to set a timer when SWSA forbids TCP
- // sending more data, and combine it with probe timer.
- //
-SetPersistTimer:
- if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT)) {
-
- DEBUG (
- (EFI_D_WARN,
- "TcpDataToSend: enter persistent state for TCB %p\n",
- Tcb)
- );
-
- if (!Tcb->ProbeTimerOn) {
- TcpSetProbeTimer (Tcb);
- }
- }
-
- return 0;
-}
-
-
-/**
- Build the TCP header of the TCP segment and transmit the segment by IP.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Nbuf Pointer to the buffer containing the segment to be sent out.
-
- @retval 0 The segment is sent out successfully.
- @retval other Error condition occurred.
-
-**/
-INTN
-TcpTransmitSegment (
- IN OUT TCP_CB *Tcb,
- IN NET_BUF *Nbuf
- )
-{
- UINT16 Len;
- TCP_HEAD *Head;
- TCP_SEG *Seg;
- BOOLEAN Syn;
- UINT32 DataLen;
-
- ASSERT ((Nbuf != NULL) && (Nbuf->Tcp == NULL) && (TcpVerifySegment (Nbuf) != 0));
-
- DataLen = Nbuf->TotalSize;
-
- Seg = TCPSEG_NETBUF (Nbuf);
- Syn = TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN);
-
- if (Syn) {
-
- Len = TcpSynBuildOption (Tcb, Nbuf);
- } else {
-
- Len = TcpBuildOption (Tcb, Nbuf);
- }
-
- ASSERT ((Len % 4 == 0) && (Len <= 40));
-
- Len += sizeof (TCP_HEAD);
-
- Head = (TCP_HEAD *) NetbufAllocSpace (
- Nbuf,
- sizeof (TCP_HEAD),
- NET_BUF_HEAD
- );
-
- ASSERT (Head != NULL);
-
- Nbuf->Tcp = Head;
-
- Head->SrcPort = Tcb->LocalEnd.Port;
- Head->DstPort = Tcb->RemoteEnd.Port;
- Head->Seq = NTOHL (Seg->Seq);
- Head->Ack = NTOHL (Tcb->RcvNxt);
- Head->HeadLen = (UINT8) (Len >> 2);
- Head->Res = 0;
- Head->Wnd = TcpComputeWnd (Tcb, Syn);
- Head->Checksum = 0;
-
- //
- // Check whether to set the PSH flag.
- //
- TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_PSH);
-
- if (DataLen != 0) {
- if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_PSH) &&
- TCP_SEQ_BETWEEN (Seg->Seq, Tcb->SndPsh, Seg->End)) {
-
- TCP_SET_FLG (Seg->Flag, TCP_FLG_PSH);
- TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_SND_PSH);
-
- } else if ((Seg->End == Tcb->SndNxt) &&
- (GET_SND_DATASIZE (Tcb->Sk) == 0)) {
-
- TCP_SET_FLG (Seg->Flag, TCP_FLG_PSH);
- }
- }
-
- //
- // Check whether to set the URG flag and the urgent pointer.
- //
- TCP_CLEAR_FLG (Seg->Flag, TCP_FLG_URG);
-
- if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_SND_URG) &&
- TCP_SEQ_LEQ (Seg->Seq, Tcb->SndUp)) {
-
- TCP_SET_FLG (Seg->Flag, TCP_FLG_URG);
-
- if (TCP_SEQ_LT (Tcb->SndUp, Seg->End)) {
-
- Seg->Urg = (UINT16) TCP_SUB_SEQ (Tcb->SndUp, Seg->Seq);
- } else {
-
- Seg->Urg = (UINT16) MIN (
- TCP_SUB_SEQ (Tcb->SndUp,
- Seg->Seq),
- 0xffff
- );
- }
- }
-
- Head->Flag = Seg->Flag;
- Head->Urg = NTOHS (Seg->Urg);
- Head->Checksum = TcpChecksum (Nbuf, Tcb->HeadSum);
-
- //
- // update the TCP session's control information
- //
- Tcb->RcvWl2 = Tcb->RcvNxt;
- if (Syn) {
- Tcb->RcvWnd = NTOHS (Head->Wnd);
- }
-
- //
- // clear delayedack flag
- //
- Tcb->DelayedAck = 0;
-
- return TcpSendIpPacket (Tcb, Nbuf, Tcb->LocalEnd.Ip, Tcb->RemoteEnd.Ip);
-}
-
-
-/**
- Get a segment from the Tcb's SndQue.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Seq The sequence number of the segment.
- @param Len The maximum length of the segment.
-
- @return Pointer to the segment, if NULL some error occurred.
-
-**/
-NET_BUF *
-TcpGetSegmentSndQue (
- IN TCP_CB *Tcb,
- IN TCP_SEQNO Seq,
- IN UINT32 Len
- )
-{
- LIST_ENTRY *Head;
- LIST_ENTRY *Cur;
- NET_BUF *Node;
- TCP_SEG *Seg;
- NET_BUF *Nbuf;
- TCP_SEQNO End;
- UINT8 *Data;
- UINT8 Flag;
- INT32 Offset;
- INT32 CopyLen;
-
- ASSERT ((Tcb != NULL) && TCP_SEQ_LEQ (Seq, Tcb->SndNxt) && (Len > 0));
-
- //
- // Find the segment that contains the Seq.
- //
- Head = &Tcb->SndQue;
-
- Node = NULL;
- Seg = NULL;
-
- NET_LIST_FOR_EACH (Cur, Head) {
- Node = NET_LIST_USER_STRUCT (Cur, NET_BUF, List);
- Seg = TCPSEG_NETBUF (Node);
-
- if (TCP_SEQ_LT (Seq, Seg->End) && TCP_SEQ_LEQ (Seg->Seq, Seq)) {
-
- break;
- }
- }
-
- ASSERT (Cur != Head);
- ASSERT (Node != NULL);
- ASSERT (Seg != NULL);
-
- //
- // Return the buffer if it can be returned without
- // adjustment:
- //
- if ((Seg->Seq == Seq) &&
- TCP_SEQ_LEQ (Seg->End, Seg->Seq + Len) &&
- !NET_BUF_SHARED (Node)) {
-
- NET_GET_REF (Node);
- return Node;
- }
-
- //
- // Create a new buffer and copy data there.
- //
- Nbuf = NetbufAlloc (Len + TCP_MAX_HEAD);
-
- if (Nbuf == NULL) {
- return NULL;
- }
-
- NetbufReserve (Nbuf, TCP_MAX_HEAD);
-
- Flag = Seg->Flag;
- End = Seg->End;
-
- if (TCP_SEQ_LT (Seq + Len, Seg->End)) {
- End = Seq + Len;
- }
-
- CopyLen = TCP_SUB_SEQ (End, Seq);
- Offset = TCP_SUB_SEQ (Seq, Seg->Seq);
-
- //
- // If SYN is set and out of the range, clear the flag.
- // Because the sequence of the first byte is SEG.SEQ+1,
- // adjust Offset by -1. If SYN is in the range, copy
- // one byte less.
- //
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) {
-
- if (TCP_SEQ_LT (Seg->Seq, Seq)) {
-
- TCP_CLEAR_FLG (Flag, TCP_FLG_SYN);
- Offset--;
- } else {
-
- CopyLen--;
- }
- }
-
- //
- // If FIN is set and in the range, copy one byte less,
- // and if it is out of the range, clear the flag.
- //
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) {
-
- if (Seg->End == End) {
-
- CopyLen--;
- } else {
-
- TCP_CLEAR_FLG (Flag, TCP_FLG_FIN);
- }
- }
-
- ASSERT (CopyLen >= 0);
-
- //
- // copy data to the segment
- //
- if (CopyLen != 0) {
- Data = NetbufAllocSpace (Nbuf, CopyLen, NET_BUF_TAIL);
- ASSERT (Data != NULL);
-
- if ((INT32) NetbufCopy (Node, Offset, CopyLen, Data) != CopyLen) {
- goto OnError;
- }
- }
-
- CopyMem (TCPSEG_NETBUF (Nbuf), Seg, sizeof (TCP_SEG));
-
- TCPSEG_NETBUF (Nbuf)->Seq = Seq;
- TCPSEG_NETBUF (Nbuf)->End = End;
- TCPSEG_NETBUF (Nbuf)->Flag = Flag;
-
- return Nbuf;
-
-OnError:
- NetbufFree (Nbuf);
- return NULL;
-}
-
-
-/**
- Get a segment from the Tcb's socket buffer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Seq The sequence number of the segment.
- @param Len The maximum length of the segment.
-
- @return Pointer to the segment, if NULL some error occurred.
-
-**/
-NET_BUF *
-TcpGetSegmentSock (
- IN TCP_CB *Tcb,
- IN TCP_SEQNO Seq,
- IN UINT32 Len
- )
-{
- NET_BUF *Nbuf;
- UINT8 *Data;
- UINT32 DataGet;
-
- ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL));
-
- Nbuf = NetbufAlloc (Len + TCP_MAX_HEAD);
-
- if (Nbuf == NULL) {
- DEBUG ((EFI_D_ERROR, "TcpGetSegmentSock: failed to allocate "
- "a netbuf for TCB %p\n",Tcb));
-
- return NULL;
- }
-
- NetbufReserve (Nbuf, TCP_MAX_HEAD);
-
- DataGet = 0;
-
- if (Len != 0) {
- //
- // copy data to the segment.
- //
- Data = NetbufAllocSpace (Nbuf, Len, NET_BUF_TAIL);
- ASSERT (Data != NULL);
-
- DataGet = SockGetDataToSend (Tcb->Sk, 0, Len, Data);
- }
-
- NET_GET_REF (Nbuf);
-
- TCPSEG_NETBUF (Nbuf)->Seq = Seq;
- TCPSEG_NETBUF (Nbuf)->End = Seq + Len;
-
- InsertTailList (&(Tcb->SndQue), &(Nbuf->List));
-
- if (DataGet != 0) {
-
- SockDataSent (Tcb->Sk, DataGet);
- }
-
- return Nbuf;
-}
-
-
-/**
- Get a segment starting from sequence Seq of a maximum
- length of Len.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Seq The sequence number of the segment.
- @param Len The maximum length of the segment.
-
- @return Pointer to the segment, if NULL some error occurred.
-
-**/
-NET_BUF *
-TcpGetSegment (
- IN TCP_CB *Tcb,
- IN TCP_SEQNO Seq,
- IN UINT32 Len
- )
-{
- NET_BUF *Nbuf;
-
- ASSERT (Tcb != NULL);
-
- //
- // Compare the SndNxt with the max sequence number sent.
- //
- if ((Len != 0) && TCP_SEQ_LT (Seq, TcpGetMaxSndNxt (Tcb))) {
-
- Nbuf = TcpGetSegmentSndQue (Tcb, Seq, Len);
- } else {
-
- Nbuf = TcpGetSegmentSock (Tcb, Seq, Len);
- }
-
- ASSERT (TcpVerifySegment (Nbuf) != 0);
- return Nbuf;
-}
-
-
-/**
- Retransmit the segment from sequence Seq.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Seq The sequence number of the segment to be retransmitted.
-
- @retval 0 Retransmission succeeded.
- @retval -1 Error condition occurred.
-
-**/
-INTN
-TcpRetransmit (
- IN TCP_CB *Tcb,
- IN TCP_SEQNO Seq
- )
-{
- NET_BUF *Nbuf;
- UINT32 Len;
-
- //
- // Compute the maxium length of retransmission. It is
- // limited by three factors:
- // 1. Less than SndMss
- // 2. must in the current send window
- // 3. will not change the boundaries of queued segments.
- //
-
- //
- // Handle the Window Retraction if TCP window scale is enabled according to RFC7323:
- // On first retransmission, or if the sequence number is out of
- // window by less than 2^Rcv.Wind.Shift, then do normal
- // retransmission(s) without regard to the receiver window as long
- // as the original segment was in window when it was sent.
- //
- if ((Tcb->SndWndScale != 0) &&
- (TCP_SEQ_GT (Seq, Tcb->RetxmitSeqMax) || TCP_SEQ_BETWEEN (Tcb->SndWl2 + Tcb->SndWnd, Seq, Tcb->SndWl2 + Tcb->SndWnd + (1 << Tcb->SndWndScale)))) {
- Len = TCP_SUB_SEQ (Tcb->SndNxt, Seq);
- DEBUG (
- (EFI_D_WARN,
- "TcpRetransmit: retransmission without regard to the receiver window for TCB %p\n",
- Tcb)
- );
-
- } else if (TCP_SEQ_GEQ (Tcb->SndWl2 + Tcb->SndWnd, Seq)) {
- Len = TCP_SUB_SEQ (Tcb->SndWl2 + Tcb->SndWnd, Seq);
-
- } else {
- DEBUG (
- (EFI_D_WARN,
- "TcpRetransmit: retransmission cancelled because send window too small for TCB %p\n",
- Tcb)
- );
-
- return 0;
- }
-
- Len = MIN (Len, Tcb->SndMss);
-
- Nbuf = TcpGetSegmentSndQue (Tcb, Seq, Len);
- if (Nbuf == NULL) {
- return -1;
- }
-
- ASSERT (TcpVerifySegment (Nbuf) != 0);
-
- if (TcpTransmitSegment (Tcb, Nbuf) != 0) {
- goto OnError;
- }
-
- if (TCP_SEQ_GT (Seq, Tcb->RetxmitSeqMax)) {
- Tcb->RetxmitSeqMax = Seq;
- }
-
- //
- // The retransmitted buffer may be on the SndQue,
- // trim TCP head because all the buffer on SndQue
- // are headless.
- //
- ASSERT (Nbuf->Tcp != NULL);
- NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD);
- Nbuf->Tcp = NULL;
-
- NetbufFree (Nbuf);
- return 0;
-
-OnError:
- if (Nbuf != NULL) {
- NetbufFree (Nbuf);
- }
-
- return -1;
-}
-
-
-/**
- Check whether to send data/SYN/FIN and piggy back an ACK.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Force Whether to ignore the sender's SWS avoidance algorithm and send
- out data by force.
-
- @return The number of bytes sent.
-
-**/
-INTN
-TcpToSendData (
- IN OUT TCP_CB *Tcb,
- IN INTN Force
- )
-{
- UINT32 Len;
- INTN Sent;
- UINT8 Flag;
- NET_BUF *Nbuf;
- TCP_SEG *Seg;
- TCP_SEQNO Seq;
- TCP_SEQNO End;
-
- ASSERT ((Tcb != NULL) && (Tcb->Sk != NULL) && (Tcb->State != TCP_LISTEN));
-
- Sent = 0;
-
- if ((Tcb->State == TCP_CLOSED) ||
- TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT)) {
-
- return 0;
- }
-
-SEND_AGAIN:
- //
- // compute how much data can be sent
- //
- Len = TcpDataToSend (Tcb, Force);
- Seq = Tcb->SndNxt;
-
- ASSERT ((Tcb->State) < (ARRAY_SIZE (mTcpOutFlag)));
- Flag = mTcpOutFlag[Tcb->State];
-
- if ((Flag & TCP_FLG_SYN) != 0) {
-
- Seq = Tcb->Iss;
- Len = 0;
- }
-
- //
- // only send a segment without data if SYN or
- // FIN is set.
- //
- if ((Len == 0) &&
- ((Flag & (TCP_FLG_SYN | TCP_FLG_FIN)) == 0)) {
- return Sent;
- }
-
- Nbuf = TcpGetSegment (Tcb, Seq, Len);
-
- if (Nbuf == NULL) {
- DEBUG (
- (EFI_D_ERROR,
- "TcpToSendData: failed to get a segment for TCB %p\n",
- Tcb)
- );
-
- goto OnError;
- }
-
- Seg = TCPSEG_NETBUF (Nbuf);
-
- //
- // Set the TcpSeg in Nbuf.
- //
- Len = Nbuf->TotalSize;
- End = Seq + Len;
- if (TCP_FLG_ON (Flag, TCP_FLG_SYN)) {
- End++;
- }
-
- if ((Flag & TCP_FLG_FIN) != 0) {
- //
- // Send FIN if all data is sent, and FIN is
- // in the window
- //
- if ((TcpGetMaxSndNxt (Tcb) == Tcb->SndNxt) &&
- (GET_SND_DATASIZE (Tcb->Sk) == 0) &&
- TCP_SEQ_LT (End + 1, Tcb->SndWnd + Tcb->SndWl2)) {
-
- DEBUG (
- (EFI_D_NET,
- "TcpToSendData: send FIN "
- "to peer for TCB %p in state %s\n",
- Tcb,
- mTcpStateName[Tcb->State])
- );
-
- End++;
- } else {
- TCP_CLEAR_FLG (Flag, TCP_FLG_FIN);
- }
- }
-
- Seg->Seq = Seq;
- Seg->End = End;
- Seg->Flag = Flag;
-
- ASSERT (TcpVerifySegment (Nbuf) != 0);
- ASSERT (TcpCheckSndQue (&Tcb->SndQue) != 0);
-
- //
- // don't send an empty segment here.
- //
- if (Seg->End == Seg->Seq) {
- DEBUG ((EFI_D_WARN, "TcpToSendData: created a empty"
- " segment for TCB %p, free it now\n", Tcb));
-
- NetbufFree (Nbuf);
- return Sent;
- }
-
- if (TcpTransmitSegment (Tcb, Nbuf) != 0) {
- NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD);
- Nbuf->Tcp = NULL;
-
- if ((Flag & TCP_FLG_FIN) != 0) {
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT);
- }
-
- goto OnError;
- }
-
- Sent += TCP_SUB_SEQ (End, Seq);
-
- //
- // All the buffer in the SndQue is headless
- //
- ASSERT (Nbuf->Tcp != NULL);
-
- NetbufTrim (Nbuf, (Nbuf->Tcp->HeadLen << 2), NET_BUF_HEAD);
- Nbuf->Tcp = NULL;
-
- NetbufFree (Nbuf);
-
- //
- // update status in TCB
- //
- Tcb->DelayedAck = 0;
-
- if ((Flag & TCP_FLG_FIN) != 0) {
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_FIN_SENT);
- }
-
- if (TCP_SEQ_GT (End, Tcb->SndNxt)) {
- Tcb->SndNxt = End;
- }
-
- if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT)) {
- TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto);
- }
-
- //
- // Enable RTT measurement only if not in retransmit.
- // Karn's algorithm reqires not to update RTT when in loss.
- //
- if ((Tcb->CongestState == TCP_CONGEST_OPEN) &&
- !TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) {
-
- DEBUG ((EFI_D_NET, "TcpToSendData: set RTT measure "
- "sequence %d for TCB %p\n", Seq, Tcb));
-
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);
- Tcb->RttSeq = Seq;
- Tcb->RttMeasure = 0;
- }
-
- if (Len == Tcb->SndMss) {
- goto SEND_AGAIN;
- }
-
- return Sent;
-
-OnError:
- if (Nbuf != NULL) {
- NetbufFree (Nbuf);
- }
-
- return Sent;
-}
-
-
-/**
- Send an ACK immediately.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpSendAck (
- IN OUT TCP_CB *Tcb
- )
-{
- NET_BUF *Nbuf;
- TCP_SEG *Seg;
-
- Nbuf = NetbufAlloc (TCP_MAX_HEAD);
-
- if (Nbuf == NULL) {
- return;
- }
-
- NetbufReserve (Nbuf, TCP_MAX_HEAD);
-
- Seg = TCPSEG_NETBUF (Nbuf);
- Seg->Seq = Tcb->SndNxt;
- Seg->End = Tcb->SndNxt;
- Seg->Flag = TCP_FLG_ACK;
-
- if (TcpTransmitSegment (Tcb, Nbuf) == 0) {
- TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW);
- Tcb->DelayedAck = 0;
- }
-
- NetbufFree (Nbuf);
-}
-
-
-/**
- Send a zero probe segment. It can be used by keepalive and zero window probe.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
- @retval 0 The zero probe segment was sent out successfully.
- @retval other Error condition occurred.
-
-**/
-INTN
-TcpSendZeroProbe (
- IN OUT TCP_CB *Tcb
- )
-{
- NET_BUF *Nbuf;
- TCP_SEG *Seg;
- INTN Result;
-
- Nbuf = NetbufAlloc (TCP_MAX_HEAD);
-
- if (Nbuf == NULL) {
- return -1;
- }
-
- NetbufReserve (Nbuf, TCP_MAX_HEAD);
-
- //
- // SndNxt-1 is out of window. The peer should respond
- // with an ACK.
- //
- Seg = TCPSEG_NETBUF (Nbuf);
- Seg->Seq = Tcb->SndNxt - 1;
- Seg->End = Tcb->SndNxt - 1;
- Seg->Flag = TCP_FLG_ACK;
-
- Result = TcpTransmitSegment (Tcb, Nbuf);
- NetbufFree (Nbuf);
-
- return Result;
-}
-
-
-/**
- Check whether to send an ACK or delayed ACK.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpToSendAck (
- IN OUT TCP_CB *Tcb
- )
-{
- UINT32 TcpNow;
-
- TcpNow = TcpRcvWinNow (Tcb);
- //
- // Generally, TCP should send a delayed ACK unless:
- // 1. ACK at least every other FULL sized segment received,
- // 2. Packets received out of order
- // 3. Receiving window is open
- //
- if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_ACK_NOW) ||
- (Tcb->DelayedAck >= 1) ||
- (TcpNow > TcpRcvWinOld (Tcb))) {
- TcpSendAck (Tcb);
- return;
- }
-
- DEBUG ((EFI_D_NET, "TcpToSendAck: scheduled a delayed"
- " ACK for TCB %p\n", Tcb));
-
- //
- // schedule a delayed ACK
- //
- Tcb->DelayedAck++;
-}
-
-
-/**
- Send a RESET segment in response to the segment received.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance, may be NULL.
- @param Head TCP header of the segment that triggers the reset.
- @param Len Length of the segment that triggers the reset.
- @param Local Local IP address.
- @param Remote Remote peer's IP address.
-
- @retval 0 A reset is sent or no need to send it.
- @retval -1 No reset is sent.
-
-**/
-INTN
-TcpSendReset (
- IN TCP_CB *Tcb,
- IN TCP_HEAD *Head,
- IN INT32 Len,
- IN UINT32 Local,
- IN UINT32 Remote
- )
-{
- NET_BUF *Nbuf;
- TCP_HEAD *Nhead;
- UINT16 HeadSum;
-
- //
- // Don't respond to a Reset with reset
- //
- if ((Head->Flag & TCP_FLG_RST) != 0) {
- return 0;
- }
-
- Nbuf = NetbufAlloc (TCP_MAX_HEAD);
-
- if (Nbuf == NULL) {
- return -1;
- }
-
- Nhead = (TCP_HEAD *) NetbufAllocSpace (
- Nbuf,
- sizeof (TCP_HEAD),
- NET_BUF_TAIL
- );
-
- ASSERT (Nhead != NULL);
-
- Nbuf->Tcp = Nhead;
- Nhead->Flag = TCP_FLG_RST;
-
- //
- // Derive Seq/ACK from the segment if no TCB
- // associated with it, otherwise from the Tcb
- //
- if (Tcb == NULL) {
-
- if (TCP_FLG_ON (Head->Flag, TCP_FLG_ACK)) {
- Nhead->Seq = Head->Ack;
- Nhead->Ack = 0;
- } else {
- Nhead->Seq = 0;
- TCP_SET_FLG (Nhead->Flag, TCP_FLG_ACK);
- Nhead->Ack = HTONL (NTOHL (Head->Seq) + Len);
- }
- } else {
-
- Nhead->Seq = HTONL (Tcb->SndNxt);
- Nhead->Ack = HTONL (Tcb->RcvNxt);
- TCP_SET_FLG (Nhead->Flag, TCP_FLG_ACK);
- }
-
- Nhead->SrcPort = Head->DstPort;
- Nhead->DstPort = Head->SrcPort;
- Nhead->HeadLen = (UINT8) (sizeof (TCP_HEAD) >> 2);
- Nhead->Res = 0;
- Nhead->Wnd = HTONS (0xFFFF);
- Nhead->Checksum = 0;
- Nhead->Urg = 0;
-
- HeadSum = NetPseudoHeadChecksum (Local, Remote, 6, 0);
- Nhead->Checksum = TcpChecksum (Nbuf, HeadSum);
-
- TcpSendIpPacket (Tcb, Nbuf, Local, Remote);
-
- NetbufFree (Nbuf);
- return 0;
-}
-
-
-/**
- Verify that the segment is in good shape.
-
- @param Nbuf Buffer that contains the segment to be checked.
-
- @retval 0 The segment is broken.
- @retval 1 The segment is in good shape.
-
-**/
-INTN
-TcpVerifySegment (
- IN NET_BUF *Nbuf
- )
-{
- TCP_HEAD *Head;
- TCP_SEG *Seg;
- UINT32 Len;
-
- if (Nbuf == NULL) {
- return 1;
- }
-
- NET_CHECK_SIGNATURE (Nbuf, NET_BUF_SIGNATURE);
-
- Seg = TCPSEG_NETBUF (Nbuf);
- Len = Nbuf->TotalSize;
- Head = Nbuf->Tcp;
-
- if (Head != NULL) {
- if (Head->Flag != Seg->Flag) {
- return 0;
- }
-
- Len -= (Head->HeadLen << 2);
- }
-
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_SYN)) {
- Len++;
- }
-
- if (TCP_FLG_ON (Seg->Flag, TCP_FLG_FIN)) {
- Len++;
- }
-
- if (Seg->Seq + Len != Seg->End) {
- return 0;
- }
-
- return 1;
-}
-
-
-/**
- Verify that all the segments in SndQue are in good shape.
-
- @param Head Pointer to the head node of the SndQue.
-
- @retval 0 At least one segment is broken.
- @retval 1 All segments in the specific queue are in good shape.
-
-**/
-INTN
-TcpCheckSndQue (
- IN LIST_ENTRY *Head
- )
-{
- LIST_ENTRY *Entry;
- NET_BUF *Nbuf;
- TCP_SEQNO Seq;
-
- if (IsListEmpty (Head)) {
- return 1;
- }
- //
- // Initialize the Seq
- //
- Entry = Head->ForwardLink;
- Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List);
- Seq = TCPSEG_NETBUF (Nbuf)->Seq;
-
- NET_LIST_FOR_EACH (Entry, Head) {
- Nbuf = NET_LIST_USER_STRUCT (Entry, NET_BUF, List);
-
- if (TcpVerifySegment (Nbuf) == 0) {
- return 0;
- }
-
- //
- // All the node in the SndQue should has:
- // SEG.SEQ = LAST_SEG.END
- //
- if (Seq != TCPSEG_NETBUF (Nbuf)->Seq) {
- return 0;
- }
-
- Seq = TCPSEG_NETBUF (Nbuf)->End;
- }
-
- return 1;
-}
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h
deleted file mode 100644
index 37191fe651..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h
+++ /dev/null
@@ -1,357 +0,0 @@
-/** @file
- Tcp Protocol header file.
-
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _TCP4_PROTO_H_
-#define _TCP4_PROTO_H_
-
-typedef struct _TCP_CB TCP_CB;
-
-#include "Tcp4Driver.h"
-#include "Socket.h"
-#include "Tcp4Option.h"
-
-
-
-///
-/// Tcp states, Don't change their order, it is used as
-/// index to mTcpOutFlag and other macros
-///
-#define TCP_CLOSED 0
-#define TCP_LISTEN 1
-#define TCP_SYN_SENT 2
-#define TCP_SYN_RCVD 3
-#define TCP_ESTABLISHED 4
-#define TCP_FIN_WAIT_1 5
-#define TCP_FIN_WAIT_2 6
-#define TCP_CLOSING 7
-#define TCP_TIME_WAIT 8
-#define TCP_CLOSE_WAIT 9
-#define TCP_LAST_ACK 10
-
-
-///
-/// Flags in the TCP header
-///
-#define TCP_FLG_FIN 0x01
-#define TCP_FLG_SYN 0x02
-#define TCP_FLG_RST 0x04
-#define TCP_FLG_PSH 0x08
-#define TCP_FLG_ACK 0x10
-#define TCP_FLG_URG 0x20
-
- //
- // mask for all the flags
- //
-#define TCP_FLG_FLAG 0x3F
-
-
-#define TCP_CONNECT_REFUSED (-1) ///< TCP error status
-#define TCP_CONNECT_RESET (-2) ///< TCP error status
-#define TCP_CONNECT_CLOSED (-3) ///< TCP error status
-
-//
-// Current congestion status as suggested by RFC3782.
-//
-#define TCP_CONGEST_RECOVER 1 ///< During the NewReno fast recovery
-#define TCP_CONGEST_LOSS 2 ///< Retxmit because of retxmit time out
-#define TCP_CONGEST_OPEN 3 ///< TCP is opening its congestion window
-
-//
-// TCP control flags
-//
-#define TCP_CTRL_NO_NAGLE 0x0001 ///< Disable Nagle algorithm
-#define TCP_CTRL_NO_KEEPALIVE 0x0002 ///< Disable keepalive timer
-#define TCP_CTRL_NO_WS 0x0004 ///< Disable window scale option
-#define TCP_CTRL_RCVD_WS 0x0008 ///< Received a wnd scale option in syn
-#define TCP_CTRL_NO_TS 0x0010 ///< Disable Timestamp option
-#define TCP_CTRL_RCVD_TS 0x0020 ///< Received a Timestamp option in syn
-#define TCP_CTRL_SND_TS 0x0040 ///< Send Timestamp option to remote
-#define TCP_CTRL_SND_URG 0x0080 ///< In urgent send mode
-#define TCP_CTRL_RCVD_URG 0x0100 ///< In urgent receive mode
-#define TCP_CTRL_SND_PSH 0x0200 ///< In PUSH send mode
-#define TCP_CTRL_FIN_SENT 0x0400 ///< FIN is sent
-#define TCP_CTRL_FIN_ACKED 0x0800 ///< FIN is ACKed.
-#define TCP_CTRL_TIMER_ON 0x1000 ///< At least one of the timer is on
-#define TCP_CTRL_RTT_ON 0x2000 ///< The RTT measurement is on
-#define TCP_CTRL_ACK_NOW 0x4000 ///< Send the ACK now, don't delay
-
-//
-// Timer related values
-//
-#define TCP_TIMER_CONNECT 0 ///< Connection establishment timer
-#define TCP_TIMER_REXMIT 1 ///< Retransmit timer
-#define TCP_TIMER_PROBE 2 ///< Window probe timer
-#define TCP_TIMER_KEEPALIVE 3 ///< Keepalive timer
-#define TCP_TIMER_FINWAIT2 4 ///< FIN_WAIT_2 timer
-#define TCP_TIMER_2MSL 5 ///< TIME_WAIT tiemr
-#define TCP_TIMER_NUMBER 6 ///< The total number of TCP timer.
-#define TCP_TICK 200 ///< Every TCP tick is 200ms
-#define TCP_TICK_HZ 5 ///< The frequence of TCP tick
-#define TCP_RTT_SHIFT 3 ///< SRTT & RTTVAR scaled by 8
-#define TCP_RTO_MIN TCP_TICK_HZ ///< The minium value of RTO
-#define TCP_RTO_MAX (TCP_TICK_HZ * 60) ///< The maxium value of RTO
-#define TCP_FOLD_RTT 4 ///< Timeout threshod to fold RTT
-
-//
-// Default values for some timers
-//
-#define TCP_MAX_LOSS 12 ///< Default max times to retxmit
-#define TCP_KEEPALIVE_IDLE_MIN (TCP_TICK_HZ * 60 * 60 * 2) ///< First keep alive
-#define TCP_KEEPALIVE_PERIOD (TCP_TICK_HZ * 60)
-#define TCP_MAX_KEEPALIVE 8
-#define TCP_FIN_WAIT2_TIME (2 * TCP_TICK_HZ)
-#define TCP_TIME_WAIT_TIME (2 * TCP_TICK_HZ)
-#define TCP_PAWS_24DAY (24 * 24 * 60 * 60 * TCP_TICK_HZ)
-#define TCP_CONNECT_TIME (75 * TCP_TICK_HZ)
-
-//
-// The header space to be reserved before TCP data to accomodate :
-// 60byte IP head + 60byte TCP head + link layer head
-//
-#define TCP_MAX_HEAD 192
-
-//
-// Value ranges for some control option
-//
-#define TCP_RCV_BUF_SIZE (2 * 1024 * 1024)
-#define TCP_RCV_BUF_SIZE_MIN (8 * 1024)
-#define TCP_SND_BUF_SIZE (2 * 1024 * 1024)
-#define TCP_SND_BUF_SIZE_MIN (8 * 1024)
-#define TCP_BACKLOG 10
-#define TCP_BACKLOG_MIN 5
-#define TCP_MAX_LOSS_MIN 6
-#define TCP_CONNECT_TIME_MIN (60 * TCP_TICK_HZ)
-#define TCP_MAX_KEEPALIVE_MIN 4
-#define TCP_KEEPALIVE_IDLE_MAX (TCP_TICK_HZ * 60 * 60 * 4)
-#define TCP_KEEPALIVE_PERIOD_MIN (TCP_TICK_HZ * 30)
-#define TCP_FIN_WAIT2_TIME_MAX (4 * TCP_TICK_HZ)
-#define TCP_TIME_WAIT_TIME_MAX (60 * TCP_TICK_HZ)
-
-///
-/// TCP segmentation data
-///
-typedef struct _TCP_SEG {
- TCP_SEQNO Seq; ///< Starting sequence number
- TCP_SEQNO End; ///< The sequence of the last byte + 1, include SYN/FIN. End-Seq = SEG.LEN
- TCP_SEQNO Ack; ///< ACK field in the segment
- UINT8 Flag; ///< TCP header flags
- UINT16 Urg; ///< Valid if URG flag is set.
- UINT32 Wnd; ///< TCP window size field
-} TCP_SEG;
-
-///
-/// Network endpoint, IP+Port structure
-///
-typedef struct _TCP_PEER {
- UINT32 Ip; ///< IP address, network byte order
- TCP_PORTNO Port; ///< Port number, network byte order
-} TCP_PEER;
-
-///
-/// TCP control block, it includes various states
-///
-struct _TCP_CB {
- LIST_ENTRY List; ///< Back and forward link entry
- TCP_CB *Parent; ///< The parent TCP_CB structure
-
- SOCKET *Sk; ///< The socket it controled.
- TCP_PEER LocalEnd; ///< Local endpoint
- TCP_PEER RemoteEnd;///< Remote endpoint
-
- LIST_ENTRY SndQue; ///< Retxmission queue
- LIST_ENTRY RcvQue; ///< Reassemble queue
- UINT32 CtrlFlag; ///< Control flags, such as NO_NAGLE
- INT32 Error; ///< Soft error status, such as TCP_CONNECT_RESET
-
- //
- // RFC793 and RFC1122 defined variables
- //
- UINT8 State; ///< TCP state, such as SYN_SENT, LISTEN
- UINT8 DelayedAck; ///< Number of delayed ACKs
- UINT16 HeadSum; ///< Checksum of the fixed parts of pesudo
- ///< header: Src IP, Dst IP, 0, Protocol,
- ///< not include the TCP length.
-
- TCP_SEQNO Iss; ///< Initial Sending Sequence
- TCP_SEQNO SndUna; ///< First unacknowledged data
- TCP_SEQNO SndNxt; ///< Next data sequence to send.
- TCP_SEQNO SndPsh; ///< Send PUSH point
- TCP_SEQNO SndUp; ///< Send urgent point
- UINT32 SndWnd; ///< Window advertised by the remote peer
- UINT32 SndWndMax; ///< Max send window advertised by the peer
- TCP_SEQNO SndWl1; ///< Seq number used for last window update
- TCP_SEQNO SndWl2; ///< Ack no of last window update
- UINT16 SndMss; ///< Max send segment size
- TCP_SEQNO RcvNxt; ///< Next sequence no to receive
- UINT32 RcvWnd; ///< Window advertised by the local peer
- TCP_SEQNO RcvWl2; ///< The RcvNxt (or ACK) of last window update.
- ///< It is necessary because of delayed ACK
-
- TCP_SEQNO RcvUp; ///< Urgent point;
- TCP_SEQNO Irs; ///< Initial Receiving Sequence
- UINT16 RcvMss; ///< Max receive segment size
- UINT16 EnabledTimer; ///< Which timer is currently enabled
- UINT32 Timer[TCP_TIMER_NUMBER]; ///< When the timer will expire
- INT32 NextExpire; ///< Count down offset for the nearest timer
- UINT32 Idle; ///< How long the connection is in idle
- UINT32 ProbeTime; ///< The time out value for current window prober
- BOOLEAN ProbeTimerOn;///< If TRUE, the probe time is on.
-
- //
- // RFC1323 defined variables, about window scale,
- // timestamp and PAWS
- //
- UINT8 SndWndScale; ///< Wndscale received from the peer
- UINT8 RcvWndScale; ///< Wndscale used to scale local buffer
- UINT32 TsRecent; ///< TsRecent to echo to the remote peer
- UINT32 TsRecentAge; ///< When this TsRecent is updated
-
- //
- // RFC2988 defined variables. about RTT measurement
- //
- TCP_SEQNO RttSeq; ///< The seq of measured segment now
- UINT32 RttMeasure; ///< Currently measured RTT in heart beats
- UINT32 SRtt; ///< Smoothed RTT, scaled by 8
- UINT32 RttVar; ///< RTT variance, scaled by 8
- UINT32 Rto; ///< Current RTO, not scaled
-
- //
- // RFC2581, and 3782 variables.
- // Congestion control + NewReno fast recovery.
- //
- UINT32 CWnd; ///< Sender's congestion window
- UINT32 Ssthresh; ///< Slow start threshold.
- TCP_SEQNO Recover; ///< Recover point for NewReno
- UINT16 DupAck; ///< Number of duplicate ACKs
- UINT8 CongestState; ///< The current congestion state(RFC3782)
- UINT8 LossTimes; ///< Number of retxmit timeouts in a row
- TCP_SEQNO LossRecover; ///< Recover point for retxmit
-
- //
- // configuration parameters, for EFI_TCP4_PROTOCOL specification
- //
- UINT32 KeepAliveIdle; ///< Idle time before sending first probe
- UINT32 KeepAlivePeriod; ///< Interval for subsequent keep alive probe
- UINT8 MaxKeepAlive; ///< Maxium keep alive probe times.
- UINT8 KeepAliveProbes; ///< The number of keep alive probe.
- UINT16 MaxRexmit; ///< The maxium number of retxmit before abort
- UINT32 FinWait2Timeout; ///< The FIN_WAIT_2 time out
- UINT32 TimeWaitTimeout; ///< The TIME_WAIT time out
- UINT32 ConnectTimeout; ///< The connect establishment time out
-
- //
- // RFC7323
- // Addressing Window Retraction for TCP Window Scale Option.
- //
- TCP_SEQNO RetxmitSeqMax; ///< Max Seq number in previous retransmission.
-
- //
- // configuration for tcp provided by user
- //
- BOOLEAN UseDefaultAddr;
- UINT8 Tos;
- UINT8 Ttl;
- EFI_IPv4_ADDRESS SubnetMask;
-
- IP_IO_IP_INFO *IpInfo; ///<pointer reference to Ip used to send pkt
-};
-
-extern LIST_ENTRY mTcpRunQue;
-extern LIST_ENTRY mTcpListenQue;
-extern TCP_SEQNO mTcpGlobalIss;
-extern UINT32 mTcpTick;
-
-///
-/// TCP_CONNECTED: both ends have synchronized their ISN.
-///
-#define TCP_CONNECTED(state) ((state) > TCP_SYN_RCVD)
-
-#define TCP_FIN_RCVD(State) \
- (((State) == TCP_CLOSE_WAIT) || \
- ((State) == TCP_LAST_ACK) || \
- ((State) == TCP_CLOSING) || \
- ((State) == TCP_TIME_WAIT))
-
-#define TCP_LOCAL_CLOSED(State) \
- (((State) == TCP_FIN_WAIT_1) || \
- ((State) == TCP_FIN_WAIT_2) || \
- ((State) == TCP_CLOSING) || \
- ((State) == TCP_TIME_WAIT) || \
- ((State) == TCP_LAST_ACK))
-
-//
-// Get the TCP_SEG point from a net buffer's ProtoData
-//
-#define TCPSEG_NETBUF(NBuf) ((TCP_SEG *) ((NBuf)->ProtoData))
-
-//
-// macros to compare sequence no
-//
-#define TCP_SEQ_LT(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) < 0)
-#define TCP_SEQ_LEQ(SeqA, SeqB) ((INT32) ((SeqA) - (SeqB)) <= 0)
-#define TCP_SEQ_GT(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) < 0)
-#define TCP_SEQ_GEQ(SeqA, SeqB) ((INT32) ((SeqB) - (SeqA)) <= 0)
-
-//
-// TCP_SEQ_BETWEEN return whether b <= m <= e
-//
-#define TCP_SEQ_BETWEEN(b, m, e) ((e) - (b) >= (m) - (b))
-
-//
-// TCP_SUB_SEQ returns Seq1 - Seq2. Make sure Seq1 >= Seq2
-//
-#define TCP_SUB_SEQ(Seq1, Seq2) ((UINT32) ((Seq1) - (Seq2)))
-
-//
-// Check whether Flag is on
-//
-#define TCP_FLG_ON(Value, Flag) ((BOOLEAN) (((Value) & (Flag)) != 0))
-
-//
-// Set and Clear operation on a Flag
-//
-#define TCP_SET_FLG(Value, Flag) ((Value) |= (Flag))
-#define TCP_CLEAR_FLG(Value, Flag) ((Value) &= ~(Flag))
-
-//
-// Test whether two peers are equal
-//
-#define TCP_PEER_EQUAL(Pa, Pb) \
- (((Pa)->Ip == (Pb)->Ip) && ((Pa)->Port == (Pb)->Port))
-
-//
-// Test whether Pa matches Pb, or Pa is more specific
-// than pb. Zero means wildcard.
-//
-#define TCP_PEER_MATCH(Pa, Pb) \
- ((((Pb)->Ip == 0) || ((Pb)->Ip == (Pa)->Ip)) && \
- (((Pb)->Port == 0) || ((Pb)->Port == (Pa)->Port)))
-
-#define TCP_TIMER_ON(Flag, Timer) ((Flag) & (1 << (Timer)))
-#define TCP_SET_TIMER(Flag, Timer) ((Flag) = (UINT16) ((Flag) | (1 << (Timer))))
-#define TCP_CLEAR_TIMER(Flag, Timer) ((Flag) = (UINT16) ((Flag) & (~(1 << (Timer)))))
-
-#define TCP_TIME_LT(Ta, Tb) ((INT32) ((Ta) - (Tb)) < 0)
-#define TCP_TIME_LEQ(Ta, Tb) ((INT32) ((Ta) - (Tb)) <= 0)
-#define TCP_SUB_TIME(Ta, Tb) ((UINT32) ((Ta) - (Tb)))
-
-#define TCP_MAX_WIN 0xFFFFU
-
-typedef
-VOID
-(*TCP_TIMER_HANDLER) (
- IN OUT TCP_CB *Tcb
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c
deleted file mode 100644
index 4cb0ee7b5e..0000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c
+++ /dev/null
@@ -1,584 +0,0 @@
-/** @file
- TCP timer related functions.
-
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php<BR>
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Tcp4Main.h"
-
-UINT32 mTcpTick = 1000;
-
-/**
- Connect timeout handler.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpConnectTimeout (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Timeout handler for TCP retransmission timer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpRexmitTimeout (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Timeout handler for window probe timer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpProbeTimeout (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Timeout handler for keepalive timer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpKeepaliveTimeout (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Timeout handler for FIN_WAIT_2 timer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpFinwait2Timeout (
- IN OUT TCP_CB *Tcb
- );
-
-/**
- Timeout handler for 2MSL timer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-Tcp2MSLTimeout (
- IN OUT TCP_CB *Tcb
- );
-
-TCP_TIMER_HANDLER mTcpTimerHandler[TCP_TIMER_NUMBER] = {
- TcpConnectTimeout,
- TcpRexmitTimeout,
- TcpProbeTimeout,
- TcpKeepaliveTimeout,
- TcpFinwait2Timeout,
- Tcp2MSLTimeout,
-};
-
-/**
- Close the TCP connection.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpClose (
- IN OUT TCP_CB *Tcb
- )
-{
- NetbufFreeList (&Tcb->SndQue);
- NetbufFreeList (&Tcb->RcvQue);
-
- TcpSetState (Tcb, TCP_CLOSED);
-}
-
-
-/**
- Connect timeout handler.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpConnectTimeout (
- IN OUT TCP_CB *Tcb
- )
-{
- if (!TCP_CONNECTED (Tcb->State)) {
- DEBUG ((EFI_D_ERROR, "TcpConnectTimeout: connection closed "
- "because conenction timer timeout for TCB %p\n", Tcb));
-
- if (EFI_ABORTED == Tcb->Sk->SockError) {
- SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT);
- }
-
- if (TCP_SYN_RCVD == Tcb->State) {
- DEBUG ((EFI_D_WARN, "TcpConnectTimeout: send reset because "
- "connection timer timeout for TCB %p\n", Tcb));
-
- TcpResetConnection (Tcb);
-
- }
-
- TcpClose (Tcb);
- }
-}
-
-
-/**
- Timeout handler for TCP retransmission timer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpRexmitTimeout (
- IN OUT TCP_CB *Tcb
- )
-{
- UINT32 FlightSize;
-
- DEBUG ((EFI_D_WARN, "TcpRexmitTimeout: transmission "
- "timeout for TCB %p\n", Tcb));
-
- //
- // Set the congestion window. FlightSize is the
- // amount of data that has been sent but not
- // yet ACKed.
- //
- FlightSize = TCP_SUB_SEQ (Tcb->SndNxt, Tcb->SndUna);
- Tcb->Ssthresh = MAX ((UINT32) (2 * Tcb->SndMss), FlightSize / 2);
-
- Tcb->CWnd = Tcb->SndMss;
- Tcb->LossRecover = Tcb->SndNxt;
-
- Tcb->LossTimes++;
- if ((Tcb->LossTimes > Tcb->MaxRexmit) &&
- !TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_CONNECT)) {
-
- DEBUG ((EFI_D_ERROR, "TcpRexmitTimeout: connection closed "
- "because too many timeouts for TCB %p\n", Tcb));
-
- if (EFI_ABORTED == Tcb->Sk->SockError) {
- SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT);
- }
-
- TcpClose (Tcb);
- return ;
- }
-
- TcpBackoffRto (Tcb);
- TcpRetransmit (Tcb, Tcb->SndUna);
- TcpSetTimer (Tcb, TCP_TIMER_REXMIT, Tcb->Rto);
-
- Tcb->CongestState = TCP_CONGEST_LOSS;
- TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_RTT_ON);
-}
-
-
-/**
- Timeout handler for window probe timer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpProbeTimeout (
- IN OUT TCP_CB *Tcb
- )
-{
- //
- // This is the timer for sender's SWSA. RFC1122 requires
- // a timer set for sender's SWSA, and suggest combine it
- // with window probe timer. If data is sent, don't set
- // the probe timer, since retransmit timer is on.
- //
- if ((TcpDataToSend (Tcb, 1) != 0) && (TcpToSendData (Tcb, 1) > 0)) {
-
- ASSERT (TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_REXMIT) != 0);
- Tcb->ProbeTimerOn = FALSE;
- return ;
- }
-
- TcpSendZeroProbe (Tcb);
- TcpSetProbeTimer (Tcb);
-}
-
-
-/**
- Timeout handler for keepalive timer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpKeepaliveTimeout (
- IN OUT TCP_CB *Tcb
- )
-{
- Tcb->KeepAliveProbes++;
-
- //
- // Too many Keep-alive probes, drop the connection
- //
- if (Tcb->KeepAliveProbes > Tcb->MaxKeepAlive) {
-
- if (EFI_ABORTED == Tcb->Sk->SockError) {
- SOCK_ERROR (Tcb->Sk, EFI_TIMEOUT);
- }
-
- TcpClose (Tcb);
- return ;
- }
-
- TcpSendZeroProbe (Tcb);
- TcpSetKeepaliveTimer (Tcb);
-}
-
-
-/**
- Timeout handler for FIN_WAIT_2 timer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpFinwait2Timeout (
- IN OUT TCP_CB *Tcb
- )
-{
- DEBUG ((EFI_D_WARN, "TcpFinwait2Timeout: connection closed "
- "because FIN_WAIT2 timer timeouts for TCB %p\n", Tcb));
-
- TcpClose (Tcb);
-}
-
-
-/**
- Timeout handler for 2MSL timer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-Tcp2MSLTimeout (
- IN OUT TCP_CB *Tcb
- )
-{
- DEBUG ((EFI_D_WARN, "Tcp2MSLTimeout: connection closed "
- "because TIME_WAIT timer timeouts for TCB %p\n", Tcb));
-
- TcpClose (Tcb);
-}
-
-
-/**
- Update the timer status and the next expire time according to the timers
- to expire in a specific future time slot.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpUpdateTimer (
- IN OUT TCP_CB *Tcb
- )
-{
- UINT16 Index;
-
- //
- // Don't use a too large value to init NextExpire
- // since mTcpTick wraps around as sequence no does.
- //
- Tcb->NextExpire = 65535;
- TCP_CLEAR_FLG (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON);
-
- for (Index = 0; Index < TCP_TIMER_NUMBER; Index++) {
-
- if (TCP_TIMER_ON (Tcb->EnabledTimer, Index) &&
- TCP_TIME_LT (Tcb->Timer[Index], mTcpTick + Tcb->NextExpire)) {
-
- Tcb->NextExpire = TCP_SUB_TIME (Tcb->Timer[Index], mTcpTick);
- TCP_SET_FLG (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON);
- }
- }
-}
-
-
-/**
- Enable a TCP timer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Timer The index of the timer to be enabled.
- @param TimeOut The timeout value of this timer.
-
-**/
-VOID
-TcpSetTimer (
- IN OUT TCP_CB *Tcb,
- IN UINT16 Timer,
- IN UINT32 TimeOut
- )
-{
- TCP_SET_TIMER (Tcb->EnabledTimer, Timer);
- Tcb->Timer[Timer] = mTcpTick + TimeOut;
-
- TcpUpdateTimer (Tcb);
-}
-
-
-/**
- Clear one TCP timer.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
- @param Timer The index of the timer to be cleared.
-
-**/
-VOID
-TcpClearTimer (
- IN OUT TCP_CB *Tcb,
- IN UINT16 Timer
- )
-{
- TCP_CLEAR_TIMER (Tcb->EnabledTimer, Timer);
- TcpUpdateTimer (Tcb);
-}
-
-
-/**
- Clear all TCP timers.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpClearAllTimer (
- IN OUT TCP_CB *Tcb
- )
-{
- Tcb->EnabledTimer = 0;
- TcpUpdateTimer (Tcb);
-}
-
-
-/**
- Enable the window prober timer and set the timeout value.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpSetProbeTimer (
- IN OUT TCP_CB *Tcb
- )
-{
- if (!Tcb->ProbeTimerOn) {
- Tcb->ProbeTime = Tcb->Rto;
- Tcb->ProbeTimerOn = TRUE;
-
- } else {
- Tcb->ProbeTime <<= 1;
- }
-
- if (Tcb->ProbeTime < TCP_RTO_MIN) {
-
- Tcb->ProbeTime = TCP_RTO_MIN;
- } else if (Tcb->ProbeTime > TCP_RTO_MAX) {
-
- Tcb->ProbeTime = TCP_RTO_MAX;
- }
-
- TcpSetTimer (Tcb, TCP_TIMER_PROBE, Tcb->ProbeTime);
-}
-
-
-/**
- Enable the keepalive timer and set the timeout value.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpSetKeepaliveTimer (
- IN OUT TCP_CB *Tcb
- )
-{
- if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_NO_KEEPALIVE)) {
- return ;
-
- }
-
- //
- // Set the timer to KeepAliveIdle if either
- // 1. the keepalive timer is off
- // 2. The keepalive timer is on, but the idle
- // is less than KeepAliveIdle, that means the
- // connection is alive since our last probe.
- //
- if (!TCP_TIMER_ON (Tcb->EnabledTimer, TCP_TIMER_KEEPALIVE) ||
- (Tcb->Idle < Tcb->KeepAliveIdle)) {
-
- TcpSetTimer (Tcb, TCP_TIMER_KEEPALIVE, Tcb->KeepAliveIdle);
- Tcb->KeepAliveProbes = 0;
-
- } else {
-
- TcpSetTimer (Tcb, TCP_TIMER_KEEPALIVE, Tcb->KeepAlivePeriod);
- }
-}
-
-
-/**
- Backoff the RTO.
-
- @param Tcb Pointer to the TCP_CB of this TCP instance.
-
-**/
-VOID
-TcpBackoffRto (
- IN OUT TCP_CB *Tcb
- )
-{
- //
- // Fold the RTT estimate if too many times, the estimate
- // may be wrong, fold it. So the next time a valid
- // measurement is sampled, we can start fresh.
- //
- if ((Tcb->LossTimes >= TCP_FOLD_RTT) && (Tcb->SRtt != 0)) {
- Tcb->RttVar += Tcb->SRtt >> 2;
- Tcb->SRtt = 0;
- }
-
- Tcb->Rto <<= 1;
-
- if (Tcb->Rto < TCP_RTO_MIN) {
-
- Tcb->Rto = TCP_RTO_MIN;
- } else if (Tcb->Rto > TCP_RTO_MAX) {
-
- Tcb->Rto = TCP_RTO_MAX;
- }
-}
-
-
-/**
- Heart beat timer handler.
-
- @param Context Context of the timer event, ignored.
-
-**/
-VOID
-EFIAPI
-TcpTickingDpc (
- IN VOID *Context
- )
-{
- LIST_ENTRY *Entry;
- LIST_ENTRY *Next;
- TCP_CB *Tcb;
- INT16 Index;
-
- mTcpTick++;
- mTcpGlobalIss += 100;
-
- //
- // Don't use LIST_FOR_EACH, which isn't delete safe.
- //
- for (Entry = mTcpRunQue.ForwardLink; Entry != &mTcpRunQue; Entry = Next) {
-
- Next = Entry->ForwardLink;
-
- Tcb = NET_LIST_USER_STRUCT (Entry, TCP_CB, List);
-
- if (Tcb->State == TCP_CLOSED) {
- continue;
- }
- //
- // The connection is doing RTT measurement.
- //
- if (TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_RTT_ON)) {
- Tcb->RttMeasure++;
- }
-
- Tcb->Idle++;
-
- if (Tcb->DelayedAck != 0) {
- TcpSendAck (Tcb);
- }
-
- //
- // No timer is active or no timer expired
- //
- if (!TCP_FLG_ON (Tcb->CtrlFlag, TCP_CTRL_TIMER_ON) ||
- ((--Tcb->NextExpire) > 0)) {
-
- continue;
- }
-
- //
- // Call the timeout handler for each expired timer.
- //
- for (Index = 0; Index < TCP_TIMER_NUMBER; Index++) {
-
- if (TCP_TIMER_ON (Tcb->EnabledTimer, Index) &&
- TCP_TIME_LEQ (Tcb->Timer[Index], mTcpTick)) {
- //
- // disable the timer before calling the handler
- // in case the handler enables it again.
- //
- TCP_CLEAR_TIMER (Tcb->EnabledTimer, Index);
- mTcpTimerHandler[Index](Tcb);
-
- //
- // The Tcb may have been deleted by the timer, or
- // no other timer is set.
- //
- if ((Next->BackLink != Entry) ||
- (Tcb->EnabledTimer == 0)) {
- break;
- }
- }
- }
-
- //
- // If the Tcb still exist or some timer is set, update the timer
- //
- if (Index == TCP_TIMER_NUMBER) {
- TcpUpdateTimer (Tcb);
- }
- }
-}
-
-/**
- Heart beat timer handler, queues the DPC at TPL_CALLBACK.
-
- @param Event Timer event signaled, ignored.
- @param Context Context of the timer event, ignored.
-
-**/
-VOID
-EFIAPI
-TcpTicking (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- QueueDpc (TPL_CALLBACK, TcpTickingDpc, Context);
-}
-