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