From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.31; helo=mga06.intel.com; envelope-from=siyuan.fu@intel.com; receiver=edk2-devel@lists.01.org Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 37C832119590D for ; Wed, 19 Dec 2018 17:41:17 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Dec 2018 17:41:16 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,375,1539673200"; d="scan'208";a="127509143" Received: from shwdeopenpsi787.ccr.corp.intel.com ([10.239.158.24]) by fmsmga002.fm.intel.com with ESMTP; 19 Dec 2018 17:41:13 -0800 From: Siyuan Fu To: edk2-devel@lists.01.org Cc: Jian J Wang , Hao Wu , Ruiyu Ni , Star Zeng , Jiaxin Wu Date: Thu, 20 Dec 2018 09:41:05 +0800 Message-Id: <20181220014110.20324-2-siyuan.fu@intel.com> X-Mailer: git-send-email 2.19.1.windows.1 In-Reply-To: <20181220014110.20324-1-siyuan.fu@intel.com> References: <20181220014110.20324-1-siyuan.fu@intel.com> MIME-Version: 1.0 Subject: [PATCH v2 1/6] MdeModulePkg: Delete Tcp4Dxe in MdeModulePkg. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 20 Dec 2018 01:41:17 -0000 Content-Transfer-Encoding: 8bit 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 Cc: Hao Wu Cc: Ruiyu Ni Cc: Star Zeng Cc: Jiaxin Wu Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Siyuan Fu --- Notes: v2: Break original patch to separate commits per module. MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c | 433 ------ MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.c | 1201 ---------------- MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c | 990 ------------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c | 717 ---------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.c | 782 ---------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c | 1497 -------------------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Io.c | 112 -- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.c | 674 --------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c | 940 ------------ MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.c | 352 ----- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c | 1238 ---------------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c | 584 -------- MdeModulePkg/MdeModulePkg.dsc | 1 - MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h | 131 -- MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h | 954 ------------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h | 342 ----- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf | 94 -- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.uni | 23 - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4DxeExtra.uni | 20 - MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Func.h | 781 ---------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h | 494 ------- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h | 130 -- MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h | 357 ----- 23 files changed, 12847 deletions(-) diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/ComponentName.c deleted file mode 100644 index f1227691ec21..000000000000 --- 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.
-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. - -**/ - -#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 adb5aa35cdf2..000000000000 --- 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.
-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. - -**/ - -#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/SockInterface.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockInterface.c deleted file mode 100644 index cd20b8bcb2dd..000000000000 --- 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.
-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. - -**/ - - -#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/Tcp4Dispatcher.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dispatcher.c deleted file mode 100644 index a0f97d603171..000000000000 --- 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.
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.
-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. - -**/ - -#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 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 2ff8eee8693b..000000000000 --- 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.
-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. - -**/ - -#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/Tcp4Input.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Input.c deleted file mode 100644 index f48efdac7cd8..000000000000 --- 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.
-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. - -**/ - - -#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 b98d1e783a2f..000000000000 --- 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.
-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. - -**/ - -#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 d8fc68c0a97d..000000000000 --- 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.
-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. - -**/ - - -#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/Tcp4Misc.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Misc.c deleted file mode 100644 index 7fd8bb1fbe09..000000000000 --- 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.
-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. - -**/ - - -#include "Tcp4Main.h" - -#include - -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 equals to . - - @param Addr Pointer to the IP address needs to match. - @param Port The port number needs to match. - - @return The Tcb which matches the 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 e84310f6c693..000000000000 --- 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.
-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. - -**/ - -#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/Tcp4Output.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Output.c deleted file mode 100644 index 760b09a1eda1..000000000000 --- 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.
-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. - -**/ - -#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/Tcp4Timer.c b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Timer.c deleted file mode 100644 index 4cb0ee7b5e6f..000000000000 --- 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.
-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. - -**/ - -#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); -} - diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc index 2465d39fd744..3529c8d30365 100644 --- a/MdeModulePkg/MdeModulePkg.dsc +++ b/MdeModulePkg/MdeModulePkg.dsc @@ -359,7 +359,6 @@ [Components] 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/SockImpl.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h deleted file mode 100644 index bea7479eb222..000000000000 --- 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.
-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. - -**/ - -#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/Socket.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h deleted file mode 100644 index 650a7dd8651f..000000000000 --- 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.
-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. - -**/ - -#ifndef _SOCKET_H_ -#define _SOCKET_H_ - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#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/Tcp4Driver.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Driver.h deleted file mode 100644 index 368f49c4ddb1..000000000000 --- 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.
-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. - -**/ - -#ifndef _TCP4_DRIVER_H_ -#define _TCP4_DRIVER_H_ - -#include -#include - -#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 7c0504770b48..000000000000 --- 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.
-# 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 1514a3917766..000000000000 --- 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.
-// -// 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 0e6d2f2896f3..000000000000 --- 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.
-// -// 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 53b7aac8ae98..000000000000 --- 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.
-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. - -**/ - -#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 equals to . - - @param Addr Pointer to the IP address needs to match. - @param Port The port number needs to match. - - @return The Tcb which matches the 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/Tcp4Main.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Main.h deleted file mode 100644 index c898a7ee2dd0..000000000000 --- 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.
-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. - -**/ - -#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/Tcp4Option.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Option.h deleted file mode 100644 index f9782cb59801..000000000000 --- 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.
-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. - -**/ - -#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/Tcp4Proto.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Proto.h deleted file mode 100644 index 37191fe65112..000000000000 --- 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.
-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. - -**/ - -#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; /// 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 -- 2.19.1.windows.1