* [PATCH v2 1/6] MdeModulePkg: Delete Tcp4Dxe in MdeModulePkg.
2018-12-20 1:41 [PATCH v2 0/6] Delete TCP, PXE, iSCSI driver in MdeModulePkg Siyuan Fu
@ 2018-12-20 1:41 ` Siyuan Fu
2018-12-20 2:09 ` Ni, Ruiyu
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
` (4 subsequent siblings)
5 siblings, 2 replies; 12+ messages in thread
From: Siyuan Fu @ 2018-12-20 1:41 UTC (permalink / raw)
To: edk2-devel; +Cc: Jian J Wang, Hao Wu, Ruiyu Ni, Star Zeng, Jiaxin Wu
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 -
| 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/PcatSingleSegmentPciCfg2Pei.inf
diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h
deleted file mode 100644
index bea7479eb222..000000000000
--- a/MdeModulePkg/Universal/Network/Tcp4Dxe/SockImpl.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/** @file
- Socket implementation header file.
-
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<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
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v2 1/6] MdeModulePkg: Delete Tcp4Dxe in MdeModulePkg.
2018-12-20 1:41 ` [PATCH v2 1/6] MdeModulePkg: Delete Tcp4Dxe " Siyuan Fu
@ 2018-12-20 2:09 ` Ni, Ruiyu
2018-12-20 4:59 ` Wang, Jian J
1 sibling, 0 replies; 12+ messages in thread
From: Ni, Ruiyu @ 2018-12-20 2:09 UTC (permalink / raw)
To: Fu, Siyuan, edk2-devel@lists.01.org; +Cc: Wu, Hao A, Wu, Jiaxin, Zeng, Star
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
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 1/6] MdeModulePkg: Delete Tcp4Dxe in MdeModulePkg.
2018-12-20 1:41 ` [PATCH v2 1/6] MdeModulePkg: Delete Tcp4Dxe " Siyuan Fu
2018-12-20 2:09 ` Ni, Ruiyu
@ 2018-12-20 4:59 ` Wang, Jian J
1 sibling, 0 replies; 12+ messages in thread
From: Wang, Jian J @ 2018-12-20 4:59 UTC (permalink / raw)
To: Fu, Siyuan, edk2-devel@lists.01.org
Cc: Wu, Hao A, Ni, Ruiyu, Zeng, Star, Wu, Jiaxin
Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
> -----Original Message-----
> From: Fu, Siyuan
> Sent: Thursday, December 20, 2018 9:41 AM
> To: edk2-devel@lists.01.org
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A <hao.a.wu@intel.com>;
> Ni, Ruiyu <ruiyu.ni@intel.com>; Zeng, Star <star.zeng@intel.com>; Wu, Jiaxin
> <jiaxin.wu@intel.com>
> Subject: [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/PcatSingleSegmentPci
> Cfg2Pei.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
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 2/6] NetworkPkg: Remove some clarification from TcpDxe.inf
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 1:41 ` Siyuan Fu
2018-12-20 1:41 ` [PATCH v2 3/6] MdeModulePkg: Delete IScsiDxe in MdeModulePkg Siyuan Fu
` (3 subsequent siblings)
5 siblings, 0 replies; 12+ messages in thread
From: Siyuan Fu @ 2018-12-20 1:41 UTC (permalink / raw)
To: edk2-devel; +Cc: Jiaxin Wu
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1278
This patch is to remove the clarification about usage/difference between
those drivers in MdeModulePkg and NetworkPkg, since the MdeModulePkg one
have been deleted.
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.
NetworkPkg/TcpDxe/TcpDxe.inf | 6 ------
1 file changed, 6 deletions(-)
diff --git a/NetworkPkg/TcpDxe/TcpDxe.inf b/NetworkPkg/TcpDxe/TcpDxe.inf
index 9433fb875cba..c4e3de7ec5ce 100644
--- a/NetworkPkg/TcpDxe/TcpDxe.inf
+++ b/NetworkPkg/TcpDxe/TcpDxe.inf
@@ -5,12 +5,6 @@
# It might provide TCPv4 Protocol or TCPv6 Protocol or both of them that depends on which network
# stack has been loaded in system. This driver supports both IPv4 and IPv6 network stack.
#
-# Notes:
-# 1) This driver can't co-work with the Tcp4Dxe driver in MdeModulePkg.
-# 2) This driver includes more bug fixes and supports more features (e.g. IPv6, TCP Cancel
-# function) than the Tcp4Dxe driver in MdeModulePkg. So, we recommend using this driver
-# even though both of them can be used.
-#
# Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
#
# This program and the accompanying materials
--
2.19.1.windows.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 3/6] MdeModulePkg: Delete IScsiDxe in MdeModulePkg.
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 1:41 ` [PATCH v2 2/6] NetworkPkg: Remove some clarification from TcpDxe.inf Siyuan Fu
@ 2018-12-20 1:41 ` 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
` (2 subsequent siblings)
5 siblings, 2 replies; 12+ messages in thread
From: Siyuan Fu @ 2018-12-20 1:41 UTC (permalink / raw)
To: edk2-devel; +Cc: Jian J Wang, Hao Wu, Ruiyu Ni, Star Zeng, Jiaxin Wu
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1278
This patch is to delete the IScsiDxe driver in MdeModulePkg. The driver
will not be maintained and can't co-work with the dual-stack IScsiDxe in
NetworkPkg.
People should use below NetworkPkg drivers instead:
NetworkPkg/IScsiDxe/IScsiDxe.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/IScsiDxe/ComponentName.c | 283 --
MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c | 430 ---
MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c | 1264 ---------
MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c | 472 ----
MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c | 676 -----
MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c | 412 ---
MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c | 539 ----
MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c | 116 -
MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c | 948 -------
MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c | 2799 --------------------
MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c | 487 ----
MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | 350 ---
MdeModulePkg/MdeModulePkg.dsc | 1 -
MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h | 165 --
MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni | 25 -
| 20 -
MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h | 106 -
MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h | 22 -
MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h | 166 --
MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr | 219 --
MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni | 62 -
MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h | 109 -
MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h | 55 -
MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h | 140 -
MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf | 134 -
MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h | 22 -
MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h | 38 -
MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h | 168 --
MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h | 74 -
MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h | 317 ---
MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h | 1005 -------
MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h | 142 -
MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | 80 -
33 files changed, 11846 deletions(-)
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c
deleted file mode 100644
index 3f561e93439d..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c
+++ /dev/null
@@ -1,283 +0,0 @@
-/** @file
- UEFI Component Name(2) protocol implementation for iSCSI.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#include "IScsiImpl.h"
-
-//
-// EFI Component Name Protocol
-//
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName = {
- IScsiComponentNameGetDriverName,
- IScsiComponentNameGetControllerName,
- "eng"
-};
-
-//
-// EFI Component Name 2 Protocol
-//
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2 = {
- (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) IScsiComponentNameGetDriverName,
- (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) IScsiComponentNameGetControllerName,
- "en"
-};
-
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mIScsiDriverNameTable[] = {
- {"eng;en", L"iSCSI Driver"},
- {NULL, NULL}
-};
-
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *mIScsiControllerNameTable = NULL;
-
-/**
- Retrieves a Unicode string that is the user readable name of the EFI 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_NAME_PROTOCOL instance.
- @param[in] Language A pointer to a three character ISO 639-2 language identifier.
- This is the language of the driver name that 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.
- @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
-IScsiComponentNameGetDriverName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN CHAR8 *Language,
- OUT CHAR16 **DriverName
- )
-{
- return LookupUnicodeString2 (
- Language,
- This->SupportedLanguages,
- mIScsiDriverNameTable,
- DriverName,
- (BOOLEAN)(This == &gIScsiComponentName)
- );
-}
-
-/**
- Update the component name for the iSCSI instance.
-
- @param[in] IScsiExtScsiPassThru A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
-
- @retval EFI_SUCCESS Update the ControllerNameTable of this instance successfully.
- @retval EFI_INVALID_PARAMETER The input parameter is invalid.
- @retval EFI_UNSUPPORTED Can't get the corresponding NIC info from the Controller handle.
-
-**/
-EFI_STATUS
-UpdateName (
- IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru
- )
-{
- EFI_STATUS Status;
- CHAR16 HandleName[150];
- ISCSI_DRIVER_DATA *Private;
- EFI_MAC_ADDRESS MacAddress;
- UINTN HwAddressSize;
- UINT16 VlanId;
- CHAR16 MacString[70];
-
- if (IScsiExtScsiPassThru == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (IScsiExtScsiPassThru);
-
- //
- // Get the mac string, it's the name of various variable
- //
- Status = NetLibGetMacAddress (Private->Controller, &MacAddress, &HwAddressSize);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- VlanId = NetLibGetVlanId (Private->Controller);
- IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString);
-
- UnicodeSPrint (
- HandleName,
- sizeof (HandleName),
- L"iSCSI IPv4 (MacString=%s)",
- MacString
- );
-
- if (mIScsiControllerNameTable != NULL) {
- FreeUnicodeStringTable (mIScsiControllerNameTable);
- mIScsiControllerNameTable = NULL;
- }
-
- Status = AddUnicodeString2 (
- "eng",
- gIScsiComponentName.SupportedLanguages,
- &mIScsiControllerNameTable,
- HandleName,
- TRUE
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- return AddUnicodeString2 (
- "en",
- gIScsiComponentName2.SupportedLanguages,
- &mIScsiControllerNameTable,
- HandleName,
- FALSE
- );
-}
-
-/**
- Retrieves a Unicode string that is the user readable name of the controller
- that is being managed by an EFI Driver.Currently not implemented.
-
- @param[in] This A pointer to the 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 three character ISO 639-2 language
- identifier. This is the language of the controller name
- that 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.
- @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
-IScsiComponentNameGetControllerName (
- 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_HANDLE IScsiController;
- ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
-
- EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru;
-
- if (ControllerHandle == NULL) {
- return EFI_UNSUPPORTED;
- }
-
- //
- // Get the handle of the controller we are controling.
- //
- IScsiController = NetLibGetNicHandle (ControllerHandle, &gEfiTcp4ProtocolGuid);
- if (IScsiController == NULL) {
- return EFI_UNSUPPORTED;
- }
-
- Status = gBS->OpenProtocol (
- IScsiController,
- &gEfiCallerIdGuid,
- (VOID **)&IScsiIdentifier,
- NULL,
- NULL,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- if (ChildHandle != NULL) {
- //
- // Make sure this driver produced ChildHandle
- //
- Status = EfiTestChildHandle (
- ControllerHandle,
- ChildHandle,
- &gEfiTcp4ProtocolGuid
- );
- if (!EFI_ERROR (Status)) {
- //
- // Retrieve an instance of a produced protocol from ChildHandle
- //
- Status = gBS->OpenProtocol (
- ChildHandle,
- &gEfiExtScsiPassThruProtocolGuid,
- (VOID **)&IScsiExtScsiPassThru,
- NULL,
- NULL,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Update the component name for this child handle.
- //
- Status = UpdateName (IScsiExtScsiPassThru);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- } else {
- return Status;
- }
- }
-
- return LookupUnicodeString2 (
- Language,
- This->SupportedLanguages,
- mIScsiControllerNameTable,
- ControllerName,
- (BOOLEAN)(This == &gIScsiComponentName)
- );
-}
-
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c
deleted file mode 100644
index 6307684ff05b..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c
+++ /dev/null
@@ -1,430 +0,0 @@
-/** @file
- This file is for Challenge-Handshake Authentication Protocol (CHAP) Configuration.
-
-Copyright (c) 2004 - 2015, 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.
-
-**/
-
-#include "IScsiImpl.h"
-#include "Md5.h"
-
-/**
- Initator calculates its own expected hash value.
-
- @param[in] ChapIdentifier iSCSI CHAP identifier sent by authenticator.
- @param[in] ChapSecret iSCSI CHAP secret of the authenticator.
- @param[in] SecretLength The length of iSCSI CHAP secret.
- @param[in] ChapChallenge The challenge message sent by authenticator.
- @param[in] ChallengeLength The length of iSCSI CHAP challenge message.
- @param[out] ChapResponse The calculation of the expected hash value.
-
- @retval EFI_SUCCESS The expected hash value was calculatedly successfully.
- @retval EFI_PROTOCOL_ERROR The length of the secret should be at least the
- length of the hash value for the hashing algorithm chosen.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiCHAPCalculateResponse (
- IN UINT32 ChapIdentifier,
- IN CHAR8 *ChapSecret,
- IN UINT32 SecretLength,
- IN UINT8 *ChapChallenge,
- IN UINT32 ChallengeLength,
- OUT UINT8 *ChapResponse
- )
-{
- MD5_CTX Md5Ctx;
- CHAR8 IdByte[1];
- EFI_STATUS Status;
-
- Status = MD5Init (&Md5Ctx);
-
- //
- // Hash Identifier - Only calculate 1 byte data (RFC1994)
- //
- IdByte[0] = (CHAR8) ChapIdentifier;
- MD5Update (&Md5Ctx, IdByte, 1);
-
- //
- // Hash Secret
- //
- if (SecretLength < ISCSI_CHAP_SECRET_MIN_LEN - 1) {
- return EFI_PROTOCOL_ERROR;
- }
-
- MD5Update (&Md5Ctx, ChapSecret, SecretLength);
-
- //
- // Hash Challenge received from Target
- //
- MD5Update (&Md5Ctx, ChapChallenge, ChallengeLength);
-
- Status = MD5Final (&Md5Ctx, ChapResponse);
-
- return Status;
-}
-
-/**
- The initator checks the CHAP response replied by target against its own
- calculation of the expected hash value.
-
- @param[in] AuthData iSCSI CHAP authentication data.
- @param[in] TargetResponse The response from target.
-
- @retval EFI_SUCCESS The response from target passed authentication.
- @retval EFI_SECURITY_VIOLATION The response from target was not expected value.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiCHAPAuthTarget (
- IN ISCSI_CHAP_AUTH_DATA *AuthData,
- IN UINT8 *TargetResponse
- )
-{
- EFI_STATUS Status;
- UINT32 SecretSize;
- UINT8 VerifyRsp[ISCSI_CHAP_RSP_LEN];
-
- Status = EFI_SUCCESS;
-
- SecretSize = (UINT32) AsciiStrLen (AuthData->AuthConfig.ReverseCHAPSecret);
- Status = IScsiCHAPCalculateResponse (
- AuthData->OutIdentifier,
- AuthData->AuthConfig.ReverseCHAPSecret,
- SecretSize,
- AuthData->OutChallenge,
- AuthData->OutChallengeLength,
- VerifyRsp
- );
-
- if (CompareMem (VerifyRsp, TargetResponse, ISCSI_CHAP_RSP_LEN) != 0) {
- Status = EFI_SECURITY_VIOLATION;
- }
-
- return Status;
-}
-
-/**
- This function checks the received iSCSI Login Response during the security
- negotiation stage.
-
- @param[in] Conn The iSCSI connection.
-
- @retval EFI_SUCCESS The Login Response passed the CHAP validation.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiCHAPOnRspReceived (
- IN ISCSI_CONNECTION *Conn
- )
-{
- EFI_STATUS Status;
- ISCSI_SESSION *Session;
- ISCSI_CHAP_AUTH_DATA *AuthData;
- CHAR8 *Value;
- UINT8 *Data;
- UINT32 Len;
- LIST_ENTRY *KeyValueList;
- UINTN Algorithm;
- CHAR8 *Identifier;
- CHAR8 *Challenge;
- CHAR8 *Name;
- CHAR8 *Response;
- UINT8 TargetRsp[ISCSI_CHAP_RSP_LEN];
- UINT32 RspLen;
-
- ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION);
- ASSERT (Conn->RspQue.BufNum != 0);
-
- Session = Conn->Session;
- AuthData = &Session->AuthData;
-
- Len = Conn->RspQue.BufSize;
- Data = AllocatePool (Len);
- if (Data == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- //
- // Copy the data in case the data spans over multiple PDUs.
- //
- NetbufQueCopy (&Conn->RspQue, 0, Len, Data);
-
- //
- // Build the key-value list from the data segment of the Login Response.
- //
- KeyValueList = IScsiBuildKeyValueList ((CHAR8 *) Data, Len);
- if (KeyValueList == NULL) {
- FreePool (Data);
- return EFI_OUT_OF_RESOURCES;
- }
-
- Status = EFI_PROTOCOL_ERROR;
-
- switch (Conn->CHAPStep) {
- case ISCSI_CHAP_INITIAL:
- //
- // The first Login Response.
- //
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_PORTAL_GROUP_TAG);
- if (Value == NULL) {
- goto ON_EXIT;
- }
-
- Session->TargetPortalGroupTag = (UINT16) AsciiStrDecimalToUintn (Value);
-
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_AUTH_METHOD);
- if (Value == NULL) {
- goto ON_EXIT;
- }
- //
- // Initiator mandates CHAP authentication but target replies without "CHAP" or
- // initiator suggets "None" but target replies with some kind of auth method.
- //
- if (AsciiStrCmp (Value, ISCSI_AUTH_METHOD_CHAP) == 0) {
- if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) {
- goto ON_EXIT;
- }
- } else {
- if (AuthData->AuthConfig.CHAPType != ISCSI_CHAP_NONE) {
- goto ON_EXIT;
- }
- }
- //
- // Transit to CHAP step one.
- //
- Conn->CHAPStep = ISCSI_CHAP_STEP_ONE;
- Status = EFI_SUCCESS;
- break;
-
- case ISCSI_CHAP_STEP_TWO:
- //
- // The Target replies with CHAP_A=<A> CHAP_I=<I> CHAP_C=<C>
- //
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_ALGORITHM);
- if (Value == NULL) {
- goto ON_EXIT;
- }
-
- Algorithm = AsciiStrDecimalToUintn (Value);
- if (Algorithm != ISCSI_CHAP_ALGORITHM_MD5) {
- //
- // Unsupported algorithm is chosen by target.
- //
- goto ON_EXIT;
- }
-
- Identifier = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_IDENTIFIER);
- if (Identifier == NULL) {
- goto ON_EXIT;
- }
-
- Challenge = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_CHALLENGE);
- if (Challenge == NULL) {
- goto ON_EXIT;
- }
- //
- // Process the CHAP identifier and CHAP Challenge from Target
- // Calculate Response value
- //
- AuthData->InIdentifier = (UINT32) AsciiStrDecimalToUintn (Identifier);
- AuthData->InChallengeLength = ISCSI_CHAP_AUTH_MAX_LEN;
- IScsiHexToBin ((UINT8 *) AuthData->InChallenge, &AuthData->InChallengeLength, Challenge);
- Status = IScsiCHAPCalculateResponse (
- AuthData->InIdentifier,
- AuthData->AuthConfig.CHAPSecret,
- (UINT32) AsciiStrLen (AuthData->AuthConfig.CHAPSecret),
- AuthData->InChallenge,
- AuthData->InChallengeLength,
- AuthData->CHAPResponse
- );
-
- //
- // Transit to next step.
- //
- Conn->CHAPStep = ISCSI_CHAP_STEP_THREE;
- break;
-
- case ISCSI_CHAP_STEP_THREE:
- //
- // one way CHAP authentication and the target would like to
- // authenticate us.
- //
- Status = EFI_SUCCESS;
- break;
-
- case ISCSI_CHAP_STEP_FOUR:
- ASSERT (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL);
- //
- // The forth step, CHAP_N=<N> CHAP_R=<R> is received from Target.
- //
- Name = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_NAME);
- if (Name == NULL) {
- goto ON_EXIT;
- }
-
- Response = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_RESPONSE);
- if (Response == NULL) {
- goto ON_EXIT;
- }
-
- RspLen = ISCSI_CHAP_RSP_LEN;
- IScsiHexToBin (TargetRsp, &RspLen, Response);
-
- //
- // Check the CHAP Response replied by Target.
- //
- Status = IScsiCHAPAuthTarget (AuthData, TargetRsp);
- break;
-
- default:
- break;
- }
-
-ON_EXIT:
-
- IScsiFreeKeyValueList (KeyValueList);
-
- FreePool (Data);
-
- return Status;
-}
-
-/**
- This function fills the CHAP authentication information into the login PDU
- during the security negotiation stage in the iSCSI connection login.
-
- @param[in] Conn The iSCSI connection.
- @param[in, out] Pdu The PDU to send out.
-
- @retval EFI_SUCCESS All check passed and the phase-related CHAP
- authentication info is filled into the iSCSI PDU.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend.
-**/
-EFI_STATUS
-IScsiCHAPToSendReq (
- IN ISCSI_CONNECTION *Conn,
- IN OUT NET_BUF *Pdu
- )
-{
- EFI_STATUS Status;
- ISCSI_SESSION *Session;
- ISCSI_LOGIN_REQUEST *LoginReq;
- ISCSI_CHAP_AUTH_DATA *AuthData;
- CHAR8 *Value;
- CHAR8 ValueStr[256];
- CHAR8 *Response;
- UINT32 RspLen;
- CHAR8 *Challenge;
- UINT32 ChallengeLen;
-
- ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION);
-
- Session = Conn->Session;
- AuthData = &Session->AuthData;
- LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, 0);
- if (LoginReq == NULL) {
- return EFI_PROTOCOL_ERROR;
- }
- Status = EFI_SUCCESS;
-
- RspLen = 2 * ISCSI_CHAP_RSP_LEN + 3;
- Response = AllocatePool (RspLen);
- if (Response == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- ChallengeLen = 2 * ISCSI_CHAP_RSP_LEN + 3;
- Challenge = AllocatePool (ChallengeLen);
- if (Challenge == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- switch (Conn->CHAPStep) {
- case ISCSI_CHAP_INITIAL:
- //
- // It's the initial Login Request. Fill in the key=value pairs mandatory
- // for the initial Login Request.
- //
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIATOR_NAME, Session->InitiatorName);
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_SESSION_TYPE, "Normal");
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_TARGET_NAME, Session->ConfigData.NvData.TargetName);
-
- if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) {
- Value = ISCSI_KEY_VALUE_NONE;
- ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
- } else {
- Value = ISCSI_AUTH_METHOD_CHAP;
- }
-
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_AUTH_METHOD, Value);
-
- break;
-
- case ISCSI_CHAP_STEP_ONE:
- //
- // First step, send the Login Request with CHAP_A=<A1,A2...> key-value pair.
- //
- AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", ISCSI_CHAP_ALGORITHM_MD5);
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_ALGORITHM, ValueStr);
-
- Conn->CHAPStep = ISCSI_CHAP_STEP_TWO;
- break;
-
- case ISCSI_CHAP_STEP_THREE:
- //
- // Third step, send the Login Request with CHAP_N=<N> CHAP_R=<R> or
- // CHAP_N=<N> CHAP_R=<R> CHAP_I=<I> CHAP_C=<C> if target ahtentication is
- // required too.
- //
- // CHAP_N=<N>
- //
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_NAME, (CHAR8 *) &AuthData->AuthConfig.CHAPName);
- //
- // CHAP_R=<R>
- //
- IScsiBinToHex ((UINT8 *) AuthData->CHAPResponse, ISCSI_CHAP_RSP_LEN, Response, &RspLen);
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_RESPONSE, Response);
-
- if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL) {
- //
- // CHAP_I=<I>
- //
- IScsiGenRandom ((UINT8 *) &AuthData->OutIdentifier, 1);
- AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData->OutIdentifier);
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr);
- //
- // CHAP_C=<C>
- //
- IScsiGenRandom ((UINT8 *) AuthData->OutChallenge, ISCSI_CHAP_RSP_LEN);
- AuthData->OutChallengeLength = ISCSI_CHAP_RSP_LEN;
- IScsiBinToHex ((UINT8 *) AuthData->OutChallenge, ISCSI_CHAP_RSP_LEN, Challenge, &ChallengeLen);
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_CHALLENGE, Challenge);
-
- Conn->CHAPStep = ISCSI_CHAP_STEP_FOUR;
- }
- //
- // set the stage transition flag.
- //
- ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
- break;
-
- default:
- Status = EFI_PROTOCOL_ERROR;
- break;
- }
-
- FreePool (Response);
- FreePool (Challenge);
-
- return Status;
-}
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
deleted file mode 100644
index cb1eff1b690c..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
+++ /dev/null
@@ -1,1264 +0,0 @@
-/** @file
- Helper functions for configuring or getting the parameters relating to iSCSI.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#include "IScsiImpl.h"
-
-CHAR16 mVendorStorageName[] = L"ISCSI_CONFIG_IFR_NVDATA";
-BOOLEAN mIScsiDeviceListUpdated = FALSE;
-UINTN mNumberOfIScsiDevices = 0;
-ISCSI_FORM_CALLBACK_INFO *mCallbackInfo = NULL;
-
-LIST_ENTRY mIScsiConfigFormList = {
- &mIScsiConfigFormList,
- &mIScsiConfigFormList
-};
-
-HII_VENDOR_DEVICE_PATH mIScsiHiiVendorDevicePath = {
- {
- {
- HARDWARE_DEVICE_PATH,
- HW_VENDOR_DP,
- {
- (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
- (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
- }
- },
- IP4_ISCSI_CONFIG_GUID
- },
- {
- END_DEVICE_PATH_TYPE,
- END_ENTIRE_DEVICE_PATH_SUBTYPE,
- {
- (UINT8) (END_DEVICE_PATH_LENGTH),
- (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
- }
- }
-};
-
-/**
- Convert the IPv4 address into a dotted string.
-
- @param[in] Ip The IPv4 address.
- @param[out] Str The dotted IP string.
-**/
-VOID
-IScsiIpToStr (
- IN EFI_IPv4_ADDRESS *Ip,
- OUT CHAR16 *Str
- )
-{
- UnicodeSPrint ( Str, 2 * IP4_STR_MAX_SIZE, L"%d.%d.%d.%d", Ip->Addr[0], Ip->Addr[1], Ip->Addr[2], Ip->Addr[3]);
-}
-
-
-/**
- Parse IsId in string format and convert it to binary.
-
- @param[in] String The buffer of the string to be parsed.
- @param[in, out] IsId The buffer to store IsId.
-
- @retval EFI_SUCCESS The operation finished successfully.
- @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
-
-**/
-EFI_STATUS
-IScsiParseIsIdFromString (
- IN CONST CHAR16 *String,
- IN OUT UINT8 *IsId
- )
-{
- UINT8 Index;
- CHAR16 *IsIdStr;
- CHAR16 TempStr[3];
- UINTN NodeVal;
- CHAR16 PortString[ISCSI_NAME_IFR_MAX_SIZE];
- EFI_INPUT_KEY Key;
-
- if ((String == NULL) || (IsId == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- IsIdStr = (CHAR16 *) String;
-
- if (StrLen (IsIdStr) != 6) {
- UnicodeSPrint (
- PortString,
- (UINTN) sizeof (PortString),
- L"Error! Input is incorrect, please input 6 hex numbers!\n"
- );
-
- CreatePopUp (
- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
- &Key,
- PortString,
- NULL
- );
-
- return EFI_INVALID_PARAMETER;
- }
-
- for (Index = 3; Index < 6; Index++) {
- CopyMem (TempStr, IsIdStr, sizeof (TempStr));
- TempStr[2] = L'\0';
-
- //
- // Convert the string to IsId. StrHexToUintn stops at the first character
- // that is not a valid hex character, '\0' here.
- //
- NodeVal = StrHexToUintn (TempStr);
-
- IsId[Index] = (UINT8) NodeVal;
-
- IsIdStr = IsIdStr + 2;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Convert IsId from binary to string format.
-
- @param[out] String The buffer to store the converted string.
- @param[in] IsId The buffer to store IsId.
-
- @retval EFI_SUCCESS The string converted successfully.
- @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
-
-**/
-EFI_STATUS
-IScsiConvertIsIdToString (
- OUT CHAR16 *String,
- IN UINT8 *IsId
- )
-{
- UINT8 Index;
- UINTN Number;
-
- if ((String == NULL) || (IsId == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- for (Index = 0; Index < 6; Index++) {
- if (IsId[Index] <= 0xF) {
- Number = UnicodeSPrint (
- String,
- 2 * ISID_CONFIGURABLE_STORAGE,
- L"0%X",
- (UINTN) IsId[Index]
- );
- } else {
- Number = UnicodeSPrint (
- String,
- 2 * ISID_CONFIGURABLE_STORAGE,
- L"%X",
- (UINTN) IsId[Index]
- );
-
- }
-
- String = String + Number;
- }
-
- *String = L'\0';
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Update the list of iSCSI devices the iSCSI driver is controlling.
-
- @retval EFI_SUCCESS The callback successfully handled the action.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiUpdateDeviceList (
- VOID
- )
-{
- EFI_STATUS Status;
- ISCSI_DEVICE_LIST *DeviceList;
- UINTN DataSize;
- UINTN NumHandles;
- EFI_HANDLE *Handles;
- UINTN HandleIndex;
- UINTN Index;
- UINTN LastDeviceIndex;
- EFI_MAC_ADDRESS MacAddress;
- UINTN HwAddressSize;
- UINT16 VlanId;
- ISCSI_MAC_INFO *CurMacInfo;
- ISCSI_MAC_INFO TempMacInfo;
- CHAR16 MacString[70];
- UINTN DeviceListSize;
-
- //
- // Dump all the handles the Managed Network Service Binding Protocol is installed on.
- //
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- NULL,
- &NumHandles,
- &Handles
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- DataSize = 0;
- Status = gRT->GetVariable (
- L"iSCSIDeviceList",
- &gIp4IScsiConfigGuid,
- NULL,
- &DataSize,
- NULL
- );
- if (Status == EFI_BUFFER_TOO_SMALL) {
- DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DataSize);
- ASSERT (DeviceList != NULL);
-
- gRT->GetVariable (
- L"iSCSIDeviceList",
- &gIp4IScsiConfigGuid,
- NULL,
- &DataSize,
- DeviceList
- );
-
- LastDeviceIndex = 0;
-
- for (HandleIndex = 0; HandleIndex < NumHandles; HandleIndex++) {
- Status = NetLibGetMacAddress (Handles[HandleIndex], &MacAddress, &HwAddressSize);
- ASSERT (Status == EFI_SUCCESS);
- VlanId = NetLibGetVlanId (Handles[HandleIndex]);
-
- for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; Index++) {
- CurMacInfo = &DeviceList->MacInfo[Index];
- if ((CurMacInfo->Len == HwAddressSize) &&
- (CurMacInfo->VlanId == VlanId) &&
- (NET_MAC_EQUAL (&CurMacInfo->Mac, MacAddress.Addr, HwAddressSize))
- ) {
- //
- // The previous configured NIC is still here.
- //
- if (Index != LastDeviceIndex) {
- //
- // Swap the current MAC address entry with the one indexed by
- // LastDeviceIndex.
- //
- CopyMem (&TempMacInfo, CurMacInfo, sizeof (ISCSI_MAC_INFO));
- CopyMem (CurMacInfo, &DeviceList->MacInfo[LastDeviceIndex], sizeof (ISCSI_MAC_INFO));
- CopyMem (&DeviceList->MacInfo[LastDeviceIndex], &TempMacInfo, sizeof (ISCSI_MAC_INFO));
- }
-
- LastDeviceIndex++;
- }
- }
-
- if (LastDeviceIndex == DeviceList->NumDevice) {
- break;
- }
- }
-
- for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; Index++) {
- //
- // delete the variables
- //
- CurMacInfo = &DeviceList->MacInfo[Index];
- IScsiMacAddrToStr (&CurMacInfo->Mac, CurMacInfo->Len, CurMacInfo->VlanId, MacString);
- gRT->SetVariable (MacString, &gEfiIScsiInitiatorNameProtocolGuid, 0, 0, NULL);
- gRT->SetVariable (MacString, &gIScsiCHAPAuthInfoGuid, 0, 0, NULL);
- }
-
- FreePool (DeviceList);
- } else if (Status != EFI_NOT_FOUND) {
- FreePool (Handles);
- return Status;
- }
- //
- // Construct the new iSCSI device list.
- //
- DeviceListSize = sizeof (ISCSI_DEVICE_LIST) + (NumHandles - 1) * sizeof (ISCSI_MAC_INFO);
- DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DeviceListSize);
- ASSERT (DeviceList != NULL);
- DeviceList->NumDevice = (UINT8) NumHandles;
-
- for (Index = 0; Index < NumHandles; Index++) {
- NetLibGetMacAddress (Handles[Index], &MacAddress, &HwAddressSize);
-
- CurMacInfo = &DeviceList->MacInfo[Index];
- CopyMem (&CurMacInfo->Mac, MacAddress.Addr, HwAddressSize);
- CurMacInfo->Len = (UINT8) HwAddressSize;
- CurMacInfo->VlanId = NetLibGetVlanId (Handles[Index]);
- }
-
- gRT->SetVariable (
- L"iSCSIDeviceList",
- &gIp4IScsiConfigGuid,
- ISCSI_CONFIG_VAR_ATTR,
- DeviceListSize,
- DeviceList
- );
-
- FreePool (DeviceList);
- FreePool (Handles);
-
- return Status;
-}
-
-/**
- Get the iSCSI configuration form entry by the index of the goto opcode actived.
-
- @param[in] Index The 0-based index of the goto opcode actived.
-
- @return The iSCSI configuration form entry found.
-**/
-ISCSI_CONFIG_FORM_ENTRY *
-IScsiGetConfigFormEntryByIndex (
- IN UINT32 Index
- )
-{
- UINT32 CurrentIndex;
- LIST_ENTRY *Entry;
- ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry;
-
- CurrentIndex = 0;
- ConfigFormEntry = NULL;
-
- NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {
- if (CurrentIndex == Index) {
- ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, ISCSI_CONFIG_FORM_ENTRY, Link);
- break;
- }
-
- CurrentIndex++;
- }
-
- return ConfigFormEntry;
-}
-
-/**
- Convert the iSCSI configuration data into the IFR data.
-
- @param[in] ConfigFormEntry The iSCSI configuration form entry.
- @param[out] IfrNvData The IFR nv data.
-
-**/
-VOID
-IScsiConvertDeviceConfigDataToIfrNvData (
- IN ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry,
- OUT ISCSI_CONFIG_IFR_NVDATA *IfrNvData
- )
-{
- ISCSI_SESSION_CONFIG_NVDATA *SessionConfigData;
- ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfigData;
-
- //
- // Normal session configuration parameters.
- //
- SessionConfigData = &ConfigFormEntry->SessionConfigData;
- IfrNvData->Enabled = SessionConfigData->Enabled;
-
- IfrNvData->InitiatorInfoFromDhcp = SessionConfigData->InitiatorInfoFromDhcp;
- IfrNvData->TargetInfoFromDhcp = SessionConfigData->TargetInfoFromDhcp;
- IfrNvData->TargetPort = SessionConfigData->TargetPort;
-
- IScsiIpToStr (&SessionConfigData->LocalIp, IfrNvData->LocalIp);
- IScsiIpToStr (&SessionConfigData->SubnetMask, IfrNvData->SubnetMask);
- IScsiIpToStr (&SessionConfigData->Gateway, IfrNvData->Gateway);
- IScsiIpToStr (&SessionConfigData->TargetIp, IfrNvData->TargetIp);
-
- IScsiAsciiStrToUnicodeStr (SessionConfigData->TargetName, IfrNvData->TargetName);
-
- IScsiLunToUnicodeStr (SessionConfigData->BootLun, IfrNvData->BootLun);
-
- IScsiConvertIsIdToString (IfrNvData->IsId, SessionConfigData->IsId);
-
- //
- // CHAP authentication parameters.
- //
- AuthConfigData = &ConfigFormEntry->AuthConfigData;
-
- IfrNvData->CHAPType = AuthConfigData->CHAPType;
-
- IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPName, IfrNvData->CHAPName);
- IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPSecret, IfrNvData->CHAPSecret);
- IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPName, IfrNvData->ReverseCHAPName);
- IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPSecret, IfrNvData->ReverseCHAPSecret);
-}
-
-/**
- This function allows the caller to request the current
- configuration for one or more named elements. The resulting
- string is in <ConfigAltResp> format. Any and all alternative
- configuration strings shall also be appended to the end of the
- current configuration string. If they are, they must appear
- after the current configuration. They must contain the same
- routing (GUID, NAME, PATH) as the current configuration string.
- They must have an additional description indicating the type of
- alternative configuration the string represents,
- "ALTCFG=<StringToken>". That <StringToken> (when
- converted from Hex UNICODE to binary) is a reference to a
- string in the associated string pack.
-
- @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
- @param[in] Request A null-terminated Unicode string in
- <ConfigRequest> format. Note that this
- includes the routing information as well as
- the configurable name / value pairs. It is
- invalid for this string to be in
- <MultiConfigRequest> format.
- @param[out] Progress On return, points to a character in the
- Request string. Points to the string's null
- terminator if request was successful. Points
- to the most recent "&" before the first
- failing name / value pair (or the beginning
- of the string if the failure is in the first
- name / value pair) if the request was not
- successful.
- @param[out] Results A null-terminated Unicode string in
- <ConfigAltResp> format which has all values
- filled in for the names in the Request string.
- String to be allocated by the called function.
-
- @retval EFI_SUCCESS The Results string is filled with the
- values corresponding to all requested
- names.
- @retval EFI_OUT_OF_RESOURCES Not enough memory to store the
- parts of the results that must be
- stored awaiting possible future
- protocols.
- @retval EFI_INVALID_PARAMETER For example, passing in a NULL
- for the Request parameter
- would result in this type of
- error. In this case, the
- Progress parameter would be
- set to NULL.
- @retval EFI_NOT_FOUND Routing data doesn't match any
- known driver. Progress set to the
- first character in the routing header.
- Note: There is no requirement that the
- driver validate the routing data. It
- must skip the <ConfigHdr> in order to
- process the names.
- @retval EFI_INVALID_PARAMETER Illegal syntax. Progress set
- to most recent & before the
- error or the beginning of the
- string.
- @retval EFI_INVALID_PARAMETER Unknown name. Progress points
- to the & before the name in
- question.Currently not implemented.
-**/
-EFI_STATUS
-EFIAPI
-IScsiFormExtractConfig (
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
- IN CONST EFI_STRING Request,
- OUT EFI_STRING *Progress,
- OUT EFI_STRING *Results
- )
-{
- EFI_STATUS Status;
- CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE];
- UINTN BufferSize;
- ISCSI_CONFIG_IFR_NVDATA *IfrNvData;
- ISCSI_FORM_CALLBACK_INFO *Private;
- EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;
- EFI_STRING ConfigRequestHdr;
- EFI_STRING ConfigRequest;
- BOOLEAN AllocatedRequest;
- UINTN Size;
-
- if (Progress == NULL || Results == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- *Progress = Request;
- if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, &gIp4IScsiConfigGuid, mVendorStorageName)) {
- return EFI_NOT_FOUND;
- }
-
- ConfigRequestHdr = NULL;
- ConfigRequest = NULL;
- AllocatedRequest = FALSE;
- Size = 0;
-
- if (!mIScsiDeviceListUpdated) {
- //
- // Update the device list.
- //
- IScsiUpdateDeviceList ();
- mIScsiDeviceListUpdated = TRUE;
- }
-
- Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);
- IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA));
- ASSERT (IfrNvData != NULL);
- if (Private->Current != NULL) {
- IScsiConvertDeviceConfigDataToIfrNvData (Private->Current, IfrNvData);
- }
-
- BufferSize = ISCSI_NAME_MAX_SIZE;
- Status = gIScsiInitiatorName.Get (&gIScsiInitiatorName, &BufferSize, InitiatorName);
- if (EFI_ERROR (Status)) {
- IfrNvData->InitiatorName[0] = L'\0';
- } else {
- IScsiAsciiStrToUnicodeStr (InitiatorName, IfrNvData->InitiatorName);
- }
-
- //
- // Convert buffer data to <ConfigResp> by helper function BlockToConfig()
- //
- HiiConfigRouting = Private->ConfigRouting;
- BufferSize = sizeof (ISCSI_CONFIG_IFR_NVDATA);
- ConfigRequest = Request;
- if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {
- //
- // Request has no request element, construct full request string.
- // Allocate and fill a buffer large enough to hold the <ConfigHdr> template
- // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator
- //
- ConfigRequestHdr = HiiConstructConfigHdr (&gIp4IScsiConfigGuid, mVendorStorageName, Private->DriverHandle);
- Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
- ConfigRequest = AllocateZeroPool (Size);
- ASSERT (ConfigRequest != NULL);
- AllocatedRequest = TRUE;
- UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);
- FreePool (ConfigRequestHdr);
- }
- Status = HiiConfigRouting->BlockToConfig (
- HiiConfigRouting,
- ConfigRequest,
- (UINT8 *) IfrNvData,
- BufferSize,
- Results,
- Progress
- );
- FreePool (IfrNvData);
- //
- // Free the allocated config request string.
- //
- if (AllocatedRequest) {
- FreePool (ConfigRequest);
- ConfigRequest = NULL;
- }
-
- //
- // Set Progress string to the original request string.
- //
- if (Request == NULL) {
- *Progress = NULL;
- } else if (StrStr (Request, L"OFFSET") == NULL) {
- *Progress = Request + StrLen (Request);
- }
-
- return Status;
-}
-
-/**
- This function applies changes in a driver's configuration.
- Input is a Configuration, which has the routing data for this
- driver followed by name / value configuration pairs. The driver
- must apply those pairs to its configurable storage. If the
- driver's configuration is stored in a linear block of data
- and the driver's name / value pairs are in <BlockConfig>
- format, it may use the ConfigToBlock helper function (above) to
- simplify the job. Currently not implemented.
-
- @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
- @param[in] Configuration A null-terminated Unicode string in
- <ConfigString> format.
- @param[out] Progress A pointer to a string filled in with the
- offset of the most recent '&' before the
- first failing name / value pair (or the
- beginn ing of the string if the failure
- is in the first name / value pair) or
- the terminating NULL if all was
- successful.
-
- @retval EFI_SUCCESS The results have been distributed or are
- awaiting distribution.
- @retval EFI_OUT_OF_RESOURCES Not enough memory to store the
- parts of the results that must be
- stored awaiting possible future
- protocols.
- @retval EFI_INVALID_PARAMETERS Passing in a NULL for the
- Results parameter would result
- in this type of error.
- @retval EFI_NOT_FOUND Target for the specified routing data
- was not found.
-**/
-EFI_STATUS
-EFIAPI
-IScsiFormRouteConfig (
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
- IN CONST EFI_STRING Configuration,
- OUT EFI_STRING *Progress
- )
-{
- if (Configuration == NULL || Progress == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Check routing data in <ConfigHdr>.
- // Note: if only one Storage is used, then this checking could be skipped.
- //
- if (!HiiIsConfigHdrMatch (Configuration, &gIp4IScsiConfigGuid, mVendorStorageName)) {
- *Progress = Configuration;
- return EFI_NOT_FOUND;
- }
-
- *Progress = Configuration + StrLen (Configuration);
- return EFI_SUCCESS;
-}
-
-/**
- This function is called to provide results data to the driver.
- This data consists of a unique key that is used to identify
- which data is either being passed back or being asked for.
-
- @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
- @param[in] Action Specifies the type of action taken by the browser.
- @param[in] QuestionId A unique value which is sent to the original
- exporting driver so that it can identify the type
- of data to expect. The format of the data tends to
- vary based on the opcode that enerated the callback.
- @param[in] Type The type of value for the question.
- @param[in] Value A pointer to the data being sent to the original
- exporting driver.
- @param[out] ActionRequest On return, points to the action requested by the
- callback function.
-
- @retval EFI_SUCCESS The callback successfully handled the action.
- @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the
- variable and its data.
- @retval EFI_DEVICE_ERROR The variable could not be saved.
- @retval EFI_UNSUPPORTED The specified Action is not supported by the
- callback.Currently not implemented.
- @retval EFI_INVALID_PARAMETERS Passing in wrong parameter.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiFormCallback (
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
- IN EFI_BROWSER_ACTION Action,
- IN EFI_QUESTION_ID QuestionId,
- IN UINT8 Type,
- IN EFI_IFR_TYPE_VALUE *Value,
- OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
- )
-{
- ISCSI_FORM_CALLBACK_INFO *Private;
- UINTN BufferSize;
- CHAR8 IScsiName[ISCSI_NAME_MAX_SIZE];
- CHAR16 PortString[128];
- CHAR8 Ip4String[IP4_STR_MAX_SIZE];
- CHAR8 LunString[ISCSI_LUN_STR_MAX_LEN];
- UINT64 Lun;
- EFI_STRING_ID DeviceFormTitleToken;
- ISCSI_CONFIG_IFR_NVDATA *IfrNvData;
- ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry;
- EFI_IP_ADDRESS HostIp;
- EFI_IP_ADDRESS SubnetMask;
- EFI_IP_ADDRESS Gateway;
- EFI_STATUS Status;
- EFI_INPUT_KEY Key;
-
- if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) {
- return EFI_UNSUPPORTED;
- }
-
- Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);
- //
- // Retrieve uncommitted data from Browser
- //
- IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA));
- ASSERT (IfrNvData != NULL);
- if (!HiiGetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData)) {
- FreePool (IfrNvData);
- return EFI_NOT_FOUND;
- }
- Status = EFI_SUCCESS;
-
- if (Action == EFI_BROWSER_ACTION_CHANGING) {
- if ((QuestionId >= KEY_DEVICE_ENTRY_BASE) && (QuestionId < (mNumberOfIScsiDevices + KEY_DEVICE_ENTRY_BASE))) {
- //
- // In case goto the device configuration form, update the device form title.
- //
- ConfigFormEntry = IScsiGetConfigFormEntryByIndex ((UINT32) (QuestionId - KEY_DEVICE_ENTRY_BASE));
- ASSERT (ConfigFormEntry != NULL);
-
- UnicodeSPrint (PortString, (UINTN) sizeof (PortString), L"Port %s", ConfigFormEntry->MacString);
- DeviceFormTitleToken = (EFI_STRING_ID) STR_ISCSI_DEVICE_FORM_TITLE;
- HiiSetString (Private->RegisteredHandle, DeviceFormTitleToken, PortString, NULL);
-
- IScsiConvertDeviceConfigDataToIfrNvData (ConfigFormEntry, IfrNvData);
-
- Private->Current = ConfigFormEntry;
- }
- } else if (Action == EFI_BROWSER_ACTION_CHANGED) {
- switch (QuestionId) {
- case KEY_INITIATOR_NAME:
- IScsiUnicodeStrToAsciiStr (IfrNvData->InitiatorName, IScsiName);
- BufferSize = AsciiStrSize (IScsiName);
-
- Status = gIScsiInitiatorName.Set (&gIScsiInitiatorName, &BufferSize, IScsiName);
- if (EFI_ERROR (Status)) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL);
- }
-
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;
- break;
-
- case KEY_LOCAL_IP:
- IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String);
- Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);
- if (EFI_ERROR (Status) ||
- ((Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) &&
- !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr)))) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);
- Status = EFI_INVALID_PARAMETER;
- } else {
- CopyMem (&Private->Current->SessionConfigData.LocalIp, &HostIp.v4, sizeof (HostIp.v4));
- }
-
- break;
-
- case KEY_SUBNET_MASK:
- IScsiUnicodeStrToAsciiStr (IfrNvData->SubnetMask, Ip4String);
- Status = IScsiAsciiStrToIp (Ip4String, &SubnetMask.v4);
- if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) && (IScsiGetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Subnet Mask!", NULL);
- Status = EFI_INVALID_PARAMETER;
- } else {
- CopyMem (&Private->Current->SessionConfigData.SubnetMask, &SubnetMask.v4, sizeof (SubnetMask.v4));
- }
-
- break;
-
- case KEY_GATE_WAY:
- IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String);
- Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4);
- if (EFI_ERROR (Status) ||
- ((Gateway.Addr[0] != 0) &&
- (Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) &&
- !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr)))) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Gateway!", NULL);
- Status = EFI_INVALID_PARAMETER;
- } else {
- CopyMem (&Private->Current->SessionConfigData.Gateway, &Gateway.v4, sizeof (Gateway.v4));
- }
-
- break;
-
- case KEY_TARGET_IP:
- IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String);
- Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);
- if (EFI_ERROR (Status) || IP4_IS_LOCAL_BROADCAST (EFI_NTOHL(HostIp.v4)) || IP4_IS_UNSPECIFIED (EFI_NTOHL(HostIp.v4))) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);
- Status = EFI_INVALID_PARAMETER;
- } else {
- CopyMem (&Private->Current->SessionConfigData.TargetIp, &HostIp.v4, sizeof (HostIp.v4));
- }
-
- break;
-
- case KEY_TARGET_NAME:
- IScsiUnicodeStrToAsciiStr (IfrNvData->TargetName, IScsiName);
- Status = IScsiNormalizeName (IScsiName, AsciiStrLen (IScsiName));
- if (EFI_ERROR (Status)) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL);
- } else {
- AsciiStrCpyS (Private->Current->SessionConfigData.TargetName, ISCSI_NAME_MAX_SIZE, IScsiName);
- }
-
- break;
-
- case KEY_DHCP_ENABLE:
- if (IfrNvData->InitiatorInfoFromDhcp == 0) {
- IfrNvData->TargetInfoFromDhcp = 0;
- }
-
- break;
-
- case KEY_BOOT_LUN:
- IScsiUnicodeStrToAsciiStr (IfrNvData->BootLun, LunString);
- Status = IScsiAsciiStrToLun (LunString, (UINT8 *) &Lun);
- if (EFI_ERROR (Status)) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid LUN string!", NULL);
- } else {
- CopyMem (Private->Current->SessionConfigData.BootLun, &Lun, sizeof (Lun));
- }
-
- break;
-
- case KEY_CHAP_NAME:
- IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPName, Private->Current->AuthConfigData.CHAPName);
- break;
-
- case KEY_CHAP_SECRET:
- IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPSecret, Private->Current->AuthConfigData.CHAPSecret);
- break;
-
- case KEY_REVERSE_CHAP_NAME:
- IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPName, Private->Current->AuthConfigData.ReverseCHAPName);
- break;
-
- case KEY_REVERSE_CHAP_SECRET:
- IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPSecret, Private->Current->AuthConfigData.ReverseCHAPSecret);
- break;
-
- case KEY_CONFIG_ISID:
- IScsiParseIsIdFromString (IfrNvData->IsId, Private->Current->SessionConfigData.IsId);
- IScsiConvertIsIdToString (IfrNvData->IsId, Private->Current->SessionConfigData.IsId);
-
- break;
-
- case KEY_SAVE_CHANGES:
- //
- // First, update those fields which don't have INTERACTIVE set.
- //
- Private->Current->SessionConfigData.Enabled = IfrNvData->Enabled;
- Private->Current->SessionConfigData.InitiatorInfoFromDhcp = IfrNvData->InitiatorInfoFromDhcp;
- Private->Current->SessionConfigData.TargetPort = IfrNvData->TargetPort;
- if (Private->Current->SessionConfigData.TargetPort == 0) {
- Private->Current->SessionConfigData.TargetPort = ISCSI_WELL_KNOWN_PORT;
- }
-
- Private->Current->SessionConfigData.TargetInfoFromDhcp = IfrNvData->TargetInfoFromDhcp;
- Private->Current->AuthConfigData.CHAPType = IfrNvData->CHAPType;
-
- //
- // Only do full parameter validation if iSCSI is enabled on this device.
- //
- if (Private->Current->SessionConfigData.Enabled) {
- //
- // Validate the address configuration of the Initiator if DHCP isn't
- // deployed.
- //
- if (!Private->Current->SessionConfigData.InitiatorInfoFromDhcp) {
- CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.LocalIp, sizeof (HostIp.v4));
- CopyMem (&SubnetMask.v4, &Private->Current->SessionConfigData.SubnetMask, sizeof (SubnetMask.v4));
- CopyMem (&Gateway.v4, &Private->Current->SessionConfigData.Gateway, sizeof (Gateway.v4));
-
- if ((Gateway.Addr[0] != 0)) {
- if (SubnetMask.Addr[0] == 0) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Gateway address is set but subnet mask is zero.", NULL);
- Status = EFI_INVALID_PARAMETER;
- break;
- } else if (!IP4_NET_EQUAL (HostIp.Addr[0], Gateway.Addr[0], SubnetMask.Addr[0])) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Local IP and Gateway are not in the same subnet.", NULL);
- Status = EFI_INVALID_PARAMETER;
- break;
- }
- }
- }
- //
- // Validate target configuration if DHCP isn't deployed.
- //
- if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) {
- CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.TargetIp, sizeof (HostIp.v4));
- if (IP4_IS_UNSPECIFIED (NTOHL (HostIp.Addr[0])) || IP4_IS_LOCAL_BROADCAST (NTOHL (HostIp.Addr[0]))) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Target IP is invalid!", NULL);
- Status = EFI_INVALID_PARAMETER;
- break;
- }
-
- //
- // Validate iSCSI target name configuration again:
- // The format of iSCSI target name is already verified when user input the name;
- // here we only check the case user does not input the name.
- //
- if (Private->Current->SessionConfigData.TargetName[0] == '\0') {
- CreatePopUp (
- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
- &Key,
- L"iSCSI target name is NULL!",
- NULL
- );
- Status = EFI_INVALID_PARAMETER;
- break;
- }
-
- }
-
- if (IfrNvData->CHAPType != ISCSI_CHAP_NONE) {
- if ((IfrNvData->CHAPName[0] == '\0') || (IfrNvData->CHAPSecret[0] == '\0')) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"CHAP Name or CHAP Secret is invalid!", NULL);
- Status = EFI_INVALID_PARAMETER;
- break;
- }
-
- if ((IfrNvData->CHAPType == ISCSI_CHAP_MUTUAL) &&
- ((IfrNvData->ReverseCHAPName[0] == '\0') || (IfrNvData->ReverseCHAPSecret[0] == '\0'))
- ) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Reverse CHAP Name or Reverse CHAP Secret is invalid!", NULL);
- Status = EFI_INVALID_PARAMETER;
- break;
- }
- }
- }
-
- BufferSize = sizeof (Private->Current->SessionConfigData);
- gRT->SetVariable (
- Private->Current->MacString,
- &gEfiIScsiInitiatorNameProtocolGuid,
- ISCSI_CONFIG_VAR_ATTR,
- BufferSize,
- &Private->Current->SessionConfigData
- );
-
- BufferSize = sizeof (Private->Current->AuthConfigData);
- gRT->SetVariable (
- Private->Current->MacString,
- &gIScsiCHAPAuthInfoGuid,
- ISCSI_CONFIG_VAR_ATTR,
- BufferSize,
- &Private->Current->AuthConfigData
- );
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;
- break;
-
- default:
- break;
- }
- }
-
- if (!EFI_ERROR (Status)) {
- //
- // Pass changed uncommitted data back to Form Browser
- //
- HiiSetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData, NULL);
- }
-
- FreePool (IfrNvData);
-
- return Status;
-}
-
-/**
- Updates the iSCSI configuration form to add/delete an entry for the iSCSI
- device specified by the Controller.
-
- @param[in] DriverBindingHandle The driverbinding handle.
- @param[in] Controller The controller handle of the iSCSI device.
- @param[in] AddForm Whether to add or delete a form entry.
-
- @retval EFI_SUCCESS The iSCSI configuration form is updated.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiConfigUpdateForm (
- IN EFI_HANDLE DriverBindingHandle,
- IN EFI_HANDLE Controller,
- IN BOOLEAN AddForm
- )
-{
- LIST_ENTRY *Entry;
- ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry;
- BOOLEAN EntryExisted;
- EFI_STATUS Status;
- EFI_MAC_ADDRESS MacAddress;
- UINTN HwAddressSize;
- UINT16 VlanId;
- CHAR16 PortString[128];
- UINT16 FormIndex;
- UINTN BufferSize;
- VOID *StartOpCodeHandle;
- VOID *EndOpCodeHandle;
- EFI_IFR_GUID_LABEL *StartLabel;
- EFI_IFR_GUID_LABEL *EndLabel;
-
- ConfigFormEntry = NULL;
- EntryExisted = FALSE;
-
- NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {
- ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, ISCSI_CONFIG_FORM_ENTRY, Link);
-
- if (ConfigFormEntry->Controller == Controller) {
- EntryExisted = TRUE;
- break;
- }
- }
-
- if (AddForm) {
- if (EntryExisted) {
- return EFI_SUCCESS;
- } else {
- //
- // Add a new form.
- //
- ConfigFormEntry = (ISCSI_CONFIG_FORM_ENTRY *) AllocateZeroPool (sizeof (ISCSI_CONFIG_FORM_ENTRY));
- if (ConfigFormEntry == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- InitializeListHead (&ConfigFormEntry->Link);
- ConfigFormEntry->Controller = Controller;
-
- //
- // Get the MAC address and convert it into the formatted string.
- //
- Status = NetLibGetMacAddress (Controller, &MacAddress, &HwAddressSize);
- ASSERT (Status == EFI_SUCCESS);
- VlanId = NetLibGetVlanId (Controller);
-
- IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, ConfigFormEntry->MacString);
-
- //
- // Get the normal session configuration data.
- //
- BufferSize = sizeof (ConfigFormEntry->SessionConfigData);
- Status = gRT->GetVariable (
- ConfigFormEntry->MacString,
- &gEfiIScsiInitiatorNameProtocolGuid,
- NULL,
- &BufferSize,
- &ConfigFormEntry->SessionConfigData
- );
- if (EFI_ERROR (Status)) {
- ZeroMem (&ConfigFormEntry->SessionConfigData, sizeof (ConfigFormEntry->SessionConfigData));
-
- //
- // Generate OUI-format ISID based on MAC address.
- //
- CopyMem (ConfigFormEntry->SessionConfigData.IsId, &MacAddress, 6);
- ConfigFormEntry->SessionConfigData.IsId[0] =
- (UINT8) (ConfigFormEntry->SessionConfigData.IsId[0] & 0x3F);
- }
- //
- // Get the CHAP authentication configuration data.
- //
- BufferSize = sizeof (ConfigFormEntry->AuthConfigData);
- Status = gRT->GetVariable (
- ConfigFormEntry->MacString,
- &gIScsiCHAPAuthInfoGuid,
- NULL,
- &BufferSize,
- &ConfigFormEntry->AuthConfigData
- );
- if (EFI_ERROR (Status)) {
- ZeroMem (&ConfigFormEntry->AuthConfigData, sizeof (ConfigFormEntry->AuthConfigData));
- }
- //
- // Compose the Port string and create a new EFI_STRING_ID.
- //
- UnicodeSPrint (PortString, sizeof (PortString), L"Port %s", ConfigFormEntry->MacString);
- ConfigFormEntry->PortTitleToken = HiiSetString (mCallbackInfo->RegisteredHandle, 0, PortString, NULL);
-
- //
- // Compose the help string of this port and create a new EFI_STRING_ID.
- //
- UnicodeSPrint (PortString, sizeof (PortString), L"Set the iSCSI parameters on port %s", ConfigFormEntry->MacString);
- ConfigFormEntry->PortTitleHelpToken = HiiSetString (mCallbackInfo->RegisteredHandle, 0, PortString, NULL);
-
- InsertTailList (&mIScsiConfigFormList, &ConfigFormEntry->Link);
- mNumberOfIScsiDevices++;
- }
- } else {
- ASSERT (EntryExisted);
-
- mNumberOfIScsiDevices--;
- RemoveEntryList (&ConfigFormEntry->Link);
- FreePool (ConfigFormEntry);
- mCallbackInfo->Current = NULL;
- }
- //
- // Allocate space for creation of Buffer
- //
-
- //
- // Init OpCode Handle
- //
- StartOpCodeHandle = HiiAllocateOpCodeHandle ();
- ASSERT (StartOpCodeHandle != NULL);
-
- EndOpCodeHandle = HiiAllocateOpCodeHandle ();
- ASSERT (EndOpCodeHandle != NULL);
-
- //
- // Create Hii Extend Label OpCode as the start opcode
- //
- StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
- StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
- StartLabel->Number = DEVICE_ENTRY_LABEL;
-
- //
- // Create Hii Extend Label OpCode as the end opcode
- //
- EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
- EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
- EndLabel->Number = LABEL_END;
-
- FormIndex = 0;
- NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {
- ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, ISCSI_CONFIG_FORM_ENTRY, Link);
-
- HiiCreateGotoOpCode (
- StartOpCodeHandle, // Container for dynamic created opcodes
- FORMID_DEVICE_FORM, // Target Form ID
- ConfigFormEntry->PortTitleToken, // Prompt text
- ConfigFormEntry->PortTitleHelpToken, // Help text
- EFI_IFR_FLAG_CALLBACK, // Question flag
- (UINT16)(KEY_DEVICE_ENTRY_BASE + FormIndex) // Question ID
- );
-
- FormIndex++;
- }
-
- HiiUpdateForm (
- mCallbackInfo->RegisteredHandle,
- &gIp4IScsiConfigGuid,
- FORMID_MAIN_FORM,
- StartOpCodeHandle, // Label DEVICE_ENTRY_LABEL
- EndOpCodeHandle // LABEL_END
- );
-
- HiiFreeOpCodeHandle (StartOpCodeHandle);
- HiiFreeOpCodeHandle (EndOpCodeHandle);
-
- return EFI_SUCCESS;
-}
-
-/**
- Initialize the iSCSI configuration form.
-
- @param[in] DriverBindingHandle The iSCSI driverbinding handle.
-
- @retval EFI_SUCCESS The iSCSI configuration form is initialized.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiConfigFormInit (
- VOID
- )
-{
- EFI_STATUS Status;
- EFI_HII_DATABASE_PROTOCOL *HiiDatabase;
- ISCSI_FORM_CALLBACK_INFO *CallbackInfo;
-
- Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **)&HiiDatabase);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- CallbackInfo = (ISCSI_FORM_CALLBACK_INFO *) AllocateZeroPool (sizeof (ISCSI_FORM_CALLBACK_INFO));
- if (CallbackInfo == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- CallbackInfo->Signature = ISCSI_FORM_CALLBACK_INFO_SIGNATURE;
- CallbackInfo->HiiDatabase = HiiDatabase;
- CallbackInfo->Current = NULL;
-
- CallbackInfo->ConfigAccess.ExtractConfig = IScsiFormExtractConfig;
- CallbackInfo->ConfigAccess.RouteConfig = IScsiFormRouteConfig;
- CallbackInfo->ConfigAccess.Callback = IScsiFormCallback;
-
- Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL, (VOID **)&CallbackInfo->ConfigRouting);
- if (EFI_ERROR (Status)) {
- FreePool(CallbackInfo);
- return Status;
- }
-
- //
- // Install Device Path Protocol and Config Access protocol to driver handle
- //
- Status = gBS->InstallMultipleProtocolInterfaces (
- &CallbackInfo->DriverHandle,
- &gEfiDevicePathProtocolGuid,
- &mIScsiHiiVendorDevicePath,
- &gEfiHiiConfigAccessProtocolGuid,
- &CallbackInfo->ConfigAccess,
- NULL
- );
- ASSERT_EFI_ERROR (Status);
-
- //
- // Publish our HII data
- //
- CallbackInfo->RegisteredHandle = HiiAddPackages (
- &gIp4IScsiConfigGuid,
- CallbackInfo->DriverHandle,
- IScsi4DxeStrings,
- IScsiConfigDxeBin,
- NULL
- );
- if (CallbackInfo->RegisteredHandle == NULL) {
- FreePool(CallbackInfo);
- return EFI_OUT_OF_RESOURCES;
- }
-
- mCallbackInfo = CallbackInfo;
-
- return Status;
-}
-
-/**
- Unload the iSCSI configuration form, this includes: delete all the iSCSI
- device configuration entries, uninstall the form callback protocol and
- free the resources used.
-
- @param[in] DriverBindingHandle The iSCSI driverbinding handle.
-
- @retval EFI_SUCCESS The iSCSI configuration form is unloaded.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-**/
-EFI_STATUS
-IScsiConfigFormUnload (
- IN EFI_HANDLE DriverBindingHandle
- )
-{
- ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry;
-
- while (!IsListEmpty (&mIScsiConfigFormList)) {
- //
- // Uninstall the device forms as the iSCSI driver instance may fail to
- // control the controller but still install the device configuration form.
- // In such case, upon driver unloading, the driver instance's driverbinding.
- // stop () won't be called, so we have to take this chance here to uninstall
- // the device form.
- //
- ConfigFormEntry = NET_LIST_USER_STRUCT (mIScsiConfigFormList.ForwardLink, ISCSI_CONFIG_FORM_ENTRY, Link);
- IScsiConfigUpdateForm (DriverBindingHandle, ConfigFormEntry->Controller, FALSE);
- }
-
- //
- // Remove HII package list
- //
- mCallbackInfo->HiiDatabase->RemovePackageList (
- mCallbackInfo->HiiDatabase,
- mCallbackInfo->RegisteredHandle
- );
-
- //
- // Uninstall EFI_HII_CONFIG_ACCESS_PROTOCOL
- //
- gBS->UninstallMultipleProtocolInterfaces (
- mCallbackInfo->DriverHandle,
- &gEfiDevicePathProtocolGuid,
- &mIScsiHiiVendorDevicePath,
- &gEfiHiiConfigAccessProtocolGuid,
- &mCallbackInfo->ConfigAccess,
- NULL
- );
- FreePool (mCallbackInfo);
-
- return EFI_SUCCESS;
-}
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c
deleted file mode 100644
index 6a876c8b69dd..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c
+++ /dev/null
@@ -1,472 +0,0 @@
-/** @file
- iSCSI DHCP related configuration routines.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#include "IScsiImpl.h"
-
-/**
- Extract the Root Path option and get the required target information.
-
- @param[in] RootPath The RootPath.
- @param[in] Length Length of the RootPath option payload.
- @param[in, out] ConfigNvData The iSCSI session configuration data read from nonvolatile device.
-
- @retval EFI_SUCCESS All required information is extracted from the RootPath option.
- @retval EFI_NOT_FOUND The RootPath is not an iSCSI RootPath.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_INVALID_PARAMETER The RootPath is mal-formatted.
-**/
-EFI_STATUS
-IScsiDhcpExtractRootPath (
- IN CHAR8 *RootPath,
- IN UINT8 Length,
- IN OUT ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData
- )
-{
- EFI_STATUS Status;
- UINT8 IScsiRootPathIdLen;
- CHAR8 *TmpStr;
- ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX];
- ISCSI_ROOT_PATH_FIELD *Field;
- UINT32 FieldIndex;
- UINT8 Index;
-
- //
- // "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname>
- //
- IScsiRootPathIdLen = (UINT8) AsciiStrLen (ISCSI_ROOT_PATH_ID);
-
- if ((Length <= IScsiRootPathIdLen) || (CompareMem (RootPath, ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) {
- return EFI_NOT_FOUND;
- }
- //
- // Skip the iSCSI RootPath ID "iscsi:".
- //
- RootPath += IScsiRootPathIdLen;
- Length = (UINT8) (Length - IScsiRootPathIdLen);
-
- TmpStr = (CHAR8 *) AllocatePool (Length + 1);
- if (TmpStr == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- CopyMem (TmpStr, RootPath, Length);
- TmpStr[Length] = '\0';
-
- Index = 0;
- FieldIndex = RP_FIELD_IDX_SERVERNAME;
- ZeroMem (&Fields[0], sizeof (Fields));
-
- //
- // Extract the fields in the Root Path option string.
- //
- for (FieldIndex = RP_FIELD_IDX_SERVERNAME; (FieldIndex < RP_FIELD_IDX_MAX) && (Index < Length); FieldIndex++) {
- if (TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) {
- Fields[FieldIndex].Str = &TmpStr[Index];
- }
-
- while ((TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) && (Index < Length)) {
- Index++;
- }
-
- if (TmpStr[Index] == ISCSI_ROOT_PATH_FIELD_DELIMITER) {
- if (FieldIndex != RP_FIELD_IDX_TARGETNAME) {
- TmpStr[Index] = '\0';
- Index++;
- }
-
- if (Fields[FieldIndex].Str != NULL) {
- Fields[FieldIndex].Len = (UINT8) AsciiStrLen (Fields[FieldIndex].Str);
- }
- }
- }
-
- if (FieldIndex != RP_FIELD_IDX_MAX) {
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
-
- if ((Fields[RP_FIELD_IDX_SERVERNAME].Str == NULL) ||
- (Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) ||
- (Fields[RP_FIELD_IDX_PROTOCOL].Len > 1)
- ) {
-
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
- //
- // Get the IP address of the target.
- //
- Field = &Fields[RP_FIELD_IDX_SERVERNAME];
- Status = IScsiAsciiStrToIp (Field->Str, &ConfigNvData->TargetIp);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
- //
- // Check the protocol type.
- //
- Field = &Fields[RP_FIELD_IDX_PROTOCOL];
- if ((Field->Str != NULL) && ((*(Field->Str) - '0') != EFI_IP_PROTO_TCP)) {
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
- //
- // Get the port of the iSCSI target.
- //
- Field = &Fields[RP_FIELD_IDX_PORT];
- if (Field->Str != NULL) {
- ConfigNvData->TargetPort = (UINT16) AsciiStrDecimalToUintn (Field->Str);
- } else {
- ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT;
- }
- //
- // Get the LUN.
- //
- Field = &Fields[RP_FIELD_IDX_LUN];
- if (Field->Str != NULL) {
- Status = IScsiAsciiStrToLun (Field->Str, ConfigNvData->BootLun);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
- } else {
- ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun));
- }
- //
- // Get the target iSCSI Name.
- //
- Field = &Fields[RP_FIELD_IDX_TARGETNAME];
-
- if (AsciiStrLen (Field->Str) > ISCSI_NAME_MAX_SIZE - 1) {
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
- //
- // Validate the iSCSI name.
- //
- Status = IScsiNormalizeName (Field->Str, AsciiStrLen (Field->Str));
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- AsciiStrCpyS (ConfigNvData->TargetName, ISCSI_NAME_MAX_SIZE, Field->Str);
-
-ON_EXIT:
-
- FreePool (TmpStr);
-
- return Status;
-}
-
-/**
- The callback function registerd to the DHCP4 instance which is used to select
- the qualified DHCP OFFER.
-
- @param[in] This The DHCP4 protocol.
- @param[in] Context The context set when configuring the DHCP4 protocol.
- @param[in] CurrentState The current state of the DHCP4 protocol.
- @param[in] Dhcp4Event The event occurs in the current state.
- @param[in] Packet The DHCP packet that is to be sent or already received.
- @param[out] NewPacket The packet used to replace the above Packet.
-
- @retval EFI_SUCCESS Either the DHCP OFFER is qualified or we're not intereseted
- in the Dhcp4Event.
- @retval EFI_NOT_READY The DHCP OFFER packet doesn't match our requirements.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiDhcpSelectOffer (
- IN EFI_DHCP4_PROTOCOL * This,
- IN VOID *Context,
- IN EFI_DHCP4_STATE CurrentState,
- IN EFI_DHCP4_EVENT Dhcp4Event,
- IN EFI_DHCP4_PACKET * Packet, OPTIONAL
- OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL
- )
-{
- EFI_STATUS Status;
- UINT32 OptionCount;
- EFI_DHCP4_PACKET_OPTION **OptionList;
- UINT32 Index;
-
- if ((Dhcp4Event != Dhcp4RcvdOffer) && (Dhcp4Event != Dhcp4SelectOffer)) {
- return EFI_SUCCESS;
- }
-
- OptionCount = 0;
-
- Status = This->Parse (This, Packet, &OptionCount, NULL);
- if (Status != EFI_BUFFER_TOO_SMALL) {
- return EFI_NOT_READY;
- }
-
- OptionList = AllocatePool (OptionCount * sizeof (EFI_DHCP4_PACKET_OPTION *));
- if (OptionList == NULL) {
- return EFI_NOT_READY;
- }
-
- Status = This->Parse (This, Packet, &OptionCount, OptionList);
- if (EFI_ERROR (Status)) {
- FreePool (OptionList);
- return EFI_NOT_READY;
- }
-
- for (Index = 0; Index < OptionCount; Index++) {
- if (OptionList[Index]->OpCode != DHCP4_TAG_ROOTPATH) {
- continue;
- }
-
- Status = IScsiDhcpExtractRootPath (
- (CHAR8 *) &OptionList[Index]->Data[0],
- OptionList[Index]->Length,
- (ISCSI_SESSION_CONFIG_NVDATA *) Context
- );
-
- break;
- }
-
- if (Index == OptionCount) {
- Status = EFI_NOT_READY;
- }
-
- FreePool (OptionList);
-
- return Status;
-}
-
-/**
- Parse the DHCP ACK to get the address configuration and DNS information.
-
- @param[in] Dhcp4 The DHCP4 protocol.
- @param[in, out] ConfigData The session configuration data.
-
- @retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
- @retval EFI_NO_MAPPING DHCP failed to acquire address and other information.
- @retval EFI_INVALID_PARAMETER The DHCP ACK's DNS option is mal-formatted.
- @retval EFI_DEVICE_ERROR Other errors as indicated.
-**/
-EFI_STATUS
-IScsiParseDhcpAck (
- IN EFI_DHCP4_PROTOCOL *Dhcp4,
- IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData
- )
-{
- EFI_STATUS Status;
- EFI_DHCP4_MODE_DATA Dhcp4ModeData;
- UINT32 OptionCount;
- EFI_DHCP4_PACKET_OPTION **OptionList;
- UINT32 Index;
-
- Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4ModeData);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- if (Dhcp4ModeData.State != Dhcp4Bound) {
- return EFI_NO_MAPPING;
- }
-
- CopyMem (&ConfigData->NvData.LocalIp, &Dhcp4ModeData.ClientAddress, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&ConfigData->NvData.SubnetMask, &Dhcp4ModeData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&ConfigData->NvData.Gateway, &Dhcp4ModeData.RouterAddress, sizeof (EFI_IPv4_ADDRESS));
-
- OptionCount = 0;
- OptionList = NULL;
-
- Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, &OptionCount, OptionList);
- if (Status != EFI_BUFFER_TOO_SMALL) {
- return EFI_DEVICE_ERROR;
- }
-
- OptionList = AllocatePool (OptionCount * sizeof (EFI_DHCP4_PACKET_OPTION *));
- if (OptionList == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, &OptionCount, OptionList);
- if (EFI_ERROR (Status)) {
- FreePool (OptionList);
- return EFI_DEVICE_ERROR;
- }
-
- for (Index = 0; Index < OptionCount; Index++) {
- //
- // Get DNS server addresses and DHCP server address from this offer.
- //
- if (OptionList[Index]->OpCode == DHCP4_TAG_DNS_SERVER) {
-
- if (((OptionList[Index]->Length & 0x3) != 0) || (OptionList[Index]->Length == 0)) {
- Status = EFI_INVALID_PARAMETER;
- break;
- }
- //
- // Primary DNS server address.
- //
- CopyMem (&ConfigData->PrimaryDns, &OptionList[Index]->Data[0], sizeof (EFI_IPv4_ADDRESS));
-
- if (OptionList[Index]->Length > 4) {
- //
- // Secondary DNS server address
- //
- CopyMem (&ConfigData->SecondaryDns, &OptionList[Index]->Data[4], sizeof (EFI_IPv4_ADDRESS));
- }
- } else if (OptionList[Index]->OpCode == DHCP4_TAG_SERVER_ID) {
- if (OptionList[Index]->Length != 4) {
- Status = EFI_INVALID_PARAMETER;
- break;
- }
-
- CopyMem (&ConfigData->DhcpServer, &OptionList[Index]->Data[0], sizeof (EFI_IPv4_ADDRESS));
- }
- }
-
- FreePool (OptionList);
-
- return Status;
-}
-
-/**
- Parse the DHCP ACK to get the address configuration and DNS information.
-
- @param[in] Image The handle of the driver image.
- @param[in] Controller The handle of the controller;
- @param[in, out] ConfigData The session configuration data.
-
- @retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_NO_MEDIA There was a media error.
- @retval Others Other errors as indicated.
-
-**/
-EFI_STATUS
-IScsiDoDhcp (
- IN EFI_HANDLE Image,
- IN EFI_HANDLE Controller,
- IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData
- )
-{
- EFI_HANDLE Dhcp4Handle;
- EFI_DHCP4_PROTOCOL *Dhcp4;
- EFI_STATUS Status;
- EFI_DHCP4_PACKET_OPTION *ParaList;
- EFI_DHCP4_CONFIG_DATA Dhcp4ConfigData;
- EFI_STATUS MediaStatus;
- UINT8 *Data;
-
- Dhcp4Handle = NULL;
- Dhcp4 = NULL;
- ParaList = NULL;
-
- //
- // Check media status before do DHCP
- //
- MediaStatus = EFI_SUCCESS;
- NetLibDetectMediaWaitTimeout (Controller, ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME, &MediaStatus);
- if (MediaStatus != EFI_SUCCESS) {
- return EFI_NO_MEDIA;
- }
-
- //
- // Create a DHCP4 child instance and get the protocol.
- //
- Status = NetLibCreateServiceChild (
- Controller,
- Image,
- &gEfiDhcp4ServiceBindingProtocolGuid,
- &Dhcp4Handle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Status = gBS->OpenProtocol (
- Dhcp4Handle,
- &gEfiDhcp4ProtocolGuid,
- (VOID **)&Dhcp4,
- Image,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- ParaList = AllocatePool (sizeof (EFI_DHCP4_PACKET_OPTION) + 3);
- if (ParaList == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
- //
- // Ask the server to reply with Netmask, Router, DNS and RootPath options.
- //
- ParaList->OpCode = DHCP4_TAG_PARA_LIST;
- ParaList->Length = (UINT8) (ConfigData->NvData.TargetInfoFromDhcp ? 4 : 3);
- Data = &ParaList->Data[0];
- Data[0] = DHCP4_TAG_NETMASK;
- Data[1] = DHCP4_TAG_ROUTER;
- Data[2] = DHCP4_TAG_DNS_SERVER;
- Data[3] = DHCP4_TAG_ROOTPATH;
-
- ZeroMem (&Dhcp4ConfigData, sizeof (EFI_DHCP4_CONFIG_DATA));
- Dhcp4ConfigData.OptionCount = 1;
- Dhcp4ConfigData.OptionList = &ParaList;
-
- if (ConfigData->NvData.TargetInfoFromDhcp) {
- //
- // Use callback to select an offer which contains target information.
- //
- Dhcp4ConfigData.Dhcp4Callback = IScsiDhcpSelectOffer;
- Dhcp4ConfigData.CallbackContext = &ConfigData->NvData;
- }
-
- Status = Dhcp4->Configure (Dhcp4, &Dhcp4ConfigData);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- Status = Dhcp4->Start (Dhcp4, NULL);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
- //
- // Parse the ACK to get required information.
- //
- Status = IScsiParseDhcpAck (Dhcp4, ConfigData);
-
-ON_EXIT:
-
- if (ParaList != NULL) {
- FreePool (ParaList);
- }
-
- if (Dhcp4 != NULL) {
- Dhcp4->Stop (Dhcp4);
- Dhcp4->Configure (Dhcp4, NULL);
-
- gBS->CloseProtocol (
- Dhcp4Handle,
- &gEfiDhcp4ProtocolGuid,
- Image,
- Controller
- );
- }
-
- NetLibDestroyServiceChild (
- Controller,
- Image,
- &gEfiDhcp4ServiceBindingProtocolGuid,
- Dhcp4Handle
- );
-
- return Status;
-}
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c
deleted file mode 100644
index 730f3e506bbc..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c
+++ /dev/null
@@ -1,676 +0,0 @@
-/** @file
- The entry point of IScsi driver.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#include "IScsiImpl.h"
-
-EFI_DRIVER_BINDING_PROTOCOL gIScsiDriverBinding = {
- IScsiDriverBindingSupported,
- IScsiDriverBindingStart,
- IScsiDriverBindingStop,
- 0xa,
- NULL,
- NULL
-};
-
-/**
- Tests to see if this driver supports the RemainingDevicePath.
-
- @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. This
- parameter is ignored by device drivers, and is optional for bus
- drivers. For bus drivers, if this parameter is not NULL, then
- the bus driver must determine if the bus controller specified
- by ControllerHandle and the child controller specified
- by RemainingDevicePath are both supported by this
- bus driver.
-
- @retval EFI_SUCCESS The RemainingDevicePath is supported or NULL.
- @retval EFI_UNSUPPORTED The device specified by ControllerHandle and
- RemainingDevicePath is not supported by the driver specified by This.
-**/
-EFI_STATUS
-IScsiIsDevicePathSupported (
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
- )
-{
- EFI_DEVICE_PATH_PROTOCOL *CurrentDevicePath;
-
- CurrentDevicePath = RemainingDevicePath;
- if (CurrentDevicePath != NULL) {
- while (!IsDevicePathEnd (CurrentDevicePath)) {
- if ((CurrentDevicePath->Type == MESSAGING_DEVICE_PATH) && (CurrentDevicePath->SubType == MSG_ISCSI_DP)) {
- return EFI_SUCCESS;
- }
-
- CurrentDevicePath = NextDevicePathNode (CurrentDevicePath);
- }
-
- return EFI_UNSUPPORTED;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- 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[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
- @param[in] 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[in] 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 acces.
- Currently not implemented.
- @retval EFI_UNSUPPORTED The device specified by ControllerHandle and
- RemainingDevicePath is not supported by the driver specified by This.
-**/
-EFI_STATUS
-EFIAPI
-IScsiDriverBindingSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
- )
-{
- EFI_STATUS Status;
-
- Status = gBS->OpenProtocol (
- ControllerHandle,
- &gEfiCallerIdGuid,
- NULL,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_TEST_PROTOCOL
- );
- if (!EFI_ERROR (Status)) {
- return EFI_ALREADY_STARTED;
- }
-
- Status = gBS->OpenProtocol (
- ControllerHandle,
- &gEfiTcp4ServiceBindingProtocolGuid,
- NULL,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_TEST_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- return EFI_UNSUPPORTED;
- }
-
- Status = IScsiIsDevicePathSupported (RemainingDevicePath);
- if (EFI_ERROR (Status)) {
- return EFI_UNSUPPORTED;
- }
-
- if (IScsiDhcpIsConfigured (ControllerHandle)) {
- Status = gBS->OpenProtocol (
- ControllerHandle,
- &gEfiDhcp4ServiceBindingProtocolGuid,
- NULL,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_TEST_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- return EFI_UNSUPPORTED;
- }
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- 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[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
- @param[in] 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[in] 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_DEVICE_ERROR The device could not be started due to a device error.
- Currently not implemented.
- @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
- @retval Others The driver failded to start the device.
-**/
-EFI_STATUS
-EFIAPI
-IScsiDriverBindingStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
- )
-{
- EFI_STATUS Status;
- ISCSI_DRIVER_DATA *Private;
- VOID *Interface;
-
- Private = IScsiCreateDriverData (This->DriverBindingHandle, ControllerHandle);
- if (Private == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- //
- // Create a underlayer child instance, but not need to configure it. Just open ChildHandle
- // via BY_DRIVER. That is, establishing the relationship between ControllerHandle and ChildHandle.
- // Therefore, when DisconnectController(), especially VLAN virtual controller handle,
- // IScsiDriverBindingStop() will be called.
- //
- Status = NetLibCreateServiceChild (
- ControllerHandle,
- This->DriverBindingHandle,
- &gEfiTcp4ServiceBindingProtocolGuid,
- &Private->ChildHandle
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = gBS->OpenProtocol (
- Private->ChildHandle,
- &gEfiTcp4ProtocolGuid,
- &Interface,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- //
- // Always install private protocol no matter what happens later. We need to
- // keep the relationship between ControllerHandle and ChildHandle.
- //
- Status = gBS->InstallProtocolInterface (
- &ControllerHandle,
- &gEfiCallerIdGuid,
- EFI_NATIVE_INTERFACE,
- &Private->IScsiIdentifier
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- //
- // Try to add a port configuration page for this controller.
- //
- IScsiConfigUpdateForm (This->DriverBindingHandle, ControllerHandle, TRUE);
-
- //
- // Get the iSCSI configuration data of this controller.
- //
- Status = IScsiGetConfigData (Private);
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
- //
- // Try to login and create an iSCSI session according to the configuration.
- //
- Status = IScsiSessionLogin (Private);
- if (Status == EFI_MEDIA_CHANGED) {
- //
- // The specified target is not available and the redirection information is
- // got, login the session again with the updated target address.
- //
- Status = IScsiSessionLogin (Private);
- }
-
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
- //
- // Duplicate the Session's tcp connection device path. The source port field
- // will be set to zero as one iSCSI session is comprised of several iSCSI
- // connections.
- //
- Private->DevicePath = IScsiGetTcpConnDevicePath (Private);
- if (Private->DevicePath == NULL) {
- goto ON_ERROR;
- }
- //
- // Install the updated device path onto the ExtScsiPassThruHandle.
- //
- Status = gBS->InstallProtocolInterface (
- &Private->ExtScsiPassThruHandle,
- &gEfiDevicePathProtocolGuid,
- EFI_NATIVE_INTERFACE,
- Private->DevicePath
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- //
- // ISCSI children should share the default Tcp child, just open the default Tcp child via BY_CHILD_CONTROLLER.
- //
- Status = gBS->OpenProtocol (
- Private->ChildHandle, /// Default Tcp child
- &gEfiTcp4ProtocolGuid,
- &Interface,
- This->DriverBindingHandle,
- Private->ExtScsiPassThruHandle,
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
- );
- if (EFI_ERROR (Status)) {
- gBS->UninstallMultipleProtocolInterfaces (
- Private->ExtScsiPassThruHandle,
- &gEfiExtScsiPassThruProtocolGuid,
- &Private->IScsiExtScsiPassThru,
- &gEfiDevicePathProtocolGuid,
- Private->DevicePath,
- NULL
- );
-
- goto ON_ERROR;
- }
-
- //
- // Update/Publish the iSCSI Boot Firmware Table.
- //
- IScsiPublishIbft ();
-
- return EFI_SUCCESS;
-
-ON_ERROR:
-
- IScsiSessionAbort (&Private->Session);
-
- return Status;
-}
-
-/**
- Stop this driver on ControllerHandle.
-
- Release the control of this controller and remove the IScsi functions. 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[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
- @param[in] 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[in] NumberOfChildren The number of child device handles in ChildHandleBuffer.Not used.
- @param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL
- if NumberOfChildren is 0.Not used.
-
- @retval EFI_SUCCESS The device was stopped.
- @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error.
- @retval EFI_INVALID_PARAMETER Child handle is NULL.
- @retval EFI_ACCESS_DENIED The protocol could not be removed from the Handle
- because its interfaces are being used.
-
-**/
-EFI_STATUS
-EFIAPI
-IScsiDriverBindingStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
- )
-{
- EFI_HANDLE IScsiController;
- EFI_STATUS Status;
- ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
- ISCSI_DRIVER_DATA *Private;
- EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru;
- ISCSI_CONNECTION *Conn;
-
- if (NumberOfChildren != 0) {
- //
- // We should have only one child.
- //
- Status = gBS->OpenProtocol (
- ChildHandleBuffer[0],
- &gEfiExtScsiPassThruProtocolGuid,
- (VOID **) &PassThru,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- return EFI_DEVICE_ERROR;
- }
-
- Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru);
- Conn = NET_LIST_HEAD (&Private->Session.Conns, ISCSI_CONNECTION, Link);
-
- //
- // Previously the TCP4 protocol is opened BY_CHILD_CONTROLLER. Just close
- // the protocol here but not uninstall the device path protocol and
- // EXT SCSI PASS THRU protocol installed on ExtScsiPassThruHandle.
- //
- gBS->CloseProtocol (
- Private->ChildHandle,
- &gEfiTcp4ProtocolGuid,
- Private->Image,
- Private->ExtScsiPassThruHandle
- );
-
- gBS->CloseProtocol (
- Conn->Tcp4Io.Handle,
- &gEfiTcp4ProtocolGuid,
- Private->Image,
- Private->ExtScsiPassThruHandle
- );
-
- return EFI_SUCCESS;
- }
- //
- // Get the handle of the controller we are controling.
- //
- IScsiController = NetLibGetNicHandle (ControllerHandle, &gEfiTcp4ProtocolGuid);
-
- Status = gBS->OpenProtocol (
- IScsiController,
- &gEfiCallerIdGuid,
- (VOID **)&IScsiIdentifier,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- return EFI_DEVICE_ERROR;
- }
-
- Private = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
-
- if (Private->ChildHandle != NULL) {
- Status = gBS->CloseProtocol (
- Private->ChildHandle,
- &gEfiTcp4ProtocolGuid,
- This->DriverBindingHandle,
- IScsiController
- );
-
- ASSERT (!EFI_ERROR (Status));
-
- Status = NetLibDestroyServiceChild (
- IScsiController,
- This->DriverBindingHandle,
- &gEfiTcp4ServiceBindingProtocolGuid,
- Private->ChildHandle
- );
- ASSERT (!EFI_ERROR (Status));
- }
-
- IScsiConfigUpdateForm (This->DriverBindingHandle, IScsiController, FALSE);
-
- //
- // Uninstall the private protocol.
- //
- gBS->UninstallProtocolInterface (
- IScsiController,
- &gEfiCallerIdGuid,
- &Private->IScsiIdentifier
- );
-
- //
- // Update the iSCSI Boot Firware Table.
- //
- IScsiPublishIbft ();
-
- IScsiSessionAbort (&Private->Session);
- Status = IScsiCleanDriverData (Private);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Unloads an image(the iSCSI driver).
-
- @param[in] ImageHandle Handle that identifies the image to be unloaded.
-
- @retval EFI_SUCCESS The image has been unloaded.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-EfiIScsiUnload (
- IN EFI_HANDLE ImageHandle
- )
-{
- EFI_STATUS Status;
- UINTN DeviceHandleCount;
- EFI_HANDLE *DeviceHandleBuffer;
- UINTN Index;
- EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
- EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
-
- //
- // Try to disonnect the driver from the devices it's controlling.
- //
- Status = gBS->LocateHandleBuffer (
- AllHandles,
- NULL,
- NULL,
- &DeviceHandleCount,
- &DeviceHandleBuffer
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- for (Index = 0; Index < DeviceHandleCount; Index++) {
- Status = IScsiTestManagedDevice (
- DeviceHandleBuffer[Index],
- gIScsiDriverBinding.DriverBindingHandle,
- &gEfiTcp4ProtocolGuid
- );
- if (EFI_ERROR (Status)) {
- continue;
- }
- Status = gBS->DisconnectController (
- DeviceHandleBuffer[Index],
- gIScsiDriverBinding.DriverBindingHandle,
- NULL
- );
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
- }
-
- //
- // Unload the iSCSI configuration form.
- //
- Status = IScsiConfigFormUnload (gIScsiDriverBinding.DriverBindingHandle);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- //
- // Uninstall the ComponentName and ComponentName2 protocol from iSCSI4 driver binding handle
- // if it has been installed.
- //
- Status = gBS->HandleProtocol (
- gIScsiDriverBinding.DriverBindingHandle,
- &gEfiComponentNameProtocolGuid,
- (VOID **) &ComponentName
- );
- if (!EFI_ERROR (Status)) {
- Status = gBS->UninstallMultipleProtocolInterfaces (
- gIScsiDriverBinding.DriverBindingHandle,
- &gEfiComponentNameProtocolGuid,
- ComponentName,
- NULL
- );
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
- }
-
- Status = gBS->HandleProtocol (
- gIScsiDriverBinding.DriverBindingHandle,
- &gEfiComponentName2ProtocolGuid,
- (VOID **) &ComponentName2
- );
- if (!EFI_ERROR (Status)) {
- gBS->UninstallMultipleProtocolInterfaces (
- gIScsiDriverBinding.DriverBindingHandle,
- &gEfiComponentName2ProtocolGuid,
- ComponentName2,
- NULL
- );
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
- }
-
- Status = gBS->UninstallMultipleProtocolInterfaces (
- ImageHandle,
- &gEfiDriverBindingProtocolGuid,
- &gIScsiDriverBinding,
- &gEfiIScsiInitiatorNameProtocolGuid,
- &gIScsiInitiatorName,
- NULL
- );
-ON_EXIT:
-
- if (DeviceHandleBuffer != NULL) {
- FreePool (DeviceHandleBuffer);
- }
-
- return Status;
-}
-
-/**
- This is the declaration of an EFI image entry point. This entry point is
- the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
- both device drivers and bus drivers. It initialize the global variables and
- publish the driver binding protocol.
-
- @param[in] ImageHandle The firmware allocated handle for the UEFI image.
- @param[in] SystemTable A pointer to the EFI System Table.
-
- @retval EFI_SUCCESS The operation completed successfully.
- @retval EFI_ACCESS_DENIED EFI_ISCSI_INITIATOR_NAME_PROTOCOL was installed unexpectedly.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiDriverEntryPoint (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-{
- EFI_STATUS Status;
- EFI_ISCSI_INITIATOR_NAME_PROTOCOL *IScsiInitiatorName;
-
- //
- // There should be only one EFI_ISCSI_INITIATOR_NAME_PROTOCOL.
- //
- Status = gBS->LocateProtocol (
- &gEfiIScsiInitiatorNameProtocolGuid,
- NULL,
- (VOID**) &IScsiInitiatorName
- );
-
- if (!EFI_ERROR (Status)) {
- return EFI_ACCESS_DENIED;
- }
-
- //
- // Initialize the EFI Driver Library
- //
- Status = EfiLibInstallDriverBindingComponentName2 (
- ImageHandle,
- SystemTable,
- &gIScsiDriverBinding,
- ImageHandle,
- &gIScsiComponentName,
- &gIScsiComponentName2
- );
-
- if (!EFI_ERROR (Status)) {
- //
- // Install the iSCSI Initiator Name Protocol.
- //
- Status = gBS->InstallProtocolInterface (
- &ImageHandle,
- &gEfiIScsiInitiatorNameProtocolGuid,
- EFI_NATIVE_INTERFACE,
- &gIScsiInitiatorName
- );
- if (EFI_ERROR (Status)) {
- gBS->UninstallMultipleProtocolInterfaces (
- ImageHandle,
- &gEfiDriverBindingProtocolGuid,
- &gIScsiDriverBinding,
- &gEfiComponentName2ProtocolGuid,
- &gIScsiComponentName2,
- &gEfiComponentNameProtocolGuid,
- &gIScsiComponentName,
- NULL
- );
- return Status;
- }
-
- //
- // Initialize the configuration form of iSCSI.
- //
- Status = IScsiConfigFormInit ();
- if (EFI_ERROR (Status)) {
- gBS->UninstallMultipleProtocolInterfaces (
- ImageHandle,
- &gEfiDriverBindingProtocolGuid,
- &gIScsiDriverBinding,
- &gEfiComponentName2ProtocolGuid,
- &gIScsiComponentName2,
- &gEfiComponentNameProtocolGuid,
- &gIScsiComponentName,
- &gEfiIScsiInitiatorNameProtocolGuid,
- &gIScsiInitiatorName,
- NULL
- );
- }
- }
- return Status;
-}
-
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c
deleted file mode 100644
index db2d6d19366e..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c
+++ /dev/null
@@ -1,412 +0,0 @@
-/** @file
- The IScsi's EFI_EXT_SCSI_PASS_THRU_PROTOCOL driver.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#include "IScsiImpl.h"
-
-/**
- Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI channel. This function
- supports both blocking I/O and nonblocking I/O. The blocking I/O functionality is required, and the
- nonblocking I/O functionality is optional.
-
- @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
- @param[in] Target The Target is an array of size TARGET_MAX_BYTES and it represents
- the id of the SCSI device to send the SCSI Request Packet. Each
- transport driver may chose to utilize a subset of this size to suit the needs
- of transport target representation. For example, a Fibre Channel driver
- may use only 8 bytes (WWN) to represent an FC target.
- @param[in] Lun The LUN of the SCSI device to send the SCSI Request Packet.
- @param[in, out] Packet A pointer to the SCSI Request Packet to send to the SCSI device
- specified by Target and Lun.
- @param[in] Event If nonblocking I/O is not supported then Event is ignored, and blocking
- I/O is performed. If Event is NULL, then blocking I/O is performed. If
- Event is not NULL and non blocking I/O is supported, then
- nonblocking I/O is performed, and Event will be signaled when the
- SCSI Request Packet completes.
-
- @retval EFI_SUCCESS The SCSI Request Packet was sent by the host. For bi-directional
- commands, InTransferLength bytes were transferred from
- InDataBuffer. For write and bi-directional commands,
- OutTransferLength bytes were transferred by
- OutDataBuffer.
- @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was not executed. The number of bytes that
- could be transferred is returned in InTransferLength. For write
- and bi-directional commands, OutTransferLength bytes were
- transferred by OutDataBuffer. Currently not implemeted.
- @retval EFI_NOT_READY The SCSI Request Packet could not be sent because there are too many
- SCSI Request Packets already queued. The caller may retry again later.
- @retval EFI_DEVICE_ERROR A device error occurred while attempting to send the SCSI Request
- Packet.
- @retval EFI_INVALID_PARAMETER Target, Lun, or the contents of ScsiRequestPacket are invalid.
- @retval EFI_UNSUPPORTED The command described by the SCSI Request Packet is not supported
- by the host adapter. This includes the case of Bi-directional SCSI
- commands not supported by the implementation. The SCSI Request
- Packet was not sent, so no additional status information is available.
- Currently not implemeted.
- @retval EFI_TIMEOUT A timeout occurred while waiting for the SCSI Request Packet to execute.
-**/
-EFI_STATUS
-EFIAPI
-IScsiExtScsiPassThruFunction (
- IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
- IN UINT8 *Target,
- IN UINT64 Lun,
- IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
- IN EFI_EVENT Event OPTIONAL
- )
-{
- ISCSI_DRIVER_DATA *Private;
- ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
- EFI_STATUS Status;
-
- Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
- ConfigNvData = &Private->Session.ConfigData.NvData;
-
- if (Target[0] != 0 || (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if ((Packet == NULL) || (Packet->Cdb == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet);
- if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_READY)) {
- //
- // Try to reinstate the session and re-execute the Scsi command.
- //
- if (EFI_ERROR (IScsiSessionReinstatement (Private))) {
- return EFI_DEVICE_ERROR;
- }
-
- Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet);
- }
-
- return Status;
-}
-
-/**
- Used to retrieve the list of legal Target IDs and LUNs for SCSI devices on a SCSI channel. These
- can either be the list SCSI devices that are actually present on the SCSI channel, or the list of legal
- Target Ids and LUNs for the SCSI channel. Regardless, the caller of this function must probe the
- Target ID and LUN returned to see if a SCSI device is actually present at that location on the SCSI
- channel.
-
- @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
- @param[in, out] Target On input, a pointer to the Target ID (an array of size
- TARGET_MAX_BYTES) of a SCSI device present on the SCSI channel.
- On output, a pointer to the Target ID (an array of
- TARGET_MAX_BYTES) of the next SCSI device present on a SCSI
- channel. An input value of 0xF(all bytes in the array are 0xF) in the
- Target array retrieves the Target ID of the first SCSI device present on a
- SCSI channel.
- @param[in, out] Lun On input, a pointer to the LUN of a SCSI device present on the SCSI
- channel. On output, a pointer to the LUN of the next SCSI device present
- on a SCSI channel.
-
- @retval EFI_SUCCESS The Target ID and LUN of the next SCSI device on the SCSI
- channel was returned in Target and Lun.
- @retval EFI_INVALID_PARAMETER Target array is not all 0xF, and Target and Lun were
- not returned on a previous call to GetNextTargetLun().
- @retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI channel.
-**/
-EFI_STATUS
-EFIAPI
-IScsiExtScsiPassThruGetNextTargetLun (
- IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
- IN OUT UINT8 **Target,
- IN OUT UINT64 *Lun
- )
-{
- ISCSI_DRIVER_DATA *Private;
- ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
- UINT8 TargetId[TARGET_MAX_BYTES];
-
- Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
- ConfigNvData = &Private->Session.ConfigData.NvData;
-
- if ((*Target)[0] == 0 && (CompareMem (Lun, ConfigNvData->BootLun, sizeof (UINT64)) == 0)) {
- //
- // Only one <Target, Lun> pair per iSCSI Driver instance.
- //
- return EFI_NOT_FOUND;
- }
-
- SetMem (TargetId, TARGET_MAX_BYTES, 0xFF);
- if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) {
- (*Target)[0] = 0;
- CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64));
-
- return EFI_SUCCESS;
- }
-
- return EFI_INVALID_PARAMETER;
-}
-
-/**
- Used to allocate and build a device path node for a SCSI device on a SCSI channel.
-
- @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
- @param[in] Target The Target is an array of size TARGET_MAX_BYTES and it specifies the
- Target ID of the SCSI device for which a device path node is to be
- allocated and built. Transport drivers may chose to utilize a subset of
- this size to suit the representation of targets. For example, a Fibre
- Channel driver may use only 8 bytes (WWN) in the array to represent a
- FC target.
- @param[in] Lun The LUN of the SCSI device for which a device path node is to be
- allocated and built.
- @param[in, out] DevicePath A pointer to a single device path node that describes the SCSI device
- specified by Target and Lun. This function is responsible for
- allocating the buffer DevicePath with the boot service
- AllocatePool(). It is the caller's responsibility to free
- DevicePath when the caller is finished with DevicePath.
-
- @retval EFI_SUCCESS The device path node that describes the SCSI device specified by
- Target and Lun was allocated and returned in
- DevicePath.
- @retval EFI_INVALID_PARAMETER DevicePath is NULL.
- @retval EFI_NOT_FOUND The SCSI devices specified by Target and Lun does not exist
- on the SCSI channel.
- @retval EFI_OUT_OF_RESOURCES There are not enough resources to allocate DevicePath.
-
-**/
-EFI_STATUS
-EFIAPI
-IScsiExtScsiPassThruBuildDevicePath (
- IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
- IN UINT8 *Target,
- IN UINT64 Lun,
- IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
- )
-{
- ISCSI_DRIVER_DATA *Private;
- ISCSI_SESSION *Session;
- ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
- ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig;
- EFI_DEV_PATH *Node;
- UINTN DevPathNodeLen;
-
- if (DevicePath == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (Target[0] != 0) {
- return EFI_NOT_FOUND;
- }
-
- Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
- Session = &Private->Session;
- ConfigNvData = &Session->ConfigData.NvData;
- AuthConfig = &Session->AuthData.AuthConfig;
-
- if (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0) {
- return EFI_NOT_FOUND;
- }
-
- DevPathNodeLen = sizeof (ISCSI_DEVICE_PATH) + AsciiStrLen (ConfigNvData->TargetName) + 1;
- Node = AllocatePool (DevPathNodeLen);
- if (Node == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Node->DevPath.Type = MESSAGING_DEVICE_PATH;
- Node->DevPath.SubType = MSG_ISCSI_DP;
- SetDevicePathNodeLength (&Node->DevPath, (UINT16)DevPathNodeLen);
-
- //
- // 0 for TCP, others are reserved.
- //
- Node->Iscsi.NetworkProtocol = 0;
-
- Node->Iscsi.LoginOption = 0;
- switch (AuthConfig->CHAPType) {
- case ISCSI_CHAP_NONE:
- Node->Iscsi.LoginOption |= 0x0800;
- break;
-
- case ISCSI_CHAP_UNI:
- Node->Iscsi.LoginOption |= 0x1000;
- break;
-
- default:
- break;
- }
-
- CopyMem (&Node->Iscsi.Lun, ConfigNvData->BootLun, sizeof (UINT64));
- Node->Iscsi.TargetPortalGroupTag = Session->TargetPortalGroupTag;
- AsciiStrCpyS ((CHAR8 *) Node + sizeof (ISCSI_DEVICE_PATH), AsciiStrLen (ConfigNvData->TargetName) + 1, ConfigNvData->TargetName);
-
- *DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Node;
-
- return EFI_SUCCESS;
-}
-
-/**
- Used to translate a device path node to a Target ID and LUN.
-
- @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
- @param[in] DevicePath A pointer to a single device path node that describes the SCSI device
- on the SCSI channel.
- @param[out] Target A pointer to the Target Array which represents the ID of a SCSI device
- on the SCSI channel.
- @param[out] Lun A pointer to the LUN of a SCSI device on the SCSI channel.
-
- @retval EFI_SUCCESS DevicePath was successfully translated to a Target ID and
- LUN, and they were returned in Target and Lun.
- @retval EFI_INVALID_PARAMETER DevicePath or Target or Lun is NULL.
- @retval EFI_NOT_FOUND A valid translation from DevicePath to a Target ID and LUN
- does not exist.Currently not implemented.
- @retval EFI_UNSUPPORTED This driver does not support the device path node type in
- DevicePath.
-**/
-EFI_STATUS
-EFIAPI
-IScsiExtScsiPassThruGetTargetLun (
- IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
- OUT UINT8 **Target,
- OUT UINT64 *Lun
- )
-{
- ISCSI_DRIVER_DATA *Private;
- ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
-
- if ((DevicePath == NULL) || (Target == NULL) || (Lun == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if ((DevicePath->Type != MESSAGING_DEVICE_PATH) ||
- (DevicePath->SubType != MSG_ISCSI_DP) ||
- (DevicePathNodeLength (DevicePath) <= sizeof (ISCSI_DEVICE_PATH))
- ) {
- return EFI_UNSUPPORTED;
- }
-
- Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
- ConfigNvData = &Private->Session.ConfigData.NvData;
-
- SetMem (*Target, TARGET_MAX_BYTES, 0xFF);
- (*Target)[0] = 0;
-
- if (AsciiStrCmp (ConfigNvData->TargetName, (CHAR8 *) DevicePath + sizeof (ISCSI_DEVICE_PATH)) != 0) {
- return EFI_UNSUPPORTED;
- }
-
- CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64));
-
- return EFI_SUCCESS;
-}
-
-/**
- Resets a SCSI channel. This operation resets all the SCSI devices connected to the SCSI channel.
- Currently not implemented.
-
- @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
-
- @retval EFI_SUCCESS The SCSI channel was reset.
- @retval EFI_DEVICE_ERROR A device error occurred while attempting to reset the SCSI channel.
- @retval EFI_TIMEOUT A timeout occurred while attempting to reset the SCSI channel.
- @retval EFI_UNSUPPORTED The SCSI channel does not support a channel reset operation.
-**/
-EFI_STATUS
-EFIAPI
-IScsiExtScsiPassThruResetChannel (
- IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This
- )
-{
- return EFI_UNSUPPORTED;
-}
-
-/**
- Resets a SCSI logical unit that is connected to a SCSI channel. Currently not implemented.
-
- @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
- @param[in] Target The Target is an array of size TARGET_MAX_BYTE and it represents the
- target port ID of the SCSI device containing the SCSI logical unit to
- reset. Transport drivers may chose to utilize a subset of this array to suit
- the representation of their targets.
- @param[in] Lun The LUN of the SCSI device to reset.
-
- @retval EFI_SUCCESS The SCSI device specified by Target and Lun was reset.
- @retval EFI_INVALID_PARAMETER Target or Lun is NULL.
- @retval EFI_TIMEOUT A timeout occurred while attempting to reset the SCSI device
- specified by Target and Lun.
- @retval EFI_UNSUPPORTED The SCSI channel does not support a target reset operation.
- @retval EFI_DEVICE_ERROR A device error occurred while attempting to reset the SCSI device
- specified by Target and Lun.
-
-**/
-EFI_STATUS
-EFIAPI
-IScsiExtScsiPassThruResetTargetLun (
- IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
- IN UINT8 *Target,
- IN UINT64 Lun
- )
-{
- return EFI_UNSUPPORTED;
-}
-
-/**
- Used to retrieve the list of legal Target IDs for SCSI devices on a SCSI channel. These can either
- be the list SCSI devices that are actually present on the SCSI channel, or the list of legal Target IDs
- for the SCSI channel. Regardless, the caller of this function must probe the Target ID returned to
- see if a SCSI device is actually present at that location on the SCSI channel.
-
- @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
- @param[in, out] Target (TARGET_MAX_BYTES) of a SCSI device present on the SCSI channel.
- On output, a pointer to the Target ID (an array of
- TARGET_MAX_BYTES) of the next SCSI device present on a SCSI
- channel. An input value of 0xF(all bytes in the array are 0xF) in the
- Target array retrieves the Target ID of the first SCSI device present on a
- SCSI channel.
-
- @retval EFI_SUCCESS The Target ID of the next SCSI device on the SCSI
- channel was returned in Target.
- @retval EFI_INVALID_PARAMETER Target or Lun is NULL.
- @retval EFI_TIMEOUT Target array is not all 0xF, and Target were not
- returned on a previous call to GetNextTarget().
- Currently not implemented.
- @retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI channel.
-**/
-EFI_STATUS
-EFIAPI
-IScsiExtScsiPassThruGetNextTarget (
- IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
- IN OUT UINT8 **Target
- )
-{
- UINT8 TargetId[TARGET_MAX_BYTES];
-
- SetMem (TargetId, TARGET_MAX_BYTES, 0xFF);
-
- if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) {
- (*Target)[0] = 0;
- return EFI_SUCCESS;
- } else if ((*Target)[0] == 0) {
- return EFI_NOT_FOUND;
- } else {
- return EFI_INVALID_PARAMETER;
- }
-}
-
-EFI_EXT_SCSI_PASS_THRU_PROTOCOL gIScsiExtScsiPassThruProtocolTemplate = {
- NULL,
- IScsiExtScsiPassThruFunction,
- IScsiExtScsiPassThruGetNextTargetLun,
- IScsiExtScsiPassThruBuildDevicePath,
- IScsiExtScsiPassThruGetTargetLun,
- IScsiExtScsiPassThruResetChannel,
- IScsiExtScsiPassThruResetTargetLun,
- IScsiExtScsiPassThruGetNextTarget
-};
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c
deleted file mode 100644
index 58c5447dcbd1..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c
+++ /dev/null
@@ -1,539 +0,0 @@
-/** @file
- Implementation for iSCSI Boot Firmware Table publication.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#include "IScsiImpl.h"
-
-BOOLEAN mIbftInstalled = FALSE;
-UINTN mTableKey;
-
-/**
- Initialize the header of the iSCSI Boot Firmware Table.
-
- @param[out] Header The header of the iSCSI Boot Firmware Table.
- @param[in] OemId The OEM ID.
- @param[in] OemTableId The OEM table ID for the iBFT.
-**/
-VOID
-IScsiInitIbfTableHeader (
- OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Header,
- IN UINT8 *OemId,
- IN UINT64 *OemTableId
- )
-{
- ZeroMem (Header, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER));
-
- Header->Signature = EFI_ACPI_3_0_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE;
- Header->Length = IBFT_HEAP_OFFSET;
- Header->Revision = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_REVISION;
- Header->Checksum = 0;
-
- CopyMem (Header->OemId, OemId, sizeof (Header->OemId));
- CopyMem (&Header->OemTableId, OemTableId, sizeof (UINT64));
-}
-
-/**
- Initialize the control section of the iSCSI Boot Firmware Table.
-
- @param[in] Table The ACPI table.
- @param[in] HandleCount The number of the handles associated with iSCSI sessions, it's
- equal to the number of iSCSI sessions.
-**/
-VOID
-IScsiInitControlSection (
- IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table,
- IN UINTN HandleCount
- )
-{
- EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control;
- UINTN NumOffset;
-
- Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1);
-
- ZeroMem (Control, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE));
-
- Control->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_ID;
- Control->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_VERSION;
- Control->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE);
-
- //
- // Each session occupies two offsets, one for the NIC section,
- // the other for the Target section.
- //
- NumOffset = 2 * HandleCount;
- if (NumOffset > 4) {
- //
- // Need expand the control section if more than 2 NIC/Target sections
- // exist.
- //
- Control->Header.Length = (UINT16) (Control->Header.Length + (NumOffset - 4) * sizeof (UINT16));
- }
-}
-
-/**
- Add one item into the heap.
-
- @param[in, out] Heap On input, the current address of the heap; On output, the address of
- the heap after the item is added.
- @param[in] Data The data to add into the heap.
- @param[in] Len Length of the Data in byte.
-**/
-VOID
-IScsiAddHeapItem (
- IN OUT UINT8 **Heap,
- IN VOID *Data,
- IN UINTN Len
- )
-{
- //
- // Add one byte for the NULL delimiter.
- //
- *Heap -= Len + 1;
-
- CopyMem (*Heap, Data, Len);
- *(*Heap + Len) = 0;
-}
-
-/**
- Fill the Initiator section of the iSCSI Boot Firmware Table.
-
- @param[in] Table The ACPI table.
- @param[in, out] Heap The heap.
- @param[in] Handle The handle associated with the iSCSI session.
-**/
-VOID
-IScsiFillInitiatorSection (
- IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table,
- IN OUT UINT8 **Heap,
- IN EFI_HANDLE Handle
- )
-{
- EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control;
- EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *Initiator;
- ISCSI_DRIVER_DATA *DriverData;
- ISCSI_SESSION *Session;
- ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
- EFI_STATUS Status;
-
- Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1);
-
- //
- // Initiator section immediately follows the control section.
- //
- Initiator = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *) ((UINT8 *) Control + IBFT_ROUNDUP (Control->Header.Length));
-
- Control->InitiatorOffset = (UINT16) ((UINTN) Initiator - (UINTN) Table);
-
- ZeroMem (Initiator, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE));
-
- Initiator->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_ID;
- Initiator->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_VERSION;
- Initiator->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE);
- Initiator->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BLOCK_VALID | EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BOOT_SELECTED;
-
- //
- // Get the identifier from the handle.
- //
- Status = gBS->HandleProtocol (Handle, &gEfiCallerIdGuid, (VOID **) &IScsiIdentifier);
- if (EFI_ERROR (Status)) {
- ASSERT (FALSE);
- return ;
- }
-
- DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
- Session = &DriverData->Session;
-
- //
- // Fill the iSCSI Initiator Name into the heap.
- //
- IScsiAddHeapItem (Heap, Session->InitiatorName, Session->InitiatorNameLength - 1);
-
- Initiator->IScsiNameLength = (UINT16) (Session->InitiatorNameLength - 1);
- Initiator->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
-}
-
-/**
- Map the v4 IP address into v6 IP address.
-
- @param[in] V4 The v4 IP address.
- @param[out] V6 The v6 IP address.
-**/
-VOID
-IScsiMapV4ToV6Addr (
- IN EFI_IPv4_ADDRESS *V4,
- OUT EFI_IPv6_ADDRESS *V6
- )
-{
- UINTN Index;
-
- ZeroMem (V6, sizeof (EFI_IPv6_ADDRESS));
-
- V6->Addr[10] = 0xff;
- V6->Addr[11] = 0xff;
-
- for (Index = 0; Index < 4; Index++) {
- V6->Addr[12 + Index] = V4->Addr[Index];
- }
-}
-
-/**
- Get the NIC's PCI location and return it according to the composited
- format defined in iSCSI Boot Firmware Table.
-
- @param[in] Controller The handle of the controller.
-
- @return UINT16 The composited representation of the NIC PCI location.
- @retval 0 Other errors as indicated.
-**/
-UINT16
-IScsiGetNICPciLocation (
- IN EFI_HANDLE Controller
- )
-{
- EFI_STATUS Status;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
- EFI_HANDLE PciIoHandle;
- EFI_PCI_IO_PROTOCOL *PciIo;
- UINTN Segment;
- UINTN Bus;
- UINTN Device;
- UINTN Function;
-
- Status = gBS->HandleProtocol (
- Controller,
- &gEfiDevicePathProtocolGuid,
- (VOID **)&DevicePath
- );
- if (EFI_ERROR (Status)) {
- return 0;
- }
-
- Status = gBS->LocateDevicePath (
- &gEfiPciIoProtocolGuid,
- &DevicePath,
- &PciIoHandle
- );
- if (EFI_ERROR (Status)) {
- return 0;
- }
-
- Status = gBS->HandleProtocol (PciIoHandle, &gEfiPciIoProtocolGuid, (VOID **)&PciIo);
- if (EFI_ERROR (Status)) {
- return 0;
- }
-
- Status = PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function);
- if (EFI_ERROR (Status)) {
- return 0;
- }
-
- return (UINT16) ((Bus << 8) | (Device << 3) | Function);
-}
-
-/**
- Fill the NIC and target sections in iSCSI Boot Firmware Table.
-
- @param[in] Table The buffer of the ACPI table.
- @param[in, out] Heap The heap buffer used to store the variable length parameters such as iSCSI name.
- @param[in] HandleCount Count The number of handles having iSCSI private protocol installed.
- @param[in] Handles The handle buffer.
-**/
-VOID
-IScsiFillNICAndTargetSections (
- IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table,
- IN OUT UINT8 **Heap,
- IN UINTN HandleCount,
- IN EFI_HANDLE *Handles
- )
-{
- EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control;
- EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *Nic;
- EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *Target;
- ISCSI_DRIVER_DATA *DriverData;
- ISCSI_SESSION_CONFIG_DATA *SessionConfigData;
- ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig;
- UINT16 *SectionOffset;
- UINTN Index;
- UINT16 Length;
- EFI_MAC_ADDRESS MacAddress;
- UINTN HwAddressSize;
- ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
- EFI_STATUS Status;
-
- //
- // Get the offset of the first Nic and Target section.
- //
- Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1);
- Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) ((UINTN) Table +
- Control->InitiatorOffset + IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE)));
- Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *) ((UINTN) Nic +
- IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));
-
- SectionOffset = &Control->NIC0Offset;
-
- for (Index = 0; Index < HandleCount; Index++) {
- Status = gBS->HandleProtocol (Handles[Index], &gEfiCallerIdGuid, (VOID **)&IScsiIdentifier);
- if (EFI_ERROR (Status)) {
- ASSERT (FALSE);
- return ;
- }
-
- DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
- SessionConfigData = &DriverData->Session.ConfigData;
- AuthConfig = &DriverData->Session.AuthData.AuthConfig;
-
- //
- // Fill the Nic section.
- //
- ZeroMem (Nic, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE));
-
- Nic->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_ID;
- Nic->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_VERSION;
- Nic->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE);
- Nic->Header.Index = (UINT8) Index;
- Nic->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BLOCK_VALID |
- EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BOOT_SELECTED |
- EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_GLOBAL;
-
- //
- // Get the subnet mask prefix length.
- //
- Nic->SubnetMaskPrefixLength = IScsiGetSubnetMaskPrefixLength (&SessionConfigData->NvData.SubnetMask);
-
- if (SessionConfigData->NvData.InitiatorInfoFromDhcp) {
- Nic->Origin = IpPrefixOriginDhcp;
- } else {
- Nic->Origin = IpPrefixOriginManual;
- }
- //
- // Map the various v4 addresses into v6 addresses.
- //
- IScsiMapV4ToV6Addr (&SessionConfigData->NvData.LocalIp, &Nic->Ip);
- IScsiMapV4ToV6Addr (&SessionConfigData->NvData.Gateway, &Nic->Gateway);
- IScsiMapV4ToV6Addr (&SessionConfigData->PrimaryDns, &Nic->PrimaryDns);
- IScsiMapV4ToV6Addr (&SessionConfigData->SecondaryDns, &Nic->SecondaryDns);
- IScsiMapV4ToV6Addr (&SessionConfigData->DhcpServer, &Nic->DhcpServer);
-
- Nic->VLanTag = NetLibGetVlanId (DriverData->Controller);
-
- Status = NetLibGetMacAddress (DriverData->Controller, &MacAddress, &HwAddressSize);
- ASSERT (Status == EFI_SUCCESS);
- CopyMem (Nic->Mac, MacAddress.Addr, sizeof (Nic->Mac));
-
- //
- // Get the PCI location of the Nic.
- //
- Nic->PciLocation = IScsiGetNICPciLocation (DriverData->Controller);
-
- *SectionOffset = (UINT16) ((UINTN) Nic - (UINTN) Table);
- SectionOffset++;
-
- //
- // Fill the Target section.
- //
- ZeroMem (Target, sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE));
-
- Target->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_ID;
- Target->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_VERSION;
- Target->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE);
- Target->Header.Index = (UINT8) Index;
- Target->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BLOCK_VALID | EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BOOT_SELECTED;
- Target->Port = SessionConfigData->NvData.TargetPort;
- Target->NicIndex = (UINT8) Index;
-
- if (AuthConfig->CHAPType == ISCSI_CHAP_NONE) {
- Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_NO_CHAP;
- } if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) {
- Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_CHAP;
- } else if (AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL) {
- Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_MUTUAL_CHAP;
- }
-
- IScsiMapV4ToV6Addr (&SessionConfigData->NvData.TargetIp, &Target->Ip);
- CopyMem (Target->BootLun, SessionConfigData->NvData.BootLun, sizeof (Target->BootLun));
-
- //
- // Target iSCSI Name, CHAP name/secret, reverse CHAP name/secret.
- //
- Length = (UINT16) AsciiStrLen (SessionConfigData->NvData.TargetName);
- IScsiAddHeapItem (Heap, SessionConfigData->NvData.TargetName, Length);
-
- Target->IScsiNameLength = Length;
- Target->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
-
- if (Target->CHAPType != EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_NO_CHAP) {
- //
- // CHAP Name
- //
- Length = (UINT16) AsciiStrLen (AuthConfig->CHAPName);
- IScsiAddHeapItem (Heap, AuthConfig->CHAPName, Length);
- Target->CHAPNameLength = Length;
- Target->CHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
-
- //
- // CHAP Secret
- //
- Length = (UINT16) AsciiStrLen (AuthConfig->CHAPSecret);
- IScsiAddHeapItem (Heap, AuthConfig->CHAPSecret, Length);
- Target->CHAPSecretLength = Length;
- Target->CHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
-
- if (Target->CHAPType == EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_MUTUAL_CHAP) {
- //
- // Reverse CHAP Name
- //
- Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPName);
- IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPName, Length);
- Target->ReverseCHAPNameLength = Length;
- Target->ReverseCHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
-
- //
- // Reverse CHAP Secret
- //
- Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPSecret);
- IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPSecret, Length);
- Target->ReverseCHAPSecretLength = Length;
- Target->ReverseCHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
- }
- }
-
- *SectionOffset = (UINT16) ((UINTN) Target - (UINTN) Table);
- SectionOffset++;
-
- //
- // Advance to the next NIC/Target pair
- //
- Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) ((UINTN) Target +
- IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE)));
- Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *) ((UINTN) Nic +
- IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));
- }
-}
-
-/**
- Publish and remove the iSCSI Boot Firmware Table according to the iSCSI
- session status.
-**/
-VOID
-IScsiPublishIbft (
- VOID
- )
-{
- EFI_STATUS Status;
- EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol;
- EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table;
- UINTN HandleCount;
- EFI_HANDLE *HandleBuffer;
- UINT8 *Heap;
- UINT8 Checksum;
- EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;
- EFI_ACPI_DESCRIPTION_HEADER *Rsdt;
- EFI_ACPI_DESCRIPTION_HEADER *Xsdt;
-
- Rsdt = NULL;
- Xsdt = NULL;
-
- Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **)&AcpiTableProtocol);
- if (EFI_ERROR (Status)) {
- return ;
- }
-
-
- //
- // Find ACPI table RSD_PTR from system table
- //
- Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **) &Rsdp);
- if (EFI_ERROR (Status)) {
- Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **) &Rsdp);
- }
-
- if (EFI_ERROR (Status) || (Rsdp == NULL)) {
- return ;
- } else if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION && Rsdp->XsdtAddress != 0) {
- Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress;
- } else if (Rsdp->RsdtAddress != 0) {
- Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress;
- }
-
- if ((Xsdt == NULL) && (Rsdt == NULL)) {
- return ;
- }
-
- if (mIbftInstalled) {
- Status = AcpiTableProtocol->UninstallAcpiTable (
- AcpiTableProtocol,
- mTableKey
- );
- if (EFI_ERROR (Status)) {
- return ;
- }
- mIbftInstalled = FALSE;
- }
-
- //
- // Get all iSCSI private protocols.
- //
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiCallerIdGuid,
- NULL,
- &HandleCount,
- &HandleBuffer
- );
- if (EFI_ERROR (Status)) {
- return ;
- }
- //
- // Allocate 4k bytes to hold the ACPI table.
- //
- Table = AllocateZeroPool (IBFT_MAX_SIZE);
- if (Table == NULL) {
- return ;
- }
-
- Heap = (UINT8 *) Table + IBFT_HEAP_OFFSET;
-
- //
- // Fill in the various section of the iSCSI Boot Firmware Table.
- //
- if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) {
- IScsiInitIbfTableHeader (Table, Xsdt->OemId, &Xsdt->OemTableId);
- } else {
- IScsiInitIbfTableHeader (Table, Rsdt->OemId, &Rsdt->OemTableId);
- }
-
- IScsiInitControlSection (Table, HandleCount);
- IScsiFillInitiatorSection (Table, &Heap, HandleBuffer[0]);
- IScsiFillNICAndTargetSections (Table, &Heap, HandleCount, HandleBuffer);
-
- Checksum = CalculateCheckSum8((UINT8 *)Table, Table->Length);
- Table->Checksum = Checksum;
-
- FreePool (HandleBuffer);
-
- //
- // Install or update the iBFT table.
- //
- Status = AcpiTableProtocol->InstallAcpiTable (
- AcpiTableProtocol,
- Table,
- Table->Length,
- &mTableKey
- );
- if (EFI_ERROR(Status)) {
- return;
- }
-
- mIbftInstalled = TRUE;
- FreePool (Table);
-}
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c
deleted file mode 100644
index e753d9eebdbe..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/** @file
- Implementation for EFI iSCSI Initiator Name Protocol.
-
-Copyright (c) 2004 - 2011, 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.
-
-**/
-
-#include "IScsiImpl.h"
-
-EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName = {
- IScsiGetInitiatorName,
- IScsiSetInitiatorName
-};
-
-/**
- Retrieves the current set value of iSCSI Initiator Name.
-
- @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
- @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer / Actual size of the
- variable data buffer.
- @param[out] Buffer Pointer to the buffer for data to be read. The data is a null-terminated UTF-8 encoded string.
- The maximum length is 223 characters, including the null-terminator.
-
- @retval EFI_SUCCESS Data was successfully retrieved into the provided buffer and the
- BufferSize was sufficient to handle the iSCSI initiator name.
- @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result.
- @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
- @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be retrieved due to a hardware error.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiGetInitiatorName (
- IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
- IN OUT UINTN *BufferSize,
- OUT VOID *Buffer
- )
-{
- EFI_STATUS Status;
-
- if ((BufferSize == NULL) || (Buffer == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- Status = gRT->GetVariable (
- ISCSI_INITIATOR_NAME_VAR_NAME,
- &gEfiIScsiInitiatorNameProtocolGuid,
- NULL,
- BufferSize,
- Buffer
- );
-
- return Status;
-}
-
-/**
- Sets the iSCSI Initiator Name.
-
- @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
- @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer.
- @param[in] Buffer Pointer to the buffer for data to be written. The data is a null-terminated UTF-8 encoded string.
- The maximum length is 223 characters, including the null-terminator.
-
- @retval EFI_SUCCESS Data was successfully stored by the protocol.
- @retval EFI_UNSUPPORTED Platform policies do not allow for data to be written.
- Currently not implemented.
- @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize exceeds the maximum allowed limit.
- @retval EFI_DEVICE_ERROR The data could not be stored due to a hardware error.
- @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the data.
- @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not adhere to RFC 3720
- (and other related protocols).
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiSetInitiatorName (
- IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
- IN OUT UINTN *BufferSize,
- IN VOID *Buffer
- )
-{
- EFI_STATUS Status;
-
- if ((BufferSize == NULL) || (Buffer == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (*BufferSize > ISCSI_NAME_MAX_SIZE) {
- *BufferSize = ISCSI_NAME_MAX_SIZE;
- return EFI_INVALID_PARAMETER;
- }
- //
- // only support iqn iSCSI names.
- //
- Status = IScsiNormalizeName ((CHAR8 *) Buffer, *BufferSize - 1);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Status = gRT->SetVariable (
- ISCSI_INITIATOR_NAME_VAR_NAME,
- &gEfiIScsiInitiatorNameProtocolGuid,
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
- *BufferSize,
- Buffer
- );
-
- return Status;
-}
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
deleted file mode 100644
index d924a8b82427..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
+++ /dev/null
@@ -1,948 +0,0 @@
-/** @file
- Miscellaneous routines for iSCSI driver.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#include "IScsiImpl.h"
-
-GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 IScsiHexString[] = "0123456789ABCDEFabcdef";
-
-/**
- Removes (trims) specified leading and trailing characters from a string.
-
- @param[in, out] Str Pointer to the null-terminated string to be trimmed. On return,
- Str will hold the trimmed string.
-
- @param[in] CharC Character will be trimmed from str.
-**/
-VOID
-StrTrim (
- IN OUT CHAR16 *Str,
- IN CHAR16 CharC
- )
-{
- CHAR16 *Pointer1;
- CHAR16 *Pointer2;
-
- if (*Str == 0) {
- return;
- }
-
- //
- // Trim off the leading and trailing characters c
- //
- for (Pointer1 = Str; (*Pointer1 != 0) && (*Pointer1 == CharC); Pointer1++) {
- ;
- }
-
- Pointer2 = Str;
- if (Pointer2 == Pointer1) {
- while (*Pointer1 != 0) {
- Pointer2++;
- Pointer1++;
- }
- } else {
- while (*Pointer1 != 0) {
- *Pointer2 = *Pointer1;
- Pointer1++;
- Pointer2++;
- }
- *Pointer2 = 0;
- }
-
-
- for (Pointer1 = Str + StrLen(Str) - 1; Pointer1 >= Str && *Pointer1 == CharC; Pointer1--) {
- ;
- }
- if (Pointer1 != Str + StrLen(Str) - 1) {
- *(Pointer1 + 1) = 0;
- }
-}
-
-/**
- Calculate the prefix length of the IPv4 subnet mask.
-
- @param[in] SubnetMask The IPv4 subnet mask.
-
- @return The prefix length of the subnet mask.
- @retval 0 Other errors as indicated.
-**/
-UINT8
-IScsiGetSubnetMaskPrefixLength (
- IN EFI_IPv4_ADDRESS *SubnetMask
- )
-{
- UINT8 Len;
- UINT32 ReverseMask;
-
- //
- // The SubnetMask is in network byte order.
- //
- ReverseMask = (SubnetMask->Addr[0] << 24) | (SubnetMask->Addr[1] << 16) | (SubnetMask->Addr[2] << 8) | (SubnetMask->Addr[3]);
-
- //
- // Reverse it.
- //
- ReverseMask = ~ReverseMask;
-
- if ((ReverseMask & (ReverseMask + 1)) != 0) {
- return 0;
- }
-
- Len = 0;
-
- while (ReverseMask != 0) {
- ReverseMask = ReverseMask >> 1;
- Len++;
- }
-
- return (UINT8) (32 - Len);
-}
-
-/**
- Convert the hexadecimal encoded LUN string into the 64-bit LUN.
-
- @param[in] Str The hexadecimal encoded LUN string.
- @param[out] Lun Storage to return the 64-bit LUN.
-
- @retval EFI_SUCCESS The 64-bit LUN is stored in Lun.
- @retval EFI_INVALID_PARAMETER The string is malformatted.
-**/
-EFI_STATUS
-IScsiAsciiStrToLun (
- IN CHAR8 *Str,
- OUT UINT8 *Lun
- )
-{
- UINTN Index, IndexValue, IndexNum, SizeStr;
- CHAR8 TemStr[2];
- UINT8 TemValue;
- UINT16 Value[4];
-
- ZeroMem (Lun, 8);
- ZeroMem (TemStr, 2);
- ZeroMem ((UINT8 *) Value, sizeof (Value));
- SizeStr = AsciiStrLen (Str);
- IndexValue = 0;
- IndexNum = 0;
-
- for (Index = 0; Index < SizeStr; Index ++) {
- TemStr[0] = Str[Index];
- TemValue = (UINT8) AsciiStrHexToUint64 (TemStr);
- if (TemValue == 0 && TemStr[0] != '0') {
- if ((TemStr[0] != '-') || (IndexNum == 0)) {
- //
- // Invalid Lun Char
- //
- return EFI_INVALID_PARAMETER;
- }
- }
-
- if ((TemValue == 0) && (TemStr[0] == '-')) {
- //
- // Next Lun value
- //
- if (++IndexValue >= 4) {
- //
- // Max 4 Lun value
- //
- return EFI_INVALID_PARAMETER;
- }
- //
- // Restart str index for the next lun value
- //
- IndexNum = 0;
- continue;
- }
-
- if (++IndexNum > 4) {
- //
- // Each Lun Str can't exceed size 4, because it will be as UINT16 value
- //
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Combine UINT16 value
- //
- Value[IndexValue] = (UINT16) ((Value[IndexValue] << 4) + TemValue);
- }
-
- for (Index = 0; Index <= IndexValue; Index ++) {
- *((UINT16 *) &Lun[Index * 2]) = HTONS (Value[Index]);
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Convert the 64-bit LUN into the hexadecimal encoded LUN string.
-
- @param[in] Lun The 64-bit LUN.
- @param[out] Str The storage to return the hexadecimal encoded LUN string.
-**/
-VOID
-IScsiLunToUnicodeStr (
- IN UINT8 *Lun,
- OUT CHAR16 *Str
- )
-{
- UINTN Index;
- CHAR16 *TempStr;
-
- TempStr = Str;
-
- for (Index = 0; Index < 4; Index++) {
-
- if ((Lun[2 * Index] | Lun[2 * Index + 1]) == 0) {
- CopyMem(TempStr, L"0-", sizeof (L"0-"));
- } else {
- TempStr[0] = (CHAR16) IScsiHexString[Lun[2 * Index] >> 4];
- TempStr[1] = (CHAR16) IScsiHexString[Lun[2 * Index] & 0x0F];
- TempStr[2] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] >> 4];
- TempStr[3] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] & 0x0F];
- TempStr[4] = L'-';
- TempStr[5] = 0;
-
- StrTrim (TempStr, L'0');
- }
-
- TempStr += StrLen (TempStr);
- }
-
- ASSERT (StrLen(Str) >= 1);
- Str[StrLen (Str) - 1] = 0;
-
- for (Index = StrLen (Str) - 1; Index > 1; Index = Index - 2) {
- if ((Str[Index] == L'0') && (Str[Index - 1] == L'-')) {
- Str[Index - 1] = 0;
- } else {
- break;
- }
- }
-}
-
-/**
- Convert the ASCII string into a UNICODE string.
-
- @param[in] Source The ASCII string.
- @param[out] Destination The storage to return the UNICODE string.
-
- @return CHAR16 * Pointer to the UNICODE string.
-**/
-CHAR16 *
-IScsiAsciiStrToUnicodeStr (
- IN CHAR8 *Source,
- OUT CHAR16 *Destination
- )
-{
- ASSERT (Destination != NULL);
- ASSERT (Source != NULL);
-
- while (*Source != '\0') {
- *(Destination++) = (CHAR16) *(Source++);
- }
-
- *Destination = '\0';
-
- return Destination;
-}
-
-/**
- Convert the UNICODE string into an ASCII string.
-
- @param[in] Source The UNICODE string.
- @param[out] Destination The storage to return the ASCII string.
-
- @return CHAR8 * Pointer to the ASCII string.
-**/
-CHAR8 *
-IScsiUnicodeStrToAsciiStr (
- IN CHAR16 *Source,
- OUT CHAR8 *Destination
- )
-{
- ASSERT (Destination != NULL);
- ASSERT (Source != NULL);
-
- while (*Source != '\0') {
- //
- // If any Unicode characters in Source contain
- // non-zero value in the upper 8 bits, then ASSERT().
- //
- ASSERT (*Source < 0x100);
- *(Destination++) = (CHAR8) *(Source++);
- }
-
- *Destination = '\0';
-
- return Destination;
-}
-
-/**
- Convert the decimal dotted IPv4 address into the binary IPv4 address.
-
- @param[in] Str The UNICODE string.
- @param[out] Ip The storage to return the ASCII string.
-
- @retval EFI_SUCCESS The binary IP address is returned in Ip.
- @retval EFI_INVALID_PARAMETER The IP string is malformatted.
-**/
-EFI_STATUS
-IScsiAsciiStrToIp (
- IN CHAR8 *Str,
- OUT EFI_IPv4_ADDRESS *Ip
- )
-{
- UINTN Index;
- UINTN Number;
-
- Index = 0;
-
- while (*Str != 0) {
-
- if (Index > 3) {
- return EFI_INVALID_PARAMETER;
- }
-
- Number = 0;
- while (NET_IS_DIGIT (*Str)) {
- Number = Number * 10 + (*Str - '0');
- Str++;
- }
-
- if (Number > 0xFF) {
- return EFI_INVALID_PARAMETER;
- }
-
- Ip->Addr[Index] = (UINT8) Number;
-
- if ((*Str != '\0') && (*Str != '.')) {
- //
- // The current character should be either the NULL terminator or
- // the dot delimiter.
- //
- return EFI_INVALID_PARAMETER;
- }
-
- if (*Str == '.') {
- //
- // Skip the delimiter.
- //
- Str++;
- }
-
- Index++;
- }
-
- if (Index != 4) {
- return EFI_INVALID_PARAMETER;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Convert the mac address into a hexadecimal encoded "-" seperated string.
-
- @param[in] Mac The mac address.
- @param[in] Len Length in bytes of the mac address.
- @param[in] VlanId VLAN ID of the network device.
- @param[out] Str The storage to return the mac string.
-**/
-VOID
-IScsiMacAddrToStr (
- IN EFI_MAC_ADDRESS *Mac,
- IN UINT32 Len,
- IN UINT16 VlanId,
- OUT CHAR16 *Str
- )
-{
- UINT32 Index;
- CHAR16 *String;
-
- for (Index = 0; Index < Len; Index++) {
- Str[3 * Index] = (CHAR16) IScsiHexString[(Mac->Addr[Index] >> 4) & 0x0F];
- Str[3 * Index + 1] = (CHAR16) IScsiHexString[Mac->Addr[Index] & 0x0F];
- Str[3 * Index + 2] = L'-';
- }
-
- String = &Str[3 * Index - 1] ;
- if (VlanId != 0) {
- String += UnicodeSPrint (String, 6 * sizeof (CHAR16), L"\\%04x", (UINTN) VlanId);
- }
-
- *String = L'\0';
-}
-
-/**
- Convert the binary encoded buffer into a hexadecimal encoded string.
-
- @param[in] BinBuffer The buffer containing the binary data.
- @param[in] BinLength Length of the binary buffer.
- @param[in, out] HexStr Pointer to the string.
- @param[in, out] HexLength The length of the string.
-
- @retval EFI_SUCCESS The binary data is converted to the hexadecimal string
- and the length of the string is updated.
- @retval EFI_BUFFER_TOO_SMALL The string is too small.
- @retval EFI_INVALID_PARAMETER The IP string is malformatted.
-**/
-EFI_STATUS
-IScsiBinToHex (
- IN UINT8 *BinBuffer,
- IN UINT32 BinLength,
- IN OUT CHAR8 *HexStr,
- IN OUT UINT32 *HexLength
- )
-{
- UINTN Index;
-
- if ((HexStr == NULL) || (BinBuffer == NULL) || (BinLength == 0)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (((*HexLength) - 3) < BinLength * 2) {
- *HexLength = BinLength * 2 + 3;
- return EFI_BUFFER_TOO_SMALL;
- }
-
- *HexLength = BinLength * 2 + 3;
- //
- // Prefix for Hex String
- //
- HexStr[0] = '0';
- HexStr[1] = 'x';
-
- for (Index = 0; Index < BinLength; Index++) {
- HexStr[Index * 2 + 2] = IScsiHexString[BinBuffer[Index] >> 4];
- HexStr[Index * 2 + 3] = IScsiHexString[BinBuffer[Index] & 0x0F];
- }
-
- HexStr[Index * 2 + 2] = '\0';
-
- return EFI_SUCCESS;
-}
-
-/**
- Convert the hexadecimal string into a binary encoded buffer.
-
- @param[in, out] BinBuffer The binary buffer.
- @param[in, out] BinLength Length of the binary buffer.
- @param[in] HexStr The hexadecimal string.
-
- @retval EFI_SUCCESS The hexadecimal string is converted into a binary
- encoded buffer.
- @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the converted data.
-**/
-EFI_STATUS
-IScsiHexToBin (
- IN OUT UINT8 *BinBuffer,
- IN OUT UINT32 *BinLength,
- IN CHAR8 *HexStr
- )
-{
- UINTN Index;
- UINTN Length;
- UINT8 Digit;
- CHAR8 TemStr[2];
-
- ZeroMem (TemStr, sizeof (TemStr));
-
- //
- // Find out how many hex characters the string has.
- //
- if ((HexStr[0] == '0') && ((HexStr[1] == 'x') || (HexStr[1] == 'X'))) {
- HexStr += 2;
- }
-
- Length = AsciiStrLen (HexStr);
-
- for (Index = 0; Index < Length; Index ++) {
- TemStr[0] = HexStr[Index];
- Digit = (UINT8) AsciiStrHexToUint64 (TemStr);
- if (Digit == 0 && TemStr[0] != '0') {
- //
- // Invalid Lun Char
- //
- break;
- }
- if ((Index & 1) == 0) {
- BinBuffer [Index/2] = Digit;
- } else {
- BinBuffer [Index/2] = (UINT8) ((BinBuffer [Index/2] << 4) + Digit);
- }
- }
-
- *BinLength = (UINT32) ((Index + 1)/2);
-
- return EFI_SUCCESS;
-}
-
-/**
- Generate random numbers.
-
- @param[in, out] Rand The buffer to contain random numbers.
- @param[in] RandLength The length of the Rand buffer.
-**/
-VOID
-IScsiGenRandom (
- IN OUT UINT8 *Rand,
- IN UINTN RandLength
- )
-{
- UINT32 Random;
-
- while (RandLength > 0) {
- Random = NET_RANDOM (NetRandomInitSeed ());
- *Rand++ = (UINT8) (Random);
- RandLength--;
- }
-}
-
-/**
- Create the iSCSI driver data..
-
- @param[in] Image The handle of the driver image.
- @param[in] Controller The handle of the controller.
-
- @return The iSCSI driver data created.
- @retval NULL Other errors as indicated.
-**/
-ISCSI_DRIVER_DATA *
-IScsiCreateDriverData (
- IN EFI_HANDLE Image,
- IN EFI_HANDLE Controller
- )
-{
- ISCSI_DRIVER_DATA *Private;
- EFI_STATUS Status;
-
- Private = AllocateZeroPool (sizeof (ISCSI_DRIVER_DATA));
- if (Private == NULL) {
- return NULL;
- }
-
- Private->Signature = ISCSI_DRIVER_DATA_SIGNATURE;
- Private->Image = Image;
- Private->Controller = Controller;
-
- //
- // Create an event to be signal when the BS to RT transition is triggerd so
- // as to abort the iSCSI session.
- //
- Status = gBS->CreateEventEx (
- EVT_NOTIFY_SIGNAL,
- TPL_CALLBACK,
- IScsiOnExitBootService,
- Private,
- &gEfiEventExitBootServicesGuid,
- &Private->ExitBootServiceEvent
- );
- if (EFI_ERROR (Status)) {
- FreePool (Private);
- return NULL;
- }
-
- CopyMem(&Private->IScsiExtScsiPassThru, &gIScsiExtScsiPassThruProtocolTemplate, sizeof(EFI_EXT_SCSI_PASS_THRU_PROTOCOL));
-
- //
- // 0 is designated to the TargetId, so use another value for the AdapterId.
- //
- Private->ExtScsiPassThruMode.AdapterId = 2;
- Private->ExtScsiPassThruMode.Attributes = EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL | EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL;
- Private->ExtScsiPassThruMode.IoAlign = 4;
- Private->IScsiExtScsiPassThru.Mode = &Private->ExtScsiPassThruMode;
-
- //
- // Install the Ext SCSI PASS THRU protocol.
- //
- Status = gBS->InstallProtocolInterface (
- &Private->ExtScsiPassThruHandle,
- &gEfiExtScsiPassThruProtocolGuid,
- EFI_NATIVE_INTERFACE,
- &Private->IScsiExtScsiPassThru
- );
- if (EFI_ERROR (Status)) {
- gBS->CloseEvent (Private->ExitBootServiceEvent);
- FreePool (Private);
-
- return NULL;
- }
-
- IScsiSessionInit (&Private->Session, FALSE);
-
- return Private;
-}
-
-/**
- Clean the iSCSI driver data.
-
- @param[in] Private The iSCSI driver data.
-
- @retval EFI_SUCCESS The clean operation is successful.
- @retval Others Other errors as indicated.
-
-**/
-EFI_STATUS
-IScsiCleanDriverData (
- IN ISCSI_DRIVER_DATA *Private
- )
-{
- EFI_STATUS Status;
-
- Status = EFI_SUCCESS;
-
- if (Private->DevicePath != NULL) {
- Status = gBS->UninstallProtocolInterface (
- Private->ExtScsiPassThruHandle,
- &gEfiDevicePathProtocolGuid,
- Private->DevicePath
- );
- if (EFI_ERROR (Status)) {
- goto EXIT;
- }
-
- FreePool (Private->DevicePath);
- }
-
- if (Private->ExtScsiPassThruHandle != NULL) {
- Status = gBS->UninstallProtocolInterface (
- Private->ExtScsiPassThruHandle,
- &gEfiExtScsiPassThruProtocolGuid,
- &Private->IScsiExtScsiPassThru
- );
- }
-
-EXIT:
- if (Private->ExitBootServiceEvent != NULL) {
- gBS->CloseEvent (Private->ExitBootServiceEvent);
- }
-
- FreePool (Private);
- return Status;
-}
-
-/**
- Check wheather the Controller is configured to use DHCP protocol.
-
- @param[in] Controller The handle of the controller.
-
- @retval TRUE The handle of the controller need the Dhcp protocol.
- @retval FALSE The handle of the controller does not need the Dhcp protocol.
-
-**/
-BOOLEAN
-IScsiDhcpIsConfigured (
- IN EFI_HANDLE Controller
- )
-{
- EFI_STATUS Status;
- EFI_MAC_ADDRESS MacAddress;
- UINTN HwAddressSize;
- UINT16 VlanId;
- CHAR16 MacString[70];
- ISCSI_SESSION_CONFIG_NVDATA *ConfigDataTmp;
-
- //
- // Get the mac string, it's the name of various variable
- //
- Status = NetLibGetMacAddress (Controller, &MacAddress, &HwAddressSize);
- if (EFI_ERROR (Status)) {
- return FALSE;
- }
- VlanId = NetLibGetVlanId (Controller);
- IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString);
-
- //
- // Get the normal configuration.
- //
- Status = GetVariable2 (
- MacString,
- &gEfiIScsiInitiatorNameProtocolGuid,
- (VOID**)&ConfigDataTmp,
- NULL
- );
- if (ConfigDataTmp == NULL || EFI_ERROR (Status)) {
- return FALSE;
- }
-
- if (ConfigDataTmp->Enabled && ConfigDataTmp->InitiatorInfoFromDhcp) {
- FreePool (ConfigDataTmp);
- return TRUE;
- }
-
- FreePool (ConfigDataTmp);
- return FALSE;
-}
-
-/**
- Get the various configuration data of this iSCSI instance.
-
- @param[in] Private The iSCSI driver data.
-
- @retval EFI_SUCCESS The configuration of this instance is got.
- @retval EFI_ABORTED The operation was aborted.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiGetConfigData (
- IN ISCSI_DRIVER_DATA *Private
- )
-{
- EFI_STATUS Status;
- ISCSI_SESSION *Session;
- UINTN BufferSize;
- EFI_MAC_ADDRESS MacAddress;
- UINTN HwAddressSize;
- UINT16 VlanId;
- CHAR16 MacString[70];
-
- //
- // get the iSCSI Initiator Name
- //
- Session = &Private->Session;
- Session->InitiatorNameLength = ISCSI_NAME_MAX_SIZE;
- Status = gIScsiInitiatorName.Get (
- &gIScsiInitiatorName,
- &Session->InitiatorNameLength,
- Session->InitiatorName
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Get the mac string, it's the name of various variable
- //
- Status = NetLibGetMacAddress (Private->Controller, &MacAddress, &HwAddressSize);
- ASSERT (Status == EFI_SUCCESS);
- VlanId = NetLibGetVlanId (Private->Controller);
- IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString);
-
- //
- // Get the normal configuration.
- //
- BufferSize = sizeof (Session->ConfigData.NvData);
- Status = gRT->GetVariable (
- MacString,
- &gEfiIScsiInitiatorNameProtocolGuid,
- NULL,
- &BufferSize,
- &Session->ConfigData.NvData
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- if (!Session->ConfigData.NvData.Enabled) {
- return EFI_ABORTED;
- }
- //
- // Get the CHAP Auth information.
- //
- BufferSize = sizeof (Session->AuthData.AuthConfig);
- Status = gRT->GetVariable (
- MacString,
- &gIScsiCHAPAuthInfoGuid,
- NULL,
- &BufferSize,
- &Session->AuthData.AuthConfig
- );
-
- if (!EFI_ERROR (Status) && Session->ConfigData.NvData.InitiatorInfoFromDhcp) {
- //
- // Start dhcp.
- //
- Status = IScsiDoDhcp (Private->Image, Private->Controller, &Session->ConfigData);
- }
-
- return Status;
-}
-
-/**
- Get the device path of the iSCSI tcp connection and update it.
-
- @param[in] Private The iSCSI driver data.
-
- @return The updated device path.
- @retval NULL Other errors as indicated.
-**/
-EFI_DEVICE_PATH_PROTOCOL *
-IScsiGetTcpConnDevicePath (
- IN ISCSI_DRIVER_DATA *Private
- )
-{
- ISCSI_SESSION *Session;
- ISCSI_CONNECTION *Conn;
- TCP4_IO *Tcp4Io;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
- EFI_STATUS Status;
- EFI_DEV_PATH *DPathNode;
-
- Session = &Private->Session;
- if (Session->State != SESSION_STATE_LOGGED_IN) {
- return NULL;
- }
-
- Conn = NET_LIST_USER_STRUCT_S (
- Session->Conns.ForwardLink,
- ISCSI_CONNECTION,
- Link,
- ISCSI_CONNECTION_SIGNATURE
- );
- Tcp4Io = &Conn->Tcp4Io;
-
- Status = gBS->HandleProtocol (
- Tcp4Io->Handle,
- &gEfiDevicePathProtocolGuid,
- (VOID **)&DevicePath
- );
- if (EFI_ERROR (Status)) {
- return NULL;
- }
- //
- // Duplicate it.
- //
- DevicePath = DuplicateDevicePath (DevicePath);
- if (DevicePath == NULL) {
- return NULL;
- }
-
- DPathNode = (EFI_DEV_PATH *) DevicePath;
-
- while (!IsDevicePathEnd (&DPathNode->DevPath)) {
- if ((DevicePathType (&DPathNode->DevPath) == MESSAGING_DEVICE_PATH) &&
- (DevicePathSubType (&DPathNode->DevPath) == MSG_IPv4_DP)
- ) {
-
- DPathNode->Ipv4.LocalPort = 0;
- DPathNode->Ipv4.StaticIpAddress =
- (BOOLEAN) (!Session->ConfigData.NvData.InitiatorInfoFromDhcp);
-
- //
- // Add a judgement here to support previous versions of IPv4_DEVICE_PATH.
- // In previous versions of IPv4_DEVICE_PATH, GatewayIpAddress and SubnetMask
- // do not exist.
- // In new version of IPv4_DEVICE_PATH, structcure length is 27.
- //
- if (DevicePathNodeLength (&DPathNode->Ipv4) == IP4_NODE_LEN_NEW_VERSIONS) {
-
- IP4_COPY_ADDRESS (
- &DPathNode->Ipv4.GatewayIpAddress,
- &Session->ConfigData.NvData.Gateway
- );
-
- IP4_COPY_ADDRESS (
- &DPathNode->Ipv4.SubnetMask,
- &Session->ConfigData.NvData.SubnetMask
- );
- }
-
- break;
- }
-
- DPathNode = (EFI_DEV_PATH *) NextDevicePathNode (&DPathNode->DevPath);
- }
-
- return DevicePath;
-}
-
-/**
- Abort the session when the transition from BS to RT is initiated.
-
- @param[in] Event The event signaled.
- @param[in] Context The iSCSI driver data.
-**/
-VOID
-EFIAPI
-IScsiOnExitBootService (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- ISCSI_DRIVER_DATA *Private;
-
- Private = (ISCSI_DRIVER_DATA *) Context;
-
- gBS->CloseEvent (Private->ExitBootServiceEvent);
- Private->ExitBootServiceEvent = NULL;
-
- IScsiSessionAbort (&Private->Session);
-}
-
-/**
- Tests whether a controller handle is being managed by IScsi driver.
-
- This function tests whether the driver specified by DriverBindingHandle is
- currently managing the controller specified by ControllerHandle. This test
- is performed by evaluating if the the protocol specified by ProtocolGuid is
- present on ControllerHandle and is was opened by DriverBindingHandle and Nic
- Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER.
- If ProtocolGuid is NULL, then ASSERT().
-
- @param ControllerHandle A handle for a controller to test.
- @param DriverBindingHandle Specifies the driver binding handle for the
- driver.
- @param ProtocolGuid Specifies the protocol that the driver specified
- by DriverBindingHandle opens in its Start()
- function.
-
- @retval EFI_SUCCESS ControllerHandle is managed by the driver
- specified by DriverBindingHandle.
- @retval EFI_UNSUPPORTED ControllerHandle is not managed by the driver
- specified by DriverBindingHandle.
-
-**/
-EFI_STATUS
-EFIAPI
-IScsiTestManagedDevice (
- IN EFI_HANDLE ControllerHandle,
- IN EFI_HANDLE DriverBindingHandle,
- IN EFI_GUID *ProtocolGuid
- )
-{
- EFI_STATUS Status;
- VOID *ManagedInterface;
- EFI_HANDLE NicControllerHandle;
-
- ASSERT (ProtocolGuid != NULL);
-
- NicControllerHandle = NetLibGetNicHandle (ControllerHandle, ProtocolGuid);
- if (NicControllerHandle == NULL) {
- return EFI_UNSUPPORTED;
- }
-
- Status = gBS->OpenProtocol (
- ControllerHandle,
- (EFI_GUID *) ProtocolGuid,
- &ManagedInterface,
- DriverBindingHandle,
- NicControllerHandle,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (!EFI_ERROR (Status)) {
- gBS->CloseProtocol (
- ControllerHandle,
- (EFI_GUID *) ProtocolGuid,
- DriverBindingHandle,
- NicControllerHandle
- );
- return EFI_UNSUPPORTED;
- }
-
- if (Status != EFI_ALREADY_STARTED) {
- return EFI_UNSUPPORTED;
- }
-
- return EFI_SUCCESS;
-}
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c
deleted file mode 100644
index b4a5c2d02413..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c
+++ /dev/null
@@ -1,2799 +0,0 @@
-/** @file
- The implementation of iSCSI protocol based on RFC3720.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#include "IScsiImpl.h"
-
-UINT32 mDataSegPad = 0;
-
-/**
- Attach the iSCSI connection to the iSCSI session.
-
- @param[in, out] Session The iSCSI session.
- @param[in, out] Conn The iSCSI connection.
-**/
-VOID
-IScsiAttatchConnection (
- IN OUT ISCSI_SESSION *Session,
- IN OUT ISCSI_CONNECTION *Conn
- )
-{
- InsertTailList (&Session->Conns, &Conn->Link);
- Conn->Session = Session;
- Session->NumConns++;
-}
-
-/**
- Detach the iSCSI connection from the session it belongs to.
-
- @param[in, out] Conn The iSCSI connection.
-**/
-VOID
-IScsiDetatchConnection (
- IN OUT ISCSI_CONNECTION *Conn
- )
-{
- RemoveEntryList (&Conn->Link);
- Conn->Session->NumConns--;
- Conn->Session = NULL;
-}
-
-/**
- Check the sequence number according to RFC3720.
-
- @param[in, out] ExpSN The currently expected sequence number.
- @param[in] NewSN The sequence number to check.
-
- @retval EFI_SUCCESS The check passed and the ExpSN is increased.
- @retval EFI_NOT_READY Response was sent due to a retransmission request.
- @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
-**/
-EFI_STATUS
-IScsiCheckSN (
- IN OUT UINT32 *ExpSN,
- IN UINT32 NewSN
- )
-{
- if (!ISCSI_SEQ_EQ (NewSN, *ExpSN)) {
- if (ISCSI_SEQ_LT (NewSN, *ExpSN)) {
- //
- // Duplicate
- //
- return EFI_NOT_READY;
- } else {
- return EFI_PROTOCOL_ERROR;
- }
- } else {
- //
- // Advance the ExpSN
- //
- (*ExpSN)++;
- return EFI_SUCCESS;
- }
-}
-
-/**
- Update the sequence numbers for the iSCSI command.
-
- @param[in, out] Session The iSCSI session.
- @param[in] MaxCmdSN Maximum CmdSN from the target.
- @param[in] ExpCmdSN Next expected CmdSN from the target.
-**/
-VOID
-IScsiUpdateCmdSN (
- IN OUT ISCSI_SESSION *Session,
- IN UINT32 MaxCmdSN,
- IN UINT32 ExpCmdSN
- )
-{
- if (ISCSI_SEQ_LT (MaxCmdSN, ExpCmdSN - 1)) {
- return ;
- }
-
- if (ISCSI_SEQ_GT (MaxCmdSN, Session->MaxCmdSN)) {
- Session->MaxCmdSN = MaxCmdSN;
- }
-
- if (ISCSI_SEQ_GT (ExpCmdSN, Session->ExpCmdSN)) {
- Session->ExpCmdSN = ExpCmdSN;
- }
-}
-
-/**
- This function does the iSCSI connection login.
-
- @param[in, out] Conn The iSCSI connection to login.
-
- @retval EFI_SUCCESS The iSCSI connection is logged into the iSCSI target.
- @retval EFI_TIMEOUT Timeout happened during the login procedure.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiConnLogin (
- IN OUT ISCSI_CONNECTION *Conn
- )
-{
- EFI_STATUS Status;
-
- //
- // Start the timer, wait 16 seconds to establish the TCP connection.
- //
- Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, 16 * TICKS_PER_SECOND);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // try to establish the tcp connection
- //
- Status = Tcp4IoConnect (&Conn->Tcp4Io, Conn->TimeoutEvent);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- gBS->SetTimer (Conn->TimeoutEvent, TimerCancel, 0);
- Conn->State = CONN_STATE_IN_LOGIN;
-
- //
- // connection is established, start the iSCSI Login
- //
- do {
- Status = IScsiSendLoginReq (Conn);
- if (EFI_ERROR (Status)) {
- break;
- }
-
- Status = IScsiReceiveLoginRsp (Conn);
- if (EFI_ERROR (Status)) {
- break;
- }
- } while (Conn->CurrentStage != ISCSI_FULL_FEATURE_PHASE);
-
- return Status;
-}
-
-/**
- Reset the iSCSI connection.
-
- @param[in, out] Conn The iSCSI connection to reset.
-**/
-VOID
-IScsiConnReset (
- IN OUT ISCSI_CONNECTION *Conn
- )
-{
- Tcp4IoReset (&Conn->Tcp4Io);
-}
-
-/**
- Create a TCP connection for the iSCSI session.
-
- @param[in] Private The iSCSI driver data.
- @param[in] Session Maximum CmdSN from the target.
-
- @return The newly created iSCSI connection.
-**/
-ISCSI_CONNECTION *
-IScsiCreateConnection (
- IN ISCSI_DRIVER_DATA *Private,
- IN ISCSI_SESSION *Session
- )
-{
- ISCSI_CONNECTION *Conn;
- TCP4_IO_CONFIG_DATA Tcp4IoConfig;
- EFI_STATUS Status;
-
- Conn = AllocatePool (sizeof (ISCSI_CONNECTION));
- if (Conn == NULL) {
- return NULL;
- }
-
- Conn->Signature = ISCSI_CONNECTION_SIGNATURE;
- Conn->State = CONN_STATE_FREE;
- Conn->CurrentStage = ISCSI_SECURITY_NEGOTIATION;
- Conn->NextStage = ISCSI_LOGIN_OPERATIONAL_NEGOTIATION;
- Conn->CHAPStep = ISCSI_CHAP_INITIAL;
- Conn->ExpStatSN = 0;
- Conn->PartialReqSent = FALSE;
- Conn->PartialRspRcvd = FALSE;
- Conn->Cid = Session->NextCid++;
-
- Status = gBS->CreateEvent (
- EVT_TIMER,
- TPL_CALLBACK,
- NULL,
- NULL,
- &Conn->TimeoutEvent
- );
- if (EFI_ERROR (Status)) {
- FreePool (Conn);
- return NULL;
- }
-
- NetbufQueInit (&Conn->RspQue);
-
- //
- // set the default connection-only parameters
- //
- Conn->MaxRecvDataSegmentLength = DEFAULT_MAX_RECV_DATA_SEG_LEN;
- Conn->HeaderDigest = IScsiDigestNone;
- Conn->DataDigest = IScsiDigestNone;
-
- CopyMem (&Tcp4IoConfig.LocalIp, &Session->ConfigData.NvData.LocalIp, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Tcp4IoConfig.SubnetMask, &Session->ConfigData.NvData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Tcp4IoConfig.Gateway, &Session->ConfigData.NvData.Gateway, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Tcp4IoConfig.RemoteIp, &Session->ConfigData.NvData.TargetIp, sizeof (EFI_IPv4_ADDRESS));
-
- Tcp4IoConfig.RemotePort = Session->ConfigData.NvData.TargetPort;
-
- //
- // Create the tcp4 IO for this connection
- //
- Status = Tcp4IoCreateSocket (
- Private->Image,
- Private->Controller,
- &Tcp4IoConfig,
- &Conn->Tcp4Io
- );
- if (EFI_ERROR (Status)) {
- gBS->CloseEvent (Conn->TimeoutEvent);
- FreePool (Conn);
- Conn = NULL;
- }
-
- return Conn;
-}
-
-/**
- Destroy an iSCSI connection.
-
- @param[in] Conn The connection to destroy.
-**/
-VOID
-IScsiDestroyConnection (
- IN ISCSI_CONNECTION *Conn
- )
-{
- Tcp4IoDestroySocket (&Conn->Tcp4Io);
- NetbufQueFlush (&Conn->RspQue);
- gBS->CloseEvent (Conn->TimeoutEvent);
- FreePool (Conn);
-}
-
-/**
- Login the iSCSI session.
-
- @param[in] Private The iSCSI driver data.
-
- @retval EFI_SUCCESS The iSCSI session login procedure finished.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_NO_MEDIA There was a media error.
- @retval Others Other errors as indicated.
-
-**/
-EFI_STATUS
-IScsiSessionLogin (
- IN ISCSI_DRIVER_DATA *Private
- )
-{
- EFI_STATUS Status;
- ISCSI_SESSION *Session;
- ISCSI_CONNECTION *Conn;
- EFI_TCP4_PROTOCOL *Tcp4;
- EFI_STATUS MediaStatus;
-
- Session = &Private->Session;
-
- //
- // Check media status before session login
- //
- MediaStatus = EFI_SUCCESS;
- NetLibDetectMediaWaitTimeout (Private->Controller, ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME, &MediaStatus);
- if (MediaStatus != EFI_SUCCESS) {
- return EFI_NO_MEDIA;
- }
-
- //
- // Set session identifier
- //
- CopyMem (Session->Isid, Session->ConfigData.NvData.IsId, 6);
-
- //
- // Create a connection for the session.
- //
- Conn = IScsiCreateConnection (Private, Session);
- if (Conn == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- IScsiAttatchConnection (Session, Conn);
-
- //
- // Login througth the newly created connection.
- //
- Status = IScsiConnLogin (Conn);
- if (EFI_ERROR (Status)) {
- IScsiConnReset (Conn);
- IScsiDetatchConnection (Conn);
- IScsiDestroyConnection (Conn);
- } else {
- Session->State = SESSION_STATE_LOGGED_IN;
-
- gBS->OpenProtocol (
- Conn->Tcp4Io.Handle,
- &gEfiTcp4ProtocolGuid,
- (VOID **)&Tcp4,
- Private->Image,
- Private->ExtScsiPassThruHandle,
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
- );
- }
-
- return Status;
-}
-
-/**
- Build and send the iSCSI login request to the iSCSI target according to
- the current login stage.
-
- @param[in] Conn The connection in the iSCSI login phase.
-
- @retval EFI_SUCCESS The iSCSI login request PDU is built and sent on this
- connection.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_DEVICE_ERROR Some kind of device error happened.
-**/
-EFI_STATUS
-IScsiSendLoginReq (
- IN ISCSI_CONNECTION *Conn
- )
-{
- NET_BUF *Pdu;
- EFI_STATUS Status;
-
- //
- // build the Login Request PDU
- //
- Pdu = IScsiPrepareLoginReq (Conn);
- if (Pdu == NULL) {
- return EFI_DEVICE_ERROR;
- }
- //
- // Send it to the iSCSI target.
- //
- Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu);
-
- NetbufFree (Pdu);
-
- return Status;
-}
-
-/**
- Receive and process the iSCSI login response.
-
- @param[in] Conn The connection in the iSCSI login phase.
-
- @retval EFI_SUCCESS The iSCSI login response PDU is received and processed.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiReceiveLoginRsp (
- IN ISCSI_CONNECTION *Conn
- )
-{
- EFI_STATUS Status;
- NET_BUF *Pdu;
-
- Pdu = NULL;
-
- //
- // Receive the iSCSI login response.
- //
- Status = IScsiReceivePdu (Conn, &Pdu, NULL, FALSE, FALSE, NULL);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // A Login Response is received, process it.
- //
- ASSERT (Pdu != NULL);
- Status = IScsiProcessLoginRsp (Conn, Pdu);
-
- NetbufFree (Pdu);
-
- return Status;
-}
-
-/**
- Add an iSCSI key-value pair as a string into the data segment of the Login Request PDU.
- The DataSegmentLength and the actual size of the net buffer containing this PDU will be
- updated.
-
- @param[in, out] Pdu The iSCSI PDU whose data segment the key-value pair will
- be added to.
- @param[in] Key The key name string.
- @param[in] Value The value string.
-
- @retval EFI_SUCCESS The key-valu pair is added to the PDU's datasegment and
- the correspondence length fields are updated.
- @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to add the key-value
- pair.
-**/
-EFI_STATUS
-IScsiAddKeyValuePair (
- IN OUT NET_BUF *Pdu,
- IN CHAR8 *Key,
- IN CHAR8 *Value
- )
-{
- UINT32 DataSegLen;
- UINT32 KeyLen;
- UINT32 ValueLen;
- UINT32 TotalLen;
- ISCSI_LOGIN_REQUEST *LoginReq;
- CHAR8 *Data;
-
- LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, NULL);
- if (LoginReq == NULL) {
- return EFI_PROTOCOL_ERROR;
- }
- DataSegLen = NTOH24 (LoginReq->DataSegmentLength);
-
- KeyLen = (UINT32) AsciiStrLen (Key);
- ValueLen = (UINT32) AsciiStrLen (Value);
-
- //
- // 1 byte for the key value separator '=' and 1 byte for the null
- // delimiter after the value.
- //
- TotalLen = KeyLen + 1 + ValueLen + 1;
-
- //
- // Allocate the space for the key-value pair.
- //
- Data = (CHAR8 *)NetbufAllocSpace (Pdu, TotalLen, NET_BUF_TAIL);
- if (Data == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- //
- // Add the key.
- //
- CopyMem (Data, Key, KeyLen);
- Data += KeyLen;
-
- *Data = '=';
- Data++;
-
- //
- // Add the value.
- //
- CopyMem (Data, Value, ValueLen);
- Data += ValueLen;
-
- *Data = '\0';
-
- //
- // update the DataSegmentLength
- //
- ISCSI_SET_DATASEG_LEN (LoginReq, DataSegLen + TotalLen);
-
- return EFI_SUCCESS;
-}
-
-/**
- Prepare the iSCSI login request to be sent according to the current login status.
-
- @param[in, out] Conn The connection in the iSCSI login phase.
-
- @return The pointer to the net buffer containing the iSCSI login request built.
- @retval Others Other errors as indicated.
-**/
-NET_BUF *
-IScsiPrepareLoginReq (
- IN OUT ISCSI_CONNECTION *Conn
- )
-{
- ISCSI_SESSION *Session;
- NET_BUF *Nbuf;
- ISCSI_LOGIN_REQUEST *LoginReq;
- EFI_STATUS Status;
-
- Session = Conn->Session;
-
- Nbuf = NetbufAlloc (sizeof (ISCSI_LOGIN_REQUEST) + DEFAULT_MAX_RECV_DATA_SEG_LEN);
- if (Nbuf == NULL) {
- return NULL;
- }
-
- LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufAllocSpace (Nbuf, sizeof (ISCSI_LOGIN_REQUEST), NET_BUF_TAIL);
- ASSERT (LoginReq != NULL);
- ZeroMem (LoginReq, sizeof (ISCSI_LOGIN_REQUEST));
-
- //
- // Init the login request pdu
- //
- ISCSI_SET_OPCODE (LoginReq, ISCSI_OPCODE_LOGIN_REQ, ISCSI_REQ_IMMEDIATE);
- ISCSI_SET_STAGES (LoginReq, Conn->CurrentStage, Conn->NextStage);
- LoginReq->VersionMax = ISCSI_VERSION_MAX;
- LoginReq->VersionMin = ISCSI_VERSION_MIN;
- LoginReq->Tsih = HTONS (Session->Tsih);
- LoginReq->InitiatorTaskTag = HTONL (Session->InitiatorTaskTag);
- LoginReq->Cid = HTONS (Conn->Cid);
- LoginReq->CmdSN = HTONL (Session->CmdSN);
-
- //
- // For the first Login Request on a coonection this is ExpStatSN for the
- // old connection and this field is only valid if the Login Request restarts
- // a connection.
- // For subsequent Login Requests it is used to acknowledge the Login Responses
- // with their increasing StatSN values.
- //
- LoginReq->ExpStatSN = HTONL (Conn->ExpStatSN);
- CopyMem (LoginReq->Isid, Session->Isid, sizeof (LoginReq->Isid));
-
- if (Conn->PartialRspRcvd) {
- //
- // A partial response, initiator must send an empty Login Request.
- //
- return Nbuf;
- }
-
- switch (Conn->CurrentStage) {
- case ISCSI_SECURITY_NEGOTIATION:
- Status = IScsiCHAPToSendReq (Conn, Nbuf);
- break;
-
- case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION:
- Status = IScsiFillOpParams (Conn, Nbuf);
- ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
- break;
-
- default:
- //
- // something error happens...
- //
- Status = EFI_DEVICE_ERROR;
- break;
- }
-
- if (EFI_ERROR (Status)) {
- NetbufFree (Nbuf);
- Nbuf = NULL;
- } else {
- //
- // Pad the data segment if needed.
- //
- IScsiPadSegment (Nbuf, ISCSI_GET_DATASEG_LEN (LoginReq));
- //
- // Check whether we will issue the stage transition signal?
- //
- Conn->TransitInitiated = (BOOLEAN) ISCSI_FLAG_ON (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
- }
-
- return Nbuf;
-}
-
-/**
- Process the iSCSI Login Response.
-
- @param[in, out] Conn The connection on which the iSCSI login response is received.
- @param[in, out] Pdu The iSCSI login response PDU.
-
- @retval EFI_SUCCESS The iSCSI login response PDU is processed and all check are passed.
- @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
- @retval EFI_MEDIA_CHANGED Target is redirected.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiProcessLoginRsp (
- IN OUT ISCSI_CONNECTION *Conn,
- IN OUT NET_BUF *Pdu
- )
-{
- EFI_STATUS Status;
- ISCSI_SESSION *Session;
- ISCSI_LOGIN_RESPONSE *LoginRsp;
- BOOLEAN Transit;
- BOOLEAN Continue;
- UINT8 CurrentStage;
- UINT8 NextStage;
- UINT8 *DataSeg;
- UINT32 DataSegLen;
-
- Session = Conn->Session;
-
- LoginRsp = (ISCSI_LOGIN_RESPONSE *) NetbufGetByte (Pdu, 0, NULL);
- if (LoginRsp == NULL) {
- return EFI_PROTOCOL_ERROR;
- }
- if (!ISCSI_CHECK_OPCODE (LoginRsp, ISCSI_OPCODE_LOGIN_RSP)) {
- //
- // It's not a Login Response
- //
- return EFI_PROTOCOL_ERROR;
- }
- //
- // Get the data segment if any.
- //
- DataSegLen = ISCSI_GET_DATASEG_LEN (LoginRsp);
- if (DataSegLen != 0) {
- DataSeg = NetbufGetByte (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NULL);
- } else {
- DataSeg = NULL;
- }
- //
- // Check the status class in the login response PDU.
- //
- switch (LoginRsp->StatusClass) {
- case ISCSI_LOGIN_STATUS_SUCCESS:
- //
- // Just break here, the response and the data segment will be processed later.
- //
- break;
-
- case ISCSI_LOGIN_STATUS_REDIRECTION:
- //
- // The target may be moved to a different address
- //
- if (DataSeg == NULL) {
- return EFI_PROTOCOL_ERROR;
- }
- //
- // Process the TargetAddress key-value strings in the data segment to update the
- // target address info.
- //
- Status = IScsiUpdateTargetAddress (Session, (CHAR8 *)DataSeg, DataSegLen);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Session will be restarted on this error status because the Target is
- // redirected by this Login Response.
- //
- return EFI_MEDIA_CHANGED;
-
- default:
- //
- // Initiator Error, Target Error, or any other undefined error code.
- //
- return EFI_PROTOCOL_ERROR;
- }
- //
- // The status is sucess, extract the wanted fields from the header segment.
- //
- Transit = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp, ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT);
- Continue = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp, ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE);
-
- CurrentStage = (UINT8) ISCSI_GET_CURRENT_STAGE (LoginRsp);
- NextStage = (UINT8) ISCSI_GET_NEXT_STAGE (LoginRsp);
-
- LoginRsp->InitiatorTaskTag = NTOHL (LoginRsp->InitiatorTaskTag);
-
- if ((Transit && Continue) ||
- (CurrentStage != Conn->CurrentStage) ||
- (!Conn->TransitInitiated && Transit) ||
- (Transit && (NextStage != Conn->NextStage)) ||
- (CompareMem (Session->Isid, LoginRsp->Isid, sizeof (LoginRsp->Isid)) != 0) ||
- (LoginRsp->InitiatorTaskTag != Session->InitiatorTaskTag)
- ) {
- //
- // A Login Response with the C bit set to 1 MUST have the T bit set to 0;
- // The CSG in the Login Response MUST be the same with the I-end of this connection;
- // The T bit can't be 1 if the last Login Response sent by the initiator doesn't
- // initiate the transistion;
- // The NSG MUST be the same with the I-end of this connection if Transit is required.
- // The ISID in the Login Response MUST be the same with this session.
- //
- return EFI_PROTOCOL_ERROR;
- }
-
- LoginRsp->StatSN = NTOHL (LoginRsp->StatSN);
- LoginRsp->ExpCmdSN = NTOHL (LoginRsp->ExpCmdSN);
- LoginRsp->MaxCmdSN = NTOHL (LoginRsp->MaxCmdSN);
-
- if ((Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION) && (Conn->CHAPStep == ISCSI_CHAP_INITIAL)) {
- //
- // If the Login Request is a leading Login Request, the target MUST use
- // the value presented in CmdSN as the target value for ExpCmdSN.
- //
- if ((Session->State == SESSION_STATE_FREE) && (Session->CmdSN != LoginRsp->ExpCmdSN)) {
- return EFI_PROTOCOL_ERROR;
- }
-
- //
- // It's the initial Login Response, initialize the local ExpStatSN, MaxCmdSN
- // and ExpCmdSN.
- //
- Conn->ExpStatSN = LoginRsp->StatSN + 1;
- Session->MaxCmdSN = LoginRsp->MaxCmdSN;
- Session->ExpCmdSN = LoginRsp->ExpCmdSN;
- } else {
- //
- // Check the StatSN of this PDU
- //
- Status = IScsiCheckSN (&Conn->ExpStatSN, LoginRsp->StatSN);
- if (!EFI_ERROR (Status)) {
- //
- // Update the MaxCmdSN and ExpCmdSN
- //
- IScsiUpdateCmdSN (Session, LoginRsp->MaxCmdSN, LoginRsp->ExpCmdSN);
- } else {
- return Status;
- }
- }
- //
- // Trim off the header segment.
- //
- NetbufTrim (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NET_BUF_HEAD);
-
- //
- // Queue this login response first in case it's a partial response so that
- // later when the full response list is received we can combine these scattered
- // responses' data segment and then process it.
- //
- NET_GET_REF (Pdu);
- NetbufQueAppend (&Conn->RspQue, Pdu);
-
- Conn->PartialRspRcvd = Continue;
- if (Continue) {
- //
- // It's a partial response, have to wait for another or more Request/Response
- // conversations to get the full response.
- //
- return EFI_SUCCESS;
- }
-
- switch (CurrentStage) {
- case ISCSI_SECURITY_NEGOTIATION:
- //
- // In security negotiation stage, let CHAP module handle it.
- //
- Status = IScsiCHAPOnRspReceived (Conn);
- break;
-
- case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION:
- //
- // Response received with negotiation resonse on iSCSI parameters, check them.
- //
- Status = IScsiCheckOpParams (Conn);
- break;
-
- default:
- //
- // Should never get here.
- //
- Status = EFI_PROTOCOL_ERROR;
- break;
- }
-
- if (Transit && (Status == EFI_SUCCESS)) {
- //
- // Do the state transition.
- //
- Conn->CurrentStage = Conn->NextStage;
-
- if (Conn->CurrentStage == ISCSI_LOGIN_OPERATIONAL_NEGOTIATION) {
- Conn->NextStage = ISCSI_FULL_FEATURE_PHASE;
- } else {
- //
- // CurrentStage is iSCSI Full Feature, it's the Login-Final Response,
- // get the TSIH from the Login Response.
- //
- Session->Tsih = NTOHS (LoginRsp->Tsih);
- }
- }
- //
- // Flush the response(s) received.
- //
- NetbufQueFlush (&Conn->RspQue);
-
- return Status;
-}
-
-/**
- Updated the target information according the data received in the iSCSI
- login response with an target redirection status.
-
- @param[in, out] Session The iSCSI session.
- @param[in] Data The data segment which should contain the
- TargetAddress key-value list.
- @param[in] Len Length of the data.
-
- @retval EFI_SUCCESS The target address is updated.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_NOT_FOUND The TargetAddress key is not found.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiUpdateTargetAddress (
- IN OUT ISCSI_SESSION *Session,
- IN CHAR8 *Data,
- IN UINT32 Len
- )
-{
- LIST_ENTRY *KeyValueList;
- CHAR8 *TargetAddress;
- CHAR8 *IpStr;
- EFI_STATUS Status;
- UINTN Number;
-
- KeyValueList = IScsiBuildKeyValueList (Data, Len);
- if (KeyValueList == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Status = EFI_NOT_FOUND;
-
- while (TRUE) {
- TargetAddress = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ADDRESS);
- if (TargetAddress == NULL) {
- break;
- }
-
- if (!NET_IS_DIGIT (TargetAddress[0])) {
- //
- // The domainname of the target may be presented in three formats: a DNS host name,
- // a dotted-decimal IPv4 address, or a bracketed IPv6 address. Only accept dotted
- // IPv4 address.
- //
- continue;
- }
-
- IpStr = TargetAddress;
-
- while ((*TargetAddress != 0) && (*TargetAddress != ':') && (*TargetAddress != ',')) {
- //
- // NULL, ':' or ',' ends the IPv4 string.
- //
- TargetAddress++;
- }
-
- if (*TargetAddress == ',') {
- //
- // Comma and the portal group tag MUST be ommitted if the TargetAddress is sent
- // as the result of a redirection.
- //
- continue;
- } else if (*TargetAddress == ':') {
- *TargetAddress = '\0';
-
- TargetAddress++;
-
- Number = AsciiStrDecimalToUintn (TargetAddress);
- if (Number > 0xFFFF) {
- continue;
- } else {
- Session->ConfigData.NvData.TargetPort = (UINT16) Number;
- }
- } else {
- //
- // The string only contains the IPv4 address. Use the well known port.
- //
- Session->ConfigData.NvData.TargetPort = ISCSI_WELL_KNOWN_PORT;
- }
- //
- // Update the target IP address.
- //
- Status = IScsiAsciiStrToIp (IpStr, &Session->ConfigData.NvData.TargetIp);
- if (EFI_ERROR (Status)) {
- continue;
- } else {
- break;
- }
- }
-
- IScsiFreeKeyValueList (KeyValueList);
-
- return Status;
-}
-
-/**
- The callback function to free the net buffer list.
-
- @param[in] Arg The opaque parameter.
-**/
-VOID
-EFIAPI
-IScsiFreeNbufList (
- VOID *Arg
- )
-{
- ASSERT (Arg != NULL);
-
- NetbufFreeList ((LIST_ENTRY *) Arg);
- FreePool (Arg);
-}
-
-/**
- The callback function called in NetBufFree, it does nothing.
-
- @param[in] Arg The opaque parameter.
-**/
-VOID
-EFIAPI
-IScsiNbufExtFree (
- VOID *Arg
- )
-{
-}
-
-/**
- Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI PDU header and
- an optional data segment. The two parts will be put into two blocks of buffers in the
- net buffer. The digest check will be conducted in this function if needed and the digests
- will be trimmed from the PDU buffer.
-
- @param[in] Conn The iSCSI connection to receive data from.
- @param[out] Pdu The received iSCSI pdu.
- @param[in] Context The context used to describe information on the caller provided
- buffer to receive data segment of the iSCSI pdu, it's optional.
- @param[in] HeaderDigest Whether there will be header digest received.
- @param[in] DataDigest Whether there will be data digest.
- @param[in] TimeoutEvent The timeout event, it's optional.
-
- @retval EFI_SUCCESS An iSCSI pdu is received.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiReceivePdu (
- IN ISCSI_CONNECTION *Conn,
- OUT NET_BUF **Pdu,
- IN ISCSI_IN_BUFFER_CONTEXT *Context, OPTIONAL
- IN BOOLEAN HeaderDigest,
- IN BOOLEAN DataDigest,
- IN EFI_EVENT TimeoutEvent OPTIONAL
- )
-{
- LIST_ENTRY *NbufList;
- UINT32 Len;
- NET_BUF *PduHdr;
- UINT8 *Header;
- EFI_STATUS Status;
- UINT32 PadLen;
- UINT32 InDataOffset;
- NET_FRAGMENT Fragment[2];
- UINT32 FragmentCount;
- NET_BUF *DataSeg;
- UINT32 PadAndCRC32[2];
-
- NbufList = AllocatePool (sizeof (LIST_ENTRY));
- if (NbufList == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- InitializeListHead (NbufList);
-
- //
- // The header digest will be received together with the PDU header if exists.
- //
- Len = sizeof (ISCSI_BASIC_HEADER) + (HeaderDigest ? sizeof (UINT32) : 0);
- PduHdr = NetbufAlloc (Len);
- if (PduHdr == NULL) {
- FreePool (NbufList);
- return EFI_OUT_OF_RESOURCES;
- }
-
- Header = NetbufAllocSpace (PduHdr, Len, NET_BUF_TAIL);
- ASSERT (Header != NULL);
- InsertTailList (NbufList, &PduHdr->List);
-
- //
- // First step, receive the BHS of the PDU.
- //
- Status = Tcp4IoReceive (&Conn->Tcp4Io, PduHdr, FALSE, TimeoutEvent);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- if (HeaderDigest) {
- //
- // TODO: check the header-digest.
- //
- //
- // Trim off the digest.
- //
- NetbufTrim (PduHdr, sizeof (UINT32), NET_BUF_TAIL);
- }
-
- Len = ISCSI_GET_DATASEG_LEN (Header);
- if (Len == 0) {
- //
- // No data segment.Form the pdu from a list of pdu segments.
- //
- *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
- if (*Pdu == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
- return Status;
- }
- //
- // Get the length of the padding bytes of the data segment.
- //
- PadLen = ISCSI_GET_PAD_LEN (Len);
-
- switch (ISCSI_GET_OPCODE (Header)) {
- case ISCSI_OPCODE_SCSI_DATA_IN:
- //
- // Try to use the buffer described by Context if the PDU is an
- // iSCSI SCSI data in pdu so as to reduce memory copy overhead.
- //
- InDataOffset = ISCSI_GET_BUFFER_OFFSET (Header);
- if ((Context == NULL) || ((InDataOffset + Len) > Context->InDataLen)) {
- Status = EFI_PROTOCOL_ERROR;
- goto ON_EXIT;
- }
-
- Fragment[0].Len = Len;
- Fragment[0].Bulk = Context->InData + InDataOffset;
-
- if (DataDigest || (PadLen != 0)) {
- //
- // The data segment is padded, use two fragments to receive it.
- // The first to receive the useful data. The second to receive the padding.
- //
- Fragment[1].Len = PadLen + (DataDigest ? sizeof (UINT32) : 0);
- Fragment[1].Bulk = (UINT8 *)PadAndCRC32 + (4 - PadLen);
- FragmentCount = 2;
- } else {
- FragmentCount = 1;
- }
-
- DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0, IScsiNbufExtFree, NULL);
- if (DataSeg == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
-
- break;
-
- case ISCSI_OPCODE_SCSI_RSP:
- case ISCSI_OPCODE_NOP_IN:
- case ISCSI_OPCODE_LOGIN_RSP:
- case ISCSI_OPCODE_TEXT_RSP:
- case ISCSI_OPCODE_ASYNC_MSG:
- case ISCSI_OPCODE_REJECT:
- case ISCSI_OPCODE_VENDOR_T0:
- case ISCSI_OPCODE_VENDOR_T1:
- case ISCSI_OPCODE_VENDOR_T2:
- //
- // Allocate buffer to receive the data segment.
- //
- Len += PadLen + (DataDigest ? sizeof (UINT32) : 0);
- DataSeg = NetbufAlloc (Len);
- if (DataSeg == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
-
- NetbufAllocSpace (DataSeg, Len, NET_BUF_TAIL);
- break;
-
- default:
- Status = EFI_PROTOCOL_ERROR;
- goto ON_EXIT;
- }
-
- InsertTailList (NbufList, &DataSeg->List);
-
- //
- // Receive the data segment with the data digest if any.
- //
- Status = Tcp4IoReceive (&Conn->Tcp4Io, DataSeg, FALSE, TimeoutEvent);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- if (DataDigest) {
- //
- // TODO: Check the data digest.
- //
- NetbufTrim (DataSeg, sizeof (UINT32), NET_BUF_TAIL);
- }
-
- if (PadLen != 0) {
- //
- // Trim off the padding bytes in the data segment.
- //
- NetbufTrim (DataSeg, PadLen, NET_BUF_TAIL);
- }
-
- //
- // Form the pdu from a list of pdu segments.
- //
- *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
- if (*Pdu == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- }
-
-ON_EXIT:
-
- if (EFI_ERROR (Status)) {
- //
- // Free the Nbufs in this NbufList and the NbufList itself.
- //
- IScsiFreeNbufList (NbufList);
- }
-
- return Status;
-}
-
-/**
- Check and get the result of the prameter negotiation.
-
- @param[in, out] Conn The connection in iSCSI login.
-
- @retval EFI_SUCCESS The parmeter check is passed and negotiation is finished.
- @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-**/
-EFI_STATUS
-IScsiCheckOpParams (
- IN OUT ISCSI_CONNECTION *Conn
- )
-{
- EFI_STATUS Status;
- LIST_ENTRY *KeyValueList;
- CHAR8 *Data;
- UINT32 Len;
- ISCSI_SESSION *Session;
- CHAR8 *Value;
- UINTN NumericValue;
-
- ASSERT (Conn->RspQue.BufNum != 0);
-
- Session = Conn->Session;
-
- Len = Conn->RspQue.BufSize;
- Data = AllocatePool (Len);
- if (Data == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- NetbufQueCopy (&Conn->RspQue, 0, Len, (UINT8 *) Data);
-
- Status = EFI_PROTOCOL_ERROR;
-
- //
- // Extract the Key-Value pairs into a list.
- //
- KeyValueList = IScsiBuildKeyValueList (Data, Len);
- if (KeyValueList == NULL) {
- FreePool (Data);
- return Status;
- }
- //
- // HeaderDigest
- //
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_HEADER_DIGEST);
- if (Value == NULL) {
- goto ON_ERROR;
- }
-
- if (AsciiStrCmp (Value, "CRC32") == 0) {
- if (Conn->HeaderDigest != IScsiDigestCRC32) {
- goto ON_ERROR;
- }
- } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) {
- Conn->HeaderDigest = IScsiDigestNone;
- } else {
- goto ON_ERROR;
- }
- //
- // DataDigest
- //
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_DIGEST);
- if (Value == NULL) {
- goto ON_ERROR;
- }
-
- if (AsciiStrCmp (Value, "CRC32") == 0) {
- if (Conn->DataDigest != IScsiDigestCRC32) {
- goto ON_ERROR;
- }
- } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) {
- Conn->DataDigest = IScsiDigestNone;
- } else {
- goto ON_ERROR;
- }
- //
- // ErrorRecoveryLevel, result fuction is Minimum.
- //
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_ERROR_RECOVERY_LEVEL);
- if (Value == NULL) {
- goto ON_ERROR;
- }
-
- NumericValue = AsciiStrDecimalToUintn (Value);
- if (NumericValue > 2) {
- goto ON_ERROR;
- }
-
- Session->ErrorRecoveryLevel = (UINT8) MIN (Session->ErrorRecoveryLevel, NumericValue);
-
- //
- // InitialR2T, result function is OR.
- //
- if (!Session->InitialR2T) {
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T);
- if (Value == NULL) {
- goto ON_ERROR;
- }
-
- Session->InitialR2T = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0);
- }
-
- //
- // ImmediateData, result function is AND.
- //
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_IMMEDIATE_DATA);
- if (Value == NULL) {
- goto ON_ERROR;
- }
-
- Session->ImmediateData = (BOOLEAN) (Session->ImmediateData && (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0));
-
- //
- // MaxRecvDataSegmentLength is declarative.
- //
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH);
- if (Value != NULL) {
- Conn->MaxRecvDataSegmentLength = (UINT32) AsciiStrDecimalToUintn (Value);
- }
- //
- // MaxBurstLength, result funtion is Mininum.
- //
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_BURST_LENGTH);
- if (Value == NULL) {
- goto ON_ERROR;
- }
-
- NumericValue = AsciiStrDecimalToUintn (Value);
- Session->MaxBurstLength = (UINT32) MIN (Session->MaxBurstLength, NumericValue);
-
- //
- // FirstBurstLength, result function is Minimum. Irrelevant when InitialR2T=Yes and
- // ImmediateData=No.
- // This Key/Value is negotiation type.
- //
- if (!(Session->InitialR2T && !Session->ImmediateData)) {
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_FIRST_BURST_LENGTH);
- if (Value == NULL) {
- goto ON_ERROR;
- }
-
- NumericValue = AsciiStrDecimalToUintn (Value);
- Session->FirstBurstLength = (UINT32) MIN (Session->FirstBurstLength, NumericValue);
- }
-
- //
- // MaxConnections, result function is Minimum.
- //
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_CONNECTIONS);
- if (Value == NULL) {
- goto ON_ERROR;
- }
-
- NumericValue = AsciiStrDecimalToUintn (Value);
- if ((NumericValue == 0) || (NumericValue > 65535)) {
- goto ON_ERROR;
- }
-
- Session->MaxConnections = (UINT32) MIN (Session->MaxConnections, NumericValue);
-
- //
- // DataPDUInOrder, result function is OR.
- //
- if (!Session->DataPDUInOrder) {
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_PDU_IN_ORDER);
- if (Value == NULL) {
- goto ON_ERROR;
- }
-
- Session->DataPDUInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0);
- }
-
- //
- // DataSequenceInorder, result function is OR.
- //
- if (!Session->DataSequenceInOrder) {
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER);
- if (Value == NULL) {
- goto ON_ERROR;
- }
-
- Session->DataSequenceInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0);
- }
-
- //
- // DefaultTime2Wait, result function is Maximum.
- //
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DEFAULT_TIME2WAIT);
- if (Value == NULL) {
- goto ON_ERROR;
- }
-
- NumericValue = AsciiStrDecimalToUintn (Value);
- if (NumericValue == 0) {
- Session->DefaultTime2Wait = 0;
- } else if (NumericValue > 3600) {
- goto ON_ERROR;
- } else {
- Session->DefaultTime2Wait = (UINT32) MAX (Session->DefaultTime2Wait, NumericValue);
- }
- //
- // DefaultTime2Retain, result function is Minimum.
- //
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DEFAULT_TIME2RETAIN);
- if (Value == NULL) {
- goto ON_ERROR;
- }
-
- NumericValue = AsciiStrDecimalToUintn (Value);
- if (NumericValue == 0) {
- Session->DefaultTime2Retain = 0;
- } else if (NumericValue > 3600) {
- goto ON_ERROR;
- } else {
- Session->DefaultTime2Retain = (UINT32) MIN (Session->DefaultTime2Retain, NumericValue);
- }
- //
- // MaxOutstandingR2T, result function is Minimum.
- //
- Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_OUTSTANDING_R2T);
- if (Value == NULL) {
- goto ON_ERROR;
- }
-
- NumericValue = AsciiStrDecimalToUintn (Value);
- if ((NumericValue == 0) || (NumericValue > 65535)) {
- goto ON_ERROR;
- }
-
- Session->MaxOutstandingR2T = (UINT16) MIN (Session->MaxOutstandingR2T, NumericValue);
-
- //
- // Remove declarative key-value pairs, if any.
- //
- IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_SESSION_TYPE);
- IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ALIAS);
- IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_PORTAL_GROUP_TAG);
- //
- // Remove the key-value that may not needed for result function is OR.
- //
- IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T);
- IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_PDU_IN_ORDER);
- IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER);
-
- //
- // Remove irrelevant parameter, if any.
- //
- if (Session->InitialR2T && !Session->ImmediateData) {
- IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_FIRST_BURST_LENGTH);
- }
-
- if (IsListEmpty (KeyValueList)) {
- //
- // Succeed if no more keys in the list.
- //
- Status = EFI_SUCCESS;
- }
-
-ON_ERROR:
-
- IScsiFreeKeyValueList (KeyValueList);
-
- FreePool (Data);
-
- return Status;
-}
-
-/**
- Fill the oprational prameters.
-
- @param[in] Conn The connection in iSCSI login.
- @param[in, out] Pdu The iSCSI login request PDU to fill the parameters.
-
- @retval EFI_SUCCESS The parmeters are filled into the iSCSI login request PDU.
-**/
-EFI_STATUS
-IScsiFillOpParams (
- IN ISCSI_CONNECTION *Conn,
- IN OUT NET_BUF *Pdu
- )
-{
- ISCSI_SESSION *Session;
- CHAR8 Value[256];
-
- Session = Conn->Session;
-
- AsciiSPrint (Value, sizeof (Value), "%a", (Conn->HeaderDigest == IScsiDigestCRC32) ? "None,CRC32" : "None");
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_HEADER_DIGEST, Value);
-
- AsciiSPrint (Value, sizeof (Value), "%a", (Conn->DataDigest == IScsiDigestCRC32) ? "None,CRC32" : "None");
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_DIGEST, Value);
-
- AsciiSPrint (Value, sizeof (Value), "%d", Session->ErrorRecoveryLevel);
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_ERROR_RECOVERY_LEVEL, Value);
-
- AsciiSPrint (Value, sizeof (Value), "%a", Session->InitialR2T ? "Yes" : "No");
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIAL_R2T, Value);
-
- AsciiSPrint (Value, sizeof (Value), "%a", Session->ImmediateData ? "Yes" : "No");
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_IMMEDIATE_DATA, Value);
-
- AsciiSPrint (Value, sizeof (Value), "%d", MAX_RECV_DATA_SEG_LEN_IN_FFP);
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH, Value);
-
- AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxBurstLength);
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_BURST_LENGTH, Value);
-
- AsciiSPrint (Value, sizeof (Value), "%d", Session->FirstBurstLength);
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_FIRST_BURST_LENGTH, Value);
-
- AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxConnections);
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_CONNECTIONS, Value);
-
- AsciiSPrint (Value, sizeof (Value), "%a", Session->DataPDUInOrder ? "Yes" : "No");
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_PDU_IN_ORDER, Value);
-
- AsciiSPrint (Value, sizeof (Value), "%a", Session->DataSequenceInOrder ? "Yes" : "No");
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER, Value);
-
- AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Wait);
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2WAIT, Value);
-
- AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Retain);
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2RETAIN, Value);
-
- AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxOutstandingR2T);
- IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_OUTSTANDING_R2T, Value);
-
- return EFI_SUCCESS;
-}
-
-/**
- Pad the iSCSI AHS or data segment to an integer number of 4 byte words.
-
- @param[in, out] Pdu The iSCSI pdu which contains segments to pad.
- @param[in] Len The length of the last semgnet in the PDU.
-
- @retval EFI_SUCCESS The segment is padded or no need to pad it.
- @retval EFI_OUT_OF_RESOURCES There is not enough remaining free space to add the
- padding bytes.
-**/
-EFI_STATUS
-IScsiPadSegment (
- IN OUT NET_BUF *Pdu,
- IN UINT32 Len
- )
-{
- UINT32 PadLen;
- UINT8 *Data;
-
- PadLen = ISCSI_GET_PAD_LEN (Len);
-
- if (PadLen != 0) {
- Data = NetbufAllocSpace (Pdu, PadLen, NET_BUF_TAIL);
- if (Data == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- ZeroMem (Data, PadLen);
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Build a key-value list from the data segment.
-
- @param[in] Data The data segment containing the key-value pairs.
- @param[in] Len Length of the data segment.
-
- @return The key-value list.
- @retval NULL Other errors as indicated.
-**/
-LIST_ENTRY *
-IScsiBuildKeyValueList (
- IN CHAR8 *Data,
- IN UINT32 Len
- )
-{
- LIST_ENTRY *ListHead;
- ISCSI_KEY_VALUE_PAIR *KeyValuePair;
-
- ListHead = AllocatePool (sizeof (LIST_ENTRY));
- if (ListHead == NULL) {
- return NULL;
- }
-
- InitializeListHead (ListHead);
-
- while (Len > 0) {
- KeyValuePair = AllocatePool (sizeof (ISCSI_KEY_VALUE_PAIR));
- if (KeyValuePair == NULL) {
- goto ON_ERROR;
- }
-
- InitializeListHead (&KeyValuePair->List);
-
- KeyValuePair->Key = Data;
-
- while ((Len > 0) && (*Data != '=')) {
- Len--;
- Data++;
- }
-
- if (*Data == '=') {
- *Data = '\0';
-
- Data++;
- Len--;
- } else {
- FreePool (KeyValuePair);
- goto ON_ERROR;
- }
-
- KeyValuePair->Value = Data;
-
- InsertTailList (ListHead, &KeyValuePair->List);;
-
- Data += AsciiStrLen (KeyValuePair->Value) + 1;
- Len -= (UINT32) AsciiStrLen (KeyValuePair->Value) + 1;
- }
-
- return ListHead;
-
-ON_ERROR:
-
- IScsiFreeKeyValueList (ListHead);
-
- return NULL;
-}
-
-/**
- Get the value string by the key name from the key-value list. If found,
- the key-value entry will be removed from the list.
-
- @param[in, out] KeyValueList The key-value list.
- @param[in] Key The key name to find.
-
- @return The value string.
-**/
-CHAR8 *
-IScsiGetValueByKeyFromList (
- IN OUT LIST_ENTRY *KeyValueList,
- IN CHAR8 *Key
- )
-{
- LIST_ENTRY *Entry;
- ISCSI_KEY_VALUE_PAIR *KeyValuePair;
- CHAR8 *Value;
-
- Value = NULL;
-
- NET_LIST_FOR_EACH (Entry, KeyValueList) {
- KeyValuePair = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR, List);
-
- if (AsciiStrCmp (KeyValuePair->Key, Key) == 0) {
- Value = KeyValuePair->Value;
-
- RemoveEntryList (&KeyValuePair->List);
- FreePool (KeyValuePair);
- break;
- }
- }
-
- return Value;
-}
-
-/**
- Free the key-value list.
-
- @param[in] KeyValueList The key-value list.
-**/
-VOID
-IScsiFreeKeyValueList (
- IN LIST_ENTRY *KeyValueList
- )
-{
- LIST_ENTRY *Entry;
- ISCSI_KEY_VALUE_PAIR *KeyValuePair;
-
- while (!IsListEmpty (KeyValueList)) {
- Entry = NetListRemoveHead (KeyValueList);
- KeyValuePair = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR, List);
-
- FreePool (KeyValuePair);
- }
-
- FreePool (KeyValueList);
-}
-
-/**
- Normalize the iSCSI name according to RFC.
-
- @param[in, out] Name The iSCSI name.
- @param[in] Len length of the iSCSI name.
-
- @retval EFI_SUCCESS The iSCSI name is valid and normalized.
- @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in the IQN format.
-**/
-EFI_STATUS
-IScsiNormalizeName (
- IN OUT CHAR8 *Name,
- IN UINTN Len
- )
-{
- UINTN Index;
-
- for (Index = 0; Index < Len; Index++) {
- if (NET_IS_UPPER_CASE_CHAR (Name[Index])) {
- //
- // Convert the upper-case characters to lower-case ones
- //
- Name[Index] = (CHAR8) (Name[Index] - 'A' + 'a');
- }
-
- if (!NET_IS_LOWER_CASE_CHAR (Name[Index]) &&
- !NET_IS_DIGIT (Name[Index]) &&
- (Name[Index] != '-') &&
- (Name[Index] != '.') &&
- (Name[Index] != ':')
- ) {
- //
- // ASCII dash, dot, colon lower-case characters and digit characters
- // are allowed.
- //
- return EFI_PROTOCOL_ERROR;
- }
- }
-
- if ((Len < 4) || (CompareMem (Name, "iqn.", 4) != 0)) {
- //
- // Only IQN format is accepted now.
- //
- return EFI_PROTOCOL_ERROR;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Create an iSCSI task control block.
-
- @param[in] Conn The connection on which the task control block will be created.
- @param[out] Tcb The newly created task control block.
-
- @retval EFI_SUCCESS The task control block is created.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_NOT_READY The target can not accept new commands.
-**/
-EFI_STATUS
-IScsiNewTcb (
- IN ISCSI_CONNECTION *Conn,
- OUT ISCSI_TCB **Tcb
- )
-{
- ISCSI_SESSION *Session;
- ISCSI_TCB *NewTcb;
-
- ASSERT (Tcb != NULL);
-
- Session = Conn->Session;
-
- if (ISCSI_SEQ_GT (Session->CmdSN, Session->MaxCmdSN)) {
- return EFI_NOT_READY;
- }
-
- NewTcb = AllocateZeroPool (sizeof (ISCSI_TCB));
- if (NewTcb == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- InitializeListHead (&NewTcb->Link);
-
- NewTcb->SoFarInOrder = TRUE;
- NewTcb->InitiatorTaskTag = Session->InitiatorTaskTag;
- NewTcb->CmdSN = Session->CmdSN;
- NewTcb->Conn = Conn;
-
- InsertTailList (&Session->TcbList, &NewTcb->Link);
-
- //
- // Advance the initiator task tag.
- //
- Session->InitiatorTaskTag++;
- Session->CmdSN++;
-
- *Tcb = NewTcb;
-
- return EFI_SUCCESS;
-}
-
-/**
- Delete the tcb from the connection and destroy it.
-
- @param[in] Tcb The tcb to delete.
-**/
-VOID
-IScsiDelTcb (
- IN ISCSI_TCB *Tcb
- )
-{
- RemoveEntryList (&Tcb->Link);
-
- FreePool (Tcb);
-}
-
-
-/**
- Create a data segment, pad it and calculate the CRC if needed.
-
- @param[in] Data The data to fill into the data segment.
- @param[in] Len Length of the data.
- @param[in] DataDigest Whether to calculate CRC for this data segment.
-
- @return The net buffer wrapping the data segment.
-**/
-NET_BUF *
-IScsiNewDataSegment (
- IN UINT8 *Data,
- IN UINT32 Len,
- IN BOOLEAN DataDigest
- )
-{
- NET_FRAGMENT Fragment[2];
- UINT32 FragmentCount;
- UINT32 PadLen;
- NET_BUF *DataSeg;
-
- Fragment[0].Len = Len;
- Fragment[0].Bulk = Data;
-
- PadLen = ISCSI_GET_PAD_LEN (Len);
- if (PadLen != 0) {
- Fragment[1].Len = PadLen;
- Fragment[1].Bulk = (UINT8 *) &mDataSegPad;
-
- FragmentCount = 2;
- } else {
- FragmentCount = 1;
- }
-
- DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0, IScsiNbufExtFree, NULL);
-
- return DataSeg;
-}
-
-/**
- Create a iSCSI SCSI command PDU to encapsulate the command issued
- by SCSI through the EXT SCSI PASS THRU Protocol.
-
- @param[in] Packet The EXT SCSI PASS THRU request packet containing the SCSI command.
- @param[in] Lun The LUN.
- @param[in] Tcb The tcb associated with this SCSI command.
-
- @return The created iSCSI SCSI command PDU.
- @retval NULL Other errors as indicated.
-**/
-NET_BUF *
-IScsiNewScsiCmdPdu (
- IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
- IN UINT64 Lun,
- IN ISCSI_TCB *Tcb
- )
-{
- LIST_ENTRY *NbufList;
- NET_BUF *Pdu;
- NET_BUF *PduHeader;
- NET_BUF *DataSeg;
- SCSI_COMMAND *ScsiCmd;
- UINT8 AHSLength;
- UINT32 Length;
- ISCSI_ADDITIONAL_HEADER *Header;
- ISCSI_BI_EXP_READ_DATA_LEN_AHS *BiExpReadDataLenAHS;
- ISCSI_SESSION *Session;
- UINT32 ImmediateDataLen;
-
- AHSLength = 0;
-
- if (Packet->DataDirection == DataBi) {
- //
- // Bi directional Read/Write command, the bidirectional expected
- // read data length AHS is required.
- //
- AHSLength += sizeof (ISCSI_BI_EXP_READ_DATA_LEN_AHS);
- }
-
- if (Packet->CdbLength > 16) {
- //
- // The CDB exceeds 16 bytes, an extended CDB AHS is required.
- //
- AHSLength = (UINT8) (AHSLength + (ISCSI_ROUNDUP (Packet->CdbLength - 16) + sizeof (ISCSI_ADDITIONAL_HEADER)));
- }
-
- Length = sizeof (SCSI_COMMAND) + AHSLength;
- PduHeader = NetbufAlloc (Length);
- if (PduHeader == NULL) {
- return NULL;
- }
-
- ScsiCmd = (SCSI_COMMAND *) NetbufAllocSpace (PduHeader, Length, NET_BUF_TAIL);
- if (ScsiCmd == NULL) {
- NetbufFree (PduHeader);
- return NULL;
- }
- Header = (ISCSI_ADDITIONAL_HEADER *) (ScsiCmd + 1);
-
- ZeroMem (ScsiCmd, Length);
-
- ISCSI_SET_OPCODE (ScsiCmd, ISCSI_OPCODE_SCSI_CMD, 0);
- ISCSI_SET_FLAG (ScsiCmd, ISCSI_TASK_ATTR_SIMPLE);
-
- //
- // Set the READ/WRITE flags according to the IO type of this request.
- //
- switch (Packet->DataDirection) {
- case DataIn:
- ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ);
- ScsiCmd->ExpDataXferLength = NTOHL (Packet->InTransferLength);
- break;
-
- case DataOut:
- ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_WRITE);
- ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength);
- break;
-
- case DataBi:
- ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ | SCSI_CMD_PDU_FLAG_WRITE);
- ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength);
-
- //
- // Fill the bidirectional expected read data length AHS.
- //
- BiExpReadDataLenAHS = (ISCSI_BI_EXP_READ_DATA_LEN_AHS *) Header;
- Header = (ISCSI_ADDITIONAL_HEADER *) (BiExpReadDataLenAHS + 1);
-
- BiExpReadDataLenAHS->Length = NTOHS (5);
- BiExpReadDataLenAHS->Type = ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN;
- BiExpReadDataLenAHS->ExpReadDataLength = NTOHL (Packet->InTransferLength);
-
- break;
- }
-
- ScsiCmd->TotalAHSLength = AHSLength;
- CopyMem (ScsiCmd->Lun, &Lun, sizeof (ScsiCmd->Lun));
- ScsiCmd->InitiatorTaskTag = NTOHL (Tcb->InitiatorTaskTag);
- ScsiCmd->CmdSN = NTOHL (Tcb->CmdSN);
- ScsiCmd->ExpStatSN = NTOHL (Tcb->Conn->ExpStatSN);
-
- CopyMem (ScsiCmd->Cdb, Packet->Cdb, sizeof (ScsiCmd->Cdb));
-
- if (Packet->CdbLength > 16) {
- Header->Length = NTOHS ((UINT16) (Packet->CdbLength - 15));
- Header->Type = ISCSI_AHS_TYPE_EXT_CDB;
-
- CopyMem (Header + 1, (UINT8 *) Packet->Cdb + 16, Packet->CdbLength - 16);
- }
-
- Pdu = PduHeader;
- Session = Tcb->Conn->Session;
- ImmediateDataLen = 0;
-
- if (Session->ImmediateData && (Packet->OutTransferLength != 0)) {
- //
- // Send immediate data in this SCSI Command PDU. The length of the immeidate
- // data is the minimum of FirstBurstLength, the data length to be xfered and
- // the MaxRecvdataSegmentLength on this connection.
- //
- ImmediateDataLen = MIN (Session->FirstBurstLength, Packet->OutTransferLength);
- ImmediateDataLen = MIN (ImmediateDataLen, Tcb->Conn->MaxRecvDataSegmentLength);
-
- //
- // Update the data segment length in the PDU header.
- //
- ISCSI_SET_DATASEG_LEN (ScsiCmd, ImmediateDataLen);
-
- //
- // Create the data segment.
- //
- DataSeg = IScsiNewDataSegment ((UINT8 *) Packet->OutDataBuffer, ImmediateDataLen, FALSE);
- if (DataSeg == NULL) {
- NetbufFree (PduHeader);
- Pdu = NULL;
- goto ON_EXIT;
- }
-
- NbufList = AllocatePool (sizeof (LIST_ENTRY));
- if (NbufList == NULL) {
- NetbufFree (PduHeader);
- NetbufFree (DataSeg);
-
- Pdu = NULL;
- goto ON_EXIT;
- }
-
- InitializeListHead (NbufList);
- InsertTailList (NbufList, &PduHeader->List);
- InsertTailList (NbufList, &DataSeg->List);
-
- Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
- if (Pdu == NULL) {
- IScsiFreeNbufList (NbufList);
- }
- }
-
- if (Session->InitialR2T ||
- (ImmediateDataLen == Session->FirstBurstLength) ||
- (ImmediateDataLen == Packet->OutTransferLength)
- ) {
- //
- // Unsolicited data out sequence is not allowed,
- // or FirstBurstLength data is already sent out by immediate data
- // or all the OUT data accompany this SCSI packet is sent as
- // immediate data, the final flag should be set on this SCSI Command
- // PDU.
- //
- ISCSI_SET_FLAG (ScsiCmd, ISCSI_BHS_FLAG_FINAL);
- }
-
-ON_EXIT:
-
- return Pdu;
-}
-
-/**
- Create a new iSCSI SCSI Data Out PDU.
-
- @param[in] Data The data to put into the Data Out PDU.
- @param[in] Len Length of the data.
- @param[in] DataSN The DataSN of the Data Out PDU.
- @param[in] Tcb The task control block of this Data Out PDU.
- @param[in] Lun The LUN.
-
- @return The net buffer wrapping the Data Out PDU.
- @retval NULL Other errors as indicated.
-**/
-NET_BUF *
-IScsiNewDataOutPdu (
- IN UINT8 *Data,
- IN UINT32 Len,
- IN UINT32 DataSN,
- IN ISCSI_TCB *Tcb,
- IN UINT64 Lun
- )
-{
- LIST_ENTRY *NbufList;
- NET_BUF *PduHdr;
- NET_BUF *DataSeg;
- NET_BUF *Pdu;
- ISCSI_SCSI_DATA_OUT *DataOutHdr;
- ISCSI_XFER_CONTEXT *XferContext;
-
- NbufList = AllocatePool (sizeof (LIST_ENTRY));
- if (NbufList == NULL) {
- return NULL;
- }
-
- InitializeListHead (NbufList);
-
- //
- // Allocate memory for the BHS.
- //
- PduHdr = NetbufAlloc (sizeof (ISCSI_SCSI_DATA_OUT));
- if (PduHdr == NULL) {
- FreePool (NbufList);
- return NULL;
- }
- //
- // Insert the BHS into the buffer list.
- //
- InsertTailList (NbufList, &PduHdr->List);
-
- DataOutHdr = (ISCSI_SCSI_DATA_OUT *) NetbufAllocSpace (PduHdr, sizeof (ISCSI_SCSI_DATA_OUT), NET_BUF_TAIL);
- ASSERT (DataOutHdr != NULL);
- XferContext = &Tcb->XferContext;
-
- ZeroMem (DataOutHdr, sizeof (ISCSI_SCSI_DATA_OUT));
-
- //
- // Set the flags and fields of the Data Out PDU BHS.
- //
- ISCSI_SET_OPCODE (DataOutHdr, ISCSI_OPCODE_SCSI_DATA_OUT, 0);
- ISCSI_SET_DATASEG_LEN (DataOutHdr, Len);
-
- DataOutHdr->InitiatorTaskTag = HTONL (Tcb->InitiatorTaskTag);
- DataOutHdr->TargetTransferTag = HTONL (XferContext->TargetTransferTag);
- DataOutHdr->ExpStatSN = HTONL (Tcb->Conn->ExpStatSN);
- DataOutHdr->DataSN = HTONL (DataSN);
- DataOutHdr->BufferOffset = HTONL (XferContext->Offset);
-
- if (XferContext->TargetTransferTag != ISCSI_RESERVED_TAG) {
- CopyMem (&DataOutHdr->Lun, &Lun, sizeof (DataOutHdr->Lun));
- }
- //
- // Build the data segment for this Data Out PDU.
- //
- DataSeg = IScsiNewDataSegment (Data, Len, FALSE);
- if (DataSeg == NULL) {
- IScsiFreeNbufList (NbufList);
- return NULL;
- }
- //
- // Put the data segment into the buffer list and combine it with the BHS
- // into a full Data Out PDU.
- //
- InsertTailList (NbufList, &DataSeg->List);
- Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
- if (Pdu == NULL) {
- IScsiFreeNbufList (NbufList);
- }
-
- return Pdu;
-}
-
-/**
- Generate a consecutive sequence of iSCSI SCSI Data Out PDUs.
-
- @param[in] Data The data which will be carried by the sequence of iSCSI SCSI Data Out PDUs.
- @param[in] Tcb The task control block of the data to send out.
- @param[in] Lun The LUN the data will be sent to.
-
- @return A list of net buffers with each of them wraps an iSCSI SCSI Data Out PDU.
- @retval NULL Other errors as indicated.
-**/
-LIST_ENTRY *
-IScsiGenerateDataOutPduSequence (
- IN UINT8 *Data,
- IN ISCSI_TCB *Tcb,
- IN UINT64 Lun
- )
-{
- LIST_ENTRY *PduList;
- UINT32 DataSN;
- UINT32 DataLen;
- NET_BUF *DataOutPdu;
- ISCSI_CONNECTION *Conn;
- ISCSI_XFER_CONTEXT *XferContext;
- UINT8 *DataOutPacket;
-
- PduList = AllocatePool (sizeof (LIST_ENTRY));
- if (PduList == NULL) {
- return NULL;
- }
-
- InitializeListHead (PduList);
-
- DataSN = 0;
- Conn = Tcb->Conn;
- DataOutPdu = NULL;
- XferContext = &Tcb->XferContext;
-
- while (XferContext->DesiredLength > 0) {
- //
- // Determine the length of data this Data Out PDU can carry.
- //
- DataLen = MIN (XferContext->DesiredLength, Conn->MaxRecvDataSegmentLength);
-
- //
- // Create a Data Out PDU.
- //
- DataOutPdu = IScsiNewDataOutPdu (Data, DataLen, DataSN, Tcb, Lun);
- if (DataOutPdu == NULL) {
- IScsiFreeNbufList (PduList);
- PduList = NULL;
-
- goto ON_EXIT;
- }
-
- InsertTailList (PduList, &DataOutPdu->List);
-
- //
- // Update the context and DataSN.
- //
- XferContext->Offset += DataLen;
- XferContext->DesiredLength -= DataLen;
- DataSN++;
- Data += DataLen;
- }
- //
- // Set the F bit for the last data out PDU in this sequence.
- //
- DataOutPacket = NetbufGetByte (DataOutPdu, 0, NULL);
- if (DataOutPacket == NULL) {
- IScsiFreeNbufList (PduList);
- PduList = NULL;
- goto ON_EXIT;
- }
-
- ISCSI_SET_FLAG (DataOutPacket, ISCSI_BHS_FLAG_FINAL);
-
-ON_EXIT:
-
- return PduList;
-}
-
-/**
- Send the Data in a sequence of Data Out PDUs one by one.
-
- @param[in] Data The data to carry by Data Out PDUs.
- @param[in] Lun The LUN the data will be sent to.
- @param[in] Tcb The task control block.
-
- @retval EFI_SUCCES The data is sent out to the LUN.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiSendDataOutPduSequence (
- IN UINT8 *Data,
- IN UINT64 Lun,
- IN ISCSI_TCB *Tcb
- )
-{
- LIST_ENTRY *DataOutPduList;
- LIST_ENTRY *Entry;
- NET_BUF *Pdu;
- EFI_STATUS Status;
-
- //
- // Generate the Data Out PDU sequence.
- //
- DataOutPduList = IScsiGenerateDataOutPduSequence (Data, Tcb, Lun);
- if (DataOutPduList == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Status = EFI_SUCCESS;
-
- //
- // Send the Data Out PDU's one by one.
- //
- NET_LIST_FOR_EACH (Entry, DataOutPduList) {
- Pdu = NET_LIST_USER_STRUCT (Entry, NET_BUF, List);
-
- Status = Tcp4IoTransmit (&Tcb->Conn->Tcp4Io, Pdu);
- if (EFI_ERROR (Status)) {
- break;
- }
- }
-
- IScsiFreeNbufList (DataOutPduList);
-
- return Status;
-}
-
-/**
- Process the received iSCSI SCSI Data In PDU.
-
- @param[in] Pdu The Data In PDU received.
- @param[in] Tcb The task control block.
- @param[in, out] Packet The EXT SCSI PASS THRU request packet.
-
- @retval EFI_SUCCES The check on the Data IN PDU is passed and some update
- actions are taken.
- @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened.
- @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the request.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiOnDataInRcvd (
- IN NET_BUF *Pdu,
- IN ISCSI_TCB *Tcb,
- IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
- )
-{
- ISCSI_SCSI_DATA_IN *DataInHdr;
- EFI_STATUS Status;
-
- DataInHdr = (ISCSI_SCSI_DATA_IN *) NetbufGetByte (Pdu, 0, NULL);
- if (DataInHdr == NULL) {
- return EFI_PROTOCOL_ERROR;
- }
-
- DataInHdr->InitiatorTaskTag = NTOHL (DataInHdr->InitiatorTaskTag);
- DataInHdr->ExpCmdSN = NTOHL (DataInHdr->ExpCmdSN);
- DataInHdr->MaxCmdSN = NTOHL (DataInHdr->MaxCmdSN);
- DataInHdr->DataSN = NTOHL (DataInHdr->DataSN);
-
- //
- // Check the DataSN.
- //
- Status = IScsiCheckSN (&Tcb->ExpDataSN, DataInHdr->DataSN);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- if (DataInHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) {
- return EFI_PROTOCOL_ERROR;
- }
- //
- // Update the command related sequence numbers.
- //
- IScsiUpdateCmdSN (Tcb->Conn->Session, DataInHdr->MaxCmdSN, DataInHdr->ExpCmdSN);
-
- if (ISCSI_FLAG_ON (DataInHdr, SCSI_DATA_IN_PDU_FLAG_STATUS_VALID)) {
- if (!ISCSI_FLAG_ON (DataInHdr, ISCSI_BHS_FLAG_FINAL)) {
- //
- // The S bit is on but the F bit is off.
- //
- return EFI_PROTOCOL_ERROR;
- }
-
- Tcb->StatusXferd = TRUE;
-
- if (ISCSI_FLAG_ON (DataInHdr, SCSI_DATA_IN_PDU_FLAG_OVERFLOW | SCSI_DATA_IN_PDU_FLAG_UNDERFLOW)) {
- //
- // Underflow and Overflow are mutual flags.
- //
- return EFI_PROTOCOL_ERROR;
- }
- //
- // S bit is on, the StatSN is valid.
- //
- Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NTOHL (DataInHdr->StatSN));
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Packet->HostAdapterStatus = 0;
- Packet->TargetStatus = DataInHdr->Status;
-
- if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) {
- Packet->InTransferLength += NTOHL (DataInHdr->ResidualCount);
- Status = EFI_BAD_BUFFER_SIZE;
- }
-
- if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) {
- Packet->InTransferLength -= NTOHL (DataInHdr->ResidualCount);
- }
- }
-
- return Status;
-}
-
-/**
- Process the received iSCSI R2T PDU.
-
- @param[in] Pdu The R2T PDU received.
- @param[in] Tcb The task control block.
- @param[in] Lun The Lun.
- @param[in, out] Packet The EXT SCSI PASS THRU request packet.
-
- @retval EFI_SUCCES The R2T PDU is valid and the solicited data is sent out.
- @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiOnR2TRcvd (
- IN NET_BUF *Pdu,
- IN ISCSI_TCB *Tcb,
- IN UINT64 Lun,
- IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
- )
-{
- ISCSI_READY_TO_TRANSFER *R2THdr;
- EFI_STATUS Status;
- ISCSI_XFER_CONTEXT *XferContext;
- UINT8 *Data;
-
- R2THdr = (ISCSI_READY_TO_TRANSFER *) NetbufGetByte (Pdu, 0, NULL);
- if (R2THdr == NULL) {
- return EFI_PROTOCOL_ERROR;
- }
-
- R2THdr->InitiatorTaskTag = NTOHL (R2THdr->InitiatorTaskTag);
- R2THdr->TargetTransferTag = NTOHL (R2THdr->TargetTransferTag);
- R2THdr->StatSN = NTOHL (R2THdr->StatSN);
- R2THdr->R2TSeqNum = NTOHL (R2THdr->R2TSeqNum);
- R2THdr->BufferOffset = NTOHL (R2THdr->BufferOffset);
- R2THdr->DesiredDataTransferLength = NTOHL (R2THdr->DesiredDataTransferLength);
-
- if ((R2THdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) || !ISCSI_SEQ_EQ (R2THdr->StatSN, Tcb->Conn->ExpStatSN)) {
- return EFI_PROTOCOL_ERROR;;
- }
- //
- // Check the sequence number.
- //
- Status = IScsiCheckSN (&Tcb->ExpDataSN, R2THdr->R2TSeqNum);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- XferContext = &Tcb->XferContext;
- XferContext->TargetTransferTag = R2THdr->TargetTransferTag;
- XferContext->Offset = R2THdr->BufferOffset;
- XferContext->DesiredLength = R2THdr->DesiredDataTransferLength;
-
- if (((XferContext->Offset + XferContext->DesiredLength) > Packet->OutTransferLength) ||
- (XferContext->DesiredLength > Tcb->Conn->Session->MaxBurstLength)
- ) {
- return EFI_PROTOCOL_ERROR;
- }
- //
- // Send the data solicited by this R2T.
- //
- Data = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset;
- Status = IScsiSendDataOutPduSequence (Data, Lun, Tcb);
-
- return Status;
-}
-
-/**
- Process the received iSCSI SCSI Response PDU.
-
- @param[in] Pdu The Response PDU received.
- @param[in] Tcb The task control block.
- @param[in, out] Packet The EXT SCSI PASS THRU request packet.
-
- @retval EFI_SUCCES The Response PDU is processed.
- @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened.
- @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the request.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiOnScsiRspRcvd (
- IN NET_BUF *Pdu,
- IN ISCSI_TCB *Tcb,
- IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
- )
-{
- SCSI_RESPONSE *ScsiRspHdr;
- ISCSI_SENSE_DATA *SenseData;
- EFI_STATUS Status;
- UINT32 DataSegLen;
-
- ScsiRspHdr = (SCSI_RESPONSE *) NetbufGetByte (Pdu, 0, NULL);
- if (ScsiRspHdr == NULL) {
- return EFI_PROTOCOL_ERROR;
- }
-
- ScsiRspHdr->InitiatorTaskTag = NTOHL (ScsiRspHdr->InitiatorTaskTag);
- if (ScsiRspHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) {
- return EFI_PROTOCOL_ERROR;
- }
-
- ScsiRspHdr->StatSN = NTOHL (ScsiRspHdr->StatSN);
-
- Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, ScsiRspHdr->StatSN);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- ScsiRspHdr->MaxCmdSN = NTOHL (ScsiRspHdr->MaxCmdSN);
- ScsiRspHdr->ExpCmdSN = NTOHL (ScsiRspHdr->ExpCmdSN);
- IScsiUpdateCmdSN (Tcb->Conn->Session, ScsiRspHdr->MaxCmdSN, ScsiRspHdr->ExpCmdSN);
-
- Tcb->StatusXferd = TRUE;
-
- Packet->HostAdapterStatus = ScsiRspHdr->Response;
- if (Packet->HostAdapterStatus != ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET) {
- return EFI_SUCCESS;
- }
-
- Packet->TargetStatus = ScsiRspHdr->Status;
-
- if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW | SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW) ||
- ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW | SCSI_RSP_PDU_FLAG_UNDERFLOW)
- ) {
- return EFI_PROTOCOL_ERROR;
- }
-
- if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW)) {
- Packet->InTransferLength += NTOHL (ScsiRspHdr->BiReadResidualCount);
- Status = EFI_BAD_BUFFER_SIZE;
- }
-
- if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW)) {
- Packet->InTransferLength -= NTOHL (ScsiRspHdr->BiReadResidualCount);
- }
-
- if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) {
- if (Packet->DataDirection == DataIn) {
- Packet->InTransferLength += NTOHL (ScsiRspHdr->ResidualCount);
- } else {
- Packet->OutTransferLength += NTOHL (ScsiRspHdr->ResidualCount);
- }
-
- Status = EFI_BAD_BUFFER_SIZE;
- }
-
- if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) {
- if (Packet->DataDirection == DataIn) {
- Packet->InTransferLength -= NTOHL (ScsiRspHdr->ResidualCount);
- } else {
- Packet->OutTransferLength -= NTOHL (ScsiRspHdr->ResidualCount);
- }
- }
-
- DataSegLen = ISCSI_GET_DATASEG_LEN (ScsiRspHdr);
- if (DataSegLen != 0) {
- SenseData = (ISCSI_SENSE_DATA *) NetbufGetByte (Pdu, sizeof (SCSI_RESPONSE), NULL);
- if (SenseData == NULL) {
- return EFI_PROTOCOL_ERROR;
- }
-
- SenseData->Length = NTOHS (SenseData->Length);
-
- Packet->SenseDataLength = (UINT8) MIN (SenseData->Length, Packet->SenseDataLength);
- if (Packet->SenseDataLength != 0) {
- CopyMem (Packet->SenseData, &SenseData->Data[0], Packet->SenseDataLength);
- }
- } else {
- Packet->SenseDataLength = 0;
- }
-
- return Status;
-}
-
-/**
- Process the received NOP In PDU.
-
- @param[in] Pdu The NOP In PDU received.
- @param[in] Tcb The task control block.
-
- @retval EFI_SUCCES The NOP In PDU is processed and the related sequence
- numbers are updated.
- @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened.
-**/
-EFI_STATUS
-IScsiOnNopInRcvd (
- IN NET_BUF *Pdu,
- IN ISCSI_TCB *Tcb
- )
-{
- ISCSI_NOP_IN *NopInHdr;
- EFI_STATUS Status;
-
- NopInHdr = (ISCSI_NOP_IN *) NetbufGetByte (Pdu, 0, NULL);
- if (NopInHdr == NULL) {
- return EFI_PROTOCOL_ERROR;
- }
-
- NopInHdr->StatSN = NTOHL (NopInHdr->StatSN);
- NopInHdr->ExpCmdSN = NTOHL (NopInHdr->ExpCmdSN);
- NopInHdr->MaxCmdSN = NTOHL (NopInHdr->MaxCmdSN);
-
- if (NopInHdr->InitiatorTaskTag == ISCSI_RESERVED_TAG) {
- if (NopInHdr->StatSN != Tcb->Conn->ExpStatSN) {
- return EFI_PROTOCOL_ERROR;
- }
- } else {
- Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NopInHdr->StatSN);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- }
-
- IScsiUpdateCmdSN (Tcb->Conn->Session, NopInHdr->MaxCmdSN, NopInHdr->ExpCmdSN);
-
- return EFI_SUCCESS;
-}
-
-/**
- Execute the SCSI command issued through the EXT SCSI PASS THRU protocol.
-
- @param[in] PassThru The EXT SCSI PASS THRU protocol.
- @param[in] Target The target ID.
- @param[in] Lun The LUN.
- @param[in, out] Packet The request packet containing IO request, SCSI command
- buffer and buffers to read/write.
-
- @retval EFI_SUCCES The SCSI command is executed and the result is updated to
- the Packet.
- @retval EFI_DEVICE_ERROR Session state was not as required.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_NOT_READY The target can not accept new commands.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiExecuteScsiCommand (
- IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru,
- IN UINT8 *Target,
- IN UINT64 Lun,
- IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
- )
-{
- EFI_STATUS Status;
- ISCSI_DRIVER_DATA *Private;
- ISCSI_SESSION *Session;
- EFI_EVENT TimeoutEvent;
- ISCSI_CONNECTION *Conn;
- ISCSI_TCB *Tcb;
- NET_BUF *Pdu;
- ISCSI_XFER_CONTEXT *XferContext;
- UINT8 *Data;
- ISCSI_IN_BUFFER_CONTEXT InBufferContext;
- UINT64 Timeout;
- UINT8 *PduHdr;
-
- Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru);
- Session = &Private->Session;
- Status = EFI_SUCCESS;
- Tcb = NULL;
- TimeoutEvent = NULL;
- Timeout = 0;
-
- if (Session->State != SESSION_STATE_LOGGED_IN) {
- Status = EFI_DEVICE_ERROR;
- goto ON_EXIT;
- }
-
- Conn = NET_LIST_USER_STRUCT_S (
- Session->Conns.ForwardLink,
- ISCSI_CONNECTION,
- Link,
- ISCSI_CONNECTION_SIGNATURE
- );
-
- if (Packet->Timeout != 0) {
- Timeout = MultU64x32 (Packet->Timeout, 2);
- }
-
- Status = IScsiNewTcb (Conn, &Tcb);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
- //
- // Encapsulate the SCSI request packet into an iSCSI SCSI Command PDU.
- //
- Pdu = IScsiNewScsiCmdPdu (Packet, Lun, Tcb);
- if (Pdu == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_EXIT;
- }
-
- XferContext = &Tcb->XferContext;
- PduHdr = NetbufGetByte (Pdu, 0, NULL);
- if (PduHdr == NULL) {
- Status = EFI_PROTOCOL_ERROR;
- NetbufFree (Pdu);
- goto ON_EXIT;
- }
- XferContext->Offset = ISCSI_GET_DATASEG_LEN (PduHdr);
-
- //
- // Transmit the SCSI Command PDU.
- //
- Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu);
-
- NetbufFree (Pdu);
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- if (!Session->InitialR2T &&
- (XferContext->Offset < Session->FirstBurstLength) &&
- (XferContext->Offset < Packet->OutTransferLength)
- ) {
- //
- // Unsolicited Data-Out sequence is allowed, there is remaining SCSI
- // OUT data and the limit of FirstBurstLength is not reached.
- //
- XferContext->TargetTransferTag = ISCSI_RESERVED_TAG;
- XferContext->DesiredLength = MIN (
- Session->FirstBurstLength,
- Packet->OutTransferLength - XferContext->Offset
- );
-
- Data = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset;
- Status = IScsiSendDataOutPduSequence (Data, Lun, Tcb);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
- }
-
- InBufferContext.InData = (UINT8 *) Packet->InDataBuffer;
- InBufferContext.InDataLen = Packet->InTransferLength;
-
- while (!Tcb->StatusXferd) {
- //
- // Start the timeout timer.
- //
- if (Timeout != 0) {
- Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, Timeout);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
- TimeoutEvent = Conn->TimeoutEvent;
- }
- //
- // try to receive PDU from target.
- //
- Status = IScsiReceivePdu (Conn, &Pdu, &InBufferContext, FALSE, FALSE, TimeoutEvent);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- PduHdr = NetbufGetByte (Pdu, 0, NULL);
- if (PduHdr == NULL) {
- Status = EFI_PROTOCOL_ERROR;
- NetbufFree (Pdu);
- goto ON_EXIT;
- }
- switch (ISCSI_GET_OPCODE (PduHdr)) {
- case ISCSI_OPCODE_SCSI_DATA_IN:
- Status = IScsiOnDataInRcvd (Pdu, Tcb, Packet);
- break;
-
- case ISCSI_OPCODE_R2T:
- Status = IScsiOnR2TRcvd (Pdu, Tcb, Lun, Packet);
- break;
-
- case ISCSI_OPCODE_SCSI_RSP:
- Status = IScsiOnScsiRspRcvd (Pdu, Tcb, Packet);
- break;
-
- case ISCSI_OPCODE_NOP_IN:
- Status = IScsiOnNopInRcvd (Pdu, Tcb);
- break;
-
- case ISCSI_OPCODE_VENDOR_T0:
- case ISCSI_OPCODE_VENDOR_T1:
- case ISCSI_OPCODE_VENDOR_T2:
- //
- // These messages are vendor specific, skip them.
- //
- break;
-
- default:
- Status = EFI_PROTOCOL_ERROR;
- break;
- }
-
- NetbufFree (Pdu);
-
- if (EFI_ERROR (Status)) {
- break;
- }
- }
-
-ON_EXIT:
-
- if (TimeoutEvent != NULL) {
- gBS->SetTimer (TimeoutEvent, TimerCancel, 0);
- }
-
- if (Tcb != NULL) {
- IScsiDelTcb (Tcb);
- }
-
- return Status;
-}
-
-/**
- Reinstate the session on some error.
-
- @param[in, out] Private The iSCSI driver data.
-
- @retval EFI_SUCCES The session is reinstated from some error.
- @retval Other Reinstatement failed.
-**/
-EFI_STATUS
-IScsiSessionReinstatement (
- IN OUT ISCSI_DRIVER_DATA *Private
- )
-{
- ISCSI_SESSION *Session;
- EFI_STATUS Status;
-
- Session = &Private->Session;
- ASSERT (Session->State != SESSION_STATE_FREE);
-
- //
- // Abort the session and re-init it.
- //
- IScsiSessionAbort (Session);
- IScsiSessionInit (Session, TRUE);
-
- //
- // Login again.
- //
- Status = IScsiSessionLogin (Private);
-
- return Status;
-}
-
-/**
- Initialize some session parameters before login.
-
- @param[in, out] Session The iSCSI session.
- @param[in] Recovery Whether the request is from a fresh new start or recovery.
-**/
-VOID
-IScsiSessionInit (
- IN OUT ISCSI_SESSION *Session,
- IN BOOLEAN Recovery
- )
-{
- if (!Recovery) {
- Session->Signature = ISCSI_SESSION_SIGNATURE;
- Session->State = SESSION_STATE_FREE;
-
- InitializeListHead (&Session->Conns);
- InitializeListHead (&Session->TcbList);
- }
-
- Session->Tsih = 0;
-
- Session->CmdSN = 1;
- Session->InitiatorTaskTag = 1;
- Session->NextCid = 1;
-
- Session->TargetPortalGroupTag = 0;
- Session->MaxConnections = ISCSI_MAX_CONNS_PER_SESSION;
- Session->InitialR2T = FALSE;
- Session->ImmediateData = TRUE;
- Session->MaxBurstLength = 262144;
- Session->FirstBurstLength = MAX_RECV_DATA_SEG_LEN_IN_FFP;
- Session->DefaultTime2Wait = 2;
- Session->DefaultTime2Retain = 20;
- Session->MaxOutstandingR2T = DEFAULT_MAX_OUTSTANDING_R2T;
- Session->DataPDUInOrder = TRUE;
- Session->DataSequenceInOrder = TRUE;
- Session->ErrorRecoveryLevel = 0;
-}
-
-/**
- Abort the iSCSI session, that is, reset all the connection and free the
- resources.
-
- @param[in, out] Session The iSCSI session.
-
- @retval EFI_SUCCES The session is aborted.
-**/
-EFI_STATUS
-IScsiSessionAbort (
- IN OUT ISCSI_SESSION *Session
- )
-{
- ISCSI_DRIVER_DATA *Private;
- ISCSI_CONNECTION *Conn;
-
- if (Session->State != SESSION_STATE_LOGGED_IN) {
- return EFI_SUCCESS;
- }
-
- ASSERT (!IsListEmpty (&Session->Conns));
-
- Private = ISCSI_DRIVER_DATA_FROM_SESSION (Session);
-
- while (!IsListEmpty (&Session->Conns)) {
- Conn = NET_LIST_USER_STRUCT_S (
- Session->Conns.ForwardLink,
- ISCSI_CONNECTION,
- Link,
- ISCSI_CONNECTION_SIGNATURE
- );
-
- gBS->CloseProtocol (
- Conn->Tcp4Io.Handle,
- &gEfiTcp4ProtocolGuid,
- Private->Image,
- Private->ExtScsiPassThruHandle
- );
-
- IScsiConnReset (Conn);
-
- IScsiDetatchConnection (Conn);
- IScsiDestroyConnection (Conn);
- }
-
- Session->State = SESSION_STATE_FAILED;
-
- return EFI_SUCCESS;
-}
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c
deleted file mode 100644
index 901b38e92fc0..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c
+++ /dev/null
@@ -1,487 +0,0 @@
-/** @file
- The wrap of TCP/IP Socket interface.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#include "IScsiImpl.h"
-
-/**
- The common notify function associated with various Tcp4Io events.
-
- @param[in] Event The event signaled.
- @param[in] Context The context.
-**/
-VOID
-EFIAPI
-Tcp4IoCommonNotify (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- *((BOOLEAN *) Context) = TRUE;
-}
-
-/**
- Create a TCP socket with the specified configuration data.
-
- @param[in] Image The handle of the driver image.
- @param[in] Controller The handle of the controller.
- @param[in] ConfigData The Tcp4 configuration data.
- @param[in] Tcp4Io The Tcp4Io.
-
- @retval EFI_SUCCESS The TCP socket is created and configured.
- @retval Others Failed to create the TCP socket or configure it.
-**/
-EFI_STATUS
-Tcp4IoCreateSocket (
- IN EFI_HANDLE Image,
- IN EFI_HANDLE Controller,
- IN TCP4_IO_CONFIG_DATA *ConfigData,
- IN TCP4_IO *Tcp4Io
- )
-{
- EFI_STATUS Status;
- EFI_TCP4_PROTOCOL *Tcp4;
- EFI_TCP4_CONFIG_DATA Tcp4ConfigData;
- EFI_TCP4_OPTION ControlOption;
- EFI_TCP4_ACCESS_POINT *AccessPoint;
-
- Tcp4Io->Handle = NULL;
- Tcp4Io->ConnToken.CompletionToken.Event = NULL;
- Tcp4Io->TxToken.CompletionToken.Event = NULL;
- Tcp4Io->RxToken.CompletionToken.Event = NULL;
- Tcp4Io->CloseToken.CompletionToken.Event = NULL;
- Tcp4 = NULL;
-
- //
- // Create the TCP4 child instance and get the TCP4 protocol.
- //
- Status = NetLibCreateServiceChild (
- Controller,
- Image,
- &gEfiTcp4ServiceBindingProtocolGuid,
- &Tcp4Io->Handle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Status = gBS->OpenProtocol (
- Tcp4Io->Handle,
- &gEfiTcp4ProtocolGuid,
- (VOID **)&Tcp4Io->Tcp4,
- Image,
- Controller,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Tcp4Io->Image = Image;
- Tcp4Io->Controller = Controller;
- Tcp4 = Tcp4Io->Tcp4;
-
- //
- // Set the configuration parameters.
- //
- ControlOption.ReceiveBufferSize = 0x200000;
- ControlOption.SendBufferSize = 0x200000;
- ControlOption.MaxSynBackLog = 0;
- ControlOption.ConnectionTimeout = 0;
- ControlOption.DataRetries = 6;
- ControlOption.FinTimeout = 0;
- ControlOption.TimeWaitTimeout = 0;
- ControlOption.KeepAliveProbes = 4;
- ControlOption.KeepAliveTime = 0;
- ControlOption.KeepAliveInterval = 0;
- ControlOption.EnableNagle = FALSE;
- ControlOption.EnableTimeStamp = FALSE;
- ControlOption.EnableWindowScaling = TRUE;
- ControlOption.EnableSelectiveAck = FALSE;
- ControlOption.EnablePathMtuDiscovery = FALSE;
-
- Tcp4ConfigData.TypeOfService = 8;
- Tcp4ConfigData.TimeToLive = 255;
- Tcp4ConfigData.ControlOption = &ControlOption;
-
- AccessPoint = &Tcp4ConfigData.AccessPoint;
-
- AccessPoint->UseDefaultAddress = FALSE;
- AccessPoint->StationPort = 0;
- AccessPoint->RemotePort = ConfigData->RemotePort;
- AccessPoint->ActiveFlag = TRUE;
-
- CopyMem (&AccessPoint->StationAddress, &ConfigData->LocalIp, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&AccessPoint->SubnetMask, &ConfigData->SubnetMask, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&AccessPoint->RemoteAddress, &ConfigData->RemoteIp, sizeof (EFI_IPv4_ADDRESS));
-
- //
- // Configure the TCP4 protocol.
- //
- Status = Tcp4->Configure (Tcp4, &Tcp4ConfigData);
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- if (!EFI_IP4_EQUAL (&ConfigData->Gateway, &mZeroIp4Addr)) {
- //
- // the gateway is not zero, add the default route by hand
- //
- Status = Tcp4->Routes (Tcp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, &ConfigData->Gateway);
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
- }
- //
- // Create events for variuos asynchronous operations.
- //
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_NOTIFY,
- Tcp4IoCommonNotify,
- &Tcp4Io->IsConnDone,
- &Tcp4Io->ConnToken.CompletionToken.Event
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_NOTIFY,
- Tcp4IoCommonNotify,
- &Tcp4Io->IsTxDone,
- &Tcp4Io->TxToken.CompletionToken.Event
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_NOTIFY,
- Tcp4IoCommonNotify,
- &Tcp4Io->IsRxDone,
- &Tcp4Io->RxToken.CompletionToken.Event
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_NOTIFY,
- Tcp4IoCommonNotify,
- &Tcp4Io->IsCloseDone,
- &Tcp4Io->CloseToken.CompletionToken.Event
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Tcp4Io->IsTxDone = FALSE;
- Tcp4Io->IsRxDone = FALSE;
-
- return EFI_SUCCESS;
-
-ON_ERROR:
-
- if (Tcp4Io->RxToken.CompletionToken.Event != NULL) {
- gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event);
- }
-
- if (Tcp4Io->TxToken.CompletionToken.Event != NULL) {
- gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event);
- }
-
- if (Tcp4Io->ConnToken.CompletionToken.Event != NULL) {
- gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event);
- }
-
- if (Tcp4 != NULL) {
- Tcp4->Configure (Tcp4, NULL);
-
- gBS->CloseProtocol (
- Tcp4Io->Handle,
- &gEfiTcp4ProtocolGuid,
- Image,
- Controller
- );
- }
-
- NetLibDestroyServiceChild (
- Controller,
- Image,
- &gEfiTcp4ServiceBindingProtocolGuid,
- Tcp4Io->Handle
- );
-
- return Status;
-}
-
-/**
- Destroy the socket.
-
- @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyeds.
-**/
-VOID
-Tcp4IoDestroySocket (
- IN TCP4_IO *Tcp4Io
- )
-{
- EFI_TCP4_PROTOCOL *Tcp4;
-
- Tcp4 = Tcp4Io->Tcp4;
-
- Tcp4->Configure (Tcp4, NULL);
-
- gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event);
- gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event);
- gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event);
-
- gBS->CloseProtocol (
- Tcp4Io->Handle,
- &gEfiTcp4ProtocolGuid,
- Tcp4Io->Image,
- Tcp4Io->Controller
- );
-
- NetLibDestroyServiceChild (
- Tcp4Io->Controller,
- Tcp4Io->Image,
- &gEfiTcp4ServiceBindingProtocolGuid,
- Tcp4Io->Handle
- );
-}
-
-/**
- Connect to the other endpoint of the TCP socket.
-
- @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket.
- @param[in] Timeout The time to wait for connection done.
-
- @retval EFI_SUCCESS Connect to the other endpoint of the TCP socket successfully.
- @retval EFI_TIMEOUT Failed to connect to the other endpoint of the TCP socket in the specified time period.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-Tcp4IoConnect (
- IN OUT TCP4_IO *Tcp4Io,
- IN EFI_EVENT Timeout
- )
-{
- EFI_TCP4_PROTOCOL *Tcp4;
- EFI_STATUS Status;
-
- Tcp4Io->IsConnDone = FALSE;
- Tcp4 = Tcp4Io->Tcp4;
- Status = Tcp4->Connect (Tcp4, &Tcp4Io->ConnToken);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- while (!Tcp4Io->IsConnDone && EFI_ERROR (gBS->CheckEvent (Timeout))) {
- Tcp4->Poll (Tcp4);
- }
-
- if (!Tcp4Io->IsConnDone) {
- Status = EFI_TIMEOUT;
- } else {
- Status = Tcp4Io->ConnToken.CompletionToken.Status;
- }
-
- return Status;
-}
-
-/**
- Reset the socket.
-
- @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket.
-**/
-VOID
-Tcp4IoReset (
- IN OUT TCP4_IO *Tcp4Io
- )
-{
- EFI_STATUS Status;
- EFI_TCP4_PROTOCOL *Tcp4;
-
- Tcp4Io->CloseToken.AbortOnClose = TRUE;
- Tcp4Io->IsCloseDone = FALSE;
-
- Tcp4 = Tcp4Io->Tcp4;
- Status = Tcp4->Close (Tcp4, &Tcp4Io->CloseToken);
- if (EFI_ERROR (Status)) {
- return ;
- }
-
- while (!Tcp4Io->IsCloseDone) {
- Tcp4->Poll (Tcp4);
- }
-}
-
-/**
- Transmit the Packet to the other endpoint of the socket.
-
- @param[in] Tcp4Io The Tcp4Io wrapping the TCP socket.
- @param[in] Packet The packet to transmit.
-
- @retval EFI_SUCCESS The packet is trasmitted.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-Tcp4IoTransmit (
- IN TCP4_IO *Tcp4Io,
- IN NET_BUF *Packet
- )
-{
- EFI_TCP4_TRANSMIT_DATA *TxData;
- EFI_TCP4_PROTOCOL *Tcp4;
- EFI_STATUS Status;
-
- TxData = AllocatePool (sizeof (EFI_TCP4_TRANSMIT_DATA) + (Packet->BlockOpNum - 1) * sizeof (EFI_TCP4_FRAGMENT_DATA));
- if (TxData == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- TxData->Push = TRUE;
- TxData->Urgent = FALSE;
- TxData->DataLength = Packet->TotalSize;
-
- //
- // Build the fragment table.
- //
- TxData->FragmentCount = Packet->BlockOpNum;
- NetbufBuildExt (Packet, (NET_FRAGMENT *) &TxData->FragmentTable[0], &TxData->FragmentCount);
-
- Tcp4Io->TxToken.Packet.TxData = TxData;
-
- //
- // Trasnmit the packet.
- //
- Tcp4 = Tcp4Io->Tcp4;
- Status = Tcp4->Transmit (Tcp4, &Tcp4Io->TxToken);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- while (!Tcp4Io->IsTxDone) {
- Tcp4->Poll (Tcp4);
- }
-
- Tcp4Io->IsTxDone = FALSE;
-
- Status = Tcp4Io->TxToken.CompletionToken.Status;
-
-ON_EXIT:
-
- FreePool (TxData);
-
- return Status;
-}
-
-/**
- Receive data from the socket.
-
- @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyed.
- @param[in] Packet The buffer to hold the data copy from the soket rx buffer.
- @param[in] AsyncMode Is this receive asyncronous or not.
- @param[in] Timeout The time to wait for receiving the amount of data the Packet
- can hold.
-
- @retval EFI_SUCCESS The required amount of data is received from the socket.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate momery.
- @retval EFI_TIMEOUT Failed to receive the required amount of data in the
- specified time period.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-Tcp4IoReceive (
- IN TCP4_IO *Tcp4Io,
- IN NET_BUF *Packet,
- IN BOOLEAN AsyncMode,
- IN EFI_EVENT Timeout
- )
-{
- EFI_TCP4_PROTOCOL *Tcp4;
- EFI_TCP4_RECEIVE_DATA RxData;
- EFI_STATUS Status;
- NET_FRAGMENT *Fragment;
- UINT32 FragmentCount;
- UINT32 CurrentFragment;
-
- FragmentCount = Packet->BlockOpNum;
- Fragment = AllocatePool (FragmentCount * sizeof (NET_FRAGMENT));
- if (Fragment == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- //
- // Build the fragment table.
- //
- NetbufBuildExt (Packet, Fragment, &FragmentCount);
-
- RxData.FragmentCount = 1;
- Tcp4Io->RxToken.Packet.RxData = &RxData;
- CurrentFragment = 0;
- Tcp4 = Tcp4Io->Tcp4;
- Status = EFI_SUCCESS;
-
- while (CurrentFragment < FragmentCount) {
- RxData.DataLength = Fragment[CurrentFragment].Len;
- RxData.FragmentTable[0].FragmentLength = Fragment[CurrentFragment].Len;
- RxData.FragmentTable[0].FragmentBuffer = Fragment[CurrentFragment].Bulk;
-
- Status = Tcp4->Receive (Tcp4, &Tcp4Io->RxToken);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- while (!Tcp4Io->IsRxDone && ((Timeout == NULL) || EFI_ERROR (gBS->CheckEvent (Timeout)))) {
- //
- // Poll until some data is received or something error happens.
- //
- Tcp4->Poll (Tcp4);
- }
-
- if (!Tcp4Io->IsRxDone) {
- //
- // Timeout occurs, cancel the receive request.
- //
- Tcp4->Cancel (Tcp4, &Tcp4Io->RxToken.CompletionToken);
-
- Status = EFI_TIMEOUT;
- goto ON_EXIT;
- } else {
- Tcp4Io->IsRxDone = FALSE;
- }
-
- if (EFI_ERROR (Tcp4Io->RxToken.CompletionToken.Status)) {
- Status = Tcp4Io->RxToken.CompletionToken.Status;
- goto ON_EXIT;
- }
-
- Fragment[CurrentFragment].Len -= RxData.FragmentTable[0].FragmentLength;
- if (Fragment[CurrentFragment].Len == 0) {
- CurrentFragment++;
- } else {
- Fragment[CurrentFragment].Bulk += RxData.FragmentTable[0].FragmentLength;
- }
- }
-
-ON_EXIT:
- Tcp4Io->RxToken.Packet.RxData = NULL;
- FreePool (Fragment);
-
- return Status;
-}
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c
deleted file mode 100644
index 3555f1a2ebe3..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c
+++ /dev/null
@@ -1,350 +0,0 @@
-/** @file
- Implementation of MD5 algorithm.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#include "Md5.h"
-
-CONST UINT32 Md5_Data[][2] = {
- { 0, 1 },
- { 1, 5 },
- { 5, 3 },
- { 0, 7 }
-};
-
-CONST UINT32 Md5_S[][4] = {
- { 7, 22, 17, 12 },
- { 5, 20, 14, 9 },
- { 4, 23, 16 ,11 },
- { 6, 21, 15, 10 },
-};
-
-CONST UINT32 Md5_T[] = {
- 0xD76AA478, 0xE8C7B756, 0x242070DB, 0xC1BDCEEE,
- 0xF57C0FAF, 0x4787C62A, 0xA8304613, 0xFD469501,
- 0x698098D8, 0x8B44F7AF, 0xFFFF5BB1, 0x895CD7BE,
- 0x6B901122, 0xFD987193, 0xA679438E, 0x49B40821,
- 0xF61E2562, 0xC040B340, 0x265E5A51, 0xE9B6C7AA,
- 0xD62F105D, 0x02441453, 0xD8A1E681, 0xE7D3FBC8,
- 0x21E1CDE6, 0xC33707D6, 0xF4D50D87, 0x455A14ED,
- 0xA9E3E905, 0xFCEFA3F8, 0x676F02D9, 0x8D2A4C8A,
- 0xFFFA3942, 0x8771F681, 0x6D9D6122, 0xFDE5380C,
- 0xA4BEEA44, 0x4BDECFA9, 0xF6BB4B60, 0xBEBFBC70,
- 0x289B7EC6, 0xEAA127FA, 0xD4EF3085, 0x04881D05,
- 0xD9D4D039, 0xE6DB99E5, 0x1FA27CF8, 0xC4AC5665,
- 0xF4292244, 0x432AFF97, 0xAB9423A7, 0xFC93A039,
- 0x655B59C3, 0x8F0CCC92, 0xFFEFF47D, 0x85845DD1,
- 0x6FA87E4F, 0xFE2CE6E0, 0xA3014314, 0x4E0811A1,
- 0xF7537E82, 0xBD3AF235, 0x2AD7D2BB, 0xEB86D391
-};
-
-CONST UINT8 Md5HashPadding[] =
-{
- 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-//
-// ROTATE_LEFT rotates x left n bits.
-//
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
-
-#define SA MedStates[Index2 & 3]
-#define SB MedStates[(Index2 + 1) & 3]
-#define SC MedStates[(Index2 + 2) & 3]
-#define SD MedStates[(Index2 + 3) & 3]
-
-/**
- Tf1 is one basic MD5 transform function.
-
- @param[in] A A 32-bit quantity.
- @param[in] B A 32-bit quantity.
- @param[in] C A 32-bit quantity.
-
- @return Output was produced as a 32-bit quantity based on the
- three 32-bit input quantity.
-**/
-UINT32
-Tf1 (
- IN UINT32 A,
- IN UINT32 B,
- IN UINT32 C
- )
-{
- return (A & B) | (~A & C);
-}
-
-/**
- Tf2 is one basic MD5 transform function.
-
- @param[in] A A 32-bit quantity.
- @param[in] B A 32-bit quantity.
- @param[in] C A 32-bit quantity.
-
- @return Output was produced as a 32-bit quantity based on the
- three 32-bit input quantity.
-**/
-UINT32
-Tf2 (
- IN UINT32 A,
- IN UINT32 B,
- IN UINT32 C
- )
-{
- return (A & C) | (B & ~C);
-}
-
-/**
- Tf3 is one basic MD5 transform function.
-
- @param[in] A A 32-bit quantity.
- @param[in] B A 32-bit quantity.
- @param[in] C A 32-bit quantity.
-
- @return Output was produced as a 32-bit quantity based on the
- three 32-bit input quantity.
-**/
-UINT32
-Tf3 (
- IN UINT32 A,
- IN UINT32 B,
- IN UINT32 C
- )
-{
- return A ^ B ^ C;
-}
-
-/**
- Tf4 is one basic MD5 transform function.
-
- @param[in] A A 32-bit quantity.
- @param[in] B A 32-bit quantity.
- @param[in] C A 32-bit quantity.
-
- @return Output was produced as a 32-bit quantity based on the
- three 32-bit input quantity.
-**/
-UINT32
-Tf4 (
- IN UINT32 A,
- IN UINT32 B,
- IN UINT32 C
- )
-{
- return B ^ (A | ~C);
-}
-
-typedef
-UINT32
-(*MD5_TRANSFORM_FUNC) (
- IN UINT32 A,
- IN UINT32 B,
- IN UINT32 C
- );
-
-CONST MD5_TRANSFORM_FUNC Md5_F[] = {
- Tf1,
- Tf2,
- Tf3,
- Tf4
-};
-
-/**
- Perform the MD5 transform on 64 bytes data segment.
-
- @param[in, out] Md5Ctx It includes the data segment for Md5 transform.
-**/
-VOID
-MD5Transform (
- IN OUT MD5_CTX *Md5Ctx
- )
-{
- UINT32 Index1;
- UINT32 Index2;
- UINT32 MedStates[MD5_HASHSIZE >> 2];
- UINT32 *Data;
- UINT32 IndexD;
- UINT32 IndexT;
-
- Data = (UINT32 *) Md5Ctx->M;
-
- //
- // Copy MD5 states to MedStates
- //
- CopyMem (MedStates, Md5Ctx->States, MD5_HASHSIZE);
-
- IndexT = 0;
- for (Index1 = 0; Index1 < 4; Index1++) {
- IndexD = Md5_Data[Index1][0];
- for (Index2 = 16; Index2 > 0; Index2--) {
- SA += (*Md5_F[Index1]) (SB, SC, SD) + Data[IndexD] + Md5_T[IndexT];
- SA = ROTATE_LEFT (SA, Md5_S[Index1][Index2 & 3]);
- SA += SB;
-
- IndexD += Md5_Data[Index1][1];
- IndexD &= 15;
-
- IndexT++;
- }
- }
-
- for (Index1 = 0; Index1 < 4; Index1++) {
- Md5Ctx->States[Index1] += MedStates[Index1];
- }
-}
-
-/**
- Copy data segment into the M field of MD5_CTX structure for later transform.
- If the length of data segment is larger than 64 bytes, then does the transform
- immediately and the generated Md5 code is stored in the States field of MD5_CTX
- data struct for later accumulation.
- All of Md5 code generated for the sequential 64-bytes data segaments are be
- accumulated in MD5Final() function.
-
- @param[in, out] Md5Ctx The data structure of storing the original data
- segment and the final result.
- @param[in] Data The data wanted to be transformed.
- @param[in] DataLen The length of data.
-**/
-VOID
-MD5UpdateBlock (
- IN OUT MD5_CTX *Md5Ctx,
- IN CONST UINT8 *Data,
- IN UINTN DataLen
- )
-{
- UINTN Limit;
-
- for (Limit = 64 - Md5Ctx->Count; DataLen >= 64 - Md5Ctx->Count; Limit = 64) {
- CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, Limit);
- MD5Transform (Md5Ctx);
-
- Md5Ctx->Count = 0;
- Data += Limit;
- DataLen -= Limit;
- }
-
- CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, DataLen);
- Md5Ctx->Count += DataLen;
-}
-
-/**
- Initialize four 32-bits chaining variables and use them to do the Md5 transform.
-
- @param[out] Md5Ctx The data structure of Md5.
-
- @retval EFI_SUCCESS Initialization is ok.
-**/
-EFI_STATUS
-MD5Init (
- OUT MD5_CTX *Md5Ctx
- )
-{
- ZeroMem (Md5Ctx, sizeof (*Md5Ctx));
-
- //
- // Set magic initialization constants.
- //
- Md5Ctx->States[0] = 0x67452301;
- Md5Ctx->States[1] = 0xefcdab89;
- Md5Ctx->States[2] = 0x98badcfe;
- Md5Ctx->States[3] = 0x10325476;
-
- return EFI_SUCCESS;
-}
-
-/**
- the external interface of Md5 algorithm
-
- @param[in, out] Md5Ctx The data structure of storing the original data
- segment and the final result.
- @param[in] Data The data wanted to be transformed.
- @param[in] DataLen The length of data.
-
- @retval EFI_SUCCESS The transform is ok.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-MD5Update (
- IN OUT MD5_CTX *Md5Ctx,
- IN VOID *Data,
- IN UINTN DataLen
- )
-{
- if (EFI_ERROR (Md5Ctx->Status)) {
- return Md5Ctx->Status;
- }
-
- MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) Data, DataLen);
- Md5Ctx->Length += DataLen;
- return EFI_SUCCESS;
-}
-
-/**
- Accumulate the MD5 value of every data segment and generate the finial
- result according to MD5 algorithm.
-
- @param[in, out] Md5Ctx The data structure of storing the original data
- segment and the final result.
- @param[out] HashVal The final 128-bits output.
-
- @retval EFI_SUCCESS The transform is ok.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-MD5Final (
- IN OUT MD5_CTX *Md5Ctx,
- OUT UINT8 *HashVal
- )
-{
- UINTN PadLength;
-
- if (Md5Ctx->Status == EFI_ALREADY_STARTED) {
- //
- // Store Hashed value & Zeroize sensitive context information.
- //
- CopyMem (HashVal, (UINT8 *) Md5Ctx->States, MD5_HASHSIZE);
- ZeroMem ((UINT8 *)Md5Ctx, sizeof (*Md5Ctx));
-
- return EFI_SUCCESS;
- }
-
- if (EFI_ERROR (Md5Ctx->Status)) {
- return Md5Ctx->Status;
- }
-
- PadLength = Md5Ctx->Count >= 56 ? 120 : 56;
- PadLength -= Md5Ctx->Count;
- MD5UpdateBlock (Md5Ctx, Md5HashPadding, PadLength);
- Md5Ctx->Length = LShiftU64 (Md5Ctx->Length, 3);
- MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) &Md5Ctx->Length, 8);
-
- ZeroMem (Md5Ctx->M, sizeof (Md5Ctx->M));
- Md5Ctx->Length = 0;
- Md5Ctx->Status = EFI_ALREADY_STARTED;
- return MD5Final (Md5Ctx, HashVal);
-}
-
diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc
index 3529c8d30365..b787fb5692d3 100644
--- a/MdeModulePkg/MdeModulePkg.dsc
+++ b/MdeModulePkg/MdeModulePkg.dsc
@@ -354,7 +354,6 @@ [Components]
MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf
MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf
MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf
- MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf
MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf
MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h
deleted file mode 100644
index ee371d26744c..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/** @file
- The header file of UEFI Component Name(2) protocol.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#ifndef _COMPONENT_NAME_H_
-#define _COMPONENT_NAME_H_
-
-#include <Protocol/ComponentName.h>
-#include <Protocol/ComponentName2.h>
-
-extern EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2;
-extern EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName;
-
-//
-// EFI Component Name Protocol for iSCSI driver.
-//
-
-/**
- Retrieves a Unicode string that is the user readable name of the EFI 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_NAME_PROTOCOL instance.
- @param[in] Language A pointer to a three characters ISO 639-2 language identifier.
- This is the language of the driver name that 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.
- @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
-IScsiComponentNameGetDriverName (
- 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 an EFI Driver. Currently not implemented.
-
- @param[in] This A pointer to the 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 three characters ISO 639-2 language
- identifier. This is the language of the controller name
- that 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.
- @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
-IScsiComponentNameGetControllerName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_HANDLE ChildHandle OPTIONAL,
- IN CHAR8 *Language,
- OUT CHAR16 **ControllerName
- );
-
-//
-// EFI iSCSI Initiator Name Protocol for IScsi driver.
-//
-
-/**
- Retrieves the current set value of iSCSI Initiator Name.
-
- @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
- @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer / Actual size of the
- variable data buffer.
- @param[out] Buffer Pointer to the buffer for data to be read.
-
- @retval EFI_SUCCESS Data was successfully retrieved into the provided buffer and the
- BufferSize was sufficient to handle the iSCSI initiator name
- @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result.
- @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
- @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be retrieved due to a hardware error.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiGetInitiatorName (
- IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
- IN OUT UINTN *BufferSize,
- OUT VOID *Buffer
- );
-
-/**
- Sets the iSCSI Initiator Name.
-
- @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
- @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer.
- @param[in] Buffer Pointer to the buffer for data to be written.
-
- @retval EFI_SUCCESS Data was successfully stored by the protocol.
- @retval EFI_UNSUPPORTED Platform policies do not allow for data to be written.
- Currently not implemented.
- @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize exceeds the maximum allowed limit.
- @retval EFI_DEVICE_ERROR The data could not be stored due to a hardware error.
- @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the data.
- @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not adhere to RFC 3720
- (and other related protocols)
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiSetInitiatorName (
- IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
- IN OUT UINTN *BufferSize,
- IN VOID *Buffer
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni
deleted file mode 100644
index d3c020e45d3b..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni
+++ /dev/null
@@ -1,25 +0,0 @@
-// /** @file
-// This module produces EFI iSCSI Initiator Name Protocol.
-//
-// This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol
-// and EFI DHCPv4 Protocol, to provide the capability to do the transport for SCSI
-// data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide
-// one way to configurate the iSCSI setting.
-//
-// Copyright (c) 2004 - 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 iSCSI Initiator Name Protocol"
-
-#string STR_MODULE_DESCRIPTION #language en-US "This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol and EFI DHCPv4 Protocol, to provide the capability to do the transport for SCSI data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide a way to configure the iSCSI setting."
-
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni
deleted file mode 100644
index 5ec75820a605..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni
+++ /dev/null
@@ -1,20 +0,0 @@
-// /** @file
-// IScsi4Dxe 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
-"iSCSI DXE Driver"
-
-
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h
deleted file mode 100644
index 14a5658f754b..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/** @file
- The header file of CHAP configuration.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#ifndef _ISCSI_CHAP_H_
-#define _ISCSI_CHAP_H_
-
-#define ISCSI_AUTH_METHOD_CHAP "CHAP"
-
-#define ISCSI_KEY_CHAP_ALGORITHM "CHAP_A"
-#define ISCSI_KEY_CHAP_IDENTIFIER "CHAP_I"
-#define ISCSI_KEY_CHAP_CHALLENGE "CHAP_C"
-#define ISCSI_KEY_CHAP_NAME "CHAP_N"
-#define ISCSI_KEY_CHAP_RESPONSE "CHAP_R"
-
-#define ISCSI_CHAP_ALGORITHM_MD5 5
-
-#define ISCSI_CHAP_AUTH_MAX_LEN 1024
-///
-/// MD5_HASHSIZE
-///
-#define ISCSI_CHAP_RSP_LEN 16
-
-#define ISCSI_CHAP_INITIAL 0
-#define ISCSI_CHAP_STEP_ONE 1
-#define ISCSI_CHAP_STEP_TWO 2
-#define ISCSI_CHAP_STEP_THREE 3
-#define ISCSI_CHAP_STEP_FOUR 4
-
-#pragma pack(1)
-
-typedef struct _ISCSI_CHAP_AUTH_CONFIG_NVDATA {
- UINT8 CHAPType;
- CHAR8 CHAPName[ISCSI_CHAP_NAME_STORAGE];
- CHAR8 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
- CHAR8 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
- CHAR8 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
-} ISCSI_CHAP_AUTH_CONFIG_NVDATA;
-
-#pragma pack()
-
-///
-/// ISCSI CHAP Authentication Data
-///
-typedef struct _ISCSI_CHAP_AUTH_DATA {
- ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfig;
- UINT32 InIdentifier;
- UINT8 InChallenge[ISCSI_CHAP_AUTH_MAX_LEN];
- UINT32 InChallengeLength;
- //
- // Calculated CHAP Response (CHAP_R) value
- //
- UINT8 CHAPResponse[ISCSI_CHAP_RSP_LEN];
-
- //
- // Auth-data to be sent out for mutual authentication
- //
- UINT32 OutIdentifier;
- UINT8 OutChallenge[ISCSI_CHAP_AUTH_MAX_LEN];
- UINT32 OutChallengeLength;
-} ISCSI_CHAP_AUTH_DATA;
-
-/**
- This function checks the received iSCSI Login Response during the security
- negotiation stage.
-
- @param[in] Conn The iSCSI connection.
-
- @retval EFI_SUCCESS The Login Response passed the CHAP validation.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiCHAPOnRspReceived (
- IN ISCSI_CONNECTION *Conn
- );
-/**
- This function fills the CHAP authentication information into the login PDU
- during the security negotiation stage in the iSCSI connection login.
-
- @param[in] Conn The iSCSI connection.
- @param[in, out] Pdu The PDU to send out.
-
- @retval EFI_SUCCESS All check passed and the phase-related CHAP
- authentication info is filled into the iSCSI PDU.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend.
-**/
-EFI_STATUS
-IScsiCHAPToSendReq (
- IN ISCSI_CONNECTION *Conn,
- IN OUT NET_BUF *Pdu
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h
deleted file mode 100644
index 650c68d53bab..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/** @file
- The common header file of Iscsi.
-
-Copyright (c) 2004 - 2008, 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.
-
-**/
-
-#ifndef _ISCSI_COMMON_H_
-#define _ISCSI_COMMON_H_
-
-typedef struct _ISCSI_SESSION ISCSI_SESSION;
-typedef struct _ISCSI_CONNECTION ISCSI_CONNECTION;
-typedef struct _ISCSI_DRIVER_DATA ISCSI_DRIVER_DATA;
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h
deleted file mode 100644
index c3d07f6f4859..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h
+++ /dev/null
@@ -1,166 +0,0 @@
-/** @file
- The header file of IScsiConfig.c.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#ifndef _ISCSI_CONFIG_H_
-#define _ISCSI_CONFIG_H_
-
-#include <Guid/MdeModuleHii.h>
-#include <Protocol/HiiConfigRouting.h>
-#include <Library/HiiLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/DebugLib.h>
-#include <Library/BaseLib.h>
-#include <Library/NetLib.h>
-
-extern UINT8 IScsiConfigDxeBin[];
-extern UINT8 IScsi4DxeStrings[];
-
-#define ISCSI_INITATOR_NAME_VAR_NAME L"I_NAME"
-
-#define ISCSI_CONFIG_VAR_ATTR (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE)
-
-#define ISCSI_FORM_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('I', 'f', 'c', 'i')
-
-
-
-/**
- If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is clear,
- then this macro return a pointer to a data structure ISCSI_FORM_CALLBACK_INFO.
-
- If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of PcdDebugProperyMask is set,
- The Signature field of the data structure ISCSI_FORM_CALLBACK_INFO
- is compared to TestSignature. If the signatures match, then a pointer
- to the pointer to a data structure ISCSI_FORM_CALLBACK_INFO is returned.
- If the signatures do not match, then DebugAssert() is called with a description
- of "CR has a bad signature" and Callback is returned.
-
- If the data type ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not contain the field
- specified by Callback, then the module will not compile.
-
- If ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not contain a field called Signature,
- then the module will not compile.
-
- @param Callback Pointer to the specified field within the data
- structure ISCSI_FORM_CALLBACK_INFO.
- @return A pointer to the pointer to a data structure ISCSI_FORM_CALLBACK_INFO.
- @retval Others Some unexpected error happened.
-**/
-
-#define ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK(Callback) \
- CR ( \
- Callback, \
- ISCSI_FORM_CALLBACK_INFO, \
- ConfigAccess, \
- ISCSI_FORM_CALLBACK_INFO_SIGNATURE \
- )
-
-#pragma pack(1)
-
-typedef struct _ISCSI_MAC_INFO {
- EFI_MAC_ADDRESS Mac;
- UINT8 Len;
- UINT16 VlanId;
-} ISCSI_MAC_INFO;
-
-typedef struct _ISCSI_DEVICE_LIST {
- UINT8 NumDevice;
- ISCSI_MAC_INFO MacInfo[1];
-} ISCSI_DEVICE_LIST;
-
-#pragma pack()
-
-typedef struct _ISCSI_CONFIG_FORM_ENTRY {
- LIST_ENTRY Link;
- EFI_HANDLE Controller;
- CHAR16 MacString[95];
- EFI_STRING_ID PortTitleToken;
- EFI_STRING_ID PortTitleHelpToken;
-
- ISCSI_SESSION_CONFIG_NVDATA SessionConfigData;
- ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfigData;
-} ISCSI_CONFIG_FORM_ENTRY;
-
-typedef struct _ISCSI_FORM_CALLBACK_INFO {
- UINTN Signature;
- EFI_HANDLE DriverHandle;
- EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
- EFI_HII_DATABASE_PROTOCOL *HiiDatabase;
- EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting;
- UINT16 *KeyList;
- VOID *FormBuffer;
- EFI_HII_HANDLE RegisteredHandle;
- ISCSI_CONFIG_FORM_ENTRY *Current;
-} ISCSI_FORM_CALLBACK_INFO;
-
-#pragma pack(1)
-
-///
-/// HII specific Vendor Device Path definition.
-///
-typedef struct {
- VENDOR_DEVICE_PATH VendorDevicePath;
- EFI_DEVICE_PATH_PROTOCOL End;
-} HII_VENDOR_DEVICE_PATH;
-
-#pragma pack()
-
-/**
- Updates the iSCSI configuration form to add/delete an entry for the iSCSI
- device specified by the Controller.
-
- @param[in] DriverBindingHandle The driverbinding handle.
- @param[in] Controller The controller handle of the iSCSI device.
- @param[in] AddForm Whether to add or delete a form entry.
-
- @retval EFI_SUCCESS The iSCSI configuration form is updated.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiConfigUpdateForm (
- IN EFI_HANDLE DriverBindingHandle,
- IN EFI_HANDLE Controller,
- IN BOOLEAN AddForm
- );
-
-/**
- Initialize the iSCSI configuration form.
-
- @param[in] DriverBindingHandle The iSCSI driverbinding handle.
-
- @retval EFI_SUCCESS The iSCSI configuration form is initialized.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiConfigFormInit (
- VOID
- );
-
-/**
- Unload the iSCSI configuration form, this includes: delete all the iSCSI
- device configuration entries, uninstall the form callback protocol and
- free the resources used.
-
- @param[in] DriverBindingHandle The iSCSI driverbinding handle.
-
- @retval EFI_SUCCESS The iSCSI configuration form is unloaded.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-**/
-EFI_STATUS
-IScsiConfigFormUnload (
- IN EFI_HANDLE DriverBindingHandle
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr
deleted file mode 100644
index 9e28d81fb40d..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr
+++ /dev/null
@@ -1,219 +0,0 @@
-/** @file
- Vfr file for iSCSI config.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-
-#include "IScsiConfigNVDataStruc.h"
-#define EFI_NETWORK_DEVICE_CLASS 0x04
-
-formset
- guid = IP4_ISCSI_CONFIG_GUID,
- title = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_TITLE),
- help = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_HELP),
-
- varstore ISCSI_CONFIG_IFR_NVDATA,
- name = ISCSI_CONFIG_IFR_NVDATA,
- guid = IP4_ISCSI_CONFIG_GUID;
- form formid = FORMID_MAIN_FORM,
- title = STRING_TOKEN(STR_ISCSI_MAIN_FORM_TITLE);
-
- string varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorName,
- prompt = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME),
- help = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME_HELP),
- flags = INTERACTIVE,
- key = KEY_INITIATOR_NAME,
- minsize = ISCSI_NAME_IFR_MIN_SIZE,
- maxsize = ISCSI_NAME_IFR_MAX_SIZE,
- endstring;
-
- label DEVICE_ENTRY_LABEL;
- label LABEL_END;
-
- endform;
-
- form formid = FORMID_DEVICE_FORM,
- title = STRING_TOKEN(STR_ISCSI_DEVICE_FORM_TITLE);
-
- checkbox varid = ISCSI_CONFIG_IFR_NVDATA.Enabled,
- prompt = STRING_TOKEN(STR_ISCSI_DEVICE_ENABLE),
- help = STRING_TOKEN(STR_NULL),
- flags = 0,
- endcheckbox;
-
- checkbox varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp,
- prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP),
- help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP),
- flags = INTERACTIVE,
- key = KEY_DHCP_ENABLE,
- endcheckbox;
-
- suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == 0x01;
- string varid = ISCSI_CONFIG_IFR_NVDATA.LocalIp,
- prompt = STRING_TOKEN(STR_ISCSI_LOCAL_IP_ADDRESS),
- help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
- flags = INTERACTIVE,
- key = KEY_LOCAL_IP,
- minsize = IP_MIN_SIZE,
- maxsize = IP_MAX_SIZE,
- endstring;
-
- string varid = ISCSI_CONFIG_IFR_NVDATA.SubnetMask,
- prompt = STRING_TOKEN(STR_ISCSI_LOCAL_MASK),
- help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
- flags = INTERACTIVE,
- key = KEY_SUBNET_MASK,
- minsize = IP_MIN_SIZE,
- maxsize = IP_MAX_SIZE,
- endstring;
-
- string varid = ISCSI_CONFIG_IFR_NVDATA.Gateway,
- prompt = STRING_TOKEN(STR_ISCSI_LOCAL_GATEWAY),
- help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
- flags = INTERACTIVE,
- key = KEY_GATE_WAY,
- minsize = IP_MIN_SIZE,
- maxsize = IP_MAX_SIZE,
- endstring;
- endif;
-
- subtitle text = STRING_TOKEN(STR_NULL);
-
- suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp == 0x00;
- checkbox varid = ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp,
- prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET),
- help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET),
- flags = 0,
- endcheckbox;
- endif;
-
- suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp == 0x01;
-
- string varid = ISCSI_CONFIG_IFR_NVDATA.TargetName,
- prompt = STRING_TOKEN(STR_ISCSI_TARGET_NAME),
- help = STRING_TOKEN(STR_ISCSI_TARGET_NAME),
- flags = INTERACTIVE,
- key = KEY_TARGET_NAME,
- minsize = ISCSI_NAME_IFR_MIN_SIZE,
- maxsize = ISCSI_NAME_IFR_MAX_SIZE,
- endstring;
-
- string varid = ISCSI_CONFIG_IFR_NVDATA.TargetIp,
- prompt = STRING_TOKEN(STR_ISCSI_TARGET_IP_ADDRESS),
- help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
- flags = INTERACTIVE,
- key = KEY_TARGET_IP,
- minsize = IP_MIN_SIZE,
- maxsize = IP_MAX_SIZE,
- endstring;
-
- numeric varid = ISCSI_CONFIG_IFR_NVDATA.TargetPort,
- prompt = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
- help = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
- flags = 0,
- minimum = TARGET_PORT_MIN_NUM,
- maximum = TARGET_PORT_MAX_NUM,
- step = 0,
- endnumeric;
-
- string varid = ISCSI_CONFIG_IFR_NVDATA.BootLun,
- prompt = STRING_TOKEN(STR_ISCSI_BOOT_LUN),
- help = STRING_TOKEN(STR_ISCSI_BOOT_LUN_HELP),
- flags = INTERACTIVE,
- key = KEY_BOOT_LUN,
- minsize = LUN_MIN_SIZE,
- maxsize = LUN_MAX_SIZE,
- endstring;
- endif;
-
- subtitle text = STRING_TOKEN(STR_NULL);
-
- oneof varid = ISCSI_CONFIG_IFR_NVDATA.CHAPType,
- prompt = STRING_TOKEN(STR_CHAP_TYPE_PROMPT),
- help = STRING_TOKEN(STR_CHAP_TYPE_HELP),
- option text = STRING_TOKEN(STR_CHAP_TYPE_NONE), value = ISCSI_CHAP_NONE, flags = DEFAULT;
- option text = STRING_TOKEN(STR_CHAP_TYPE_UNI), value = ISCSI_CHAP_UNI, flags = 0;
- option text = STRING_TOKEN(STR_CHAP_TYPE_MUTUAL), value = ISCSI_CHAP_MUTUAL, flags = 0;
- endoneof;
-
- suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == ISCSI_CHAP_NONE;
-
- string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPName,
- prompt = STRING_TOKEN(STR_ISCSI_CHAP_NAME),
- help = STRING_TOKEN(STR_ISCSI_CHAP_NAME),
- flags = INTERACTIVE,
- key = KEY_CHAP_NAME,
- minsize = 0,
- maxsize = ISCSI_CHAP_NAME_MAX_LEN,
- endstring;
-
- string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPSecret,
- prompt = STRING_TOKEN(STR_ISCSI_CHAP_SECRET),
- help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP),
- flags = INTERACTIVE,
- key = KEY_CHAP_SECRET,
- minsize = ISCSI_CHAP_SECRET_MIN_LEN,
- maxsize = ISCSI_CHAP_SECRET_MAX_LEN,
- endstring;
-
- endif;
-
- suppressif NOT ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType == ISCSI_CHAP_MUTUAL;
-
- string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPName,
- prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME),
- help = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME),
- flags = INTERACTIVE,
- key = KEY_REVERSE_CHAP_NAME,
- minsize = 0,
- maxsize = ISCSI_CHAP_NAME_MAX_LEN,
- endstring;
-
- string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPSecret,
- prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_SECRET),
- help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP),
- flags = INTERACTIVE,
- key = KEY_REVERSE_CHAP_SECRET,
- minsize = ISCSI_CHAP_SECRET_MIN_LEN,
- maxsize = ISCSI_CHAP_SECRET_MAX_LEN,
- endstring;
-
- endif;
-
- subtitle text = STRING_TOKEN(STR_NULL);
-
- string varid = ISCSI_CONFIG_IFR_NVDATA.IsId,
- prompt = STRING_TOKEN(STR_ISCSI_CONFIG_ISID),
- help = STRING_TOKEN(STR_ISCSI_CONFIG_ISID_HELP),
- flags = INTERACTIVE,
- key = KEY_CONFIG_ISID,
- minsize = ISID_CONFIGURABLE_MIN_LEN,
- maxsize = ISID_CONFIGURABLE_MAX_LEN,
- endstring;
-
- subtitle text = STRING_TOKEN(STR_NULL);
-
- text
- help = STRING_TOKEN (STR_SAVE_CHANGES),
- text = STRING_TOKEN (STR_SAVE_CHANGES),
- flags = INTERACTIVE,
- key = KEY_SAVE_CHANGES;
-
- goto FORMID_MAIN_FORM,
- prompt = STRING_TOKEN (STR_RETURN_MAIN_FORM),
- help = STRING_TOKEN (STR_RETURN_MAIN_FORM),
- flags = 0;
-
- endform;
-
-endformset;
-
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni
deleted file mode 100644
index 729c74ebfc1b..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni
+++ /dev/null
@@ -1,62 +0,0 @@
-// *++
-//
-// Copyright (c) 2004 - 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.
-//
-// Module Name:
-//
-// IScsiConfigStrings.uni
-//
-// Abstract:
-//
-// String definitions for iSCSI configuration.
-//
-// Revision History:
-//
-// --*/
-
-
-/=#
-
-#langdef en-US "English"
-
-#string STR_ISCSI_CONFIG_FORM_TITLE #language en-US "iSCSI Configuration"
-#string STR_ISCSI_CONFIG_FORM_HELP #language en-US "Configure the iSCSI parameters."
-#string STR_ISCSI_MAIN_FORM_TITLE #language en-US "iSCSI Configuration"
-#string STR_ISCSI_CONFIG_INIT_NAME #language en-US "iSCSI Initiator Name"
-#string STR_ISCSI_CONFIG_INIT_NAME_HELP #language en-US "The worldwide unique name of the initiator. Only iqn. format is accepted."
-#string STR_ISCSI_DEVICE_FORM_TITLE #language en-US ""
-#string STR_ISCSI_DEVICE_ENABLE #language en-US "Enable iSCSI"
-#string STR_ISCSI_LOCAL_IP_ADDRESS #language en-US " Initiator IP Address"
-#string STR_ISCSI_LOCAL_MASK #language en-US " Initiator Subnet Mask"
-#string STR_ISCSI_LOCAL_GATEWAY #language en-US " Gateway"
-#string STR_ISCSI_IP_ADDRESS_HELP #language en-US "Enter IP address in dotted-decimal notation."
-#string STR_ISCSI_TARGET_NAME #language en-US " Target Name"
-#string STR_ISCSI_TARGET_IP_ADDRESS #language en-US " Target IP Address"
-#string STR_ISCSI_TARGET_PORT #language en-US " Target Port"
-#string STR_ISCSI_BOOT_LUN #language en-US " Boot LUN"
-#string STR_ISCSI_BOOT_LUN_HELP #language en-US "Hexadecimal representation of the LU number. Examples are: 4752-3A4F-6b7e-2F99, 6734-9-156f-127, 4186-9"
-#string STR_ISCSI_ENABLE_DHCP #language en-US "Enable DHCP"
-#string STR_ISCSI_ENABLE_DHCP_ON_TARGET #language en-US "Get target info via DHCP"
-#string STR_CHAP_TYPE_PROMPT #language en-US "CHAP Type"
-#string STR_CHAP_TYPE_HELP #language en-US "None, One way CHAP or mutual CHAP"
-#string STR_CHAP_TYPE_NONE #language en-US "None"
-#string STR_CHAP_TYPE_UNI #language en-US "One way"
-#string STR_CHAP_TYPE_MUTUAL #language en-US "Mutual"
-#string STR_ISCSI_CHAP_NAME #language en-US " CHAP Name"
-#string STR_ISCSI_CHAP_SECRET #language en-US " CHAP Secret"
-#string STR_ISCSI_CHAP_SECRET_HELP #language en-US "The minimum length is 12 bytes and the maximum length is 16 bytes."
-#string STR_ISCSI_REVERSE_CHAP_NAME #language en-US " Reverse CHAP Name"
-#string STR_ISCSI_REVERSE_CHAP_SECRET #language en-US " Reverse CHAP Secret"
-#string STR_ISCSI_CONFIG_ISID #language en-US "ISID"
-#string STR_ISCSI_CONFIG_ISID_HELP #language en-US "OUI-format ISID in 6 bytes, default value are derived from MAC address. Only last 3 bytes are configurable. Example: update 0ABBCCDDEEFF to 0ABBCCF07901 by input F07901."
-#string STR_RETURN_MAIN_FORM #language en-US "Back to Previous Page"
-#string STR_SAVE_CHANGES #language en-US "Save Changes"
-#string STR_NULL #language en-US ""
-
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h
deleted file mode 100644
index 7c2e4e65fa8e..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/** @file
- Define NVData structures used by the iSCSI configuration component
-
-Copyright (c) 2004 - 2011, 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.
-
-**/
-
-#ifndef _ISCSI_NVDATASTRUC_H_
-#define _ISCSI_NVDATASTRUC_H_
-
-#include <Guid/Ip4IScsiConfigHii.h>
-
-#define VAR_EQ_TEST_NAME 0x100
-
-#define FORMID_MAIN_FORM 1
-#define FORMID_DEVICE_FORM 2
-
-#define ISCSI_NAME_MAX_SIZE 224
-
-//
-// Vfr has a limit on the size, it's 255 bytes.
-//
-#define ISCSI_NAME_IFR_MIN_SIZE 4
-#define ISCSI_NAME_IFR_MAX_SIZE 223
-
-#define IP_MIN_SIZE 7
-#define IP_MAX_SIZE 15
-#define IP4_STR_MAX_SIZE 16
-
-#define LUN_MIN_SIZE 1
-#define LUN_MAX_SIZE 20
-
-#define ISCSI_CHAP_NONE 0
-#define ISCSI_CHAP_UNI 1
-#define ISCSI_CHAP_MUTUAL 2
-
-#define TARGET_PORT_MIN_NUM 0
-#define TARGET_PORT_MAX_NUM 65535
-
-#define DEVICE_ENTRY_LABEL 0x1234
-#define LABEL_END 0xffff
-
-#define KEY_INITIATOR_NAME 0x101
-#define KEY_DHCP_ENABLE 0x102
-#define KEY_LOCAL_IP 0x103
-#define KEY_SUBNET_MASK 0x104
-#define KEY_GATE_WAY 0x105
-#define KEY_TARGET_IP 0x106
-#define KEY_CHAP_NAME 0x107
-#define KEY_CHAP_SECRET 0x108
-#define KEY_REVERSE_CHAP_NAME 0x109
-#define KEY_REVERSE_CHAP_SECRET 0x10a
-#define KEY_SAVE_CHANGES 0x10b
-#define KEY_TARGET_NAME 0x10c
-#define KEY_BOOT_LUN 0x10d
-#define KEY_CONFIG_ISID 0x10e
-
-#define KEY_DEVICE_ENTRY_BASE 0x1000
-
-#define ISCSI_LUN_STR_MAX_LEN 21
-#define ISCSI_CHAP_SECRET_MIN_LEN 12
-#define ISCSI_CHAP_SECRET_MAX_LEN 16
-//
-// ISCSI_CHAP_SECRET_STORAGE = ISCSI_CHAP_SECRET_MAX_LEN + sizeof (NULL-Terminator)
-//
-#define ISCSI_CHAP_SECRET_STORAGE 17
-
-#define ISCSI_CHAP_NAME_MAX_LEN 126
-#define ISCSI_CHAP_NAME_STORAGE 127
-
-#define ISID_CONFIGURABLE_MIN_LEN 6
-#define ISID_CONFIGURABLE_MAX_LEN 12
-#define ISID_CONFIGURABLE_STORAGE 13
-
-#pragma pack(1)
-typedef struct {
- CHAR16 InitiatorName[ISCSI_NAME_MAX_SIZE];
-
- UINT8 Enabled;
-
- UINT8 InitiatorInfoFromDhcp;
- CHAR16 LocalIp[IP4_STR_MAX_SIZE];
- CHAR16 SubnetMask[IP4_STR_MAX_SIZE];
- CHAR16 Gateway[IP4_STR_MAX_SIZE];
-
- CHAR16 TargetName[ISCSI_NAME_MAX_SIZE];
- CHAR16 TargetIp[IP4_STR_MAX_SIZE];
- UINT16 TargetPort;
- CHAR16 BootLun[ISCSI_LUN_STR_MAX_LEN];
- UINT8 TargetInfoFromDhcp;
-
- UINT8 CHAPType;
- CHAR16 CHAPName[ISCSI_CHAP_NAME_STORAGE];
- CHAR16 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
- CHAR16 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
- CHAR16 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
-
- CHAR16 IsId[ISID_CONFIGURABLE_STORAGE];
-} ISCSI_CONFIG_IFR_NVDATA;
-#pragma pack()
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h
deleted file mode 100644
index 4c4dcaa8f68d..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/** @file
- The header file of IScsiDhcp.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#ifndef _ISCSI_DHCP_H_
-#define _ISCSI_DHCP_H_
-
-#include <Protocol/Dhcp4.h>
-
-#define ISCSI_ROOT_PATH_ID "iscsi:"
-#define ISCSI_ROOT_PATH_FIELD_DELIMITER ':'
-
-#define RP_FIELD_IDX_SERVERNAME 0
-#define RP_FIELD_IDX_PROTOCOL 1
-#define RP_FIELD_IDX_PORT 2
-#define RP_FIELD_IDX_LUN 3
-#define RP_FIELD_IDX_TARGETNAME 4
-#define RP_FIELD_IDX_MAX 5
-
-typedef struct _ISCSI_ROOT_PATH_FIELD {
- CHAR8 *Str;
- UINT8 Len;
-} ISCSI_ROOT_PATH_FIELD;
-
-/**
- Parse the DHCP ACK to get the address configuration and DNS information.
-
- @param[in] Image The handle of the driver image.
- @param[in] Controller The handle of the controller;
- @param[in, out] ConfigData The session configuration data.
-
- @retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_NO_MEDIA There was a media error.
- @retval Others Other errors as indicated.
-
-**/
-EFI_STATUS
-IScsiDoDhcp (
- IN EFI_HANDLE Image,
- IN EFI_HANDLE Controller,
- IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h
deleted file mode 100644
index d6a619f00fc0..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/** @file
- The header file of IScsiDriver.c.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#ifndef _ISCSI_DRIVER_H_
-#define _ISCSI_DRIVER_H_
-
-#include <Uefi.h>
-#include <Protocol/DevicePath.h>
-#include <Protocol/LoadedImage.h>
-#include <Protocol/HiiConfigAccess.h>
-#include <Protocol/HiiDatabase.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiLib.h>
-#include <Library/DevicePathLib.h>
-#include <Protocol/DriverBinding.h>
-#include <Protocol/ScsiPassThruExt.h>
-
-#define ISCSI_INITIATOR_NAME_VAR_NAME L"I_NAME"
-
-typedef struct _ISCSI_PRIVATE_PROTOCOL {
- UINT32 Reserved;
-} ISCSI_PRIVATE_PROTOCOL;
-
-//
-// EFI Driver Binding Protocol for iSCSI driver.
-//
-
-/**
- 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[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
- @param[in] 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[in] 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 acces.
- Currently not implemented.
- @retval EFI_UNSUPPORTED The device specified by ControllerHandle and
- RemainingDevicePath is not supported by the driver specified by This.
-**/
-EFI_STATUS
-EFIAPI
-IScsiDriverBindingSupported (
- 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[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
- @param[in] 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[in] 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_DEVICE_ERROR The device could not be started due to a device error.
- Currently not implemented.
- @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
- @retval Others The driver failded to start the device.
-**/
-EFI_STATUS
-EFIAPI
-IScsiDriverBindingStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
- );
-
-/**
- Stop this driver on ControllerHandle.
-
- Release the control of this controller and remove the IScsi functions. 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[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
- @param[in] 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[in] NumberOfChildren The number of child device handles in ChildHandleBuffer.Not used.
- @param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL
- if NumberOfChildren is 0.Not used.
-
- @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
-IScsiDriverBindingStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
deleted file mode 100644
index 48729e3029f7..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
+++ /dev/null
@@ -1,134 +0,0 @@
-## @file
-# This module produces EFI iSCSI Initiator Name Protocol.
-#
-# This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol
-# and EFI DHCPv4 Protocol, to provide the capability to do the transport for SCSI
-# data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide
-# one way to configurate the iSCSI setting. This driver only supports IPv4 network
-# stack.
-#
-# Notes:
-# 1) This driver can't co-work with the IScsiDxe driver in NetworkPkg.
-# 2) This driver might have some issues that have been fixed in the IScsiDxe driver
-# in NetworkPkg.
-# 3) This driver supports fewer features than the IScsiDxe driver in NetworkPkg
-# (e.g. IPv6, Dns support for target URL configuration, iSCSI keyword support).
-# 4) IScsiDxe driver in NetworkPkg is recommended for use instead of this one even
-# though both of them can be used.
-#
-# Copyright (c) 2004 - 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 = IScsi4Dxe
- MODULE_UNI_FILE = IScsi4Dxe.uni
- FILE_GUID = 4579B72D-7EC4-4dd4-8486-083C86B182A7
- MODULE_TYPE = UEFI_DRIVER
- VERSION_STRING = 1.0
- ENTRY_POINT = IScsiDriverEntryPoint
- UNLOAD_IMAGE = EfiIScsiUnload
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-# VALID_ARCHITECTURES = IA32 X64 EBC
-#
-# DRIVER_BINDING = gIScsiDriverBinding
-# COMPONENT_NAME = gIScsiComponentName
-# COMPONENT_NAME2 = gIScsiComponentName2
-#
-
-[Sources]
- IScsiTcp4Io.h
- IScsiProto.h
- IScsiMisc.h
- IScsiIbft.h
- IScsiExtScsiPassThru.h
- IScsiDriver.h
- IScsiDhcp.h
- IScsiCommon.h
- IScsiCHAP.h
- IScsiInitiatorName.h
- ComponentName.h
- Md5.h
- IScsiTcp4Io.c
- IScsiProto.c
- IScsiMisc.c
- IScsiInitiatorName.c
- IScsiIbft.c
- IScsiExtScsiPassThru.c
- IScsiDriver.c
- IScsiDhcp.c
- IScsiCHAP.c
- ComponentName.c
- Md5.c
- IScsiConfigDxeStrings.uni
- IScsiConfigDxe.vfr
- IScsiConfig.c
- IScsiConfig.h
- IScsiImpl.h
- IScsiConfigNVDataStruc.h
-
-[Packages]
- MdePkg/MdePkg.dec
- MdeModulePkg/MdeModulePkg.dec
-
-[LibraryClasses]
- UefiDriverEntryPoint
- UefiLib
- BaseLib
- UefiBootServicesTableLib
- UefiRuntimeServicesTableLib
- BaseMemoryLib
- MemoryAllocationLib
- DevicePathLib
- DebugLib
- PrintLib
- HiiLib
- NetLib
-
-[Protocols]
- ## PRODUCES
- ## UNDEFINED # Variable
- gEfiIScsiInitiatorNameProtocolGuid
- gEfiExtScsiPassThruProtocolGuid ## BY_START
- gEfiTcp4ProtocolGuid ## TO_START
- gEfiTcp4ServiceBindingProtocolGuid ## TO_START
- gEfiDhcp4ProtocolGuid ## TO_START
- gEfiDhcp4ServiceBindingProtocolGuid ## TO_START
- ## TO_START
- ## PRODUCES
- gEfiDevicePathProtocolGuid
- gEfiHiiConfigAccessProtocolGuid ## PRODUCES
- gEfiHiiDatabaseProtocolGuid ## CONSUMES
- gEfiPciIoProtocolGuid ## SOMETIMES_CONSUMES
- gEfiAcpiTableProtocolGuid ## SOMETIMES_CONSUMES
-
-[Guids]
- gEfiEventExitBootServicesGuid ## SOMETIMES_CONSUMES ## Event
- gEfiIfrTianoGuid ## SOMETIMES_PRODUCES ## UNDEFINED
- gEfiAcpiTableGuid ## SOMETIMES_CONSUMES ## SystemTable
- gEfiAcpi10TableGuid ## SOMETIMES_CONSUMES ## SystemTable
- ## SOMETIMES_PRODUCES ## Variable:L"iSCSIDeviceList"
- ## SOMETIMES_CONSUMES ## Variable:L"iSCSIDeviceList"
- ## SOMETIMES_CONSUMES ## UNDEFINED # HiiIsConfigHdrMatch mVendorStorageName
- ## SOMETIMES_PRODUCES ## UNDEFINED # HiiConstructConfigHdr mVendorStorageName
- ## SOMETIMES_PRODUCES ## UNDEFINED # HiiGetBrowserData mVendorStorageName
- ## SOMETIMES_CONSUMES ## UNDEFINED # HiiSetBrowserData mVendorStorageName
- ## SOMETIMES_CONSUMES ## HII
- gIp4IScsiConfigGuid
- ## SOMETIMES_PRODUCES ## Variable
- ## SOMETIMES_CONSUMES ## Variable
- gIScsiCHAPAuthInfoGuid
-
-[UserExtensions.TianoCore."ExtraFiles"]
- IScsi4DxeExtra.uni
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h
deleted file mode 100644
index e635e47b9292..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/** @file
- The header file of IScsiExtScsiPassThru.c.
-
-Copyright (c) 2004 - 2008, 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.
-
-**/
-
-#ifndef _ISCSI_EXT_SCSI_PASS_THRU_H_
-#define _ISCSI_EXT_SCSI_PASS_THRU_H_
-
-#include <Protocol/ScsiPassThruExt.h>
-
-extern EFI_EXT_SCSI_PASS_THRU_PROTOCOL gIScsiExtScsiPassThruProtocolTemplate;
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h
deleted file mode 100644
index 4f3828db63c6..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/** @file
- Some extra definitions for iBFT.
-
-Copyright (c) 2004 - 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
-
-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 _ISCSI_IBFT_H_
-#define _ISCSI_IBFT_H_
-
-#include <IndustryStandard/Acpi.h>
-#include <IndustryStandard/IScsiBootFirmwareTable.h>
-#include <Protocol/AcpiTable.h>
-#include <Protocol/PciIo.h>
-
-#define IBFT_TABLE_VAR_NAME L"iBFT"
-#define IBFT_MAX_SIZE 4096
-#define IBFT_HEAP_OFFSET 2048
-
-#define IBFT_ROUNDUP(size) NET_ROUNDUP ((size), EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_STRUCTURE_ALIGNMENT)
-
-/**
- Publish and remove the iSCSI Boot Firmware Table according to the iSCSI
- session status.
-**/
-VOID
-IScsiPublishIbft (
- VOID
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h
deleted file mode 100644
index 8a5ee2149eb2..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/** @file
- The header file of IScsiImpl.c.
-
-Copyright (c) 2004 - 2016, 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.
-
-**/
-
-#ifndef _ISCSI_IMPL_H_
-#define _ISCSI_IMPL_H_
-
-#include <Uefi.h>
-
-#include <IndustryStandard/Dhcp.h>
-
-#include <Library/BaseMemoryLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/NetLib.h>
-#include <Library/PrintLib.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-
-#include <Guid/EventGroup.h>
-
-#include "IScsiCommon.h"
-#include "IScsiDriver.h"
-#include "IScsiInitiatorName.h"
-#include "ComponentName.h"
-#include "IScsiConfigNVDataStruc.h"
-#include "IScsiExtScsiPassThru.h"
-#include "IScsiProto.h"
-#include "IScsiMisc.h"
-#include "IScsiCHAP.h"
-#include "IScsiConfig.h"
-#include "IScsiDhcp.h"
-#include "IScsiTcp4Io.h"
-#include "IScsiIbft.h"
-
-
-#define ISCSI_SESSION_SIGNATURE SIGNATURE_32 ('I', 'S', 'S', 'N')
-
-struct _ISCSI_SESSION {
- UINT32 Signature;
-
- ISCSI_SESSION_CONFIG_DATA ConfigData;
- ISCSI_CHAP_AUTH_DATA AuthData;
-
- CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE];
- UINTN InitiatorNameLength;
- UINT8 State;
-
- UINT8 Isid[6];
- UINT16 Tsih;
-
- UINT32 CmdSN;
- UINT32 ExpCmdSN;
- UINT32 MaxCmdSN;
-
- UINT32 InitiatorTaskTag;
- UINT16 NextCid;
-
- LIST_ENTRY Conns;
- UINT32 NumConns;
-
- LIST_ENTRY TcbList;
-
- //
- // session-wide parameters
- //
- UINT16 TargetPortalGroupTag;
- UINT32 MaxConnections;
- BOOLEAN InitialR2T;
- BOOLEAN ImmediateData;
- UINT32 MaxBurstLength;
- UINT32 FirstBurstLength;
- UINT32 DefaultTime2Wait;
- UINT32 DefaultTime2Retain;
- UINT16 MaxOutstandingR2T;
- BOOLEAN DataPDUInOrder;
- BOOLEAN DataSequenceInOrder;
- UINT8 ErrorRecoveryLevel;
-};
-
-#define ISCSI_CONNECTION_SIGNATURE SIGNATURE_32 ('I', 'S', 'C', 'N')
-
-struct _ISCSI_CONNECTION {
- UINT32 Signature;
- LIST_ENTRY Link;
-
- EFI_EVENT TimeoutEvent;
-
- ISCSI_SESSION *Session;
-
- UINT8 State;
- UINT8 CurrentStage;
- UINT8 NextStage;
-
- UINT8 CHAPStep;
-
- BOOLEAN PartialReqSent;
- BOOLEAN PartialRspRcvd;
-
- BOOLEAN TransitInitiated;
-
- UINT16 Cid;
- UINT32 ExpStatSN;
-
- //
- // queues...
- //
- NET_BUF_QUEUE RspQue;
-
- TCP4_IO Tcp4Io;
-
- //
- // connection-only parameters
- //
- UINT32 MaxRecvDataSegmentLength;
- ISCSI_DIGEST_TYPE HeaderDigest;
- ISCSI_DIGEST_TYPE DataDigest;
-};
-
-#define ISCSI_DRIVER_DATA_SIGNATURE SIGNATURE_32 ('I', 'S', 'D', 'A')
-
-#define ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU(PassThru) \
- CR ( \
- PassThru, \
- ISCSI_DRIVER_DATA, \
- IScsiExtScsiPassThru, \
- ISCSI_DRIVER_DATA_SIGNATURE \
- )
-#define ISCSI_DRIVER_DATA_FROM_IDENTIFIER(Identifier) \
- CR ( \
- Identifier, \
- ISCSI_DRIVER_DATA, \
- IScsiIdentifier, \
- ISCSI_DRIVER_DATA_SIGNATURE \
- )
-#define ISCSI_DRIVER_DATA_FROM_SESSION(s) \
- CR ( \
- s, \
- ISCSI_DRIVER_DATA, \
- Session, \
- ISCSI_DRIVER_DATA_SIGNATURE \
- )
-
-struct _ISCSI_DRIVER_DATA {
- UINT32 Signature;
- EFI_HANDLE Image;
- EFI_HANDLE Controller;
- ISCSI_PRIVATE_PROTOCOL IScsiIdentifier;
- EFI_HANDLE ChildHandle;
- EFI_EVENT ExitBootServiceEvent;
-
- EFI_EXT_SCSI_PASS_THRU_PROTOCOL IScsiExtScsiPassThru;
- EFI_EXT_SCSI_PASS_THRU_MODE ExtScsiPassThruMode;
- EFI_HANDLE ExtScsiPassThruHandle;
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;
-
- ISCSI_SESSION Session;
-};
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h
deleted file mode 100644
index f967fb383095..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/** @file
- The header file for EFI iSCSI Initiator Name Protocol.
-
-Copyright (c) 2004 - 2008, 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.
-
-**/
-
-#ifndef _ISCSI_INITIATOR_NAME_H_
-#define _ISCSI_INITIATOR_NAME_H_
-
-#include <Protocol/IScsiInitiatorName.h>
-
-extern EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName;
-
-//
-// EFI iSCSI Initiator Name Protocol for IScsi driver.
-//
-
-/**
- Retrieves the current set value of iSCSI Initiator Name.
-
- @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
- @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer / Actual size of the
- variable data buffer.
- @param[out] Buffer Pointer to the buffer for data to be read.
-
- @retval EFI_SUCCESS Data was successfully retrieved into the provided buffer and the
- BufferSize was sufficient to handle the iSCSI initiator name.
- @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result.
- @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
- @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be retrieved due to a hardware error.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiGetInitiatorName (
- IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
- IN OUT UINTN *BufferSize,
- OUT VOID *Buffer
- );
-
-/**
- Sets the iSCSI Initiator Name.
-
- @param[in] This Pointer to the EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
- @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer.
- @param[in] Buffer Pointer to the buffer for data to be written.
-
- @retval EFI_SUCCESS Data was successfully stored by the protocol.
- @retval EFI_UNSUPPORTED Platform policies do not allow for data to be written.
- Currently not implemented.
- @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize exceeds the maximum allowed limit.
- @retval EFI_DEVICE_ERROR The data could not be stored due to a hardware error.
- @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the data.
- @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not adhere to RFC 3720
- (and other related protocols).
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-EFIAPI
-IScsiSetInitiatorName (
- IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
- IN OUT UINTN *BufferSize,
- IN VOID *Buffer
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h
deleted file mode 100644
index 500e00373b25..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h
+++ /dev/null
@@ -1,317 +0,0 @@
-/** @file
- Miscellaneous definitions for iSCSI driver.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#ifndef _ISCSI_MISC_H_
-#define _ISCSI_MISC_H_
-
-#include <Library/BaseLib.h>
-
-typedef struct _ISCSI_SESSION_CONFIG_DATA ISCSI_SESSION_CONFIG_DATA;
-
-///
-/// IPv4 Device Path Node Length
-///
-#define IP4_NODE_LEN_NEW_VERSIONS 27
-
-#pragma pack(1)
-typedef struct {
- BOOLEAN Enabled;
-
- BOOLEAN InitiatorInfoFromDhcp;
- EFI_IPv4_ADDRESS LocalIp;
- EFI_IPv4_ADDRESS SubnetMask;
- EFI_IPv4_ADDRESS Gateway;
-
- BOOLEAN TargetInfoFromDhcp;
- CHAR8 TargetName[ISCSI_NAME_MAX_SIZE];
- EFI_IPv4_ADDRESS TargetIp;
- UINT16 TargetPort;
- UINT8 BootLun[8];
-
- UINT8 IsId[6];
-} ISCSI_SESSION_CONFIG_NVDATA;
-#pragma pack()
-
-struct _ISCSI_SESSION_CONFIG_DATA {
- ISCSI_SESSION_CONFIG_NVDATA NvData;
-
- EFI_IPv4_ADDRESS PrimaryDns;
- EFI_IPv4_ADDRESS SecondaryDns;
- EFI_IPv4_ADDRESS DhcpServer;
-};
-
-/**
- Calculate the prefix length of the IPv4 subnet mask.
-
- @param[in] SubnetMask The IPv4 subnet mask.
-
- @return The prefix length of the subnet mask.
- @retval 0 Other errors as indicated.
-**/
-UINT8
-IScsiGetSubnetMaskPrefixLength (
- IN EFI_IPv4_ADDRESS *SubnetMask
- );
-
-/**
- Convert the hexadecimal encoded LUN string into the 64-bit LUN.
-
- @param[in] Str The hexadecimal encoded LUN string.
- @param[out] Lun Storage to return the 64-bit LUN.
-
- @retval EFI_SUCCESS The 64-bit LUN is stored in Lun.
- @retval EFI_INVALID_PARAMETER The string is malformatted.
-**/
-EFI_STATUS
-IScsiAsciiStrToLun (
- IN CHAR8 *Str,
- OUT UINT8 *Lun
- );
-
-/**
- Convert the 64-bit LUN into the hexadecimal encoded LUN string.
-
- @param[in] Lun The 64-bit LUN.
- @param[out] Str The storage to return the hexadecimal encoded LUN string.
-**/
-VOID
-IScsiLunToUnicodeStr (
- IN UINT8 *Lun,
- OUT CHAR16 *Str
- );
-
-/**
- Convert the ASCII string into a UNICODE string.
-
- @param[in] Source The ASCII string.
- @param[out] Destination The storage to return the UNICODE string.
-
- @return CHAR16 * Pointer to the UNICODE string.
-**/
-CHAR16 *
-IScsiAsciiStrToUnicodeStr (
- IN CHAR8 *Source,
- OUT CHAR16 *Destination
- );
-
-/**
- Convert the UNICODE string into an ASCII string.
-
- @param[in] Source The UNICODE string.
- @param[out] Destination The storage to return the ASCII string.
-
- @return CHAR8 * Pointer to the ASCII string.
-**/
-CHAR8 *
-IScsiUnicodeStrToAsciiStr (
- IN CHAR16 *Source,
- OUT CHAR8 *Destination
- );
-
-/**
- Convert the mac address into a hexadecimal encoded "-" seperated string.
-
- @param[in] Mac The mac address.
- @param[in] Len Length in bytes of the mac address.
- @param[in] VlanId VLAN ID of the network device.
- @param[out] Str The storage to return the mac string.
-**/
-VOID
-IScsiMacAddrToStr (
- IN EFI_MAC_ADDRESS *Mac,
- IN UINT32 Len,
- IN UINT16 VlanId,
- OUT CHAR16 *Str
- );
-
-/**
- Convert the decimal dotted IPv4 address into the binary IPv4 address.
-
- @param[in] Str The UNICODE string.
- @param[out] Ip The storage to return the ASCII string.
-
- @retval EFI_SUCCESS The binary IP address is returned in Ip.
- @retval EFI_INVALID_PARAMETER The IP string is malformatted.
-**/
-EFI_STATUS
-IScsiAsciiStrToIp (
- IN CHAR8 *Str,
- OUT EFI_IPv4_ADDRESS *Ip
- );
-
-/**
- Convert the binary encoded buffer into a hexadecimal encoded string.
-
- @param[in] BinBuffer The buffer containing the binary data.
- @param[in] BinLength Length of the binary buffer.
- @param[in, out] HexStr Pointer to the string.
- @param[in, out] HexLength The length of the string.
-
- @retval EFI_SUCCESS The binary data is converted to the hexadecimal string
- and the length of the string is updated.
- @retval EFI_BUFFER_TOO_SMALL The string is too small.
- @retval EFI_INVALID_PARAMETER The IP string is malformatted.
-**/
-EFI_STATUS
-IScsiBinToHex (
- IN UINT8 *BinBuffer,
- IN UINT32 BinLength,
- IN OUT CHAR8 *HexStr,
- IN OUT UINT32 *HexLength
- );
-
-/**
- Convert the hexadecimal string into a binary encoded buffer.
-
- @param[in, out] BinBuffer The binary buffer.
- @param[in, out] BinLength Length of the binary buffer.
- @param[in] HexStr The hexadecimal string.
-
- @retval EFI_SUCCESS The hexadecimal string is converted into a binary
- encoded buffer.
- @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the converted data.
-**/
-EFI_STATUS
-IScsiHexToBin (
- IN OUT UINT8 *BinBuffer,
- IN OUT UINT32 *BinLength,
- IN CHAR8 *HexStr
- );
-
-/**
- Generate random numbers.
-
- @param[in, out] Rand The buffer to contain random numbers.
- @param[in] RandLength The length of the Rand buffer.
-**/
-VOID
-IScsiGenRandom (
- IN OUT UINT8 *Rand,
- IN UINTN RandLength
- );
-
-/**
- Create the iSCSI driver data..
-
- @param[in] Image The handle of the driver image.
- @param[in] Controller The handle of the controller.
-
- @return The iSCSI driver data created.
- @retval NULL Other errors as indicated.
-**/
-ISCSI_DRIVER_DATA *
-IScsiCreateDriverData (
- IN EFI_HANDLE Image,
- IN EFI_HANDLE Controller
- );
-
-/**
- Clean the iSCSI driver data.
-
- @param[in] Private The iSCSI driver data.
-
- @retval EFI_SUCCES The clean operation is successful.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiCleanDriverData (
- IN ISCSI_DRIVER_DATA *Private
- );
-
-/**
- Check wheather the Controller is configured to use DHCP protocol.
-
- @param[in] Controller The handle of the controller.
-
- @retval TRUE The handle of the controller need the Dhcp protocol.
- @retval FALSE The handle of the controller does not need the Dhcp protocol.
-
-**/
-BOOLEAN
-IScsiDhcpIsConfigured (
- IN EFI_HANDLE Controller
- );
-
-/**
- Get the various configuration data of this iSCSI instance.
-
- @param[in] Private The iSCSI driver data.
-
- @retval EFI_SUCCESS The configuration of this instance is got.
- @retval EFI_ABORTED The operation was aborted.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiGetConfigData (
- IN ISCSI_DRIVER_DATA *Private
- );
-
-/**
- Get the device path of the iSCSI tcp connection and update it.
-
- @param[in] Private The iSCSI driver data.
-
- @return The updated device path.
- @retval NULL Other errors as indicated.
-**/
-EFI_DEVICE_PATH_PROTOCOL *
-IScsiGetTcpConnDevicePath (
- IN ISCSI_DRIVER_DATA *Private
- );
-
-/**
- Abort the session when the transition from BS to RT is initiated.
-
- @param[in] Event The event signaled.
- @param[in] Context The iSCSI driver data.
-**/
-VOID
-EFIAPI
-IScsiOnExitBootService (
- IN EFI_EVENT Event,
- IN VOID *Context
- );
-
-/**
- Tests whether a controller handle is being managed by IScsi driver.
-
- This function tests whether the driver specified by DriverBindingHandle is
- currently managing the controller specified by ControllerHandle. This test
- is performed by evaluating if the the protocol specified by ProtocolGuid is
- present on ControllerHandle and is was opened by DriverBindingHandle and Nic
- Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER.
- If ProtocolGuid is NULL, then ASSERT().
-
- @param ControllerHandle A handle for a controller to test.
- @param DriverBindingHandle Specifies the driver binding handle for the
- driver.
- @param ProtocolGuid Specifies the protocol that the driver specified
- by DriverBindingHandle opens in its Start()
- function.
-
- @retval EFI_SUCCESS ControllerHandle is managed by the driver
- specified by DriverBindingHandle.
- @retval EFI_UNSUPPORTED ControllerHandle is not managed by the driver
- specified by DriverBindingHandle.
-
-**/
-EFI_STATUS
-EFIAPI
-IScsiTestManagedDevice (
- IN EFI_HANDLE ControllerHandle,
- IN EFI_HANDLE DriverBindingHandle,
- IN EFI_GUID *ProtocolGuid
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h
deleted file mode 100644
index 6469df0434a1..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h
+++ /dev/null
@@ -1,1005 +0,0 @@
-/** @file
- The header file of iSCSI Protocol that defines many specific data structures.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#ifndef _ISCSI_PROTO_H_
-#define _ISCSI_PROTO_H_
-
-#include <Protocol/ScsiPassThruExt.h>
-
-//
-// RFC 1982 Serial Number Arithmetic, SERIAL_BITS = 32
-//
-#define ISCSI_SEQ_EQ(s1, s2) ((s1) == (s2))
-#define ISCSI_SEQ_LT(s1, s2) \
- ( \
- (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) < ((UINT32) 1 << 31)) || \
- (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) > ((UINT32) 1 << 31)) \
- )
-#define ISCSI_SEQ_GT(s1, s2) \
- ( \
- (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) > ((UINT32) 1 << 31)) || \
- (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) < ((UINT32) 1 << 31)) \
- )
-
-#define ISCSI_WELL_KNOWN_PORT 3260
-#define ISCSI_MAX_CONNS_PER_SESSION 1
-
-#define DEFAULT_MAX_RECV_DATA_SEG_LEN 8192
-#define MAX_RECV_DATA_SEG_LEN_IN_FFP 65536
-#define DEFAULT_MAX_OUTSTANDING_R2T 1
-
-#define ISCSI_VERSION_MAX 0x00
-#define ISCSI_VERSION_MIN 0x00
-
-#define ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
-#define ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
-
-#define ISCSI_KEY_AUTH_METHOD "AuthMethod"
-#define ISCSI_KEY_HEADER_DIGEST "HeaderDigest"
-#define ISCSI_KEY_DATA_DIGEST "DataDigest"
-#define ISCSI_KEY_MAX_CONNECTIONS "MaxConnections"
-#define ISCSI_KEY_TARGET_NAME "TargetName"
-#define ISCSI_KEY_INITIATOR_NAME "InitiatorName"
-#define ISCSI_KEY_TARGET_ALIAS "TargetAlias"
-#define ISCSI_KEY_INITIATOR_ALIAS "InitiatorAlias"
-#define ISCSI_KEY_TARGET_ADDRESS "TargetAddress"
-#define ISCSI_KEY_INITIAL_R2T "InitialR2T"
-#define ISCSI_KEY_IMMEDIATE_DATA "ImmediateData"
-#define ISCSI_KEY_TARGET_PORTAL_GROUP_TAG "TargetPortalGroupTag"
-#define ISCSI_KEY_MAX_BURST_LENGTH "MaxBurstLength"
-#define ISCSI_KEY_FIRST_BURST_LENGTH "FirstBurstLength"
-#define ISCSI_KEY_DEFAULT_TIME2WAIT "DefaultTime2Wait"
-#define ISCSI_KEY_DEFAULT_TIME2RETAIN "DefaultTime2Retain"
-#define ISCSI_KEY_MAX_OUTSTANDING_R2T "MaxOutstandingR2T"
-#define ISCSI_KEY_DATA_PDU_IN_ORDER "DataPDUInOrder"
-#define ISCSI_KEY_DATA_SEQUENCE_IN_ORDER "DataSequenceInOrder"
-#define ISCSI_KEY_ERROR_RECOVERY_LEVEL "ErrorRecoveryLevel"
-#define ISCSI_KEY_SESSION_TYPE "SessionType"
-#define ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH "MaxRecvDataSegmentLength"
-
-#define ISCSI_KEY_VALUE_NONE "None"
-
-///
-/// connection state for initiator
-///
-
-#define CONN_STATE_FREE 0
-#define CONN_STATE_XPT_WAIT 1
-#define CONN_STATE_IN_LOGIN 2
-#define CONN_STATE_LOGGED_IN 3
-#define CONN_STATE_IN_LOGOUT 4
-#define CONN_STATE_LOGOUT_REQUESTED 5
-#define CONN_STATE_CLEANUP_WAIT 6
-#define CONN_STATE_IN_CLEANUP 7
-
-///
-/// session state for initiator
-///
-#define SESSION_STATE_FREE 0
-#define SESSION_STATE_LOGGED_IN 1
-#define SESSION_STATE_FAILED 2
-
-typedef enum {
- DataIn = 0,
- DataOut = 1,
- DataBi = 2
-} DATA_DIRECTION;
-
-#define ISCSI_RESERVED_TAG 0xffffffff
-
-#define ISCSI_REQ_IMMEDIATE 0x40
-#define ISCSI_OPCODE_MASK 0x3F
-
-#define ISCSI_SET_OPCODE(PduHdr, Op, Flgs) ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) = ((Op) | (Flgs)))
-#define ISCSI_GET_OPCODE(PduHdr) ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) & ISCSI_OPCODE_MASK)
-#define ISCSI_CHECK_OPCODE(PduHdr, Op) ((((PduHdr)->OpCode) & ISCSI_OPCODE_MASK) == (Op))
-#define ISCSI_IMMEDIATE_ON(PduHdr) ((PduHdr)->OpCode & ISCSI_REQ_IMMEDIATE)
-#define ISCSI_SET_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *) (PduHdr))->Flags |= (BOOLEAN)(Flag))
-#define ISCSI_CLEAR_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *) (PduHdr))->Flags &= ~(Flag))
-#define ISCSI_FLAG_ON(PduHdr, Flag) ((((ISCSI_BASIC_HEADER *) (PduHdr))->Flags & (Flag)) == (Flag))
-#define ISCSI_SET_STAGES(PduHdr, Cur, Nxt) ((PduHdr)->Flags = (UINT8) ((PduHdr)->Flags | ((Cur) << 2 | (Nxt))))
-#define ISCSI_GET_CURRENT_STAGE(PduHdr) (((PduHdr)->Flags >> 2) & 0x3)
-#define ISCSI_GET_NEXT_STAGE(PduHdr) (((PduHdr)->Flags) & 0x3)
-
-#define ISCSI_GET_PAD_LEN(DataLen) ((~(DataLen) + 1) & 0x3)
-#define ISCSI_ROUNDUP(DataLen) (((DataLen) + 3) &~(0x3))
-
-#define HTON24(Dst, Src) \
- do { \
- (Dst)[0] = (UINT8) (((Src) >> 16) & 0xFF); \
- (Dst)[1] = (UINT8) (((Src) >> 8) & 0xFF); \
- (Dst)[2] = (UINT8) ((Src) & 0xFF); \
- } while (0);
-
-#define NTOH24(src) (((src)[0] << 16) | ((src)[1] << 8) | ((src)[2]))
-
-#define ISCSI_GET_DATASEG_LEN(PduHdr) NTOH24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength)
-#define ISCSI_SET_DATASEG_LEN(PduHdr, Len) HTON24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength, (Len))
-
-//
-// initiator opcodes
-//
-#define ISCSI_OPCODE_NOP_OUT 0x00
-#define ISCSI_OPCODE_SCSI_CMD 0x01
-#define ISCSI_OPCODE_SCSI_TMF_REQ 0x02
-#define ISCSI_OPCODE_LOGIN_REQ 0x03
-#define ISCSI_OPCODE_TEXT_REQ 0x04
-#define ISCSI_OPCODE_SCSI_DATA_OUT 0x05
-#define ISCSI_OPCODE_LOGOUT_REQ 0x06
-#define ISCSI_OPCODE_SNACK_REQ 0x10
-#define ISCSI_OPCODE_VENDOR_I0 0x1c
-#define ISCSI_OPCODE_VENDOR_I1 0x1d
-#define ISCSI_OPCODE_VENDOR_I2 0x1e
-
-//
-// target opcodes
-//
-#define ISCSI_OPCODE_NOP_IN 0x20
-#define ISCSI_OPCODE_SCSI_RSP 0x21
-#define ISCSI_OPCODE_SCSI_TMF_RSP 0x22
-#define ISCSI_OPCODE_LOGIN_RSP 0x23
-#define ISCSI_OPCODE_TEXT_RSP 0x24
-#define ISCSI_OPCODE_SCSI_DATA_IN 0x25
-#define ISCSI_OPCODE_LOGOUT_RSP 0x26
-#define ISCSI_OPCODE_R2T 0x31
-#define ISCSI_OPCODE_ASYNC_MSG 0x32
-#define ISCSI_OPCODE_VENDOR_T0 0x3c
-#define ISCSI_OPCODE_VENDOR_T1 0x3d
-#define ISCSI_OPCODE_VENDOR_T2 0x3e
-#define ISCSI_OPCODE_REJECT 0x3f
-
-#define ISCSI_BHS_FLAG_FINAL 0x80
-
-///
-/// iSCSI Basic Header Segment
-///
-typedef struct _ISCSI_BASIC_HEADER {
- UINT8 OpCode;
- UINT8 Flags;
- UINT16 OpCodeSpecific1;
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT8 Lun[8];
- UINT32 InitiatorTaskTag;
- UINT32 OpCodeSpecific2[7];
-} ISCSI_BASIC_HEADER;
-
-//
-// Defined AHS types, others are reserved.
-//
-#define ISCSI_AHS_TYPE_EXT_CDB 0x1
-#define ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN 0x2
-
-typedef struct _ISCSI_ADDTIONAL_HEADER {
- UINT16 Length;
- UINT8 Type;
- UINT8 TypeSpecific[1];
-} ISCSI_ADDITIONAL_HEADER;
-
-typedef struct _ISCSI_BI_EXP_READ_DATA_LEN_AHS {
- UINT16 Length;
- UINT8 Type;
- UINT8 Reserved;
- UINT32 ExpReadDataLength;
-} ISCSI_BI_EXP_READ_DATA_LEN_AHS;
-
-#define SCSI_CMD_PDU_FLAG_READ 0x40
-#define SCSI_CMD_PDU_FLAG_WRITE 0x20
-
-#define ISCSI_CMD_PDU_TASK_ATTR_MASK 0x07
-
-//
-// task attributes
-//
-#define ISCSI_TASK_ATTR_UNTAGGED 0x00
-#define ISCSI_TASK_ATTR_SIMPLE 0x01
-#define ISCSI_TASK_ATTR_ORDERD 0x02
-#define ISCSI_TASK_ATTR_HOQ 0x03
-#define ISCSI_TASK_ATTR_ACA 0x04
-
-///
-/// SCSI Command
-///
-typedef struct _SCSI_COMMAND {
- UINT8 OpCode;
- UINT8 Flags;
- UINT16 Reserved;
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT8 Lun[8];
- UINT32 InitiatorTaskTag;
- UINT32 ExpDataXferLength;
- UINT32 CmdSN;
- UINT32 ExpStatSN;
- UINT8 Cdb[16];
-} SCSI_COMMAND;
-
-//
-// flag bit definitions in SCSI response
-//
-#define SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW 0x10
-#define SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW 0x08
-#define SCSI_RSP_PDU_FLAG_OVERFLOW 0x04
-#define SCSI_RSP_PDU_FLAG_UNDERFLOW 0x02
-
-//
-// iSCSI service response codes
-//
-#define ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET 0x00
-#define ISCSI_SERVICE_RSP_TARGET_FAILURE 0x01
-
-///
-/// SCSI Response
-///
-typedef struct _SCSI_RESPONSE {
- UINT8 OpCode;
- UINT8 Flags;
- UINT8 Response;
- UINT8 Status;
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT8 Reserved[8];
- UINT32 InitiatorTaskTag;
- UINT32 SNACKTag;
- UINT32 StatSN;
- UINT32 ExpCmdSN;
- UINT32 MaxCmdSN;
- UINT32 ExpDataSN;
- UINT32 BiReadResidualCount;
- UINT32 ResidualCount;
-} SCSI_RESPONSE;
-
-typedef struct _ISCSI_SENSE_DATA {
- UINT16 Length;
- UINT8 Data[2];
-} ISCSI_SENSE_DATA;
-
-///
-/// iSCSI Task Managment Function Request
-///
-typedef struct _ISCSI_TMF_REQUEST {
- UINT8 OpCode;
- UINT8 Fuction;
- UINT16 Reserved1;
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT8 Lun[8];
- UINT32 InitiatorTaskTag;
- UINT32 ReferencedTaskTag;
- UINT32 CmdSN;
- UINT32 ExpStatSN;
- UINT32 RefCmdSN;
- UINT32 ExpDataSN;
- UINT32 Reserved2[2];
-} ISCSI_TMF_REQUEST;
-
-#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_COMPLETE 0
-#define ISCSI_TMF_RSP_PDU_RSP_TASK_NOT_EXIST 1
-#define ISCSI_TMF_RSP_PDU_RSP_LUN_NOT_EXIST 2
-#define ISCSI_TMF_RSP_PDU_RSP_TASK_STILL_ALLEGIANT 3
-#define ISCSI_TMF_RSP_PDU_RSP_TASK_REASSGIN_NOT_SUPPORTED 4
-#define ISCSI_TMF_RSP_PDU_RSP_NOT_SUPPORTED 5
-#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_AHTH_FAILED 6
-#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_REJECTED 255
-
-///
-/// iSCSI Task Management Function Response
-///
-typedef struct _ISCSI_TMF_RESPONSE {
- UINT8 OpCode;
- UINT8 Reserved1;
- UINT8 Response;
- UINT8 Reserved2;
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT32 Reserver3[2];
- UINT32 InitiatorTaskTag;
- UINT32 Reserved4;
- UINT32 StatSN;
- UINT32 ExpCmdSN;
- UINT32 MaxCmdSN;
- UINT32 Reserved[3];
-} ISCSI_TMF_RESPONSE;
-
-///
-/// SCSI Data-Out
-///
-typedef struct _ISCSI_SCSI_DATA_OUT {
- UINT8 OpCode;
- UINT8 Reserved1[3];
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT8 Lun[8];
- UINT32 InitiatorTaskTag;
- UINT32 TargetTransferTag;
- UINT32 Reserved2;
- UINT32 ExpStatSN;
- UINT32 Reserved3;
- UINT32 DataSN;
- UINT32 BufferOffset;
- UINT32 Reserved4;
-} ISCSI_SCSI_DATA_OUT;
-
-#define SCSI_DATA_IN_PDU_FLAG_ACKKNOWLEDGE 0x40
-#define SCSI_DATA_IN_PDU_FLAG_OVERFLOW SCSI_RSP_PDU_FLAG_OVERFLOW
-#define SCSI_DATA_IN_PDU_FLAG_UNDERFLOW SCSI_RSP_PDU_FLAG_UNDERFLOW
-#define SCSI_DATA_IN_PDU_FLAG_STATUS_VALID 0x01
-
-///
-/// SCSI Data-In
-///
-typedef struct _ISCSI_SCSI_DATA_IN {
- UINT8 OpCode;
- UINT8 Flags;
- UINT8 Reserved1;
- UINT8 Status;
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT8 Lun[8];
- UINT32 InitiatorTaskTag;
- UINT32 TargetTransferTag;
- UINT32 StatSN;
- UINT32 ExpCmdSN;
- UINT32 MaxCmdSN;
- UINT32 DataSN;
- UINT32 BufferOffset;
- UINT32 ResidualCount;
-} ISCSI_SCSI_DATA_IN;
-
-#define ISCSI_GET_BUFFER_OFFSET(PduHdr) NTOHL (((ISCSI_SCSI_DATA_IN *) (PduHdr))->BufferOffset)
-
-///
-/// Ready To Transfer
-///
-typedef struct _ISCSI_READY_TO_TRANSFER {
- UINT8 OpCode;
- UINT8 Reserved1[3];
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT8 Lun[8];
- UINT32 InitiatorTaskTag;
- UINT32 TargetTransferTag;
- UINT32 StatSN;
- UINT32 ExpCmdSN;
- UINT32 MaxCmdSN;
- UINT32 R2TSeqNum;
- UINT32 BufferOffset;
- UINT32 DesiredDataTransferLength;
-} ISCSI_READY_TO_TRANSFER;
-
-typedef struct _ISCSI_ASYNC_MESSAGE {
- UINT8 OpCode;
- UINT8 Reserved1[8];
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT8 Lun[8];
- UINT32 InitiatorTaskTag;
- UINT32 Reserved2;
- UINT32 StatSN;
- UINT32 ExpCmdSN;
- UINT32 MaxCmdSN;
- UINT8 AsyncEvent;
- UINT8 AsyncVCode;
- UINT16 Parameter1;
- UINT16 Parameter2;
- UINT16 Parameter3;
- UINT32 Reserved3;
-} ISCSI_ASYNC_MESSAGE;
-
-#define ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT 0x80
-#define ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE 0x40
-
-///
-/// Login Request
-///
-typedef struct _ISCSI_LOGIN_REQUEST {
- UINT8 OpCode;
- UINT8 Flags;
- UINT8 VersionMax;
- UINT8 VersionMin;
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT8 Isid[6];
- UINT16 Tsih;
- UINT32 InitiatorTaskTag;
- UINT16 Cid;
- UINT16 Reserved1;
- UINT32 CmdSN;
- UINT32 ExpStatSN;
- UINT32 Reserved2[4];
-} ISCSI_LOGIN_REQUEST;
-
-#define ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT
-#define ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE
-
-#define ISCSI_LOGIN_STATUS_SUCCESS 0
-#define ISCSI_LOGIN_STATUS_REDIRECTION 1
-#define ISCSI_LOGIN_STATUS_INITIATOR_ERROR 2
-#define ISCSI_LOGIN_STATUS_TARGET_ERROR 3
-
-///
-/// Login Response
-///
-typedef struct _ISCSI_LOGIN_RESPONSE {
- UINT8 OpCode;
- UINT8 Flags;
- UINT8 VersionMax;
- UINT8 VersionActive;
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT8 Isid[6];
- UINT16 Tsih;
- UINT32 InitiatorTaskTag;
- UINT32 Reserved1;
- UINT32 StatSN;
- UINT32 ExpCmdSN;
- UINT32 MaxCmdSN;
- UINT8 StatusClass;
- UINT8 StatusDetail;
- UINT8 Reserved2[10];
-} ISCSI_LOGIN_RESPONSE;
-
-#define ISCSI_LOGOUT_REASON_CLOSE_SESSION 0
-#define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION 1
-#define ISCSI_LOGOUT_REASON_REMOVE_CONNECTION_FOR_RECOVERY 2
-
-///
-/// Logout Request
-///
-typedef struct _ISCSI_LOGOUT_REQUEST {
- UINT8 OpCode;
- UINT8 ReasonCode;
- UINT16 Reserved1;
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT32 Reserved2[2];
- UINT32 InitiatorTaskTag;
- UINT16 Cid;
- UINT16 Reserved3;
- UINT32 CmdSN;
- UINT32 ExpStatSN;
- UINT32 Reserved4[4];
-} ISCSI_LOGOUT_REQUEST;
-
-#define ISCSI_LOGOUT_RESPONSE_SESSION_CLOSED_SUCCESS 0
-#define ISCSI_LOGOUT_RESPONSE_CID_NOT_FOUND 1
-#define ISCSI_LOGOUT_RESPONSE_RECOVERY_NOT_SUPPORTED 2
-#define ISCSI_LOGOUT_RESPONSE_CLEANUP_FAILED 3
-
-///
-/// Logout Response
-///
-typedef struct _ISCSI_LOGOUT_RESPONSE {
- UINT8 OpCode;
- UINT8 Reserved1;
- UINT8 Response;
- UINT8 Reserved2;
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT32 Reserved3[2];
- UINT32 InitiatorTaskTag;
- UINT32 Reserved4;
- UINT32 StatSN;
- UINT32 ExpCmdSN;
- UINT32 MaxCmdSN;
- UINT32 Reserved5;
- UINT16 Time2Wait;
- UINT16 Time2Retain;
- UINT32 Reserved6;
-} ISCSI_LOGOUT_RESPONSE;
-
-#define ISCSI_SNACK_REQUEST_TYPE_DATA_OR_R2T 0
-#define ISCSI_SNACK_REQUEST_TYPE_STATUS 1
-#define ISCSI_SNACK_REQUEST_TYPE_DATA_ACK 2
-#define ISCSI_SNACK_REQUEST_TYPE_RDATA 3
-
-///
-/// SNACK Request
-///
-typedef struct _ISCSI_SNACK_REQUEST {
- UINT8 OpCode;
- UINT8 Type;
- UINT16 Reserved1;
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT8 Lun[8];
- UINT32 InitiatorTaskTag;
- UINT32 TargetTransferTag;
- UINT32 Reserved2;
- UINT32 ExpStatSN;
- UINT32 Reserved[2];
- UINT32 BegRun;
- UINT32 RunLength;
-} ISCSI_SNACK_REQUEST;
-
-///
-/// Reject
-///
-typedef struct _ISCSI_REJECT {
- UINT8 OpCode;
- UINT8 Reserved1;
- UINT8 Reason;
- UINT8 Reserved2;
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT32 Reserved3[2];
- UINT32 InitiatorTaskTag;
- UINT32 Reserved4;
- UINT32 StatSN;
- UINT32 ExpCmdSN;
- UINT32 MaxCmdSN;
- UINT32 DataSN;
- UINT32 Reserved5[2];
-} ISCSI_REJECT;
-
-///
-/// NOP-Out
-///
-typedef struct _ISCSI_NOP_OUT {
- UINT8 OpCode;
- UINT8 Reserved1[3];
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT8 Lun[8];
- UINT32 InitiatorTaskTag;
- UINT32 TargetTransferTag;
- UINT32 CmdSN;
- UINT32 ExpStatSN;
- UINT32 Reserved2[4];
-} ISCSI_NOP_OUT;
-
-///
-/// NOP-In
-///
-typedef struct _ISCSI_NOP_IN {
- UINT8 OpCode;
- UINT8 Reserved1[3];
- UINT8 TotalAHSLength;
- UINT8 DataSegmentLength[3];
- UINT8 Lun[8];
- UINT32 InitiatorTaskTag;
- UINT32 TargetTransferTag;
- UINT32 StatSN;
- UINT32 ExpCmdSN;
- UINT32 MaxCmdSN;
- UINT32 Reserved2[3];
-} ISCSI_NOP_IN;
-
-#define ISCSI_SECURITY_NEGOTIATION 0
-#define ISCSI_LOGIN_OPERATIONAL_NEGOTIATION 1
-#define ISCSI_FULL_FEATURE_PHASE 3
-
-typedef enum {
- IScsiDigestNone,
- IScsiDigestCRC32
-} ISCSI_DIGEST_TYPE;
-
-typedef struct _ISCSI_XFER_CONTEXT {
- UINT32 TargetTransferTag;
- UINT32 Offset;
- UINT32 DesiredLength;
- UINT32 ExpDataSN;
-} ISCSI_XFER_CONTEXT;
-
-typedef struct _ISCSI_IN_BUFFER_CONTEXT {
- UINT8 *InData;
- UINT32 InDataLen;
-} ISCSI_IN_BUFFER_CONTEXT;
-
-typedef struct _ISCSI_TCB {
- LIST_ENTRY Link;
-
- BOOLEAN SoFarInOrder;
- UINT32 ExpDataSN;
- BOOLEAN FbitReceived;
- BOOLEAN StatusXferd;
- UINT32 ActiveR2Ts;
- UINT32 Response;
- CHAR8 *Reason;
- UINT32 InitiatorTaskTag;
- UINT32 CmdSN;
- UINT32 SNACKTag;
-
- ISCSI_XFER_CONTEXT XferContext;
-
- ISCSI_CONNECTION *Conn;
-} ISCSI_TCB;
-
-typedef struct _ISCSI_KEY_VALUE_PAIR {
- LIST_ENTRY List;
-
- CHAR8 *Key;
- CHAR8 *Value;
-} ISCSI_KEY_VALUE_PAIR;
-
-/**
- Attach the iSCSI connection to the iSCSI session.
-
- @param[in, out] Session The iSCSI session.
- @param[in, out] Conn The iSCSI connection.
-**/
-VOID
-IScsiAttatchConnection (
- IN OUT ISCSI_SESSION *Session,
- IN OUT ISCSI_CONNECTION *Conn
- );
-
-/**
- Detach the iSCSI connection from the session it belongs to.
-
- @param[in, out] Conn The iSCSI connection.
-**/
-VOID
-IScsiDetatchConnection (
- IN OUT ISCSI_CONNECTION *Conn
- );
-
-/**
- This function does the iSCSI connection login.
-
- @param[in, out] Conn The iSCSI connection to login.
-
- @retval EFI_SUCCESS The iSCSI connection is logged into the iSCSI target.
- @retval EFI_TIMEOUT Timeout happened during the login procedure.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiConnLogin (
- IN OUT ISCSI_CONNECTION *Conn
- );
-
-/**
- Create a TCP connection for the iSCSI session.
-
- @param[in] Private The iSCSI driver data.
- @param[in] Session Maximum CmdSN from the target.
-
- @return The newly created iSCSI connection.
-**/
-ISCSI_CONNECTION *
-IScsiCreateConnection (
- IN ISCSI_DRIVER_DATA *Private,
- IN ISCSI_SESSION *Session
- );
-
-/**
- Destroy an iSCSI connection.
-
- @param[in] Conn The connection to destroy.
-**/
-VOID
-IScsiDestroyConnection (
- IN ISCSI_CONNECTION *Conn
- );
-
-/**
- Login the iSCSI session.
-
- @param[in] Private The iSCSI driver data.
-
- @retval EFI_SUCCESS The iSCSI session login procedure finished.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_NO_MEDIA There was a media error.
- @retval Others Other errors as indicated.
-
-**/
-EFI_STATUS
-IScsiSessionLogin (
- IN ISCSI_DRIVER_DATA *Private
- );
-
-/**
- Build and send the iSCSI login request to the iSCSI target according to
- the current login stage.
-
- @param[in] Conn The connection in the iSCSI login phase.
-
- @retval EFI_SUCCESS The iSCSI login request PDU is built and sent on this
- connection.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_DEVICE_ERROR Some kind of device error happened.
-**/
-EFI_STATUS
-IScsiSendLoginReq (
- IN ISCSI_CONNECTION *Conn
- );
-
-/**
- Receive and process the iSCSI login response.
-
- @param[in] Conn The connection in the iSCSI login phase.
-
- @retval EFI_SUCCESS The iSCSI login response PDU is received and processed.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiReceiveLoginRsp (
- IN ISCSI_CONNECTION *Conn
- );
-
-/**
- Add an iSCSI key-value pair as a string into the data segment of the Login Request PDU.
- The DataSegmentLength and the actual size of the net buffer containing this PDU will be
- updated.
-
- @param[in, out] Pdu The iSCSI PDU whose data segment the key-value pair will
- be added to.
- @param[in] Key The key name string.
- @param[in] Value The value string.
-
- @retval EFI_SUCCESS The key-valu pair is added to the PDU's datasegment and
- the correspondence length fields are updated.
- @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to add the key-value
- pair.
-**/
-EFI_STATUS
-IScsiAddKeyValuePair (
- IN OUT NET_BUF *Pdu,
- IN CHAR8 *Key,
- IN CHAR8 *Value
- );
-
-/**
- Prepare the iSCSI login request to be sent according to the current login status.
-
- @param[in, out] Conn The connection in the iSCSI login phase.
-
- @return The pointer to the net buffer containing the iSCSI login request built.
- @retval Others Other errors as indicated.
-**/
-NET_BUF *
-IScsiPrepareLoginReq (
- IN OUT ISCSI_CONNECTION *Conn
- );
-
-/**
- Process the iSCSI Login Response.
-
- @param[in, out] Conn The connection on which the iSCSI login response is received.
- @param[in, out] Pdu The iSCSI login response PDU.
-
- @retval EFI_SUCCESS The iSCSI login response PDU is processed and all check are passed.
- @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
- @retval EFI_MEDIA_CHANGED Target is redirected.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiProcessLoginRsp (
- IN OUT ISCSI_CONNECTION *Conn,
- IN OUT NET_BUF *Pdu
- );
-
-/**
- Updated the target information according the data received in the iSCSI
- login response with an target redirection status.
-
- @param[in, out] Session The iSCSI session.
- @param[in] Data The data segment which should contain the
- TargetAddress key-value list.
- @param[in] Len Length of the data.
-
- @retval EFI_SUCCESS The target address is updated.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_NOT_FOUND The TargetAddress key is not found.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiUpdateTargetAddress (
- IN OUT ISCSI_SESSION *Session,
- IN CHAR8 *Data,
- IN UINT32 Len
- );
-
-/**
- The callback function to free the net buffer list.
-
- @param[in] Arg The opaque parameter.
-**/
-VOID
-EFIAPI
-IScsiFreeNbufList (
- VOID *Arg
- );
-
-/**
- Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI PDU header and
- an optional data segment. The two parts will be put into two blocks of buffers in the
- net buffer. The digest check will be conducted in this function if needed and the digests
- will be trimmed from the PDU buffer.
-
- @param[in] Conn The iSCSI connection to receive data from.
- @param[out] Pdu The received iSCSI pdu.
- @param[in] Context The context used to describe information on the caller provided
- buffer to receive data segment of the iSCSI pdu, it's optional.
- @param[in] HeaderDigest Whether there will be header digest received.
- @param[in] DataDigest Whether there will be data digest.
- @param[in] TimeoutEvent The timeout event, it's optional.
-
- @retval EFI_SUCCESS An iSCSI pdu is received.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiReceivePdu (
- IN ISCSI_CONNECTION *Conn,
- OUT NET_BUF **Pdu,
- IN ISCSI_IN_BUFFER_CONTEXT *Context, OPTIONAL
- IN BOOLEAN HeaderDigest,
- IN BOOLEAN DataDigest,
- IN EFI_EVENT TimeoutEvent OPTIONAL
- );
-
-/**
- Check and get the result of the prameter negotiation.
-
- @param[in, out] Conn The connection in iSCSI login.
-
- @retval EFI_SUCCESS The parmeter check is passed and negotiation is finished.
- @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
-**/
-EFI_STATUS
-IScsiCheckOpParams (
- IN OUT ISCSI_CONNECTION *Conn
- );
-
-/**
- Fill the oprational prameters.
-
- @param[in] Conn The connection in iSCSI login.
- @param[in, out] Pdu The iSCSI login request PDU to fill the parameters.
-
- @retval EFI_SUCCESS The parmeters are filled into the iSCSI login request PDU.
-**/
-EFI_STATUS
-IScsiFillOpParams (
- IN ISCSI_CONNECTION *Conn,
- IN OUT NET_BUF *Pdu
- );
-
-/**
- Pad the iSCSI AHS or data segment to an integer number of 4 byte words.
-
- @param[in, out] Pdu The iSCSI pdu which contains segments to pad.
- @param[in] Len The length of the last semgnet in the PDU.
-
- @retval EFI_SUCCESS The segment is padded or no need to pad it.
- @retval EFI_OUT_OF_RESOURCES There is not enough remaining free space to add the
- padding bytes.
-**/
-EFI_STATUS
-IScsiPadSegment (
- IN OUT NET_BUF *Pdu,
- IN UINT32 Len
- );
-
-/**
- Build a key-value list from the data segment.
-
- @param[in] Data The data segment containing the key-value pairs.
- @param[in] Len Length of the data segment.
-
- @return The key-value list.
- @retval NULL Other errors as indicated.
-**/
-LIST_ENTRY *
-IScsiBuildKeyValueList (
- IN CHAR8 *Data,
- IN UINT32 Len
- );
-
-/**
- Get the value string by the key name from the key-value list. If found,
- the key-value entry will be removed from the list.
-
- @param[in, out] KeyValueList The key-value list.
- @param[in] Key The key name to find.
-
- @return The value string.
-**/
-CHAR8 *
-IScsiGetValueByKeyFromList (
- IN OUT LIST_ENTRY *KeyValueList,
- IN CHAR8 *Key
- );
-
-/**
- Free the key-value list.
-
- @param[in] KeyValueList The key-value list.
-**/
-VOID
-IScsiFreeKeyValueList (
- IN LIST_ENTRY *KeyValueList
- );
-
-/**
- Normalize the iSCSI name according to RFC.
-
- @param[in, out] Name The iSCSI name.
- @param[in] Len length of the iSCSI name.
-
- @retval EFI_SUCCESS The iSCSI name is valid and normalized.
- @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in the IQN format.
-**/
-EFI_STATUS
-IScsiNormalizeName (
- IN OUT CHAR8 *Name,
- IN UINTN Len
- );
-
-/**
- Execute the SCSI command issued through the EXT SCSI PASS THRU protocol.
-
- @param[in] PassThru The EXT SCSI PASS THRU protocol.
- @param[in] Target The target ID.
- @param[in] Lun The LUN.
- @param[in, out] Packet The request packet containing IO request, SCSI command
- buffer and buffers to read/write.
-
- @retval EFI_SUCCES The SCSI command is executed and the result is updated to
- the Packet.
- @retval EFI_DEVICE_ERROR Session state was not as required.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_NOT_READY The target can not accept new commands.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-IScsiExecuteScsiCommand (
- IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru,
- IN UINT8 *Target,
- IN UINT64 Lun,
- IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
- );
-
-/**
- Reinstate the session on some error.
-
- @param[in, out] Private The iSCSI driver data.
-
- @retval EFI_SUCCES The session is reinstated from some error.
- @retval Other Reinstatement failed.
-**/
-EFI_STATUS
-IScsiSessionReinstatement (
- IN OUT ISCSI_DRIVER_DATA *Private
- );
-
-/**
- Initialize some session parameters before login.
-
- @param[in, out] Session The iSCSI session.
- @param[in] Recovery Whether the request is from a fresh new start or recovery.
-**/
-VOID
-IScsiSessionInit (
- IN OUT ISCSI_SESSION *Session,
- IN BOOLEAN Recovery
- );
-
-/**
- Abort the iSCSI session, that is, reset all the connection and free the
- resources.
-
- @param[in, out] Session The iSCSI session.
-
- @retval EFI_SUCCES The session is aborted.
-**/
-EFI_STATUS
-IScsiSessionAbort (
- IN OUT ISCSI_SESSION *Session
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h
deleted file mode 100644
index 9e0f1e0f02c2..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/** @file
- iSCSI Tcp4 IO related definitions.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#ifndef _ISCSI_TCP4_IO_H_
-#define _ISCSI_TCP4_IO_H_
-
-#include <Library/NetLib.h>
-#include <Protocol/Tcp4.h>
-
-typedef struct _TCP4_IO_CONFIG_DATA {
- EFI_IPv4_ADDRESS LocalIp;
- EFI_IPv4_ADDRESS SubnetMask;
- EFI_IPv4_ADDRESS Gateway;
-
- EFI_IPv4_ADDRESS RemoteIp;
- UINT16 RemotePort;
-} TCP4_IO_CONFIG_DATA;
-
-typedef struct _TCP4_IO {
- EFI_HANDLE Image;
- EFI_HANDLE Controller;
-
- EFI_HANDLE Handle;
- EFI_TCP4_PROTOCOL *Tcp4;
-
- EFI_TCP4_CONNECTION_TOKEN ConnToken;
- EFI_TCP4_IO_TOKEN TxToken;
- EFI_TCP4_IO_TOKEN RxToken;
- EFI_TCP4_CLOSE_TOKEN CloseToken;
-
- BOOLEAN IsConnDone;
- BOOLEAN IsTxDone;
- BOOLEAN IsRxDone;
- BOOLEAN IsCloseDone;
-} TCP4_IO;
-
-/**
- Create a TCP socket with the specified configuration data.
-
- @param[in] Image The handle of the driver image.
- @param[in] Controller The handle of the controller.
- @param[in] ConfigData The Tcp4 configuration data.
- @param[in] Tcp4Io The Tcp4Io.
-
- @retval EFI_SUCCESS The TCP socket is created and configured.
- @retval Others Failed to create the TCP socket or configure it.
-**/
-EFI_STATUS
-Tcp4IoCreateSocket (
- IN EFI_HANDLE Image,
- IN EFI_HANDLE Controller,
- IN TCP4_IO_CONFIG_DATA *ConfigData,
- IN TCP4_IO *Tcp4Io
- );
-
-/**
- Destroy the socket.
-
- @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyeds.
-**/
-VOID
-Tcp4IoDestroySocket (
- IN TCP4_IO *Tcp4Io
- );
-
-/**
- Connect to the other endpoint of the TCP socket.
-
- @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket.
- @param[in] Timeout The time to wait for connection done.
-
- @retval EFI_SUCCESS Connect to the other endpoint of the TCP socket successfully.
- @retval EFI_TIMEOUT Failed to connect to the other endpoint of the TCP socket in the specified time period.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-Tcp4IoConnect (
- IN OUT TCP4_IO *Tcp4Io,
- IN EFI_EVENT Timeout
- );
-
-/**
- Reset the socket.
-
- @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket.
-**/
-VOID
-Tcp4IoReset (
- IN OUT TCP4_IO *Tcp4Io
- );
-
-/**
- Transmit the Packet to the other endpoint of the socket.
-
- @param[in] Tcp4Io The Tcp4Io wrapping the TCP socket.
- @param[in] Packet The packet to transmit.
-
- @retval EFI_SUCCESS The packet is trasmitted.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-Tcp4IoTransmit (
- IN TCP4_IO *Tcp4Io,
- IN NET_BUF *Packet
- );
-
-/**
- Receive data from the socket.
-
- @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyed.
- @param[in] Packet The buffer to hold the data copy from the soket rx buffer.
- @param[in] AsyncMode Is this receive asyncronous or not.
- @param[in] Timeout The time to wait for receiving the amount of data the Packet
- can hold.
-
- @retval EFI_SUCCESS The required amount of data is received from the socket.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate momery.
- @retval EFI_TIMEOUT Failed to receive the required amount of data in the
- specified time period.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-Tcp4IoReceive (
- IN TCP4_IO *Tcp4Io,
- IN NET_BUF *Packet,
- IN BOOLEAN AsyncMode,
- IN EFI_EVENT Timeout
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h
deleted file mode 100644
index 1541b2d8ece1..000000000000
--- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/** @file
- Header file for Md5.
-
-Copyright (c) 2004 - 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.
-
-**/
-
-#ifndef _MD5_H_
-#define _MD5_H_
-
-#include <Uefi.h>
-#include <Library/BaseLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/NetLib.h>
-
-#define MD5_HASHSIZE 16
-
-typedef struct _MD5_CTX {
- EFI_STATUS Status;
- UINT64 Length;
- UINT32 States[MD5_HASHSIZE / sizeof (UINT32)];
- UINT8 M[64];
- UINTN Count;
-} MD5_CTX;
-
-/**
- Initialize four 32-bits chaining variables and use them to do the Md5 transform.
-
- @param[out] Md5Ctx The data structure of Md5.
-
- @retval EFI_SUCCESS Initialization is ok.
-**/
-EFI_STATUS
-MD5Init (
- OUT MD5_CTX *Md5Ctx
- );
-
-/**
- the external interface of Md5 algorithm
-
- @param[in, out] Md5Ctx The data structure of storing the original data
- segment and the final result.
- @param[in] Data The data wanted to be transformed.
- @param[in] DataLen The length of data.
-
- @retval EFI_SUCCESS The transform is ok.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-MD5Update (
- IN OUT MD5_CTX *Md5Ctx,
- IN VOID *Data,
- IN UINTN DataLen
- );
-
-/**
- Accumulate the MD5 value of every data segment and generate the finial
- result according to MD5 algorithm.
-
- @param[in, out] Md5Ctx The data structure of storing the original data
- segment and the final result.
- @param[out] HashVal The final 128-bits output.
-
- @retval EFI_SUCCESS The transform is ok.
- @retval Others Other errors as indicated.
-**/
-EFI_STATUS
-MD5Final (
- IN OUT MD5_CTX *Md5Ctx,
- OUT UINT8 *HashVal
- );
-
-#endif
--
2.19.1.windows.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v2 3/6] MdeModulePkg: Delete IScsiDxe in MdeModulePkg.
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
1 sibling, 0 replies; 12+ messages in thread
From: Ni, Ruiyu @ 2018-12-20 2:07 UTC (permalink / raw)
To: Fu, Siyuan, edk2-devel@lists.01.org
Cc: Wang, Jian J, Wu, Hao A, Zeng, Star, Wu, Jiaxin
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
Thanks/Ray
> -----Original Message-----
> From: Fu, Siyuan <siyuan.fu@intel.com>
> Sent: Thursday, December 20, 2018 9:41 AM
> To: edk2-devel@lists.01.org
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A <hao.a.wu@intel.com>;
> Ni, Ruiyu <ruiyu.ni@intel.com>; Zeng, Star <star.zeng@intel.com>; Wu, Jiaxin
> <jiaxin.wu@intel.com>
> Subject: [PATCH v2 3/6] MdeModulePkg: Delete IScsiDxe in MdeModulePkg.
>
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1278
>
> This patch is to delete the IScsiDxe driver in MdeModulePkg. The driver
> will not be maintained and can't co-work with the dual-stack IScsiDxe in
> NetworkPkg.
>
> People should use below NetworkPkg drivers instead:
> NetworkPkg/IScsiDxe/IScsiDxe.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/IScsiDxe/ComponentName.c |
> 283 --
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c | 430 ---
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c | 1264 -----
> ----
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c | 472 ----
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c | 676 -----
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c | 412
> ---
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c | 539 ----
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c | 116 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c | 948 -------
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c | 2799 ------
> --------------
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c | 487 ----
> MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | 350 ---
> MdeModulePkg/MdeModulePkg.dsc | 1 -
> MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h |
> 165 --
> MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni | 25 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni | 20 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h | 106 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h | 22 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h | 166 --
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr | 219 --
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni |
> 62 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h |
> 109 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h | 55 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h | 140 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf | 134 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h | 22
> -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h | 38 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h | 168 --
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h | 74 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h | 317 ---
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h | 1005 -----
> --
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h | 142 -
> MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | 80 -
> 33 files changed, 11846 deletions(-)
>
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c
> deleted file mode 100644
> index 3f561e93439d..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c
> +++ /dev/null
> @@ -1,283 +0,0 @@
> -/** @file
> - UEFI Component Name(2) protocol implementation for iSCSI.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -//
> -// EFI Component Name Protocol
> -//
> -GLOBAL_REMOVE_IF_UNREFERENCED
> EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName = {
> - IScsiComponentNameGetDriverName,
> - IScsiComponentNameGetControllerName,
> - "eng"
> -};
> -
> -//
> -// EFI Component Name 2 Protocol
> -//
> -GLOBAL_REMOVE_IF_UNREFERENCED
> EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2 = {
> - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)
> IScsiComponentNameGetDriverName,
> - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)
> IScsiComponentNameGetControllerName,
> - "en"
> -};
> -
> -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE
> mIScsiDriverNameTable[] = {
> - {"eng;en", L"iSCSI Driver"},
> - {NULL, NULL}
> -};
> -
> -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE
> *mIScsiControllerNameTable = NULL;
> -
> -/**
> - Retrieves a Unicode string that is the user readable name of the EFI 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_NAME_PROTOCOL
> instance.
> - @param[in] Language A pointer to a three character ISO 639-2 language
> identifier.
> - This is the language of the driver name that 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.
> - @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
> -IScsiComponentNameGetDriverName (
> - IN EFI_COMPONENT_NAME_PROTOCOL *This,
> - IN CHAR8 *Language,
> - OUT CHAR16 **DriverName
> - )
> -{
> - return LookupUnicodeString2 (
> - Language,
> - This->SupportedLanguages,
> - mIScsiDriverNameTable,
> - DriverName,
> - (BOOLEAN)(This == &gIScsiComponentName)
> - );
> -}
> -
> -/**
> - Update the component name for the iSCSI instance.
> -
> - @param[in] IScsiExtScsiPassThru A pointer to the
> EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
> -
> - @retval EFI_SUCCESS Update the ControllerNameTable of this
> instance successfully.
> - @retval EFI_INVALID_PARAMETER The input parameter is invalid.
> - @retval EFI_UNSUPPORTED Can't get the corresponding NIC info from
> the Controller handle.
> -
> -**/
> -EFI_STATUS
> -UpdateName (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru
> - )
> -{
> - EFI_STATUS Status;
> - CHAR16 HandleName[150];
> - ISCSI_DRIVER_DATA *Private;
> - EFI_MAC_ADDRESS MacAddress;
> - UINTN HwAddressSize;
> - UINT16 VlanId;
> - CHAR16 MacString[70];
> -
> - if (IScsiExtScsiPassThru == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU
> (IScsiExtScsiPassThru);
> -
> - //
> - // Get the mac string, it's the name of various variable
> - //
> - Status = NetLibGetMacAddress (Private->Controller, &MacAddress,
> &HwAddressSize);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> - VlanId = NetLibGetVlanId (Private->Controller);
> - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId,
> MacString);
> -
> - UnicodeSPrint (
> - HandleName,
> - sizeof (HandleName),
> - L"iSCSI IPv4 (MacString=%s)",
> - MacString
> - );
> -
> - if (mIScsiControllerNameTable != NULL) {
> - FreeUnicodeStringTable (mIScsiControllerNameTable);
> - mIScsiControllerNameTable = NULL;
> - }
> -
> - Status = AddUnicodeString2 (
> - "eng",
> - gIScsiComponentName.SupportedLanguages,
> - &mIScsiControllerNameTable,
> - HandleName,
> - TRUE
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - return AddUnicodeString2 (
> - "en",
> - gIScsiComponentName2.SupportedLanguages,
> - &mIScsiControllerNameTable,
> - HandleName,
> - FALSE
> - );
> -}
> -
> -/**
> - Retrieves a Unicode string that is the user readable name of the controller
> - that is being managed by an EFI Driver.Currently not implemented.
> -
> - @param[in] This A pointer to the
> 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 three character ISO 639-2
> language
> - identifier. This is the language of the controller name
> - that 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.
> - @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
> -IScsiComponentNameGetControllerName (
> - 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_HANDLE IScsiController;
> - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
> -
> - EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru;
> -
> - if (ControllerHandle == NULL) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - //
> - // Get the handle of the controller we are controling.
> - //
> - IScsiController = NetLibGetNicHandle (ControllerHandle,
> &gEfiTcp4ProtocolGuid);
> - if (IScsiController == NULL) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - Status = gBS->OpenProtocol (
> - IScsiController,
> - &gEfiCallerIdGuid,
> - (VOID **)&IScsiIdentifier,
> - NULL,
> - NULL,
> - EFI_OPEN_PROTOCOL_GET_PROTOCOL
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - if (ChildHandle != NULL) {
> - //
> - // Make sure this driver produced ChildHandle
> - //
> - Status = EfiTestChildHandle (
> - ControllerHandle,
> - ChildHandle,
> - &gEfiTcp4ProtocolGuid
> - );
> - if (!EFI_ERROR (Status)) {
> - //
> - // Retrieve an instance of a produced protocol from ChildHandle
> - //
> - Status = gBS->OpenProtocol (
> - ChildHandle,
> - &gEfiExtScsiPassThruProtocolGuid,
> - (VOID **)&IScsiExtScsiPassThru,
> - NULL,
> - NULL,
> - EFI_OPEN_PROTOCOL_GET_PROTOCOL
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - //
> - // Update the component name for this child handle.
> - //
> - Status = UpdateName (IScsiExtScsiPassThru);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> - } else {
> - return Status;
> - }
> - }
> -
> - return LookupUnicodeString2 (
> - Language,
> - This->SupportedLanguages,
> - mIScsiControllerNameTable,
> - ControllerName,
> - (BOOLEAN)(This == &gIScsiComponentName)
> - );
> -}
> -
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c
> deleted file mode 100644
> index 6307684ff05b..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c
> +++ /dev/null
> @@ -1,430 +0,0 @@
> -/** @file
> - This file is for Challenge-Handshake Authentication Protocol (CHAP)
> Configuration.
> -
> -Copyright (c) 2004 - 2015, 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -#include "Md5.h"
> -
> -/**
> - Initator calculates its own expected hash value.
> -
> - @param[in] ChapIdentifier iSCSI CHAP identifier sent by authenticator.
> - @param[in] ChapSecret iSCSI CHAP secret of the authenticator.
> - @param[in] SecretLength The length of iSCSI CHAP secret.
> - @param[in] ChapChallenge The challenge message sent by
> authenticator.
> - @param[in] ChallengeLength The length of iSCSI CHAP challenge
> message.
> - @param[out] ChapResponse The calculation of the expected hash
> value.
> -
> - @retval EFI_SUCCESS The expected hash value was calculatedly
> successfully.
> - @retval EFI_PROTOCOL_ERROR The length of the secret should be at
> least the
> - length of the hash value for the hashing algorithm chosen.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiCHAPCalculateResponse (
> - IN UINT32 ChapIdentifier,
> - IN CHAR8 *ChapSecret,
> - IN UINT32 SecretLength,
> - IN UINT8 *ChapChallenge,
> - IN UINT32 ChallengeLength,
> - OUT UINT8 *ChapResponse
> - )
> -{
> - MD5_CTX Md5Ctx;
> - CHAR8 IdByte[1];
> - EFI_STATUS Status;
> -
> - Status = MD5Init (&Md5Ctx);
> -
> - //
> - // Hash Identifier - Only calculate 1 byte data (RFC1994)
> - //
> - IdByte[0] = (CHAR8) ChapIdentifier;
> - MD5Update (&Md5Ctx, IdByte, 1);
> -
> - //
> - // Hash Secret
> - //
> - if (SecretLength < ISCSI_CHAP_SECRET_MIN_LEN - 1) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - MD5Update (&Md5Ctx, ChapSecret, SecretLength);
> -
> - //
> - // Hash Challenge received from Target
> - //
> - MD5Update (&Md5Ctx, ChapChallenge, ChallengeLength);
> -
> - Status = MD5Final (&Md5Ctx, ChapResponse);
> -
> - return Status;
> -}
> -
> -/**
> - The initator checks the CHAP response replied by target against its own
> - calculation of the expected hash value.
> -
> - @param[in] AuthData iSCSI CHAP authentication data.
> - @param[in] TargetResponse The response from target.
> -
> - @retval EFI_SUCCESS The response from target passed
> authentication.
> - @retval EFI_SECURITY_VIOLATION The response from target was not
> expected value.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiCHAPAuthTarget (
> - IN ISCSI_CHAP_AUTH_DATA *AuthData,
> - IN UINT8 *TargetResponse
> - )
> -{
> - EFI_STATUS Status;
> - UINT32 SecretSize;
> - UINT8 VerifyRsp[ISCSI_CHAP_RSP_LEN];
> -
> - Status = EFI_SUCCESS;
> -
> - SecretSize = (UINT32) AsciiStrLen (AuthData-
> >AuthConfig.ReverseCHAPSecret);
> - Status = IScsiCHAPCalculateResponse (
> - AuthData->OutIdentifier,
> - AuthData->AuthConfig.ReverseCHAPSecret,
> - SecretSize,
> - AuthData->OutChallenge,
> - AuthData->OutChallengeLength,
> - VerifyRsp
> - );
> -
> - if (CompareMem (VerifyRsp, TargetResponse, ISCSI_CHAP_RSP_LEN) != 0)
> {
> - Status = EFI_SECURITY_VIOLATION;
> - }
> -
> - return Status;
> -}
> -
> -/**
> - This function checks the received iSCSI Login Response during the security
> - negotiation stage.
> -
> - @param[in] Conn The iSCSI connection.
> -
> - @retval EFI_SUCCESS The Login Response passed the CHAP validation.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiCHAPOnRspReceived (
> - IN ISCSI_CONNECTION *Conn
> - )
> -{
> - EFI_STATUS Status;
> - ISCSI_SESSION *Session;
> - ISCSI_CHAP_AUTH_DATA *AuthData;
> - CHAR8 *Value;
> - UINT8 *Data;
> - UINT32 Len;
> - LIST_ENTRY *KeyValueList;
> - UINTN Algorithm;
> - CHAR8 *Identifier;
> - CHAR8 *Challenge;
> - CHAR8 *Name;
> - CHAR8 *Response;
> - UINT8 TargetRsp[ISCSI_CHAP_RSP_LEN];
> - UINT32 RspLen;
> -
> - ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION);
> - ASSERT (Conn->RspQue.BufNum != 0);
> -
> - Session = Conn->Session;
> - AuthData = &Session->AuthData;
> -
> - Len = Conn->RspQue.BufSize;
> - Data = AllocatePool (Len);
> - if (Data == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> - //
> - // Copy the data in case the data spans over multiple PDUs.
> - //
> - NetbufQueCopy (&Conn->RspQue, 0, Len, Data);
> -
> - //
> - // Build the key-value list from the data segment of the Login Response.
> - //
> - KeyValueList = IScsiBuildKeyValueList ((CHAR8 *) Data, Len);
> - if (KeyValueList == NULL) {
> - FreePool (Data);
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Status = EFI_PROTOCOL_ERROR;
> -
> - switch (Conn->CHAPStep) {
> - case ISCSI_CHAP_INITIAL:
> - //
> - // The first Login Response.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_TARGET_PORTAL_GROUP_TAG);
> - if (Value == NULL) {
> - goto ON_EXIT;
> - }
> -
> - Session->TargetPortalGroupTag = (UINT16) AsciiStrDecimalToUintn
> (Value);
> -
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_AUTH_METHOD);
> - if (Value == NULL) {
> - goto ON_EXIT;
> - }
> - //
> - // Initiator mandates CHAP authentication but target replies without
> "CHAP" or
> - // initiator suggets "None" but target replies with some kind of auth
> method.
> - //
> - if (AsciiStrCmp (Value, ISCSI_AUTH_METHOD_CHAP) == 0) {
> - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) {
> - goto ON_EXIT;
> - }
> - } else {
> - if (AuthData->AuthConfig.CHAPType != ISCSI_CHAP_NONE) {
> - goto ON_EXIT;
> - }
> - }
> - //
> - // Transit to CHAP step one.
> - //
> - Conn->CHAPStep = ISCSI_CHAP_STEP_ONE;
> - Status = EFI_SUCCESS;
> - break;
> -
> - case ISCSI_CHAP_STEP_TWO:
> - //
> - // The Target replies with CHAP_A=<A> CHAP_I=<I> CHAP_C=<C>
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_CHAP_ALGORITHM);
> - if (Value == NULL) {
> - goto ON_EXIT;
> - }
> -
> - Algorithm = AsciiStrDecimalToUintn (Value);
> - if (Algorithm != ISCSI_CHAP_ALGORITHM_MD5) {
> - //
> - // Unsupported algorithm is chosen by target.
> - //
> - goto ON_EXIT;
> - }
> -
> - Identifier = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_CHAP_IDENTIFIER);
> - if (Identifier == NULL) {
> - goto ON_EXIT;
> - }
> -
> - Challenge = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_CHAP_CHALLENGE);
> - if (Challenge == NULL) {
> - goto ON_EXIT;
> - }
> - //
> - // Process the CHAP identifier and CHAP Challenge from Target
> - // Calculate Response value
> - //
> - AuthData->InIdentifier = (UINT32) AsciiStrDecimalToUintn (Identifier);
> - AuthData->InChallengeLength = ISCSI_CHAP_AUTH_MAX_LEN;
> - IScsiHexToBin ((UINT8 *) AuthData->InChallenge, &AuthData-
> >InChallengeLength, Challenge);
> - Status = IScsiCHAPCalculateResponse (
> - AuthData->InIdentifier,
> - AuthData->AuthConfig.CHAPSecret,
> - (UINT32) AsciiStrLen (AuthData->AuthConfig.CHAPSecret),
> - AuthData->InChallenge,
> - AuthData->InChallengeLength,
> - AuthData->CHAPResponse
> - );
> -
> - //
> - // Transit to next step.
> - //
> - Conn->CHAPStep = ISCSI_CHAP_STEP_THREE;
> - break;
> -
> - case ISCSI_CHAP_STEP_THREE:
> - //
> - // one way CHAP authentication and the target would like to
> - // authenticate us.
> - //
> - Status = EFI_SUCCESS;
> - break;
> -
> - case ISCSI_CHAP_STEP_FOUR:
> - ASSERT (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL);
> - //
> - // The forth step, CHAP_N=<N> CHAP_R=<R> is received from Target.
> - //
> - Name = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_CHAP_NAME);
> - if (Name == NULL) {
> - goto ON_EXIT;
> - }
> -
> - Response = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_CHAP_RESPONSE);
> - if (Response == NULL) {
> - goto ON_EXIT;
> - }
> -
> - RspLen = ISCSI_CHAP_RSP_LEN;
> - IScsiHexToBin (TargetRsp, &RspLen, Response);
> -
> - //
> - // Check the CHAP Response replied by Target.
> - //
> - Status = IScsiCHAPAuthTarget (AuthData, TargetRsp);
> - break;
> -
> - default:
> - break;
> - }
> -
> -ON_EXIT:
> -
> - IScsiFreeKeyValueList (KeyValueList);
> -
> - FreePool (Data);
> -
> - return Status;
> -}
> -
> -/**
> - This function fills the CHAP authentication information into the login PDU
> - during the security negotiation stage in the iSCSI connection login.
> -
> - @param[in] Conn The iSCSI connection.
> - @param[in, out] Pdu The PDU to send out.
> -
> - @retval EFI_SUCCESS All check passed and the phase-related CHAP
> - authentication info is filled into the iSCSI PDU.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend.
> -**/
> -EFI_STATUS
> -IScsiCHAPToSendReq (
> - IN ISCSI_CONNECTION *Conn,
> - IN OUT NET_BUF *Pdu
> - )
> -{
> - EFI_STATUS Status;
> - ISCSI_SESSION *Session;
> - ISCSI_LOGIN_REQUEST *LoginReq;
> - ISCSI_CHAP_AUTH_DATA *AuthData;
> - CHAR8 *Value;
> - CHAR8 ValueStr[256];
> - CHAR8 *Response;
> - UINT32 RspLen;
> - CHAR8 *Challenge;
> - UINT32 ChallengeLen;
> -
> - ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION);
> -
> - Session = Conn->Session;
> - AuthData = &Session->AuthData;
> - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, 0);
> - if (LoginReq == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> - Status = EFI_SUCCESS;
> -
> - RspLen = 2 * ISCSI_CHAP_RSP_LEN + 3;
> - Response = AllocatePool (RspLen);
> - if (Response == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - ChallengeLen = 2 * ISCSI_CHAP_RSP_LEN + 3;
> - Challenge = AllocatePool (ChallengeLen);
> - if (Challenge == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - switch (Conn->CHAPStep) {
> - case ISCSI_CHAP_INITIAL:
> - //
> - // It's the initial Login Request. Fill in the key=value pairs mandatory
> - // for the initial Login Request.
> - //
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIATOR_NAME, Session-
> >InitiatorName);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_SESSION_TYPE, "Normal");
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_TARGET_NAME, Session-
> >ConfigData.NvData.TargetName);
> -
> - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) {
> - Value = ISCSI_KEY_VALUE_NONE;
> - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
> - } else {
> - Value = ISCSI_AUTH_METHOD_CHAP;
> - }
> -
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_AUTH_METHOD, Value);
> -
> - break;
> -
> - case ISCSI_CHAP_STEP_ONE:
> - //
> - // First step, send the Login Request with CHAP_A=<A1,A2...> key-value
> pair.
> - //
> - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d",
> ISCSI_CHAP_ALGORITHM_MD5);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_ALGORITHM, ValueStr);
> -
> - Conn->CHAPStep = ISCSI_CHAP_STEP_TWO;
> - break;
> -
> - case ISCSI_CHAP_STEP_THREE:
> - //
> - // Third step, send the Login Request with CHAP_N=<N> CHAP_R=<R> or
> - // CHAP_N=<N> CHAP_R=<R> CHAP_I=<I> CHAP_C=<C> if target
> ahtentication is
> - // required too.
> - //
> - // CHAP_N=<N>
> - //
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_NAME, (CHAR8 *)
> &AuthData->AuthConfig.CHAPName);
> - //
> - // CHAP_R=<R>
> - //
> - IScsiBinToHex ((UINT8 *) AuthData->CHAPResponse,
> ISCSI_CHAP_RSP_LEN, Response, &RspLen);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_RESPONSE, Response);
> -
> - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL) {
> - //
> - // CHAP_I=<I>
> - //
> - IScsiGenRandom ((UINT8 *) &AuthData->OutIdentifier, 1);
> - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData->OutIdentifier);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr);
> - //
> - // CHAP_C=<C>
> - //
> - IScsiGenRandom ((UINT8 *) AuthData->OutChallenge,
> ISCSI_CHAP_RSP_LEN);
> - AuthData->OutChallengeLength = ISCSI_CHAP_RSP_LEN;
> - IScsiBinToHex ((UINT8 *) AuthData->OutChallenge,
> ISCSI_CHAP_RSP_LEN, Challenge, &ChallengeLen);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_CHALLENGE, Challenge);
> -
> - Conn->CHAPStep = ISCSI_CHAP_STEP_FOUR;
> - }
> - //
> - // set the stage transition flag.
> - //
> - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
> - break;
> -
> - default:
> - Status = EFI_PROTOCOL_ERROR;
> - break;
> - }
> -
> - FreePool (Response);
> - FreePool (Challenge);
> -
> - return Status;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
> deleted file mode 100644
> index cb1eff1b690c..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
> +++ /dev/null
> @@ -1,1264 +0,0 @@
> -/** @file
> - Helper functions for configuring or getting the parameters relating to iSCSI.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -CHAR16 mVendorStorageName[] = L"ISCSI_CONFIG_IFR_NVDATA";
> -BOOLEAN mIScsiDeviceListUpdated = FALSE;
> -UINTN mNumberOfIScsiDevices = 0;
> -ISCSI_FORM_CALLBACK_INFO *mCallbackInfo = NULL;
> -
> -LIST_ENTRY mIScsiConfigFormList = {
> - &mIScsiConfigFormList,
> - &mIScsiConfigFormList
> -};
> -
> -HII_VENDOR_DEVICE_PATH mIScsiHiiVendorDevicePath = {
> - {
> - {
> - HARDWARE_DEVICE_PATH,
> - HW_VENDOR_DP,
> - {
> - (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
> - (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
> - }
> - },
> - IP4_ISCSI_CONFIG_GUID
> - },
> - {
> - END_DEVICE_PATH_TYPE,
> - END_ENTIRE_DEVICE_PATH_SUBTYPE,
> - {
> - (UINT8) (END_DEVICE_PATH_LENGTH),
> - (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
> - }
> - }
> -};
> -
> -/**
> - Convert the IPv4 address into a dotted string.
> -
> - @param[in] Ip The IPv4 address.
> - @param[out] Str The dotted IP string.
> -**/
> -VOID
> -IScsiIpToStr (
> - IN EFI_IPv4_ADDRESS *Ip,
> - OUT CHAR16 *Str
> - )
> -{
> - UnicodeSPrint ( Str, 2 * IP4_STR_MAX_SIZE, L"%d.%d.%d.%d", Ip->Addr[0],
> Ip->Addr[1], Ip->Addr[2], Ip->Addr[3]);
> -}
> -
> -
> -/**
> - Parse IsId in string format and convert it to binary.
> -
> - @param[in] String The buffer of the string to be parsed.
> - @param[in, out] IsId The buffer to store IsId.
> -
> - @retval EFI_SUCCESS The operation finished successfully.
> - @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
> -
> -**/
> -EFI_STATUS
> -IScsiParseIsIdFromString (
> - IN CONST CHAR16 *String,
> - IN OUT UINT8 *IsId
> - )
> -{
> - UINT8 Index;
> - CHAR16 *IsIdStr;
> - CHAR16 TempStr[3];
> - UINTN NodeVal;
> - CHAR16 PortString[ISCSI_NAME_IFR_MAX_SIZE];
> - EFI_INPUT_KEY Key;
> -
> - if ((String == NULL) || (IsId == NULL)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - IsIdStr = (CHAR16 *) String;
> -
> - if (StrLen (IsIdStr) != 6) {
> - UnicodeSPrint (
> - PortString,
> - (UINTN) sizeof (PortString),
> - L"Error! Input is incorrect, please input 6 hex numbers!\n"
> - );
> -
> - CreatePopUp (
> - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
> - &Key,
> - PortString,
> - NULL
> - );
> -
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - for (Index = 3; Index < 6; Index++) {
> - CopyMem (TempStr, IsIdStr, sizeof (TempStr));
> - TempStr[2] = L'\0';
> -
> - //
> - // Convert the string to IsId. StrHexToUintn stops at the first character
> - // that is not a valid hex character, '\0' here.
> - //
> - NodeVal = StrHexToUintn (TempStr);
> -
> - IsId[Index] = (UINT8) NodeVal;
> -
> - IsIdStr = IsIdStr + 2;
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Convert IsId from binary to string format.
> -
> - @param[out] String The buffer to store the converted string.
> - @param[in] IsId The buffer to store IsId.
> -
> - @retval EFI_SUCCESS The string converted successfully.
> - @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
> -
> -**/
> -EFI_STATUS
> -IScsiConvertIsIdToString (
> - OUT CHAR16 *String,
> - IN UINT8 *IsId
> - )
> -{
> - UINT8 Index;
> - UINTN Number;
> -
> - if ((String == NULL) || (IsId == NULL)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - for (Index = 0; Index < 6; Index++) {
> - if (IsId[Index] <= 0xF) {
> - Number = UnicodeSPrint (
> - String,
> - 2 * ISID_CONFIGURABLE_STORAGE,
> - L"0%X",
> - (UINTN) IsId[Index]
> - );
> - } else {
> - Number = UnicodeSPrint (
> - String,
> - 2 * ISID_CONFIGURABLE_STORAGE,
> - L"%X",
> - (UINTN) IsId[Index]
> - );
> -
> - }
> -
> - String = String + Number;
> - }
> -
> - *String = L'\0';
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -/**
> - Update the list of iSCSI devices the iSCSI driver is controlling.
> -
> - @retval EFI_SUCCESS The callback successfully handled the action.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiUpdateDeviceList (
> - VOID
> - )
> -{
> - EFI_STATUS Status;
> - ISCSI_DEVICE_LIST *DeviceList;
> - UINTN DataSize;
> - UINTN NumHandles;
> - EFI_HANDLE *Handles;
> - UINTN HandleIndex;
> - UINTN Index;
> - UINTN LastDeviceIndex;
> - EFI_MAC_ADDRESS MacAddress;
> - UINTN HwAddressSize;
> - UINT16 VlanId;
> - ISCSI_MAC_INFO *CurMacInfo;
> - ISCSI_MAC_INFO TempMacInfo;
> - CHAR16 MacString[70];
> - UINTN DeviceListSize;
> -
> - //
> - // Dump all the handles the Managed Network Service Binding Protocol is
> installed on.
> - //
> - Status = gBS->LocateHandleBuffer (
> - ByProtocol,
> - &gEfiManagedNetworkServiceBindingProtocolGuid,
> - NULL,
> - &NumHandles,
> - &Handles
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - DataSize = 0;
> - Status = gRT->GetVariable (
> - L"iSCSIDeviceList",
> - &gIp4IScsiConfigGuid,
> - NULL,
> - &DataSize,
> - NULL
> - );
> - if (Status == EFI_BUFFER_TOO_SMALL) {
> - DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DataSize);
> - ASSERT (DeviceList != NULL);
> -
> - gRT->GetVariable (
> - L"iSCSIDeviceList",
> - &gIp4IScsiConfigGuid,
> - NULL,
> - &DataSize,
> - DeviceList
> - );
> -
> - LastDeviceIndex = 0;
> -
> - for (HandleIndex = 0; HandleIndex < NumHandles; HandleIndex++) {
> - Status = NetLibGetMacAddress (Handles[HandleIndex], &MacAddress,
> &HwAddressSize);
> - ASSERT (Status == EFI_SUCCESS);
> - VlanId = NetLibGetVlanId (Handles[HandleIndex]);
> -
> - for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; Index++) {
> - CurMacInfo = &DeviceList->MacInfo[Index];
> - if ((CurMacInfo->Len == HwAddressSize) &&
> - (CurMacInfo->VlanId == VlanId) &&
> - (NET_MAC_EQUAL (&CurMacInfo->Mac, MacAddress.Addr,
> HwAddressSize))
> - ) {
> - //
> - // The previous configured NIC is still here.
> - //
> - if (Index != LastDeviceIndex) {
> - //
> - // Swap the current MAC address entry with the one indexed by
> - // LastDeviceIndex.
> - //
> - CopyMem (&TempMacInfo, CurMacInfo, sizeof (ISCSI_MAC_INFO));
> - CopyMem (CurMacInfo, &DeviceList->MacInfo[LastDeviceIndex],
> sizeof (ISCSI_MAC_INFO));
> - CopyMem (&DeviceList->MacInfo[LastDeviceIndex], &TempMacInfo,
> sizeof (ISCSI_MAC_INFO));
> - }
> -
> - LastDeviceIndex++;
> - }
> - }
> -
> - if (LastDeviceIndex == DeviceList->NumDevice) {
> - break;
> - }
> - }
> -
> - for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; Index++) {
> - //
> - // delete the variables
> - //
> - CurMacInfo = &DeviceList->MacInfo[Index];
> - IScsiMacAddrToStr (&CurMacInfo->Mac, CurMacInfo->Len, CurMacInfo-
> >VlanId, MacString);
> - gRT->SetVariable (MacString, &gEfiIScsiInitiatorNameProtocolGuid, 0, 0,
> NULL);
> - gRT->SetVariable (MacString, &gIScsiCHAPAuthInfoGuid, 0, 0, NULL);
> - }
> -
> - FreePool (DeviceList);
> - } else if (Status != EFI_NOT_FOUND) {
> - FreePool (Handles);
> - return Status;
> - }
> - //
> - // Construct the new iSCSI device list.
> - //
> - DeviceListSize = sizeof (ISCSI_DEVICE_LIST) + (NumHandles - 1) * sizeof
> (ISCSI_MAC_INFO);
> - DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DeviceListSize);
> - ASSERT (DeviceList != NULL);
> - DeviceList->NumDevice = (UINT8) NumHandles;
> -
> - for (Index = 0; Index < NumHandles; Index++) {
> - NetLibGetMacAddress (Handles[Index], &MacAddress, &HwAddressSize);
> -
> - CurMacInfo = &DeviceList->MacInfo[Index];
> - CopyMem (&CurMacInfo->Mac, MacAddress.Addr, HwAddressSize);
> - CurMacInfo->Len = (UINT8) HwAddressSize;
> - CurMacInfo->VlanId = NetLibGetVlanId (Handles[Index]);
> - }
> -
> - gRT->SetVariable (
> - L"iSCSIDeviceList",
> - &gIp4IScsiConfigGuid,
> - ISCSI_CONFIG_VAR_ATTR,
> - DeviceListSize,
> - DeviceList
> - );
> -
> - FreePool (DeviceList);
> - FreePool (Handles);
> -
> - return Status;
> -}
> -
> -/**
> - Get the iSCSI configuration form entry by the index of the goto opcode
> actived.
> -
> - @param[in] Index The 0-based index of the goto opcode actived.
> -
> - @return The iSCSI configuration form entry found.
> -**/
> -ISCSI_CONFIG_FORM_ENTRY *
> -IScsiGetConfigFormEntryByIndex (
> - IN UINT32 Index
> - )
> -{
> - UINT32 CurrentIndex;
> - LIST_ENTRY *Entry;
> - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry;
> -
> - CurrentIndex = 0;
> - ConfigFormEntry = NULL;
> -
> - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {
> - if (CurrentIndex == Index) {
> - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry,
> ISCSI_CONFIG_FORM_ENTRY, Link);
> - break;
> - }
> -
> - CurrentIndex++;
> - }
> -
> - return ConfigFormEntry;
> -}
> -
> -/**
> - Convert the iSCSI configuration data into the IFR data.
> -
> - @param[in] ConfigFormEntry The iSCSI configuration form entry.
> - @param[out] IfrNvData The IFR nv data.
> -
> -**/
> -VOID
> -IScsiConvertDeviceConfigDataToIfrNvData (
> - IN ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry,
> - OUT ISCSI_CONFIG_IFR_NVDATA *IfrNvData
> - )
> -{
> - ISCSI_SESSION_CONFIG_NVDATA *SessionConfigData;
> - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfigData;
> -
> - //
> - // Normal session configuration parameters.
> - //
> - SessionConfigData = &ConfigFormEntry->SessionConfigData;
> - IfrNvData->Enabled = SessionConfigData->Enabled;
> -
> - IfrNvData->InitiatorInfoFromDhcp = SessionConfigData-
> >InitiatorInfoFromDhcp;
> - IfrNvData->TargetInfoFromDhcp = SessionConfigData-
> >TargetInfoFromDhcp;
> - IfrNvData->TargetPort = SessionConfigData->TargetPort;
> -
> - IScsiIpToStr (&SessionConfigData->LocalIp, IfrNvData->LocalIp);
> - IScsiIpToStr (&SessionConfigData->SubnetMask, IfrNvData->SubnetMask);
> - IScsiIpToStr (&SessionConfigData->Gateway, IfrNvData->Gateway);
> - IScsiIpToStr (&SessionConfigData->TargetIp, IfrNvData->TargetIp);
> -
> - IScsiAsciiStrToUnicodeStr (SessionConfigData->TargetName, IfrNvData-
> >TargetName);
> -
> - IScsiLunToUnicodeStr (SessionConfigData->BootLun, IfrNvData->BootLun);
> -
> - IScsiConvertIsIdToString (IfrNvData->IsId, SessionConfigData->IsId);
> -
> - //
> - // CHAP authentication parameters.
> - //
> - AuthConfigData = &ConfigFormEntry->AuthConfigData;
> -
> - IfrNvData->CHAPType = AuthConfigData->CHAPType;
> -
> - IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPName, IfrNvData-
> >CHAPName);
> - IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPSecret, IfrNvData-
> >CHAPSecret);
> - IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPName,
> IfrNvData->ReverseCHAPName);
> - IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPSecret,
> IfrNvData->ReverseCHAPSecret);
> -}
> -
> -/**
> - This function allows the caller to request the current
> - configuration for one or more named elements. The resulting
> - string is in <ConfigAltResp> format. Any and all alternative
> - configuration strings shall also be appended to the end of the
> - current configuration string. If they are, they must appear
> - after the current configuration. They must contain the same
> - routing (GUID, NAME, PATH) as the current configuration string.
> - They must have an additional description indicating the type of
> - alternative configuration the string represents,
> - "ALTCFG=<StringToken>". That <StringToken> (when
> - converted from Hex UNICODE to binary) is a reference to a
> - string in the associated string pack.
> -
> - @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
> - @param[in] Request A null-terminated Unicode string in
> - <ConfigRequest> format. Note that this
> - includes the routing information as well as
> - the configurable name / value pairs. It is
> - invalid for this string to be in
> - <MultiConfigRequest> format.
> - @param[out] Progress On return, points to a character in the
> - Request string. Points to the string's null
> - terminator if request was successful. Points
> - to the most recent "&" before the first
> - failing name / value pair (or the beginning
> - of the string if the failure is in the first
> - name / value pair) if the request was not
> - successful.
> - @param[out] Results A null-terminated Unicode string in
> - <ConfigAltResp> format which has all values
> - filled in for the names in the Request string.
> - String to be allocated by the called function.
> -
> - @retval EFI_SUCCESS The Results string is filled with the
> - values corresponding to all requested
> - names.
> - @retval EFI_OUT_OF_RESOURCES Not enough memory to store the
> - parts of the results that must be
> - stored awaiting possible future
> - protocols.
> - @retval EFI_INVALID_PARAMETER For example, passing in a NULL
> - for the Request parameter
> - would result in this type of
> - error. In this case, the
> - Progress parameter would be
> - set to NULL.
> - @retval EFI_NOT_FOUND Routing data doesn't match any
> - known driver. Progress set to the
> - first character in the routing header.
> - Note: There is no requirement that the
> - driver validate the routing data. It
> - must skip the <ConfigHdr> in order to
> - process the names.
> - @retval EFI_INVALID_PARAMETER Illegal syntax. Progress set
> - to most recent & before the
> - error or the beginning of the
> - string.
> - @retval EFI_INVALID_PARAMETER Unknown name. Progress points
> - to the & before the name in
> - question.Currently not implemented.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiFormExtractConfig (
> - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
> - IN CONST EFI_STRING Request,
> - OUT EFI_STRING *Progress,
> - OUT EFI_STRING *Results
> - )
> -{
> - EFI_STATUS Status;
> - CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE];
> - UINTN BufferSize;
> - ISCSI_CONFIG_IFR_NVDATA *IfrNvData;
> - ISCSI_FORM_CALLBACK_INFO *Private;
> - EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;
> - EFI_STRING ConfigRequestHdr;
> - EFI_STRING ConfigRequest;
> - BOOLEAN AllocatedRequest;
> - UINTN Size;
> -
> - if (Progress == NULL || Results == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - *Progress = Request;
> - if ((Request != NULL) && !HiiIsConfigHdrMatch (Request,
> &gIp4IScsiConfigGuid, mVendorStorageName)) {
> - return EFI_NOT_FOUND;
> - }
> -
> - ConfigRequestHdr = NULL;
> - ConfigRequest = NULL;
> - AllocatedRequest = FALSE;
> - Size = 0;
> -
> - if (!mIScsiDeviceListUpdated) {
> - //
> - // Update the device list.
> - //
> - IScsiUpdateDeviceList ();
> - mIScsiDeviceListUpdated = TRUE;
> - }
> -
> - Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);
> - IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA));
> - ASSERT (IfrNvData != NULL);
> - if (Private->Current != NULL) {
> - IScsiConvertDeviceConfigDataToIfrNvData (Private->Current, IfrNvData);
> - }
> -
> - BufferSize = ISCSI_NAME_MAX_SIZE;
> - Status = gIScsiInitiatorName.Get (&gIScsiInitiatorName, &BufferSize,
> InitiatorName);
> - if (EFI_ERROR (Status)) {
> - IfrNvData->InitiatorName[0] = L'\0';
> - } else {
> - IScsiAsciiStrToUnicodeStr (InitiatorName, IfrNvData->InitiatorName);
> - }
> -
> - //
> - // Convert buffer data to <ConfigResp> by helper function BlockToConfig()
> - //
> - HiiConfigRouting = Private->ConfigRouting;
> - BufferSize = sizeof (ISCSI_CONFIG_IFR_NVDATA);
> - ConfigRequest = Request;
> - if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {
> - //
> - // Request has no request element, construct full request string.
> - // Allocate and fill a buffer large enough to hold the <ConfigHdr> template
> - // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW"
> followed by a Null-terminator
> - //
> - ConfigRequestHdr = HiiConstructConfigHdr (&gIp4IScsiConfigGuid,
> mVendorStorageName, Private->DriverHandle);
> - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
> - ConfigRequest = AllocateZeroPool (Size);
> - ASSERT (ConfigRequest != NULL);
> - AllocatedRequest = TRUE;
> - UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX",
> ConfigRequestHdr, (UINT64)BufferSize);
> - FreePool (ConfigRequestHdr);
> - }
> - Status = HiiConfigRouting->BlockToConfig (
> - HiiConfigRouting,
> - ConfigRequest,
> - (UINT8 *) IfrNvData,
> - BufferSize,
> - Results,
> - Progress
> - );
> - FreePool (IfrNvData);
> - //
> - // Free the allocated config request string.
> - //
> - if (AllocatedRequest) {
> - FreePool (ConfigRequest);
> - ConfigRequest = NULL;
> - }
> -
> - //
> - // Set Progress string to the original request string.
> - //
> - if (Request == NULL) {
> - *Progress = NULL;
> - } else if (StrStr (Request, L"OFFSET") == NULL) {
> - *Progress = Request + StrLen (Request);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - This function applies changes in a driver's configuration.
> - Input is a Configuration, which has the routing data for this
> - driver followed by name / value configuration pairs. The driver
> - must apply those pairs to its configurable storage. If the
> - driver's configuration is stored in a linear block of data
> - and the driver's name / value pairs are in <BlockConfig>
> - format, it may use the ConfigToBlock helper function (above) to
> - simplify the job. Currently not implemented.
> -
> - @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
> - @param[in] Configuration A null-terminated Unicode string in
> - <ConfigString> format.
> - @param[out] Progress A pointer to a string filled in with the
> - offset of the most recent '&' before the
> - first failing name / value pair (or the
> - beginn ing of the string if the failure
> - is in the first name / value pair) or
> - the terminating NULL if all was
> - successful.
> -
> - @retval EFI_SUCCESS The results have been distributed or are
> - awaiting distribution.
> - @retval EFI_OUT_OF_RESOURCES Not enough memory to store the
> - parts of the results that must be
> - stored awaiting possible future
> - protocols.
> - @retval EFI_INVALID_PARAMETERS Passing in a NULL for the
> - Results parameter would result
> - in this type of error.
> - @retval EFI_NOT_FOUND Target for the specified routing data
> - was not found.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiFormRouteConfig (
> - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
> - IN CONST EFI_STRING Configuration,
> - OUT EFI_STRING *Progress
> - )
> -{
> - if (Configuration == NULL || Progress == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - //
> - // Check routing data in <ConfigHdr>.
> - // Note: if only one Storage is used, then this checking could be skipped.
> - //
> - if (!HiiIsConfigHdrMatch (Configuration, &gIp4IScsiConfigGuid,
> mVendorStorageName)) {
> - *Progress = Configuration;
> - return EFI_NOT_FOUND;
> - }
> -
> - *Progress = Configuration + StrLen (Configuration);
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - This function is called to provide results data to the driver.
> - This data consists of a unique key that is used to identify
> - which data is either being passed back or being asked for.
> -
> - @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
> - @param[in] Action Specifies the type of action taken by the browser.
> - @param[in] QuestionId A unique value which is sent to the original
> - exporting driver so that it can identify the type
> - of data to expect. The format of the data tends to
> - vary based on the opcode that enerated the callback.
> - @param[in] Type The type of value for the question.
> - @param[in] Value A pointer to the data being sent to the original
> - exporting driver.
> - @param[out] ActionRequest On return, points to the action requested
> by the
> - callback function.
> -
> - @retval EFI_SUCCESS The callback successfully handled the action.
> - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold
> the
> - variable and its data.
> - @retval EFI_DEVICE_ERROR The variable could not be saved.
> - @retval EFI_UNSUPPORTED The specified Action is not supported by
> the
> - callback.Currently not implemented.
> - @retval EFI_INVALID_PARAMETERS Passing in wrong parameter.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiFormCallback (
> - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
> - IN EFI_BROWSER_ACTION Action,
> - IN EFI_QUESTION_ID QuestionId,
> - IN UINT8 Type,
> - IN EFI_IFR_TYPE_VALUE *Value,
> - OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
> - )
> -{
> - ISCSI_FORM_CALLBACK_INFO *Private;
> - UINTN BufferSize;
> - CHAR8 IScsiName[ISCSI_NAME_MAX_SIZE];
> - CHAR16 PortString[128];
> - CHAR8 Ip4String[IP4_STR_MAX_SIZE];
> - CHAR8 LunString[ISCSI_LUN_STR_MAX_LEN];
> - UINT64 Lun;
> - EFI_STRING_ID DeviceFormTitleToken;
> - ISCSI_CONFIG_IFR_NVDATA *IfrNvData;
> - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry;
> - EFI_IP_ADDRESS HostIp;
> - EFI_IP_ADDRESS SubnetMask;
> - EFI_IP_ADDRESS Gateway;
> - EFI_STATUS Status;
> - EFI_INPUT_KEY Key;
> -
> - if (Action != EFI_BROWSER_ACTION_CHANGING && Action !=
> EFI_BROWSER_ACTION_CHANGED) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);
> - //
> - // Retrieve uncommitted data from Browser
> - //
> - IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA));
> - ASSERT (IfrNvData != NULL);
> - if (!HiiGetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName,
> sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData)) {
> - FreePool (IfrNvData);
> - return EFI_NOT_FOUND;
> - }
> - Status = EFI_SUCCESS;
> -
> - if (Action == EFI_BROWSER_ACTION_CHANGING) {
> - if ((QuestionId >= KEY_DEVICE_ENTRY_BASE) && (QuestionId <
> (mNumberOfIScsiDevices + KEY_DEVICE_ENTRY_BASE))) {
> - //
> - // In case goto the device configuration form, update the device form
> title.
> - //
> - ConfigFormEntry = IScsiGetConfigFormEntryByIndex ((UINT32)
> (QuestionId - KEY_DEVICE_ENTRY_BASE));
> - ASSERT (ConfigFormEntry != NULL);
> -
> - UnicodeSPrint (PortString, (UINTN) sizeof (PortString), L"Port %s",
> ConfigFormEntry->MacString);
> - DeviceFormTitleToken = (EFI_STRING_ID)
> STR_ISCSI_DEVICE_FORM_TITLE;
> - HiiSetString (Private->RegisteredHandle, DeviceFormTitleToken,
> PortString, NULL);
> -
> - IScsiConvertDeviceConfigDataToIfrNvData (ConfigFormEntry, IfrNvData);
> -
> - Private->Current = ConfigFormEntry;
> - }
> - } else if (Action == EFI_BROWSER_ACTION_CHANGED) {
> - switch (QuestionId) {
> - case KEY_INITIATOR_NAME:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->InitiatorName, IScsiName);
> - BufferSize = AsciiStrSize (IScsiName);
> -
> - Status = gIScsiInitiatorName.Set (&gIScsiInitiatorName, &BufferSize,
> IScsiName);
> - if (EFI_ERROR (Status)) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Invalid iSCSI Name!", NULL);
> - }
> -
> - *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;
> - break;
> -
> - case KEY_LOCAL_IP:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String);
> - Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);
> - if (EFI_ERROR (Status) ||
> - ((Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) &&
> - !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), NTOHL(*(UINT32*)Private-
> >Current->SessionConfigData.SubnetMask.Addr)))) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Invalid IP address!", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - } else {
> - CopyMem (&Private->Current->SessionConfigData.LocalIp, &HostIp.v4,
> sizeof (HostIp.v4));
> - }
> -
> - break;
> -
> - case KEY_SUBNET_MASK:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->SubnetMask, Ip4String);
> - Status = IScsiAsciiStrToIp (Ip4String, &SubnetMask.v4);
> - if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) &&
> (IScsiGetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Invalid Subnet Mask!", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - } else {
> - CopyMem (&Private->Current->SessionConfigData.SubnetMask,
> &SubnetMask.v4, sizeof (SubnetMask.v4));
> - }
> -
> - break;
> -
> - case KEY_GATE_WAY:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String);
> - Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4);
> - if (EFI_ERROR (Status) ||
> - ((Gateway.Addr[0] != 0) &&
> - (Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) &&
> - !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]),
> NTOHL(*(UINT32*)Private->Current-
> >SessionConfigData.SubnetMask.Addr)))) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Invalid Gateway!", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - } else {
> - CopyMem (&Private->Current->SessionConfigData.Gateway,
> &Gateway.v4, sizeof (Gateway.v4));
> - }
> -
> - break;
> -
> - case KEY_TARGET_IP:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String);
> - Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);
> - if (EFI_ERROR (Status) || IP4_IS_LOCAL_BROADCAST
> (EFI_NTOHL(HostIp.v4)) || IP4_IS_UNSPECIFIED (EFI_NTOHL(HostIp.v4))) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Invalid IP address!", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - } else {
> - CopyMem (&Private->Current->SessionConfigData.TargetIp, &HostIp.v4,
> sizeof (HostIp.v4));
> - }
> -
> - break;
> -
> - case KEY_TARGET_NAME:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->TargetName, IScsiName);
> - Status = IScsiNormalizeName (IScsiName, AsciiStrLen (IScsiName));
> - if (EFI_ERROR (Status)) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Invalid iSCSI Name!", NULL);
> - } else {
> - AsciiStrCpyS (Private->Current->SessionConfigData.TargetName,
> ISCSI_NAME_MAX_SIZE, IScsiName);
> - }
> -
> - break;
> -
> - case KEY_DHCP_ENABLE:
> - if (IfrNvData->InitiatorInfoFromDhcp == 0) {
> - IfrNvData->TargetInfoFromDhcp = 0;
> - }
> -
> - break;
> -
> - case KEY_BOOT_LUN:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->BootLun, LunString);
> - Status = IScsiAsciiStrToLun (LunString, (UINT8 *) &Lun);
> - if (EFI_ERROR (Status)) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Invalid LUN string!", NULL);
> - } else {
> - CopyMem (Private->Current->SessionConfigData.BootLun, &Lun, sizeof
> (Lun));
> - }
> -
> - break;
> -
> - case KEY_CHAP_NAME:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPName, Private->Current-
> >AuthConfigData.CHAPName);
> - break;
> -
> - case KEY_CHAP_SECRET:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPSecret, Private->Current-
> >AuthConfigData.CHAPSecret);
> - break;
> -
> - case KEY_REVERSE_CHAP_NAME:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPName, Private-
> >Current->AuthConfigData.ReverseCHAPName);
> - break;
> -
> - case KEY_REVERSE_CHAP_SECRET:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPSecret, Private-
> >Current->AuthConfigData.ReverseCHAPSecret);
> - break;
> -
> - case KEY_CONFIG_ISID:
> - IScsiParseIsIdFromString (IfrNvData->IsId, Private->Current-
> >SessionConfigData.IsId);
> - IScsiConvertIsIdToString (IfrNvData->IsId, Private->Current-
> >SessionConfigData.IsId);
> -
> - break;
> -
> - case KEY_SAVE_CHANGES:
> - //
> - // First, update those fields which don't have INTERACTIVE set.
> - //
> - Private->Current->SessionConfigData.Enabled = IfrNvData-
> >Enabled;
> - Private->Current->SessionConfigData.InitiatorInfoFromDhcp = IfrNvData-
> >InitiatorInfoFromDhcp;
> - Private->Current->SessionConfigData.TargetPort = IfrNvData-
> >TargetPort;
> - if (Private->Current->SessionConfigData.TargetPort == 0) {
> - Private->Current->SessionConfigData.TargetPort =
> ISCSI_WELL_KNOWN_PORT;
> - }
> -
> - Private->Current->SessionConfigData.TargetInfoFromDhcp = IfrNvData-
> >TargetInfoFromDhcp;
> - Private->Current->AuthConfigData.CHAPType = IfrNvData-
> >CHAPType;
> -
> - //
> - // Only do full parameter validation if iSCSI is enabled on this device.
> - //
> - if (Private->Current->SessionConfigData.Enabled) {
> - //
> - // Validate the address configuration of the Initiator if DHCP isn't
> - // deployed.
> - //
> - if (!Private->Current->SessionConfigData.InitiatorInfoFromDhcp) {
> - CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.LocalIp,
> sizeof (HostIp.v4));
> - CopyMem (&SubnetMask.v4, &Private->Current-
> >SessionConfigData.SubnetMask, sizeof (SubnetMask.v4));
> - CopyMem (&Gateway.v4, &Private->Current-
> >SessionConfigData.Gateway, sizeof (Gateway.v4));
> -
> - if ((Gateway.Addr[0] != 0)) {
> - if (SubnetMask.Addr[0] == 0) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Gateway address is set but subnet mask is zero.", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - } else if (!IP4_NET_EQUAL (HostIp.Addr[0], Gateway.Addr[0],
> SubnetMask.Addr[0])) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Local IP and Gateway are not in the same subnet.", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - }
> - }
> - }
> - //
> - // Validate target configuration if DHCP isn't deployed.
> - //
> - if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) {
> - CopyMem (&HostIp.v4, &Private->Current-
> >SessionConfigData.TargetIp, sizeof (HostIp.v4));
> - if (IP4_IS_UNSPECIFIED (NTOHL (HostIp.Addr[0])) ||
> IP4_IS_LOCAL_BROADCAST (NTOHL (HostIp.Addr[0]))) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Target IP is invalid!", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - }
> -
> - //
> - // Validate iSCSI target name configuration again:
> - // The format of iSCSI target name is already verified when user input
> the name;
> - // here we only check the case user does not input the name.
> - //
> - if (Private->Current->SessionConfigData.TargetName[0] == '\0') {
> - CreatePopUp (
> - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
> - &Key,
> - L"iSCSI target name is NULL!",
> - NULL
> - );
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - }
> -
> - }
> -
> - if (IfrNvData->CHAPType != ISCSI_CHAP_NONE) {
> - if ((IfrNvData->CHAPName[0] == '\0') || (IfrNvData->CHAPSecret[0] ==
> '\0')) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"CHAP Name or CHAP Secret is invalid!", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - }
> -
> - if ((IfrNvData->CHAPType == ISCSI_CHAP_MUTUAL) &&
> - ((IfrNvData->ReverseCHAPName[0] == '\0') || (IfrNvData-
> >ReverseCHAPSecret[0] == '\0'))
> - ) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Reverse CHAP Name or Reverse CHAP Secret is invalid!", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - }
> - }
> - }
> -
> - BufferSize = sizeof (Private->Current->SessionConfigData);
> - gRT->SetVariable (
> - Private->Current->MacString,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - ISCSI_CONFIG_VAR_ATTR,
> - BufferSize,
> - &Private->Current->SessionConfigData
> - );
> -
> - BufferSize = sizeof (Private->Current->AuthConfigData);
> - gRT->SetVariable (
> - Private->Current->MacString,
> - &gIScsiCHAPAuthInfoGuid,
> - ISCSI_CONFIG_VAR_ATTR,
> - BufferSize,
> - &Private->Current->AuthConfigData
> - );
> - *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;
> - break;
> -
> - default:
> - break;
> - }
> - }
> -
> - if (!EFI_ERROR (Status)) {
> - //
> - // Pass changed uncommitted data back to Form Browser
> - //
> - HiiSetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, sizeof
> (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData, NULL);
> - }
> -
> - FreePool (IfrNvData);
> -
> - return Status;
> -}
> -
> -/**
> - Updates the iSCSI configuration form to add/delete an entry for the iSCSI
> - device specified by the Controller.
> -
> - @param[in] DriverBindingHandle The driverbinding handle.
> - @param[in] Controller The controller handle of the iSCSI device.
> - @param[in] AddForm Whether to add or delete a form entry.
> -
> - @retval EFI_SUCCESS The iSCSI configuration form is updated.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConfigUpdateForm (
> - IN EFI_HANDLE DriverBindingHandle,
> - IN EFI_HANDLE Controller,
> - IN BOOLEAN AddForm
> - )
> -{
> - LIST_ENTRY *Entry;
> - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry;
> - BOOLEAN EntryExisted;
> - EFI_STATUS Status;
> - EFI_MAC_ADDRESS MacAddress;
> - UINTN HwAddressSize;
> - UINT16 VlanId;
> - CHAR16 PortString[128];
> - UINT16 FormIndex;
> - UINTN BufferSize;
> - VOID *StartOpCodeHandle;
> - VOID *EndOpCodeHandle;
> - EFI_IFR_GUID_LABEL *StartLabel;
> - EFI_IFR_GUID_LABEL *EndLabel;
> -
> - ConfigFormEntry = NULL;
> - EntryExisted = FALSE;
> -
> - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {
> - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry,
> ISCSI_CONFIG_FORM_ENTRY, Link);
> -
> - if (ConfigFormEntry->Controller == Controller) {
> - EntryExisted = TRUE;
> - break;
> - }
> - }
> -
> - if (AddForm) {
> - if (EntryExisted) {
> - return EFI_SUCCESS;
> - } else {
> - //
> - // Add a new form.
> - //
> - ConfigFormEntry = (ISCSI_CONFIG_FORM_ENTRY *) AllocateZeroPool
> (sizeof (ISCSI_CONFIG_FORM_ENTRY));
> - if (ConfigFormEntry == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - InitializeListHead (&ConfigFormEntry->Link);
> - ConfigFormEntry->Controller = Controller;
> -
> - //
> - // Get the MAC address and convert it into the formatted string.
> - //
> - Status = NetLibGetMacAddress (Controller, &MacAddress,
> &HwAddressSize);
> - ASSERT (Status == EFI_SUCCESS);
> - VlanId = NetLibGetVlanId (Controller);
> -
> - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId,
> ConfigFormEntry->MacString);
> -
> - //
> - // Get the normal session configuration data.
> - //
> - BufferSize = sizeof (ConfigFormEntry->SessionConfigData);
> - Status = gRT->GetVariable (
> - ConfigFormEntry->MacString,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - NULL,
> - &BufferSize,
> - &ConfigFormEntry->SessionConfigData
> - );
> - if (EFI_ERROR (Status)) {
> - ZeroMem (&ConfigFormEntry->SessionConfigData, sizeof
> (ConfigFormEntry->SessionConfigData));
> -
> - //
> - // Generate OUI-format ISID based on MAC address.
> - //
> - CopyMem (ConfigFormEntry->SessionConfigData.IsId, &MacAddress, 6);
> - ConfigFormEntry->SessionConfigData.IsId[0] =
> - (UINT8) (ConfigFormEntry->SessionConfigData.IsId[0] & 0x3F);
> - }
> - //
> - // Get the CHAP authentication configuration data.
> - //
> - BufferSize = sizeof (ConfigFormEntry->AuthConfigData);
> - Status = gRT->GetVariable (
> - ConfigFormEntry->MacString,
> - &gIScsiCHAPAuthInfoGuid,
> - NULL,
> - &BufferSize,
> - &ConfigFormEntry->AuthConfigData
> - );
> - if (EFI_ERROR (Status)) {
> - ZeroMem (&ConfigFormEntry->AuthConfigData, sizeof
> (ConfigFormEntry->AuthConfigData));
> - }
> - //
> - // Compose the Port string and create a new EFI_STRING_ID.
> - //
> - UnicodeSPrint (PortString, sizeof (PortString), L"Port %s",
> ConfigFormEntry->MacString);
> - ConfigFormEntry->PortTitleToken = HiiSetString (mCallbackInfo-
> >RegisteredHandle, 0, PortString, NULL);
> -
> - //
> - // Compose the help string of this port and create a new EFI_STRING_ID.
> - //
> - UnicodeSPrint (PortString, sizeof (PortString), L"Set the iSCSI parameters
> on port %s", ConfigFormEntry->MacString);
> - ConfigFormEntry->PortTitleHelpToken = HiiSetString (mCallbackInfo-
> >RegisteredHandle, 0, PortString, NULL);
> -
> - InsertTailList (&mIScsiConfigFormList, &ConfigFormEntry->Link);
> - mNumberOfIScsiDevices++;
> - }
> - } else {
> - ASSERT (EntryExisted);
> -
> - mNumberOfIScsiDevices--;
> - RemoveEntryList (&ConfigFormEntry->Link);
> - FreePool (ConfigFormEntry);
> - mCallbackInfo->Current = NULL;
> - }
> - //
> - // Allocate space for creation of Buffer
> - //
> -
> - //
> - // Init OpCode Handle
> - //
> - StartOpCodeHandle = HiiAllocateOpCodeHandle ();
> - ASSERT (StartOpCodeHandle != NULL);
> -
> - EndOpCodeHandle = HiiAllocateOpCodeHandle ();
> - ASSERT (EndOpCodeHandle != NULL);
> -
> - //
> - // Create Hii Extend Label OpCode as the start opcode
> - //
> - StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode
> (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof
> (EFI_IFR_GUID_LABEL));
> - StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
> - StartLabel->Number = DEVICE_ENTRY_LABEL;
> -
> - //
> - // Create Hii Extend Label OpCode as the end opcode
> - //
> - EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode
> (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
> - EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
> - EndLabel->Number = LABEL_END;
> -
> - FormIndex = 0;
> - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {
> - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry,
> ISCSI_CONFIG_FORM_ENTRY, Link);
> -
> - HiiCreateGotoOpCode (
> - StartOpCodeHandle, // Container for dynamic created
> opcodes
> - FORMID_DEVICE_FORM, // Target Form ID
> - ConfigFormEntry->PortTitleToken, // Prompt text
> - ConfigFormEntry->PortTitleHelpToken, // Help text
> - EFI_IFR_FLAG_CALLBACK, // Question flag
> - (UINT16)(KEY_DEVICE_ENTRY_BASE + FormIndex) // Question ID
> - );
> -
> - FormIndex++;
> - }
> -
> - HiiUpdateForm (
> - mCallbackInfo->RegisteredHandle,
> - &gIp4IScsiConfigGuid,
> - FORMID_MAIN_FORM,
> - StartOpCodeHandle, // Label DEVICE_ENTRY_LABEL
> - EndOpCodeHandle // LABEL_END
> - );
> -
> - HiiFreeOpCodeHandle (StartOpCodeHandle);
> - HiiFreeOpCodeHandle (EndOpCodeHandle);
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Initialize the iSCSI configuration form.
> -
> - @param[in] DriverBindingHandle The iSCSI driverbinding handle.
> -
> - @retval EFI_SUCCESS The iSCSI configuration form is initialized.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConfigFormInit (
> - VOID
> - )
> -{
> - EFI_STATUS Status;
> - EFI_HII_DATABASE_PROTOCOL *HiiDatabase;
> - ISCSI_FORM_CALLBACK_INFO *CallbackInfo;
> -
> - Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID
> **)&HiiDatabase);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - CallbackInfo = (ISCSI_FORM_CALLBACK_INFO *) AllocateZeroPool (sizeof
> (ISCSI_FORM_CALLBACK_INFO));
> - if (CallbackInfo == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - CallbackInfo->Signature = ISCSI_FORM_CALLBACK_INFO_SIGNATURE;
> - CallbackInfo->HiiDatabase = HiiDatabase;
> - CallbackInfo->Current = NULL;
> -
> - CallbackInfo->ConfigAccess.ExtractConfig = IScsiFormExtractConfig;
> - CallbackInfo->ConfigAccess.RouteConfig = IScsiFormRouteConfig;
> - CallbackInfo->ConfigAccess.Callback = IScsiFormCallback;
> -
> - Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL,
> (VOID **)&CallbackInfo->ConfigRouting);
> - if (EFI_ERROR (Status)) {
> - FreePool(CallbackInfo);
> - return Status;
> - }
> -
> - //
> - // Install Device Path Protocol and Config Access protocol to driver handle
> - //
> - Status = gBS->InstallMultipleProtocolInterfaces (
> - &CallbackInfo->DriverHandle,
> - &gEfiDevicePathProtocolGuid,
> - &mIScsiHiiVendorDevicePath,
> - &gEfiHiiConfigAccessProtocolGuid,
> - &CallbackInfo->ConfigAccess,
> - NULL
> - );
> - ASSERT_EFI_ERROR (Status);
> -
> - //
> - // Publish our HII data
> - //
> - CallbackInfo->RegisteredHandle = HiiAddPackages (
> - &gIp4IScsiConfigGuid,
> - CallbackInfo->DriverHandle,
> - IScsi4DxeStrings,
> - IScsiConfigDxeBin,
> - NULL
> - );
> - if (CallbackInfo->RegisteredHandle == NULL) {
> - FreePool(CallbackInfo);
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - mCallbackInfo = CallbackInfo;
> -
> - return Status;
> -}
> -
> -/**
> - Unload the iSCSI configuration form, this includes: delete all the iSCSI
> - device configuration entries, uninstall the form callback protocol and
> - free the resources used.
> -
> - @param[in] DriverBindingHandle The iSCSI driverbinding handle.
> -
> - @retval EFI_SUCCESS The iSCSI configuration form is unloaded.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -**/
> -EFI_STATUS
> -IScsiConfigFormUnload (
> - IN EFI_HANDLE DriverBindingHandle
> - )
> -{
> - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry;
> -
> - while (!IsListEmpty (&mIScsiConfigFormList)) {
> - //
> - // Uninstall the device forms as the iSCSI driver instance may fail to
> - // control the controller but still install the device configuration form.
> - // In such case, upon driver unloading, the driver instance's driverbinding.
> - // stop () won't be called, so we have to take this chance here to uninstall
> - // the device form.
> - //
> - ConfigFormEntry = NET_LIST_USER_STRUCT
> (mIScsiConfigFormList.ForwardLink, ISCSI_CONFIG_FORM_ENTRY, Link);
> - IScsiConfigUpdateForm (DriverBindingHandle, ConfigFormEntry-
> >Controller, FALSE);
> - }
> -
> - //
> - // Remove HII package list
> - //
> - mCallbackInfo->HiiDatabase->RemovePackageList (
> - mCallbackInfo->HiiDatabase,
> - mCallbackInfo->RegisteredHandle
> - );
> -
> - //
> - // Uninstall EFI_HII_CONFIG_ACCESS_PROTOCOL
> - //
> - gBS->UninstallMultipleProtocolInterfaces (
> - mCallbackInfo->DriverHandle,
> - &gEfiDevicePathProtocolGuid,
> - &mIScsiHiiVendorDevicePath,
> - &gEfiHiiConfigAccessProtocolGuid,
> - &mCallbackInfo->ConfigAccess,
> - NULL
> - );
> - FreePool (mCallbackInfo);
> -
> - return EFI_SUCCESS;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c
> deleted file mode 100644
> index 6a876c8b69dd..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c
> +++ /dev/null
> @@ -1,472 +0,0 @@
> -/** @file
> - iSCSI DHCP related configuration routines.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -/**
> - Extract the Root Path option and get the required target information.
> -
> - @param[in] RootPath The RootPath.
> - @param[in] Length Length of the RootPath option payload.
> - @param[in, out] ConfigNvData The iSCSI session configuration data read
> from nonvolatile device.
> -
> - @retval EFI_SUCCESS All required information is extracted from the
> RootPath option.
> - @retval EFI_NOT_FOUND The RootPath is not an iSCSI RootPath.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_INVALID_PARAMETER The RootPath is mal-formatted.
> -**/
> -EFI_STATUS
> -IScsiDhcpExtractRootPath (
> - IN CHAR8 *RootPath,
> - IN UINT8 Length,
> - IN OUT ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData
> - )
> -{
> - EFI_STATUS Status;
> - UINT8 IScsiRootPathIdLen;
> - CHAR8 *TmpStr;
> - ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX];
> - ISCSI_ROOT_PATH_FIELD *Field;
> - UINT32 FieldIndex;
> - UINT8 Index;
> -
> - //
> - // "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname>
> - //
> - IScsiRootPathIdLen = (UINT8) AsciiStrLen (ISCSI_ROOT_PATH_ID);
> -
> - if ((Length <= IScsiRootPathIdLen) || (CompareMem (RootPath,
> ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) {
> - return EFI_NOT_FOUND;
> - }
> - //
> - // Skip the iSCSI RootPath ID "iscsi:".
> - //
> - RootPath += IScsiRootPathIdLen;
> - Length = (UINT8) (Length - IScsiRootPathIdLen);
> -
> - TmpStr = (CHAR8 *) AllocatePool (Length + 1);
> - if (TmpStr == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - CopyMem (TmpStr, RootPath, Length);
> - TmpStr[Length] = '\0';
> -
> - Index = 0;
> - FieldIndex = RP_FIELD_IDX_SERVERNAME;
> - ZeroMem (&Fields[0], sizeof (Fields));
> -
> - //
> - // Extract the fields in the Root Path option string.
> - //
> - for (FieldIndex = RP_FIELD_IDX_SERVERNAME; (FieldIndex <
> RP_FIELD_IDX_MAX) && (Index < Length); FieldIndex++) {
> - if (TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) {
> - Fields[FieldIndex].Str = &TmpStr[Index];
> - }
> -
> - while ((TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) && (Index
> < Length)) {
> - Index++;
> - }
> -
> - if (TmpStr[Index] == ISCSI_ROOT_PATH_FIELD_DELIMITER) {
> - if (FieldIndex != RP_FIELD_IDX_TARGETNAME) {
> - TmpStr[Index] = '\0';
> - Index++;
> - }
> -
> - if (Fields[FieldIndex].Str != NULL) {
> - Fields[FieldIndex].Len = (UINT8) AsciiStrLen (Fields[FieldIndex].Str);
> - }
> - }
> - }
> -
> - if (FieldIndex != RP_FIELD_IDX_MAX) {
> - Status = EFI_INVALID_PARAMETER;
> - goto ON_EXIT;
> - }
> -
> - if ((Fields[RP_FIELD_IDX_SERVERNAME].Str == NULL) ||
> - (Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) ||
> - (Fields[RP_FIELD_IDX_PROTOCOL].Len > 1)
> - ) {
> -
> - Status = EFI_INVALID_PARAMETER;
> - goto ON_EXIT;
> - }
> - //
> - // Get the IP address of the target.
> - //
> - Field = &Fields[RP_FIELD_IDX_SERVERNAME];
> - Status = IScsiAsciiStrToIp (Field->Str, &ConfigNvData->TargetIp);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - //
> - // Check the protocol type.
> - //
> - Field = &Fields[RP_FIELD_IDX_PROTOCOL];
> - if ((Field->Str != NULL) && ((*(Field->Str) - '0') != EFI_IP_PROTO_TCP)) {
> - Status = EFI_INVALID_PARAMETER;
> - goto ON_EXIT;
> - }
> - //
> - // Get the port of the iSCSI target.
> - //
> - Field = &Fields[RP_FIELD_IDX_PORT];
> - if (Field->Str != NULL) {
> - ConfigNvData->TargetPort = (UINT16) AsciiStrDecimalToUintn (Field->Str);
> - } else {
> - ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT;
> - }
> - //
> - // Get the LUN.
> - //
> - Field = &Fields[RP_FIELD_IDX_LUN];
> - if (Field->Str != NULL) {
> - Status = IScsiAsciiStrToLun (Field->Str, ConfigNvData->BootLun);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - } else {
> - ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun));
> - }
> - //
> - // Get the target iSCSI Name.
> - //
> - Field = &Fields[RP_FIELD_IDX_TARGETNAME];
> -
> - if (AsciiStrLen (Field->Str) > ISCSI_NAME_MAX_SIZE - 1) {
> - Status = EFI_INVALID_PARAMETER;
> - goto ON_EXIT;
> - }
> - //
> - // Validate the iSCSI name.
> - //
> - Status = IScsiNormalizeName (Field->Str, AsciiStrLen (Field->Str));
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - AsciiStrCpyS (ConfigNvData->TargetName, ISCSI_NAME_MAX_SIZE, Field-
> >Str);
> -
> -ON_EXIT:
> -
> - FreePool (TmpStr);
> -
> - return Status;
> -}
> -
> -/**
> - The callback function registerd to the DHCP4 instance which is used to
> select
> - the qualified DHCP OFFER.
> -
> - @param[in] This The DHCP4 protocol.
> - @param[in] Context The context set when configuring the DHCP4
> protocol.
> - @param[in] CurrentState The current state of the DHCP4 protocol.
> - @param[in] Dhcp4Event The event occurs in the current state.
> - @param[in] Packet The DHCP packet that is to be sent or already
> received.
> - @param[out] NewPacket The packet used to replace the above Packet.
> -
> - @retval EFI_SUCCESS Either the DHCP OFFER is qualified or we're not
> intereseted
> - in the Dhcp4Event.
> - @retval EFI_NOT_READY The DHCP OFFER packet doesn't match our
> requirements.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDhcpSelectOffer (
> - IN EFI_DHCP4_PROTOCOL * This,
> - IN VOID *Context,
> - IN EFI_DHCP4_STATE CurrentState,
> - IN EFI_DHCP4_EVENT Dhcp4Event,
> - IN EFI_DHCP4_PACKET * Packet, OPTIONAL
> - OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL
> - )
> -{
> - EFI_STATUS Status;
> - UINT32 OptionCount;
> - EFI_DHCP4_PACKET_OPTION **OptionList;
> - UINT32 Index;
> -
> - if ((Dhcp4Event != Dhcp4RcvdOffer) && (Dhcp4Event != Dhcp4SelectOffer))
> {
> - return EFI_SUCCESS;
> - }
> -
> - OptionCount = 0;
> -
> - Status = This->Parse (This, Packet, &OptionCount, NULL);
> - if (Status != EFI_BUFFER_TOO_SMALL) {
> - return EFI_NOT_READY;
> - }
> -
> - OptionList = AllocatePool (OptionCount * sizeof
> (EFI_DHCP4_PACKET_OPTION *));
> - if (OptionList == NULL) {
> - return EFI_NOT_READY;
> - }
> -
> - Status = This->Parse (This, Packet, &OptionCount, OptionList);
> - if (EFI_ERROR (Status)) {
> - FreePool (OptionList);
> - return EFI_NOT_READY;
> - }
> -
> - for (Index = 0; Index < OptionCount; Index++) {
> - if (OptionList[Index]->OpCode != DHCP4_TAG_ROOTPATH) {
> - continue;
> - }
> -
> - Status = IScsiDhcpExtractRootPath (
> - (CHAR8 *) &OptionList[Index]->Data[0],
> - OptionList[Index]->Length,
> - (ISCSI_SESSION_CONFIG_NVDATA *) Context
> - );
> -
> - break;
> - }
> -
> - if (Index == OptionCount) {
> - Status = EFI_NOT_READY;
> - }
> -
> - FreePool (OptionList);
> -
> - return Status;
> -}
> -
> -/**
> - Parse the DHCP ACK to get the address configuration and DNS information.
> -
> - @param[in] Dhcp4 The DHCP4 protocol.
> - @param[in, out] ConfigData The session configuration data.
> -
> - @retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
> - @retval EFI_NO_MAPPING DHCP failed to acquire address and other
> information.
> - @retval EFI_INVALID_PARAMETER The DHCP ACK's DNS option is mal-
> formatted.
> - @retval EFI_DEVICE_ERROR Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiParseDhcpAck (
> - IN EFI_DHCP4_PROTOCOL *Dhcp4,
> - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData
> - )
> -{
> - EFI_STATUS Status;
> - EFI_DHCP4_MODE_DATA Dhcp4ModeData;
> - UINT32 OptionCount;
> - EFI_DHCP4_PACKET_OPTION **OptionList;
> - UINT32 Index;
> -
> - Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4ModeData);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - if (Dhcp4ModeData.State != Dhcp4Bound) {
> - return EFI_NO_MAPPING;
> - }
> -
> - CopyMem (&ConfigData->NvData.LocalIp,
> &Dhcp4ModeData.ClientAddress, sizeof (EFI_IPv4_ADDRESS));
> - CopyMem (&ConfigData->NvData.SubnetMask,
> &Dhcp4ModeData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
> - CopyMem (&ConfigData->NvData.Gateway,
> &Dhcp4ModeData.RouterAddress, sizeof (EFI_IPv4_ADDRESS));
> -
> - OptionCount = 0;
> - OptionList = NULL;
> -
> - Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket,
> &OptionCount, OptionList);
> - if (Status != EFI_BUFFER_TOO_SMALL) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - OptionList = AllocatePool (OptionCount * sizeof
> (EFI_DHCP4_PACKET_OPTION *));
> - if (OptionList == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket,
> &OptionCount, OptionList);
> - if (EFI_ERROR (Status)) {
> - FreePool (OptionList);
> - return EFI_DEVICE_ERROR;
> - }
> -
> - for (Index = 0; Index < OptionCount; Index++) {
> - //
> - // Get DNS server addresses and DHCP server address from this offer.
> - //
> - if (OptionList[Index]->OpCode == DHCP4_TAG_DNS_SERVER) {
> -
> - if (((OptionList[Index]->Length & 0x3) != 0) || (OptionList[Index]-
> >Length == 0)) {
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - }
> - //
> - // Primary DNS server address.
> - //
> - CopyMem (&ConfigData->PrimaryDns, &OptionList[Index]->Data[0],
> sizeof (EFI_IPv4_ADDRESS));
> -
> - if (OptionList[Index]->Length > 4) {
> - //
> - // Secondary DNS server address
> - //
> - CopyMem (&ConfigData->SecondaryDns, &OptionList[Index]->Data[4],
> sizeof (EFI_IPv4_ADDRESS));
> - }
> - } else if (OptionList[Index]->OpCode == DHCP4_TAG_SERVER_ID) {
> - if (OptionList[Index]->Length != 4) {
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - }
> -
> - CopyMem (&ConfigData->DhcpServer, &OptionList[Index]->Data[0],
> sizeof (EFI_IPv4_ADDRESS));
> - }
> - }
> -
> - FreePool (OptionList);
> -
> - return Status;
> -}
> -
> -/**
> - Parse the DHCP ACK to get the address configuration and DNS information.
> -
> - @param[in] Image The handle of the driver image.
> - @param[in] Controller The handle of the controller;
> - @param[in, out] ConfigData The session configuration data.
> -
> - @retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NO_MEDIA There was a media error.
> - @retval Others Other errors as indicated.
> -
> -**/
> -EFI_STATUS
> -IScsiDoDhcp (
> - IN EFI_HANDLE Image,
> - IN EFI_HANDLE Controller,
> - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData
> - )
> -{
> - EFI_HANDLE Dhcp4Handle;
> - EFI_DHCP4_PROTOCOL *Dhcp4;
> - EFI_STATUS Status;
> - EFI_DHCP4_PACKET_OPTION *ParaList;
> - EFI_DHCP4_CONFIG_DATA Dhcp4ConfigData;
> - EFI_STATUS MediaStatus;
> - UINT8 *Data;
> -
> - Dhcp4Handle = NULL;
> - Dhcp4 = NULL;
> - ParaList = NULL;
> -
> - //
> - // Check media status before do DHCP
> - //
> - MediaStatus = EFI_SUCCESS;
> - NetLibDetectMediaWaitTimeout (Controller,
> ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME, &MediaStatus);
> - if (MediaStatus != EFI_SUCCESS) {
> - return EFI_NO_MEDIA;
> - }
> -
> - //
> - // Create a DHCP4 child instance and get the protocol.
> - //
> - Status = NetLibCreateServiceChild (
> - Controller,
> - Image,
> - &gEfiDhcp4ServiceBindingProtocolGuid,
> - &Dhcp4Handle
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - Status = gBS->OpenProtocol (
> - Dhcp4Handle,
> - &gEfiDhcp4ProtocolGuid,
> - (VOID **)&Dhcp4,
> - Image,
> - Controller,
> - EFI_OPEN_PROTOCOL_BY_DRIVER
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - ParaList = AllocatePool (sizeof (EFI_DHCP4_PACKET_OPTION) + 3);
> - if (ParaList == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto ON_EXIT;
> - }
> - //
> - // Ask the server to reply with Netmask, Router, DNS and RootPath options.
> - //
> - ParaList->OpCode = DHCP4_TAG_PARA_LIST;
> - ParaList->Length = (UINT8) (ConfigData->NvData.TargetInfoFromDhcp ? 4 :
> 3);
> - Data = &ParaList->Data[0];
> - Data[0] = DHCP4_TAG_NETMASK;
> - Data[1] = DHCP4_TAG_ROUTER;
> - Data[2] = DHCP4_TAG_DNS_SERVER;
> - Data[3] = DHCP4_TAG_ROOTPATH;
> -
> - ZeroMem (&Dhcp4ConfigData, sizeof (EFI_DHCP4_CONFIG_DATA));
> - Dhcp4ConfigData.OptionCount = 1;
> - Dhcp4ConfigData.OptionList = &ParaList;
> -
> - if (ConfigData->NvData.TargetInfoFromDhcp) {
> - //
> - // Use callback to select an offer which contains target information.
> - //
> - Dhcp4ConfigData.Dhcp4Callback = IScsiDhcpSelectOffer;
> - Dhcp4ConfigData.CallbackContext = &ConfigData->NvData;
> - }
> -
> - Status = Dhcp4->Configure (Dhcp4, &Dhcp4ConfigData);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - Status = Dhcp4->Start (Dhcp4, NULL);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - //
> - // Parse the ACK to get required information.
> - //
> - Status = IScsiParseDhcpAck (Dhcp4, ConfigData);
> -
> -ON_EXIT:
> -
> - if (ParaList != NULL) {
> - FreePool (ParaList);
> - }
> -
> - if (Dhcp4 != NULL) {
> - Dhcp4->Stop (Dhcp4);
> - Dhcp4->Configure (Dhcp4, NULL);
> -
> - gBS->CloseProtocol (
> - Dhcp4Handle,
> - &gEfiDhcp4ProtocolGuid,
> - Image,
> - Controller
> - );
> - }
> -
> - NetLibDestroyServiceChild (
> - Controller,
> - Image,
> - &gEfiDhcp4ServiceBindingProtocolGuid,
> - Dhcp4Handle
> - );
> -
> - return Status;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c
> deleted file mode 100644
> index 730f3e506bbc..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c
> +++ /dev/null
> @@ -1,676 +0,0 @@
> -/** @file
> - The entry point of IScsi driver.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -EFI_DRIVER_BINDING_PROTOCOL gIScsiDriverBinding = {
> - IScsiDriverBindingSupported,
> - IScsiDriverBindingStart,
> - IScsiDriverBindingStop,
> - 0xa,
> - NULL,
> - NULL
> -};
> -
> -/**
> - Tests to see if this driver supports the RemainingDevicePath.
> -
> - @param[in] RemainingDevicePath A pointer to the remaining portion of a
> device path. This
> - parameter is ignored by device drivers, and is optional for
> bus
> - drivers. For bus drivers, if this parameter is not NULL, then
> - the bus driver must determine if the bus controller
> specified
> - by ControllerHandle and the child controller specified
> - by RemainingDevicePath are both supported by this
> - bus driver.
> -
> - @retval EFI_SUCCESS The RemainingDevicePath is supported or
> NULL.
> - @retval EFI_UNSUPPORTED The device specified by ControllerHandle
> and
> - RemainingDevicePath is not supported by the driver
> specified by This.
> -**/
> -EFI_STATUS
> -IScsiIsDevicePathSupported (
> - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
> - )
> -{
> - EFI_DEVICE_PATH_PROTOCOL *CurrentDevicePath;
> -
> - CurrentDevicePath = RemainingDevicePath;
> - if (CurrentDevicePath != NULL) {
> - while (!IsDevicePathEnd (CurrentDevicePath)) {
> - if ((CurrentDevicePath->Type == MESSAGING_DEVICE_PATH) &&
> (CurrentDevicePath->SubType == MSG_ISCSI_DP)) {
> - return EFI_SUCCESS;
> - }
> -
> - CurrentDevicePath = NextDevicePathNode (CurrentDevicePath);
> - }
> -
> - return EFI_UNSUPPORTED;
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - 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[in] This A pointer to the
> EFI_DRIVER_BINDING_PROTOCOL instance.
> - @param[in] 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[in] 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 acces.
> - Currently not implemented.
> - @retval EFI_UNSUPPORTED The device specified by ControllerHandle
> and
> - RemainingDevicePath is not supported by the driver
> specified by This.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverBindingSupported (
> - IN EFI_DRIVER_BINDING_PROTOCOL *This,
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
> - )
> -{
> - EFI_STATUS Status;
> -
> - Status = gBS->OpenProtocol (
> - ControllerHandle,
> - &gEfiCallerIdGuid,
> - NULL,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_TEST_PROTOCOL
> - );
> - if (!EFI_ERROR (Status)) {
> - return EFI_ALREADY_STARTED;
> - }
> -
> - Status = gBS->OpenProtocol (
> - ControllerHandle,
> - &gEfiTcp4ServiceBindingProtocolGuid,
> - NULL,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_TEST_PROTOCOL
> - );
> - if (EFI_ERROR (Status)) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - Status = IScsiIsDevicePathSupported (RemainingDevicePath);
> - if (EFI_ERROR (Status)) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - if (IScsiDhcpIsConfigured (ControllerHandle)) {
> - Status = gBS->OpenProtocol (
> - ControllerHandle,
> - &gEfiDhcp4ServiceBindingProtocolGuid,
> - NULL,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_TEST_PROTOCOL
> - );
> - if (EFI_ERROR (Status)) {
> - return EFI_UNSUPPORTED;
> - }
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - 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[in] This A pointer to the
> EFI_DRIVER_BINDING_PROTOCOL instance.
> - @param[in] 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[in] 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_DEVICE_ERROR The device could not be started due to a
> device error.
> - Currently not implemented.
> - @retval EFI_OUT_OF_RESOURCES The request could not be completed
> due to a lack of resources.
> - @retval Others The driver failded to start the device.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverBindingStart (
> - IN EFI_DRIVER_BINDING_PROTOCOL *This,
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
> - )
> -{
> - EFI_STATUS Status;
> - ISCSI_DRIVER_DATA *Private;
> - VOID *Interface;
> -
> - Private = IScsiCreateDriverData (This->DriverBindingHandle,
> ControllerHandle);
> - if (Private == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - //
> - // Create a underlayer child instance, but not need to configure it. Just
> open ChildHandle
> - // via BY_DRIVER. That is, establishing the relationship between
> ControllerHandle and ChildHandle.
> - // Therefore, when DisconnectController(), especially VLAN virtual
> controller handle,
> - // IScsiDriverBindingStop() will be called.
> - //
> - Status = NetLibCreateServiceChild (
> - ControllerHandle,
> - This->DriverBindingHandle,
> - &gEfiTcp4ServiceBindingProtocolGuid,
> - &Private->ChildHandle
> - );
> -
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Status = gBS->OpenProtocol (
> - Private->ChildHandle,
> - &gEfiTcp4ProtocolGuid,
> - &Interface,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_BY_DRIVER
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - //
> - // Always install private protocol no matter what happens later. We need
> to
> - // keep the relationship between ControllerHandle and ChildHandle.
> - //
> - Status = gBS->InstallProtocolInterface (
> - &ControllerHandle,
> - &gEfiCallerIdGuid,
> - EFI_NATIVE_INTERFACE,
> - &Private->IScsiIdentifier
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - //
> - // Try to add a port configuration page for this controller.
> - //
> - IScsiConfigUpdateForm (This->DriverBindingHandle, ControllerHandle,
> TRUE);
> -
> - //
> - // Get the iSCSI configuration data of this controller.
> - //
> - Status = IScsiGetConfigData (Private);
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> - //
> - // Try to login and create an iSCSI session according to the configuration.
> - //
> - Status = IScsiSessionLogin (Private);
> - if (Status == EFI_MEDIA_CHANGED) {
> - //
> - // The specified target is not available and the redirection information is
> - // got, login the session again with the updated target address.
> - //
> - Status = IScsiSessionLogin (Private);
> - }
> -
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> - //
> - // Duplicate the Session's tcp connection device path. The source port field
> - // will be set to zero as one iSCSI session is comprised of several iSCSI
> - // connections.
> - //
> - Private->DevicePath = IScsiGetTcpConnDevicePath (Private);
> - if (Private->DevicePath == NULL) {
> - goto ON_ERROR;
> - }
> - //
> - // Install the updated device path onto the ExtScsiPassThruHandle.
> - //
> - Status = gBS->InstallProtocolInterface (
> - &Private->ExtScsiPassThruHandle,
> - &gEfiDevicePathProtocolGuid,
> - EFI_NATIVE_INTERFACE,
> - Private->DevicePath
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - //
> - // ISCSI children should share the default Tcp child, just open the default
> Tcp child via BY_CHILD_CONTROLLER.
> - //
> - Status = gBS->OpenProtocol (
> - Private->ChildHandle, /// Default Tcp child
> - &gEfiTcp4ProtocolGuid,
> - &Interface,
> - This->DriverBindingHandle,
> - Private->ExtScsiPassThruHandle,
> - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
> - );
> - if (EFI_ERROR (Status)) {
> - gBS->UninstallMultipleProtocolInterfaces (
> - Private->ExtScsiPassThruHandle,
> - &gEfiExtScsiPassThruProtocolGuid,
> - &Private->IScsiExtScsiPassThru,
> - &gEfiDevicePathProtocolGuid,
> - Private->DevicePath,
> - NULL
> - );
> -
> - goto ON_ERROR;
> - }
> -
> - //
> - // Update/Publish the iSCSI Boot Firmware Table.
> - //
> - IScsiPublishIbft ();
> -
> - return EFI_SUCCESS;
> -
> -ON_ERROR:
> -
> - IScsiSessionAbort (&Private->Session);
> -
> - return Status;
> -}
> -
> -/**
> - Stop this driver on ControllerHandle.
> -
> - Release the control of this controller and remove the IScsi functions. 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[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL
> instance.
> - @param[in] 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[in] NumberOfChildren The number of child device handles in
> ChildHandleBuffer.Not used.
> - @param[in] ChildHandleBuffer An array of child handles to be freed. May
> be NULL
> - if NumberOfChildren is 0.Not used.
> -
> - @retval EFI_SUCCESS The device was stopped.
> - @retval EFI_DEVICE_ERROR The device could not be stopped due to a
> device error.
> - @retval EFI_INVALID_PARAMETER Child handle is NULL.
> - @retval EFI_ACCESS_DENIED The protocol could not be removed from
> the Handle
> - because its interfaces are being used.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverBindingStop (
> - IN EFI_DRIVER_BINDING_PROTOCOL *This,
> - IN EFI_HANDLE ControllerHandle,
> - IN UINTN NumberOfChildren,
> - IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
> - )
> -{
> - EFI_HANDLE IScsiController;
> - EFI_STATUS Status;
> - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
> - ISCSI_DRIVER_DATA *Private;
> - EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru;
> - ISCSI_CONNECTION *Conn;
> -
> - if (NumberOfChildren != 0) {
> - //
> - // We should have only one child.
> - //
> - Status = gBS->OpenProtocol (
> - ChildHandleBuffer[0],
> - &gEfiExtScsiPassThruProtocolGuid,
> - (VOID **) &PassThru,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_GET_PROTOCOL
> - );
> - if (EFI_ERROR (Status)) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru);
> - Conn = NET_LIST_HEAD (&Private->Session.Conns, ISCSI_CONNECTION,
> Link);
> -
> - //
> - // Previously the TCP4 protocol is opened BY_CHILD_CONTROLLER. Just
> close
> - // the protocol here but not uninstall the device path protocol and
> - // EXT SCSI PASS THRU protocol installed on ExtScsiPassThruHandle.
> - //
> - gBS->CloseProtocol (
> - Private->ChildHandle,
> - &gEfiTcp4ProtocolGuid,
> - Private->Image,
> - Private->ExtScsiPassThruHandle
> - );
> -
> - gBS->CloseProtocol (
> - Conn->Tcp4Io.Handle,
> - &gEfiTcp4ProtocolGuid,
> - Private->Image,
> - Private->ExtScsiPassThruHandle
> - );
> -
> - return EFI_SUCCESS;
> - }
> - //
> - // Get the handle of the controller we are controling.
> - //
> - IScsiController = NetLibGetNicHandle (ControllerHandle,
> &gEfiTcp4ProtocolGuid);
> -
> - Status = gBS->OpenProtocol (
> - IScsiController,
> - &gEfiCallerIdGuid,
> - (VOID **)&IScsiIdentifier,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_GET_PROTOCOL
> - );
> - if (EFI_ERROR (Status)) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - Private = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
> -
> - if (Private->ChildHandle != NULL) {
> - Status = gBS->CloseProtocol (
> - Private->ChildHandle,
> - &gEfiTcp4ProtocolGuid,
> - This->DriverBindingHandle,
> - IScsiController
> - );
> -
> - ASSERT (!EFI_ERROR (Status));
> -
> - Status = NetLibDestroyServiceChild (
> - IScsiController,
> - This->DriverBindingHandle,
> - &gEfiTcp4ServiceBindingProtocolGuid,
> - Private->ChildHandle
> - );
> - ASSERT (!EFI_ERROR (Status));
> - }
> -
> - IScsiConfigUpdateForm (This->DriverBindingHandle, IScsiController, FALSE);
> -
> - //
> - // Uninstall the private protocol.
> - //
> - gBS->UninstallProtocolInterface (
> - IScsiController,
> - &gEfiCallerIdGuid,
> - &Private->IScsiIdentifier
> - );
> -
> - //
> - // Update the iSCSI Boot Firware Table.
> - //
> - IScsiPublishIbft ();
> -
> - IScsiSessionAbort (&Private->Session);
> - Status = IScsiCleanDriverData (Private);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Unloads an image(the iSCSI driver).
> -
> - @param[in] ImageHandle Handle that identifies the image to be
> unloaded.
> -
> - @retval EFI_SUCCESS The image has been unloaded.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiIScsiUnload (
> - IN EFI_HANDLE ImageHandle
> - )
> -{
> - EFI_STATUS Status;
> - UINTN DeviceHandleCount;
> - EFI_HANDLE *DeviceHandleBuffer;
> - UINTN Index;
> - EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
> - EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
> -
> - //
> - // Try to disonnect the driver from the devices it's controlling.
> - //
> - Status = gBS->LocateHandleBuffer (
> - AllHandles,
> - NULL,
> - NULL,
> - &DeviceHandleCount,
> - &DeviceHandleBuffer
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - for (Index = 0; Index < DeviceHandleCount; Index++) {
> - Status = IScsiTestManagedDevice (
> - DeviceHandleBuffer[Index],
> - gIScsiDriverBinding.DriverBindingHandle,
> - &gEfiTcp4ProtocolGuid
> - );
> - if (EFI_ERROR (Status)) {
> - continue;
> - }
> - Status = gBS->DisconnectController (
> - DeviceHandleBuffer[Index],
> - gIScsiDriverBinding.DriverBindingHandle,
> - NULL
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - }
> -
> - //
> - // Unload the iSCSI configuration form.
> - //
> - Status = IScsiConfigFormUnload (gIScsiDriverBinding.DriverBindingHandle);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - //
> - // Uninstall the ComponentName and ComponentName2 protocol from
> iSCSI4 driver binding handle
> - // if it has been installed.
> - //
> - Status = gBS->HandleProtocol (
> - gIScsiDriverBinding.DriverBindingHandle,
> - &gEfiComponentNameProtocolGuid,
> - (VOID **) &ComponentName
> - );
> - if (!EFI_ERROR (Status)) {
> - Status = gBS->UninstallMultipleProtocolInterfaces (
> - gIScsiDriverBinding.DriverBindingHandle,
> - &gEfiComponentNameProtocolGuid,
> - ComponentName,
> - NULL
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - }
> -
> - Status = gBS->HandleProtocol (
> - gIScsiDriverBinding.DriverBindingHandle,
> - &gEfiComponentName2ProtocolGuid,
> - (VOID **) &ComponentName2
> - );
> - if (!EFI_ERROR (Status)) {
> - gBS->UninstallMultipleProtocolInterfaces (
> - gIScsiDriverBinding.DriverBindingHandle,
> - &gEfiComponentName2ProtocolGuid,
> - ComponentName2,
> - NULL
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - }
> -
> - Status = gBS->UninstallMultipleProtocolInterfaces (
> - ImageHandle,
> - &gEfiDriverBindingProtocolGuid,
> - &gIScsiDriverBinding,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - &gIScsiInitiatorName,
> - NULL
> - );
> -ON_EXIT:
> -
> - if (DeviceHandleBuffer != NULL) {
> - FreePool (DeviceHandleBuffer);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - This is the declaration of an EFI image entry point. This entry point is
> - the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
> - both device drivers and bus drivers. It initialize the global variables and
> - publish the driver binding protocol.
> -
> - @param[in] ImageHandle The firmware allocated handle for the UEFI
> image.
> - @param[in] SystemTable A pointer to the EFI System Table.
> -
> - @retval EFI_SUCCESS The operation completed successfully.
> - @retval EFI_ACCESS_DENIED EFI_ISCSI_INITIATOR_NAME_PROTOCOL
> was installed unexpectedly.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverEntryPoint (
> - IN EFI_HANDLE ImageHandle,
> - IN EFI_SYSTEM_TABLE *SystemTable
> - )
> -{
> - EFI_STATUS Status;
> - EFI_ISCSI_INITIATOR_NAME_PROTOCOL *IScsiInitiatorName;
> -
> - //
> - // There should be only one EFI_ISCSI_INITIATOR_NAME_PROTOCOL.
> - //
> - Status = gBS->LocateProtocol (
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - NULL,
> - (VOID**) &IScsiInitiatorName
> - );
> -
> - if (!EFI_ERROR (Status)) {
> - return EFI_ACCESS_DENIED;
> - }
> -
> - //
> - // Initialize the EFI Driver Library
> - //
> - Status = EfiLibInstallDriverBindingComponentName2 (
> - ImageHandle,
> - SystemTable,
> - &gIScsiDriverBinding,
> - ImageHandle,
> - &gIScsiComponentName,
> - &gIScsiComponentName2
> - );
> -
> - if (!EFI_ERROR (Status)) {
> - //
> - // Install the iSCSI Initiator Name Protocol.
> - //
> - Status = gBS->InstallProtocolInterface (
> - &ImageHandle,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - EFI_NATIVE_INTERFACE,
> - &gIScsiInitiatorName
> - );
> - if (EFI_ERROR (Status)) {
> - gBS->UninstallMultipleProtocolInterfaces (
> - ImageHandle,
> - &gEfiDriverBindingProtocolGuid,
> - &gIScsiDriverBinding,
> - &gEfiComponentName2ProtocolGuid,
> - &gIScsiComponentName2,
> - &gEfiComponentNameProtocolGuid,
> - &gIScsiComponentName,
> - NULL
> - );
> - return Status;
> - }
> -
> - //
> - // Initialize the configuration form of iSCSI.
> - //
> - Status = IScsiConfigFormInit ();
> - if (EFI_ERROR (Status)) {
> - gBS->UninstallMultipleProtocolInterfaces (
> - ImageHandle,
> - &gEfiDriverBindingProtocolGuid,
> - &gIScsiDriverBinding,
> - &gEfiComponentName2ProtocolGuid,
> - &gIScsiComponentName2,
> - &gEfiComponentNameProtocolGuid,
> - &gIScsiComponentName,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - &gIScsiInitiatorName,
> - NULL
> - );
> - }
> - }
> - return Status;
> -}
> -
> diff --git
> a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c
> deleted file mode 100644
> index db2d6d19366e..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c
> +++ /dev/null
> @@ -1,412 +0,0 @@
> -/** @file
> - The IScsi's EFI_EXT_SCSI_PASS_THRU_PROTOCOL driver.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -/**
> - Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI
> channel. This function
> - supports both blocking I/O and nonblocking I/O. The blocking I/O
> functionality is required, and the
> - nonblocking I/O functionality is optional.
> -
> - @param[in] This A pointer to the
> EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
> - @param[in] Target The Target is an array of size TARGET_MAX_BYTES
> and it represents
> - the id of the SCSI device to send the SCSI Request Packet. Each
> - transport driver may chose to utilize a subset of this size to suit
> the needs
> - of transport target representation. For example, a Fibre
> Channel driver
> - may use only 8 bytes (WWN) to represent an FC target.
> - @param[in] Lun The LUN of the SCSI device to send the SCSI Request
> Packet.
> - @param[in, out] Packet A pointer to the SCSI Request Packet to send to
> the SCSI device
> - specified by Target and Lun.
> - @param[in] Event If nonblocking I/O is not supported then Event is
> ignored, and blocking
> - I/O is performed. If Event is NULL, then blocking I/O is
> performed. If
> - Event is not NULL and non blocking I/O is supported, then
> - nonblocking I/O is performed, and Event will be signaled when
> the
> - SCSI Request Packet completes.
> -
> - @retval EFI_SUCCESS The SCSI Request Packet was sent by the host.
> For bi-directional
> - commands, InTransferLength bytes were transferred from
> - InDataBuffer. For write and bi-directional commands,
> - OutTransferLength bytes were transferred by
> - OutDataBuffer.
> - @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was not
> executed. The number of bytes that
> - could be transferred is returned in InTransferLength. For
> write
> - and bi-directional commands, OutTransferLength bytes
> were
> - transferred by OutDataBuffer. Currently not implemeted.
> - @retval EFI_NOT_READY The SCSI Request Packet could not be sent
> because there are too many
> - SCSI Request Packets already queued. The caller may retry
> again later.
> - @retval EFI_DEVICE_ERROR A device error occurred while attempting to
> send the SCSI Request
> - Packet.
> - @retval EFI_INVALID_PARAMETER Target, Lun, or the contents of
> ScsiRequestPacket are invalid.
> - @retval EFI_UNSUPPORTED The command described by the SCSI
> Request Packet is not supported
> - by the host adapter. This includes the case of Bi-directional
> SCSI
> - commands not supported by the implementation. The SCSI
> Request
> - Packet was not sent, so no additional status information is
> available.
> - Currently not implemeted.
> - @retval EFI_TIMEOUT A timeout occurred while waiting for the SCSI
> Request Packet to execute.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruFunction (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
> - IN UINT8 *Target,
> - IN UINT64 Lun,
> - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
> - IN EFI_EVENT Event OPTIONAL
> - )
> -{
> - ISCSI_DRIVER_DATA *Private;
> - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
> - EFI_STATUS Status;
> -
> - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
> - ConfigNvData = &Private->Session.ConfigData.NvData;
> -
> - if (Target[0] != 0 || (CompareMem (&Lun, ConfigNvData->BootLun, sizeof
> (UINT64)) != 0)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if ((Packet == NULL) || (Packet->Cdb == NULL)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet);
> - if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_READY)) {
> - //
> - // Try to reinstate the session and re-execute the Scsi command.
> - //
> - if (EFI_ERROR (IScsiSessionReinstatement (Private))) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Used to retrieve the list of legal Target IDs and LUNs for SCSI devices on a
> SCSI channel. These
> - can either be the list SCSI devices that are actually present on the SCSI
> channel, or the list of legal
> - Target Ids and LUNs for the SCSI channel. Regardless, the caller of this
> function must probe the
> - Target ID and LUN returned to see if a SCSI device is actually present at that
> location on the SCSI
> - channel.
> -
> - @param[in] This A pointer to the
> EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
> - @param[in, out] Target On input, a pointer to the Target ID (an array of
> size
> - TARGET_MAX_BYTES) of a SCSI device present on the SCSI
> channel.
> - On output, a pointer to the Target ID (an array of
> - TARGET_MAX_BYTES) of the next SCSI device present on a
> SCSI
> - channel. An input value of 0xF(all bytes in the array are 0xF) in
> the
> - Target array retrieves the Target ID of the first SCSI device
> present on a
> - SCSI channel.
> - @param[in, out] Lun On input, a pointer to the LUN of a SCSI device
> present on the SCSI
> - channel. On output, a pointer to the LUN of the next SCSI
> device present
> - on a SCSI channel.
> -
> - @retval EFI_SUCCESS The Target ID and LUN of the next SCSI device
> on the SCSI
> - channel was returned in Target and Lun.
> - @retval EFI_INVALID_PARAMETER Target array is not all 0xF, and Target
> and Lun were
> - not returned on a previous call to GetNextTargetLun().
> - @retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI
> channel.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruGetNextTargetLun (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
> - IN OUT UINT8 **Target,
> - IN OUT UINT64 *Lun
> - )
> -{
> - ISCSI_DRIVER_DATA *Private;
> - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
> - UINT8 TargetId[TARGET_MAX_BYTES];
> -
> - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
> - ConfigNvData = &Private->Session.ConfigData.NvData;
> -
> - if ((*Target)[0] == 0 && (CompareMem (Lun, ConfigNvData->BootLun,
> sizeof (UINT64)) == 0)) {
> - //
> - // Only one <Target, Lun> pair per iSCSI Driver instance.
> - //
> - return EFI_NOT_FOUND;
> - }
> -
> - SetMem (TargetId, TARGET_MAX_BYTES, 0xFF);
> - if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) {
> - (*Target)[0] = 0;
> - CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64));
> -
> - return EFI_SUCCESS;
> - }
> -
> - return EFI_INVALID_PARAMETER;
> -}
> -
> -/**
> - Used to allocate and build a device path node for a SCSI device on a SCSI
> channel.
> -
> - @param[in] This A pointer to the
> EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
> - @param[in] Target The Target is an array of size TARGET_MAX_BYTES
> and it specifies the
> - Target ID of the SCSI device for which a device path node is to
> be
> - allocated and built. Transport drivers may chose to utilize a
> subset of
> - this size to suit the representation of targets. For example, a
> Fibre
> - Channel driver may use only 8 bytes (WWN) in the array to
> represent a
> - FC target.
> - @param[in] Lun The LUN of the SCSI device for which a device path
> node is to be
> - allocated and built.
> - @param[in, out] DevicePath A pointer to a single device path node that
> describes the SCSI device
> - specified by Target and Lun. This function is responsible for
> - allocating the buffer DevicePath with the boot service
> - AllocatePool(). It is the caller's responsibility to free
> - DevicePath when the caller is finished with DevicePath.
> -
> - @retval EFI_SUCCESS The device path node that describes the SCSI
> device specified by
> - Target and Lun was allocated and returned in
> - DevicePath.
> - @retval EFI_INVALID_PARAMETER DevicePath is NULL.
> - @retval EFI_NOT_FOUND The SCSI devices specified by Target and Lun
> does not exist
> - on the SCSI channel.
> - @retval EFI_OUT_OF_RESOURCES There are not enough resources to
> allocate DevicePath.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruBuildDevicePath (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
> - IN UINT8 *Target,
> - IN UINT64 Lun,
> - IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
> - )
> -{
> - ISCSI_DRIVER_DATA *Private;
> - ISCSI_SESSION *Session;
> - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
> - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig;
> - EFI_DEV_PATH *Node;
> - UINTN DevPathNodeLen;
> -
> - if (DevicePath == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (Target[0] != 0) {
> - return EFI_NOT_FOUND;
> - }
> -
> - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
> - Session = &Private->Session;
> - ConfigNvData = &Session->ConfigData.NvData;
> - AuthConfig = &Session->AuthData.AuthConfig;
> -
> - if (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0) {
> - return EFI_NOT_FOUND;
> - }
> -
> - DevPathNodeLen = sizeof (ISCSI_DEVICE_PATH) + AsciiStrLen
> (ConfigNvData->TargetName) + 1;
> - Node = AllocatePool (DevPathNodeLen);
> - if (Node == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Node->DevPath.Type = MESSAGING_DEVICE_PATH;
> - Node->DevPath.SubType = MSG_ISCSI_DP;
> - SetDevicePathNodeLength (&Node->DevPath, (UINT16)DevPathNodeLen);
> -
> - //
> - // 0 for TCP, others are reserved.
> - //
> - Node->Iscsi.NetworkProtocol = 0;
> -
> - Node->Iscsi.LoginOption = 0;
> - switch (AuthConfig->CHAPType) {
> - case ISCSI_CHAP_NONE:
> - Node->Iscsi.LoginOption |= 0x0800;
> - break;
> -
> - case ISCSI_CHAP_UNI:
> - Node->Iscsi.LoginOption |= 0x1000;
> - break;
> -
> - default:
> - break;
> - }
> -
> - CopyMem (&Node->Iscsi.Lun, ConfigNvData->BootLun, sizeof (UINT64));
> - Node->Iscsi.TargetPortalGroupTag = Session->TargetPortalGroupTag;
> - AsciiStrCpyS ((CHAR8 *) Node + sizeof (ISCSI_DEVICE_PATH), AsciiStrLen
> (ConfigNvData->TargetName) + 1, ConfigNvData->TargetName);
> -
> - *DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Node;
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Used to translate a device path node to a Target ID and LUN.
> -
> - @param[in] This A pointer to the
> EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
> - @param[in] DevicePath A pointer to a single device path node that
> describes the SCSI device
> - on the SCSI channel.
> - @param[out] Target A pointer to the Target Array which represents the
> ID of a SCSI device
> - on the SCSI channel.
> - @param[out] Lun A pointer to the LUN of a SCSI device on the SCSI
> channel.
> -
> - @retval EFI_SUCCESS DevicePath was successfully translated to a
> Target ID and
> - LUN, and they were returned in Target and Lun.
> - @retval EFI_INVALID_PARAMETER DevicePath or Target or Lun is NULL.
> - @retval EFI_NOT_FOUND A valid translation from DevicePath to a
> Target ID and LUN
> - does not exist.Currently not implemented.
> - @retval EFI_UNSUPPORTED This driver does not support the device
> path node type in
> - DevicePath.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruGetTargetLun (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
> - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
> - OUT UINT8 **Target,
> - OUT UINT64 *Lun
> - )
> -{
> - ISCSI_DRIVER_DATA *Private;
> - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
> -
> - if ((DevicePath == NULL) || (Target == NULL) || (Lun == NULL)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if ((DevicePath->Type != MESSAGING_DEVICE_PATH) ||
> - (DevicePath->SubType != MSG_ISCSI_DP) ||
> - (DevicePathNodeLength (DevicePath) <= sizeof (ISCSI_DEVICE_PATH))
> - ) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
> - ConfigNvData = &Private->Session.ConfigData.NvData;
> -
> - SetMem (*Target, TARGET_MAX_BYTES, 0xFF);
> - (*Target)[0] = 0;
> -
> - if (AsciiStrCmp (ConfigNvData->TargetName, (CHAR8 *) DevicePath +
> sizeof (ISCSI_DEVICE_PATH)) != 0) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64));
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Resets a SCSI channel. This operation resets all the SCSI devices connected
> to the SCSI channel.
> - Currently not implemented.
> -
> - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL
> instance.
> -
> - @retval EFI_SUCCESS The SCSI channel was reset.
> - @retval EFI_DEVICE_ERROR A device error occurred while attempting to
> reset the SCSI channel.
> - @retval EFI_TIMEOUT A timeout occurred while attempting to reset the
> SCSI channel.
> - @retval EFI_UNSUPPORTED The SCSI channel does not support a channel
> reset operation.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruResetChannel (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This
> - )
> -{
> - return EFI_UNSUPPORTED;
> -}
> -
> -/**
> - Resets a SCSI logical unit that is connected to a SCSI channel. Currently not
> implemented.
> -
> - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL
> instance.
> - @param[in] Target The Target is an array of size TARGET_MAX_BYTE and it
> represents the
> - target port ID of the SCSI device containing the SCSI logical unit to
> - reset. Transport drivers may chose to utilize a subset of this array
> to suit
> - the representation of their targets.
> - @param[in] Lun The LUN of the SCSI device to reset.
> -
> - @retval EFI_SUCCESS The SCSI device specified by Target and Lun was
> reset.
> - @retval EFI_INVALID_PARAMETER Target or Lun is NULL.
> - @retval EFI_TIMEOUT A timeout occurred while attempting to reset
> the SCSI device
> - specified by Target and Lun.
> - @retval EFI_UNSUPPORTED The SCSI channel does not support a target
> reset operation.
> - @retval EFI_DEVICE_ERROR A device error occurred while attempting to
> reset the SCSI device
> - specified by Target and Lun.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruResetTargetLun (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
> - IN UINT8 *Target,
> - IN UINT64 Lun
> - )
> -{
> - return EFI_UNSUPPORTED;
> -}
> -
> -/**
> - Used to retrieve the list of legal Target IDs for SCSI devices on a SCSI
> channel. These can either
> - be the list SCSI devices that are actually present on the SCSI channel, or the
> list of legal Target IDs
> - for the SCSI channel. Regardless, the caller of this function must probe the
> Target ID returned to
> - see if a SCSI device is actually present at that location on the SCSI channel.
> -
> - @param[in] This A pointer to the
> EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
> - @param[in, out] Target (TARGET_MAX_BYTES) of a SCSI device present
> on the SCSI channel.
> - On output, a pointer to the Target ID (an array of
> - TARGET_MAX_BYTES) of the next SCSI device present on a
> SCSI
> - channel. An input value of 0xF(all bytes in the array are 0xF) in
> the
> - Target array retrieves the Target ID of the first SCSI device
> present on a
> - SCSI channel.
> -
> - @retval EFI_SUCCESS The Target ID of the next SCSI device on the
> SCSI
> - channel was returned in Target.
> - @retval EFI_INVALID_PARAMETER Target or Lun is NULL.
> - @retval EFI_TIMEOUT Target array is not all 0xF, and Target were not
> - returned on a previous call to GetNextTarget().
> - Currently not implemented.
> - @retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI
> channel.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruGetNextTarget (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
> - IN OUT UINT8 **Target
> - )
> -{
> - UINT8 TargetId[TARGET_MAX_BYTES];
> -
> - SetMem (TargetId, TARGET_MAX_BYTES, 0xFF);
> -
> - if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) {
> - (*Target)[0] = 0;
> - return EFI_SUCCESS;
> - } else if ((*Target)[0] == 0) {
> - return EFI_NOT_FOUND;
> - } else {
> - return EFI_INVALID_PARAMETER;
> - }
> -}
> -
> -EFI_EXT_SCSI_PASS_THRU_PROTOCOL
> gIScsiExtScsiPassThruProtocolTemplate = {
> - NULL,
> - IScsiExtScsiPassThruFunction,
> - IScsiExtScsiPassThruGetNextTargetLun,
> - IScsiExtScsiPassThruBuildDevicePath,
> - IScsiExtScsiPassThruGetTargetLun,
> - IScsiExtScsiPassThruResetChannel,
> - IScsiExtScsiPassThruResetTargetLun,
> - IScsiExtScsiPassThruGetNextTarget
> -};
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c
> deleted file mode 100644
> index 58c5447dcbd1..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c
> +++ /dev/null
> @@ -1,539 +0,0 @@
> -/** @file
> - Implementation for iSCSI Boot Firmware Table publication.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -BOOLEAN mIbftInstalled = FALSE;
> -UINTN mTableKey;
> -
> -/**
> - Initialize the header of the iSCSI Boot Firmware Table.
> -
> - @param[out] Header The header of the iSCSI Boot Firmware Table.
> - @param[in] OemId The OEM ID.
> - @param[in] OemTableId The OEM table ID for the iBFT.
> -**/
> -VOID
> -IScsiInitIbfTableHeader (
> - OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Header,
> - IN UINT8 *OemId,
> - IN UINT64 *OemTableId
> - )
> -{
> - ZeroMem (Header, sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER));
> -
> - Header->Signature =
> EFI_ACPI_3_0_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE;
> - Header->Length = IBFT_HEAP_OFFSET;
> - Header->Revision = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_REVISION;
> - Header->Checksum = 0;
> -
> - CopyMem (Header->OemId, OemId, sizeof (Header->OemId));
> - CopyMem (&Header->OemTableId, OemTableId, sizeof (UINT64));
> -}
> -
> -/**
> - Initialize the control section of the iSCSI Boot Firmware Table.
> -
> - @param[in] Table The ACPI table.
> - @param[in] HandleCount The number of the handles associated with iSCSI
> sessions, it's
> - equal to the number of iSCSI sessions.
> -**/
> -VOID
> -IScsiInitControlSection (
> - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table,
> - IN UINTN HandleCount
> - )
> -{
> - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE
> *Control;
> - UINTN NumOffset;
> -
> - Control =
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table
> + 1);
> -
> - ZeroMem (Control, sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE));
> -
> - Control->Header.StructureId =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_ID;
> - Control->Header.Version =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_VERSION;
> - Control->Header.Length = (UINT16) sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE);
> -
> - //
> - // Each session occupies two offsets, one for the NIC section,
> - // the other for the Target section.
> - //
> - NumOffset = 2 * HandleCount;
> - if (NumOffset > 4) {
> - //
> - // Need expand the control section if more than 2 NIC/Target sections
> - // exist.
> - //
> - Control->Header.Length = (UINT16) (Control->Header.Length +
> (NumOffset - 4) * sizeof (UINT16));
> - }
> -}
> -
> -/**
> - Add one item into the heap.
> -
> - @param[in, out] Heap On input, the current address of the heap; On
> output, the address of
> - the heap after the item is added.
> - @param[in] Data The data to add into the heap.
> - @param[in] Len Length of the Data in byte.
> -**/
> -VOID
> -IScsiAddHeapItem (
> - IN OUT UINT8 **Heap,
> - IN VOID *Data,
> - IN UINTN Len
> - )
> -{
> - //
> - // Add one byte for the NULL delimiter.
> - //
> - *Heap -= Len + 1;
> -
> - CopyMem (*Heap, Data, Len);
> - *(*Heap + Len) = 0;
> -}
> -
> -/**
> - Fill the Initiator section of the iSCSI Boot Firmware Table.
> -
> - @param[in] Table The ACPI table.
> - @param[in, out] Heap The heap.
> - @param[in] Handle The handle associated with the iSCSI session.
> -**/
> -VOID
> -IScsiFillInitiatorSection (
> - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table,
> - IN OUT UINT8 **Heap,
> - IN EFI_HANDLE Handle
> - )
> -{
> - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE
> *Control;
> - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE
> *Initiator;
> - ISCSI_DRIVER_DATA *DriverData;
> - ISCSI_SESSION *Session;
> - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
> - EFI_STATUS Status;
> -
> - Control =
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table
> + 1);
> -
> - //
> - // Initiator section immediately follows the control section.
> - //
> - Initiator =
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *)
> ((UINT8 *) Control + IBFT_ROUNDUP (Control->Header.Length));
> -
> - Control->InitiatorOffset = (UINT16) ((UINTN) Initiator - (UINTN) Table);
> -
> - ZeroMem (Initiator, sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE));
> -
> - Initiator->Header.StructureId =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_ID;
> - Initiator->Header.Version =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_VERSIO
> N;
> - Initiator->Header.Length = (UINT16) sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE);
> - Initiator->Header.Flags =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_B
> LOCK_VALID |
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_B
> OOT_SELECTED;
> -
> - //
> - // Get the identifier from the handle.
> - //
> - Status = gBS->HandleProtocol (Handle, &gEfiCallerIdGuid, (VOID **)
> &IScsiIdentifier);
> - if (EFI_ERROR (Status)) {
> - ASSERT (FALSE);
> - return ;
> - }
> -
> - DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
> - Session = &DriverData->Session;
> -
> - //
> - // Fill the iSCSI Initiator Name into the heap.
> - //
> - IScsiAddHeapItem (Heap, Session->InitiatorName, Session-
> >InitiatorNameLength - 1);
> -
> - Initiator->IScsiNameLength = (UINT16) (Session->InitiatorNameLength - 1);
> - Initiator->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
> -}
> -
> -/**
> - Map the v4 IP address into v6 IP address.
> -
> - @param[in] V4 The v4 IP address.
> - @param[out] V6 The v6 IP address.
> -**/
> -VOID
> -IScsiMapV4ToV6Addr (
> - IN EFI_IPv4_ADDRESS *V4,
> - OUT EFI_IPv6_ADDRESS *V6
> - )
> -{
> - UINTN Index;
> -
> - ZeroMem (V6, sizeof (EFI_IPv6_ADDRESS));
> -
> - V6->Addr[10] = 0xff;
> - V6->Addr[11] = 0xff;
> -
> - for (Index = 0; Index < 4; Index++) {
> - V6->Addr[12 + Index] = V4->Addr[Index];
> - }
> -}
> -
> -/**
> - Get the NIC's PCI location and return it according to the composited
> - format defined in iSCSI Boot Firmware Table.
> -
> - @param[in] Controller The handle of the controller.
> -
> - @return UINT16 The composited representation of the NIC PCI
> location.
> - @retval 0 Other errors as indicated.
> -**/
> -UINT16
> -IScsiGetNICPciLocation (
> - IN EFI_HANDLE Controller
> - )
> -{
> - EFI_STATUS Status;
> - EFI_DEVICE_PATH_PROTOCOL *DevicePath;
> - EFI_HANDLE PciIoHandle;
> - EFI_PCI_IO_PROTOCOL *PciIo;
> - UINTN Segment;
> - UINTN Bus;
> - UINTN Device;
> - UINTN Function;
> -
> - Status = gBS->HandleProtocol (
> - Controller,
> - &gEfiDevicePathProtocolGuid,
> - (VOID **)&DevicePath
> - );
> - if (EFI_ERROR (Status)) {
> - return 0;
> - }
> -
> - Status = gBS->LocateDevicePath (
> - &gEfiPciIoProtocolGuid,
> - &DevicePath,
> - &PciIoHandle
> - );
> - if (EFI_ERROR (Status)) {
> - return 0;
> - }
> -
> - Status = gBS->HandleProtocol (PciIoHandle, &gEfiPciIoProtocolGuid, (VOID
> **)&PciIo);
> - if (EFI_ERROR (Status)) {
> - return 0;
> - }
> -
> - Status = PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function);
> - if (EFI_ERROR (Status)) {
> - return 0;
> - }
> -
> - return (UINT16) ((Bus << 8) | (Device << 3) | Function);
> -}
> -
> -/**
> - Fill the NIC and target sections in iSCSI Boot Firmware Table.
> -
> - @param[in] Table The buffer of the ACPI table.
> - @param[in, out] Heap The heap buffer used to store the variable
> length parameters such as iSCSI name.
> - @param[in] HandleCount Count The number of handles having iSCSI
> private protocol installed.
> - @param[in] Handles The handle buffer.
> -**/
> -VOID
> -IScsiFillNICAndTargetSections (
> - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table,
> - IN OUT UINT8 **Heap,
> - IN UINTN HandleCount,
> - IN EFI_HANDLE *Handles
> - )
> -{
> - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE
> *Control;
> - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *Nic;
> - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *Target;
> - ISCSI_DRIVER_DATA *DriverData;
> - ISCSI_SESSION_CONFIG_DATA *SessionConfigData;
> - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig;
> - UINT16 *SectionOffset;
> - UINTN Index;
> - UINT16 Length;
> - EFI_MAC_ADDRESS MacAddress;
> - UINTN HwAddressSize;
> - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
> - EFI_STATUS Status;
> -
> - //
> - // Get the offset of the first Nic and Target section.
> - //
> - Control =
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table
> + 1);
> - Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *)
> ((UINTN) Table +
> - Control->InitiatorOffset + IBFT_ROUNDUP (sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE)));
> - Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE
> *) ((UINTN) Nic +
> - IBFT_ROUNDUP (sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));
> -
> - SectionOffset = &Control->NIC0Offset;
> -
> - for (Index = 0; Index < HandleCount; Index++) {
> - Status = gBS->HandleProtocol (Handles[Index], &gEfiCallerIdGuid, (VOID
> **)&IScsiIdentifier);
> - if (EFI_ERROR (Status)) {
> - ASSERT (FALSE);
> - return ;
> - }
> -
> - DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
> - SessionConfigData = &DriverData->Session.ConfigData;
> - AuthConfig = &DriverData->Session.AuthData.AuthConfig;
> -
> - //
> - // Fill the Nic section.
> - //
> - ZeroMem (Nic, sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE));
> -
> - Nic->Header.StructureId =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_ID;
> - Nic->Header.Version =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_VERSION;
> - Nic->Header.Length = (UINT16) sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE);
> - Nic->Header.Index = (UINT8) Index;
> - Nic->Header.Flags =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BLOCK_
> VALID |
> -
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BOOT_S
> ELECTED |
> -
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_GLOBAL;
> -
> - //
> - // Get the subnet mask prefix length.
> - //
> - Nic->SubnetMaskPrefixLength = IScsiGetSubnetMaskPrefixLength
> (&SessionConfigData->NvData.SubnetMask);
> -
> - if (SessionConfigData->NvData.InitiatorInfoFromDhcp) {
> - Nic->Origin = IpPrefixOriginDhcp;
> - } else {
> - Nic->Origin = IpPrefixOriginManual;
> - }
> - //
> - // Map the various v4 addresses into v6 addresses.
> - //
> - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.LocalIp, &Nic->Ip);
> - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.Gateway, &Nic-
> >Gateway);
> - IScsiMapV4ToV6Addr (&SessionConfigData->PrimaryDns, &Nic-
> >PrimaryDns);
> - IScsiMapV4ToV6Addr (&SessionConfigData->SecondaryDns, &Nic-
> >SecondaryDns);
> - IScsiMapV4ToV6Addr (&SessionConfigData->DhcpServer, &Nic-
> >DhcpServer);
> -
> - Nic->VLanTag = NetLibGetVlanId (DriverData->Controller);
> -
> - Status = NetLibGetMacAddress (DriverData->Controller, &MacAddress,
> &HwAddressSize);
> - ASSERT (Status == EFI_SUCCESS);
> - CopyMem (Nic->Mac, MacAddress.Addr, sizeof (Nic->Mac));
> -
> - //
> - // Get the PCI location of the Nic.
> - //
> - Nic->PciLocation = IScsiGetNICPciLocation (DriverData->Controller);
> -
> - *SectionOffset = (UINT16) ((UINTN) Nic - (UINTN) Table);
> - SectionOffset++;
> -
> - //
> - // Fill the Target section.
> - //
> - ZeroMem (Target, sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE));
> -
> - Target->Header.StructureId =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_ID;
> - Target->Header.Version =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_VERSION;
> - Target->Header.Length = (UINT16) sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE);
> - Target->Header.Index = (UINT8) Index;
> - Target->Header.Flags =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BLO
> CK_VALID |
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BOO
> T_SELECTED;
> - Target->Port = SessionConfigData->NvData.TargetPort;
> - Target->NicIndex = (UINT8) Index;
> -
> - if (AuthConfig->CHAPType == ISCSI_CHAP_NONE) {
> - Target->CHAPType =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP
> E_NO_CHAP;
> - } if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) {
> - Target->CHAPType =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP
> E_CHAP;
> - } else if (AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL) {
> - Target->CHAPType =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP
> E_MUTUAL_CHAP;
> - }
> -
> - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.TargetIp, &Target-
> >Ip);
> - CopyMem (Target->BootLun, SessionConfigData->NvData.BootLun, sizeof
> (Target->BootLun));
> -
> - //
> - // Target iSCSI Name, CHAP name/secret, reverse CHAP name/secret.
> - //
> - Length = (UINT16) AsciiStrLen (SessionConfigData->NvData.TargetName);
> - IScsiAddHeapItem (Heap, SessionConfigData->NvData.TargetName,
> Length);
> -
> - Target->IScsiNameLength = Length;
> - Target->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
> -
> - if (Target->CHAPType !=
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP
> E_NO_CHAP) {
> - //
> - // CHAP Name
> - //
> - Length = (UINT16) AsciiStrLen (AuthConfig->CHAPName);
> - IScsiAddHeapItem (Heap, AuthConfig->CHAPName, Length);
> - Target->CHAPNameLength = Length;
> - Target->CHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
> -
> - //
> - // CHAP Secret
> - //
> - Length = (UINT16) AsciiStrLen (AuthConfig->CHAPSecret);
> - IScsiAddHeapItem (Heap, AuthConfig->CHAPSecret, Length);
> - Target->CHAPSecretLength = Length;
> - Target->CHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
> -
> - if (Target->CHAPType ==
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYP
> E_MUTUAL_CHAP) {
> - //
> - // Reverse CHAP Name
> - //
> - Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPName);
> - IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPName, Length);
> - Target->ReverseCHAPNameLength = Length;
> - Target->ReverseCHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN)
> Table);
> -
> - //
> - // Reverse CHAP Secret
> - //
> - Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPSecret);
> - IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPSecret, Length);
> - Target->ReverseCHAPSecretLength = Length;
> - Target->ReverseCHAPSecretOffset = (UINT16) ((UINTN) *Heap -
> (UINTN) Table);
> - }
> - }
> -
> - *SectionOffset = (UINT16) ((UINTN) Target - (UINTN) Table);
> - SectionOffset++;
> -
> - //
> - // Advance to the next NIC/Target pair
> - //
> - Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *)
> ((UINTN) Target +
> - IBFT_ROUNDUP (sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE)));
> - Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE
> *) ((UINTN) Nic +
> - IBFT_ROUNDUP (sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));
> - }
> -}
> -
> -/**
> - Publish and remove the iSCSI Boot Firmware Table according to the iSCSI
> - session status.
> -**/
> -VOID
> -IScsiPublishIbft (
> - VOID
> - )
> -{
> - EFI_STATUS Status;
> - EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol;
> - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table;
> - UINTN HandleCount;
> - EFI_HANDLE *HandleBuffer;
> - UINT8 *Heap;
> - UINT8 Checksum;
> - EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;
> - EFI_ACPI_DESCRIPTION_HEADER *Rsdt;
> - EFI_ACPI_DESCRIPTION_HEADER *Xsdt;
> -
> - Rsdt = NULL;
> - Xsdt = NULL;
> -
> - Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID
> **)&AcpiTableProtocol);
> - if (EFI_ERROR (Status)) {
> - return ;
> - }
> -
> -
> - //
> - // Find ACPI table RSD_PTR from system table
> - //
> - Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **)
> &Rsdp);
> - if (EFI_ERROR (Status)) {
> - Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID
> **) &Rsdp);
> - }
> -
> - if (EFI_ERROR (Status) || (Rsdp == NULL)) {
> - return ;
> - } else if (Rsdp->Revision >=
> EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION && Rsdp-
> >XsdtAddress != 0) {
> - Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress;
> - } else if (Rsdp->RsdtAddress != 0) {
> - Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress;
> - }
> -
> - if ((Xsdt == NULL) && (Rsdt == NULL)) {
> - return ;
> - }
> -
> - if (mIbftInstalled) {
> - Status = AcpiTableProtocol->UninstallAcpiTable (
> - AcpiTableProtocol,
> - mTableKey
> - );
> - if (EFI_ERROR (Status)) {
> - return ;
> - }
> - mIbftInstalled = FALSE;
> - }
> -
> - //
> - // Get all iSCSI private protocols.
> - //
> - Status = gBS->LocateHandleBuffer (
> - ByProtocol,
> - &gEfiCallerIdGuid,
> - NULL,
> - &HandleCount,
> - &HandleBuffer
> - );
> - if (EFI_ERROR (Status)) {
> - return ;
> - }
> - //
> - // Allocate 4k bytes to hold the ACPI table.
> - //
> - Table = AllocateZeroPool (IBFT_MAX_SIZE);
> - if (Table == NULL) {
> - return ;
> - }
> -
> - Heap = (UINT8 *) Table + IBFT_HEAP_OFFSET;
> -
> - //
> - // Fill in the various section of the iSCSI Boot Firmware Table.
> - //
> - if (Rsdp->Revision >=
> EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) {
> - IScsiInitIbfTableHeader (Table, Xsdt->OemId, &Xsdt->OemTableId);
> - } else {
> - IScsiInitIbfTableHeader (Table, Rsdt->OemId, &Rsdt->OemTableId);
> - }
> -
> - IScsiInitControlSection (Table, HandleCount);
> - IScsiFillInitiatorSection (Table, &Heap, HandleBuffer[0]);
> - IScsiFillNICAndTargetSections (Table, &Heap, HandleCount, HandleBuffer);
> -
> - Checksum = CalculateCheckSum8((UINT8 *)Table, Table->Length);
> - Table->Checksum = Checksum;
> -
> - FreePool (HandleBuffer);
> -
> - //
> - // Install or update the iBFT table.
> - //
> - Status = AcpiTableProtocol->InstallAcpiTable (
> - AcpiTableProtocol,
> - Table,
> - Table->Length,
> - &mTableKey
> - );
> - if (EFI_ERROR(Status)) {
> - return;
> - }
> -
> - mIbftInstalled = TRUE;
> - FreePool (Table);
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c
> deleted file mode 100644
> index e753d9eebdbe..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c
> +++ /dev/null
> @@ -1,116 +0,0 @@
> -/** @file
> - Implementation for EFI iSCSI Initiator Name Protocol.
> -
> -Copyright (c) 2004 - 2011, 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName = {
> - IScsiGetInitiatorName,
> - IScsiSetInitiatorName
> -};
> -
> -/**
> - Retrieves the current set value of iSCSI Initiator Name.
> -
> - @param[in] This Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer
> / Actual size of the
> - variable data buffer.
> - @param[out] Buffer Pointer to the buffer for data to be read. The data
> is a null-terminated UTF-8 encoded string.
> - The maximum length is 223 characters, including the null-
> terminator.
> -
> - @retval EFI_SUCCESS Data was successfully retrieved into the
> provided buffer and the
> - BufferSize was sufficient to handle the iSCSI initiator name.
> - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result.
> - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
> - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be
> retrieved due to a hardware error.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiGetInitiatorName (
> - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
> - IN OUT UINTN *BufferSize,
> - OUT VOID *Buffer
> - )
> -{
> - EFI_STATUS Status;
> -
> - if ((BufferSize == NULL) || (Buffer == NULL)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Status = gRT->GetVariable (
> - ISCSI_INITIATOR_NAME_VAR_NAME,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - NULL,
> - BufferSize,
> - Buffer
> - );
> -
> - return Status;
> -}
> -
> -/**
> - Sets the iSCSI Initiator Name.
> -
> - @param[in] This Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer.
> - @param[in] Buffer Pointer to the buffer for data to be written. The
> data is a null-terminated UTF-8 encoded string.
> - The maximum length is 223 characters, including the null-
> terminator.
> -
> - @retval EFI_SUCCESS Data was successfully stored by the protocol.
> - @retval EFI_UNSUPPORTED Platform policies do not allow for data to be
> written.
> - Currently not implemented.
> - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or
> BufferSize exceeds the maximum allowed limit.
> - @retval EFI_DEVICE_ERROR The data could not be stored due to a
> hardware error.
> - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold
> the data.
> - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not
> adhere to RFC 3720
> - (and other related protocols).
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiSetInitiatorName (
> - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
> - IN OUT UINTN *BufferSize,
> - IN VOID *Buffer
> - )
> -{
> - EFI_STATUS Status;
> -
> - if ((BufferSize == NULL) || (Buffer == NULL)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (*BufferSize > ISCSI_NAME_MAX_SIZE) {
> - *BufferSize = ISCSI_NAME_MAX_SIZE;
> - return EFI_INVALID_PARAMETER;
> - }
> - //
> - // only support iqn iSCSI names.
> - //
> - Status = IScsiNormalizeName ((CHAR8 *) Buffer, *BufferSize - 1);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - Status = gRT->SetVariable (
> - ISCSI_INITIATOR_NAME_VAR_NAME,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - EFI_VARIABLE_NON_VOLATILE |
> EFI_VARIABLE_BOOTSERVICE_ACCESS,
> - *BufferSize,
> - Buffer
> - );
> -
> - return Status;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
> deleted file mode 100644
> index d924a8b82427..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
> +++ /dev/null
> @@ -1,948 +0,0 @@
> -/** @file
> - Miscellaneous routines for iSCSI driver.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 IScsiHexString[] =
> "0123456789ABCDEFabcdef";
> -
> -/**
> - Removes (trims) specified leading and trailing characters from a string.
> -
> - @param[in, out] Str Pointer to the null-terminated string to be trimmed.
> On return,
> - Str will hold the trimmed string.
> -
> - @param[in] CharC Character will be trimmed from str.
> -**/
> -VOID
> -StrTrim (
> - IN OUT CHAR16 *Str,
> - IN CHAR16 CharC
> - )
> -{
> - CHAR16 *Pointer1;
> - CHAR16 *Pointer2;
> -
> - if (*Str == 0) {
> - return;
> - }
> -
> - //
> - // Trim off the leading and trailing characters c
> - //
> - for (Pointer1 = Str; (*Pointer1 != 0) && (*Pointer1 == CharC); Pointer1++) {
> - ;
> - }
> -
> - Pointer2 = Str;
> - if (Pointer2 == Pointer1) {
> - while (*Pointer1 != 0) {
> - Pointer2++;
> - Pointer1++;
> - }
> - } else {
> - while (*Pointer1 != 0) {
> - *Pointer2 = *Pointer1;
> - Pointer1++;
> - Pointer2++;
> - }
> - *Pointer2 = 0;
> - }
> -
> -
> - for (Pointer1 = Str + StrLen(Str) - 1; Pointer1 >= Str && *Pointer1 == CharC;
> Pointer1--) {
> - ;
> - }
> - if (Pointer1 != Str + StrLen(Str) - 1) {
> - *(Pointer1 + 1) = 0;
> - }
> -}
> -
> -/**
> - Calculate the prefix length of the IPv4 subnet mask.
> -
> - @param[in] SubnetMask The IPv4 subnet mask.
> -
> - @return The prefix length of the subnet mask.
> - @retval 0 Other errors as indicated.
> -**/
> -UINT8
> -IScsiGetSubnetMaskPrefixLength (
> - IN EFI_IPv4_ADDRESS *SubnetMask
> - )
> -{
> - UINT8 Len;
> - UINT32 ReverseMask;
> -
> - //
> - // The SubnetMask is in network byte order.
> - //
> - ReverseMask = (SubnetMask->Addr[0] << 24) | (SubnetMask->Addr[1] <<
> 16) | (SubnetMask->Addr[2] << 8) | (SubnetMask->Addr[3]);
> -
> - //
> - // Reverse it.
> - //
> - ReverseMask = ~ReverseMask;
> -
> - if ((ReverseMask & (ReverseMask + 1)) != 0) {
> - return 0;
> - }
> -
> - Len = 0;
> -
> - while (ReverseMask != 0) {
> - ReverseMask = ReverseMask >> 1;
> - Len++;
> - }
> -
> - return (UINT8) (32 - Len);
> -}
> -
> -/**
> - Convert the hexadecimal encoded LUN string into the 64-bit LUN.
> -
> - @param[in] Str The hexadecimal encoded LUN string.
> - @param[out] Lun Storage to return the 64-bit LUN.
> -
> - @retval EFI_SUCCESS The 64-bit LUN is stored in Lun.
> - @retval EFI_INVALID_PARAMETER The string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiAsciiStrToLun (
> - IN CHAR8 *Str,
> - OUT UINT8 *Lun
> - )
> -{
> - UINTN Index, IndexValue, IndexNum, SizeStr;
> - CHAR8 TemStr[2];
> - UINT8 TemValue;
> - UINT16 Value[4];
> -
> - ZeroMem (Lun, 8);
> - ZeroMem (TemStr, 2);
> - ZeroMem ((UINT8 *) Value, sizeof (Value));
> - SizeStr = AsciiStrLen (Str);
> - IndexValue = 0;
> - IndexNum = 0;
> -
> - for (Index = 0; Index < SizeStr; Index ++) {
> - TemStr[0] = Str[Index];
> - TemValue = (UINT8) AsciiStrHexToUint64 (TemStr);
> - if (TemValue == 0 && TemStr[0] != '0') {
> - if ((TemStr[0] != '-') || (IndexNum == 0)) {
> - //
> - // Invalid Lun Char
> - //
> - return EFI_INVALID_PARAMETER;
> - }
> - }
> -
> - if ((TemValue == 0) && (TemStr[0] == '-')) {
> - //
> - // Next Lun value
> - //
> - if (++IndexValue >= 4) {
> - //
> - // Max 4 Lun value
> - //
> - return EFI_INVALID_PARAMETER;
> - }
> - //
> - // Restart str index for the next lun value
> - //
> - IndexNum = 0;
> - continue;
> - }
> -
> - if (++IndexNum > 4) {
> - //
> - // Each Lun Str can't exceed size 4, because it will be as UINT16 value
> - //
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - //
> - // Combine UINT16 value
> - //
> - Value[IndexValue] = (UINT16) ((Value[IndexValue] << 4) + TemValue);
> - }
> -
> - for (Index = 0; Index <= IndexValue; Index ++) {
> - *((UINT16 *) &Lun[Index * 2]) = HTONS (Value[Index]);
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Convert the 64-bit LUN into the hexadecimal encoded LUN string.
> -
> - @param[in] Lun The 64-bit LUN.
> - @param[out] Str The storage to return the hexadecimal encoded LUN
> string.
> -**/
> -VOID
> -IScsiLunToUnicodeStr (
> - IN UINT8 *Lun,
> - OUT CHAR16 *Str
> - )
> -{
> - UINTN Index;
> - CHAR16 *TempStr;
> -
> - TempStr = Str;
> -
> - for (Index = 0; Index < 4; Index++) {
> -
> - if ((Lun[2 * Index] | Lun[2 * Index + 1]) == 0) {
> - CopyMem(TempStr, L"0-", sizeof (L"0-"));
> - } else {
> - TempStr[0] = (CHAR16) IScsiHexString[Lun[2 * Index] >> 4];
> - TempStr[1] = (CHAR16) IScsiHexString[Lun[2 * Index] & 0x0F];
> - TempStr[2] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] >> 4];
> - TempStr[3] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] & 0x0F];
> - TempStr[4] = L'-';
> - TempStr[5] = 0;
> -
> - StrTrim (TempStr, L'0');
> - }
> -
> - TempStr += StrLen (TempStr);
> - }
> -
> - ASSERT (StrLen(Str) >= 1);
> - Str[StrLen (Str) - 1] = 0;
> -
> - for (Index = StrLen (Str) - 1; Index > 1; Index = Index - 2) {
> - if ((Str[Index] == L'0') && (Str[Index - 1] == L'-')) {
> - Str[Index - 1] = 0;
> - } else {
> - break;
> - }
> - }
> -}
> -
> -/**
> - Convert the ASCII string into a UNICODE string.
> -
> - @param[in] Source The ASCII string.
> - @param[out] Destination The storage to return the UNICODE string.
> -
> - @return CHAR16 * Pointer to the UNICODE string.
> -**/
> -CHAR16 *
> -IScsiAsciiStrToUnicodeStr (
> - IN CHAR8 *Source,
> - OUT CHAR16 *Destination
> - )
> -{
> - ASSERT (Destination != NULL);
> - ASSERT (Source != NULL);
> -
> - while (*Source != '\0') {
> - *(Destination++) = (CHAR16) *(Source++);
> - }
> -
> - *Destination = '\0';
> -
> - return Destination;
> -}
> -
> -/**
> - Convert the UNICODE string into an ASCII string.
> -
> - @param[in] Source The UNICODE string.
> - @param[out] Destination The storage to return the ASCII string.
> -
> - @return CHAR8 * Pointer to the ASCII string.
> -**/
> -CHAR8 *
> -IScsiUnicodeStrToAsciiStr (
> - IN CHAR16 *Source,
> - OUT CHAR8 *Destination
> - )
> -{
> - ASSERT (Destination != NULL);
> - ASSERT (Source != NULL);
> -
> - while (*Source != '\0') {
> - //
> - // If any Unicode characters in Source contain
> - // non-zero value in the upper 8 bits, then ASSERT().
> - //
> - ASSERT (*Source < 0x100);
> - *(Destination++) = (CHAR8) *(Source++);
> - }
> -
> - *Destination = '\0';
> -
> - return Destination;
> -}
> -
> -/**
> - Convert the decimal dotted IPv4 address into the binary IPv4 address.
> -
> - @param[in] Str The UNICODE string.
> - @param[out] Ip The storage to return the ASCII string.
> -
> - @retval EFI_SUCCESS The binary IP address is returned in Ip.
> - @retval EFI_INVALID_PARAMETER The IP string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiAsciiStrToIp (
> - IN CHAR8 *Str,
> - OUT EFI_IPv4_ADDRESS *Ip
> - )
> -{
> - UINTN Index;
> - UINTN Number;
> -
> - Index = 0;
> -
> - while (*Str != 0) {
> -
> - if (Index > 3) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Number = 0;
> - while (NET_IS_DIGIT (*Str)) {
> - Number = Number * 10 + (*Str - '0');
> - Str++;
> - }
> -
> - if (Number > 0xFF) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Ip->Addr[Index] = (UINT8) Number;
> -
> - if ((*Str != '\0') && (*Str != '.')) {
> - //
> - // The current character should be either the NULL terminator or
> - // the dot delimiter.
> - //
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (*Str == '.') {
> - //
> - // Skip the delimiter.
> - //
> - Str++;
> - }
> -
> - Index++;
> - }
> -
> - if (Index != 4) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Convert the mac address into a hexadecimal encoded "-" seperated string.
> -
> - @param[in] Mac The mac address.
> - @param[in] Len Length in bytes of the mac address.
> - @param[in] VlanId VLAN ID of the network device.
> - @param[out] Str The storage to return the mac string.
> -**/
> -VOID
> -IScsiMacAddrToStr (
> - IN EFI_MAC_ADDRESS *Mac,
> - IN UINT32 Len,
> - IN UINT16 VlanId,
> - OUT CHAR16 *Str
> - )
> -{
> - UINT32 Index;
> - CHAR16 *String;
> -
> - for (Index = 0; Index < Len; Index++) {
> - Str[3 * Index] = (CHAR16) IScsiHexString[(Mac->Addr[Index] >> 4) &
> 0x0F];
> - Str[3 * Index + 1] = (CHAR16) IScsiHexString[Mac->Addr[Index] & 0x0F];
> - Str[3 * Index + 2] = L'-';
> - }
> -
> - String = &Str[3 * Index - 1] ;
> - if (VlanId != 0) {
> - String += UnicodeSPrint (String, 6 * sizeof (CHAR16), L"\\%04x", (UINTN)
> VlanId);
> - }
> -
> - *String = L'\0';
> -}
> -
> -/**
> - Convert the binary encoded buffer into a hexadecimal encoded string.
> -
> - @param[in] BinBuffer The buffer containing the binary data.
> - @param[in] BinLength Length of the binary buffer.
> - @param[in, out] HexStr Pointer to the string.
> - @param[in, out] HexLength The length of the string.
> -
> - @retval EFI_SUCCESS The binary data is converted to the hexadecimal
> string
> - and the length of the string is updated.
> - @retval EFI_BUFFER_TOO_SMALL The string is too small.
> - @retval EFI_INVALID_PARAMETER The IP string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiBinToHex (
> - IN UINT8 *BinBuffer,
> - IN UINT32 BinLength,
> - IN OUT CHAR8 *HexStr,
> - IN OUT UINT32 *HexLength
> - )
> -{
> - UINTN Index;
> -
> - if ((HexStr == NULL) || (BinBuffer == NULL) || (BinLength == 0)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (((*HexLength) - 3) < BinLength * 2) {
> - *HexLength = BinLength * 2 + 3;
> - return EFI_BUFFER_TOO_SMALL;
> - }
> -
> - *HexLength = BinLength * 2 + 3;
> - //
> - // Prefix for Hex String
> - //
> - HexStr[0] = '0';
> - HexStr[1] = 'x';
> -
> - for (Index = 0; Index < BinLength; Index++) {
> - HexStr[Index * 2 + 2] = IScsiHexString[BinBuffer[Index] >> 4];
> - HexStr[Index * 2 + 3] = IScsiHexString[BinBuffer[Index] & 0x0F];
> - }
> -
> - HexStr[Index * 2 + 2] = '\0';
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Convert the hexadecimal string into a binary encoded buffer.
> -
> - @param[in, out] BinBuffer The binary buffer.
> - @param[in, out] BinLength Length of the binary buffer.
> - @param[in] HexStr The hexadecimal string.
> -
> - @retval EFI_SUCCESS The hexadecimal string is converted into a binary
> - encoded buffer.
> - @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the
> converted data.
> -**/
> -EFI_STATUS
> -IScsiHexToBin (
> - IN OUT UINT8 *BinBuffer,
> - IN OUT UINT32 *BinLength,
> - IN CHAR8 *HexStr
> - )
> -{
> - UINTN Index;
> - UINTN Length;
> - UINT8 Digit;
> - CHAR8 TemStr[2];
> -
> - ZeroMem (TemStr, sizeof (TemStr));
> -
> - //
> - // Find out how many hex characters the string has.
> - //
> - if ((HexStr[0] == '0') && ((HexStr[1] == 'x') || (HexStr[1] == 'X'))) {
> - HexStr += 2;
> - }
> -
> - Length = AsciiStrLen (HexStr);
> -
> - for (Index = 0; Index < Length; Index ++) {
> - TemStr[0] = HexStr[Index];
> - Digit = (UINT8) AsciiStrHexToUint64 (TemStr);
> - if (Digit == 0 && TemStr[0] != '0') {
> - //
> - // Invalid Lun Char
> - //
> - break;
> - }
> - if ((Index & 1) == 0) {
> - BinBuffer [Index/2] = Digit;
> - } else {
> - BinBuffer [Index/2] = (UINT8) ((BinBuffer [Index/2] << 4) + Digit);
> - }
> - }
> -
> - *BinLength = (UINT32) ((Index + 1)/2);
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Generate random numbers.
> -
> - @param[in, out] Rand The buffer to contain random numbers.
> - @param[in] RandLength The length of the Rand buffer.
> -**/
> -VOID
> -IScsiGenRandom (
> - IN OUT UINT8 *Rand,
> - IN UINTN RandLength
> - )
> -{
> - UINT32 Random;
> -
> - while (RandLength > 0) {
> - Random = NET_RANDOM (NetRandomInitSeed ());
> - *Rand++ = (UINT8) (Random);
> - RandLength--;
> - }
> -}
> -
> -/**
> - Create the iSCSI driver data..
> -
> - @param[in] Image The handle of the driver image.
> - @param[in] Controller The handle of the controller.
> -
> - @return The iSCSI driver data created.
> - @retval NULL Other errors as indicated.
> -**/
> -ISCSI_DRIVER_DATA *
> -IScsiCreateDriverData (
> - IN EFI_HANDLE Image,
> - IN EFI_HANDLE Controller
> - )
> -{
> - ISCSI_DRIVER_DATA *Private;
> - EFI_STATUS Status;
> -
> - Private = AllocateZeroPool (sizeof (ISCSI_DRIVER_DATA));
> - if (Private == NULL) {
> - return NULL;
> - }
> -
> - Private->Signature = ISCSI_DRIVER_DATA_SIGNATURE;
> - Private->Image = Image;
> - Private->Controller = Controller;
> -
> - //
> - // Create an event to be signal when the BS to RT transition is triggerd so
> - // as to abort the iSCSI session.
> - //
> - Status = gBS->CreateEventEx (
> - EVT_NOTIFY_SIGNAL,
> - TPL_CALLBACK,
> - IScsiOnExitBootService,
> - Private,
> - &gEfiEventExitBootServicesGuid,
> - &Private->ExitBootServiceEvent
> - );
> - if (EFI_ERROR (Status)) {
> - FreePool (Private);
> - return NULL;
> - }
> -
> - CopyMem(&Private->IScsiExtScsiPassThru,
> &gIScsiExtScsiPassThruProtocolTemplate,
> sizeof(EFI_EXT_SCSI_PASS_THRU_PROTOCOL));
> -
> - //
> - // 0 is designated to the TargetId, so use another value for the AdapterId.
> - //
> - Private->ExtScsiPassThruMode.AdapterId = 2;
> - Private->ExtScsiPassThruMode.Attributes =
> EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL |
> EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL;
> - Private->ExtScsiPassThruMode.IoAlign = 4;
> - Private->IScsiExtScsiPassThru.Mode = &Private->ExtScsiPassThruMode;
> -
> - //
> - // Install the Ext SCSI PASS THRU protocol.
> - //
> - Status = gBS->InstallProtocolInterface (
> - &Private->ExtScsiPassThruHandle,
> - &gEfiExtScsiPassThruProtocolGuid,
> - EFI_NATIVE_INTERFACE,
> - &Private->IScsiExtScsiPassThru
> - );
> - if (EFI_ERROR (Status)) {
> - gBS->CloseEvent (Private->ExitBootServiceEvent);
> - FreePool (Private);
> -
> - return NULL;
> - }
> -
> - IScsiSessionInit (&Private->Session, FALSE);
> -
> - return Private;
> -}
> -
> -/**
> - Clean the iSCSI driver data.
> -
> - @param[in] Private The iSCSI driver data.
> -
> - @retval EFI_SUCCESS The clean operation is successful.
> - @retval Others Other errors as indicated.
> -
> -**/
> -EFI_STATUS
> -IScsiCleanDriverData (
> - IN ISCSI_DRIVER_DATA *Private
> - )
> -{
> - EFI_STATUS Status;
> -
> - Status = EFI_SUCCESS;
> -
> - if (Private->DevicePath != NULL) {
> - Status = gBS->UninstallProtocolInterface (
> - Private->ExtScsiPassThruHandle,
> - &gEfiDevicePathProtocolGuid,
> - Private->DevicePath
> - );
> - if (EFI_ERROR (Status)) {
> - goto EXIT;
> - }
> -
> - FreePool (Private->DevicePath);
> - }
> -
> - if (Private->ExtScsiPassThruHandle != NULL) {
> - Status = gBS->UninstallProtocolInterface (
> - Private->ExtScsiPassThruHandle,
> - &gEfiExtScsiPassThruProtocolGuid,
> - &Private->IScsiExtScsiPassThru
> - );
> - }
> -
> -EXIT:
> - if (Private->ExitBootServiceEvent != NULL) {
> - gBS->CloseEvent (Private->ExitBootServiceEvent);
> - }
> -
> - FreePool (Private);
> - return Status;
> -}
> -
> -/**
> - Check wheather the Controller is configured to use DHCP protocol.
> -
> - @param[in] Controller The handle of the controller.
> -
> - @retval TRUE The handle of the controller need the Dhcp
> protocol.
> - @retval FALSE The handle of the controller does not need the
> Dhcp protocol.
> -
> -**/
> -BOOLEAN
> -IScsiDhcpIsConfigured (
> - IN EFI_HANDLE Controller
> - )
> -{
> - EFI_STATUS Status;
> - EFI_MAC_ADDRESS MacAddress;
> - UINTN HwAddressSize;
> - UINT16 VlanId;
> - CHAR16 MacString[70];
> - ISCSI_SESSION_CONFIG_NVDATA *ConfigDataTmp;
> -
> - //
> - // Get the mac string, it's the name of various variable
> - //
> - Status = NetLibGetMacAddress (Controller, &MacAddress,
> &HwAddressSize);
> - if (EFI_ERROR (Status)) {
> - return FALSE;
> - }
> - VlanId = NetLibGetVlanId (Controller);
> - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId,
> MacString);
> -
> - //
> - // Get the normal configuration.
> - //
> - Status = GetVariable2 (
> - MacString,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - (VOID**)&ConfigDataTmp,
> - NULL
> - );
> - if (ConfigDataTmp == NULL || EFI_ERROR (Status)) {
> - return FALSE;
> - }
> -
> - if (ConfigDataTmp->Enabled && ConfigDataTmp->InitiatorInfoFromDhcp) {
> - FreePool (ConfigDataTmp);
> - return TRUE;
> - }
> -
> - FreePool (ConfigDataTmp);
> - return FALSE;
> -}
> -
> -/**
> - Get the various configuration data of this iSCSI instance.
> -
> - @param[in] Private The iSCSI driver data.
> -
> - @retval EFI_SUCCESS The configuration of this instance is got.
> - @retval EFI_ABORTED The operation was aborted.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiGetConfigData (
> - IN ISCSI_DRIVER_DATA *Private
> - )
> -{
> - EFI_STATUS Status;
> - ISCSI_SESSION *Session;
> - UINTN BufferSize;
> - EFI_MAC_ADDRESS MacAddress;
> - UINTN HwAddressSize;
> - UINT16 VlanId;
> - CHAR16 MacString[70];
> -
> - //
> - // get the iSCSI Initiator Name
> - //
> - Session = &Private->Session;
> - Session->InitiatorNameLength = ISCSI_NAME_MAX_SIZE;
> - Status = gIScsiInitiatorName.Get (
> - &gIScsiInitiatorName,
> - &Session->InitiatorNameLength,
> - Session->InitiatorName
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - //
> - // Get the mac string, it's the name of various variable
> - //
> - Status = NetLibGetMacAddress (Private->Controller, &MacAddress,
> &HwAddressSize);
> - ASSERT (Status == EFI_SUCCESS);
> - VlanId = NetLibGetVlanId (Private->Controller);
> - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId,
> MacString);
> -
> - //
> - // Get the normal configuration.
> - //
> - BufferSize = sizeof (Session->ConfigData.NvData);
> - Status = gRT->GetVariable (
> - MacString,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - NULL,
> - &BufferSize,
> - &Session->ConfigData.NvData
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - if (!Session->ConfigData.NvData.Enabled) {
> - return EFI_ABORTED;
> - }
> - //
> - // Get the CHAP Auth information.
> - //
> - BufferSize = sizeof (Session->AuthData.AuthConfig);
> - Status = gRT->GetVariable (
> - MacString,
> - &gIScsiCHAPAuthInfoGuid,
> - NULL,
> - &BufferSize,
> - &Session->AuthData.AuthConfig
> - );
> -
> - if (!EFI_ERROR (Status) && Session-
> >ConfigData.NvData.InitiatorInfoFromDhcp) {
> - //
> - // Start dhcp.
> - //
> - Status = IScsiDoDhcp (Private->Image, Private->Controller, &Session-
> >ConfigData);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Get the device path of the iSCSI tcp connection and update it.
> -
> - @param[in] Private The iSCSI driver data.
> -
> - @return The updated device path.
> - @retval NULL Other errors as indicated.
> -**/
> -EFI_DEVICE_PATH_PROTOCOL *
> -IScsiGetTcpConnDevicePath (
> - IN ISCSI_DRIVER_DATA *Private
> - )
> -{
> - ISCSI_SESSION *Session;
> - ISCSI_CONNECTION *Conn;
> - TCP4_IO *Tcp4Io;
> - EFI_DEVICE_PATH_PROTOCOL *DevicePath;
> - EFI_STATUS Status;
> - EFI_DEV_PATH *DPathNode;
> -
> - Session = &Private->Session;
> - if (Session->State != SESSION_STATE_LOGGED_IN) {
> - return NULL;
> - }
> -
> - Conn = NET_LIST_USER_STRUCT_S (
> - Session->Conns.ForwardLink,
> - ISCSI_CONNECTION,
> - Link,
> - ISCSI_CONNECTION_SIGNATURE
> - );
> - Tcp4Io = &Conn->Tcp4Io;
> -
> - Status = gBS->HandleProtocol (
> - Tcp4Io->Handle,
> - &gEfiDevicePathProtocolGuid,
> - (VOID **)&DevicePath
> - );
> - if (EFI_ERROR (Status)) {
> - return NULL;
> - }
> - //
> - // Duplicate it.
> - //
> - DevicePath = DuplicateDevicePath (DevicePath);
> - if (DevicePath == NULL) {
> - return NULL;
> - }
> -
> - DPathNode = (EFI_DEV_PATH *) DevicePath;
> -
> - while (!IsDevicePathEnd (&DPathNode->DevPath)) {
> - if ((DevicePathType (&DPathNode->DevPath) ==
> MESSAGING_DEVICE_PATH) &&
> - (DevicePathSubType (&DPathNode->DevPath) == MSG_IPv4_DP)
> - ) {
> -
> - DPathNode->Ipv4.LocalPort = 0;
> - DPathNode->Ipv4.StaticIpAddress =
> - (BOOLEAN) (!Session->ConfigData.NvData.InitiatorInfoFromDhcp);
> -
> - //
> - // Add a judgement here to support previous versions of
> IPv4_DEVICE_PATH.
> - // In previous versions of IPv4_DEVICE_PATH, GatewayIpAddress and
> SubnetMask
> - // do not exist.
> - // In new version of IPv4_DEVICE_PATH, structcure length is 27.
> - //
> - if (DevicePathNodeLength (&DPathNode->Ipv4) ==
> IP4_NODE_LEN_NEW_VERSIONS) {
> -
> - IP4_COPY_ADDRESS (
> - &DPathNode->Ipv4.GatewayIpAddress,
> - &Session->ConfigData.NvData.Gateway
> - );
> -
> - IP4_COPY_ADDRESS (
> - &DPathNode->Ipv4.SubnetMask,
> - &Session->ConfigData.NvData.SubnetMask
> - );
> - }
> -
> - break;
> - }
> -
> - DPathNode = (EFI_DEV_PATH *) NextDevicePathNode (&DPathNode-
> >DevPath);
> - }
> -
> - return DevicePath;
> -}
> -
> -/**
> - Abort the session when the transition from BS to RT is initiated.
> -
> - @param[in] Event The event signaled.
> - @param[in] Context The iSCSI driver data.
> -**/
> -VOID
> -EFIAPI
> -IScsiOnExitBootService (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - )
> -{
> - ISCSI_DRIVER_DATA *Private;
> -
> - Private = (ISCSI_DRIVER_DATA *) Context;
> -
> - gBS->CloseEvent (Private->ExitBootServiceEvent);
> - Private->ExitBootServiceEvent = NULL;
> -
> - IScsiSessionAbort (&Private->Session);
> -}
> -
> -/**
> - Tests whether a controller handle is being managed by IScsi driver.
> -
> - This function tests whether the driver specified by DriverBindingHandle is
> - currently managing the controller specified by ControllerHandle. This test
> - is performed by evaluating if the the protocol specified by ProtocolGuid is
> - present on ControllerHandle and is was opened by DriverBindingHandle
> and Nic
> - Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER.
> - If ProtocolGuid is NULL, then ASSERT().
> -
> - @param ControllerHandle A handle for a controller to test.
> - @param DriverBindingHandle Specifies the driver binding handle for the
> - driver.
> - @param ProtocolGuid Specifies the protocol that the driver specified
> - by DriverBindingHandle opens in its Start()
> - function.
> -
> - @retval EFI_SUCCESS ControllerHandle is managed by the driver
> - specified by DriverBindingHandle.
> - @retval EFI_UNSUPPORTED ControllerHandle is not managed by the
> driver
> - specified by DriverBindingHandle.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiTestManagedDevice (
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_HANDLE DriverBindingHandle,
> - IN EFI_GUID *ProtocolGuid
> - )
> -{
> - EFI_STATUS Status;
> - VOID *ManagedInterface;
> - EFI_HANDLE NicControllerHandle;
> -
> - ASSERT (ProtocolGuid != NULL);
> -
> - NicControllerHandle = NetLibGetNicHandle (ControllerHandle,
> ProtocolGuid);
> - if (NicControllerHandle == NULL) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - Status = gBS->OpenProtocol (
> - ControllerHandle,
> - (EFI_GUID *) ProtocolGuid,
> - &ManagedInterface,
> - DriverBindingHandle,
> - NicControllerHandle,
> - EFI_OPEN_PROTOCOL_BY_DRIVER
> - );
> - if (!EFI_ERROR (Status)) {
> - gBS->CloseProtocol (
> - ControllerHandle,
> - (EFI_GUID *) ProtocolGuid,
> - DriverBindingHandle,
> - NicControllerHandle
> - );
> - return EFI_UNSUPPORTED;
> - }
> -
> - if (Status != EFI_ALREADY_STARTED) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - return EFI_SUCCESS;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c
> deleted file mode 100644
> index b4a5c2d02413..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c
> +++ /dev/null
> @@ -1,2799 +0,0 @@
> -/** @file
> - The implementation of iSCSI protocol based on RFC3720.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -UINT32 mDataSegPad = 0;
> -
> -/**
> - Attach the iSCSI connection to the iSCSI session.
> -
> - @param[in, out] Session The iSCSI session.
> - @param[in, out] Conn The iSCSI connection.
> -**/
> -VOID
> -IScsiAttatchConnection (
> - IN OUT ISCSI_SESSION *Session,
> - IN OUT ISCSI_CONNECTION *Conn
> - )
> -{
> - InsertTailList (&Session->Conns, &Conn->Link);
> - Conn->Session = Session;
> - Session->NumConns++;
> -}
> -
> -/**
> - Detach the iSCSI connection from the session it belongs to.
> -
> - @param[in, out] Conn The iSCSI connection.
> -**/
> -VOID
> -IScsiDetatchConnection (
> - IN OUT ISCSI_CONNECTION *Conn
> - )
> -{
> - RemoveEntryList (&Conn->Link);
> - Conn->Session->NumConns--;
> - Conn->Session = NULL;
> -}
> -
> -/**
> - Check the sequence number according to RFC3720.
> -
> - @param[in, out] ExpSN The currently expected sequence number.
> - @param[in] NewSN The sequence number to check.
> -
> - @retval EFI_SUCCESS The check passed and the ExpSN is increased.
> - @retval EFI_NOT_READY Response was sent due to a retransmission
> request.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error
> happened.
> -**/
> -EFI_STATUS
> -IScsiCheckSN (
> - IN OUT UINT32 *ExpSN,
> - IN UINT32 NewSN
> - )
> -{
> - if (!ISCSI_SEQ_EQ (NewSN, *ExpSN)) {
> - if (ISCSI_SEQ_LT (NewSN, *ExpSN)) {
> - //
> - // Duplicate
> - //
> - return EFI_NOT_READY;
> - } else {
> - return EFI_PROTOCOL_ERROR;
> - }
> - } else {
> - //
> - // Advance the ExpSN
> - //
> - (*ExpSN)++;
> - return EFI_SUCCESS;
> - }
> -}
> -
> -/**
> - Update the sequence numbers for the iSCSI command.
> -
> - @param[in, out] Session The iSCSI session.
> - @param[in] MaxCmdSN Maximum CmdSN from the target.
> - @param[in] ExpCmdSN Next expected CmdSN from the target.
> -**/
> -VOID
> -IScsiUpdateCmdSN (
> - IN OUT ISCSI_SESSION *Session,
> - IN UINT32 MaxCmdSN,
> - IN UINT32 ExpCmdSN
> - )
> -{
> - if (ISCSI_SEQ_LT (MaxCmdSN, ExpCmdSN - 1)) {
> - return ;
> - }
> -
> - if (ISCSI_SEQ_GT (MaxCmdSN, Session->MaxCmdSN)) {
> - Session->MaxCmdSN = MaxCmdSN;
> - }
> -
> - if (ISCSI_SEQ_GT (ExpCmdSN, Session->ExpCmdSN)) {
> - Session->ExpCmdSN = ExpCmdSN;
> - }
> -}
> -
> -/**
> - This function does the iSCSI connection login.
> -
> - @param[in, out] Conn The iSCSI connection to login.
> -
> - @retval EFI_SUCCESS The iSCSI connection is logged into the iSCSI
> target.
> - @retval EFI_TIMEOUT Timeout happened during the login procedure.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConnLogin (
> - IN OUT ISCSI_CONNECTION *Conn
> - )
> -{
> - EFI_STATUS Status;
> -
> - //
> - // Start the timer, wait 16 seconds to establish the TCP connection.
> - //
> - Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, 16 *
> TICKS_PER_SECOND);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> - //
> - // try to establish the tcp connection
> - //
> - Status = Tcp4IoConnect (&Conn->Tcp4Io, Conn->TimeoutEvent);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - gBS->SetTimer (Conn->TimeoutEvent, TimerCancel, 0);
> - Conn->State = CONN_STATE_IN_LOGIN;
> -
> - //
> - // connection is established, start the iSCSI Login
> - //
> - do {
> - Status = IScsiSendLoginReq (Conn);
> - if (EFI_ERROR (Status)) {
> - break;
> - }
> -
> - Status = IScsiReceiveLoginRsp (Conn);
> - if (EFI_ERROR (Status)) {
> - break;
> - }
> - } while (Conn->CurrentStage != ISCSI_FULL_FEATURE_PHASE);
> -
> - return Status;
> -}
> -
> -/**
> - Reset the iSCSI connection.
> -
> - @param[in, out] Conn The iSCSI connection to reset.
> -**/
> -VOID
> -IScsiConnReset (
> - IN OUT ISCSI_CONNECTION *Conn
> - )
> -{
> - Tcp4IoReset (&Conn->Tcp4Io);
> -}
> -
> -/**
> - Create a TCP connection for the iSCSI session.
> -
> - @param[in] Private The iSCSI driver data.
> - @param[in] Session Maximum CmdSN from the target.
> -
> - @return The newly created iSCSI connection.
> -**/
> -ISCSI_CONNECTION *
> -IScsiCreateConnection (
> - IN ISCSI_DRIVER_DATA *Private,
> - IN ISCSI_SESSION *Session
> - )
> -{
> - ISCSI_CONNECTION *Conn;
> - TCP4_IO_CONFIG_DATA Tcp4IoConfig;
> - EFI_STATUS Status;
> -
> - Conn = AllocatePool (sizeof (ISCSI_CONNECTION));
> - if (Conn == NULL) {
> - return NULL;
> - }
> -
> - Conn->Signature = ISCSI_CONNECTION_SIGNATURE;
> - Conn->State = CONN_STATE_FREE;
> - Conn->CurrentStage = ISCSI_SECURITY_NEGOTIATION;
> - Conn->NextStage = ISCSI_LOGIN_OPERATIONAL_NEGOTIATION;
> - Conn->CHAPStep = ISCSI_CHAP_INITIAL;
> - Conn->ExpStatSN = 0;
> - Conn->PartialReqSent = FALSE;
> - Conn->PartialRspRcvd = FALSE;
> - Conn->Cid = Session->NextCid++;
> -
> - Status = gBS->CreateEvent (
> - EVT_TIMER,
> - TPL_CALLBACK,
> - NULL,
> - NULL,
> - &Conn->TimeoutEvent
> - );
> - if (EFI_ERROR (Status)) {
> - FreePool (Conn);
> - return NULL;
> - }
> -
> - NetbufQueInit (&Conn->RspQue);
> -
> - //
> - // set the default connection-only parameters
> - //
> - Conn->MaxRecvDataSegmentLength =
> DEFAULT_MAX_RECV_DATA_SEG_LEN;
> - Conn->HeaderDigest = IScsiDigestNone;
> - Conn->DataDigest = IScsiDigestNone;
> -
> - CopyMem (&Tcp4IoConfig.LocalIp, &Session->ConfigData.NvData.LocalIp,
> sizeof (EFI_IPv4_ADDRESS));
> - CopyMem (&Tcp4IoConfig.SubnetMask, &Session-
> >ConfigData.NvData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
> - CopyMem (&Tcp4IoConfig.Gateway, &Session-
> >ConfigData.NvData.Gateway, sizeof (EFI_IPv4_ADDRESS));
> - CopyMem (&Tcp4IoConfig.RemoteIp, &Session-
> >ConfigData.NvData.TargetIp, sizeof (EFI_IPv4_ADDRESS));
> -
> - Tcp4IoConfig.RemotePort = Session->ConfigData.NvData.TargetPort;
> -
> - //
> - // Create the tcp4 IO for this connection
> - //
> - Status = Tcp4IoCreateSocket (
> - Private->Image,
> - Private->Controller,
> - &Tcp4IoConfig,
> - &Conn->Tcp4Io
> - );
> - if (EFI_ERROR (Status)) {
> - gBS->CloseEvent (Conn->TimeoutEvent);
> - FreePool (Conn);
> - Conn = NULL;
> - }
> -
> - return Conn;
> -}
> -
> -/**
> - Destroy an iSCSI connection.
> -
> - @param[in] Conn The connection to destroy.
> -**/
> -VOID
> -IScsiDestroyConnection (
> - IN ISCSI_CONNECTION *Conn
> - )
> -{
> - Tcp4IoDestroySocket (&Conn->Tcp4Io);
> - NetbufQueFlush (&Conn->RspQue);
> - gBS->CloseEvent (Conn->TimeoutEvent);
> - FreePool (Conn);
> -}
> -
> -/**
> - Login the iSCSI session.
> -
> - @param[in] Private The iSCSI driver data.
> -
> - @retval EFI_SUCCESS The iSCSI session login procedure finished.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NO_MEDIA There was a media error.
> - @retval Others Other errors as indicated.
> -
> -**/
> -EFI_STATUS
> -IScsiSessionLogin (
> - IN ISCSI_DRIVER_DATA *Private
> - )
> -{
> - EFI_STATUS Status;
> - ISCSI_SESSION *Session;
> - ISCSI_CONNECTION *Conn;
> - EFI_TCP4_PROTOCOL *Tcp4;
> - EFI_STATUS MediaStatus;
> -
> - Session = &Private->Session;
> -
> - //
> - // Check media status before session login
> - //
> - MediaStatus = EFI_SUCCESS;
> - NetLibDetectMediaWaitTimeout (Private->Controller,
> ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME, &MediaStatus);
> - if (MediaStatus != EFI_SUCCESS) {
> - return EFI_NO_MEDIA;
> - }
> -
> - //
> - // Set session identifier
> - //
> - CopyMem (Session->Isid, Session->ConfigData.NvData.IsId, 6);
> -
> - //
> - // Create a connection for the session.
> - //
> - Conn = IScsiCreateConnection (Private, Session);
> - if (Conn == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - IScsiAttatchConnection (Session, Conn);
> -
> - //
> - // Login througth the newly created connection.
> - //
> - Status = IScsiConnLogin (Conn);
> - if (EFI_ERROR (Status)) {
> - IScsiConnReset (Conn);
> - IScsiDetatchConnection (Conn);
> - IScsiDestroyConnection (Conn);
> - } else {
> - Session->State = SESSION_STATE_LOGGED_IN;
> -
> - gBS->OpenProtocol (
> - Conn->Tcp4Io.Handle,
> - &gEfiTcp4ProtocolGuid,
> - (VOID **)&Tcp4,
> - Private->Image,
> - Private->ExtScsiPassThruHandle,
> - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
> - );
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Build and send the iSCSI login request to the iSCSI target according to
> - the current login stage.
> -
> - @param[in] Conn The connection in the iSCSI login phase.
> -
> - @retval EFI_SUCCESS The iSCSI login request PDU is built and sent on
> this
> - connection.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_DEVICE_ERROR Some kind of device error happened.
> -**/
> -EFI_STATUS
> -IScsiSendLoginReq (
> - IN ISCSI_CONNECTION *Conn
> - )
> -{
> - NET_BUF *Pdu;
> - EFI_STATUS Status;
> -
> - //
> - // build the Login Request PDU
> - //
> - Pdu = IScsiPrepareLoginReq (Conn);
> - if (Pdu == NULL) {
> - return EFI_DEVICE_ERROR;
> - }
> - //
> - // Send it to the iSCSI target.
> - //
> - Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu);
> -
> - NetbufFree (Pdu);
> -
> - return Status;
> -}
> -
> -/**
> - Receive and process the iSCSI login response.
> -
> - @param[in] Conn The connection in the iSCSI login phase.
> -
> - @retval EFI_SUCCESS The iSCSI login response PDU is received and
> processed.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiReceiveLoginRsp (
> - IN ISCSI_CONNECTION *Conn
> - )
> -{
> - EFI_STATUS Status;
> - NET_BUF *Pdu;
> -
> - Pdu = NULL;
> -
> - //
> - // Receive the iSCSI login response.
> - //
> - Status = IScsiReceivePdu (Conn, &Pdu, NULL, FALSE, FALSE, NULL);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> - //
> - // A Login Response is received, process it.
> - //
> - ASSERT (Pdu != NULL);
> - Status = IScsiProcessLoginRsp (Conn, Pdu);
> -
> - NetbufFree (Pdu);
> -
> - return Status;
> -}
> -
> -/**
> - Add an iSCSI key-value pair as a string into the data segment of the Login
> Request PDU.
> - The DataSegmentLength and the actual size of the net buffer containing
> this PDU will be
> - updated.
> -
> - @param[in, out] Pdu The iSCSI PDU whose data segment the key-
> value pair will
> - be added to.
> - @param[in] Key The key name string.
> - @param[in] Value The value string.
> -
> - @retval EFI_SUCCESS The key-valu pair is added to the PDU's
> datasegment and
> - the correspondence length fields are updated.
> - @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to
> add the key-value
> - pair.
> -**/
> -EFI_STATUS
> -IScsiAddKeyValuePair (
> - IN OUT NET_BUF *Pdu,
> - IN CHAR8 *Key,
> - IN CHAR8 *Value
> - )
> -{
> - UINT32 DataSegLen;
> - UINT32 KeyLen;
> - UINT32 ValueLen;
> - UINT32 TotalLen;
> - ISCSI_LOGIN_REQUEST *LoginReq;
> - CHAR8 *Data;
> -
> - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, NULL);
> - if (LoginReq == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> - DataSegLen = NTOH24 (LoginReq->DataSegmentLength);
> -
> - KeyLen = (UINT32) AsciiStrLen (Key);
> - ValueLen = (UINT32) AsciiStrLen (Value);
> -
> - //
> - // 1 byte for the key value separator '=' and 1 byte for the null
> - // delimiter after the value.
> - //
> - TotalLen = KeyLen + 1 + ValueLen + 1;
> -
> - //
> - // Allocate the space for the key-value pair.
> - //
> - Data = (CHAR8 *)NetbufAllocSpace (Pdu, TotalLen, NET_BUF_TAIL);
> - if (Data == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> - //
> - // Add the key.
> - //
> - CopyMem (Data, Key, KeyLen);
> - Data += KeyLen;
> -
> - *Data = '=';
> - Data++;
> -
> - //
> - // Add the value.
> - //
> - CopyMem (Data, Value, ValueLen);
> - Data += ValueLen;
> -
> - *Data = '\0';
> -
> - //
> - // update the DataSegmentLength
> - //
> - ISCSI_SET_DATASEG_LEN (LoginReq, DataSegLen + TotalLen);
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Prepare the iSCSI login request to be sent according to the current login
> status.
> -
> - @param[in, out] Conn The connection in the iSCSI login phase.
> -
> - @return The pointer to the net buffer containing the iSCSI login request
> built.
> - @retval Others Other errors as indicated.
> -**/
> -NET_BUF *
> -IScsiPrepareLoginReq (
> - IN OUT ISCSI_CONNECTION *Conn
> - )
> -{
> - ISCSI_SESSION *Session;
> - NET_BUF *Nbuf;
> - ISCSI_LOGIN_REQUEST *LoginReq;
> - EFI_STATUS Status;
> -
> - Session = Conn->Session;
> -
> - Nbuf = NetbufAlloc (sizeof (ISCSI_LOGIN_REQUEST) +
> DEFAULT_MAX_RECV_DATA_SEG_LEN);
> - if (Nbuf == NULL) {
> - return NULL;
> - }
> -
> - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufAllocSpace (Nbuf, sizeof
> (ISCSI_LOGIN_REQUEST), NET_BUF_TAIL);
> - ASSERT (LoginReq != NULL);
> - ZeroMem (LoginReq, sizeof (ISCSI_LOGIN_REQUEST));
> -
> - //
> - // Init the login request pdu
> - //
> - ISCSI_SET_OPCODE (LoginReq, ISCSI_OPCODE_LOGIN_REQ,
> ISCSI_REQ_IMMEDIATE);
> - ISCSI_SET_STAGES (LoginReq, Conn->CurrentStage, Conn->NextStage);
> - LoginReq->VersionMax = ISCSI_VERSION_MAX;
> - LoginReq->VersionMin = ISCSI_VERSION_MIN;
> - LoginReq->Tsih = HTONS (Session->Tsih);
> - LoginReq->InitiatorTaskTag = HTONL (Session->InitiatorTaskTag);
> - LoginReq->Cid = HTONS (Conn->Cid);
> - LoginReq->CmdSN = HTONL (Session->CmdSN);
> -
> - //
> - // For the first Login Request on a coonection this is ExpStatSN for the
> - // old connection and this field is only valid if the Login Request restarts
> - // a connection.
> - // For subsequent Login Requests it is used to acknowledge the Login
> Responses
> - // with their increasing StatSN values.
> - //
> - LoginReq->ExpStatSN = HTONL (Conn->ExpStatSN);
> - CopyMem (LoginReq->Isid, Session->Isid, sizeof (LoginReq->Isid));
> -
> - if (Conn->PartialRspRcvd) {
> - //
> - // A partial response, initiator must send an empty Login Request.
> - //
> - return Nbuf;
> - }
> -
> - switch (Conn->CurrentStage) {
> - case ISCSI_SECURITY_NEGOTIATION:
> - Status = IScsiCHAPToSendReq (Conn, Nbuf);
> - break;
> -
> - case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION:
> - Status = IScsiFillOpParams (Conn, Nbuf);
> - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
> - break;
> -
> - default:
> - //
> - // something error happens...
> - //
> - Status = EFI_DEVICE_ERROR;
> - break;
> - }
> -
> - if (EFI_ERROR (Status)) {
> - NetbufFree (Nbuf);
> - Nbuf = NULL;
> - } else {
> - //
> - // Pad the data segment if needed.
> - //
> - IScsiPadSegment (Nbuf, ISCSI_GET_DATASEG_LEN (LoginReq));
> - //
> - // Check whether we will issue the stage transition signal?
> - //
> - Conn->TransitInitiated = (BOOLEAN) ISCSI_FLAG_ON (LoginReq,
> ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
> - }
> -
> - return Nbuf;
> -}
> -
> -/**
> - Process the iSCSI Login Response.
> -
> - @param[in, out] Conn The connection on which the iSCSI login response is
> received.
> - @param[in, out] Pdu The iSCSI login response PDU.
> -
> - @retval EFI_SUCCESS The iSCSI login response PDU is processed and all
> check are passed.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error
> happened.
> - @retval EFI_MEDIA_CHANGED Target is redirected.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiProcessLoginRsp (
> - IN OUT ISCSI_CONNECTION *Conn,
> - IN OUT NET_BUF *Pdu
> - )
> -{
> - EFI_STATUS Status;
> - ISCSI_SESSION *Session;
> - ISCSI_LOGIN_RESPONSE *LoginRsp;
> - BOOLEAN Transit;
> - BOOLEAN Continue;
> - UINT8 CurrentStage;
> - UINT8 NextStage;
> - UINT8 *DataSeg;
> - UINT32 DataSegLen;
> -
> - Session = Conn->Session;
> -
> - LoginRsp = (ISCSI_LOGIN_RESPONSE *) NetbufGetByte (Pdu, 0, NULL);
> - if (LoginRsp == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> - if (!ISCSI_CHECK_OPCODE (LoginRsp, ISCSI_OPCODE_LOGIN_RSP)) {
> - //
> - // It's not a Login Response
> - //
> - return EFI_PROTOCOL_ERROR;
> - }
> - //
> - // Get the data segment if any.
> - //
> - DataSegLen = ISCSI_GET_DATASEG_LEN (LoginRsp);
> - if (DataSegLen != 0) {
> - DataSeg = NetbufGetByte (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NULL);
> - } else {
> - DataSeg = NULL;
> - }
> - //
> - // Check the status class in the login response PDU.
> - //
> - switch (LoginRsp->StatusClass) {
> - case ISCSI_LOGIN_STATUS_SUCCESS:
> - //
> - // Just break here, the response and the data segment will be processed
> later.
> - //
> - break;
> -
> - case ISCSI_LOGIN_STATUS_REDIRECTION:
> - //
> - // The target may be moved to a different address
> - //
> - if (DataSeg == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> - //
> - // Process the TargetAddress key-value strings in the data segment to
> update the
> - // target address info.
> - //
> - Status = IScsiUpdateTargetAddress (Session, (CHAR8 *)DataSeg,
> DataSegLen);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> - //
> - // Session will be restarted on this error status because the Target is
> - // redirected by this Login Response.
> - //
> - return EFI_MEDIA_CHANGED;
> -
> - default:
> - //
> - // Initiator Error, Target Error, or any other undefined error code.
> - //
> - return EFI_PROTOCOL_ERROR;
> - }
> - //
> - // The status is sucess, extract the wanted fields from the header segment.
> - //
> - Transit = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp,
> ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT);
> - Continue = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp,
> ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE);
> -
> - CurrentStage = (UINT8) ISCSI_GET_CURRENT_STAGE (LoginRsp);
> - NextStage = (UINT8) ISCSI_GET_NEXT_STAGE (LoginRsp);
> -
> - LoginRsp->InitiatorTaskTag = NTOHL (LoginRsp->InitiatorTaskTag);
> -
> - if ((Transit && Continue) ||
> - (CurrentStage != Conn->CurrentStage) ||
> - (!Conn->TransitInitiated && Transit) ||
> - (Transit && (NextStage != Conn->NextStage)) ||
> - (CompareMem (Session->Isid, LoginRsp->Isid, sizeof (LoginRsp->Isid)) !=
> 0) ||
> - (LoginRsp->InitiatorTaskTag != Session->InitiatorTaskTag)
> - ) {
> - //
> - // A Login Response with the C bit set to 1 MUST have the T bit set to 0;
> - // The CSG in the Login Response MUST be the same with the I-end of this
> connection;
> - // The T bit can't be 1 if the last Login Response sent by the initiator
> doesn't
> - // initiate the transistion;
> - // The NSG MUST be the same with the I-end of this connection if Transit
> is required.
> - // The ISID in the Login Response MUST be the same with this session.
> - //
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - LoginRsp->StatSN = NTOHL (LoginRsp->StatSN);
> - LoginRsp->ExpCmdSN = NTOHL (LoginRsp->ExpCmdSN);
> - LoginRsp->MaxCmdSN = NTOHL (LoginRsp->MaxCmdSN);
> -
> - if ((Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION) && (Conn-
> >CHAPStep == ISCSI_CHAP_INITIAL)) {
> - //
> - // If the Login Request is a leading Login Request, the target MUST use
> - // the value presented in CmdSN as the target value for ExpCmdSN.
> - //
> - if ((Session->State == SESSION_STATE_FREE) && (Session->CmdSN !=
> LoginRsp->ExpCmdSN)) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - //
> - // It's the initial Login Response, initialize the local ExpStatSN, MaxCmdSN
> - // and ExpCmdSN.
> - //
> - Conn->ExpStatSN = LoginRsp->StatSN + 1;
> - Session->MaxCmdSN = LoginRsp->MaxCmdSN;
> - Session->ExpCmdSN = LoginRsp->ExpCmdSN;
> - } else {
> - //
> - // Check the StatSN of this PDU
> - //
> - Status = IScsiCheckSN (&Conn->ExpStatSN, LoginRsp->StatSN);
> - if (!EFI_ERROR (Status)) {
> - //
> - // Update the MaxCmdSN and ExpCmdSN
> - //
> - IScsiUpdateCmdSN (Session, LoginRsp->MaxCmdSN, LoginRsp-
> >ExpCmdSN);
> - } else {
> - return Status;
> - }
> - }
> - //
> - // Trim off the header segment.
> - //
> - NetbufTrim (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NET_BUF_HEAD);
> -
> - //
> - // Queue this login response first in case it's a partial response so that
> - // later when the full response list is received we can combine these
> scattered
> - // responses' data segment and then process it.
> - //
> - NET_GET_REF (Pdu);
> - NetbufQueAppend (&Conn->RspQue, Pdu);
> -
> - Conn->PartialRspRcvd = Continue;
> - if (Continue) {
> - //
> - // It's a partial response, have to wait for another or more
> Request/Response
> - // conversations to get the full response.
> - //
> - return EFI_SUCCESS;
> - }
> -
> - switch (CurrentStage) {
> - case ISCSI_SECURITY_NEGOTIATION:
> - //
> - // In security negotiation stage, let CHAP module handle it.
> - //
> - Status = IScsiCHAPOnRspReceived (Conn);
> - break;
> -
> - case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION:
> - //
> - // Response received with negotiation resonse on iSCSI parameters, check
> them.
> - //
> - Status = IScsiCheckOpParams (Conn);
> - break;
> -
> - default:
> - //
> - // Should never get here.
> - //
> - Status = EFI_PROTOCOL_ERROR;
> - break;
> - }
> -
> - if (Transit && (Status == EFI_SUCCESS)) {
> - //
> - // Do the state transition.
> - //
> - Conn->CurrentStage = Conn->NextStage;
> -
> - if (Conn->CurrentStage == ISCSI_LOGIN_OPERATIONAL_NEGOTIATION) {
> - Conn->NextStage = ISCSI_FULL_FEATURE_PHASE;
> - } else {
> - //
> - // CurrentStage is iSCSI Full Feature, it's the Login-Final Response,
> - // get the TSIH from the Login Response.
> - //
> - Session->Tsih = NTOHS (LoginRsp->Tsih);
> - }
> - }
> - //
> - // Flush the response(s) received.
> - //
> - NetbufQueFlush (&Conn->RspQue);
> -
> - return Status;
> -}
> -
> -/**
> - Updated the target information according the data received in the iSCSI
> - login response with an target redirection status.
> -
> - @param[in, out] Session The iSCSI session.
> - @param[in] Data The data segment which should contain the
> - TargetAddress key-value list.
> - @param[in] Len Length of the data.
> -
> - @retval EFI_SUCCESS The target address is updated.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NOT_FOUND The TargetAddress key is not found.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiUpdateTargetAddress (
> - IN OUT ISCSI_SESSION *Session,
> - IN CHAR8 *Data,
> - IN UINT32 Len
> - )
> -{
> - LIST_ENTRY *KeyValueList;
> - CHAR8 *TargetAddress;
> - CHAR8 *IpStr;
> - EFI_STATUS Status;
> - UINTN Number;
> -
> - KeyValueList = IScsiBuildKeyValueList (Data, Len);
> - if (KeyValueList == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Status = EFI_NOT_FOUND;
> -
> - while (TRUE) {
> - TargetAddress = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_TARGET_ADDRESS);
> - if (TargetAddress == NULL) {
> - break;
> - }
> -
> - if (!NET_IS_DIGIT (TargetAddress[0])) {
> - //
> - // The domainname of the target may be presented in three formats: a
> DNS host name,
> - // a dotted-decimal IPv4 address, or a bracketed IPv6 address. Only
> accept dotted
> - // IPv4 address.
> - //
> - continue;
> - }
> -
> - IpStr = TargetAddress;
> -
> - while ((*TargetAddress != 0) && (*TargetAddress != ':') &&
> (*TargetAddress != ',')) {
> - //
> - // NULL, ':' or ',' ends the IPv4 string.
> - //
> - TargetAddress++;
> - }
> -
> - if (*TargetAddress == ',') {
> - //
> - // Comma and the portal group tag MUST be ommitted if the
> TargetAddress is sent
> - // as the result of a redirection.
> - //
> - continue;
> - } else if (*TargetAddress == ':') {
> - *TargetAddress = '\0';
> -
> - TargetAddress++;
> -
> - Number = AsciiStrDecimalToUintn (TargetAddress);
> - if (Number > 0xFFFF) {
> - continue;
> - } else {
> - Session->ConfigData.NvData.TargetPort = (UINT16) Number;
> - }
> - } else {
> - //
> - // The string only contains the IPv4 address. Use the well known port.
> - //
> - Session->ConfigData.NvData.TargetPort = ISCSI_WELL_KNOWN_PORT;
> - }
> - //
> - // Update the target IP address.
> - //
> - Status = IScsiAsciiStrToIp (IpStr, &Session->ConfigData.NvData.TargetIp);
> - if (EFI_ERROR (Status)) {
> - continue;
> - } else {
> - break;
> - }
> - }
> -
> - IScsiFreeKeyValueList (KeyValueList);
> -
> - return Status;
> -}
> -
> -/**
> - The callback function to free the net buffer list.
> -
> - @param[in] Arg The opaque parameter.
> -**/
> -VOID
> -EFIAPI
> -IScsiFreeNbufList (
> - VOID *Arg
> - )
> -{
> - ASSERT (Arg != NULL);
> -
> - NetbufFreeList ((LIST_ENTRY *) Arg);
> - FreePool (Arg);
> -}
> -
> -/**
> - The callback function called in NetBufFree, it does nothing.
> -
> - @param[in] Arg The opaque parameter.
> -**/
> -VOID
> -EFIAPI
> -IScsiNbufExtFree (
> - VOID *Arg
> - )
> -{
> -}
> -
> -/**
> - Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI
> PDU header and
> - an optional data segment. The two parts will be put into two blocks of
> buffers in the
> - net buffer. The digest check will be conducted in this function if needed
> and the digests
> - will be trimmed from the PDU buffer.
> -
> - @param[in] Conn The iSCSI connection to receive data from.
> - @param[out] Pdu The received iSCSI pdu.
> - @param[in] Context The context used to describe information on the
> caller provided
> - buffer to receive data segment of the iSCSI pdu, it's optional.
> - @param[in] HeaderDigest Whether there will be header digest received.
> - @param[in] DataDigest Whether there will be data digest.
> - @param[in] TimeoutEvent The timeout event, it's optional.
> -
> - @retval EFI_SUCCESS An iSCSI pdu is received.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error
> happened.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiReceivePdu (
> - IN ISCSI_CONNECTION *Conn,
> - OUT NET_BUF **Pdu,
> - IN ISCSI_IN_BUFFER_CONTEXT *Context, OPTIONAL
> - IN BOOLEAN HeaderDigest,
> - IN BOOLEAN DataDigest,
> - IN EFI_EVENT TimeoutEvent OPTIONAL
> - )
> -{
> - LIST_ENTRY *NbufList;
> - UINT32 Len;
> - NET_BUF *PduHdr;
> - UINT8 *Header;
> - EFI_STATUS Status;
> - UINT32 PadLen;
> - UINT32 InDataOffset;
> - NET_FRAGMENT Fragment[2];
> - UINT32 FragmentCount;
> - NET_BUF *DataSeg;
> - UINT32 PadAndCRC32[2];
> -
> - NbufList = AllocatePool (sizeof (LIST_ENTRY));
> - if (NbufList == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - InitializeListHead (NbufList);
> -
> - //
> - // The header digest will be received together with the PDU header if
> exists.
> - //
> - Len = sizeof (ISCSI_BASIC_HEADER) + (HeaderDigest ? sizeof (UINT32) : 0);
> - PduHdr = NetbufAlloc (Len);
> - if (PduHdr == NULL) {
> - FreePool (NbufList);
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Header = NetbufAllocSpace (PduHdr, Len, NET_BUF_TAIL);
> - ASSERT (Header != NULL);
> - InsertTailList (NbufList, &PduHdr->List);
> -
> - //
> - // First step, receive the BHS of the PDU.
> - //
> - Status = Tcp4IoReceive (&Conn->Tcp4Io, PduHdr, FALSE, TimeoutEvent);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - if (HeaderDigest) {
> - //
> - // TODO: check the header-digest.
> - //
> - //
> - // Trim off the digest.
> - //
> - NetbufTrim (PduHdr, sizeof (UINT32), NET_BUF_TAIL);
> - }
> -
> - Len = ISCSI_GET_DATASEG_LEN (Header);
> - if (Len == 0) {
> - //
> - // No data segment.Form the pdu from a list of pdu segments.
> - //
> - *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
> - if (*Pdu == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto ON_EXIT;
> - }
> - return Status;
> - }
> - //
> - // Get the length of the padding bytes of the data segment.
> - //
> - PadLen = ISCSI_GET_PAD_LEN (Len);
> -
> - switch (ISCSI_GET_OPCODE (Header)) {
> - case ISCSI_OPCODE_SCSI_DATA_IN:
> - //
> - // Try to use the buffer described by Context if the PDU is an
> - // iSCSI SCSI data in pdu so as to reduce memory copy overhead.
> - //
> - InDataOffset = ISCSI_GET_BUFFER_OFFSET (Header);
> - if ((Context == NULL) || ((InDataOffset + Len) > Context->InDataLen)) {
> - Status = EFI_PROTOCOL_ERROR;
> - goto ON_EXIT;
> - }
> -
> - Fragment[0].Len = Len;
> - Fragment[0].Bulk = Context->InData + InDataOffset;
> -
> - if (DataDigest || (PadLen != 0)) {
> - //
> - // The data segment is padded, use two fragments to receive it.
> - // The first to receive the useful data. The second to receive the padding.
> - //
> - Fragment[1].Len = PadLen + (DataDigest ? sizeof (UINT32) : 0);
> - Fragment[1].Bulk = (UINT8 *)PadAndCRC32 + (4 - PadLen);
> - FragmentCount = 2;
> - } else {
> - FragmentCount = 1;
> - }
> -
> - DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0,
> IScsiNbufExtFree, NULL);
> - if (DataSeg == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto ON_EXIT;
> - }
> -
> - break;
> -
> - case ISCSI_OPCODE_SCSI_RSP:
> - case ISCSI_OPCODE_NOP_IN:
> - case ISCSI_OPCODE_LOGIN_RSP:
> - case ISCSI_OPCODE_TEXT_RSP:
> - case ISCSI_OPCODE_ASYNC_MSG:
> - case ISCSI_OPCODE_REJECT:
> - case ISCSI_OPCODE_VENDOR_T0:
> - case ISCSI_OPCODE_VENDOR_T1:
> - case ISCSI_OPCODE_VENDOR_T2:
> - //
> - // Allocate buffer to receive the data segment.
> - //
> - Len += PadLen + (DataDigest ? sizeof (UINT32) : 0);
> - DataSeg = NetbufAlloc (Len);
> - if (DataSeg == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto ON_EXIT;
> - }
> -
> - NetbufAllocSpace (DataSeg, Len, NET_BUF_TAIL);
> - break;
> -
> - default:
> - Status = EFI_PROTOCOL_ERROR;
> - goto ON_EXIT;
> - }
> -
> - InsertTailList (NbufList, &DataSeg->List);
> -
> - //
> - // Receive the data segment with the data digest if any.
> - //
> - Status = Tcp4IoReceive (&Conn->Tcp4Io, DataSeg, FALSE, TimeoutEvent);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - if (DataDigest) {
> - //
> - // TODO: Check the data digest.
> - //
> - NetbufTrim (DataSeg, sizeof (UINT32), NET_BUF_TAIL);
> - }
> -
> - if (PadLen != 0) {
> - //
> - // Trim off the padding bytes in the data segment.
> - //
> - NetbufTrim (DataSeg, PadLen, NET_BUF_TAIL);
> - }
> -
> - //
> - // Form the pdu from a list of pdu segments.
> - //
> - *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
> - if (*Pdu == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - }
> -
> -ON_EXIT:
> -
> - if (EFI_ERROR (Status)) {
> - //
> - // Free the Nbufs in this NbufList and the NbufList itself.
> - //
> - IScsiFreeNbufList (NbufList);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Check and get the result of the prameter negotiation.
> -
> - @param[in, out] Conn The connection in iSCSI login.
> -
> - @retval EFI_SUCCESS The parmeter check is passed and negotiation is
> finished.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error
> happened.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -**/
> -EFI_STATUS
> -IScsiCheckOpParams (
> - IN OUT ISCSI_CONNECTION *Conn
> - )
> -{
> - EFI_STATUS Status;
> - LIST_ENTRY *KeyValueList;
> - CHAR8 *Data;
> - UINT32 Len;
> - ISCSI_SESSION *Session;
> - CHAR8 *Value;
> - UINTN NumericValue;
> -
> - ASSERT (Conn->RspQue.BufNum != 0);
> -
> - Session = Conn->Session;
> -
> - Len = Conn->RspQue.BufSize;
> - Data = AllocatePool (Len);
> - if (Data == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - NetbufQueCopy (&Conn->RspQue, 0, Len, (UINT8 *) Data);
> -
> - Status = EFI_PROTOCOL_ERROR;
> -
> - //
> - // Extract the Key-Value pairs into a list.
> - //
> - KeyValueList = IScsiBuildKeyValueList (Data, Len);
> - if (KeyValueList == NULL) {
> - FreePool (Data);
> - return Status;
> - }
> - //
> - // HeaderDigest
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_HEADER_DIGEST);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - if (AsciiStrCmp (Value, "CRC32") == 0) {
> - if (Conn->HeaderDigest != IScsiDigestCRC32) {
> - goto ON_ERROR;
> - }
> - } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) {
> - Conn->HeaderDigest = IScsiDigestNone;
> - } else {
> - goto ON_ERROR;
> - }
> - //
> - // DataDigest
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DATA_DIGEST);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - if (AsciiStrCmp (Value, "CRC32") == 0) {
> - if (Conn->DataDigest != IScsiDigestCRC32) {
> - goto ON_ERROR;
> - }
> - } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) {
> - Conn->DataDigest = IScsiDigestNone;
> - } else {
> - goto ON_ERROR;
> - }
> - //
> - // ErrorRecoveryLevel, result fuction is Minimum.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_ERROR_RECOVERY_LEVEL);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - NumericValue = AsciiStrDecimalToUintn (Value);
> - if (NumericValue > 2) {
> - goto ON_ERROR;
> - }
> -
> - Session->ErrorRecoveryLevel = (UINT8) MIN (Session->ErrorRecoveryLevel,
> NumericValue);
> -
> - //
> - // InitialR2T, result function is OR.
> - //
> - if (!Session->InitialR2T) {
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_INITIAL_R2T);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - Session->InitialR2T = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0);
> - }
> -
> - //
> - // ImmediateData, result function is AND.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_IMMEDIATE_DATA);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - Session->ImmediateData = (BOOLEAN) (Session->ImmediateData &&
> (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0));
> -
> - //
> - // MaxRecvDataSegmentLength is declarative.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH);
> - if (Value != NULL) {
> - Conn->MaxRecvDataSegmentLength = (UINT32) AsciiStrDecimalToUintn
> (Value);
> - }
> - //
> - // MaxBurstLength, result funtion is Mininum.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_MAX_BURST_LENGTH);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - NumericValue = AsciiStrDecimalToUintn (Value);
> - Session->MaxBurstLength = (UINT32) MIN (Session->MaxBurstLength,
> NumericValue);
> -
> - //
> - // FirstBurstLength, result function is Minimum. Irrelevant when
> InitialR2T=Yes and
> - // ImmediateData=No.
> - // This Key/Value is negotiation type.
> - //
> - if (!(Session->InitialR2T && !Session->ImmediateData)) {
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_FIRST_BURST_LENGTH);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - NumericValue = AsciiStrDecimalToUintn (Value);
> - Session->FirstBurstLength = (UINT32) MIN (Session->FirstBurstLength,
> NumericValue);
> - }
> -
> - //
> - // MaxConnections, result function is Minimum.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_MAX_CONNECTIONS);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - NumericValue = AsciiStrDecimalToUintn (Value);
> - if ((NumericValue == 0) || (NumericValue > 65535)) {
> - goto ON_ERROR;
> - }
> -
> - Session->MaxConnections = (UINT32) MIN (Session->MaxConnections,
> NumericValue);
> -
> - //
> - // DataPDUInOrder, result function is OR.
> - //
> - if (!Session->DataPDUInOrder) {
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DATA_PDU_IN_ORDER);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - Session->DataPDUInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0);
> - }
> -
> - //
> - // DataSequenceInorder, result function is OR.
> - //
> - if (!Session->DataSequenceInOrder) {
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DATA_SEQUENCE_IN_ORDER);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - Session->DataSequenceInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes")
> == 0);
> - }
> -
> - //
> - // DefaultTime2Wait, result function is Maximum.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DEFAULT_TIME2WAIT);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - NumericValue = AsciiStrDecimalToUintn (Value);
> - if (NumericValue == 0) {
> - Session->DefaultTime2Wait = 0;
> - } else if (NumericValue > 3600) {
> - goto ON_ERROR;
> - } else {
> - Session->DefaultTime2Wait = (UINT32) MAX (Session->DefaultTime2Wait,
> NumericValue);
> - }
> - //
> - // DefaultTime2Retain, result function is Minimum.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DEFAULT_TIME2RETAIN);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - NumericValue = AsciiStrDecimalToUintn (Value);
> - if (NumericValue == 0) {
> - Session->DefaultTime2Retain = 0;
> - } else if (NumericValue > 3600) {
> - goto ON_ERROR;
> - } else {
> - Session->DefaultTime2Retain = (UINT32) MIN (Session-
> >DefaultTime2Retain, NumericValue);
> - }
> - //
> - // MaxOutstandingR2T, result function is Minimum.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_MAX_OUTSTANDING_R2T);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - NumericValue = AsciiStrDecimalToUintn (Value);
> - if ((NumericValue == 0) || (NumericValue > 65535)) {
> - goto ON_ERROR;
> - }
> -
> - Session->MaxOutstandingR2T = (UINT16) MIN (Session-
> >MaxOutstandingR2T, NumericValue);
> -
> - //
> - // Remove declarative key-value pairs, if any.
> - //
> - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_SESSION_TYPE);
> - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ALIAS);
> - IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_TARGET_PORTAL_GROUP_TAG);
> - //
> - // Remove the key-value that may not needed for result function is OR.
> - //
> - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T);
> - IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DATA_PDU_IN_ORDER);
> - IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DATA_SEQUENCE_IN_ORDER);
> -
> - //
> - // Remove irrelevant parameter, if any.
> - //
> - if (Session->InitialR2T && !Session->ImmediateData) {
> - IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_FIRST_BURST_LENGTH);
> - }
> -
> - if (IsListEmpty (KeyValueList)) {
> - //
> - // Succeed if no more keys in the list.
> - //
> - Status = EFI_SUCCESS;
> - }
> -
> -ON_ERROR:
> -
> - IScsiFreeKeyValueList (KeyValueList);
> -
> - FreePool (Data);
> -
> - return Status;
> -}
> -
> -/**
> - Fill the oprational prameters.
> -
> - @param[in] Conn The connection in iSCSI login.
> - @param[in, out] Pdu The iSCSI login request PDU to fill the parameters.
> -
> - @retval EFI_SUCCESS The parmeters are filled into the iSCSI login
> request PDU.
> -**/
> -EFI_STATUS
> -IScsiFillOpParams (
> - IN ISCSI_CONNECTION *Conn,
> - IN OUT NET_BUF *Pdu
> - )
> -{
> - ISCSI_SESSION *Session;
> - CHAR8 Value[256];
> -
> - Session = Conn->Session;
> -
> - AsciiSPrint (Value, sizeof (Value), "%a", (Conn->HeaderDigest ==
> IScsiDigestCRC32) ? "None,CRC32" : "None");
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_HEADER_DIGEST, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%a", (Conn->DataDigest ==
> IScsiDigestCRC32) ? "None,CRC32" : "None");
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_DIGEST, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%d", Session->ErrorRecoveryLevel);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_ERROR_RECOVERY_LEVEL, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%a", Session->InitialR2T ? "Yes" : "No");
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIAL_R2T, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%a", Session->ImmediateData ? "Yes" :
> "No");
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_IMMEDIATE_DATA, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%d",
> MAX_RECV_DATA_SEG_LEN_IN_FFP);
> - IScsiAddKeyValuePair (Pdu,
> ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxBurstLength);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_BURST_LENGTH, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%d", Session->FirstBurstLength);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_FIRST_BURST_LENGTH, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxConnections);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_CONNECTIONS, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%a", Session->DataPDUInOrder ? "Yes" :
> "No");
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_PDU_IN_ORDER, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%a", Session->DataSequenceInOrder ?
> "Yes" : "No");
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER,
> Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Wait);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2WAIT, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Retain);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2RETAIN, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxOutstandingR2T);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_OUTSTANDING_R2T, Value);
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Pad the iSCSI AHS or data segment to an integer number of 4 byte words.
> -
> - @param[in, out] Pdu The iSCSI pdu which contains segments to pad.
> - @param[in] Len The length of the last semgnet in the PDU.
> -
> - @retval EFI_SUCCESS The segment is padded or no need to pad it.
> - @retval EFI_OUT_OF_RESOURCES There is not enough remaining free
> space to add the
> - padding bytes.
> -**/
> -EFI_STATUS
> -IScsiPadSegment (
> - IN OUT NET_BUF *Pdu,
> - IN UINT32 Len
> - )
> -{
> - UINT32 PadLen;
> - UINT8 *Data;
> -
> - PadLen = ISCSI_GET_PAD_LEN (Len);
> -
> - if (PadLen != 0) {
> - Data = NetbufAllocSpace (Pdu, PadLen, NET_BUF_TAIL);
> - if (Data == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - ZeroMem (Data, PadLen);
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Build a key-value list from the data segment.
> -
> - @param[in] Data The data segment containing the key-value pairs.
> - @param[in] Len Length of the data segment.
> -
> - @return The key-value list.
> - @retval NULL Other errors as indicated.
> -**/
> -LIST_ENTRY *
> -IScsiBuildKeyValueList (
> - IN CHAR8 *Data,
> - IN UINT32 Len
> - )
> -{
> - LIST_ENTRY *ListHead;
> - ISCSI_KEY_VALUE_PAIR *KeyValuePair;
> -
> - ListHead = AllocatePool (sizeof (LIST_ENTRY));
> - if (ListHead == NULL) {
> - return NULL;
> - }
> -
> - InitializeListHead (ListHead);
> -
> - while (Len > 0) {
> - KeyValuePair = AllocatePool (sizeof (ISCSI_KEY_VALUE_PAIR));
> - if (KeyValuePair == NULL) {
> - goto ON_ERROR;
> - }
> -
> - InitializeListHead (&KeyValuePair->List);
> -
> - KeyValuePair->Key = Data;
> -
> - while ((Len > 0) && (*Data != '=')) {
> - Len--;
> - Data++;
> - }
> -
> - if (*Data == '=') {
> - *Data = '\0';
> -
> - Data++;
> - Len--;
> - } else {
> - FreePool (KeyValuePair);
> - goto ON_ERROR;
> - }
> -
> - KeyValuePair->Value = Data;
> -
> - InsertTailList (ListHead, &KeyValuePair->List);;
> -
> - Data += AsciiStrLen (KeyValuePair->Value) + 1;
> - Len -= (UINT32) AsciiStrLen (KeyValuePair->Value) + 1;
> - }
> -
> - return ListHead;
> -
> -ON_ERROR:
> -
> - IScsiFreeKeyValueList (ListHead);
> -
> - return NULL;
> -}
> -
> -/**
> - Get the value string by the key name from the key-value list. If found,
> - the key-value entry will be removed from the list.
> -
> - @param[in, out] KeyValueList The key-value list.
> - @param[in] Key The key name to find.
> -
> - @return The value string.
> -**/
> -CHAR8 *
> -IScsiGetValueByKeyFromList (
> - IN OUT LIST_ENTRY *KeyValueList,
> - IN CHAR8 *Key
> - )
> -{
> - LIST_ENTRY *Entry;
> - ISCSI_KEY_VALUE_PAIR *KeyValuePair;
> - CHAR8 *Value;
> -
> - Value = NULL;
> -
> - NET_LIST_FOR_EACH (Entry, KeyValueList) {
> - KeyValuePair = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR,
> List);
> -
> - if (AsciiStrCmp (KeyValuePair->Key, Key) == 0) {
> - Value = KeyValuePair->Value;
> -
> - RemoveEntryList (&KeyValuePair->List);
> - FreePool (KeyValuePair);
> - break;
> - }
> - }
> -
> - return Value;
> -}
> -
> -/**
> - Free the key-value list.
> -
> - @param[in] KeyValueList The key-value list.
> -**/
> -VOID
> -IScsiFreeKeyValueList (
> - IN LIST_ENTRY *KeyValueList
> - )
> -{
> - LIST_ENTRY *Entry;
> - ISCSI_KEY_VALUE_PAIR *KeyValuePair;
> -
> - while (!IsListEmpty (KeyValueList)) {
> - Entry = NetListRemoveHead (KeyValueList);
> - KeyValuePair = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR,
> List);
> -
> - FreePool (KeyValuePair);
> - }
> -
> - FreePool (KeyValueList);
> -}
> -
> -/**
> - Normalize the iSCSI name according to RFC.
> -
> - @param[in, out] Name The iSCSI name.
> - @param[in] Len length of the iSCSI name.
> -
> - @retval EFI_SUCCESS The iSCSI name is valid and normalized.
> - @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in
> the IQN format.
> -**/
> -EFI_STATUS
> -IScsiNormalizeName (
> - IN OUT CHAR8 *Name,
> - IN UINTN Len
> - )
> -{
> - UINTN Index;
> -
> - for (Index = 0; Index < Len; Index++) {
> - if (NET_IS_UPPER_CASE_CHAR (Name[Index])) {
> - //
> - // Convert the upper-case characters to lower-case ones
> - //
> - Name[Index] = (CHAR8) (Name[Index] - 'A' + 'a');
> - }
> -
> - if (!NET_IS_LOWER_CASE_CHAR (Name[Index]) &&
> - !NET_IS_DIGIT (Name[Index]) &&
> - (Name[Index] != '-') &&
> - (Name[Index] != '.') &&
> - (Name[Index] != ':')
> - ) {
> - //
> - // ASCII dash, dot, colon lower-case characters and digit characters
> - // are allowed.
> - //
> - return EFI_PROTOCOL_ERROR;
> - }
> - }
> -
> - if ((Len < 4) || (CompareMem (Name, "iqn.", 4) != 0)) {
> - //
> - // Only IQN format is accepted now.
> - //
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Create an iSCSI task control block.
> -
> - @param[in] Conn The connection on which the task control block will
> be created.
> - @param[out] Tcb The newly created task control block.
> -
> - @retval EFI_SUCCESS The task control block is created.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NOT_READY The target can not accept new commands.
> -**/
> -EFI_STATUS
> -IScsiNewTcb (
> - IN ISCSI_CONNECTION *Conn,
> - OUT ISCSI_TCB **Tcb
> - )
> -{
> - ISCSI_SESSION *Session;
> - ISCSI_TCB *NewTcb;
> -
> - ASSERT (Tcb != NULL);
> -
> - Session = Conn->Session;
> -
> - if (ISCSI_SEQ_GT (Session->CmdSN, Session->MaxCmdSN)) {
> - return EFI_NOT_READY;
> - }
> -
> - NewTcb = AllocateZeroPool (sizeof (ISCSI_TCB));
> - if (NewTcb == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - InitializeListHead (&NewTcb->Link);
> -
> - NewTcb->SoFarInOrder = TRUE;
> - NewTcb->InitiatorTaskTag = Session->InitiatorTaskTag;
> - NewTcb->CmdSN = Session->CmdSN;
> - NewTcb->Conn = Conn;
> -
> - InsertTailList (&Session->TcbList, &NewTcb->Link);
> -
> - //
> - // Advance the initiator task tag.
> - //
> - Session->InitiatorTaskTag++;
> - Session->CmdSN++;
> -
> - *Tcb = NewTcb;
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Delete the tcb from the connection and destroy it.
> -
> - @param[in] Tcb The tcb to delete.
> -**/
> -VOID
> -IScsiDelTcb (
> - IN ISCSI_TCB *Tcb
> - )
> -{
> - RemoveEntryList (&Tcb->Link);
> -
> - FreePool (Tcb);
> -}
> -
> -
> -/**
> - Create a data segment, pad it and calculate the CRC if needed.
> -
> - @param[in] Data The data to fill into the data segment.
> - @param[in] Len Length of the data.
> - @param[in] DataDigest Whether to calculate CRC for this data segment.
> -
> - @return The net buffer wrapping the data segment.
> -**/
> -NET_BUF *
> -IScsiNewDataSegment (
> - IN UINT8 *Data,
> - IN UINT32 Len,
> - IN BOOLEAN DataDigest
> - )
> -{
> - NET_FRAGMENT Fragment[2];
> - UINT32 FragmentCount;
> - UINT32 PadLen;
> - NET_BUF *DataSeg;
> -
> - Fragment[0].Len = Len;
> - Fragment[0].Bulk = Data;
> -
> - PadLen = ISCSI_GET_PAD_LEN (Len);
> - if (PadLen != 0) {
> - Fragment[1].Len = PadLen;
> - Fragment[1].Bulk = (UINT8 *) &mDataSegPad;
> -
> - FragmentCount = 2;
> - } else {
> - FragmentCount = 1;
> - }
> -
> - DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0,
> IScsiNbufExtFree, NULL);
> -
> - return DataSeg;
> -}
> -
> -/**
> - Create a iSCSI SCSI command PDU to encapsulate the command issued
> - by SCSI through the EXT SCSI PASS THRU Protocol.
> -
> - @param[in] Packet The EXT SCSI PASS THRU request packet containing the
> SCSI command.
> - @param[in] Lun The LUN.
> - @param[in] Tcb The tcb associated with this SCSI command.
> -
> - @return The created iSCSI SCSI command PDU.
> - @retval NULL Other errors as indicated.
> -**/
> -NET_BUF *
> -IScsiNewScsiCmdPdu (
> - IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
> - IN UINT64 Lun,
> - IN ISCSI_TCB *Tcb
> - )
> -{
> - LIST_ENTRY *NbufList;
> - NET_BUF *Pdu;
> - NET_BUF *PduHeader;
> - NET_BUF *DataSeg;
> - SCSI_COMMAND *ScsiCmd;
> - UINT8 AHSLength;
> - UINT32 Length;
> - ISCSI_ADDITIONAL_HEADER *Header;
> - ISCSI_BI_EXP_READ_DATA_LEN_AHS *BiExpReadDataLenAHS;
> - ISCSI_SESSION *Session;
> - UINT32 ImmediateDataLen;
> -
> - AHSLength = 0;
> -
> - if (Packet->DataDirection == DataBi) {
> - //
> - // Bi directional Read/Write command, the bidirectional expected
> - // read data length AHS is required.
> - //
> - AHSLength += sizeof (ISCSI_BI_EXP_READ_DATA_LEN_AHS);
> - }
> -
> - if (Packet->CdbLength > 16) {
> - //
> - // The CDB exceeds 16 bytes, an extended CDB AHS is required.
> - //
> - AHSLength = (UINT8) (AHSLength + (ISCSI_ROUNDUP (Packet-
> >CdbLength - 16) + sizeof (ISCSI_ADDITIONAL_HEADER)));
> - }
> -
> - Length = sizeof (SCSI_COMMAND) + AHSLength;
> - PduHeader = NetbufAlloc (Length);
> - if (PduHeader == NULL) {
> - return NULL;
> - }
> -
> - ScsiCmd = (SCSI_COMMAND *) NetbufAllocSpace (PduHeader, Length,
> NET_BUF_TAIL);
> - if (ScsiCmd == NULL) {
> - NetbufFree (PduHeader);
> - return NULL;
> - }
> - Header = (ISCSI_ADDITIONAL_HEADER *) (ScsiCmd + 1);
> -
> - ZeroMem (ScsiCmd, Length);
> -
> - ISCSI_SET_OPCODE (ScsiCmd, ISCSI_OPCODE_SCSI_CMD, 0);
> - ISCSI_SET_FLAG (ScsiCmd, ISCSI_TASK_ATTR_SIMPLE);
> -
> - //
> - // Set the READ/WRITE flags according to the IO type of this request.
> - //
> - switch (Packet->DataDirection) {
> - case DataIn:
> - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ);
> - ScsiCmd->ExpDataXferLength = NTOHL (Packet->InTransferLength);
> - break;
> -
> - case DataOut:
> - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_WRITE);
> - ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength);
> - break;
> -
> - case DataBi:
> - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ |
> SCSI_CMD_PDU_FLAG_WRITE);
> - ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength);
> -
> - //
> - // Fill the bidirectional expected read data length AHS.
> - //
> - BiExpReadDataLenAHS = (ISCSI_BI_EXP_READ_DATA_LEN_AHS
> *) Header;
> - Header = (ISCSI_ADDITIONAL_HEADER *) (BiExpReadDataLenAHS + 1);
> -
> - BiExpReadDataLenAHS->Length = NTOHS (5);
> - BiExpReadDataLenAHS->Type =
> ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN;
> - BiExpReadDataLenAHS->ExpReadDataLength = NTOHL (Packet-
> >InTransferLength);
> -
> - break;
> - }
> -
> - ScsiCmd->TotalAHSLength = AHSLength;
> - CopyMem (ScsiCmd->Lun, &Lun, sizeof (ScsiCmd->Lun));
> - ScsiCmd->InitiatorTaskTag = NTOHL (Tcb->InitiatorTaskTag);
> - ScsiCmd->CmdSN = NTOHL (Tcb->CmdSN);
> - ScsiCmd->ExpStatSN = NTOHL (Tcb->Conn->ExpStatSN);
> -
> - CopyMem (ScsiCmd->Cdb, Packet->Cdb, sizeof (ScsiCmd->Cdb));
> -
> - if (Packet->CdbLength > 16) {
> - Header->Length = NTOHS ((UINT16) (Packet->CdbLength - 15));
> - Header->Type = ISCSI_AHS_TYPE_EXT_CDB;
> -
> - CopyMem (Header + 1, (UINT8 *) Packet->Cdb + 16, Packet->CdbLength -
> 16);
> - }
> -
> - Pdu = PduHeader;
> - Session = Tcb->Conn->Session;
> - ImmediateDataLen = 0;
> -
> - if (Session->ImmediateData && (Packet->OutTransferLength != 0)) {
> - //
> - // Send immediate data in this SCSI Command PDU. The length of the
> immeidate
> - // data is the minimum of FirstBurstLength, the data length to be xfered
> and
> - // the MaxRecvdataSegmentLength on this connection.
> - //
> - ImmediateDataLen = MIN (Session->FirstBurstLength, Packet-
> >OutTransferLength);
> - ImmediateDataLen = MIN (ImmediateDataLen, Tcb->Conn-
> >MaxRecvDataSegmentLength);
> -
> - //
> - // Update the data segment length in the PDU header.
> - //
> - ISCSI_SET_DATASEG_LEN (ScsiCmd, ImmediateDataLen);
> -
> - //
> - // Create the data segment.
> - //
> - DataSeg = IScsiNewDataSegment ((UINT8 *) Packet->OutDataBuffer,
> ImmediateDataLen, FALSE);
> - if (DataSeg == NULL) {
> - NetbufFree (PduHeader);
> - Pdu = NULL;
> - goto ON_EXIT;
> - }
> -
> - NbufList = AllocatePool (sizeof (LIST_ENTRY));
> - if (NbufList == NULL) {
> - NetbufFree (PduHeader);
> - NetbufFree (DataSeg);
> -
> - Pdu = NULL;
> - goto ON_EXIT;
> - }
> -
> - InitializeListHead (NbufList);
> - InsertTailList (NbufList, &PduHeader->List);
> - InsertTailList (NbufList, &DataSeg->List);
> -
> - Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
> - if (Pdu == NULL) {
> - IScsiFreeNbufList (NbufList);
> - }
> - }
> -
> - if (Session->InitialR2T ||
> - (ImmediateDataLen == Session->FirstBurstLength) ||
> - (ImmediateDataLen == Packet->OutTransferLength)
> - ) {
> - //
> - // Unsolicited data out sequence is not allowed,
> - // or FirstBurstLength data is already sent out by immediate data
> - // or all the OUT data accompany this SCSI packet is sent as
> - // immediate data, the final flag should be set on this SCSI Command
> - // PDU.
> - //
> - ISCSI_SET_FLAG (ScsiCmd, ISCSI_BHS_FLAG_FINAL);
> - }
> -
> -ON_EXIT:
> -
> - return Pdu;
> -}
> -
> -/**
> - Create a new iSCSI SCSI Data Out PDU.
> -
> - @param[in] Data The data to put into the Data Out PDU.
> - @param[in] Len Length of the data.
> - @param[in] DataSN The DataSN of the Data Out PDU.
> - @param[in] Tcb The task control block of this Data Out PDU.
> - @param[in] Lun The LUN.
> -
> - @return The net buffer wrapping the Data Out PDU.
> - @retval NULL Other errors as indicated.
> -**/
> -NET_BUF *
> -IScsiNewDataOutPdu (
> - IN UINT8 *Data,
> - IN UINT32 Len,
> - IN UINT32 DataSN,
> - IN ISCSI_TCB *Tcb,
> - IN UINT64 Lun
> - )
> -{
> - LIST_ENTRY *NbufList;
> - NET_BUF *PduHdr;
> - NET_BUF *DataSeg;
> - NET_BUF *Pdu;
> - ISCSI_SCSI_DATA_OUT *DataOutHdr;
> - ISCSI_XFER_CONTEXT *XferContext;
> -
> - NbufList = AllocatePool (sizeof (LIST_ENTRY));
> - if (NbufList == NULL) {
> - return NULL;
> - }
> -
> - InitializeListHead (NbufList);
> -
> - //
> - // Allocate memory for the BHS.
> - //
> - PduHdr = NetbufAlloc (sizeof (ISCSI_SCSI_DATA_OUT));
> - if (PduHdr == NULL) {
> - FreePool (NbufList);
> - return NULL;
> - }
> - //
> - // Insert the BHS into the buffer list.
> - //
> - InsertTailList (NbufList, &PduHdr->List);
> -
> - DataOutHdr = (ISCSI_SCSI_DATA_OUT *) NetbufAllocSpace (PduHdr,
> sizeof (ISCSI_SCSI_DATA_OUT), NET_BUF_TAIL);
> - ASSERT (DataOutHdr != NULL);
> - XferContext = &Tcb->XferContext;
> -
> - ZeroMem (DataOutHdr, sizeof (ISCSI_SCSI_DATA_OUT));
> -
> - //
> - // Set the flags and fields of the Data Out PDU BHS.
> - //
> - ISCSI_SET_OPCODE (DataOutHdr, ISCSI_OPCODE_SCSI_DATA_OUT, 0);
> - ISCSI_SET_DATASEG_LEN (DataOutHdr, Len);
> -
> - DataOutHdr->InitiatorTaskTag = HTONL (Tcb->InitiatorTaskTag);
> - DataOutHdr->TargetTransferTag = HTONL (XferContext-
> >TargetTransferTag);
> - DataOutHdr->ExpStatSN = HTONL (Tcb->Conn->ExpStatSN);
> - DataOutHdr->DataSN = HTONL (DataSN);
> - DataOutHdr->BufferOffset = HTONL (XferContext->Offset);
> -
> - if (XferContext->TargetTransferTag != ISCSI_RESERVED_TAG) {
> - CopyMem (&DataOutHdr->Lun, &Lun, sizeof (DataOutHdr->Lun));
> - }
> - //
> - // Build the data segment for this Data Out PDU.
> - //
> - DataSeg = IScsiNewDataSegment (Data, Len, FALSE);
> - if (DataSeg == NULL) {
> - IScsiFreeNbufList (NbufList);
> - return NULL;
> - }
> - //
> - // Put the data segment into the buffer list and combine it with the BHS
> - // into a full Data Out PDU.
> - //
> - InsertTailList (NbufList, &DataSeg->List);
> - Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
> - if (Pdu == NULL) {
> - IScsiFreeNbufList (NbufList);
> - }
> -
> - return Pdu;
> -}
> -
> -/**
> - Generate a consecutive sequence of iSCSI SCSI Data Out PDUs.
> -
> - @param[in] Data The data which will be carried by the sequence of iSCSI
> SCSI Data Out PDUs.
> - @param[in] Tcb The task control block of the data to send out.
> - @param[in] Lun The LUN the data will be sent to.
> -
> - @return A list of net buffers with each of them wraps an iSCSI SCSI Data
> Out PDU.
> - @retval NULL Other errors as indicated.
> -**/
> -LIST_ENTRY *
> -IScsiGenerateDataOutPduSequence (
> - IN UINT8 *Data,
> - IN ISCSI_TCB *Tcb,
> - IN UINT64 Lun
> - )
> -{
> - LIST_ENTRY *PduList;
> - UINT32 DataSN;
> - UINT32 DataLen;
> - NET_BUF *DataOutPdu;
> - ISCSI_CONNECTION *Conn;
> - ISCSI_XFER_CONTEXT *XferContext;
> - UINT8 *DataOutPacket;
> -
> - PduList = AllocatePool (sizeof (LIST_ENTRY));
> - if (PduList == NULL) {
> - return NULL;
> - }
> -
> - InitializeListHead (PduList);
> -
> - DataSN = 0;
> - Conn = Tcb->Conn;
> - DataOutPdu = NULL;
> - XferContext = &Tcb->XferContext;
> -
> - while (XferContext->DesiredLength > 0) {
> - //
> - // Determine the length of data this Data Out PDU can carry.
> - //
> - DataLen = MIN (XferContext->DesiredLength, Conn-
> >MaxRecvDataSegmentLength);
> -
> - //
> - // Create a Data Out PDU.
> - //
> - DataOutPdu = IScsiNewDataOutPdu (Data, DataLen, DataSN, Tcb, Lun);
> - if (DataOutPdu == NULL) {
> - IScsiFreeNbufList (PduList);
> - PduList = NULL;
> -
> - goto ON_EXIT;
> - }
> -
> - InsertTailList (PduList, &DataOutPdu->List);
> -
> - //
> - // Update the context and DataSN.
> - //
> - XferContext->Offset += DataLen;
> - XferContext->DesiredLength -= DataLen;
> - DataSN++;
> - Data += DataLen;
> - }
> - //
> - // Set the F bit for the last data out PDU in this sequence.
> - //
> - DataOutPacket = NetbufGetByte (DataOutPdu, 0, NULL);
> - if (DataOutPacket == NULL) {
> - IScsiFreeNbufList (PduList);
> - PduList = NULL;
> - goto ON_EXIT;
> - }
> -
> - ISCSI_SET_FLAG (DataOutPacket, ISCSI_BHS_FLAG_FINAL);
> -
> -ON_EXIT:
> -
> - return PduList;
> -}
> -
> -/**
> - Send the Data in a sequence of Data Out PDUs one by one.
> -
> - @param[in] Data The data to carry by Data Out PDUs.
> - @param[in] Lun The LUN the data will be sent to.
> - @param[in] Tcb The task control block.
> -
> - @retval EFI_SUCCES The data is sent out to the LUN.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiSendDataOutPduSequence (
> - IN UINT8 *Data,
> - IN UINT64 Lun,
> - IN ISCSI_TCB *Tcb
> - )
> -{
> - LIST_ENTRY *DataOutPduList;
> - LIST_ENTRY *Entry;
> - NET_BUF *Pdu;
> - EFI_STATUS Status;
> -
> - //
> - // Generate the Data Out PDU sequence.
> - //
> - DataOutPduList = IScsiGenerateDataOutPduSequence (Data, Tcb, Lun);
> - if (DataOutPduList == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Status = EFI_SUCCESS;
> -
> - //
> - // Send the Data Out PDU's one by one.
> - //
> - NET_LIST_FOR_EACH (Entry, DataOutPduList) {
> - Pdu = NET_LIST_USER_STRUCT (Entry, NET_BUF, List);
> -
> - Status = Tcp4IoTransmit (&Tcb->Conn->Tcp4Io, Pdu);
> - if (EFI_ERROR (Status)) {
> - break;
> - }
> - }
> -
> - IScsiFreeNbufList (DataOutPduList);
> -
> - return Status;
> -}
> -
> -/**
> - Process the received iSCSI SCSI Data In PDU.
> -
> - @param[in] Pdu The Data In PDU received.
> - @param[in] Tcb The task control block.
> - @param[in, out] Packet The EXT SCSI PASS THRU request packet.
> -
> - @retval EFI_SUCCES The check on the Data IN PDU is passed and
> some update
> - actions are taken.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror
> happened.
> - @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the
> request.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiOnDataInRcvd (
> - IN NET_BUF *Pdu,
> - IN ISCSI_TCB *Tcb,
> - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
> - )
> -{
> - ISCSI_SCSI_DATA_IN *DataInHdr;
> - EFI_STATUS Status;
> -
> - DataInHdr = (ISCSI_SCSI_DATA_IN *) NetbufGetByte (Pdu, 0,
> NULL);
> - if (DataInHdr == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - DataInHdr->InitiatorTaskTag = NTOHL (DataInHdr->InitiatorTaskTag);
> - DataInHdr->ExpCmdSN = NTOHL (DataInHdr->ExpCmdSN);
> - DataInHdr->MaxCmdSN = NTOHL (DataInHdr->MaxCmdSN);
> - DataInHdr->DataSN = NTOHL (DataInHdr->DataSN);
> -
> - //
> - // Check the DataSN.
> - //
> - Status = IScsiCheckSN (&Tcb->ExpDataSN, DataInHdr->DataSN);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - if (DataInHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) {
> - return EFI_PROTOCOL_ERROR;
> - }
> - //
> - // Update the command related sequence numbers.
> - //
> - IScsiUpdateCmdSN (Tcb->Conn->Session, DataInHdr->MaxCmdSN,
> DataInHdr->ExpCmdSN);
> -
> - if (ISCSI_FLAG_ON (DataInHdr,
> SCSI_DATA_IN_PDU_FLAG_STATUS_VALID)) {
> - if (!ISCSI_FLAG_ON (DataInHdr, ISCSI_BHS_FLAG_FINAL)) {
> - //
> - // The S bit is on but the F bit is off.
> - //
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - Tcb->StatusXferd = TRUE;
> -
> - if (ISCSI_FLAG_ON (DataInHdr, SCSI_DATA_IN_PDU_FLAG_OVERFLOW |
> SCSI_DATA_IN_PDU_FLAG_UNDERFLOW)) {
> - //
> - // Underflow and Overflow are mutual flags.
> - //
> - return EFI_PROTOCOL_ERROR;
> - }
> - //
> - // S bit is on, the StatSN is valid.
> - //
> - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NTOHL (DataInHdr-
> >StatSN));
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - Packet->HostAdapterStatus = 0;
> - Packet->TargetStatus = DataInHdr->Status;
> -
> - if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) {
> - Packet->InTransferLength += NTOHL (DataInHdr->ResidualCount);
> - Status = EFI_BAD_BUFFER_SIZE;
> - }
> -
> - if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) {
> - Packet->InTransferLength -= NTOHL (DataInHdr->ResidualCount);
> - }
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Process the received iSCSI R2T PDU.
> -
> - @param[in] Pdu The R2T PDU received.
> - @param[in] Tcb The task control block.
> - @param[in] Lun The Lun.
> - @param[in, out] Packet The EXT SCSI PASS THRU request packet.
> -
> - @retval EFI_SUCCES The R2T PDU is valid and the solicited data is sent
> out.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror
> happened.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiOnR2TRcvd (
> - IN NET_BUF *Pdu,
> - IN ISCSI_TCB *Tcb,
> - IN UINT64 Lun,
> - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
> - )
> -{
> - ISCSI_READY_TO_TRANSFER *R2THdr;
> - EFI_STATUS Status;
> - ISCSI_XFER_CONTEXT *XferContext;
> - UINT8 *Data;
> -
> - R2THdr = (ISCSI_READY_TO_TRANSFER *) NetbufGetByte (Pdu, 0, NULL);
> - if (R2THdr == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - R2THdr->InitiatorTaskTag = NTOHL (R2THdr->InitiatorTaskTag);
> - R2THdr->TargetTransferTag = NTOHL (R2THdr->TargetTransferTag);
> - R2THdr->StatSN = NTOHL (R2THdr->StatSN);
> - R2THdr->R2TSeqNum = NTOHL (R2THdr->R2TSeqNum);
> - R2THdr->BufferOffset = NTOHL (R2THdr->BufferOffset);
> - R2THdr->DesiredDataTransferLength = NTOHL (R2THdr-
> >DesiredDataTransferLength);
> -
> - if ((R2THdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) || !ISCSI_SEQ_EQ
> (R2THdr->StatSN, Tcb->Conn->ExpStatSN)) {
> - return EFI_PROTOCOL_ERROR;;
> - }
> - //
> - // Check the sequence number.
> - //
> - Status = IScsiCheckSN (&Tcb->ExpDataSN, R2THdr->R2TSeqNum);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - XferContext = &Tcb->XferContext;
> - XferContext->TargetTransferTag = R2THdr->TargetTransferTag;
> - XferContext->Offset = R2THdr->BufferOffset;
> - XferContext->DesiredLength = R2THdr->DesiredDataTransferLength;
> -
> - if (((XferContext->Offset + XferContext->DesiredLength) > Packet-
> >OutTransferLength) ||
> - (XferContext->DesiredLength > Tcb->Conn->Session->MaxBurstLength)
> - ) {
> - return EFI_PROTOCOL_ERROR;
> - }
> - //
> - // Send the data solicited by this R2T.
> - //
> - Data = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset;
> - Status = IScsiSendDataOutPduSequence (Data, Lun, Tcb);
> -
> - return Status;
> -}
> -
> -/**
> - Process the received iSCSI SCSI Response PDU.
> -
> - @param[in] Pdu The Response PDU received.
> - @param[in] Tcb The task control block.
> - @param[in, out] Packet The EXT SCSI PASS THRU request packet.
> -
> - @retval EFI_SUCCES The Response PDU is processed.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror
> happened.
> - @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the
> request.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiOnScsiRspRcvd (
> - IN NET_BUF *Pdu,
> - IN ISCSI_TCB *Tcb,
> - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
> - )
> -{
> - SCSI_RESPONSE *ScsiRspHdr;
> - ISCSI_SENSE_DATA *SenseData;
> - EFI_STATUS Status;
> - UINT32 DataSegLen;
> -
> - ScsiRspHdr = (SCSI_RESPONSE *) NetbufGetByte (Pdu, 0, NULL);
> - if (ScsiRspHdr == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - ScsiRspHdr->InitiatorTaskTag = NTOHL (ScsiRspHdr->InitiatorTaskTag);
> - if (ScsiRspHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - ScsiRspHdr->StatSN = NTOHL (ScsiRspHdr->StatSN);
> -
> - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, ScsiRspHdr-
> >StatSN);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - ScsiRspHdr->MaxCmdSN = NTOHL (ScsiRspHdr->MaxCmdSN);
> - ScsiRspHdr->ExpCmdSN = NTOHL (ScsiRspHdr->ExpCmdSN);
> - IScsiUpdateCmdSN (Tcb->Conn->Session, ScsiRspHdr->MaxCmdSN,
> ScsiRspHdr->ExpCmdSN);
> -
> - Tcb->StatusXferd = TRUE;
> -
> - Packet->HostAdapterStatus = ScsiRspHdr->Response;
> - if (Packet->HostAdapterStatus !=
> ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET) {
> - return EFI_SUCCESS;
> - }
> -
> - Packet->TargetStatus = ScsiRspHdr->Status;
> -
> - if (ISCSI_FLAG_ON (ScsiRspHdr,
> SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW |
> SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW) ||
> - ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW |
> SCSI_RSP_PDU_FLAG_UNDERFLOW)
> - ) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - if (ISCSI_FLAG_ON (ScsiRspHdr,
> SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW)) {
> - Packet->InTransferLength += NTOHL (ScsiRspHdr->BiReadResidualCount);
> - Status = EFI_BAD_BUFFER_SIZE;
> - }
> -
> - if (ISCSI_FLAG_ON (ScsiRspHdr,
> SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW)) {
> - Packet->InTransferLength -= NTOHL (ScsiRspHdr->BiReadResidualCount);
> - }
> -
> - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) {
> - if (Packet->DataDirection == DataIn) {
> - Packet->InTransferLength += NTOHL (ScsiRspHdr->ResidualCount);
> - } else {
> - Packet->OutTransferLength += NTOHL (ScsiRspHdr->ResidualCount);
> - }
> -
> - Status = EFI_BAD_BUFFER_SIZE;
> - }
> -
> - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) {
> - if (Packet->DataDirection == DataIn) {
> - Packet->InTransferLength -= NTOHL (ScsiRspHdr->ResidualCount);
> - } else {
> - Packet->OutTransferLength -= NTOHL (ScsiRspHdr->ResidualCount);
> - }
> - }
> -
> - DataSegLen = ISCSI_GET_DATASEG_LEN (ScsiRspHdr);
> - if (DataSegLen != 0) {
> - SenseData = (ISCSI_SENSE_DATA *) NetbufGetByte (Pdu, sizeof
> (SCSI_RESPONSE), NULL);
> - if (SenseData == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - SenseData->Length = NTOHS (SenseData->Length);
> -
> - Packet->SenseDataLength = (UINT8) MIN (SenseData->Length, Packet-
> >SenseDataLength);
> - if (Packet->SenseDataLength != 0) {
> - CopyMem (Packet->SenseData, &SenseData->Data[0], Packet-
> >SenseDataLength);
> - }
> - } else {
> - Packet->SenseDataLength = 0;
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Process the received NOP In PDU.
> -
> - @param[in] Pdu The NOP In PDU received.
> - @param[in] Tcb The task control block.
> -
> - @retval EFI_SUCCES The NOP In PDU is processed and the related
> sequence
> - numbers are updated.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror
> happened.
> -**/
> -EFI_STATUS
> -IScsiOnNopInRcvd (
> - IN NET_BUF *Pdu,
> - IN ISCSI_TCB *Tcb
> - )
> -{
> - ISCSI_NOP_IN *NopInHdr;
> - EFI_STATUS Status;
> -
> - NopInHdr = (ISCSI_NOP_IN *) NetbufGetByte (Pdu, 0, NULL);
> - if (NopInHdr == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - NopInHdr->StatSN = NTOHL (NopInHdr->StatSN);
> - NopInHdr->ExpCmdSN = NTOHL (NopInHdr->ExpCmdSN);
> - NopInHdr->MaxCmdSN = NTOHL (NopInHdr->MaxCmdSN);
> -
> - if (NopInHdr->InitiatorTaskTag == ISCSI_RESERVED_TAG) {
> - if (NopInHdr->StatSN != Tcb->Conn->ExpStatSN) {
> - return EFI_PROTOCOL_ERROR;
> - }
> - } else {
> - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NopInHdr->StatSN);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> - }
> -
> - IScsiUpdateCmdSN (Tcb->Conn->Session, NopInHdr->MaxCmdSN,
> NopInHdr->ExpCmdSN);
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Execute the SCSI command issued through the EXT SCSI PASS THRU
> protocol.
> -
> - @param[in] PassThru The EXT SCSI PASS THRU protocol.
> - @param[in] Target The target ID.
> - @param[in] Lun The LUN.
> - @param[in, out] Packet The request packet containing IO request, SCSI
> command
> - buffer and buffers to read/write.
> -
> - @retval EFI_SUCCES The SCSI command is executed and the result is
> updated to
> - the Packet.
> - @retval EFI_DEVICE_ERROR Session state was not as required.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NOT_READY The target can not accept new commands.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiExecuteScsiCommand (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru,
> - IN UINT8 *Target,
> - IN UINT64 Lun,
> - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
> - )
> -{
> - EFI_STATUS Status;
> - ISCSI_DRIVER_DATA *Private;
> - ISCSI_SESSION *Session;
> - EFI_EVENT TimeoutEvent;
> - ISCSI_CONNECTION *Conn;
> - ISCSI_TCB *Tcb;
> - NET_BUF *Pdu;
> - ISCSI_XFER_CONTEXT *XferContext;
> - UINT8 *Data;
> - ISCSI_IN_BUFFER_CONTEXT InBufferContext;
> - UINT64 Timeout;
> - UINT8 *PduHdr;
> -
> - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru);
> - Session = &Private->Session;
> - Status = EFI_SUCCESS;
> - Tcb = NULL;
> - TimeoutEvent = NULL;
> - Timeout = 0;
> -
> - if (Session->State != SESSION_STATE_LOGGED_IN) {
> - Status = EFI_DEVICE_ERROR;
> - goto ON_EXIT;
> - }
> -
> - Conn = NET_LIST_USER_STRUCT_S (
> - Session->Conns.ForwardLink,
> - ISCSI_CONNECTION,
> - Link,
> - ISCSI_CONNECTION_SIGNATURE
> - );
> -
> - if (Packet->Timeout != 0) {
> - Timeout = MultU64x32 (Packet->Timeout, 2);
> - }
> -
> - Status = IScsiNewTcb (Conn, &Tcb);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - //
> - // Encapsulate the SCSI request packet into an iSCSI SCSI Command PDU.
> - //
> - Pdu = IScsiNewScsiCmdPdu (Packet, Lun, Tcb);
> - if (Pdu == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto ON_EXIT;
> - }
> -
> - XferContext = &Tcb->XferContext;
> - PduHdr = NetbufGetByte (Pdu, 0, NULL);
> - if (PduHdr == NULL) {
> - Status = EFI_PROTOCOL_ERROR;
> - NetbufFree (Pdu);
> - goto ON_EXIT;
> - }
> - XferContext->Offset = ISCSI_GET_DATASEG_LEN (PduHdr);
> -
> - //
> - // Transmit the SCSI Command PDU.
> - //
> - Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu);
> -
> - NetbufFree (Pdu);
> -
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - if (!Session->InitialR2T &&
> - (XferContext->Offset < Session->FirstBurstLength) &&
> - (XferContext->Offset < Packet->OutTransferLength)
> - ) {
> - //
> - // Unsolicited Data-Out sequence is allowed, there is remaining SCSI
> - // OUT data and the limit of FirstBurstLength is not reached.
> - //
> - XferContext->TargetTransferTag = ISCSI_RESERVED_TAG;
> - XferContext->DesiredLength = MIN (
> - Session->FirstBurstLength,
> - Packet->OutTransferLength - XferContext->Offset
> - );
> -
> - Data = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset;
> - Status = IScsiSendDataOutPduSequence (Data, Lun, Tcb);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - }
> -
> - InBufferContext.InData = (UINT8 *) Packet->InDataBuffer;
> - InBufferContext.InDataLen = Packet->InTransferLength;
> -
> - while (!Tcb->StatusXferd) {
> - //
> - // Start the timeout timer.
> - //
> - if (Timeout != 0) {
> - Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, Timeout);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - TimeoutEvent = Conn->TimeoutEvent;
> - }
> - //
> - // try to receive PDU from target.
> - //
> - Status = IScsiReceivePdu (Conn, &Pdu, &InBufferContext, FALSE, FALSE,
> TimeoutEvent);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - PduHdr = NetbufGetByte (Pdu, 0, NULL);
> - if (PduHdr == NULL) {
> - Status = EFI_PROTOCOL_ERROR;
> - NetbufFree (Pdu);
> - goto ON_EXIT;
> - }
> - switch (ISCSI_GET_OPCODE (PduHdr)) {
> - case ISCSI_OPCODE_SCSI_DATA_IN:
> - Status = IScsiOnDataInRcvd (Pdu, Tcb, Packet);
> - break;
> -
> - case ISCSI_OPCODE_R2T:
> - Status = IScsiOnR2TRcvd (Pdu, Tcb, Lun, Packet);
> - break;
> -
> - case ISCSI_OPCODE_SCSI_RSP:
> - Status = IScsiOnScsiRspRcvd (Pdu, Tcb, Packet);
> - break;
> -
> - case ISCSI_OPCODE_NOP_IN:
> - Status = IScsiOnNopInRcvd (Pdu, Tcb);
> - break;
> -
> - case ISCSI_OPCODE_VENDOR_T0:
> - case ISCSI_OPCODE_VENDOR_T1:
> - case ISCSI_OPCODE_VENDOR_T2:
> - //
> - // These messages are vendor specific, skip them.
> - //
> - break;
> -
> - default:
> - Status = EFI_PROTOCOL_ERROR;
> - break;
> - }
> -
> - NetbufFree (Pdu);
> -
> - if (EFI_ERROR (Status)) {
> - break;
> - }
> - }
> -
> -ON_EXIT:
> -
> - if (TimeoutEvent != NULL) {
> - gBS->SetTimer (TimeoutEvent, TimerCancel, 0);
> - }
> -
> - if (Tcb != NULL) {
> - IScsiDelTcb (Tcb);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Reinstate the session on some error.
> -
> - @param[in, out] Private The iSCSI driver data.
> -
> - @retval EFI_SUCCES The session is reinstated from some error.
> - @retval Other Reinstatement failed.
> -**/
> -EFI_STATUS
> -IScsiSessionReinstatement (
> - IN OUT ISCSI_DRIVER_DATA *Private
> - )
> -{
> - ISCSI_SESSION *Session;
> - EFI_STATUS Status;
> -
> - Session = &Private->Session;
> - ASSERT (Session->State != SESSION_STATE_FREE);
> -
> - //
> - // Abort the session and re-init it.
> - //
> - IScsiSessionAbort (Session);
> - IScsiSessionInit (Session, TRUE);
> -
> - //
> - // Login again.
> - //
> - Status = IScsiSessionLogin (Private);
> -
> - return Status;
> -}
> -
> -/**
> - Initialize some session parameters before login.
> -
> - @param[in, out] Session The iSCSI session.
> - @param[in] Recovery Whether the request is from a fresh new start or
> recovery.
> -**/
> -VOID
> -IScsiSessionInit (
> - IN OUT ISCSI_SESSION *Session,
> - IN BOOLEAN Recovery
> - )
> -{
> - if (!Recovery) {
> - Session->Signature = ISCSI_SESSION_SIGNATURE;
> - Session->State = SESSION_STATE_FREE;
> -
> - InitializeListHead (&Session->Conns);
> - InitializeListHead (&Session->TcbList);
> - }
> -
> - Session->Tsih = 0;
> -
> - Session->CmdSN = 1;
> - Session->InitiatorTaskTag = 1;
> - Session->NextCid = 1;
> -
> - Session->TargetPortalGroupTag = 0;
> - Session->MaxConnections = ISCSI_MAX_CONNS_PER_SESSION;
> - Session->InitialR2T = FALSE;
> - Session->ImmediateData = TRUE;
> - Session->MaxBurstLength = 262144;
> - Session->FirstBurstLength = MAX_RECV_DATA_SEG_LEN_IN_FFP;
> - Session->DefaultTime2Wait = 2;
> - Session->DefaultTime2Retain = 20;
> - Session->MaxOutstandingR2T = DEFAULT_MAX_OUTSTANDING_R2T;
> - Session->DataPDUInOrder = TRUE;
> - Session->DataSequenceInOrder = TRUE;
> - Session->ErrorRecoveryLevel = 0;
> -}
> -
> -/**
> - Abort the iSCSI session, that is, reset all the connection and free the
> - resources.
> -
> - @param[in, out] Session The iSCSI session.
> -
> - @retval EFI_SUCCES The session is aborted.
> -**/
> -EFI_STATUS
> -IScsiSessionAbort (
> - IN OUT ISCSI_SESSION *Session
> - )
> -{
> - ISCSI_DRIVER_DATA *Private;
> - ISCSI_CONNECTION *Conn;
> -
> - if (Session->State != SESSION_STATE_LOGGED_IN) {
> - return EFI_SUCCESS;
> - }
> -
> - ASSERT (!IsListEmpty (&Session->Conns));
> -
> - Private = ISCSI_DRIVER_DATA_FROM_SESSION (Session);
> -
> - while (!IsListEmpty (&Session->Conns)) {
> - Conn = NET_LIST_USER_STRUCT_S (
> - Session->Conns.ForwardLink,
> - ISCSI_CONNECTION,
> - Link,
> - ISCSI_CONNECTION_SIGNATURE
> - );
> -
> - gBS->CloseProtocol (
> - Conn->Tcp4Io.Handle,
> - &gEfiTcp4ProtocolGuid,
> - Private->Image,
> - Private->ExtScsiPassThruHandle
> - );
> -
> - IScsiConnReset (Conn);
> -
> - IScsiDetatchConnection (Conn);
> - IScsiDestroyConnection (Conn);
> - }
> -
> - Session->State = SESSION_STATE_FAILED;
> -
> - return EFI_SUCCESS;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c
> deleted file mode 100644
> index 901b38e92fc0..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c
> +++ /dev/null
> @@ -1,487 +0,0 @@
> -/** @file
> - The wrap of TCP/IP Socket interface.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -/**
> - The common notify function associated with various Tcp4Io events.
> -
> - @param[in] Event The event signaled.
> - @param[in] Context The context.
> -**/
> -VOID
> -EFIAPI
> -Tcp4IoCommonNotify (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - )
> -{
> - *((BOOLEAN *) Context) = TRUE;
> -}
> -
> -/**
> - Create a TCP socket with the specified configuration data.
> -
> - @param[in] Image The handle of the driver image.
> - @param[in] Controller The handle of the controller.
> - @param[in] ConfigData The Tcp4 configuration data.
> - @param[in] Tcp4Io The Tcp4Io.
> -
> - @retval EFI_SUCCESS The TCP socket is created and configured.
> - @retval Others Failed to create the TCP socket or configure it.
> -**/
> -EFI_STATUS
> -Tcp4IoCreateSocket (
> - IN EFI_HANDLE Image,
> - IN EFI_HANDLE Controller,
> - IN TCP4_IO_CONFIG_DATA *ConfigData,
> - IN TCP4_IO *Tcp4Io
> - )
> -{
> - EFI_STATUS Status;
> - EFI_TCP4_PROTOCOL *Tcp4;
> - EFI_TCP4_CONFIG_DATA Tcp4ConfigData;
> - EFI_TCP4_OPTION ControlOption;
> - EFI_TCP4_ACCESS_POINT *AccessPoint;
> -
> - Tcp4Io->Handle = NULL;
> - Tcp4Io->ConnToken.CompletionToken.Event = NULL;
> - Tcp4Io->TxToken.CompletionToken.Event = NULL;
> - Tcp4Io->RxToken.CompletionToken.Event = NULL;
> - Tcp4Io->CloseToken.CompletionToken.Event = NULL;
> - Tcp4 = NULL;
> -
> - //
> - // Create the TCP4 child instance and get the TCP4 protocol.
> - //
> - Status = NetLibCreateServiceChild (
> - Controller,
> - Image,
> - &gEfiTcp4ServiceBindingProtocolGuid,
> - &Tcp4Io->Handle
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - Status = gBS->OpenProtocol (
> - Tcp4Io->Handle,
> - &gEfiTcp4ProtocolGuid,
> - (VOID **)&Tcp4Io->Tcp4,
> - Image,
> - Controller,
> - EFI_OPEN_PROTOCOL_BY_DRIVER
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Tcp4Io->Image = Image;
> - Tcp4Io->Controller = Controller;
> - Tcp4 = Tcp4Io->Tcp4;
> -
> - //
> - // Set the configuration parameters.
> - //
> - ControlOption.ReceiveBufferSize = 0x200000;
> - ControlOption.SendBufferSize = 0x200000;
> - ControlOption.MaxSynBackLog = 0;
> - ControlOption.ConnectionTimeout = 0;
> - ControlOption.DataRetries = 6;
> - ControlOption.FinTimeout = 0;
> - ControlOption.TimeWaitTimeout = 0;
> - ControlOption.KeepAliveProbes = 4;
> - ControlOption.KeepAliveTime = 0;
> - ControlOption.KeepAliveInterval = 0;
> - ControlOption.EnableNagle = FALSE;
> - ControlOption.EnableTimeStamp = FALSE;
> - ControlOption.EnableWindowScaling = TRUE;
> - ControlOption.EnableSelectiveAck = FALSE;
> - ControlOption.EnablePathMtuDiscovery = FALSE;
> -
> - Tcp4ConfigData.TypeOfService = 8;
> - Tcp4ConfigData.TimeToLive = 255;
> - Tcp4ConfigData.ControlOption = &ControlOption;
> -
> - AccessPoint = &Tcp4ConfigData.AccessPoint;
> -
> - AccessPoint->UseDefaultAddress = FALSE;
> - AccessPoint->StationPort = 0;
> - AccessPoint->RemotePort = ConfigData->RemotePort;
> - AccessPoint->ActiveFlag = TRUE;
> -
> - CopyMem (&AccessPoint->StationAddress, &ConfigData->LocalIp, sizeof
> (EFI_IPv4_ADDRESS));
> - CopyMem (&AccessPoint->SubnetMask, &ConfigData->SubnetMask,
> sizeof (EFI_IPv4_ADDRESS));
> - CopyMem (&AccessPoint->RemoteAddress, &ConfigData->RemoteIp,
> sizeof (EFI_IPv4_ADDRESS));
> -
> - //
> - // Configure the TCP4 protocol.
> - //
> - Status = Tcp4->Configure (Tcp4, &Tcp4ConfigData);
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - if (!EFI_IP4_EQUAL (&ConfigData->Gateway, &mZeroIp4Addr)) {
> - //
> - // the gateway is not zero, add the default route by hand
> - //
> - Status = Tcp4->Routes (Tcp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr,
> &ConfigData->Gateway);
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> - }
> - //
> - // Create events for variuos asynchronous operations.
> - //
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_SIGNAL,
> - TPL_NOTIFY,
> - Tcp4IoCommonNotify,
> - &Tcp4Io->IsConnDone,
> - &Tcp4Io->ConnToken.CompletionToken.Event
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_SIGNAL,
> - TPL_NOTIFY,
> - Tcp4IoCommonNotify,
> - &Tcp4Io->IsTxDone,
> - &Tcp4Io->TxToken.CompletionToken.Event
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_SIGNAL,
> - TPL_NOTIFY,
> - Tcp4IoCommonNotify,
> - &Tcp4Io->IsRxDone,
> - &Tcp4Io->RxToken.CompletionToken.Event
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_SIGNAL,
> - TPL_NOTIFY,
> - Tcp4IoCommonNotify,
> - &Tcp4Io->IsCloseDone,
> - &Tcp4Io->CloseToken.CompletionToken.Event
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Tcp4Io->IsTxDone = FALSE;
> - Tcp4Io->IsRxDone = FALSE;
> -
> - return EFI_SUCCESS;
> -
> -ON_ERROR:
> -
> - if (Tcp4Io->RxToken.CompletionToken.Event != NULL) {
> - gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event);
> - }
> -
> - if (Tcp4Io->TxToken.CompletionToken.Event != NULL) {
> - gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event);
> - }
> -
> - if (Tcp4Io->ConnToken.CompletionToken.Event != NULL) {
> - gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event);
> - }
> -
> - if (Tcp4 != NULL) {
> - Tcp4->Configure (Tcp4, NULL);
> -
> - gBS->CloseProtocol (
> - Tcp4Io->Handle,
> - &gEfiTcp4ProtocolGuid,
> - Image,
> - Controller
> - );
> - }
> -
> - NetLibDestroyServiceChild (
> - Controller,
> - Image,
> - &gEfiTcp4ServiceBindingProtocolGuid,
> - Tcp4Io->Handle
> - );
> -
> - return Status;
> -}
> -
> -/**
> - Destroy the socket.
> -
> - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyeds.
> -**/
> -VOID
> -Tcp4IoDestroySocket (
> - IN TCP4_IO *Tcp4Io
> - )
> -{
> - EFI_TCP4_PROTOCOL *Tcp4;
> -
> - Tcp4 = Tcp4Io->Tcp4;
> -
> - Tcp4->Configure (Tcp4, NULL);
> -
> - gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event);
> - gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event);
> - gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event);
> -
> - gBS->CloseProtocol (
> - Tcp4Io->Handle,
> - &gEfiTcp4ProtocolGuid,
> - Tcp4Io->Image,
> - Tcp4Io->Controller
> - );
> -
> - NetLibDestroyServiceChild (
> - Tcp4Io->Controller,
> - Tcp4Io->Image,
> - &gEfiTcp4ServiceBindingProtocolGuid,
> - Tcp4Io->Handle
> - );
> -}
> -
> -/**
> - Connect to the other endpoint of the TCP socket.
> -
> - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket.
> - @param[in] Timeout The time to wait for connection done.
> -
> - @retval EFI_SUCCESS Connect to the other endpoint of the TCP socket
> successfully.
> - @retval EFI_TIMEOUT Failed to connect to the other endpoint of the
> TCP socket in the specified time period.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoConnect (
> - IN OUT TCP4_IO *Tcp4Io,
> - IN EFI_EVENT Timeout
> - )
> -{
> - EFI_TCP4_PROTOCOL *Tcp4;
> - EFI_STATUS Status;
> -
> - Tcp4Io->IsConnDone = FALSE;
> - Tcp4 = Tcp4Io->Tcp4;
> - Status = Tcp4->Connect (Tcp4, &Tcp4Io->ConnToken);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - while (!Tcp4Io->IsConnDone && EFI_ERROR (gBS->CheckEvent (Timeout)))
> {
> - Tcp4->Poll (Tcp4);
> - }
> -
> - if (!Tcp4Io->IsConnDone) {
> - Status = EFI_TIMEOUT;
> - } else {
> - Status = Tcp4Io->ConnToken.CompletionToken.Status;
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Reset the socket.
> -
> - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket.
> -**/
> -VOID
> -Tcp4IoReset (
> - IN OUT TCP4_IO *Tcp4Io
> - )
> -{
> - EFI_STATUS Status;
> - EFI_TCP4_PROTOCOL *Tcp4;
> -
> - Tcp4Io->CloseToken.AbortOnClose = TRUE;
> - Tcp4Io->IsCloseDone = FALSE;
> -
> - Tcp4 = Tcp4Io->Tcp4;
> - Status = Tcp4->Close (Tcp4, &Tcp4Io->CloseToken);
> - if (EFI_ERROR (Status)) {
> - return ;
> - }
> -
> - while (!Tcp4Io->IsCloseDone) {
> - Tcp4->Poll (Tcp4);
> - }
> -}
> -
> -/**
> - Transmit the Packet to the other endpoint of the socket.
> -
> - @param[in] Tcp4Io The Tcp4Io wrapping the TCP socket.
> - @param[in] Packet The packet to transmit.
> -
> - @retval EFI_SUCCESS The packet is trasmitted.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoTransmit (
> - IN TCP4_IO *Tcp4Io,
> - IN NET_BUF *Packet
> - )
> -{
> - EFI_TCP4_TRANSMIT_DATA *TxData;
> - EFI_TCP4_PROTOCOL *Tcp4;
> - EFI_STATUS Status;
> -
> - TxData = AllocatePool (sizeof (EFI_TCP4_TRANSMIT_DATA) + (Packet-
> >BlockOpNum - 1) * sizeof (EFI_TCP4_FRAGMENT_DATA));
> - if (TxData == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - TxData->Push = TRUE;
> - TxData->Urgent = FALSE;
> - TxData->DataLength = Packet->TotalSize;
> -
> - //
> - // Build the fragment table.
> - //
> - TxData->FragmentCount = Packet->BlockOpNum;
> - NetbufBuildExt (Packet, (NET_FRAGMENT *) &TxData->FragmentTable[0],
> &TxData->FragmentCount);
> -
> - Tcp4Io->TxToken.Packet.TxData = TxData;
> -
> - //
> - // Trasnmit the packet.
> - //
> - Tcp4 = Tcp4Io->Tcp4;
> - Status = Tcp4->Transmit (Tcp4, &Tcp4Io->TxToken);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - while (!Tcp4Io->IsTxDone) {
> - Tcp4->Poll (Tcp4);
> - }
> -
> - Tcp4Io->IsTxDone = FALSE;
> -
> - Status = Tcp4Io->TxToken.CompletionToken.Status;
> -
> -ON_EXIT:
> -
> - FreePool (TxData);
> -
> - return Status;
> -}
> -
> -/**
> - Receive data from the socket.
> -
> - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be
> destroyed.
> - @param[in] Packet The buffer to hold the data copy from the soket rx
> buffer.
> - @param[in] AsyncMode Is this receive asyncronous or not.
> - @param[in] Timeout The time to wait for receiving the amount of data
> the Packet
> - can hold.
> -
> - @retval EFI_SUCCESS The required amount of data is received from
> the socket.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate momery.
> - @retval EFI_TIMEOUT Failed to receive the required amount of data in
> the
> - specified time period.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoReceive (
> - IN TCP4_IO *Tcp4Io,
> - IN NET_BUF *Packet,
> - IN BOOLEAN AsyncMode,
> - IN EFI_EVENT Timeout
> - )
> -{
> - EFI_TCP4_PROTOCOL *Tcp4;
> - EFI_TCP4_RECEIVE_DATA RxData;
> - EFI_STATUS Status;
> - NET_FRAGMENT *Fragment;
> - UINT32 FragmentCount;
> - UINT32 CurrentFragment;
> -
> - FragmentCount = Packet->BlockOpNum;
> - Fragment = AllocatePool (FragmentCount * sizeof (NET_FRAGMENT));
> - if (Fragment == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> - //
> - // Build the fragment table.
> - //
> - NetbufBuildExt (Packet, Fragment, &FragmentCount);
> -
> - RxData.FragmentCount = 1;
> - Tcp4Io->RxToken.Packet.RxData = &RxData;
> - CurrentFragment = 0;
> - Tcp4 = Tcp4Io->Tcp4;
> - Status = EFI_SUCCESS;
> -
> - while (CurrentFragment < FragmentCount) {
> - RxData.DataLength = Fragment[CurrentFragment].Len;
> - RxData.FragmentTable[0].FragmentLength =
> Fragment[CurrentFragment].Len;
> - RxData.FragmentTable[0].FragmentBuffer =
> Fragment[CurrentFragment].Bulk;
> -
> - Status = Tcp4->Receive (Tcp4, &Tcp4Io->RxToken);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - while (!Tcp4Io->IsRxDone && ((Timeout == NULL) || EFI_ERROR (gBS-
> >CheckEvent (Timeout)))) {
> - //
> - // Poll until some data is received or something error happens.
> - //
> - Tcp4->Poll (Tcp4);
> - }
> -
> - if (!Tcp4Io->IsRxDone) {
> - //
> - // Timeout occurs, cancel the receive request.
> - //
> - Tcp4->Cancel (Tcp4, &Tcp4Io->RxToken.CompletionToken);
> -
> - Status = EFI_TIMEOUT;
> - goto ON_EXIT;
> - } else {
> - Tcp4Io->IsRxDone = FALSE;
> - }
> -
> - if (EFI_ERROR (Tcp4Io->RxToken.CompletionToken.Status)) {
> - Status = Tcp4Io->RxToken.CompletionToken.Status;
> - goto ON_EXIT;
> - }
> -
> - Fragment[CurrentFragment].Len -=
> RxData.FragmentTable[0].FragmentLength;
> - if (Fragment[CurrentFragment].Len == 0) {
> - CurrentFragment++;
> - } else {
> - Fragment[CurrentFragment].Bulk +=
> RxData.FragmentTable[0].FragmentLength;
> - }
> - }
> -
> -ON_EXIT:
> - Tcp4Io->RxToken.Packet.RxData = NULL;
> - FreePool (Fragment);
> -
> - return Status;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c
> deleted file mode 100644
> index 3555f1a2ebe3..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c
> +++ /dev/null
> @@ -1,350 +0,0 @@
> -/** @file
> - Implementation of MD5 algorithm.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "Md5.h"
> -
> -CONST UINT32 Md5_Data[][2] = {
> - { 0, 1 },
> - { 1, 5 },
> - { 5, 3 },
> - { 0, 7 }
> -};
> -
> -CONST UINT32 Md5_S[][4] = {
> - { 7, 22, 17, 12 },
> - { 5, 20, 14, 9 },
> - { 4, 23, 16 ,11 },
> - { 6, 21, 15, 10 },
> -};
> -
> -CONST UINT32 Md5_T[] = {
> - 0xD76AA478, 0xE8C7B756, 0x242070DB, 0xC1BDCEEE,
> - 0xF57C0FAF, 0x4787C62A, 0xA8304613, 0xFD469501,
> - 0x698098D8, 0x8B44F7AF, 0xFFFF5BB1, 0x895CD7BE,
> - 0x6B901122, 0xFD987193, 0xA679438E, 0x49B40821,
> - 0xF61E2562, 0xC040B340, 0x265E5A51, 0xE9B6C7AA,
> - 0xD62F105D, 0x02441453, 0xD8A1E681, 0xE7D3FBC8,
> - 0x21E1CDE6, 0xC33707D6, 0xF4D50D87, 0x455A14ED,
> - 0xA9E3E905, 0xFCEFA3F8, 0x676F02D9, 0x8D2A4C8A,
> - 0xFFFA3942, 0x8771F681, 0x6D9D6122, 0xFDE5380C,
> - 0xA4BEEA44, 0x4BDECFA9, 0xF6BB4B60, 0xBEBFBC70,
> - 0x289B7EC6, 0xEAA127FA, 0xD4EF3085, 0x04881D05,
> - 0xD9D4D039, 0xE6DB99E5, 0x1FA27CF8, 0xC4AC5665,
> - 0xF4292244, 0x432AFF97, 0xAB9423A7, 0xFC93A039,
> - 0x655B59C3, 0x8F0CCC92, 0xFFEFF47D, 0x85845DD1,
> - 0x6FA87E4F, 0xFE2CE6E0, 0xA3014314, 0x4E0811A1,
> - 0xF7537E82, 0xBD3AF235, 0x2AD7D2BB, 0xEB86D391
> -};
> -
> -CONST UINT8 Md5HashPadding[] =
> -{
> - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
> -};
> -
> -//
> -// ROTATE_LEFT rotates x left n bits.
> -//
> -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
> -
> -#define SA MedStates[Index2 & 3]
> -#define SB MedStates[(Index2 + 1) & 3]
> -#define SC MedStates[(Index2 + 2) & 3]
> -#define SD MedStates[(Index2 + 3) & 3]
> -
> -/**
> - Tf1 is one basic MD5 transform function.
> -
> - @param[in] A A 32-bit quantity.
> - @param[in] B A 32-bit quantity.
> - @param[in] C A 32-bit quantity.
> -
> - @return Output was produced as a 32-bit quantity based on the
> - three 32-bit input quantity.
> -**/
> -UINT32
> -Tf1 (
> - IN UINT32 A,
> - IN UINT32 B,
> - IN UINT32 C
> - )
> -{
> - return (A & B) | (~A & C);
> -}
> -
> -/**
> - Tf2 is one basic MD5 transform function.
> -
> - @param[in] A A 32-bit quantity.
> - @param[in] B A 32-bit quantity.
> - @param[in] C A 32-bit quantity.
> -
> - @return Output was produced as a 32-bit quantity based on the
> - three 32-bit input quantity.
> -**/
> -UINT32
> -Tf2 (
> - IN UINT32 A,
> - IN UINT32 B,
> - IN UINT32 C
> - )
> -{
> - return (A & C) | (B & ~C);
> -}
> -
> -/**
> - Tf3 is one basic MD5 transform function.
> -
> - @param[in] A A 32-bit quantity.
> - @param[in] B A 32-bit quantity.
> - @param[in] C A 32-bit quantity.
> -
> - @return Output was produced as a 32-bit quantity based on the
> - three 32-bit input quantity.
> -**/
> -UINT32
> -Tf3 (
> - IN UINT32 A,
> - IN UINT32 B,
> - IN UINT32 C
> - )
> -{
> - return A ^ B ^ C;
> -}
> -
> -/**
> - Tf4 is one basic MD5 transform function.
> -
> - @param[in] A A 32-bit quantity.
> - @param[in] B A 32-bit quantity.
> - @param[in] C A 32-bit quantity.
> -
> - @return Output was produced as a 32-bit quantity based on the
> - three 32-bit input quantity.
> -**/
> -UINT32
> -Tf4 (
> - IN UINT32 A,
> - IN UINT32 B,
> - IN UINT32 C
> - )
> -{
> - return B ^ (A | ~C);
> -}
> -
> -typedef
> -UINT32
> -(*MD5_TRANSFORM_FUNC) (
> - IN UINT32 A,
> - IN UINT32 B,
> - IN UINT32 C
> - );
> -
> -CONST MD5_TRANSFORM_FUNC Md5_F[] = {
> - Tf1,
> - Tf2,
> - Tf3,
> - Tf4
> -};
> -
> -/**
> - Perform the MD5 transform on 64 bytes data segment.
> -
> - @param[in, out] Md5Ctx It includes the data segment for Md5 transform.
> -**/
> -VOID
> -MD5Transform (
> - IN OUT MD5_CTX *Md5Ctx
> - )
> -{
> - UINT32 Index1;
> - UINT32 Index2;
> - UINT32 MedStates[MD5_HASHSIZE >> 2];
> - UINT32 *Data;
> - UINT32 IndexD;
> - UINT32 IndexT;
> -
> - Data = (UINT32 *) Md5Ctx->M;
> -
> - //
> - // Copy MD5 states to MedStates
> - //
> - CopyMem (MedStates, Md5Ctx->States, MD5_HASHSIZE);
> -
> - IndexT = 0;
> - for (Index1 = 0; Index1 < 4; Index1++) {
> - IndexD = Md5_Data[Index1][0];
> - for (Index2 = 16; Index2 > 0; Index2--) {
> - SA += (*Md5_F[Index1]) (SB, SC, SD) + Data[IndexD] + Md5_T[IndexT];
> - SA = ROTATE_LEFT (SA, Md5_S[Index1][Index2 & 3]);
> - SA += SB;
> -
> - IndexD += Md5_Data[Index1][1];
> - IndexD &= 15;
> -
> - IndexT++;
> - }
> - }
> -
> - for (Index1 = 0; Index1 < 4; Index1++) {
> - Md5Ctx->States[Index1] += MedStates[Index1];
> - }
> -}
> -
> -/**
> - Copy data segment into the M field of MD5_CTX structure for later
> transform.
> - If the length of data segment is larger than 64 bytes, then does the
> transform
> - immediately and the generated Md5 code is stored in the States field of
> MD5_CTX
> - data struct for later accumulation.
> - All of Md5 code generated for the sequential 64-bytes data segaments are
> be
> - accumulated in MD5Final() function.
> -
> - @param[in, out] Md5Ctx The data structure of storing the original data
> - segment and the final result.
> - @param[in] Data The data wanted to be transformed.
> - @param[in] DataLen The length of data.
> -**/
> -VOID
> -MD5UpdateBlock (
> - IN OUT MD5_CTX *Md5Ctx,
> - IN CONST UINT8 *Data,
> - IN UINTN DataLen
> - )
> -{
> - UINTN Limit;
> -
> - for (Limit = 64 - Md5Ctx->Count; DataLen >= 64 - Md5Ctx->Count; Limit = 64)
> {
> - CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, Limit);
> - MD5Transform (Md5Ctx);
> -
> - Md5Ctx->Count = 0;
> - Data += Limit;
> - DataLen -= Limit;
> - }
> -
> - CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, DataLen);
> - Md5Ctx->Count += DataLen;
> -}
> -
> -/**
> - Initialize four 32-bits chaining variables and use them to do the Md5
> transform.
> -
> - @param[out] Md5Ctx The data structure of Md5.
> -
> - @retval EFI_SUCCESS Initialization is ok.
> -**/
> -EFI_STATUS
> -MD5Init (
> - OUT MD5_CTX *Md5Ctx
> - )
> -{
> - ZeroMem (Md5Ctx, sizeof (*Md5Ctx));
> -
> - //
> - // Set magic initialization constants.
> - //
> - Md5Ctx->States[0] = 0x67452301;
> - Md5Ctx->States[1] = 0xefcdab89;
> - Md5Ctx->States[2] = 0x98badcfe;
> - Md5Ctx->States[3] = 0x10325476;
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - the external interface of Md5 algorithm
> -
> - @param[in, out] Md5Ctx The data structure of storing the original data
> - segment and the final result.
> - @param[in] Data The data wanted to be transformed.
> - @param[in] DataLen The length of data.
> -
> - @retval EFI_SUCCESS The transform is ok.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -MD5Update (
> - IN OUT MD5_CTX *Md5Ctx,
> - IN VOID *Data,
> - IN UINTN DataLen
> - )
> -{
> - if (EFI_ERROR (Md5Ctx->Status)) {
> - return Md5Ctx->Status;
> - }
> -
> - MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) Data, DataLen);
> - Md5Ctx->Length += DataLen;
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Accumulate the MD5 value of every data segment and generate the finial
> - result according to MD5 algorithm.
> -
> - @param[in, out] Md5Ctx The data structure of storing the original data
> - segment and the final result.
> - @param[out] HashVal The final 128-bits output.
> -
> - @retval EFI_SUCCESS The transform is ok.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -MD5Final (
> - IN OUT MD5_CTX *Md5Ctx,
> - OUT UINT8 *HashVal
> - )
> -{
> - UINTN PadLength;
> -
> - if (Md5Ctx->Status == EFI_ALREADY_STARTED) {
> - //
> - // Store Hashed value & Zeroize sensitive context information.
> - //
> - CopyMem (HashVal, (UINT8 *) Md5Ctx->States, MD5_HASHSIZE);
> - ZeroMem ((UINT8 *)Md5Ctx, sizeof (*Md5Ctx));
> -
> - return EFI_SUCCESS;
> - }
> -
> - if (EFI_ERROR (Md5Ctx->Status)) {
> - return Md5Ctx->Status;
> - }
> -
> - PadLength = Md5Ctx->Count >= 56 ? 120 : 56;
> - PadLength -= Md5Ctx->Count;
> - MD5UpdateBlock (Md5Ctx, Md5HashPadding, PadLength);
> - Md5Ctx->Length = LShiftU64 (Md5Ctx->Length, 3);
> - MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) &Md5Ctx->Length, 8);
> -
> - ZeroMem (Md5Ctx->M, sizeof (Md5Ctx->M));
> - Md5Ctx->Length = 0;
> - Md5Ctx->Status = EFI_ALREADY_STARTED;
> - return MD5Final (Md5Ctx, HashVal);
> -}
> -
> diff --git a/MdeModulePkg/MdeModulePkg.dsc
> b/MdeModulePkg/MdeModulePkg.dsc
> index 3529c8d30365..b787fb5692d3 100644
> --- a/MdeModulePkg/MdeModulePkg.dsc
> +++ b/MdeModulePkg/MdeModulePkg.dsc
> @@ -354,7 +354,6 @@ [Components]
> MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf
> MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf
> MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf
> - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
> MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf
> MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf
> MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf
> diff --git
> a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h
> deleted file mode 100644
> index ee371d26744c..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h
> +++ /dev/null
> @@ -1,165 +0,0 @@
> -/** @file
> - The header file of UEFI Component Name(2) protocol.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _COMPONENT_NAME_H_
> -#define _COMPONENT_NAME_H_
> -
> -#include <Protocol/ComponentName.h>
> -#include <Protocol/ComponentName2.h>
> -
> -extern EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2;
> -extern EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName;
> -
> -//
> -// EFI Component Name Protocol for iSCSI driver.
> -//
> -
> -/**
> - Retrieves a Unicode string that is the user readable name of the EFI 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_NAME_PROTOCOL
> instance.
> - @param[in] Language A pointer to a three characters ISO 639-2 language
> identifier.
> - This is the language of the driver name that 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.
> - @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
> -IScsiComponentNameGetDriverName (
> - 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 an EFI Driver. Currently not implemented.
> -
> - @param[in] This A pointer to the
> 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 three characters ISO 639-2
> language
> - identifier. This is the language of the controller name
> - that 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.
> - @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
> -IScsiComponentNameGetControllerName (
> - IN EFI_COMPONENT_NAME_PROTOCOL *This,
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_HANDLE ChildHandle OPTIONAL,
> - IN CHAR8 *Language,
> - OUT CHAR16 **ControllerName
> - );
> -
> -//
> -// EFI iSCSI Initiator Name Protocol for IScsi driver.
> -//
> -
> -/**
> - Retrieves the current set value of iSCSI Initiator Name.
> -
> - @param[in] This Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer
> / Actual size of the
> - variable data buffer.
> - @param[out] Buffer Pointer to the buffer for data to be read.
> -
> - @retval EFI_SUCCESS Data was successfully retrieved into the
> provided buffer and the
> - BufferSize was sufficient to handle the iSCSI initiator name
> - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result.
> - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
> - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be
> retrieved due to a hardware error.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiGetInitiatorName (
> - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
> - IN OUT UINTN *BufferSize,
> - OUT VOID *Buffer
> - );
> -
> -/**
> - Sets the iSCSI Initiator Name.
> -
> - @param[in] This Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer.
> - @param[in] Buffer Pointer to the buffer for data to be written.
> -
> - @retval EFI_SUCCESS Data was successfully stored by the protocol.
> - @retval EFI_UNSUPPORTED Platform policies do not allow for data to be
> written.
> - Currently not implemented.
> - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or
> BufferSize exceeds the maximum allowed limit.
> - @retval EFI_DEVICE_ERROR The data could not be stored due to a
> hardware error.
> - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold
> the data.
> - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not
> adhere to RFC 3720
> - (and other related protocols)
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiSetInitiatorName (
> - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
> - IN OUT UINTN *BufferSize,
> - IN VOID *Buffer
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni
> deleted file mode 100644
> index d3c020e45d3b..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni
> +++ /dev/null
> @@ -1,25 +0,0 @@
> -// /** @file
> -// This module produces EFI iSCSI Initiator Name Protocol.
> -//
> -// This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4
> Protocol
> -// and EFI DHCPv4 Protocol, to provide the capability to do the transport for
> SCSI
> -// data over TCP/IP. It installs EFI HII Configuration Access Protocol to
> provide
> -// one way to configurate the iSCSI setting.
> -//
> -// Copyright (c) 2004 - 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 iSCSI
> Initiator Name Protocol"
> -
> -#string STR_MODULE_DESCRIPTION #language en-US "This module
> produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol and EFI
> DHCPv4 Protocol, to provide the capability to do the transport for SCSI data
> over TCP/IP. It installs EFI HII Configuration Access Protocol to provide a way
> to configure the iSCSI setting."
> -
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni
> deleted file mode 100644
> index 5ec75820a605..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni
> +++ /dev/null
> @@ -1,20 +0,0 @@
> -// /** @file
> -// IScsi4Dxe 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
> -"iSCSI DXE Driver"
> -
> -
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h
> deleted file mode 100644
> index 14a5658f754b..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h
> +++ /dev/null
> @@ -1,106 +0,0 @@
> -/** @file
> - The header file of CHAP configuration.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _ISCSI_CHAP_H_
> -#define _ISCSI_CHAP_H_
> -
> -#define ISCSI_AUTH_METHOD_CHAP "CHAP"
> -
> -#define ISCSI_KEY_CHAP_ALGORITHM "CHAP_A"
> -#define ISCSI_KEY_CHAP_IDENTIFIER "CHAP_I"
> -#define ISCSI_KEY_CHAP_CHALLENGE "CHAP_C"
> -#define ISCSI_KEY_CHAP_NAME "CHAP_N"
> -#define ISCSI_KEY_CHAP_RESPONSE "CHAP_R"
> -
> -#define ISCSI_CHAP_ALGORITHM_MD5 5
> -
> -#define ISCSI_CHAP_AUTH_MAX_LEN 1024
> -///
> -/// MD5_HASHSIZE
> -///
> -#define ISCSI_CHAP_RSP_LEN 16
> -
> -#define ISCSI_CHAP_INITIAL 0
> -#define ISCSI_CHAP_STEP_ONE 1
> -#define ISCSI_CHAP_STEP_TWO 2
> -#define ISCSI_CHAP_STEP_THREE 3
> -#define ISCSI_CHAP_STEP_FOUR 4
> -
> -#pragma pack(1)
> -
> -typedef struct _ISCSI_CHAP_AUTH_CONFIG_NVDATA {
> - UINT8 CHAPType;
> - CHAR8 CHAPName[ISCSI_CHAP_NAME_STORAGE];
> - CHAR8 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
> - CHAR8 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
> - CHAR8 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
> -} ISCSI_CHAP_AUTH_CONFIG_NVDATA;
> -
> -#pragma pack()
> -
> -///
> -/// ISCSI CHAP Authentication Data
> -///
> -typedef struct _ISCSI_CHAP_AUTH_DATA {
> - ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfig;
> - UINT32 InIdentifier;
> - UINT8 InChallenge[ISCSI_CHAP_AUTH_MAX_LEN];
> - UINT32 InChallengeLength;
> - //
> - // Calculated CHAP Response (CHAP_R) value
> - //
> - UINT8 CHAPResponse[ISCSI_CHAP_RSP_LEN];
> -
> - //
> - // Auth-data to be sent out for mutual authentication
> - //
> - UINT32 OutIdentifier;
> - UINT8 OutChallenge[ISCSI_CHAP_AUTH_MAX_LEN];
> - UINT32 OutChallengeLength;
> -} ISCSI_CHAP_AUTH_DATA;
> -
> -/**
> - This function checks the received iSCSI Login Response during the security
> - negotiation stage.
> -
> - @param[in] Conn The iSCSI connection.
> -
> - @retval EFI_SUCCESS The Login Response passed the CHAP validation.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiCHAPOnRspReceived (
> - IN ISCSI_CONNECTION *Conn
> - );
> -/**
> - This function fills the CHAP authentication information into the login PDU
> - during the security negotiation stage in the iSCSI connection login.
> -
> - @param[in] Conn The iSCSI connection.
> - @param[in, out] Pdu The PDU to send out.
> -
> - @retval EFI_SUCCESS All check passed and the phase-related CHAP
> - authentication info is filled into the iSCSI PDU.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend.
> -**/
> -EFI_STATUS
> -IScsiCHAPToSendReq (
> - IN ISCSI_CONNECTION *Conn,
> - IN OUT NET_BUF *Pdu
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h
> deleted file mode 100644
> index 650c68d53bab..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -/** @file
> - The common header file of Iscsi.
> -
> -Copyright (c) 2004 - 2008, 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.
> -
> -**/
> -
> -#ifndef _ISCSI_COMMON_H_
> -#define _ISCSI_COMMON_H_
> -
> -typedef struct _ISCSI_SESSION ISCSI_SESSION;
> -typedef struct _ISCSI_CONNECTION ISCSI_CONNECTION;
> -typedef struct _ISCSI_DRIVER_DATA ISCSI_DRIVER_DATA;
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h
> deleted file mode 100644
> index c3d07f6f4859..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h
> +++ /dev/null
> @@ -1,166 +0,0 @@
> -/** @file
> - The header file of IScsiConfig.c.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _ISCSI_CONFIG_H_
> -#define _ISCSI_CONFIG_H_
> -
> -#include <Guid/MdeModuleHii.h>
> -#include <Protocol/HiiConfigRouting.h>
> -#include <Library/HiiLib.h>
> -#include <Library/DevicePathLib.h>
> -#include <Library/DebugLib.h>
> -#include <Library/BaseLib.h>
> -#include <Library/NetLib.h>
> -
> -extern UINT8 IScsiConfigDxeBin[];
> -extern UINT8 IScsi4DxeStrings[];
> -
> -#define ISCSI_INITATOR_NAME_VAR_NAME L"I_NAME"
> -
> -#define ISCSI_CONFIG_VAR_ATTR
> (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE)
> -
> -#define ISCSI_FORM_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('I', 'f',
> 'c', 'i')
> -
> -
> -
> -/**
> - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of
> PcdDebugProperyMask is clear,
> - then this macro return a pointer to a data structure
> ISCSI_FORM_CALLBACK_INFO.
> -
> - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of
> PcdDebugProperyMask is set,
> - The Signature field of the data structure ISCSI_FORM_CALLBACK_INFO
> - is compared to TestSignature. If the signatures match, then a pointer
> - to the pointer to a data structure ISCSI_FORM_CALLBACK_INFO is returned.
> - If the signatures do not match, then DebugAssert() is called with a
> description
> - of "CR has a bad signature" and Callback is returned.
> -
> - If the data type ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not
> contain the field
> - specified by Callback, then the module will not compile.
> -
> - If ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not contain a field
> called Signature,
> - then the module will not compile.
> -
> - @param Callback Pointer to the specified field within the data
> - structure ISCSI_FORM_CALLBACK_INFO.
> - @return A pointer to the pointer to a data structure
> ISCSI_FORM_CALLBACK_INFO.
> - @retval Others Some unexpected error happened.
> -**/
> -
> -#define ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK(Callback)
> \
> - CR ( \
> - Callback, \
> - ISCSI_FORM_CALLBACK_INFO, \
> - ConfigAccess, \
> - ISCSI_FORM_CALLBACK_INFO_SIGNATURE \
> - )
> -
> -#pragma pack(1)
> -
> -typedef struct _ISCSI_MAC_INFO {
> - EFI_MAC_ADDRESS Mac;
> - UINT8 Len;
> - UINT16 VlanId;
> -} ISCSI_MAC_INFO;
> -
> -typedef struct _ISCSI_DEVICE_LIST {
> - UINT8 NumDevice;
> - ISCSI_MAC_INFO MacInfo[1];
> -} ISCSI_DEVICE_LIST;
> -
> -#pragma pack()
> -
> -typedef struct _ISCSI_CONFIG_FORM_ENTRY {
> - LIST_ENTRY Link;
> - EFI_HANDLE Controller;
> - CHAR16 MacString[95];
> - EFI_STRING_ID PortTitleToken;
> - EFI_STRING_ID PortTitleHelpToken;
> -
> - ISCSI_SESSION_CONFIG_NVDATA SessionConfigData;
> - ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfigData;
> -} ISCSI_CONFIG_FORM_ENTRY;
> -
> -typedef struct _ISCSI_FORM_CALLBACK_INFO {
> - UINTN Signature;
> - EFI_HANDLE DriverHandle;
> - EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
> - EFI_HII_DATABASE_PROTOCOL *HiiDatabase;
> - EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting;
> - UINT16 *KeyList;
> - VOID *FormBuffer;
> - EFI_HII_HANDLE RegisteredHandle;
> - ISCSI_CONFIG_FORM_ENTRY *Current;
> -} ISCSI_FORM_CALLBACK_INFO;
> -
> -#pragma pack(1)
> -
> -///
> -/// HII specific Vendor Device Path definition.
> -///
> -typedef struct {
> - VENDOR_DEVICE_PATH VendorDevicePath;
> - EFI_DEVICE_PATH_PROTOCOL End;
> -} HII_VENDOR_DEVICE_PATH;
> -
> -#pragma pack()
> -
> -/**
> - Updates the iSCSI configuration form to add/delete an entry for the iSCSI
> - device specified by the Controller.
> -
> - @param[in] DriverBindingHandle The driverbinding handle.
> - @param[in] Controller The controller handle of the iSCSI device.
> - @param[in] AddForm Whether to add or delete a form entry.
> -
> - @retval EFI_SUCCESS The iSCSI configuration form is updated.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConfigUpdateForm (
> - IN EFI_HANDLE DriverBindingHandle,
> - IN EFI_HANDLE Controller,
> - IN BOOLEAN AddForm
> - );
> -
> -/**
> - Initialize the iSCSI configuration form.
> -
> - @param[in] DriverBindingHandle The iSCSI driverbinding handle.
> -
> - @retval EFI_SUCCESS The iSCSI configuration form is initialized.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConfigFormInit (
> - VOID
> - );
> -
> -/**
> - Unload the iSCSI configuration form, this includes: delete all the iSCSI
> - device configuration entries, uninstall the form callback protocol and
> - free the resources used.
> -
> - @param[in] DriverBindingHandle The iSCSI driverbinding handle.
> -
> - @retval EFI_SUCCESS The iSCSI configuration form is unloaded.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -**/
> -EFI_STATUS
> -IScsiConfigFormUnload (
> - IN EFI_HANDLE DriverBindingHandle
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr
> deleted file mode 100644
> index 9e28d81fb40d..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr
> +++ /dev/null
> @@ -1,219 +0,0 @@
> -/** @file
> - Vfr file for iSCSI config.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -
> -#include "IScsiConfigNVDataStruc.h"
> -#define EFI_NETWORK_DEVICE_CLASS 0x04
> -
> -formset
> - guid = IP4_ISCSI_CONFIG_GUID,
> - title = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_TITLE),
> - help = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_HELP),
> -
> - varstore ISCSI_CONFIG_IFR_NVDATA,
> - name = ISCSI_CONFIG_IFR_NVDATA,
> - guid = IP4_ISCSI_CONFIG_GUID;
> - form formid = FORMID_MAIN_FORM,
> - title = STRING_TOKEN(STR_ISCSI_MAIN_FORM_TITLE);
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorName,
> - prompt = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME),
> - help = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME_HELP),
> - flags = INTERACTIVE,
> - key = KEY_INITIATOR_NAME,
> - minsize = ISCSI_NAME_IFR_MIN_SIZE,
> - maxsize = ISCSI_NAME_IFR_MAX_SIZE,
> - endstring;
> -
> - label DEVICE_ENTRY_LABEL;
> - label LABEL_END;
> -
> - endform;
> -
> - form formid = FORMID_DEVICE_FORM,
> - title = STRING_TOKEN(STR_ISCSI_DEVICE_FORM_TITLE);
> -
> - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.Enabled,
> - prompt = STRING_TOKEN(STR_ISCSI_DEVICE_ENABLE),
> - help = STRING_TOKEN(STR_NULL),
> - flags = 0,
> - endcheckbox;
> -
> - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp,
> - prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP),
> - help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP),
> - flags = INTERACTIVE,
> - key = KEY_DHCP_ENABLE,
> - endcheckbox;
> -
> - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp ==
> 0x01;
> - string varid = ISCSI_CONFIG_IFR_NVDATA.LocalIp,
> - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_IP_ADDRESS),
> - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
> - flags = INTERACTIVE,
> - key = KEY_LOCAL_IP,
> - minsize = IP_MIN_SIZE,
> - maxsize = IP_MAX_SIZE,
> - endstring;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.SubnetMask,
> - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_MASK),
> - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
> - flags = INTERACTIVE,
> - key = KEY_SUBNET_MASK,
> - minsize = IP_MIN_SIZE,
> - maxsize = IP_MAX_SIZE,
> - endstring;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.Gateway,
> - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_GATEWAY),
> - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
> - flags = INTERACTIVE,
> - key = KEY_GATE_WAY,
> - minsize = IP_MIN_SIZE,
> - maxsize = IP_MAX_SIZE,
> - endstring;
> - endif;
> -
> - subtitle text = STRING_TOKEN(STR_NULL);
> -
> - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp ==
> 0x00;
> - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp,
> - prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET),
> - help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET),
> - flags = 0,
> - endcheckbox;
> - endif;
> -
> - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp ==
> 0x01;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.TargetName,
> - prompt = STRING_TOKEN(STR_ISCSI_TARGET_NAME),
> - help = STRING_TOKEN(STR_ISCSI_TARGET_NAME),
> - flags = INTERACTIVE,
> - key = KEY_TARGET_NAME,
> - minsize = ISCSI_NAME_IFR_MIN_SIZE,
> - maxsize = ISCSI_NAME_IFR_MAX_SIZE,
> - endstring;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.TargetIp,
> - prompt = STRING_TOKEN(STR_ISCSI_TARGET_IP_ADDRESS),
> - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
> - flags = INTERACTIVE,
> - key = KEY_TARGET_IP,
> - minsize = IP_MIN_SIZE,
> - maxsize = IP_MAX_SIZE,
> - endstring;
> -
> - numeric varid = ISCSI_CONFIG_IFR_NVDATA.TargetPort,
> - prompt = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
> - help = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
> - flags = 0,
> - minimum = TARGET_PORT_MIN_NUM,
> - maximum = TARGET_PORT_MAX_NUM,
> - step = 0,
> - endnumeric;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.BootLun,
> - prompt = STRING_TOKEN(STR_ISCSI_BOOT_LUN),
> - help = STRING_TOKEN(STR_ISCSI_BOOT_LUN_HELP),
> - flags = INTERACTIVE,
> - key = KEY_BOOT_LUN,
> - minsize = LUN_MIN_SIZE,
> - maxsize = LUN_MAX_SIZE,
> - endstring;
> - endif;
> -
> - subtitle text = STRING_TOKEN(STR_NULL);
> -
> - oneof varid = ISCSI_CONFIG_IFR_NVDATA.CHAPType,
> - prompt = STRING_TOKEN(STR_CHAP_TYPE_PROMPT),
> - help = STRING_TOKEN(STR_CHAP_TYPE_HELP),
> - option text = STRING_TOKEN(STR_CHAP_TYPE_NONE), value =
> ISCSI_CHAP_NONE, flags = DEFAULT;
> - option text = STRING_TOKEN(STR_CHAP_TYPE_UNI), value =
> ISCSI_CHAP_UNI, flags = 0;
> - option text = STRING_TOKEN(STR_CHAP_TYPE_MUTUAL), value =
> ISCSI_CHAP_MUTUAL, flags = 0;
> - endoneof;
> -
> - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType ==
> ISCSI_CHAP_NONE;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPName,
> - prompt = STRING_TOKEN(STR_ISCSI_CHAP_NAME),
> - help = STRING_TOKEN(STR_ISCSI_CHAP_NAME),
> - flags = INTERACTIVE,
> - key = KEY_CHAP_NAME,
> - minsize = 0,
> - maxsize = ISCSI_CHAP_NAME_MAX_LEN,
> - endstring;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPSecret,
> - prompt = STRING_TOKEN(STR_ISCSI_CHAP_SECRET),
> - help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP),
> - flags = INTERACTIVE,
> - key = KEY_CHAP_SECRET,
> - minsize = ISCSI_CHAP_SECRET_MIN_LEN,
> - maxsize = ISCSI_CHAP_SECRET_MAX_LEN,
> - endstring;
> -
> - endif;
> -
> - suppressif NOT ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType ==
> ISCSI_CHAP_MUTUAL;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPName,
> - prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME),
> - help = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME),
> - flags = INTERACTIVE,
> - key = KEY_REVERSE_CHAP_NAME,
> - minsize = 0,
> - maxsize = ISCSI_CHAP_NAME_MAX_LEN,
> - endstring;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPSecret,
> - prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_SECRET),
> - help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP),
> - flags = INTERACTIVE,
> - key = KEY_REVERSE_CHAP_SECRET,
> - minsize = ISCSI_CHAP_SECRET_MIN_LEN,
> - maxsize = ISCSI_CHAP_SECRET_MAX_LEN,
> - endstring;
> -
> - endif;
> -
> - subtitle text = STRING_TOKEN(STR_NULL);
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.IsId,
> - prompt = STRING_TOKEN(STR_ISCSI_CONFIG_ISID),
> - help = STRING_TOKEN(STR_ISCSI_CONFIG_ISID_HELP),
> - flags = INTERACTIVE,
> - key = KEY_CONFIG_ISID,
> - minsize = ISID_CONFIGURABLE_MIN_LEN,
> - maxsize = ISID_CONFIGURABLE_MAX_LEN,
> - endstring;
> -
> - subtitle text = STRING_TOKEN(STR_NULL);
> -
> - text
> - help = STRING_TOKEN (STR_SAVE_CHANGES),
> - text = STRING_TOKEN (STR_SAVE_CHANGES),
> - flags = INTERACTIVE,
> - key = KEY_SAVE_CHANGES;
> -
> - goto FORMID_MAIN_FORM,
> - prompt = STRING_TOKEN (STR_RETURN_MAIN_FORM),
> - help = STRING_TOKEN (STR_RETURN_MAIN_FORM),
> - flags = 0;
> -
> - endform;
> -
> -endformset;
> -
> diff --git
> a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni
> deleted file mode 100644
> index 729c74ebfc1b..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni
> +++ /dev/null
> @@ -1,62 +0,0 @@
> -// *++
> -//
> -// Copyright (c) 2004 - 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.
> -//
> -// Module Name:
> -//
> -// IScsiConfigStrings.uni
> -//
> -// Abstract:
> -//
> -// String definitions for iSCSI configuration.
> -//
> -// Revision History:
> -//
> -// --*/
> -
> -
> -/=#
> -
> -#langdef en-US "English"
> -
> -#string STR_ISCSI_CONFIG_FORM_TITLE #language en-US "iSCSI
> Configuration"
> -#string STR_ISCSI_CONFIG_FORM_HELP #language en-US "Configure the
> iSCSI parameters."
> -#string STR_ISCSI_MAIN_FORM_TITLE #language en-US "iSCSI
> Configuration"
> -#string STR_ISCSI_CONFIG_INIT_NAME #language en-US "iSCSI Initiator
> Name"
> -#string STR_ISCSI_CONFIG_INIT_NAME_HELP #language en-US "The
> worldwide unique name of the initiator. Only iqn. format is accepted."
> -#string STR_ISCSI_DEVICE_FORM_TITLE #language en-US ""
> -#string STR_ISCSI_DEVICE_ENABLE #language en-US "Enable iSCSI"
> -#string STR_ISCSI_LOCAL_IP_ADDRESS #language en-US " Initiator IP
> Address"
> -#string STR_ISCSI_LOCAL_MASK #language en-US " Initiator Subnet
> Mask"
> -#string STR_ISCSI_LOCAL_GATEWAY #language en-US " Gateway"
> -#string STR_ISCSI_IP_ADDRESS_HELP #language en-US "Enter IP address
> in dotted-decimal notation."
> -#string STR_ISCSI_TARGET_NAME #language en-US " Target Name"
> -#string STR_ISCSI_TARGET_IP_ADDRESS #language en-US " Target IP
> Address"
> -#string STR_ISCSI_TARGET_PORT #language en-US " Target Port"
> -#string STR_ISCSI_BOOT_LUN #language en-US " Boot LUN"
> -#string STR_ISCSI_BOOT_LUN_HELP #language en-US "Hexadecimal
> representation of the LU number. Examples are: 4752-3A4F-6b7e-2F99, 6734-
> 9-156f-127, 4186-9"
> -#string STR_ISCSI_ENABLE_DHCP #language en-US "Enable DHCP"
> -#string STR_ISCSI_ENABLE_DHCP_ON_TARGET #language en-US "Get target
> info via DHCP"
> -#string STR_CHAP_TYPE_PROMPT #language en-US "CHAP Type"
> -#string STR_CHAP_TYPE_HELP #language en-US "None, One way
> CHAP or mutual CHAP"
> -#string STR_CHAP_TYPE_NONE #language en-US "None"
> -#string STR_CHAP_TYPE_UNI #language en-US "One way"
> -#string STR_CHAP_TYPE_MUTUAL #language en-US "Mutual"
> -#string STR_ISCSI_CHAP_NAME #language en-US " CHAP Name"
> -#string STR_ISCSI_CHAP_SECRET #language en-US " CHAP Secret"
> -#string STR_ISCSI_CHAP_SECRET_HELP #language en-US "The minimum
> length is 12 bytes and the maximum length is 16 bytes."
> -#string STR_ISCSI_REVERSE_CHAP_NAME #language en-US " Reverse
> CHAP Name"
> -#string STR_ISCSI_REVERSE_CHAP_SECRET #language en-US " Reverse
> CHAP Secret"
> -#string STR_ISCSI_CONFIG_ISID #language en-US "ISID"
> -#string STR_ISCSI_CONFIG_ISID_HELP #language en-US "OUI-format ISID
> in 6 bytes, default value are derived from MAC address. Only last 3 bytes are
> configurable. Example: update 0ABBCCDDEEFF to 0ABBCCF07901 by input
> F07901."
> -#string STR_RETURN_MAIN_FORM #language en-US "Back to Previous
> Page"
> -#string STR_SAVE_CHANGES #language en-US "Save Changes"
> -#string STR_NULL #language en-US ""
> -
> diff --git
> a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h
> deleted file mode 100644
> index 7c2e4e65fa8e..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h
> +++ /dev/null
> @@ -1,109 +0,0 @@
> -/** @file
> - Define NVData structures used by the iSCSI configuration component
> -
> -Copyright (c) 2004 - 2011, 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.
> -
> -**/
> -
> -#ifndef _ISCSI_NVDATASTRUC_H_
> -#define _ISCSI_NVDATASTRUC_H_
> -
> -#include <Guid/Ip4IScsiConfigHii.h>
> -
> -#define VAR_EQ_TEST_NAME 0x100
> -
> -#define FORMID_MAIN_FORM 1
> -#define FORMID_DEVICE_FORM 2
> -
> -#define ISCSI_NAME_MAX_SIZE 224
> -
> -//
> -// Vfr has a limit on the size, it's 255 bytes.
> -//
> -#define ISCSI_NAME_IFR_MIN_SIZE 4
> -#define ISCSI_NAME_IFR_MAX_SIZE 223
> -
> -#define IP_MIN_SIZE 7
> -#define IP_MAX_SIZE 15
> -#define IP4_STR_MAX_SIZE 16
> -
> -#define LUN_MIN_SIZE 1
> -#define LUN_MAX_SIZE 20
> -
> -#define ISCSI_CHAP_NONE 0
> -#define ISCSI_CHAP_UNI 1
> -#define ISCSI_CHAP_MUTUAL 2
> -
> -#define TARGET_PORT_MIN_NUM 0
> -#define TARGET_PORT_MAX_NUM 65535
> -
> -#define DEVICE_ENTRY_LABEL 0x1234
> -#define LABEL_END 0xffff
> -
> -#define KEY_INITIATOR_NAME 0x101
> -#define KEY_DHCP_ENABLE 0x102
> -#define KEY_LOCAL_IP 0x103
> -#define KEY_SUBNET_MASK 0x104
> -#define KEY_GATE_WAY 0x105
> -#define KEY_TARGET_IP 0x106
> -#define KEY_CHAP_NAME 0x107
> -#define KEY_CHAP_SECRET 0x108
> -#define KEY_REVERSE_CHAP_NAME 0x109
> -#define KEY_REVERSE_CHAP_SECRET 0x10a
> -#define KEY_SAVE_CHANGES 0x10b
> -#define KEY_TARGET_NAME 0x10c
> -#define KEY_BOOT_LUN 0x10d
> -#define KEY_CONFIG_ISID 0x10e
> -
> -#define KEY_DEVICE_ENTRY_BASE 0x1000
> -
> -#define ISCSI_LUN_STR_MAX_LEN 21
> -#define ISCSI_CHAP_SECRET_MIN_LEN 12
> -#define ISCSI_CHAP_SECRET_MAX_LEN 16
> -//
> -// ISCSI_CHAP_SECRET_STORAGE = ISCSI_CHAP_SECRET_MAX_LEN + sizeof
> (NULL-Terminator)
> -//
> -#define ISCSI_CHAP_SECRET_STORAGE 17
> -
> -#define ISCSI_CHAP_NAME_MAX_LEN 126
> -#define ISCSI_CHAP_NAME_STORAGE 127
> -
> -#define ISID_CONFIGURABLE_MIN_LEN 6
> -#define ISID_CONFIGURABLE_MAX_LEN 12
> -#define ISID_CONFIGURABLE_STORAGE 13
> -
> -#pragma pack(1)
> -typedef struct {
> - CHAR16 InitiatorName[ISCSI_NAME_MAX_SIZE];
> -
> - UINT8 Enabled;
> -
> - UINT8 InitiatorInfoFromDhcp;
> - CHAR16 LocalIp[IP4_STR_MAX_SIZE];
> - CHAR16 SubnetMask[IP4_STR_MAX_SIZE];
> - CHAR16 Gateway[IP4_STR_MAX_SIZE];
> -
> - CHAR16 TargetName[ISCSI_NAME_MAX_SIZE];
> - CHAR16 TargetIp[IP4_STR_MAX_SIZE];
> - UINT16 TargetPort;
> - CHAR16 BootLun[ISCSI_LUN_STR_MAX_LEN];
> - UINT8 TargetInfoFromDhcp;
> -
> - UINT8 CHAPType;
> - CHAR16 CHAPName[ISCSI_CHAP_NAME_STORAGE];
> - CHAR16 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
> - CHAR16 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
> - CHAR16 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
> -
> - CHAR16 IsId[ISID_CONFIGURABLE_STORAGE];
> -} ISCSI_CONFIG_IFR_NVDATA;
> -#pragma pack()
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h
> deleted file mode 100644
> index 4c4dcaa8f68d..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h
> +++ /dev/null
> @@ -1,55 +0,0 @@
> -/** @file
> - The header file of IScsiDhcp.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _ISCSI_DHCP_H_
> -#define _ISCSI_DHCP_H_
> -
> -#include <Protocol/Dhcp4.h>
> -
> -#define ISCSI_ROOT_PATH_ID "iscsi:"
> -#define ISCSI_ROOT_PATH_FIELD_DELIMITER ':'
> -
> -#define RP_FIELD_IDX_SERVERNAME 0
> -#define RP_FIELD_IDX_PROTOCOL 1
> -#define RP_FIELD_IDX_PORT 2
> -#define RP_FIELD_IDX_LUN 3
> -#define RP_FIELD_IDX_TARGETNAME 4
> -#define RP_FIELD_IDX_MAX 5
> -
> -typedef struct _ISCSI_ROOT_PATH_FIELD {
> - CHAR8 *Str;
> - UINT8 Len;
> -} ISCSI_ROOT_PATH_FIELD;
> -
> -/**
> - Parse the DHCP ACK to get the address configuration and DNS information.
> -
> - @param[in] Image The handle of the driver image.
> - @param[in] Controller The handle of the controller;
> - @param[in, out] ConfigData The session configuration data.
> -
> - @retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NO_MEDIA There was a media error.
> - @retval Others Other errors as indicated.
> -
> -**/
> -EFI_STATUS
> -IScsiDoDhcp (
> - IN EFI_HANDLE Image,
> - IN EFI_HANDLE Controller,
> - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h
> deleted file mode 100644
> index d6a619f00fc0..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h
> +++ /dev/null
> @@ -1,140 +0,0 @@
> -/** @file
> - The header file of IScsiDriver.c.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _ISCSI_DRIVER_H_
> -#define _ISCSI_DRIVER_H_
> -
> -#include <Uefi.h>
> -#include <Protocol/DevicePath.h>
> -#include <Protocol/LoadedImage.h>
> -#include <Protocol/HiiConfigAccess.h>
> -#include <Protocol/HiiDatabase.h>
> -#include <Library/UefiDriverEntryPoint.h>
> -#include <Library/UefiBootServicesTableLib.h>
> -#include <Library/UefiLib.h>
> -#include <Library/DevicePathLib.h>
> -#include <Protocol/DriverBinding.h>
> -#include <Protocol/ScsiPassThruExt.h>
> -
> -#define ISCSI_INITIATOR_NAME_VAR_NAME L"I_NAME"
> -
> -typedef struct _ISCSI_PRIVATE_PROTOCOL {
> - UINT32 Reserved;
> -} ISCSI_PRIVATE_PROTOCOL;
> -
> -//
> -// EFI Driver Binding Protocol for iSCSI driver.
> -//
> -
> -/**
> - 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[in] This A pointer to the
> EFI_DRIVER_BINDING_PROTOCOL instance.
> - @param[in] 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[in] 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 acces.
> - Currently not implemented.
> - @retval EFI_UNSUPPORTED The device specified by ControllerHandle
> and
> - RemainingDevicePath is not supported by the driver
> specified by This.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverBindingSupported (
> - 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[in] This A pointer to the
> EFI_DRIVER_BINDING_PROTOCOL instance.
> - @param[in] 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[in] 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_DEVICE_ERROR The device could not be started due to a
> device error.
> - Currently not implemented.
> - @retval EFI_OUT_OF_RESOURCES The request could not be completed
> due to a lack of resources.
> - @retval Others The driver failded to start the device.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverBindingStart (
> - IN EFI_DRIVER_BINDING_PROTOCOL *This,
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
> - );
> -
> -/**
> - Stop this driver on ControllerHandle.
> -
> - Release the control of this controller and remove the IScsi functions. 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[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL
> instance.
> - @param[in] 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[in] NumberOfChildren The number of child device handles in
> ChildHandleBuffer.Not used.
> - @param[in] ChildHandleBuffer An array of child handles to be freed. May
> be NULL
> - if NumberOfChildren is 0.Not used.
> -
> - @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
> -IScsiDriverBindingStop (
> - IN EFI_DRIVER_BINDING_PROTOCOL *This,
> - IN EFI_HANDLE ControllerHandle,
> - IN UINTN NumberOfChildren,
> - IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
> deleted file mode 100644
> index 48729e3029f7..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
> +++ /dev/null
> @@ -1,134 +0,0 @@
> -## @file
> -# This module produces EFI iSCSI Initiator Name Protocol.
> -#
> -# This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4
> Protocol
> -# and EFI DHCPv4 Protocol, to provide the capability to do the transport for
> SCSI
> -# data over TCP/IP. It installs EFI HII Configuration Access Protocol to
> provide
> -# one way to configurate the iSCSI setting. This driver only supports IPv4
> network
> -# stack.
> -#
> -# Notes:
> -# 1) This driver can't co-work with the IScsiDxe driver in NetworkPkg.
> -# 2) This driver might have some issues that have been fixed in the IScsiDxe
> driver
> -# in NetworkPkg.
> -# 3) This driver supports fewer features than the IScsiDxe driver in
> NetworkPkg
> -# (e.g. IPv6, Dns support for target URL configuration, iSCSI keyword
> support).
> -# 4) IScsiDxe driver in NetworkPkg is recommended for use instead of this
> one even
> -# though both of them can be used.
> -#
> -# Copyright (c) 2004 - 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 = IScsi4Dxe
> - MODULE_UNI_FILE = IScsi4Dxe.uni
> - FILE_GUID = 4579B72D-7EC4-4dd4-8486-083C86B182A7
> - MODULE_TYPE = UEFI_DRIVER
> - VERSION_STRING = 1.0
> - ENTRY_POINT = IScsiDriverEntryPoint
> - UNLOAD_IMAGE = EfiIScsiUnload
> -
> -#
> -# The following information is for reference only and not required by the
> build tools.
> -#
> -# VALID_ARCHITECTURES = IA32 X64 EBC
> -#
> -# DRIVER_BINDING = gIScsiDriverBinding
> -# COMPONENT_NAME = gIScsiComponentName
> -# COMPONENT_NAME2 = gIScsiComponentName2
> -#
> -
> -[Sources]
> - IScsiTcp4Io.h
> - IScsiProto.h
> - IScsiMisc.h
> - IScsiIbft.h
> - IScsiExtScsiPassThru.h
> - IScsiDriver.h
> - IScsiDhcp.h
> - IScsiCommon.h
> - IScsiCHAP.h
> - IScsiInitiatorName.h
> - ComponentName.h
> - Md5.h
> - IScsiTcp4Io.c
> - IScsiProto.c
> - IScsiMisc.c
> - IScsiInitiatorName.c
> - IScsiIbft.c
> - IScsiExtScsiPassThru.c
> - IScsiDriver.c
> - IScsiDhcp.c
> - IScsiCHAP.c
> - ComponentName.c
> - Md5.c
> - IScsiConfigDxeStrings.uni
> - IScsiConfigDxe.vfr
> - IScsiConfig.c
> - IScsiConfig.h
> - IScsiImpl.h
> - IScsiConfigNVDataStruc.h
> -
> -[Packages]
> - MdePkg/MdePkg.dec
> - MdeModulePkg/MdeModulePkg.dec
> -
> -[LibraryClasses]
> - UefiDriverEntryPoint
> - UefiLib
> - BaseLib
> - UefiBootServicesTableLib
> - UefiRuntimeServicesTableLib
> - BaseMemoryLib
> - MemoryAllocationLib
> - DevicePathLib
> - DebugLib
> - PrintLib
> - HiiLib
> - NetLib
> -
> -[Protocols]
> - ## PRODUCES
> - ## UNDEFINED # Variable
> - gEfiIScsiInitiatorNameProtocolGuid
> - gEfiExtScsiPassThruProtocolGuid ## BY_START
> - gEfiTcp4ProtocolGuid ## TO_START
> - gEfiTcp4ServiceBindingProtocolGuid ## TO_START
> - gEfiDhcp4ProtocolGuid ## TO_START
> - gEfiDhcp4ServiceBindingProtocolGuid ## TO_START
> - ## TO_START
> - ## PRODUCES
> - gEfiDevicePathProtocolGuid
> - gEfiHiiConfigAccessProtocolGuid ## PRODUCES
> - gEfiHiiDatabaseProtocolGuid ## CONSUMES
> - gEfiPciIoProtocolGuid ## SOMETIMES_CONSUMES
> - gEfiAcpiTableProtocolGuid ## SOMETIMES_CONSUMES
> -
> -[Guids]
> - gEfiEventExitBootServicesGuid ## SOMETIMES_CONSUMES ##
> Event
> - gEfiIfrTianoGuid ## SOMETIMES_PRODUCES ## UNDEFINED
> - gEfiAcpiTableGuid ## SOMETIMES_CONSUMES ##
> SystemTable
> - gEfiAcpi10TableGuid ## SOMETIMES_CONSUMES ##
> SystemTable
> - ## SOMETIMES_PRODUCES ## Variable:L"iSCSIDeviceList"
> - ## SOMETIMES_CONSUMES ## Variable:L"iSCSIDeviceList"
> - ## SOMETIMES_CONSUMES ## UNDEFINED # HiiIsConfigHdrMatch
> mVendorStorageName
> - ## SOMETIMES_PRODUCES ## UNDEFINED # HiiConstructConfigHdr
> mVendorStorageName
> - ## SOMETIMES_PRODUCES ## UNDEFINED # HiiGetBrowserData
> mVendorStorageName
> - ## SOMETIMES_CONSUMES ## UNDEFINED # HiiSetBrowserData
> mVendorStorageName
> - ## SOMETIMES_CONSUMES ## HII
> - gIp4IScsiConfigGuid
> - ## SOMETIMES_PRODUCES ## Variable
> - ## SOMETIMES_CONSUMES ## Variable
> - gIScsiCHAPAuthInfoGuid
> -
> -[UserExtensions.TianoCore."ExtraFiles"]
> - IScsi4DxeExtra.uni
> diff --git
> a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h
> deleted file mode 100644
> index e635e47b9292..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -/** @file
> - The header file of IScsiExtScsiPassThru.c.
> -
> -Copyright (c) 2004 - 2008, 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.
> -
> -**/
> -
> -#ifndef _ISCSI_EXT_SCSI_PASS_THRU_H_
> -#define _ISCSI_EXT_SCSI_PASS_THRU_H_
> -
> -#include <Protocol/ScsiPassThruExt.h>
> -
> -extern EFI_EXT_SCSI_PASS_THRU_PROTOCOL
> gIScsiExtScsiPassThruProtocolTemplate;
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h
> deleted file mode 100644
> index 4f3828db63c6..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h
> +++ /dev/null
> @@ -1,38 +0,0 @@
> -/** @file
> - Some extra definitions for iBFT.
> -
> -Copyright (c) 2004 - 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
> -
> -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 _ISCSI_IBFT_H_
> -#define _ISCSI_IBFT_H_
> -
> -#include <IndustryStandard/Acpi.h>
> -#include <IndustryStandard/IScsiBootFirmwareTable.h>
> -#include <Protocol/AcpiTable.h>
> -#include <Protocol/PciIo.h>
> -
> -#define IBFT_TABLE_VAR_NAME L"iBFT"
> -#define IBFT_MAX_SIZE 4096
> -#define IBFT_HEAP_OFFSET 2048
> -
> -#define IBFT_ROUNDUP(size) NET_ROUNDUP ((size),
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_STRUCTURE_ALIGNMENT)
> -
> -/**
> - Publish and remove the iSCSI Boot Firmware Table according to the iSCSI
> - session status.
> -**/
> -VOID
> -IScsiPublishIbft (
> - VOID
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h
> deleted file mode 100644
> index 8a5ee2149eb2..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h
> +++ /dev/null
> @@ -1,168 +0,0 @@
> -/** @file
> - The header file of IScsiImpl.c.
> -
> -Copyright (c) 2004 - 2016, 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.
> -
> -**/
> -
> -#ifndef _ISCSI_IMPL_H_
> -#define _ISCSI_IMPL_H_
> -
> -#include <Uefi.h>
> -
> -#include <IndustryStandard/Dhcp.h>
> -
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/MemoryAllocationLib.h>
> -#include <Library/NetLib.h>
> -#include <Library/PrintLib.h>
> -#include <Library/UefiRuntimeServicesTableLib.h>
> -
> -#include <Guid/EventGroup.h>
> -
> -#include "IScsiCommon.h"
> -#include "IScsiDriver.h"
> -#include "IScsiInitiatorName.h"
> -#include "ComponentName.h"
> -#include "IScsiConfigNVDataStruc.h"
> -#include "IScsiExtScsiPassThru.h"
> -#include "IScsiProto.h"
> -#include "IScsiMisc.h"
> -#include "IScsiCHAP.h"
> -#include "IScsiConfig.h"
> -#include "IScsiDhcp.h"
> -#include "IScsiTcp4Io.h"
> -#include "IScsiIbft.h"
> -
> -
> -#define ISCSI_SESSION_SIGNATURE SIGNATURE_32 ('I', 'S', 'S', 'N')
> -
> -struct _ISCSI_SESSION {
> - UINT32 Signature;
> -
> - ISCSI_SESSION_CONFIG_DATA ConfigData;
> - ISCSI_CHAP_AUTH_DATA AuthData;
> -
> - CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE];
> - UINTN InitiatorNameLength;
> - UINT8 State;
> -
> - UINT8 Isid[6];
> - UINT16 Tsih;
> -
> - UINT32 CmdSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> -
> - UINT32 InitiatorTaskTag;
> - UINT16 NextCid;
> -
> - LIST_ENTRY Conns;
> - UINT32 NumConns;
> -
> - LIST_ENTRY TcbList;
> -
> - //
> - // session-wide parameters
> - //
> - UINT16 TargetPortalGroupTag;
> - UINT32 MaxConnections;
> - BOOLEAN InitialR2T;
> - BOOLEAN ImmediateData;
> - UINT32 MaxBurstLength;
> - UINT32 FirstBurstLength;
> - UINT32 DefaultTime2Wait;
> - UINT32 DefaultTime2Retain;
> - UINT16 MaxOutstandingR2T;
> - BOOLEAN DataPDUInOrder;
> - BOOLEAN DataSequenceInOrder;
> - UINT8 ErrorRecoveryLevel;
> -};
> -
> -#define ISCSI_CONNECTION_SIGNATURE SIGNATURE_32 ('I', 'S', 'C', 'N')
> -
> -struct _ISCSI_CONNECTION {
> - UINT32 Signature;
> - LIST_ENTRY Link;
> -
> - EFI_EVENT TimeoutEvent;
> -
> - ISCSI_SESSION *Session;
> -
> - UINT8 State;
> - UINT8 CurrentStage;
> - UINT8 NextStage;
> -
> - UINT8 CHAPStep;
> -
> - BOOLEAN PartialReqSent;
> - BOOLEAN PartialRspRcvd;
> -
> - BOOLEAN TransitInitiated;
> -
> - UINT16 Cid;
> - UINT32 ExpStatSN;
> -
> - //
> - // queues...
> - //
> - NET_BUF_QUEUE RspQue;
> -
> - TCP4_IO Tcp4Io;
> -
> - //
> - // connection-only parameters
> - //
> - UINT32 MaxRecvDataSegmentLength;
> - ISCSI_DIGEST_TYPE HeaderDigest;
> - ISCSI_DIGEST_TYPE DataDigest;
> -};
> -
> -#define ISCSI_DRIVER_DATA_SIGNATURE SIGNATURE_32 ('I', 'S', 'D', 'A')
> -
> -#define ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU(PassThru) \
> - CR ( \
> - PassThru, \
> - ISCSI_DRIVER_DATA, \
> - IScsiExtScsiPassThru, \
> - ISCSI_DRIVER_DATA_SIGNATURE \
> - )
> -#define ISCSI_DRIVER_DATA_FROM_IDENTIFIER(Identifier) \
> - CR ( \
> - Identifier, \
> - ISCSI_DRIVER_DATA, \
> - IScsiIdentifier, \
> - ISCSI_DRIVER_DATA_SIGNATURE \
> - )
> -#define ISCSI_DRIVER_DATA_FROM_SESSION(s) \
> - CR ( \
> - s, \
> - ISCSI_DRIVER_DATA, \
> - Session, \
> - ISCSI_DRIVER_DATA_SIGNATURE \
> - )
> -
> -struct _ISCSI_DRIVER_DATA {
> - UINT32 Signature;
> - EFI_HANDLE Image;
> - EFI_HANDLE Controller;
> - ISCSI_PRIVATE_PROTOCOL IScsiIdentifier;
> - EFI_HANDLE ChildHandle;
> - EFI_EVENT ExitBootServiceEvent;
> -
> - EFI_EXT_SCSI_PASS_THRU_PROTOCOL IScsiExtScsiPassThru;
> - EFI_EXT_SCSI_PASS_THRU_MODE ExtScsiPassThruMode;
> - EFI_HANDLE ExtScsiPassThruHandle;
> - EFI_DEVICE_PATH_PROTOCOL *DevicePath;
> -
> - ISCSI_SESSION Session;
> -};
> -
> -#endif
> diff --git
> a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h
> deleted file mode 100644
> index f967fb383095..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h
> +++ /dev/null
> @@ -1,74 +0,0 @@
> -/** @file
> - The header file for EFI iSCSI Initiator Name Protocol.
> -
> -Copyright (c) 2004 - 2008, 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.
> -
> -**/
> -
> -#ifndef _ISCSI_INITIATOR_NAME_H_
> -#define _ISCSI_INITIATOR_NAME_H_
> -
> -#include <Protocol/IScsiInitiatorName.h>
> -
> -extern EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName;
> -
> -//
> -// EFI iSCSI Initiator Name Protocol for IScsi driver.
> -//
> -
> -/**
> - Retrieves the current set value of iSCSI Initiator Name.
> -
> - @param[in] This Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer
> / Actual size of the
> - variable data buffer.
> - @param[out] Buffer Pointer to the buffer for data to be read.
> -
> - @retval EFI_SUCCESS Data was successfully retrieved into the
> provided buffer and the
> - BufferSize was sufficient to handle the iSCSI initiator name.
> - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result.
> - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
> - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be
> retrieved due to a hardware error.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiGetInitiatorName (
> - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
> - IN OUT UINTN *BufferSize,
> - OUT VOID *Buffer
> - );
> -
> -/**
> - Sets the iSCSI Initiator Name.
> -
> - @param[in] This Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer.
> - @param[in] Buffer Pointer to the buffer for data to be written.
> -
> - @retval EFI_SUCCESS Data was successfully stored by the protocol.
> - @retval EFI_UNSUPPORTED Platform policies do not allow for data to be
> written.
> - Currently not implemented.
> - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or
> BufferSize exceeds the maximum allowed limit.
> - @retval EFI_DEVICE_ERROR The data could not be stored due to a
> hardware error.
> - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold
> the data.
> - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not
> adhere to RFC 3720
> - (and other related protocols).
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiSetInitiatorName (
> - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
> - IN OUT UINTN *BufferSize,
> - IN VOID *Buffer
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h
> deleted file mode 100644
> index 500e00373b25..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h
> +++ /dev/null
> @@ -1,317 +0,0 @@
> -/** @file
> - Miscellaneous definitions for iSCSI driver.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _ISCSI_MISC_H_
> -#define _ISCSI_MISC_H_
> -
> -#include <Library/BaseLib.h>
> -
> -typedef struct _ISCSI_SESSION_CONFIG_DATA
> ISCSI_SESSION_CONFIG_DATA;
> -
> -///
> -/// IPv4 Device Path Node Length
> -///
> -#define IP4_NODE_LEN_NEW_VERSIONS 27
> -
> -#pragma pack(1)
> -typedef struct {
> - BOOLEAN Enabled;
> -
> - BOOLEAN InitiatorInfoFromDhcp;
> - EFI_IPv4_ADDRESS LocalIp;
> - EFI_IPv4_ADDRESS SubnetMask;
> - EFI_IPv4_ADDRESS Gateway;
> -
> - BOOLEAN TargetInfoFromDhcp;
> - CHAR8 TargetName[ISCSI_NAME_MAX_SIZE];
> - EFI_IPv4_ADDRESS TargetIp;
> - UINT16 TargetPort;
> - UINT8 BootLun[8];
> -
> - UINT8 IsId[6];
> -} ISCSI_SESSION_CONFIG_NVDATA;
> -#pragma pack()
> -
> -struct _ISCSI_SESSION_CONFIG_DATA {
> - ISCSI_SESSION_CONFIG_NVDATA NvData;
> -
> - EFI_IPv4_ADDRESS PrimaryDns;
> - EFI_IPv4_ADDRESS SecondaryDns;
> - EFI_IPv4_ADDRESS DhcpServer;
> -};
> -
> -/**
> - Calculate the prefix length of the IPv4 subnet mask.
> -
> - @param[in] SubnetMask The IPv4 subnet mask.
> -
> - @return The prefix length of the subnet mask.
> - @retval 0 Other errors as indicated.
> -**/
> -UINT8
> -IScsiGetSubnetMaskPrefixLength (
> - IN EFI_IPv4_ADDRESS *SubnetMask
> - );
> -
> -/**
> - Convert the hexadecimal encoded LUN string into the 64-bit LUN.
> -
> - @param[in] Str The hexadecimal encoded LUN string.
> - @param[out] Lun Storage to return the 64-bit LUN.
> -
> - @retval EFI_SUCCESS The 64-bit LUN is stored in Lun.
> - @retval EFI_INVALID_PARAMETER The string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiAsciiStrToLun (
> - IN CHAR8 *Str,
> - OUT UINT8 *Lun
> - );
> -
> -/**
> - Convert the 64-bit LUN into the hexadecimal encoded LUN string.
> -
> - @param[in] Lun The 64-bit LUN.
> - @param[out] Str The storage to return the hexadecimal encoded LUN
> string.
> -**/
> -VOID
> -IScsiLunToUnicodeStr (
> - IN UINT8 *Lun,
> - OUT CHAR16 *Str
> - );
> -
> -/**
> - Convert the ASCII string into a UNICODE string.
> -
> - @param[in] Source The ASCII string.
> - @param[out] Destination The storage to return the UNICODE string.
> -
> - @return CHAR16 * Pointer to the UNICODE string.
> -**/
> -CHAR16 *
> -IScsiAsciiStrToUnicodeStr (
> - IN CHAR8 *Source,
> - OUT CHAR16 *Destination
> - );
> -
> -/**
> - Convert the UNICODE string into an ASCII string.
> -
> - @param[in] Source The UNICODE string.
> - @param[out] Destination The storage to return the ASCII string.
> -
> - @return CHAR8 * Pointer to the ASCII string.
> -**/
> -CHAR8 *
> -IScsiUnicodeStrToAsciiStr (
> - IN CHAR16 *Source,
> - OUT CHAR8 *Destination
> - );
> -
> -/**
> - Convert the mac address into a hexadecimal encoded "-" seperated string.
> -
> - @param[in] Mac The mac address.
> - @param[in] Len Length in bytes of the mac address.
> - @param[in] VlanId VLAN ID of the network device.
> - @param[out] Str The storage to return the mac string.
> -**/
> -VOID
> -IScsiMacAddrToStr (
> - IN EFI_MAC_ADDRESS *Mac,
> - IN UINT32 Len,
> - IN UINT16 VlanId,
> - OUT CHAR16 *Str
> - );
> -
> -/**
> - Convert the decimal dotted IPv4 address into the binary IPv4 address.
> -
> - @param[in] Str The UNICODE string.
> - @param[out] Ip The storage to return the ASCII string.
> -
> - @retval EFI_SUCCESS The binary IP address is returned in Ip.
> - @retval EFI_INVALID_PARAMETER The IP string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiAsciiStrToIp (
> - IN CHAR8 *Str,
> - OUT EFI_IPv4_ADDRESS *Ip
> - );
> -
> -/**
> - Convert the binary encoded buffer into a hexadecimal encoded string.
> -
> - @param[in] BinBuffer The buffer containing the binary data.
> - @param[in] BinLength Length of the binary buffer.
> - @param[in, out] HexStr Pointer to the string.
> - @param[in, out] HexLength The length of the string.
> -
> - @retval EFI_SUCCESS The binary data is converted to the hexadecimal
> string
> - and the length of the string is updated.
> - @retval EFI_BUFFER_TOO_SMALL The string is too small.
> - @retval EFI_INVALID_PARAMETER The IP string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiBinToHex (
> - IN UINT8 *BinBuffer,
> - IN UINT32 BinLength,
> - IN OUT CHAR8 *HexStr,
> - IN OUT UINT32 *HexLength
> - );
> -
> -/**
> - Convert the hexadecimal string into a binary encoded buffer.
> -
> - @param[in, out] BinBuffer The binary buffer.
> - @param[in, out] BinLength Length of the binary buffer.
> - @param[in] HexStr The hexadecimal string.
> -
> - @retval EFI_SUCCESS The hexadecimal string is converted into a binary
> - encoded buffer.
> - @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the
> converted data.
> -**/
> -EFI_STATUS
> -IScsiHexToBin (
> - IN OUT UINT8 *BinBuffer,
> - IN OUT UINT32 *BinLength,
> - IN CHAR8 *HexStr
> - );
> -
> -/**
> - Generate random numbers.
> -
> - @param[in, out] Rand The buffer to contain random numbers.
> - @param[in] RandLength The length of the Rand buffer.
> -**/
> -VOID
> -IScsiGenRandom (
> - IN OUT UINT8 *Rand,
> - IN UINTN RandLength
> - );
> -
> -/**
> - Create the iSCSI driver data..
> -
> - @param[in] Image The handle of the driver image.
> - @param[in] Controller The handle of the controller.
> -
> - @return The iSCSI driver data created.
> - @retval NULL Other errors as indicated.
> -**/
> -ISCSI_DRIVER_DATA *
> -IScsiCreateDriverData (
> - IN EFI_HANDLE Image,
> - IN EFI_HANDLE Controller
> - );
> -
> -/**
> - Clean the iSCSI driver data.
> -
> - @param[in] Private The iSCSI driver data.
> -
> - @retval EFI_SUCCES The clean operation is successful.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiCleanDriverData (
> - IN ISCSI_DRIVER_DATA *Private
> - );
> -
> -/**
> - Check wheather the Controller is configured to use DHCP protocol.
> -
> - @param[in] Controller The handle of the controller.
> -
> - @retval TRUE The handle of the controller need the Dhcp
> protocol.
> - @retval FALSE The handle of the controller does not need the
> Dhcp protocol.
> -
> -**/
> -BOOLEAN
> -IScsiDhcpIsConfigured (
> - IN EFI_HANDLE Controller
> - );
> -
> -/**
> - Get the various configuration data of this iSCSI instance.
> -
> - @param[in] Private The iSCSI driver data.
> -
> - @retval EFI_SUCCESS The configuration of this instance is got.
> - @retval EFI_ABORTED The operation was aborted.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiGetConfigData (
> - IN ISCSI_DRIVER_DATA *Private
> - );
> -
> -/**
> - Get the device path of the iSCSI tcp connection and update it.
> -
> - @param[in] Private The iSCSI driver data.
> -
> - @return The updated device path.
> - @retval NULL Other errors as indicated.
> -**/
> -EFI_DEVICE_PATH_PROTOCOL *
> -IScsiGetTcpConnDevicePath (
> - IN ISCSI_DRIVER_DATA *Private
> - );
> -
> -/**
> - Abort the session when the transition from BS to RT is initiated.
> -
> - @param[in] Event The event signaled.
> - @param[in] Context The iSCSI driver data.
> -**/
> -VOID
> -EFIAPI
> -IScsiOnExitBootService (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - );
> -
> -/**
> - Tests whether a controller handle is being managed by IScsi driver.
> -
> - This function tests whether the driver specified by DriverBindingHandle is
> - currently managing the controller specified by ControllerHandle. This test
> - is performed by evaluating if the the protocol specified by ProtocolGuid is
> - present on ControllerHandle and is was opened by DriverBindingHandle
> and Nic
> - Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER.
> - If ProtocolGuid is NULL, then ASSERT().
> -
> - @param ControllerHandle A handle for a controller to test.
> - @param DriverBindingHandle Specifies the driver binding handle for the
> - driver.
> - @param ProtocolGuid Specifies the protocol that the driver specified
> - by DriverBindingHandle opens in its Start()
> - function.
> -
> - @retval EFI_SUCCESS ControllerHandle is managed by the driver
> - specified by DriverBindingHandle.
> - @retval EFI_UNSUPPORTED ControllerHandle is not managed by the
> driver
> - specified by DriverBindingHandle.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiTestManagedDevice (
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_HANDLE DriverBindingHandle,
> - IN EFI_GUID *ProtocolGuid
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h
> deleted file mode 100644
> index 6469df0434a1..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h
> +++ /dev/null
> @@ -1,1005 +0,0 @@
> -/** @file
> - The header file of iSCSI Protocol that defines many specific data structures.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _ISCSI_PROTO_H_
> -#define _ISCSI_PROTO_H_
> -
> -#include <Protocol/ScsiPassThruExt.h>
> -
> -//
> -// RFC 1982 Serial Number Arithmetic, SERIAL_BITS = 32
> -//
> -#define ISCSI_SEQ_EQ(s1, s2) ((s1) == (s2))
> -#define ISCSI_SEQ_LT(s1, s2) \
> - ( \
> - (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) < ((UINT32) 1 << 31)) || \
> - (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) > ((UINT32) 1 << 31)) \
> - )
> -#define ISCSI_SEQ_GT(s1, s2) \
> - ( \
> - (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) > ((UINT32) 1 << 31)) || \
> - (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) < ((UINT32) 1 << 31)) \
> - )
> -
> -#define ISCSI_WELL_KNOWN_PORT 3260
> -#define ISCSI_MAX_CONNS_PER_SESSION 1
> -
> -#define DEFAULT_MAX_RECV_DATA_SEG_LEN 8192
> -#define MAX_RECV_DATA_SEG_LEN_IN_FFP 65536
> -#define DEFAULT_MAX_OUTSTANDING_R2T 1
> -
> -#define ISCSI_VERSION_MAX 0x00
> -#define ISCSI_VERSION_MIN 0x00
> -
> -#define ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME
> EFI_TIMER_PERIOD_SECONDS(20)
> -#define ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME
> EFI_TIMER_PERIOD_SECONDS(20)
> -
> -#define ISCSI_KEY_AUTH_METHOD "AuthMethod"
> -#define ISCSI_KEY_HEADER_DIGEST "HeaderDigest"
> -#define ISCSI_KEY_DATA_DIGEST "DataDigest"
> -#define ISCSI_KEY_MAX_CONNECTIONS "MaxConnections"
> -#define ISCSI_KEY_TARGET_NAME "TargetName"
> -#define ISCSI_KEY_INITIATOR_NAME "InitiatorName"
> -#define ISCSI_KEY_TARGET_ALIAS "TargetAlias"
> -#define ISCSI_KEY_INITIATOR_ALIAS "InitiatorAlias"
> -#define ISCSI_KEY_TARGET_ADDRESS "TargetAddress"
> -#define ISCSI_KEY_INITIAL_R2T "InitialR2T"
> -#define ISCSI_KEY_IMMEDIATE_DATA "ImmediateData"
> -#define ISCSI_KEY_TARGET_PORTAL_GROUP_TAG
> "TargetPortalGroupTag"
> -#define ISCSI_KEY_MAX_BURST_LENGTH "MaxBurstLength"
> -#define ISCSI_KEY_FIRST_BURST_LENGTH "FirstBurstLength"
> -#define ISCSI_KEY_DEFAULT_TIME2WAIT "DefaultTime2Wait"
> -#define ISCSI_KEY_DEFAULT_TIME2RETAIN "DefaultTime2Retain"
> -#define ISCSI_KEY_MAX_OUTSTANDING_R2T "MaxOutstandingR2T"
> -#define ISCSI_KEY_DATA_PDU_IN_ORDER "DataPDUInOrder"
> -#define ISCSI_KEY_DATA_SEQUENCE_IN_ORDER
> "DataSequenceInOrder"
> -#define ISCSI_KEY_ERROR_RECOVERY_LEVEL "ErrorRecoveryLevel"
> -#define ISCSI_KEY_SESSION_TYPE "SessionType"
> -#define ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH
> "MaxRecvDataSegmentLength"
> -
> -#define ISCSI_KEY_VALUE_NONE "None"
> -
> -///
> -/// connection state for initiator
> -///
> -
> -#define CONN_STATE_FREE 0
> -#define CONN_STATE_XPT_WAIT 1
> -#define CONN_STATE_IN_LOGIN 2
> -#define CONN_STATE_LOGGED_IN 3
> -#define CONN_STATE_IN_LOGOUT 4
> -#define CONN_STATE_LOGOUT_REQUESTED 5
> -#define CONN_STATE_CLEANUP_WAIT 6
> -#define CONN_STATE_IN_CLEANUP 7
> -
> -///
> -/// session state for initiator
> -///
> -#define SESSION_STATE_FREE 0
> -#define SESSION_STATE_LOGGED_IN 1
> -#define SESSION_STATE_FAILED 2
> -
> -typedef enum {
> - DataIn = 0,
> - DataOut = 1,
> - DataBi = 2
> -} DATA_DIRECTION;
> -
> -#define ISCSI_RESERVED_TAG 0xffffffff
> -
> -#define ISCSI_REQ_IMMEDIATE 0x40
> -#define ISCSI_OPCODE_MASK 0x3F
> -
> -#define ISCSI_SET_OPCODE(PduHdr, Op, Flgs) ((((ISCSI_BASIC_HEADER *)
> (PduHdr))->OpCode) = ((Op) | (Flgs)))
> -#define ISCSI_GET_OPCODE(PduHdr) ((((ISCSI_BASIC_HEADER *)
> (PduHdr))->OpCode) & ISCSI_OPCODE_MASK)
> -#define ISCSI_CHECK_OPCODE(PduHdr, Op) ((((PduHdr)->OpCode) &
> ISCSI_OPCODE_MASK) == (Op))
> -#define ISCSI_IMMEDIATE_ON(PduHdr) ((PduHdr)->OpCode &
> ISCSI_REQ_IMMEDIATE)
> -#define ISCSI_SET_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *)
> (PduHdr))->Flags |= (BOOLEAN)(Flag))
> -#define ISCSI_CLEAR_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *)
> (PduHdr))->Flags &= ~(Flag))
> -#define ISCSI_FLAG_ON(PduHdr, Flag) ((((ISCSI_BASIC_HEADER *)
> (PduHdr))->Flags & (Flag)) == (Flag))
> -#define ISCSI_SET_STAGES(PduHdr, Cur, Nxt) ((PduHdr)->Flags = (UINT8)
> ((PduHdr)->Flags | ((Cur) << 2 | (Nxt))))
> -#define ISCSI_GET_CURRENT_STAGE(PduHdr) (((PduHdr)->Flags >> 2) &
> 0x3)
> -#define ISCSI_GET_NEXT_STAGE(PduHdr) (((PduHdr)->Flags) & 0x3)
> -
> -#define ISCSI_GET_PAD_LEN(DataLen) ((~(DataLen) + 1) & 0x3)
> -#define ISCSI_ROUNDUP(DataLen) (((DataLen) + 3) &~(0x3))
> -
> -#define HTON24(Dst, Src) \
> - do { \
> - (Dst)[0] = (UINT8) (((Src) >> 16) & 0xFF); \
> - (Dst)[1] = (UINT8) (((Src) >> 8) & 0xFF); \
> - (Dst)[2] = (UINT8) ((Src) & 0xFF); \
> - } while (0);
> -
> -#define NTOH24(src) (((src)[0] << 16) | ((src)[1] << 8) | ((src)[2]))
> -
> -#define ISCSI_GET_DATASEG_LEN(PduHdr) NTOH24
> (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength)
> -#define ISCSI_SET_DATASEG_LEN(PduHdr, Len) HTON24
> (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength, (Len))
> -
> -//
> -// initiator opcodes
> -//
> -#define ISCSI_OPCODE_NOP_OUT 0x00
> -#define ISCSI_OPCODE_SCSI_CMD 0x01
> -#define ISCSI_OPCODE_SCSI_TMF_REQ 0x02
> -#define ISCSI_OPCODE_LOGIN_REQ 0x03
> -#define ISCSI_OPCODE_TEXT_REQ 0x04
> -#define ISCSI_OPCODE_SCSI_DATA_OUT 0x05
> -#define ISCSI_OPCODE_LOGOUT_REQ 0x06
> -#define ISCSI_OPCODE_SNACK_REQ 0x10
> -#define ISCSI_OPCODE_VENDOR_I0 0x1c
> -#define ISCSI_OPCODE_VENDOR_I1 0x1d
> -#define ISCSI_OPCODE_VENDOR_I2 0x1e
> -
> -//
> -// target opcodes
> -//
> -#define ISCSI_OPCODE_NOP_IN 0x20
> -#define ISCSI_OPCODE_SCSI_RSP 0x21
> -#define ISCSI_OPCODE_SCSI_TMF_RSP 0x22
> -#define ISCSI_OPCODE_LOGIN_RSP 0x23
> -#define ISCSI_OPCODE_TEXT_RSP 0x24
> -#define ISCSI_OPCODE_SCSI_DATA_IN 0x25
> -#define ISCSI_OPCODE_LOGOUT_RSP 0x26
> -#define ISCSI_OPCODE_R2T 0x31
> -#define ISCSI_OPCODE_ASYNC_MSG 0x32
> -#define ISCSI_OPCODE_VENDOR_T0 0x3c
> -#define ISCSI_OPCODE_VENDOR_T1 0x3d
> -#define ISCSI_OPCODE_VENDOR_T2 0x3e
> -#define ISCSI_OPCODE_REJECT 0x3f
> -
> -#define ISCSI_BHS_FLAG_FINAL 0x80
> -
> -///
> -/// iSCSI Basic Header Segment
> -///
> -typedef struct _ISCSI_BASIC_HEADER {
> - UINT8 OpCode;
> - UINT8 Flags;
> - UINT16 OpCodeSpecific1;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 OpCodeSpecific2[7];
> -} ISCSI_BASIC_HEADER;
> -
> -//
> -// Defined AHS types, others are reserved.
> -//
> -#define ISCSI_AHS_TYPE_EXT_CDB 0x1
> -#define ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN 0x2
> -
> -typedef struct _ISCSI_ADDTIONAL_HEADER {
> - UINT16 Length;
> - UINT8 Type;
> - UINT8 TypeSpecific[1];
> -} ISCSI_ADDITIONAL_HEADER;
> -
> -typedef struct _ISCSI_BI_EXP_READ_DATA_LEN_AHS {
> - UINT16 Length;
> - UINT8 Type;
> - UINT8 Reserved;
> - UINT32 ExpReadDataLength;
> -} ISCSI_BI_EXP_READ_DATA_LEN_AHS;
> -
> -#define SCSI_CMD_PDU_FLAG_READ 0x40
> -#define SCSI_CMD_PDU_FLAG_WRITE 0x20
> -
> -#define ISCSI_CMD_PDU_TASK_ATTR_MASK 0x07
> -
> -//
> -// task attributes
> -//
> -#define ISCSI_TASK_ATTR_UNTAGGED 0x00
> -#define ISCSI_TASK_ATTR_SIMPLE 0x01
> -#define ISCSI_TASK_ATTR_ORDERD 0x02
> -#define ISCSI_TASK_ATTR_HOQ 0x03
> -#define ISCSI_TASK_ATTR_ACA 0x04
> -
> -///
> -/// SCSI Command
> -///
> -typedef struct _SCSI_COMMAND {
> - UINT8 OpCode;
> - UINT8 Flags;
> - UINT16 Reserved;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 ExpDataXferLength;
> - UINT32 CmdSN;
> - UINT32 ExpStatSN;
> - UINT8 Cdb[16];
> -} SCSI_COMMAND;
> -
> -//
> -// flag bit definitions in SCSI response
> -//
> -#define SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW 0x10
> -#define SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW 0x08
> -#define SCSI_RSP_PDU_FLAG_OVERFLOW 0x04
> -#define SCSI_RSP_PDU_FLAG_UNDERFLOW 0x02
> -
> -//
> -// iSCSI service response codes
> -//
> -#define ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET 0x00
> -#define ISCSI_SERVICE_RSP_TARGET_FAILURE 0x01
> -
> -///
> -/// SCSI Response
> -///
> -typedef struct _SCSI_RESPONSE {
> - UINT8 OpCode;
> - UINT8 Flags;
> - UINT8 Response;
> - UINT8 Status;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Reserved[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 SNACKTag;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT32 ExpDataSN;
> - UINT32 BiReadResidualCount;
> - UINT32 ResidualCount;
> -} SCSI_RESPONSE;
> -
> -typedef struct _ISCSI_SENSE_DATA {
> - UINT16 Length;
> - UINT8 Data[2];
> -} ISCSI_SENSE_DATA;
> -
> -///
> -/// iSCSI Task Managment Function Request
> -///
> -typedef struct _ISCSI_TMF_REQUEST {
> - UINT8 OpCode;
> - UINT8 Fuction;
> - UINT16 Reserved1;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 ReferencedTaskTag;
> - UINT32 CmdSN;
> - UINT32 ExpStatSN;
> - UINT32 RefCmdSN;
> - UINT32 ExpDataSN;
> - UINT32 Reserved2[2];
> -} ISCSI_TMF_REQUEST;
> -
> -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_COMPLETE 0
> -#define ISCSI_TMF_RSP_PDU_RSP_TASK_NOT_EXIST 1
> -#define ISCSI_TMF_RSP_PDU_RSP_LUN_NOT_EXIST 2
> -#define ISCSI_TMF_RSP_PDU_RSP_TASK_STILL_ALLEGIANT 3
> -#define ISCSI_TMF_RSP_PDU_RSP_TASK_REASSGIN_NOT_SUPPORTED 4
> -#define ISCSI_TMF_RSP_PDU_RSP_NOT_SUPPORTED 5
> -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_AHTH_FAILED 6
> -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_REJECTED 255
> -
> -///
> -/// iSCSI Task Management Function Response
> -///
> -typedef struct _ISCSI_TMF_RESPONSE {
> - UINT8 OpCode;
> - UINT8 Reserved1;
> - UINT8 Response;
> - UINT8 Reserved2;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT32 Reserver3[2];
> - UINT32 InitiatorTaskTag;
> - UINT32 Reserved4;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT32 Reserved[3];
> -} ISCSI_TMF_RESPONSE;
> -
> -///
> -/// SCSI Data-Out
> -///
> -typedef struct _ISCSI_SCSI_DATA_OUT {
> - UINT8 OpCode;
> - UINT8 Reserved1[3];
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 TargetTransferTag;
> - UINT32 Reserved2;
> - UINT32 ExpStatSN;
> - UINT32 Reserved3;
> - UINT32 DataSN;
> - UINT32 BufferOffset;
> - UINT32 Reserved4;
> -} ISCSI_SCSI_DATA_OUT;
> -
> -#define SCSI_DATA_IN_PDU_FLAG_ACKKNOWLEDGE 0x40
> -#define SCSI_DATA_IN_PDU_FLAG_OVERFLOW
> SCSI_RSP_PDU_FLAG_OVERFLOW
> -#define SCSI_DATA_IN_PDU_FLAG_UNDERFLOW
> SCSI_RSP_PDU_FLAG_UNDERFLOW
> -#define SCSI_DATA_IN_PDU_FLAG_STATUS_VALID 0x01
> -
> -///
> -/// SCSI Data-In
> -///
> -typedef struct _ISCSI_SCSI_DATA_IN {
> - UINT8 OpCode;
> - UINT8 Flags;
> - UINT8 Reserved1;
> - UINT8 Status;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 TargetTransferTag;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT32 DataSN;
> - UINT32 BufferOffset;
> - UINT32 ResidualCount;
> -} ISCSI_SCSI_DATA_IN;
> -
> -#define ISCSI_GET_BUFFER_OFFSET(PduHdr) NTOHL
> (((ISCSI_SCSI_DATA_IN *) (PduHdr))->BufferOffset)
> -
> -///
> -/// Ready To Transfer
> -///
> -typedef struct _ISCSI_READY_TO_TRANSFER {
> - UINT8 OpCode;
> - UINT8 Reserved1[3];
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 TargetTransferTag;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT32 R2TSeqNum;
> - UINT32 BufferOffset;
> - UINT32 DesiredDataTransferLength;
> -} ISCSI_READY_TO_TRANSFER;
> -
> -typedef struct _ISCSI_ASYNC_MESSAGE {
> - UINT8 OpCode;
> - UINT8 Reserved1[8];
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 Reserved2;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT8 AsyncEvent;
> - UINT8 AsyncVCode;
> - UINT16 Parameter1;
> - UINT16 Parameter2;
> - UINT16 Parameter3;
> - UINT32 Reserved3;
> -} ISCSI_ASYNC_MESSAGE;
> -
> -#define ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT 0x80
> -#define ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE 0x40
> -
> -///
> -/// Login Request
> -///
> -typedef struct _ISCSI_LOGIN_REQUEST {
> - UINT8 OpCode;
> - UINT8 Flags;
> - UINT8 VersionMax;
> - UINT8 VersionMin;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Isid[6];
> - UINT16 Tsih;
> - UINT32 InitiatorTaskTag;
> - UINT16 Cid;
> - UINT16 Reserved1;
> - UINT32 CmdSN;
> - UINT32 ExpStatSN;
> - UINT32 Reserved2[4];
> -} ISCSI_LOGIN_REQUEST;
> -
> -#define ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT
> ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT
> -#define ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE
> ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE
> -
> -#define ISCSI_LOGIN_STATUS_SUCCESS 0
> -#define ISCSI_LOGIN_STATUS_REDIRECTION 1
> -#define ISCSI_LOGIN_STATUS_INITIATOR_ERROR 2
> -#define ISCSI_LOGIN_STATUS_TARGET_ERROR 3
> -
> -///
> -/// Login Response
> -///
> -typedef struct _ISCSI_LOGIN_RESPONSE {
> - UINT8 OpCode;
> - UINT8 Flags;
> - UINT8 VersionMax;
> - UINT8 VersionActive;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Isid[6];
> - UINT16 Tsih;
> - UINT32 InitiatorTaskTag;
> - UINT32 Reserved1;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT8 StatusClass;
> - UINT8 StatusDetail;
> - UINT8 Reserved2[10];
> -} ISCSI_LOGIN_RESPONSE;
> -
> -#define ISCSI_LOGOUT_REASON_CLOSE_SESSION 0
> -#define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION 1
> -#define ISCSI_LOGOUT_REASON_REMOVE_CONNECTION_FOR_RECOVERY
> 2
> -
> -///
> -/// Logout Request
> -///
> -typedef struct _ISCSI_LOGOUT_REQUEST {
> - UINT8 OpCode;
> - UINT8 ReasonCode;
> - UINT16 Reserved1;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT32 Reserved2[2];
> - UINT32 InitiatorTaskTag;
> - UINT16 Cid;
> - UINT16 Reserved3;
> - UINT32 CmdSN;
> - UINT32 ExpStatSN;
> - UINT32 Reserved4[4];
> -} ISCSI_LOGOUT_REQUEST;
> -
> -#define ISCSI_LOGOUT_RESPONSE_SESSION_CLOSED_SUCCESS 0
> -#define ISCSI_LOGOUT_RESPONSE_CID_NOT_FOUND 1
> -#define ISCSI_LOGOUT_RESPONSE_RECOVERY_NOT_SUPPORTED 2
> -#define ISCSI_LOGOUT_RESPONSE_CLEANUP_FAILED 3
> -
> -///
> -/// Logout Response
> -///
> -typedef struct _ISCSI_LOGOUT_RESPONSE {
> - UINT8 OpCode;
> - UINT8 Reserved1;
> - UINT8 Response;
> - UINT8 Reserved2;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT32 Reserved3[2];
> - UINT32 InitiatorTaskTag;
> - UINT32 Reserved4;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT32 Reserved5;
> - UINT16 Time2Wait;
> - UINT16 Time2Retain;
> - UINT32 Reserved6;
> -} ISCSI_LOGOUT_RESPONSE;
> -
> -#define ISCSI_SNACK_REQUEST_TYPE_DATA_OR_R2T 0
> -#define ISCSI_SNACK_REQUEST_TYPE_STATUS 1
> -#define ISCSI_SNACK_REQUEST_TYPE_DATA_ACK 2
> -#define ISCSI_SNACK_REQUEST_TYPE_RDATA 3
> -
> -///
> -/// SNACK Request
> -///
> -typedef struct _ISCSI_SNACK_REQUEST {
> - UINT8 OpCode;
> - UINT8 Type;
> - UINT16 Reserved1;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 TargetTransferTag;
> - UINT32 Reserved2;
> - UINT32 ExpStatSN;
> - UINT32 Reserved[2];
> - UINT32 BegRun;
> - UINT32 RunLength;
> -} ISCSI_SNACK_REQUEST;
> -
> -///
> -/// Reject
> -///
> -typedef struct _ISCSI_REJECT {
> - UINT8 OpCode;
> - UINT8 Reserved1;
> - UINT8 Reason;
> - UINT8 Reserved2;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT32 Reserved3[2];
> - UINT32 InitiatorTaskTag;
> - UINT32 Reserved4;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT32 DataSN;
> - UINT32 Reserved5[2];
> -} ISCSI_REJECT;
> -
> -///
> -/// NOP-Out
> -///
> -typedef struct _ISCSI_NOP_OUT {
> - UINT8 OpCode;
> - UINT8 Reserved1[3];
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 TargetTransferTag;
> - UINT32 CmdSN;
> - UINT32 ExpStatSN;
> - UINT32 Reserved2[4];
> -} ISCSI_NOP_OUT;
> -
> -///
> -/// NOP-In
> -///
> -typedef struct _ISCSI_NOP_IN {
> - UINT8 OpCode;
> - UINT8 Reserved1[3];
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 TargetTransferTag;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT32 Reserved2[3];
> -} ISCSI_NOP_IN;
> -
> -#define ISCSI_SECURITY_NEGOTIATION 0
> -#define ISCSI_LOGIN_OPERATIONAL_NEGOTIATION 1
> -#define ISCSI_FULL_FEATURE_PHASE 3
> -
> -typedef enum {
> - IScsiDigestNone,
> - IScsiDigestCRC32
> -} ISCSI_DIGEST_TYPE;
> -
> -typedef struct _ISCSI_XFER_CONTEXT {
> - UINT32 TargetTransferTag;
> - UINT32 Offset;
> - UINT32 DesiredLength;
> - UINT32 ExpDataSN;
> -} ISCSI_XFER_CONTEXT;
> -
> -typedef struct _ISCSI_IN_BUFFER_CONTEXT {
> - UINT8 *InData;
> - UINT32 InDataLen;
> -} ISCSI_IN_BUFFER_CONTEXT;
> -
> -typedef struct _ISCSI_TCB {
> - LIST_ENTRY Link;
> -
> - BOOLEAN SoFarInOrder;
> - UINT32 ExpDataSN;
> - BOOLEAN FbitReceived;
> - BOOLEAN StatusXferd;
> - UINT32 ActiveR2Ts;
> - UINT32 Response;
> - CHAR8 *Reason;
> - UINT32 InitiatorTaskTag;
> - UINT32 CmdSN;
> - UINT32 SNACKTag;
> -
> - ISCSI_XFER_CONTEXT XferContext;
> -
> - ISCSI_CONNECTION *Conn;
> -} ISCSI_TCB;
> -
> -typedef struct _ISCSI_KEY_VALUE_PAIR {
> - LIST_ENTRY List;
> -
> - CHAR8 *Key;
> - CHAR8 *Value;
> -} ISCSI_KEY_VALUE_PAIR;
> -
> -/**
> - Attach the iSCSI connection to the iSCSI session.
> -
> - @param[in, out] Session The iSCSI session.
> - @param[in, out] Conn The iSCSI connection.
> -**/
> -VOID
> -IScsiAttatchConnection (
> - IN OUT ISCSI_SESSION *Session,
> - IN OUT ISCSI_CONNECTION *Conn
> - );
> -
> -/**
> - Detach the iSCSI connection from the session it belongs to.
> -
> - @param[in, out] Conn The iSCSI connection.
> -**/
> -VOID
> -IScsiDetatchConnection (
> - IN OUT ISCSI_CONNECTION *Conn
> - );
> -
> -/**
> - This function does the iSCSI connection login.
> -
> - @param[in, out] Conn The iSCSI connection to login.
> -
> - @retval EFI_SUCCESS The iSCSI connection is logged into the iSCSI
> target.
> - @retval EFI_TIMEOUT Timeout happened during the login procedure.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConnLogin (
> - IN OUT ISCSI_CONNECTION *Conn
> - );
> -
> -/**
> - Create a TCP connection for the iSCSI session.
> -
> - @param[in] Private The iSCSI driver data.
> - @param[in] Session Maximum CmdSN from the target.
> -
> - @return The newly created iSCSI connection.
> -**/
> -ISCSI_CONNECTION *
> -IScsiCreateConnection (
> - IN ISCSI_DRIVER_DATA *Private,
> - IN ISCSI_SESSION *Session
> - );
> -
> -/**
> - Destroy an iSCSI connection.
> -
> - @param[in] Conn The connection to destroy.
> -**/
> -VOID
> -IScsiDestroyConnection (
> - IN ISCSI_CONNECTION *Conn
> - );
> -
> -/**
> - Login the iSCSI session.
> -
> - @param[in] Private The iSCSI driver data.
> -
> - @retval EFI_SUCCESS The iSCSI session login procedure finished.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NO_MEDIA There was a media error.
> - @retval Others Other errors as indicated.
> -
> -**/
> -EFI_STATUS
> -IScsiSessionLogin (
> - IN ISCSI_DRIVER_DATA *Private
> - );
> -
> -/**
> - Build and send the iSCSI login request to the iSCSI target according to
> - the current login stage.
> -
> - @param[in] Conn The connection in the iSCSI login phase.
> -
> - @retval EFI_SUCCESS The iSCSI login request PDU is built and sent on
> this
> - connection.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_DEVICE_ERROR Some kind of device error happened.
> -**/
> -EFI_STATUS
> -IScsiSendLoginReq (
> - IN ISCSI_CONNECTION *Conn
> - );
> -
> -/**
> - Receive and process the iSCSI login response.
> -
> - @param[in] Conn The connection in the iSCSI login phase.
> -
> - @retval EFI_SUCCESS The iSCSI login response PDU is received and
> processed.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiReceiveLoginRsp (
> - IN ISCSI_CONNECTION *Conn
> - );
> -
> -/**
> - Add an iSCSI key-value pair as a string into the data segment of the Login
> Request PDU.
> - The DataSegmentLength and the actual size of the net buffer containing
> this PDU will be
> - updated.
> -
> - @param[in, out] Pdu The iSCSI PDU whose data segment the key-
> value pair will
> - be added to.
> - @param[in] Key The key name string.
> - @param[in] Value The value string.
> -
> - @retval EFI_SUCCESS The key-valu pair is added to the PDU's
> datasegment and
> - the correspondence length fields are updated.
> - @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to
> add the key-value
> - pair.
> -**/
> -EFI_STATUS
> -IScsiAddKeyValuePair (
> - IN OUT NET_BUF *Pdu,
> - IN CHAR8 *Key,
> - IN CHAR8 *Value
> - );
> -
> -/**
> - Prepare the iSCSI login request to be sent according to the current login
> status.
> -
> - @param[in, out] Conn The connection in the iSCSI login phase.
> -
> - @return The pointer to the net buffer containing the iSCSI login request
> built.
> - @retval Others Other errors as indicated.
> -**/
> -NET_BUF *
> -IScsiPrepareLoginReq (
> - IN OUT ISCSI_CONNECTION *Conn
> - );
> -
> -/**
> - Process the iSCSI Login Response.
> -
> - @param[in, out] Conn The connection on which the iSCSI login response is
> received.
> - @param[in, out] Pdu The iSCSI login response PDU.
> -
> - @retval EFI_SUCCESS The iSCSI login response PDU is processed and all
> check are passed.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error
> happened.
> - @retval EFI_MEDIA_CHANGED Target is redirected.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiProcessLoginRsp (
> - IN OUT ISCSI_CONNECTION *Conn,
> - IN OUT NET_BUF *Pdu
> - );
> -
> -/**
> - Updated the target information according the data received in the iSCSI
> - login response with an target redirection status.
> -
> - @param[in, out] Session The iSCSI session.
> - @param[in] Data The data segment which should contain the
> - TargetAddress key-value list.
> - @param[in] Len Length of the data.
> -
> - @retval EFI_SUCCESS The target address is updated.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NOT_FOUND The TargetAddress key is not found.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiUpdateTargetAddress (
> - IN OUT ISCSI_SESSION *Session,
> - IN CHAR8 *Data,
> - IN UINT32 Len
> - );
> -
> -/**
> - The callback function to free the net buffer list.
> -
> - @param[in] Arg The opaque parameter.
> -**/
> -VOID
> -EFIAPI
> -IScsiFreeNbufList (
> - VOID *Arg
> - );
> -
> -/**
> - Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI
> PDU header and
> - an optional data segment. The two parts will be put into two blocks of
> buffers in the
> - net buffer. The digest check will be conducted in this function if needed
> and the digests
> - will be trimmed from the PDU buffer.
> -
> - @param[in] Conn The iSCSI connection to receive data from.
> - @param[out] Pdu The received iSCSI pdu.
> - @param[in] Context The context used to describe information on the
> caller provided
> - buffer to receive data segment of the iSCSI pdu, it's optional.
> - @param[in] HeaderDigest Whether there will be header digest received.
> - @param[in] DataDigest Whether there will be data digest.
> - @param[in] TimeoutEvent The timeout event, it's optional.
> -
> - @retval EFI_SUCCESS An iSCSI pdu is received.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error
> happened.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiReceivePdu (
> - IN ISCSI_CONNECTION *Conn,
> - OUT NET_BUF **Pdu,
> - IN ISCSI_IN_BUFFER_CONTEXT *Context, OPTIONAL
> - IN BOOLEAN HeaderDigest,
> - IN BOOLEAN DataDigest,
> - IN EFI_EVENT TimeoutEvent OPTIONAL
> - );
> -
> -/**
> - Check and get the result of the prameter negotiation.
> -
> - @param[in, out] Conn The connection in iSCSI login.
> -
> - @retval EFI_SUCCESS The parmeter check is passed and negotiation is
> finished.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error
> happened.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -**/
> -EFI_STATUS
> -IScsiCheckOpParams (
> - IN OUT ISCSI_CONNECTION *Conn
> - );
> -
> -/**
> - Fill the oprational prameters.
> -
> - @param[in] Conn The connection in iSCSI login.
> - @param[in, out] Pdu The iSCSI login request PDU to fill the parameters.
> -
> - @retval EFI_SUCCESS The parmeters are filled into the iSCSI login
> request PDU.
> -**/
> -EFI_STATUS
> -IScsiFillOpParams (
> - IN ISCSI_CONNECTION *Conn,
> - IN OUT NET_BUF *Pdu
> - );
> -
> -/**
> - Pad the iSCSI AHS or data segment to an integer number of 4 byte words.
> -
> - @param[in, out] Pdu The iSCSI pdu which contains segments to pad.
> - @param[in] Len The length of the last semgnet in the PDU.
> -
> - @retval EFI_SUCCESS The segment is padded or no need to pad it.
> - @retval EFI_OUT_OF_RESOURCES There is not enough remaining free
> space to add the
> - padding bytes.
> -**/
> -EFI_STATUS
> -IScsiPadSegment (
> - IN OUT NET_BUF *Pdu,
> - IN UINT32 Len
> - );
> -
> -/**
> - Build a key-value list from the data segment.
> -
> - @param[in] Data The data segment containing the key-value pairs.
> - @param[in] Len Length of the data segment.
> -
> - @return The key-value list.
> - @retval NULL Other errors as indicated.
> -**/
> -LIST_ENTRY *
> -IScsiBuildKeyValueList (
> - IN CHAR8 *Data,
> - IN UINT32 Len
> - );
> -
> -/**
> - Get the value string by the key name from the key-value list. If found,
> - the key-value entry will be removed from the list.
> -
> - @param[in, out] KeyValueList The key-value list.
> - @param[in] Key The key name to find.
> -
> - @return The value string.
> -**/
> -CHAR8 *
> -IScsiGetValueByKeyFromList (
> - IN OUT LIST_ENTRY *KeyValueList,
> - IN CHAR8 *Key
> - );
> -
> -/**
> - Free the key-value list.
> -
> - @param[in] KeyValueList The key-value list.
> -**/
> -VOID
> -IScsiFreeKeyValueList (
> - IN LIST_ENTRY *KeyValueList
> - );
> -
> -/**
> - Normalize the iSCSI name according to RFC.
> -
> - @param[in, out] Name The iSCSI name.
> - @param[in] Len length of the iSCSI name.
> -
> - @retval EFI_SUCCESS The iSCSI name is valid and normalized.
> - @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in
> the IQN format.
> -**/
> -EFI_STATUS
> -IScsiNormalizeName (
> - IN OUT CHAR8 *Name,
> - IN UINTN Len
> - );
> -
> -/**
> - Execute the SCSI command issued through the EXT SCSI PASS THRU
> protocol.
> -
> - @param[in] PassThru The EXT SCSI PASS THRU protocol.
> - @param[in] Target The target ID.
> - @param[in] Lun The LUN.
> - @param[in, out] Packet The request packet containing IO request, SCSI
> command
> - buffer and buffers to read/write.
> -
> - @retval EFI_SUCCES The SCSI command is executed and the result is
> updated to
> - the Packet.
> - @retval EFI_DEVICE_ERROR Session state was not as required.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NOT_READY The target can not accept new commands.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiExecuteScsiCommand (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru,
> - IN UINT8 *Target,
> - IN UINT64 Lun,
> - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
> - );
> -
> -/**
> - Reinstate the session on some error.
> -
> - @param[in, out] Private The iSCSI driver data.
> -
> - @retval EFI_SUCCES The session is reinstated from some error.
> - @retval Other Reinstatement failed.
> -**/
> -EFI_STATUS
> -IScsiSessionReinstatement (
> - IN OUT ISCSI_DRIVER_DATA *Private
> - );
> -
> -/**
> - Initialize some session parameters before login.
> -
> - @param[in, out] Session The iSCSI session.
> - @param[in] Recovery Whether the request is from a fresh new start or
> recovery.
> -**/
> -VOID
> -IScsiSessionInit (
> - IN OUT ISCSI_SESSION *Session,
> - IN BOOLEAN Recovery
> - );
> -
> -/**
> - Abort the iSCSI session, that is, reset all the connection and free the
> - resources.
> -
> - @param[in, out] Session The iSCSI session.
> -
> - @retval EFI_SUCCES The session is aborted.
> -**/
> -EFI_STATUS
> -IScsiSessionAbort (
> - IN OUT ISCSI_SESSION *Session
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h
> deleted file mode 100644
> index 9e0f1e0f02c2..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h
> +++ /dev/null
> @@ -1,142 +0,0 @@
> -/** @file
> - iSCSI Tcp4 IO related definitions.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _ISCSI_TCP4_IO_H_
> -#define _ISCSI_TCP4_IO_H_
> -
> -#include <Library/NetLib.h>
> -#include <Protocol/Tcp4.h>
> -
> -typedef struct _TCP4_IO_CONFIG_DATA {
> - EFI_IPv4_ADDRESS LocalIp;
> - EFI_IPv4_ADDRESS SubnetMask;
> - EFI_IPv4_ADDRESS Gateway;
> -
> - EFI_IPv4_ADDRESS RemoteIp;
> - UINT16 RemotePort;
> -} TCP4_IO_CONFIG_DATA;
> -
> -typedef struct _TCP4_IO {
> - EFI_HANDLE Image;
> - EFI_HANDLE Controller;
> -
> - EFI_HANDLE Handle;
> - EFI_TCP4_PROTOCOL *Tcp4;
> -
> - EFI_TCP4_CONNECTION_TOKEN ConnToken;
> - EFI_TCP4_IO_TOKEN TxToken;
> - EFI_TCP4_IO_TOKEN RxToken;
> - EFI_TCP4_CLOSE_TOKEN CloseToken;
> -
> - BOOLEAN IsConnDone;
> - BOOLEAN IsTxDone;
> - BOOLEAN IsRxDone;
> - BOOLEAN IsCloseDone;
> -} TCP4_IO;
> -
> -/**
> - Create a TCP socket with the specified configuration data.
> -
> - @param[in] Image The handle of the driver image.
> - @param[in] Controller The handle of the controller.
> - @param[in] ConfigData The Tcp4 configuration data.
> - @param[in] Tcp4Io The Tcp4Io.
> -
> - @retval EFI_SUCCESS The TCP socket is created and configured.
> - @retval Others Failed to create the TCP socket or configure it.
> -**/
> -EFI_STATUS
> -Tcp4IoCreateSocket (
> - IN EFI_HANDLE Image,
> - IN EFI_HANDLE Controller,
> - IN TCP4_IO_CONFIG_DATA *ConfigData,
> - IN TCP4_IO *Tcp4Io
> - );
> -
> -/**
> - Destroy the socket.
> -
> - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyeds.
> -**/
> -VOID
> -Tcp4IoDestroySocket (
> - IN TCP4_IO *Tcp4Io
> - );
> -
> -/**
> - Connect to the other endpoint of the TCP socket.
> -
> - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket.
> - @param[in] Timeout The time to wait for connection done.
> -
> - @retval EFI_SUCCESS Connect to the other endpoint of the TCP socket
> successfully.
> - @retval EFI_TIMEOUT Failed to connect to the other endpoint of the
> TCP socket in the specified time period.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoConnect (
> - IN OUT TCP4_IO *Tcp4Io,
> - IN EFI_EVENT Timeout
> - );
> -
> -/**
> - Reset the socket.
> -
> - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket.
> -**/
> -VOID
> -Tcp4IoReset (
> - IN OUT TCP4_IO *Tcp4Io
> - );
> -
> -/**
> - Transmit the Packet to the other endpoint of the socket.
> -
> - @param[in] Tcp4Io The Tcp4Io wrapping the TCP socket.
> - @param[in] Packet The packet to transmit.
> -
> - @retval EFI_SUCCESS The packet is trasmitted.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoTransmit (
> - IN TCP4_IO *Tcp4Io,
> - IN NET_BUF *Packet
> - );
> -
> -/**
> - Receive data from the socket.
> -
> - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be
> destroyed.
> - @param[in] Packet The buffer to hold the data copy from the soket rx
> buffer.
> - @param[in] AsyncMode Is this receive asyncronous or not.
> - @param[in] Timeout The time to wait for receiving the amount of data
> the Packet
> - can hold.
> -
> - @retval EFI_SUCCESS The required amount of data is received from
> the socket.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate momery.
> - @retval EFI_TIMEOUT Failed to receive the required amount of data in
> the
> - specified time period.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoReceive (
> - IN TCP4_IO *Tcp4Io,
> - IN NET_BUF *Packet,
> - IN BOOLEAN AsyncMode,
> - IN EFI_EVENT Timeout
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h
> deleted file mode 100644
> index 1541b2d8ece1..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h
> +++ /dev/null
> @@ -1,80 +0,0 @@
> -/** @file
> - Header file for Md5.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _MD5_H_
> -#define _MD5_H_
> -
> -#include <Uefi.h>
> -#include <Library/BaseLib.h>
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/NetLib.h>
> -
> -#define MD5_HASHSIZE 16
> -
> -typedef struct _MD5_CTX {
> - EFI_STATUS Status;
> - UINT64 Length;
> - UINT32 States[MD5_HASHSIZE / sizeof (UINT32)];
> - UINT8 M[64];
> - UINTN Count;
> -} MD5_CTX;
> -
> -/**
> - Initialize four 32-bits chaining variables and use them to do the Md5
> transform.
> -
> - @param[out] Md5Ctx The data structure of Md5.
> -
> - @retval EFI_SUCCESS Initialization is ok.
> -**/
> -EFI_STATUS
> -MD5Init (
> - OUT MD5_CTX *Md5Ctx
> - );
> -
> -/**
> - the external interface of Md5 algorithm
> -
> - @param[in, out] Md5Ctx The data structure of storing the original data
> - segment and the final result.
> - @param[in] Data The data wanted to be transformed.
> - @param[in] DataLen The length of data.
> -
> - @retval EFI_SUCCESS The transform is ok.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -MD5Update (
> - IN OUT MD5_CTX *Md5Ctx,
> - IN VOID *Data,
> - IN UINTN DataLen
> - );
> -
> -/**
> - Accumulate the MD5 value of every data segment and generate the finial
> - result according to MD5 algorithm.
> -
> - @param[in, out] Md5Ctx The data structure of storing the original data
> - segment and the final result.
> - @param[out] HashVal The final 128-bits output.
> -
> - @retval EFI_SUCCESS The transform is ok.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -MD5Final (
> - IN OUT MD5_CTX *Md5Ctx,
> - OUT UINT8 *HashVal
> - );
> -
> -#endif
> --
> 2.19.1.windows.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 3/6] MdeModulePkg: Delete IScsiDxe in MdeModulePkg.
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
1 sibling, 0 replies; 12+ messages in thread
From: Wang, Jian J @ 2018-12-20 4:43 UTC (permalink / raw)
To: Fu, Siyuan, edk2-devel@lists.01.org
Cc: Wu, Hao A, Ni, Ruiyu, Zeng, Star, Wu, Jiaxin
Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
> -----Original Message-----
> From: Fu, Siyuan
> Sent: Thursday, December 20, 2018 9:41 AM
> To: edk2-devel@lists.01.org
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A <hao.a.wu@intel.com>;
> Ni, Ruiyu <ruiyu.ni@intel.com>; Zeng, Star <star.zeng@intel.com>; Wu, Jiaxin
> <jiaxin.wu@intel.com>
> Subject: [PATCH v2 3/6] MdeModulePkg: Delete IScsiDxe in MdeModulePkg.
>
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1278
>
> This patch is to delete the IScsiDxe driver in MdeModulePkg. The driver
> will not be maintained and can't co-work with the dual-stack IScsiDxe in
> NetworkPkg.
>
> People should use below NetworkPkg drivers instead:
> NetworkPkg/IScsiDxe/IScsiDxe.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/IScsiDxe/ComponentName.c | 283 --
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c | 430 ---
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c | 1264 --------
> -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c | 472 ----
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c | 676 -----
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c | 412 ---
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c | 539 ----
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c | 116 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c | 948 -------
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c | 2799 ---------
> -----------
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c | 487 ----
> MdeModulePkg/Universal/Network/IScsiDxe/Md5.c | 350 ---
> MdeModulePkg/MdeModulePkg.dsc | 1 -
> MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h | 165 --
> MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni | 25 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni | 20 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h | 106 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h | 22 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h | 166 --
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr | 219 --
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni | 62 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h | 109 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h | 55 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h | 140 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf | 134 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h | 22 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h | 38 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h | 168 --
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h | 74 -
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h | 317 ---
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h | 1005 -------
> MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h | 142 -
> MdeModulePkg/Universal/Network/IScsiDxe/Md5.h | 80 -
> 33 files changed, 11846 deletions(-)
>
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c
> deleted file mode 100644
> index 3f561e93439d..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.c
> +++ /dev/null
> @@ -1,283 +0,0 @@
> -/** @file
> - UEFI Component Name(2) protocol implementation for iSCSI.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -//
> -// EFI Component Name Protocol
> -//
> -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL
> gIScsiComponentName = {
> - IScsiComponentNameGetDriverName,
> - IScsiComponentNameGetControllerName,
> - "eng"
> -};
> -
> -//
> -// EFI Component Name 2 Protocol
> -//
> -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL
> gIScsiComponentName2 = {
> - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)
> IScsiComponentNameGetDriverName,
> - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)
> IScsiComponentNameGetControllerName,
> - "en"
> -};
> -
> -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE
> mIScsiDriverNameTable[] = {
> - {"eng;en", L"iSCSI Driver"},
> - {NULL, NULL}
> -};
> -
> -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE
> *mIScsiControllerNameTable = NULL;
> -
> -/**
> - Retrieves a Unicode string that is the user readable name of the EFI 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_NAME_PROTOCOL
> instance.
> - @param[in] Language A pointer to a three character ISO 639-2 language
> identifier.
> - This is the language of the driver name that 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.
> - @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
> -IScsiComponentNameGetDriverName (
> - IN EFI_COMPONENT_NAME_PROTOCOL *This,
> - IN CHAR8 *Language,
> - OUT CHAR16 **DriverName
> - )
> -{
> - return LookupUnicodeString2 (
> - Language,
> - This->SupportedLanguages,
> - mIScsiDriverNameTable,
> - DriverName,
> - (BOOLEAN)(This == &gIScsiComponentName)
> - );
> -}
> -
> -/**
> - Update the component name for the iSCSI instance.
> -
> - @param[in] IScsiExtScsiPassThru A pointer to the
> EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
> -
> - @retval EFI_SUCCESS Update the ControllerNameTable of this
> instance successfully.
> - @retval EFI_INVALID_PARAMETER The input parameter is invalid.
> - @retval EFI_UNSUPPORTED Can't get the corresponding NIC info from
> the Controller handle.
> -
> -**/
> -EFI_STATUS
> -UpdateName (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru
> - )
> -{
> - EFI_STATUS Status;
> - CHAR16 HandleName[150];
> - ISCSI_DRIVER_DATA *Private;
> - EFI_MAC_ADDRESS MacAddress;
> - UINTN HwAddressSize;
> - UINT16 VlanId;
> - CHAR16 MacString[70];
> -
> - if (IScsiExtScsiPassThru == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU
> (IScsiExtScsiPassThru);
> -
> - //
> - // Get the mac string, it's the name of various variable
> - //
> - Status = NetLibGetMacAddress (Private->Controller, &MacAddress,
> &HwAddressSize);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> - VlanId = NetLibGetVlanId (Private->Controller);
> - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId,
> MacString);
> -
> - UnicodeSPrint (
> - HandleName,
> - sizeof (HandleName),
> - L"iSCSI IPv4 (MacString=%s)",
> - MacString
> - );
> -
> - if (mIScsiControllerNameTable != NULL) {
> - FreeUnicodeStringTable (mIScsiControllerNameTable);
> - mIScsiControllerNameTable = NULL;
> - }
> -
> - Status = AddUnicodeString2 (
> - "eng",
> - gIScsiComponentName.SupportedLanguages,
> - &mIScsiControllerNameTable,
> - HandleName,
> - TRUE
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - return AddUnicodeString2 (
> - "en",
> - gIScsiComponentName2.SupportedLanguages,
> - &mIScsiControllerNameTable,
> - HandleName,
> - FALSE
> - );
> -}
> -
> -/**
> - Retrieves a Unicode string that is the user readable name of the controller
> - that is being managed by an EFI Driver.Currently not implemented.
> -
> - @param[in] This A pointer to the 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 three character ISO 639-2 language
> - identifier. This is the language of the controller name
> - that 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.
> - @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
> -IScsiComponentNameGetControllerName (
> - 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_HANDLE IScsiController;
> - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
> -
> - EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru;
> -
> - if (ControllerHandle == NULL) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - //
> - // Get the handle of the controller we are controling.
> - //
> - IScsiController = NetLibGetNicHandle (ControllerHandle,
> &gEfiTcp4ProtocolGuid);
> - if (IScsiController == NULL) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - Status = gBS->OpenProtocol (
> - IScsiController,
> - &gEfiCallerIdGuid,
> - (VOID **)&IScsiIdentifier,
> - NULL,
> - NULL,
> - EFI_OPEN_PROTOCOL_GET_PROTOCOL
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - if (ChildHandle != NULL) {
> - //
> - // Make sure this driver produced ChildHandle
> - //
> - Status = EfiTestChildHandle (
> - ControllerHandle,
> - ChildHandle,
> - &gEfiTcp4ProtocolGuid
> - );
> - if (!EFI_ERROR (Status)) {
> - //
> - // Retrieve an instance of a produced protocol from ChildHandle
> - //
> - Status = gBS->OpenProtocol (
> - ChildHandle,
> - &gEfiExtScsiPassThruProtocolGuid,
> - (VOID **)&IScsiExtScsiPassThru,
> - NULL,
> - NULL,
> - EFI_OPEN_PROTOCOL_GET_PROTOCOL
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - //
> - // Update the component name for this child handle.
> - //
> - Status = UpdateName (IScsiExtScsiPassThru);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> - } else {
> - return Status;
> - }
> - }
> -
> - return LookupUnicodeString2 (
> - Language,
> - This->SupportedLanguages,
> - mIScsiControllerNameTable,
> - ControllerName,
> - (BOOLEAN)(This == &gIScsiComponentName)
> - );
> -}
> -
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c
> deleted file mode 100644
> index 6307684ff05b..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.c
> +++ /dev/null
> @@ -1,430 +0,0 @@
> -/** @file
> - This file is for Challenge-Handshake Authentication Protocol (CHAP)
> Configuration.
> -
> -Copyright (c) 2004 - 2015, 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -#include "Md5.h"
> -
> -/**
> - Initator calculates its own expected hash value.
> -
> - @param[in] ChapIdentifier iSCSI CHAP identifier sent by authenticator.
> - @param[in] ChapSecret iSCSI CHAP secret of the authenticator.
> - @param[in] SecretLength The length of iSCSI CHAP secret.
> - @param[in] ChapChallenge The challenge message sent by authenticator.
> - @param[in] ChallengeLength The length of iSCSI CHAP challenge message.
> - @param[out] ChapResponse The calculation of the expected hash value.
> -
> - @retval EFI_SUCCESS The expected hash value was calculatedly
> successfully.
> - @retval EFI_PROTOCOL_ERROR The length of the secret should be at least
> the
> - length of the hash value for the hashing algorithm chosen.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiCHAPCalculateResponse (
> - IN UINT32 ChapIdentifier,
> - IN CHAR8 *ChapSecret,
> - IN UINT32 SecretLength,
> - IN UINT8 *ChapChallenge,
> - IN UINT32 ChallengeLength,
> - OUT UINT8 *ChapResponse
> - )
> -{
> - MD5_CTX Md5Ctx;
> - CHAR8 IdByte[1];
> - EFI_STATUS Status;
> -
> - Status = MD5Init (&Md5Ctx);
> -
> - //
> - // Hash Identifier - Only calculate 1 byte data (RFC1994)
> - //
> - IdByte[0] = (CHAR8) ChapIdentifier;
> - MD5Update (&Md5Ctx, IdByte, 1);
> -
> - //
> - // Hash Secret
> - //
> - if (SecretLength < ISCSI_CHAP_SECRET_MIN_LEN - 1) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - MD5Update (&Md5Ctx, ChapSecret, SecretLength);
> -
> - //
> - // Hash Challenge received from Target
> - //
> - MD5Update (&Md5Ctx, ChapChallenge, ChallengeLength);
> -
> - Status = MD5Final (&Md5Ctx, ChapResponse);
> -
> - return Status;
> -}
> -
> -/**
> - The initator checks the CHAP response replied by target against its own
> - calculation of the expected hash value.
> -
> - @param[in] AuthData iSCSI CHAP authentication data.
> - @param[in] TargetResponse The response from target.
> -
> - @retval EFI_SUCCESS The response from target passed authentication.
> - @retval EFI_SECURITY_VIOLATION The response from target was not
> expected value.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiCHAPAuthTarget (
> - IN ISCSI_CHAP_AUTH_DATA *AuthData,
> - IN UINT8 *TargetResponse
> - )
> -{
> - EFI_STATUS Status;
> - UINT32 SecretSize;
> - UINT8 VerifyRsp[ISCSI_CHAP_RSP_LEN];
> -
> - Status = EFI_SUCCESS;
> -
> - SecretSize = (UINT32) AsciiStrLen (AuthData->AuthConfig.ReverseCHAPSecret);
> - Status = IScsiCHAPCalculateResponse (
> - AuthData->OutIdentifier,
> - AuthData->AuthConfig.ReverseCHAPSecret,
> - SecretSize,
> - AuthData->OutChallenge,
> - AuthData->OutChallengeLength,
> - VerifyRsp
> - );
> -
> - if (CompareMem (VerifyRsp, TargetResponse, ISCSI_CHAP_RSP_LEN) != 0) {
> - Status = EFI_SECURITY_VIOLATION;
> - }
> -
> - return Status;
> -}
> -
> -/**
> - This function checks the received iSCSI Login Response during the security
> - negotiation stage.
> -
> - @param[in] Conn The iSCSI connection.
> -
> - @retval EFI_SUCCESS The Login Response passed the CHAP validation.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiCHAPOnRspReceived (
> - IN ISCSI_CONNECTION *Conn
> - )
> -{
> - EFI_STATUS Status;
> - ISCSI_SESSION *Session;
> - ISCSI_CHAP_AUTH_DATA *AuthData;
> - CHAR8 *Value;
> - UINT8 *Data;
> - UINT32 Len;
> - LIST_ENTRY *KeyValueList;
> - UINTN Algorithm;
> - CHAR8 *Identifier;
> - CHAR8 *Challenge;
> - CHAR8 *Name;
> - CHAR8 *Response;
> - UINT8 TargetRsp[ISCSI_CHAP_RSP_LEN];
> - UINT32 RspLen;
> -
> - ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION);
> - ASSERT (Conn->RspQue.BufNum != 0);
> -
> - Session = Conn->Session;
> - AuthData = &Session->AuthData;
> -
> - Len = Conn->RspQue.BufSize;
> - Data = AllocatePool (Len);
> - if (Data == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> - //
> - // Copy the data in case the data spans over multiple PDUs.
> - //
> - NetbufQueCopy (&Conn->RspQue, 0, Len, Data);
> -
> - //
> - // Build the key-value list from the data segment of the Login Response.
> - //
> - KeyValueList = IScsiBuildKeyValueList ((CHAR8 *) Data, Len);
> - if (KeyValueList == NULL) {
> - FreePool (Data);
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Status = EFI_PROTOCOL_ERROR;
> -
> - switch (Conn->CHAPStep) {
> - case ISCSI_CHAP_INITIAL:
> - //
> - // The first Login Response.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_TARGET_PORTAL_GROUP_TAG);
> - if (Value == NULL) {
> - goto ON_EXIT;
> - }
> -
> - Session->TargetPortalGroupTag = (UINT16) AsciiStrDecimalToUintn (Value);
> -
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_AUTH_METHOD);
> - if (Value == NULL) {
> - goto ON_EXIT;
> - }
> - //
> - // Initiator mandates CHAP authentication but target replies without "CHAP"
> or
> - // initiator suggets "None" but target replies with some kind of auth method.
> - //
> - if (AsciiStrCmp (Value, ISCSI_AUTH_METHOD_CHAP) == 0) {
> - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) {
> - goto ON_EXIT;
> - }
> - } else {
> - if (AuthData->AuthConfig.CHAPType != ISCSI_CHAP_NONE) {
> - goto ON_EXIT;
> - }
> - }
> - //
> - // Transit to CHAP step one.
> - //
> - Conn->CHAPStep = ISCSI_CHAP_STEP_ONE;
> - Status = EFI_SUCCESS;
> - break;
> -
> - case ISCSI_CHAP_STEP_TWO:
> - //
> - // The Target replies with CHAP_A=<A> CHAP_I=<I> CHAP_C=<C>
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_CHAP_ALGORITHM);
> - if (Value == NULL) {
> - goto ON_EXIT;
> - }
> -
> - Algorithm = AsciiStrDecimalToUintn (Value);
> - if (Algorithm != ISCSI_CHAP_ALGORITHM_MD5) {
> - //
> - // Unsupported algorithm is chosen by target.
> - //
> - goto ON_EXIT;
> - }
> -
> - Identifier = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_CHAP_IDENTIFIER);
> - if (Identifier == NULL) {
> - goto ON_EXIT;
> - }
> -
> - Challenge = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_CHAP_CHALLENGE);
> - if (Challenge == NULL) {
> - goto ON_EXIT;
> - }
> - //
> - // Process the CHAP identifier and CHAP Challenge from Target
> - // Calculate Response value
> - //
> - AuthData->InIdentifier = (UINT32) AsciiStrDecimalToUintn (Identifier);
> - AuthData->InChallengeLength = ISCSI_CHAP_AUTH_MAX_LEN;
> - IScsiHexToBin ((UINT8 *) AuthData->InChallenge, &AuthData-
> >InChallengeLength, Challenge);
> - Status = IScsiCHAPCalculateResponse (
> - AuthData->InIdentifier,
> - AuthData->AuthConfig.CHAPSecret,
> - (UINT32) AsciiStrLen (AuthData->AuthConfig.CHAPSecret),
> - AuthData->InChallenge,
> - AuthData->InChallengeLength,
> - AuthData->CHAPResponse
> - );
> -
> - //
> - // Transit to next step.
> - //
> - Conn->CHAPStep = ISCSI_CHAP_STEP_THREE;
> - break;
> -
> - case ISCSI_CHAP_STEP_THREE:
> - //
> - // one way CHAP authentication and the target would like to
> - // authenticate us.
> - //
> - Status = EFI_SUCCESS;
> - break;
> -
> - case ISCSI_CHAP_STEP_FOUR:
> - ASSERT (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL);
> - //
> - // The forth step, CHAP_N=<N> CHAP_R=<R> is received from Target.
> - //
> - Name = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_NAME);
> - if (Name == NULL) {
> - goto ON_EXIT;
> - }
> -
> - Response = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_CHAP_RESPONSE);
> - if (Response == NULL) {
> - goto ON_EXIT;
> - }
> -
> - RspLen = ISCSI_CHAP_RSP_LEN;
> - IScsiHexToBin (TargetRsp, &RspLen, Response);
> -
> - //
> - // Check the CHAP Response replied by Target.
> - //
> - Status = IScsiCHAPAuthTarget (AuthData, TargetRsp);
> - break;
> -
> - default:
> - break;
> - }
> -
> -ON_EXIT:
> -
> - IScsiFreeKeyValueList (KeyValueList);
> -
> - FreePool (Data);
> -
> - return Status;
> -}
> -
> -/**
> - This function fills the CHAP authentication information into the login PDU
> - during the security negotiation stage in the iSCSI connection login.
> -
> - @param[in] Conn The iSCSI connection.
> - @param[in, out] Pdu The PDU to send out.
> -
> - @retval EFI_SUCCESS All check passed and the phase-related CHAP
> - authentication info is filled into the iSCSI PDU.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend.
> -**/
> -EFI_STATUS
> -IScsiCHAPToSendReq (
> - IN ISCSI_CONNECTION *Conn,
> - IN OUT NET_BUF *Pdu
> - )
> -{
> - EFI_STATUS Status;
> - ISCSI_SESSION *Session;
> - ISCSI_LOGIN_REQUEST *LoginReq;
> - ISCSI_CHAP_AUTH_DATA *AuthData;
> - CHAR8 *Value;
> - CHAR8 ValueStr[256];
> - CHAR8 *Response;
> - UINT32 RspLen;
> - CHAR8 *Challenge;
> - UINT32 ChallengeLen;
> -
> - ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION);
> -
> - Session = Conn->Session;
> - AuthData = &Session->AuthData;
> - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, 0);
> - if (LoginReq == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> - Status = EFI_SUCCESS;
> -
> - RspLen = 2 * ISCSI_CHAP_RSP_LEN + 3;
> - Response = AllocatePool (RspLen);
> - if (Response == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - ChallengeLen = 2 * ISCSI_CHAP_RSP_LEN + 3;
> - Challenge = AllocatePool (ChallengeLen);
> - if (Challenge == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - switch (Conn->CHAPStep) {
> - case ISCSI_CHAP_INITIAL:
> - //
> - // It's the initial Login Request. Fill in the key=value pairs mandatory
> - // for the initial Login Request.
> - //
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIATOR_NAME, Session-
> >InitiatorName);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_SESSION_TYPE, "Normal");
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_TARGET_NAME, Session-
> >ConfigData.NvData.TargetName);
> -
> - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_NONE) {
> - Value = ISCSI_KEY_VALUE_NONE;
> - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
> - } else {
> - Value = ISCSI_AUTH_METHOD_CHAP;
> - }
> -
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_AUTH_METHOD, Value);
> -
> - break;
> -
> - case ISCSI_CHAP_STEP_ONE:
> - //
> - // First step, send the Login Request with CHAP_A=<A1,A2...> key-value pair.
> - //
> - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", ISCSI_CHAP_ALGORITHM_MD5);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_ALGORITHM, ValueStr);
> -
> - Conn->CHAPStep = ISCSI_CHAP_STEP_TWO;
> - break;
> -
> - case ISCSI_CHAP_STEP_THREE:
> - //
> - // Third step, send the Login Request with CHAP_N=<N> CHAP_R=<R> or
> - // CHAP_N=<N> CHAP_R=<R> CHAP_I=<I> CHAP_C=<C> if target
> ahtentication is
> - // required too.
> - //
> - // CHAP_N=<N>
> - //
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_NAME, (CHAR8 *) &AuthData-
> >AuthConfig.CHAPName);
> - //
> - // CHAP_R=<R>
> - //
> - IScsiBinToHex ((UINT8 *) AuthData->CHAPResponse, ISCSI_CHAP_RSP_LEN,
> Response, &RspLen);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_RESPONSE, Response);
> -
> - if (AuthData->AuthConfig.CHAPType == ISCSI_CHAP_MUTUAL) {
> - //
> - // CHAP_I=<I>
> - //
> - IScsiGenRandom ((UINT8 *) &AuthData->OutIdentifier, 1);
> - AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData->OutIdentifier);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr);
> - //
> - // CHAP_C=<C>
> - //
> - IScsiGenRandom ((UINT8 *) AuthData->OutChallenge,
> ISCSI_CHAP_RSP_LEN);
> - AuthData->OutChallengeLength = ISCSI_CHAP_RSP_LEN;
> - IScsiBinToHex ((UINT8 *) AuthData->OutChallenge, ISCSI_CHAP_RSP_LEN,
> Challenge, &ChallengeLen);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_CHALLENGE, Challenge);
> -
> - Conn->CHAPStep = ISCSI_CHAP_STEP_FOUR;
> - }
> - //
> - // set the stage transition flag.
> - //
> - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
> - break;
> -
> - default:
> - Status = EFI_PROTOCOL_ERROR;
> - break;
> - }
> -
> - FreePool (Response);
> - FreePool (Challenge);
> -
> - return Status;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
> deleted file mode 100644
> index cb1eff1b690c..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.c
> +++ /dev/null
> @@ -1,1264 +0,0 @@
> -/** @file
> - Helper functions for configuring or getting the parameters relating to iSCSI.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -CHAR16 mVendorStorageName[] = L"ISCSI_CONFIG_IFR_NVDATA";
> -BOOLEAN mIScsiDeviceListUpdated = FALSE;
> -UINTN mNumberOfIScsiDevices = 0;
> -ISCSI_FORM_CALLBACK_INFO *mCallbackInfo = NULL;
> -
> -LIST_ENTRY mIScsiConfigFormList = {
> - &mIScsiConfigFormList,
> - &mIScsiConfigFormList
> -};
> -
> -HII_VENDOR_DEVICE_PATH mIScsiHiiVendorDevicePath = {
> - {
> - {
> - HARDWARE_DEVICE_PATH,
> - HW_VENDOR_DP,
> - {
> - (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
> - (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
> - }
> - },
> - IP4_ISCSI_CONFIG_GUID
> - },
> - {
> - END_DEVICE_PATH_TYPE,
> - END_ENTIRE_DEVICE_PATH_SUBTYPE,
> - {
> - (UINT8) (END_DEVICE_PATH_LENGTH),
> - (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
> - }
> - }
> -};
> -
> -/**
> - Convert the IPv4 address into a dotted string.
> -
> - @param[in] Ip The IPv4 address.
> - @param[out] Str The dotted IP string.
> -**/
> -VOID
> -IScsiIpToStr (
> - IN EFI_IPv4_ADDRESS *Ip,
> - OUT CHAR16 *Str
> - )
> -{
> - UnicodeSPrint ( Str, 2 * IP4_STR_MAX_SIZE, L"%d.%d.%d.%d", Ip->Addr[0], Ip-
> >Addr[1], Ip->Addr[2], Ip->Addr[3]);
> -}
> -
> -
> -/**
> - Parse IsId in string format and convert it to binary.
> -
> - @param[in] String The buffer of the string to be parsed.
> - @param[in, out] IsId The buffer to store IsId.
> -
> - @retval EFI_SUCCESS The operation finished successfully.
> - @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
> -
> -**/
> -EFI_STATUS
> -IScsiParseIsIdFromString (
> - IN CONST CHAR16 *String,
> - IN OUT UINT8 *IsId
> - )
> -{
> - UINT8 Index;
> - CHAR16 *IsIdStr;
> - CHAR16 TempStr[3];
> - UINTN NodeVal;
> - CHAR16 PortString[ISCSI_NAME_IFR_MAX_SIZE];
> - EFI_INPUT_KEY Key;
> -
> - if ((String == NULL) || (IsId == NULL)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - IsIdStr = (CHAR16 *) String;
> -
> - if (StrLen (IsIdStr) != 6) {
> - UnicodeSPrint (
> - PortString,
> - (UINTN) sizeof (PortString),
> - L"Error! Input is incorrect, please input 6 hex numbers!\n"
> - );
> -
> - CreatePopUp (
> - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
> - &Key,
> - PortString,
> - NULL
> - );
> -
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - for (Index = 3; Index < 6; Index++) {
> - CopyMem (TempStr, IsIdStr, sizeof (TempStr));
> - TempStr[2] = L'\0';
> -
> - //
> - // Convert the string to IsId. StrHexToUintn stops at the first character
> - // that is not a valid hex character, '\0' here.
> - //
> - NodeVal = StrHexToUintn (TempStr);
> -
> - IsId[Index] = (UINT8) NodeVal;
> -
> - IsIdStr = IsIdStr + 2;
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Convert IsId from binary to string format.
> -
> - @param[out] String The buffer to store the converted string.
> - @param[in] IsId The buffer to store IsId.
> -
> - @retval EFI_SUCCESS The string converted successfully.
> - @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
> -
> -**/
> -EFI_STATUS
> -IScsiConvertIsIdToString (
> - OUT CHAR16 *String,
> - IN UINT8 *IsId
> - )
> -{
> - UINT8 Index;
> - UINTN Number;
> -
> - if ((String == NULL) || (IsId == NULL)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - for (Index = 0; Index < 6; Index++) {
> - if (IsId[Index] <= 0xF) {
> - Number = UnicodeSPrint (
> - String,
> - 2 * ISID_CONFIGURABLE_STORAGE,
> - L"0%X",
> - (UINTN) IsId[Index]
> - );
> - } else {
> - Number = UnicodeSPrint (
> - String,
> - 2 * ISID_CONFIGURABLE_STORAGE,
> - L"%X",
> - (UINTN) IsId[Index]
> - );
> -
> - }
> -
> - String = String + Number;
> - }
> -
> - *String = L'\0';
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -/**
> - Update the list of iSCSI devices the iSCSI driver is controlling.
> -
> - @retval EFI_SUCCESS The callback successfully handled the action.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiUpdateDeviceList (
> - VOID
> - )
> -{
> - EFI_STATUS Status;
> - ISCSI_DEVICE_LIST *DeviceList;
> - UINTN DataSize;
> - UINTN NumHandles;
> - EFI_HANDLE *Handles;
> - UINTN HandleIndex;
> - UINTN Index;
> - UINTN LastDeviceIndex;
> - EFI_MAC_ADDRESS MacAddress;
> - UINTN HwAddressSize;
> - UINT16 VlanId;
> - ISCSI_MAC_INFO *CurMacInfo;
> - ISCSI_MAC_INFO TempMacInfo;
> - CHAR16 MacString[70];
> - UINTN DeviceListSize;
> -
> - //
> - // Dump all the handles the Managed Network Service Binding Protocol is
> installed on.
> - //
> - Status = gBS->LocateHandleBuffer (
> - ByProtocol,
> - &gEfiManagedNetworkServiceBindingProtocolGuid,
> - NULL,
> - &NumHandles,
> - &Handles
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - DataSize = 0;
> - Status = gRT->GetVariable (
> - L"iSCSIDeviceList",
> - &gIp4IScsiConfigGuid,
> - NULL,
> - &DataSize,
> - NULL
> - );
> - if (Status == EFI_BUFFER_TOO_SMALL) {
> - DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DataSize);
> - ASSERT (DeviceList != NULL);
> -
> - gRT->GetVariable (
> - L"iSCSIDeviceList",
> - &gIp4IScsiConfigGuid,
> - NULL,
> - &DataSize,
> - DeviceList
> - );
> -
> - LastDeviceIndex = 0;
> -
> - for (HandleIndex = 0; HandleIndex < NumHandles; HandleIndex++) {
> - Status = NetLibGetMacAddress (Handles[HandleIndex], &MacAddress,
> &HwAddressSize);
> - ASSERT (Status == EFI_SUCCESS);
> - VlanId = NetLibGetVlanId (Handles[HandleIndex]);
> -
> - for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; Index++) {
> - CurMacInfo = &DeviceList->MacInfo[Index];
> - if ((CurMacInfo->Len == HwAddressSize) &&
> - (CurMacInfo->VlanId == VlanId) &&
> - (NET_MAC_EQUAL (&CurMacInfo->Mac, MacAddress.Addr,
> HwAddressSize))
> - ) {
> - //
> - // The previous configured NIC is still here.
> - //
> - if (Index != LastDeviceIndex) {
> - //
> - // Swap the current MAC address entry with the one indexed by
> - // LastDeviceIndex.
> - //
> - CopyMem (&TempMacInfo, CurMacInfo, sizeof (ISCSI_MAC_INFO));
> - CopyMem (CurMacInfo, &DeviceList->MacInfo[LastDeviceIndex], sizeof
> (ISCSI_MAC_INFO));
> - CopyMem (&DeviceList->MacInfo[LastDeviceIndex], &TempMacInfo,
> sizeof (ISCSI_MAC_INFO));
> - }
> -
> - LastDeviceIndex++;
> - }
> - }
> -
> - if (LastDeviceIndex == DeviceList->NumDevice) {
> - break;
> - }
> - }
> -
> - for (Index = LastDeviceIndex; Index < DeviceList->NumDevice; Index++) {
> - //
> - // delete the variables
> - //
> - CurMacInfo = &DeviceList->MacInfo[Index];
> - IScsiMacAddrToStr (&CurMacInfo->Mac, CurMacInfo->Len, CurMacInfo-
> >VlanId, MacString);
> - gRT->SetVariable (MacString, &gEfiIScsiInitiatorNameProtocolGuid, 0, 0,
> NULL);
> - gRT->SetVariable (MacString, &gIScsiCHAPAuthInfoGuid, 0, 0, NULL);
> - }
> -
> - FreePool (DeviceList);
> - } else if (Status != EFI_NOT_FOUND) {
> - FreePool (Handles);
> - return Status;
> - }
> - //
> - // Construct the new iSCSI device list.
> - //
> - DeviceListSize = sizeof (ISCSI_DEVICE_LIST) + (NumHandles - 1) * sizeof
> (ISCSI_MAC_INFO);
> - DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DeviceListSize);
> - ASSERT (DeviceList != NULL);
> - DeviceList->NumDevice = (UINT8) NumHandles;
> -
> - for (Index = 0; Index < NumHandles; Index++) {
> - NetLibGetMacAddress (Handles[Index], &MacAddress, &HwAddressSize);
> -
> - CurMacInfo = &DeviceList->MacInfo[Index];
> - CopyMem (&CurMacInfo->Mac, MacAddress.Addr, HwAddressSize);
> - CurMacInfo->Len = (UINT8) HwAddressSize;
> - CurMacInfo->VlanId = NetLibGetVlanId (Handles[Index]);
> - }
> -
> - gRT->SetVariable (
> - L"iSCSIDeviceList",
> - &gIp4IScsiConfigGuid,
> - ISCSI_CONFIG_VAR_ATTR,
> - DeviceListSize,
> - DeviceList
> - );
> -
> - FreePool (DeviceList);
> - FreePool (Handles);
> -
> - return Status;
> -}
> -
> -/**
> - Get the iSCSI configuration form entry by the index of the goto opcode actived.
> -
> - @param[in] Index The 0-based index of the goto opcode actived.
> -
> - @return The iSCSI configuration form entry found.
> -**/
> -ISCSI_CONFIG_FORM_ENTRY *
> -IScsiGetConfigFormEntryByIndex (
> - IN UINT32 Index
> - )
> -{
> - UINT32 CurrentIndex;
> - LIST_ENTRY *Entry;
> - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry;
> -
> - CurrentIndex = 0;
> - ConfigFormEntry = NULL;
> -
> - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {
> - if (CurrentIndex == Index) {
> - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry,
> ISCSI_CONFIG_FORM_ENTRY, Link);
> - break;
> - }
> -
> - CurrentIndex++;
> - }
> -
> - return ConfigFormEntry;
> -}
> -
> -/**
> - Convert the iSCSI configuration data into the IFR data.
> -
> - @param[in] ConfigFormEntry The iSCSI configuration form entry.
> - @param[out] IfrNvData The IFR nv data.
> -
> -**/
> -VOID
> -IScsiConvertDeviceConfigDataToIfrNvData (
> - IN ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry,
> - OUT ISCSI_CONFIG_IFR_NVDATA *IfrNvData
> - )
> -{
> - ISCSI_SESSION_CONFIG_NVDATA *SessionConfigData;
> - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfigData;
> -
> - //
> - // Normal session configuration parameters.
> - //
> - SessionConfigData = &ConfigFormEntry->SessionConfigData;
> - IfrNvData->Enabled = SessionConfigData->Enabled;
> -
> - IfrNvData->InitiatorInfoFromDhcp = SessionConfigData-
> >InitiatorInfoFromDhcp;
> - IfrNvData->TargetInfoFromDhcp = SessionConfigData-
> >TargetInfoFromDhcp;
> - IfrNvData->TargetPort = SessionConfigData->TargetPort;
> -
> - IScsiIpToStr (&SessionConfigData->LocalIp, IfrNvData->LocalIp);
> - IScsiIpToStr (&SessionConfigData->SubnetMask, IfrNvData->SubnetMask);
> - IScsiIpToStr (&SessionConfigData->Gateway, IfrNvData->Gateway);
> - IScsiIpToStr (&SessionConfigData->TargetIp, IfrNvData->TargetIp);
> -
> - IScsiAsciiStrToUnicodeStr (SessionConfigData->TargetName, IfrNvData-
> >TargetName);
> -
> - IScsiLunToUnicodeStr (SessionConfigData->BootLun, IfrNvData->BootLun);
> -
> - IScsiConvertIsIdToString (IfrNvData->IsId, SessionConfigData->IsId);
> -
> - //
> - // CHAP authentication parameters.
> - //
> - AuthConfigData = &ConfigFormEntry->AuthConfigData;
> -
> - IfrNvData->CHAPType = AuthConfigData->CHAPType;
> -
> - IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPName, IfrNvData-
> >CHAPName);
> - IScsiAsciiStrToUnicodeStr (AuthConfigData->CHAPSecret, IfrNvData-
> >CHAPSecret);
> - IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPName, IfrNvData-
> >ReverseCHAPName);
> - IScsiAsciiStrToUnicodeStr (AuthConfigData->ReverseCHAPSecret, IfrNvData-
> >ReverseCHAPSecret);
> -}
> -
> -/**
> - This function allows the caller to request the current
> - configuration for one or more named elements. The resulting
> - string is in <ConfigAltResp> format. Any and all alternative
> - configuration strings shall also be appended to the end of the
> - current configuration string. If they are, they must appear
> - after the current configuration. They must contain the same
> - routing (GUID, NAME, PATH) as the current configuration string.
> - They must have an additional description indicating the type of
> - alternative configuration the string represents,
> - "ALTCFG=<StringToken>". That <StringToken> (when
> - converted from Hex UNICODE to binary) is a reference to a
> - string in the associated string pack.
> -
> - @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
> - @param[in] Request A null-terminated Unicode string in
> - <ConfigRequest> format. Note that this
> - includes the routing information as well as
> - the configurable name / value pairs. It is
> - invalid for this string to be in
> - <MultiConfigRequest> format.
> - @param[out] Progress On return, points to a character in the
> - Request string. Points to the string's null
> - terminator if request was successful. Points
> - to the most recent "&" before the first
> - failing name / value pair (or the beginning
> - of the string if the failure is in the first
> - name / value pair) if the request was not
> - successful.
> - @param[out] Results A null-terminated Unicode string in
> - <ConfigAltResp> format which has all values
> - filled in for the names in the Request string.
> - String to be allocated by the called function.
> -
> - @retval EFI_SUCCESS The Results string is filled with the
> - values corresponding to all requested
> - names.
> - @retval EFI_OUT_OF_RESOURCES Not enough memory to store the
> - parts of the results that must be
> - stored awaiting possible future
> - protocols.
> - @retval EFI_INVALID_PARAMETER For example, passing in a NULL
> - for the Request parameter
> - would result in this type of
> - error. In this case, the
> - Progress parameter would be
> - set to NULL.
> - @retval EFI_NOT_FOUND Routing data doesn't match any
> - known driver. Progress set to the
> - first character in the routing header.
> - Note: There is no requirement that the
> - driver validate the routing data. It
> - must skip the <ConfigHdr> in order to
> - process the names.
> - @retval EFI_INVALID_PARAMETER Illegal syntax. Progress set
> - to most recent & before the
> - error or the beginning of the
> - string.
> - @retval EFI_INVALID_PARAMETER Unknown name. Progress points
> - to the & before the name in
> - question.Currently not implemented.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiFormExtractConfig (
> - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
> - IN CONST EFI_STRING Request,
> - OUT EFI_STRING *Progress,
> - OUT EFI_STRING *Results
> - )
> -{
> - EFI_STATUS Status;
> - CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE];
> - UINTN BufferSize;
> - ISCSI_CONFIG_IFR_NVDATA *IfrNvData;
> - ISCSI_FORM_CALLBACK_INFO *Private;
> - EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;
> - EFI_STRING ConfigRequestHdr;
> - EFI_STRING ConfigRequest;
> - BOOLEAN AllocatedRequest;
> - UINTN Size;
> -
> - if (Progress == NULL || Results == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - *Progress = Request;
> - if ((Request != NULL) && !HiiIsConfigHdrMatch (Request,
> &gIp4IScsiConfigGuid, mVendorStorageName)) {
> - return EFI_NOT_FOUND;
> - }
> -
> - ConfigRequestHdr = NULL;
> - ConfigRequest = NULL;
> - AllocatedRequest = FALSE;
> - Size = 0;
> -
> - if (!mIScsiDeviceListUpdated) {
> - //
> - // Update the device list.
> - //
> - IScsiUpdateDeviceList ();
> - mIScsiDeviceListUpdated = TRUE;
> - }
> -
> - Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);
> - IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA));
> - ASSERT (IfrNvData != NULL);
> - if (Private->Current != NULL) {
> - IScsiConvertDeviceConfigDataToIfrNvData (Private->Current, IfrNvData);
> - }
> -
> - BufferSize = ISCSI_NAME_MAX_SIZE;
> - Status = gIScsiInitiatorName.Get (&gIScsiInitiatorName, &BufferSize,
> InitiatorName);
> - if (EFI_ERROR (Status)) {
> - IfrNvData->InitiatorName[0] = L'\0';
> - } else {
> - IScsiAsciiStrToUnicodeStr (InitiatorName, IfrNvData->InitiatorName);
> - }
> -
> - //
> - // Convert buffer data to <ConfigResp> by helper function BlockToConfig()
> - //
> - HiiConfigRouting = Private->ConfigRouting;
> - BufferSize = sizeof (ISCSI_CONFIG_IFR_NVDATA);
> - ConfigRequest = Request;
> - if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {
> - //
> - // Request has no request element, construct full request string.
> - // Allocate and fill a buffer large enough to hold the <ConfigHdr> template
> - // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW"
> followed by a Null-terminator
> - //
> - ConfigRequestHdr = HiiConstructConfigHdr (&gIp4IScsiConfigGuid,
> mVendorStorageName, Private->DriverHandle);
> - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
> - ConfigRequest = AllocateZeroPool (Size);
> - ASSERT (ConfigRequest != NULL);
> - AllocatedRequest = TRUE;
> - UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX",
> ConfigRequestHdr, (UINT64)BufferSize);
> - FreePool (ConfigRequestHdr);
> - }
> - Status = HiiConfigRouting->BlockToConfig (
> - HiiConfigRouting,
> - ConfigRequest,
> - (UINT8 *) IfrNvData,
> - BufferSize,
> - Results,
> - Progress
> - );
> - FreePool (IfrNvData);
> - //
> - // Free the allocated config request string.
> - //
> - if (AllocatedRequest) {
> - FreePool (ConfigRequest);
> - ConfigRequest = NULL;
> - }
> -
> - //
> - // Set Progress string to the original request string.
> - //
> - if (Request == NULL) {
> - *Progress = NULL;
> - } else if (StrStr (Request, L"OFFSET") == NULL) {
> - *Progress = Request + StrLen (Request);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - This function applies changes in a driver's configuration.
> - Input is a Configuration, which has the routing data for this
> - driver followed by name / value configuration pairs. The driver
> - must apply those pairs to its configurable storage. If the
> - driver's configuration is stored in a linear block of data
> - and the driver's name / value pairs are in <BlockConfig>
> - format, it may use the ConfigToBlock helper function (above) to
> - simplify the job. Currently not implemented.
> -
> - @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
> - @param[in] Configuration A null-terminated Unicode string in
> - <ConfigString> format.
> - @param[out] Progress A pointer to a string filled in with the
> - offset of the most recent '&' before the
> - first failing name / value pair (or the
> - beginn ing of the string if the failure
> - is in the first name / value pair) or
> - the terminating NULL if all was
> - successful.
> -
> - @retval EFI_SUCCESS The results have been distributed or are
> - awaiting distribution.
> - @retval EFI_OUT_OF_RESOURCES Not enough memory to store the
> - parts of the results that must be
> - stored awaiting possible future
> - protocols.
> - @retval EFI_INVALID_PARAMETERS Passing in a NULL for the
> - Results parameter would result
> - in this type of error.
> - @retval EFI_NOT_FOUND Target for the specified routing data
> - was not found.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiFormRouteConfig (
> - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
> - IN CONST EFI_STRING Configuration,
> - OUT EFI_STRING *Progress
> - )
> -{
> - if (Configuration == NULL || Progress == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - //
> - // Check routing data in <ConfigHdr>.
> - // Note: if only one Storage is used, then this checking could be skipped.
> - //
> - if (!HiiIsConfigHdrMatch (Configuration, &gIp4IScsiConfigGuid,
> mVendorStorageName)) {
> - *Progress = Configuration;
> - return EFI_NOT_FOUND;
> - }
> -
> - *Progress = Configuration + StrLen (Configuration);
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - This function is called to provide results data to the driver.
> - This data consists of a unique key that is used to identify
> - which data is either being passed back or being asked for.
> -
> - @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
> - @param[in] Action Specifies the type of action taken by the browser.
> - @param[in] QuestionId A unique value which is sent to the original
> - exporting driver so that it can identify the type
> - of data to expect. The format of the data tends to
> - vary based on the opcode that enerated the callback.
> - @param[in] Type The type of value for the question.
> - @param[in] Value A pointer to the data being sent to the original
> - exporting driver.
> - @param[out] ActionRequest On return, points to the action requested by
> the
> - callback function.
> -
> - @retval EFI_SUCCESS The callback successfully handled the action.
> - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold
> the
> - variable and its data.
> - @retval EFI_DEVICE_ERROR The variable could not be saved.
> - @retval EFI_UNSUPPORTED The specified Action is not supported by the
> - callback.Currently not implemented.
> - @retval EFI_INVALID_PARAMETERS Passing in wrong parameter.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiFormCallback (
> - IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
> - IN EFI_BROWSER_ACTION Action,
> - IN EFI_QUESTION_ID QuestionId,
> - IN UINT8 Type,
> - IN EFI_IFR_TYPE_VALUE *Value,
> - OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
> - )
> -{
> - ISCSI_FORM_CALLBACK_INFO *Private;
> - UINTN BufferSize;
> - CHAR8 IScsiName[ISCSI_NAME_MAX_SIZE];
> - CHAR16 PortString[128];
> - CHAR8 Ip4String[IP4_STR_MAX_SIZE];
> - CHAR8 LunString[ISCSI_LUN_STR_MAX_LEN];
> - UINT64 Lun;
> - EFI_STRING_ID DeviceFormTitleToken;
> - ISCSI_CONFIG_IFR_NVDATA *IfrNvData;
> - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry;
> - EFI_IP_ADDRESS HostIp;
> - EFI_IP_ADDRESS SubnetMask;
> - EFI_IP_ADDRESS Gateway;
> - EFI_STATUS Status;
> - EFI_INPUT_KEY Key;
> -
> - if (Action != EFI_BROWSER_ACTION_CHANGING && Action !=
> EFI_BROWSER_ACTION_CHANGED) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);
> - //
> - // Retrieve uncommitted data from Browser
> - //
> - IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA));
> - ASSERT (IfrNvData != NULL);
> - if (!HiiGetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, sizeof
> (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData)) {
> - FreePool (IfrNvData);
> - return EFI_NOT_FOUND;
> - }
> - Status = EFI_SUCCESS;
> -
> - if (Action == EFI_BROWSER_ACTION_CHANGING) {
> - if ((QuestionId >= KEY_DEVICE_ENTRY_BASE) && (QuestionId <
> (mNumberOfIScsiDevices + KEY_DEVICE_ENTRY_BASE))) {
> - //
> - // In case goto the device configuration form, update the device form title.
> - //
> - ConfigFormEntry = IScsiGetConfigFormEntryByIndex ((UINT32) (QuestionId -
> KEY_DEVICE_ENTRY_BASE));
> - ASSERT (ConfigFormEntry != NULL);
> -
> - UnicodeSPrint (PortString, (UINTN) sizeof (PortString), L"Port %s",
> ConfigFormEntry->MacString);
> - DeviceFormTitleToken = (EFI_STRING_ID) STR_ISCSI_DEVICE_FORM_TITLE;
> - HiiSetString (Private->RegisteredHandle, DeviceFormTitleToken, PortString,
> NULL);
> -
> - IScsiConvertDeviceConfigDataToIfrNvData (ConfigFormEntry, IfrNvData);
> -
> - Private->Current = ConfigFormEntry;
> - }
> - } else if (Action == EFI_BROWSER_ACTION_CHANGED) {
> - switch (QuestionId) {
> - case KEY_INITIATOR_NAME:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->InitiatorName, IScsiName);
> - BufferSize = AsciiStrSize (IScsiName);
> -
> - Status = gIScsiInitiatorName.Set (&gIScsiInitiatorName, &BufferSize,
> IScsiName);
> - if (EFI_ERROR (Status)) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid
> iSCSI Name!", NULL);
> - }
> -
> - *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;
> - break;
> -
> - case KEY_LOCAL_IP:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String);
> - Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);
> - if (EFI_ERROR (Status) ||
> - ((Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) &&
> - !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), NTOHL(*(UINT32*)Private-
> >Current->SessionConfigData.SubnetMask.Addr)))) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid
> IP address!", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - } else {
> - CopyMem (&Private->Current->SessionConfigData.LocalIp, &HostIp.v4,
> sizeof (HostIp.v4));
> - }
> -
> - break;
> -
> - case KEY_SUBNET_MASK:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->SubnetMask, Ip4String);
> - Status = IScsiAsciiStrToIp (Ip4String, &SubnetMask.v4);
> - if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) &&
> (IScsiGetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid
> Subnet Mask!", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - } else {
> - CopyMem (&Private->Current->SessionConfigData.SubnetMask,
> &SubnetMask.v4, sizeof (SubnetMask.v4));
> - }
> -
> - break;
> -
> - case KEY_GATE_WAY:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String);
> - Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4);
> - if (EFI_ERROR (Status) ||
> - ((Gateway.Addr[0] != 0) &&
> - (Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) &&
> - !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), NTOHL(*(UINT32*)Private-
> >Current->SessionConfigData.SubnetMask.Addr)))) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid
> Gateway!", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - } else {
> - CopyMem (&Private->Current->SessionConfigData.Gateway, &Gateway.v4,
> sizeof (Gateway.v4));
> - }
> -
> - break;
> -
> - case KEY_TARGET_IP:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String);
> - Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);
> - if (EFI_ERROR (Status) || IP4_IS_LOCAL_BROADCAST (EFI_NTOHL(HostIp.v4))
> || IP4_IS_UNSPECIFIED (EFI_NTOHL(HostIp.v4))) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid
> IP address!", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - } else {
> - CopyMem (&Private->Current->SessionConfigData.TargetIp, &HostIp.v4,
> sizeof (HostIp.v4));
> - }
> -
> - break;
> -
> - case KEY_TARGET_NAME:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->TargetName, IScsiName);
> - Status = IScsiNormalizeName (IScsiName, AsciiStrLen (IScsiName));
> - if (EFI_ERROR (Status)) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid
> iSCSI Name!", NULL);
> - } else {
> - AsciiStrCpyS (Private->Current->SessionConfigData.TargetName,
> ISCSI_NAME_MAX_SIZE, IScsiName);
> - }
> -
> - break;
> -
> - case KEY_DHCP_ENABLE:
> - if (IfrNvData->InitiatorInfoFromDhcp == 0) {
> - IfrNvData->TargetInfoFromDhcp = 0;
> - }
> -
> - break;
> -
> - case KEY_BOOT_LUN:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->BootLun, LunString);
> - Status = IScsiAsciiStrToLun (LunString, (UINT8 *) &Lun);
> - if (EFI_ERROR (Status)) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid
> LUN string!", NULL);
> - } else {
> - CopyMem (Private->Current->SessionConfigData.BootLun, &Lun, sizeof
> (Lun));
> - }
> -
> - break;
> -
> - case KEY_CHAP_NAME:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPName, Private->Current-
> >AuthConfigData.CHAPName);
> - break;
> -
> - case KEY_CHAP_SECRET:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->CHAPSecret, Private->Current-
> >AuthConfigData.CHAPSecret);
> - break;
> -
> - case KEY_REVERSE_CHAP_NAME:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPName, Private-
> >Current->AuthConfigData.ReverseCHAPName);
> - break;
> -
> - case KEY_REVERSE_CHAP_SECRET:
> - IScsiUnicodeStrToAsciiStr (IfrNvData->ReverseCHAPSecret, Private-
> >Current->AuthConfigData.ReverseCHAPSecret);
> - break;
> -
> - case KEY_CONFIG_ISID:
> - IScsiParseIsIdFromString (IfrNvData->IsId, Private->Current-
> >SessionConfigData.IsId);
> - IScsiConvertIsIdToString (IfrNvData->IsId, Private->Current-
> >SessionConfigData.IsId);
> -
> - break;
> -
> - case KEY_SAVE_CHANGES:
> - //
> - // First, update those fields which don't have INTERACTIVE set.
> - //
> - Private->Current->SessionConfigData.Enabled = IfrNvData->Enabled;
> - Private->Current->SessionConfigData.InitiatorInfoFromDhcp = IfrNvData-
> >InitiatorInfoFromDhcp;
> - Private->Current->SessionConfigData.TargetPort = IfrNvData-
> >TargetPort;
> - if (Private->Current->SessionConfigData.TargetPort == 0) {
> - Private->Current->SessionConfigData.TargetPort =
> ISCSI_WELL_KNOWN_PORT;
> - }
> -
> - Private->Current->SessionConfigData.TargetInfoFromDhcp = IfrNvData-
> >TargetInfoFromDhcp;
> - Private->Current->AuthConfigData.CHAPType = IfrNvData-
> >CHAPType;
> -
> - //
> - // Only do full parameter validation if iSCSI is enabled on this device.
> - //
> - if (Private->Current->SessionConfigData.Enabled) {
> - //
> - // Validate the address configuration of the Initiator if DHCP isn't
> - // deployed.
> - //
> - if (!Private->Current->SessionConfigData.InitiatorInfoFromDhcp) {
> - CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.LocalIp,
> sizeof (HostIp.v4));
> - CopyMem (&SubnetMask.v4, &Private->Current-
> >SessionConfigData.SubnetMask, sizeof (SubnetMask.v4));
> - CopyMem (&Gateway.v4, &Private->Current-
> >SessionConfigData.Gateway, sizeof (Gateway.v4));
> -
> - if ((Gateway.Addr[0] != 0)) {
> - if (SubnetMask.Addr[0] == 0) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Gateway address is set but subnet mask is zero.", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - } else if (!IP4_NET_EQUAL (HostIp.Addr[0], Gateway.Addr[0],
> SubnetMask.Addr[0])) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Local IP and Gateway are not in the same subnet.", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - }
> - }
> - }
> - //
> - // Validate target configuration if DHCP isn't deployed.
> - //
> - if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) {
> - CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.TargetIp,
> sizeof (HostIp.v4));
> - if (IP4_IS_UNSPECIFIED (NTOHL (HostIp.Addr[0])) ||
> IP4_IS_LOCAL_BROADCAST (NTOHL (HostIp.Addr[0]))) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Target IP is invalid!", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - }
> -
> - //
> - // Validate iSCSI target name configuration again:
> - // The format of iSCSI target name is already verified when user input the
> name;
> - // here we only check the case user does not input the name.
> - //
> - if (Private->Current->SessionConfigData.TargetName[0] == '\0') {
> - CreatePopUp (
> - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
> - &Key,
> - L"iSCSI target name is NULL!",
> - NULL
> - );
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - }
> -
> - }
> -
> - if (IfrNvData->CHAPType != ISCSI_CHAP_NONE) {
> - if ((IfrNvData->CHAPName[0] == '\0') || (IfrNvData->CHAPSecret[0] ==
> '\0')) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"CHAP Name or CHAP Secret is invalid!", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - }
> -
> - if ((IfrNvData->CHAPType == ISCSI_CHAP_MUTUAL) &&
> - ((IfrNvData->ReverseCHAPName[0] == '\0') || (IfrNvData-
> >ReverseCHAPSecret[0] == '\0'))
> - ) {
> - CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key,
> L"Reverse CHAP Name or Reverse CHAP Secret is invalid!", NULL);
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - }
> - }
> - }
> -
> - BufferSize = sizeof (Private->Current->SessionConfigData);
> - gRT->SetVariable (
> - Private->Current->MacString,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - ISCSI_CONFIG_VAR_ATTR,
> - BufferSize,
> - &Private->Current->SessionConfigData
> - );
> -
> - BufferSize = sizeof (Private->Current->AuthConfigData);
> - gRT->SetVariable (
> - Private->Current->MacString,
> - &gIScsiCHAPAuthInfoGuid,
> - ISCSI_CONFIG_VAR_ATTR,
> - BufferSize,
> - &Private->Current->AuthConfigData
> - );
> - *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;
> - break;
> -
> - default:
> - break;
> - }
> - }
> -
> - if (!EFI_ERROR (Status)) {
> - //
> - // Pass changed uncommitted data back to Form Browser
> - //
> - HiiSetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, sizeof
> (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData, NULL);
> - }
> -
> - FreePool (IfrNvData);
> -
> - return Status;
> -}
> -
> -/**
> - Updates the iSCSI configuration form to add/delete an entry for the iSCSI
> - device specified by the Controller.
> -
> - @param[in] DriverBindingHandle The driverbinding handle.
> - @param[in] Controller The controller handle of the iSCSI device.
> - @param[in] AddForm Whether to add or delete a form entry.
> -
> - @retval EFI_SUCCESS The iSCSI configuration form is updated.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConfigUpdateForm (
> - IN EFI_HANDLE DriverBindingHandle,
> - IN EFI_HANDLE Controller,
> - IN BOOLEAN AddForm
> - )
> -{
> - LIST_ENTRY *Entry;
> - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry;
> - BOOLEAN EntryExisted;
> - EFI_STATUS Status;
> - EFI_MAC_ADDRESS MacAddress;
> - UINTN HwAddressSize;
> - UINT16 VlanId;
> - CHAR16 PortString[128];
> - UINT16 FormIndex;
> - UINTN BufferSize;
> - VOID *StartOpCodeHandle;
> - VOID *EndOpCodeHandle;
> - EFI_IFR_GUID_LABEL *StartLabel;
> - EFI_IFR_GUID_LABEL *EndLabel;
> -
> - ConfigFormEntry = NULL;
> - EntryExisted = FALSE;
> -
> - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {
> - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry,
> ISCSI_CONFIG_FORM_ENTRY, Link);
> -
> - if (ConfigFormEntry->Controller == Controller) {
> - EntryExisted = TRUE;
> - break;
> - }
> - }
> -
> - if (AddForm) {
> - if (EntryExisted) {
> - return EFI_SUCCESS;
> - } else {
> - //
> - // Add a new form.
> - //
> - ConfigFormEntry = (ISCSI_CONFIG_FORM_ENTRY *) AllocateZeroPool
> (sizeof (ISCSI_CONFIG_FORM_ENTRY));
> - if (ConfigFormEntry == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - InitializeListHead (&ConfigFormEntry->Link);
> - ConfigFormEntry->Controller = Controller;
> -
> - //
> - // Get the MAC address and convert it into the formatted string.
> - //
> - Status = NetLibGetMacAddress (Controller, &MacAddress, &HwAddressSize);
> - ASSERT (Status == EFI_SUCCESS);
> - VlanId = NetLibGetVlanId (Controller);
> -
> - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId,
> ConfigFormEntry->MacString);
> -
> - //
> - // Get the normal session configuration data.
> - //
> - BufferSize = sizeof (ConfigFormEntry->SessionConfigData);
> - Status = gRT->GetVariable (
> - ConfigFormEntry->MacString,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - NULL,
> - &BufferSize,
> - &ConfigFormEntry->SessionConfigData
> - );
> - if (EFI_ERROR (Status)) {
> - ZeroMem (&ConfigFormEntry->SessionConfigData, sizeof
> (ConfigFormEntry->SessionConfigData));
> -
> - //
> - // Generate OUI-format ISID based on MAC address.
> - //
> - CopyMem (ConfigFormEntry->SessionConfigData.IsId, &MacAddress, 6);
> - ConfigFormEntry->SessionConfigData.IsId[0] =
> - (UINT8) (ConfigFormEntry->SessionConfigData.IsId[0] & 0x3F);
> - }
> - //
> - // Get the CHAP authentication configuration data.
> - //
> - BufferSize = sizeof (ConfigFormEntry->AuthConfigData);
> - Status = gRT->GetVariable (
> - ConfigFormEntry->MacString,
> - &gIScsiCHAPAuthInfoGuid,
> - NULL,
> - &BufferSize,
> - &ConfigFormEntry->AuthConfigData
> - );
> - if (EFI_ERROR (Status)) {
> - ZeroMem (&ConfigFormEntry->AuthConfigData, sizeof (ConfigFormEntry-
> >AuthConfigData));
> - }
> - //
> - // Compose the Port string and create a new EFI_STRING_ID.
> - //
> - UnicodeSPrint (PortString, sizeof (PortString), L"Port %s", ConfigFormEntry-
> >MacString);
> - ConfigFormEntry->PortTitleToken = HiiSetString (mCallbackInfo-
> >RegisteredHandle, 0, PortString, NULL);
> -
> - //
> - // Compose the help string of this port and create a new EFI_STRING_ID.
> - //
> - UnicodeSPrint (PortString, sizeof (PortString), L"Set the iSCSI parameters on
> port %s", ConfigFormEntry->MacString);
> - ConfigFormEntry->PortTitleHelpToken = HiiSetString (mCallbackInfo-
> >RegisteredHandle, 0, PortString, NULL);
> -
> - InsertTailList (&mIScsiConfigFormList, &ConfigFormEntry->Link);
> - mNumberOfIScsiDevices++;
> - }
> - } else {
> - ASSERT (EntryExisted);
> -
> - mNumberOfIScsiDevices--;
> - RemoveEntryList (&ConfigFormEntry->Link);
> - FreePool (ConfigFormEntry);
> - mCallbackInfo->Current = NULL;
> - }
> - //
> - // Allocate space for creation of Buffer
> - //
> -
> - //
> - // Init OpCode Handle
> - //
> - StartOpCodeHandle = HiiAllocateOpCodeHandle ();
> - ASSERT (StartOpCodeHandle != NULL);
> -
> - EndOpCodeHandle = HiiAllocateOpCodeHandle ();
> - ASSERT (EndOpCodeHandle != NULL);
> -
> - //
> - // Create Hii Extend Label OpCode as the start opcode
> - //
> - StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode
> (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
> - StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
> - StartLabel->Number = DEVICE_ENTRY_LABEL;
> -
> - //
> - // Create Hii Extend Label OpCode as the end opcode
> - //
> - EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle,
> &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
> - EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
> - EndLabel->Number = LABEL_END;
> -
> - FormIndex = 0;
> - NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {
> - ConfigFormEntry = NET_LIST_USER_STRUCT (Entry,
> ISCSI_CONFIG_FORM_ENTRY, Link);
> -
> - HiiCreateGotoOpCode (
> - StartOpCodeHandle, // Container for dynamic created
> opcodes
> - FORMID_DEVICE_FORM, // Target Form ID
> - ConfigFormEntry->PortTitleToken, // Prompt text
> - ConfigFormEntry->PortTitleHelpToken, // Help text
> - EFI_IFR_FLAG_CALLBACK, // Question flag
> - (UINT16)(KEY_DEVICE_ENTRY_BASE + FormIndex) // Question ID
> - );
> -
> - FormIndex++;
> - }
> -
> - HiiUpdateForm (
> - mCallbackInfo->RegisteredHandle,
> - &gIp4IScsiConfigGuid,
> - FORMID_MAIN_FORM,
> - StartOpCodeHandle, // Label DEVICE_ENTRY_LABEL
> - EndOpCodeHandle // LABEL_END
> - );
> -
> - HiiFreeOpCodeHandle (StartOpCodeHandle);
> - HiiFreeOpCodeHandle (EndOpCodeHandle);
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Initialize the iSCSI configuration form.
> -
> - @param[in] DriverBindingHandle The iSCSI driverbinding handle.
> -
> - @retval EFI_SUCCESS The iSCSI configuration form is initialized.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConfigFormInit (
> - VOID
> - )
> -{
> - EFI_STATUS Status;
> - EFI_HII_DATABASE_PROTOCOL *HiiDatabase;
> - ISCSI_FORM_CALLBACK_INFO *CallbackInfo;
> -
> - Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID
> **)&HiiDatabase);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - CallbackInfo = (ISCSI_FORM_CALLBACK_INFO *) AllocateZeroPool (sizeof
> (ISCSI_FORM_CALLBACK_INFO));
> - if (CallbackInfo == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - CallbackInfo->Signature = ISCSI_FORM_CALLBACK_INFO_SIGNATURE;
> - CallbackInfo->HiiDatabase = HiiDatabase;
> - CallbackInfo->Current = NULL;
> -
> - CallbackInfo->ConfigAccess.ExtractConfig = IScsiFormExtractConfig;
> - CallbackInfo->ConfigAccess.RouteConfig = IScsiFormRouteConfig;
> - CallbackInfo->ConfigAccess.Callback = IScsiFormCallback;
> -
> - Status = gBS->LocateProtocol (&gEfiHiiConfigRoutingProtocolGuid, NULL,
> (VOID **)&CallbackInfo->ConfigRouting);
> - if (EFI_ERROR (Status)) {
> - FreePool(CallbackInfo);
> - return Status;
> - }
> -
> - //
> - // Install Device Path Protocol and Config Access protocol to driver handle
> - //
> - Status = gBS->InstallMultipleProtocolInterfaces (
> - &CallbackInfo->DriverHandle,
> - &gEfiDevicePathProtocolGuid,
> - &mIScsiHiiVendorDevicePath,
> - &gEfiHiiConfigAccessProtocolGuid,
> - &CallbackInfo->ConfigAccess,
> - NULL
> - );
> - ASSERT_EFI_ERROR (Status);
> -
> - //
> - // Publish our HII data
> - //
> - CallbackInfo->RegisteredHandle = HiiAddPackages (
> - &gIp4IScsiConfigGuid,
> - CallbackInfo->DriverHandle,
> - IScsi4DxeStrings,
> - IScsiConfigDxeBin,
> - NULL
> - );
> - if (CallbackInfo->RegisteredHandle == NULL) {
> - FreePool(CallbackInfo);
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - mCallbackInfo = CallbackInfo;
> -
> - return Status;
> -}
> -
> -/**
> - Unload the iSCSI configuration form, this includes: delete all the iSCSI
> - device configuration entries, uninstall the form callback protocol and
> - free the resources used.
> -
> - @param[in] DriverBindingHandle The iSCSI driverbinding handle.
> -
> - @retval EFI_SUCCESS The iSCSI configuration form is unloaded.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -**/
> -EFI_STATUS
> -IScsiConfigFormUnload (
> - IN EFI_HANDLE DriverBindingHandle
> - )
> -{
> - ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry;
> -
> - while (!IsListEmpty (&mIScsiConfigFormList)) {
> - //
> - // Uninstall the device forms as the iSCSI driver instance may fail to
> - // control the controller but still install the device configuration form.
> - // In such case, upon driver unloading, the driver instance's driverbinding.
> - // stop () won't be called, so we have to take this chance here to uninstall
> - // the device form.
> - //
> - ConfigFormEntry = NET_LIST_USER_STRUCT
> (mIScsiConfigFormList.ForwardLink, ISCSI_CONFIG_FORM_ENTRY, Link);
> - IScsiConfigUpdateForm (DriverBindingHandle, ConfigFormEntry->Controller,
> FALSE);
> - }
> -
> - //
> - // Remove HII package list
> - //
> - mCallbackInfo->HiiDatabase->RemovePackageList (
> - mCallbackInfo->HiiDatabase,
> - mCallbackInfo->RegisteredHandle
> - );
> -
> - //
> - // Uninstall EFI_HII_CONFIG_ACCESS_PROTOCOL
> - //
> - gBS->UninstallMultipleProtocolInterfaces (
> - mCallbackInfo->DriverHandle,
> - &gEfiDevicePathProtocolGuid,
> - &mIScsiHiiVendorDevicePath,
> - &gEfiHiiConfigAccessProtocolGuid,
> - &mCallbackInfo->ConfigAccess,
> - NULL
> - );
> - FreePool (mCallbackInfo);
> -
> - return EFI_SUCCESS;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c
> deleted file mode 100644
> index 6a876c8b69dd..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.c
> +++ /dev/null
> @@ -1,472 +0,0 @@
> -/** @file
> - iSCSI DHCP related configuration routines.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -/**
> - Extract the Root Path option and get the required target information.
> -
> - @param[in] RootPath The RootPath.
> - @param[in] Length Length of the RootPath option payload.
> - @param[in, out] ConfigNvData The iSCSI session configuration data read
> from nonvolatile device.
> -
> - @retval EFI_SUCCESS All required information is extracted from the
> RootPath option.
> - @retval EFI_NOT_FOUND The RootPath is not an iSCSI RootPath.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_INVALID_PARAMETER The RootPath is mal-formatted.
> -**/
> -EFI_STATUS
> -IScsiDhcpExtractRootPath (
> - IN CHAR8 *RootPath,
> - IN UINT8 Length,
> - IN OUT ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData
> - )
> -{
> - EFI_STATUS Status;
> - UINT8 IScsiRootPathIdLen;
> - CHAR8 *TmpStr;
> - ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX];
> - ISCSI_ROOT_PATH_FIELD *Field;
> - UINT32 FieldIndex;
> - UINT8 Index;
> -
> - //
> - // "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname>
> - //
> - IScsiRootPathIdLen = (UINT8) AsciiStrLen (ISCSI_ROOT_PATH_ID);
> -
> - if ((Length <= IScsiRootPathIdLen) || (CompareMem (RootPath,
> ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) {
> - return EFI_NOT_FOUND;
> - }
> - //
> - // Skip the iSCSI RootPath ID "iscsi:".
> - //
> - RootPath += IScsiRootPathIdLen;
> - Length = (UINT8) (Length - IScsiRootPathIdLen);
> -
> - TmpStr = (CHAR8 *) AllocatePool (Length + 1);
> - if (TmpStr == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - CopyMem (TmpStr, RootPath, Length);
> - TmpStr[Length] = '\0';
> -
> - Index = 0;
> - FieldIndex = RP_FIELD_IDX_SERVERNAME;
> - ZeroMem (&Fields[0], sizeof (Fields));
> -
> - //
> - // Extract the fields in the Root Path option string.
> - //
> - for (FieldIndex = RP_FIELD_IDX_SERVERNAME; (FieldIndex <
> RP_FIELD_IDX_MAX) && (Index < Length); FieldIndex++) {
> - if (TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) {
> - Fields[FieldIndex].Str = &TmpStr[Index];
> - }
> -
> - while ((TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) && (Index <
> Length)) {
> - Index++;
> - }
> -
> - if (TmpStr[Index] == ISCSI_ROOT_PATH_FIELD_DELIMITER) {
> - if (FieldIndex != RP_FIELD_IDX_TARGETNAME) {
> - TmpStr[Index] = '\0';
> - Index++;
> - }
> -
> - if (Fields[FieldIndex].Str != NULL) {
> - Fields[FieldIndex].Len = (UINT8) AsciiStrLen (Fields[FieldIndex].Str);
> - }
> - }
> - }
> -
> - if (FieldIndex != RP_FIELD_IDX_MAX) {
> - Status = EFI_INVALID_PARAMETER;
> - goto ON_EXIT;
> - }
> -
> - if ((Fields[RP_FIELD_IDX_SERVERNAME].Str == NULL) ||
> - (Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) ||
> - (Fields[RP_FIELD_IDX_PROTOCOL].Len > 1)
> - ) {
> -
> - Status = EFI_INVALID_PARAMETER;
> - goto ON_EXIT;
> - }
> - //
> - // Get the IP address of the target.
> - //
> - Field = &Fields[RP_FIELD_IDX_SERVERNAME];
> - Status = IScsiAsciiStrToIp (Field->Str, &ConfigNvData->TargetIp);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - //
> - // Check the protocol type.
> - //
> - Field = &Fields[RP_FIELD_IDX_PROTOCOL];
> - if ((Field->Str != NULL) && ((*(Field->Str) - '0') != EFI_IP_PROTO_TCP)) {
> - Status = EFI_INVALID_PARAMETER;
> - goto ON_EXIT;
> - }
> - //
> - // Get the port of the iSCSI target.
> - //
> - Field = &Fields[RP_FIELD_IDX_PORT];
> - if (Field->Str != NULL) {
> - ConfigNvData->TargetPort = (UINT16) AsciiStrDecimalToUintn (Field->Str);
> - } else {
> - ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT;
> - }
> - //
> - // Get the LUN.
> - //
> - Field = &Fields[RP_FIELD_IDX_LUN];
> - if (Field->Str != NULL) {
> - Status = IScsiAsciiStrToLun (Field->Str, ConfigNvData->BootLun);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - } else {
> - ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun));
> - }
> - //
> - // Get the target iSCSI Name.
> - //
> - Field = &Fields[RP_FIELD_IDX_TARGETNAME];
> -
> - if (AsciiStrLen (Field->Str) > ISCSI_NAME_MAX_SIZE - 1) {
> - Status = EFI_INVALID_PARAMETER;
> - goto ON_EXIT;
> - }
> - //
> - // Validate the iSCSI name.
> - //
> - Status = IScsiNormalizeName (Field->Str, AsciiStrLen (Field->Str));
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - AsciiStrCpyS (ConfigNvData->TargetName, ISCSI_NAME_MAX_SIZE, Field->Str);
> -
> -ON_EXIT:
> -
> - FreePool (TmpStr);
> -
> - return Status;
> -}
> -
> -/**
> - The callback function registerd to the DHCP4 instance which is used to select
> - the qualified DHCP OFFER.
> -
> - @param[in] This The DHCP4 protocol.
> - @param[in] Context The context set when configuring the DHCP4 protocol.
> - @param[in] CurrentState The current state of the DHCP4 protocol.
> - @param[in] Dhcp4Event The event occurs in the current state.
> - @param[in] Packet The DHCP packet that is to be sent or already received.
> - @param[out] NewPacket The packet used to replace the above Packet.
> -
> - @retval EFI_SUCCESS Either the DHCP OFFER is qualified or we're not
> intereseted
> - in the Dhcp4Event.
> - @retval EFI_NOT_READY The DHCP OFFER packet doesn't match our
> requirements.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDhcpSelectOffer (
> - IN EFI_DHCP4_PROTOCOL * This,
> - IN VOID *Context,
> - IN EFI_DHCP4_STATE CurrentState,
> - IN EFI_DHCP4_EVENT Dhcp4Event,
> - IN EFI_DHCP4_PACKET * Packet, OPTIONAL
> - OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL
> - )
> -{
> - EFI_STATUS Status;
> - UINT32 OptionCount;
> - EFI_DHCP4_PACKET_OPTION **OptionList;
> - UINT32 Index;
> -
> - if ((Dhcp4Event != Dhcp4RcvdOffer) && (Dhcp4Event != Dhcp4SelectOffer)) {
> - return EFI_SUCCESS;
> - }
> -
> - OptionCount = 0;
> -
> - Status = This->Parse (This, Packet, &OptionCount, NULL);
> - if (Status != EFI_BUFFER_TOO_SMALL) {
> - return EFI_NOT_READY;
> - }
> -
> - OptionList = AllocatePool (OptionCount * sizeof (EFI_DHCP4_PACKET_OPTION
> *));
> - if (OptionList == NULL) {
> - return EFI_NOT_READY;
> - }
> -
> - Status = This->Parse (This, Packet, &OptionCount, OptionList);
> - if (EFI_ERROR (Status)) {
> - FreePool (OptionList);
> - return EFI_NOT_READY;
> - }
> -
> - for (Index = 0; Index < OptionCount; Index++) {
> - if (OptionList[Index]->OpCode != DHCP4_TAG_ROOTPATH) {
> - continue;
> - }
> -
> - Status = IScsiDhcpExtractRootPath (
> - (CHAR8 *) &OptionList[Index]->Data[0],
> - OptionList[Index]->Length,
> - (ISCSI_SESSION_CONFIG_NVDATA *) Context
> - );
> -
> - break;
> - }
> -
> - if (Index == OptionCount) {
> - Status = EFI_NOT_READY;
> - }
> -
> - FreePool (OptionList);
> -
> - return Status;
> -}
> -
> -/**
> - Parse the DHCP ACK to get the address configuration and DNS information.
> -
> - @param[in] Dhcp4 The DHCP4 protocol.
> - @param[in, out] ConfigData The session configuration data.
> -
> - @retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
> - @retval EFI_NO_MAPPING DHCP failed to acquire address and other
> information.
> - @retval EFI_INVALID_PARAMETER The DHCP ACK's DNS option is mal-
> formatted.
> - @retval EFI_DEVICE_ERROR Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiParseDhcpAck (
> - IN EFI_DHCP4_PROTOCOL *Dhcp4,
> - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData
> - )
> -{
> - EFI_STATUS Status;
> - EFI_DHCP4_MODE_DATA Dhcp4ModeData;
> - UINT32 OptionCount;
> - EFI_DHCP4_PACKET_OPTION **OptionList;
> - UINT32 Index;
> -
> - Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4ModeData);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - if (Dhcp4ModeData.State != Dhcp4Bound) {
> - return EFI_NO_MAPPING;
> - }
> -
> - CopyMem (&ConfigData->NvData.LocalIp, &Dhcp4ModeData.ClientAddress,
> sizeof (EFI_IPv4_ADDRESS));
> - CopyMem (&ConfigData->NvData.SubnetMask,
> &Dhcp4ModeData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
> - CopyMem (&ConfigData->NvData.Gateway,
> &Dhcp4ModeData.RouterAddress, sizeof (EFI_IPv4_ADDRESS));
> -
> - OptionCount = 0;
> - OptionList = NULL;
> -
> - Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket,
> &OptionCount, OptionList);
> - if (Status != EFI_BUFFER_TOO_SMALL) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - OptionList = AllocatePool (OptionCount * sizeof (EFI_DHCP4_PACKET_OPTION
> *));
> - if (OptionList == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, &OptionCount,
> OptionList);
> - if (EFI_ERROR (Status)) {
> - FreePool (OptionList);
> - return EFI_DEVICE_ERROR;
> - }
> -
> - for (Index = 0; Index < OptionCount; Index++) {
> - //
> - // Get DNS server addresses and DHCP server address from this offer.
> - //
> - if (OptionList[Index]->OpCode == DHCP4_TAG_DNS_SERVER) {
> -
> - if (((OptionList[Index]->Length & 0x3) != 0) || (OptionList[Index]->Length ==
> 0)) {
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - }
> - //
> - // Primary DNS server address.
> - //
> - CopyMem (&ConfigData->PrimaryDns, &OptionList[Index]->Data[0], sizeof
> (EFI_IPv4_ADDRESS));
> -
> - if (OptionList[Index]->Length > 4) {
> - //
> - // Secondary DNS server address
> - //
> - CopyMem (&ConfigData->SecondaryDns, &OptionList[Index]->Data[4],
> sizeof (EFI_IPv4_ADDRESS));
> - }
> - } else if (OptionList[Index]->OpCode == DHCP4_TAG_SERVER_ID) {
> - if (OptionList[Index]->Length != 4) {
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - }
> -
> - CopyMem (&ConfigData->DhcpServer, &OptionList[Index]->Data[0], sizeof
> (EFI_IPv4_ADDRESS));
> - }
> - }
> -
> - FreePool (OptionList);
> -
> - return Status;
> -}
> -
> -/**
> - Parse the DHCP ACK to get the address configuration and DNS information.
> -
> - @param[in] Image The handle of the driver image.
> - @param[in] Controller The handle of the controller;
> - @param[in, out] ConfigData The session configuration data.
> -
> - @retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NO_MEDIA There was a media error.
> - @retval Others Other errors as indicated.
> -
> -**/
> -EFI_STATUS
> -IScsiDoDhcp (
> - IN EFI_HANDLE Image,
> - IN EFI_HANDLE Controller,
> - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData
> - )
> -{
> - EFI_HANDLE Dhcp4Handle;
> - EFI_DHCP4_PROTOCOL *Dhcp4;
> - EFI_STATUS Status;
> - EFI_DHCP4_PACKET_OPTION *ParaList;
> - EFI_DHCP4_CONFIG_DATA Dhcp4ConfigData;
> - EFI_STATUS MediaStatus;
> - UINT8 *Data;
> -
> - Dhcp4Handle = NULL;
> - Dhcp4 = NULL;
> - ParaList = NULL;
> -
> - //
> - // Check media status before do DHCP
> - //
> - MediaStatus = EFI_SUCCESS;
> - NetLibDetectMediaWaitTimeout (Controller,
> ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME, &MediaStatus);
> - if (MediaStatus != EFI_SUCCESS) {
> - return EFI_NO_MEDIA;
> - }
> -
> - //
> - // Create a DHCP4 child instance and get the protocol.
> - //
> - Status = NetLibCreateServiceChild (
> - Controller,
> - Image,
> - &gEfiDhcp4ServiceBindingProtocolGuid,
> - &Dhcp4Handle
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - Status = gBS->OpenProtocol (
> - Dhcp4Handle,
> - &gEfiDhcp4ProtocolGuid,
> - (VOID **)&Dhcp4,
> - Image,
> - Controller,
> - EFI_OPEN_PROTOCOL_BY_DRIVER
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - ParaList = AllocatePool (sizeof (EFI_DHCP4_PACKET_OPTION) + 3);
> - if (ParaList == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto ON_EXIT;
> - }
> - //
> - // Ask the server to reply with Netmask, Router, DNS and RootPath options.
> - //
> - ParaList->OpCode = DHCP4_TAG_PARA_LIST;
> - ParaList->Length = (UINT8) (ConfigData->NvData.TargetInfoFromDhcp ? 4 : 3);
> - Data = &ParaList->Data[0];
> - Data[0] = DHCP4_TAG_NETMASK;
> - Data[1] = DHCP4_TAG_ROUTER;
> - Data[2] = DHCP4_TAG_DNS_SERVER;
> - Data[3] = DHCP4_TAG_ROOTPATH;
> -
> - ZeroMem (&Dhcp4ConfigData, sizeof (EFI_DHCP4_CONFIG_DATA));
> - Dhcp4ConfigData.OptionCount = 1;
> - Dhcp4ConfigData.OptionList = &ParaList;
> -
> - if (ConfigData->NvData.TargetInfoFromDhcp) {
> - //
> - // Use callback to select an offer which contains target information.
> - //
> - Dhcp4ConfigData.Dhcp4Callback = IScsiDhcpSelectOffer;
> - Dhcp4ConfigData.CallbackContext = &ConfigData->NvData;
> - }
> -
> - Status = Dhcp4->Configure (Dhcp4, &Dhcp4ConfigData);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - Status = Dhcp4->Start (Dhcp4, NULL);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - //
> - // Parse the ACK to get required information.
> - //
> - Status = IScsiParseDhcpAck (Dhcp4, ConfigData);
> -
> -ON_EXIT:
> -
> - if (ParaList != NULL) {
> - FreePool (ParaList);
> - }
> -
> - if (Dhcp4 != NULL) {
> - Dhcp4->Stop (Dhcp4);
> - Dhcp4->Configure (Dhcp4, NULL);
> -
> - gBS->CloseProtocol (
> - Dhcp4Handle,
> - &gEfiDhcp4ProtocolGuid,
> - Image,
> - Controller
> - );
> - }
> -
> - NetLibDestroyServiceChild (
> - Controller,
> - Image,
> - &gEfiDhcp4ServiceBindingProtocolGuid,
> - Dhcp4Handle
> - );
> -
> - return Status;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c
> deleted file mode 100644
> index 730f3e506bbc..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.c
> +++ /dev/null
> @@ -1,676 +0,0 @@
> -/** @file
> - The entry point of IScsi driver.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -EFI_DRIVER_BINDING_PROTOCOL gIScsiDriverBinding = {
> - IScsiDriverBindingSupported,
> - IScsiDriverBindingStart,
> - IScsiDriverBindingStop,
> - 0xa,
> - NULL,
> - NULL
> -};
> -
> -/**
> - Tests to see if this driver supports the RemainingDevicePath.
> -
> - @param[in] RemainingDevicePath A pointer to the remaining portion of a
> device path. This
> - parameter is ignored by device drivers, and is optional for
> bus
> - drivers. For bus drivers, if this parameter is not NULL, then
> - the bus driver must determine if the bus controller specified
> - by ControllerHandle and the child controller specified
> - by RemainingDevicePath are both supported by this
> - bus driver.
> -
> - @retval EFI_SUCCESS The RemainingDevicePath is supported or NULL.
> - @retval EFI_UNSUPPORTED The device specified by ControllerHandle and
> - RemainingDevicePath is not supported by the driver
> specified by This.
> -**/
> -EFI_STATUS
> -IScsiIsDevicePathSupported (
> - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
> - )
> -{
> - EFI_DEVICE_PATH_PROTOCOL *CurrentDevicePath;
> -
> - CurrentDevicePath = RemainingDevicePath;
> - if (CurrentDevicePath != NULL) {
> - while (!IsDevicePathEnd (CurrentDevicePath)) {
> - if ((CurrentDevicePath->Type == MESSAGING_DEVICE_PATH) &&
> (CurrentDevicePath->SubType == MSG_ISCSI_DP)) {
> - return EFI_SUCCESS;
> - }
> -
> - CurrentDevicePath = NextDevicePathNode (CurrentDevicePath);
> - }
> -
> - return EFI_UNSUPPORTED;
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - 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[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL
> instance.
> - @param[in] 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[in] 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 acces.
> - Currently not implemented.
> - @retval EFI_UNSUPPORTED The device specified by ControllerHandle and
> - RemainingDevicePath is not supported by the driver
> specified by This.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverBindingSupported (
> - IN EFI_DRIVER_BINDING_PROTOCOL *This,
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
> - )
> -{
> - EFI_STATUS Status;
> -
> - Status = gBS->OpenProtocol (
> - ControllerHandle,
> - &gEfiCallerIdGuid,
> - NULL,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_TEST_PROTOCOL
> - );
> - if (!EFI_ERROR (Status)) {
> - return EFI_ALREADY_STARTED;
> - }
> -
> - Status = gBS->OpenProtocol (
> - ControllerHandle,
> - &gEfiTcp4ServiceBindingProtocolGuid,
> - NULL,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_TEST_PROTOCOL
> - );
> - if (EFI_ERROR (Status)) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - Status = IScsiIsDevicePathSupported (RemainingDevicePath);
> - if (EFI_ERROR (Status)) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - if (IScsiDhcpIsConfigured (ControllerHandle)) {
> - Status = gBS->OpenProtocol (
> - ControllerHandle,
> - &gEfiDhcp4ServiceBindingProtocolGuid,
> - NULL,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_TEST_PROTOCOL
> - );
> - if (EFI_ERROR (Status)) {
> - return EFI_UNSUPPORTED;
> - }
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - 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[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL
> instance.
> - @param[in] 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[in] 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_DEVICE_ERROR The device could not be started due to a
> device error.
> - Currently not implemented.
> - @retval EFI_OUT_OF_RESOURCES The request could not be completed due
> to a lack of resources.
> - @retval Others The driver failded to start the device.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverBindingStart (
> - IN EFI_DRIVER_BINDING_PROTOCOL *This,
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
> - )
> -{
> - EFI_STATUS Status;
> - ISCSI_DRIVER_DATA *Private;
> - VOID *Interface;
> -
> - Private = IScsiCreateDriverData (This->DriverBindingHandle, ControllerHandle);
> - if (Private == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - //
> - // Create a underlayer child instance, but not need to configure it. Just open
> ChildHandle
> - // via BY_DRIVER. That is, establishing the relationship between
> ControllerHandle and ChildHandle.
> - // Therefore, when DisconnectController(), especially VLAN virtual controller
> handle,
> - // IScsiDriverBindingStop() will be called.
> - //
> - Status = NetLibCreateServiceChild (
> - ControllerHandle,
> - This->DriverBindingHandle,
> - &gEfiTcp4ServiceBindingProtocolGuid,
> - &Private->ChildHandle
> - );
> -
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Status = gBS->OpenProtocol (
> - Private->ChildHandle,
> - &gEfiTcp4ProtocolGuid,
> - &Interface,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_BY_DRIVER
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - //
> - // Always install private protocol no matter what happens later. We need to
> - // keep the relationship between ControllerHandle and ChildHandle.
> - //
> - Status = gBS->InstallProtocolInterface (
> - &ControllerHandle,
> - &gEfiCallerIdGuid,
> - EFI_NATIVE_INTERFACE,
> - &Private->IScsiIdentifier
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - //
> - // Try to add a port configuration page for this controller.
> - //
> - IScsiConfigUpdateForm (This->DriverBindingHandle, ControllerHandle, TRUE);
> -
> - //
> - // Get the iSCSI configuration data of this controller.
> - //
> - Status = IScsiGetConfigData (Private);
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> - //
> - // Try to login and create an iSCSI session according to the configuration.
> - //
> - Status = IScsiSessionLogin (Private);
> - if (Status == EFI_MEDIA_CHANGED) {
> - //
> - // The specified target is not available and the redirection information is
> - // got, login the session again with the updated target address.
> - //
> - Status = IScsiSessionLogin (Private);
> - }
> -
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> - //
> - // Duplicate the Session's tcp connection device path. The source port field
> - // will be set to zero as one iSCSI session is comprised of several iSCSI
> - // connections.
> - //
> - Private->DevicePath = IScsiGetTcpConnDevicePath (Private);
> - if (Private->DevicePath == NULL) {
> - goto ON_ERROR;
> - }
> - //
> - // Install the updated device path onto the ExtScsiPassThruHandle.
> - //
> - Status = gBS->InstallProtocolInterface (
> - &Private->ExtScsiPassThruHandle,
> - &gEfiDevicePathProtocolGuid,
> - EFI_NATIVE_INTERFACE,
> - Private->DevicePath
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - //
> - // ISCSI children should share the default Tcp child, just open the default Tcp
> child via BY_CHILD_CONTROLLER.
> - //
> - Status = gBS->OpenProtocol (
> - Private->ChildHandle, /// Default Tcp child
> - &gEfiTcp4ProtocolGuid,
> - &Interface,
> - This->DriverBindingHandle,
> - Private->ExtScsiPassThruHandle,
> - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
> - );
> - if (EFI_ERROR (Status)) {
> - gBS->UninstallMultipleProtocolInterfaces (
> - Private->ExtScsiPassThruHandle,
> - &gEfiExtScsiPassThruProtocolGuid,
> - &Private->IScsiExtScsiPassThru,
> - &gEfiDevicePathProtocolGuid,
> - Private->DevicePath,
> - NULL
> - );
> -
> - goto ON_ERROR;
> - }
> -
> - //
> - // Update/Publish the iSCSI Boot Firmware Table.
> - //
> - IScsiPublishIbft ();
> -
> - return EFI_SUCCESS;
> -
> -ON_ERROR:
> -
> - IScsiSessionAbort (&Private->Session);
> -
> - return Status;
> -}
> -
> -/**
> - Stop this driver on ControllerHandle.
> -
> - Release the control of this controller and remove the IScsi functions. 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[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL
> instance.
> - @param[in] 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[in] NumberOfChildren The number of child device handles in
> ChildHandleBuffer.Not used.
> - @param[in] ChildHandleBuffer An array of child handles to be freed. May be
> NULL
> - if NumberOfChildren is 0.Not used.
> -
> - @retval EFI_SUCCESS The device was stopped.
> - @retval EFI_DEVICE_ERROR The device could not be stopped due to a
> device error.
> - @retval EFI_INVALID_PARAMETER Child handle is NULL.
> - @retval EFI_ACCESS_DENIED The protocol could not be removed from the
> Handle
> - because its interfaces are being used.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverBindingStop (
> - IN EFI_DRIVER_BINDING_PROTOCOL *This,
> - IN EFI_HANDLE ControllerHandle,
> - IN UINTN NumberOfChildren,
> - IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
> - )
> -{
> - EFI_HANDLE IScsiController;
> - EFI_STATUS Status;
> - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
> - ISCSI_DRIVER_DATA *Private;
> - EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru;
> - ISCSI_CONNECTION *Conn;
> -
> - if (NumberOfChildren != 0) {
> - //
> - // We should have only one child.
> - //
> - Status = gBS->OpenProtocol (
> - ChildHandleBuffer[0],
> - &gEfiExtScsiPassThruProtocolGuid,
> - (VOID **) &PassThru,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_GET_PROTOCOL
> - );
> - if (EFI_ERROR (Status)) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru);
> - Conn = NET_LIST_HEAD (&Private->Session.Conns, ISCSI_CONNECTION,
> Link);
> -
> - //
> - // Previously the TCP4 protocol is opened BY_CHILD_CONTROLLER. Just
> close
> - // the protocol here but not uninstall the device path protocol and
> - // EXT SCSI PASS THRU protocol installed on ExtScsiPassThruHandle.
> - //
> - gBS->CloseProtocol (
> - Private->ChildHandle,
> - &gEfiTcp4ProtocolGuid,
> - Private->Image,
> - Private->ExtScsiPassThruHandle
> - );
> -
> - gBS->CloseProtocol (
> - Conn->Tcp4Io.Handle,
> - &gEfiTcp4ProtocolGuid,
> - Private->Image,
> - Private->ExtScsiPassThruHandle
> - );
> -
> - return EFI_SUCCESS;
> - }
> - //
> - // Get the handle of the controller we are controling.
> - //
> - IScsiController = NetLibGetNicHandle (ControllerHandle,
> &gEfiTcp4ProtocolGuid);
> -
> - Status = gBS->OpenProtocol (
> - IScsiController,
> - &gEfiCallerIdGuid,
> - (VOID **)&IScsiIdentifier,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_GET_PROTOCOL
> - );
> - if (EFI_ERROR (Status)) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - Private = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
> -
> - if (Private->ChildHandle != NULL) {
> - Status = gBS->CloseProtocol (
> - Private->ChildHandle,
> - &gEfiTcp4ProtocolGuid,
> - This->DriverBindingHandle,
> - IScsiController
> - );
> -
> - ASSERT (!EFI_ERROR (Status));
> -
> - Status = NetLibDestroyServiceChild (
> - IScsiController,
> - This->DriverBindingHandle,
> - &gEfiTcp4ServiceBindingProtocolGuid,
> - Private->ChildHandle
> - );
> - ASSERT (!EFI_ERROR (Status));
> - }
> -
> - IScsiConfigUpdateForm (This->DriverBindingHandle, IScsiController, FALSE);
> -
> - //
> - // Uninstall the private protocol.
> - //
> - gBS->UninstallProtocolInterface (
> - IScsiController,
> - &gEfiCallerIdGuid,
> - &Private->IScsiIdentifier
> - );
> -
> - //
> - // Update the iSCSI Boot Firware Table.
> - //
> - IScsiPublishIbft ();
> -
> - IScsiSessionAbort (&Private->Session);
> - Status = IScsiCleanDriverData (Private);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Unloads an image(the iSCSI driver).
> -
> - @param[in] ImageHandle Handle that identifies the image to be unloaded.
> -
> - @retval EFI_SUCCESS The image has been unloaded.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiIScsiUnload (
> - IN EFI_HANDLE ImageHandle
> - )
> -{
> - EFI_STATUS Status;
> - UINTN DeviceHandleCount;
> - EFI_HANDLE *DeviceHandleBuffer;
> - UINTN Index;
> - EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
> - EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
> -
> - //
> - // Try to disonnect the driver from the devices it's controlling.
> - //
> - Status = gBS->LocateHandleBuffer (
> - AllHandles,
> - NULL,
> - NULL,
> - &DeviceHandleCount,
> - &DeviceHandleBuffer
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - for (Index = 0; Index < DeviceHandleCount; Index++) {
> - Status = IScsiTestManagedDevice (
> - DeviceHandleBuffer[Index],
> - gIScsiDriverBinding.DriverBindingHandle,
> - &gEfiTcp4ProtocolGuid
> - );
> - if (EFI_ERROR (Status)) {
> - continue;
> - }
> - Status = gBS->DisconnectController (
> - DeviceHandleBuffer[Index],
> - gIScsiDriverBinding.DriverBindingHandle,
> - NULL
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - }
> -
> - //
> - // Unload the iSCSI configuration form.
> - //
> - Status = IScsiConfigFormUnload (gIScsiDriverBinding.DriverBindingHandle);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - //
> - // Uninstall the ComponentName and ComponentName2 protocol from iSCSI4
> driver binding handle
> - // if it has been installed.
> - //
> - Status = gBS->HandleProtocol (
> - gIScsiDriverBinding.DriverBindingHandle,
> - &gEfiComponentNameProtocolGuid,
> - (VOID **) &ComponentName
> - );
> - if (!EFI_ERROR (Status)) {
> - Status = gBS->UninstallMultipleProtocolInterfaces (
> - gIScsiDriverBinding.DriverBindingHandle,
> - &gEfiComponentNameProtocolGuid,
> - ComponentName,
> - NULL
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - }
> -
> - Status = gBS->HandleProtocol (
> - gIScsiDriverBinding.DriverBindingHandle,
> - &gEfiComponentName2ProtocolGuid,
> - (VOID **) &ComponentName2
> - );
> - if (!EFI_ERROR (Status)) {
> - gBS->UninstallMultipleProtocolInterfaces (
> - gIScsiDriverBinding.DriverBindingHandle,
> - &gEfiComponentName2ProtocolGuid,
> - ComponentName2,
> - NULL
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - }
> -
> - Status = gBS->UninstallMultipleProtocolInterfaces (
> - ImageHandle,
> - &gEfiDriverBindingProtocolGuid,
> - &gIScsiDriverBinding,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - &gIScsiInitiatorName,
> - NULL
> - );
> -ON_EXIT:
> -
> - if (DeviceHandleBuffer != NULL) {
> - FreePool (DeviceHandleBuffer);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - This is the declaration of an EFI image entry point. This entry point is
> - the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
> - both device drivers and bus drivers. It initialize the global variables and
> - publish the driver binding protocol.
> -
> - @param[in] ImageHandle The firmware allocated handle for the UEFI
> image.
> - @param[in] SystemTable A pointer to the EFI System Table.
> -
> - @retval EFI_SUCCESS The operation completed successfully.
> - @retval EFI_ACCESS_DENIED EFI_ISCSI_INITIATOR_NAME_PROTOCOL was
> installed unexpectedly.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverEntryPoint (
> - IN EFI_HANDLE ImageHandle,
> - IN EFI_SYSTEM_TABLE *SystemTable
> - )
> -{
> - EFI_STATUS Status;
> - EFI_ISCSI_INITIATOR_NAME_PROTOCOL *IScsiInitiatorName;
> -
> - //
> - // There should be only one EFI_ISCSI_INITIATOR_NAME_PROTOCOL.
> - //
> - Status = gBS->LocateProtocol (
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - NULL,
> - (VOID**) &IScsiInitiatorName
> - );
> -
> - if (!EFI_ERROR (Status)) {
> - return EFI_ACCESS_DENIED;
> - }
> -
> - //
> - // Initialize the EFI Driver Library
> - //
> - Status = EfiLibInstallDriverBindingComponentName2 (
> - ImageHandle,
> - SystemTable,
> - &gIScsiDriverBinding,
> - ImageHandle,
> - &gIScsiComponentName,
> - &gIScsiComponentName2
> - );
> -
> - if (!EFI_ERROR (Status)) {
> - //
> - // Install the iSCSI Initiator Name Protocol.
> - //
> - Status = gBS->InstallProtocolInterface (
> - &ImageHandle,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - EFI_NATIVE_INTERFACE,
> - &gIScsiInitiatorName
> - );
> - if (EFI_ERROR (Status)) {
> - gBS->UninstallMultipleProtocolInterfaces (
> - ImageHandle,
> - &gEfiDriverBindingProtocolGuid,
> - &gIScsiDriverBinding,
> - &gEfiComponentName2ProtocolGuid,
> - &gIScsiComponentName2,
> - &gEfiComponentNameProtocolGuid,
> - &gIScsiComponentName,
> - NULL
> - );
> - return Status;
> - }
> -
> - //
> - // Initialize the configuration form of iSCSI.
> - //
> - Status = IScsiConfigFormInit ();
> - if (EFI_ERROR (Status)) {
> - gBS->UninstallMultipleProtocolInterfaces (
> - ImageHandle,
> - &gEfiDriverBindingProtocolGuid,
> - &gIScsiDriverBinding,
> - &gEfiComponentName2ProtocolGuid,
> - &gIScsiComponentName2,
> - &gEfiComponentNameProtocolGuid,
> - &gIScsiComponentName,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - &gIScsiInitiatorName,
> - NULL
> - );
> - }
> - }
> - return Status;
> -}
> -
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c
> deleted file mode 100644
> index db2d6d19366e..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.c
> +++ /dev/null
> @@ -1,412 +0,0 @@
> -/** @file
> - The IScsi's EFI_EXT_SCSI_PASS_THRU_PROTOCOL driver.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -/**
> - Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI
> channel. This function
> - supports both blocking I/O and nonblocking I/O. The blocking I/O functionality
> is required, and the
> - nonblocking I/O functionality is optional.
> -
> - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL
> instance.
> - @param[in] Target The Target is an array of size TARGET_MAX_BYTES and
> it represents
> - the id of the SCSI device to send the SCSI Request Packet. Each
> - transport driver may chose to utilize a subset of this size to suit
> the needs
> - of transport target representation. For example, a Fibre Channel
> driver
> - may use only 8 bytes (WWN) to represent an FC target.
> - @param[in] Lun The LUN of the SCSI device to send the SCSI Request
> Packet.
> - @param[in, out] Packet A pointer to the SCSI Request Packet to send to the
> SCSI device
> - specified by Target and Lun.
> - @param[in] Event If nonblocking I/O is not supported then Event is
> ignored, and blocking
> - I/O is performed. If Event is NULL, then blocking I/O is performed.
> If
> - Event is not NULL and non blocking I/O is supported, then
> - nonblocking I/O is performed, and Event will be signaled when
> the
> - SCSI Request Packet completes.
> -
> - @retval EFI_SUCCESS The SCSI Request Packet was sent by the host. For
> bi-directional
> - commands, InTransferLength bytes were transferred from
> - InDataBuffer. For write and bi-directional commands,
> - OutTransferLength bytes were transferred by
> - OutDataBuffer.
> - @retval EFI_BAD_BUFFER_SIZE The SCSI Request Packet was not executed.
> The number of bytes that
> - could be transferred is returned in InTransferLength. For write
> - and bi-directional commands, OutTransferLength bytes were
> - transferred by OutDataBuffer. Currently not implemeted.
> - @retval EFI_NOT_READY The SCSI Request Packet could not be sent
> because there are too many
> - SCSI Request Packets already queued. The caller may retry
> again later.
> - @retval EFI_DEVICE_ERROR A device error occurred while attempting to
> send the SCSI Request
> - Packet.
> - @retval EFI_INVALID_PARAMETER Target, Lun, or the contents of
> ScsiRequestPacket are invalid.
> - @retval EFI_UNSUPPORTED The command described by the SCSI Request
> Packet is not supported
> - by the host adapter. This includes the case of Bi-directional
> SCSI
> - commands not supported by the implementation. The SCSI
> Request
> - Packet was not sent, so no additional status information is
> available.
> - Currently not implemeted.
> - @retval EFI_TIMEOUT A timeout occurred while waiting for the SCSI
> Request Packet to execute.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruFunction (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
> - IN UINT8 *Target,
> - IN UINT64 Lun,
> - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
> - IN EFI_EVENT Event OPTIONAL
> - )
> -{
> - ISCSI_DRIVER_DATA *Private;
> - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
> - EFI_STATUS Status;
> -
> - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
> - ConfigNvData = &Private->Session.ConfigData.NvData;
> -
> - if (Target[0] != 0 || (CompareMem (&Lun, ConfigNvData->BootLun, sizeof
> (UINT64)) != 0)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if ((Packet == NULL) || (Packet->Cdb == NULL)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet);
> - if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_READY)) {
> - //
> - // Try to reinstate the session and re-execute the Scsi command.
> - //
> - if (EFI_ERROR (IScsiSessionReinstatement (Private))) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - Status = IScsiExecuteScsiCommand (This, Target, Lun, Packet);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Used to retrieve the list of legal Target IDs and LUNs for SCSI devices on a SCSI
> channel. These
> - can either be the list SCSI devices that are actually present on the SCSI channel,
> or the list of legal
> - Target Ids and LUNs for the SCSI channel. Regardless, the caller of this
> function must probe the
> - Target ID and LUN returned to see if a SCSI device is actually present at that
> location on the SCSI
> - channel.
> -
> - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL
> instance.
> - @param[in, out] Target On input, a pointer to the Target ID (an array of size
> - TARGET_MAX_BYTES) of a SCSI device present on the SCSI
> channel.
> - On output, a pointer to the Target ID (an array of
> - TARGET_MAX_BYTES) of the next SCSI device present on a SCSI
> - channel. An input value of 0xF(all bytes in the array are 0xF) in
> the
> - Target array retrieves the Target ID of the first SCSI device
> present on a
> - SCSI channel.
> - @param[in, out] Lun On input, a pointer to the LUN of a SCSI device
> present on the SCSI
> - channel. On output, a pointer to the LUN of the next SCSI device
> present
> - on a SCSI channel.
> -
> - @retval EFI_SUCCESS The Target ID and LUN of the next SCSI device on
> the SCSI
> - channel was returned in Target and Lun.
> - @retval EFI_INVALID_PARAMETER Target array is not all 0xF, and Target and
> Lun were
> - not returned on a previous call to GetNextTargetLun().
> - @retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI
> channel.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruGetNextTargetLun (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
> - IN OUT UINT8 **Target,
> - IN OUT UINT64 *Lun
> - )
> -{
> - ISCSI_DRIVER_DATA *Private;
> - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
> - UINT8 TargetId[TARGET_MAX_BYTES];
> -
> - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
> - ConfigNvData = &Private->Session.ConfigData.NvData;
> -
> - if ((*Target)[0] == 0 && (CompareMem (Lun, ConfigNvData->BootLun, sizeof
> (UINT64)) == 0)) {
> - //
> - // Only one <Target, Lun> pair per iSCSI Driver instance.
> - //
> - return EFI_NOT_FOUND;
> - }
> -
> - SetMem (TargetId, TARGET_MAX_BYTES, 0xFF);
> - if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) {
> - (*Target)[0] = 0;
> - CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64));
> -
> - return EFI_SUCCESS;
> - }
> -
> - return EFI_INVALID_PARAMETER;
> -}
> -
> -/**
> - Used to allocate and build a device path node for a SCSI device on a SCSI
> channel.
> -
> - @param[in] This A pointer to the
> EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
> - @param[in] Target The Target is an array of size TARGET_MAX_BYTES
> and it specifies the
> - Target ID of the SCSI device for which a device path node is to
> be
> - allocated and built. Transport drivers may chose to utilize a
> subset of
> - this size to suit the representation of targets. For example, a
> Fibre
> - Channel driver may use only 8 bytes (WWN) in the array to
> represent a
> - FC target.
> - @param[in] Lun The LUN of the SCSI device for which a device path
> node is to be
> - allocated and built.
> - @param[in, out] DevicePath A pointer to a single device path node that
> describes the SCSI device
> - specified by Target and Lun. This function is responsible for
> - allocating the buffer DevicePath with the boot service
> - AllocatePool(). It is the caller's responsibility to free
> - DevicePath when the caller is finished with DevicePath.
> -
> - @retval EFI_SUCCESS The device path node that describes the SCSI
> device specified by
> - Target and Lun was allocated and returned in
> - DevicePath.
> - @retval EFI_INVALID_PARAMETER DevicePath is NULL.
> - @retval EFI_NOT_FOUND The SCSI devices specified by Target and Lun
> does not exist
> - on the SCSI channel.
> - @retval EFI_OUT_OF_RESOURCES There are not enough resources to
> allocate DevicePath.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruBuildDevicePath (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
> - IN UINT8 *Target,
> - IN UINT64 Lun,
> - IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
> - )
> -{
> - ISCSI_DRIVER_DATA *Private;
> - ISCSI_SESSION *Session;
> - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
> - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig;
> - EFI_DEV_PATH *Node;
> - UINTN DevPathNodeLen;
> -
> - if (DevicePath == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (Target[0] != 0) {
> - return EFI_NOT_FOUND;
> - }
> -
> - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
> - Session = &Private->Session;
> - ConfigNvData = &Session->ConfigData.NvData;
> - AuthConfig = &Session->AuthData.AuthConfig;
> -
> - if (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0) {
> - return EFI_NOT_FOUND;
> - }
> -
> - DevPathNodeLen = sizeof (ISCSI_DEVICE_PATH) + AsciiStrLen (ConfigNvData-
> >TargetName) + 1;
> - Node = AllocatePool (DevPathNodeLen);
> - if (Node == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Node->DevPath.Type = MESSAGING_DEVICE_PATH;
> - Node->DevPath.SubType = MSG_ISCSI_DP;
> - SetDevicePathNodeLength (&Node->DevPath, (UINT16)DevPathNodeLen);
> -
> - //
> - // 0 for TCP, others are reserved.
> - //
> - Node->Iscsi.NetworkProtocol = 0;
> -
> - Node->Iscsi.LoginOption = 0;
> - switch (AuthConfig->CHAPType) {
> - case ISCSI_CHAP_NONE:
> - Node->Iscsi.LoginOption |= 0x0800;
> - break;
> -
> - case ISCSI_CHAP_UNI:
> - Node->Iscsi.LoginOption |= 0x1000;
> - break;
> -
> - default:
> - break;
> - }
> -
> - CopyMem (&Node->Iscsi.Lun, ConfigNvData->BootLun, sizeof (UINT64));
> - Node->Iscsi.TargetPortalGroupTag = Session->TargetPortalGroupTag;
> - AsciiStrCpyS ((CHAR8 *) Node + sizeof (ISCSI_DEVICE_PATH), AsciiStrLen
> (ConfigNvData->TargetName) + 1, ConfigNvData->TargetName);
> -
> - *DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Node;
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Used to translate a device path node to a Target ID and LUN.
> -
> - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL
> instance.
> - @param[in] DevicePath A pointer to a single device path node that describes
> the SCSI device
> - on the SCSI channel.
> - @param[out] Target A pointer to the Target Array which represents the ID
> of a SCSI device
> - on the SCSI channel.
> - @param[out] Lun A pointer to the LUN of a SCSI device on the SCSI
> channel.
> -
> - @retval EFI_SUCCESS DevicePath was successfully translated to a Target
> ID and
> - LUN, and they were returned in Target and Lun.
> - @retval EFI_INVALID_PARAMETER DevicePath or Target or Lun is NULL.
> - @retval EFI_NOT_FOUND A valid translation from DevicePath to a Target
> ID and LUN
> - does not exist.Currently not implemented.
> - @retval EFI_UNSUPPORTED This driver does not support the device path
> node type in
> - DevicePath.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruGetTargetLun (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
> - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
> - OUT UINT8 **Target,
> - OUT UINT64 *Lun
> - )
> -{
> - ISCSI_DRIVER_DATA *Private;
> - ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
> -
> - if ((DevicePath == NULL) || (Target == NULL) || (Lun == NULL)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if ((DevicePath->Type != MESSAGING_DEVICE_PATH) ||
> - (DevicePath->SubType != MSG_ISCSI_DP) ||
> - (DevicePathNodeLength (DevicePath) <= sizeof (ISCSI_DEVICE_PATH))
> - ) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
> - ConfigNvData = &Private->Session.ConfigData.NvData;
> -
> - SetMem (*Target, TARGET_MAX_BYTES, 0xFF);
> - (*Target)[0] = 0;
> -
> - if (AsciiStrCmp (ConfigNvData->TargetName, (CHAR8 *) DevicePath + sizeof
> (ISCSI_DEVICE_PATH)) != 0) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - CopyMem (Lun, ConfigNvData->BootLun, sizeof (UINT64));
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Resets a SCSI channel. This operation resets all the SCSI devices connected to
> the SCSI channel.
> - Currently not implemented.
> -
> - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL
> instance.
> -
> - @retval EFI_SUCCESS The SCSI channel was reset.
> - @retval EFI_DEVICE_ERROR A device error occurred while attempting to reset
> the SCSI channel.
> - @retval EFI_TIMEOUT A timeout occurred while attempting to reset the
> SCSI channel.
> - @retval EFI_UNSUPPORTED The SCSI channel does not support a channel
> reset operation.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruResetChannel (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This
> - )
> -{
> - return EFI_UNSUPPORTED;
> -}
> -
> -/**
> - Resets a SCSI logical unit that is connected to a SCSI channel. Currently not
> implemented.
> -
> - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL
> instance.
> - @param[in] Target The Target is an array of size TARGET_MAX_BYTE and it
> represents the
> - target port ID of the SCSI device containing the SCSI logical unit to
> - reset. Transport drivers may chose to utilize a subset of this array to
> suit
> - the representation of their targets.
> - @param[in] Lun The LUN of the SCSI device to reset.
> -
> - @retval EFI_SUCCESS The SCSI device specified by Target and Lun was
> reset.
> - @retval EFI_INVALID_PARAMETER Target or Lun is NULL.
> - @retval EFI_TIMEOUT A timeout occurred while attempting to reset the
> SCSI device
> - specified by Target and Lun.
> - @retval EFI_UNSUPPORTED The SCSI channel does not support a target
> reset operation.
> - @retval EFI_DEVICE_ERROR A device error occurred while attempting to
> reset the SCSI device
> - specified by Target and Lun.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruResetTargetLun (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
> - IN UINT8 *Target,
> - IN UINT64 Lun
> - )
> -{
> - return EFI_UNSUPPORTED;
> -}
> -
> -/**
> - Used to retrieve the list of legal Target IDs for SCSI devices on a SCSI channel.
> These can either
> - be the list SCSI devices that are actually present on the SCSI channel, or the list
> of legal Target IDs
> - for the SCSI channel. Regardless, the caller of this function must probe the
> Target ID returned to
> - see if a SCSI device is actually present at that location on the SCSI channel.
> -
> - @param[in] This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL
> instance.
> - @param[in, out] Target (TARGET_MAX_BYTES) of a SCSI device present on
> the SCSI channel.
> - On output, a pointer to the Target ID (an array of
> - TARGET_MAX_BYTES) of the next SCSI device present on a SCSI
> - channel. An input value of 0xF(all bytes in the array are 0xF) in
> the
> - Target array retrieves the Target ID of the first SCSI device
> present on a
> - SCSI channel.
> -
> - @retval EFI_SUCCESS The Target ID of the next SCSI device on the SCSI
> - channel was returned in Target.
> - @retval EFI_INVALID_PARAMETER Target or Lun is NULL.
> - @retval EFI_TIMEOUT Target array is not all 0xF, and Target were not
> - returned on a previous call to GetNextTarget().
> - Currently not implemented.
> - @retval EFI_NOT_FOUND There are no more SCSI devices on this SCSI
> channel.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiExtScsiPassThruGetNextTarget (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
> - IN OUT UINT8 **Target
> - )
> -{
> - UINT8 TargetId[TARGET_MAX_BYTES];
> -
> - SetMem (TargetId, TARGET_MAX_BYTES, 0xFF);
> -
> - if (CompareMem (*Target, TargetId, TARGET_MAX_BYTES) == 0) {
> - (*Target)[0] = 0;
> - return EFI_SUCCESS;
> - } else if ((*Target)[0] == 0) {
> - return EFI_NOT_FOUND;
> - } else {
> - return EFI_INVALID_PARAMETER;
> - }
> -}
> -
> -EFI_EXT_SCSI_PASS_THRU_PROTOCOL gIScsiExtScsiPassThruProtocolTemplate
> = {
> - NULL,
> - IScsiExtScsiPassThruFunction,
> - IScsiExtScsiPassThruGetNextTargetLun,
> - IScsiExtScsiPassThruBuildDevicePath,
> - IScsiExtScsiPassThruGetTargetLun,
> - IScsiExtScsiPassThruResetChannel,
> - IScsiExtScsiPassThruResetTargetLun,
> - IScsiExtScsiPassThruGetNextTarget
> -};
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c
> deleted file mode 100644
> index 58c5447dcbd1..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.c
> +++ /dev/null
> @@ -1,539 +0,0 @@
> -/** @file
> - Implementation for iSCSI Boot Firmware Table publication.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -BOOLEAN mIbftInstalled = FALSE;
> -UINTN mTableKey;
> -
> -/**
> - Initialize the header of the iSCSI Boot Firmware Table.
> -
> - @param[out] Header The header of the iSCSI Boot Firmware Table.
> - @param[in] OemId The OEM ID.
> - @param[in] OemTableId The OEM table ID for the iBFT.
> -**/
> -VOID
> -IScsiInitIbfTableHeader (
> - OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Header,
> - IN UINT8 *OemId,
> - IN UINT64 *OemTableId
> - )
> -{
> - ZeroMem (Header, sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER));
> -
> - Header->Signature =
> EFI_ACPI_3_0_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE;
> - Header->Length = IBFT_HEAP_OFFSET;
> - Header->Revision = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_REVISION;
> - Header->Checksum = 0;
> -
> - CopyMem (Header->OemId, OemId, sizeof (Header->OemId));
> - CopyMem (&Header->OemTableId, OemTableId, sizeof (UINT64));
> -}
> -
> -/**
> - Initialize the control section of the iSCSI Boot Firmware Table.
> -
> - @param[in] Table The ACPI table.
> - @param[in] HandleCount The number of the handles associated with iSCSI
> sessions, it's
> - equal to the number of iSCSI sessions.
> -**/
> -VOID
> -IScsiInitControlSection (
> - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table,
> - IN UINTN HandleCount
> - )
> -{
> - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control;
> - UINTN NumOffset;
> -
> - Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE
> *) (Table + 1);
> -
> - ZeroMem (Control, sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE));
> -
> - Control->Header.StructureId =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_ID;
> - Control->Header.Version =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_VERSION;
> - Control->Header.Length = (UINT16) sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE);
> -
> - //
> - // Each session occupies two offsets, one for the NIC section,
> - // the other for the Target section.
> - //
> - NumOffset = 2 * HandleCount;
> - if (NumOffset > 4) {
> - //
> - // Need expand the control section if more than 2 NIC/Target sections
> - // exist.
> - //
> - Control->Header.Length = (UINT16) (Control->Header.Length + (NumOffset -
> 4) * sizeof (UINT16));
> - }
> -}
> -
> -/**
> - Add one item into the heap.
> -
> - @param[in, out] Heap On input, the current address of the heap; On output,
> the address of
> - the heap after the item is added.
> - @param[in] Data The data to add into the heap.
> - @param[in] Len Length of the Data in byte.
> -**/
> -VOID
> -IScsiAddHeapItem (
> - IN OUT UINT8 **Heap,
> - IN VOID *Data,
> - IN UINTN Len
> - )
> -{
> - //
> - // Add one byte for the NULL delimiter.
> - //
> - *Heap -= Len + 1;
> -
> - CopyMem (*Heap, Data, Len);
> - *(*Heap + Len) = 0;
> -}
> -
> -/**
> - Fill the Initiator section of the iSCSI Boot Firmware Table.
> -
> - @param[in] Table The ACPI table.
> - @param[in, out] Heap The heap.
> - @param[in] Handle The handle associated with the iSCSI session.
> -**/
> -VOID
> -IScsiFillInitiatorSection (
> - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table,
> - IN OUT UINT8 **Heap,
> - IN EFI_HANDLE Handle
> - )
> -{
> - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control;
> - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *Initiator;
> - ISCSI_DRIVER_DATA *DriverData;
> - ISCSI_SESSION *Session;
> - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
> - EFI_STATUS Status;
> -
> - Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE
> *) (Table + 1);
> -
> - //
> - // Initiator section immediately follows the control section.
> - //
> - Initiator = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE
> *) ((UINT8 *) Control + IBFT_ROUNDUP (Control->Header.Length));
> -
> - Control->InitiatorOffset = (UINT16) ((UINTN) Initiator - (UINTN) Table);
> -
> - ZeroMem (Initiator, sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE));
> -
> - Initiator->Header.StructureId =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_ID;
> - Initiator->Header.Version =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_VERSION;
> - Initiator->Header.Length = (UINT16) sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE);
> - Initiator->Header.Flags =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BLOC
> K_VALID |
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BOO
> T_SELECTED;
> -
> - //
> - // Get the identifier from the handle.
> - //
> - Status = gBS->HandleProtocol (Handle, &gEfiCallerIdGuid, (VOID **)
> &IScsiIdentifier);
> - if (EFI_ERROR (Status)) {
> - ASSERT (FALSE);
> - return ;
> - }
> -
> - DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
> - Session = &DriverData->Session;
> -
> - //
> - // Fill the iSCSI Initiator Name into the heap.
> - //
> - IScsiAddHeapItem (Heap, Session->InitiatorName, Session-
> >InitiatorNameLength - 1);
> -
> - Initiator->IScsiNameLength = (UINT16) (Session->InitiatorNameLength - 1);
> - Initiator->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
> -}
> -
> -/**
> - Map the v4 IP address into v6 IP address.
> -
> - @param[in] V4 The v4 IP address.
> - @param[out] V6 The v6 IP address.
> -**/
> -VOID
> -IScsiMapV4ToV6Addr (
> - IN EFI_IPv4_ADDRESS *V4,
> - OUT EFI_IPv6_ADDRESS *V6
> - )
> -{
> - UINTN Index;
> -
> - ZeroMem (V6, sizeof (EFI_IPv6_ADDRESS));
> -
> - V6->Addr[10] = 0xff;
> - V6->Addr[11] = 0xff;
> -
> - for (Index = 0; Index < 4; Index++) {
> - V6->Addr[12 + Index] = V4->Addr[Index];
> - }
> -}
> -
> -/**
> - Get the NIC's PCI location and return it according to the composited
> - format defined in iSCSI Boot Firmware Table.
> -
> - @param[in] Controller The handle of the controller.
> -
> - @return UINT16 The composited representation of the NIC PCI location.
> - @retval 0 Other errors as indicated.
> -**/
> -UINT16
> -IScsiGetNICPciLocation (
> - IN EFI_HANDLE Controller
> - )
> -{
> - EFI_STATUS Status;
> - EFI_DEVICE_PATH_PROTOCOL *DevicePath;
> - EFI_HANDLE PciIoHandle;
> - EFI_PCI_IO_PROTOCOL *PciIo;
> - UINTN Segment;
> - UINTN Bus;
> - UINTN Device;
> - UINTN Function;
> -
> - Status = gBS->HandleProtocol (
> - Controller,
> - &gEfiDevicePathProtocolGuid,
> - (VOID **)&DevicePath
> - );
> - if (EFI_ERROR (Status)) {
> - return 0;
> - }
> -
> - Status = gBS->LocateDevicePath (
> - &gEfiPciIoProtocolGuid,
> - &DevicePath,
> - &PciIoHandle
> - );
> - if (EFI_ERROR (Status)) {
> - return 0;
> - }
> -
> - Status = gBS->HandleProtocol (PciIoHandle, &gEfiPciIoProtocolGuid, (VOID
> **)&PciIo);
> - if (EFI_ERROR (Status)) {
> - return 0;
> - }
> -
> - Status = PciIo->GetLocation (PciIo, &Segment, &Bus, &Device, &Function);
> - if (EFI_ERROR (Status)) {
> - return 0;
> - }
> -
> - return (UINT16) ((Bus << 8) | (Device << 3) | Function);
> -}
> -
> -/**
> - Fill the NIC and target sections in iSCSI Boot Firmware Table.
> -
> - @param[in] Table The buffer of the ACPI table.
> - @param[in, out] Heap The heap buffer used to store the variable length
> parameters such as iSCSI name.
> - @param[in] HandleCount Count The number of handles having iSCSI
> private protocol installed.
> - @param[in] Handles The handle buffer.
> -**/
> -VOID
> -IScsiFillNICAndTargetSections (
> - IN EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table,
> - IN OUT UINT8 **Heap,
> - IN UINTN HandleCount,
> - IN EFI_HANDLE *Handles
> - )
> -{
> - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control;
> - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *Nic;
> - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *Target;
> - ISCSI_DRIVER_DATA *DriverData;
> - ISCSI_SESSION_CONFIG_DATA *SessionConfigData;
> - ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig;
> - UINT16 *SectionOffset;
> - UINTN Index;
> - UINT16 Length;
> - EFI_MAC_ADDRESS MacAddress;
> - UINTN HwAddressSize;
> - ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
> - EFI_STATUS Status;
> -
> - //
> - // Get the offset of the first Nic and Target section.
> - //
> - Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE
> *) (Table + 1);
> - Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *)
> ((UINTN) Table +
> - Control->InitiatorOffset + IBFT_ROUNDUP (sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE)));
> - Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *)
> ((UINTN) Nic +
> - IBFT_ROUNDUP (sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));
> -
> - SectionOffset = &Control->NIC0Offset;
> -
> - for (Index = 0; Index < HandleCount; Index++) {
> - Status = gBS->HandleProtocol (Handles[Index], &gEfiCallerIdGuid, (VOID
> **)&IScsiIdentifier);
> - if (EFI_ERROR (Status)) {
> - ASSERT (FALSE);
> - return ;
> - }
> -
> - DriverData = ISCSI_DRIVER_DATA_FROM_IDENTIFIER (IScsiIdentifier);
> - SessionConfigData = &DriverData->Session.ConfigData;
> - AuthConfig = &DriverData->Session.AuthData.AuthConfig;
> -
> - //
> - // Fill the Nic section.
> - //
> - ZeroMem (Nic, sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE));
> -
> - Nic->Header.StructureId =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_ID;
> - Nic->Header.Version =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_VERSION;
> - Nic->Header.Length = (UINT16) sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE);
> - Nic->Header.Index = (UINT8) Index;
> - Nic->Header.Flags =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BLOCK_VAL
> ID |
> -
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BOOT_SELE
> CTED |
> -
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_GLOBAL;
> -
> - //
> - // Get the subnet mask prefix length.
> - //
> - Nic->SubnetMaskPrefixLength = IScsiGetSubnetMaskPrefixLength
> (&SessionConfigData->NvData.SubnetMask);
> -
> - if (SessionConfigData->NvData.InitiatorInfoFromDhcp) {
> - Nic->Origin = IpPrefixOriginDhcp;
> - } else {
> - Nic->Origin = IpPrefixOriginManual;
> - }
> - //
> - // Map the various v4 addresses into v6 addresses.
> - //
> - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.LocalIp, &Nic->Ip);
> - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.Gateway, &Nic-
> >Gateway);
> - IScsiMapV4ToV6Addr (&SessionConfigData->PrimaryDns, &Nic->PrimaryDns);
> - IScsiMapV4ToV6Addr (&SessionConfigData->SecondaryDns, &Nic-
> >SecondaryDns);
> - IScsiMapV4ToV6Addr (&SessionConfigData->DhcpServer, &Nic->DhcpServer);
> -
> - Nic->VLanTag = NetLibGetVlanId (DriverData->Controller);
> -
> - Status = NetLibGetMacAddress (DriverData->Controller, &MacAddress,
> &HwAddressSize);
> - ASSERT (Status == EFI_SUCCESS);
> - CopyMem (Nic->Mac, MacAddress.Addr, sizeof (Nic->Mac));
> -
> - //
> - // Get the PCI location of the Nic.
> - //
> - Nic->PciLocation = IScsiGetNICPciLocation (DriverData->Controller);
> -
> - *SectionOffset = (UINT16) ((UINTN) Nic - (UINTN) Table);
> - SectionOffset++;
> -
> - //
> - // Fill the Target section.
> - //
> - ZeroMem (Target, sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE));
> -
> - Target->Header.StructureId =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_ID;
> - Target->Header.Version =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_VERSION;
> - Target->Header.Length = (UINT16) sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE);
> - Target->Header.Index = (UINT8) Index;
> - Target->Header.Flags =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BLOCK_
> VALID |
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BOOT_
> SELECTED;
> - Target->Port = SessionConfigData->NvData.TargetPort;
> - Target->NicIndex = (UINT8) Index;
> -
> - if (AuthConfig->CHAPType == ISCSI_CHAP_NONE) {
> - Target->CHAPType =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_
> NO_CHAP;
> - } if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) {
> - Target->CHAPType =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_C
> HAP;
> - } else if (AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL) {
> - Target->CHAPType =
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_
> MUTUAL_CHAP;
> - }
> -
> - IScsiMapV4ToV6Addr (&SessionConfigData->NvData.TargetIp, &Target->Ip);
> - CopyMem (Target->BootLun, SessionConfigData->NvData.BootLun, sizeof
> (Target->BootLun));
> -
> - //
> - // Target iSCSI Name, CHAP name/secret, reverse CHAP name/secret.
> - //
> - Length = (UINT16) AsciiStrLen (SessionConfigData->NvData.TargetName);
> - IScsiAddHeapItem (Heap, SessionConfigData->NvData.TargetName, Length);
> -
> - Target->IScsiNameLength = Length;
> - Target->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
> -
> - if (Target->CHAPType !=
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_
> NO_CHAP) {
> - //
> - // CHAP Name
> - //
> - Length = (UINT16) AsciiStrLen (AuthConfig->CHAPName);
> - IScsiAddHeapItem (Heap, AuthConfig->CHAPName, Length);
> - Target->CHAPNameLength = Length;
> - Target->CHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
> -
> - //
> - // CHAP Secret
> - //
> - Length = (UINT16) AsciiStrLen (AuthConfig->CHAPSecret);
> - IScsiAddHeapItem (Heap, AuthConfig->CHAPSecret, Length);
> - Target->CHAPSecretLength = Length;
> - Target->CHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
> -
> - if (Target->CHAPType ==
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_
> MUTUAL_CHAP) {
> - //
> - // Reverse CHAP Name
> - //
> - Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPName);
> - IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPName, Length);
> - Target->ReverseCHAPNameLength = Length;
> - Target->ReverseCHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN)
> Table);
> -
> - //
> - // Reverse CHAP Secret
> - //
> - Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPSecret);
> - IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPSecret, Length);
> - Target->ReverseCHAPSecretLength = Length;
> - Target->ReverseCHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN)
> Table);
> - }
> - }
> -
> - *SectionOffset = (UINT16) ((UINTN) Target - (UINTN) Table);
> - SectionOffset++;
> -
> - //
> - // Advance to the next NIC/Target pair
> - //
> - Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *)
> ((UINTN) Target +
> - IBFT_ROUNDUP (sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE)));
> - Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *)
> ((UINTN) Nic +
> - IBFT_ROUNDUP (sizeof
> (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));
> - }
> -}
> -
> -/**
> - Publish and remove the iSCSI Boot Firmware Table according to the iSCSI
> - session status.
> -**/
> -VOID
> -IScsiPublishIbft (
> - VOID
> - )
> -{
> - EFI_STATUS Status;
> - EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol;
> - EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Table;
> - UINTN HandleCount;
> - EFI_HANDLE *HandleBuffer;
> - UINT8 *Heap;
> - UINT8 Checksum;
> - EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;
> - EFI_ACPI_DESCRIPTION_HEADER *Rsdt;
> - EFI_ACPI_DESCRIPTION_HEADER *Xsdt;
> -
> - Rsdt = NULL;
> - Xsdt = NULL;
> -
> - Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID
> **)&AcpiTableProtocol);
> - if (EFI_ERROR (Status)) {
> - return ;
> - }
> -
> -
> - //
> - // Find ACPI table RSD_PTR from system table
> - //
> - Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **)
> &Rsdp);
> - if (EFI_ERROR (Status)) {
> - Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **)
> &Rsdp);
> - }
> -
> - if (EFI_ERROR (Status) || (Rsdp == NULL)) {
> - return ;
> - } else if (Rsdp->Revision >=
> EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION && Rsdp-
> >XsdtAddress != 0) {
> - Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress;
> - } else if (Rsdp->RsdtAddress != 0) {
> - Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress;
> - }
> -
> - if ((Xsdt == NULL) && (Rsdt == NULL)) {
> - return ;
> - }
> -
> - if (mIbftInstalled) {
> - Status = AcpiTableProtocol->UninstallAcpiTable (
> - AcpiTableProtocol,
> - mTableKey
> - );
> - if (EFI_ERROR (Status)) {
> - return ;
> - }
> - mIbftInstalled = FALSE;
> - }
> -
> - //
> - // Get all iSCSI private protocols.
> - //
> - Status = gBS->LocateHandleBuffer (
> - ByProtocol,
> - &gEfiCallerIdGuid,
> - NULL,
> - &HandleCount,
> - &HandleBuffer
> - );
> - if (EFI_ERROR (Status)) {
> - return ;
> - }
> - //
> - // Allocate 4k bytes to hold the ACPI table.
> - //
> - Table = AllocateZeroPool (IBFT_MAX_SIZE);
> - if (Table == NULL) {
> - return ;
> - }
> -
> - Heap = (UINT8 *) Table + IBFT_HEAP_OFFSET;
> -
> - //
> - // Fill in the various section of the iSCSI Boot Firmware Table.
> - //
> - if (Rsdp->Revision >=
> EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) {
> - IScsiInitIbfTableHeader (Table, Xsdt->OemId, &Xsdt->OemTableId);
> - } else {
> - IScsiInitIbfTableHeader (Table, Rsdt->OemId, &Rsdt->OemTableId);
> - }
> -
> - IScsiInitControlSection (Table, HandleCount);
> - IScsiFillInitiatorSection (Table, &Heap, HandleBuffer[0]);
> - IScsiFillNICAndTargetSections (Table, &Heap, HandleCount, HandleBuffer);
> -
> - Checksum = CalculateCheckSum8((UINT8 *)Table, Table->Length);
> - Table->Checksum = Checksum;
> -
> - FreePool (HandleBuffer);
> -
> - //
> - // Install or update the iBFT table.
> - //
> - Status = AcpiTableProtocol->InstallAcpiTable (
> - AcpiTableProtocol,
> - Table,
> - Table->Length,
> - &mTableKey
> - );
> - if (EFI_ERROR(Status)) {
> - return;
> - }
> -
> - mIbftInstalled = TRUE;
> - FreePool (Table);
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c
> deleted file mode 100644
> index e753d9eebdbe..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.c
> +++ /dev/null
> @@ -1,116 +0,0 @@
> -/** @file
> - Implementation for EFI iSCSI Initiator Name Protocol.
> -
> -Copyright (c) 2004 - 2011, 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName = {
> - IScsiGetInitiatorName,
> - IScsiSetInitiatorName
> -};
> -
> -/**
> - Retrieves the current set value of iSCSI Initiator Name.
> -
> - @param[in] This Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer /
> Actual size of the
> - variable data buffer.
> - @param[out] Buffer Pointer to the buffer for data to be read. The data is
> a null-terminated UTF-8 encoded string.
> - The maximum length is 223 characters, including the null-
> terminator.
> -
> - @retval EFI_SUCCESS Data was successfully retrieved into the provided
> buffer and the
> - BufferSize was sufficient to handle the iSCSI initiator name.
> - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result.
> - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
> - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be retrieved
> due to a hardware error.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiGetInitiatorName (
> - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
> - IN OUT UINTN *BufferSize,
> - OUT VOID *Buffer
> - )
> -{
> - EFI_STATUS Status;
> -
> - if ((BufferSize == NULL) || (Buffer == NULL)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Status = gRT->GetVariable (
> - ISCSI_INITIATOR_NAME_VAR_NAME,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - NULL,
> - BufferSize,
> - Buffer
> - );
> -
> - return Status;
> -}
> -
> -/**
> - Sets the iSCSI Initiator Name.
> -
> - @param[in] This Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer.
> - @param[in] Buffer Pointer to the buffer for data to be written. The data
> is a null-terminated UTF-8 encoded string.
> - The maximum length is 223 characters, including the null-
> terminator.
> -
> - @retval EFI_SUCCESS Data was successfully stored by the protocol.
> - @retval EFI_UNSUPPORTED Platform policies do not allow for data to be
> written.
> - Currently not implemented.
> - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize
> exceeds the maximum allowed limit.
> - @retval EFI_DEVICE_ERROR The data could not be stored due to a
> hardware error.
> - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold
> the data.
> - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not adhere
> to RFC 3720
> - (and other related protocols).
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiSetInitiatorName (
> - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
> - IN OUT UINTN *BufferSize,
> - IN VOID *Buffer
> - )
> -{
> - EFI_STATUS Status;
> -
> - if ((BufferSize == NULL) || (Buffer == NULL)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (*BufferSize > ISCSI_NAME_MAX_SIZE) {
> - *BufferSize = ISCSI_NAME_MAX_SIZE;
> - return EFI_INVALID_PARAMETER;
> - }
> - //
> - // only support iqn iSCSI names.
> - //
> - Status = IScsiNormalizeName ((CHAR8 *) Buffer, *BufferSize - 1);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - Status = gRT->SetVariable (
> - ISCSI_INITIATOR_NAME_VAR_NAME,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - EFI_VARIABLE_NON_VOLATILE |
> EFI_VARIABLE_BOOTSERVICE_ACCESS,
> - *BufferSize,
> - Buffer
> - );
> -
> - return Status;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
> deleted file mode 100644
> index d924a8b82427..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
> +++ /dev/null
> @@ -1,948 +0,0 @@
> -/** @file
> - Miscellaneous routines for iSCSI driver.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 IScsiHexString[] =
> "0123456789ABCDEFabcdef";
> -
> -/**
> - Removes (trims) specified leading and trailing characters from a string.
> -
> - @param[in, out] Str Pointer to the null-terminated string to be trimmed. On
> return,
> - Str will hold the trimmed string.
> -
> - @param[in] CharC Character will be trimmed from str.
> -**/
> -VOID
> -StrTrim (
> - IN OUT CHAR16 *Str,
> - IN CHAR16 CharC
> - )
> -{
> - CHAR16 *Pointer1;
> - CHAR16 *Pointer2;
> -
> - if (*Str == 0) {
> - return;
> - }
> -
> - //
> - // Trim off the leading and trailing characters c
> - //
> - for (Pointer1 = Str; (*Pointer1 != 0) && (*Pointer1 == CharC); Pointer1++) {
> - ;
> - }
> -
> - Pointer2 = Str;
> - if (Pointer2 == Pointer1) {
> - while (*Pointer1 != 0) {
> - Pointer2++;
> - Pointer1++;
> - }
> - } else {
> - while (*Pointer1 != 0) {
> - *Pointer2 = *Pointer1;
> - Pointer1++;
> - Pointer2++;
> - }
> - *Pointer2 = 0;
> - }
> -
> -
> - for (Pointer1 = Str + StrLen(Str) - 1; Pointer1 >= Str && *Pointer1 == CharC;
> Pointer1--) {
> - ;
> - }
> - if (Pointer1 != Str + StrLen(Str) - 1) {
> - *(Pointer1 + 1) = 0;
> - }
> -}
> -
> -/**
> - Calculate the prefix length of the IPv4 subnet mask.
> -
> - @param[in] SubnetMask The IPv4 subnet mask.
> -
> - @return The prefix length of the subnet mask.
> - @retval 0 Other errors as indicated.
> -**/
> -UINT8
> -IScsiGetSubnetMaskPrefixLength (
> - IN EFI_IPv4_ADDRESS *SubnetMask
> - )
> -{
> - UINT8 Len;
> - UINT32 ReverseMask;
> -
> - //
> - // The SubnetMask is in network byte order.
> - //
> - ReverseMask = (SubnetMask->Addr[0] << 24) | (SubnetMask->Addr[1] << 16) |
> (SubnetMask->Addr[2] << 8) | (SubnetMask->Addr[3]);
> -
> - //
> - // Reverse it.
> - //
> - ReverseMask = ~ReverseMask;
> -
> - if ((ReverseMask & (ReverseMask + 1)) != 0) {
> - return 0;
> - }
> -
> - Len = 0;
> -
> - while (ReverseMask != 0) {
> - ReverseMask = ReverseMask >> 1;
> - Len++;
> - }
> -
> - return (UINT8) (32 - Len);
> -}
> -
> -/**
> - Convert the hexadecimal encoded LUN string into the 64-bit LUN.
> -
> - @param[in] Str The hexadecimal encoded LUN string.
> - @param[out] Lun Storage to return the 64-bit LUN.
> -
> - @retval EFI_SUCCESS The 64-bit LUN is stored in Lun.
> - @retval EFI_INVALID_PARAMETER The string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiAsciiStrToLun (
> - IN CHAR8 *Str,
> - OUT UINT8 *Lun
> - )
> -{
> - UINTN Index, IndexValue, IndexNum, SizeStr;
> - CHAR8 TemStr[2];
> - UINT8 TemValue;
> - UINT16 Value[4];
> -
> - ZeroMem (Lun, 8);
> - ZeroMem (TemStr, 2);
> - ZeroMem ((UINT8 *) Value, sizeof (Value));
> - SizeStr = AsciiStrLen (Str);
> - IndexValue = 0;
> - IndexNum = 0;
> -
> - for (Index = 0; Index < SizeStr; Index ++) {
> - TemStr[0] = Str[Index];
> - TemValue = (UINT8) AsciiStrHexToUint64 (TemStr);
> - if (TemValue == 0 && TemStr[0] != '0') {
> - if ((TemStr[0] != '-') || (IndexNum == 0)) {
> - //
> - // Invalid Lun Char
> - //
> - return EFI_INVALID_PARAMETER;
> - }
> - }
> -
> - if ((TemValue == 0) && (TemStr[0] == '-')) {
> - //
> - // Next Lun value
> - //
> - if (++IndexValue >= 4) {
> - //
> - // Max 4 Lun value
> - //
> - return EFI_INVALID_PARAMETER;
> - }
> - //
> - // Restart str index for the next lun value
> - //
> - IndexNum = 0;
> - continue;
> - }
> -
> - if (++IndexNum > 4) {
> - //
> - // Each Lun Str can't exceed size 4, because it will be as UINT16 value
> - //
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - //
> - // Combine UINT16 value
> - //
> - Value[IndexValue] = (UINT16) ((Value[IndexValue] << 4) + TemValue);
> - }
> -
> - for (Index = 0; Index <= IndexValue; Index ++) {
> - *((UINT16 *) &Lun[Index * 2]) = HTONS (Value[Index]);
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Convert the 64-bit LUN into the hexadecimal encoded LUN string.
> -
> - @param[in] Lun The 64-bit LUN.
> - @param[out] Str The storage to return the hexadecimal encoded LUN string.
> -**/
> -VOID
> -IScsiLunToUnicodeStr (
> - IN UINT8 *Lun,
> - OUT CHAR16 *Str
> - )
> -{
> - UINTN Index;
> - CHAR16 *TempStr;
> -
> - TempStr = Str;
> -
> - for (Index = 0; Index < 4; Index++) {
> -
> - if ((Lun[2 * Index] | Lun[2 * Index + 1]) == 0) {
> - CopyMem(TempStr, L"0-", sizeof (L"0-"));
> - } else {
> - TempStr[0] = (CHAR16) IScsiHexString[Lun[2 * Index] >> 4];
> - TempStr[1] = (CHAR16) IScsiHexString[Lun[2 * Index] & 0x0F];
> - TempStr[2] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] >> 4];
> - TempStr[3] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] & 0x0F];
> - TempStr[4] = L'-';
> - TempStr[5] = 0;
> -
> - StrTrim (TempStr, L'0');
> - }
> -
> - TempStr += StrLen (TempStr);
> - }
> -
> - ASSERT (StrLen(Str) >= 1);
> - Str[StrLen (Str) - 1] = 0;
> -
> - for (Index = StrLen (Str) - 1; Index > 1; Index = Index - 2) {
> - if ((Str[Index] == L'0') && (Str[Index - 1] == L'-')) {
> - Str[Index - 1] = 0;
> - } else {
> - break;
> - }
> - }
> -}
> -
> -/**
> - Convert the ASCII string into a UNICODE string.
> -
> - @param[in] Source The ASCII string.
> - @param[out] Destination The storage to return the UNICODE string.
> -
> - @return CHAR16 * Pointer to the UNICODE string.
> -**/
> -CHAR16 *
> -IScsiAsciiStrToUnicodeStr (
> - IN CHAR8 *Source,
> - OUT CHAR16 *Destination
> - )
> -{
> - ASSERT (Destination != NULL);
> - ASSERT (Source != NULL);
> -
> - while (*Source != '\0') {
> - *(Destination++) = (CHAR16) *(Source++);
> - }
> -
> - *Destination = '\0';
> -
> - return Destination;
> -}
> -
> -/**
> - Convert the UNICODE string into an ASCII string.
> -
> - @param[in] Source The UNICODE string.
> - @param[out] Destination The storage to return the ASCII string.
> -
> - @return CHAR8 * Pointer to the ASCII string.
> -**/
> -CHAR8 *
> -IScsiUnicodeStrToAsciiStr (
> - IN CHAR16 *Source,
> - OUT CHAR8 *Destination
> - )
> -{
> - ASSERT (Destination != NULL);
> - ASSERT (Source != NULL);
> -
> - while (*Source != '\0') {
> - //
> - // If any Unicode characters in Source contain
> - // non-zero value in the upper 8 bits, then ASSERT().
> - //
> - ASSERT (*Source < 0x100);
> - *(Destination++) = (CHAR8) *(Source++);
> - }
> -
> - *Destination = '\0';
> -
> - return Destination;
> -}
> -
> -/**
> - Convert the decimal dotted IPv4 address into the binary IPv4 address.
> -
> - @param[in] Str The UNICODE string.
> - @param[out] Ip The storage to return the ASCII string.
> -
> - @retval EFI_SUCCESS The binary IP address is returned in Ip.
> - @retval EFI_INVALID_PARAMETER The IP string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiAsciiStrToIp (
> - IN CHAR8 *Str,
> - OUT EFI_IPv4_ADDRESS *Ip
> - )
> -{
> - UINTN Index;
> - UINTN Number;
> -
> - Index = 0;
> -
> - while (*Str != 0) {
> -
> - if (Index > 3) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Number = 0;
> - while (NET_IS_DIGIT (*Str)) {
> - Number = Number * 10 + (*Str - '0');
> - Str++;
> - }
> -
> - if (Number > 0xFF) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Ip->Addr[Index] = (UINT8) Number;
> -
> - if ((*Str != '\0') && (*Str != '.')) {
> - //
> - // The current character should be either the NULL terminator or
> - // the dot delimiter.
> - //
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (*Str == '.') {
> - //
> - // Skip the delimiter.
> - //
> - Str++;
> - }
> -
> - Index++;
> - }
> -
> - if (Index != 4) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Convert the mac address into a hexadecimal encoded "-" seperated string.
> -
> - @param[in] Mac The mac address.
> - @param[in] Len Length in bytes of the mac address.
> - @param[in] VlanId VLAN ID of the network device.
> - @param[out] Str The storage to return the mac string.
> -**/
> -VOID
> -IScsiMacAddrToStr (
> - IN EFI_MAC_ADDRESS *Mac,
> - IN UINT32 Len,
> - IN UINT16 VlanId,
> - OUT CHAR16 *Str
> - )
> -{
> - UINT32 Index;
> - CHAR16 *String;
> -
> - for (Index = 0; Index < Len; Index++) {
> - Str[3 * Index] = (CHAR16) IScsiHexString[(Mac->Addr[Index] >> 4) & 0x0F];
> - Str[3 * Index + 1] = (CHAR16) IScsiHexString[Mac->Addr[Index] & 0x0F];
> - Str[3 * Index + 2] = L'-';
> - }
> -
> - String = &Str[3 * Index - 1] ;
> - if (VlanId != 0) {
> - String += UnicodeSPrint (String, 6 * sizeof (CHAR16), L"\\%04x", (UINTN)
> VlanId);
> - }
> -
> - *String = L'\0';
> -}
> -
> -/**
> - Convert the binary encoded buffer into a hexadecimal encoded string.
> -
> - @param[in] BinBuffer The buffer containing the binary data.
> - @param[in] BinLength Length of the binary buffer.
> - @param[in, out] HexStr Pointer to the string.
> - @param[in, out] HexLength The length of the string.
> -
> - @retval EFI_SUCCESS The binary data is converted to the hexadecimal
> string
> - and the length of the string is updated.
> - @retval EFI_BUFFER_TOO_SMALL The string is too small.
> - @retval EFI_INVALID_PARAMETER The IP string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiBinToHex (
> - IN UINT8 *BinBuffer,
> - IN UINT32 BinLength,
> - IN OUT CHAR8 *HexStr,
> - IN OUT UINT32 *HexLength
> - )
> -{
> - UINTN Index;
> -
> - if ((HexStr == NULL) || (BinBuffer == NULL) || (BinLength == 0)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (((*HexLength) - 3) < BinLength * 2) {
> - *HexLength = BinLength * 2 + 3;
> - return EFI_BUFFER_TOO_SMALL;
> - }
> -
> - *HexLength = BinLength * 2 + 3;
> - //
> - // Prefix for Hex String
> - //
> - HexStr[0] = '0';
> - HexStr[1] = 'x';
> -
> - for (Index = 0; Index < BinLength; Index++) {
> - HexStr[Index * 2 + 2] = IScsiHexString[BinBuffer[Index] >> 4];
> - HexStr[Index * 2 + 3] = IScsiHexString[BinBuffer[Index] & 0x0F];
> - }
> -
> - HexStr[Index * 2 + 2] = '\0';
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Convert the hexadecimal string into a binary encoded buffer.
> -
> - @param[in, out] BinBuffer The binary buffer.
> - @param[in, out] BinLength Length of the binary buffer.
> - @param[in] HexStr The hexadecimal string.
> -
> - @retval EFI_SUCCESS The hexadecimal string is converted into a binary
> - encoded buffer.
> - @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the
> converted data.
> -**/
> -EFI_STATUS
> -IScsiHexToBin (
> - IN OUT UINT8 *BinBuffer,
> - IN OUT UINT32 *BinLength,
> - IN CHAR8 *HexStr
> - )
> -{
> - UINTN Index;
> - UINTN Length;
> - UINT8 Digit;
> - CHAR8 TemStr[2];
> -
> - ZeroMem (TemStr, sizeof (TemStr));
> -
> - //
> - // Find out how many hex characters the string has.
> - //
> - if ((HexStr[0] == '0') && ((HexStr[1] == 'x') || (HexStr[1] == 'X'))) {
> - HexStr += 2;
> - }
> -
> - Length = AsciiStrLen (HexStr);
> -
> - for (Index = 0; Index < Length; Index ++) {
> - TemStr[0] = HexStr[Index];
> - Digit = (UINT8) AsciiStrHexToUint64 (TemStr);
> - if (Digit == 0 && TemStr[0] != '0') {
> - //
> - // Invalid Lun Char
> - //
> - break;
> - }
> - if ((Index & 1) == 0) {
> - BinBuffer [Index/2] = Digit;
> - } else {
> - BinBuffer [Index/2] = (UINT8) ((BinBuffer [Index/2] << 4) + Digit);
> - }
> - }
> -
> - *BinLength = (UINT32) ((Index + 1)/2);
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Generate random numbers.
> -
> - @param[in, out] Rand The buffer to contain random numbers.
> - @param[in] RandLength The length of the Rand buffer.
> -**/
> -VOID
> -IScsiGenRandom (
> - IN OUT UINT8 *Rand,
> - IN UINTN RandLength
> - )
> -{
> - UINT32 Random;
> -
> - while (RandLength > 0) {
> - Random = NET_RANDOM (NetRandomInitSeed ());
> - *Rand++ = (UINT8) (Random);
> - RandLength--;
> - }
> -}
> -
> -/**
> - Create the iSCSI driver data..
> -
> - @param[in] Image The handle of the driver image.
> - @param[in] Controller The handle of the controller.
> -
> - @return The iSCSI driver data created.
> - @retval NULL Other errors as indicated.
> -**/
> -ISCSI_DRIVER_DATA *
> -IScsiCreateDriverData (
> - IN EFI_HANDLE Image,
> - IN EFI_HANDLE Controller
> - )
> -{
> - ISCSI_DRIVER_DATA *Private;
> - EFI_STATUS Status;
> -
> - Private = AllocateZeroPool (sizeof (ISCSI_DRIVER_DATA));
> - if (Private == NULL) {
> - return NULL;
> - }
> -
> - Private->Signature = ISCSI_DRIVER_DATA_SIGNATURE;
> - Private->Image = Image;
> - Private->Controller = Controller;
> -
> - //
> - // Create an event to be signal when the BS to RT transition is triggerd so
> - // as to abort the iSCSI session.
> - //
> - Status = gBS->CreateEventEx (
> - EVT_NOTIFY_SIGNAL,
> - TPL_CALLBACK,
> - IScsiOnExitBootService,
> - Private,
> - &gEfiEventExitBootServicesGuid,
> - &Private->ExitBootServiceEvent
> - );
> - if (EFI_ERROR (Status)) {
> - FreePool (Private);
> - return NULL;
> - }
> -
> - CopyMem(&Private->IScsiExtScsiPassThru,
> &gIScsiExtScsiPassThruProtocolTemplate,
> sizeof(EFI_EXT_SCSI_PASS_THRU_PROTOCOL));
> -
> - //
> - // 0 is designated to the TargetId, so use another value for the AdapterId.
> - //
> - Private->ExtScsiPassThruMode.AdapterId = 2;
> - Private->ExtScsiPassThruMode.Attributes =
> EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL |
> EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL;
> - Private->ExtScsiPassThruMode.IoAlign = 4;
> - Private->IScsiExtScsiPassThru.Mode = &Private->ExtScsiPassThruMode;
> -
> - //
> - // Install the Ext SCSI PASS THRU protocol.
> - //
> - Status = gBS->InstallProtocolInterface (
> - &Private->ExtScsiPassThruHandle,
> - &gEfiExtScsiPassThruProtocolGuid,
> - EFI_NATIVE_INTERFACE,
> - &Private->IScsiExtScsiPassThru
> - );
> - if (EFI_ERROR (Status)) {
> - gBS->CloseEvent (Private->ExitBootServiceEvent);
> - FreePool (Private);
> -
> - return NULL;
> - }
> -
> - IScsiSessionInit (&Private->Session, FALSE);
> -
> - return Private;
> -}
> -
> -/**
> - Clean the iSCSI driver data.
> -
> - @param[in] Private The iSCSI driver data.
> -
> - @retval EFI_SUCCESS The clean operation is successful.
> - @retval Others Other errors as indicated.
> -
> -**/
> -EFI_STATUS
> -IScsiCleanDriverData (
> - IN ISCSI_DRIVER_DATA *Private
> - )
> -{
> - EFI_STATUS Status;
> -
> - Status = EFI_SUCCESS;
> -
> - if (Private->DevicePath != NULL) {
> - Status = gBS->UninstallProtocolInterface (
> - Private->ExtScsiPassThruHandle,
> - &gEfiDevicePathProtocolGuid,
> - Private->DevicePath
> - );
> - if (EFI_ERROR (Status)) {
> - goto EXIT;
> - }
> -
> - FreePool (Private->DevicePath);
> - }
> -
> - if (Private->ExtScsiPassThruHandle != NULL) {
> - Status = gBS->UninstallProtocolInterface (
> - Private->ExtScsiPassThruHandle,
> - &gEfiExtScsiPassThruProtocolGuid,
> - &Private->IScsiExtScsiPassThru
> - );
> - }
> -
> -EXIT:
> - if (Private->ExitBootServiceEvent != NULL) {
> - gBS->CloseEvent (Private->ExitBootServiceEvent);
> - }
> -
> - FreePool (Private);
> - return Status;
> -}
> -
> -/**
> - Check wheather the Controller is configured to use DHCP protocol.
> -
> - @param[in] Controller The handle of the controller.
> -
> - @retval TRUE The handle of the controller need the Dhcp protocol.
> - @retval FALSE The handle of the controller does not need the Dhcp
> protocol.
> -
> -**/
> -BOOLEAN
> -IScsiDhcpIsConfigured (
> - IN EFI_HANDLE Controller
> - )
> -{
> - EFI_STATUS Status;
> - EFI_MAC_ADDRESS MacAddress;
> - UINTN HwAddressSize;
> - UINT16 VlanId;
> - CHAR16 MacString[70];
> - ISCSI_SESSION_CONFIG_NVDATA *ConfigDataTmp;
> -
> - //
> - // Get the mac string, it's the name of various variable
> - //
> - Status = NetLibGetMacAddress (Controller, &MacAddress, &HwAddressSize);
> - if (EFI_ERROR (Status)) {
> - return FALSE;
> - }
> - VlanId = NetLibGetVlanId (Controller);
> - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId,
> MacString);
> -
> - //
> - // Get the normal configuration.
> - //
> - Status = GetVariable2 (
> - MacString,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - (VOID**)&ConfigDataTmp,
> - NULL
> - );
> - if (ConfigDataTmp == NULL || EFI_ERROR (Status)) {
> - return FALSE;
> - }
> -
> - if (ConfigDataTmp->Enabled && ConfigDataTmp->InitiatorInfoFromDhcp) {
> - FreePool (ConfigDataTmp);
> - return TRUE;
> - }
> -
> - FreePool (ConfigDataTmp);
> - return FALSE;
> -}
> -
> -/**
> - Get the various configuration data of this iSCSI instance.
> -
> - @param[in] Private The iSCSI driver data.
> -
> - @retval EFI_SUCCESS The configuration of this instance is got.
> - @retval EFI_ABORTED The operation was aborted.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiGetConfigData (
> - IN ISCSI_DRIVER_DATA *Private
> - )
> -{
> - EFI_STATUS Status;
> - ISCSI_SESSION *Session;
> - UINTN BufferSize;
> - EFI_MAC_ADDRESS MacAddress;
> - UINTN HwAddressSize;
> - UINT16 VlanId;
> - CHAR16 MacString[70];
> -
> - //
> - // get the iSCSI Initiator Name
> - //
> - Session = &Private->Session;
> - Session->InitiatorNameLength = ISCSI_NAME_MAX_SIZE;
> - Status = gIScsiInitiatorName.Get (
> - &gIScsiInitiatorName,
> - &Session->InitiatorNameLength,
> - Session->InitiatorName
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - //
> - // Get the mac string, it's the name of various variable
> - //
> - Status = NetLibGetMacAddress (Private->Controller, &MacAddress,
> &HwAddressSize);
> - ASSERT (Status == EFI_SUCCESS);
> - VlanId = NetLibGetVlanId (Private->Controller);
> - IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId,
> MacString);
> -
> - //
> - // Get the normal configuration.
> - //
> - BufferSize = sizeof (Session->ConfigData.NvData);
> - Status = gRT->GetVariable (
> - MacString,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - NULL,
> - &BufferSize,
> - &Session->ConfigData.NvData
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - if (!Session->ConfigData.NvData.Enabled) {
> - return EFI_ABORTED;
> - }
> - //
> - // Get the CHAP Auth information.
> - //
> - BufferSize = sizeof (Session->AuthData.AuthConfig);
> - Status = gRT->GetVariable (
> - MacString,
> - &gIScsiCHAPAuthInfoGuid,
> - NULL,
> - &BufferSize,
> - &Session->AuthData.AuthConfig
> - );
> -
> - if (!EFI_ERROR (Status) && Session-
> >ConfigData.NvData.InitiatorInfoFromDhcp) {
> - //
> - // Start dhcp.
> - //
> - Status = IScsiDoDhcp (Private->Image, Private->Controller, &Session-
> >ConfigData);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Get the device path of the iSCSI tcp connection and update it.
> -
> - @param[in] Private The iSCSI driver data.
> -
> - @return The updated device path.
> - @retval NULL Other errors as indicated.
> -**/
> -EFI_DEVICE_PATH_PROTOCOL *
> -IScsiGetTcpConnDevicePath (
> - IN ISCSI_DRIVER_DATA *Private
> - )
> -{
> - ISCSI_SESSION *Session;
> - ISCSI_CONNECTION *Conn;
> - TCP4_IO *Tcp4Io;
> - EFI_DEVICE_PATH_PROTOCOL *DevicePath;
> - EFI_STATUS Status;
> - EFI_DEV_PATH *DPathNode;
> -
> - Session = &Private->Session;
> - if (Session->State != SESSION_STATE_LOGGED_IN) {
> - return NULL;
> - }
> -
> - Conn = NET_LIST_USER_STRUCT_S (
> - Session->Conns.ForwardLink,
> - ISCSI_CONNECTION,
> - Link,
> - ISCSI_CONNECTION_SIGNATURE
> - );
> - Tcp4Io = &Conn->Tcp4Io;
> -
> - Status = gBS->HandleProtocol (
> - Tcp4Io->Handle,
> - &gEfiDevicePathProtocolGuid,
> - (VOID **)&DevicePath
> - );
> - if (EFI_ERROR (Status)) {
> - return NULL;
> - }
> - //
> - // Duplicate it.
> - //
> - DevicePath = DuplicateDevicePath (DevicePath);
> - if (DevicePath == NULL) {
> - return NULL;
> - }
> -
> - DPathNode = (EFI_DEV_PATH *) DevicePath;
> -
> - while (!IsDevicePathEnd (&DPathNode->DevPath)) {
> - if ((DevicePathType (&DPathNode->DevPath) == MESSAGING_DEVICE_PATH)
> &&
> - (DevicePathSubType (&DPathNode->DevPath) == MSG_IPv4_DP)
> - ) {
> -
> - DPathNode->Ipv4.LocalPort = 0;
> - DPathNode->Ipv4.StaticIpAddress =
> - (BOOLEAN) (!Session->ConfigData.NvData.InitiatorInfoFromDhcp);
> -
> - //
> - // Add a judgement here to support previous versions of IPv4_DEVICE_PATH.
> - // In previous versions of IPv4_DEVICE_PATH, GatewayIpAddress and
> SubnetMask
> - // do not exist.
> - // In new version of IPv4_DEVICE_PATH, structcure length is 27.
> - //
> - if (DevicePathNodeLength (&DPathNode->Ipv4) ==
> IP4_NODE_LEN_NEW_VERSIONS) {
> -
> - IP4_COPY_ADDRESS (
> - &DPathNode->Ipv4.GatewayIpAddress,
> - &Session->ConfigData.NvData.Gateway
> - );
> -
> - IP4_COPY_ADDRESS (
> - &DPathNode->Ipv4.SubnetMask,
> - &Session->ConfigData.NvData.SubnetMask
> - );
> - }
> -
> - break;
> - }
> -
> - DPathNode = (EFI_DEV_PATH *) NextDevicePathNode (&DPathNode-
> >DevPath);
> - }
> -
> - return DevicePath;
> -}
> -
> -/**
> - Abort the session when the transition from BS to RT is initiated.
> -
> - @param[in] Event The event signaled.
> - @param[in] Context The iSCSI driver data.
> -**/
> -VOID
> -EFIAPI
> -IScsiOnExitBootService (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - )
> -{
> - ISCSI_DRIVER_DATA *Private;
> -
> - Private = (ISCSI_DRIVER_DATA *) Context;
> -
> - gBS->CloseEvent (Private->ExitBootServiceEvent);
> - Private->ExitBootServiceEvent = NULL;
> -
> - IScsiSessionAbort (&Private->Session);
> -}
> -
> -/**
> - Tests whether a controller handle is being managed by IScsi driver.
> -
> - This function tests whether the driver specified by DriverBindingHandle is
> - currently managing the controller specified by ControllerHandle. This test
> - is performed by evaluating if the the protocol specified by ProtocolGuid is
> - present on ControllerHandle and is was opened by DriverBindingHandle and
> Nic
> - Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER.
> - If ProtocolGuid is NULL, then ASSERT().
> -
> - @param ControllerHandle A handle for a controller to test.
> - @param DriverBindingHandle Specifies the driver binding handle for the
> - driver.
> - @param ProtocolGuid Specifies the protocol that the driver specified
> - by DriverBindingHandle opens in its Start()
> - function.
> -
> - @retval EFI_SUCCESS ControllerHandle is managed by the driver
> - specified by DriverBindingHandle.
> - @retval EFI_UNSUPPORTED ControllerHandle is not managed by the driver
> - specified by DriverBindingHandle.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiTestManagedDevice (
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_HANDLE DriverBindingHandle,
> - IN EFI_GUID *ProtocolGuid
> - )
> -{
> - EFI_STATUS Status;
> - VOID *ManagedInterface;
> - EFI_HANDLE NicControllerHandle;
> -
> - ASSERT (ProtocolGuid != NULL);
> -
> - NicControllerHandle = NetLibGetNicHandle (ControllerHandle, ProtocolGuid);
> - if (NicControllerHandle == NULL) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - Status = gBS->OpenProtocol (
> - ControllerHandle,
> - (EFI_GUID *) ProtocolGuid,
> - &ManagedInterface,
> - DriverBindingHandle,
> - NicControllerHandle,
> - EFI_OPEN_PROTOCOL_BY_DRIVER
> - );
> - if (!EFI_ERROR (Status)) {
> - gBS->CloseProtocol (
> - ControllerHandle,
> - (EFI_GUID *) ProtocolGuid,
> - DriverBindingHandle,
> - NicControllerHandle
> - );
> - return EFI_UNSUPPORTED;
> - }
> -
> - if (Status != EFI_ALREADY_STARTED) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - return EFI_SUCCESS;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c
> deleted file mode 100644
> index b4a5c2d02413..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.c
> +++ /dev/null
> @@ -1,2799 +0,0 @@
> -/** @file
> - The implementation of iSCSI protocol based on RFC3720.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -UINT32 mDataSegPad = 0;
> -
> -/**
> - Attach the iSCSI connection to the iSCSI session.
> -
> - @param[in, out] Session The iSCSI session.
> - @param[in, out] Conn The iSCSI connection.
> -**/
> -VOID
> -IScsiAttatchConnection (
> - IN OUT ISCSI_SESSION *Session,
> - IN OUT ISCSI_CONNECTION *Conn
> - )
> -{
> - InsertTailList (&Session->Conns, &Conn->Link);
> - Conn->Session = Session;
> - Session->NumConns++;
> -}
> -
> -/**
> - Detach the iSCSI connection from the session it belongs to.
> -
> - @param[in, out] Conn The iSCSI connection.
> -**/
> -VOID
> -IScsiDetatchConnection (
> - IN OUT ISCSI_CONNECTION *Conn
> - )
> -{
> - RemoveEntryList (&Conn->Link);
> - Conn->Session->NumConns--;
> - Conn->Session = NULL;
> -}
> -
> -/**
> - Check the sequence number according to RFC3720.
> -
> - @param[in, out] ExpSN The currently expected sequence number.
> - @param[in] NewSN The sequence number to check.
> -
> - @retval EFI_SUCCESS The check passed and the ExpSN is increased.
> - @retval EFI_NOT_READY Response was sent due to a retransmission
> request.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
> -**/
> -EFI_STATUS
> -IScsiCheckSN (
> - IN OUT UINT32 *ExpSN,
> - IN UINT32 NewSN
> - )
> -{
> - if (!ISCSI_SEQ_EQ (NewSN, *ExpSN)) {
> - if (ISCSI_SEQ_LT (NewSN, *ExpSN)) {
> - //
> - // Duplicate
> - //
> - return EFI_NOT_READY;
> - } else {
> - return EFI_PROTOCOL_ERROR;
> - }
> - } else {
> - //
> - // Advance the ExpSN
> - //
> - (*ExpSN)++;
> - return EFI_SUCCESS;
> - }
> -}
> -
> -/**
> - Update the sequence numbers for the iSCSI command.
> -
> - @param[in, out] Session The iSCSI session.
> - @param[in] MaxCmdSN Maximum CmdSN from the target.
> - @param[in] ExpCmdSN Next expected CmdSN from the target.
> -**/
> -VOID
> -IScsiUpdateCmdSN (
> - IN OUT ISCSI_SESSION *Session,
> - IN UINT32 MaxCmdSN,
> - IN UINT32 ExpCmdSN
> - )
> -{
> - if (ISCSI_SEQ_LT (MaxCmdSN, ExpCmdSN - 1)) {
> - return ;
> - }
> -
> - if (ISCSI_SEQ_GT (MaxCmdSN, Session->MaxCmdSN)) {
> - Session->MaxCmdSN = MaxCmdSN;
> - }
> -
> - if (ISCSI_SEQ_GT (ExpCmdSN, Session->ExpCmdSN)) {
> - Session->ExpCmdSN = ExpCmdSN;
> - }
> -}
> -
> -/**
> - This function does the iSCSI connection login.
> -
> - @param[in, out] Conn The iSCSI connection to login.
> -
> - @retval EFI_SUCCESS The iSCSI connection is logged into the iSCSI target.
> - @retval EFI_TIMEOUT Timeout happened during the login procedure.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConnLogin (
> - IN OUT ISCSI_CONNECTION *Conn
> - )
> -{
> - EFI_STATUS Status;
> -
> - //
> - // Start the timer, wait 16 seconds to establish the TCP connection.
> - //
> - Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, 16 *
> TICKS_PER_SECOND);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> - //
> - // try to establish the tcp connection
> - //
> - Status = Tcp4IoConnect (&Conn->Tcp4Io, Conn->TimeoutEvent);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - gBS->SetTimer (Conn->TimeoutEvent, TimerCancel, 0);
> - Conn->State = CONN_STATE_IN_LOGIN;
> -
> - //
> - // connection is established, start the iSCSI Login
> - //
> - do {
> - Status = IScsiSendLoginReq (Conn);
> - if (EFI_ERROR (Status)) {
> - break;
> - }
> -
> - Status = IScsiReceiveLoginRsp (Conn);
> - if (EFI_ERROR (Status)) {
> - break;
> - }
> - } while (Conn->CurrentStage != ISCSI_FULL_FEATURE_PHASE);
> -
> - return Status;
> -}
> -
> -/**
> - Reset the iSCSI connection.
> -
> - @param[in, out] Conn The iSCSI connection to reset.
> -**/
> -VOID
> -IScsiConnReset (
> - IN OUT ISCSI_CONNECTION *Conn
> - )
> -{
> - Tcp4IoReset (&Conn->Tcp4Io);
> -}
> -
> -/**
> - Create a TCP connection for the iSCSI session.
> -
> - @param[in] Private The iSCSI driver data.
> - @param[in] Session Maximum CmdSN from the target.
> -
> - @return The newly created iSCSI connection.
> -**/
> -ISCSI_CONNECTION *
> -IScsiCreateConnection (
> - IN ISCSI_DRIVER_DATA *Private,
> - IN ISCSI_SESSION *Session
> - )
> -{
> - ISCSI_CONNECTION *Conn;
> - TCP4_IO_CONFIG_DATA Tcp4IoConfig;
> - EFI_STATUS Status;
> -
> - Conn = AllocatePool (sizeof (ISCSI_CONNECTION));
> - if (Conn == NULL) {
> - return NULL;
> - }
> -
> - Conn->Signature = ISCSI_CONNECTION_SIGNATURE;
> - Conn->State = CONN_STATE_FREE;
> - Conn->CurrentStage = ISCSI_SECURITY_NEGOTIATION;
> - Conn->NextStage = ISCSI_LOGIN_OPERATIONAL_NEGOTIATION;
> - Conn->CHAPStep = ISCSI_CHAP_INITIAL;
> - Conn->ExpStatSN = 0;
> - Conn->PartialReqSent = FALSE;
> - Conn->PartialRspRcvd = FALSE;
> - Conn->Cid = Session->NextCid++;
> -
> - Status = gBS->CreateEvent (
> - EVT_TIMER,
> - TPL_CALLBACK,
> - NULL,
> - NULL,
> - &Conn->TimeoutEvent
> - );
> - if (EFI_ERROR (Status)) {
> - FreePool (Conn);
> - return NULL;
> - }
> -
> - NetbufQueInit (&Conn->RspQue);
> -
> - //
> - // set the default connection-only parameters
> - //
> - Conn->MaxRecvDataSegmentLength = DEFAULT_MAX_RECV_DATA_SEG_LEN;
> - Conn->HeaderDigest = IScsiDigestNone;
> - Conn->DataDigest = IScsiDigestNone;
> -
> - CopyMem (&Tcp4IoConfig.LocalIp, &Session->ConfigData.NvData.LocalIp,
> sizeof (EFI_IPv4_ADDRESS));
> - CopyMem (&Tcp4IoConfig.SubnetMask, &Session-
> >ConfigData.NvData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
> - CopyMem (&Tcp4IoConfig.Gateway, &Session->ConfigData.NvData.Gateway,
> sizeof (EFI_IPv4_ADDRESS));
> - CopyMem (&Tcp4IoConfig.RemoteIp, &Session->ConfigData.NvData.TargetIp,
> sizeof (EFI_IPv4_ADDRESS));
> -
> - Tcp4IoConfig.RemotePort = Session->ConfigData.NvData.TargetPort;
> -
> - //
> - // Create the tcp4 IO for this connection
> - //
> - Status = Tcp4IoCreateSocket (
> - Private->Image,
> - Private->Controller,
> - &Tcp4IoConfig,
> - &Conn->Tcp4Io
> - );
> - if (EFI_ERROR (Status)) {
> - gBS->CloseEvent (Conn->TimeoutEvent);
> - FreePool (Conn);
> - Conn = NULL;
> - }
> -
> - return Conn;
> -}
> -
> -/**
> - Destroy an iSCSI connection.
> -
> - @param[in] Conn The connection to destroy.
> -**/
> -VOID
> -IScsiDestroyConnection (
> - IN ISCSI_CONNECTION *Conn
> - )
> -{
> - Tcp4IoDestroySocket (&Conn->Tcp4Io);
> - NetbufQueFlush (&Conn->RspQue);
> - gBS->CloseEvent (Conn->TimeoutEvent);
> - FreePool (Conn);
> -}
> -
> -/**
> - Login the iSCSI session.
> -
> - @param[in] Private The iSCSI driver data.
> -
> - @retval EFI_SUCCESS The iSCSI session login procedure finished.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NO_MEDIA There was a media error.
> - @retval Others Other errors as indicated.
> -
> -**/
> -EFI_STATUS
> -IScsiSessionLogin (
> - IN ISCSI_DRIVER_DATA *Private
> - )
> -{
> - EFI_STATUS Status;
> - ISCSI_SESSION *Session;
> - ISCSI_CONNECTION *Conn;
> - EFI_TCP4_PROTOCOL *Tcp4;
> - EFI_STATUS MediaStatus;
> -
> - Session = &Private->Session;
> -
> - //
> - // Check media status before session login
> - //
> - MediaStatus = EFI_SUCCESS;
> - NetLibDetectMediaWaitTimeout (Private->Controller,
> ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME, &MediaStatus);
> - if (MediaStatus != EFI_SUCCESS) {
> - return EFI_NO_MEDIA;
> - }
> -
> - //
> - // Set session identifier
> - //
> - CopyMem (Session->Isid, Session->ConfigData.NvData.IsId, 6);
> -
> - //
> - // Create a connection for the session.
> - //
> - Conn = IScsiCreateConnection (Private, Session);
> - if (Conn == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - IScsiAttatchConnection (Session, Conn);
> -
> - //
> - // Login througth the newly created connection.
> - //
> - Status = IScsiConnLogin (Conn);
> - if (EFI_ERROR (Status)) {
> - IScsiConnReset (Conn);
> - IScsiDetatchConnection (Conn);
> - IScsiDestroyConnection (Conn);
> - } else {
> - Session->State = SESSION_STATE_LOGGED_IN;
> -
> - gBS->OpenProtocol (
> - Conn->Tcp4Io.Handle,
> - &gEfiTcp4ProtocolGuid,
> - (VOID **)&Tcp4,
> - Private->Image,
> - Private->ExtScsiPassThruHandle,
> - EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
> - );
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Build and send the iSCSI login request to the iSCSI target according to
> - the current login stage.
> -
> - @param[in] Conn The connection in the iSCSI login phase.
> -
> - @retval EFI_SUCCESS The iSCSI login request PDU is built and sent on this
> - connection.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_DEVICE_ERROR Some kind of device error happened.
> -**/
> -EFI_STATUS
> -IScsiSendLoginReq (
> - IN ISCSI_CONNECTION *Conn
> - )
> -{
> - NET_BUF *Pdu;
> - EFI_STATUS Status;
> -
> - //
> - // build the Login Request PDU
> - //
> - Pdu = IScsiPrepareLoginReq (Conn);
> - if (Pdu == NULL) {
> - return EFI_DEVICE_ERROR;
> - }
> - //
> - // Send it to the iSCSI target.
> - //
> - Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu);
> -
> - NetbufFree (Pdu);
> -
> - return Status;
> -}
> -
> -/**
> - Receive and process the iSCSI login response.
> -
> - @param[in] Conn The connection in the iSCSI login phase.
> -
> - @retval EFI_SUCCESS The iSCSI login response PDU is received and
> processed.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiReceiveLoginRsp (
> - IN ISCSI_CONNECTION *Conn
> - )
> -{
> - EFI_STATUS Status;
> - NET_BUF *Pdu;
> -
> - Pdu = NULL;
> -
> - //
> - // Receive the iSCSI login response.
> - //
> - Status = IScsiReceivePdu (Conn, &Pdu, NULL, FALSE, FALSE, NULL);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> - //
> - // A Login Response is received, process it.
> - //
> - ASSERT (Pdu != NULL);
> - Status = IScsiProcessLoginRsp (Conn, Pdu);
> -
> - NetbufFree (Pdu);
> -
> - return Status;
> -}
> -
> -/**
> - Add an iSCSI key-value pair as a string into the data segment of the Login
> Request PDU.
> - The DataSegmentLength and the actual size of the net buffer containing this
> PDU will be
> - updated.
> -
> - @param[in, out] Pdu The iSCSI PDU whose data segment the key-value
> pair will
> - be added to.
> - @param[in] Key The key name string.
> - @param[in] Value The value string.
> -
> - @retval EFI_SUCCESS The key-valu pair is added to the PDU's
> datasegment and
> - the correspondence length fields are updated.
> - @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to
> add the key-value
> - pair.
> -**/
> -EFI_STATUS
> -IScsiAddKeyValuePair (
> - IN OUT NET_BUF *Pdu,
> - IN CHAR8 *Key,
> - IN CHAR8 *Value
> - )
> -{
> - UINT32 DataSegLen;
> - UINT32 KeyLen;
> - UINT32 ValueLen;
> - UINT32 TotalLen;
> - ISCSI_LOGIN_REQUEST *LoginReq;
> - CHAR8 *Data;
> -
> - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, NULL);
> - if (LoginReq == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> - DataSegLen = NTOH24 (LoginReq->DataSegmentLength);
> -
> - KeyLen = (UINT32) AsciiStrLen (Key);
> - ValueLen = (UINT32) AsciiStrLen (Value);
> -
> - //
> - // 1 byte for the key value separator '=' and 1 byte for the null
> - // delimiter after the value.
> - //
> - TotalLen = KeyLen + 1 + ValueLen + 1;
> -
> - //
> - // Allocate the space for the key-value pair.
> - //
> - Data = (CHAR8 *)NetbufAllocSpace (Pdu, TotalLen, NET_BUF_TAIL);
> - if (Data == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> - //
> - // Add the key.
> - //
> - CopyMem (Data, Key, KeyLen);
> - Data += KeyLen;
> -
> - *Data = '=';
> - Data++;
> -
> - //
> - // Add the value.
> - //
> - CopyMem (Data, Value, ValueLen);
> - Data += ValueLen;
> -
> - *Data = '\0';
> -
> - //
> - // update the DataSegmentLength
> - //
> - ISCSI_SET_DATASEG_LEN (LoginReq, DataSegLen + TotalLen);
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Prepare the iSCSI login request to be sent according to the current login status.
> -
> - @param[in, out] Conn The connection in the iSCSI login phase.
> -
> - @return The pointer to the net buffer containing the iSCSI login request built.
> - @retval Others Other errors as indicated.
> -**/
> -NET_BUF *
> -IScsiPrepareLoginReq (
> - IN OUT ISCSI_CONNECTION *Conn
> - )
> -{
> - ISCSI_SESSION *Session;
> - NET_BUF *Nbuf;
> - ISCSI_LOGIN_REQUEST *LoginReq;
> - EFI_STATUS Status;
> -
> - Session = Conn->Session;
> -
> - Nbuf = NetbufAlloc (sizeof (ISCSI_LOGIN_REQUEST) +
> DEFAULT_MAX_RECV_DATA_SEG_LEN);
> - if (Nbuf == NULL) {
> - return NULL;
> - }
> -
> - LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufAllocSpace (Nbuf, sizeof
> (ISCSI_LOGIN_REQUEST), NET_BUF_TAIL);
> - ASSERT (LoginReq != NULL);
> - ZeroMem (LoginReq, sizeof (ISCSI_LOGIN_REQUEST));
> -
> - //
> - // Init the login request pdu
> - //
> - ISCSI_SET_OPCODE (LoginReq, ISCSI_OPCODE_LOGIN_REQ,
> ISCSI_REQ_IMMEDIATE);
> - ISCSI_SET_STAGES (LoginReq, Conn->CurrentStage, Conn->NextStage);
> - LoginReq->VersionMax = ISCSI_VERSION_MAX;
> - LoginReq->VersionMin = ISCSI_VERSION_MIN;
> - LoginReq->Tsih = HTONS (Session->Tsih);
> - LoginReq->InitiatorTaskTag = HTONL (Session->InitiatorTaskTag);
> - LoginReq->Cid = HTONS (Conn->Cid);
> - LoginReq->CmdSN = HTONL (Session->CmdSN);
> -
> - //
> - // For the first Login Request on a coonection this is ExpStatSN for the
> - // old connection and this field is only valid if the Login Request restarts
> - // a connection.
> - // For subsequent Login Requests it is used to acknowledge the Login
> Responses
> - // with their increasing StatSN values.
> - //
> - LoginReq->ExpStatSN = HTONL (Conn->ExpStatSN);
> - CopyMem (LoginReq->Isid, Session->Isid, sizeof (LoginReq->Isid));
> -
> - if (Conn->PartialRspRcvd) {
> - //
> - // A partial response, initiator must send an empty Login Request.
> - //
> - return Nbuf;
> - }
> -
> - switch (Conn->CurrentStage) {
> - case ISCSI_SECURITY_NEGOTIATION:
> - Status = IScsiCHAPToSendReq (Conn, Nbuf);
> - break;
> -
> - case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION:
> - Status = IScsiFillOpParams (Conn, Nbuf);
> - ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
> - break;
> -
> - default:
> - //
> - // something error happens...
> - //
> - Status = EFI_DEVICE_ERROR;
> - break;
> - }
> -
> - if (EFI_ERROR (Status)) {
> - NetbufFree (Nbuf);
> - Nbuf = NULL;
> - } else {
> - //
> - // Pad the data segment if needed.
> - //
> - IScsiPadSegment (Nbuf, ISCSI_GET_DATASEG_LEN (LoginReq));
> - //
> - // Check whether we will issue the stage transition signal?
> - //
> - Conn->TransitInitiated = (BOOLEAN) ISCSI_FLAG_ON (LoginReq,
> ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
> - }
> -
> - return Nbuf;
> -}
> -
> -/**
> - Process the iSCSI Login Response.
> -
> - @param[in, out] Conn The connection on which the iSCSI login response is
> received.
> - @param[in, out] Pdu The iSCSI login response PDU.
> -
> - @retval EFI_SUCCESS The iSCSI login response PDU is processed and all
> check are passed.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
> - @retval EFI_MEDIA_CHANGED Target is redirected.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiProcessLoginRsp (
> - IN OUT ISCSI_CONNECTION *Conn,
> - IN OUT NET_BUF *Pdu
> - )
> -{
> - EFI_STATUS Status;
> - ISCSI_SESSION *Session;
> - ISCSI_LOGIN_RESPONSE *LoginRsp;
> - BOOLEAN Transit;
> - BOOLEAN Continue;
> - UINT8 CurrentStage;
> - UINT8 NextStage;
> - UINT8 *DataSeg;
> - UINT32 DataSegLen;
> -
> - Session = Conn->Session;
> -
> - LoginRsp = (ISCSI_LOGIN_RESPONSE *) NetbufGetByte (Pdu, 0, NULL);
> - if (LoginRsp == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> - if (!ISCSI_CHECK_OPCODE (LoginRsp, ISCSI_OPCODE_LOGIN_RSP)) {
> - //
> - // It's not a Login Response
> - //
> - return EFI_PROTOCOL_ERROR;
> - }
> - //
> - // Get the data segment if any.
> - //
> - DataSegLen = ISCSI_GET_DATASEG_LEN (LoginRsp);
> - if (DataSegLen != 0) {
> - DataSeg = NetbufGetByte (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NULL);
> - } else {
> - DataSeg = NULL;
> - }
> - //
> - // Check the status class in the login response PDU.
> - //
> - switch (LoginRsp->StatusClass) {
> - case ISCSI_LOGIN_STATUS_SUCCESS:
> - //
> - // Just break here, the response and the data segment will be processed later.
> - //
> - break;
> -
> - case ISCSI_LOGIN_STATUS_REDIRECTION:
> - //
> - // The target may be moved to a different address
> - //
> - if (DataSeg == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> - //
> - // Process the TargetAddress key-value strings in the data segment to update
> the
> - // target address info.
> - //
> - Status = IScsiUpdateTargetAddress (Session, (CHAR8 *)DataSeg, DataSegLen);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> - //
> - // Session will be restarted on this error status because the Target is
> - // redirected by this Login Response.
> - //
> - return EFI_MEDIA_CHANGED;
> -
> - default:
> - //
> - // Initiator Error, Target Error, or any other undefined error code.
> - //
> - return EFI_PROTOCOL_ERROR;
> - }
> - //
> - // The status is sucess, extract the wanted fields from the header segment.
> - //
> - Transit = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp,
> ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT);
> - Continue = (BOOLEAN) ISCSI_FLAG_ON (LoginRsp,
> ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE);
> -
> - CurrentStage = (UINT8) ISCSI_GET_CURRENT_STAGE (LoginRsp);
> - NextStage = (UINT8) ISCSI_GET_NEXT_STAGE (LoginRsp);
> -
> - LoginRsp->InitiatorTaskTag = NTOHL (LoginRsp->InitiatorTaskTag);
> -
> - if ((Transit && Continue) ||
> - (CurrentStage != Conn->CurrentStage) ||
> - (!Conn->TransitInitiated && Transit) ||
> - (Transit && (NextStage != Conn->NextStage)) ||
> - (CompareMem (Session->Isid, LoginRsp->Isid, sizeof (LoginRsp->Isid)) != 0)
> ||
> - (LoginRsp->InitiatorTaskTag != Session->InitiatorTaskTag)
> - ) {
> - //
> - // A Login Response with the C bit set to 1 MUST have the T bit set to 0;
> - // The CSG in the Login Response MUST be the same with the I-end of this
> connection;
> - // The T bit can't be 1 if the last Login Response sent by the initiator doesn't
> - // initiate the transistion;
> - // The NSG MUST be the same with the I-end of this connection if Transit is
> required.
> - // The ISID in the Login Response MUST be the same with this session.
> - //
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - LoginRsp->StatSN = NTOHL (LoginRsp->StatSN);
> - LoginRsp->ExpCmdSN = NTOHL (LoginRsp->ExpCmdSN);
> - LoginRsp->MaxCmdSN = NTOHL (LoginRsp->MaxCmdSN);
> -
> - if ((Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION) && (Conn-
> >CHAPStep == ISCSI_CHAP_INITIAL)) {
> - //
> - // If the Login Request is a leading Login Request, the target MUST use
> - // the value presented in CmdSN as the target value for ExpCmdSN.
> - //
> - if ((Session->State == SESSION_STATE_FREE) && (Session->CmdSN !=
> LoginRsp->ExpCmdSN)) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - //
> - // It's the initial Login Response, initialize the local ExpStatSN, MaxCmdSN
> - // and ExpCmdSN.
> - //
> - Conn->ExpStatSN = LoginRsp->StatSN + 1;
> - Session->MaxCmdSN = LoginRsp->MaxCmdSN;
> - Session->ExpCmdSN = LoginRsp->ExpCmdSN;
> - } else {
> - //
> - // Check the StatSN of this PDU
> - //
> - Status = IScsiCheckSN (&Conn->ExpStatSN, LoginRsp->StatSN);
> - if (!EFI_ERROR (Status)) {
> - //
> - // Update the MaxCmdSN and ExpCmdSN
> - //
> - IScsiUpdateCmdSN (Session, LoginRsp->MaxCmdSN, LoginRsp->ExpCmdSN);
> - } else {
> - return Status;
> - }
> - }
> - //
> - // Trim off the header segment.
> - //
> - NetbufTrim (Pdu, sizeof (ISCSI_LOGIN_RESPONSE), NET_BUF_HEAD);
> -
> - //
> - // Queue this login response first in case it's a partial response so that
> - // later when the full response list is received we can combine these scattered
> - // responses' data segment and then process it.
> - //
> - NET_GET_REF (Pdu);
> - NetbufQueAppend (&Conn->RspQue, Pdu);
> -
> - Conn->PartialRspRcvd = Continue;
> - if (Continue) {
> - //
> - // It's a partial response, have to wait for another or more Request/Response
> - // conversations to get the full response.
> - //
> - return EFI_SUCCESS;
> - }
> -
> - switch (CurrentStage) {
> - case ISCSI_SECURITY_NEGOTIATION:
> - //
> - // In security negotiation stage, let CHAP module handle it.
> - //
> - Status = IScsiCHAPOnRspReceived (Conn);
> - break;
> -
> - case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION:
> - //
> - // Response received with negotiation resonse on iSCSI parameters, check
> them.
> - //
> - Status = IScsiCheckOpParams (Conn);
> - break;
> -
> - default:
> - //
> - // Should never get here.
> - //
> - Status = EFI_PROTOCOL_ERROR;
> - break;
> - }
> -
> - if (Transit && (Status == EFI_SUCCESS)) {
> - //
> - // Do the state transition.
> - //
> - Conn->CurrentStage = Conn->NextStage;
> -
> - if (Conn->CurrentStage == ISCSI_LOGIN_OPERATIONAL_NEGOTIATION) {
> - Conn->NextStage = ISCSI_FULL_FEATURE_PHASE;
> - } else {
> - //
> - // CurrentStage is iSCSI Full Feature, it's the Login-Final Response,
> - // get the TSIH from the Login Response.
> - //
> - Session->Tsih = NTOHS (LoginRsp->Tsih);
> - }
> - }
> - //
> - // Flush the response(s) received.
> - //
> - NetbufQueFlush (&Conn->RspQue);
> -
> - return Status;
> -}
> -
> -/**
> - Updated the target information according the data received in the iSCSI
> - login response with an target redirection status.
> -
> - @param[in, out] Session The iSCSI session.
> - @param[in] Data The data segment which should contain the
> - TargetAddress key-value list.
> - @param[in] Len Length of the data.
> -
> - @retval EFI_SUCCESS The target address is updated.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NOT_FOUND The TargetAddress key is not found.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiUpdateTargetAddress (
> - IN OUT ISCSI_SESSION *Session,
> - IN CHAR8 *Data,
> - IN UINT32 Len
> - )
> -{
> - LIST_ENTRY *KeyValueList;
> - CHAR8 *TargetAddress;
> - CHAR8 *IpStr;
> - EFI_STATUS Status;
> - UINTN Number;
> -
> - KeyValueList = IScsiBuildKeyValueList (Data, Len);
> - if (KeyValueList == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Status = EFI_NOT_FOUND;
> -
> - while (TRUE) {
> - TargetAddress = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_TARGET_ADDRESS);
> - if (TargetAddress == NULL) {
> - break;
> - }
> -
> - if (!NET_IS_DIGIT (TargetAddress[0])) {
> - //
> - // The domainname of the target may be presented in three formats: a DNS
> host name,
> - // a dotted-decimal IPv4 address, or a bracketed IPv6 address. Only accept
> dotted
> - // IPv4 address.
> - //
> - continue;
> - }
> -
> - IpStr = TargetAddress;
> -
> - while ((*TargetAddress != 0) && (*TargetAddress != ':') && (*TargetAddress !=
> ',')) {
> - //
> - // NULL, ':' or ',' ends the IPv4 string.
> - //
> - TargetAddress++;
> - }
> -
> - if (*TargetAddress == ',') {
> - //
> - // Comma and the portal group tag MUST be ommitted if the TargetAddress
> is sent
> - // as the result of a redirection.
> - //
> - continue;
> - } else if (*TargetAddress == ':') {
> - *TargetAddress = '\0';
> -
> - TargetAddress++;
> -
> - Number = AsciiStrDecimalToUintn (TargetAddress);
> - if (Number > 0xFFFF) {
> - continue;
> - } else {
> - Session->ConfigData.NvData.TargetPort = (UINT16) Number;
> - }
> - } else {
> - //
> - // The string only contains the IPv4 address. Use the well known port.
> - //
> - Session->ConfigData.NvData.TargetPort = ISCSI_WELL_KNOWN_PORT;
> - }
> - //
> - // Update the target IP address.
> - //
> - Status = IScsiAsciiStrToIp (IpStr, &Session->ConfigData.NvData.TargetIp);
> - if (EFI_ERROR (Status)) {
> - continue;
> - } else {
> - break;
> - }
> - }
> -
> - IScsiFreeKeyValueList (KeyValueList);
> -
> - return Status;
> -}
> -
> -/**
> - The callback function to free the net buffer list.
> -
> - @param[in] Arg The opaque parameter.
> -**/
> -VOID
> -EFIAPI
> -IScsiFreeNbufList (
> - VOID *Arg
> - )
> -{
> - ASSERT (Arg != NULL);
> -
> - NetbufFreeList ((LIST_ENTRY *) Arg);
> - FreePool (Arg);
> -}
> -
> -/**
> - The callback function called in NetBufFree, it does nothing.
> -
> - @param[in] Arg The opaque parameter.
> -**/
> -VOID
> -EFIAPI
> -IScsiNbufExtFree (
> - VOID *Arg
> - )
> -{
> -}
> -
> -/**
> - Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI PDU
> header and
> - an optional data segment. The two parts will be put into two blocks of buffers
> in the
> - net buffer. The digest check will be conducted in this function if needed and
> the digests
> - will be trimmed from the PDU buffer.
> -
> - @param[in] Conn The iSCSI connection to receive data from.
> - @param[out] Pdu The received iSCSI pdu.
> - @param[in] Context The context used to describe information on the caller
> provided
> - buffer to receive data segment of the iSCSI pdu, it's optional.
> - @param[in] HeaderDigest Whether there will be header digest received.
> - @param[in] DataDigest Whether there will be data digest.
> - @param[in] TimeoutEvent The timeout event, it's optional.
> -
> - @retval EFI_SUCCESS An iSCSI pdu is received.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiReceivePdu (
> - IN ISCSI_CONNECTION *Conn,
> - OUT NET_BUF **Pdu,
> - IN ISCSI_IN_BUFFER_CONTEXT *Context, OPTIONAL
> - IN BOOLEAN HeaderDigest,
> - IN BOOLEAN DataDigest,
> - IN EFI_EVENT TimeoutEvent OPTIONAL
> - )
> -{
> - LIST_ENTRY *NbufList;
> - UINT32 Len;
> - NET_BUF *PduHdr;
> - UINT8 *Header;
> - EFI_STATUS Status;
> - UINT32 PadLen;
> - UINT32 InDataOffset;
> - NET_FRAGMENT Fragment[2];
> - UINT32 FragmentCount;
> - NET_BUF *DataSeg;
> - UINT32 PadAndCRC32[2];
> -
> - NbufList = AllocatePool (sizeof (LIST_ENTRY));
> - if (NbufList == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - InitializeListHead (NbufList);
> -
> - //
> - // The header digest will be received together with the PDU header if exists.
> - //
> - Len = sizeof (ISCSI_BASIC_HEADER) + (HeaderDigest ? sizeof (UINT32) : 0);
> - PduHdr = NetbufAlloc (Len);
> - if (PduHdr == NULL) {
> - FreePool (NbufList);
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Header = NetbufAllocSpace (PduHdr, Len, NET_BUF_TAIL);
> - ASSERT (Header != NULL);
> - InsertTailList (NbufList, &PduHdr->List);
> -
> - //
> - // First step, receive the BHS of the PDU.
> - //
> - Status = Tcp4IoReceive (&Conn->Tcp4Io, PduHdr, FALSE, TimeoutEvent);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - if (HeaderDigest) {
> - //
> - // TODO: check the header-digest.
> - //
> - //
> - // Trim off the digest.
> - //
> - NetbufTrim (PduHdr, sizeof (UINT32), NET_BUF_TAIL);
> - }
> -
> - Len = ISCSI_GET_DATASEG_LEN (Header);
> - if (Len == 0) {
> - //
> - // No data segment.Form the pdu from a list of pdu segments.
> - //
> - *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
> - if (*Pdu == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto ON_EXIT;
> - }
> - return Status;
> - }
> - //
> - // Get the length of the padding bytes of the data segment.
> - //
> - PadLen = ISCSI_GET_PAD_LEN (Len);
> -
> - switch (ISCSI_GET_OPCODE (Header)) {
> - case ISCSI_OPCODE_SCSI_DATA_IN:
> - //
> - // Try to use the buffer described by Context if the PDU is an
> - // iSCSI SCSI data in pdu so as to reduce memory copy overhead.
> - //
> - InDataOffset = ISCSI_GET_BUFFER_OFFSET (Header);
> - if ((Context == NULL) || ((InDataOffset + Len) > Context->InDataLen)) {
> - Status = EFI_PROTOCOL_ERROR;
> - goto ON_EXIT;
> - }
> -
> - Fragment[0].Len = Len;
> - Fragment[0].Bulk = Context->InData + InDataOffset;
> -
> - if (DataDigest || (PadLen != 0)) {
> - //
> - // The data segment is padded, use two fragments to receive it.
> - // The first to receive the useful data. The second to receive the padding.
> - //
> - Fragment[1].Len = PadLen + (DataDigest ? sizeof (UINT32) : 0);
> - Fragment[1].Bulk = (UINT8 *)PadAndCRC32 + (4 - PadLen);
> - FragmentCount = 2;
> - } else {
> - FragmentCount = 1;
> - }
> -
> - DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0,
> IScsiNbufExtFree, NULL);
> - if (DataSeg == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto ON_EXIT;
> - }
> -
> - break;
> -
> - case ISCSI_OPCODE_SCSI_RSP:
> - case ISCSI_OPCODE_NOP_IN:
> - case ISCSI_OPCODE_LOGIN_RSP:
> - case ISCSI_OPCODE_TEXT_RSP:
> - case ISCSI_OPCODE_ASYNC_MSG:
> - case ISCSI_OPCODE_REJECT:
> - case ISCSI_OPCODE_VENDOR_T0:
> - case ISCSI_OPCODE_VENDOR_T1:
> - case ISCSI_OPCODE_VENDOR_T2:
> - //
> - // Allocate buffer to receive the data segment.
> - //
> - Len += PadLen + (DataDigest ? sizeof (UINT32) : 0);
> - DataSeg = NetbufAlloc (Len);
> - if (DataSeg == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto ON_EXIT;
> - }
> -
> - NetbufAllocSpace (DataSeg, Len, NET_BUF_TAIL);
> - break;
> -
> - default:
> - Status = EFI_PROTOCOL_ERROR;
> - goto ON_EXIT;
> - }
> -
> - InsertTailList (NbufList, &DataSeg->List);
> -
> - //
> - // Receive the data segment with the data digest if any.
> - //
> - Status = Tcp4IoReceive (&Conn->Tcp4Io, DataSeg, FALSE, TimeoutEvent);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - if (DataDigest) {
> - //
> - // TODO: Check the data digest.
> - //
> - NetbufTrim (DataSeg, sizeof (UINT32), NET_BUF_TAIL);
> - }
> -
> - if (PadLen != 0) {
> - //
> - // Trim off the padding bytes in the data segment.
> - //
> - NetbufTrim (DataSeg, PadLen, NET_BUF_TAIL);
> - }
> -
> - //
> - // Form the pdu from a list of pdu segments.
> - //
> - *Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
> - if (*Pdu == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - }
> -
> -ON_EXIT:
> -
> - if (EFI_ERROR (Status)) {
> - //
> - // Free the Nbufs in this NbufList and the NbufList itself.
> - //
> - IScsiFreeNbufList (NbufList);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Check and get the result of the prameter negotiation.
> -
> - @param[in, out] Conn The connection in iSCSI login.
> -
> - @retval EFI_SUCCESS The parmeter check is passed and negotiation is
> finished.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -**/
> -EFI_STATUS
> -IScsiCheckOpParams (
> - IN OUT ISCSI_CONNECTION *Conn
> - )
> -{
> - EFI_STATUS Status;
> - LIST_ENTRY *KeyValueList;
> - CHAR8 *Data;
> - UINT32 Len;
> - ISCSI_SESSION *Session;
> - CHAR8 *Value;
> - UINTN NumericValue;
> -
> - ASSERT (Conn->RspQue.BufNum != 0);
> -
> - Session = Conn->Session;
> -
> - Len = Conn->RspQue.BufSize;
> - Data = AllocatePool (Len);
> - if (Data == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - NetbufQueCopy (&Conn->RspQue, 0, Len, (UINT8 *) Data);
> -
> - Status = EFI_PROTOCOL_ERROR;
> -
> - //
> - // Extract the Key-Value pairs into a list.
> - //
> - KeyValueList = IScsiBuildKeyValueList (Data, Len);
> - if (KeyValueList == NULL) {
> - FreePool (Data);
> - return Status;
> - }
> - //
> - // HeaderDigest
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_HEADER_DIGEST);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - if (AsciiStrCmp (Value, "CRC32") == 0) {
> - if (Conn->HeaderDigest != IScsiDigestCRC32) {
> - goto ON_ERROR;
> - }
> - } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) {
> - Conn->HeaderDigest = IScsiDigestNone;
> - } else {
> - goto ON_ERROR;
> - }
> - //
> - // DataDigest
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_DIGEST);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - if (AsciiStrCmp (Value, "CRC32") == 0) {
> - if (Conn->DataDigest != IScsiDigestCRC32) {
> - goto ON_ERROR;
> - }
> - } else if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) == 0) {
> - Conn->DataDigest = IScsiDigestNone;
> - } else {
> - goto ON_ERROR;
> - }
> - //
> - // ErrorRecoveryLevel, result fuction is Minimum.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_ERROR_RECOVERY_LEVEL);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - NumericValue = AsciiStrDecimalToUintn (Value);
> - if (NumericValue > 2) {
> - goto ON_ERROR;
> - }
> -
> - Session->ErrorRecoveryLevel = (UINT8) MIN (Session->ErrorRecoveryLevel,
> NumericValue);
> -
> - //
> - // InitialR2T, result function is OR.
> - //
> - if (!Session->InitialR2T) {
> - Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - Session->InitialR2T = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0);
> - }
> -
> - //
> - // ImmediateData, result function is AND.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_IMMEDIATE_DATA);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - Session->ImmediateData = (BOOLEAN) (Session->ImmediateData &&
> (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0));
> -
> - //
> - // MaxRecvDataSegmentLength is declarative.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH);
> - if (Value != NULL) {
> - Conn->MaxRecvDataSegmentLength = (UINT32) AsciiStrDecimalToUintn
> (Value);
> - }
> - //
> - // MaxBurstLength, result funtion is Mininum.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_MAX_BURST_LENGTH);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - NumericValue = AsciiStrDecimalToUintn (Value);
> - Session->MaxBurstLength = (UINT32) MIN (Session->MaxBurstLength,
> NumericValue);
> -
> - //
> - // FirstBurstLength, result function is Minimum. Irrelevant when InitialR2T=Yes
> and
> - // ImmediateData=No.
> - // This Key/Value is negotiation type.
> - //
> - if (!(Session->InitialR2T && !Session->ImmediateData)) {
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_FIRST_BURST_LENGTH);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - NumericValue = AsciiStrDecimalToUintn (Value);
> - Session->FirstBurstLength = (UINT32) MIN (Session->FirstBurstLength,
> NumericValue);
> - }
> -
> - //
> - // MaxConnections, result function is Minimum.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_MAX_CONNECTIONS);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - NumericValue = AsciiStrDecimalToUintn (Value);
> - if ((NumericValue == 0) || (NumericValue > 65535)) {
> - goto ON_ERROR;
> - }
> -
> - Session->MaxConnections = (UINT32) MIN (Session->MaxConnections,
> NumericValue);
> -
> - //
> - // DataPDUInOrder, result function is OR.
> - //
> - if (!Session->DataPDUInOrder) {
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DATA_PDU_IN_ORDER);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - Session->DataPDUInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes") == 0);
> - }
> -
> - //
> - // DataSequenceInorder, result function is OR.
> - //
> - if (!Session->DataSequenceInOrder) {
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DATA_SEQUENCE_IN_ORDER);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - Session->DataSequenceInOrder = (BOOLEAN) (AsciiStrCmp (Value, "Yes") ==
> 0);
> - }
> -
> - //
> - // DefaultTime2Wait, result function is Maximum.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DEFAULT_TIME2WAIT);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - NumericValue = AsciiStrDecimalToUintn (Value);
> - if (NumericValue == 0) {
> - Session->DefaultTime2Wait = 0;
> - } else if (NumericValue > 3600) {
> - goto ON_ERROR;
> - } else {
> - Session->DefaultTime2Wait = (UINT32) MAX (Session->DefaultTime2Wait,
> NumericValue);
> - }
> - //
> - // DefaultTime2Retain, result function is Minimum.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DEFAULT_TIME2RETAIN);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - NumericValue = AsciiStrDecimalToUintn (Value);
> - if (NumericValue == 0) {
> - Session->DefaultTime2Retain = 0;
> - } else if (NumericValue > 3600) {
> - goto ON_ERROR;
> - } else {
> - Session->DefaultTime2Retain = (UINT32) MIN (Session->DefaultTime2Retain,
> NumericValue);
> - }
> - //
> - // MaxOutstandingR2T, result function is Minimum.
> - //
> - Value = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_MAX_OUTSTANDING_R2T);
> - if (Value == NULL) {
> - goto ON_ERROR;
> - }
> -
> - NumericValue = AsciiStrDecimalToUintn (Value);
> - if ((NumericValue == 0) || (NumericValue > 65535)) {
> - goto ON_ERROR;
> - }
> -
> - Session->MaxOutstandingR2T = (UINT16) MIN (Session->MaxOutstandingR2T,
> NumericValue);
> -
> - //
> - // Remove declarative key-value pairs, if any.
> - //
> - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_SESSION_TYPE);
> - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ALIAS);
> - IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_TARGET_PORTAL_GROUP_TAG);
> - //
> - // Remove the key-value that may not needed for result function is OR.
> - //
> - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_INITIAL_R2T);
> - IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_DATA_PDU_IN_ORDER);
> - IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_DATA_SEQUENCE_IN_ORDER);
> -
> - //
> - // Remove irrelevant parameter, if any.
> - //
> - if (Session->InitialR2T && !Session->ImmediateData) {
> - IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_FIRST_BURST_LENGTH);
> - }
> -
> - if (IsListEmpty (KeyValueList)) {
> - //
> - // Succeed if no more keys in the list.
> - //
> - Status = EFI_SUCCESS;
> - }
> -
> -ON_ERROR:
> -
> - IScsiFreeKeyValueList (KeyValueList);
> -
> - FreePool (Data);
> -
> - return Status;
> -}
> -
> -/**
> - Fill the oprational prameters.
> -
> - @param[in] Conn The connection in iSCSI login.
> - @param[in, out] Pdu The iSCSI login request PDU to fill the parameters.
> -
> - @retval EFI_SUCCESS The parmeters are filled into the iSCSI login request
> PDU.
> -**/
> -EFI_STATUS
> -IScsiFillOpParams (
> - IN ISCSI_CONNECTION *Conn,
> - IN OUT NET_BUF *Pdu
> - )
> -{
> - ISCSI_SESSION *Session;
> - CHAR8 Value[256];
> -
> - Session = Conn->Session;
> -
> - AsciiSPrint (Value, sizeof (Value), "%a", (Conn->HeaderDigest ==
> IScsiDigestCRC32) ? "None,CRC32" : "None");
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_HEADER_DIGEST, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%a", (Conn->DataDigest ==
> IScsiDigestCRC32) ? "None,CRC32" : "None");
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_DIGEST, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%d", Session->ErrorRecoveryLevel);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_ERROR_RECOVERY_LEVEL, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%a", Session->InitialR2T ? "Yes" : "No");
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_INITIAL_R2T, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%a", Session->ImmediateData ? "Yes" :
> "No");
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_IMMEDIATE_DATA, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%d", MAX_RECV_DATA_SEG_LEN_IN_FFP);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH,
> Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxBurstLength);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_BURST_LENGTH, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%d", Session->FirstBurstLength);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_FIRST_BURST_LENGTH, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxConnections);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_CONNECTIONS, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%a", Session->DataPDUInOrder ? "Yes" :
> "No");
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_PDU_IN_ORDER, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%a", Session->DataSequenceInOrder ?
> "Yes" : "No");
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DATA_SEQUENCE_IN_ORDER, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Wait);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2WAIT, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%d", Session->DefaultTime2Retain);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_DEFAULT_TIME2RETAIN, Value);
> -
> - AsciiSPrint (Value, sizeof (Value), "%d", Session->MaxOutstandingR2T);
> - IScsiAddKeyValuePair (Pdu, ISCSI_KEY_MAX_OUTSTANDING_R2T, Value);
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Pad the iSCSI AHS or data segment to an integer number of 4 byte words.
> -
> - @param[in, out] Pdu The iSCSI pdu which contains segments to pad.
> - @param[in] Len The length of the last semgnet in the PDU.
> -
> - @retval EFI_SUCCESS The segment is padded or no need to pad it.
> - @retval EFI_OUT_OF_RESOURCES There is not enough remaining free space
> to add the
> - padding bytes.
> -**/
> -EFI_STATUS
> -IScsiPadSegment (
> - IN OUT NET_BUF *Pdu,
> - IN UINT32 Len
> - )
> -{
> - UINT32 PadLen;
> - UINT8 *Data;
> -
> - PadLen = ISCSI_GET_PAD_LEN (Len);
> -
> - if (PadLen != 0) {
> - Data = NetbufAllocSpace (Pdu, PadLen, NET_BUF_TAIL);
> - if (Data == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - ZeroMem (Data, PadLen);
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Build a key-value list from the data segment.
> -
> - @param[in] Data The data segment containing the key-value pairs.
> - @param[in] Len Length of the data segment.
> -
> - @return The key-value list.
> - @retval NULL Other errors as indicated.
> -**/
> -LIST_ENTRY *
> -IScsiBuildKeyValueList (
> - IN CHAR8 *Data,
> - IN UINT32 Len
> - )
> -{
> - LIST_ENTRY *ListHead;
> - ISCSI_KEY_VALUE_PAIR *KeyValuePair;
> -
> - ListHead = AllocatePool (sizeof (LIST_ENTRY));
> - if (ListHead == NULL) {
> - return NULL;
> - }
> -
> - InitializeListHead (ListHead);
> -
> - while (Len > 0) {
> - KeyValuePair = AllocatePool (sizeof (ISCSI_KEY_VALUE_PAIR));
> - if (KeyValuePair == NULL) {
> - goto ON_ERROR;
> - }
> -
> - InitializeListHead (&KeyValuePair->List);
> -
> - KeyValuePair->Key = Data;
> -
> - while ((Len > 0) && (*Data != '=')) {
> - Len--;
> - Data++;
> - }
> -
> - if (*Data == '=') {
> - *Data = '\0';
> -
> - Data++;
> - Len--;
> - } else {
> - FreePool (KeyValuePair);
> - goto ON_ERROR;
> - }
> -
> - KeyValuePair->Value = Data;
> -
> - InsertTailList (ListHead, &KeyValuePair->List);;
> -
> - Data += AsciiStrLen (KeyValuePair->Value) + 1;
> - Len -= (UINT32) AsciiStrLen (KeyValuePair->Value) + 1;
> - }
> -
> - return ListHead;
> -
> -ON_ERROR:
> -
> - IScsiFreeKeyValueList (ListHead);
> -
> - return NULL;
> -}
> -
> -/**
> - Get the value string by the key name from the key-value list. If found,
> - the key-value entry will be removed from the list.
> -
> - @param[in, out] KeyValueList The key-value list.
> - @param[in] Key The key name to find.
> -
> - @return The value string.
> -**/
> -CHAR8 *
> -IScsiGetValueByKeyFromList (
> - IN OUT LIST_ENTRY *KeyValueList,
> - IN CHAR8 *Key
> - )
> -{
> - LIST_ENTRY *Entry;
> - ISCSI_KEY_VALUE_PAIR *KeyValuePair;
> - CHAR8 *Value;
> -
> - Value = NULL;
> -
> - NET_LIST_FOR_EACH (Entry, KeyValueList) {
> - KeyValuePair = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR, List);
> -
> - if (AsciiStrCmp (KeyValuePair->Key, Key) == 0) {
> - Value = KeyValuePair->Value;
> -
> - RemoveEntryList (&KeyValuePair->List);
> - FreePool (KeyValuePair);
> - break;
> - }
> - }
> -
> - return Value;
> -}
> -
> -/**
> - Free the key-value list.
> -
> - @param[in] KeyValueList The key-value list.
> -**/
> -VOID
> -IScsiFreeKeyValueList (
> - IN LIST_ENTRY *KeyValueList
> - )
> -{
> - LIST_ENTRY *Entry;
> - ISCSI_KEY_VALUE_PAIR *KeyValuePair;
> -
> - while (!IsListEmpty (KeyValueList)) {
> - Entry = NetListRemoveHead (KeyValueList);
> - KeyValuePair = NET_LIST_USER_STRUCT (Entry, ISCSI_KEY_VALUE_PAIR,
> List);
> -
> - FreePool (KeyValuePair);
> - }
> -
> - FreePool (KeyValueList);
> -}
> -
> -/**
> - Normalize the iSCSI name according to RFC.
> -
> - @param[in, out] Name The iSCSI name.
> - @param[in] Len length of the iSCSI name.
> -
> - @retval EFI_SUCCESS The iSCSI name is valid and normalized.
> - @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in the
> IQN format.
> -**/
> -EFI_STATUS
> -IScsiNormalizeName (
> - IN OUT CHAR8 *Name,
> - IN UINTN Len
> - )
> -{
> - UINTN Index;
> -
> - for (Index = 0; Index < Len; Index++) {
> - if (NET_IS_UPPER_CASE_CHAR (Name[Index])) {
> - //
> - // Convert the upper-case characters to lower-case ones
> - //
> - Name[Index] = (CHAR8) (Name[Index] - 'A' + 'a');
> - }
> -
> - if (!NET_IS_LOWER_CASE_CHAR (Name[Index]) &&
> - !NET_IS_DIGIT (Name[Index]) &&
> - (Name[Index] != '-') &&
> - (Name[Index] != '.') &&
> - (Name[Index] != ':')
> - ) {
> - //
> - // ASCII dash, dot, colon lower-case characters and digit characters
> - // are allowed.
> - //
> - return EFI_PROTOCOL_ERROR;
> - }
> - }
> -
> - if ((Len < 4) || (CompareMem (Name, "iqn.", 4) != 0)) {
> - //
> - // Only IQN format is accepted now.
> - //
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Create an iSCSI task control block.
> -
> - @param[in] Conn The connection on which the task control block will
> be created.
> - @param[out] Tcb The newly created task control block.
> -
> - @retval EFI_SUCCESS The task control block is created.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NOT_READY The target can not accept new commands.
> -**/
> -EFI_STATUS
> -IScsiNewTcb (
> - IN ISCSI_CONNECTION *Conn,
> - OUT ISCSI_TCB **Tcb
> - )
> -{
> - ISCSI_SESSION *Session;
> - ISCSI_TCB *NewTcb;
> -
> - ASSERT (Tcb != NULL);
> -
> - Session = Conn->Session;
> -
> - if (ISCSI_SEQ_GT (Session->CmdSN, Session->MaxCmdSN)) {
> - return EFI_NOT_READY;
> - }
> -
> - NewTcb = AllocateZeroPool (sizeof (ISCSI_TCB));
> - if (NewTcb == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - InitializeListHead (&NewTcb->Link);
> -
> - NewTcb->SoFarInOrder = TRUE;
> - NewTcb->InitiatorTaskTag = Session->InitiatorTaskTag;
> - NewTcb->CmdSN = Session->CmdSN;
> - NewTcb->Conn = Conn;
> -
> - InsertTailList (&Session->TcbList, &NewTcb->Link);
> -
> - //
> - // Advance the initiator task tag.
> - //
> - Session->InitiatorTaskTag++;
> - Session->CmdSN++;
> -
> - *Tcb = NewTcb;
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Delete the tcb from the connection and destroy it.
> -
> - @param[in] Tcb The tcb to delete.
> -**/
> -VOID
> -IScsiDelTcb (
> - IN ISCSI_TCB *Tcb
> - )
> -{
> - RemoveEntryList (&Tcb->Link);
> -
> - FreePool (Tcb);
> -}
> -
> -
> -/**
> - Create a data segment, pad it and calculate the CRC if needed.
> -
> - @param[in] Data The data to fill into the data segment.
> - @param[in] Len Length of the data.
> - @param[in] DataDigest Whether to calculate CRC for this data segment.
> -
> - @return The net buffer wrapping the data segment.
> -**/
> -NET_BUF *
> -IScsiNewDataSegment (
> - IN UINT8 *Data,
> - IN UINT32 Len,
> - IN BOOLEAN DataDigest
> - )
> -{
> - NET_FRAGMENT Fragment[2];
> - UINT32 FragmentCount;
> - UINT32 PadLen;
> - NET_BUF *DataSeg;
> -
> - Fragment[0].Len = Len;
> - Fragment[0].Bulk = Data;
> -
> - PadLen = ISCSI_GET_PAD_LEN (Len);
> - if (PadLen != 0) {
> - Fragment[1].Len = PadLen;
> - Fragment[1].Bulk = (UINT8 *) &mDataSegPad;
> -
> - FragmentCount = 2;
> - } else {
> - FragmentCount = 1;
> - }
> -
> - DataSeg = NetbufFromExt (&Fragment[0], FragmentCount, 0, 0,
> IScsiNbufExtFree, NULL);
> -
> - return DataSeg;
> -}
> -
> -/**
> - Create a iSCSI SCSI command PDU to encapsulate the command issued
> - by SCSI through the EXT SCSI PASS THRU Protocol.
> -
> - @param[in] Packet The EXT SCSI PASS THRU request packet containing the
> SCSI command.
> - @param[in] Lun The LUN.
> - @param[in] Tcb The tcb associated with this SCSI command.
> -
> - @return The created iSCSI SCSI command PDU.
> - @retval NULL Other errors as indicated.
> -**/
> -NET_BUF *
> -IScsiNewScsiCmdPdu (
> - IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
> - IN UINT64 Lun,
> - IN ISCSI_TCB *Tcb
> - )
> -{
> - LIST_ENTRY *NbufList;
> - NET_BUF *Pdu;
> - NET_BUF *PduHeader;
> - NET_BUF *DataSeg;
> - SCSI_COMMAND *ScsiCmd;
> - UINT8 AHSLength;
> - UINT32 Length;
> - ISCSI_ADDITIONAL_HEADER *Header;
> - ISCSI_BI_EXP_READ_DATA_LEN_AHS *BiExpReadDataLenAHS;
> - ISCSI_SESSION *Session;
> - UINT32 ImmediateDataLen;
> -
> - AHSLength = 0;
> -
> - if (Packet->DataDirection == DataBi) {
> - //
> - // Bi directional Read/Write command, the bidirectional expected
> - // read data length AHS is required.
> - //
> - AHSLength += sizeof (ISCSI_BI_EXP_READ_DATA_LEN_AHS);
> - }
> -
> - if (Packet->CdbLength > 16) {
> - //
> - // The CDB exceeds 16 bytes, an extended CDB AHS is required.
> - //
> - AHSLength = (UINT8) (AHSLength + (ISCSI_ROUNDUP (Packet->CdbLength -
> 16) + sizeof (ISCSI_ADDITIONAL_HEADER)));
> - }
> -
> - Length = sizeof (SCSI_COMMAND) + AHSLength;
> - PduHeader = NetbufAlloc (Length);
> - if (PduHeader == NULL) {
> - return NULL;
> - }
> -
> - ScsiCmd = (SCSI_COMMAND *) NetbufAllocSpace (PduHeader, Length,
> NET_BUF_TAIL);
> - if (ScsiCmd == NULL) {
> - NetbufFree (PduHeader);
> - return NULL;
> - }
> - Header = (ISCSI_ADDITIONAL_HEADER *) (ScsiCmd + 1);
> -
> - ZeroMem (ScsiCmd, Length);
> -
> - ISCSI_SET_OPCODE (ScsiCmd, ISCSI_OPCODE_SCSI_CMD, 0);
> - ISCSI_SET_FLAG (ScsiCmd, ISCSI_TASK_ATTR_SIMPLE);
> -
> - //
> - // Set the READ/WRITE flags according to the IO type of this request.
> - //
> - switch (Packet->DataDirection) {
> - case DataIn:
> - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ);
> - ScsiCmd->ExpDataXferLength = NTOHL (Packet->InTransferLength);
> - break;
> -
> - case DataOut:
> - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_WRITE);
> - ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength);
> - break;
> -
> - case DataBi:
> - ISCSI_SET_FLAG (ScsiCmd, SCSI_CMD_PDU_FLAG_READ |
> SCSI_CMD_PDU_FLAG_WRITE);
> - ScsiCmd->ExpDataXferLength = NTOHL (Packet->OutTransferLength);
> -
> - //
> - // Fill the bidirectional expected read data length AHS.
> - //
> - BiExpReadDataLenAHS = (ISCSI_BI_EXP_READ_DATA_LEN_AHS *)
> Header;
> - Header = (ISCSI_ADDITIONAL_HEADER *) (BiExpReadDataLenAHS + 1);
> -
> - BiExpReadDataLenAHS->Length = NTOHS (5);
> - BiExpReadDataLenAHS->Type = ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN;
> - BiExpReadDataLenAHS->ExpReadDataLength = NTOHL (Packet-
> >InTransferLength);
> -
> - break;
> - }
> -
> - ScsiCmd->TotalAHSLength = AHSLength;
> - CopyMem (ScsiCmd->Lun, &Lun, sizeof (ScsiCmd->Lun));
> - ScsiCmd->InitiatorTaskTag = NTOHL (Tcb->InitiatorTaskTag);
> - ScsiCmd->CmdSN = NTOHL (Tcb->CmdSN);
> - ScsiCmd->ExpStatSN = NTOHL (Tcb->Conn->ExpStatSN);
> -
> - CopyMem (ScsiCmd->Cdb, Packet->Cdb, sizeof (ScsiCmd->Cdb));
> -
> - if (Packet->CdbLength > 16) {
> - Header->Length = NTOHS ((UINT16) (Packet->CdbLength - 15));
> - Header->Type = ISCSI_AHS_TYPE_EXT_CDB;
> -
> - CopyMem (Header + 1, (UINT8 *) Packet->Cdb + 16, Packet->CdbLength - 16);
> - }
> -
> - Pdu = PduHeader;
> - Session = Tcb->Conn->Session;
> - ImmediateDataLen = 0;
> -
> - if (Session->ImmediateData && (Packet->OutTransferLength != 0)) {
> - //
> - // Send immediate data in this SCSI Command PDU. The length of the
> immeidate
> - // data is the minimum of FirstBurstLength, the data length to be xfered and
> - // the MaxRecvdataSegmentLength on this connection.
> - //
> - ImmediateDataLen = MIN (Session->FirstBurstLength, Packet-
> >OutTransferLength);
> - ImmediateDataLen = MIN (ImmediateDataLen, Tcb->Conn-
> >MaxRecvDataSegmentLength);
> -
> - //
> - // Update the data segment length in the PDU header.
> - //
> - ISCSI_SET_DATASEG_LEN (ScsiCmd, ImmediateDataLen);
> -
> - //
> - // Create the data segment.
> - //
> - DataSeg = IScsiNewDataSegment ((UINT8 *) Packet->OutDataBuffer,
> ImmediateDataLen, FALSE);
> - if (DataSeg == NULL) {
> - NetbufFree (PduHeader);
> - Pdu = NULL;
> - goto ON_EXIT;
> - }
> -
> - NbufList = AllocatePool (sizeof (LIST_ENTRY));
> - if (NbufList == NULL) {
> - NetbufFree (PduHeader);
> - NetbufFree (DataSeg);
> -
> - Pdu = NULL;
> - goto ON_EXIT;
> - }
> -
> - InitializeListHead (NbufList);
> - InsertTailList (NbufList, &PduHeader->List);
> - InsertTailList (NbufList, &DataSeg->List);
> -
> - Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
> - if (Pdu == NULL) {
> - IScsiFreeNbufList (NbufList);
> - }
> - }
> -
> - if (Session->InitialR2T ||
> - (ImmediateDataLen == Session->FirstBurstLength) ||
> - (ImmediateDataLen == Packet->OutTransferLength)
> - ) {
> - //
> - // Unsolicited data out sequence is not allowed,
> - // or FirstBurstLength data is already sent out by immediate data
> - // or all the OUT data accompany this SCSI packet is sent as
> - // immediate data, the final flag should be set on this SCSI Command
> - // PDU.
> - //
> - ISCSI_SET_FLAG (ScsiCmd, ISCSI_BHS_FLAG_FINAL);
> - }
> -
> -ON_EXIT:
> -
> - return Pdu;
> -}
> -
> -/**
> - Create a new iSCSI SCSI Data Out PDU.
> -
> - @param[in] Data The data to put into the Data Out PDU.
> - @param[in] Len Length of the data.
> - @param[in] DataSN The DataSN of the Data Out PDU.
> - @param[in] Tcb The task control block of this Data Out PDU.
> - @param[in] Lun The LUN.
> -
> - @return The net buffer wrapping the Data Out PDU.
> - @retval NULL Other errors as indicated.
> -**/
> -NET_BUF *
> -IScsiNewDataOutPdu (
> - IN UINT8 *Data,
> - IN UINT32 Len,
> - IN UINT32 DataSN,
> - IN ISCSI_TCB *Tcb,
> - IN UINT64 Lun
> - )
> -{
> - LIST_ENTRY *NbufList;
> - NET_BUF *PduHdr;
> - NET_BUF *DataSeg;
> - NET_BUF *Pdu;
> - ISCSI_SCSI_DATA_OUT *DataOutHdr;
> - ISCSI_XFER_CONTEXT *XferContext;
> -
> - NbufList = AllocatePool (sizeof (LIST_ENTRY));
> - if (NbufList == NULL) {
> - return NULL;
> - }
> -
> - InitializeListHead (NbufList);
> -
> - //
> - // Allocate memory for the BHS.
> - //
> - PduHdr = NetbufAlloc (sizeof (ISCSI_SCSI_DATA_OUT));
> - if (PduHdr == NULL) {
> - FreePool (NbufList);
> - return NULL;
> - }
> - //
> - // Insert the BHS into the buffer list.
> - //
> - InsertTailList (NbufList, &PduHdr->List);
> -
> - DataOutHdr = (ISCSI_SCSI_DATA_OUT *) NetbufAllocSpace (PduHdr, sizeof
> (ISCSI_SCSI_DATA_OUT), NET_BUF_TAIL);
> - ASSERT (DataOutHdr != NULL);
> - XferContext = &Tcb->XferContext;
> -
> - ZeroMem (DataOutHdr, sizeof (ISCSI_SCSI_DATA_OUT));
> -
> - //
> - // Set the flags and fields of the Data Out PDU BHS.
> - //
> - ISCSI_SET_OPCODE (DataOutHdr, ISCSI_OPCODE_SCSI_DATA_OUT, 0);
> - ISCSI_SET_DATASEG_LEN (DataOutHdr, Len);
> -
> - DataOutHdr->InitiatorTaskTag = HTONL (Tcb->InitiatorTaskTag);
> - DataOutHdr->TargetTransferTag = HTONL (XferContext->TargetTransferTag);
> - DataOutHdr->ExpStatSN = HTONL (Tcb->Conn->ExpStatSN);
> - DataOutHdr->DataSN = HTONL (DataSN);
> - DataOutHdr->BufferOffset = HTONL (XferContext->Offset);
> -
> - if (XferContext->TargetTransferTag != ISCSI_RESERVED_TAG) {
> - CopyMem (&DataOutHdr->Lun, &Lun, sizeof (DataOutHdr->Lun));
> - }
> - //
> - // Build the data segment for this Data Out PDU.
> - //
> - DataSeg = IScsiNewDataSegment (Data, Len, FALSE);
> - if (DataSeg == NULL) {
> - IScsiFreeNbufList (NbufList);
> - return NULL;
> - }
> - //
> - // Put the data segment into the buffer list and combine it with the BHS
> - // into a full Data Out PDU.
> - //
> - InsertTailList (NbufList, &DataSeg->List);
> - Pdu = NetbufFromBufList (NbufList, 0, 0, IScsiFreeNbufList, NbufList);
> - if (Pdu == NULL) {
> - IScsiFreeNbufList (NbufList);
> - }
> -
> - return Pdu;
> -}
> -
> -/**
> - Generate a consecutive sequence of iSCSI SCSI Data Out PDUs.
> -
> - @param[in] Data The data which will be carried by the sequence of iSCSI SCSI
> Data Out PDUs.
> - @param[in] Tcb The task control block of the data to send out.
> - @param[in] Lun The LUN the data will be sent to.
> -
> - @return A list of net buffers with each of them wraps an iSCSI SCSI Data Out
> PDU.
> - @retval NULL Other errors as indicated.
> -**/
> -LIST_ENTRY *
> -IScsiGenerateDataOutPduSequence (
> - IN UINT8 *Data,
> - IN ISCSI_TCB *Tcb,
> - IN UINT64 Lun
> - )
> -{
> - LIST_ENTRY *PduList;
> - UINT32 DataSN;
> - UINT32 DataLen;
> - NET_BUF *DataOutPdu;
> - ISCSI_CONNECTION *Conn;
> - ISCSI_XFER_CONTEXT *XferContext;
> - UINT8 *DataOutPacket;
> -
> - PduList = AllocatePool (sizeof (LIST_ENTRY));
> - if (PduList == NULL) {
> - return NULL;
> - }
> -
> - InitializeListHead (PduList);
> -
> - DataSN = 0;
> - Conn = Tcb->Conn;
> - DataOutPdu = NULL;
> - XferContext = &Tcb->XferContext;
> -
> - while (XferContext->DesiredLength > 0) {
> - //
> - // Determine the length of data this Data Out PDU can carry.
> - //
> - DataLen = MIN (XferContext->DesiredLength, Conn-
> >MaxRecvDataSegmentLength);
> -
> - //
> - // Create a Data Out PDU.
> - //
> - DataOutPdu = IScsiNewDataOutPdu (Data, DataLen, DataSN, Tcb, Lun);
> - if (DataOutPdu == NULL) {
> - IScsiFreeNbufList (PduList);
> - PduList = NULL;
> -
> - goto ON_EXIT;
> - }
> -
> - InsertTailList (PduList, &DataOutPdu->List);
> -
> - //
> - // Update the context and DataSN.
> - //
> - XferContext->Offset += DataLen;
> - XferContext->DesiredLength -= DataLen;
> - DataSN++;
> - Data += DataLen;
> - }
> - //
> - // Set the F bit for the last data out PDU in this sequence.
> - //
> - DataOutPacket = NetbufGetByte (DataOutPdu, 0, NULL);
> - if (DataOutPacket == NULL) {
> - IScsiFreeNbufList (PduList);
> - PduList = NULL;
> - goto ON_EXIT;
> - }
> -
> - ISCSI_SET_FLAG (DataOutPacket, ISCSI_BHS_FLAG_FINAL);
> -
> -ON_EXIT:
> -
> - return PduList;
> -}
> -
> -/**
> - Send the Data in a sequence of Data Out PDUs one by one.
> -
> - @param[in] Data The data to carry by Data Out PDUs.
> - @param[in] Lun The LUN the data will be sent to.
> - @param[in] Tcb The task control block.
> -
> - @retval EFI_SUCCES The data is sent out to the LUN.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiSendDataOutPduSequence (
> - IN UINT8 *Data,
> - IN UINT64 Lun,
> - IN ISCSI_TCB *Tcb
> - )
> -{
> - LIST_ENTRY *DataOutPduList;
> - LIST_ENTRY *Entry;
> - NET_BUF *Pdu;
> - EFI_STATUS Status;
> -
> - //
> - // Generate the Data Out PDU sequence.
> - //
> - DataOutPduList = IScsiGenerateDataOutPduSequence (Data, Tcb, Lun);
> - if (DataOutPduList == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Status = EFI_SUCCESS;
> -
> - //
> - // Send the Data Out PDU's one by one.
> - //
> - NET_LIST_FOR_EACH (Entry, DataOutPduList) {
> - Pdu = NET_LIST_USER_STRUCT (Entry, NET_BUF, List);
> -
> - Status = Tcp4IoTransmit (&Tcb->Conn->Tcp4Io, Pdu);
> - if (EFI_ERROR (Status)) {
> - break;
> - }
> - }
> -
> - IScsiFreeNbufList (DataOutPduList);
> -
> - return Status;
> -}
> -
> -/**
> - Process the received iSCSI SCSI Data In PDU.
> -
> - @param[in] Pdu The Data In PDU received.
> - @param[in] Tcb The task control block.
> - @param[in, out] Packet The EXT SCSI PASS THRU request packet.
> -
> - @retval EFI_SUCCES The check on the Data IN PDU is passed and some
> update
> - actions are taken.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened.
> - @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the
> request.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiOnDataInRcvd (
> - IN NET_BUF *Pdu,
> - IN ISCSI_TCB *Tcb,
> - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
> - )
> -{
> - ISCSI_SCSI_DATA_IN *DataInHdr;
> - EFI_STATUS Status;
> -
> - DataInHdr = (ISCSI_SCSI_DATA_IN *) NetbufGetByte (Pdu, 0, NULL);
> - if (DataInHdr == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - DataInHdr->InitiatorTaskTag = NTOHL (DataInHdr->InitiatorTaskTag);
> - DataInHdr->ExpCmdSN = NTOHL (DataInHdr->ExpCmdSN);
> - DataInHdr->MaxCmdSN = NTOHL (DataInHdr->MaxCmdSN);
> - DataInHdr->DataSN = NTOHL (DataInHdr->DataSN);
> -
> - //
> - // Check the DataSN.
> - //
> - Status = IScsiCheckSN (&Tcb->ExpDataSN, DataInHdr->DataSN);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - if (DataInHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) {
> - return EFI_PROTOCOL_ERROR;
> - }
> - //
> - // Update the command related sequence numbers.
> - //
> - IScsiUpdateCmdSN (Tcb->Conn->Session, DataInHdr->MaxCmdSN, DataInHdr-
> >ExpCmdSN);
> -
> - if (ISCSI_FLAG_ON (DataInHdr, SCSI_DATA_IN_PDU_FLAG_STATUS_VALID)) {
> - if (!ISCSI_FLAG_ON (DataInHdr, ISCSI_BHS_FLAG_FINAL)) {
> - //
> - // The S bit is on but the F bit is off.
> - //
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - Tcb->StatusXferd = TRUE;
> -
> - if (ISCSI_FLAG_ON (DataInHdr, SCSI_DATA_IN_PDU_FLAG_OVERFLOW |
> SCSI_DATA_IN_PDU_FLAG_UNDERFLOW)) {
> - //
> - // Underflow and Overflow are mutual flags.
> - //
> - return EFI_PROTOCOL_ERROR;
> - }
> - //
> - // S bit is on, the StatSN is valid.
> - //
> - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NTOHL (DataInHdr-
> >StatSN));
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - Packet->HostAdapterStatus = 0;
> - Packet->TargetStatus = DataInHdr->Status;
> -
> - if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) {
> - Packet->InTransferLength += NTOHL (DataInHdr->ResidualCount);
> - Status = EFI_BAD_BUFFER_SIZE;
> - }
> -
> - if (ISCSI_FLAG_ON (DataInHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) {
> - Packet->InTransferLength -= NTOHL (DataInHdr->ResidualCount);
> - }
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Process the received iSCSI R2T PDU.
> -
> - @param[in] Pdu The R2T PDU received.
> - @param[in] Tcb The task control block.
> - @param[in] Lun The Lun.
> - @param[in, out] Packet The EXT SCSI PASS THRU request packet.
> -
> - @retval EFI_SUCCES The R2T PDU is valid and the solicited data is sent out.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiOnR2TRcvd (
> - IN NET_BUF *Pdu,
> - IN ISCSI_TCB *Tcb,
> - IN UINT64 Lun,
> - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
> - )
> -{
> - ISCSI_READY_TO_TRANSFER *R2THdr;
> - EFI_STATUS Status;
> - ISCSI_XFER_CONTEXT *XferContext;
> - UINT8 *Data;
> -
> - R2THdr = (ISCSI_READY_TO_TRANSFER *) NetbufGetByte (Pdu, 0, NULL);
> - if (R2THdr == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - R2THdr->InitiatorTaskTag = NTOHL (R2THdr->InitiatorTaskTag);
> - R2THdr->TargetTransferTag = NTOHL (R2THdr->TargetTransferTag);
> - R2THdr->StatSN = NTOHL (R2THdr->StatSN);
> - R2THdr->R2TSeqNum = NTOHL (R2THdr->R2TSeqNum);
> - R2THdr->BufferOffset = NTOHL (R2THdr->BufferOffset);
> - R2THdr->DesiredDataTransferLength = NTOHL (R2THdr-
> >DesiredDataTransferLength);
> -
> - if ((R2THdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) || !ISCSI_SEQ_EQ
> (R2THdr->StatSN, Tcb->Conn->ExpStatSN)) {
> - return EFI_PROTOCOL_ERROR;;
> - }
> - //
> - // Check the sequence number.
> - //
> - Status = IScsiCheckSN (&Tcb->ExpDataSN, R2THdr->R2TSeqNum);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - XferContext = &Tcb->XferContext;
> - XferContext->TargetTransferTag = R2THdr->TargetTransferTag;
> - XferContext->Offset = R2THdr->BufferOffset;
> - XferContext->DesiredLength = R2THdr->DesiredDataTransferLength;
> -
> - if (((XferContext->Offset + XferContext->DesiredLength) > Packet-
> >OutTransferLength) ||
> - (XferContext->DesiredLength > Tcb->Conn->Session->MaxBurstLength)
> - ) {
> - return EFI_PROTOCOL_ERROR;
> - }
> - //
> - // Send the data solicited by this R2T.
> - //
> - Data = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset;
> - Status = IScsiSendDataOutPduSequence (Data, Lun, Tcb);
> -
> - return Status;
> -}
> -
> -/**
> - Process the received iSCSI SCSI Response PDU.
> -
> - @param[in] Pdu The Response PDU received.
> - @param[in] Tcb The task control block.
> - @param[in, out] Packet The EXT SCSI PASS THRU request packet.
> -
> - @retval EFI_SUCCES The Response PDU is processed.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened.
> - @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the
> request.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiOnScsiRspRcvd (
> - IN NET_BUF *Pdu,
> - IN ISCSI_TCB *Tcb,
> - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
> - )
> -{
> - SCSI_RESPONSE *ScsiRspHdr;
> - ISCSI_SENSE_DATA *SenseData;
> - EFI_STATUS Status;
> - UINT32 DataSegLen;
> -
> - ScsiRspHdr = (SCSI_RESPONSE *) NetbufGetByte (Pdu, 0, NULL);
> - if (ScsiRspHdr == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - ScsiRspHdr->InitiatorTaskTag = NTOHL (ScsiRspHdr->InitiatorTaskTag);
> - if (ScsiRspHdr->InitiatorTaskTag != Tcb->InitiatorTaskTag) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - ScsiRspHdr->StatSN = NTOHL (ScsiRspHdr->StatSN);
> -
> - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, ScsiRspHdr->StatSN);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - ScsiRspHdr->MaxCmdSN = NTOHL (ScsiRspHdr->MaxCmdSN);
> - ScsiRspHdr->ExpCmdSN = NTOHL (ScsiRspHdr->ExpCmdSN);
> - IScsiUpdateCmdSN (Tcb->Conn->Session, ScsiRspHdr->MaxCmdSN,
> ScsiRspHdr->ExpCmdSN);
> -
> - Tcb->StatusXferd = TRUE;
> -
> - Packet->HostAdapterStatus = ScsiRspHdr->Response;
> - if (Packet->HostAdapterStatus !=
> ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET) {
> - return EFI_SUCCESS;
> - }
> -
> - Packet->TargetStatus = ScsiRspHdr->Status;
> -
> - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW |
> SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW) ||
> - ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW |
> SCSI_RSP_PDU_FLAG_UNDERFLOW)
> - ) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW)) {
> - Packet->InTransferLength += NTOHL (ScsiRspHdr->BiReadResidualCount);
> - Status = EFI_BAD_BUFFER_SIZE;
> - }
> -
> - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW))
> {
> - Packet->InTransferLength -= NTOHL (ScsiRspHdr->BiReadResidualCount);
> - }
> -
> - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_OVERFLOW)) {
> - if (Packet->DataDirection == DataIn) {
> - Packet->InTransferLength += NTOHL (ScsiRspHdr->ResidualCount);
> - } else {
> - Packet->OutTransferLength += NTOHL (ScsiRspHdr->ResidualCount);
> - }
> -
> - Status = EFI_BAD_BUFFER_SIZE;
> - }
> -
> - if (ISCSI_FLAG_ON (ScsiRspHdr, SCSI_RSP_PDU_FLAG_UNDERFLOW)) {
> - if (Packet->DataDirection == DataIn) {
> - Packet->InTransferLength -= NTOHL (ScsiRspHdr->ResidualCount);
> - } else {
> - Packet->OutTransferLength -= NTOHL (ScsiRspHdr->ResidualCount);
> - }
> - }
> -
> - DataSegLen = ISCSI_GET_DATASEG_LEN (ScsiRspHdr);
> - if (DataSegLen != 0) {
> - SenseData = (ISCSI_SENSE_DATA *) NetbufGetByte (Pdu, sizeof
> (SCSI_RESPONSE), NULL);
> - if (SenseData == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - SenseData->Length = NTOHS (SenseData->Length);
> -
> - Packet->SenseDataLength = (UINT8) MIN (SenseData->Length, Packet-
> >SenseDataLength);
> - if (Packet->SenseDataLength != 0) {
> - CopyMem (Packet->SenseData, &SenseData->Data[0], Packet-
> >SenseDataLength);
> - }
> - } else {
> - Packet->SenseDataLength = 0;
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Process the received NOP In PDU.
> -
> - @param[in] Pdu The NOP In PDU received.
> - @param[in] Tcb The task control block.
> -
> - @retval EFI_SUCCES The NOP In PDU is processed and the related
> sequence
> - numbers are updated.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror happened.
> -**/
> -EFI_STATUS
> -IScsiOnNopInRcvd (
> - IN NET_BUF *Pdu,
> - IN ISCSI_TCB *Tcb
> - )
> -{
> - ISCSI_NOP_IN *NopInHdr;
> - EFI_STATUS Status;
> -
> - NopInHdr = (ISCSI_NOP_IN *) NetbufGetByte (Pdu, 0, NULL);
> - if (NopInHdr == NULL) {
> - return EFI_PROTOCOL_ERROR;
> - }
> -
> - NopInHdr->StatSN = NTOHL (NopInHdr->StatSN);
> - NopInHdr->ExpCmdSN = NTOHL (NopInHdr->ExpCmdSN);
> - NopInHdr->MaxCmdSN = NTOHL (NopInHdr->MaxCmdSN);
> -
> - if (NopInHdr->InitiatorTaskTag == ISCSI_RESERVED_TAG) {
> - if (NopInHdr->StatSN != Tcb->Conn->ExpStatSN) {
> - return EFI_PROTOCOL_ERROR;
> - }
> - } else {
> - Status = IScsiCheckSN (&Tcb->Conn->ExpStatSN, NopInHdr->StatSN);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> - }
> -
> - IScsiUpdateCmdSN (Tcb->Conn->Session, NopInHdr->MaxCmdSN, NopInHdr-
> >ExpCmdSN);
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Execute the SCSI command issued through the EXT SCSI PASS THRU protocol.
> -
> - @param[in] PassThru The EXT SCSI PASS THRU protocol.
> - @param[in] Target The target ID.
> - @param[in] Lun The LUN.
> - @param[in, out] Packet The request packet containing IO request, SCSI
> command
> - buffer and buffers to read/write.
> -
> - @retval EFI_SUCCES The SCSI command is executed and the result is
> updated to
> - the Packet.
> - @retval EFI_DEVICE_ERROR Session state was not as required.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NOT_READY The target can not accept new commands.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiExecuteScsiCommand (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru,
> - IN UINT8 *Target,
> - IN UINT64 Lun,
> - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
> - )
> -{
> - EFI_STATUS Status;
> - ISCSI_DRIVER_DATA *Private;
> - ISCSI_SESSION *Session;
> - EFI_EVENT TimeoutEvent;
> - ISCSI_CONNECTION *Conn;
> - ISCSI_TCB *Tcb;
> - NET_BUF *Pdu;
> - ISCSI_XFER_CONTEXT *XferContext;
> - UINT8 *Data;
> - ISCSI_IN_BUFFER_CONTEXT InBufferContext;
> - UINT64 Timeout;
> - UINT8 *PduHdr;
> -
> - Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (PassThru);
> - Session = &Private->Session;
> - Status = EFI_SUCCESS;
> - Tcb = NULL;
> - TimeoutEvent = NULL;
> - Timeout = 0;
> -
> - if (Session->State != SESSION_STATE_LOGGED_IN) {
> - Status = EFI_DEVICE_ERROR;
> - goto ON_EXIT;
> - }
> -
> - Conn = NET_LIST_USER_STRUCT_S (
> - Session->Conns.ForwardLink,
> - ISCSI_CONNECTION,
> - Link,
> - ISCSI_CONNECTION_SIGNATURE
> - );
> -
> - if (Packet->Timeout != 0) {
> - Timeout = MultU64x32 (Packet->Timeout, 2);
> - }
> -
> - Status = IScsiNewTcb (Conn, &Tcb);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - //
> - // Encapsulate the SCSI request packet into an iSCSI SCSI Command PDU.
> - //
> - Pdu = IScsiNewScsiCmdPdu (Packet, Lun, Tcb);
> - if (Pdu == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto ON_EXIT;
> - }
> -
> - XferContext = &Tcb->XferContext;
> - PduHdr = NetbufGetByte (Pdu, 0, NULL);
> - if (PduHdr == NULL) {
> - Status = EFI_PROTOCOL_ERROR;
> - NetbufFree (Pdu);
> - goto ON_EXIT;
> - }
> - XferContext->Offset = ISCSI_GET_DATASEG_LEN (PduHdr);
> -
> - //
> - // Transmit the SCSI Command PDU.
> - //
> - Status = Tcp4IoTransmit (&Conn->Tcp4Io, Pdu);
> -
> - NetbufFree (Pdu);
> -
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - if (!Session->InitialR2T &&
> - (XferContext->Offset < Session->FirstBurstLength) &&
> - (XferContext->Offset < Packet->OutTransferLength)
> - ) {
> - //
> - // Unsolicited Data-Out sequence is allowed, there is remaining SCSI
> - // OUT data and the limit of FirstBurstLength is not reached.
> - //
> - XferContext->TargetTransferTag = ISCSI_RESERVED_TAG;
> - XferContext->DesiredLength = MIN (
> - Session->FirstBurstLength,
> - Packet->OutTransferLength - XferContext->Offset
> - );
> -
> - Data = (UINT8 *) Packet->OutDataBuffer + XferContext->Offset;
> - Status = IScsiSendDataOutPduSequence (Data, Lun, Tcb);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - }
> -
> - InBufferContext.InData = (UINT8 *) Packet->InDataBuffer;
> - InBufferContext.InDataLen = Packet->InTransferLength;
> -
> - while (!Tcb->StatusXferd) {
> - //
> - // Start the timeout timer.
> - //
> - if (Timeout != 0) {
> - Status = gBS->SetTimer (Conn->TimeoutEvent, TimerRelative, Timeout);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - TimeoutEvent = Conn->TimeoutEvent;
> - }
> - //
> - // try to receive PDU from target.
> - //
> - Status = IScsiReceivePdu (Conn, &Pdu, &InBufferContext, FALSE, FALSE,
> TimeoutEvent);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - PduHdr = NetbufGetByte (Pdu, 0, NULL);
> - if (PduHdr == NULL) {
> - Status = EFI_PROTOCOL_ERROR;
> - NetbufFree (Pdu);
> - goto ON_EXIT;
> - }
> - switch (ISCSI_GET_OPCODE (PduHdr)) {
> - case ISCSI_OPCODE_SCSI_DATA_IN:
> - Status = IScsiOnDataInRcvd (Pdu, Tcb, Packet);
> - break;
> -
> - case ISCSI_OPCODE_R2T:
> - Status = IScsiOnR2TRcvd (Pdu, Tcb, Lun, Packet);
> - break;
> -
> - case ISCSI_OPCODE_SCSI_RSP:
> - Status = IScsiOnScsiRspRcvd (Pdu, Tcb, Packet);
> - break;
> -
> - case ISCSI_OPCODE_NOP_IN:
> - Status = IScsiOnNopInRcvd (Pdu, Tcb);
> - break;
> -
> - case ISCSI_OPCODE_VENDOR_T0:
> - case ISCSI_OPCODE_VENDOR_T1:
> - case ISCSI_OPCODE_VENDOR_T2:
> - //
> - // These messages are vendor specific, skip them.
> - //
> - break;
> -
> - default:
> - Status = EFI_PROTOCOL_ERROR;
> - break;
> - }
> -
> - NetbufFree (Pdu);
> -
> - if (EFI_ERROR (Status)) {
> - break;
> - }
> - }
> -
> -ON_EXIT:
> -
> - if (TimeoutEvent != NULL) {
> - gBS->SetTimer (TimeoutEvent, TimerCancel, 0);
> - }
> -
> - if (Tcb != NULL) {
> - IScsiDelTcb (Tcb);
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Reinstate the session on some error.
> -
> - @param[in, out] Private The iSCSI driver data.
> -
> - @retval EFI_SUCCES The session is reinstated from some error.
> - @retval Other Reinstatement failed.
> -**/
> -EFI_STATUS
> -IScsiSessionReinstatement (
> - IN OUT ISCSI_DRIVER_DATA *Private
> - )
> -{
> - ISCSI_SESSION *Session;
> - EFI_STATUS Status;
> -
> - Session = &Private->Session;
> - ASSERT (Session->State != SESSION_STATE_FREE);
> -
> - //
> - // Abort the session and re-init it.
> - //
> - IScsiSessionAbort (Session);
> - IScsiSessionInit (Session, TRUE);
> -
> - //
> - // Login again.
> - //
> - Status = IScsiSessionLogin (Private);
> -
> - return Status;
> -}
> -
> -/**
> - Initialize some session parameters before login.
> -
> - @param[in, out] Session The iSCSI session.
> - @param[in] Recovery Whether the request is from a fresh new start or
> recovery.
> -**/
> -VOID
> -IScsiSessionInit (
> - IN OUT ISCSI_SESSION *Session,
> - IN BOOLEAN Recovery
> - )
> -{
> - if (!Recovery) {
> - Session->Signature = ISCSI_SESSION_SIGNATURE;
> - Session->State = SESSION_STATE_FREE;
> -
> - InitializeListHead (&Session->Conns);
> - InitializeListHead (&Session->TcbList);
> - }
> -
> - Session->Tsih = 0;
> -
> - Session->CmdSN = 1;
> - Session->InitiatorTaskTag = 1;
> - Session->NextCid = 1;
> -
> - Session->TargetPortalGroupTag = 0;
> - Session->MaxConnections = ISCSI_MAX_CONNS_PER_SESSION;
> - Session->InitialR2T = FALSE;
> - Session->ImmediateData = TRUE;
> - Session->MaxBurstLength = 262144;
> - Session->FirstBurstLength = MAX_RECV_DATA_SEG_LEN_IN_FFP;
> - Session->DefaultTime2Wait = 2;
> - Session->DefaultTime2Retain = 20;
> - Session->MaxOutstandingR2T = DEFAULT_MAX_OUTSTANDING_R2T;
> - Session->DataPDUInOrder = TRUE;
> - Session->DataSequenceInOrder = TRUE;
> - Session->ErrorRecoveryLevel = 0;
> -}
> -
> -/**
> - Abort the iSCSI session, that is, reset all the connection and free the
> - resources.
> -
> - @param[in, out] Session The iSCSI session.
> -
> - @retval EFI_SUCCES The session is aborted.
> -**/
> -EFI_STATUS
> -IScsiSessionAbort (
> - IN OUT ISCSI_SESSION *Session
> - )
> -{
> - ISCSI_DRIVER_DATA *Private;
> - ISCSI_CONNECTION *Conn;
> -
> - if (Session->State != SESSION_STATE_LOGGED_IN) {
> - return EFI_SUCCESS;
> - }
> -
> - ASSERT (!IsListEmpty (&Session->Conns));
> -
> - Private = ISCSI_DRIVER_DATA_FROM_SESSION (Session);
> -
> - while (!IsListEmpty (&Session->Conns)) {
> - Conn = NET_LIST_USER_STRUCT_S (
> - Session->Conns.ForwardLink,
> - ISCSI_CONNECTION,
> - Link,
> - ISCSI_CONNECTION_SIGNATURE
> - );
> -
> - gBS->CloseProtocol (
> - Conn->Tcp4Io.Handle,
> - &gEfiTcp4ProtocolGuid,
> - Private->Image,
> - Private->ExtScsiPassThruHandle
> - );
> -
> - IScsiConnReset (Conn);
> -
> - IScsiDetatchConnection (Conn);
> - IScsiDestroyConnection (Conn);
> - }
> -
> - Session->State = SESSION_STATE_FAILED;
> -
> - return EFI_SUCCESS;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c
> deleted file mode 100644
> index 901b38e92fc0..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.c
> +++ /dev/null
> @@ -1,487 +0,0 @@
> -/** @file
> - The wrap of TCP/IP Socket interface.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "IScsiImpl.h"
> -
> -/**
> - The common notify function associated with various Tcp4Io events.
> -
> - @param[in] Event The event signaled.
> - @param[in] Context The context.
> -**/
> -VOID
> -EFIAPI
> -Tcp4IoCommonNotify (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - )
> -{
> - *((BOOLEAN *) Context) = TRUE;
> -}
> -
> -/**
> - Create a TCP socket with the specified configuration data.
> -
> - @param[in] Image The handle of the driver image.
> - @param[in] Controller The handle of the controller.
> - @param[in] ConfigData The Tcp4 configuration data.
> - @param[in] Tcp4Io The Tcp4Io.
> -
> - @retval EFI_SUCCESS The TCP socket is created and configured.
> - @retval Others Failed to create the TCP socket or configure it.
> -**/
> -EFI_STATUS
> -Tcp4IoCreateSocket (
> - IN EFI_HANDLE Image,
> - IN EFI_HANDLE Controller,
> - IN TCP4_IO_CONFIG_DATA *ConfigData,
> - IN TCP4_IO *Tcp4Io
> - )
> -{
> - EFI_STATUS Status;
> - EFI_TCP4_PROTOCOL *Tcp4;
> - EFI_TCP4_CONFIG_DATA Tcp4ConfigData;
> - EFI_TCP4_OPTION ControlOption;
> - EFI_TCP4_ACCESS_POINT *AccessPoint;
> -
> - Tcp4Io->Handle = NULL;
> - Tcp4Io->ConnToken.CompletionToken.Event = NULL;
> - Tcp4Io->TxToken.CompletionToken.Event = NULL;
> - Tcp4Io->RxToken.CompletionToken.Event = NULL;
> - Tcp4Io->CloseToken.CompletionToken.Event = NULL;
> - Tcp4 = NULL;
> -
> - //
> - // Create the TCP4 child instance and get the TCP4 protocol.
> - //
> - Status = NetLibCreateServiceChild (
> - Controller,
> - Image,
> - &gEfiTcp4ServiceBindingProtocolGuid,
> - &Tcp4Io->Handle
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - Status = gBS->OpenProtocol (
> - Tcp4Io->Handle,
> - &gEfiTcp4ProtocolGuid,
> - (VOID **)&Tcp4Io->Tcp4,
> - Image,
> - Controller,
> - EFI_OPEN_PROTOCOL_BY_DRIVER
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Tcp4Io->Image = Image;
> - Tcp4Io->Controller = Controller;
> - Tcp4 = Tcp4Io->Tcp4;
> -
> - //
> - // Set the configuration parameters.
> - //
> - ControlOption.ReceiveBufferSize = 0x200000;
> - ControlOption.SendBufferSize = 0x200000;
> - ControlOption.MaxSynBackLog = 0;
> - ControlOption.ConnectionTimeout = 0;
> - ControlOption.DataRetries = 6;
> - ControlOption.FinTimeout = 0;
> - ControlOption.TimeWaitTimeout = 0;
> - ControlOption.KeepAliveProbes = 4;
> - ControlOption.KeepAliveTime = 0;
> - ControlOption.KeepAliveInterval = 0;
> - ControlOption.EnableNagle = FALSE;
> - ControlOption.EnableTimeStamp = FALSE;
> - ControlOption.EnableWindowScaling = TRUE;
> - ControlOption.EnableSelectiveAck = FALSE;
> - ControlOption.EnablePathMtuDiscovery = FALSE;
> -
> - Tcp4ConfigData.TypeOfService = 8;
> - Tcp4ConfigData.TimeToLive = 255;
> - Tcp4ConfigData.ControlOption = &ControlOption;
> -
> - AccessPoint = &Tcp4ConfigData.AccessPoint;
> -
> - AccessPoint->UseDefaultAddress = FALSE;
> - AccessPoint->StationPort = 0;
> - AccessPoint->RemotePort = ConfigData->RemotePort;
> - AccessPoint->ActiveFlag = TRUE;
> -
> - CopyMem (&AccessPoint->StationAddress, &ConfigData->LocalIp, sizeof
> (EFI_IPv4_ADDRESS));
> - CopyMem (&AccessPoint->SubnetMask, &ConfigData->SubnetMask, sizeof
> (EFI_IPv4_ADDRESS));
> - CopyMem (&AccessPoint->RemoteAddress, &ConfigData->RemoteIp, sizeof
> (EFI_IPv4_ADDRESS));
> -
> - //
> - // Configure the TCP4 protocol.
> - //
> - Status = Tcp4->Configure (Tcp4, &Tcp4ConfigData);
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - if (!EFI_IP4_EQUAL (&ConfigData->Gateway, &mZeroIp4Addr)) {
> - //
> - // the gateway is not zero, add the default route by hand
> - //
> - Status = Tcp4->Routes (Tcp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr,
> &ConfigData->Gateway);
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> - }
> - //
> - // Create events for variuos asynchronous operations.
> - //
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_SIGNAL,
> - TPL_NOTIFY,
> - Tcp4IoCommonNotify,
> - &Tcp4Io->IsConnDone,
> - &Tcp4Io->ConnToken.CompletionToken.Event
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_SIGNAL,
> - TPL_NOTIFY,
> - Tcp4IoCommonNotify,
> - &Tcp4Io->IsTxDone,
> - &Tcp4Io->TxToken.CompletionToken.Event
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_SIGNAL,
> - TPL_NOTIFY,
> - Tcp4IoCommonNotify,
> - &Tcp4Io->IsRxDone,
> - &Tcp4Io->RxToken.CompletionToken.Event
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_SIGNAL,
> - TPL_NOTIFY,
> - Tcp4IoCommonNotify,
> - &Tcp4Io->IsCloseDone,
> - &Tcp4Io->CloseToken.CompletionToken.Event
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Tcp4Io->IsTxDone = FALSE;
> - Tcp4Io->IsRxDone = FALSE;
> -
> - return EFI_SUCCESS;
> -
> -ON_ERROR:
> -
> - if (Tcp4Io->RxToken.CompletionToken.Event != NULL) {
> - gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event);
> - }
> -
> - if (Tcp4Io->TxToken.CompletionToken.Event != NULL) {
> - gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event);
> - }
> -
> - if (Tcp4Io->ConnToken.CompletionToken.Event != NULL) {
> - gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event);
> - }
> -
> - if (Tcp4 != NULL) {
> - Tcp4->Configure (Tcp4, NULL);
> -
> - gBS->CloseProtocol (
> - Tcp4Io->Handle,
> - &gEfiTcp4ProtocolGuid,
> - Image,
> - Controller
> - );
> - }
> -
> - NetLibDestroyServiceChild (
> - Controller,
> - Image,
> - &gEfiTcp4ServiceBindingProtocolGuid,
> - Tcp4Io->Handle
> - );
> -
> - return Status;
> -}
> -
> -/**
> - Destroy the socket.
> -
> - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyeds.
> -**/
> -VOID
> -Tcp4IoDestroySocket (
> - IN TCP4_IO *Tcp4Io
> - )
> -{
> - EFI_TCP4_PROTOCOL *Tcp4;
> -
> - Tcp4 = Tcp4Io->Tcp4;
> -
> - Tcp4->Configure (Tcp4, NULL);
> -
> - gBS->CloseEvent (Tcp4Io->TxToken.CompletionToken.Event);
> - gBS->CloseEvent (Tcp4Io->RxToken.CompletionToken.Event);
> - gBS->CloseEvent (Tcp4Io->ConnToken.CompletionToken.Event);
> -
> - gBS->CloseProtocol (
> - Tcp4Io->Handle,
> - &gEfiTcp4ProtocolGuid,
> - Tcp4Io->Image,
> - Tcp4Io->Controller
> - );
> -
> - NetLibDestroyServiceChild (
> - Tcp4Io->Controller,
> - Tcp4Io->Image,
> - &gEfiTcp4ServiceBindingProtocolGuid,
> - Tcp4Io->Handle
> - );
> -}
> -
> -/**
> - Connect to the other endpoint of the TCP socket.
> -
> - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket.
> - @param[in] Timeout The time to wait for connection done.
> -
> - @retval EFI_SUCCESS Connect to the other endpoint of the TCP socket
> successfully.
> - @retval EFI_TIMEOUT Failed to connect to the other endpoint of the TCP
> socket in the specified time period.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoConnect (
> - IN OUT TCP4_IO *Tcp4Io,
> - IN EFI_EVENT Timeout
> - )
> -{
> - EFI_TCP4_PROTOCOL *Tcp4;
> - EFI_STATUS Status;
> -
> - Tcp4Io->IsConnDone = FALSE;
> - Tcp4 = Tcp4Io->Tcp4;
> - Status = Tcp4->Connect (Tcp4, &Tcp4Io->ConnToken);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - while (!Tcp4Io->IsConnDone && EFI_ERROR (gBS->CheckEvent (Timeout))) {
> - Tcp4->Poll (Tcp4);
> - }
> -
> - if (!Tcp4Io->IsConnDone) {
> - Status = EFI_TIMEOUT;
> - } else {
> - Status = Tcp4Io->ConnToken.CompletionToken.Status;
> - }
> -
> - return Status;
> -}
> -
> -/**
> - Reset the socket.
> -
> - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket.
> -**/
> -VOID
> -Tcp4IoReset (
> - IN OUT TCP4_IO *Tcp4Io
> - )
> -{
> - EFI_STATUS Status;
> - EFI_TCP4_PROTOCOL *Tcp4;
> -
> - Tcp4Io->CloseToken.AbortOnClose = TRUE;
> - Tcp4Io->IsCloseDone = FALSE;
> -
> - Tcp4 = Tcp4Io->Tcp4;
> - Status = Tcp4->Close (Tcp4, &Tcp4Io->CloseToken);
> - if (EFI_ERROR (Status)) {
> - return ;
> - }
> -
> - while (!Tcp4Io->IsCloseDone) {
> - Tcp4->Poll (Tcp4);
> - }
> -}
> -
> -/**
> - Transmit the Packet to the other endpoint of the socket.
> -
> - @param[in] Tcp4Io The Tcp4Io wrapping the TCP socket.
> - @param[in] Packet The packet to transmit.
> -
> - @retval EFI_SUCCESS The packet is trasmitted.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoTransmit (
> - IN TCP4_IO *Tcp4Io,
> - IN NET_BUF *Packet
> - )
> -{
> - EFI_TCP4_TRANSMIT_DATA *TxData;
> - EFI_TCP4_PROTOCOL *Tcp4;
> - EFI_STATUS Status;
> -
> - TxData = AllocatePool (sizeof (EFI_TCP4_TRANSMIT_DATA) + (Packet-
> >BlockOpNum - 1) * sizeof (EFI_TCP4_FRAGMENT_DATA));
> - if (TxData == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - TxData->Push = TRUE;
> - TxData->Urgent = FALSE;
> - TxData->DataLength = Packet->TotalSize;
> -
> - //
> - // Build the fragment table.
> - //
> - TxData->FragmentCount = Packet->BlockOpNum;
> - NetbufBuildExt (Packet, (NET_FRAGMENT *) &TxData->FragmentTable[0],
> &TxData->FragmentCount);
> -
> - Tcp4Io->TxToken.Packet.TxData = TxData;
> -
> - //
> - // Trasnmit the packet.
> - //
> - Tcp4 = Tcp4Io->Tcp4;
> - Status = Tcp4->Transmit (Tcp4, &Tcp4Io->TxToken);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - while (!Tcp4Io->IsTxDone) {
> - Tcp4->Poll (Tcp4);
> - }
> -
> - Tcp4Io->IsTxDone = FALSE;
> -
> - Status = Tcp4Io->TxToken.CompletionToken.Status;
> -
> -ON_EXIT:
> -
> - FreePool (TxData);
> -
> - return Status;
> -}
> -
> -/**
> - Receive data from the socket.
> -
> - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyed.
> - @param[in] Packet The buffer to hold the data copy from the soket rx
> buffer.
> - @param[in] AsyncMode Is this receive asyncronous or not.
> - @param[in] Timeout The time to wait for receiving the amount of data
> the Packet
> - can hold.
> -
> - @retval EFI_SUCCESS The required amount of data is received from the
> socket.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate momery.
> - @retval EFI_TIMEOUT Failed to receive the required amount of data in
> the
> - specified time period.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoReceive (
> - IN TCP4_IO *Tcp4Io,
> - IN NET_BUF *Packet,
> - IN BOOLEAN AsyncMode,
> - IN EFI_EVENT Timeout
> - )
> -{
> - EFI_TCP4_PROTOCOL *Tcp4;
> - EFI_TCP4_RECEIVE_DATA RxData;
> - EFI_STATUS Status;
> - NET_FRAGMENT *Fragment;
> - UINT32 FragmentCount;
> - UINT32 CurrentFragment;
> -
> - FragmentCount = Packet->BlockOpNum;
> - Fragment = AllocatePool (FragmentCount * sizeof (NET_FRAGMENT));
> - if (Fragment == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> - //
> - // Build the fragment table.
> - //
> - NetbufBuildExt (Packet, Fragment, &FragmentCount);
> -
> - RxData.FragmentCount = 1;
> - Tcp4Io->RxToken.Packet.RxData = &RxData;
> - CurrentFragment = 0;
> - Tcp4 = Tcp4Io->Tcp4;
> - Status = EFI_SUCCESS;
> -
> - while (CurrentFragment < FragmentCount) {
> - RxData.DataLength = Fragment[CurrentFragment].Len;
> - RxData.FragmentTable[0].FragmentLength =
> Fragment[CurrentFragment].Len;
> - RxData.FragmentTable[0].FragmentBuffer =
> Fragment[CurrentFragment].Bulk;
> -
> - Status = Tcp4->Receive (Tcp4, &Tcp4Io->RxToken);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - while (!Tcp4Io->IsRxDone && ((Timeout == NULL) || EFI_ERROR (gBS-
> >CheckEvent (Timeout)))) {
> - //
> - // Poll until some data is received or something error happens.
> - //
> - Tcp4->Poll (Tcp4);
> - }
> -
> - if (!Tcp4Io->IsRxDone) {
> - //
> - // Timeout occurs, cancel the receive request.
> - //
> - Tcp4->Cancel (Tcp4, &Tcp4Io->RxToken.CompletionToken);
> -
> - Status = EFI_TIMEOUT;
> - goto ON_EXIT;
> - } else {
> - Tcp4Io->IsRxDone = FALSE;
> - }
> -
> - if (EFI_ERROR (Tcp4Io->RxToken.CompletionToken.Status)) {
> - Status = Tcp4Io->RxToken.CompletionToken.Status;
> - goto ON_EXIT;
> - }
> -
> - Fragment[CurrentFragment].Len -=
> RxData.FragmentTable[0].FragmentLength;
> - if (Fragment[CurrentFragment].Len == 0) {
> - CurrentFragment++;
> - } else {
> - Fragment[CurrentFragment].Bulk +=
> RxData.FragmentTable[0].FragmentLength;
> - }
> - }
> -
> -ON_EXIT:
> - Tcp4Io->RxToken.Packet.RxData = NULL;
> - FreePool (Fragment);
> -
> - return Status;
> -}
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c
> b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c
> deleted file mode 100644
> index 3555f1a2ebe3..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.c
> +++ /dev/null
> @@ -1,350 +0,0 @@
> -/** @file
> - Implementation of MD5 algorithm.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#include "Md5.h"
> -
> -CONST UINT32 Md5_Data[][2] = {
> - { 0, 1 },
> - { 1, 5 },
> - { 5, 3 },
> - { 0, 7 }
> -};
> -
> -CONST UINT32 Md5_S[][4] = {
> - { 7, 22, 17, 12 },
> - { 5, 20, 14, 9 },
> - { 4, 23, 16 ,11 },
> - { 6, 21, 15, 10 },
> -};
> -
> -CONST UINT32 Md5_T[] = {
> - 0xD76AA478, 0xE8C7B756, 0x242070DB, 0xC1BDCEEE,
> - 0xF57C0FAF, 0x4787C62A, 0xA8304613, 0xFD469501,
> - 0x698098D8, 0x8B44F7AF, 0xFFFF5BB1, 0x895CD7BE,
> - 0x6B901122, 0xFD987193, 0xA679438E, 0x49B40821,
> - 0xF61E2562, 0xC040B340, 0x265E5A51, 0xE9B6C7AA,
> - 0xD62F105D, 0x02441453, 0xD8A1E681, 0xE7D3FBC8,
> - 0x21E1CDE6, 0xC33707D6, 0xF4D50D87, 0x455A14ED,
> - 0xA9E3E905, 0xFCEFA3F8, 0x676F02D9, 0x8D2A4C8A,
> - 0xFFFA3942, 0x8771F681, 0x6D9D6122, 0xFDE5380C,
> - 0xA4BEEA44, 0x4BDECFA9, 0xF6BB4B60, 0xBEBFBC70,
> - 0x289B7EC6, 0xEAA127FA, 0xD4EF3085, 0x04881D05,
> - 0xD9D4D039, 0xE6DB99E5, 0x1FA27CF8, 0xC4AC5665,
> - 0xF4292244, 0x432AFF97, 0xAB9423A7, 0xFC93A039,
> - 0x655B59C3, 0x8F0CCC92, 0xFFEFF47D, 0x85845DD1,
> - 0x6FA87E4F, 0xFE2CE6E0, 0xA3014314, 0x4E0811A1,
> - 0xF7537E82, 0xBD3AF235, 0x2AD7D2BB, 0xEB86D391
> -};
> -
> -CONST UINT8 Md5HashPadding[] =
> -{
> - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
> - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
> -};
> -
> -//
> -// ROTATE_LEFT rotates x left n bits.
> -//
> -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
> -
> -#define SA MedStates[Index2 & 3]
> -#define SB MedStates[(Index2 + 1) & 3]
> -#define SC MedStates[(Index2 + 2) & 3]
> -#define SD MedStates[(Index2 + 3) & 3]
> -
> -/**
> - Tf1 is one basic MD5 transform function.
> -
> - @param[in] A A 32-bit quantity.
> - @param[in] B A 32-bit quantity.
> - @param[in] C A 32-bit quantity.
> -
> - @return Output was produced as a 32-bit quantity based on the
> - three 32-bit input quantity.
> -**/
> -UINT32
> -Tf1 (
> - IN UINT32 A,
> - IN UINT32 B,
> - IN UINT32 C
> - )
> -{
> - return (A & B) | (~A & C);
> -}
> -
> -/**
> - Tf2 is one basic MD5 transform function.
> -
> - @param[in] A A 32-bit quantity.
> - @param[in] B A 32-bit quantity.
> - @param[in] C A 32-bit quantity.
> -
> - @return Output was produced as a 32-bit quantity based on the
> - three 32-bit input quantity.
> -**/
> -UINT32
> -Tf2 (
> - IN UINT32 A,
> - IN UINT32 B,
> - IN UINT32 C
> - )
> -{
> - return (A & C) | (B & ~C);
> -}
> -
> -/**
> - Tf3 is one basic MD5 transform function.
> -
> - @param[in] A A 32-bit quantity.
> - @param[in] B A 32-bit quantity.
> - @param[in] C A 32-bit quantity.
> -
> - @return Output was produced as a 32-bit quantity based on the
> - three 32-bit input quantity.
> -**/
> -UINT32
> -Tf3 (
> - IN UINT32 A,
> - IN UINT32 B,
> - IN UINT32 C
> - )
> -{
> - return A ^ B ^ C;
> -}
> -
> -/**
> - Tf4 is one basic MD5 transform function.
> -
> - @param[in] A A 32-bit quantity.
> - @param[in] B A 32-bit quantity.
> - @param[in] C A 32-bit quantity.
> -
> - @return Output was produced as a 32-bit quantity based on the
> - three 32-bit input quantity.
> -**/
> -UINT32
> -Tf4 (
> - IN UINT32 A,
> - IN UINT32 B,
> - IN UINT32 C
> - )
> -{
> - return B ^ (A | ~C);
> -}
> -
> -typedef
> -UINT32
> -(*MD5_TRANSFORM_FUNC) (
> - IN UINT32 A,
> - IN UINT32 B,
> - IN UINT32 C
> - );
> -
> -CONST MD5_TRANSFORM_FUNC Md5_F[] = {
> - Tf1,
> - Tf2,
> - Tf3,
> - Tf4
> -};
> -
> -/**
> - Perform the MD5 transform on 64 bytes data segment.
> -
> - @param[in, out] Md5Ctx It includes the data segment for Md5 transform.
> -**/
> -VOID
> -MD5Transform (
> - IN OUT MD5_CTX *Md5Ctx
> - )
> -{
> - UINT32 Index1;
> - UINT32 Index2;
> - UINT32 MedStates[MD5_HASHSIZE >> 2];
> - UINT32 *Data;
> - UINT32 IndexD;
> - UINT32 IndexT;
> -
> - Data = (UINT32 *) Md5Ctx->M;
> -
> - //
> - // Copy MD5 states to MedStates
> - //
> - CopyMem (MedStates, Md5Ctx->States, MD5_HASHSIZE);
> -
> - IndexT = 0;
> - for (Index1 = 0; Index1 < 4; Index1++) {
> - IndexD = Md5_Data[Index1][0];
> - for (Index2 = 16; Index2 > 0; Index2--) {
> - SA += (*Md5_F[Index1]) (SB, SC, SD) + Data[IndexD] + Md5_T[IndexT];
> - SA = ROTATE_LEFT (SA, Md5_S[Index1][Index2 & 3]);
> - SA += SB;
> -
> - IndexD += Md5_Data[Index1][1];
> - IndexD &= 15;
> -
> - IndexT++;
> - }
> - }
> -
> - for (Index1 = 0; Index1 < 4; Index1++) {
> - Md5Ctx->States[Index1] += MedStates[Index1];
> - }
> -}
> -
> -/**
> - Copy data segment into the M field of MD5_CTX structure for later transform.
> - If the length of data segment is larger than 64 bytes, then does the transform
> - immediately and the generated Md5 code is stored in the States field of
> MD5_CTX
> - data struct for later accumulation.
> - All of Md5 code generated for the sequential 64-bytes data segaments are be
> - accumulated in MD5Final() function.
> -
> - @param[in, out] Md5Ctx The data structure of storing the original data
> - segment and the final result.
> - @param[in] Data The data wanted to be transformed.
> - @param[in] DataLen The length of data.
> -**/
> -VOID
> -MD5UpdateBlock (
> - IN OUT MD5_CTX *Md5Ctx,
> - IN CONST UINT8 *Data,
> - IN UINTN DataLen
> - )
> -{
> - UINTN Limit;
> -
> - for (Limit = 64 - Md5Ctx->Count; DataLen >= 64 - Md5Ctx->Count; Limit = 64) {
> - CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, Limit);
> - MD5Transform (Md5Ctx);
> -
> - Md5Ctx->Count = 0;
> - Data += Limit;
> - DataLen -= Limit;
> - }
> -
> - CopyMem (Md5Ctx->M + Md5Ctx->Count, (VOID *)Data, DataLen);
> - Md5Ctx->Count += DataLen;
> -}
> -
> -/**
> - Initialize four 32-bits chaining variables and use them to do the Md5 transform.
> -
> - @param[out] Md5Ctx The data structure of Md5.
> -
> - @retval EFI_SUCCESS Initialization is ok.
> -**/
> -EFI_STATUS
> -MD5Init (
> - OUT MD5_CTX *Md5Ctx
> - )
> -{
> - ZeroMem (Md5Ctx, sizeof (*Md5Ctx));
> -
> - //
> - // Set magic initialization constants.
> - //
> - Md5Ctx->States[0] = 0x67452301;
> - Md5Ctx->States[1] = 0xefcdab89;
> - Md5Ctx->States[2] = 0x98badcfe;
> - Md5Ctx->States[3] = 0x10325476;
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - the external interface of Md5 algorithm
> -
> - @param[in, out] Md5Ctx The data structure of storing the original data
> - segment and the final result.
> - @param[in] Data The data wanted to be transformed.
> - @param[in] DataLen The length of data.
> -
> - @retval EFI_SUCCESS The transform is ok.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -MD5Update (
> - IN OUT MD5_CTX *Md5Ctx,
> - IN VOID *Data,
> - IN UINTN DataLen
> - )
> -{
> - if (EFI_ERROR (Md5Ctx->Status)) {
> - return Md5Ctx->Status;
> - }
> -
> - MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) Data, DataLen);
> - Md5Ctx->Length += DataLen;
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Accumulate the MD5 value of every data segment and generate the finial
> - result according to MD5 algorithm.
> -
> - @param[in, out] Md5Ctx The data structure of storing the original data
> - segment and the final result.
> - @param[out] HashVal The final 128-bits output.
> -
> - @retval EFI_SUCCESS The transform is ok.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -MD5Final (
> - IN OUT MD5_CTX *Md5Ctx,
> - OUT UINT8 *HashVal
> - )
> -{
> - UINTN PadLength;
> -
> - if (Md5Ctx->Status == EFI_ALREADY_STARTED) {
> - //
> - // Store Hashed value & Zeroize sensitive context information.
> - //
> - CopyMem (HashVal, (UINT8 *) Md5Ctx->States, MD5_HASHSIZE);
> - ZeroMem ((UINT8 *)Md5Ctx, sizeof (*Md5Ctx));
> -
> - return EFI_SUCCESS;
> - }
> -
> - if (EFI_ERROR (Md5Ctx->Status)) {
> - return Md5Ctx->Status;
> - }
> -
> - PadLength = Md5Ctx->Count >= 56 ? 120 : 56;
> - PadLength -= Md5Ctx->Count;
> - MD5UpdateBlock (Md5Ctx, Md5HashPadding, PadLength);
> - Md5Ctx->Length = LShiftU64 (Md5Ctx->Length, 3);
> - MD5UpdateBlock (Md5Ctx, (CONST UINT8 *) &Md5Ctx->Length, 8);
> -
> - ZeroMem (Md5Ctx->M, sizeof (Md5Ctx->M));
> - Md5Ctx->Length = 0;
> - Md5Ctx->Status = EFI_ALREADY_STARTED;
> - return MD5Final (Md5Ctx, HashVal);
> -}
> -
> diff --git a/MdeModulePkg/MdeModulePkg.dsc
> b/MdeModulePkg/MdeModulePkg.dsc
> index 3529c8d30365..b787fb5692d3 100644
> --- a/MdeModulePkg/MdeModulePkg.dsc
> +++ b/MdeModulePkg/MdeModulePkg.dsc
> @@ -354,7 +354,6 @@ [Components]
> MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf
> MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf
> MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf
> - MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
> MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf
> MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDxe.inf
> MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h
> deleted file mode 100644
> index ee371d26744c..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/ComponentName.h
> +++ /dev/null
> @@ -1,165 +0,0 @@
> -/** @file
> - The header file of UEFI Component Name(2) protocol.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _COMPONENT_NAME_H_
> -#define _COMPONENT_NAME_H_
> -
> -#include <Protocol/ComponentName.h>
> -#include <Protocol/ComponentName2.h>
> -
> -extern EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2;
> -extern EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName;
> -
> -//
> -// EFI Component Name Protocol for iSCSI driver.
> -//
> -
> -/**
> - Retrieves a Unicode string that is the user readable name of the EFI 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_NAME_PROTOCOL
> instance.
> - @param[in] Language A pointer to a three characters ISO 639-2 language
> identifier.
> - This is the language of the driver name that 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.
> - @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
> -IScsiComponentNameGetDriverName (
> - 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 an EFI Driver. Currently not implemented.
> -
> - @param[in] This A pointer to the 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 three characters ISO 639-2 language
> - identifier. This is the language of the controller name
> - that 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.
> - @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
> -IScsiComponentNameGetControllerName (
> - IN EFI_COMPONENT_NAME_PROTOCOL *This,
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_HANDLE ChildHandle OPTIONAL,
> - IN CHAR8 *Language,
> - OUT CHAR16 **ControllerName
> - );
> -
> -//
> -// EFI iSCSI Initiator Name Protocol for IScsi driver.
> -//
> -
> -/**
> - Retrieves the current set value of iSCSI Initiator Name.
> -
> - @param[in] This Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer /
> Actual size of the
> - variable data buffer.
> - @param[out] Buffer Pointer to the buffer for data to be read.
> -
> - @retval EFI_SUCCESS Data was successfully retrieved into the provided
> buffer and the
> - BufferSize was sufficient to handle the iSCSI initiator name
> - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result.
> - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
> - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be retrieved
> due to a hardware error.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiGetInitiatorName (
> - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
> - IN OUT UINTN *BufferSize,
> - OUT VOID *Buffer
> - );
> -
> -/**
> - Sets the iSCSI Initiator Name.
> -
> - @param[in] This Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer.
> - @param[in] Buffer Pointer to the buffer for data to be written.
> -
> - @retval EFI_SUCCESS Data was successfully stored by the protocol.
> - @retval EFI_UNSUPPORTED Platform policies do not allow for data to be
> written.
> - Currently not implemented.
> - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize
> exceeds the maximum allowed limit.
> - @retval EFI_DEVICE_ERROR The data could not be stored due to a
> hardware error.
> - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold
> the data.
> - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not adhere
> to RFC 3720
> - (and other related protocols)
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiSetInitiatorName (
> - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
> - IN OUT UINTN *BufferSize,
> - IN VOID *Buffer
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni
> deleted file mode 100644
> index d3c020e45d3b..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4Dxe.uni
> +++ /dev/null
> @@ -1,25 +0,0 @@
> -// /** @file
> -// This module produces EFI iSCSI Initiator Name Protocol.
> -//
> -// This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4
> Protocol
> -// and EFI DHCPv4 Protocol, to provide the capability to do the transport for
> SCSI
> -// data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide
> -// one way to configurate the iSCSI setting.
> -//
> -// Copyright (c) 2004 - 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 iSCSI
> Initiator Name Protocol"
> -
> -#string STR_MODULE_DESCRIPTION #language en-US "This module
> produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4 Protocol and EFI
> DHCPv4 Protocol, to provide the capability to do the transport for SCSI data
> over TCP/IP. It installs EFI HII Configuration Access Protocol to provide a way to
> configure the iSCSI setting."
> -
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni
> deleted file mode 100644
> index 5ec75820a605..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsi4DxeExtra.uni
> +++ /dev/null
> @@ -1,20 +0,0 @@
> -// /** @file
> -// IScsi4Dxe 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
> -"iSCSI DXE Driver"
> -
> -
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h
> deleted file mode 100644
> index 14a5658f754b..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCHAP.h
> +++ /dev/null
> @@ -1,106 +0,0 @@
> -/** @file
> - The header file of CHAP configuration.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _ISCSI_CHAP_H_
> -#define _ISCSI_CHAP_H_
> -
> -#define ISCSI_AUTH_METHOD_CHAP "CHAP"
> -
> -#define ISCSI_KEY_CHAP_ALGORITHM "CHAP_A"
> -#define ISCSI_KEY_CHAP_IDENTIFIER "CHAP_I"
> -#define ISCSI_KEY_CHAP_CHALLENGE "CHAP_C"
> -#define ISCSI_KEY_CHAP_NAME "CHAP_N"
> -#define ISCSI_KEY_CHAP_RESPONSE "CHAP_R"
> -
> -#define ISCSI_CHAP_ALGORITHM_MD5 5
> -
> -#define ISCSI_CHAP_AUTH_MAX_LEN 1024
> -///
> -/// MD5_HASHSIZE
> -///
> -#define ISCSI_CHAP_RSP_LEN 16
> -
> -#define ISCSI_CHAP_INITIAL 0
> -#define ISCSI_CHAP_STEP_ONE 1
> -#define ISCSI_CHAP_STEP_TWO 2
> -#define ISCSI_CHAP_STEP_THREE 3
> -#define ISCSI_CHAP_STEP_FOUR 4
> -
> -#pragma pack(1)
> -
> -typedef struct _ISCSI_CHAP_AUTH_CONFIG_NVDATA {
> - UINT8 CHAPType;
> - CHAR8 CHAPName[ISCSI_CHAP_NAME_STORAGE];
> - CHAR8 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
> - CHAR8 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
> - CHAR8 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
> -} ISCSI_CHAP_AUTH_CONFIG_NVDATA;
> -
> -#pragma pack()
> -
> -///
> -/// ISCSI CHAP Authentication Data
> -///
> -typedef struct _ISCSI_CHAP_AUTH_DATA {
> - ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfig;
> - UINT32 InIdentifier;
> - UINT8 InChallenge[ISCSI_CHAP_AUTH_MAX_LEN];
> - UINT32 InChallengeLength;
> - //
> - // Calculated CHAP Response (CHAP_R) value
> - //
> - UINT8 CHAPResponse[ISCSI_CHAP_RSP_LEN];
> -
> - //
> - // Auth-data to be sent out for mutual authentication
> - //
> - UINT32 OutIdentifier;
> - UINT8 OutChallenge[ISCSI_CHAP_AUTH_MAX_LEN];
> - UINT32 OutChallengeLength;
> -} ISCSI_CHAP_AUTH_DATA;
> -
> -/**
> - This function checks the received iSCSI Login Response during the security
> - negotiation stage.
> -
> - @param[in] Conn The iSCSI connection.
> -
> - @retval EFI_SUCCESS The Login Response passed the CHAP validation.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiCHAPOnRspReceived (
> - IN ISCSI_CONNECTION *Conn
> - );
> -/**
> - This function fills the CHAP authentication information into the login PDU
> - during the security negotiation stage in the iSCSI connection login.
> -
> - @param[in] Conn The iSCSI connection.
> - @param[in, out] Pdu The PDU to send out.
> -
> - @retval EFI_SUCCESS All check passed and the phase-related CHAP
> - authentication info is filled into the iSCSI PDU.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_PROTOCOL_ERROR Some kind of protocol error happend.
> -**/
> -EFI_STATUS
> -IScsiCHAPToSendReq (
> - IN ISCSI_CONNECTION *Conn,
> - IN OUT NET_BUF *Pdu
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h
> deleted file mode 100644
> index 650c68d53bab..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiCommon.h
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -/** @file
> - The common header file of Iscsi.
> -
> -Copyright (c) 2004 - 2008, 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.
> -
> -**/
> -
> -#ifndef _ISCSI_COMMON_H_
> -#define _ISCSI_COMMON_H_
> -
> -typedef struct _ISCSI_SESSION ISCSI_SESSION;
> -typedef struct _ISCSI_CONNECTION ISCSI_CONNECTION;
> -typedef struct _ISCSI_DRIVER_DATA ISCSI_DRIVER_DATA;
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h
> deleted file mode 100644
> index c3d07f6f4859..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfig.h
> +++ /dev/null
> @@ -1,166 +0,0 @@
> -/** @file
> - The header file of IScsiConfig.c.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _ISCSI_CONFIG_H_
> -#define _ISCSI_CONFIG_H_
> -
> -#include <Guid/MdeModuleHii.h>
> -#include <Protocol/HiiConfigRouting.h>
> -#include <Library/HiiLib.h>
> -#include <Library/DevicePathLib.h>
> -#include <Library/DebugLib.h>
> -#include <Library/BaseLib.h>
> -#include <Library/NetLib.h>
> -
> -extern UINT8 IScsiConfigDxeBin[];
> -extern UINT8 IScsi4DxeStrings[];
> -
> -#define ISCSI_INITATOR_NAME_VAR_NAME L"I_NAME"
> -
> -#define ISCSI_CONFIG_VAR_ATTR
> (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE)
> -
> -#define ISCSI_FORM_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('I', 'f', 'c',
> 'i')
> -
> -
> -
> -/**
> - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of
> PcdDebugProperyMask is clear,
> - then this macro return a pointer to a data structure
> ISCSI_FORM_CALLBACK_INFO.
> -
> - If the DEBUG_PROPERTY_DEBUG_ASSERT_ENABLED bit of
> PcdDebugProperyMask is set,
> - The Signature field of the data structure ISCSI_FORM_CALLBACK_INFO
> - is compared to TestSignature. If the signatures match, then a pointer
> - to the pointer to a data structure ISCSI_FORM_CALLBACK_INFO is returned.
> - If the signatures do not match, then DebugAssert() is called with a description
> - of "CR has a bad signature" and Callback is returned.
> -
> - If the data type ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not contain
> the field
> - specified by Callback, then the module will not compile.
> -
> - If ISCSI_FORM_CALLBACK_INFO_SIGNATURE does not contain a field called
> Signature,
> - then the module will not compile.
> -
> - @param Callback Pointer to the specified field within the data
> - structure ISCSI_FORM_CALLBACK_INFO.
> - @return A pointer to the pointer to a data structure
> ISCSI_FORM_CALLBACK_INFO.
> - @retval Others Some unexpected error happened.
> -**/
> -
> -#define ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK(Callback) \
> - CR ( \
> - Callback, \
> - ISCSI_FORM_CALLBACK_INFO, \
> - ConfigAccess, \
> - ISCSI_FORM_CALLBACK_INFO_SIGNATURE \
> - )
> -
> -#pragma pack(1)
> -
> -typedef struct _ISCSI_MAC_INFO {
> - EFI_MAC_ADDRESS Mac;
> - UINT8 Len;
> - UINT16 VlanId;
> -} ISCSI_MAC_INFO;
> -
> -typedef struct _ISCSI_DEVICE_LIST {
> - UINT8 NumDevice;
> - ISCSI_MAC_INFO MacInfo[1];
> -} ISCSI_DEVICE_LIST;
> -
> -#pragma pack()
> -
> -typedef struct _ISCSI_CONFIG_FORM_ENTRY {
> - LIST_ENTRY Link;
> - EFI_HANDLE Controller;
> - CHAR16 MacString[95];
> - EFI_STRING_ID PortTitleToken;
> - EFI_STRING_ID PortTitleHelpToken;
> -
> - ISCSI_SESSION_CONFIG_NVDATA SessionConfigData;
> - ISCSI_CHAP_AUTH_CONFIG_NVDATA AuthConfigData;
> -} ISCSI_CONFIG_FORM_ENTRY;
> -
> -typedef struct _ISCSI_FORM_CALLBACK_INFO {
> - UINTN Signature;
> - EFI_HANDLE DriverHandle;
> - EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
> - EFI_HII_DATABASE_PROTOCOL *HiiDatabase;
> - EFI_HII_CONFIG_ROUTING_PROTOCOL *ConfigRouting;
> - UINT16 *KeyList;
> - VOID *FormBuffer;
> - EFI_HII_HANDLE RegisteredHandle;
> - ISCSI_CONFIG_FORM_ENTRY *Current;
> -} ISCSI_FORM_CALLBACK_INFO;
> -
> -#pragma pack(1)
> -
> -///
> -/// HII specific Vendor Device Path definition.
> -///
> -typedef struct {
> - VENDOR_DEVICE_PATH VendorDevicePath;
> - EFI_DEVICE_PATH_PROTOCOL End;
> -} HII_VENDOR_DEVICE_PATH;
> -
> -#pragma pack()
> -
> -/**
> - Updates the iSCSI configuration form to add/delete an entry for the iSCSI
> - device specified by the Controller.
> -
> - @param[in] DriverBindingHandle The driverbinding handle.
> - @param[in] Controller The controller handle of the iSCSI device.
> - @param[in] AddForm Whether to add or delete a form entry.
> -
> - @retval EFI_SUCCESS The iSCSI configuration form is updated.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConfigUpdateForm (
> - IN EFI_HANDLE DriverBindingHandle,
> - IN EFI_HANDLE Controller,
> - IN BOOLEAN AddForm
> - );
> -
> -/**
> - Initialize the iSCSI configuration form.
> -
> - @param[in] DriverBindingHandle The iSCSI driverbinding handle.
> -
> - @retval EFI_SUCCESS The iSCSI configuration form is initialized.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConfigFormInit (
> - VOID
> - );
> -
> -/**
> - Unload the iSCSI configuration form, this includes: delete all the iSCSI
> - device configuration entries, uninstall the form callback protocol and
> - free the resources used.
> -
> - @param[in] DriverBindingHandle The iSCSI driverbinding handle.
> -
> - @retval EFI_SUCCESS The iSCSI configuration form is unloaded.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -**/
> -EFI_STATUS
> -IScsiConfigFormUnload (
> - IN EFI_HANDLE DriverBindingHandle
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr
> deleted file mode 100644
> index 9e28d81fb40d..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxe.vfr
> +++ /dev/null
> @@ -1,219 +0,0 @@
> -/** @file
> - Vfr file for iSCSI config.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -
> -#include "IScsiConfigNVDataStruc.h"
> -#define EFI_NETWORK_DEVICE_CLASS 0x04
> -
> -formset
> - guid = IP4_ISCSI_CONFIG_GUID,
> - title = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_TITLE),
> - help = STRING_TOKEN(STR_ISCSI_CONFIG_FORM_HELP),
> -
> - varstore ISCSI_CONFIG_IFR_NVDATA,
> - name = ISCSI_CONFIG_IFR_NVDATA,
> - guid = IP4_ISCSI_CONFIG_GUID;
> - form formid = FORMID_MAIN_FORM,
> - title = STRING_TOKEN(STR_ISCSI_MAIN_FORM_TITLE);
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorName,
> - prompt = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME),
> - help = STRING_TOKEN(STR_ISCSI_CONFIG_INIT_NAME_HELP),
> - flags = INTERACTIVE,
> - key = KEY_INITIATOR_NAME,
> - minsize = ISCSI_NAME_IFR_MIN_SIZE,
> - maxsize = ISCSI_NAME_IFR_MAX_SIZE,
> - endstring;
> -
> - label DEVICE_ENTRY_LABEL;
> - label LABEL_END;
> -
> - endform;
> -
> - form formid = FORMID_DEVICE_FORM,
> - title = STRING_TOKEN(STR_ISCSI_DEVICE_FORM_TITLE);
> -
> - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.Enabled,
> - prompt = STRING_TOKEN(STR_ISCSI_DEVICE_ENABLE),
> - help = STRING_TOKEN(STR_NULL),
> - flags = 0,
> - endcheckbox;
> -
> - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp,
> - prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP),
> - help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP),
> - flags = INTERACTIVE,
> - key = KEY_DHCP_ENABLE,
> - endcheckbox;
> -
> - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp ==
> 0x01;
> - string varid = ISCSI_CONFIG_IFR_NVDATA.LocalIp,
> - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_IP_ADDRESS),
> - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
> - flags = INTERACTIVE,
> - key = KEY_LOCAL_IP,
> - minsize = IP_MIN_SIZE,
> - maxsize = IP_MAX_SIZE,
> - endstring;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.SubnetMask,
> - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_MASK),
> - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
> - flags = INTERACTIVE,
> - key = KEY_SUBNET_MASK,
> - minsize = IP_MIN_SIZE,
> - maxsize = IP_MAX_SIZE,
> - endstring;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.Gateway,
> - prompt = STRING_TOKEN(STR_ISCSI_LOCAL_GATEWAY),
> - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
> - flags = INTERACTIVE,
> - key = KEY_GATE_WAY,
> - minsize = IP_MIN_SIZE,
> - maxsize = IP_MAX_SIZE,
> - endstring;
> - endif;
> -
> - subtitle text = STRING_TOKEN(STR_NULL);
> -
> - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.InitiatorInfoFromDhcp ==
> 0x00;
> - checkbox varid = ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp,
> - prompt = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET),
> - help = STRING_TOKEN(STR_ISCSI_ENABLE_DHCP_ON_TARGET),
> - flags = 0,
> - endcheckbox;
> - endif;
> -
> - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.TargetInfoFromDhcp == 0x01;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.TargetName,
> - prompt = STRING_TOKEN(STR_ISCSI_TARGET_NAME),
> - help = STRING_TOKEN(STR_ISCSI_TARGET_NAME),
> - flags = INTERACTIVE,
> - key = KEY_TARGET_NAME,
> - minsize = ISCSI_NAME_IFR_MIN_SIZE,
> - maxsize = ISCSI_NAME_IFR_MAX_SIZE,
> - endstring;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.TargetIp,
> - prompt = STRING_TOKEN(STR_ISCSI_TARGET_IP_ADDRESS),
> - help = STRING_TOKEN(STR_ISCSI_IP_ADDRESS_HELP),
> - flags = INTERACTIVE,
> - key = KEY_TARGET_IP,
> - minsize = IP_MIN_SIZE,
> - maxsize = IP_MAX_SIZE,
> - endstring;
> -
> - numeric varid = ISCSI_CONFIG_IFR_NVDATA.TargetPort,
> - prompt = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
> - help = STRING_TOKEN(STR_ISCSI_TARGET_PORT),
> - flags = 0,
> - minimum = TARGET_PORT_MIN_NUM,
> - maximum = TARGET_PORT_MAX_NUM,
> - step = 0,
> - endnumeric;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.BootLun,
> - prompt = STRING_TOKEN(STR_ISCSI_BOOT_LUN),
> - help = STRING_TOKEN(STR_ISCSI_BOOT_LUN_HELP),
> - flags = INTERACTIVE,
> - key = KEY_BOOT_LUN,
> - minsize = LUN_MIN_SIZE,
> - maxsize = LUN_MAX_SIZE,
> - endstring;
> - endif;
> -
> - subtitle text = STRING_TOKEN(STR_NULL);
> -
> - oneof varid = ISCSI_CONFIG_IFR_NVDATA.CHAPType,
> - prompt = STRING_TOKEN(STR_CHAP_TYPE_PROMPT),
> - help = STRING_TOKEN(STR_CHAP_TYPE_HELP),
> - option text = STRING_TOKEN(STR_CHAP_TYPE_NONE), value =
> ISCSI_CHAP_NONE, flags = DEFAULT;
> - option text = STRING_TOKEN(STR_CHAP_TYPE_UNI), value =
> ISCSI_CHAP_UNI, flags = 0;
> - option text = STRING_TOKEN(STR_CHAP_TYPE_MUTUAL), value =
> ISCSI_CHAP_MUTUAL, flags = 0;
> - endoneof;
> -
> - suppressif ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType ==
> ISCSI_CHAP_NONE;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPName,
> - prompt = STRING_TOKEN(STR_ISCSI_CHAP_NAME),
> - help = STRING_TOKEN(STR_ISCSI_CHAP_NAME),
> - flags = INTERACTIVE,
> - key = KEY_CHAP_NAME,
> - minsize = 0,
> - maxsize = ISCSI_CHAP_NAME_MAX_LEN,
> - endstring;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.CHAPSecret,
> - prompt = STRING_TOKEN(STR_ISCSI_CHAP_SECRET),
> - help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP),
> - flags = INTERACTIVE,
> - key = KEY_CHAP_SECRET,
> - minsize = ISCSI_CHAP_SECRET_MIN_LEN,
> - maxsize = ISCSI_CHAP_SECRET_MAX_LEN,
> - endstring;
> -
> - endif;
> -
> - suppressif NOT ideqval ISCSI_CONFIG_IFR_NVDATA.CHAPType ==
> ISCSI_CHAP_MUTUAL;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPName,
> - prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME),
> - help = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_NAME),
> - flags = INTERACTIVE,
> - key = KEY_REVERSE_CHAP_NAME,
> - minsize = 0,
> - maxsize = ISCSI_CHAP_NAME_MAX_LEN,
> - endstring;
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.ReverseCHAPSecret,
> - prompt = STRING_TOKEN(STR_ISCSI_REVERSE_CHAP_SECRET),
> - help = STRING_TOKEN(STR_ISCSI_CHAP_SECRET_HELP),
> - flags = INTERACTIVE,
> - key = KEY_REVERSE_CHAP_SECRET,
> - minsize = ISCSI_CHAP_SECRET_MIN_LEN,
> - maxsize = ISCSI_CHAP_SECRET_MAX_LEN,
> - endstring;
> -
> - endif;
> -
> - subtitle text = STRING_TOKEN(STR_NULL);
> -
> - string varid = ISCSI_CONFIG_IFR_NVDATA.IsId,
> - prompt = STRING_TOKEN(STR_ISCSI_CONFIG_ISID),
> - help = STRING_TOKEN(STR_ISCSI_CONFIG_ISID_HELP),
> - flags = INTERACTIVE,
> - key = KEY_CONFIG_ISID,
> - minsize = ISID_CONFIGURABLE_MIN_LEN,
> - maxsize = ISID_CONFIGURABLE_MAX_LEN,
> - endstring;
> -
> - subtitle text = STRING_TOKEN(STR_NULL);
> -
> - text
> - help = STRING_TOKEN (STR_SAVE_CHANGES),
> - text = STRING_TOKEN (STR_SAVE_CHANGES),
> - flags = INTERACTIVE,
> - key = KEY_SAVE_CHANGES;
> -
> - goto FORMID_MAIN_FORM,
> - prompt = STRING_TOKEN (STR_RETURN_MAIN_FORM),
> - help = STRING_TOKEN (STR_RETURN_MAIN_FORM),
> - flags = 0;
> -
> - endform;
> -
> -endformset;
> -
> diff --git
> a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni
> deleted file mode 100644
> index 729c74ebfc1b..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigDxeStrings.uni
> +++ /dev/null
> @@ -1,62 +0,0 @@
> -// *++
> -//
> -// Copyright (c) 2004 - 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.
> -//
> -// Module Name:
> -//
> -// IScsiConfigStrings.uni
> -//
> -// Abstract:
> -//
> -// String definitions for iSCSI configuration.
> -//
> -// Revision History:
> -//
> -// --*/
> -
> -
> -/=#
> -
> -#langdef en-US "English"
> -
> -#string STR_ISCSI_CONFIG_FORM_TITLE #language en-US "iSCSI
> Configuration"
> -#string STR_ISCSI_CONFIG_FORM_HELP #language en-US "Configure the
> iSCSI parameters."
> -#string STR_ISCSI_MAIN_FORM_TITLE #language en-US "iSCSI
> Configuration"
> -#string STR_ISCSI_CONFIG_INIT_NAME #language en-US "iSCSI Initiator
> Name"
> -#string STR_ISCSI_CONFIG_INIT_NAME_HELP #language en-US "The worldwide
> unique name of the initiator. Only iqn. format is accepted."
> -#string STR_ISCSI_DEVICE_FORM_TITLE #language en-US ""
> -#string STR_ISCSI_DEVICE_ENABLE #language en-US "Enable iSCSI"
> -#string STR_ISCSI_LOCAL_IP_ADDRESS #language en-US " Initiator IP
> Address"
> -#string STR_ISCSI_LOCAL_MASK #language en-US " Initiator Subnet
> Mask"
> -#string STR_ISCSI_LOCAL_GATEWAY #language en-US " Gateway"
> -#string STR_ISCSI_IP_ADDRESS_HELP #language en-US "Enter IP address in
> dotted-decimal notation."
> -#string STR_ISCSI_TARGET_NAME #language en-US " Target Name"
> -#string STR_ISCSI_TARGET_IP_ADDRESS #language en-US " Target IP
> Address"
> -#string STR_ISCSI_TARGET_PORT #language en-US " Target Port"
> -#string STR_ISCSI_BOOT_LUN #language en-US " Boot LUN"
> -#string STR_ISCSI_BOOT_LUN_HELP #language en-US "Hexadecimal
> representation of the LU number. Examples are: 4752-3A4F-6b7e-2F99, 6734-9-
> 156f-127, 4186-9"
> -#string STR_ISCSI_ENABLE_DHCP #language en-US "Enable DHCP"
> -#string STR_ISCSI_ENABLE_DHCP_ON_TARGET #language en-US "Get target
> info via DHCP"
> -#string STR_CHAP_TYPE_PROMPT #language en-US "CHAP Type"
> -#string STR_CHAP_TYPE_HELP #language en-US "None, One way CHAP
> or mutual CHAP"
> -#string STR_CHAP_TYPE_NONE #language en-US "None"
> -#string STR_CHAP_TYPE_UNI #language en-US "One way"
> -#string STR_CHAP_TYPE_MUTUAL #language en-US "Mutual"
> -#string STR_ISCSI_CHAP_NAME #language en-US " CHAP Name"
> -#string STR_ISCSI_CHAP_SECRET #language en-US " CHAP Secret"
> -#string STR_ISCSI_CHAP_SECRET_HELP #language en-US "The minimum
> length is 12 bytes and the maximum length is 16 bytes."
> -#string STR_ISCSI_REVERSE_CHAP_NAME #language en-US " Reverse CHAP
> Name"
> -#string STR_ISCSI_REVERSE_CHAP_SECRET #language en-US " Reverse CHAP
> Secret"
> -#string STR_ISCSI_CONFIG_ISID #language en-US "ISID"
> -#string STR_ISCSI_CONFIG_ISID_HELP #language en-US "OUI-format ISID in
> 6 bytes, default value are derived from MAC address. Only last 3 bytes are
> configurable. Example: update 0ABBCCDDEEFF to 0ABBCCF07901 by input
> F07901."
> -#string STR_RETURN_MAIN_FORM #language en-US "Back to Previous
> Page"
> -#string STR_SAVE_CHANGES #language en-US "Save Changes"
> -#string STR_NULL #language en-US ""
> -
> diff --git
> a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h
> deleted file mode 100644
> index 7c2e4e65fa8e..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiConfigNVDataStruc.h
> +++ /dev/null
> @@ -1,109 +0,0 @@
> -/** @file
> - Define NVData structures used by the iSCSI configuration component
> -
> -Copyright (c) 2004 - 2011, 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.
> -
> -**/
> -
> -#ifndef _ISCSI_NVDATASTRUC_H_
> -#define _ISCSI_NVDATASTRUC_H_
> -
> -#include <Guid/Ip4IScsiConfigHii.h>
> -
> -#define VAR_EQ_TEST_NAME 0x100
> -
> -#define FORMID_MAIN_FORM 1
> -#define FORMID_DEVICE_FORM 2
> -
> -#define ISCSI_NAME_MAX_SIZE 224
> -
> -//
> -// Vfr has a limit on the size, it's 255 bytes.
> -//
> -#define ISCSI_NAME_IFR_MIN_SIZE 4
> -#define ISCSI_NAME_IFR_MAX_SIZE 223
> -
> -#define IP_MIN_SIZE 7
> -#define IP_MAX_SIZE 15
> -#define IP4_STR_MAX_SIZE 16
> -
> -#define LUN_MIN_SIZE 1
> -#define LUN_MAX_SIZE 20
> -
> -#define ISCSI_CHAP_NONE 0
> -#define ISCSI_CHAP_UNI 1
> -#define ISCSI_CHAP_MUTUAL 2
> -
> -#define TARGET_PORT_MIN_NUM 0
> -#define TARGET_PORT_MAX_NUM 65535
> -
> -#define DEVICE_ENTRY_LABEL 0x1234
> -#define LABEL_END 0xffff
> -
> -#define KEY_INITIATOR_NAME 0x101
> -#define KEY_DHCP_ENABLE 0x102
> -#define KEY_LOCAL_IP 0x103
> -#define KEY_SUBNET_MASK 0x104
> -#define KEY_GATE_WAY 0x105
> -#define KEY_TARGET_IP 0x106
> -#define KEY_CHAP_NAME 0x107
> -#define KEY_CHAP_SECRET 0x108
> -#define KEY_REVERSE_CHAP_NAME 0x109
> -#define KEY_REVERSE_CHAP_SECRET 0x10a
> -#define KEY_SAVE_CHANGES 0x10b
> -#define KEY_TARGET_NAME 0x10c
> -#define KEY_BOOT_LUN 0x10d
> -#define KEY_CONFIG_ISID 0x10e
> -
> -#define KEY_DEVICE_ENTRY_BASE 0x1000
> -
> -#define ISCSI_LUN_STR_MAX_LEN 21
> -#define ISCSI_CHAP_SECRET_MIN_LEN 12
> -#define ISCSI_CHAP_SECRET_MAX_LEN 16
> -//
> -// ISCSI_CHAP_SECRET_STORAGE = ISCSI_CHAP_SECRET_MAX_LEN + sizeof
> (NULL-Terminator)
> -//
> -#define ISCSI_CHAP_SECRET_STORAGE 17
> -
> -#define ISCSI_CHAP_NAME_MAX_LEN 126
> -#define ISCSI_CHAP_NAME_STORAGE 127
> -
> -#define ISID_CONFIGURABLE_MIN_LEN 6
> -#define ISID_CONFIGURABLE_MAX_LEN 12
> -#define ISID_CONFIGURABLE_STORAGE 13
> -
> -#pragma pack(1)
> -typedef struct {
> - CHAR16 InitiatorName[ISCSI_NAME_MAX_SIZE];
> -
> - UINT8 Enabled;
> -
> - UINT8 InitiatorInfoFromDhcp;
> - CHAR16 LocalIp[IP4_STR_MAX_SIZE];
> - CHAR16 SubnetMask[IP4_STR_MAX_SIZE];
> - CHAR16 Gateway[IP4_STR_MAX_SIZE];
> -
> - CHAR16 TargetName[ISCSI_NAME_MAX_SIZE];
> - CHAR16 TargetIp[IP4_STR_MAX_SIZE];
> - UINT16 TargetPort;
> - CHAR16 BootLun[ISCSI_LUN_STR_MAX_LEN];
> - UINT8 TargetInfoFromDhcp;
> -
> - UINT8 CHAPType;
> - CHAR16 CHAPName[ISCSI_CHAP_NAME_STORAGE];
> - CHAR16 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
> - CHAR16 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
> - CHAR16 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
> -
> - CHAR16 IsId[ISID_CONFIGURABLE_STORAGE];
> -} ISCSI_CONFIG_IFR_NVDATA;
> -#pragma pack()
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h
> deleted file mode 100644
> index 4c4dcaa8f68d..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDhcp.h
> +++ /dev/null
> @@ -1,55 +0,0 @@
> -/** @file
> - The header file of IScsiDhcp.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _ISCSI_DHCP_H_
> -#define _ISCSI_DHCP_H_
> -
> -#include <Protocol/Dhcp4.h>
> -
> -#define ISCSI_ROOT_PATH_ID "iscsi:"
> -#define ISCSI_ROOT_PATH_FIELD_DELIMITER ':'
> -
> -#define RP_FIELD_IDX_SERVERNAME 0
> -#define RP_FIELD_IDX_PROTOCOL 1
> -#define RP_FIELD_IDX_PORT 2
> -#define RP_FIELD_IDX_LUN 3
> -#define RP_FIELD_IDX_TARGETNAME 4
> -#define RP_FIELD_IDX_MAX 5
> -
> -typedef struct _ISCSI_ROOT_PATH_FIELD {
> - CHAR8 *Str;
> - UINT8 Len;
> -} ISCSI_ROOT_PATH_FIELD;
> -
> -/**
> - Parse the DHCP ACK to get the address configuration and DNS information.
> -
> - @param[in] Image The handle of the driver image.
> - @param[in] Controller The handle of the controller;
> - @param[in, out] ConfigData The session configuration data.
> -
> - @retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NO_MEDIA There was a media error.
> - @retval Others Other errors as indicated.
> -
> -**/
> -EFI_STATUS
> -IScsiDoDhcp (
> - IN EFI_HANDLE Image,
> - IN EFI_HANDLE Controller,
> - IN OUT ISCSI_SESSION_CONFIG_DATA *ConfigData
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h
> deleted file mode 100644
> index d6a619f00fc0..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDriver.h
> +++ /dev/null
> @@ -1,140 +0,0 @@
> -/** @file
> - The header file of IScsiDriver.c.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _ISCSI_DRIVER_H_
> -#define _ISCSI_DRIVER_H_
> -
> -#include <Uefi.h>
> -#include <Protocol/DevicePath.h>
> -#include <Protocol/LoadedImage.h>
> -#include <Protocol/HiiConfigAccess.h>
> -#include <Protocol/HiiDatabase.h>
> -#include <Library/UefiDriverEntryPoint.h>
> -#include <Library/UefiBootServicesTableLib.h>
> -#include <Library/UefiLib.h>
> -#include <Library/DevicePathLib.h>
> -#include <Protocol/DriverBinding.h>
> -#include <Protocol/ScsiPassThruExt.h>
> -
> -#define ISCSI_INITIATOR_NAME_VAR_NAME L"I_NAME"
> -
> -typedef struct _ISCSI_PRIVATE_PROTOCOL {
> - UINT32 Reserved;
> -} ISCSI_PRIVATE_PROTOCOL;
> -
> -//
> -// EFI Driver Binding Protocol for iSCSI driver.
> -//
> -
> -/**
> - 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[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL
> instance.
> - @param[in] 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[in] 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 acces.
> - Currently not implemented.
> - @retval EFI_UNSUPPORTED The device specified by ControllerHandle and
> - RemainingDevicePath is not supported by the driver
> specified by This.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverBindingSupported (
> - 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[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL
> instance.
> - @param[in] 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[in] 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_DEVICE_ERROR The device could not be started due to a
> device error.
> - Currently not implemented.
> - @retval EFI_OUT_OF_RESOURCES The request could not be completed due
> to a lack of resources.
> - @retval Others The driver failded to start the device.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiDriverBindingStart (
> - IN EFI_DRIVER_BINDING_PROTOCOL *This,
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
> - );
> -
> -/**
> - Stop this driver on ControllerHandle.
> -
> - Release the control of this controller and remove the IScsi functions. 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[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL
> instance.
> - @param[in] 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[in] NumberOfChildren The number of child device handles in
> ChildHandleBuffer.Not used.
> - @param[in] ChildHandleBuffer An array of child handles to be freed. May be
> NULL
> - if NumberOfChildren is 0.Not used.
> -
> - @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
> -IScsiDriverBindingStop (
> - IN EFI_DRIVER_BINDING_PROTOCOL *This,
> - IN EFI_HANDLE ControllerHandle,
> - IN UINTN NumberOfChildren,
> - IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
> deleted file mode 100644
> index 48729e3029f7..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
> +++ /dev/null
> @@ -1,134 +0,0 @@
> -## @file
> -# This module produces EFI iSCSI Initiator Name Protocol.
> -#
> -# This module produces EFI iSCSI Initiator Name Protocol upon EFI TCPv4
> Protocol
> -# and EFI DHCPv4 Protocol, to provide the capability to do the transport for
> SCSI
> -# data over TCP/IP. It installs EFI HII Configuration Access Protocol to provide
> -# one way to configurate the iSCSI setting. This driver only supports IPv4
> network
> -# stack.
> -#
> -# Notes:
> -# 1) This driver can't co-work with the IScsiDxe driver in NetworkPkg.
> -# 2) This driver might have some issues that have been fixed in the IScsiDxe
> driver
> -# in NetworkPkg.
> -# 3) This driver supports fewer features than the IScsiDxe driver in NetworkPkg
> -# (e.g. IPv6, Dns support for target URL configuration, iSCSI keyword support).
> -# 4) IScsiDxe driver in NetworkPkg is recommended for use instead of this one
> even
> -# though both of them can be used.
> -#
> -# Copyright (c) 2004 - 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 = IScsi4Dxe
> - MODULE_UNI_FILE = IScsi4Dxe.uni
> - FILE_GUID = 4579B72D-7EC4-4dd4-8486-083C86B182A7
> - MODULE_TYPE = UEFI_DRIVER
> - VERSION_STRING = 1.0
> - ENTRY_POINT = IScsiDriverEntryPoint
> - UNLOAD_IMAGE = EfiIScsiUnload
> -
> -#
> -# The following information is for reference only and not required by the build
> tools.
> -#
> -# VALID_ARCHITECTURES = IA32 X64 EBC
> -#
> -# DRIVER_BINDING = gIScsiDriverBinding
> -# COMPONENT_NAME = gIScsiComponentName
> -# COMPONENT_NAME2 = gIScsiComponentName2
> -#
> -
> -[Sources]
> - IScsiTcp4Io.h
> - IScsiProto.h
> - IScsiMisc.h
> - IScsiIbft.h
> - IScsiExtScsiPassThru.h
> - IScsiDriver.h
> - IScsiDhcp.h
> - IScsiCommon.h
> - IScsiCHAP.h
> - IScsiInitiatorName.h
> - ComponentName.h
> - Md5.h
> - IScsiTcp4Io.c
> - IScsiProto.c
> - IScsiMisc.c
> - IScsiInitiatorName.c
> - IScsiIbft.c
> - IScsiExtScsiPassThru.c
> - IScsiDriver.c
> - IScsiDhcp.c
> - IScsiCHAP.c
> - ComponentName.c
> - Md5.c
> - IScsiConfigDxeStrings.uni
> - IScsiConfigDxe.vfr
> - IScsiConfig.c
> - IScsiConfig.h
> - IScsiImpl.h
> - IScsiConfigNVDataStruc.h
> -
> -[Packages]
> - MdePkg/MdePkg.dec
> - MdeModulePkg/MdeModulePkg.dec
> -
> -[LibraryClasses]
> - UefiDriverEntryPoint
> - UefiLib
> - BaseLib
> - UefiBootServicesTableLib
> - UefiRuntimeServicesTableLib
> - BaseMemoryLib
> - MemoryAllocationLib
> - DevicePathLib
> - DebugLib
> - PrintLib
> - HiiLib
> - NetLib
> -
> -[Protocols]
> - ## PRODUCES
> - ## UNDEFINED # Variable
> - gEfiIScsiInitiatorNameProtocolGuid
> - gEfiExtScsiPassThruProtocolGuid ## BY_START
> - gEfiTcp4ProtocolGuid ## TO_START
> - gEfiTcp4ServiceBindingProtocolGuid ## TO_START
> - gEfiDhcp4ProtocolGuid ## TO_START
> - gEfiDhcp4ServiceBindingProtocolGuid ## TO_START
> - ## TO_START
> - ## PRODUCES
> - gEfiDevicePathProtocolGuid
> - gEfiHiiConfigAccessProtocolGuid ## PRODUCES
> - gEfiHiiDatabaseProtocolGuid ## CONSUMES
> - gEfiPciIoProtocolGuid ## SOMETIMES_CONSUMES
> - gEfiAcpiTableProtocolGuid ## SOMETIMES_CONSUMES
> -
> -[Guids]
> - gEfiEventExitBootServicesGuid ## SOMETIMES_CONSUMES ## Event
> - gEfiIfrTianoGuid ## SOMETIMES_PRODUCES ## UNDEFINED
> - gEfiAcpiTableGuid ## SOMETIMES_CONSUMES ## SystemTable
> - gEfiAcpi10TableGuid ## SOMETIMES_CONSUMES ##
> SystemTable
> - ## SOMETIMES_PRODUCES ## Variable:L"iSCSIDeviceList"
> - ## SOMETIMES_CONSUMES ## Variable:L"iSCSIDeviceList"
> - ## SOMETIMES_CONSUMES ## UNDEFINED # HiiIsConfigHdrMatch
> mVendorStorageName
> - ## SOMETIMES_PRODUCES ## UNDEFINED # HiiConstructConfigHdr
> mVendorStorageName
> - ## SOMETIMES_PRODUCES ## UNDEFINED # HiiGetBrowserData
> mVendorStorageName
> - ## SOMETIMES_CONSUMES ## UNDEFINED # HiiSetBrowserData
> mVendorStorageName
> - ## SOMETIMES_CONSUMES ## HII
> - gIp4IScsiConfigGuid
> - ## SOMETIMES_PRODUCES ## Variable
> - ## SOMETIMES_CONSUMES ## Variable
> - gIScsiCHAPAuthInfoGuid
> -
> -[UserExtensions.TianoCore."ExtraFiles"]
> - IScsi4DxeExtra.uni
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h
> deleted file mode 100644
> index e635e47b9292..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiExtScsiPassThru.h
> +++ /dev/null
> @@ -1,22 +0,0 @@
> -/** @file
> - The header file of IScsiExtScsiPassThru.c.
> -
> -Copyright (c) 2004 - 2008, 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.
> -
> -**/
> -
> -#ifndef _ISCSI_EXT_SCSI_PASS_THRU_H_
> -#define _ISCSI_EXT_SCSI_PASS_THRU_H_
> -
> -#include <Protocol/ScsiPassThruExt.h>
> -
> -extern EFI_EXT_SCSI_PASS_THRU_PROTOCOL
> gIScsiExtScsiPassThruProtocolTemplate;
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h
> deleted file mode 100644
> index 4f3828db63c6..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiIbft.h
> +++ /dev/null
> @@ -1,38 +0,0 @@
> -/** @file
> - Some extra definitions for iBFT.
> -
> -Copyright (c) 2004 - 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
> -
> -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 _ISCSI_IBFT_H_
> -#define _ISCSI_IBFT_H_
> -
> -#include <IndustryStandard/Acpi.h>
> -#include <IndustryStandard/IScsiBootFirmwareTable.h>
> -#include <Protocol/AcpiTable.h>
> -#include <Protocol/PciIo.h>
> -
> -#define IBFT_TABLE_VAR_NAME L"iBFT"
> -#define IBFT_MAX_SIZE 4096
> -#define IBFT_HEAP_OFFSET 2048
> -
> -#define IBFT_ROUNDUP(size) NET_ROUNDUP ((size),
> EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_STRUCTURE_ALIGNMENT)
> -
> -/**
> - Publish and remove the iSCSI Boot Firmware Table according to the iSCSI
> - session status.
> -**/
> -VOID
> -IScsiPublishIbft (
> - VOID
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h
> deleted file mode 100644
> index 8a5ee2149eb2..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiImpl.h
> +++ /dev/null
> @@ -1,168 +0,0 @@
> -/** @file
> - The header file of IScsiImpl.c.
> -
> -Copyright (c) 2004 - 2016, 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.
> -
> -**/
> -
> -#ifndef _ISCSI_IMPL_H_
> -#define _ISCSI_IMPL_H_
> -
> -#include <Uefi.h>
> -
> -#include <IndustryStandard/Dhcp.h>
> -
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/MemoryAllocationLib.h>
> -#include <Library/NetLib.h>
> -#include <Library/PrintLib.h>
> -#include <Library/UefiRuntimeServicesTableLib.h>
> -
> -#include <Guid/EventGroup.h>
> -
> -#include "IScsiCommon.h"
> -#include "IScsiDriver.h"
> -#include "IScsiInitiatorName.h"
> -#include "ComponentName.h"
> -#include "IScsiConfigNVDataStruc.h"
> -#include "IScsiExtScsiPassThru.h"
> -#include "IScsiProto.h"
> -#include "IScsiMisc.h"
> -#include "IScsiCHAP.h"
> -#include "IScsiConfig.h"
> -#include "IScsiDhcp.h"
> -#include "IScsiTcp4Io.h"
> -#include "IScsiIbft.h"
> -
> -
> -#define ISCSI_SESSION_SIGNATURE SIGNATURE_32 ('I', 'S', 'S', 'N')
> -
> -struct _ISCSI_SESSION {
> - UINT32 Signature;
> -
> - ISCSI_SESSION_CONFIG_DATA ConfigData;
> - ISCSI_CHAP_AUTH_DATA AuthData;
> -
> - CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE];
> - UINTN InitiatorNameLength;
> - UINT8 State;
> -
> - UINT8 Isid[6];
> - UINT16 Tsih;
> -
> - UINT32 CmdSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> -
> - UINT32 InitiatorTaskTag;
> - UINT16 NextCid;
> -
> - LIST_ENTRY Conns;
> - UINT32 NumConns;
> -
> - LIST_ENTRY TcbList;
> -
> - //
> - // session-wide parameters
> - //
> - UINT16 TargetPortalGroupTag;
> - UINT32 MaxConnections;
> - BOOLEAN InitialR2T;
> - BOOLEAN ImmediateData;
> - UINT32 MaxBurstLength;
> - UINT32 FirstBurstLength;
> - UINT32 DefaultTime2Wait;
> - UINT32 DefaultTime2Retain;
> - UINT16 MaxOutstandingR2T;
> - BOOLEAN DataPDUInOrder;
> - BOOLEAN DataSequenceInOrder;
> - UINT8 ErrorRecoveryLevel;
> -};
> -
> -#define ISCSI_CONNECTION_SIGNATURE SIGNATURE_32 ('I', 'S', 'C', 'N')
> -
> -struct _ISCSI_CONNECTION {
> - UINT32 Signature;
> - LIST_ENTRY Link;
> -
> - EFI_EVENT TimeoutEvent;
> -
> - ISCSI_SESSION *Session;
> -
> - UINT8 State;
> - UINT8 CurrentStage;
> - UINT8 NextStage;
> -
> - UINT8 CHAPStep;
> -
> - BOOLEAN PartialReqSent;
> - BOOLEAN PartialRspRcvd;
> -
> - BOOLEAN TransitInitiated;
> -
> - UINT16 Cid;
> - UINT32 ExpStatSN;
> -
> - //
> - // queues...
> - //
> - NET_BUF_QUEUE RspQue;
> -
> - TCP4_IO Tcp4Io;
> -
> - //
> - // connection-only parameters
> - //
> - UINT32 MaxRecvDataSegmentLength;
> - ISCSI_DIGEST_TYPE HeaderDigest;
> - ISCSI_DIGEST_TYPE DataDigest;
> -};
> -
> -#define ISCSI_DRIVER_DATA_SIGNATURE SIGNATURE_32 ('I', 'S', 'D', 'A')
> -
> -#define ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU(PassThru) \
> - CR ( \
> - PassThru, \
> - ISCSI_DRIVER_DATA, \
> - IScsiExtScsiPassThru, \
> - ISCSI_DRIVER_DATA_SIGNATURE \
> - )
> -#define ISCSI_DRIVER_DATA_FROM_IDENTIFIER(Identifier) \
> - CR ( \
> - Identifier, \
> - ISCSI_DRIVER_DATA, \
> - IScsiIdentifier, \
> - ISCSI_DRIVER_DATA_SIGNATURE \
> - )
> -#define ISCSI_DRIVER_DATA_FROM_SESSION(s) \
> - CR ( \
> - s, \
> - ISCSI_DRIVER_DATA, \
> - Session, \
> - ISCSI_DRIVER_DATA_SIGNATURE \
> - )
> -
> -struct _ISCSI_DRIVER_DATA {
> - UINT32 Signature;
> - EFI_HANDLE Image;
> - EFI_HANDLE Controller;
> - ISCSI_PRIVATE_PROTOCOL IScsiIdentifier;
> - EFI_HANDLE ChildHandle;
> - EFI_EVENT ExitBootServiceEvent;
> -
> - EFI_EXT_SCSI_PASS_THRU_PROTOCOL IScsiExtScsiPassThru;
> - EFI_EXT_SCSI_PASS_THRU_MODE ExtScsiPassThruMode;
> - EFI_HANDLE ExtScsiPassThruHandle;
> - EFI_DEVICE_PATH_PROTOCOL *DevicePath;
> -
> - ISCSI_SESSION Session;
> -};
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h
> deleted file mode 100644
> index f967fb383095..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiInitiatorName.h
> +++ /dev/null
> @@ -1,74 +0,0 @@
> -/** @file
> - The header file for EFI iSCSI Initiator Name Protocol.
> -
> -Copyright (c) 2004 - 2008, 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.
> -
> -**/
> -
> -#ifndef _ISCSI_INITIATOR_NAME_H_
> -#define _ISCSI_INITIATOR_NAME_H_
> -
> -#include <Protocol/IScsiInitiatorName.h>
> -
> -extern EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName;
> -
> -//
> -// EFI iSCSI Initiator Name Protocol for IScsi driver.
> -//
> -
> -/**
> - Retrieves the current set value of iSCSI Initiator Name.
> -
> - @param[in] This Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer /
> Actual size of the
> - variable data buffer.
> - @param[out] Buffer Pointer to the buffer for data to be read.
> -
> - @retval EFI_SUCCESS Data was successfully retrieved into the provided
> buffer and the
> - BufferSize was sufficient to handle the iSCSI initiator name.
> - @retval EFI_BUFFER_TOO_SMALL BufferSize is too small for the result.
> - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL.
> - @retval EFI_DEVICE_ERROR The iSCSI initiator name could not be retrieved
> due to a hardware error.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiGetInitiatorName (
> - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
> - IN OUT UINTN *BufferSize,
> - OUT VOID *Buffer
> - );
> -
> -/**
> - Sets the iSCSI Initiator Name.
> -
> - @param[in] This Pointer to the
> EFI_ISCSI_INITIATOR_NAME_PROTOCOL instance.
> - @param[in, out] BufferSize Size of the buffer in bytes pointed to by Buffer.
> - @param[in] Buffer Pointer to the buffer for data to be written.
> -
> - @retval EFI_SUCCESS Data was successfully stored by the protocol.
> - @retval EFI_UNSUPPORTED Platform policies do not allow for data to be
> written.
> - Currently not implemented.
> - @retval EFI_INVALID_PARAMETER BufferSize or Buffer is NULL, or BufferSize
> exceeds the maximum allowed limit.
> - @retval EFI_DEVICE_ERROR The data could not be stored due to a
> hardware error.
> - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold
> the data.
> - @retval EFI_PROTOCOL_ERROR Input iSCSI initiator name does not adhere
> to RFC 3720
> - (and other related protocols).
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiSetInitiatorName (
> - IN EFI_ISCSI_INITIATOR_NAME_PROTOCOL *This,
> - IN OUT UINTN *BufferSize,
> - IN VOID *Buffer
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h
> deleted file mode 100644
> index 500e00373b25..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.h
> +++ /dev/null
> @@ -1,317 +0,0 @@
> -/** @file
> - Miscellaneous definitions for iSCSI driver.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _ISCSI_MISC_H_
> -#define _ISCSI_MISC_H_
> -
> -#include <Library/BaseLib.h>
> -
> -typedef struct _ISCSI_SESSION_CONFIG_DATA ISCSI_SESSION_CONFIG_DATA;
> -
> -///
> -/// IPv4 Device Path Node Length
> -///
> -#define IP4_NODE_LEN_NEW_VERSIONS 27
> -
> -#pragma pack(1)
> -typedef struct {
> - BOOLEAN Enabled;
> -
> - BOOLEAN InitiatorInfoFromDhcp;
> - EFI_IPv4_ADDRESS LocalIp;
> - EFI_IPv4_ADDRESS SubnetMask;
> - EFI_IPv4_ADDRESS Gateway;
> -
> - BOOLEAN TargetInfoFromDhcp;
> - CHAR8 TargetName[ISCSI_NAME_MAX_SIZE];
> - EFI_IPv4_ADDRESS TargetIp;
> - UINT16 TargetPort;
> - UINT8 BootLun[8];
> -
> - UINT8 IsId[6];
> -} ISCSI_SESSION_CONFIG_NVDATA;
> -#pragma pack()
> -
> -struct _ISCSI_SESSION_CONFIG_DATA {
> - ISCSI_SESSION_CONFIG_NVDATA NvData;
> -
> - EFI_IPv4_ADDRESS PrimaryDns;
> - EFI_IPv4_ADDRESS SecondaryDns;
> - EFI_IPv4_ADDRESS DhcpServer;
> -};
> -
> -/**
> - Calculate the prefix length of the IPv4 subnet mask.
> -
> - @param[in] SubnetMask The IPv4 subnet mask.
> -
> - @return The prefix length of the subnet mask.
> - @retval 0 Other errors as indicated.
> -**/
> -UINT8
> -IScsiGetSubnetMaskPrefixLength (
> - IN EFI_IPv4_ADDRESS *SubnetMask
> - );
> -
> -/**
> - Convert the hexadecimal encoded LUN string into the 64-bit LUN.
> -
> - @param[in] Str The hexadecimal encoded LUN string.
> - @param[out] Lun Storage to return the 64-bit LUN.
> -
> - @retval EFI_SUCCESS The 64-bit LUN is stored in Lun.
> - @retval EFI_INVALID_PARAMETER The string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiAsciiStrToLun (
> - IN CHAR8 *Str,
> - OUT UINT8 *Lun
> - );
> -
> -/**
> - Convert the 64-bit LUN into the hexadecimal encoded LUN string.
> -
> - @param[in] Lun The 64-bit LUN.
> - @param[out] Str The storage to return the hexadecimal encoded LUN string.
> -**/
> -VOID
> -IScsiLunToUnicodeStr (
> - IN UINT8 *Lun,
> - OUT CHAR16 *Str
> - );
> -
> -/**
> - Convert the ASCII string into a UNICODE string.
> -
> - @param[in] Source The ASCII string.
> - @param[out] Destination The storage to return the UNICODE string.
> -
> - @return CHAR16 * Pointer to the UNICODE string.
> -**/
> -CHAR16 *
> -IScsiAsciiStrToUnicodeStr (
> - IN CHAR8 *Source,
> - OUT CHAR16 *Destination
> - );
> -
> -/**
> - Convert the UNICODE string into an ASCII string.
> -
> - @param[in] Source The UNICODE string.
> - @param[out] Destination The storage to return the ASCII string.
> -
> - @return CHAR8 * Pointer to the ASCII string.
> -**/
> -CHAR8 *
> -IScsiUnicodeStrToAsciiStr (
> - IN CHAR16 *Source,
> - OUT CHAR8 *Destination
> - );
> -
> -/**
> - Convert the mac address into a hexadecimal encoded "-" seperated string.
> -
> - @param[in] Mac The mac address.
> - @param[in] Len Length in bytes of the mac address.
> - @param[in] VlanId VLAN ID of the network device.
> - @param[out] Str The storage to return the mac string.
> -**/
> -VOID
> -IScsiMacAddrToStr (
> - IN EFI_MAC_ADDRESS *Mac,
> - IN UINT32 Len,
> - IN UINT16 VlanId,
> - OUT CHAR16 *Str
> - );
> -
> -/**
> - Convert the decimal dotted IPv4 address into the binary IPv4 address.
> -
> - @param[in] Str The UNICODE string.
> - @param[out] Ip The storage to return the ASCII string.
> -
> - @retval EFI_SUCCESS The binary IP address is returned in Ip.
> - @retval EFI_INVALID_PARAMETER The IP string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiAsciiStrToIp (
> - IN CHAR8 *Str,
> - OUT EFI_IPv4_ADDRESS *Ip
> - );
> -
> -/**
> - Convert the binary encoded buffer into a hexadecimal encoded string.
> -
> - @param[in] BinBuffer The buffer containing the binary data.
> - @param[in] BinLength Length of the binary buffer.
> - @param[in, out] HexStr Pointer to the string.
> - @param[in, out] HexLength The length of the string.
> -
> - @retval EFI_SUCCESS The binary data is converted to the hexadecimal
> string
> - and the length of the string is updated.
> - @retval EFI_BUFFER_TOO_SMALL The string is too small.
> - @retval EFI_INVALID_PARAMETER The IP string is malformatted.
> -**/
> -EFI_STATUS
> -IScsiBinToHex (
> - IN UINT8 *BinBuffer,
> - IN UINT32 BinLength,
> - IN OUT CHAR8 *HexStr,
> - IN OUT UINT32 *HexLength
> - );
> -
> -/**
> - Convert the hexadecimal string into a binary encoded buffer.
> -
> - @param[in, out] BinBuffer The binary buffer.
> - @param[in, out] BinLength Length of the binary buffer.
> - @param[in] HexStr The hexadecimal string.
> -
> - @retval EFI_SUCCESS The hexadecimal string is converted into a binary
> - encoded buffer.
> - @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the
> converted data.
> -**/
> -EFI_STATUS
> -IScsiHexToBin (
> - IN OUT UINT8 *BinBuffer,
> - IN OUT UINT32 *BinLength,
> - IN CHAR8 *HexStr
> - );
> -
> -/**
> - Generate random numbers.
> -
> - @param[in, out] Rand The buffer to contain random numbers.
> - @param[in] RandLength The length of the Rand buffer.
> -**/
> -VOID
> -IScsiGenRandom (
> - IN OUT UINT8 *Rand,
> - IN UINTN RandLength
> - );
> -
> -/**
> - Create the iSCSI driver data..
> -
> - @param[in] Image The handle of the driver image.
> - @param[in] Controller The handle of the controller.
> -
> - @return The iSCSI driver data created.
> - @retval NULL Other errors as indicated.
> -**/
> -ISCSI_DRIVER_DATA *
> -IScsiCreateDriverData (
> - IN EFI_HANDLE Image,
> - IN EFI_HANDLE Controller
> - );
> -
> -/**
> - Clean the iSCSI driver data.
> -
> - @param[in] Private The iSCSI driver data.
> -
> - @retval EFI_SUCCES The clean operation is successful.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiCleanDriverData (
> - IN ISCSI_DRIVER_DATA *Private
> - );
> -
> -/**
> - Check wheather the Controller is configured to use DHCP protocol.
> -
> - @param[in] Controller The handle of the controller.
> -
> - @retval TRUE The handle of the controller need the Dhcp protocol.
> - @retval FALSE The handle of the controller does not need the Dhcp
> protocol.
> -
> -**/
> -BOOLEAN
> -IScsiDhcpIsConfigured (
> - IN EFI_HANDLE Controller
> - );
> -
> -/**
> - Get the various configuration data of this iSCSI instance.
> -
> - @param[in] Private The iSCSI driver data.
> -
> - @retval EFI_SUCCESS The configuration of this instance is got.
> - @retval EFI_ABORTED The operation was aborted.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiGetConfigData (
> - IN ISCSI_DRIVER_DATA *Private
> - );
> -
> -/**
> - Get the device path of the iSCSI tcp connection and update it.
> -
> - @param[in] Private The iSCSI driver data.
> -
> - @return The updated device path.
> - @retval NULL Other errors as indicated.
> -**/
> -EFI_DEVICE_PATH_PROTOCOL *
> -IScsiGetTcpConnDevicePath (
> - IN ISCSI_DRIVER_DATA *Private
> - );
> -
> -/**
> - Abort the session when the transition from BS to RT is initiated.
> -
> - @param[in] Event The event signaled.
> - @param[in] Context The iSCSI driver data.
> -**/
> -VOID
> -EFIAPI
> -IScsiOnExitBootService (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - );
> -
> -/**
> - Tests whether a controller handle is being managed by IScsi driver.
> -
> - This function tests whether the driver specified by DriverBindingHandle is
> - currently managing the controller specified by ControllerHandle. This test
> - is performed by evaluating if the the protocol specified by ProtocolGuid is
> - present on ControllerHandle and is was opened by DriverBindingHandle and
> Nic
> - Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER.
> - If ProtocolGuid is NULL, then ASSERT().
> -
> - @param ControllerHandle A handle for a controller to test.
> - @param DriverBindingHandle Specifies the driver binding handle for the
> - driver.
> - @param ProtocolGuid Specifies the protocol that the driver specified
> - by DriverBindingHandle opens in its Start()
> - function.
> -
> - @retval EFI_SUCCESS ControllerHandle is managed by the driver
> - specified by DriverBindingHandle.
> - @retval EFI_UNSUPPORTED ControllerHandle is not managed by the driver
> - specified by DriverBindingHandle.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -IScsiTestManagedDevice (
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_HANDLE DriverBindingHandle,
> - IN EFI_GUID *ProtocolGuid
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h
> deleted file mode 100644
> index 6469df0434a1..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h
> +++ /dev/null
> @@ -1,1005 +0,0 @@
> -/** @file
> - The header file of iSCSI Protocol that defines many specific data structures.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _ISCSI_PROTO_H_
> -#define _ISCSI_PROTO_H_
> -
> -#include <Protocol/ScsiPassThruExt.h>
> -
> -//
> -// RFC 1982 Serial Number Arithmetic, SERIAL_BITS = 32
> -//
> -#define ISCSI_SEQ_EQ(s1, s2) ((s1) == (s2))
> -#define ISCSI_SEQ_LT(s1, s2) \
> - ( \
> - (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) < ((UINT32) 1 << 31)) || \
> - (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) > ((UINT32) 1 << 31)) \
> - )
> -#define ISCSI_SEQ_GT(s1, s2) \
> - ( \
> - (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) > ((UINT32) 1 << 31)) || \
> - (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) < ((UINT32) 1 << 31)) \
> - )
> -
> -#define ISCSI_WELL_KNOWN_PORT 3260
> -#define ISCSI_MAX_CONNS_PER_SESSION 1
> -
> -#define DEFAULT_MAX_RECV_DATA_SEG_LEN 8192
> -#define MAX_RECV_DATA_SEG_LEN_IN_FFP 65536
> -#define DEFAULT_MAX_OUTSTANDING_R2T 1
> -
> -#define ISCSI_VERSION_MAX 0x00
> -#define ISCSI_VERSION_MIN 0x00
> -
> -#define ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME
> EFI_TIMER_PERIOD_SECONDS(20)
> -#define ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME
> EFI_TIMER_PERIOD_SECONDS(20)
> -
> -#define ISCSI_KEY_AUTH_METHOD "AuthMethod"
> -#define ISCSI_KEY_HEADER_DIGEST "HeaderDigest"
> -#define ISCSI_KEY_DATA_DIGEST "DataDigest"
> -#define ISCSI_KEY_MAX_CONNECTIONS "MaxConnections"
> -#define ISCSI_KEY_TARGET_NAME "TargetName"
> -#define ISCSI_KEY_INITIATOR_NAME "InitiatorName"
> -#define ISCSI_KEY_TARGET_ALIAS "TargetAlias"
> -#define ISCSI_KEY_INITIATOR_ALIAS "InitiatorAlias"
> -#define ISCSI_KEY_TARGET_ADDRESS "TargetAddress"
> -#define ISCSI_KEY_INITIAL_R2T "InitialR2T"
> -#define ISCSI_KEY_IMMEDIATE_DATA "ImmediateData"
> -#define ISCSI_KEY_TARGET_PORTAL_GROUP_TAG "TargetPortalGroupTag"
> -#define ISCSI_KEY_MAX_BURST_LENGTH "MaxBurstLength"
> -#define ISCSI_KEY_FIRST_BURST_LENGTH "FirstBurstLength"
> -#define ISCSI_KEY_DEFAULT_TIME2WAIT "DefaultTime2Wait"
> -#define ISCSI_KEY_DEFAULT_TIME2RETAIN "DefaultTime2Retain"
> -#define ISCSI_KEY_MAX_OUTSTANDING_R2T "MaxOutstandingR2T"
> -#define ISCSI_KEY_DATA_PDU_IN_ORDER "DataPDUInOrder"
> -#define ISCSI_KEY_DATA_SEQUENCE_IN_ORDER "DataSequenceInOrder"
> -#define ISCSI_KEY_ERROR_RECOVERY_LEVEL "ErrorRecoveryLevel"
> -#define ISCSI_KEY_SESSION_TYPE "SessionType"
> -#define ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH
> "MaxRecvDataSegmentLength"
> -
> -#define ISCSI_KEY_VALUE_NONE "None"
> -
> -///
> -/// connection state for initiator
> -///
> -
> -#define CONN_STATE_FREE 0
> -#define CONN_STATE_XPT_WAIT 1
> -#define CONN_STATE_IN_LOGIN 2
> -#define CONN_STATE_LOGGED_IN 3
> -#define CONN_STATE_IN_LOGOUT 4
> -#define CONN_STATE_LOGOUT_REQUESTED 5
> -#define CONN_STATE_CLEANUP_WAIT 6
> -#define CONN_STATE_IN_CLEANUP 7
> -
> -///
> -/// session state for initiator
> -///
> -#define SESSION_STATE_FREE 0
> -#define SESSION_STATE_LOGGED_IN 1
> -#define SESSION_STATE_FAILED 2
> -
> -typedef enum {
> - DataIn = 0,
> - DataOut = 1,
> - DataBi = 2
> -} DATA_DIRECTION;
> -
> -#define ISCSI_RESERVED_TAG 0xffffffff
> -
> -#define ISCSI_REQ_IMMEDIATE 0x40
> -#define ISCSI_OPCODE_MASK 0x3F
> -
> -#define ISCSI_SET_OPCODE(PduHdr, Op, Flgs) ((((ISCSI_BASIC_HEADER *)
> (PduHdr))->OpCode) = ((Op) | (Flgs)))
> -#define ISCSI_GET_OPCODE(PduHdr) ((((ISCSI_BASIC_HEADER *)
> (PduHdr))->OpCode) & ISCSI_OPCODE_MASK)
> -#define ISCSI_CHECK_OPCODE(PduHdr, Op) ((((PduHdr)->OpCode) &
> ISCSI_OPCODE_MASK) == (Op))
> -#define ISCSI_IMMEDIATE_ON(PduHdr) ((PduHdr)->OpCode &
> ISCSI_REQ_IMMEDIATE)
> -#define ISCSI_SET_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *) (PduHdr))-
> >Flags |= (BOOLEAN)(Flag))
> -#define ISCSI_CLEAR_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *)
> (PduHdr))->Flags &= ~(Flag))
> -#define ISCSI_FLAG_ON(PduHdr, Flag) ((((ISCSI_BASIC_HEADER *)
> (PduHdr))->Flags & (Flag)) == (Flag))
> -#define ISCSI_SET_STAGES(PduHdr, Cur, Nxt) ((PduHdr)->Flags = (UINT8)
> ((PduHdr)->Flags | ((Cur) << 2 | (Nxt))))
> -#define ISCSI_GET_CURRENT_STAGE(PduHdr) (((PduHdr)->Flags >> 2) & 0x3)
> -#define ISCSI_GET_NEXT_STAGE(PduHdr) (((PduHdr)->Flags) & 0x3)
> -
> -#define ISCSI_GET_PAD_LEN(DataLen) ((~(DataLen) + 1) & 0x3)
> -#define ISCSI_ROUNDUP(DataLen) (((DataLen) + 3) &~(0x3))
> -
> -#define HTON24(Dst, Src) \
> - do { \
> - (Dst)[0] = (UINT8) (((Src) >> 16) & 0xFF); \
> - (Dst)[1] = (UINT8) (((Src) >> 8) & 0xFF); \
> - (Dst)[2] = (UINT8) ((Src) & 0xFF); \
> - } while (0);
> -
> -#define NTOH24(src) (((src)[0] << 16) | ((src)[1] << 8) | ((src)[2]))
> -
> -#define ISCSI_GET_DATASEG_LEN(PduHdr) NTOH24 (((ISCSI_BASIC_HEADER
> *) (PduHdr))->DataSegmentLength)
> -#define ISCSI_SET_DATASEG_LEN(PduHdr, Len) HTON24
> (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength, (Len))
> -
> -//
> -// initiator opcodes
> -//
> -#define ISCSI_OPCODE_NOP_OUT 0x00
> -#define ISCSI_OPCODE_SCSI_CMD 0x01
> -#define ISCSI_OPCODE_SCSI_TMF_REQ 0x02
> -#define ISCSI_OPCODE_LOGIN_REQ 0x03
> -#define ISCSI_OPCODE_TEXT_REQ 0x04
> -#define ISCSI_OPCODE_SCSI_DATA_OUT 0x05
> -#define ISCSI_OPCODE_LOGOUT_REQ 0x06
> -#define ISCSI_OPCODE_SNACK_REQ 0x10
> -#define ISCSI_OPCODE_VENDOR_I0 0x1c
> -#define ISCSI_OPCODE_VENDOR_I1 0x1d
> -#define ISCSI_OPCODE_VENDOR_I2 0x1e
> -
> -//
> -// target opcodes
> -//
> -#define ISCSI_OPCODE_NOP_IN 0x20
> -#define ISCSI_OPCODE_SCSI_RSP 0x21
> -#define ISCSI_OPCODE_SCSI_TMF_RSP 0x22
> -#define ISCSI_OPCODE_LOGIN_RSP 0x23
> -#define ISCSI_OPCODE_TEXT_RSP 0x24
> -#define ISCSI_OPCODE_SCSI_DATA_IN 0x25
> -#define ISCSI_OPCODE_LOGOUT_RSP 0x26
> -#define ISCSI_OPCODE_R2T 0x31
> -#define ISCSI_OPCODE_ASYNC_MSG 0x32
> -#define ISCSI_OPCODE_VENDOR_T0 0x3c
> -#define ISCSI_OPCODE_VENDOR_T1 0x3d
> -#define ISCSI_OPCODE_VENDOR_T2 0x3e
> -#define ISCSI_OPCODE_REJECT 0x3f
> -
> -#define ISCSI_BHS_FLAG_FINAL 0x80
> -
> -///
> -/// iSCSI Basic Header Segment
> -///
> -typedef struct _ISCSI_BASIC_HEADER {
> - UINT8 OpCode;
> - UINT8 Flags;
> - UINT16 OpCodeSpecific1;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 OpCodeSpecific2[7];
> -} ISCSI_BASIC_HEADER;
> -
> -//
> -// Defined AHS types, others are reserved.
> -//
> -#define ISCSI_AHS_TYPE_EXT_CDB 0x1
> -#define ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN 0x2
> -
> -typedef struct _ISCSI_ADDTIONAL_HEADER {
> - UINT16 Length;
> - UINT8 Type;
> - UINT8 TypeSpecific[1];
> -} ISCSI_ADDITIONAL_HEADER;
> -
> -typedef struct _ISCSI_BI_EXP_READ_DATA_LEN_AHS {
> - UINT16 Length;
> - UINT8 Type;
> - UINT8 Reserved;
> - UINT32 ExpReadDataLength;
> -} ISCSI_BI_EXP_READ_DATA_LEN_AHS;
> -
> -#define SCSI_CMD_PDU_FLAG_READ 0x40
> -#define SCSI_CMD_PDU_FLAG_WRITE 0x20
> -
> -#define ISCSI_CMD_PDU_TASK_ATTR_MASK 0x07
> -
> -//
> -// task attributes
> -//
> -#define ISCSI_TASK_ATTR_UNTAGGED 0x00
> -#define ISCSI_TASK_ATTR_SIMPLE 0x01
> -#define ISCSI_TASK_ATTR_ORDERD 0x02
> -#define ISCSI_TASK_ATTR_HOQ 0x03
> -#define ISCSI_TASK_ATTR_ACA 0x04
> -
> -///
> -/// SCSI Command
> -///
> -typedef struct _SCSI_COMMAND {
> - UINT8 OpCode;
> - UINT8 Flags;
> - UINT16 Reserved;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 ExpDataXferLength;
> - UINT32 CmdSN;
> - UINT32 ExpStatSN;
> - UINT8 Cdb[16];
> -} SCSI_COMMAND;
> -
> -//
> -// flag bit definitions in SCSI response
> -//
> -#define SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW 0x10
> -#define SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW 0x08
> -#define SCSI_RSP_PDU_FLAG_OVERFLOW 0x04
> -#define SCSI_RSP_PDU_FLAG_UNDERFLOW 0x02
> -
> -//
> -// iSCSI service response codes
> -//
> -#define ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET 0x00
> -#define ISCSI_SERVICE_RSP_TARGET_FAILURE 0x01
> -
> -///
> -/// SCSI Response
> -///
> -typedef struct _SCSI_RESPONSE {
> - UINT8 OpCode;
> - UINT8 Flags;
> - UINT8 Response;
> - UINT8 Status;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Reserved[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 SNACKTag;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT32 ExpDataSN;
> - UINT32 BiReadResidualCount;
> - UINT32 ResidualCount;
> -} SCSI_RESPONSE;
> -
> -typedef struct _ISCSI_SENSE_DATA {
> - UINT16 Length;
> - UINT8 Data[2];
> -} ISCSI_SENSE_DATA;
> -
> -///
> -/// iSCSI Task Managment Function Request
> -///
> -typedef struct _ISCSI_TMF_REQUEST {
> - UINT8 OpCode;
> - UINT8 Fuction;
> - UINT16 Reserved1;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 ReferencedTaskTag;
> - UINT32 CmdSN;
> - UINT32 ExpStatSN;
> - UINT32 RefCmdSN;
> - UINT32 ExpDataSN;
> - UINT32 Reserved2[2];
> -} ISCSI_TMF_REQUEST;
> -
> -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_COMPLETE 0
> -#define ISCSI_TMF_RSP_PDU_RSP_TASK_NOT_EXIST 1
> -#define ISCSI_TMF_RSP_PDU_RSP_LUN_NOT_EXIST 2
> -#define ISCSI_TMF_RSP_PDU_RSP_TASK_STILL_ALLEGIANT 3
> -#define ISCSI_TMF_RSP_PDU_RSP_TASK_REASSGIN_NOT_SUPPORTED 4
> -#define ISCSI_TMF_RSP_PDU_RSP_NOT_SUPPORTED 5
> -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_AHTH_FAILED 6
> -#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_REJECTED 255
> -
> -///
> -/// iSCSI Task Management Function Response
> -///
> -typedef struct _ISCSI_TMF_RESPONSE {
> - UINT8 OpCode;
> - UINT8 Reserved1;
> - UINT8 Response;
> - UINT8 Reserved2;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT32 Reserver3[2];
> - UINT32 InitiatorTaskTag;
> - UINT32 Reserved4;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT32 Reserved[3];
> -} ISCSI_TMF_RESPONSE;
> -
> -///
> -/// SCSI Data-Out
> -///
> -typedef struct _ISCSI_SCSI_DATA_OUT {
> - UINT8 OpCode;
> - UINT8 Reserved1[3];
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 TargetTransferTag;
> - UINT32 Reserved2;
> - UINT32 ExpStatSN;
> - UINT32 Reserved3;
> - UINT32 DataSN;
> - UINT32 BufferOffset;
> - UINT32 Reserved4;
> -} ISCSI_SCSI_DATA_OUT;
> -
> -#define SCSI_DATA_IN_PDU_FLAG_ACKKNOWLEDGE 0x40
> -#define SCSI_DATA_IN_PDU_FLAG_OVERFLOW
> SCSI_RSP_PDU_FLAG_OVERFLOW
> -#define SCSI_DATA_IN_PDU_FLAG_UNDERFLOW
> SCSI_RSP_PDU_FLAG_UNDERFLOW
> -#define SCSI_DATA_IN_PDU_FLAG_STATUS_VALID 0x01
> -
> -///
> -/// SCSI Data-In
> -///
> -typedef struct _ISCSI_SCSI_DATA_IN {
> - UINT8 OpCode;
> - UINT8 Flags;
> - UINT8 Reserved1;
> - UINT8 Status;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 TargetTransferTag;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT32 DataSN;
> - UINT32 BufferOffset;
> - UINT32 ResidualCount;
> -} ISCSI_SCSI_DATA_IN;
> -
> -#define ISCSI_GET_BUFFER_OFFSET(PduHdr) NTOHL (((ISCSI_SCSI_DATA_IN *)
> (PduHdr))->BufferOffset)
> -
> -///
> -/// Ready To Transfer
> -///
> -typedef struct _ISCSI_READY_TO_TRANSFER {
> - UINT8 OpCode;
> - UINT8 Reserved1[3];
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 TargetTransferTag;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT32 R2TSeqNum;
> - UINT32 BufferOffset;
> - UINT32 DesiredDataTransferLength;
> -} ISCSI_READY_TO_TRANSFER;
> -
> -typedef struct _ISCSI_ASYNC_MESSAGE {
> - UINT8 OpCode;
> - UINT8 Reserved1[8];
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 Reserved2;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT8 AsyncEvent;
> - UINT8 AsyncVCode;
> - UINT16 Parameter1;
> - UINT16 Parameter2;
> - UINT16 Parameter3;
> - UINT32 Reserved3;
> -} ISCSI_ASYNC_MESSAGE;
> -
> -#define ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT 0x80
> -#define ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE 0x40
> -
> -///
> -/// Login Request
> -///
> -typedef struct _ISCSI_LOGIN_REQUEST {
> - UINT8 OpCode;
> - UINT8 Flags;
> - UINT8 VersionMax;
> - UINT8 VersionMin;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Isid[6];
> - UINT16 Tsih;
> - UINT32 InitiatorTaskTag;
> - UINT16 Cid;
> - UINT16 Reserved1;
> - UINT32 CmdSN;
> - UINT32 ExpStatSN;
> - UINT32 Reserved2[4];
> -} ISCSI_LOGIN_REQUEST;
> -
> -#define ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT
> ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT
> -#define ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE
> ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE
> -
> -#define ISCSI_LOGIN_STATUS_SUCCESS 0
> -#define ISCSI_LOGIN_STATUS_REDIRECTION 1
> -#define ISCSI_LOGIN_STATUS_INITIATOR_ERROR 2
> -#define ISCSI_LOGIN_STATUS_TARGET_ERROR 3
> -
> -///
> -/// Login Response
> -///
> -typedef struct _ISCSI_LOGIN_RESPONSE {
> - UINT8 OpCode;
> - UINT8 Flags;
> - UINT8 VersionMax;
> - UINT8 VersionActive;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Isid[6];
> - UINT16 Tsih;
> - UINT32 InitiatorTaskTag;
> - UINT32 Reserved1;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT8 StatusClass;
> - UINT8 StatusDetail;
> - UINT8 Reserved2[10];
> -} ISCSI_LOGIN_RESPONSE;
> -
> -#define ISCSI_LOGOUT_REASON_CLOSE_SESSION 0
> -#define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION 1
> -#define ISCSI_LOGOUT_REASON_REMOVE_CONNECTION_FOR_RECOVERY 2
> -
> -///
> -/// Logout Request
> -///
> -typedef struct _ISCSI_LOGOUT_REQUEST {
> - UINT8 OpCode;
> - UINT8 ReasonCode;
> - UINT16 Reserved1;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT32 Reserved2[2];
> - UINT32 InitiatorTaskTag;
> - UINT16 Cid;
> - UINT16 Reserved3;
> - UINT32 CmdSN;
> - UINT32 ExpStatSN;
> - UINT32 Reserved4[4];
> -} ISCSI_LOGOUT_REQUEST;
> -
> -#define ISCSI_LOGOUT_RESPONSE_SESSION_CLOSED_SUCCESS 0
> -#define ISCSI_LOGOUT_RESPONSE_CID_NOT_FOUND 1
> -#define ISCSI_LOGOUT_RESPONSE_RECOVERY_NOT_SUPPORTED 2
> -#define ISCSI_LOGOUT_RESPONSE_CLEANUP_FAILED 3
> -
> -///
> -/// Logout Response
> -///
> -typedef struct _ISCSI_LOGOUT_RESPONSE {
> - UINT8 OpCode;
> - UINT8 Reserved1;
> - UINT8 Response;
> - UINT8 Reserved2;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT32 Reserved3[2];
> - UINT32 InitiatorTaskTag;
> - UINT32 Reserved4;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT32 Reserved5;
> - UINT16 Time2Wait;
> - UINT16 Time2Retain;
> - UINT32 Reserved6;
> -} ISCSI_LOGOUT_RESPONSE;
> -
> -#define ISCSI_SNACK_REQUEST_TYPE_DATA_OR_R2T 0
> -#define ISCSI_SNACK_REQUEST_TYPE_STATUS 1
> -#define ISCSI_SNACK_REQUEST_TYPE_DATA_ACK 2
> -#define ISCSI_SNACK_REQUEST_TYPE_RDATA 3
> -
> -///
> -/// SNACK Request
> -///
> -typedef struct _ISCSI_SNACK_REQUEST {
> - UINT8 OpCode;
> - UINT8 Type;
> - UINT16 Reserved1;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 TargetTransferTag;
> - UINT32 Reserved2;
> - UINT32 ExpStatSN;
> - UINT32 Reserved[2];
> - UINT32 BegRun;
> - UINT32 RunLength;
> -} ISCSI_SNACK_REQUEST;
> -
> -///
> -/// Reject
> -///
> -typedef struct _ISCSI_REJECT {
> - UINT8 OpCode;
> - UINT8 Reserved1;
> - UINT8 Reason;
> - UINT8 Reserved2;
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT32 Reserved3[2];
> - UINT32 InitiatorTaskTag;
> - UINT32 Reserved4;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT32 DataSN;
> - UINT32 Reserved5[2];
> -} ISCSI_REJECT;
> -
> -///
> -/// NOP-Out
> -///
> -typedef struct _ISCSI_NOP_OUT {
> - UINT8 OpCode;
> - UINT8 Reserved1[3];
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 TargetTransferTag;
> - UINT32 CmdSN;
> - UINT32 ExpStatSN;
> - UINT32 Reserved2[4];
> -} ISCSI_NOP_OUT;
> -
> -///
> -/// NOP-In
> -///
> -typedef struct _ISCSI_NOP_IN {
> - UINT8 OpCode;
> - UINT8 Reserved1[3];
> - UINT8 TotalAHSLength;
> - UINT8 DataSegmentLength[3];
> - UINT8 Lun[8];
> - UINT32 InitiatorTaskTag;
> - UINT32 TargetTransferTag;
> - UINT32 StatSN;
> - UINT32 ExpCmdSN;
> - UINT32 MaxCmdSN;
> - UINT32 Reserved2[3];
> -} ISCSI_NOP_IN;
> -
> -#define ISCSI_SECURITY_NEGOTIATION 0
> -#define ISCSI_LOGIN_OPERATIONAL_NEGOTIATION 1
> -#define ISCSI_FULL_FEATURE_PHASE 3
> -
> -typedef enum {
> - IScsiDigestNone,
> - IScsiDigestCRC32
> -} ISCSI_DIGEST_TYPE;
> -
> -typedef struct _ISCSI_XFER_CONTEXT {
> - UINT32 TargetTransferTag;
> - UINT32 Offset;
> - UINT32 DesiredLength;
> - UINT32 ExpDataSN;
> -} ISCSI_XFER_CONTEXT;
> -
> -typedef struct _ISCSI_IN_BUFFER_CONTEXT {
> - UINT8 *InData;
> - UINT32 InDataLen;
> -} ISCSI_IN_BUFFER_CONTEXT;
> -
> -typedef struct _ISCSI_TCB {
> - LIST_ENTRY Link;
> -
> - BOOLEAN SoFarInOrder;
> - UINT32 ExpDataSN;
> - BOOLEAN FbitReceived;
> - BOOLEAN StatusXferd;
> - UINT32 ActiveR2Ts;
> - UINT32 Response;
> - CHAR8 *Reason;
> - UINT32 InitiatorTaskTag;
> - UINT32 CmdSN;
> - UINT32 SNACKTag;
> -
> - ISCSI_XFER_CONTEXT XferContext;
> -
> - ISCSI_CONNECTION *Conn;
> -} ISCSI_TCB;
> -
> -typedef struct _ISCSI_KEY_VALUE_PAIR {
> - LIST_ENTRY List;
> -
> - CHAR8 *Key;
> - CHAR8 *Value;
> -} ISCSI_KEY_VALUE_PAIR;
> -
> -/**
> - Attach the iSCSI connection to the iSCSI session.
> -
> - @param[in, out] Session The iSCSI session.
> - @param[in, out] Conn The iSCSI connection.
> -**/
> -VOID
> -IScsiAttatchConnection (
> - IN OUT ISCSI_SESSION *Session,
> - IN OUT ISCSI_CONNECTION *Conn
> - );
> -
> -/**
> - Detach the iSCSI connection from the session it belongs to.
> -
> - @param[in, out] Conn The iSCSI connection.
> -**/
> -VOID
> -IScsiDetatchConnection (
> - IN OUT ISCSI_CONNECTION *Conn
> - );
> -
> -/**
> - This function does the iSCSI connection login.
> -
> - @param[in, out] Conn The iSCSI connection to login.
> -
> - @retval EFI_SUCCESS The iSCSI connection is logged into the iSCSI target.
> - @retval EFI_TIMEOUT Timeout happened during the login procedure.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiConnLogin (
> - IN OUT ISCSI_CONNECTION *Conn
> - );
> -
> -/**
> - Create a TCP connection for the iSCSI session.
> -
> - @param[in] Private The iSCSI driver data.
> - @param[in] Session Maximum CmdSN from the target.
> -
> - @return The newly created iSCSI connection.
> -**/
> -ISCSI_CONNECTION *
> -IScsiCreateConnection (
> - IN ISCSI_DRIVER_DATA *Private,
> - IN ISCSI_SESSION *Session
> - );
> -
> -/**
> - Destroy an iSCSI connection.
> -
> - @param[in] Conn The connection to destroy.
> -**/
> -VOID
> -IScsiDestroyConnection (
> - IN ISCSI_CONNECTION *Conn
> - );
> -
> -/**
> - Login the iSCSI session.
> -
> - @param[in] Private The iSCSI driver data.
> -
> - @retval EFI_SUCCESS The iSCSI session login procedure finished.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NO_MEDIA There was a media error.
> - @retval Others Other errors as indicated.
> -
> -**/
> -EFI_STATUS
> -IScsiSessionLogin (
> - IN ISCSI_DRIVER_DATA *Private
> - );
> -
> -/**
> - Build and send the iSCSI login request to the iSCSI target according to
> - the current login stage.
> -
> - @param[in] Conn The connection in the iSCSI login phase.
> -
> - @retval EFI_SUCCESS The iSCSI login request PDU is built and sent on this
> - connection.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_DEVICE_ERROR Some kind of device error happened.
> -**/
> -EFI_STATUS
> -IScsiSendLoginReq (
> - IN ISCSI_CONNECTION *Conn
> - );
> -
> -/**
> - Receive and process the iSCSI login response.
> -
> - @param[in] Conn The connection in the iSCSI login phase.
> -
> - @retval EFI_SUCCESS The iSCSI login response PDU is received and
> processed.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiReceiveLoginRsp (
> - IN ISCSI_CONNECTION *Conn
> - );
> -
> -/**
> - Add an iSCSI key-value pair as a string into the data segment of the Login
> Request PDU.
> - The DataSegmentLength and the actual size of the net buffer containing this
> PDU will be
> - updated.
> -
> - @param[in, out] Pdu The iSCSI PDU whose data segment the key-value
> pair will
> - be added to.
> - @param[in] Key The key name string.
> - @param[in] Value The value string.
> -
> - @retval EFI_SUCCESS The key-valu pair is added to the PDU's
> datasegment and
> - the correspondence length fields are updated.
> - @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to
> add the key-value
> - pair.
> -**/
> -EFI_STATUS
> -IScsiAddKeyValuePair (
> - IN OUT NET_BUF *Pdu,
> - IN CHAR8 *Key,
> - IN CHAR8 *Value
> - );
> -
> -/**
> - Prepare the iSCSI login request to be sent according to the current login status.
> -
> - @param[in, out] Conn The connection in the iSCSI login phase.
> -
> - @return The pointer to the net buffer containing the iSCSI login request built.
> - @retval Others Other errors as indicated.
> -**/
> -NET_BUF *
> -IScsiPrepareLoginReq (
> - IN OUT ISCSI_CONNECTION *Conn
> - );
> -
> -/**
> - Process the iSCSI Login Response.
> -
> - @param[in, out] Conn The connection on which the iSCSI login response is
> received.
> - @param[in, out] Pdu The iSCSI login response PDU.
> -
> - @retval EFI_SUCCESS The iSCSI login response PDU is processed and all
> check are passed.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
> - @retval EFI_MEDIA_CHANGED Target is redirected.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiProcessLoginRsp (
> - IN OUT ISCSI_CONNECTION *Conn,
> - IN OUT NET_BUF *Pdu
> - );
> -
> -/**
> - Updated the target information according the data received in the iSCSI
> - login response with an target redirection status.
> -
> - @param[in, out] Session The iSCSI session.
> - @param[in] Data The data segment which should contain the
> - TargetAddress key-value list.
> - @param[in] Len Length of the data.
> -
> - @retval EFI_SUCCESS The target address is updated.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NOT_FOUND The TargetAddress key is not found.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiUpdateTargetAddress (
> - IN OUT ISCSI_SESSION *Session,
> - IN CHAR8 *Data,
> - IN UINT32 Len
> - );
> -
> -/**
> - The callback function to free the net buffer list.
> -
> - @param[in] Arg The opaque parameter.
> -**/
> -VOID
> -EFIAPI
> -IScsiFreeNbufList (
> - VOID *Arg
> - );
> -
> -/**
> - Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI PDU
> header and
> - an optional data segment. The two parts will be put into two blocks of buffers
> in the
> - net buffer. The digest check will be conducted in this function if needed and
> the digests
> - will be trimmed from the PDU buffer.
> -
> - @param[in] Conn The iSCSI connection to receive data from.
> - @param[out] Pdu The received iSCSI pdu.
> - @param[in] Context The context used to describe information on the caller
> provided
> - buffer to receive data segment of the iSCSI pdu, it's optional.
> - @param[in] HeaderDigest Whether there will be header digest received.
> - @param[in] DataDigest Whether there will be data digest.
> - @param[in] TimeoutEvent The timeout event, it's optional.
> -
> - @retval EFI_SUCCESS An iSCSI pdu is received.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiReceivePdu (
> - IN ISCSI_CONNECTION *Conn,
> - OUT NET_BUF **Pdu,
> - IN ISCSI_IN_BUFFER_CONTEXT *Context, OPTIONAL
> - IN BOOLEAN HeaderDigest,
> - IN BOOLEAN DataDigest,
> - IN EFI_EVENT TimeoutEvent OPTIONAL
> - );
> -
> -/**
> - Check and get the result of the prameter negotiation.
> -
> - @param[in, out] Conn The connection in iSCSI login.
> -
> - @retval EFI_SUCCESS The parmeter check is passed and negotiation is
> finished.
> - @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> -**/
> -EFI_STATUS
> -IScsiCheckOpParams (
> - IN OUT ISCSI_CONNECTION *Conn
> - );
> -
> -/**
> - Fill the oprational prameters.
> -
> - @param[in] Conn The connection in iSCSI login.
> - @param[in, out] Pdu The iSCSI login request PDU to fill the parameters.
> -
> - @retval EFI_SUCCESS The parmeters are filled into the iSCSI login request
> PDU.
> -**/
> -EFI_STATUS
> -IScsiFillOpParams (
> - IN ISCSI_CONNECTION *Conn,
> - IN OUT NET_BUF *Pdu
> - );
> -
> -/**
> - Pad the iSCSI AHS or data segment to an integer number of 4 byte words.
> -
> - @param[in, out] Pdu The iSCSI pdu which contains segments to pad.
> - @param[in] Len The length of the last semgnet in the PDU.
> -
> - @retval EFI_SUCCESS The segment is padded or no need to pad it.
> - @retval EFI_OUT_OF_RESOURCES There is not enough remaining free space
> to add the
> - padding bytes.
> -**/
> -EFI_STATUS
> -IScsiPadSegment (
> - IN OUT NET_BUF *Pdu,
> - IN UINT32 Len
> - );
> -
> -/**
> - Build a key-value list from the data segment.
> -
> - @param[in] Data The data segment containing the key-value pairs.
> - @param[in] Len Length of the data segment.
> -
> - @return The key-value list.
> - @retval NULL Other errors as indicated.
> -**/
> -LIST_ENTRY *
> -IScsiBuildKeyValueList (
> - IN CHAR8 *Data,
> - IN UINT32 Len
> - );
> -
> -/**
> - Get the value string by the key name from the key-value list. If found,
> - the key-value entry will be removed from the list.
> -
> - @param[in, out] KeyValueList The key-value list.
> - @param[in] Key The key name to find.
> -
> - @return The value string.
> -**/
> -CHAR8 *
> -IScsiGetValueByKeyFromList (
> - IN OUT LIST_ENTRY *KeyValueList,
> - IN CHAR8 *Key
> - );
> -
> -/**
> - Free the key-value list.
> -
> - @param[in] KeyValueList The key-value list.
> -**/
> -VOID
> -IScsiFreeKeyValueList (
> - IN LIST_ENTRY *KeyValueList
> - );
> -
> -/**
> - Normalize the iSCSI name according to RFC.
> -
> - @param[in, out] Name The iSCSI name.
> - @param[in] Len length of the iSCSI name.
> -
> - @retval EFI_SUCCESS The iSCSI name is valid and normalized.
> - @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in the
> IQN format.
> -**/
> -EFI_STATUS
> -IScsiNormalizeName (
> - IN OUT CHAR8 *Name,
> - IN UINTN Len
> - );
> -
> -/**
> - Execute the SCSI command issued through the EXT SCSI PASS THRU protocol.
> -
> - @param[in] PassThru The EXT SCSI PASS THRU protocol.
> - @param[in] Target The target ID.
> - @param[in] Lun The LUN.
> - @param[in, out] Packet The request packet containing IO request, SCSI
> command
> - buffer and buffers to read/write.
> -
> - @retval EFI_SUCCES The SCSI command is executed and the result is
> updated to
> - the Packet.
> - @retval EFI_DEVICE_ERROR Session state was not as required.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval EFI_NOT_READY The target can not accept new commands.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -IScsiExecuteScsiCommand (
> - IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru,
> - IN UINT8 *Target,
> - IN UINT64 Lun,
> - IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
> - );
> -
> -/**
> - Reinstate the session on some error.
> -
> - @param[in, out] Private The iSCSI driver data.
> -
> - @retval EFI_SUCCES The session is reinstated from some error.
> - @retval Other Reinstatement failed.
> -**/
> -EFI_STATUS
> -IScsiSessionReinstatement (
> - IN OUT ISCSI_DRIVER_DATA *Private
> - );
> -
> -/**
> - Initialize some session parameters before login.
> -
> - @param[in, out] Session The iSCSI session.
> - @param[in] Recovery Whether the request is from a fresh new start or
> recovery.
> -**/
> -VOID
> -IScsiSessionInit (
> - IN OUT ISCSI_SESSION *Session,
> - IN BOOLEAN Recovery
> - );
> -
> -/**
> - Abort the iSCSI session, that is, reset all the connection and free the
> - resources.
> -
> - @param[in, out] Session The iSCSI session.
> -
> - @retval EFI_SUCCES The session is aborted.
> -**/
> -EFI_STATUS
> -IScsiSessionAbort (
> - IN OUT ISCSI_SESSION *Session
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h
> deleted file mode 100644
> index 9e0f1e0f02c2..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiTcp4Io.h
> +++ /dev/null
> @@ -1,142 +0,0 @@
> -/** @file
> - iSCSI Tcp4 IO related definitions.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _ISCSI_TCP4_IO_H_
> -#define _ISCSI_TCP4_IO_H_
> -
> -#include <Library/NetLib.h>
> -#include <Protocol/Tcp4.h>
> -
> -typedef struct _TCP4_IO_CONFIG_DATA {
> - EFI_IPv4_ADDRESS LocalIp;
> - EFI_IPv4_ADDRESS SubnetMask;
> - EFI_IPv4_ADDRESS Gateway;
> -
> - EFI_IPv4_ADDRESS RemoteIp;
> - UINT16 RemotePort;
> -} TCP4_IO_CONFIG_DATA;
> -
> -typedef struct _TCP4_IO {
> - EFI_HANDLE Image;
> - EFI_HANDLE Controller;
> -
> - EFI_HANDLE Handle;
> - EFI_TCP4_PROTOCOL *Tcp4;
> -
> - EFI_TCP4_CONNECTION_TOKEN ConnToken;
> - EFI_TCP4_IO_TOKEN TxToken;
> - EFI_TCP4_IO_TOKEN RxToken;
> - EFI_TCP4_CLOSE_TOKEN CloseToken;
> -
> - BOOLEAN IsConnDone;
> - BOOLEAN IsTxDone;
> - BOOLEAN IsRxDone;
> - BOOLEAN IsCloseDone;
> -} TCP4_IO;
> -
> -/**
> - Create a TCP socket with the specified configuration data.
> -
> - @param[in] Image The handle of the driver image.
> - @param[in] Controller The handle of the controller.
> - @param[in] ConfigData The Tcp4 configuration data.
> - @param[in] Tcp4Io The Tcp4Io.
> -
> - @retval EFI_SUCCESS The TCP socket is created and configured.
> - @retval Others Failed to create the TCP socket or configure it.
> -**/
> -EFI_STATUS
> -Tcp4IoCreateSocket (
> - IN EFI_HANDLE Image,
> - IN EFI_HANDLE Controller,
> - IN TCP4_IO_CONFIG_DATA *ConfigData,
> - IN TCP4_IO *Tcp4Io
> - );
> -
> -/**
> - Destroy the socket.
> -
> - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyeds.
> -**/
> -VOID
> -Tcp4IoDestroySocket (
> - IN TCP4_IO *Tcp4Io
> - );
> -
> -/**
> - Connect to the other endpoint of the TCP socket.
> -
> - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket.
> - @param[in] Timeout The time to wait for connection done.
> -
> - @retval EFI_SUCCESS Connect to the other endpoint of the TCP socket
> successfully.
> - @retval EFI_TIMEOUT Failed to connect to the other endpoint of the TCP
> socket in the specified time period.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoConnect (
> - IN OUT TCP4_IO *Tcp4Io,
> - IN EFI_EVENT Timeout
> - );
> -
> -/**
> - Reset the socket.
> -
> - @param[in, out] Tcp4Io The Tcp4Io wrapping the TCP socket.
> -**/
> -VOID
> -Tcp4IoReset (
> - IN OUT TCP4_IO *Tcp4Io
> - );
> -
> -/**
> - Transmit the Packet to the other endpoint of the socket.
> -
> - @param[in] Tcp4Io The Tcp4Io wrapping the TCP socket.
> - @param[in] Packet The packet to transmit.
> -
> - @retval EFI_SUCCESS The packet is trasmitted.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoTransmit (
> - IN TCP4_IO *Tcp4Io,
> - IN NET_BUF *Packet
> - );
> -
> -/**
> - Receive data from the socket.
> -
> - @param[in] Tcp4Io The Tcp4Io which wraps the socket to be destroyed.
> - @param[in] Packet The buffer to hold the data copy from the soket rx
> buffer.
> - @param[in] AsyncMode Is this receive asyncronous or not.
> - @param[in] Timeout The time to wait for receiving the amount of data
> the Packet
> - can hold.
> -
> - @retval EFI_SUCCESS The required amount of data is received from the
> socket.
> - @retval EFI_OUT_OF_RESOURCES Failed to allocate momery.
> - @retval EFI_TIMEOUT Failed to receive the required amount of data in
> the
> - specified time period.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -Tcp4IoReceive (
> - IN TCP4_IO *Tcp4Io,
> - IN NET_BUF *Packet,
> - IN BOOLEAN AsyncMode,
> - IN EFI_EVENT Timeout
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h
> b/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h
> deleted file mode 100644
> index 1541b2d8ece1..000000000000
> --- a/MdeModulePkg/Universal/Network/IScsiDxe/Md5.h
> +++ /dev/null
> @@ -1,80 +0,0 @@
> -/** @file
> - Header file for Md5.
> -
> -Copyright (c) 2004 - 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.
> -
> -**/
> -
> -#ifndef _MD5_H_
> -#define _MD5_H_
> -
> -#include <Uefi.h>
> -#include <Library/BaseLib.h>
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/NetLib.h>
> -
> -#define MD5_HASHSIZE 16
> -
> -typedef struct _MD5_CTX {
> - EFI_STATUS Status;
> - UINT64 Length;
> - UINT32 States[MD5_HASHSIZE / sizeof (UINT32)];
> - UINT8 M[64];
> - UINTN Count;
> -} MD5_CTX;
> -
> -/**
> - Initialize four 32-bits chaining variables and use them to do the Md5 transform.
> -
> - @param[out] Md5Ctx The data structure of Md5.
> -
> - @retval EFI_SUCCESS Initialization is ok.
> -**/
> -EFI_STATUS
> -MD5Init (
> - OUT MD5_CTX *Md5Ctx
> - );
> -
> -/**
> - the external interface of Md5 algorithm
> -
> - @param[in, out] Md5Ctx The data structure of storing the original data
> - segment and the final result.
> - @param[in] Data The data wanted to be transformed.
> - @param[in] DataLen The length of data.
> -
> - @retval EFI_SUCCESS The transform is ok.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -MD5Update (
> - IN OUT MD5_CTX *Md5Ctx,
> - IN VOID *Data,
> - IN UINTN DataLen
> - );
> -
> -/**
> - Accumulate the MD5 value of every data segment and generate the finial
> - result according to MD5 algorithm.
> -
> - @param[in, out] Md5Ctx The data structure of storing the original data
> - segment and the final result.
> - @param[out] HashVal The final 128-bits output.
> -
> - @retval EFI_SUCCESS The transform is ok.
> - @retval Others Other errors as indicated.
> -**/
> -EFI_STATUS
> -MD5Final (
> - IN OUT MD5_CTX *Md5Ctx,
> - OUT UINT8 *HashVal
> - );
> -
> -#endif
> --
> 2.19.1.windows.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 4/6] NetworkPkg: Remove some clarification from IScsiDxe.inf
2018-12-20 1:41 [PATCH v2 0/6] Delete TCP, PXE, iSCSI driver in MdeModulePkg Siyuan Fu
` (2 preceding siblings ...)
2018-12-20 1:41 ` [PATCH v2 3/6] MdeModulePkg: Delete IScsiDxe in MdeModulePkg Siyuan Fu
@ 2018-12-20 1:41 ` Siyuan Fu
2018-12-20 1:41 ` [PATCH v2 5/6] MdeModulePkg: Delete UefiPxeBcDxe in MdeModulePkg Siyuan Fu
2018-12-20 1:41 ` [PATCH v2 6/6] NetworkPkg: Remove some clarification from UefiPxeBcDxe.inf Siyuan Fu
5 siblings, 0 replies; 12+ messages in thread
From: Siyuan Fu @ 2018-12-20 1:41 UTC (permalink / raw)
To: edk2-devel; +Cc: Jiaxin Wu
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1278
This patch is to remove the clarification about usage/difference between
those drivers in MdeModulePkg and NetworkPkg, since the MdeModulePkg one
have been deleted.
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.
NetworkPkg/IScsiDxe/IScsiDxe.inf | 10 ----------
1 file changed, 10 deletions(-)
diff --git a/NetworkPkg/IScsiDxe/IScsiDxe.inf b/NetworkPkg/IScsiDxe/IScsiDxe.inf
index 195dc191250f..bdf1313aa957 100644
--- a/NetworkPkg/IScsiDxe/IScsiDxe.inf
+++ b/NetworkPkg/IScsiDxe/IScsiDxe.inf
@@ -4,16 +4,6 @@
# The iSCSI driver provides iSCSI service in the preboot environment and supports
# booting over iSCSI. This driver supports both IPv4 and IPv6 network stack.
#
-# Notes:
-# 1) This driver can't co-work with the IScsiDxe driver in MdeModulePkg.
-# 2) This driver includes more bug fixes and supports more features (e.g. IPv6, Dns
-# support for target URL configuration, iSCSI keyword support) than the IscsiDxe
-# driver in MdeModulePkg. So, we recommend using this driver even though both of
-# them can be used.
-# 3) This driver depends on OpenSSL. To use this driver, please follow the
-# instructions found in the file "OpenSSL-HOWTO.txt" located in
-# CryptoPkg\Library\OpensslLib to enable the OpenSSL building first.
-#
# Copyright (c) 2004 - 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
--
2.19.1.windows.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 5/6] MdeModulePkg: Delete UefiPxeBcDxe in MdeModulePkg.
2018-12-20 1:41 [PATCH v2 0/6] Delete TCP, PXE, iSCSI driver in MdeModulePkg Siyuan Fu
` (3 preceding siblings ...)
2018-12-20 1:41 ` [PATCH v2 4/6] NetworkPkg: Remove some clarification from IScsiDxe.inf Siyuan Fu
@ 2018-12-20 1:41 ` 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
5 siblings, 1 reply; 12+ messages in thread
From: Siyuan Fu @ 2018-12-20 1:41 UTC (permalink / raw)
To: edk2-devel; +Cc: Jian J Wang, Hao Wu, Ruiyu Ni, Star Zeng, Jiaxin Wu
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1278
This patch is to delete the UefiPxeBcDxe driver in MdeModulePkg. The
driver will not be maintained and can't co-work with the dual-stack
UefiPxeBcDxe in NetworkPkg.
People should use below NetworkPkg drivers instead:
NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.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/UefiPxeBcDxe/ComponentName.c | 365 ---
MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c | 1999 -------------
MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c | 665 -----
MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c | 2989 --------------------
MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c | 454 ---
MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c | 221 --
MdeModulePkg/MdeModulePkg.dsc | 1 -
MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h | 502 ----
MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h | 102 -
MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h | 189 --
MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h | 137 -
MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h | 134 -
MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni | 25 -
| 20 -
MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf | 102 -
15 files changed, 7905 deletions(-)
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c
deleted file mode 100644
index a085ef61f341..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c
+++ /dev/null
@@ -1,365 +0,0 @@
-/** @file
-
-Copyright (c) 2007 - 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.
-
-**/
-
-
-#include "PxeBcImpl.h"
-
-//
-// EFI Component Name Functions
-//
-/**
- 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
-PxeBcComponentNameGetDriverName (
- 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
-PxeBcComponentNameGetControllerName (
- 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 gPxeBcComponentName = {
- PxeBcComponentNameGetDriverName,
- PxeBcComponentNameGetControllerName,
- "eng"
-};
-
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2 = {
- (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) PxeBcComponentNameGetDriverName,
- (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) PxeBcComponentNameGetControllerName,
- "en"
-};
-
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPxeBcDriverNameTable[] = {
- {
- "eng;en",
- L"UEFI PXE Base Code Driver"
- },
- {
- NULL,
- NULL
- }
-};
-
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPxeBcControllerNameTable[] = {
- {
- "eng;en",
- L"PXE Controller"
- },
- {
- NULL,
- 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
-PxeBcComponentNameGetDriverName (
- IN EFI_COMPONENT_NAME_PROTOCOL * This,
- IN CHAR8 *Language,
- OUT CHAR16 **DriverName
- )
-{
- return LookupUnicodeString2 (
- Language,
- This->SupportedLanguages,
- mPxeBcDriverNameTable,
- DriverName,
- (BOOLEAN)(This == &gPxeBcComponentName)
- );
-}
-
-/**
- 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
-PxeBcComponentNameGetControllerName (
- IN EFI_COMPONENT_NAME_PROTOCOL * This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_HANDLE ChildHandle OPTIONAL,
- IN CHAR8 *Language,
- OUT CHAR16 **ControllerName
- )
-{
- EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;
- EFI_HANDLE NicHandle;
- EFI_STATUS Status;
-
- if (ControllerHandle == NULL || ChildHandle != NULL) {
- return EFI_UNSUPPORTED;
- }
-
- NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);
- if (NicHandle == NULL) {
- NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);
-
- if (NicHandle == NULL) {
- NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);
-
- if (NicHandle == NULL) {
- NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp4ProtocolGuid);
-
- if (NicHandle == NULL) {
- NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid);
-
- if (NicHandle == NULL) {
- return EFI_UNSUPPORTED;
- }
- }
- }
- }
- }
-
- Status = gBS->OpenProtocol (
- NicHandle,
- &gEfiPxeBaseCodeProtocolGuid,
- (VOID **) &PxeBc,
- NULL,
- NULL,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- return LookupUnicodeString2 (
- Language,
- This->SupportedLanguages,
- mPxeBcControllerNameTable,
- ControllerName,
- (BOOLEAN)(This == &gPxeBcComponentName)
- );
-}
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c
deleted file mode 100644
index f7b975f2997f..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c
+++ /dev/null
@@ -1,1999 +0,0 @@
-/** @file
- Support for PxeBc dhcp functions.
-
-Copyright (c) 2013, Red Hat, Inc.
-Copyright (c) 2007 - 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.
-
-**/
-
-
-#include "PxeBcImpl.h"
-
-//
-// This is a map from the interested DHCP4 option tags' index to the tag value.
-//
-UINT8 mInterestedDhcp4Tags[PXEBC_DHCP4_TAG_INDEX_MAX] = {
- DHCP4_TAG_BOOTFILE_LEN,
- DHCP4_TAG_VENDOR,
- DHCP4_TAG_OVERLOAD,
- DHCP4_TAG_MSG_TYPE,
- DHCP4_TAG_SERVER_ID,
- DHCP4_TAG_VENDOR_CLASS_ID,
- DHCP4_TAG_BOOTFILE
-};
-
-
-/**
- This function initialize the DHCP4 message instance.
-
- This function will pad each item of dhcp4 message packet.
-
- @param Seed Pointer to the message instance of the DHCP4 packet.
- @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance.
-
-**/
-VOID
-PxeBcInitSeedPacket (
- IN EFI_DHCP4_PACKET *Seed,
- IN EFI_UDP4_PROTOCOL *Udp4
- )
-{
- EFI_SIMPLE_NETWORK_MODE Mode;
- EFI_DHCP4_HEADER *Header;
-
- Udp4->GetModeData (Udp4, NULL, NULL, NULL, &Mode);
-
- Seed->Size = sizeof (EFI_DHCP4_PACKET);
- Seed->Length = sizeof (Seed->Dhcp4);
-
- Header = &Seed->Dhcp4.Header;
-
- ZeroMem (Header, sizeof (EFI_DHCP4_HEADER));
- Header->OpCode = PXEBC_DHCP4_OPCODE_REQUEST;
- Header->HwType = Mode.IfType;
- Header->HwAddrLen = (UINT8) Mode.HwAddressSize;
- CopyMem (Header->ClientHwAddr, &Mode.CurrentAddress, Header->HwAddrLen);
-
- Seed->Dhcp4.Magik = PXEBC_DHCP4_MAGIC;
- Seed->Dhcp4.Option[0] = DHCP4_TAG_EOP;
-}
-
-
-/**
- Copy the DCHP4 packet from srouce to destination.
-
- @param[in] Dst Pointer to the cache buffer for DHCPv4 packet.
- @param[in] Src Pointer to the DHCPv4 packet to be cached.
-
- @retval EFI_SUCCESS Packet is copied.
- @retval EFI_BUFFER_TOO_SMALL Cache buffer is not big enough to hold the packet.
-
-**/
-EFI_STATUS
-PxeBcCopyEfiDhcp4Packet (
- IN EFI_DHCP4_PACKET *Dst,
- IN EFI_DHCP4_PACKET *Src
- )
-{
- if (Dst->Size < Src->Length) {
- return EFI_BUFFER_TOO_SMALL;
- }
-
- CopyMem (&Dst->Dhcp4, &Src->Dhcp4, Src->Length);
- Dst->Length = Src->Length;
- return EFI_SUCCESS;
-}
-
-
-/**
- Copy the dhcp4 packet to the PxeBc private data and parse the dhcp4 packet.
-
- @param Private Pointer to PxeBc private data.
- @param OfferIndex Index of cached packets as complements of pxe mode data,
- the index is maximum offer number.
-
- @retval EFI_SUCCESS Cache and parse the packet successfully.
- @retval EFI_BUFFER_TOO_SMALL Cache buffer is not big enough to hold the packet.
-
-**/
-EFI_STATUS
-PxeBcCopyProxyOffer (
- IN PXEBC_PRIVATE_DATA *Private,
- IN UINT32 OfferIndex
- )
-{
- EFI_PXE_BASE_CODE_MODE *Mode;
- EFI_DHCP4_PACKET *Offer;
- EFI_STATUS Status;
-
- ASSERT (OfferIndex < Private->NumOffers);
- ASSERT (OfferIndex < PXEBC_MAX_OFFER_NUM);
-
- Mode = Private->PxeBc.Mode;
- Offer = &Private->Dhcp4Offers[OfferIndex].Packet.Offer;
-
- Status = PxeBcCopyEfiDhcp4Packet (&Private->ProxyOffer.Packet.Offer, Offer);
- if (EFI_ERROR(Status)) {
- return Status;
- }
- CopyMem (&Mode->ProxyOffer, &Offer->Dhcp4, Offer->Length);
- Mode->ProxyOfferReceived = TRUE;
-
- PxeBcParseCachedDhcpPacket (&Private->ProxyOffer);
- return EFI_SUCCESS;
-}
-
-
-/**
- Parse the cached dhcp packet.
-
- @param CachedPacket Pointer to cached dhcp packet.
-
- @retval TRUE Succeed to parse and validation.
- @retval FALSE Fail to parse or validation.
-
-**/
-BOOLEAN
-PxeBcParseCachedDhcpPacket (
- IN PXEBC_CACHED_DHCP4_PACKET *CachedPacket
- )
-{
- EFI_DHCP4_PACKET *Offer;
- EFI_DHCP4_PACKET_OPTION **Options;
- EFI_DHCP4_PACKET_OPTION *Option;
- UINT8 OfferType;
- UINTN Index;
- UINT8 *Ptr8;
-
- CachedPacket->IsPxeOffer = FALSE;
- ZeroMem (CachedPacket->Dhcp4Option, sizeof (CachedPacket->Dhcp4Option));
- ZeroMem (&CachedPacket->PxeVendorOption, sizeof (CachedPacket->PxeVendorOption));
-
- Offer = &CachedPacket->Packet.Offer;
- Options = CachedPacket->Dhcp4Option;
-
- //
- // Parse interested dhcp options and store their pointers in CachedPacket->Dhcp4Option.
- // First, try to parse DHCPv4 options from the DHCP optional parameters field.
- //
- for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) {
- Options[Index] = PxeBcParseExtendOptions (
- Offer->Dhcp4.Option,
- GET_OPTION_BUFFER_LEN (Offer),
- mInterestedDhcp4Tags[Index]
- );
- }
- //
- // Second, Check if bootfilename and serverhostname is overloaded to carry DHCP options refers to rfc-2132.
- // If yes, try to parse options from the BootFileName field, then ServerName field.
- //
- Option = Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD];
- if (Option != NULL) {
- if ((Option->Data[0] & PXEBC_DHCP4_OVERLOAD_FILE) != 0) {
- for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) {
- if (Options[Index] == NULL) {
- Options[Index] = PxeBcParseExtendOptions (
- (UINT8 *) Offer->Dhcp4.Header.BootFileName,
- sizeof (Offer->Dhcp4.Header.BootFileName),
- mInterestedDhcp4Tags[Index]
- );
- }
- }
- }
- if ((Option->Data[0] & PXEBC_DHCP4_OVERLOAD_SERVER_NAME) != 0) {
- for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) {
- if (Options[Index] == NULL) {
- Options[Index] = PxeBcParseExtendOptions (
- (UINT8 *) Offer->Dhcp4.Header.ServerName,
- sizeof (Offer->Dhcp4.Header.ServerName),
- mInterestedDhcp4Tags[Index]
- );
- }
- }
- }
- }
-
- //
- // Check whether is an offer with PXEClient or not.
- //
- Option = Options[PXEBC_DHCP4_TAG_INDEX_CLASS_ID];
- if ((Option != NULL) && (Option->Length >= 9) &&
- (CompareMem (Option->Data, DEFAULT_CLASS_ID_DATA, 9) == 0)) {
-
- CachedPacket->IsPxeOffer = TRUE;
- }
-
- //
- // Parse pxe vendor options and store their content/pointers in CachedPacket->PxeVendorOption.
- //
- Option = Options[PXEBC_DHCP4_TAG_INDEX_VENDOR];
- if (CachedPacket->IsPxeOffer && (Option != NULL)) {
-
- if (!PxeBcParseVendorOptions (Option, &CachedPacket->PxeVendorOption)) {
- return FALSE;
- }
- }
-
-
- //
- // Parse PXE boot file name:
- // According to PXE spec, boot file name should be read from DHCP option 67 (bootfile name) if present.
- // Otherwise, read from boot file field in DHCP header.
- //
- if (Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) {
- //
- // RFC 2132, Section 9.5 does not strictly state Bootfile name (option 67) is null
- // terminated string. So force to append null terminated character at the end of string.
- //
- Ptr8 = (UINT8*)&Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Data[0];
- Ptr8 += Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Length;
- if (*(Ptr8 - 1) != '\0') {
- *Ptr8 = '\0';
- }
- } else if (Offer->Dhcp4.Header.BootFileName[0] != 0) {
- //
- // If the bootfile is not present and bootfilename is present in dhcp packet, just parse it.
- // And do not count dhcp option header, or else will destroy the serverhostname.
- //
- // Make sure "BootFileName" is not overloaded.
- //
- if (Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD] == NULL ||
- (Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD]->Data[0] & PXEBC_DHCP4_OVERLOAD_FILE) == 0) {
- Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] = (EFI_DHCP4_PACKET_OPTION *) (&Offer->Dhcp4.Header.BootFileName[0] -
- OFFSET_OF (EFI_DHCP4_PACKET_OPTION, Data[0]));
- }
- }
-
- //
- // Determine offer type of the dhcp packet.
- //
- Option = Options[PXEBC_DHCP4_TAG_INDEX_MSG_TYPE];
- if ((Option == NULL) || (Option->Data[0] == 0)) {
- //
- // It's a bootp offer
- //
- Option = CachedPacket->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE];
- if (Option == NULL) {
- //
- // bootp offer without bootfilename, discard it.
- //
- return FALSE;
- }
-
- OfferType = DHCP4_PACKET_TYPE_BOOTP;
-
- } else {
-
- if (IS_VALID_DISCOVER_VENDOR_OPTION (CachedPacket->PxeVendorOption.BitMap)) {
- //
- // It's a pxe10 offer with PXEClient and discover vendor option.
- //
- OfferType = DHCP4_PACKET_TYPE_PXE10;
- } else if (IS_VALID_MTFTP_VENDOR_OPTION (CachedPacket->PxeVendorOption.BitMap)) {
- //
- // It's a wfm11a offer with PXEClient and mtftp vendor option, and
- // return false since mtftp not supported currently.
- //
- return FALSE;
- } else {
- //
- // If the binl offer with only PXEClient.
- //
- OfferType = (UINT8) ((CachedPacket->IsPxeOffer) ? DHCP4_PACKET_TYPE_BINL : DHCP4_PACKET_TYPE_DHCP_ONLY);
- }
- }
-
- CachedPacket->OfferType = OfferType;
-
- return TRUE;
-}
-
-
-/**
- Offer dhcp service with a BINL dhcp offer.
-
- @param Private Pointer to PxeBc private data.
- @param Index Index of cached packets as complements of pxe mode data,
- the index is maximum offer number.
-
- @retval TRUE Offer the service successfully under priority BINL.
- @retval FALSE Boot Service failed, parse cached dhcp packet failed or this
- BINL ack cannot find options set or bootfile name specified.
-
-**/
-BOOLEAN
-PxeBcTryBinl (
- IN PXEBC_PRIVATE_DATA *Private,
- IN UINT32 Index
- )
-{
- EFI_DHCP4_PACKET *Offer;
- EFI_IP_ADDRESS ServerIp;
- EFI_STATUS Status;
- PXEBC_CACHED_DHCP4_PACKET *CachedPacket;
- EFI_DHCP4_PACKET *Reply;
-
- ASSERT (Index < PXEBC_MAX_OFFER_NUM);
- ASSERT (Private->Dhcp4Offers[Index].OfferType == DHCP4_PACKET_TYPE_BINL);
-
- Offer = &Private->Dhcp4Offers[Index].Packet.Offer;
-
- //
- // Use siaddr(next server) in DHCPOFFER packet header, if zero, use option 54(server identifier)
- // in DHCPOFFER packet.
- // (It does not comply with PXE Spec, Ver2.1)
- //
- if (EFI_IP4_EQUAL (&Offer->Dhcp4.Header.ServerAddr.Addr, &mZeroIp4Addr)) {
- CopyMem (
- &ServerIp.Addr[0],
- Private->Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]->Data,
- sizeof (EFI_IPv4_ADDRESS)
- );
- } else {
- CopyMem (
- &ServerIp.Addr[0],
- &Offer->Dhcp4.Header.ServerAddr,
- sizeof (EFI_IPv4_ADDRESS)
- );
- }
- if (ServerIp.Addr[0] == 0) {
- return FALSE;
- }
-
- CachedPacket = &Private->ProxyOffer;
- Reply = &CachedPacket->Packet.Offer;
-
- Status = PxeBcDiscvBootService (
- Private,
- 0,
- NULL,
- FALSE,
- &ServerIp,
- 0,
- NULL,
- FALSE,
- Reply
- );
- if (EFI_ERROR (Status)) {
- return FALSE;
- }
-
- if (!PxeBcParseCachedDhcpPacket (CachedPacket)) {
- return FALSE;
- }
-
- if ((CachedPacket->OfferType != DHCP4_PACKET_TYPE_PXE10) &&
- (CachedPacket->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] == NULL)) {
- //
- // This BINL ack doesn't have discovery options set or bootfile name
- // specified.
- //
- return FALSE;
- }
-
- Private->PxeBc.Mode->ProxyOfferReceived = TRUE;
- CopyMem (&Private->PxeBc.Mode->ProxyOffer, &Reply->Dhcp4, Reply->Length);
-
- return TRUE;
-}
-
-
-/**
- Offer dhcp service for each proxy with a BINL dhcp offer.
-
- @param Private Pointer to PxeBc private data
- @param OfferIndex Pointer to the index of cached packets as complements of
- pxe mode data, the index is maximum offer number.
-
- @return If there is no service needed offer return FALSE, otherwise TRUE.
-
-**/
-BOOLEAN
-PxeBcTryBinlProxy (
- IN PXEBC_PRIVATE_DATA *Private,
- OUT UINT32 *OfferIndex
- )
-{
- UINT32 Index;
-
- for (Index = 0; Index < Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]; Index++) {
-
- *OfferIndex = Private->BinlIndex[Index];
- //
- // Try this BINL proxy offer
- //
- if (PxeBcTryBinl (Private, *OfferIndex)) {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-
-/**
- This function is to check the selected proxy offer (include BINL dhcp offer and
- DHCP_ONLY offer ) and set the flag and copy the DHCP packets to the Pxe base code
- mode structure.
-
- @param Private Pointer to PxeBc private data.
-
- @retval EFI_SUCCESS Operational successful.
- @retval EFI_NO_RESPONSE Offer dhcp service failed.
- @retval EFI_BUFFER_TOO_SMALL Failed to copy the packet to Pxe base code mode.
-
-**/
-EFI_STATUS
-PxeBcCheckSelectedOffer (
- IN PXEBC_PRIVATE_DATA *Private
- )
-{
- PXEBC_CACHED_DHCP4_PACKET *SelectedOffer;
- EFI_DHCP4_PACKET_OPTION **Options;
- UINT32 Index;
- EFI_DHCP4_PACKET *Offer;
- UINT32 ProxyOfferIndex;
- EFI_STATUS Status;
- EFI_PXE_BASE_CODE_MODE *Mode;
- EFI_DHCP4_PACKET *Ack;
-
- ASSERT (Private->SelectedOffer != 0);
-
- Status = EFI_SUCCESS;
- SelectedOffer = &Private->Dhcp4Offers[Private->SelectedOffer - 1];
- Options = SelectedOffer->Dhcp4Option;
-
- if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_BINL) {
- //
- // The addresses are acquired from a BINL dhcp offer, try BINL to get
- // the bootfile name
- //
- if (!PxeBcTryBinl (Private, Private->SelectedOffer - 1)) {
- Status = EFI_NO_RESPONSE;
- }
- } else if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_DHCP_ONLY) {
- //
- // The selected offer to finish the D.O.R.A. is a DHCP only offer, we need
- // try proxy offers if there are some, othewise the bootfile name must be
- // set in this DHCP only offer.
- //
- if (Private->GotProxyOffer) {
- //
- // Get rid of the compiler warning.
- //
- ProxyOfferIndex = 0;
- if (Private->SortOffers) {
- //
- // The offers are sorted before selecting, the proxy offer type must be
- // already determined.
- //
- ASSERT (Private->ProxyIndex[Private->ProxyOfferType] > 0);
-
- if (Private->ProxyOfferType == DHCP4_PACKET_TYPE_BINL) {
- //
- // We buffer all received BINL proxy offers, try them all one by one
- //
- if (!PxeBcTryBinlProxy (Private, &ProxyOfferIndex)) {
- Status = EFI_NO_RESPONSE;
- }
- } else {
- //
- // For other types, only one proxy offer is buffered.
- //
- ProxyOfferIndex = Private->ProxyIndex[Private->ProxyOfferType] - 1;
- }
- } else {
- //
- // The proxy offer type is not determined, choose proxy offer in the
- // received order.
- //
- Status = EFI_NO_RESPONSE;
-
- ASSERT (Private->NumOffers < PXEBC_MAX_OFFER_NUM);
- for (Index = 0; Index < Private->NumOffers; Index++) {
-
- Offer = &Private->Dhcp4Offers[Index].Packet.Offer;
- if (!IS_PROXY_DHCP_OFFER (Offer)) {
- //
- // Skip non proxy dhcp offers.
- //
- continue;
- }
-
- if (Private->Dhcp4Offers[Index].OfferType == DHCP4_PACKET_TYPE_BINL) {
- //
- // Try BINL
- //
- if (!PxeBcTryBinl (Private, Index)) {
- //
- // Failed, skip to the next offer
- //
- continue;
- }
- }
-
- Private->ProxyOfferType = Private->Dhcp4Offers[Index].OfferType;
- ProxyOfferIndex = Index;
- Status = EFI_SUCCESS;
- break;
- }
- }
-
- if (!EFI_ERROR (Status) && (Private->ProxyOfferType != DHCP4_PACKET_TYPE_BINL)) {
- //
- // Copy the proxy offer to Mode and set the flag
- //
- Status = PxeBcCopyProxyOffer (Private, ProxyOfferIndex);
- }
- } else {
- //
- // No proxy offer is received, the bootfile name MUST be set.
- //
- ASSERT (Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL);
- }
- }
-
- if (!EFI_ERROR (Status)) {
- //
- // Everything is OK, set the flag and copy the DHCP packets.
- //
- Mode = Private->PxeBc.Mode;
- Offer = &SelectedOffer->Packet.Offer;
-
- //
- // The discover packet is already copied, just set flag here.
- //
- Mode->DhcpDiscoverValid = TRUE;
-
- Ack = &Private->Dhcp4Ack.Packet.Ack;
- if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_BOOTP) {
- //
- // Other type of ACK is already cached. Bootp is special that we should
- // use the bootp reply as the ACK and put it into the DHCP_ONLY buffer.
- //
- Status = PxeBcCopyEfiDhcp4Packet (&Private->Dhcp4Ack.Packet.Ack, Offer);
- }
-
- PxeBcParseCachedDhcpPacket (&Private->Dhcp4Ack);
-
- Mode->DhcpAckReceived = TRUE;
-
- //
- // Copy the dhcp ack.
- //
- CopyMem (&Mode->DhcpAck, &Ack->Dhcp4, Ack->Length);
- }
-
- return Status;
-}
-
-
-/**
- Cache the Dhcp4 packet offer, Parse and validate each option of the packet.
-
- @param Private Pointer to PxeBc private data.
- @param RcvdOffer Pointer to the received Dhcp proxy offer packet.
-
- @retval EFI_SUCCESS Cache and parse the packet successfully.
- @retval Others Operation failed.
-
-**/
-EFI_STATUS
-PxeBcCacheDhcpOffer (
- IN PXEBC_PRIVATE_DATA *Private,
- IN EFI_DHCP4_PACKET *RcvdOffer
- )
-{
- PXEBC_CACHED_DHCP4_PACKET *CachedOffer;
- EFI_DHCP4_PACKET *Offer;
- UINT8 OfferType;
- EFI_STATUS Status;
-
- CachedOffer = &Private->Dhcp4Offers[Private->NumOffers];
- Offer = &CachedOffer->Packet.Offer;
-
- //
- // Cache the orignal dhcp packet
- //
- Status = PxeBcCopyEfiDhcp4Packet (Offer, RcvdOffer);
- if (EFI_ERROR(Status)) {
- return Status;
- }
-
- //
- // Parse and validate the options (including dhcp option and vendor option)
- //
- if (!PxeBcParseCachedDhcpPacket (CachedOffer)) {
- return EFI_ABORTED;
- }
-
- OfferType = CachedOffer->OfferType;
- if (OfferType >= DHCP4_PACKET_TYPE_MAX) {
- return EFI_ABORTED;
- }
-
- if (OfferType == DHCP4_PACKET_TYPE_BOOTP) {
-
- if (Private->BootpIndex != 0) {
- //
- // Only cache the first bootp offer, discard others.
- //
- return EFI_ABORTED;
- } else {
- //
- // Take as a dhcp only offer, but record index specifically.
- //
- Private->BootpIndex = Private->NumOffers + 1;
- }
- } else {
-
- if (IS_PROXY_DHCP_OFFER (Offer)) {
- //
- // It's a proxy dhcp offer with no your address, including pxe10, wfm11a or binl offer.
- //
- Private->GotProxyOffer = TRUE;
-
- if (OfferType == DHCP4_PACKET_TYPE_BINL) {
- //
- // Cache all binl offers.
- //
- Private->BinlIndex[Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]] = Private->NumOffers;
- Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]++;
- } else if (Private->ProxyIndex[OfferType] != 0) {
- //
- // Only cache the first pxe10/wfm11a offers each, discard the others.
- //
- return EFI_ABORTED;
- } else {
- //
- // Record index of the proxy dhcp offer with type other than binl.
- //
- Private->ProxyIndex[OfferType] = Private->NumOffers + 1;
- }
- } else {
- //
- // It's a dhcp offer with your address.
- //
- ASSERT (Private->ServerCount[OfferType] < PXEBC_MAX_OFFER_NUM);
- Private->OfferIndex[OfferType][Private->ServerCount[OfferType]] = Private->NumOffers;
- Private->ServerCount[OfferType]++;
- }
- }
-
- //
- // Count the accepted offers.
- //
- Private->NumOffers++;
-
- return EFI_SUCCESS;
-}
-
-/**
- Switch the Ip4 policy to static.
-
- @param[in] Private The pointer to PXEBC_PRIVATE_DATA.
-
- @retval EFI_SUCCESS The policy is already configured to static.
- @retval Others Other error as indicated..
-
-**/
-EFI_STATUS
-PxeBcSetIp4Policy (
- IN PXEBC_PRIVATE_DATA *Private
- )
-{
- EFI_STATUS Status;
- EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
- EFI_IP4_CONFIG2_POLICY Policy;
- UINTN DataSize;
-
- Ip4Config2 = Private->Ip4Config2;
- DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
- Status = Ip4Config2->GetData (
- Ip4Config2,
- Ip4Config2DataTypePolicy,
- &DataSize,
- &Policy
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- if (Policy != Ip4Config2PolicyStatic) {
- Policy = Ip4Config2PolicyStatic;
- Status= Ip4Config2->SetData (
- Ip4Config2,
- Ip4Config2DataTypePolicy,
- sizeof (EFI_IP4_CONFIG2_POLICY),
- &Policy
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- }
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Select the specified proxy offer, such as BINL, DHCP_ONLY and so on.
- If the proxy does not exist, try offers with bootfile.
-
- @param Private Pointer to PxeBc private data.
-
-**/
-VOID
-PxeBcSelectOffer (
- IN PXEBC_PRIVATE_DATA *Private
- )
-{
- UINT32 Index;
- UINT32 OfferIndex;
- EFI_DHCP4_PACKET *Offer;
-
- Private->SelectedOffer = 0;
-
- if (Private->SortOffers) {
- //
- // Select offer according to the priority
- //
- if (Private->ServerCount[DHCP4_PACKET_TYPE_PXE10] > 0) {
- //
- // DHCP with PXE10
- //
- Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_PXE10][0] + 1;
-
- } else if (Private->ServerCount[DHCP4_PACKET_TYPE_WFM11A] > 0) {
- //
- // DHCP with WfM
- //
- Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_WFM11A][0] + 1;
-
- } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_PXE10] > 0) &&
- (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0)
- ) {
- //
- // DHCP only and proxy DHCP with PXE10
- //
- Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1;
- Private->ProxyOfferType = DHCP4_PACKET_TYPE_PXE10;
-
- } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_WFM11A] > 0) &&
- (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0)
- ) {
- //
- // DHCP only and proxy DHCP with WfM
- //
- Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1;
- Private->ProxyOfferType = DHCP4_PACKET_TYPE_WFM11A;
-
- } else if (Private->ServerCount[DHCP4_PACKET_TYPE_BINL] > 0) {
- //
- // DHCP with BINL
- //
- Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_BINL][0] + 1;
-
- } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL] > 0) &&
- (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0)
- ) {
- //
- // DHCP only and proxy DHCP with BINL
- //
- Private->SelectedOffer = Private->OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1;
- Private->ProxyOfferType = DHCP4_PACKET_TYPE_BINL;
-
- } else {
- //
- // Try offers with bootfile
- //
- for (Index = 0; Index < Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY]; Index++) {
- //
- // Select the first DHCP only offer with bootfile
- //
- OfferIndex = Private->OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][Index];
- if (Private->Dhcp4Offers[OfferIndex].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) {
- Private->SelectedOffer = OfferIndex + 1;
- break;
- }
- }
-
- if (Private->SelectedOffer == 0) {
- //
- // Select the Bootp reply with bootfile if any
- //
- Private->SelectedOffer = Private->BootpIndex;
- }
- }
- } else {
- //
- // Try the offers in the received order.
- //
- for (Index = 0; Index < Private->NumOffers; Index++) {
-
- Offer = &Private->Dhcp4Offers[Index].Packet.Offer;
-
- if (IS_PROXY_DHCP_OFFER (Offer)) {
- //
- // Skip proxy offers
- //
- continue;
- }
-
- if ((Private->Dhcp4Offers[Index].OfferType == DHCP4_PACKET_TYPE_DHCP_ONLY) &&
- ((!Private->GotProxyOffer) && (Private->Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] == NULL))) {
- //
- // DHCP only offer but no proxy offer received and no bootfile option in this offer
- //
- continue;
- }
-
- Private->SelectedOffer = Index + 1;
- break;
- }
- }
-}
-
-
-/**
- Callback routine.
-
- EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4 Protocol driver
- to intercept events that occurred in the configuration process. This structure
- provides advanced control of each state transition of the DHCP process. The
- returned status code determines the behavior of the EFI DHCPv4 Protocol driver.
- There are three possible returned values, which are described in the following
- table.
-
- @param This Pointer to the EFI DHCPv4 Protocol instance that is used to
- configure this callback function.
- @param Context Pointer to the context that is initialized by
- EFI_DHCP4_PROTOCOL.Configure().
- @param CurrentState The current operational state of the EFI DHCPv4 Protocol
- driver.
- @param Dhcp4Event The event that occurs in the current state, which usually means a
- state transition.
- @param Packet The DHCP packet that is going to be sent or already received.
- @param NewPacket The packet that is used to replace the above Packet.
-
- @retval EFI_SUCCESS Tells the EFI DHCPv4 Protocol driver to continue the DHCP process.
- @retval EFI_NOT_READY Only used in the Dhcp4Selecting state. The EFI DHCPv4 Protocol
- driver will continue to wait for more DHCPOFFER packets until the retry
- timeout expires.
- @retval EFI_ABORTED Tells the EFI DHCPv4 Protocol driver to abort the current process and
- return to the Dhcp4Init or Dhcp4InitReboot state.
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDhcpCallBack (
- IN EFI_DHCP4_PROTOCOL * This,
- IN VOID *Context,
- IN EFI_DHCP4_STATE CurrentState,
- IN EFI_DHCP4_EVENT Dhcp4Event,
- IN EFI_DHCP4_PACKET * Packet OPTIONAL,
- OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- EFI_PXE_BASE_CODE_MODE *Mode;
- EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback;
- EFI_DHCP4_PACKET_OPTION *MaxMsgSize;
- UINT16 Value;
- EFI_STATUS Status;
- BOOLEAN Received;
- EFI_DHCP4_HEADER *DhcpHeader;
-
- if ((Dhcp4Event != Dhcp4RcvdOffer) &&
- (Dhcp4Event != Dhcp4SelectOffer) &&
- (Dhcp4Event != Dhcp4SendDiscover) &&
- (Dhcp4Event != Dhcp4RcvdAck) &&
- (Dhcp4Event != Dhcp4SendRequest)) {
- return EFI_SUCCESS;
- }
-
- Private = (PXEBC_PRIVATE_DATA *) Context;
- Mode = Private->PxeBc.Mode;
- Callback = Private->PxeBcCallback;
-
- //
- // Override the Maximum DHCP Message Size.
- //
- MaxMsgSize = PxeBcParseExtendOptions (
- Packet->Dhcp4.Option,
- GET_OPTION_BUFFER_LEN (Packet),
- DHCP4_TAG_MAXMSG
- );
- if (MaxMsgSize != NULL) {
- Value = HTONS (PXEBC_DHCP4_MAX_PACKET_SIZE);
- CopyMem (MaxMsgSize->Data, &Value, sizeof (Value));
- }
-
- if ((Dhcp4Event != Dhcp4SelectOffer) && (Callback != NULL)) {
- Received = (BOOLEAN) ((Dhcp4Event == Dhcp4RcvdOffer) || (Dhcp4Event == Dhcp4RcvdAck));
- Status = Callback->Callback (
- Callback,
- Private->Function,
- Received,
- Packet->Length,
- (EFI_PXE_BASE_CODE_PACKET *) &Packet->Dhcp4
- );
- if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {
- return EFI_ABORTED;
- }
- }
-
- Status = EFI_SUCCESS;
-
- switch (Dhcp4Event) {
-
- case Dhcp4SendDiscover:
- case Dhcp4SendRequest:
- if (Packet->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) {
- //
- // If the to be sent packet exceeds the maximum length, abort the DHCP process.
- //
- Status = EFI_ABORTED;
- break;
- }
-
- if (Mode->SendGUID) {
- //
- // send the system GUID instead of the MAC address as the hardware address
- // in the DHCP packet header.
- //
- DhcpHeader = &Packet->Dhcp4.Header;
-
- if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) DhcpHeader->ClientHwAddr))) {
- //
- // GUID not yet set - send all 0xff's to show programable (via SetVariable)
- // SetMem(DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid, sizeof(EFI_GUID), 0xff);
- // GUID not yet set - send all 0's to show not programable
- //
- DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios table!\n"));
- ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID));
- }
-
- DhcpHeader->HwAddrLen = (UINT8) sizeof (EFI_GUID);
- }
-
- if (Dhcp4Event == Dhcp4SendDiscover) {
- //
- // Cache the dhcp discover packet, of which some information will be used later.
- //
- CopyMem (Mode->DhcpDiscover.Raw, &Packet->Dhcp4, Packet->Length);
- }
-
- break;
-
- case Dhcp4RcvdOffer:
- Status = EFI_NOT_READY;
- if (Packet->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) {
- //
- // Ignore the incoming Offers which exceed the maximum length.
- //
- break;
- }
-
- if (Private->NumOffers < PXEBC_MAX_OFFER_NUM) {
- //
- // Cache the dhcp offers in Private->Dhcp4Offers[]
- // If error happens, just ignore this packet and continue to wait more offer.
- //
- PxeBcCacheDhcpOffer (Private, Packet);
- }
-
- break;
-
- case Dhcp4SelectOffer:
- //
- // Select an offer, if succeeded, Private->SelectedOffer points to
- // the index of the selected one.
- //
- PxeBcSelectOffer (Private);
-
- if (Private->SelectedOffer == 0) {
- Status = EFI_ABORTED;
- } else {
- *NewPacket = &Private->Dhcp4Offers[Private->SelectedOffer - 1].Packet.Offer;
- }
-
- break;
-
- case Dhcp4RcvdAck:
- //
- // Cache Ack
- //
- ASSERT (Private->SelectedOffer != 0);
-
- Status = PxeBcCopyEfiDhcp4Packet (&Private->Dhcp4Ack.Packet.Ack, Packet);
- if (EFI_ERROR (Status)) {
- return EFI_ABORTED;
- }
- break;
-
- default:
- break;
- }
-
- return Status;
-}
-
-
-/**
- Initialize the DHCP options and build the option list.
-
- @param Private Pointer to PxeBc private data.
- @param OptList Pointer to a DHCP option list.
-
- @param IsDhcpDiscover Discover dhcp option or not.
-
- @return The index item number of the option list.
-
-**/
-UINT32
-PxeBcBuildDhcpOptions (
- IN PXEBC_PRIVATE_DATA *Private,
- IN EFI_DHCP4_PACKET_OPTION **OptList,
- IN BOOLEAN IsDhcpDiscover
- )
-{
- UINT32 Index;
- PXEBC_DHCP4_OPTION_ENTRY OptEnt;
- UINT16 Value;
-
- Index = 0;
- OptList[0] = (EFI_DHCP4_PACKET_OPTION *) Private->OptionBuffer;
-
- if (!IsDhcpDiscover) {
- //
- // Append message type.
- //
- OptList[Index]->OpCode = DHCP4_TAG_MSG_TYPE;
- OptList[Index]->Length = 1;
- OptEnt.Mesg = (PXEBC_DHCP4_OPTION_MESG *) OptList[Index]->Data;
- OptEnt.Mesg->Type = PXEBC_DHCP4_MSG_TYPE_REQUEST;
- Index++;
- OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
-
- //
- // Append max message size.
- //
- OptList[Index]->OpCode = DHCP4_TAG_MAXMSG;
- OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE);
- OptEnt.MaxMesgSize = (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *) OptList[Index]->Data;
- Value = NTOHS (PXEBC_DHCP4_MAX_PACKET_SIZE);
- CopyMem (&OptEnt.MaxMesgSize->Size, &Value, sizeof (UINT16));
- Index++;
- OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
- }
- //
- // Parameter request list option.
- //
- OptList[Index]->OpCode = DHCP4_TAG_PARA_LIST;
- OptList[Index]->Length = 35;
- OptEnt.Para = (PXEBC_DHCP4_OPTION_PARA *) OptList[Index]->Data;
- OptEnt.Para->ParaList[0] = DHCP4_TAG_NETMASK;
- OptEnt.Para->ParaList[1] = DHCP4_TAG_TIME_OFFSET;
- OptEnt.Para->ParaList[2] = DHCP4_TAG_ROUTER;
- OptEnt.Para->ParaList[3] = DHCP4_TAG_TIME_SERVER;
- OptEnt.Para->ParaList[4] = DHCP4_TAG_NAME_SERVER;
- OptEnt.Para->ParaList[5] = DHCP4_TAG_DNS_SERVER;
- OptEnt.Para->ParaList[6] = DHCP4_TAG_HOSTNAME;
- OptEnt.Para->ParaList[7] = DHCP4_TAG_BOOTFILE_LEN;
- OptEnt.Para->ParaList[8] = DHCP4_TAG_DOMAINNAME;
- OptEnt.Para->ParaList[9] = DHCP4_TAG_ROOTPATH;
- OptEnt.Para->ParaList[10] = DHCP4_TAG_EXTEND_PATH;
- OptEnt.Para->ParaList[11] = DHCP4_TAG_EMTU;
- OptEnt.Para->ParaList[12] = DHCP4_TAG_TTL;
- OptEnt.Para->ParaList[13] = DHCP4_TAG_BROADCAST;
- OptEnt.Para->ParaList[14] = DHCP4_TAG_NIS_DOMAIN;
- OptEnt.Para->ParaList[15] = DHCP4_TAG_NIS_SERVER;
- OptEnt.Para->ParaList[16] = DHCP4_TAG_NTP_SERVER;
- OptEnt.Para->ParaList[17] = DHCP4_TAG_VENDOR;
- OptEnt.Para->ParaList[18] = DHCP4_TAG_REQUEST_IP;
- OptEnt.Para->ParaList[19] = DHCP4_TAG_LEASE;
- OptEnt.Para->ParaList[20] = DHCP4_TAG_SERVER_ID;
- OptEnt.Para->ParaList[21] = DHCP4_TAG_T1;
- OptEnt.Para->ParaList[22] = DHCP4_TAG_T2;
- OptEnt.Para->ParaList[23] = DHCP4_TAG_VENDOR_CLASS_ID;
- OptEnt.Para->ParaList[24] = DHCP4_TAG_TFTP;
- OptEnt.Para->ParaList[25] = DHCP4_TAG_BOOTFILE;
- OptEnt.Para->ParaList[26] = DHCP4_TAG_UUID;
- OptEnt.Para->ParaList[27] = 0x80;
- OptEnt.Para->ParaList[28] = 0x81;
- OptEnt.Para->ParaList[29] = 0x82;
- OptEnt.Para->ParaList[30] = 0x83;
- OptEnt.Para->ParaList[31] = 0x84;
- OptEnt.Para->ParaList[32] = 0x85;
- OptEnt.Para->ParaList[33] = 0x86;
- OptEnt.Para->ParaList[34] = 0x87;
- Index++;
- OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
-
- //
- // Append UUID/Guid-based client identifier option
- //
- OptList[Index]->OpCode = DHCP4_TAG_UUID;
- OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_UUID);
- OptEnt.Uuid = (PXEBC_DHCP4_OPTION_UUID *) OptList[Index]->Data;
- OptEnt.Uuid->Type = 0;
- Index++;
- OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
-
- if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) OptEnt.Uuid->Guid))) {
- //
- // GUID not yet set - send all 0xff's to show programable (via SetVariable)
- // SetMem(DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid, sizeof(EFI_GUID), 0xff);
- // GUID not yet set - send all 0's to show not programable
- //
- DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios table!\n"));
- ZeroMem (OptEnt.Uuid->Guid, sizeof (EFI_GUID));
- }
-
- //
- // Append client network device interface option
- //
- OptList[Index]->OpCode = DHCP4_TAG_UNDI;
- OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_UNDI);
- OptEnt.Undi = (PXEBC_DHCP4_OPTION_UNDI *) OptList[Index]->Data;
- if (Private->Nii != NULL) {
- OptEnt.Undi->Type = Private->Nii->Type;
- OptEnt.Undi->MajorVer = Private->Nii->MajorVer;
- OptEnt.Undi->MinorVer = Private->Nii->MinorVer;
- } else {
- OptEnt.Undi->Type = DEFAULT_UNDI_TYPE;
- OptEnt.Undi->MajorVer = DEFAULT_UNDI_MAJOR;
- OptEnt.Undi->MinorVer = DEFAULT_UNDI_MINOR;
- }
-
- Index++;
- OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
-
- //
- // Append client system architecture option
- //
- OptList[Index]->OpCode = DHCP4_TAG_ARCH;
- OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_ARCH);
- OptEnt.Arch = (PXEBC_DHCP4_OPTION_ARCH *) OptList[Index]->Data;
- Value = HTONS (EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE);
- CopyMem (&OptEnt.Arch->Type, &Value, sizeof (UINT16));
- Index++;
- OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
-
- //
- // Append client system architecture option
- //
- OptList[Index]->OpCode = DHCP4_TAG_VENDOR_CLASS_ID;
- OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_CLID);
- OptEnt.Clid = (PXEBC_DHCP4_OPTION_CLID *) OptList[Index]->Data;
- CopyMem (OptEnt.Clid, DEFAULT_CLASS_ID_DATA, sizeof (PXEBC_DHCP4_OPTION_CLID));
- CvtNum (EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE, OptEnt.Clid->ArchitectureType, sizeof (OptEnt.Clid->ArchitectureType));
-
- if (Private->Nii != NULL) {
- //
- // If NII protocol exists, update DHCP option data
- //
- CopyMem (OptEnt.Clid->InterfaceName, Private->Nii->StringId, sizeof (OptEnt.Clid->InterfaceName));
- CvtNum (Private->Nii->MajorVer, OptEnt.Clid->UndiMajor, sizeof (OptEnt.Clid->UndiMajor));
- CvtNum (Private->Nii->MinorVer, OptEnt.Clid->UndiMinor, sizeof (OptEnt.Clid->UndiMinor));
- }
-
- Index++;
-
- return Index;
-}
-
-
-/**
- Discover the boot of service and initialize the vendor option if exists.
-
- @param Private Pointer to PxeBc private data.
- @param Type PxeBc option boot item type
- @param Layer PxeBc option boot item layer
- @param UseBis Use BIS or not
- @param DestIp Ip address for server
- @param IpCount The total count of the server ip address
- @param SrvList Server list
- @param IsDiscv Discover the vendor or not
- @param Reply The dhcp4 packet of Pxe reply
-
- @retval EFI_SUCCESS Operation succeeds.
- @retval EFI_OUT_OF_RESOURCES Allocate memory pool failed.
- @retval EFI_NOT_FOUND There is no vendor option exists.
- @retval EFI_TIMEOUT Send Pxe Discover time out.
-
-**/
-EFI_STATUS
-PxeBcDiscvBootService (
- IN PXEBC_PRIVATE_DATA * Private,
- IN UINT16 Type,
- IN UINT16 *Layer,
- IN BOOLEAN UseBis,
- IN EFI_IP_ADDRESS * DestIp,
- IN UINT16 IpCount,
- IN EFI_PXE_BASE_CODE_SRVLIST * SrvList,
- IN BOOLEAN IsDiscv,
- OUT EFI_DHCP4_PACKET * Reply OPTIONAL
- )
-{
- EFI_PXE_BASE_CODE_UDP_PORT Sport;
- EFI_PXE_BASE_CODE_MODE *Mode;
- EFI_DHCP4_PROTOCOL *Dhcp4;
- EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN Token;
- BOOLEAN IsBCast;
- EFI_STATUS Status;
- UINT16 RepIndex;
- UINT16 SrvIndex;
- UINT16 TryIndex;
- EFI_DHCP4_LISTEN_POINT ListenPoint;
- EFI_DHCP4_PACKET *Response;
- EFI_DHCP4_PACKET_OPTION *OptList[PXEBC_DHCP4_MAX_OPTION_NUM];
- UINT32 OptCount;
- EFI_DHCP4_PACKET_OPTION *PxeOpt;
- PXEBC_OPTION_BOOT_ITEM *PxeBootItem;
- UINT8 VendorOptLen;
- EFI_DHCP4_HEADER *DhcpHeader;
- UINT32 Xid;
-
- Mode = Private->PxeBc.Mode;
- Dhcp4 = Private->Dhcp4;
- Status = EFI_SUCCESS;
-
- ZeroMem (&Token, sizeof (EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN));
-
- if (DestIp == NULL) {
- Sport = PXEBC_DHCP4_S_PORT;
- IsBCast = TRUE;
- } else {
- Sport = PXEBC_BS_DISCOVER_PORT;
- IsBCast = FALSE;
- }
-
- if (!UseBis && Layer != NULL) {
- *Layer &= EFI_PXE_BASE_CODE_BOOT_LAYER_MASK;
- }
-
- OptCount = PxeBcBuildDhcpOptions (Private, OptList, FALSE);
-
- if (IsDiscv) {
- ASSERT (Layer != NULL);
- //
- // Add vendor option of PXE_BOOT_ITEM
- //
- VendorOptLen = (UINT8) ((sizeof (EFI_DHCP4_PACKET_OPTION) - 1) * 2 + sizeof (PXEBC_OPTION_BOOT_ITEM) + 1);
- OptList[OptCount] = AllocatePool (VendorOptLen);
- if (OptList[OptCount] == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- OptList[OptCount]->OpCode = DHCP4_TAG_VENDOR;
- OptList[OptCount]->Length = (UINT8) (VendorOptLen - 2);
- PxeOpt = (EFI_DHCP4_PACKET_OPTION *) OptList[OptCount]->Data;
- PxeOpt->OpCode = PXEBC_VENDOR_TAG_BOOT_ITEM;
- PxeOpt->Length = (UINT8) sizeof (PXEBC_OPTION_BOOT_ITEM);
- PxeBootItem = (PXEBC_OPTION_BOOT_ITEM *) PxeOpt->Data;
- PxeBootItem->Type = HTONS (Type);
- PxeBootItem->Layer = HTONS (*Layer);
- PxeOpt->Data[PxeOpt->Length] = DHCP4_TAG_EOP;
-
- OptCount++;
- }
-
- Status = Dhcp4->Build (Dhcp4, &Private->SeedPacket, 0, NULL, OptCount, OptList, &Token.Packet);
-
- if (IsDiscv) {
- FreePool (OptList[OptCount - 1]);
- }
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- DhcpHeader = &Token.Packet->Dhcp4.Header;
- if (Mode->SendGUID) {
- if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) DhcpHeader->ClientHwAddr))) {
- //
- // GUID not yet set - send all 0's to show not programable
- //
- DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios table!\n"));
- ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID));
- }
-
- DhcpHeader->HwAddrLen = (UINT8) sizeof (EFI_GUID);
- }
-
- Xid = NET_RANDOM (NetRandomInitSeed ());
- Token.Packet->Dhcp4.Header.Xid = HTONL(Xid);
- Token.Packet->Dhcp4.Header.Reserved = HTONS((UINT16) ((IsBCast) ? 0x8000 : 0));
- CopyMem (&Token.Packet->Dhcp4.Header.ClientAddr, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS));
-
- Token.RemotePort = Sport;
-
- if (IsBCast) {
- SetMem (&Token.RemoteAddress, sizeof (EFI_IPv4_ADDRESS), 0xff);
- } else {
- CopyMem (&Token.RemoteAddress, DestIp, sizeof (EFI_IPv4_ADDRESS));
- }
-
- CopyMem (&Token.GatewayAddress, &Private->GatewayIp, sizeof (EFI_IPv4_ADDRESS));
-
- if (!IsBCast) {
- Token.ListenPointCount = 1;
- Token.ListenPoints = &ListenPoint;
- Token.ListenPoints[0].ListenPort = PXEBC_BS_DISCOVER_PORT;
- CopyMem (&Token.ListenPoints[0].ListenAddress, &Private->StationIp, sizeof(EFI_IPv4_ADDRESS));
- CopyMem (&Token.ListenPoints[0].SubnetMask, &Private->SubnetMask, sizeof(EFI_IPv4_ADDRESS));
- }
- //
- // Send Pxe Discover
- //
- for (TryIndex = 1; TryIndex <= PXEBC_BOOT_REQUEST_RETRIES; TryIndex++) {
-
- Token.TimeoutValue = (UINT16) (PXEBC_BOOT_REQUEST_TIMEOUT * TryIndex);
- Token.Packet->Dhcp4.Header.Seconds = (UINT16) (PXEBC_BOOT_REQUEST_TIMEOUT * (TryIndex - 1));
-
- Status = Dhcp4->TransmitReceive (Dhcp4, &Token);
-
- if (Token.Status != EFI_TIMEOUT) {
- break;
- }
- }
-
- if (TryIndex > PXEBC_BOOT_REQUEST_RETRIES) {
- //
- // No server response our PXE request
- //
- Status = EFI_TIMEOUT;
- }
-
- if (!EFI_ERROR (Status)) {
- //
- // Find Pxe Reply
- //
- RepIndex = 0;
- SrvIndex = 0;
- Response = Token.ResponseList;
-
- while (RepIndex < Token.ResponseCount) {
- if (Response->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) {
- SrvIndex = 0;
- RepIndex++;
- Response = (EFI_DHCP4_PACKET *) ((UINT8 *) Response + Response->Size);
- continue;
- }
-
- while (SrvIndex < IpCount) {
-
- if (SrvList[SrvIndex].AcceptAnyResponse) {
- break;
- }
-
- if ((SrvList[SrvIndex].Type == Type) && EFI_IP4_EQUAL (&(Response->Dhcp4.Header.ServerAddr), &(Private->ServerIp))) {
- break;
- }
-
- SrvIndex++;
- }
-
- if ((IpCount != SrvIndex) || (IpCount == 0)) {
- break;
- }
-
- SrvIndex = 0;
- RepIndex++;
- Response = (EFI_DHCP4_PACKET *) ((UINT8 *) Response + Response->Size);
- }
-
- if (RepIndex < Token.ResponseCount) {
-
- if (Reply != NULL) {
- Status = PxeBcCopyEfiDhcp4Packet (Reply, Response);
- if (EFI_ERROR(Status)) {
- goto ON_EXIT;
- }
- }
-
- if (IsDiscv) {
- CopyMem (&(Mode->PxeDiscover), &(Token.Packet->Dhcp4), Token.Packet->Length);
- Mode->PxeDiscoverValid = TRUE;
-
- CopyMem (Mode->PxeReply.Raw, &Response->Dhcp4, Response->Length);
- Mode->PxeReplyReceived = TRUE;
- }
- } else {
- Status = EFI_NOT_FOUND;
- }
- }
-
-ON_EXIT:
- //
- // free the responselist
- //
- if (Token.ResponseList != NULL) {
- FreePool (Token.ResponseList);
- }
- //
- // Free the dhcp packet
- //
- if (Token.Packet != NULL) {
- FreePool (Token.Packet);
- }
-
- return Status;
-}
-
-
-/**
- Parse interested dhcp options.
-
- @param Buffer Pointer to the dhcp options packet.
- @param Length The length of the dhcp options.
- @param OptTag The option OpCode.
-
- @return NULL if the buffer length is 0 and OpCode is not
- DHCP4_TAG_EOP, or the pointer to the buffer.
-
-**/
-EFI_DHCP4_PACKET_OPTION *
-PxeBcParseExtendOptions (
- IN UINT8 *Buffer,
- IN UINT32 Length,
- IN UINT8 OptTag
- )
-{
- EFI_DHCP4_PACKET_OPTION *Option;
- UINT32 Offset;
-
- Option = (EFI_DHCP4_PACKET_OPTION *) Buffer;
- Offset = 0;
-
- while (Offset < Length && Option->OpCode != DHCP4_TAG_EOP) {
-
- if (Option->OpCode == OptTag) {
-
- return Option;
- }
-
- if (Option->OpCode == DHCP4_TAG_PAD) {
- Offset++;
- } else {
- Offset += Option->Length + 2;
- }
-
- Option = (EFI_DHCP4_PACKET_OPTION *) (Buffer + Offset);
- }
-
- return NULL;
-}
-
-
-/**
- This function is to parse and check vendor options.
-
- @param Dhcp4Option Pointer to dhcp options
- @param VendorOption Pointer to vendor options
-
- @return TRUE if valid for vendor options, or FALSE.
-
-**/
-BOOLEAN
-PxeBcParseVendorOptions (
- IN EFI_DHCP4_PACKET_OPTION *Dhcp4Option,
- IN PXEBC_VENDOR_OPTION *VendorOption
- )
-{
- UINT32 *BitMap;
- UINT8 VendorOptionLen;
- EFI_DHCP4_PACKET_OPTION *PxeOption;
- UINT8 Offset;
-
- BitMap = VendorOption->BitMap;
- VendorOptionLen = Dhcp4Option->Length;
- PxeOption = (EFI_DHCP4_PACKET_OPTION *) &Dhcp4Option->Data[0];
- Offset = 0;
-
- while ((Offset < VendorOptionLen) && (PxeOption->OpCode != DHCP4_TAG_EOP)) {
- //
- // Parse every Vendor Option and set its BitMap
- //
- switch (PxeOption->OpCode) {
-
- case PXEBC_VENDOR_TAG_MTFTP_IP:
-
- CopyMem (&VendorOption->MtftpIp, PxeOption->Data, sizeof (EFI_IPv4_ADDRESS));
- break;
-
- case PXEBC_VENDOR_TAG_MTFTP_CPORT:
-
- CopyMem (&VendorOption->MtftpCPort, PxeOption->Data, sizeof (VendorOption->MtftpCPort));
- break;
-
- case PXEBC_VENDOR_TAG_MTFTP_SPORT:
-
- CopyMem (&VendorOption->MtftpSPort, PxeOption->Data, sizeof (VendorOption->MtftpSPort));
- break;
-
- case PXEBC_VENDOR_TAG_MTFTP_TIMEOUT:
-
- VendorOption->MtftpTimeout = *PxeOption->Data;
- break;
-
- case PXEBC_VENDOR_TAG_MTFTP_DELAY:
-
- VendorOption->MtftpDelay = *PxeOption->Data;
- break;
-
- case PXEBC_VENDOR_TAG_DISCOVER_CTRL:
-
- VendorOption->DiscoverCtrl = *PxeOption->Data;
- break;
-
- case PXEBC_VENDOR_TAG_DISCOVER_MCAST:
-
- CopyMem (&VendorOption->DiscoverMcastIp, PxeOption->Data, sizeof (EFI_IPv4_ADDRESS));
- break;
-
- case PXEBC_VENDOR_TAG_BOOT_SERVERS:
-
- VendorOption->BootSvrLen = PxeOption->Length;
- VendorOption->BootSvr = (PXEBC_BOOT_SVR_ENTRY *) PxeOption->Data;
- break;
-
- case PXEBC_VENDOR_TAG_BOOT_MENU:
-
- VendorOption->BootMenuLen = PxeOption->Length;
- VendorOption->BootMenu = (PXEBC_BOOT_MENU_ENTRY *) PxeOption->Data;
- break;
-
- case PXEBC_VENDOR_TAG_MENU_PROMPT:
-
- VendorOption->MenuPromptLen = PxeOption->Length;
- VendorOption->MenuPrompt = (PXEBC_MENU_PROMPT *) PxeOption->Data;
- break;
-
- case PXEBC_VENDOR_TAG_MCAST_ALLOC:
-
- CopyMem (&VendorOption->McastIpBase, PxeOption->Data, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&VendorOption->McastIpBlock, PxeOption->Data + 4, sizeof (VendorOption->McastIpBlock));
- CopyMem (&VendorOption->McastIpRange, PxeOption->Data + 6, sizeof (VendorOption->McastIpRange));
- break;
-
- case PXEBC_VENDOR_TAG_CREDENTIAL_TYPES:
-
- VendorOption->CredTypeLen = PxeOption->Length;
- VendorOption->CredType = (UINT32 *) PxeOption->Data;
- break;
-
- case PXEBC_VENDOR_TAG_BOOT_ITEM:
-
- CopyMem (&VendorOption->BootSrvType, PxeOption->Data, sizeof (VendorOption->BootSrvType));
- CopyMem (&VendorOption->BootSrvLayer, PxeOption->Data + 2, sizeof (VendorOption->BootSrvLayer));
- break;
- }
-
- SET_VENDOR_OPTION_BIT_MAP (BitMap, PxeOption->OpCode);
-
- if (PxeOption->OpCode == DHCP4_TAG_PAD) {
- Offset++;
- } else {
- Offset = (UINT8) (Offset + PxeOption->Length + 2);
- }
-
- PxeOption = (EFI_DHCP4_PACKET_OPTION *) (Dhcp4Option->Data + Offset);
- }
-
- //
- // FixMe, return falas if invalid of any vendor option
- //
-
- return TRUE;
-}
-
-
-/**
- This function display boot item detail.
-
- If the length of the boot item string over 70 Char, just display 70 Char.
-
- @param Str Pointer to a string (boot item string).
- @param Len The length of string.
-
-**/
-VOID
-PxeBcDisplayBootItem (
- IN UINT8 *Str,
- IN UINT8 Len
- )
-{
- UINT8 Tmp;
-
- Len = (UINT8) MIN (70, Len);
- Tmp = Str[Len];
- Str[Len] = 0;
- AsciiPrint ("%a \n", Str);
- Str[Len] = Tmp;
-}
-
-
-/**
- Choose the boot prompt.
-
- @param Private Pointer to PxeBc private data.
-
- @retval EFI_SUCCESS Select boot prompt done.
- @retval EFI_TIMEOUT Select boot prompt time out.
- @retval EFI_NOT_FOUND The proxy offer is not Pxe10.
- @retval EFI_ABORTED User cancel the operation.
- @retval EFI_NOT_READY Read the input key from the keybroad has not finish.
-
-**/
-EFI_STATUS
-PxeBcSelectBootPrompt (
- IN PXEBC_PRIVATE_DATA *Private
- )
-{
- PXEBC_CACHED_DHCP4_PACKET *Packet;
- PXEBC_VENDOR_OPTION *VendorOpt;
- EFI_EVENT TimeoutEvent;
- EFI_EVENT DescendEvent;
- EFI_INPUT_KEY InputKey;
- EFI_STATUS Status;
- UINT8 Timeout;
- UINT8 *Prompt;
- UINT8 PromptLen;
- INT32 SecCol;
- INT32 SecRow;
-
- TimeoutEvent = NULL;
- DescendEvent = NULL;
-
- if (Private->PxeBc.Mode->ProxyOfferReceived) {
-
- Packet = &Private->ProxyOffer;
- } else {
-
- Packet = &Private->Dhcp4Ack;
- }
-
- if (Packet->OfferType != DHCP4_PACKET_TYPE_PXE10) {
- return EFI_NOT_FOUND;
- }
-
- VendorOpt = &Packet->PxeVendorOption;
- //
- // According to the PXE specification 2.1, Table 2-1 PXE DHCP Options (Full
- // List), we must not consider a boot prompt or boot menu if all of the
- // following hold:
- // - the PXE_DISCOVERY_CONTROL PXE tag is present inside the Vendor Options
- // (=43) DHCP tag, and
- // - the PXE_DISCOVERY_CONTROL PXE tag has bit 3 set, and
- // - a boot file name has been presented with DHCP option 67.
- //
- if (IS_DISABLE_PROMPT_MENU (VendorOpt->DiscoverCtrl) &&
- Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) {
- return EFI_ABORTED;
- }
-
- if (!IS_VALID_BOOT_PROMPT (VendorOpt->BitMap)) {
- return EFI_SUCCESS;
- }
-
- Timeout = VendorOpt->MenuPrompt->Timeout;
- Prompt = VendorOpt->MenuPrompt->Prompt;
- PromptLen = (UINT8) (VendorOpt->MenuPromptLen - 1);
-
- if (Timeout == 0) {
- return EFI_SUCCESS;
- }
-
- if (Timeout == 255) {
- return EFI_TIMEOUT;
- }
-
- Status = gBS->CreateEvent (
- EVT_TIMER,
- TPL_CALLBACK,
- NULL,
- NULL,
- &TimeoutEvent
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Status = gBS->SetTimer (
- TimeoutEvent,
- TimerRelative,
- MultU64x32 (Timeout, TICKS_PER_SECOND)
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- Status = gBS->CreateEvent (
- EVT_TIMER,
- TPL_CALLBACK,
- NULL,
- NULL,
- &DescendEvent
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- Status = gBS->SetTimer (
- DescendEvent,
- TimerPeriodic,
- TICKS_PER_SECOND
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- SecCol = gST->ConOut->Mode->CursorColumn;
- SecRow = gST->ConOut->Mode->CursorRow;
-
- PxeBcDisplayBootItem (Prompt, PromptLen);
-
- gST->ConOut->SetCursorPosition (gST->ConOut, SecCol + PromptLen, SecRow);
- AsciiPrint ("(%d) ", Timeout--);
-
- while (EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) {
-
- if (!EFI_ERROR (gBS->CheckEvent (DescendEvent))) {
- gST->ConOut->SetCursorPosition (gST->ConOut, SecCol + PromptLen, SecRow);
- AsciiPrint ("(%d) ", Timeout--);
- }
-
- if (gST->ConIn->ReadKeyStroke (gST->ConIn, &InputKey) == EFI_NOT_READY) {
-
- gBS->Stall (10 * TICKS_PER_MS);
- continue;
- }
-
- if (InputKey.ScanCode == 0) {
-
- switch (InputKey.UnicodeChar) {
- case CTRL ('c'):
- Status = EFI_ABORTED;
- break;
-
- case CTRL ('m'):
- case 'm':
- case 'M':
- Status = EFI_TIMEOUT;
- break;
-
- default:
- continue;
- }
- } else {
-
- switch (InputKey.ScanCode) {
- case SCAN_F8:
- Status = EFI_TIMEOUT;
- break;
-
- case SCAN_ESC:
- Status = EFI_ABORTED;
- break;
-
- default:
- continue;
- }
- }
-
- break;
- }
-
- gST->ConOut->SetCursorPosition (gST->ConOut, 0 , SecRow + 1);
-
-ON_EXIT:
-
- if (DescendEvent != NULL) {
- gBS->CloseEvent (DescendEvent);
- }
-
- if (TimeoutEvent != NULL) {
- gBS->CloseEvent (TimeoutEvent);
- }
-
- return Status;
-}
-
-
-/**
- Select the boot menu.
-
- @param Private Pointer to PxeBc private data.
- @param Type The type of the menu.
- @param UseDefaultItem Use default item or not.
-
- @retval EFI_ABORTED User cancel operation.
- @retval EFI_SUCCESS Select the boot menu success.
- @retval EFI_NOT_READY Read the input key from the keybroad has not finish.
-
-**/
-EFI_STATUS
-PxeBcSelectBootMenu (
- IN PXEBC_PRIVATE_DATA *Private,
- OUT UINT16 *Type,
- IN BOOLEAN UseDefaultItem
- )
-{
- PXEBC_CACHED_DHCP4_PACKET *Packet;
- PXEBC_VENDOR_OPTION *VendorOpt;
- EFI_INPUT_KEY InputKey;
- UINT8 MenuSize;
- UINT8 MenuNum;
- INT32 TopRow;
- UINT16 Select;
- UINT16 LastSelect;
- UINT8 Index;
- BOOLEAN Finish;
- CHAR8 Blank[70];
- PXEBC_BOOT_MENU_ENTRY *MenuItem;
- PXEBC_BOOT_MENU_ENTRY *MenuArray[PXEBC_MAX_MENU_NUM];
-
- Finish = FALSE;
- Select = 0;
- Index = 0;
- *Type = 0;
-
- if (Private->PxeBc.Mode->ProxyOfferReceived) {
-
- Packet = &Private->ProxyOffer;
- } else {
-
- Packet = &Private->Dhcp4Ack;
- }
-
- ASSERT (Packet->OfferType == DHCP4_PACKET_TYPE_PXE10);
-
- VendorOpt = &Packet->PxeVendorOption;
-
- if (!IS_VALID_BOOT_MENU (VendorOpt->BitMap)) {
- return EFI_SUCCESS;
- }
-
- SetMem (Blank, sizeof(Blank), ' ');
-
- MenuSize = VendorOpt->BootMenuLen;
- MenuItem = VendorOpt->BootMenu;
-
- if (MenuSize == 0) {
- return EFI_NOT_READY;
- }
-
- while (MenuSize > 0) {
- MenuArray[Index++] = MenuItem;
- MenuSize = (UINT8) (MenuSize - (MenuItem->DescLen + 3));
- MenuItem = (PXEBC_BOOT_MENU_ENTRY *) ((UINT8 *) MenuItem + MenuItem->DescLen + 3);
- if (Index >= PXEBC_MAX_MENU_NUM) {
- break;
- }
- }
-
- if (UseDefaultItem) {
- *Type = MenuArray[0]->Type;
- *Type = NTOHS (*Type);
- return EFI_SUCCESS;
- }
-
- MenuNum = Index;
-
- for (Index = 0; Index < MenuNum; Index++) {
- PxeBcDisplayBootItem (MenuArray[Index]->DescStr, MenuArray[Index]->DescLen);
- }
-
- TopRow = gST->ConOut->Mode->CursorRow - MenuNum;
-
- do {
- ASSERT (Select < PXEBC_MAX_MENU_NUM);
- //
- // highlight selected row
- //
- gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK, EFI_LIGHTGRAY));
- gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + Select);
- Blank[MenuArray[Select]->DescLen] = 0;
- AsciiPrint ("%a\r", Blank);
- PxeBcDisplayBootItem (MenuArray[Select]->DescStr, MenuArray[Select]->DescLen);
- gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + MenuNum);
- LastSelect = Select;
-
- while (gST->ConIn->ReadKeyStroke (gST->ConIn, &InputKey) == EFI_NOT_READY) {
- gBS->Stall (10 * TICKS_PER_MS);
- }
-
- if (InputKey.ScanCode == 0) {
- switch (InputKey.UnicodeChar) {
- case CTRL ('c'):
- InputKey.ScanCode = SCAN_ESC;
- break;
-
- case CTRL ('j'): /* linefeed */
- case CTRL ('m'): /* return */
- Finish = TRUE;
- break;
-
- case CTRL ('i'): /* tab */
- case ' ':
- case 'd':
- case 'D':
- InputKey.ScanCode = SCAN_DOWN;
- break;
-
- case CTRL ('h'): /* backspace */
- case 'u':
- case 'U':
- InputKey.ScanCode = SCAN_UP;
- break;
-
- default:
- InputKey.ScanCode = 0;
- }
- }
-
- switch (InputKey.ScanCode) {
- case SCAN_LEFT:
- case SCAN_UP:
- if (Select > 0) {
- --Select;
- }
-
- break;
-
- case SCAN_DOWN:
- case SCAN_RIGHT:
- if (++Select == MenuNum) {
- --Select;
- }
-
- break;
-
- case SCAN_PAGE_UP:
- case SCAN_HOME:
- Select = 0;
- break;
-
- case SCAN_PAGE_DOWN:
- case SCAN_END:
- Select = (UINT16) (MenuNum - 1);
- break;
-
- case SCAN_ESC:
- return EFI_ABORTED;
- }
-
- /* unhighlight last selected row */
- gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));
- gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + LastSelect);
- Blank[MenuArray[LastSelect]->DescLen] = 0;
- AsciiPrint ("%a\r", Blank);
- PxeBcDisplayBootItem (MenuArray[LastSelect]->DescStr, MenuArray[LastSelect]->DescLen);
- gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + MenuNum);
- } while (!Finish);
-
- ASSERT (Select < PXEBC_MAX_MENU_NUM);
-
- //
- // Swap the byte order
- //
- CopyMem (Type, &MenuArray[Select]->Type, sizeof (UINT16));
- *Type = NTOHS (*Type);
-
- return EFI_SUCCESS;
-}
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
deleted file mode 100644
index 76c140d8e3ff..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
+++ /dev/null
@@ -1,665 +0,0 @@
-/** @file
- The driver binding for UEFI PXEBC protocol.
-
-Copyright (c) 2007 - 2015, 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.
-
-**/
-
-
-#include "PxeBcImpl.h"
-
-EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding = {
- PxeBcDriverBindingSupported,
- PxeBcDriverBindingStart,
- PxeBcDriverBindingStop,
- 0xa,
- NULL,
- NULL
-};
-
-/**
- This is the declaration of an EFI image entry point. This entry point is
- the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
- both device drivers and bus drivers.
-
- @param ImageHandle The firmware allocated handle for the UEFI image.
- @param SystemTable A pointer to the EFI System Table.
-
- @retval EFI_SUCCESS The operation completed successfully.
- @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDriverEntryPoint (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-{
- return EfiLibInstallDriverBindingComponentName2 (
- ImageHandle,
- SystemTable,
- &gPxeBcDriverBinding,
- ImageHandle,
- &gPxeBcComponentName,
- &gPxeBcComponentName2
- );
-}
-
-
-/**
- Test to see if this driver supports ControllerHandle. This service
- is called by the EFI boot service ConnectController(). In
- order to make drivers as small as possible, there are a few calling
- restrictions for this service. ConnectController() must
- follow these calling restrictions. If any other agent wishes to call
- Supported() it must also follow these calling restrictions.
- PxeBc requires DHCP4 and MTFTP4 protocols.
-
- @param This Protocol instance pointer.
- @param ControllerHandle Handle of device to test
- @param RemainingDevicePath Optional parameter use to pick a specific child
- device to start.
-
- @retval EFI_SUCCESS This driver supports this device
- @retval EFI_ALREADY_STARTED This driver is already running on this device
- @retval other This driver does not support this device
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDriverBindingSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL * This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL
- )
-{
- EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;
- EFI_STATUS Status;
-
- Status = gBS->OpenProtocol (
- ControllerHandle,
- &gEfiPxeBaseCodeProtocolGuid,
- (VOID **) &PxeBc,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
-
- if (!EFI_ERROR (Status)) {
- return EFI_ALREADY_STARTED;
- }
-
- Status = gBS->OpenProtocol (
- ControllerHandle,
- &gEfiDhcp4ServiceBindingProtocolGuid,
- NULL,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_TEST_PROTOCOL
- );
-
- if (!EFI_ERROR (Status)) {
-
- Status = gBS->OpenProtocol (
- ControllerHandle,
- &gEfiMtftp4ServiceBindingProtocolGuid,
- NULL,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_TEST_PROTOCOL
- );
-
- }
-
- return Status;
-}
-
-
-/**
- Start this driver on ControllerHandle. This service is called by the
- EFI boot service ConnectController(). In order to make
- drivers as small as possible, there are a few calling restrictions for
- this service. ConnectController() must follow these
- calling restrictions. If any other agent wishes to call Start() it
- must also follow these calling restrictions.
-
- @param This Protocol instance pointer.
- @param ControllerHandle Handle of device to bind driver to
- @param RemainingDevicePath Optional parameter use to pick a specific child
- device to start.
-
- @retval EFI_SUCCESS This driver is added to ControllerHandle
- @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle
- @retval other This driver does not support this device
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDriverBindingStart (
- IN EFI_DRIVER_BINDING_PROTOCOL * This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- UINTN Index;
- EFI_STATUS Status;
- EFI_IP4_MODE_DATA Ip4ModeData;
-
- Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));
- if (Private == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Private->Signature = PXEBC_PRIVATE_DATA_SIGNATURE;
- Private->Controller = ControllerHandle;
- Private->Image = This->DriverBindingHandle;
- CopyMem (&Private->PxeBc, &mPxeBcProtocolTemplate, sizeof (Private->PxeBc));
- Private->PxeBc.Mode = &Private->Mode;
- CopyMem (&Private->LoadFile, &mLoadFileProtocolTemplate, sizeof (Private->LoadFile));
-
- Private->ProxyOffer.Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;
- Private->Dhcp4Ack.Packet.Ack.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;
- Private->PxeReply.Packet.Ack.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;
-
- for (Index = 0; Index < PXEBC_MAX_OFFER_NUM; Index++) {
- Private->Dhcp4Offers[Index].Packet.Offer.Size = PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;
- }
-
- //
- // Get the NII interface if it exists.
- //
- Status = gBS->OpenProtocol (
- ControllerHandle,
- &gEfiNetworkInterfaceIdentifierProtocolGuid_31,
- (VOID **) &Private->Nii,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- Private->Nii = NULL;
- }
-
- Status = NetLibCreateServiceChild (
- ControllerHandle,
- This->DriverBindingHandle,
- &gEfiArpServiceBindingProtocolGuid,
- &Private->ArpChild
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = gBS->OpenProtocol (
- Private->ArpChild,
- &gEfiArpProtocolGuid,
- (VOID **) &Private->Arp,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = NetLibCreateServiceChild (
- ControllerHandle,
- This->DriverBindingHandle,
- &gEfiDhcp4ServiceBindingProtocolGuid,
- &Private->Dhcp4Child
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = gBS->OpenProtocol (
- Private->Dhcp4Child,
- &gEfiDhcp4ProtocolGuid,
- (VOID **) &Private->Dhcp4,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = NetLibCreateServiceChild (
- ControllerHandle,
- This->DriverBindingHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- &Private->Ip4Child
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = gBS->OpenProtocol (
- Private->Ip4Child,
- &gEfiIp4ProtocolGuid,
- (VOID **) &Private->Ip4,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- //
- // Get max packet size from Ip4 to calculate block size for Tftp later.
- //
- Status = Private->Ip4->GetModeData (Private->Ip4, &Ip4ModeData, NULL, NULL);
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Private->Ip4MaxPacketSize = Ip4ModeData.MaxPacketSize;
-
- Status = NetLibCreateServiceChild (
- ControllerHandle,
- This->DriverBindingHandle,
- &gEfiMtftp4ServiceBindingProtocolGuid,
- &Private->Mtftp4Child
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = gBS->OpenProtocol (
- Private->Mtftp4Child,
- &gEfiMtftp4ProtocolGuid,
- (VOID **) &Private->Mtftp4,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = NetLibCreateServiceChild (
- ControllerHandle,
- This->DriverBindingHandle,
- &gEfiUdp4ServiceBindingProtocolGuid,
- &Private->Udp4ReadChild
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- //
- // The UDP instance for EfiPxeBcUdpRead
- //
- Status = gBS->OpenProtocol (
- Private->Udp4ReadChild,
- &gEfiUdp4ProtocolGuid,
- (VOID **) &Private->Udp4Read,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- //
- // The UDP instance for EfiPxeBcUdpWrite
- //
- Status = NetLibCreateServiceChild (
- ControllerHandle,
- This->DriverBindingHandle,
- &gEfiUdp4ServiceBindingProtocolGuid,
- &Private->Udp4WriteChild
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- Status = gBS->OpenProtocol (
- Private->Udp4WriteChild,
- &gEfiUdp4ProtocolGuid,
- (VOID **) &Private->Udp4Write,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
- ZeroMem (&Private->Udp4CfgData, sizeof (EFI_UDP4_CONFIG_DATA));
- Private->Udp4CfgData.AcceptBroadcast = FALSE;
- Private->Udp4CfgData.AcceptPromiscuous = FALSE;
- Private->Udp4CfgData.AcceptAnyPort = TRUE;
- Private->Udp4CfgData.AllowDuplicatePort = TRUE;
- Private->Udp4CfgData.TypeOfService = DEFAULT_ToS;
- Private->Udp4CfgData.TimeToLive = DEFAULT_TTL;
- Private->Udp4CfgData.DoNotFragment = FALSE;
- Private->Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;
- Private->Udp4CfgData.UseDefaultAddress = FALSE;
-
- PxeBcInitSeedPacket (&Private->SeedPacket, Private->Udp4Read);
- Private->MacLen = Private->SeedPacket.Dhcp4.Header.HwAddrLen;
- CopyMem (&Private->Mac, &Private->SeedPacket.Dhcp4.Header.ClientHwAddr[0], Private->MacLen);
-
-
- ZeroMem (&Private->Ip4ConfigData, sizeof (EFI_IP4_CONFIG_DATA));
- Private->Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP;
- Private->Ip4ConfigData.AcceptIcmpErrors = TRUE;
- Private->Ip4ConfigData.TypeOfService = DEFAULT_ToS;
- Private->Ip4ConfigData.TimeToLive = DEFAULT_TTL;
- Private->Ip4ConfigData.DoNotFragment = FALSE;
- Private->Ip4ConfigData.RawData = FALSE;
-
- Status = gBS->InstallMultipleProtocolInterfaces (
- &ControllerHandle,
- &gEfiPxeBaseCodeProtocolGuid,
- &Private->PxeBc,
- &gEfiLoadFileProtocolGuid,
- &Private->LoadFile,
- NULL
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
- //
- // Locate Ip4->Ip4Config2 and store it for set IPv4 Policy.
- //
- Status = gBS->HandleProtocol (
- ControllerHandle,
- &gEfiIp4Config2ProtocolGuid,
- (VOID **) &Private->Ip4Config2
- );
- if (EFI_ERROR (Status)) {
- goto ON_ERROR;
- }
-
- return EFI_SUCCESS;
-
-ON_ERROR:
-
- if (Private->Udp4WriteChild != NULL) {
- gBS->CloseProtocol (
- Private->Udp4WriteChild,
- &gEfiUdp4ProtocolGuid,
- This->DriverBindingHandle,
- ControllerHandle
- );
- NetLibDestroyServiceChild (
- ControllerHandle,
- This->DriverBindingHandle,
- &gEfiUdp4ServiceBindingProtocolGuid,
- Private->Udp4WriteChild
- );
- }
-
- if (Private->Udp4ReadChild != NULL) {
- gBS->CloseProtocol (
- Private->Udp4ReadChild,
- &gEfiUdp4ProtocolGuid,
- This->DriverBindingHandle,
- ControllerHandle
- );
- NetLibDestroyServiceChild (
- ControllerHandle,
- This->DriverBindingHandle,
- &gEfiUdp4ServiceBindingProtocolGuid,
- Private->Udp4ReadChild
- );
- }
-
- if (Private->Mtftp4Child != NULL) {
- gBS->CloseProtocol (
- Private->Mtftp4Child,
- &gEfiMtftp4ProtocolGuid,
- This->DriverBindingHandle,
- ControllerHandle
- );
-
- NetLibDestroyServiceChild (
- ControllerHandle,
- This->DriverBindingHandle,
- &gEfiMtftp4ServiceBindingProtocolGuid,
- Private->Mtftp4Child
- );
- }
-
- if (Private->Ip4Child != NULL) {
- gBS->CloseProtocol (
- Private->Ip4Child,
- &gEfiIp4ProtocolGuid,
- This->DriverBindingHandle,
- ControllerHandle
- );
-
- NetLibDestroyServiceChild (
- ControllerHandle,
- This->DriverBindingHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- Private->Ip4Child
- );
- }
-
- if (Private->Dhcp4Child != NULL) {
- gBS->CloseProtocol (
- Private->Dhcp4Child,
- &gEfiDhcp4ProtocolGuid,
- This->DriverBindingHandle,
- ControllerHandle
- );
-
- NetLibDestroyServiceChild (
- ControllerHandle,
- This->DriverBindingHandle,
- &gEfiDhcp4ServiceBindingProtocolGuid,
- Private->Dhcp4Child
- );
- }
-
- if (Private->ArpChild != NULL) {
- gBS->CloseProtocol (
- Private->ArpChild,
- &gEfiArpProtocolGuid,
- This->DriverBindingHandle,
- ControllerHandle
- );
-
- NetLibDestroyServiceChild (
- ControllerHandle,
- This->DriverBindingHandle,
- &gEfiArpServiceBindingProtocolGuid,
- Private->ArpChild
- );
- }
-
- FreePool (Private);
-
- return Status;
-}
-
-
-/**
- Stop this driver on ControllerHandle. This service is called by the
- EFI boot service DisconnectController(). In order to
- make drivers as small as possible, there are a few calling
- restrictions for this service. DisconnectController()
- must follow these calling restrictions. If any other agent wishes
- to call Stop() it must also follow these calling restrictions.
-
- @param This Protocol instance pointer.
- @param ControllerHandle Handle of device to stop driver on
- @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
- children is zero stop the entire bus driver.
- @param ChildHandleBuffer List of Child Handles to Stop.
-
- @retval EFI_SUCCESS This driver is removed ControllerHandle
- @retval other This driver was not removed from this device
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDriverBindingStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;
- EFI_HANDLE NicHandle;
- EFI_STATUS Status;
-
- NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);
- if (NicHandle == NULL) {
- NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp4ProtocolGuid);
-
- if (NicHandle == NULL) {
- NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);
-
- if (NicHandle == NULL) {
- NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp4ProtocolGuid);
-
- if (NicHandle == NULL) {
- NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiMtftp4ProtocolGuid);
-
- if (NicHandle == NULL) {
- return EFI_SUCCESS;
- }
- }
- }
- }
- }
-
- Status = gBS->OpenProtocol (
- NicHandle,
- &gEfiPxeBaseCodeProtocolGuid,
- (VOID **) &PxeBc,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
-
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Stop functionality of PXE Base Code protocol
- //
- Status = PxeBc->Stop (PxeBc);
- if (Status != EFI_SUCCESS && Status != EFI_NOT_STARTED) {
- return Status;
- }
-
- Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc);
-
- Status = gBS->UninstallMultipleProtocolInterfaces (
- NicHandle,
- &gEfiPxeBaseCodeProtocolGuid,
- &Private->PxeBc,
- &gEfiLoadFileProtocolGuid,
- &Private->LoadFile,
- NULL
- );
-
- if (!EFI_ERROR (Status)) {
-
- gBS->CloseProtocol (
- Private->Udp4WriteChild,
- &gEfiUdp4ProtocolGuid,
- This->DriverBindingHandle,
- NicHandle
- );
- NetLibDestroyServiceChild (
- ControllerHandle,
- This->DriverBindingHandle,
- &gEfiUdp4ServiceBindingProtocolGuid,
- Private->Udp4WriteChild
- );
-
- gBS->CloseProtocol (
- Private->Udp4ReadChild,
- &gEfiUdp4ProtocolGuid,
- This->DriverBindingHandle,
- NicHandle
- );
- NetLibDestroyServiceChild (
- NicHandle,
- This->DriverBindingHandle,
- &gEfiUdp4ServiceBindingProtocolGuid,
- Private->Udp4ReadChild
- );
-
- gBS->CloseProtocol (
- Private->Dhcp4Child,
- &gEfiDhcp4ProtocolGuid,
- This->DriverBindingHandle,
- NicHandle
- );
- NetLibDestroyServiceChild (
- NicHandle,
- This->DriverBindingHandle,
- &gEfiDhcp4ServiceBindingProtocolGuid,
- Private->Dhcp4Child
- );
-
- gBS->CloseProtocol (
- Private->Mtftp4Child,
- &gEfiMtftp4ProtocolGuid,
- This->DriverBindingHandle,
- NicHandle
- );
- NetLibDestroyServiceChild (
- NicHandle,
- This->DriverBindingHandle,
- &gEfiMtftp4ServiceBindingProtocolGuid,
- Private->Mtftp4Child
- );
-
- gBS->CloseProtocol (
- Private->Ip4Child,
- &gEfiIp4ProtocolGuid,
- This->DriverBindingHandle,
- NicHandle
- );
- NetLibDestroyServiceChild (
- NicHandle,
- This->DriverBindingHandle,
- &gEfiIp4ServiceBindingProtocolGuid,
- Private->Ip4Child
- );
-
- gBS->CloseProtocol (
- Private->ArpChild,
- &gEfiArpProtocolGuid,
- This->DriverBindingHandle,
- NicHandle
- );
- NetLibDestroyServiceChild (
- NicHandle,
- This->DriverBindingHandle,
- &gEfiArpServiceBindingProtocolGuid,
- Private->ArpChild
- );
-
- FreePool (Private);
- }
-
- return Status;
-}
-
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c
deleted file mode 100644
index 3fa3be99c178..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c
+++ /dev/null
@@ -1,2989 +0,0 @@
-/** @file
- Interface routines for PxeBc.
-
-Copyright (c) 2007 - 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.
-
-**/
-
-
-#include "PxeBcImpl.h"
-
-UINT32 mPxeDhcpTimeout[4] = { 4, 8, 16, 32 };
-
-/**
- Get and record the arp cache.
-
- @param This Pointer to EFI_PXE_BC_PROTOCOL
-
- @retval EFI_SUCCESS Arp cache updated successfully
- @retval others If error occurs when getting arp cache
-
-**/
-EFI_STATUS
-UpdateArpCache (
- IN EFI_PXE_BASE_CODE_PROTOCOL * This
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- EFI_PXE_BASE_CODE_MODE *Mode;
- EFI_STATUS Status;
- UINT32 EntryLength;
- UINT32 EntryCount;
- EFI_ARP_FIND_DATA *Entries;
- UINT32 Index;
-
- Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
- Mode = Private->PxeBc.Mode;
-
- Status = Private->Arp->Find (
- Private->Arp,
- TRUE,
- NULL,
- &EntryLength,
- &EntryCount,
- &Entries,
- TRUE
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- Mode->ArpCacheEntries = MIN (
- EntryCount,
- EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES
- );
- for (Index = 0; Index < Mode->ArpCacheEntries; Index ++) {
- CopyMem (
- &Mode->ArpCache[Index].IpAddr,
- Entries + 1,
- Entries->SwAddressLength
- );
- CopyMem (
- &Mode->ArpCache[Index].MacAddr,
- (UINT8 *) (Entries + 1) + Entries->SwAddressLength,
- Entries->HwAddressLength
- );
- //
- // Slip to the next FindData.
- //
- Entries = (EFI_ARP_FIND_DATA *) ((UINT8 *) Entries + EntryLength);
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Timeout routine to update arp cache.
-
- @param Event Pointer to EFI_PXE_BC_PROTOCOL
- @param Context Context of the timer event
-
-**/
-VOID
-EFIAPI
-ArpCacheUpdateTimeout (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- UpdateArpCache ((EFI_PXE_BASE_CODE_PROTOCOL *) Context);
-}
-
-/**
- Do arp resolution from arp cache in PxeBcMode.
-
- @param PxeBcMode The PXE BC mode to look into.
- @param Ip4Addr The Ip4 address for resolution.
- @param MacAddress The resoluted MAC address if the resolution is successful.
- The value is undefined if resolution fails.
-
- @retval TRUE The resolution is successful.
- @retval FALSE Otherwise.
-
-**/
-BOOLEAN
-FindInArpCache (
- IN EFI_PXE_BASE_CODE_MODE *PxeBcMode,
- IN EFI_IPv4_ADDRESS *Ip4Addr,
- OUT EFI_MAC_ADDRESS *MacAddress
- )
-{
- UINT32 Index;
-
- for (Index = 0; Index < PxeBcMode->ArpCacheEntries; Index ++) {
- if (EFI_IP4_EQUAL (&PxeBcMode->ArpCache[Index].IpAddr.v4, Ip4Addr)) {
- CopyMem (
- MacAddress,
- &PxeBcMode->ArpCache[Index].MacAddr,
- sizeof (EFI_MAC_ADDRESS)
- );
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-/**
- Notify function for the ICMP receive token, used to process
- the received ICMP packets.
-
- @param Context The PXEBC private data.
-
-**/
-VOID
-EFIAPI
-IcmpErrorListenHandlerDpc (
- IN VOID *Context
- )
-{
- EFI_STATUS Status;
- EFI_IP4_RECEIVE_DATA *RxData;
- EFI_IP4_PROTOCOL *Ip4;
- PXEBC_PRIVATE_DATA *Private;
- EFI_PXE_BASE_CODE_MODE *Mode;
- UINTN Index;
- UINT32 CopiedLen;
- UINT8 *CopiedPointer;
-
- Private = (PXEBC_PRIVATE_DATA *) Context;
- Mode = &Private->Mode;
- Status = Private->IcmpErrorRcvToken.Status;
- RxData = Private->IcmpErrorRcvToken.Packet.RxData;
- Ip4 = Private->Ip4;
-
- if (Status == EFI_ABORTED) {
- //
- // The reception is actively aborted by the consumer, directly return.
- //
- return;
- }
-
- if (RxData == NULL) {
- goto Resume;
- }
-
- if (Status != EFI_ICMP_ERROR) {
- //
- // The return status should be recognized as EFI_ICMP_ERROR.
- //
- goto CleanUp;
- }
-
- if (EFI_IP4 (RxData->Header->SourceAddress) != 0 &&
- (NTOHL (Mode->SubnetMask.Addr[0]) != 0) &&
- IP4_NET_EQUAL (NTOHL(Mode->StationIp.Addr[0]), EFI_NTOHL (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0])) &&
- !NetIp4IsUnicast (EFI_NTOHL (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0]))) {
- //
- // The source address is not zero and it's not a unicast IP address, discard it.
- //
- goto CleanUp;
- }
-
- if (!EFI_IP4_EQUAL (&RxData->Header->DestinationAddress, &Mode->StationIp.v4)) {
- //
- // The dest address is not equal to Station Ip address, discard it.
- //
- goto CleanUp;
- }
-
- //
- // Constructor ICMP error packet
- //
- CopiedLen = 0;
- CopiedPointer = (UINT8 *) &Mode->IcmpError;
-
- for (Index = 0; Index < RxData->FragmentCount; Index ++) {
- CopiedLen += RxData->FragmentTable[Index].FragmentLength;
- if (CopiedLen <= sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR)) {
- CopyMem (
- CopiedPointer,
- RxData->FragmentTable[Index].FragmentBuffer,
- RxData->FragmentTable[Index].FragmentLength
- );
- } else {
- CopyMem (
- CopiedPointer,
- RxData->FragmentTable[Index].FragmentBuffer,
- CopiedLen - sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR)
- );
- }
- CopiedPointer += CopiedLen;
- }
-
-CleanUp:
- gBS->SignalEvent (RxData->RecycleSignal);
-
-Resume:
- Ip4->Receive (Ip4, &(Private->IcmpErrorRcvToken));
-}
-
-/**
- Request IcmpErrorListenHandlerDpc as a DPC at TPL_CALLBACK
-
- @param Event The event signaled.
- @param Context The context passed in by the event notifier.
-
-**/
-VOID
-EFIAPI
-IcmpErrorListenHandler (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- //
- // Request IpIoListenHandlerDpc as a DPC at TPL_CALLBACK
- //
- QueueDpc (TPL_CALLBACK, IcmpErrorListenHandlerDpc, Context);
-}
-
-/**
- Enables the use of the PXE Base Code Protocol functions.
-
- This function enables the use of the PXE Base Code Protocol functions. If the
- Started field of the EFI_PXE_BASE_CODE_MODE structure is already TRUE, then
- EFI_ALREADY_STARTED will be returned. If UseIpv6 is TRUE, then IPv6 formatted
- addresses will be used in this session. If UseIpv6 is FALSE, then IPv4 formatted
- addresses will be used in this session. If UseIpv6 is TRUE, and the Ipv6Supported
- field of the EFI_PXE_BASE_CODE_MODE structure is FALSE, then EFI_UNSUPPORTED will
- be returned. If there is not enough memory or other resources to start the PXE
- Base Code Protocol, then EFI_OUT_OF_RESOURCES will be returned. Otherwise, the
- PXE Base Code Protocol will be started, and all of the fields of the EFI_PXE_BASE_CODE_MODE
- structure will be initialized as follows:
- StartedSet to TRUE.
- Ipv6SupportedUnchanged.
- Ipv6AvailableUnchanged.
- UsingIpv6Set to UseIpv6.
- BisSupportedUnchanged.
- BisDetectedUnchanged.
- AutoArpSet to TRUE.
- SendGUIDSet to FALSE.
- TTLSet to DEFAULT_TTL.
- ToSSet to DEFAULT_ToS.
- DhcpCompletedSet to FALSE.
- ProxyOfferReceivedSet to FALSE.
- StationIpSet to an address of all zeros.
- SubnetMaskSet to a subnet mask of all zeros.
- DhcpDiscoverZero-filled.
- DhcpAckZero-filled.
- ProxyOfferZero-filled.
- PxeDiscoverValidSet to FALSE.
- PxeDiscoverZero-filled.
- PxeReplyValidSet to FALSE.
- PxeReplyZero-filled.
- PxeBisReplyValidSet to FALSE.
- PxeBisReplyZero-filled.
- IpFilterSet the Filters field to 0 and the IpCnt field to 0.
- ArpCacheEntriesSet to 0.
- ArpCacheZero-filled.
- RouteTableEntriesSet to 0.
- RouteTableZero-filled.
- IcmpErrorReceivedSet to FALSE.
- IcmpErrorZero-filled.
- TftpErroReceivedSet to FALSE.
- TftpErrorZero-filled.
- MakeCallbacksSet to TRUE if the PXE Base Code Callback Protocol is available.
- Set to FALSE if the PXE Base Code Callback Protocol is not available.
-
- @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
- @param UseIpv6 Specifies the type of IP addresses that are to be used during the session
- that is being started. Set to TRUE for IPv6 addresses, and FALSE for
- IPv4 addresses.
-
- @retval EFI_SUCCESS The PXE Base Code Protocol was started.
- @retval EFI_DEVICE_ERROR The network device encountered an error during this oper
- @retval EFI_UNSUPPORTED UseIpv6 is TRUE, but the Ipv6Supported field of the
- EFI_PXE_BASE_CODE_MODE structure is FALSE.
- @retval EFI_ALREADY_STARTED The PXE Base Code Protocol is already in the started state.
- @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not point to a valid
- EFI_PXE_BASE_CODE_PROTOCOL structure.
- @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory or other resources to start the
- PXE Base Code Protocol.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcStart (
- IN EFI_PXE_BASE_CODE_PROTOCOL *This,
- IN BOOLEAN UseIpv6
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- EFI_PXE_BASE_CODE_MODE *Mode;
- EFI_STATUS Status;
-
- if (This == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
- Mode = Private->PxeBc.Mode;
-
- if (Mode->Started) {
- return EFI_ALREADY_STARTED;
- }
-
- if (UseIpv6) {
- //
- // IPv6 is not supported now.
- //
- return EFI_UNSUPPORTED;
- }
-
- AsciiPrint ("\n>>Start PXE over IPv4");
-
- //
- // Configure the udp4 instance to let it receive data
- //
- Status = Private->Udp4Read->Configure (
- Private->Udp4Read,
- &Private->Udp4CfgData
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
-
- //
- // Configure block size for TFTP as a default value to handle all link layers.
- //
- Private->BlockSize = MIN (Private->Ip4MaxPacketSize, PXEBC_DEFAULT_PACKET_SIZE) -
- PXEBC_DEFAULT_UDP_OVERHEAD_SIZE - PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE;
- //
- // If PcdTftpBlockSize is set to non-zero, override the default value.
- //
- if (PcdGet64 (PcdTftpBlockSize) != 0) {
- Private->BlockSize = (UINTN) PcdGet64 (PcdTftpBlockSize);
- }
-
- Private->AddressIsOk = FALSE;
-
- ZeroMem (Mode, sizeof (EFI_PXE_BASE_CODE_MODE));
-
- Mode->Started = TRUE;
- Mode->TTL = DEFAULT_TTL;
- Mode->ToS = DEFAULT_ToS;
- Mode->AutoArp = TRUE;
-
- //
- // Create the event for Arp Cache checking.
- //
- Status = gBS->CreateEvent (
- EVT_TIMER | EVT_NOTIFY_SIGNAL,
- TPL_CALLBACK,
- ArpCacheUpdateTimeout,
- This,
- &Private->GetArpCacheEvent
- );
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- //
- // Start the timeout timer event.
- //
- Status = gBS->SetTimer (
- Private->GetArpCacheEvent,
- TimerPeriodic,
- TICKS_PER_SECOND
- );
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- //
- // Create ICMP error receiving event
- //
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_NOTIFY,
- IcmpErrorListenHandler,
- Private,
- &(Private->IcmpErrorRcvToken.Event)
- );
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- //
- //DHCP4 service allows only one of its children to be configured in
- //the active state, If the DHCP4 D.O.R.A started by IP4 auto
- //configuration and has not been completed, the Dhcp4 state machine
- //will not be in the right state for the PXE to start a new round D.O.R.A.
- //so we need to switch it's policy to static.
- //
- Status = PxeBcSetIp4Policy (Private);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4ConfigData);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- //
- // start to listen incoming packet
- //
- Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpErrorRcvToken);
- if (!EFI_ERROR (Status)) {
- return Status;
- }
-
-ON_EXIT:
- Private->Ip4->Configure (Private->Ip4, NULL);
-
- if (Private->IcmpErrorRcvToken.Event != NULL) {
- gBS->CloseEvent (Private->IcmpErrorRcvToken.Event);
- }
-
- if (Private->GetArpCacheEvent != NULL) {
- gBS->SetTimer (Private->GetArpCacheEvent, TimerCancel, 0);
- gBS->CloseEvent (Private->GetArpCacheEvent);
- }
-
- Mode->Started = FALSE;
- Mode->TTL = 0;
- Mode->ToS = 0;
- Mode->AutoArp = FALSE;
-
- return Status;
-}
-
-
-/**
- Disables the use of the PXE Base Code Protocol functions.
-
- This function stops all activity on the network device. All the resources allocated
- in Start() are released, the Started field of the EFI_PXE_BASE_CODE_MODE structure is
- set to FALSE and EFI_SUCCESS is returned. If the Started field of the EFI_PXE_BASE_CODE_MODE
- structure is already FALSE, then EFI_NOT_STARTED will be returned.
-
- @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
-
- @retval EFI_SUCCESS The PXE Base Code Protocol was stopped.
- @retval EFI_NOT_STARTED The PXE Base Code Protocol is already in the stopped state.
- @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not point to a valid
- EFI_PXE_BASE_CODE_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcStop (
- IN EFI_PXE_BASE_CODE_PROTOCOL *This
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- EFI_PXE_BASE_CODE_MODE *Mode;
-
- if (This == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
- Mode = Private->PxeBc.Mode;
-
- if (!Mode->Started) {
- return EFI_NOT_STARTED;
- }
-
- Private->Ip4->Cancel (Private->Ip4, NULL);
- //
- // Dispatch the DPCs queued by the NotifyFunction of the canceled rx token's
- // events.
- //
- DispatchDpc ();
-
- Private->Ip4->Configure (Private->Ip4, NULL);
-
- //
- // Close the ICMP error receiving event.
- //
- gBS->CloseEvent (Private->IcmpErrorRcvToken.Event);
-
- //
- // Cancel the TimeoutEvent timer.
- //
- gBS->SetTimer (Private->GetArpCacheEvent, TimerCancel, 0);
-
- //
- // Close the TimeoutEvent event.
- //
- gBS->CloseEvent (Private->GetArpCacheEvent);
-
- Mode->Started = FALSE;
-
- Private->CurrentUdpSrcPort = 0;
- Private->Udp4Write->Configure (Private->Udp4Write, NULL);
- Private->Udp4Read->Groups (Private->Udp4Read, FALSE, NULL);
- Private->Udp4Read->Configure (Private->Udp4Read, NULL);
-
- Private->Dhcp4->Stop (Private->Dhcp4);
- Private->Dhcp4->Configure (Private->Dhcp4, NULL);
-
- Private->FileSize = 0;
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Attempts to complete a DHCPv4 D.O.R.A. (discover / offer / request / acknowledge) or DHCPv6
- S.A.R.R (solicit / advertise / request / reply) sequence.
-
- This function attempts to complete the DHCP sequence. If this sequence is completed,
- then EFI_SUCCESS is returned, and the DhcpCompleted, ProxyOfferReceived, StationIp,
- SubnetMask, DhcpDiscover, DhcpAck, and ProxyOffer fields of the EFI_PXE_BASE_CODE_MODE
- structure are filled in.
- If SortOffers is TRUE, then the cached DHCP offer packets will be sorted before
- they are tried. If SortOffers is FALSE, then the cached DHCP offer packets will
- be tried in the order in which they are received. Please see the Preboot Execution
- Environment (PXE) Specification for additional details on the implementation of DHCP.
- This function can take at least 31 seconds to timeout and return control to the
- caller. If the DHCP sequence does not complete, then EFI_TIMEOUT will be returned.
- If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
- then the DHCP sequence will be stopped and EFI_ABORTED will be returned.
-
- @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
- @param SortOffers TRUE if the offers received should be sorted. Set to FALSE to try the
- offers in the order that they are received.
-
- @retval EFI_SUCCESS Valid DHCP has completed.
- @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state.
- @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not point to a valid
- EFI_PXE_BASE_CODE_PROTOCOL structure.
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
- @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory to complete the DHCP Protocol.
- @retval EFI_ABORTED The callback function aborted the DHCP Protocol.
- @retval EFI_TIMEOUT The DHCP Protocol timed out.
- @retval EFI_ICMP_ERROR An ICMP error packet was received during the DHCP session.
- @retval EFI_NO_RESPONSE Valid PXE offer was not received.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcDhcp (
- IN EFI_PXE_BASE_CODE_PROTOCOL *This,
- IN BOOLEAN SortOffers
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- EFI_PXE_BASE_CODE_MODE *Mode;
- EFI_DHCP4_PROTOCOL *Dhcp4;
- EFI_DHCP4_CONFIG_DATA Dhcp4CfgData;
- EFI_DHCP4_MODE_DATA Dhcp4Mode;
- EFI_DHCP4_PACKET_OPTION *OptList[PXEBC_DHCP4_MAX_OPTION_NUM];
- UINT32 OptCount;
- EFI_STATUS Status;
- EFI_ARP_CONFIG_DATA ArpConfigData;
- EFI_PXE_BASE_CODE_IP_FILTER IpFilter;
-
- if (This == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Status = EFI_SUCCESS;
- Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
- Mode = Private->PxeBc.Mode;
- Dhcp4 = Private->Dhcp4;
- Private->Function = EFI_PXE_BASE_CODE_FUNCTION_DHCP;
- Private->SortOffers = SortOffers;
-
- if (!Mode->Started) {
- return EFI_NOT_STARTED;
- }
-
- Mode->IcmpErrorReceived = FALSE;
-
- //
- // Stop Udp4Read instance
- //
- Private->Udp4Read->Configure (Private->Udp4Read, NULL);
-
- //
- // Initialize the DHCP options and build the option list
- //
- OptCount = PxeBcBuildDhcpOptions (Private, OptList, TRUE);
-
- //
- // Set the DHCP4 config data.
- // The four discovery timeouts are 4, 8, 16, 32 seconds respectively.
- //
- ZeroMem (&Dhcp4CfgData, sizeof (EFI_DHCP4_CONFIG_DATA));
- Dhcp4CfgData.OptionCount = OptCount;
- Dhcp4CfgData.OptionList = OptList;
- Dhcp4CfgData.Dhcp4Callback = PxeBcDhcpCallBack;
- Dhcp4CfgData.CallbackContext = Private;
- Dhcp4CfgData.DiscoverTryCount = 4;
- Dhcp4CfgData.DiscoverTimeout = mPxeDhcpTimeout;
-
- Status = Dhcp4->Configure (Dhcp4, &Dhcp4CfgData);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- //
- // Zero those arrays to record the varies numbers of DHCP OFFERS.
- //
- Private->GotProxyOffer = FALSE;
- Private->NumOffers = 0;
- Private->BootpIndex = 0;
- ZeroMem (Private->ServerCount, sizeof (Private->ServerCount));
- ZeroMem (Private->ProxyIndex, sizeof (Private->ProxyIndex));
-
- Status = Dhcp4->Start (Dhcp4, NULL);
- if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {
- if (Status == EFI_ICMP_ERROR) {
- Mode->IcmpErrorReceived = TRUE;
- }
- goto ON_EXIT;
- }
-
- Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4Mode);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- ASSERT (Dhcp4Mode.State == Dhcp4Bound);
-
- CopyMem (&Private->StationIp, &Dhcp4Mode.ClientAddress, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Private->SubnetMask, &Dhcp4Mode.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Private->GatewayIp, &Dhcp4Mode.RouterAddress, sizeof (EFI_IPv4_ADDRESS));
-
- CopyMem (&Mode->StationIp, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Mode->SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS));
-
- //
- // Check the selected offer to see whether BINL is required, if no or BINL is
- // finished, set the various Mode members.
- //
- Status = PxeBcCheckSelectedOffer (Private);
-
- AsciiPrint ("\n Station IP address is ");
-
- PxeBcShowIp4Addr (&Private->StationIp.v4);
- AsciiPrint ("\n");
-
-ON_EXIT:
- if (EFI_ERROR (Status)) {
- Dhcp4->Stop (Dhcp4);
- Dhcp4->Configure (Dhcp4, NULL);
- } else {
- //
- // Remove the previously configured option list and callback function
- //
- ZeroMem (&Dhcp4CfgData, sizeof (EFI_DHCP4_CONFIG_DATA));
- Dhcp4->Configure (Dhcp4, &Dhcp4CfgData);
-
- Private->AddressIsOk = TRUE;
-
- if (!Mode->UsingIpv6) {
- //
- // If in IPv4 mode, configure the corresponding ARP with this new
- // station IP address.
- //
- ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA));
-
- ArpConfigData.SwAddressType = 0x0800;
- ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS);
- ArpConfigData.StationAddress = &Private->StationIp.v4;
-
- Private->Arp->Configure (Private->Arp, NULL);
- Private->Arp->Configure (Private->Arp, &ArpConfigData);
-
- //
- // Updated the route table. Fill the first entry.
- //
- Mode->RouteTableEntries = 1;
- Mode->RouteTable[0].IpAddr.Addr[0] = Private->StationIp.Addr[0] & Private->SubnetMask.Addr[0];
- Mode->RouteTable[0].SubnetMask.Addr[0] = Private->SubnetMask.Addr[0];
- Mode->RouteTable[0].GwAddr.Addr[0] = 0;
-
- //
- // Create the default route entry if there is a default router.
- //
- if (Private->GatewayIp.Addr[0] != 0) {
- Mode->RouteTableEntries = 2;
- Mode->RouteTable[1].IpAddr.Addr[0] = 0;
- Mode->RouteTable[1].SubnetMask.Addr[0] = 0;
- Mode->RouteTable[1].GwAddr.Addr[0] = Private->GatewayIp.Addr[0];
- }
-
- //
- // Flush new station IP address into Udp4CfgData and Ip4ConfigData
- //
- CopyMem (&Private->Udp4CfgData.StationAddress, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Private->Udp4CfgData.SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Private->Ip4ConfigData.StationAddress, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Private->Ip4ConfigData.SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS));
-
- //
- // Reconfigure the Ip4 instance to capture background ICMP packets with new station Ip address.
- //
- Private->Ip4->Cancel (Private->Ip4, &Private->IcmpErrorRcvToken);
- Private->Ip4->Configure (Private->Ip4, NULL);
-
- Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4ConfigData);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpErrorRcvToken);
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
- }
- }
-
- Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData);
-
- //
- // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP
- // receive filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.
- //
- ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER));
- IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP;
- This->SetIpFilter (This, &IpFilter);
-
- return Status;
-}
-
-
-/**
- Attempts to complete the PXE Boot Server and/or boot image discovery sequence.
-
- This function attempts to complete the PXE Boot Server and/or boot image discovery
- sequence. If this sequence is completed, then EFI_SUCCESS is returned, and the
- PxeDiscoverValid, PxeDiscover, PxeReplyReceived, and PxeReply fields of the
- EFI_PXE_BASE_CODE_MODE structure are filled in. If UseBis is TRUE, then the
- PxeBisReplyReceived and PxeBisReply fields of the EFI_PXE_BASE_CODE_MODE structure
- will also be filled in. If UseBis is FALSE, then PxeBisReplyValid will be set to FALSE.
- In the structure referenced by parameter Info, the PXE Boot Server list, SrvList[],
- has two uses: It is the Boot Server IP address list used for unicast discovery
- (if the UseUCast field is TRUE), and it is the list used for Boot Server verification
- (if the MustUseList field is TRUE). Also, if the MustUseList field in that structure
- is TRUE and the AcceptAnyResponse field in the SrvList[] array is TRUE, any Boot
- Server reply of that type will be accepted. If the AcceptAnyResponse field is
- FALSE, only responses from Boot Servers with matching IP addresses will be accepted.
- This function can take at least 10 seconds to timeout and return control to the
- caller. If the Discovery sequence does not complete, then EFI_TIMEOUT will be
- returned. Please see the Preboot Execution Environment (PXE) Specification for
- additional details on the implementation of the Discovery sequence.
- If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
- then the Discovery sequence is stopped and EFI_ABORTED will be returned.
-
- @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
- @param Type The type of bootstrap to perform.
- @param Layer Pointer to the boot server layer number to discover, which must be
- PXE_BOOT_LAYER_INITIAL when a new server type is being
- discovered.
- @param UseBis TRUE if Boot Integrity Services are to be used. FALSE otherwise.
- @param Info Pointer to a data structure that contains additional information on the
- type of discovery operation that is to be performed.
-
- @retval EFI_SUCCESS The Discovery sequence has been completed.
- @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
- @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory to complete Discovery.
- @retval EFI_ABORTED The callback function aborted the Discovery sequence.
- @retval EFI_TIMEOUT The Discovery sequence timed out.
- @retval EFI_ICMP_ERROR An ICMP error packet was received during the PXE discovery
- session.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcDiscover (
- IN EFI_PXE_BASE_CODE_PROTOCOL *This,
- IN UINT16 Type,
- IN UINT16 *Layer,
- IN BOOLEAN UseBis,
- IN EFI_PXE_BASE_CODE_DISCOVER_INFO *Info OPTIONAL
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- EFI_PXE_BASE_CODE_MODE *Mode;
- EFI_PXE_BASE_CODE_DISCOVER_INFO DefaultInfo;
- EFI_PXE_BASE_CODE_DISCOVER_INFO *CreatedInfo;
- EFI_PXE_BASE_CODE_SRVLIST *SrvList;
- EFI_PXE_BASE_CODE_SRVLIST DefaultSrvList;
- PXEBC_CACHED_DHCP4_PACKET *Packet;
- PXEBC_VENDOR_OPTION *VendorOpt;
- UINT16 Index;
- EFI_STATUS Status;
- PXEBC_BOOT_SVR_ENTRY *BootSvrEntry;
- EFI_PXE_BASE_CODE_IP_FILTER IpFilter;
-
- if (This == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
- Mode = Private->PxeBc.Mode;
- BootSvrEntry = NULL;
- SrvList = NULL;
- CreatedInfo = NULL;
- Status = EFI_DEVICE_ERROR;
- Private->Function = EFI_PXE_BASE_CODE_FUNCTION_DISCOVER;
-
- if (!Private->AddressIsOk) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (!Mode->Started) {
- return EFI_NOT_STARTED;
- }
-
- //
- // Stop Udp4Read instance
- //
- Private->Udp4Read->Configure (Private->Udp4Read, NULL);
-
- Mode->IcmpErrorReceived = FALSE;
-
- //
- // If layer isn't EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL,
- // use the previous setting;
- // If info isn't offered,
- // use the cached DhcpAck and ProxyOffer packets.
- //
- ZeroMem (&DefaultInfo, sizeof (EFI_PXE_BASE_CODE_DISCOVER_INFO));
- if (*Layer != EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL) {
-
- if (!Mode->PxeDiscoverValid || !Mode->PxeReplyReceived || (!Mode->PxeBisReplyReceived && UseBis)) {
-
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
-
- DefaultInfo.IpCnt = 1;
- DefaultInfo.UseUCast = TRUE;
-
- DefaultSrvList.Type = Type;
- DefaultSrvList.AcceptAnyResponse = FALSE;
- DefaultSrvList.IpAddr.Addr[0] = Private->ServerIp.Addr[0];
-
- SrvList = &DefaultSrvList;
- Info = &DefaultInfo;
- } else if (Info == NULL) {
- //
- // Create info by the cached packet before
- //
- Packet = (Mode->ProxyOfferReceived) ? &Private->ProxyOffer : &Private->Dhcp4Ack;
- VendorOpt = &Packet->PxeVendorOption;
-
- if (!Mode->DhcpAckReceived || !IS_VALID_DISCOVER_VENDOR_OPTION (VendorOpt->BitMap)) {
- //
- // Address is not acquired or no discovery options.
- //
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
-
- DefaultInfo.UseMCast = (BOOLEAN)!IS_DISABLE_MCAST_DISCOVER (VendorOpt->DiscoverCtrl);
- DefaultInfo.UseBCast = (BOOLEAN)!IS_DISABLE_BCAST_DISCOVER (VendorOpt->DiscoverCtrl);
- DefaultInfo.MustUseList = (BOOLEAN) IS_ENABLE_USE_SERVER_LIST (VendorOpt->DiscoverCtrl);
- DefaultInfo.UseUCast = DefaultInfo.MustUseList;
-
- if (DefaultInfo.UseMCast) {
- //
- // Get the multicast discover ip address from vendor option.
- //
- CopyMem (
- &DefaultInfo.ServerMCastIp.Addr,
- &VendorOpt->DiscoverMcastIp,
- sizeof (EFI_IPv4_ADDRESS)
- );
- }
-
- DefaultInfo.IpCnt = 0;
- Info = &DefaultInfo;
- SrvList = Info->SrvList;
-
- if (DefaultInfo.MustUseList) {
- BootSvrEntry = VendorOpt->BootSvr;
- Status = EFI_INVALID_PARAMETER;
-
- while (((UINT8) (BootSvrEntry - VendorOpt->BootSvr)) < VendorOpt->BootSvrLen) {
-
- if (BootSvrEntry->Type == HTONS (Type)) {
- Status = EFI_SUCCESS;
- break;
- }
-
- BootSvrEntry = GET_NEXT_BOOT_SVR_ENTRY (BootSvrEntry);
- }
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- DefaultInfo.IpCnt = BootSvrEntry->IpCnt;
-
- if (DefaultInfo.IpCnt >= 1) {
- CreatedInfo = AllocatePool (sizeof (DefaultInfo) + (DefaultInfo.IpCnt - 1) * sizeof (*SrvList));
- if (CreatedInfo == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ON_EXIT;
-
- }
-
- CopyMem (CreatedInfo, &DefaultInfo, sizeof (DefaultInfo));
- Info = CreatedInfo;
- SrvList = Info->SrvList;
- }
-
- for (Index = 0; Index < DefaultInfo.IpCnt; Index++) {
- CopyMem (&SrvList[Index].IpAddr, &BootSvrEntry->IpAddr[Index], sizeof (EFI_IPv4_ADDRESS));
- SrvList[Index].AcceptAnyResponse = FALSE;
- SrvList[Index].Type = BootSvrEntry->Type;
- }
- }
-
- } else {
-
- SrvList = Info->SrvList;
-
- if (!SrvList[0].AcceptAnyResponse) {
-
- for (Index = 1; Index < Info->IpCnt; Index++) {
- if (SrvList[Index].AcceptAnyResponse) {
- break;
- }
- }
-
- if (Index != Info->IpCnt) {
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
- }
- }
-
- if ((!Info->UseUCast && !Info->UseBCast && !Info->UseMCast) || (Info->MustUseList && Info->IpCnt == 0)) {
-
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
- //
- // Execute discover by UniCast/BroadCast/MultiCast
- //
- if (Info->UseUCast) {
-
- for (Index = 0; Index < Info->IpCnt; Index++) {
-
- if (BootSvrEntry == NULL) {
- Private->ServerIp.Addr[0] = SrvList[Index].IpAddr.Addr[0];
- } else {
- CopyMem (
- &Private->ServerIp,
- &BootSvrEntry->IpAddr[Index],
- sizeof (EFI_IPv4_ADDRESS)
- );
- }
-
- Status = PxeBcDiscvBootService (
- Private,
- Type,
- Layer,
- UseBis,
- &SrvList[Index].IpAddr,
- 0,
- NULL,
- TRUE,
- &Private->PxeReply.Packet.Ack
- );
- if (!EFI_ERROR (Status)) {
- break;
- }
- }
-
- } else if (Info->UseMCast) {
-
- Status = PxeBcDiscvBootService (
- Private,
- Type,
- Layer,
- UseBis,
- &Info->ServerMCastIp,
- 0,
- NULL,
- TRUE,
- &Private->PxeReply.Packet.Ack
- );
-
- } else if (Info->UseBCast) {
-
- Status = PxeBcDiscvBootService (
- Private,
- Type,
- Layer,
- UseBis,
- NULL,
- Info->IpCnt,
- SrvList,
- TRUE,
- &Private->PxeReply.Packet.Ack
- );
- }
-
- if (EFI_ERROR (Status) || !Mode->PxeReplyReceived || (!Mode->PxeBisReplyReceived && UseBis)) {
- if (Status == EFI_ICMP_ERROR) {
- Mode->IcmpErrorReceived = TRUE;
- } else {
- Status = EFI_DEVICE_ERROR;
- }
- goto ON_EXIT;
- } else {
- PxeBcParseCachedDhcpPacket (&Private->PxeReply);
- }
-
- if (Mode->PxeBisReplyReceived) {
- CopyMem (
- &Private->ServerIp,
- &Mode->PxeReply.Dhcpv4.BootpSiAddr,
- sizeof (EFI_IPv4_ADDRESS)
- );
- }
-
- if (CreatedInfo != NULL) {
- FreePool (CreatedInfo);
- }
-
-ON_EXIT:
-
- Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData);
-
- //
- // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP
- // receive filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.
- //
- ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER));
- IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP;
- This->SetIpFilter (This, &IpFilter);
-
- return Status;
-}
-
-
-/**
- Used to perform TFTP and MTFTP services.
-
- This function is used to perform TFTP and MTFTP services. This includes the
- TFTP operations to get the size of a file, read a directory, read a file, and
- write a file. It also includes the MTFTP operations to get the size of a file,
- read a directory, and read a file. The type of operation is specified by Operation.
- If the callback function that is invoked during the TFTP/MTFTP operation does
- not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then EFI_ABORTED will
- be returned.
- For read operations, the return data will be placed in the buffer specified by
- BufferPtr. If BufferSize is too small to contain the entire downloaded file,
- then EFI_BUFFER_TOO_SMALL will be returned and BufferSize will be set to zero
- or the size of the requested file (the size of the requested file is only returned
- if the TFTP server supports TFTP options). If BufferSize is large enough for the
- read operation, then BufferSize will be set to the size of the downloaded file,
- and EFI_SUCCESS will be returned. Applications using the PxeBc.Mtftp() services
- should use the get-file-size operations to determine the size of the downloaded
- file prior to using the read-file operations-especially when downloading large
- (greater than 64 MB) files-instead of making two calls to the read-file operation.
- Following this recommendation will save time if the file is larger than expected
- and the TFTP server does not support TFTP option extensions. Without TFTP option
- extension support, the client has to download the entire file, counting and discarding
- the received packets, to determine the file size.
- For write operations, the data to be sent is in the buffer specified by BufferPtr.
- BufferSize specifies the number of bytes to send. If the write operation completes
- successfully, then EFI_SUCCESS will be returned.
- For TFTP "get file size" operations, the size of the requested file or directory
- is returned in BufferSize, and EFI_SUCCESS will be returned. If the TFTP server
- does not support options, the file will be downloaded into a bit bucket and the
- length of the downloaded file will be returned. For MTFTP "get file size" operations,
- if the MTFTP server does not support the "get file size" option, EFI_UNSUPPORTED
- will be returned.
- This function can take up to 10 seconds to timeout and return control to the caller.
- If the TFTP sequence does not complete, EFI_TIMEOUT will be returned.
- If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
- then the TFTP sequence is stopped and EFI_ABORTED will be returned.
- The format of the data returned from a TFTP read directory operation is a null-terminated
- filename followed by a null-terminated information string, of the form
- "size year-month-day hour:minute:second" (i.e. %d %d-%d-%d %d:%d:%f - note that
- the seconds field can be a decimal number), where the date and time are UTC. For
- an MTFTP read directory command, there is additionally a null-terminated multicast
- IP address preceding the filename of the form %d.%d.%d.%d for IP v4. The final
- entry is itself null-terminated, so that the final information string is terminated
- with two null octets.
-
- @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
- @param Operation The type of operation to perform.
- @param BufferPtr A pointer to the data buffer.
- @param Overwrite Only used on write file operations. TRUE if a file on a remote server can
- be overwritten.
- @param BufferSize For get-file-size operations, *BufferSize returns the size of the
- requested file.
- @param BlockSize The requested block size to be used during a TFTP transfer.
- @param ServerIp The TFTP / MTFTP server IP address.
- @param Filename A Null-terminated ASCII string that specifies a directory name or a file
- name.
- @param Info Pointer to the MTFTP information.
- @param DontUseBuffer Set to FALSE for normal TFTP and MTFTP read file operation.
-
- @retval EFI_SUCCESS The TFTP/MTFTP operation was completed.
- @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
- @retval EFI_BUFFER_TOO_SMALL The buffer is not large enough to complete the read operation.
- @retval EFI_ABORTED The callback function aborted the TFTP/MTFTP operation.
- @retval EFI_TIMEOUT The TFTP/MTFTP operation timed out.
- @retval EFI_ICMP_ERROR An ICMP error packet was received during the MTFTP session.
- @retval EFI_TFTP_ERROR A TFTP error packet was received during the MTFTP session.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcMtftp (
- IN EFI_PXE_BASE_CODE_PROTOCOL *This,
- IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation,
- IN OUT VOID *BufferPtr,
- IN BOOLEAN Overwrite,
- IN OUT UINT64 *BufferSize,
- IN UINTN *BlockSize OPTIONAL,
- IN EFI_IP_ADDRESS *ServerIp,
- IN UINT8 *Filename,
- IN EFI_PXE_BASE_CODE_MTFTP_INFO *Info OPTIONAL,
- IN BOOLEAN DontUseBuffer
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- EFI_MTFTP4_CONFIG_DATA Mtftp4Config;
- EFI_STATUS Status;
- EFI_PXE_BASE_CODE_MODE *Mode;
- EFI_MAC_ADDRESS TempMacAddr;
- EFI_PXE_BASE_CODE_IP_FILTER IpFilter;
-
- if ((This == NULL) ||
- (Filename == NULL) ||
- (BufferSize == NULL) ||
- ((ServerIp == NULL) ||
- (IP4_IS_UNSPECIFIED (NTOHL (ServerIp->Addr[0])) ||
- IP4_IS_LOCAL_BROADCAST (NTOHL (ServerIp->Addr[0])))) ||
- ((BufferPtr == NULL) && DontUseBuffer) ||
- ((BlockSize != NULL) && (*BlockSize < 512))) {
-
- return EFI_INVALID_PARAMETER;
- }
-
- Status = EFI_DEVICE_ERROR;
- Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
- Mode = &Private->Mode;
-
- if (!Mode->AutoArp) {
- //
- // If AutoArp is set false, check arp cache
- //
- UpdateArpCache (This);
- if (!FindInArpCache (Mode, &ServerIp->v4, &TempMacAddr)) {
- return EFI_DEVICE_ERROR;
- }
- }
-
- //
- // Stop Udp4Read instance
- //
- Private->Udp4Read->Configure (Private->Udp4Read, NULL);
-
- Mode->TftpErrorReceived = FALSE;
- Mode->IcmpErrorReceived = FALSE;
-
- Mtftp4Config.UseDefaultSetting = FALSE;
- Mtftp4Config.TimeoutValue = PXEBC_MTFTP_TIMEOUT;
- Mtftp4Config.TryCount = PXEBC_MTFTP_RETRIES;
-
- CopyMem (
- &Mtftp4Config.StationIp,
- &Private->StationIp,
- sizeof (EFI_IPv4_ADDRESS)
- );
- CopyMem (
- &Mtftp4Config.SubnetMask,
- &Private->SubnetMask,
- sizeof (EFI_IPv4_ADDRESS)
- );
- CopyMem (
- &Mtftp4Config.GatewayIp,
- &Private->GatewayIp,
- sizeof (EFI_IPv4_ADDRESS)
- );
- CopyMem (
- &Mtftp4Config.ServerIp,
- ServerIp,
- sizeof (EFI_IPv4_ADDRESS)
- );
-
- switch (Operation) {
-
- case EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE:
-
- Status = PxeBcTftpGetFileSize (
- Private,
- &Mtftp4Config,
- Filename,
- BlockSize,
- BufferSize
- );
-
- break;
-
- case EFI_PXE_BASE_CODE_TFTP_READ_FILE:
-
- Status = PxeBcTftpReadFile (
- Private,
- &Mtftp4Config,
- Filename,
- BlockSize,
- BufferPtr,
- BufferSize,
- DontUseBuffer
- );
-
- break;
-
- case EFI_PXE_BASE_CODE_TFTP_WRITE_FILE:
-
- Status = PxeBcTftpWriteFile (
- Private,
- &Mtftp4Config,
- Filename,
- Overwrite,
- BlockSize,
- BufferPtr,
- BufferSize
- );
-
- break;
-
- case EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY:
-
- Status = PxeBcTftpReadDirectory (
- Private,
- &Mtftp4Config,
- Filename,
- BlockSize,
- BufferPtr,
- BufferSize,
- DontUseBuffer
- );
-
- break;
-
- case EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE:
- case EFI_PXE_BASE_CODE_MTFTP_READ_FILE:
- case EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY:
- Status = EFI_UNSUPPORTED;
- break;
-
- default:
-
- Status = EFI_INVALID_PARAMETER;
- break;
- }
-
- if (Status == EFI_ICMP_ERROR) {
- Mode->IcmpErrorReceived = TRUE;
- }
-
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
-ON_EXIT:
- Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData);
- //
- // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP
- // receive filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.
- //
- ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER));
- IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP;
- This->SetIpFilter (This, &IpFilter);
-
- return Status;
-}
-
-
-/**
- Writes a UDP packet to the network interface.
-
- This function writes a UDP packet specified by the (optional HeaderPtr and)
- BufferPtr parameters to the network interface. The UDP header is automatically
- built by this routine. It uses the parameters OpFlags, DestIp, DestPort, GatewayIp,
- SrcIp, and SrcPort to build this header. If the packet is successfully built and
- transmitted through the network interface, then EFI_SUCCESS will be returned.
- If a timeout occurs during the transmission of the packet, then EFI_TIMEOUT will
- be returned. If an ICMP error occurs during the transmission of the packet, then
- the IcmpErrorReceived field is set to TRUE, the IcmpError field is filled in and
- EFI_ICMP_ERROR will be returned. If the Callback Protocol does not return
- EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then EFI_ABORTED will be returned.
-
- @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
- @param OpFlags The UDP operation flags.
- @param DestIp The destination IP address.
- @param DestPort The destination UDP port number.
- @param GatewayIp The gateway IP address.
- @param SrcIp The source IP address.
- @param SrcPort The source UDP port number.
- @param HeaderSize An optional field which may be set to the length of a header at
- HeaderPtr to be prefixed to the data at BufferPtr.
- @param HeaderPtr If HeaderSize is not NULL, a pointer to a header to be prefixed to the
- data at BufferPtr.
- @param BufferSize A pointer to the size of the data at BufferPtr.
- @param BufferPtr A pointer to the data to be written.
-
- @retval EFI_SUCCESS The UDP Write operation was completed.
- @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_BAD_BUFFER_SIZE The buffer is too long to be transmitted.
- @retval EFI_ABORTED The callback function aborted the UDP Write operation.
- @retval EFI_TIMEOUT The UDP Write operation timed out.
- @retval EFI_ICMP_ERROR An ICMP error packet was received during the UDP write session.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcUdpWrite (
- IN EFI_PXE_BASE_CODE_PROTOCOL *This,
- IN UINT16 OpFlags,
- IN EFI_IP_ADDRESS *DestIp,
- IN EFI_PXE_BASE_CODE_UDP_PORT *DestPort,
- IN EFI_IP_ADDRESS *GatewayIp OPTIONAL,
- IN EFI_IP_ADDRESS *SrcIp OPTIONAL,
- IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL,
- IN UINTN *HeaderSize OPTIONAL,
- IN VOID *HeaderPtr OPTIONAL,
- IN UINTN *BufferSize,
- IN VOID *BufferPtr
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- EFI_UDP4_PROTOCOL *Udp4;
- EFI_UDP4_COMPLETION_TOKEN Token;
- EFI_UDP4_TRANSMIT_DATA *Udp4TxData;
- UINT32 FragCount;
- UINT32 DataLength;
- EFI_UDP4_SESSION_DATA Udp4Session;
- EFI_STATUS Status;
- BOOLEAN IsDone;
- EFI_PXE_BASE_CODE_MODE *Mode;
- EFI_MAC_ADDRESS TempMacAddr;
-
- IsDone = FALSE;
-
- if ((This == NULL) || (DestIp == NULL) || (DestPort == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if ((GatewayIp != NULL) && (IP4_IS_UNSPECIFIED (NTOHL (GatewayIp->Addr[0])) || IP4_IS_LOCAL_BROADCAST (NTOHL (GatewayIp->Addr[0])))) {
- //
- // Gateway is provided but it's not a unicast IP address.
- //
- return EFI_INVALID_PARAMETER;
- }
-
- if ((HeaderSize != NULL) && ((*HeaderSize == 0) || (HeaderPtr == NULL))) {
- //
- // The HeaderSize ptr isn't NULL and: 1. the value is zero; or 2. the HeaderPtr
- // is NULL.
- //
- return EFI_INVALID_PARAMETER;
- }
-
- if ((BufferSize == NULL) || ((*BufferSize != 0) && (BufferPtr == NULL))) {
- return EFI_INVALID_PARAMETER;
- }
-
- Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
- Udp4 = Private->Udp4Write;
- Mode = &Private->Mode;
- if (!Mode->Started) {
- return EFI_NOT_STARTED;
- }
-
- if (!Private->AddressIsOk && (SrcIp == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (!Mode->AutoArp) {
- //
- // If AutoArp is set false, check arp cache
- //
- UpdateArpCache (This);
- if (!FindInArpCache (Mode, &DestIp->v4, &TempMacAddr)) {
- return EFI_DEVICE_ERROR;
- }
- }
-
- Mode->IcmpErrorReceived = FALSE;
-
- if ((Private->CurrentUdpSrcPort == 0) ||
- ((SrcPort != NULL) && (*SrcPort != Private->CurrentUdpSrcPort))) {
- //
- // Port is changed, (re)configure the Udp4Write instance
- //
- if (SrcPort != NULL) {
- Private->CurrentUdpSrcPort = *SrcPort;
- }
- }
-
- Status = PxeBcConfigureUdpWriteInstance (
- Udp4,
- &Private->StationIp.v4,
- &Private->SubnetMask.v4,
- &Private->GatewayIp.v4,
- &Private->CurrentUdpSrcPort,
- Private->Mode.TTL,
- Private->Mode.ToS
- );
- if (EFI_ERROR (Status)) {
- Private->CurrentUdpSrcPort = 0;
- return EFI_INVALID_PARAMETER;
- }
-
- ZeroMem (&Token, sizeof (EFI_UDP4_COMPLETION_TOKEN));
- ZeroMem (&Udp4Session, sizeof (EFI_UDP4_SESSION_DATA));
-
- CopyMem (&Udp4Session.DestinationAddress, DestIp, sizeof (EFI_IPv4_ADDRESS));
- Udp4Session.DestinationPort = *DestPort;
- if (SrcIp != NULL) {
- CopyMem (&Udp4Session.SourceAddress, SrcIp, sizeof (EFI_IPv4_ADDRESS));
- }
- if (SrcPort != NULL) {
- Udp4Session.SourcePort = *SrcPort;
- }
-
- FragCount = (HeaderSize != NULL) ? 2 : 1;
- Udp4TxData = (EFI_UDP4_TRANSMIT_DATA *) AllocateZeroPool (sizeof (EFI_UDP4_TRANSMIT_DATA) + (FragCount - 1) * sizeof (EFI_UDP4_FRAGMENT_DATA));
- if (Udp4TxData == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Udp4TxData->FragmentCount = FragCount;
- Udp4TxData->FragmentTable[FragCount - 1].FragmentLength = (UINT32) *BufferSize;
- Udp4TxData->FragmentTable[FragCount - 1].FragmentBuffer = BufferPtr;
- DataLength = (UINT32) *BufferSize;
-
- if (FragCount == 2) {
-
- Udp4TxData->FragmentTable[0].FragmentLength = (UINT32) *HeaderSize;
- Udp4TxData->FragmentTable[0].FragmentBuffer = HeaderPtr;
- DataLength += (UINT32) *HeaderSize;
- }
-
- if (GatewayIp != NULL) {
- Udp4TxData->GatewayAddress = (EFI_IPv4_ADDRESS *) GatewayIp;
- }
- Udp4TxData->UdpSessionData = &Udp4Session;
- Udp4TxData->DataLength = DataLength;
- Token.Packet.TxData = Udp4TxData;
-
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_NOTIFY,
- PxeBcCommonNotify,
- &IsDone,
- &Token.Event
- );
- if (EFI_ERROR (Status)) {
- goto ON_EXIT;
- }
-
- Status = Udp4->Transmit (Udp4, &Token);
- if (EFI_ERROR (Status)) {
- if (Status == EFI_ICMP_ERROR) {
- Mode->IcmpErrorReceived = TRUE;
- }
- goto ON_EXIT;
- }
-
- while (!IsDone) {
-
- Udp4->Poll (Udp4);
- }
-
- Status = Token.Status;
-
-ON_EXIT:
-
- if (Token.Event != NULL) {
- gBS->CloseEvent (Token.Event);
- }
-
- FreePool (Udp4TxData);
-
- //
- // Reset the instance.
- //
- Udp4->Configure (Udp4, NULL);
- return Status;
-}
-
-/**
- Decide whether the incoming UDP packet is acceptable per IP filter settings
- in provided PxeBcMode.
-
- @param PxeBcMode Pointer to EFI_PXE_BASE_CODE_MODE.
- @param Session Received UDP session.
-
- @retval TRUE The UDP package matches IP filters.
- @retval FALSE The UDP package doesn't matches IP filters.
-
-**/
-BOOLEAN
-CheckIpByFilter (
- IN EFI_PXE_BASE_CODE_MODE *PxeBcMode,
- IN EFI_UDP4_SESSION_DATA *Session
- )
-{
- UINTN Index;
- EFI_IPv4_ADDRESS Ip4Address;
- EFI_IPv4_ADDRESS DestIp4Address;
-
- if ((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) != 0) {
- return TRUE;
- }
-
- CopyMem (&DestIp4Address, &Session->DestinationAddress, sizeof (DestIp4Address));
- if (((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0) &&
- IP4_IS_MULTICAST (EFI_NTOHL (DestIp4Address))
- ) {
- return TRUE;
- }
-
- if (((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0) &&
- IP4_IS_LOCAL_BROADCAST (EFI_NTOHL (DestIp4Address))
- ) {
- return TRUE;
- }
-
- CopyMem (&Ip4Address, &PxeBcMode->StationIp.v4, sizeof (Ip4Address));
- if (((PxeBcMode->IpFilter.Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0) &&
- EFI_IP4_EQUAL (&Ip4Address, &DestIp4Address)
- ) {
- return TRUE;
- }
-
- ASSERT (PxeBcMode->IpFilter.IpCnt < EFI_PXE_BASE_CODE_MAX_IPCNT);
-
- for (Index = 0; Index < PxeBcMode->IpFilter.IpCnt; Index++) {
- CopyMem (
- &Ip4Address,
- &PxeBcMode->IpFilter.IpList[Index].v4,
- sizeof (Ip4Address)
- );
- if (EFI_IP4_EQUAL (&Ip4Address, &DestIp4Address)) {
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-/**
- Reads a UDP packet from the network interface.
-
- This function reads a UDP packet from a network interface. The data contents
- are returned in (the optional HeaderPtr and) BufferPtr, and the size of the
- buffer received is returned in BufferSize . If the input BufferSize is smaller
- than the UDP packet received (less optional HeaderSize), it will be set to the
- required size, and EFI_BUFFER_TOO_SMALL will be returned. In this case, the
- contents of BufferPtr are undefined, and the packet is lost. If a UDP packet is
- successfully received, then EFI_SUCCESS will be returned, and the information
- from the UDP header will be returned in DestIp, DestPort, SrcIp, and SrcPort if
- they are not NULL. Depending on the values of OpFlags and the DestIp, DestPort,
- SrcIp, and SrcPort input values, different types of UDP packet receive filtering
- will be performed. The following tables summarize these receive filter operations.
-
- @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
- @param OpFlags The UDP operation flags.
- @param DestIp The destination IP address.
- @param DestPort The destination UDP port number.
- @param SrcIp The source IP address.
- @param SrcPort The source UDP port number.
- @param HeaderSize An optional field which may be set to the length of a header at
- HeaderPtr to be prefixed to the data at BufferPtr.
- @param HeaderPtr If HeaderSize is not NULL, a pointer to a header to be prefixed to the
- data at BufferPtr.
- @param BufferSize A pointer to the size of the data at BufferPtr.
- @param BufferPtr A pointer to the data to be read.
-
- @retval EFI_SUCCESS The UDP Read operation was completed.
- @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
- @retval EFI_BUFFER_TOO_SMALL The packet is larger than Buffer can hold.
- @retval EFI_ABORTED The callback function aborted the UDP Read operation.
- @retval EFI_TIMEOUT The UDP Read operation timed out.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcUdpRead (
- IN EFI_PXE_BASE_CODE_PROTOCOL *This,
- IN UINT16 OpFlags,
- IN OUT EFI_IP_ADDRESS *DestIp OPTIONAL,
- IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort OPTIONAL,
- IN OUT EFI_IP_ADDRESS *SrcIp OPTIONAL,
- IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL,
- IN UINTN *HeaderSize OPTIONAL,
- IN VOID *HeaderPtr OPTIONAL,
- IN OUT UINTN *BufferSize,
- IN VOID *BufferPtr
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- EFI_PXE_BASE_CODE_MODE *Mode;
- EFI_UDP4_PROTOCOL *Udp4;
- EFI_UDP4_COMPLETION_TOKEN Token;
- EFI_UDP4_RECEIVE_DATA *RxData;
- EFI_UDP4_SESSION_DATA *Session;
- EFI_STATUS Status;
- BOOLEAN IsDone;
- BOOLEAN Matched;
- UINTN CopiedLen;
- UINTN HeaderLen;
- UINTN HeaderCopiedLen;
- UINTN BufferCopiedLen;
- UINT32 FragmentLength;
- UINTN FragmentIndex;
- UINT8 *FragmentBuffer;
-
- if (This == NULL || DestIp == NULL || DestPort == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) == 0 && (DestPort == NULL)) ||
- ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) == 0 && (SrcIp == NULL)) ||
- ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) == 0 && (SrcPort == NULL))) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (((HeaderSize != NULL) && (*HeaderSize == 0)) || ((HeaderSize != NULL) && (HeaderPtr == NULL))) {
- return EFI_INVALID_PARAMETER;
- }
-
- if ((BufferSize == NULL) || (BufferPtr == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
-
- Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
- Mode = Private->PxeBc.Mode;
- Udp4 = Private->Udp4Read;
-
- if (!Mode->Started) {
- return EFI_NOT_STARTED;
- }
-
- Mode->IcmpErrorReceived = FALSE;
-
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_NOTIFY,
- PxeBcCommonNotify,
- &IsDone,
- &Token.Event
- );
- if (EFI_ERROR (Status)) {
- return EFI_OUT_OF_RESOURCES;
- }
-
-TRY_AGAIN:
-
- IsDone = FALSE;
- Status = Udp4->Receive (Udp4, &Token);
- if (EFI_ERROR (Status)) {
- if (Status == EFI_ICMP_ERROR) {
- Mode->IcmpErrorReceived = TRUE;
- }
- goto ON_EXIT;
- }
-
- Udp4->Poll (Udp4);
-
- if (!IsDone) {
- Status = EFI_TIMEOUT;
- } else {
-
- //
- // check whether this packet matches the filters
- //
- if (EFI_ERROR (Token.Status)){
- goto ON_EXIT;
- }
-
- RxData = Token.Packet.RxData;
- Session = &RxData->UdpSession;
-
- Matched = TRUE;
-
- if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER) != 0) {
- Matched = FALSE;
- //
- // Check UDP package by IP filter settings
- //
- if (CheckIpByFilter (Mode, Session)) {
- Matched = TRUE;
- }
- }
-
- if (Matched) {
- Matched = FALSE;
-
- //
- // Match the destination ip of the received udp dgram
- //
- if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP) != 0) {
- Matched = TRUE;
-
- if (DestIp != NULL) {
- CopyMem (DestIp, &Session->DestinationAddress, sizeof (EFI_IPv4_ADDRESS));
- }
- } else {
- if (DestIp != NULL) {
- if (EFI_IP4_EQUAL (DestIp, &Session->DestinationAddress)) {
- Matched = TRUE;
- }
- } else {
- if (EFI_IP4_EQUAL (&Private->StationIp, &Session->DestinationAddress)) {
- Matched = TRUE;
- }
- }
- }
- }
-
- if (Matched) {
- //
- // Match the destination port of the received udp dgram
- //
- if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) != 0) {
-
- if (DestPort != NULL) {
- *DestPort = Session->DestinationPort;
- }
- } else {
-
- if (*DestPort != Session->DestinationPort) {
- Matched = FALSE;
- }
- }
- }
-
- if (Matched) {
- //
- // Match the source ip of the received udp dgram
- //
- if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP) != 0) {
-
- if (SrcIp != NULL) {
- CopyMem (SrcIp, &Session->SourceAddress, sizeof (EFI_IPv4_ADDRESS));
- }
- } else {
-
- if (!EFI_IP4_EQUAL (SrcIp, &Session->SourceAddress)) {
- Matched = FALSE;
- }
- }
- }
-
- if (Matched) {
- //
- // Match the source port of the received udp dgram
- //
- if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) != 0) {
-
- if (SrcPort != NULL) {
- *SrcPort = Session->SourcePort;
- }
- } else {
-
- if (*SrcPort != Session->SourcePort) {
- Matched = FALSE;
- }
- }
- }
-
- if (Matched) {
- ASSERT (RxData != NULL);
-
- HeaderLen = 0;
- if (HeaderSize != NULL) {
- HeaderLen = MIN (*HeaderSize, RxData->DataLength);
- }
-
- if (RxData->DataLength - HeaderLen > *BufferSize) {
- Status = EFI_BUFFER_TOO_SMALL;
- } else {
- *HeaderSize = HeaderLen;
- *BufferSize = RxData->DataLength - HeaderLen;
-
- HeaderCopiedLen = 0;
- BufferCopiedLen = 0;
- for (FragmentIndex = 0; FragmentIndex < RxData->FragmentCount; FragmentIndex++) {
- FragmentLength = RxData->FragmentTable[FragmentIndex].FragmentLength;
- FragmentBuffer = RxData->FragmentTable[FragmentIndex].FragmentBuffer;
- if (HeaderCopiedLen + FragmentLength < HeaderLen) {
- //
- // Copy the header part of received data.
- //
- CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, FragmentBuffer, FragmentLength);
- HeaderCopiedLen += FragmentLength;
- } else if (HeaderCopiedLen < HeaderLen) {
- //
- // Copy the header part of received data.
- //
- CopiedLen = HeaderLen - HeaderCopiedLen;
- CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, FragmentBuffer, CopiedLen);
- HeaderCopiedLen += CopiedLen;
-
- //
- // Copy the other part of received data.
- //
- CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, FragmentBuffer + CopiedLen, FragmentLength - CopiedLen);
- BufferCopiedLen += (FragmentLength - CopiedLen);
- } else {
- //
- // Copy the other part of received data.
- //
- CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, FragmentBuffer, FragmentLength);
- BufferCopiedLen += FragmentLength;
- }
- }
- }
- } else {
-
- Status = EFI_TIMEOUT;
- }
-
- //
- // Recycle the RxData
- //
- gBS->SignalEvent (RxData->RecycleSignal);
-
- if (!Matched) {
- goto TRY_AGAIN;
- }
- }
-
-ON_EXIT:
-
- Udp4->Cancel (Udp4, &Token);
-
- gBS->CloseEvent (Token.Event);
-
- return Status;
-}
-
-/**
- Updates the IP receive filters of a network device and enables software filtering.
-
- The NewFilter field is used to modify the network device's current IP receive
- filter settings and to enable a software filter. This function updates the IpFilter
- field of the EFI_PXE_BASE_CODE_MODE structure with the contents of NewIpFilter.
- The software filter is used when the USE_FILTER in OpFlags is set to UdpRead().
- The current hardware filter remains in effect no matter what the settings of OpFlags
- are, so that the meaning of ANY_DEST_IP set in OpFlags to UdpRead() is from those
- packets whose reception is enabled in hardware-physical NIC address (unicast),
- broadcast address, logical address or addresses (multicast), or all (promiscuous).
- UdpRead() does not modify the IP filter settings.
- Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP receive
- filter list emptied and the filter set to EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.
- If an application or driver wishes to preserve the IP receive filter settings,
- it will have to preserve the IP receive filter settings before these calls, and
- use SetIpFilter() to restore them after the calls. If incompatible filtering is
- requested (for example, PROMISCUOUS with anything else) or if the device does not
- support a requested filter setting and it cannot be accommodated in software
- (for example, PROMISCUOUS not supported), EFI_INVALID_PARAMETER will be returned.
- The IPlist field is used to enable IPs other than the StationIP. They may be
- multicast or unicast. If IPcnt is set as well as EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP,
- then both the StationIP and the IPs from the IPlist will be used.
-
- @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
- @param NewFilter Pointer to the new set of IP receive filters.
-
- @retval EFI_SUCCESS The IP receive filter settings were updated.
- @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcSetIpFilter (
- IN EFI_PXE_BASE_CODE_PROTOCOL *This,
- IN EFI_PXE_BASE_CODE_IP_FILTER *NewFilter
- )
-{
- EFI_STATUS Status;
- PXEBC_PRIVATE_DATA *Private;
- EFI_PXE_BASE_CODE_MODE *Mode;
- UINTN Index;
- EFI_UDP4_CONFIG_DATA *Udp4Cfg;
- BOOLEAN PromiscuousNeed;
- BOOLEAN AcceptPromiscuous;
- BOOLEAN AcceptBroadcast;
- BOOLEAN MultiCastUpdate;
-
- if (This == NULL) {
- DEBUG ((EFI_D_ERROR, "This == NULL.\n"));
- return EFI_INVALID_PARAMETER;
- }
-
- Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
- Mode = Private->PxeBc.Mode;
-
- if (NewFilter == NULL) {
- DEBUG ((EFI_D_ERROR, "NewFilter == NULL.\n"));
- return EFI_INVALID_PARAMETER;
- }
-
- if (NewFilter->IpCnt > EFI_PXE_BASE_CODE_MAX_IPCNT) {
- DEBUG ((EFI_D_ERROR, "NewFilter->IpCnt > %d.\n", EFI_PXE_BASE_CODE_MAX_IPCNT));
- return EFI_INVALID_PARAMETER;
- }
-
- if (!Mode->Started) {
- DEBUG ((EFI_D_ERROR, "BC was not started.\n"));
- return EFI_NOT_STARTED;
- }
-
- if (Mode->UsingIpv6) {
- DEBUG ((EFI_D_ERROR, "This driver is PXE for IPv4 Only.\n"));
- return EFI_INVALID_PARAMETER;
- }
-
- PromiscuousNeed = FALSE;
-
- for (Index = 0; Index < NewFilter->IpCnt; ++Index) {
- if (IP4_IS_LOCAL_BROADCAST (EFI_IP4 (NewFilter->IpList[Index].v4))) {
- //
- // The IP is a broadcast address.
- //
- DEBUG ((EFI_D_ERROR, "There is broadcast address in NewFilter.\n"));
- return EFI_INVALID_PARAMETER;
- }
- if ((EFI_NTOHL(Mode->StationIp) != 0) &&
- (EFI_NTOHL(Mode->SubnetMask) != 0) &&
- IP4_NET_EQUAL(EFI_NTOHL(Mode->StationIp), EFI_NTOHL(NewFilter->IpList[Index].v4), EFI_NTOHL(Mode->SubnetMask)) &&
- NetIp4IsUnicast (EFI_IP4 (NewFilter->IpList[Index].v4), EFI_NTOHL(Mode->SubnetMask)) &&
- ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0)) {
- //
- // If EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP is set and IP4 address is in IpList,
- // promiscuous mode is needed.
- //
- PromiscuousNeed = TRUE;
- }
- }
-
- AcceptPromiscuous = FALSE;
- AcceptBroadcast = FALSE;
- MultiCastUpdate = FALSE;
-
- if (PromiscuousNeed ||
- ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) != 0) ||
- ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0)
- ) {
- //
- // Configure the udp4 filter to receive all packages.
- //
- AcceptPromiscuous = TRUE;
- } else if ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0) {
- //
- // Configure the udp4 filter to receive all broadcast packages.
- //
- AcceptBroadcast = TRUE;
- }
-
- //
- // In multicast condition when Promiscuous FALSE and IpCnt no-zero.
- // Here check if there is any update of the multicast ip address. If yes,
- // we need leave the old multicast group (by Config UDP instance to NULL),
- // and join the new multicast group.
- //
- if (!AcceptPromiscuous) {
- if ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0) {
- if (Mode->IpFilter.IpCnt != NewFilter->IpCnt) {
- MultiCastUpdate = TRUE;
- } else if (CompareMem (Mode->IpFilter.IpList, NewFilter->IpList, NewFilter->IpCnt * sizeof (EFI_IP_ADDRESS)) != 0 ) {
- MultiCastUpdate = TRUE;
- }
- }
- }
-
- //
- // Check whether we need reconfigure the UDP instance.
- //
- Udp4Cfg = &Private->Udp4CfgData;
- if ((AcceptPromiscuous != Udp4Cfg->AcceptPromiscuous) ||
- (AcceptBroadcast != Udp4Cfg->AcceptBroadcast) || MultiCastUpdate) {
- //
- // Clear the UDP instance configuration, all joined groups will be left
- // during the operation.
- //
- Private->Udp4Read->Configure (Private->Udp4Read, NULL);
-
- //
- // Configure the UDP instance with the new configuration.
- //
- Udp4Cfg->AcceptPromiscuous = AcceptPromiscuous;
- Udp4Cfg->AcceptBroadcast = AcceptBroadcast;
- Status = Private->Udp4Read->Configure (Private->Udp4Read, Udp4Cfg);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // In not Promiscuous mode, need to join the new multicast group.
- //
- if (!AcceptPromiscuous) {
- for (Index = 0; Index < NewFilter->IpCnt; ++Index) {
- if (IP4_IS_MULTICAST (EFI_NTOHL (NewFilter->IpList[Index].v4))) {
- //
- // Join the mutilcast group.
- //
- Status = Private->Udp4Read->Groups (Private->Udp4Read, TRUE, &NewFilter->IpList[Index].v4);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- }
- }
- }
- }
-
-
- //
- // Save the new filter.
- //
- CopyMem (&Mode->IpFilter, NewFilter, sizeof (Mode->IpFilter));
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Uses the ARP protocol to resolve a MAC address.
-
- This function uses the ARP protocol to resolve a MAC address. The UsingIpv6 field
- of the EFI_PXE_BASE_CODE_MODE structure is used to determine if IPv4 or IPv6
- addresses are being used. The IP address specified by IpAddr is used to resolve
- a MAC address. If the ARP protocol succeeds in resolving the specified address,
- then the ArpCacheEntries and ArpCache fields of the EFI_PXE_BASE_CODE_MODE structure
- are updated, and EFI_SUCCESS is returned. If MacAddr is not NULL, the resolved
- MAC address is placed there as well. If the PXE Base Code protocol is in the
- stopped state, then EFI_NOT_STARTED is returned. If the ARP protocol encounters
- a timeout condition while attempting to resolve an address, then EFI_TIMEOUT is
- returned. If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
- then EFI_ABORTED is returned.
-
- @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
- @param IpAddr Pointer to the IP address that is used to resolve a MAC address.
- @param MacAddr If not NULL, a pointer to the MAC address that was resolved with the
- ARP protocol.
-
- @retval EFI_SUCCESS The IP or MAC address was resolved.
- @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
- @retval EFI_ICMP_ERROR Something error occur with the ICMP packet message.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcArp (
- IN EFI_PXE_BASE_CODE_PROTOCOL * This,
- IN EFI_IP_ADDRESS * IpAddr,
- IN EFI_MAC_ADDRESS * MacAddr OPTIONAL
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- EFI_PXE_BASE_CODE_MODE *Mode;
- EFI_STATUS Status;
- EFI_MAC_ADDRESS TempMacAddr;
-
- if (This == NULL || IpAddr == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
- Mode = Private->PxeBc.Mode;
-
- if (!Mode->Started) {
- return EFI_NOT_STARTED;
- }
-
- if (!Private->AddressIsOk || Mode->UsingIpv6) {
- //
- // We can't resolve the IP address if we don't have a local address now.
- // Don't have ARP for IPv6.
- //
- return EFI_INVALID_PARAMETER;
- }
-
- Mode->IcmpErrorReceived = FALSE;
-
- if (!Mode->AutoArp) {
- //
- // If AutoArp is set false, check arp cache
- //
- UpdateArpCache (This);
- if (!FindInArpCache (Mode, &IpAddr->v4, &TempMacAddr)) {
- return EFI_DEVICE_ERROR;
- }
- } else {
- Status = Private->Arp->Request (Private->Arp, &IpAddr->v4, NULL, &TempMacAddr);
- if (EFI_ERROR (Status)) {
- if (Status == EFI_ICMP_ERROR) {
- Mode->IcmpErrorReceived = TRUE;
- }
- return Status;
- }
- }
-
- if (MacAddr != NULL) {
- CopyMem (MacAddr, &TempMacAddr, sizeof (EFI_MAC_ADDRESS));
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Updates the parameters that affect the operation of the PXE Base Code Protocol.
-
- This function sets parameters that affect the operation of the PXE Base Code Protocol.
- The parameter specified by NewAutoArp is used to control the generation of ARP
- protocol packets. If NewAutoArp is TRUE, then ARP Protocol packets will be generated
- as required by the PXE Base Code Protocol. If NewAutoArp is FALSE, then no ARP
- Protocol packets will be generated. In this case, the only mappings that are
- available are those stored in the ArpCache of the EFI_PXE_BASE_CODE_MODE structure.
- If there are not enough mappings in the ArpCache to perform a PXE Base Code Protocol
- service, then the service will fail. This function updates the AutoArp field of
- the EFI_PXE_BASE_CODE_MODE structure to NewAutoArp.
- The SetParameters() call must be invoked after a Callback Protocol is installed
- to enable the use of callbacks.
-
- @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
- @param NewAutoArp If not NULL, a pointer to a value that specifies whether to replace the
- current value of AutoARP.
- @param NewSendGUID If not NULL, a pointer to a value that specifies whether to replace the
- current value of SendGUID.
- @param NewTTL If not NULL, a pointer to be used in place of the current value of TTL,
- the "time to live" field of the IP header.
- @param NewToS If not NULL, a pointer to be used in place of the current value of ToS,
- the "type of service" field of the IP header.
- @param NewMakeCallback If not NULL, a pointer to a value that specifies whether to replace the
- current value of the MakeCallback field of the Mode structure.
-
- @retval EFI_SUCCESS The new parameters values were updated.
- @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcSetParameters (
- IN EFI_PXE_BASE_CODE_PROTOCOL *This,
- IN BOOLEAN *NewAutoArp OPTIONAL,
- IN BOOLEAN *NewSendGUID OPTIONAL,
- IN UINT8 *NewTTL OPTIONAL,
- IN UINT8 *NewToS OPTIONAL,
- IN BOOLEAN *NewMakeCallback // OPTIONAL
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- EFI_PXE_BASE_CODE_MODE *Mode;
- EFI_STATUS Status;
-
- Status = EFI_SUCCESS;
-
- if (This == NULL) {
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
-
- Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
- Mode = Private->PxeBc.Mode;
-
- if (NewSendGUID != NULL && *NewSendGUID) {
- //
- // FixMe, cann't locate SendGuid
- //
- }
-
- if (NewMakeCallback != NULL && *NewMakeCallback) {
-
- Status = gBS->HandleProtocol (
- Private->Controller,
- &gEfiPxeBaseCodeCallbackProtocolGuid,
- (VOID **) &Private->PxeBcCallback
- );
- if (EFI_ERROR (Status) || (Private->PxeBcCallback->Callback == NULL)) {
-
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
- }
-
- if (!Mode->Started) {
- Status = EFI_NOT_STARTED;
- goto ON_EXIT;
- }
-
- if (NewMakeCallback != NULL) {
-
- if (*NewMakeCallback) {
- //
- // Update the Callback protocol.
- //
- Status = gBS->HandleProtocol (
- Private->Controller,
- &gEfiPxeBaseCodeCallbackProtocolGuid,
- (VOID **) &Private->PxeBcCallback
- );
-
- if (EFI_ERROR (Status) || (Private->PxeBcCallback->Callback == NULL)) {
- Status = EFI_INVALID_PARAMETER;
- goto ON_EXIT;
- }
- } else {
- Private->PxeBcCallback = NULL;
- }
-
- Mode->MakeCallbacks = *NewMakeCallback;
- }
-
- if (NewAutoArp != NULL) {
- Mode->AutoArp = *NewAutoArp;
- }
-
- if (NewSendGUID != NULL) {
- Mode->SendGUID = *NewSendGUID;
- }
-
- if (NewTTL != NULL) {
- Mode->TTL = *NewTTL;
- }
-
- if (NewToS != NULL) {
- Mode->ToS = *NewToS;
- }
-
-ON_EXIT:
- return Status;
-}
-
-/**
- Updates the station IP address and/or subnet mask values of a network device.
-
- This function updates the station IP address and/or subnet mask values of a network
- device. The NewStationIp field is used to modify the network device's current IP address.
- If NewStationIP is NULL, then the current IP address will not be modified. Otherwise,
- this function updates the StationIp field of the EFI_PXE_BASE_CODE_MODE structure
- with NewStationIp. The NewSubnetMask field is used to modify the network device's current subnet
- mask. If NewSubnetMask is NULL, then the current subnet mask will not be modified.
- Otherwise, this function updates the SubnetMask field of the EFI_PXE_BASE_CODE_MODE
- structure with NewSubnetMask.
-
- @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
- @param NewStationIp Pointer to the new IP address to be used by the network device.
- @param NewSubnetMask Pointer to the new subnet mask to be used by the network device.
-
- @retval EFI_SUCCESS The new station IP address and/or subnet mask were updated.
- @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcSetStationIP (
- IN EFI_PXE_BASE_CODE_PROTOCOL * This,
- IN EFI_IP_ADDRESS * NewStationIp OPTIONAL,
- IN EFI_IP_ADDRESS * NewSubnetMask OPTIONAL
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- EFI_PXE_BASE_CODE_MODE *Mode;
- EFI_ARP_CONFIG_DATA ArpConfigData;
-
- if (This == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (NewSubnetMask != NULL && !IP4_IS_VALID_NETMASK (NTOHL (NewSubnetMask->Addr[0]))) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (NewStationIp != NULL) {
- if (IP4_IS_UNSPECIFIED(NTOHL (NewStationIp->Addr[0])) ||
- IP4_IS_LOCAL_BROADCAST(NTOHL (NewStationIp->Addr[0])) ||
- (NewSubnetMask != NULL && NewSubnetMask->Addr[0] != 0 && !NetIp4IsUnicast (NTOHL (NewStationIp->Addr[0]), NTOHL (NewSubnetMask->Addr[0])))) {
- return EFI_INVALID_PARAMETER;
- }
- }
-
- Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
- Mode = Private->PxeBc.Mode;
-
- if (!Mode->Started) {
- return EFI_NOT_STARTED;
- }
-
- if (NewStationIp != NULL) {
- CopyMem (&Mode->StationIp, NewStationIp, sizeof (EFI_IP_ADDRESS));
- CopyMem (&Private->StationIp, NewStationIp, sizeof (EFI_IP_ADDRESS));
- }
-
- if (NewSubnetMask != NULL) {
- CopyMem (&Mode->SubnetMask, NewSubnetMask, sizeof (EFI_IP_ADDRESS));
- CopyMem (&Private->SubnetMask ,NewSubnetMask, sizeof (EFI_IP_ADDRESS));
- }
-
- Private->AddressIsOk = TRUE;
-
- if (!Mode->UsingIpv6) {
- //
- // If in IPv4 mode, configure the corresponding ARP with this new
- // station IP address.
- //
- ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA));
-
- ArpConfigData.SwAddressType = 0x0800;
- ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS);
- ArpConfigData.StationAddress = &Private->StationIp.v4;
-
- Private->Arp->Configure (Private->Arp, NULL);
- Private->Arp->Configure (Private->Arp, &ArpConfigData);
-
- //
- // Update the route table.
- //
- Mode->RouteTableEntries = 1;
- Mode->RouteTable[0].IpAddr.Addr[0] = Private->StationIp.Addr[0] & Private->SubnetMask.Addr[0];
- Mode->RouteTable[0].SubnetMask.Addr[0] = Private->SubnetMask.Addr[0];
- Mode->RouteTable[0].GwAddr.Addr[0] = 0;
- }
-
- return EFI_SUCCESS;
-}
-
-/**
- Updates the contents of the cached DHCP and Discover packets.
-
- The pointers to the new packets are used to update the contents of the cached
- packets in the EFI_PXE_BASE_CODE_MODE structure.
-
- @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.
- @param NewDhcpDiscoverValid Pointer to a value that will replace the current
- DhcpDiscoverValid field.
- @param NewDhcpAckReceived Pointer to a value that will replace the current
- DhcpAckReceived field.
- @param NewProxyOfferReceived Pointer to a value that will replace the current
- ProxyOfferReceived field.
- @param NewPxeDiscoverValid Pointer to a value that will replace the current
- ProxyOfferReceived field.
- @param NewPxeReplyReceived Pointer to a value that will replace the current
- PxeReplyReceived field.
- @param NewPxeBisReplyReceived Pointer to a value that will replace the current
- PxeBisReplyReceived field.
- @param NewDhcpDiscover Pointer to the new cached DHCP Discover packet contents.
- @param NewDhcpAck Pointer to the new cached DHCP Ack packet contents.
- @param NewProxyOffer Pointer to the new cached Proxy Offer packet contents.
- @param NewPxeDiscover Pointer to the new cached PXE Discover packet contents.
- @param NewPxeReply Pointer to the new cached PXE Reply packet contents.
- @param NewPxeBisReply Pointer to the new cached PXE BIS Reply packet contents.
-
- @retval EFI_SUCCESS The cached packet contents were updated.
- @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state.
- @retval EFI_INVALID_PARAMETER This is NULL or not point to a valid EFI_PXE_BASE_CODE_PROTOCOL structure.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeBcSetPackets (
- IN EFI_PXE_BASE_CODE_PROTOCOL * This,
- IN BOOLEAN * NewDhcpDiscoverValid OPTIONAL,
- IN BOOLEAN * NewDhcpAckReceived OPTIONAL,
- IN BOOLEAN * NewProxyOfferReceived OPTIONAL,
- IN BOOLEAN * NewPxeDiscoverValid OPTIONAL,
- IN BOOLEAN * NewPxeReplyReceived OPTIONAL,
- IN BOOLEAN * NewPxeBisReplyReceived OPTIONAL,
- IN EFI_PXE_BASE_CODE_PACKET * NewDhcpDiscover OPTIONAL,
- IN EFI_PXE_BASE_CODE_PACKET * NewDhcpAck OPTIONAL,
- IN EFI_PXE_BASE_CODE_PACKET * NewProxyOffer OPTIONAL,
- IN EFI_PXE_BASE_CODE_PACKET * NewPxeDiscover OPTIONAL,
- IN EFI_PXE_BASE_CODE_PACKET * NewPxeReply OPTIONAL,
- IN EFI_PXE_BASE_CODE_PACKET * NewPxeBisReply OPTIONAL
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- EFI_PXE_BASE_CODE_MODE *Mode;
-
- if (This == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
- Mode = Private->PxeBc.Mode;
-
- if (!Mode->Started) {
- return EFI_NOT_STARTED;
- }
-
- if (NewDhcpDiscoverValid != NULL) {
- Mode->DhcpDiscoverValid = *NewDhcpDiscoverValid;
- }
-
- if (NewDhcpAckReceived != NULL) {
- Mode->DhcpAckReceived = *NewDhcpAckReceived;
- }
-
- if (NewProxyOfferReceived != NULL) {
- Mode->ProxyOfferReceived = *NewProxyOfferReceived;
- }
-
- if (NewPxeDiscoverValid != NULL) {
- Mode->PxeDiscoverValid = *NewPxeDiscoverValid;
- }
-
- if (NewPxeReplyReceived != NULL) {
- Mode->PxeReplyReceived = *NewPxeReplyReceived;
- }
-
- if (NewPxeBisReplyReceived != NULL) {
- Mode->PxeBisReplyReceived = *NewPxeBisReplyReceived;
- }
-
- if (NewDhcpDiscover != NULL) {
- CopyMem (&Mode->DhcpDiscover, NewDhcpDiscover, sizeof (EFI_PXE_BASE_CODE_PACKET));
- }
-
- if (NewDhcpAck != NULL) {
- CopyMem (&Mode->DhcpAck, NewDhcpAck, sizeof (EFI_PXE_BASE_CODE_PACKET));
- }
-
- if (NewProxyOffer != NULL) {
- CopyMem (&Mode->ProxyOffer, NewProxyOffer, sizeof (EFI_PXE_BASE_CODE_PACKET));
- }
-
- if (NewPxeDiscover != NULL) {
- CopyMem (&Mode->PxeDiscover, NewPxeDiscover, sizeof (EFI_PXE_BASE_CODE_PACKET));
- }
-
- if (NewPxeReply != NULL) {
- CopyMem (&Mode->PxeReply, NewPxeReply, sizeof (EFI_PXE_BASE_CODE_PACKET));
- }
-
- if (NewPxeBisReply != NULL) {
- CopyMem (&Mode->PxeBisReply, NewPxeBisReply, sizeof (EFI_PXE_BASE_CODE_PACKET));
- }
-
- return EFI_SUCCESS;
-}
-
-EFI_PXE_BASE_CODE_PROTOCOL mPxeBcProtocolTemplate = {
- EFI_PXE_BASE_CODE_PROTOCOL_REVISION,
- EfiPxeBcStart,
- EfiPxeBcStop,
- EfiPxeBcDhcp,
- EfiPxeBcDiscover,
- EfiPxeBcMtftp,
- EfiPxeBcUdpWrite,
- EfiPxeBcUdpRead,
- EfiPxeBcSetIpFilter,
- EfiPxeBcArp,
- EfiPxeBcSetParameters,
- EfiPxeBcSetStationIP,
- EfiPxeBcSetPackets,
- NULL
-};
-
-/**
- Callback function that is invoked when the PXE Base Code Protocol is about to transmit, has
- received, or is waiting to receive a packet.
-
- This function is invoked when the PXE Base Code Protocol is about to transmit, has received,
- or is waiting to receive a packet. Parameters Function and Received specify the type of event.
- Parameters PacketLen and Packet specify the packet that generated the event. If these fields
- are zero and NULL respectively, then this is a status update callback. If the operation specified
- by Function is to continue, then CALLBACK_STATUS_CONTINUE should be returned. If the operation
- specified by Function should be aborted, then CALLBACK_STATUS_ABORT should be returned. Due to
- the polling nature of UEFI device drivers, a callback function should not execute for more than 5 ms.
- The SetParameters() function must be called after a Callback Protocol is installed to enable the
- use of callbacks.
-
- @param This Pointer to the EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL instance.
- @param Function The PXE Base Code Protocol function that is waiting for an event.
- @param Received TRUE if the callback is being invoked due to a receive event. FALSE if
- the callback is being invoked due to a transmit event.
- @param PacketLength The length, in bytes, of Packet. This field will have a value of zero if
- this is a wait for receive event.
- @param PacketPtr If Received is TRUE, a pointer to the packet that was just received;
- otherwise a pointer to the packet that is about to be transmitted.
-
- @retval EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE if Function specifies a continue operation
- @retval EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT if Function specifies an abort operation
-
-**/
-EFI_PXE_BASE_CODE_CALLBACK_STATUS
-EFIAPI
-EfiPxeLoadFileCallback (
- IN EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL * This,
- IN EFI_PXE_BASE_CODE_FUNCTION Function,
- IN BOOLEAN Received,
- IN UINT32 PacketLength,
- IN EFI_PXE_BASE_CODE_PACKET * PacketPtr OPTIONAL
- )
-{
- EFI_INPUT_KEY Key;
- EFI_STATUS Status;
-
- //
- // Catch Ctrl-C or ESC to abort.
- //
- Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
-
- if (!EFI_ERROR (Status)) {
-
- if (Key.ScanCode == SCAN_ESC || Key.UnicodeChar == (0x1F & 'c')) {
-
- return EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT;
- }
- }
- //
- // No print if receive packet
- //
- if (Received) {
- return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE;
- }
- //
- // Print only for three functions
- //
- switch (Function) {
-
- case EFI_PXE_BASE_CODE_FUNCTION_MTFTP:
- //
- // Print only for open MTFTP packets, not every MTFTP packets
- //
- if (PacketLength != 0 && PacketPtr != NULL) {
- if (PacketPtr->Raw[0x1C] != 0x00 || PacketPtr->Raw[0x1D] != 0x01) {
- return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE;
- }
- }
- break;
-
- case EFI_PXE_BASE_CODE_FUNCTION_DHCP:
- case EFI_PXE_BASE_CODE_FUNCTION_DISCOVER:
- break;
-
- default:
- return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE;
- }
-
- if (PacketLength != 0 && PacketPtr != NULL) {
- //
- // Print '.' when transmit a packet
- //
- AsciiPrint (".");
-
- }
-
- return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE;
-}
-
-EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL mPxeBcCallBackTemplate = {
- EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_REVISION,
- EfiPxeLoadFileCallback
-};
-
-
-/**
- Find the boot file.
-
- @param Private Pointer to PxeBc private data.
- @param BufferSize Pointer to buffer size.
- @param Buffer Pointer to buffer.
-
- @retval EFI_SUCCESS Discover the boot file successfully.
- @retval EFI_TIMEOUT The TFTP/MTFTP operation timed out.
- @retval EFI_ABORTED PXE bootstrap server, so local boot need abort.
- @retval EFI_BUFFER_TOO_SMALL The buffer is too small to load the boot file.
-
-**/
-EFI_STATUS
-DiscoverBootFile (
- IN PXEBC_PRIVATE_DATA *Private,
- IN OUT UINT64 *BufferSize,
- IN VOID *Buffer
- )
-{
- EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;
- EFI_PXE_BASE_CODE_MODE *Mode;
- EFI_STATUS Status;
- UINT16 Type;
- UINT16 Layer;
- BOOLEAN UseBis;
- PXEBC_CACHED_DHCP4_PACKET *Packet;
- UINT16 Value;
-
- PxeBc = &Private->PxeBc;
- Mode = PxeBc->Mode;
- Type = EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP;
- Layer = EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL;
-
- //
- // do DHCP.
- //
- Status = PxeBc->Dhcp (PxeBc, TRUE);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Select a boot server
- //
- Status = PxeBcSelectBootPrompt (Private);
-
- if (Status == EFI_SUCCESS) {
- Status = PxeBcSelectBootMenu (Private, &Type, TRUE);
- } else if (Status == EFI_TIMEOUT) {
- Status = PxeBcSelectBootMenu (Private, &Type, FALSE);
- }
-
- if (!EFI_ERROR (Status)) {
-
- if (Type == EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP) {
- //
- // Local boot(PXE bootstrap server) need abort
- //
- return EFI_ABORTED;
- }
-
- UseBis = (BOOLEAN) (Mode->BisSupported && Mode->BisDetected);
- Status = PxeBc->Discover (PxeBc, Type, &Layer, UseBis, NULL);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- }
-
- *BufferSize = 0;
-
- //
- // Get bootfile name and (m)tftp server ip addresss
- //
- if (Mode->PxeReplyReceived) {
- Packet = &Private->PxeReply;
- } else if (Mode->ProxyOfferReceived) {
- Packet = &Private->ProxyOffer;
- } else {
- Packet = &Private->Dhcp4Ack;
- }
-
- //
- // Use siaddr(next server) in DHCPOFFER packet header, if zero, use option 54(server identifier)
- // in DHCPOFFER packet.
- // (It does not comply with PXE Spec, Ver2.1)
- //
- if (EFI_IP4_EQUAL (&Packet->Packet.Offer.Dhcp4.Header.ServerAddr, &mZeroIp4Addr)) {
- CopyMem (
- &Private->ServerIp,
- Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]->Data,
- sizeof (EFI_IPv4_ADDRESS)
- );
- } else {
- CopyMem (
- &Private->ServerIp,
- &Packet->Packet.Offer.Dhcp4.Header.ServerAddr,
- sizeof (EFI_IPv4_ADDRESS)
- );
- }
- if (Private->ServerIp.Addr[0] == 0) {
- return EFI_DEVICE_ERROR;
- }
-
- ASSERT (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL);
-
- //
- // bootlfile name
- //
- Private->BootFileName = (CHAR8 *) (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Data);
-
- if (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN] != NULL) {
- //
- // Already have the bootfile length option, compute the file size
- //
- CopyMem (&Value, Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN]->Data, sizeof (Value));
- Value = NTOHS (Value);
- *BufferSize = 512 * Value;
- Status = EFI_BUFFER_TOO_SMALL;
- } else {
- //
- // Get the bootfile size from tftp
- //
- Status = PxeBc->Mtftp (
- PxeBc,
- EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE,
- Buffer,
- FALSE,
- BufferSize,
- &Private->BlockSize,
- &Private->ServerIp,
- (UINT8 *) Private->BootFileName,
- NULL,
- FALSE
- );
- }
-
- Private->FileSize = (UINTN) *BufferSize;
-
- //
- // Display all the information: boot server address, boot file name and boot file size.
- //
- AsciiPrint ("\n Server IP address is ");
- PxeBcShowIp4Addr (&Private->ServerIp.v4);
- AsciiPrint ("\n NBP filename is %a", Private->BootFileName);
- AsciiPrint ("\n NBP filesize is %d Bytes", Private->FileSize);
-
- return Status;
-}
-
-/**
- Causes the driver to load a specified file.
-
- @param This Protocol instance pointer.
- @param FilePath The device specific path of the file to load.
- @param BootPolicy If TRUE, indicates that the request originates from the
- boot manager is attempting to load FilePath as a boot
- selection. If FALSE, then FilePath must match as exact file
- to be loaded.
- @param BufferSize On input the size of Buffer in bytes. On output with a return
- code of EFI_SUCCESS, the amount of data transferred to
- Buffer. On output with a return code of EFI_BUFFER_TOO_SMALL,
- the size of Buffer required to retrieve the requested file.
- @param Buffer The memory buffer to transfer the file to. IF Buffer is NULL,
- then no the size of the requested file is returned in
- BufferSize.
-
- @retval EFI_SUCCESS The file was loaded.
- @retval EFI_UNSUPPORTED The device does not support the provided BootPolicy
- @retval EFI_INVALID_PARAMETER FilePath is not a valid device path, or
- BufferSize is NULL.
- @retval EFI_NO_MEDIA No medium was present to load the file.
- @retval EFI_DEVICE_ERROR The file was not loaded due to a device error.
- @retval EFI_NO_RESPONSE The remote system did not respond.
- @retval EFI_NOT_FOUND The file was not found.
- @retval EFI_ABORTED The file load process was manually cancelled.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeLoadFile (
- IN EFI_LOAD_FILE_PROTOCOL * This,
- IN EFI_DEVICE_PATH_PROTOCOL * FilePath,
- IN BOOLEAN BootPolicy,
- IN OUT UINTN *BufferSize,
- IN VOID *Buffer OPTIONAL
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;
- BOOLEAN NewMakeCallback;
- EFI_STATUS Status;
- UINT64 TmpBufSize;
- EFI_STATUS MediaStatus;
-
- if (FilePath == NULL || !IsDevicePathEnd (FilePath)) {
- return EFI_INVALID_PARAMETER;
- }
-
- Private = PXEBC_PRIVATE_DATA_FROM_LOADFILE (This);
- PxeBc = &Private->PxeBc;
- NewMakeCallback = FALSE;
- Status = EFI_DEVICE_ERROR;
-
- if (This == NULL || BufferSize == NULL) {
-
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Only support BootPolicy
- //
- if (!BootPolicy) {
- return EFI_UNSUPPORTED;
- }
-
- //
- // Check media status before PXE start
- //
- MediaStatus = EFI_SUCCESS;
- NetLibDetectMediaWaitTimeout (Private->Controller, PXEBC_CHECK_MEDIA_WAITING_TIME, &MediaStatus);
- if (MediaStatus != EFI_SUCCESS) {
- return EFI_NO_MEDIA;
- }
-
- Status = PxeBc->Start (PxeBc, FALSE);
- if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {
- return Status;
- }
-
- Status = gBS->HandleProtocol (
- Private->Controller,
- &gEfiPxeBaseCodeCallbackProtocolGuid,
- (VOID **) &Private->PxeBcCallback
- );
- if (Status == EFI_UNSUPPORTED) {
-
- CopyMem (&Private->LoadFileCallback, &mPxeBcCallBackTemplate, sizeof (Private->LoadFileCallback));
-
- Status = gBS->InstallProtocolInterface (
- &Private->Controller,
- &gEfiPxeBaseCodeCallbackProtocolGuid,
- EFI_NATIVE_INTERFACE,
- &Private->LoadFileCallback
- );
-
- NewMakeCallback = (BOOLEAN) (Status == EFI_SUCCESS);
-
- Status = PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL, &NewMakeCallback);
- if (EFI_ERROR (Status)) {
- PxeBc->Stop (PxeBc);
- return Status;
- }
- }
-
- if (Private->FileSize == 0) {
- TmpBufSize = 0;
- Status = DiscoverBootFile (Private, &TmpBufSize, Buffer);
-
- if (sizeof (UINTN) < sizeof (UINT64) && (TmpBufSize > 0xFFFFFFFF)) {
- Status = EFI_DEVICE_ERROR;
- } else if (TmpBufSize > 0 && *BufferSize >= (UINTN) TmpBufSize && Buffer != NULL) {
- AsciiPrint ("\n Downloading NBP file...\n");
- *BufferSize = (UINTN) TmpBufSize;
- Status = PxeBc->Mtftp (
- PxeBc,
- EFI_PXE_BASE_CODE_TFTP_READ_FILE,
- Buffer,
- FALSE,
- &TmpBufSize,
- &Private->BlockSize,
- &Private->ServerIp,
- (UINT8 *) Private->BootFileName,
- NULL,
- FALSE
- );
- } else if (TmpBufSize > 0) {
- *BufferSize = (UINTN) TmpBufSize;
- Status = EFI_BUFFER_TOO_SMALL;
- }
- } else if (Buffer == NULL || Private->FileSize > *BufferSize) {
- *BufferSize = Private->FileSize;
- Status = EFI_BUFFER_TOO_SMALL;
- } else {
- //
- // Download the file.
- //
- AsciiPrint ("\n Downloading NBP file...\n");
- TmpBufSize = (UINT64) (*BufferSize);
- Status = PxeBc->Mtftp (
- PxeBc,
- EFI_PXE_BASE_CODE_TFTP_READ_FILE,
- Buffer,
- FALSE,
- &TmpBufSize,
- &Private->BlockSize,
- &Private->ServerIp,
- (UINT8 *) Private->BootFileName,
- NULL,
- FALSE
- );
- }
- //
- // If we added a callback protocol, now is the time to remove it.
- //
- if (NewMakeCallback) {
-
- NewMakeCallback = FALSE;
-
- PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL, &NewMakeCallback);
-
- gBS->UninstallProtocolInterface (
- Private->Controller,
- &gEfiPxeBaseCodeCallbackProtocolGuid,
- &Private->LoadFileCallback
- );
- }
-
- //
- // Check download status
- //
- if (Status == EFI_SUCCESS) {
- AsciiPrint ("\n NBP file downloaded successfully.\n");
- //
- // The DHCP4 can have only one configured child instance so we need to stop
- // reset the DHCP4 child before we return. Otherwise the other programs which
- // also need to use DHCP4 will be impacted.
- // The functionality of PXE Base Code protocol will not be stopped,
- // when downloading is successfully.
- //
- Private->Dhcp4->Stop (Private->Dhcp4);
- Private->Dhcp4->Configure (Private->Dhcp4, NULL);
- return EFI_SUCCESS;
-
- } else if (Status == EFI_BUFFER_TOO_SMALL) {
- if (Buffer != NULL) {
- AsciiPrint ("PXE-E05: Download buffer is smaller than requested file.\n");
- } else {
- //
- // The functionality of PXE Base Code protocol will not be stopped.
- //
- return Status;
- }
-
- } else if (Status == EFI_DEVICE_ERROR) {
- AsciiPrint ("PXE-E07: Network device error.\n");
-
- } else if (Status == EFI_OUT_OF_RESOURCES) {
- AsciiPrint ("PXE-E09: Could not allocate I/O buffers.\n");
-
- } else if (Status == EFI_NO_MEDIA) {
- AsciiPrint ("PXE-E12: Could not detect network connection.\n");
-
- } else if (Status == EFI_NO_RESPONSE) {
- AsciiPrint ("PXE-E16: No offer received.\n");
-
- } else if (Status == EFI_TIMEOUT) {
- AsciiPrint ("PXE-E18: Server response timeout.\n");
-
- } else if (Status == EFI_ABORTED) {
- AsciiPrint ("PXE-E21: Remote boot cancelled.\n");
-
- } else if (Status == EFI_ICMP_ERROR) {
- AsciiPrint ("PXE-E22: Client received ICMP error from server.\n");
-
- } else if (Status == EFI_TFTP_ERROR) {
- AsciiPrint ("PXE-E23: Client received TFTP error from server.\n");
-
- } else {
- AsciiPrint ("PXE-E99: Unexpected network error.\n");
- }
-
- PxeBc->Stop (PxeBc);
-
- return Status;
-}
-
-EFI_LOAD_FILE_PROTOCOL mLoadFileProtocolTemplate = { EfiPxeLoadFile };
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c
deleted file mode 100644
index 88767c8394ab..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c
+++ /dev/null
@@ -1,454 +0,0 @@
-/** @file
- PxeBc MTFTP functions.
-
-Copyright (c) 2007 - 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.
-
-**/
-
-#include "PxeBcImpl.h"
-
-CHAR8 *mMtftpOptions[PXE_MTFTP_OPTION_MAXIMUM_INDEX] = {
- "blksize",
- "timeout",
- "tsize",
- "multicast"
-};
-
-
-/**
- This is a callback function when packets received/transmitted in Mtftp driver.
-
- A callback function that is provided by the caller to intercept
- the EFI_MTFTP4_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the
- EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept
- EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to
- EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().
-
- @param This Pointer to Mtftp protocol instance
- @param Token Pointer to Mtftp token
- @param PacketLen Length of Mtftp packet
- @param Packet Pointer to Mtftp packet
-
- @retval EFI_SUCCESS Operation sucess
- @retval EFI_ABORTED Abort transfer process
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcCheckPacket (
- IN EFI_MTFTP4_PROTOCOL *This,
- IN EFI_MTFTP4_TOKEN *Token,
- IN UINT16 PacketLen,
- IN EFI_MTFTP4_PACKET *Packet
- )
-{
- PXEBC_PRIVATE_DATA *Private;
- EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback;
- EFI_STATUS Status;
-
- Private = (PXEBC_PRIVATE_DATA *) Token->Context;
- Callback = Private->PxeBcCallback;
- Status = EFI_SUCCESS;
-
- if (Packet->OpCode == EFI_MTFTP4_OPCODE_ERROR) {
- Private->Mode.TftpErrorReceived = TRUE;
- Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;
- AsciiStrnCpyS (Private->Mode.TftpError.ErrorString, PXE_MTFTP_ERROR_STRING_LENGTH, (CHAR8 *) Packet->Error.ErrorMessage, PXE_MTFTP_ERROR_STRING_LENGTH - 1);
- Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';
- }
-
- if (Callback != NULL) {
-
- Status = Callback->Callback (
- Callback,
- Private->Function,
- TRUE,
- PacketLen,
- (EFI_PXE_BASE_CODE_PACKET *) Packet
- );
- if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {
-
- Status = EFI_ABORTED;
- } else {
-
- Status = EFI_SUCCESS;
- }
- }
-
- return Status;
-}
-
-
-/**
- This function is to get size of a file by Tftp.
-
- @param Private Pointer to PxeBc private data
- @param Config Pointer to Mtftp configuration data
- @param Filename Pointer to file name
- @param BlockSize Pointer to block size
- @param BufferSize Pointer to buffer size
-
- @retval EFI_SUCCESS Get the size of file success
- @retval EFI_NOT_FOUND Parse the tftp ptions failed.
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
- @retval Other Has not get the size of the file.
-
-**/
-EFI_STATUS
-PxeBcTftpGetFileSize (
- IN PXEBC_PRIVATE_DATA *Private,
- IN EFI_MTFTP4_CONFIG_DATA *Config,
- IN UINT8 *Filename,
- IN UINTN *BlockSize,
- IN OUT UINT64 *BufferSize
- )
-{
- EFI_MTFTP4_PROTOCOL *Mtftp4;
- EFI_MTFTP4_OPTION ReqOpt[2];
- EFI_MTFTP4_PACKET *Packet;
- EFI_MTFTP4_OPTION *Option;
- UINT32 PktLen;
- UINT8 OptBuf[128];
- UINT32 OptCnt;
- EFI_STATUS Status;
-
- *BufferSize = 0;
- Status = EFI_DEVICE_ERROR;
- Mtftp4 = Private->Mtftp4;
- Packet = NULL;
- Option = NULL;
- PktLen = 0;
- OptCnt = 1;
- Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;
-
- Status = Mtftp4->Configure (Mtftp4, Config);
- if (EFI_ERROR (Status)) {
-
- return Status;
- }
-
- ReqOpt[0].OptionStr = (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX];
- UtoA10 (0, (CHAR8 *) OptBuf, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);
- ReqOpt[0].ValueStr = OptBuf;
-
- if (BlockSize != NULL) {
- ReqOpt[1].OptionStr = (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];
- ReqOpt[1].ValueStr = ReqOpt[0].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1;
- UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[1].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX - (AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1));
- OptCnt++;
- }
-
- Status = Mtftp4->GetInfo (
- Mtftp4,
- NULL,
- Filename,
- NULL,
- (UINT8) OptCnt,
- ReqOpt,
- &PktLen,
- &Packet
- );
-
- if (EFI_ERROR (Status)) {
- if (Status == EFI_TFTP_ERROR) {
- Private->Mode.TftpErrorReceived = TRUE;
- Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;
- AsciiStrnCpyS (
- Private->Mode.TftpError.ErrorString,
- PXE_MTFTP_ERROR_STRING_LENGTH,
- (CHAR8 *) Packet->Error.ErrorMessage,
- PXE_MTFTP_ERROR_STRING_LENGTH - 1
- );
- Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';
- }
- goto ON_ERROR;
- }
-
- OptCnt = 0;
-
- Status = Mtftp4->ParseOptions (
- Mtftp4,
- PktLen,
- Packet,
- (UINT32 *) &OptCnt,
- &Option
- );
-
- if (EFI_ERROR (Status)) {
-
- goto ON_ERROR;
- }
-
- Status = EFI_NOT_FOUND;
-
- while (OptCnt != 0) {
-
- if (AsciiStrnCmp ((CHAR8 *) Option[OptCnt - 1].OptionStr, "tsize", 5) == 0) {
-
- *BufferSize = AtoU64 (Option[OptCnt - 1].ValueStr);
- Status = EFI_SUCCESS;
- }
-
- OptCnt--;
- }
-
- FreePool (Option);
-
-ON_ERROR:
-
- if (Packet != NULL) {
- FreePool (Packet);
- }
-
- Mtftp4->Configure (Mtftp4, NULL);
-
- return Status;
-}
-
-
-/**
- This function is to get data of a file by Tftp.
-
- @param Private Pointer to PxeBc private data
- @param Config Pointer to Mtftp configuration data
- @param Filename Pointer to file name
- @param BlockSize Pointer to block size
- @param BufferPtr Pointer to buffer
- @param BufferSize Pointer to buffer size
- @param DontUseBuffer Indicate whether with a receive buffer
-
- @retval EFI_SUCCESS Read the data success from the special file.
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
- @retval other Read data from file failed.
-
-**/
-EFI_STATUS
-PxeBcTftpReadFile (
- IN PXEBC_PRIVATE_DATA *Private,
- IN EFI_MTFTP4_CONFIG_DATA *Config,
- IN UINT8 *Filename,
- IN UINTN *BlockSize,
- IN UINT8 *BufferPtr,
- IN OUT UINT64 *BufferSize,
- IN BOOLEAN DontUseBuffer
- )
-{
- EFI_MTFTP4_PROTOCOL *Mtftp4;
- EFI_MTFTP4_TOKEN Token;
- EFI_MTFTP4_OPTION ReqOpt[1];
- UINT32 OptCnt;
- UINT8 OptBuf[128];
- EFI_STATUS Status;
-
- Status = EFI_DEVICE_ERROR;
- Mtftp4 = Private->Mtftp4;
- OptCnt = 0;
- Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;
-
- Status = Mtftp4->Configure (Mtftp4, Config);
- if (EFI_ERROR (Status)) {
-
- return Status;
- }
-
- if (BlockSize != NULL) {
-
- ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];
- ReqOpt[0].ValueStr = OptBuf;
- UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);
- OptCnt++;
- }
-
- Token.Event = NULL;
- Token.OverrideData = NULL;
- Token.Filename = Filename;
- Token.ModeStr = NULL;
- Token.OptionCount = OptCnt;
- Token.OptionList = ReqOpt;
- Token.Context = Private;
-
- if (DontUseBuffer) {
- Token.BufferSize = 0;
- Token.Buffer = NULL;
- } else {
- Token.BufferSize = *BufferSize;
- Token.Buffer = BufferPtr;
- }
-
- Token.CheckPacket = PxeBcCheckPacket;
- Token.TimeoutCallback = NULL;
- Token.PacketNeeded = NULL;
-
- Status = Mtftp4->ReadFile (Mtftp4, &Token);
-
- *BufferSize = Token.BufferSize;
-
- Mtftp4->Configure (Mtftp4, NULL);
-
- return Status;
-}
-
-
-/**
- This function is put data of a file by Tftp.
-
- @param Private Pointer to PxeBc private data
- @param Config Pointer to Mtftp configuration data
- @param Filename Pointer to file name
- @param Overwrite Indicate whether with overwrite attribute
- @param BlockSize Pointer to block size
- @param BufferPtr Pointer to buffer
- @param BufferSize Pointer to buffer size
-
- @retval EFI_SUCCESS Write the data success into the special file.
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
- @retval other Write data into file failed.
-
-**/
-EFI_STATUS
-PxeBcTftpWriteFile (
- IN PXEBC_PRIVATE_DATA *Private,
- IN EFI_MTFTP4_CONFIG_DATA *Config,
- IN UINT8 *Filename,
- IN BOOLEAN Overwrite,
- IN UINTN *BlockSize,
- IN UINT8 *BufferPtr,
- IN OUT UINT64 *BufferSize
- )
-{
- EFI_MTFTP4_PROTOCOL *Mtftp4;
- EFI_MTFTP4_TOKEN Token;
- EFI_MTFTP4_OPTION ReqOpt[1];
- UINT32 OptCnt;
- UINT8 OptBuf[128];
- EFI_STATUS Status;
-
- Status = EFI_DEVICE_ERROR;
- Mtftp4 = Private->Mtftp4;
- OptCnt = 0;
- Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;
-
- Status = Mtftp4->Configure (Mtftp4, Config);
- if (EFI_ERROR (Status)) {
-
- return Status;
- }
-
- if (BlockSize != NULL) {
-
- ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];
- ReqOpt[0].ValueStr = OptBuf;
- UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);
- OptCnt++;
- }
-
- Token.Event = NULL;
- Token.OverrideData = NULL;
- Token.Filename = Filename;
- Token.ModeStr = NULL;
- Token.OptionCount = OptCnt;
- Token.OptionList = ReqOpt;
- Token.BufferSize = *BufferSize;
- Token.Buffer = BufferPtr;
- Token.CheckPacket = PxeBcCheckPacket;
- Token.TimeoutCallback = NULL;
- Token.PacketNeeded = NULL;
-
- Status = Mtftp4->WriteFile (Mtftp4, &Token);
- *BufferSize = Token.BufferSize;
-
- Mtftp4->Configure (Mtftp4, NULL);
-
- return Status;
-}
-
-
-/**
- This function is to get data(file) from a directory(may be a server) by Tftp.
-
- @param Private Pointer to PxeBc private data.
- @param Config Pointer to Mtftp configuration data.
- @param Filename Pointer to file name.
- @param BlockSize Pointer to block size.
- @param BufferPtr Pointer to buffer.
- @param BufferSize Pointer to buffer size.
- @param DontUseBuffer Indicate whether with a receive buffer.
-
- @retval EFI_SUCCES Get the data from the file included in directory success.
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
- @retval other Operation failed.
-
-**/
-EFI_STATUS
-PxeBcTftpReadDirectory (
- IN PXEBC_PRIVATE_DATA *Private,
- IN EFI_MTFTP4_CONFIG_DATA *Config,
- IN UINT8 *Filename,
- IN UINTN *BlockSize,
- IN UINT8 *BufferPtr,
- IN OUT UINT64 *BufferSize,
- IN BOOLEAN DontUseBuffer
- )
-{
- EFI_MTFTP4_PROTOCOL *Mtftp4;
- EFI_MTFTP4_TOKEN Token;
- EFI_MTFTP4_OPTION ReqOpt[1];
- UINT32 OptCnt;
- UINT8 OptBuf[128];
- EFI_STATUS Status;
-
- Status = EFI_DEVICE_ERROR;
- Mtftp4 = Private->Mtftp4;
- OptCnt = 0;
- Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;
-
- Status = Mtftp4->Configure (Mtftp4, Config);
- if (EFI_ERROR (Status)) {
-
- return Status;
- }
-
- if (BlockSize != NULL) {
-
- ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];
- ReqOpt[0].ValueStr = OptBuf;
- UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);
- OptCnt++;
- }
-
- Token.Event = NULL;
- Token.OverrideData = NULL;
- Token.Filename = Filename;
- Token.ModeStr = NULL;
- Token.OptionCount = OptCnt;
- Token.OptionList = ReqOpt;
- Token.Context = Private;
-
- if (DontUseBuffer) {
- Token.BufferSize = 0;
- Token.Buffer = NULL;
- } else {
- Token.BufferSize = *BufferSize;
- Token.Buffer = BufferPtr;
- }
-
- Token.CheckPacket = PxeBcCheckPacket;
- Token.TimeoutCallback = NULL;
- Token.PacketNeeded = NULL;
-
- Status = Mtftp4->ReadDirectory (Mtftp4, &Token);
-
- *BufferSize = Token.BufferSize;
-
- Mtftp4->Configure (Mtftp4, NULL);
-
- return Status;
-}
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c
deleted file mode 100644
index 1401ca5ec2fd..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/** @file
- Support routines for PxeBc.
-
-Copyright (c) 2007 - 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.
-
-**/
-
-
-#include "PxeBcImpl.h"
-
-
-/**
- The common notify function associated with various PxeBc events.
-
- @param Event The event signaled.
- @param Context The context.
-
-**/
-VOID
-EFIAPI
-PxeBcCommonNotify (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- *((BOOLEAN *) Context) = TRUE;
-}
-
-
-/**
- This function initialize(or configure) the Udp4Write instance.
-
- @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance.
- @param StationIp Pointer to the station ip address.
- @param SubnetMask Pointer to the subnetmask of the station ip address.
- @param Gateway Pointer to the gateway ip address.
- @param SrcPort Pointer to the srouce port of the station.
- @param Ttl The time to live field of the IP header.
- @param ToS The type of service field of the IP header.
-
- @retval EFI_SUCCESS The configuration settings were set, changed, or reset successfully.
- @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 following conditions are TRUE:
- @retval EFI_ALREADY_STARTED The EFI UDPv4 Protocol instance is already started/configured
- and must be stopped/reset before it can be reconfigured.
- @retval EFI_ACCESS_DENIED UdpConfigData. AllowDuplicatePort is FALSE
- and UdpConfigData.StationPort is already used by
- other instance.
- @retval EFI_OUT_OF_RESOURCES The EFI UDPv4 Protocol driver cannot allocate memory for this
- EFI UDPv4 Protocol instance.
- @retval EFI_DEVICE_ERROR An unexpected network or system error occurred and this instance
- was not opened.
- @retval Others Please examine the function Udp4->Routes(Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway) returns.
-
-**/
-EFI_STATUS
-PxeBcConfigureUdpWriteInstance (
- IN EFI_UDP4_PROTOCOL *Udp4,
- IN EFI_IPv4_ADDRESS *StationIp,
- IN EFI_IPv4_ADDRESS *SubnetMask,
- IN EFI_IPv4_ADDRESS *Gateway,
- IN OUT UINT16 *SrcPort,
- IN UINT8 Ttl,
- IN UINT8 ToS
- )
-{
- EFI_UDP4_CONFIG_DATA Udp4CfgData;
- EFI_STATUS Status;
-
- ZeroMem (&Udp4CfgData, sizeof (Udp4CfgData));
-
- Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;
- Udp4CfgData.TypeOfService = ToS;
- Udp4CfgData.TimeToLive = Ttl;
- Udp4CfgData.AllowDuplicatePort = TRUE;
-
- CopyMem (&Udp4CfgData.StationAddress, StationIp, sizeof (*StationIp));
- CopyMem (&Udp4CfgData.SubnetMask, SubnetMask, sizeof (*SubnetMask));
-
- Udp4CfgData.StationPort = *SrcPort;
-
- //
- // Reset the instance.
- //
- Udp4->Configure (Udp4, NULL);
-
- Status = Udp4->Configure (Udp4, &Udp4CfgData);
- if (!EFI_ERROR (Status) && (Gateway->Addr[0] != 0)) {
- //
- // basic configuration OK, need to add the default route entry
- //
- Status = Udp4->Routes (Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway);
- if (EFI_ERROR (Status)) {
- //
- // roll back
- //
- Udp4->Configure (Udp4, NULL);
- }
- }
-
- if (!EFI_ERROR (Status) && (*SrcPort == 0)) {
- Udp4->GetModeData (Udp4, &Udp4CfgData, NULL, NULL, NULL);
- *SrcPort = Udp4CfgData.StationPort;
- }
-
- return Status;
-}
-
-/**
- This function is to display the IPv4 address.
-
- @param[in] Ip The pointer to the IPv4 address.
-
-**/
-VOID
-PxeBcShowIp4Addr (
- IN EFI_IPv4_ADDRESS *Ip
- )
-{
- UINTN Index;
-
- for (Index = 0; Index < 4; Index++) {
- AsciiPrint ("%d", Ip->Addr[Index]);
- if (Index < 3) {
- AsciiPrint (".");
- }
- }
-}
-
-/**
- Convert number to ASCII value.
-
- @param Number Numeric value to convert to decimal ASCII value.
- @param Buffer Buffer to place ASCII version of the Number.
- @param Length Length of Buffer.
-
-**/
-VOID
-CvtNum (
- IN UINTN Number,
- IN UINT8 *Buffer,
- IN UINTN Length
- )
-{
- UINTN Remainder;
-
- for (; Length > 0; Length--) {
- Remainder = Number % 10;
- Number /= 10;
- Buffer[Length - 1] = (UINT8) ('0' + Remainder);
- }
-}
-
-
-/**
- Convert unsigned int number to decimal number.
-
- @param Number The unsigned int number will be converted.
- @param Buffer Pointer to the buffer to store the decimal number after transform.
- @param[in] BufferSize The maxsize of the buffer.
-
- @return the length of the number after transform.
-
-**/
-UINTN
-UtoA10 (
- IN UINTN Number,
- IN CHAR8 *Buffer,
- IN UINTN BufferSize
- )
-{
- UINTN Index;
- CHAR8 TempStr[64];
-
- Index = 63;
- TempStr[Index] = 0;
-
- do {
- Index--;
- TempStr[Index] = (CHAR8) ('0' + (Number % 10));
- Number = Number / 10;
- } while (Number != 0);
-
- AsciiStrCpyS (Buffer, BufferSize, &TempStr[Index]);
-
- return AsciiStrLen (Buffer);
-}
-
-
-/**
- Convert ASCII numeric string to a UINTN value.
-
- @param Buffer Pointer to the 8-byte unsigned int value.
-
- @return UINTN value of the ASCII string.
-
-**/
-UINT64
-AtoU64 (
- IN UINT8 *Buffer
- )
-{
- UINT64 Value;
- UINT8 Character;
-
- Value = 0;
- while ((Character = *Buffer++) != '\0') {
- Value = MultU64x32 (Value, 10) + (Character - '0');
- }
-
- return Value;
-}
-
diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc
index b787fb5692d3..5d042be3a862 100644
--- a/MdeModulePkg/MdeModulePkg.dsc
+++ b/MdeModulePkg/MdeModulePkg.dsc
@@ -420,7 +420,6 @@ [Components]
MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf
[Components.IA32, Components.X64, Components.AARCH64]
- MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
MdeModulePkg/Universal/DebugSupportDxe/DebugSupportDxe.inf
MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
MdeModulePkg/Universal/EbcDxe/EbcDebugger.inf
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h
deleted file mode 100644
index d8336c5e82e9..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h
+++ /dev/null
@@ -1,502 +0,0 @@
-/** @file
- Dhcp and Discover routines for PxeBc.
-
-Copyright (c) 2013, Red Hat, Inc.
-Copyright (c) 2007 - 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.
-
-**/
-
-#ifndef __EFI_PXEBC_DHCP_H__
-#define __EFI_PXEBC_DHCP_H__
-
-#define PXEBC_DHCP4_MAX_OPTION_NUM 16
-#define PXEBC_DHCP4_MAX_OPTION_SIZE 312
-#define PXEBC_DHCP4_MAX_PACKET_SIZE (sizeof (EFI_PXE_BASE_CODE_PACKET))
-
-#define PXEBC_DHCP4_S_PORT 67
-#define PXEBC_DHCP4_C_PORT 68
-#define PXEBC_BS_DOWNLOAD_PORT 69
-#define PXEBC_BS_DISCOVER_PORT 4011
-
-#define PXEBC_DHCP4_OPCODE_REQUEST 1
-#define PXEBC_DHCP4_OPCODE_REPLY 2
-#define PXEBC_DHCP4_MSG_TYPE_REQUEST 3
-#define PXEBC_DHCP4_MAGIC 0x63538263 // network byte order
-
-//
-// Sub-Options in Dhcp Vendor Option
-//
-#define PXEBC_VENDOR_TAG_MTFTP_IP 1
-#define PXEBC_VENDOR_TAG_MTFTP_CPORT 2
-#define PXEBC_VENDOR_TAG_MTFTP_SPORT 3
-#define PXEBC_VENDOR_TAG_MTFTP_TIMEOUT 4
-#define PXEBC_VENDOR_TAG_MTFTP_DELAY 5
-#define PXEBC_VENDOR_TAG_DISCOVER_CTRL 6
-#define PXEBC_VENDOR_TAG_DISCOVER_MCAST 7
-#define PXEBC_VENDOR_TAG_BOOT_SERVERS 8
-#define PXEBC_VENDOR_TAG_BOOT_MENU 9
-#define PXEBC_VENDOR_TAG_MENU_PROMPT 10
-#define PXEBC_VENDOR_TAG_MCAST_ALLOC 11
-#define PXEBC_VENDOR_TAG_CREDENTIAL_TYPES 12
-#define PXEBC_VENDOR_TAG_BOOT_ITEM 71
-
-#define PXEBC_DHCP4_DISCOVER_INIT_TIMEOUT 4
-#define PXEBC_DHCP4_DISCOVER_RETRIES 4
-
-#define PXEBC_MAX_MENU_NUM 24
-#define PXEBC_MAX_OFFER_NUM 16
-
-#define PXEBC_BOOT_REQUEST_TIMEOUT 1
-#define PXEBC_BOOT_REQUEST_RETRIES 4
-
-#define PXEBC_DHCP4_OVERLOAD_FILE 1
-#define PXEBC_DHCP4_OVERLOAD_SERVER_NAME 2
-
-//
-// The array index of the DHCP4 option tag interested
-//
-#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN 0
-#define PXEBC_DHCP4_TAG_INDEX_VENDOR 1
-#define PXEBC_DHCP4_TAG_INDEX_OVERLOAD 2
-#define PXEBC_DHCP4_TAG_INDEX_MSG_TYPE 3
-#define PXEBC_DHCP4_TAG_INDEX_SERVER_ID 4
-#define PXEBC_DHCP4_TAG_INDEX_CLASS_ID 5
-#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE 6
-#define PXEBC_DHCP4_TAG_INDEX_MAX 7
-
-//
-// The type of DHCP OFFER, arranged by priority, PXE10 has the highest priority.
-//
-#define DHCP4_PACKET_TYPE_PXE10 0
-#define DHCP4_PACKET_TYPE_WFM11A 1
-#define DHCP4_PACKET_TYPE_BINL 2
-#define DHCP4_PACKET_TYPE_DHCP_ONLY 3
-#define DHCP4_PACKET_TYPE_BOOTP 4
-#define DHCP4_PACKET_TYPE_MAX 5
-
-#define BIT(x) (1 << x)
-#define CTRL(x) (0x1F & (x))
-
-//
-// WfM11a options
-//
-#define MTFTP_VENDOR_OPTION_BIT_MAP (BIT (PXEBC_VENDOR_TAG_MTFTP_IP) | \
- BIT (PXEBC_VENDOR_TAG_MTFTP_CPORT) | \
- BIT (PXEBC_VENDOR_TAG_MTFTP_SPORT) | \
- BIT (PXEBC_VENDOR_TAG_MTFTP_TIMEOUT) | \
- BIT (PXEBC_VENDOR_TAG_MTFTP_DELAY))
-//
-// Discoverty options
-//
-#define DISCOVER_VENDOR_OPTION_BIT_MAP (BIT (PXEBC_VENDOR_TAG_DISCOVER_CTRL) | \
- BIT (PXEBC_VENDOR_TAG_DISCOVER_MCAST) | \
- BIT (PXEBC_VENDOR_TAG_BOOT_SERVERS) | \
- BIT (PXEBC_VENDOR_TAG_BOOT_MENU) | \
- BIT (PXEBC_VENDOR_TAG_MENU_PROMPT))
-
-#define IS_VALID_BOOT_PROMPT(x) \
- ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) == BIT (PXEBC_VENDOR_TAG_MENU_PROMPT))
-
-#define IS_VALID_BOOT_MENU(x) \
- ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_BOOT_MENU)) == BIT (PXEBC_VENDOR_TAG_BOOT_MENU))
-
-#define IS_VALID_MTFTP_VENDOR_OPTION(x) \
- (((UINT32) ((x)[0]) & MTFTP_VENDOR_OPTION_BIT_MAP) == MTFTP_VENDOR_OPTION_BIT_MAP)
-
-#define IS_VALID_DISCOVER_VENDOR_OPTION(x) (((UINT32) ((x)[0]) & DISCOVER_VENDOR_OPTION_BIT_MAP) != 0)
-
-#define IS_VALID_CREDENTIAL_VENDOR_OPTION(x) \
- (((UINT32) ((x)[0]) & BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) == BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES))
-
-#define IS_VALID_BOOTITEM_VENDOR_OPTION(x) \
- (((UINT32) ((x)[PXEBC_VENDOR_TAG_BOOT_ITEM / 32]) & BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32)) \
- == BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32))
-
-#define IS_DISABLE_BCAST_DISCOVER(x) (((x) & BIT (0)) == BIT (0))
-#define IS_DISABLE_MCAST_DISCOVER(x) (((x) & BIT (1)) == BIT (1))
-#define IS_ENABLE_USE_SERVER_LIST(x) (((x) & BIT (2)) == BIT (2))
-#define IS_DISABLE_PROMPT_MENU(x) (((x) & BIT (3)) == BIT (3))
-
-#define SET_VENDOR_OPTION_BIT_MAP(x, y) (((x)[(y) / 32]) = (UINT32) ((x)[(y) / 32]) | BIT ((y) % 32))
-
-#pragma pack(1)
-typedef struct {
- UINT8 ParaList[135];
-} PXEBC_DHCP4_OPTION_PARA;
-
-typedef struct {
- UINT16 Size;
-} PXEBC_DHCP4_OPTION_MAX_MESG_SIZE;
-
-typedef struct {
- UINT8 Type;
- UINT8 MajorVer;
- UINT8 MinorVer;
-} PXEBC_DHCP4_OPTION_UNDI;
-
-typedef struct {
- UINT8 Type;
-} PXEBC_DHCP4_OPTION_MESG;
-
-typedef struct {
- UINT16 Type;
-} PXEBC_DHCP4_OPTION_ARCH;
-
-#define DEFAULT_CLASS_ID_DATA "PXEClient:Arch:xxxxx:UNDI:003000"
-#define DEFAULT_UNDI_TYPE 1
-#define DEFAULT_UNDI_MAJOR 3
-#define DEFAULT_UNDI_MINOR 0
-
-typedef struct {
- UINT8 ClassIdentifier[10];
- UINT8 ArchitecturePrefix[5];
- UINT8 ArchitectureType[5];
- UINT8 Lit3[1];
- UINT8 InterfaceName[4];
- UINT8 Lit4[1];
- UINT8 UndiMajor[3];
- UINT8 UndiMinor[3];
-} PXEBC_DHCP4_OPTION_CLID;
-
-typedef struct {
- UINT8 Type;
- UINT8 Guid[16];
-} PXEBC_DHCP4_OPTION_UUID;
-
-typedef struct {
- UINT16 Type;
- UINT16 Layer;
-} PXEBC_OPTION_BOOT_ITEM;
-
-#pragma pack()
-
-typedef union {
- PXEBC_DHCP4_OPTION_PARA *Para;
- PXEBC_DHCP4_OPTION_UNDI *Undi;
- PXEBC_DHCP4_OPTION_ARCH *Arch;
- PXEBC_DHCP4_OPTION_CLID *Clid;
- PXEBC_DHCP4_OPTION_UUID *Uuid;
- PXEBC_DHCP4_OPTION_MESG *Mesg;
- PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *MaxMesgSize;
-} PXEBC_DHCP4_OPTION_ENTRY;
-
-typedef struct {
- UINT16 Type;
- UINT8 IpCnt;
- EFI_IPv4_ADDRESS IpAddr[1];
-} PXEBC_BOOT_SVR_ENTRY;
-
-typedef struct {
- UINT16 Type;
- UINT8 DescLen;
- UINT8 DescStr[1];
-} PXEBC_BOOT_MENU_ENTRY;
-
-typedef struct {
- UINT8 Timeout;
- UINT8 Prompt[1];
-} PXEBC_MENU_PROMPT;
-
-typedef struct {
- UINT32 BitMap[8];
- EFI_IPv4_ADDRESS MtftpIp;
- UINT16 MtftpCPort;
- UINT16 MtftpSPort;
- UINT8 MtftpTimeout;
- UINT8 MtftpDelay;
- UINT8 DiscoverCtrl;
- EFI_IPv4_ADDRESS DiscoverMcastIp;
- EFI_IPv4_ADDRESS McastIpBase;
- UINT16 McastIpBlock;
- UINT16 McastIpRange;
- UINT16 BootSrvType;
- UINT16 BootSrvLayer;
- PXEBC_BOOT_SVR_ENTRY *BootSvr;
- UINT8 BootSvrLen;
- PXEBC_BOOT_MENU_ENTRY *BootMenu;
- UINT8 BootMenuLen;
- PXEBC_MENU_PROMPT *MenuPrompt;
- UINT8 MenuPromptLen;
- UINT32 *CredType;
- UINT8 CredTypeLen;
-} PXEBC_VENDOR_OPTION;
-
-#define PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE (OFFSET_OF (EFI_DHCP4_PACKET, Dhcp4) + PXEBC_DHCP4_MAX_PACKET_SIZE)
-
-typedef union {
- EFI_DHCP4_PACKET Offer;
- EFI_DHCP4_PACKET Ack;
- UINT8 Buffer[PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE];
-} PXEBC_DHCP4_PACKET;
-
-typedef struct {
- PXEBC_DHCP4_PACKET Packet;
- BOOLEAN IsPxeOffer;
- UINT8 OfferType;
- EFI_DHCP4_PACKET_OPTION *Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_MAX];
- PXEBC_VENDOR_OPTION PxeVendorOption;
-} PXEBC_CACHED_DHCP4_PACKET;
-
-#define GET_NEXT_DHCP_OPTION(Opt) \
- (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + sizeof (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1)
-
-#define GET_OPTION_BUFFER_LEN(Pkt) ((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4)
-#define IS_PROXY_DHCP_OFFER(Offer) EFI_IP4_EQUAL (&((Offer)->Dhcp4.Header.YourAddr), &mZeroIp4Addr)
-
-#define GET_NEXT_BOOT_SVR_ENTRY(Ent) \
- (PXEBC_BOOT_SVR_ENTRY *) ((UINT8 *) Ent + sizeof (*(Ent)) + ((Ent)->IpCnt - 1) * sizeof (EFI_IPv4_ADDRESS))
-
-
-/**
- This function initialize the DHCP4 message instance.
-
- This function will pad each item of dhcp4 message packet.
-
- @param Seed Pointer to the message instance of the DHCP4 packet.
- @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance.
-
-**/
-VOID
-PxeBcInitSeedPacket (
- IN EFI_DHCP4_PACKET *Seed,
- IN EFI_UDP4_PROTOCOL *Udp4
- );
-
-
-/**
- Parse the cached dhcp packet.
-
- @param CachedPacket Pointer to cached dhcp packet.
-
- @retval TRUE Succeed to parse and validation.
- @retval FALSE Fail to parse or validation.
-
-**/
-BOOLEAN
-PxeBcParseCachedDhcpPacket (
- IN PXEBC_CACHED_DHCP4_PACKET *CachedPacket
- );
-
-/**
- This function is to check the selected proxy offer (include BINL dhcp offer and
- DHCP_ONLY offer ) and set the flag and copy the DHCP packets to the Pxe base code
- mode structure.
-
- @param Private Pointer to PxeBc private data.
-
- @retval EFI_SUCCESS Operational successful.
- @retval EFI_NO_RESPONSE Offer dhcp service failed.
- @retval EFI_BUFFER_TOO_SMALL Failed to copy the packet to Pxe base code mode.
-
-**/
-EFI_STATUS
-PxeBcCheckSelectedOffer (
- IN PXEBC_PRIVATE_DATA *Private
- );
-
-
-/**
- Callback routine.
-
- EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4 Protocol driver
- to intercept events that occurred in the configuration process. This structure
- provides advanced control of each state transition of the DHCP process. The
- returned status code determines the behavior of the EFI DHCPv4 Protocol driver.
- There are three possible returned values, which are described in the following
- table.
-
- @param This Pointer to the EFI DHCPv4 Protocol instance that is used to
- configure this callback function.
- @param Context Pointer to the context that is initialized by
- EFI_DHCP4_PROTOCOL.Configure().
- @param CurrentState The current operational state of the EFI DHCPv4 Protocol
- driver.
- @param Dhcp4Event The event that occurs in the current state, which usually means a
- state transition.
- @param Packet The DHCP packet that is going to be sent or already received.
- @param NewPacket The packet that is used to replace the above Packet.
-
- @retval EFI_SUCCESS Tells the EFI DHCPv4 Protocol driver to continue the DHCP process.
- @retval EFI_NOT_READY Only used in the Dhcp4Selecting state. The EFI DHCPv4 Protocol
- driver will continue to wait for more DHCPOFFER packets until the retry
- timeout expires.
- @retval EFI_ABORTED Tells the EFI DHCPv4 Protocol driver to abort the current process and
- return to the Dhcp4Init or Dhcp4InitReboot state.
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDhcpCallBack (
- IN EFI_DHCP4_PROTOCOL * This,
- IN VOID *Context,
- IN EFI_DHCP4_STATE CurrentState,
- IN EFI_DHCP4_EVENT Dhcp4Event,
- IN EFI_DHCP4_PACKET * Packet OPTIONAL,
- OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL
- );
-
-/**
- Switch the Ip4 policy to static.
-
- @param[in] Private The pointer to PXEBC_PRIVATE_DATA.
-
- @retval EFI_SUCCESS The policy is already configured to static.
- @retval Others Other error as indicated..
-
-**/
-EFI_STATUS
-PxeBcSetIp4Policy (
- IN PXEBC_PRIVATE_DATA *Private
- );
-
-/**
- Discover the boot of service and initialize the vendor option if exists.
-
- @param Private Pointer to PxeBc private data.
- @param Type PxeBc option boot item type
- @param Layer PxeBc option boot item layer
- @param UseBis Use BIS or not
- @param DestIp Ip address for server
- @param IpCount The total count of the server ip address
- @param SrvList Server list
- @param IsDiscv Discover the vendor or not
- @param Reply The dhcp4 packet of Pxe reply
-
- @retval EFI_SUCCESS Operation succeeds.
- @retval EFI_OUT_OF_RESOURCES Allocate memory pool failed.
- @retval EFI_NOT_FOUND There is no vendor option exists.
- @retval EFI_TIMEOUT Send Pxe Discover time out.
-
-**/
-EFI_STATUS
-PxeBcDiscvBootService (
- IN PXEBC_PRIVATE_DATA * Private,
- IN UINT16 Type,
- IN UINT16 *Layer,
- IN BOOLEAN UseBis,
- IN EFI_IP_ADDRESS * DestIp,
- IN UINT16 IpCount,
- IN EFI_PXE_BASE_CODE_SRVLIST * SrvList,
- IN BOOLEAN IsDiscv,
- OUT EFI_DHCP4_PACKET * Reply OPTIONAL
- );
-
-
-/**
- Initialize the DHCP options and build the option list.
-
- @param Private Pointer to PxeBc private data.
- @param OptList Pointer to a DHCP option list.
-
- @param IsDhcpDiscover Discover dhcp option or not.
-
- @return The index item number of the option list.
-
-**/
-UINT32
-PxeBcBuildDhcpOptions (
- IN PXEBC_PRIVATE_DATA *Private,
- IN EFI_DHCP4_PACKET_OPTION **OptList,
- IN BOOLEAN IsDhcpDiscover
- );
-
-
-/**
- Create the boot options.
-
- @param OptList Pointer to the list of the options
- @param Type the type of option
- @param Layer the layer of the boot options
- @param OptLen length of opotion
-
-**/
-VOID
-PxeBcCreateBootOptions (
- IN EFI_DHCP4_PACKET_OPTION *OptList,
- IN UINT16 Type,
- IN UINT16 *Layer,
- OUT UINT32 *OptLen
- );
-
-
-/**
- Parse interested dhcp options.
-
- @param Buffer Pointer to the dhcp options packet.
- @param Length The length of the dhcp options.
- @param OptTag The option OpCode.
-
- @return NULL if the buffer length is 0 and OpCode is not
- DHCP4_TAG_EOP, or the pointer to the buffer.
-
-**/
-EFI_DHCP4_PACKET_OPTION *
-PxeBcParseExtendOptions (
- IN UINT8 *Buffer,
- IN UINT32 Length,
- IN UINT8 OptTag
- );
-
-
-/**
- This function is to parse and check vendor options.
-
- @param Dhcp4Option Pointer to dhcp options
- @param VendorOption Pointer to vendor options
-
- @return TRUE if valid for vendor options, or FALSE.
-
-**/
-BOOLEAN
-PxeBcParseVendorOptions (
- IN EFI_DHCP4_PACKET_OPTION *Dhcp4Option,
- IN PXEBC_VENDOR_OPTION *VendorOption
- );
-
-
-/**
- Choose the boot prompt.
-
- @param Private Pointer to PxeBc private data.
-
- @retval EFI_SUCCESS Select boot prompt done.
- @retval EFI_TIMEOUT Select boot prompt time out.
- @retval EFI_NOT_FOUND The proxy offer is not Pxe10.
- @retval EFI_ABORTED User cancel the operation.
- @retval EFI_NOT_READY Read the input key from the keybroad has not finish.
-
-**/
-EFI_STATUS
-PxeBcSelectBootPrompt (
- IN PXEBC_PRIVATE_DATA *Private
- );
-
-
-/**
- Select the boot menu.
-
- @param Private Pointer to PxeBc private data.
- @param Type The type of the menu.
- @param UseDefaultItem Use default item or not.
-
- @retval EFI_ABORTED User cancel operation.
- @retval EFI_SUCCESS Select the boot menu success.
- @retval EFI_NOT_READY Read the input key from the keybroad has not finish.
-
-**/
-EFI_STATUS
-PxeBcSelectBootMenu (
- IN PXEBC_PRIVATE_DATA *Private,
- OUT UINT16 *Type,
- IN BOOLEAN UseDefaultItem
- );
-
-#endif
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h
deleted file mode 100644
index b7bf069dd637..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/** @file
-
-Copyright (c) 2007 - 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.
-
-**/
-
-#ifndef __EFI_PXEBC_DRIVER_H__
-#define __EFI_PXEBC_DRIVER_H__
-
-/**
- Test to see if this driver supports ControllerHandle. This service
- is called by the EFI boot service ConnectController(). In
- order to make drivers as small as possible, there are a few calling
- restrictions for this service. ConnectController() must
- follow these calling restrictions. If any other agent wishes to call
- Supported() it must also follow these calling restrictions.
- PxeBc requires DHCP4 and MTFTP4 protocols.
-
- @param This Protocol instance pointer.
- @param ControllerHandle Handle of device to test
- @param RemainingDevicePath Optional parameter use to pick a specific child
- device to start.
-
- @retval EFI_SUCCESS This driver supports this device
- @retval EFI_ALREADY_STARTED This driver is already running on this device
- @retval other This driver does not support this device
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDriverBindingSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL * This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL
- );
-
-/**
- Start this driver on ControllerHandle. This service is called by the
- EFI boot service ConnectController(). In order to make
- drivers as small as possible, there are a few calling restrictions for
- this service. ConnectController() must follow these
- calling restrictions. If any other agent wishes to call Start() it
- must also follow these calling restrictions.
-
- @param This Protocol instance pointer.
- @param ControllerHandle Handle of device to bind driver to
- @param RemainingDevicePath Optional parameter use to pick a specific child
- device to start.
-
- @retval EFI_SUCCESS This driver is added to ControllerHandle
- @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle
- @retval other This driver does not support this device
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDriverBindingStart (
- IN EFI_DRIVER_BINDING_PROTOCOL * This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL
- );
-
-/**
- Stop this driver on ControllerHandle. This service is called by the
- EFI boot service DisconnectController(). In order to
- make drivers as small as possible, there are a few calling
- restrictions for this service. DisconnectController()
- must follow these calling restrictions. If any other agent wishes
- to call Stop() it must also follow these calling restrictions.
-
- @param This Protocol instance pointer.
- @param ControllerHandle Handle of device to stop driver on
- @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of
- children is zero stop the entire bus driver.
- @param ChildHandleBuffer List of Child Handles to Stop.
-
- @retval EFI_SUCCESS This driver is removed ControllerHandle
- @retval other This driver was not removed from this device
-
-**/
-EFI_STATUS
-EFIAPI
-PxeBcDriverBindingStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- );
-
-extern EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2;
-extern EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName;
-extern EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding;
-
-#endif
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h
deleted file mode 100644
index e96b6f2c5d14..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h
+++ /dev/null
@@ -1,189 +0,0 @@
-/** @file
-
-Copyright (c) 2007 - 2016, 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.
-
-**/
-
-#ifndef __EFI_PXEBC_IMPL_H__
-#define __EFI_PXEBC_IMPL_H__
-
-
-typedef struct _PXEBC_PRIVATE_DATA PXEBC_PRIVATE_DATA;
-
-#include <Uefi.h>
-
-#include <Guid/SmBios.h>
-#include <IndustryStandard/SmBios.h>
-#include <IndustryStandard/Dhcp.h>
-#include <Protocol/Dhcp4.h>
-#include <Protocol/PxeBaseCode.h>
-#include <Protocol/Mtftp4.h>
-#include <Protocol/Udp4.h>
-#include <Protocol/LoadFile.h>
-#include <Protocol/NetworkInterfaceIdentifier.h>
-#include <Protocol/PxeBaseCodeCallBack.h>
-#include <Protocol/Arp.h>
-#include <Protocol/Ip4.h>
-#include <Protocol/Ip4Config2.h>
-
-#include <Library/DebugLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiLib.h>
-#include <Library/BaseLib.h>
-#include <Library/NetLib.h>
-#include <Library/DpcLib.h>
-#include <Library/PcdLib.h>
-
-#include "PxeBcDriver.h"
-#include "PxeBcDhcp.h"
-#include "PxeBcMtftp.h"
-#include "PxeBcSupport.h"
-
-#define PXEBC_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('P', 'X', 'E', 'P')
-#define PXEBC_MTFTP_TIMEOUT 4
-#define PXEBC_MTFTP_RETRIES 6
-#define PXEBC_DEFAULT_UDP_OVERHEAD_SIZE 8
-#define PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE 4
-#define PXEBC_DEFAULT_PACKET_SIZE 1480
-#define PXEBC_DEFAULT_LIFETIME 50000 // 50ms, unit is microsecond
-#define PXEBC_CHECK_MEDIA_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
-
-struct _PXEBC_PRIVATE_DATA {
- UINT32 Signature;
- EFI_HANDLE Controller;
- EFI_HANDLE Image;
- EFI_HANDLE ArpChild;
- EFI_HANDLE Dhcp4Child;
- EFI_HANDLE Ip4Child;
- EFI_HANDLE Mtftp4Child;
- EFI_HANDLE Udp4ReadChild;
- EFI_HANDLE Udp4WriteChild;
-
- EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *Nii;
-
- EFI_PXE_BASE_CODE_PROTOCOL PxeBc;
- EFI_LOAD_FILE_PROTOCOL LoadFile;
- EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL LoadFileCallback;
- EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *PxeBcCallback;
- EFI_ARP_PROTOCOL *Arp;
- EFI_DHCP4_PROTOCOL *Dhcp4;
- EFI_IP4_PROTOCOL *Ip4;
- EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
- EFI_IP4_CONFIG_DATA Ip4ConfigData;
- EFI_MTFTP4_PROTOCOL *Mtftp4;
- EFI_UDP4_PROTOCOL *Udp4Read;
- EFI_UDP4_PROTOCOL *Udp4Write;
- UINT16 CurrentUdpSrcPort;
- EFI_UDP4_CONFIG_DATA Udp4CfgData;
-
-
- EFI_PXE_BASE_CODE_MODE Mode;
- EFI_PXE_BASE_CODE_FUNCTION Function;
-
- CHAR8 *BootFileName;
-
- EFI_IP_ADDRESS StationIp;
- EFI_IP_ADDRESS SubnetMask;
- EFI_IP_ADDRESS GatewayIp;
- EFI_IP_ADDRESS ServerIp;
- BOOLEAN AddressIsOk;
- UINT32 Ip4MaxPacketSize;
- UINTN BlockSize;
- UINTN FileSize;
-
- UINT8 OptionBuffer[PXEBC_DHCP4_MAX_OPTION_SIZE];
- EFI_DHCP4_PACKET SeedPacket;
- EFI_MAC_ADDRESS Mac;
- UINT8 MacLen;
-
- BOOLEAN SortOffers;
- BOOLEAN GotProxyOffer;
- UINT32 NumOffers;
- UINT32 SelectedOffer;
- UINT32 ProxyOfferType;
-
- //
- // Cached packets as complements of pxe mode data
- //
- PXEBC_CACHED_DHCP4_PACKET ProxyOffer;
- PXEBC_CACHED_DHCP4_PACKET Dhcp4Ack;
- PXEBC_CACHED_DHCP4_PACKET PxeReply;
- PXEBC_CACHED_DHCP4_PACKET Dhcp4Offers[PXEBC_MAX_OFFER_NUM];
-
- //
- // Arrays for different types of offers:
- // ServerCount records the count of the servers we got the offers,
- // OfferIndex records the index of the offer sent by the server indexed by ServerCount.
- //
- UINT32 ServerCount[DHCP4_PACKET_TYPE_MAX];
- UINT32 OfferIndex[DHCP4_PACKET_TYPE_MAX][PXEBC_MAX_OFFER_NUM];
- UINT32 BootpIndex;
- UINT32 ProxyIndex[DHCP4_PACKET_TYPE_MAX];
- UINT32 BinlIndex[PXEBC_MAX_OFFER_NUM];
-
- EFI_EVENT GetArpCacheEvent;
- //
- // token and event used to get ICMP error data from IP
- //
- EFI_IP4_COMPLETION_TOKEN IcmpErrorRcvToken;
-};
-
-#define PXEBC_PRIVATE_DATA_FROM_PXEBC(a) CR (a, PXEBC_PRIVATE_DATA, PxeBc, PXEBC_PRIVATE_DATA_SIGNATURE)
-
-#define PXEBC_PRIVATE_DATA_FROM_LOADFILE(a) CR (a, PXEBC_PRIVATE_DATA, LoadFile, PXEBC_PRIVATE_DATA_SIGNATURE)
-
-#define PXEBC_PRIVATE_DATA_FROM_PXEBCCALLBACK(a) CR (a, PXEBC_PRIVATE_DATA, PxeBcCallback, PXEBC_PRIVATE_DATA_SIGNATURE)
-
-extern EFI_PXE_BASE_CODE_PROTOCOL mPxeBcProtocolTemplate;
-extern EFI_LOAD_FILE_PROTOCOL mLoadFileProtocolTemplate;
-
-/**
- Causes the driver to load a specified file.
-
- @param This Protocol instance pointer.
- @param FilePath The device specific path of the file to load.
- @param BootPolicy If TRUE, indicates that the request originates from the
- boot manager is attempting to load FilePath as a boot
- selection. If FALSE, then FilePath must match as exact file
- to be loaded.
- @param BufferSize On input the size of Buffer in bytes. On output with a return
- code of EFI_SUCCESS, the amount of data transferred to
- Buffer. On output with a return code of EFI_BUFFER_TOO_SMALL,
- the size of Buffer required to retrieve the requested file.
- @param Buffer The memory buffer to transfer the file to. IF Buffer is NULL,
- then no the size of the requested file is returned in
- BufferSize.
-
- @retval EFI_SUCCESS The file was loaded.
- @retval EFI_UNSUPPORTED The device does not support the provided BootPolicy
- @retval EFI_INVALID_PARAMETER FilePath is not a valid device path, or
- BufferSize is NULL.
- @retval EFI_NO_MEDIA No medium was present to load the file.
- @retval EFI_DEVICE_ERROR The file was not loaded due to a device error.
- @retval EFI_NO_RESPONSE The remote system did not respond.
- @retval EFI_NOT_FOUND The file was not found.
- @retval EFI_ABORTED The file load process was manually cancelled.
-
-**/
-EFI_STATUS
-EFIAPI
-EfiPxeLoadFile (
- IN EFI_LOAD_FILE_PROTOCOL * This,
- IN EFI_DEVICE_PATH_PROTOCOL * FilePath,
- IN BOOLEAN BootPolicy,
- IN OUT UINTN *BufferSize,
- IN VOID *Buffer OPTIONAL
- );
-
-#endif
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h
deleted file mode 100644
index 903dd4fbb69a..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/** @file
- Mtftp routines for PxeBc.
-
-Copyright (c) 2007 - 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.
-
-**/
-
-#ifndef __EFI_PXEBC_MTFTP_H__
-#define __EFI_PXEBC_MTFTP_H__
-
-#define PXE_MTFTP_OPTION_BLKSIZE_INDEX 0
-#define PXE_MTFTP_OPTION_TIMEOUT_INDEX 1
-#define PXE_MTFTP_OPTION_TSIZE_INDEX 2
-#define PXE_MTFTP_OPTION_MULTICAST_INDEX 3
-#define PXE_MTFTP_OPTION_MAXIMUM_INDEX 4
-
-#define PXE_MTFTP_ERROR_STRING_LENGTH 127
-#define PXE_MTFTP_OPTBUF_MAXNUM_INDEX 128
-
-
-/**
- This function is to get size of a file by Tftp.
-
- @param Private Pointer to PxeBc private data
- @param Config Pointer to Mtftp configuration data
- @param Filename Pointer to file name
- @param BlockSize Pointer to block size
- @param BufferSize Pointer to buffer size
-
- @retval EFI_SUCCESS Get the size of file success
- @retval EFI_NOT_FOUND Parse the tftp ptions failed.
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
- @retval Other Has not get the size of the file.
-
-**/
-EFI_STATUS
-PxeBcTftpGetFileSize (
- IN PXEBC_PRIVATE_DATA *Private,
- IN EFI_MTFTP4_CONFIG_DATA *Config,
- IN UINT8 *Filename,
- IN UINTN *BlockSize,
- IN OUT UINT64 *BufferSize
- );
-
-
-/**
- This function is to get data of a file by Tftp.
-
- @param Private Pointer to PxeBc private data
- @param Config Pointer to Mtftp configuration data
- @param Filename Pointer to file name
- @param BlockSize Pointer to block size
- @param BufferPtr Pointer to buffer
- @param BufferSize Pointer to buffer size
- @param DontUseBuffer Indicate whether with a receive buffer
-
- @retval EFI_SUCCESS Read the data success from the special file.
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
- @retval other Read data from file failed.
-
-**/
-EFI_STATUS
-PxeBcTftpReadFile (
- IN PXEBC_PRIVATE_DATA *Private,
- IN EFI_MTFTP4_CONFIG_DATA *Config,
- IN UINT8 *Filename,
- IN UINTN *BlockSize,
- IN UINT8 *BufferPtr,
- IN OUT UINT64 *BufferSize,
- IN BOOLEAN DontUseBuffer
- );
-
-
-/**
- This function is put data of a file by Tftp.
-
- @param Private Pointer to PxeBc private data
- @param Config Pointer to Mtftp configuration data
- @param Filename Pointer to file name
- @param Overwrite Indicate whether with overwrite attribute
- @param BlockSize Pointer to block size
- @param BufferPtr Pointer to buffer
- @param BufferSize Pointer to buffer size
-
- @retval EFI_SUCCESS Write the data success into the special file.
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
- @retval other Write data into file failed.
-
-**/
-EFI_STATUS
-PxeBcTftpWriteFile (
- IN PXEBC_PRIVATE_DATA *Private,
- IN EFI_MTFTP4_CONFIG_DATA *Config,
- IN UINT8 *Filename,
- IN BOOLEAN Overwrite,
- IN UINTN *BlockSize,
- IN UINT8 *BufferPtr,
- IN OUT UINT64 *BufferSize
- );
-
-
-/**
- This function is to get data(file) from a directory(may be a server) by Tftp.
-
- @param Private Pointer to PxeBc private data.
- @param Config Pointer to Mtftp configuration data.
- @param Filename Pointer to file name.
- @param BlockSize Pointer to block size.
- @param BufferPtr Pointer to buffer.
- @param BufferSize Pointer to buffer size.
- @param DontUseBuffer Indicate whether with a receive buffer.
-
- @retval EFI_SUCCES Get the data from the file included in directory success.
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
- @retval other Operation failed.
-
-**/
-EFI_STATUS
-PxeBcTftpReadDirectory (
- IN PXEBC_PRIVATE_DATA *Private,
- IN EFI_MTFTP4_CONFIG_DATA *Config,
- IN UINT8 *Filename,
- IN UINTN *BlockSize,
- IN UINT8 *BufferPtr,
- IN OUT UINT64 *BufferSize,
- IN BOOLEAN DontUseBuffer
- );
-
-#endif
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h
deleted file mode 100644
index a28c9740c171..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/** @file
- Support routines for PxeBc.
-Copyright (c) 2007 - 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.
-
-**/
-
-#ifndef __EFI_PXEBC_SUPPORT_H__
-#define __EFI_PXEBC_SUPPORT_H__
-
-
-/**
- The common notify function associated with various PxeBc events.
-
- @param Event The event signaled.
- @param Context The context.
-
-**/
-VOID
-EFIAPI
-PxeBcCommonNotify (
- IN EFI_EVENT Event,
- IN VOID *Context
- );
-
-
-/**
- This function initialize(or configure) the Udp4Write instance.
-
- @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance.
- @param StationIp Pointer to the station ip address.
- @param SubnetMask Pointer to the subnetmask of the station ip address.
- @param Gateway Pointer to the gateway ip address.
- @param SrcPort Pointer to the srouce port of the station.
- @param Ttl The time to live field of the IP header.
- @param ToS The type of service field of the IP header.
-
- @retval EFI_SUCCESS The configuration settings were set, changed, or reset successfully.
- @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 following conditions are TRUE:
- @retval EFI_ALREADY_STARTED The EFI UDPv4 Protocol instance is already started/configured
- and must be stopped/reset before it can be reconfigured.
- @retval EFI_ACCESS_DENIED UdpConfigData. AllowDuplicatePort is FALSE
- and UdpConfigData.StationPort is already used by
- other instance.
- @retval EFI_OUT_OF_RESOURCES The EFI UDPv4 Protocol driver cannot allocate memory for this
- EFI UDPv4 Protocol instance.
- @retval EFI_DEVICE_ERROR An unexpected network or system error occurred and this instance
- was not opened.
- @retval Others Please examine the function Udp4->Routes(Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway) returns.
-
-**/
-EFI_STATUS
-PxeBcConfigureUdpWriteInstance (
- IN EFI_UDP4_PROTOCOL *Udp4,
- IN EFI_IPv4_ADDRESS *StationIp,
- IN EFI_IPv4_ADDRESS *SubnetMask,
- IN EFI_IPv4_ADDRESS *Gateway,
- IN OUT UINT16 *SrcPort,
- IN UINT8 Ttl,
- IN UINT8 ToS
- );
-
-
-/**
- This function is to display the IPv4 address.
-
- @param[in] Ip The pointer to the IPv4 address.
-
-**/
-VOID
-PxeBcShowIp4Addr (
- IN EFI_IPv4_ADDRESS *Ip
- );
-
-
-/**
- Convert number to ASCII value.
-
- @param Number Numeric value to convert to decimal ASCII value.
- @param Buffer Buffer to place ASCII version of the Number.
- @param Length Length of Buffer.
-
-**/
-VOID
-CvtNum (
- IN UINTN Number,
- IN UINT8 *Buffer,
- IN UINTN Length
- );
-
-
-/**
- Convert unsigned int number to decimal number.
-
- @param Number The unsigned int number will be converted.
- @param Buffer Pointer to the buffer to store the decimal number after transform.
- @param[in] BufferSize The maxsize of the buffer.
-
- @return the length of the number after transform.
-
-**/
-UINTN
-UtoA10 (
- IN UINTN Number,
- IN CHAR8 *Buffer,
- IN UINTN BufferSize
-
- );
-
-
-/**
- Convert ASCII numeric string to a UINTN value.
-
- @param Buffer Pointer to the 8-byte unsigned int value.
-
- @return UINTN value of the ASCII string.
-
-**/
-UINT64
-AtoU64 (
- IN UINT8 *Buffer
- );
-
-
-#endif
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni
deleted file mode 100644
index e97c3cadd973..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni
+++ /dev/null
@@ -1,25 +0,0 @@
-// /** @file
-// This module produces EFI Preboot Execution Environment (PXE) Base Code Protocol.
-//
-// This module produces EFI PXE Base Code Protocol upon EFI MMP Protocl and IPv4
-// network stack, used to control PXE-compatible devices. It produces EFI Load File
-// Protocol to provide one clean way to otain control from the boot manager if the
-// boot patch is from the remote device.
-//
-// Copyright (c) 2007 - 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 Preboot Execution Environment (PXE) Base Code Protocol"
-
-#string STR_MODULE_DESCRIPTION #language en-US "This module produces EFI PXE Base Code Protocol upon the EFI MMP Protocol and the IPv4 network stack, and is used to control PXE-compatible devices. It produces the EFI Load File Protocol to provide a clean method to obtain control from the boot manager if the boot patch is from the remote device."
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni
deleted file mode 100644
index 2c1bda1a8bd2..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni
+++ /dev/null
@@ -1,20 +0,0 @@
-// /** @file
-// UefiPxe4BcDxe 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
-"UEFI PXE Base Code DXE Driver"
-
-
diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
deleted file mode 100644
index 042401992945..000000000000
--- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
+++ /dev/null
@@ -1,102 +0,0 @@
-## @file
-# This module produces EFI Preboot Execution Environment (PXE) Base Code Protocol.
-#
-# This module produces EFI PXE Base Code Protocol upon EFI MMP Protocl and IPv4
-# network stack, used to control PXE-compatible devices. It produces EFI Load File
-# Protocol to provide one clean way to otain control from the boot manager if the
-# boot patch is from the remote device. This driver only supports IPv4 network stack.
-#
-# Notes:
-# 1) This driver can't co-work with the UefiPxeBcDxe driver in NetworkPkg.
-# 2) This driver might have some issues that have been fixed in the UefiPxeBcDxe
-# driver in NetworkPkg.
-# 3) This driver supports fewer features than the UefiPxeBcDxe driver in NetworkPkg
-# (e.g. IPv6, MTFTP windowsize).
-# 4) UefiPxeBcDxe driver in NetworkPkg is recommended for use instead of this one even
-# though both of them can be used.
-#
-# Copyright (c) 2007 - 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 = UefiPxe4BcDxe
- MODULE_UNI_FILE = UefiPxe4BcDxe.uni
- FILE_GUID = 3B1DEAB5-C75D-442e-9238-8E2FFB62B0BB
- MODULE_TYPE = UEFI_DRIVER
- VERSION_STRING = 1.0
- ENTRY_POINT = PxeBcDriverEntryPoint
- UNLOAD_IMAGE = NetLibDefaultUnload
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-# VALID_ARCHITECTURES = IA32 X64
-#
-# DRIVER_BINDING = gPxeBcDriverBinding
-# COMPONENT_NAME = gPxeBcComponentName
-# COMPONENT_NAME2 = gPxeBcComponentName2
-#
-
-[Sources]
- PxeBcMtftp.c
- PxeBcSupport.h
- PxeBcSupport.c
- PxeBcDriver.c
- PxeBcDhcp.h
- ComponentName.c
- PxeBcImpl.c
- PxeBcImpl.h
- PxeBcDhcp.c
- PxeBcMtftp.h
- PxeBcDriver.h
-
-
-[Packages]
- MdePkg/MdePkg.dec
- MdeModulePkg/MdeModulePkg.dec
-
-[LibraryClasses]
- BaseLib
- UefiLib
- UefiBootServicesTableLib
- UefiDriverEntryPoint
- BaseMemoryLib
- MemoryAllocationLib
- DebugLib
- NetLib
- DpcLib
- PcdLib
-
-[Protocols]
- gEfiPxeBaseCodeCallbackProtocolGuid ## SOMETIMES_PRODUCES
- gEfiPxeBaseCodeProtocolGuid ## BY_START
- gEfiLoadFileProtocolGuid ## BY_START
- gEfiNetworkInterfaceIdentifierProtocolGuid_31 ## SOMETIMES_CONSUMES
- gEfiArpServiceBindingProtocolGuid ## TO_START
- gEfiArpProtocolGuid ## TO_START
- gEfiMtftp4ServiceBindingProtocolGuid ## TO_START
- gEfiMtftp4ProtocolGuid ## TO_START
- gEfiUdp4ServiceBindingProtocolGuid ## TO_START
- gEfiUdp4ProtocolGuid ## TO_START
- gEfiDhcp4ServiceBindingProtocolGuid ## TO_START
- gEfiDhcp4ProtocolGuid ## TO_START
- gEfiIp4ServiceBindingProtocolGuid ## TO_START
- gEfiIp4ProtocolGuid ## TO_START
- gEfiIp4Config2ProtocolGuid ## TO_START
-
-[Pcd]
- gEfiMdeModulePkgTokenSpaceGuid.PcdTftpBlockSize ## SOMETIMES_CONSUMES
-
-[UserExtensions.TianoCore."ExtraFiles"]
- UefiPxe4BcDxeExtra.uni
--
2.19.1.windows.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v2 5/6] MdeModulePkg: Delete UefiPxeBcDxe in MdeModulePkg.
2018-12-20 1:41 ` [PATCH v2 5/6] MdeModulePkg: Delete UefiPxeBcDxe in MdeModulePkg Siyuan Fu
@ 2018-12-20 4:56 ` Wang, Jian J
0 siblings, 0 replies; 12+ messages in thread
From: Wang, Jian J @ 2018-12-20 4:56 UTC (permalink / raw)
To: Fu, Siyuan, edk2-devel@lists.01.org
Cc: Wu, Hao A, Ni, Ruiyu, Zeng, Star, Wu, Jiaxin
Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
> -----Original Message-----
> From: Fu, Siyuan
> Sent: Thursday, December 20, 2018 9:41 AM
> To: edk2-devel@lists.01.org
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A <hao.a.wu@intel.com>;
> Ni, Ruiyu <ruiyu.ni@intel.com>; Zeng, Star <star.zeng@intel.com>; Wu, Jiaxin
> <jiaxin.wu@intel.com>
> Subject: [PATCH v2 5/6] MdeModulePkg: Delete UefiPxeBcDxe in
> MdeModulePkg.
>
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1278
>
> This patch is to delete the UefiPxeBcDxe driver in MdeModulePkg. The
> driver will not be maintained and can't co-work with the dual-stack
> UefiPxeBcDxe in NetworkPkg.
>
> People should use below NetworkPkg drivers instead:
> NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.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/UefiPxeBcDxe/ComponentName.c |
> 365 ---
> MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c | 1999 --
> -----------
> MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c | 665 ---
> --
> MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c | 2989 --
> ------------------
> MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c | 454 --
> -
> MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c | 221 -
> -
> MdeModulePkg/MdeModulePkg.dsc | 1 -
> MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h | 502 --
> --
> MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h | 102 -
> MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h | 189 --
> MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h | 137 -
> MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h | 134 -
> MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni | 25
> -
> MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni |
> 20 -
> MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf | 102
> -
> 15 files changed, 7905 deletions(-)
>
> diff --git
> a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c
> b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c
> deleted file mode 100644
> index a085ef61f341..000000000000
> --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/ComponentName.c
> +++ /dev/null
> @@ -1,365 +0,0 @@
> -/** @file
> -
> -Copyright (c) 2007 - 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.
> -
> -**/
> -
> -
> -#include "PxeBcImpl.h"
> -
> -//
> -// EFI Component Name Functions
> -//
> -/**
> - 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
> -PxeBcComponentNameGetDriverName (
> - 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
> -PxeBcComponentNameGetControllerName (
> - 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
> gPxeBcComponentName = {
> - PxeBcComponentNameGetDriverName,
> - PxeBcComponentNameGetControllerName,
> - "eng"
> -};
> -
> -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL
> gPxeBcComponentName2 = {
> - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)
> PxeBcComponentNameGetDriverName,
> - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)
> PxeBcComponentNameGetControllerName,
> - "en"
> -};
> -
> -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE
> mPxeBcDriverNameTable[] = {
> - {
> - "eng;en",
> - L"UEFI PXE Base Code Driver"
> - },
> - {
> - NULL,
> - NULL
> - }
> -};
> -
> -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE
> mPxeBcControllerNameTable[] = {
> - {
> - "eng;en",
> - L"PXE Controller"
> - },
> - {
> - NULL,
> - 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
> -PxeBcComponentNameGetDriverName (
> - IN EFI_COMPONENT_NAME_PROTOCOL * This,
> - IN CHAR8 *Language,
> - OUT CHAR16 **DriverName
> - )
> -{
> - return LookupUnicodeString2 (
> - Language,
> - This->SupportedLanguages,
> - mPxeBcDriverNameTable,
> - DriverName,
> - (BOOLEAN)(This == &gPxeBcComponentName)
> - );
> -}
> -
> -/**
> - 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
> -PxeBcComponentNameGetControllerName (
> - IN EFI_COMPONENT_NAME_PROTOCOL * This,
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_HANDLE ChildHandle OPTIONAL,
> - IN CHAR8 *Language,
> - OUT CHAR16 **ControllerName
> - )
> -{
> - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;
> - EFI_HANDLE NicHandle;
> - EFI_STATUS Status;
> -
> - if (ControllerHandle == NULL || ChildHandle != NULL) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);
> - if (NicHandle == NULL) {
> - NicHandle = NetLibGetNicHandle (ControllerHandle,
> &gEfiDhcp4ProtocolGuid);
> -
> - if (NicHandle == NULL) {
> - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);
> -
> - if (NicHandle == NULL) {
> - NicHandle = NetLibGetNicHandle (ControllerHandle,
> &gEfiUdp4ProtocolGuid);
> -
> - if (NicHandle == NULL) {
> - NicHandle = NetLibGetNicHandle (ControllerHandle,
> &gEfiMtftp4ProtocolGuid);
> -
> - if (NicHandle == NULL) {
> - return EFI_UNSUPPORTED;
> - }
> - }
> - }
> - }
> - }
> -
> - Status = gBS->OpenProtocol (
> - NicHandle,
> - &gEfiPxeBaseCodeProtocolGuid,
> - (VOID **) &PxeBc,
> - NULL,
> - NULL,
> - EFI_OPEN_PROTOCOL_GET_PROTOCOL
> - );
> -
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - return LookupUnicodeString2 (
> - Language,
> - This->SupportedLanguages,
> - mPxeBcControllerNameTable,
> - ControllerName,
> - (BOOLEAN)(This == &gPxeBcComponentName)
> - );
> -}
> diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c
> b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c
> deleted file mode 100644
> index f7b975f2997f..000000000000
> --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c
> +++ /dev/null
> @@ -1,1999 +0,0 @@
> -/** @file
> - Support for PxeBc dhcp functions.
> -
> -Copyright (c) 2013, Red Hat, Inc.
> -Copyright (c) 2007 - 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.
> -
> -**/
> -
> -
> -#include "PxeBcImpl.h"
> -
> -//
> -// This is a map from the interested DHCP4 option tags' index to the tag value.
> -//
> -UINT8 mInterestedDhcp4Tags[PXEBC_DHCP4_TAG_INDEX_MAX] = {
> - DHCP4_TAG_BOOTFILE_LEN,
> - DHCP4_TAG_VENDOR,
> - DHCP4_TAG_OVERLOAD,
> - DHCP4_TAG_MSG_TYPE,
> - DHCP4_TAG_SERVER_ID,
> - DHCP4_TAG_VENDOR_CLASS_ID,
> - DHCP4_TAG_BOOTFILE
> -};
> -
> -
> -/**
> - This function initialize the DHCP4 message instance.
> -
> - This function will pad each item of dhcp4 message packet.
> -
> - @param Seed Pointer to the message instance of the DHCP4 packet.
> - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance.
> -
> -**/
> -VOID
> -PxeBcInitSeedPacket (
> - IN EFI_DHCP4_PACKET *Seed,
> - IN EFI_UDP4_PROTOCOL *Udp4
> - )
> -{
> - EFI_SIMPLE_NETWORK_MODE Mode;
> - EFI_DHCP4_HEADER *Header;
> -
> - Udp4->GetModeData (Udp4, NULL, NULL, NULL, &Mode);
> -
> - Seed->Size = sizeof (EFI_DHCP4_PACKET);
> - Seed->Length = sizeof (Seed->Dhcp4);
> -
> - Header = &Seed->Dhcp4.Header;
> -
> - ZeroMem (Header, sizeof (EFI_DHCP4_HEADER));
> - Header->OpCode = PXEBC_DHCP4_OPCODE_REQUEST;
> - Header->HwType = Mode.IfType;
> - Header->HwAddrLen = (UINT8) Mode.HwAddressSize;
> - CopyMem (Header->ClientHwAddr, &Mode.CurrentAddress, Header-
> >HwAddrLen);
> -
> - Seed->Dhcp4.Magik = PXEBC_DHCP4_MAGIC;
> - Seed->Dhcp4.Option[0] = DHCP4_TAG_EOP;
> -}
> -
> -
> -/**
> - Copy the DCHP4 packet from srouce to destination.
> -
> - @param[in] Dst Pointer to the cache buffer for DHCPv4 packet.
> - @param[in] Src Pointer to the DHCPv4 packet to be cached.
> -
> - @retval EFI_SUCCESS Packet is copied.
> - @retval EFI_BUFFER_TOO_SMALL Cache buffer is not big enough to hold
> the packet.
> -
> -**/
> -EFI_STATUS
> -PxeBcCopyEfiDhcp4Packet (
> - IN EFI_DHCP4_PACKET *Dst,
> - IN EFI_DHCP4_PACKET *Src
> - )
> -{
> - if (Dst->Size < Src->Length) {
> - return EFI_BUFFER_TOO_SMALL;
> - }
> -
> - CopyMem (&Dst->Dhcp4, &Src->Dhcp4, Src->Length);
> - Dst->Length = Src->Length;
> - return EFI_SUCCESS;
> -}
> -
> -
> -/**
> - Copy the dhcp4 packet to the PxeBc private data and parse the dhcp4 packet.
> -
> - @param Private Pointer to PxeBc private data.
> - @param OfferIndex Index of cached packets as complements of pxe mode
> data,
> - the index is maximum offer number.
> -
> - @retval EFI_SUCCESS Cache and parse the packet successfully.
> - @retval EFI_BUFFER_TOO_SMALL Cache buffer is not big enough to hold
> the packet.
> -
> -**/
> -EFI_STATUS
> -PxeBcCopyProxyOffer (
> - IN PXEBC_PRIVATE_DATA *Private,
> - IN UINT32 OfferIndex
> - )
> -{
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - EFI_DHCP4_PACKET *Offer;
> - EFI_STATUS Status;
> -
> - ASSERT (OfferIndex < Private->NumOffers);
> - ASSERT (OfferIndex < PXEBC_MAX_OFFER_NUM);
> -
> - Mode = Private->PxeBc.Mode;
> - Offer = &Private->Dhcp4Offers[OfferIndex].Packet.Offer;
> -
> - Status = PxeBcCopyEfiDhcp4Packet (&Private->ProxyOffer.Packet.Offer,
> Offer);
> - if (EFI_ERROR(Status)) {
> - return Status;
> - }
> - CopyMem (&Mode->ProxyOffer, &Offer->Dhcp4, Offer->Length);
> - Mode->ProxyOfferReceived = TRUE;
> -
> - PxeBcParseCachedDhcpPacket (&Private->ProxyOffer);
> - return EFI_SUCCESS;
> -}
> -
> -
> -/**
> - Parse the cached dhcp packet.
> -
> - @param CachedPacket Pointer to cached dhcp packet.
> -
> - @retval TRUE Succeed to parse and validation.
> - @retval FALSE Fail to parse or validation.
> -
> -**/
> -BOOLEAN
> -PxeBcParseCachedDhcpPacket (
> - IN PXEBC_CACHED_DHCP4_PACKET *CachedPacket
> - )
> -{
> - EFI_DHCP4_PACKET *Offer;
> - EFI_DHCP4_PACKET_OPTION **Options;
> - EFI_DHCP4_PACKET_OPTION *Option;
> - UINT8 OfferType;
> - UINTN Index;
> - UINT8 *Ptr8;
> -
> - CachedPacket->IsPxeOffer = FALSE;
> - ZeroMem (CachedPacket->Dhcp4Option, sizeof (CachedPacket-
> >Dhcp4Option));
> - ZeroMem (&CachedPacket->PxeVendorOption, sizeof (CachedPacket-
> >PxeVendorOption));
> -
> - Offer = &CachedPacket->Packet.Offer;
> - Options = CachedPacket->Dhcp4Option;
> -
> - //
> - // Parse interested dhcp options and store their pointers in CachedPacket-
> >Dhcp4Option.
> - // First, try to parse DHCPv4 options from the DHCP optional parameters field.
> - //
> - for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) {
> - Options[Index] = PxeBcParseExtendOptions (
> - Offer->Dhcp4.Option,
> - GET_OPTION_BUFFER_LEN (Offer),
> - mInterestedDhcp4Tags[Index]
> - );
> - }
> - //
> - // Second, Check if bootfilename and serverhostname is overloaded to carry
> DHCP options refers to rfc-2132.
> - // If yes, try to parse options from the BootFileName field, then ServerName
> field.
> - //
> - Option = Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD];
> - if (Option != NULL) {
> - if ((Option->Data[0] & PXEBC_DHCP4_OVERLOAD_FILE) != 0) {
> - for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) {
> - if (Options[Index] == NULL) {
> - Options[Index] = PxeBcParseExtendOptions (
> - (UINT8 *) Offer->Dhcp4.Header.BootFileName,
> - sizeof (Offer->Dhcp4.Header.BootFileName),
> - mInterestedDhcp4Tags[Index]
> - );
> - }
> - }
> - }
> - if ((Option->Data[0] & PXEBC_DHCP4_OVERLOAD_SERVER_NAME) != 0) {
> - for (Index = 0; Index < PXEBC_DHCP4_TAG_INDEX_MAX; Index++) {
> - if (Options[Index] == NULL) {
> - Options[Index] = PxeBcParseExtendOptions (
> - (UINT8 *) Offer->Dhcp4.Header.ServerName,
> - sizeof (Offer->Dhcp4.Header.ServerName),
> - mInterestedDhcp4Tags[Index]
> - );
> - }
> - }
> - }
> - }
> -
> - //
> - // Check whether is an offer with PXEClient or not.
> - //
> - Option = Options[PXEBC_DHCP4_TAG_INDEX_CLASS_ID];
> - if ((Option != NULL) && (Option->Length >= 9) &&
> - (CompareMem (Option->Data, DEFAULT_CLASS_ID_DATA, 9) == 0)) {
> -
> - CachedPacket->IsPxeOffer = TRUE;
> - }
> -
> - //
> - // Parse pxe vendor options and store their content/pointers in CachedPacket-
> >PxeVendorOption.
> - //
> - Option = Options[PXEBC_DHCP4_TAG_INDEX_VENDOR];
> - if (CachedPacket->IsPxeOffer && (Option != NULL)) {
> -
> - if (!PxeBcParseVendorOptions (Option, &CachedPacket->PxeVendorOption)) {
> - return FALSE;
> - }
> - }
> -
> -
> - //
> - // Parse PXE boot file name:
> - // According to PXE spec, boot file name should be read from DHCP option 67
> (bootfile name) if present.
> - // Otherwise, read from boot file field in DHCP header.
> - //
> - if (Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) {
> - //
> - // RFC 2132, Section 9.5 does not strictly state Bootfile name (option 67) is
> null
> - // terminated string. So force to append null terminated character at the end
> of string.
> - //
> - Ptr8 = (UINT8*)&Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Data[0];
> - Ptr8 += Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Length;
> - if (*(Ptr8 - 1) != '\0') {
> - *Ptr8 = '\0';
> - }
> - } else if (Offer->Dhcp4.Header.BootFileName[0] != 0) {
> - //
> - // If the bootfile is not present and bootfilename is present in dhcp packet,
> just parse it.
> - // And do not count dhcp option header, or else will destroy the
> serverhostname.
> - //
> - // Make sure "BootFileName" is not overloaded.
> - //
> - if (Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD] == NULL ||
> - (Options[PXEBC_DHCP4_TAG_INDEX_OVERLOAD]->Data[0] &
> PXEBC_DHCP4_OVERLOAD_FILE) == 0) {
> - Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] =
> (EFI_DHCP4_PACKET_OPTION *) (&Offer->Dhcp4.Header.BootFileName[0] -
> - OFFSET_OF (EFI_DHCP4_PACKET_OPTION, Data[0]));
> - }
> - }
> -
> - //
> - // Determine offer type of the dhcp packet.
> - //
> - Option = Options[PXEBC_DHCP4_TAG_INDEX_MSG_TYPE];
> - if ((Option == NULL) || (Option->Data[0] == 0)) {
> - //
> - // It's a bootp offer
> - //
> - Option = CachedPacket-
> >Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE];
> - if (Option == NULL) {
> - //
> - // bootp offer without bootfilename, discard it.
> - //
> - return FALSE;
> - }
> -
> - OfferType = DHCP4_PACKET_TYPE_BOOTP;
> -
> - } else {
> -
> - if (IS_VALID_DISCOVER_VENDOR_OPTION (CachedPacket-
> >PxeVendorOption.BitMap)) {
> - //
> - // It's a pxe10 offer with PXEClient and discover vendor option.
> - //
> - OfferType = DHCP4_PACKET_TYPE_PXE10;
> - } else if (IS_VALID_MTFTP_VENDOR_OPTION (CachedPacket-
> >PxeVendorOption.BitMap)) {
> - //
> - // It's a wfm11a offer with PXEClient and mtftp vendor option, and
> - // return false since mtftp not supported currently.
> - //
> - return FALSE;
> - } else {
> - //
> - // If the binl offer with only PXEClient.
> - //
> - OfferType = (UINT8) ((CachedPacket->IsPxeOffer) ?
> DHCP4_PACKET_TYPE_BINL : DHCP4_PACKET_TYPE_DHCP_ONLY);
> - }
> - }
> -
> - CachedPacket->OfferType = OfferType;
> -
> - return TRUE;
> -}
> -
> -
> -/**
> - Offer dhcp service with a BINL dhcp offer.
> -
> - @param Private Pointer to PxeBc private data.
> - @param Index Index of cached packets as complements of pxe mode data,
> - the index is maximum offer number.
> -
> - @retval TRUE Offer the service successfully under priority BINL.
> - @retval FALSE Boot Service failed, parse cached dhcp packet failed or this
> - BINL ack cannot find options set or bootfile name specified.
> -
> -**/
> -BOOLEAN
> -PxeBcTryBinl (
> - IN PXEBC_PRIVATE_DATA *Private,
> - IN UINT32 Index
> - )
> -{
> - EFI_DHCP4_PACKET *Offer;
> - EFI_IP_ADDRESS ServerIp;
> - EFI_STATUS Status;
> - PXEBC_CACHED_DHCP4_PACKET *CachedPacket;
> - EFI_DHCP4_PACKET *Reply;
> -
> - ASSERT (Index < PXEBC_MAX_OFFER_NUM);
> - ASSERT (Private->Dhcp4Offers[Index].OfferType ==
> DHCP4_PACKET_TYPE_BINL);
> -
> - Offer = &Private->Dhcp4Offers[Index].Packet.Offer;
> -
> - //
> - // Use siaddr(next server) in DHCPOFFER packet header, if zero, use option
> 54(server identifier)
> - // in DHCPOFFER packet.
> - // (It does not comply with PXE Spec, Ver2.1)
> - //
> - if (EFI_IP4_EQUAL (&Offer->Dhcp4.Header.ServerAddr.Addr, &mZeroIp4Addr))
> {
> - CopyMem (
> - &ServerIp.Addr[0],
> - Private-
> >Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]-
> >Data,
> - sizeof (EFI_IPv4_ADDRESS)
> - );
> - } else {
> - CopyMem (
> - &ServerIp.Addr[0],
> - &Offer->Dhcp4.Header.ServerAddr,
> - sizeof (EFI_IPv4_ADDRESS)
> - );
> - }
> - if (ServerIp.Addr[0] == 0) {
> - return FALSE;
> - }
> -
> - CachedPacket = &Private->ProxyOffer;
> - Reply = &CachedPacket->Packet.Offer;
> -
> - Status = PxeBcDiscvBootService (
> - Private,
> - 0,
> - NULL,
> - FALSE,
> - &ServerIp,
> - 0,
> - NULL,
> - FALSE,
> - Reply
> - );
> - if (EFI_ERROR (Status)) {
> - return FALSE;
> - }
> -
> - if (!PxeBcParseCachedDhcpPacket (CachedPacket)) {
> - return FALSE;
> - }
> -
> - if ((CachedPacket->OfferType != DHCP4_PACKET_TYPE_PXE10) &&
> - (CachedPacket->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] ==
> NULL)) {
> - //
> - // This BINL ack doesn't have discovery options set or bootfile name
> - // specified.
> - //
> - return FALSE;
> - }
> -
> - Private->PxeBc.Mode->ProxyOfferReceived = TRUE;
> - CopyMem (&Private->PxeBc.Mode->ProxyOffer, &Reply->Dhcp4, Reply-
> >Length);
> -
> - return TRUE;
> -}
> -
> -
> -/**
> - Offer dhcp service for each proxy with a BINL dhcp offer.
> -
> - @param Private Pointer to PxeBc private data
> - @param OfferIndex Pointer to the index of cached packets as complements
> of
> - pxe mode data, the index is maximum offer number.
> -
> - @return If there is no service needed offer return FALSE, otherwise TRUE.
> -
> -**/
> -BOOLEAN
> -PxeBcTryBinlProxy (
> - IN PXEBC_PRIVATE_DATA *Private,
> - OUT UINT32 *OfferIndex
> - )
> -{
> - UINT32 Index;
> -
> - for (Index = 0; Index < Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL];
> Index++) {
> -
> - *OfferIndex = Private->BinlIndex[Index];
> - //
> - // Try this BINL proxy offer
> - //
> - if (PxeBcTryBinl (Private, *OfferIndex)) {
> - return TRUE;
> - }
> - }
> -
> - return FALSE;
> -}
> -
> -
> -/**
> - This function is to check the selected proxy offer (include BINL dhcp offer and
> - DHCP_ONLY offer ) and set the flag and copy the DHCP packets to the Pxe
> base code
> - mode structure.
> -
> - @param Private Pointer to PxeBc private data.
> -
> - @retval EFI_SUCCESS Operational successful.
> - @retval EFI_NO_RESPONSE Offer dhcp service failed.
> - @retval EFI_BUFFER_TOO_SMALL Failed to copy the packet to Pxe base
> code mode.
> -
> -**/
> -EFI_STATUS
> -PxeBcCheckSelectedOffer (
> - IN PXEBC_PRIVATE_DATA *Private
> - )
> -{
> - PXEBC_CACHED_DHCP4_PACKET *SelectedOffer;
> - EFI_DHCP4_PACKET_OPTION **Options;
> - UINT32 Index;
> - EFI_DHCP4_PACKET *Offer;
> - UINT32 ProxyOfferIndex;
> - EFI_STATUS Status;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - EFI_DHCP4_PACKET *Ack;
> -
> - ASSERT (Private->SelectedOffer != 0);
> -
> - Status = EFI_SUCCESS;
> - SelectedOffer = &Private->Dhcp4Offers[Private->SelectedOffer - 1];
> - Options = SelectedOffer->Dhcp4Option;
> -
> - if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_BINL) {
> - //
> - // The addresses are acquired from a BINL dhcp offer, try BINL to get
> - // the bootfile name
> - //
> - if (!PxeBcTryBinl (Private, Private->SelectedOffer - 1)) {
> - Status = EFI_NO_RESPONSE;
> - }
> - } else if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_DHCP_ONLY) {
> - //
> - // The selected offer to finish the D.O.R.A. is a DHCP only offer, we need
> - // try proxy offers if there are some, othewise the bootfile name must be
> - // set in this DHCP only offer.
> - //
> - if (Private->GotProxyOffer) {
> - //
> - // Get rid of the compiler warning.
> - //
> - ProxyOfferIndex = 0;
> - if (Private->SortOffers) {
> - //
> - // The offers are sorted before selecting, the proxy offer type must be
> - // already determined.
> - //
> - ASSERT (Private->ProxyIndex[Private->ProxyOfferType] > 0);
> -
> - if (Private->ProxyOfferType == DHCP4_PACKET_TYPE_BINL) {
> - //
> - // We buffer all received BINL proxy offers, try them all one by one
> - //
> - if (!PxeBcTryBinlProxy (Private, &ProxyOfferIndex)) {
> - Status = EFI_NO_RESPONSE;
> - }
> - } else {
> - //
> - // For other types, only one proxy offer is buffered.
> - //
> - ProxyOfferIndex = Private->ProxyIndex[Private->ProxyOfferType] - 1;
> - }
> - } else {
> - //
> - // The proxy offer type is not determined, choose proxy offer in the
> - // received order.
> - //
> - Status = EFI_NO_RESPONSE;
> -
> - ASSERT (Private->NumOffers < PXEBC_MAX_OFFER_NUM);
> - for (Index = 0; Index < Private->NumOffers; Index++) {
> -
> - Offer = &Private->Dhcp4Offers[Index].Packet.Offer;
> - if (!IS_PROXY_DHCP_OFFER (Offer)) {
> - //
> - // Skip non proxy dhcp offers.
> - //
> - continue;
> - }
> -
> - if (Private->Dhcp4Offers[Index].OfferType == DHCP4_PACKET_TYPE_BINL)
> {
> - //
> - // Try BINL
> - //
> - if (!PxeBcTryBinl (Private, Index)) {
> - //
> - // Failed, skip to the next offer
> - //
> - continue;
> - }
> - }
> -
> - Private->ProxyOfferType = Private->Dhcp4Offers[Index].OfferType;
> - ProxyOfferIndex = Index;
> - Status = EFI_SUCCESS;
> - break;
> - }
> - }
> -
> - if (!EFI_ERROR (Status) && (Private->ProxyOfferType !=
> DHCP4_PACKET_TYPE_BINL)) {
> - //
> - // Copy the proxy offer to Mode and set the flag
> - //
> - Status = PxeBcCopyProxyOffer (Private, ProxyOfferIndex);
> - }
> - } else {
> - //
> - // No proxy offer is received, the bootfile name MUST be set.
> - //
> - ASSERT (Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL);
> - }
> - }
> -
> - if (!EFI_ERROR (Status)) {
> - //
> - // Everything is OK, set the flag and copy the DHCP packets.
> - //
> - Mode = Private->PxeBc.Mode;
> - Offer = &SelectedOffer->Packet.Offer;
> -
> - //
> - // The discover packet is already copied, just set flag here.
> - //
> - Mode->DhcpDiscoverValid = TRUE;
> -
> - Ack = &Private->Dhcp4Ack.Packet.Ack;
> - if (SelectedOffer->OfferType == DHCP4_PACKET_TYPE_BOOTP) {
> - //
> - // Other type of ACK is already cached. Bootp is special that we should
> - // use the bootp reply as the ACK and put it into the DHCP_ONLY buffer.
> - //
> - Status = PxeBcCopyEfiDhcp4Packet (&Private->Dhcp4Ack.Packet.Ack, Offer);
> - }
> -
> - PxeBcParseCachedDhcpPacket (&Private->Dhcp4Ack);
> -
> - Mode->DhcpAckReceived = TRUE;
> -
> - //
> - // Copy the dhcp ack.
> - //
> - CopyMem (&Mode->DhcpAck, &Ack->Dhcp4, Ack->Length);
> - }
> -
> - return Status;
> -}
> -
> -
> -/**
> - Cache the Dhcp4 packet offer, Parse and validate each option of the packet.
> -
> - @param Private Pointer to PxeBc private data.
> - @param RcvdOffer Pointer to the received Dhcp proxy offer packet.
> -
> - @retval EFI_SUCCESS Cache and parse the packet successfully.
> - @retval Others Operation failed.
> -
> -**/
> -EFI_STATUS
> -PxeBcCacheDhcpOffer (
> - IN PXEBC_PRIVATE_DATA *Private,
> - IN EFI_DHCP4_PACKET *RcvdOffer
> - )
> -{
> - PXEBC_CACHED_DHCP4_PACKET *CachedOffer;
> - EFI_DHCP4_PACKET *Offer;
> - UINT8 OfferType;
> - EFI_STATUS Status;
> -
> - CachedOffer = &Private->Dhcp4Offers[Private->NumOffers];
> - Offer = &CachedOffer->Packet.Offer;
> -
> - //
> - // Cache the orignal dhcp packet
> - //
> - Status = PxeBcCopyEfiDhcp4Packet (Offer, RcvdOffer);
> - if (EFI_ERROR(Status)) {
> - return Status;
> - }
> -
> - //
> - // Parse and validate the options (including dhcp option and vendor option)
> - //
> - if (!PxeBcParseCachedDhcpPacket (CachedOffer)) {
> - return EFI_ABORTED;
> - }
> -
> - OfferType = CachedOffer->OfferType;
> - if (OfferType >= DHCP4_PACKET_TYPE_MAX) {
> - return EFI_ABORTED;
> - }
> -
> - if (OfferType == DHCP4_PACKET_TYPE_BOOTP) {
> -
> - if (Private->BootpIndex != 0) {
> - //
> - // Only cache the first bootp offer, discard others.
> - //
> - return EFI_ABORTED;
> - } else {
> - //
> - // Take as a dhcp only offer, but record index specifically.
> - //
> - Private->BootpIndex = Private->NumOffers + 1;
> - }
> - } else {
> -
> - if (IS_PROXY_DHCP_OFFER (Offer)) {
> - //
> - // It's a proxy dhcp offer with no your address, including pxe10, wfm11a or
> binl offer.
> - //
> - Private->GotProxyOffer = TRUE;
> -
> - if (OfferType == DHCP4_PACKET_TYPE_BINL) {
> - //
> - // Cache all binl offers.
> - //
> - Private->BinlIndex[Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]] =
> Private->NumOffers;
> - Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL]++;
> - } else if (Private->ProxyIndex[OfferType] != 0) {
> - //
> - // Only cache the first pxe10/wfm11a offers each, discard the others.
> - //
> - return EFI_ABORTED;
> - } else {
> - //
> - // Record index of the proxy dhcp offer with type other than binl.
> - //
> - Private->ProxyIndex[OfferType] = Private->NumOffers + 1;
> - }
> - } else {
> - //
> - // It's a dhcp offer with your address.
> - //
> - ASSERT (Private->ServerCount[OfferType] < PXEBC_MAX_OFFER_NUM);
> - Private->OfferIndex[OfferType][Private->ServerCount[OfferType]] =
> Private->NumOffers;
> - Private->ServerCount[OfferType]++;
> - }
> - }
> -
> - //
> - // Count the accepted offers.
> - //
> - Private->NumOffers++;
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Switch the Ip4 policy to static.
> -
> - @param[in] Private The pointer to PXEBC_PRIVATE_DATA.
> -
> - @retval EFI_SUCCESS The policy is already configured to static.
> - @retval Others Other error as indicated..
> -
> -**/
> -EFI_STATUS
> -PxeBcSetIp4Policy (
> - IN PXEBC_PRIVATE_DATA *Private
> - )
> -{
> - EFI_STATUS Status;
> - EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
> - EFI_IP4_CONFIG2_POLICY Policy;
> - UINTN DataSize;
> -
> - Ip4Config2 = Private->Ip4Config2;
> - DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
> - Status = Ip4Config2->GetData (
> - Ip4Config2,
> - Ip4Config2DataTypePolicy,
> - &DataSize,
> - &Policy
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - if (Policy != Ip4Config2PolicyStatic) {
> - Policy = Ip4Config2PolicyStatic;
> - Status= Ip4Config2->SetData (
> - Ip4Config2,
> - Ip4Config2DataTypePolicy,
> - sizeof (EFI_IP4_CONFIG2_POLICY),
> - &Policy
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -/**
> - Select the specified proxy offer, such as BINL, DHCP_ONLY and so on.
> - If the proxy does not exist, try offers with bootfile.
> -
> - @param Private Pointer to PxeBc private data.
> -
> -**/
> -VOID
> -PxeBcSelectOffer (
> - IN PXEBC_PRIVATE_DATA *Private
> - )
> -{
> - UINT32 Index;
> - UINT32 OfferIndex;
> - EFI_DHCP4_PACKET *Offer;
> -
> - Private->SelectedOffer = 0;
> -
> - if (Private->SortOffers) {
> - //
> - // Select offer according to the priority
> - //
> - if (Private->ServerCount[DHCP4_PACKET_TYPE_PXE10] > 0) {
> - //
> - // DHCP with PXE10
> - //
> - Private->SelectedOffer = Private-
> >OfferIndex[DHCP4_PACKET_TYPE_PXE10][0] + 1;
> -
> - } else if (Private->ServerCount[DHCP4_PACKET_TYPE_WFM11A] > 0) {
> - //
> - // DHCP with WfM
> - //
> - Private->SelectedOffer = Private-
> >OfferIndex[DHCP4_PACKET_TYPE_WFM11A][0] + 1;
> -
> - } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_PXE10] > 0) &&
> - (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0)
> - ) {
> - //
> - // DHCP only and proxy DHCP with PXE10
> - //
> - Private->SelectedOffer = Private-
> >OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1;
> - Private->ProxyOfferType = DHCP4_PACKET_TYPE_PXE10;
> -
> - } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_WFM11A] > 0) &&
> - (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0)
> - ) {
> - //
> - // DHCP only and proxy DHCP with WfM
> - //
> - Private->SelectedOffer = Private-
> >OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1;
> - Private->ProxyOfferType = DHCP4_PACKET_TYPE_WFM11A;
> -
> - } else if (Private->ServerCount[DHCP4_PACKET_TYPE_BINL] > 0) {
> - //
> - // DHCP with BINL
> - //
> - Private->SelectedOffer = Private-
> >OfferIndex[DHCP4_PACKET_TYPE_BINL][0] + 1;
> -
> - } else if ((Private->ProxyIndex[DHCP4_PACKET_TYPE_BINL] > 0) &&
> - (Private->ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY] > 0)
> - ) {
> - //
> - // DHCP only and proxy DHCP with BINL
> - //
> - Private->SelectedOffer = Private-
> >OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][0] + 1;
> - Private->ProxyOfferType = DHCP4_PACKET_TYPE_BINL;
> -
> - } else {
> - //
> - // Try offers with bootfile
> - //
> - for (Index = 0; Index < Private-
> >ServerCount[DHCP4_PACKET_TYPE_DHCP_ONLY]; Index++) {
> - //
> - // Select the first DHCP only offer with bootfile
> - //
> - OfferIndex = Private-
> >OfferIndex[DHCP4_PACKET_TYPE_DHCP_ONLY][Index];
> - if (Private-
> >Dhcp4Offers[OfferIndex].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]
> != NULL) {
> - Private->SelectedOffer = OfferIndex + 1;
> - break;
> - }
> - }
> -
> - if (Private->SelectedOffer == 0) {
> - //
> - // Select the Bootp reply with bootfile if any
> - //
> - Private->SelectedOffer = Private->BootpIndex;
> - }
> - }
> - } else {
> - //
> - // Try the offers in the received order.
> - //
> - for (Index = 0; Index < Private->NumOffers; Index++) {
> -
> - Offer = &Private->Dhcp4Offers[Index].Packet.Offer;
> -
> - if (IS_PROXY_DHCP_OFFER (Offer)) {
> - //
> - // Skip proxy offers
> - //
> - continue;
> - }
> -
> - if ((Private->Dhcp4Offers[Index].OfferType ==
> DHCP4_PACKET_TYPE_DHCP_ONLY) &&
> - ((!Private->GotProxyOffer) && (Private-
> >Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] ==
> NULL))) {
> - //
> - // DHCP only offer but no proxy offer received and no bootfile option in
> this offer
> - //
> - continue;
> - }
> -
> - Private->SelectedOffer = Index + 1;
> - break;
> - }
> - }
> -}
> -
> -
> -/**
> - Callback routine.
> -
> - EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4
> Protocol driver
> - to intercept events that occurred in the configuration process. This structure
> - provides advanced control of each state transition of the DHCP process. The
> - returned status code determines the behavior of the EFI DHCPv4 Protocol
> driver.
> - There are three possible returned values, which are described in the following
> - table.
> -
> - @param This Pointer to the EFI DHCPv4 Protocol instance that is
> used to
> - configure this callback function.
> - @param Context Pointer to the context that is initialized by
> - EFI_DHCP4_PROTOCOL.Configure().
> - @param CurrentState The current operational state of the EFI DHCPv4
> Protocol
> - driver.
> - @param Dhcp4Event The event that occurs in the current state, which
> usually means a
> - state transition.
> - @param Packet The DHCP packet that is going to be sent or already
> received.
> - @param NewPacket The packet that is used to replace the above
> Packet.
> -
> - @retval EFI_SUCCESS Tells the EFI DHCPv4 Protocol driver to continue
> the DHCP process.
> - @retval EFI_NOT_READY Only used in the Dhcp4Selecting state. The EFI
> DHCPv4 Protocol
> - driver will continue to wait for more DHCPOFFER packets until
> the retry
> - timeout expires.
> - @retval EFI_ABORTED Tells the EFI DHCPv4 Protocol driver to abort the
> current process and
> - return to the Dhcp4Init or Dhcp4InitReboot state.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -PxeBcDhcpCallBack (
> - IN EFI_DHCP4_PROTOCOL * This,
> - IN VOID *Context,
> - IN EFI_DHCP4_STATE CurrentState,
> - IN EFI_DHCP4_EVENT Dhcp4Event,
> - IN EFI_DHCP4_PACKET * Packet OPTIONAL,
> - OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback;
> - EFI_DHCP4_PACKET_OPTION *MaxMsgSize;
> - UINT16 Value;
> - EFI_STATUS Status;
> - BOOLEAN Received;
> - EFI_DHCP4_HEADER *DhcpHeader;
> -
> - if ((Dhcp4Event != Dhcp4RcvdOffer) &&
> - (Dhcp4Event != Dhcp4SelectOffer) &&
> - (Dhcp4Event != Dhcp4SendDiscover) &&
> - (Dhcp4Event != Dhcp4RcvdAck) &&
> - (Dhcp4Event != Dhcp4SendRequest)) {
> - return EFI_SUCCESS;
> - }
> -
> - Private = (PXEBC_PRIVATE_DATA *) Context;
> - Mode = Private->PxeBc.Mode;
> - Callback = Private->PxeBcCallback;
> -
> - //
> - // Override the Maximum DHCP Message Size.
> - //
> - MaxMsgSize = PxeBcParseExtendOptions (
> - Packet->Dhcp4.Option,
> - GET_OPTION_BUFFER_LEN (Packet),
> - DHCP4_TAG_MAXMSG
> - );
> - if (MaxMsgSize != NULL) {
> - Value = HTONS (PXEBC_DHCP4_MAX_PACKET_SIZE);
> - CopyMem (MaxMsgSize->Data, &Value, sizeof (Value));
> - }
> -
> - if ((Dhcp4Event != Dhcp4SelectOffer) && (Callback != NULL)) {
> - Received = (BOOLEAN) ((Dhcp4Event == Dhcp4RcvdOffer) || (Dhcp4Event ==
> Dhcp4RcvdAck));
> - Status = Callback->Callback (
> - Callback,
> - Private->Function,
> - Received,
> - Packet->Length,
> - (EFI_PXE_BASE_CODE_PACKET *) &Packet->Dhcp4
> - );
> - if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {
> - return EFI_ABORTED;
> - }
> - }
> -
> - Status = EFI_SUCCESS;
> -
> - switch (Dhcp4Event) {
> -
> - case Dhcp4SendDiscover:
> - case Dhcp4SendRequest:
> - if (Packet->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) {
> - //
> - // If the to be sent packet exceeds the maximum length, abort the DHCP
> process.
> - //
> - Status = EFI_ABORTED;
> - break;
> - }
> -
> - if (Mode->SendGUID) {
> - //
> - // send the system GUID instead of the MAC address as the hardware
> address
> - // in the DHCP packet header.
> - //
> - DhcpHeader = &Packet->Dhcp4.Header;
> -
> - if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) DhcpHeader-
> >ClientHwAddr))) {
> - //
> - // GUID not yet set - send all 0xff's to show programable (via SetVariable)
> - // SetMem(DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid,
> sizeof(EFI_GUID), 0xff);
> - // GUID not yet set - send all 0's to show not programable
> - //
> - DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios
> table!\n"));
> - ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID));
> - }
> -
> - DhcpHeader->HwAddrLen = (UINT8) sizeof (EFI_GUID);
> - }
> -
> - if (Dhcp4Event == Dhcp4SendDiscover) {
> - //
> - // Cache the dhcp discover packet, of which some information will be used
> later.
> - //
> - CopyMem (Mode->DhcpDiscover.Raw, &Packet->Dhcp4, Packet->Length);
> - }
> -
> - break;
> -
> - case Dhcp4RcvdOffer:
> - Status = EFI_NOT_READY;
> - if (Packet->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) {
> - //
> - // Ignore the incoming Offers which exceed the maximum length.
> - //
> - break;
> - }
> -
> - if (Private->NumOffers < PXEBC_MAX_OFFER_NUM) {
> - //
> - // Cache the dhcp offers in Private->Dhcp4Offers[]
> - // If error happens, just ignore this packet and continue to wait more offer.
> - //
> - PxeBcCacheDhcpOffer (Private, Packet);
> - }
> -
> - break;
> -
> - case Dhcp4SelectOffer:
> - //
> - // Select an offer, if succeeded, Private->SelectedOffer points to
> - // the index of the selected one.
> - //
> - PxeBcSelectOffer (Private);
> -
> - if (Private->SelectedOffer == 0) {
> - Status = EFI_ABORTED;
> - } else {
> - *NewPacket = &Private->Dhcp4Offers[Private->SelectedOffer -
> 1].Packet.Offer;
> - }
> -
> - break;
> -
> - case Dhcp4RcvdAck:
> - //
> - // Cache Ack
> - //
> - ASSERT (Private->SelectedOffer != 0);
> -
> - Status = PxeBcCopyEfiDhcp4Packet (&Private->Dhcp4Ack.Packet.Ack, Packet);
> - if (EFI_ERROR (Status)) {
> - return EFI_ABORTED;
> - }
> - break;
> -
> - default:
> - break;
> - }
> -
> - return Status;
> -}
> -
> -
> -/**
> - Initialize the DHCP options and build the option list.
> -
> - @param Private Pointer to PxeBc private data.
> - @param OptList Pointer to a DHCP option list.
> -
> - @param IsDhcpDiscover Discover dhcp option or not.
> -
> - @return The index item number of the option list.
> -
> -**/
> -UINT32
> -PxeBcBuildDhcpOptions (
> - IN PXEBC_PRIVATE_DATA *Private,
> - IN EFI_DHCP4_PACKET_OPTION **OptList,
> - IN BOOLEAN IsDhcpDiscover
> - )
> -{
> - UINT32 Index;
> - PXEBC_DHCP4_OPTION_ENTRY OptEnt;
> - UINT16 Value;
> -
> - Index = 0;
> - OptList[0] = (EFI_DHCP4_PACKET_OPTION *) Private->OptionBuffer;
> -
> - if (!IsDhcpDiscover) {
> - //
> - // Append message type.
> - //
> - OptList[Index]->OpCode = DHCP4_TAG_MSG_TYPE;
> - OptList[Index]->Length = 1;
> - OptEnt.Mesg = (PXEBC_DHCP4_OPTION_MESG *) OptList[Index]-
> >Data;
> - OptEnt.Mesg->Type = PXEBC_DHCP4_MSG_TYPE_REQUEST;
> - Index++;
> - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
> -
> - //
> - // Append max message size.
> - //
> - OptList[Index]->OpCode = DHCP4_TAG_MAXMSG;
> - OptList[Index]->Length = (UINT8) sizeof
> (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE);
> - OptEnt.MaxMesgSize = (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *)
> OptList[Index]->Data;
> - Value = NTOHS (PXEBC_DHCP4_MAX_PACKET_SIZE);
> - CopyMem (&OptEnt.MaxMesgSize->Size, &Value, sizeof (UINT16));
> - Index++;
> - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
> - }
> - //
> - // Parameter request list option.
> - //
> - OptList[Index]->OpCode = DHCP4_TAG_PARA_LIST;
> - OptList[Index]->Length = 35;
> - OptEnt.Para = (PXEBC_DHCP4_OPTION_PARA *) OptList[Index]->Data;
> - OptEnt.Para->ParaList[0] = DHCP4_TAG_NETMASK;
> - OptEnt.Para->ParaList[1] = DHCP4_TAG_TIME_OFFSET;
> - OptEnt.Para->ParaList[2] = DHCP4_TAG_ROUTER;
> - OptEnt.Para->ParaList[3] = DHCP4_TAG_TIME_SERVER;
> - OptEnt.Para->ParaList[4] = DHCP4_TAG_NAME_SERVER;
> - OptEnt.Para->ParaList[5] = DHCP4_TAG_DNS_SERVER;
> - OptEnt.Para->ParaList[6] = DHCP4_TAG_HOSTNAME;
> - OptEnt.Para->ParaList[7] = DHCP4_TAG_BOOTFILE_LEN;
> - OptEnt.Para->ParaList[8] = DHCP4_TAG_DOMAINNAME;
> - OptEnt.Para->ParaList[9] = DHCP4_TAG_ROOTPATH;
> - OptEnt.Para->ParaList[10] = DHCP4_TAG_EXTEND_PATH;
> - OptEnt.Para->ParaList[11] = DHCP4_TAG_EMTU;
> - OptEnt.Para->ParaList[12] = DHCP4_TAG_TTL;
> - OptEnt.Para->ParaList[13] = DHCP4_TAG_BROADCAST;
> - OptEnt.Para->ParaList[14] = DHCP4_TAG_NIS_DOMAIN;
> - OptEnt.Para->ParaList[15] = DHCP4_TAG_NIS_SERVER;
> - OptEnt.Para->ParaList[16] = DHCP4_TAG_NTP_SERVER;
> - OptEnt.Para->ParaList[17] = DHCP4_TAG_VENDOR;
> - OptEnt.Para->ParaList[18] = DHCP4_TAG_REQUEST_IP;
> - OptEnt.Para->ParaList[19] = DHCP4_TAG_LEASE;
> - OptEnt.Para->ParaList[20] = DHCP4_TAG_SERVER_ID;
> - OptEnt.Para->ParaList[21] = DHCP4_TAG_T1;
> - OptEnt.Para->ParaList[22] = DHCP4_TAG_T2;
> - OptEnt.Para->ParaList[23] = DHCP4_TAG_VENDOR_CLASS_ID;
> - OptEnt.Para->ParaList[24] = DHCP4_TAG_TFTP;
> - OptEnt.Para->ParaList[25] = DHCP4_TAG_BOOTFILE;
> - OptEnt.Para->ParaList[26] = DHCP4_TAG_UUID;
> - OptEnt.Para->ParaList[27] = 0x80;
> - OptEnt.Para->ParaList[28] = 0x81;
> - OptEnt.Para->ParaList[29] = 0x82;
> - OptEnt.Para->ParaList[30] = 0x83;
> - OptEnt.Para->ParaList[31] = 0x84;
> - OptEnt.Para->ParaList[32] = 0x85;
> - OptEnt.Para->ParaList[33] = 0x86;
> - OptEnt.Para->ParaList[34] = 0x87;
> - Index++;
> - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
> -
> - //
> - // Append UUID/Guid-based client identifier option
> - //
> - OptList[Index]->OpCode = DHCP4_TAG_UUID;
> - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_UUID);
> - OptEnt.Uuid = (PXEBC_DHCP4_OPTION_UUID *) OptList[Index]->Data;
> - OptEnt.Uuid->Type = 0;
> - Index++;
> - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
> -
> - if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) OptEnt.Uuid->Guid))) {
> - //
> - // GUID not yet set - send all 0xff's to show programable (via SetVariable)
> - // SetMem(DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid,
> sizeof(EFI_GUID), 0xff);
> - // GUID not yet set - send all 0's to show not programable
> - //
> - DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios
> table!\n"));
> - ZeroMem (OptEnt.Uuid->Guid, sizeof (EFI_GUID));
> - }
> -
> - //
> - // Append client network device interface option
> - //
> - OptList[Index]->OpCode = DHCP4_TAG_UNDI;
> - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_UNDI);
> - OptEnt.Undi = (PXEBC_DHCP4_OPTION_UNDI *) OptList[Index]->Data;
> - if (Private->Nii != NULL) {
> - OptEnt.Undi->Type = Private->Nii->Type;
> - OptEnt.Undi->MajorVer = Private->Nii->MajorVer;
> - OptEnt.Undi->MinorVer = Private->Nii->MinorVer;
> - } else {
> - OptEnt.Undi->Type = DEFAULT_UNDI_TYPE;
> - OptEnt.Undi->MajorVer = DEFAULT_UNDI_MAJOR;
> - OptEnt.Undi->MinorVer = DEFAULT_UNDI_MINOR;
> - }
> -
> - Index++;
> - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
> -
> - //
> - // Append client system architecture option
> - //
> - OptList[Index]->OpCode = DHCP4_TAG_ARCH;
> - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_ARCH);
> - OptEnt.Arch = (PXEBC_DHCP4_OPTION_ARCH *) OptList[Index]->Data;
> - Value = HTONS (EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE);
> - CopyMem (&OptEnt.Arch->Type, &Value, sizeof (UINT16));
> - Index++;
> - OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
> -
> - //
> - // Append client system architecture option
> - //
> - OptList[Index]->OpCode = DHCP4_TAG_VENDOR_CLASS_ID;
> - OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_CLID);
> - OptEnt.Clid = (PXEBC_DHCP4_OPTION_CLID *) OptList[Index]->Data;
> - CopyMem (OptEnt.Clid, DEFAULT_CLASS_ID_DATA, sizeof
> (PXEBC_DHCP4_OPTION_CLID));
> - CvtNum (EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE, OptEnt.Clid-
> >ArchitectureType, sizeof (OptEnt.Clid->ArchitectureType));
> -
> - if (Private->Nii != NULL) {
> - //
> - // If NII protocol exists, update DHCP option data
> - //
> - CopyMem (OptEnt.Clid->InterfaceName, Private->Nii->StringId, sizeof
> (OptEnt.Clid->InterfaceName));
> - CvtNum (Private->Nii->MajorVer, OptEnt.Clid->UndiMajor, sizeof
> (OptEnt.Clid->UndiMajor));
> - CvtNum (Private->Nii->MinorVer, OptEnt.Clid->UndiMinor, sizeof
> (OptEnt.Clid->UndiMinor));
> - }
> -
> - Index++;
> -
> - return Index;
> -}
> -
> -
> -/**
> - Discover the boot of service and initialize the vendor option if exists.
> -
> - @param Private Pointer to PxeBc private data.
> - @param Type PxeBc option boot item type
> - @param Layer PxeBc option boot item layer
> - @param UseBis Use BIS or not
> - @param DestIp Ip address for server
> - @param IpCount The total count of the server ip address
> - @param SrvList Server list
> - @param IsDiscv Discover the vendor or not
> - @param Reply The dhcp4 packet of Pxe reply
> -
> - @retval EFI_SUCCESS Operation succeeds.
> - @retval EFI_OUT_OF_RESOURCES Allocate memory pool failed.
> - @retval EFI_NOT_FOUND There is no vendor option exists.
> - @retval EFI_TIMEOUT Send Pxe Discover time out.
> -
> -**/
> -EFI_STATUS
> -PxeBcDiscvBootService (
> - IN PXEBC_PRIVATE_DATA * Private,
> - IN UINT16 Type,
> - IN UINT16 *Layer,
> - IN BOOLEAN UseBis,
> - IN EFI_IP_ADDRESS * DestIp,
> - IN UINT16 IpCount,
> - IN EFI_PXE_BASE_CODE_SRVLIST * SrvList,
> - IN BOOLEAN IsDiscv,
> - OUT EFI_DHCP4_PACKET * Reply OPTIONAL
> - )
> -{
> - EFI_PXE_BASE_CODE_UDP_PORT Sport;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - EFI_DHCP4_PROTOCOL *Dhcp4;
> - EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN Token;
> - BOOLEAN IsBCast;
> - EFI_STATUS Status;
> - UINT16 RepIndex;
> - UINT16 SrvIndex;
> - UINT16 TryIndex;
> - EFI_DHCP4_LISTEN_POINT ListenPoint;
> - EFI_DHCP4_PACKET *Response;
> - EFI_DHCP4_PACKET_OPTION
> *OptList[PXEBC_DHCP4_MAX_OPTION_NUM];
> - UINT32 OptCount;
> - EFI_DHCP4_PACKET_OPTION *PxeOpt;
> - PXEBC_OPTION_BOOT_ITEM *PxeBootItem;
> - UINT8 VendorOptLen;
> - EFI_DHCP4_HEADER *DhcpHeader;
> - UINT32 Xid;
> -
> - Mode = Private->PxeBc.Mode;
> - Dhcp4 = Private->Dhcp4;
> - Status = EFI_SUCCESS;
> -
> - ZeroMem (&Token, sizeof (EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN));
> -
> - if (DestIp == NULL) {
> - Sport = PXEBC_DHCP4_S_PORT;
> - IsBCast = TRUE;
> - } else {
> - Sport = PXEBC_BS_DISCOVER_PORT;
> - IsBCast = FALSE;
> - }
> -
> - if (!UseBis && Layer != NULL) {
> - *Layer &= EFI_PXE_BASE_CODE_BOOT_LAYER_MASK;
> - }
> -
> - OptCount = PxeBcBuildDhcpOptions (Private, OptList, FALSE);
> -
> - if (IsDiscv) {
> - ASSERT (Layer != NULL);
> - //
> - // Add vendor option of PXE_BOOT_ITEM
> - //
> - VendorOptLen = (UINT8) ((sizeof (EFI_DHCP4_PACKET_OPTION) - 1) * 2 +
> sizeof (PXEBC_OPTION_BOOT_ITEM) + 1);
> - OptList[OptCount] = AllocatePool (VendorOptLen);
> - if (OptList[OptCount] == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - OptList[OptCount]->OpCode = DHCP4_TAG_VENDOR;
> - OptList[OptCount]->Length = (UINT8) (VendorOptLen - 2);
> - PxeOpt = (EFI_DHCP4_PACKET_OPTION *) OptList[OptCount]-
> >Data;
> - PxeOpt->OpCode = PXEBC_VENDOR_TAG_BOOT_ITEM;
> - PxeOpt->Length = (UINT8) sizeof (PXEBC_OPTION_BOOT_ITEM);
> - PxeBootItem = (PXEBC_OPTION_BOOT_ITEM *) PxeOpt->Data;
> - PxeBootItem->Type = HTONS (Type);
> - PxeBootItem->Layer = HTONS (*Layer);
> - PxeOpt->Data[PxeOpt->Length] = DHCP4_TAG_EOP;
> -
> - OptCount++;
> - }
> -
> - Status = Dhcp4->Build (Dhcp4, &Private->SeedPacket, 0, NULL, OptCount,
> OptList, &Token.Packet);
> -
> - if (IsDiscv) {
> - FreePool (OptList[OptCount - 1]);
> - }
> -
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - DhcpHeader = &Token.Packet->Dhcp4.Header;
> - if (Mode->SendGUID) {
> - if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) DhcpHeader-
> >ClientHwAddr))) {
> - //
> - // GUID not yet set - send all 0's to show not programable
> - //
> - DEBUG ((EFI_D_WARN, "PXE: Failed to read system GUID from the smbios
> table!\n"));
> - ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID));
> - }
> -
> - DhcpHeader->HwAddrLen = (UINT8) sizeof (EFI_GUID);
> - }
> -
> - Xid = NET_RANDOM (NetRandomInitSeed ());
> - Token.Packet->Dhcp4.Header.Xid = HTONL(Xid);
> - Token.Packet->Dhcp4.Header.Reserved = HTONS((UINT16) ((IsBCast) ?
> 0x8000 : 0));
> - CopyMem (&Token.Packet->Dhcp4.Header.ClientAddr, &Private->StationIp,
> sizeof (EFI_IPv4_ADDRESS));
> -
> - Token.RemotePort = Sport;
> -
> - if (IsBCast) {
> - SetMem (&Token.RemoteAddress, sizeof (EFI_IPv4_ADDRESS), 0xff);
> - } else {
> - CopyMem (&Token.RemoteAddress, DestIp, sizeof (EFI_IPv4_ADDRESS));
> - }
> -
> - CopyMem (&Token.GatewayAddress, &Private->GatewayIp, sizeof
> (EFI_IPv4_ADDRESS));
> -
> - if (!IsBCast) {
> - Token.ListenPointCount = 1;
> - Token.ListenPoints = &ListenPoint;
> - Token.ListenPoints[0].ListenPort = PXEBC_BS_DISCOVER_PORT;
> - CopyMem (&Token.ListenPoints[0].ListenAddress, &Private->StationIp,
> sizeof(EFI_IPv4_ADDRESS));
> - CopyMem (&Token.ListenPoints[0].SubnetMask, &Private->SubnetMask,
> sizeof(EFI_IPv4_ADDRESS));
> - }
> - //
> - // Send Pxe Discover
> - //
> - for (TryIndex = 1; TryIndex <= PXEBC_BOOT_REQUEST_RETRIES; TryIndex++) {
> -
> - Token.TimeoutValue = (UINT16)
> (PXEBC_BOOT_REQUEST_TIMEOUT * TryIndex);
> - Token.Packet->Dhcp4.Header.Seconds = (UINT16)
> (PXEBC_BOOT_REQUEST_TIMEOUT * (TryIndex - 1));
> -
> - Status = Dhcp4->TransmitReceive (Dhcp4, &Token);
> -
> - if (Token.Status != EFI_TIMEOUT) {
> - break;
> - }
> - }
> -
> - if (TryIndex > PXEBC_BOOT_REQUEST_RETRIES) {
> - //
> - // No server response our PXE request
> - //
> - Status = EFI_TIMEOUT;
> - }
> -
> - if (!EFI_ERROR (Status)) {
> - //
> - // Find Pxe Reply
> - //
> - RepIndex = 0;
> - SrvIndex = 0;
> - Response = Token.ResponseList;
> -
> - while (RepIndex < Token.ResponseCount) {
> - if (Response->Length > PXEBC_DHCP4_MAX_PACKET_SIZE) {
> - SrvIndex = 0;
> - RepIndex++;
> - Response = (EFI_DHCP4_PACKET *) ((UINT8 *) Response + Response->Size);
> - continue;
> - }
> -
> - while (SrvIndex < IpCount) {
> -
> - if (SrvList[SrvIndex].AcceptAnyResponse) {
> - break;
> - }
> -
> - if ((SrvList[SrvIndex].Type == Type) && EFI_IP4_EQUAL (&(Response-
> >Dhcp4.Header.ServerAddr), &(Private->ServerIp))) {
> - break;
> - }
> -
> - SrvIndex++;
> - }
> -
> - if ((IpCount != SrvIndex) || (IpCount == 0)) {
> - break;
> - }
> -
> - SrvIndex = 0;
> - RepIndex++;
> - Response = (EFI_DHCP4_PACKET *) ((UINT8 *) Response + Response->Size);
> - }
> -
> - if (RepIndex < Token.ResponseCount) {
> -
> - if (Reply != NULL) {
> - Status = PxeBcCopyEfiDhcp4Packet (Reply, Response);
> - if (EFI_ERROR(Status)) {
> - goto ON_EXIT;
> - }
> - }
> -
> - if (IsDiscv) {
> - CopyMem (&(Mode->PxeDiscover), &(Token.Packet->Dhcp4),
> Token.Packet->Length);
> - Mode->PxeDiscoverValid = TRUE;
> -
> - CopyMem (Mode->PxeReply.Raw, &Response->Dhcp4, Response->Length);
> - Mode->PxeReplyReceived = TRUE;
> - }
> - } else {
> - Status = EFI_NOT_FOUND;
> - }
> - }
> -
> -ON_EXIT:
> - //
> - // free the responselist
> - //
> - if (Token.ResponseList != NULL) {
> - FreePool (Token.ResponseList);
> - }
> - //
> - // Free the dhcp packet
> - //
> - if (Token.Packet != NULL) {
> - FreePool (Token.Packet);
> - }
> -
> - return Status;
> -}
> -
> -
> -/**
> - Parse interested dhcp options.
> -
> - @param Buffer Pointer to the dhcp options packet.
> - @param Length The length of the dhcp options.
> - @param OptTag The option OpCode.
> -
> - @return NULL if the buffer length is 0 and OpCode is not
> - DHCP4_TAG_EOP, or the pointer to the buffer.
> -
> -**/
> -EFI_DHCP4_PACKET_OPTION *
> -PxeBcParseExtendOptions (
> - IN UINT8 *Buffer,
> - IN UINT32 Length,
> - IN UINT8 OptTag
> - )
> -{
> - EFI_DHCP4_PACKET_OPTION *Option;
> - UINT32 Offset;
> -
> - Option = (EFI_DHCP4_PACKET_OPTION *) Buffer;
> - Offset = 0;
> -
> - while (Offset < Length && Option->OpCode != DHCP4_TAG_EOP) {
> -
> - if (Option->OpCode == OptTag) {
> -
> - return Option;
> - }
> -
> - if (Option->OpCode == DHCP4_TAG_PAD) {
> - Offset++;
> - } else {
> - Offset += Option->Length + 2;
> - }
> -
> - Option = (EFI_DHCP4_PACKET_OPTION *) (Buffer + Offset);
> - }
> -
> - return NULL;
> -}
> -
> -
> -/**
> - This function is to parse and check vendor options.
> -
> - @param Dhcp4Option Pointer to dhcp options
> - @param VendorOption Pointer to vendor options
> -
> - @return TRUE if valid for vendor options, or FALSE.
> -
> -**/
> -BOOLEAN
> -PxeBcParseVendorOptions (
> - IN EFI_DHCP4_PACKET_OPTION *Dhcp4Option,
> - IN PXEBC_VENDOR_OPTION *VendorOption
> - )
> -{
> - UINT32 *BitMap;
> - UINT8 VendorOptionLen;
> - EFI_DHCP4_PACKET_OPTION *PxeOption;
> - UINT8 Offset;
> -
> - BitMap = VendorOption->BitMap;
> - VendorOptionLen = Dhcp4Option->Length;
> - PxeOption = (EFI_DHCP4_PACKET_OPTION *) &Dhcp4Option->Data[0];
> - Offset = 0;
> -
> - while ((Offset < VendorOptionLen) && (PxeOption->OpCode !=
> DHCP4_TAG_EOP)) {
> - //
> - // Parse every Vendor Option and set its BitMap
> - //
> - switch (PxeOption->OpCode) {
> -
> - case PXEBC_VENDOR_TAG_MTFTP_IP:
> -
> - CopyMem (&VendorOption->MtftpIp, PxeOption->Data, sizeof
> (EFI_IPv4_ADDRESS));
> - break;
> -
> - case PXEBC_VENDOR_TAG_MTFTP_CPORT:
> -
> - CopyMem (&VendorOption->MtftpCPort, PxeOption->Data, sizeof
> (VendorOption->MtftpCPort));
> - break;
> -
> - case PXEBC_VENDOR_TAG_MTFTP_SPORT:
> -
> - CopyMem (&VendorOption->MtftpSPort, PxeOption->Data, sizeof
> (VendorOption->MtftpSPort));
> - break;
> -
> - case PXEBC_VENDOR_TAG_MTFTP_TIMEOUT:
> -
> - VendorOption->MtftpTimeout = *PxeOption->Data;
> - break;
> -
> - case PXEBC_VENDOR_TAG_MTFTP_DELAY:
> -
> - VendorOption->MtftpDelay = *PxeOption->Data;
> - break;
> -
> - case PXEBC_VENDOR_TAG_DISCOVER_CTRL:
> -
> - VendorOption->DiscoverCtrl = *PxeOption->Data;
> - break;
> -
> - case PXEBC_VENDOR_TAG_DISCOVER_MCAST:
> -
> - CopyMem (&VendorOption->DiscoverMcastIp, PxeOption->Data, sizeof
> (EFI_IPv4_ADDRESS));
> - break;
> -
> - case PXEBC_VENDOR_TAG_BOOT_SERVERS:
> -
> - VendorOption->BootSvrLen = PxeOption->Length;
> - VendorOption->BootSvr = (PXEBC_BOOT_SVR_ENTRY *) PxeOption->Data;
> - break;
> -
> - case PXEBC_VENDOR_TAG_BOOT_MENU:
> -
> - VendorOption->BootMenuLen = PxeOption->Length;
> - VendorOption->BootMenu = (PXEBC_BOOT_MENU_ENTRY *) PxeOption-
> >Data;
> - break;
> -
> - case PXEBC_VENDOR_TAG_MENU_PROMPT:
> -
> - VendorOption->MenuPromptLen = PxeOption->Length;
> - VendorOption->MenuPrompt = (PXEBC_MENU_PROMPT *) PxeOption-
> >Data;
> - break;
> -
> - case PXEBC_VENDOR_TAG_MCAST_ALLOC:
> -
> - CopyMem (&VendorOption->McastIpBase, PxeOption->Data, sizeof
> (EFI_IPv4_ADDRESS));
> - CopyMem (&VendorOption->McastIpBlock, PxeOption->Data + 4, sizeof
> (VendorOption->McastIpBlock));
> - CopyMem (&VendorOption->McastIpRange, PxeOption->Data + 6, sizeof
> (VendorOption->McastIpRange));
> - break;
> -
> - case PXEBC_VENDOR_TAG_CREDENTIAL_TYPES:
> -
> - VendorOption->CredTypeLen = PxeOption->Length;
> - VendorOption->CredType = (UINT32 *) PxeOption->Data;
> - break;
> -
> - case PXEBC_VENDOR_TAG_BOOT_ITEM:
> -
> - CopyMem (&VendorOption->BootSrvType, PxeOption->Data, sizeof
> (VendorOption->BootSrvType));
> - CopyMem (&VendorOption->BootSrvLayer, PxeOption->Data + 2, sizeof
> (VendorOption->BootSrvLayer));
> - break;
> - }
> -
> - SET_VENDOR_OPTION_BIT_MAP (BitMap, PxeOption->OpCode);
> -
> - if (PxeOption->OpCode == DHCP4_TAG_PAD) {
> - Offset++;
> - } else {
> - Offset = (UINT8) (Offset + PxeOption->Length + 2);
> - }
> -
> - PxeOption = (EFI_DHCP4_PACKET_OPTION *) (Dhcp4Option->Data + Offset);
> - }
> -
> - //
> - // FixMe, return falas if invalid of any vendor option
> - //
> -
> - return TRUE;
> -}
> -
> -
> -/**
> - This function display boot item detail.
> -
> - If the length of the boot item string over 70 Char, just display 70 Char.
> -
> - @param Str Pointer to a string (boot item string).
> - @param Len The length of string.
> -
> -**/
> -VOID
> -PxeBcDisplayBootItem (
> - IN UINT8 *Str,
> - IN UINT8 Len
> - )
> -{
> - UINT8 Tmp;
> -
> - Len = (UINT8) MIN (70, Len);
> - Tmp = Str[Len];
> - Str[Len] = 0;
> - AsciiPrint ("%a \n", Str);
> - Str[Len] = Tmp;
> -}
> -
> -
> -/**
> - Choose the boot prompt.
> -
> - @param Private Pointer to PxeBc private data.
> -
> - @retval EFI_SUCCESS Select boot prompt done.
> - @retval EFI_TIMEOUT Select boot prompt time out.
> - @retval EFI_NOT_FOUND The proxy offer is not Pxe10.
> - @retval EFI_ABORTED User cancel the operation.
> - @retval EFI_NOT_READY Read the input key from the keybroad has not
> finish.
> -
> -**/
> -EFI_STATUS
> -PxeBcSelectBootPrompt (
> - IN PXEBC_PRIVATE_DATA *Private
> - )
> -{
> - PXEBC_CACHED_DHCP4_PACKET *Packet;
> - PXEBC_VENDOR_OPTION *VendorOpt;
> - EFI_EVENT TimeoutEvent;
> - EFI_EVENT DescendEvent;
> - EFI_INPUT_KEY InputKey;
> - EFI_STATUS Status;
> - UINT8 Timeout;
> - UINT8 *Prompt;
> - UINT8 PromptLen;
> - INT32 SecCol;
> - INT32 SecRow;
> -
> - TimeoutEvent = NULL;
> - DescendEvent = NULL;
> -
> - if (Private->PxeBc.Mode->ProxyOfferReceived) {
> -
> - Packet = &Private->ProxyOffer;
> - } else {
> -
> - Packet = &Private->Dhcp4Ack;
> - }
> -
> - if (Packet->OfferType != DHCP4_PACKET_TYPE_PXE10) {
> - return EFI_NOT_FOUND;
> - }
> -
> - VendorOpt = &Packet->PxeVendorOption;
> - //
> - // According to the PXE specification 2.1, Table 2-1 PXE DHCP Options (Full
> - // List), we must not consider a boot prompt or boot menu if all of the
> - // following hold:
> - // - the PXE_DISCOVERY_CONTROL PXE tag is present inside the Vendor
> Options
> - // (=43) DHCP tag, and
> - // - the PXE_DISCOVERY_CONTROL PXE tag has bit 3 set, and
> - // - a boot file name has been presented with DHCP option 67.
> - //
> - if (IS_DISABLE_PROMPT_MENU (VendorOpt->DiscoverCtrl) &&
> - Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) {
> - return EFI_ABORTED;
> - }
> -
> - if (!IS_VALID_BOOT_PROMPT (VendorOpt->BitMap)) {
> - return EFI_SUCCESS;
> - }
> -
> - Timeout = VendorOpt->MenuPrompt->Timeout;
> - Prompt = VendorOpt->MenuPrompt->Prompt;
> - PromptLen = (UINT8) (VendorOpt->MenuPromptLen - 1);
> -
> - if (Timeout == 0) {
> - return EFI_SUCCESS;
> - }
> -
> - if (Timeout == 255) {
> - return EFI_TIMEOUT;
> - }
> -
> - Status = gBS->CreateEvent (
> - EVT_TIMER,
> - TPL_CALLBACK,
> - NULL,
> - NULL,
> - &TimeoutEvent
> - );
> -
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - Status = gBS->SetTimer (
> - TimeoutEvent,
> - TimerRelative,
> - MultU64x32 (Timeout, TICKS_PER_SECOND)
> - );
> -
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - Status = gBS->CreateEvent (
> - EVT_TIMER,
> - TPL_CALLBACK,
> - NULL,
> - NULL,
> - &DescendEvent
> - );
> -
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - Status = gBS->SetTimer (
> - DescendEvent,
> - TimerPeriodic,
> - TICKS_PER_SECOND
> - );
> -
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - SecCol = gST->ConOut->Mode->CursorColumn;
> - SecRow = gST->ConOut->Mode->CursorRow;
> -
> - PxeBcDisplayBootItem (Prompt, PromptLen);
> -
> - gST->ConOut->SetCursorPosition (gST->ConOut, SecCol + PromptLen,
> SecRow);
> - AsciiPrint ("(%d) ", Timeout--);
> -
> - while (EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) {
> -
> - if (!EFI_ERROR (gBS->CheckEvent (DescendEvent))) {
> - gST->ConOut->SetCursorPosition (gST->ConOut, SecCol + PromptLen,
> SecRow);
> - AsciiPrint ("(%d) ", Timeout--);
> - }
> -
> - if (gST->ConIn->ReadKeyStroke (gST->ConIn, &InputKey) == EFI_NOT_READY)
> {
> -
> - gBS->Stall (10 * TICKS_PER_MS);
> - continue;
> - }
> -
> - if (InputKey.ScanCode == 0) {
> -
> - switch (InputKey.UnicodeChar) {
> - case CTRL ('c'):
> - Status = EFI_ABORTED;
> - break;
> -
> - case CTRL ('m'):
> - case 'm':
> - case 'M':
> - Status = EFI_TIMEOUT;
> - break;
> -
> - default:
> - continue;
> - }
> - } else {
> -
> - switch (InputKey.ScanCode) {
> - case SCAN_F8:
> - Status = EFI_TIMEOUT;
> - break;
> -
> - case SCAN_ESC:
> - Status = EFI_ABORTED;
> - break;
> -
> - default:
> - continue;
> - }
> - }
> -
> - break;
> - }
> -
> - gST->ConOut->SetCursorPosition (gST->ConOut, 0 , SecRow + 1);
> -
> -ON_EXIT:
> -
> - if (DescendEvent != NULL) {
> - gBS->CloseEvent (DescendEvent);
> - }
> -
> - if (TimeoutEvent != NULL) {
> - gBS->CloseEvent (TimeoutEvent);
> - }
> -
> - return Status;
> -}
> -
> -
> -/**
> - Select the boot menu.
> -
> - @param Private Pointer to PxeBc private data.
> - @param Type The type of the menu.
> - @param UseDefaultItem Use default item or not.
> -
> - @retval EFI_ABORTED User cancel operation.
> - @retval EFI_SUCCESS Select the boot menu success.
> - @retval EFI_NOT_READY Read the input key from the keybroad has not finish.
> -
> -**/
> -EFI_STATUS
> -PxeBcSelectBootMenu (
> - IN PXEBC_PRIVATE_DATA *Private,
> - OUT UINT16 *Type,
> - IN BOOLEAN UseDefaultItem
> - )
> -{
> - PXEBC_CACHED_DHCP4_PACKET *Packet;
> - PXEBC_VENDOR_OPTION *VendorOpt;
> - EFI_INPUT_KEY InputKey;
> - UINT8 MenuSize;
> - UINT8 MenuNum;
> - INT32 TopRow;
> - UINT16 Select;
> - UINT16 LastSelect;
> - UINT8 Index;
> - BOOLEAN Finish;
> - CHAR8 Blank[70];
> - PXEBC_BOOT_MENU_ENTRY *MenuItem;
> - PXEBC_BOOT_MENU_ENTRY *MenuArray[PXEBC_MAX_MENU_NUM];
> -
> - Finish = FALSE;
> - Select = 0;
> - Index = 0;
> - *Type = 0;
> -
> - if (Private->PxeBc.Mode->ProxyOfferReceived) {
> -
> - Packet = &Private->ProxyOffer;
> - } else {
> -
> - Packet = &Private->Dhcp4Ack;
> - }
> -
> - ASSERT (Packet->OfferType == DHCP4_PACKET_TYPE_PXE10);
> -
> - VendorOpt = &Packet->PxeVendorOption;
> -
> - if (!IS_VALID_BOOT_MENU (VendorOpt->BitMap)) {
> - return EFI_SUCCESS;
> - }
> -
> - SetMem (Blank, sizeof(Blank), ' ');
> -
> - MenuSize = VendorOpt->BootMenuLen;
> - MenuItem = VendorOpt->BootMenu;
> -
> - if (MenuSize == 0) {
> - return EFI_NOT_READY;
> - }
> -
> - while (MenuSize > 0) {
> - MenuArray[Index++] = MenuItem;
> - MenuSize = (UINT8) (MenuSize - (MenuItem->DescLen + 3));
> - MenuItem = (PXEBC_BOOT_MENU_ENTRY *) ((UINT8 *) MenuItem +
> MenuItem->DescLen + 3);
> - if (Index >= PXEBC_MAX_MENU_NUM) {
> - break;
> - }
> - }
> -
> - if (UseDefaultItem) {
> - *Type = MenuArray[0]->Type;
> - *Type = NTOHS (*Type);
> - return EFI_SUCCESS;
> - }
> -
> - MenuNum = Index;
> -
> - for (Index = 0; Index < MenuNum; Index++) {
> - PxeBcDisplayBootItem (MenuArray[Index]->DescStr, MenuArray[Index]-
> >DescLen);
> - }
> -
> - TopRow = gST->ConOut->Mode->CursorRow - MenuNum;
> -
> - do {
> - ASSERT (Select < PXEBC_MAX_MENU_NUM);
> - //
> - // highlight selected row
> - //
> - gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK,
> EFI_LIGHTGRAY));
> - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + Select);
> - Blank[MenuArray[Select]->DescLen] = 0;
> - AsciiPrint ("%a\r", Blank);
> - PxeBcDisplayBootItem (MenuArray[Select]->DescStr, MenuArray[Select]-
> >DescLen);
> - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + MenuNum);
> - LastSelect = Select;
> -
> - while (gST->ConIn->ReadKeyStroke (gST->ConIn, &InputKey) ==
> EFI_NOT_READY) {
> - gBS->Stall (10 * TICKS_PER_MS);
> - }
> -
> - if (InputKey.ScanCode == 0) {
> - switch (InputKey.UnicodeChar) {
> - case CTRL ('c'):
> - InputKey.ScanCode = SCAN_ESC;
> - break;
> -
> - case CTRL ('j'): /* linefeed */
> - case CTRL ('m'): /* return */
> - Finish = TRUE;
> - break;
> -
> - case CTRL ('i'): /* tab */
> - case ' ':
> - case 'd':
> - case 'D':
> - InputKey.ScanCode = SCAN_DOWN;
> - break;
> -
> - case CTRL ('h'): /* backspace */
> - case 'u':
> - case 'U':
> - InputKey.ScanCode = SCAN_UP;
> - break;
> -
> - default:
> - InputKey.ScanCode = 0;
> - }
> - }
> -
> - switch (InputKey.ScanCode) {
> - case SCAN_LEFT:
> - case SCAN_UP:
> - if (Select > 0) {
> - --Select;
> - }
> -
> - break;
> -
> - case SCAN_DOWN:
> - case SCAN_RIGHT:
> - if (++Select == MenuNum) {
> - --Select;
> - }
> -
> - break;
> -
> - case SCAN_PAGE_UP:
> - case SCAN_HOME:
> - Select = 0;
> - break;
> -
> - case SCAN_PAGE_DOWN:
> - case SCAN_END:
> - Select = (UINT16) (MenuNum - 1);
> - break;
> -
> - case SCAN_ESC:
> - return EFI_ABORTED;
> - }
> -
> - /* unhighlight last selected row */
> - gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY,
> EFI_BLACK));
> - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + LastSelect);
> - Blank[MenuArray[LastSelect]->DescLen] = 0;
> - AsciiPrint ("%a\r", Blank);
> - PxeBcDisplayBootItem (MenuArray[LastSelect]->DescStr,
> MenuArray[LastSelect]->DescLen);
> - gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + MenuNum);
> - } while (!Finish);
> -
> - ASSERT (Select < PXEBC_MAX_MENU_NUM);
> -
> - //
> - // Swap the byte order
> - //
> - CopyMem (Type, &MenuArray[Select]->Type, sizeof (UINT16));
> - *Type = NTOHS (*Type);
> -
> - return EFI_SUCCESS;
> -}
> -
> diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
> b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
> deleted file mode 100644
> index 76c140d8e3ff..000000000000
> --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
> +++ /dev/null
> @@ -1,665 +0,0 @@
> -/** @file
> - The driver binding for UEFI PXEBC protocol.
> -
> -Copyright (c) 2007 - 2015, 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.
> -
> -**/
> -
> -
> -#include "PxeBcImpl.h"
> -
> -EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding = {
> - PxeBcDriverBindingSupported,
> - PxeBcDriverBindingStart,
> - PxeBcDriverBindingStop,
> - 0xa,
> - NULL,
> - NULL
> -};
> -
> -/**
> - This is the declaration of an EFI image entry point. This entry point is
> - the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
> - both device drivers and bus drivers.
> -
> - @param ImageHandle The firmware allocated handle for the UEFI
> image.
> - @param SystemTable A pointer to the EFI System Table.
> -
> - @retval EFI_SUCCESS The operation completed successfully.
> - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to
> a lack of resources.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -PxeBcDriverEntryPoint (
> - IN EFI_HANDLE ImageHandle,
> - IN EFI_SYSTEM_TABLE *SystemTable
> - )
> -{
> - return EfiLibInstallDriverBindingComponentName2 (
> - ImageHandle,
> - SystemTable,
> - &gPxeBcDriverBinding,
> - ImageHandle,
> - &gPxeBcComponentName,
> - &gPxeBcComponentName2
> - );
> -}
> -
> -
> -/**
> - Test to see if this driver supports ControllerHandle. This service
> - is called by the EFI boot service ConnectController(). In
> - order to make drivers as small as possible, there are a few calling
> - restrictions for this service. ConnectController() must
> - follow these calling restrictions. If any other agent wishes to call
> - Supported() it must also follow these calling restrictions.
> - PxeBc requires DHCP4 and MTFTP4 protocols.
> -
> - @param This Protocol instance pointer.
> - @param ControllerHandle Handle of device to test
> - @param RemainingDevicePath Optional parameter use to pick a specific child
> - device to start.
> -
> - @retval EFI_SUCCESS This driver supports this device
> - @retval EFI_ALREADY_STARTED This driver is already running on this device
> - @retval other This driver does not support this device
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -PxeBcDriverBindingSupported (
> - IN EFI_DRIVER_BINDING_PROTOCOL * This,
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL
> - )
> -{
> - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;
> - EFI_STATUS Status;
> -
> - Status = gBS->OpenProtocol (
> - ControllerHandle,
> - &gEfiPxeBaseCodeProtocolGuid,
> - (VOID **) &PxeBc,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_GET_PROTOCOL
> - );
> -
> - if (!EFI_ERROR (Status)) {
> - return EFI_ALREADY_STARTED;
> - }
> -
> - Status = gBS->OpenProtocol (
> - ControllerHandle,
> - &gEfiDhcp4ServiceBindingProtocolGuid,
> - NULL,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_TEST_PROTOCOL
> - );
> -
> - if (!EFI_ERROR (Status)) {
> -
> - Status = gBS->OpenProtocol (
> - ControllerHandle,
> - &gEfiMtftp4ServiceBindingProtocolGuid,
> - NULL,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_TEST_PROTOCOL
> - );
> -
> - }
> -
> - return Status;
> -}
> -
> -
> -/**
> - Start this driver on ControllerHandle. This service is called by the
> - EFI boot service ConnectController(). In order to make
> - drivers as small as possible, there are a few calling restrictions for
> - this service. ConnectController() must follow these
> - calling restrictions. If any other agent wishes to call Start() it
> - must also follow these calling restrictions.
> -
> - @param This Protocol instance pointer.
> - @param ControllerHandle Handle of device to bind driver to
> - @param RemainingDevicePath Optional parameter use to pick a specific child
> - device to start.
> -
> - @retval EFI_SUCCESS This driver is added to ControllerHandle
> - @retval EFI_ALREADY_STARTED This driver is already running on
> ControllerHandle
> - @retval other This driver does not support this device
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -PxeBcDriverBindingStart (
> - IN EFI_DRIVER_BINDING_PROTOCOL * This,
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - UINTN Index;
> - EFI_STATUS Status;
> - EFI_IP4_MODE_DATA Ip4ModeData;
> -
> - Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));
> - if (Private == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Private->Signature = PXEBC_PRIVATE_DATA_SIGNATURE;
> - Private->Controller = ControllerHandle;
> - Private->Image = This->DriverBindingHandle;
> - CopyMem (&Private->PxeBc, &mPxeBcProtocolTemplate, sizeof (Private-
> >PxeBc));
> - Private->PxeBc.Mode = &Private->Mode;
> - CopyMem (&Private->LoadFile, &mLoadFileProtocolTemplate, sizeof (Private-
> >LoadFile));
> -
> - Private->ProxyOffer.Packet.Offer.Size =
> PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;
> - Private->Dhcp4Ack.Packet.Ack.Size =
> PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;
> - Private->PxeReply.Packet.Ack.Size =
> PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;
> -
> - for (Index = 0; Index < PXEBC_MAX_OFFER_NUM; Index++) {
> - Private->Dhcp4Offers[Index].Packet.Offer.Size =
> PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE;
> - }
> -
> - //
> - // Get the NII interface if it exists.
> - //
> - Status = gBS->OpenProtocol (
> - ControllerHandle,
> - &gEfiNetworkInterfaceIdentifierProtocolGuid_31,
> - (VOID **) &Private->Nii,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_GET_PROTOCOL
> - );
> - if (EFI_ERROR (Status)) {
> - Private->Nii = NULL;
> - }
> -
> - Status = NetLibCreateServiceChild (
> - ControllerHandle,
> - This->DriverBindingHandle,
> - &gEfiArpServiceBindingProtocolGuid,
> - &Private->ArpChild
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Status = gBS->OpenProtocol (
> - Private->ArpChild,
> - &gEfiArpProtocolGuid,
> - (VOID **) &Private->Arp,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_BY_DRIVER
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Status = NetLibCreateServiceChild (
> - ControllerHandle,
> - This->DriverBindingHandle,
> - &gEfiDhcp4ServiceBindingProtocolGuid,
> - &Private->Dhcp4Child
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Status = gBS->OpenProtocol (
> - Private->Dhcp4Child,
> - &gEfiDhcp4ProtocolGuid,
> - (VOID **) &Private->Dhcp4,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_BY_DRIVER
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Status = NetLibCreateServiceChild (
> - ControllerHandle,
> - This->DriverBindingHandle,
> - &gEfiIp4ServiceBindingProtocolGuid,
> - &Private->Ip4Child
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Status = gBS->OpenProtocol (
> - Private->Ip4Child,
> - &gEfiIp4ProtocolGuid,
> - (VOID **) &Private->Ip4,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_BY_DRIVER
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - //
> - // Get max packet size from Ip4 to calculate block size for Tftp later.
> - //
> - Status = Private->Ip4->GetModeData (Private->Ip4, &Ip4ModeData, NULL,
> NULL);
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Private->Ip4MaxPacketSize = Ip4ModeData.MaxPacketSize;
> -
> - Status = NetLibCreateServiceChild (
> - ControllerHandle,
> - This->DriverBindingHandle,
> - &gEfiMtftp4ServiceBindingProtocolGuid,
> - &Private->Mtftp4Child
> - );
> -
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Status = gBS->OpenProtocol (
> - Private->Mtftp4Child,
> - &gEfiMtftp4ProtocolGuid,
> - (VOID **) &Private->Mtftp4,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_BY_DRIVER
> - );
> -
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Status = NetLibCreateServiceChild (
> - ControllerHandle,
> - This->DriverBindingHandle,
> - &gEfiUdp4ServiceBindingProtocolGuid,
> - &Private->Udp4ReadChild
> - );
> -
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - //
> - // The UDP instance for EfiPxeBcUdpRead
> - //
> - Status = gBS->OpenProtocol (
> - Private->Udp4ReadChild,
> - &gEfiUdp4ProtocolGuid,
> - (VOID **) &Private->Udp4Read,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_BY_DRIVER
> - );
> -
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - //
> - // The UDP instance for EfiPxeBcUdpWrite
> - //
> - Status = NetLibCreateServiceChild (
> - ControllerHandle,
> - This->DriverBindingHandle,
> - &gEfiUdp4ServiceBindingProtocolGuid,
> - &Private->Udp4WriteChild
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - Status = gBS->OpenProtocol (
> - Private->Udp4WriteChild,
> - &gEfiUdp4ProtocolGuid,
> - (VOID **) &Private->Udp4Write,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_BY_DRIVER
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> - ZeroMem (&Private->Udp4CfgData, sizeof (EFI_UDP4_CONFIG_DATA));
> - Private->Udp4CfgData.AcceptBroadcast = FALSE;
> - Private->Udp4CfgData.AcceptPromiscuous = FALSE;
> - Private->Udp4CfgData.AcceptAnyPort = TRUE;
> - Private->Udp4CfgData.AllowDuplicatePort = TRUE;
> - Private->Udp4CfgData.TypeOfService = DEFAULT_ToS;
> - Private->Udp4CfgData.TimeToLive = DEFAULT_TTL;
> - Private->Udp4CfgData.DoNotFragment = FALSE;
> - Private->Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;
> - Private->Udp4CfgData.UseDefaultAddress = FALSE;
> -
> - PxeBcInitSeedPacket (&Private->SeedPacket, Private->Udp4Read);
> - Private->MacLen = Private->SeedPacket.Dhcp4.Header.HwAddrLen;
> - CopyMem (&Private->Mac, &Private-
> >SeedPacket.Dhcp4.Header.ClientHwAddr[0], Private->MacLen);
> -
> -
> - ZeroMem (&Private->Ip4ConfigData, sizeof (EFI_IP4_CONFIG_DATA));
> - Private->Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP;
> - Private->Ip4ConfigData.AcceptIcmpErrors = TRUE;
> - Private->Ip4ConfigData.TypeOfService = DEFAULT_ToS;
> - Private->Ip4ConfigData.TimeToLive = DEFAULT_TTL;
> - Private->Ip4ConfigData.DoNotFragment = FALSE;
> - Private->Ip4ConfigData.RawData = FALSE;
> -
> - Status = gBS->InstallMultipleProtocolInterfaces (
> - &ControllerHandle,
> - &gEfiPxeBaseCodeProtocolGuid,
> - &Private->PxeBc,
> - &gEfiLoadFileProtocolGuid,
> - &Private->LoadFile,
> - NULL
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> - //
> - // Locate Ip4->Ip4Config2 and store it for set IPv4 Policy.
> - //
> - Status = gBS->HandleProtocol (
> - ControllerHandle,
> - &gEfiIp4Config2ProtocolGuid,
> - (VOID **) &Private->Ip4Config2
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_ERROR;
> - }
> -
> - return EFI_SUCCESS;
> -
> -ON_ERROR:
> -
> - if (Private->Udp4WriteChild != NULL) {
> - gBS->CloseProtocol (
> - Private->Udp4WriteChild,
> - &gEfiUdp4ProtocolGuid,
> - This->DriverBindingHandle,
> - ControllerHandle
> - );
> - NetLibDestroyServiceChild (
> - ControllerHandle,
> - This->DriverBindingHandle,
> - &gEfiUdp4ServiceBindingProtocolGuid,
> - Private->Udp4WriteChild
> - );
> - }
> -
> - if (Private->Udp4ReadChild != NULL) {
> - gBS->CloseProtocol (
> - Private->Udp4ReadChild,
> - &gEfiUdp4ProtocolGuid,
> - This->DriverBindingHandle,
> - ControllerHandle
> - );
> - NetLibDestroyServiceChild (
> - ControllerHandle,
> - This->DriverBindingHandle,
> - &gEfiUdp4ServiceBindingProtocolGuid,
> - Private->Udp4ReadChild
> - );
> - }
> -
> - if (Private->Mtftp4Child != NULL) {
> - gBS->CloseProtocol (
> - Private->Mtftp4Child,
> - &gEfiMtftp4ProtocolGuid,
> - This->DriverBindingHandle,
> - ControllerHandle
> - );
> -
> - NetLibDestroyServiceChild (
> - ControllerHandle,
> - This->DriverBindingHandle,
> - &gEfiMtftp4ServiceBindingProtocolGuid,
> - Private->Mtftp4Child
> - );
> - }
> -
> - if (Private->Ip4Child != NULL) {
> - gBS->CloseProtocol (
> - Private->Ip4Child,
> - &gEfiIp4ProtocolGuid,
> - This->DriverBindingHandle,
> - ControllerHandle
> - );
> -
> - NetLibDestroyServiceChild (
> - ControllerHandle,
> - This->DriverBindingHandle,
> - &gEfiIp4ServiceBindingProtocolGuid,
> - Private->Ip4Child
> - );
> - }
> -
> - if (Private->Dhcp4Child != NULL) {
> - gBS->CloseProtocol (
> - Private->Dhcp4Child,
> - &gEfiDhcp4ProtocolGuid,
> - This->DriverBindingHandle,
> - ControllerHandle
> - );
> -
> - NetLibDestroyServiceChild (
> - ControllerHandle,
> - This->DriverBindingHandle,
> - &gEfiDhcp4ServiceBindingProtocolGuid,
> - Private->Dhcp4Child
> - );
> - }
> -
> - if (Private->ArpChild != NULL) {
> - gBS->CloseProtocol (
> - Private->ArpChild,
> - &gEfiArpProtocolGuid,
> - This->DriverBindingHandle,
> - ControllerHandle
> - );
> -
> - NetLibDestroyServiceChild (
> - ControllerHandle,
> - This->DriverBindingHandle,
> - &gEfiArpServiceBindingProtocolGuid,
> - Private->ArpChild
> - );
> - }
> -
> - FreePool (Private);
> -
> - return Status;
> -}
> -
> -
> -/**
> - Stop this driver on ControllerHandle. This service is called by the
> - EFI boot service DisconnectController(). In order to
> - make drivers as small as possible, there are a few calling
> - restrictions for this service. DisconnectController()
> - must follow these calling restrictions. If any other agent wishes
> - to call Stop() it must also follow these calling restrictions.
> -
> - @param This Protocol instance pointer.
> - @param ControllerHandle Handle of device to stop driver on
> - @param NumberOfChildren Number of Handles in ChildHandleBuffer. If
> number of
> - children is zero stop the entire bus driver.
> - @param ChildHandleBuffer List of Child Handles to Stop.
> -
> - @retval EFI_SUCCESS This driver is removed ControllerHandle
> - @retval other This driver was not removed from this device
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -PxeBcDriverBindingStop (
> - IN EFI_DRIVER_BINDING_PROTOCOL *This,
> - IN EFI_HANDLE ControllerHandle,
> - IN UINTN NumberOfChildren,
> - IN EFI_HANDLE *ChildHandleBuffer
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;
> - EFI_HANDLE NicHandle;
> - EFI_STATUS Status;
> -
> - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);
> - if (NicHandle == NULL) {
> - NicHandle = NetLibGetNicHandle (ControllerHandle,
> &gEfiDhcp4ProtocolGuid);
> -
> - if (NicHandle == NULL) {
> - NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiIp4ProtocolGuid);
> -
> - if (NicHandle == NULL) {
> - NicHandle = NetLibGetNicHandle (ControllerHandle,
> &gEfiUdp4ProtocolGuid);
> -
> - if (NicHandle == NULL) {
> - NicHandle = NetLibGetNicHandle (ControllerHandle,
> &gEfiMtftp4ProtocolGuid);
> -
> - if (NicHandle == NULL) {
> - return EFI_SUCCESS;
> - }
> - }
> - }
> - }
> - }
> -
> - Status = gBS->OpenProtocol (
> - NicHandle,
> - &gEfiPxeBaseCodeProtocolGuid,
> - (VOID **) &PxeBc,
> - This->DriverBindingHandle,
> - ControllerHandle,
> - EFI_OPEN_PROTOCOL_GET_PROTOCOL
> - );
> -
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - //
> - // Stop functionality of PXE Base Code protocol
> - //
> - Status = PxeBc->Stop (PxeBc);
> - if (Status != EFI_SUCCESS && Status != EFI_NOT_STARTED) {
> - return Status;
> - }
> -
> - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (PxeBc);
> -
> - Status = gBS->UninstallMultipleProtocolInterfaces (
> - NicHandle,
> - &gEfiPxeBaseCodeProtocolGuid,
> - &Private->PxeBc,
> - &gEfiLoadFileProtocolGuid,
> - &Private->LoadFile,
> - NULL
> - );
> -
> - if (!EFI_ERROR (Status)) {
> -
> - gBS->CloseProtocol (
> - Private->Udp4WriteChild,
> - &gEfiUdp4ProtocolGuid,
> - This->DriverBindingHandle,
> - NicHandle
> - );
> - NetLibDestroyServiceChild (
> - ControllerHandle,
> - This->DriverBindingHandle,
> - &gEfiUdp4ServiceBindingProtocolGuid,
> - Private->Udp4WriteChild
> - );
> -
> - gBS->CloseProtocol (
> - Private->Udp4ReadChild,
> - &gEfiUdp4ProtocolGuid,
> - This->DriverBindingHandle,
> - NicHandle
> - );
> - NetLibDestroyServiceChild (
> - NicHandle,
> - This->DriverBindingHandle,
> - &gEfiUdp4ServiceBindingProtocolGuid,
> - Private->Udp4ReadChild
> - );
> -
> - gBS->CloseProtocol (
> - Private->Dhcp4Child,
> - &gEfiDhcp4ProtocolGuid,
> - This->DriverBindingHandle,
> - NicHandle
> - );
> - NetLibDestroyServiceChild (
> - NicHandle,
> - This->DriverBindingHandle,
> - &gEfiDhcp4ServiceBindingProtocolGuid,
> - Private->Dhcp4Child
> - );
> -
> - gBS->CloseProtocol (
> - Private->Mtftp4Child,
> - &gEfiMtftp4ProtocolGuid,
> - This->DriverBindingHandle,
> - NicHandle
> - );
> - NetLibDestroyServiceChild (
> - NicHandle,
> - This->DriverBindingHandle,
> - &gEfiMtftp4ServiceBindingProtocolGuid,
> - Private->Mtftp4Child
> - );
> -
> - gBS->CloseProtocol (
> - Private->Ip4Child,
> - &gEfiIp4ProtocolGuid,
> - This->DriverBindingHandle,
> - NicHandle
> - );
> - NetLibDestroyServiceChild (
> - NicHandle,
> - This->DriverBindingHandle,
> - &gEfiIp4ServiceBindingProtocolGuid,
> - Private->Ip4Child
> - );
> -
> - gBS->CloseProtocol (
> - Private->ArpChild,
> - &gEfiArpProtocolGuid,
> - This->DriverBindingHandle,
> - NicHandle
> - );
> - NetLibDestroyServiceChild (
> - NicHandle,
> - This->DriverBindingHandle,
> - &gEfiArpServiceBindingProtocolGuid,
> - Private->ArpChild
> - );
> -
> - FreePool (Private);
> - }
> -
> - return Status;
> -}
> -
> -
> diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c
> b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c
> deleted file mode 100644
> index 3fa3be99c178..000000000000
> --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c
> +++ /dev/null
> @@ -1,2989 +0,0 @@
> -/** @file
> - Interface routines for PxeBc.
> -
> -Copyright (c) 2007 - 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.
> -
> -**/
> -
> -
> -#include "PxeBcImpl.h"
> -
> -UINT32 mPxeDhcpTimeout[4] = { 4, 8, 16, 32 };
> -
> -/**
> - Get and record the arp cache.
> -
> - @param This Pointer to EFI_PXE_BC_PROTOCOL
> -
> - @retval EFI_SUCCESS Arp cache updated successfully
> - @retval others If error occurs when getting arp cache
> -
> -**/
> -EFI_STATUS
> -UpdateArpCache (
> - IN EFI_PXE_BASE_CODE_PROTOCOL * This
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - EFI_STATUS Status;
> - UINT32 EntryLength;
> - UINT32 EntryCount;
> - EFI_ARP_FIND_DATA *Entries;
> - UINT32 Index;
> -
> - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
> - Mode = Private->PxeBc.Mode;
> -
> - Status = Private->Arp->Find (
> - Private->Arp,
> - TRUE,
> - NULL,
> - &EntryLength,
> - &EntryCount,
> - &Entries,
> - TRUE
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - Mode->ArpCacheEntries = MIN (
> - EntryCount,
> - EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES
> - );
> - for (Index = 0; Index < Mode->ArpCacheEntries; Index ++) {
> - CopyMem (
> - &Mode->ArpCache[Index].IpAddr,
> - Entries + 1,
> - Entries->SwAddressLength
> - );
> - CopyMem (
> - &Mode->ArpCache[Index].MacAddr,
> - (UINT8 *) (Entries + 1) + Entries->SwAddressLength,
> - Entries->HwAddressLength
> - );
> - //
> - // Slip to the next FindData.
> - //
> - Entries = (EFI_ARP_FIND_DATA *) ((UINT8 *) Entries + EntryLength);
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Timeout routine to update arp cache.
> -
> - @param Event Pointer to EFI_PXE_BC_PROTOCOL
> - @param Context Context of the timer event
> -
> -**/
> -VOID
> -EFIAPI
> -ArpCacheUpdateTimeout (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - )
> -{
> - UpdateArpCache ((EFI_PXE_BASE_CODE_PROTOCOL *) Context);
> -}
> -
> -/**
> - Do arp resolution from arp cache in PxeBcMode.
> -
> - @param PxeBcMode The PXE BC mode to look into.
> - @param Ip4Addr The Ip4 address for resolution.
> - @param MacAddress The resoluted MAC address if the resolution is
> successful.
> - The value is undefined if resolution fails.
> -
> - @retval TRUE The resolution is successful.
> - @retval FALSE Otherwise.
> -
> -**/
> -BOOLEAN
> -FindInArpCache (
> - IN EFI_PXE_BASE_CODE_MODE *PxeBcMode,
> - IN EFI_IPv4_ADDRESS *Ip4Addr,
> - OUT EFI_MAC_ADDRESS *MacAddress
> - )
> -{
> - UINT32 Index;
> -
> - for (Index = 0; Index < PxeBcMode->ArpCacheEntries; Index ++) {
> - if (EFI_IP4_EQUAL (&PxeBcMode->ArpCache[Index].IpAddr.v4, Ip4Addr)) {
> - CopyMem (
> - MacAddress,
> - &PxeBcMode->ArpCache[Index].MacAddr,
> - sizeof (EFI_MAC_ADDRESS)
> - );
> - return TRUE;
> - }
> - }
> -
> - return FALSE;
> -}
> -
> -/**
> - Notify function for the ICMP receive token, used to process
> - the received ICMP packets.
> -
> - @param Context The PXEBC private data.
> -
> -**/
> -VOID
> -EFIAPI
> -IcmpErrorListenHandlerDpc (
> - IN VOID *Context
> - )
> -{
> - EFI_STATUS Status;
> - EFI_IP4_RECEIVE_DATA *RxData;
> - EFI_IP4_PROTOCOL *Ip4;
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - UINTN Index;
> - UINT32 CopiedLen;
> - UINT8 *CopiedPointer;
> -
> - Private = (PXEBC_PRIVATE_DATA *) Context;
> - Mode = &Private->Mode;
> - Status = Private->IcmpErrorRcvToken.Status;
> - RxData = Private->IcmpErrorRcvToken.Packet.RxData;
> - Ip4 = Private->Ip4;
> -
> - if (Status == EFI_ABORTED) {
> - //
> - // The reception is actively aborted by the consumer, directly return.
> - //
> - return;
> - }
> -
> - if (RxData == NULL) {
> - goto Resume;
> - }
> -
> - if (Status != EFI_ICMP_ERROR) {
> - //
> - // The return status should be recognized as EFI_ICMP_ERROR.
> - //
> - goto CleanUp;
> - }
> -
> - if (EFI_IP4 (RxData->Header->SourceAddress) != 0 &&
> - (NTOHL (Mode->SubnetMask.Addr[0]) != 0) &&
> - IP4_NET_EQUAL (NTOHL(Mode->StationIp.Addr[0]), EFI_NTOHL (RxData-
> >Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0])) &&
> - !NetIp4IsUnicast (EFI_NTOHL (RxData->Header->SourceAddress), NTOHL
> (Mode->SubnetMask.Addr[0]))) {
> - //
> - // The source address is not zero and it's not a unicast IP address, discard it.
> - //
> - goto CleanUp;
> - }
> -
> - if (!EFI_IP4_EQUAL (&RxData->Header->DestinationAddress, &Mode-
> >StationIp.v4)) {
> - //
> - // The dest address is not equal to Station Ip address, discard it.
> - //
> - goto CleanUp;
> - }
> -
> - //
> - // Constructor ICMP error packet
> - //
> - CopiedLen = 0;
> - CopiedPointer = (UINT8 *) &Mode->IcmpError;
> -
> - for (Index = 0; Index < RxData->FragmentCount; Index ++) {
> - CopiedLen += RxData->FragmentTable[Index].FragmentLength;
> - if (CopiedLen <= sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR)) {
> - CopyMem (
> - CopiedPointer,
> - RxData->FragmentTable[Index].FragmentBuffer,
> - RxData->FragmentTable[Index].FragmentLength
> - );
> - } else {
> - CopyMem (
> - CopiedPointer,
> - RxData->FragmentTable[Index].FragmentBuffer,
> - CopiedLen - sizeof (EFI_PXE_BASE_CODE_ICMP_ERROR)
> - );
> - }
> - CopiedPointer += CopiedLen;
> - }
> -
> -CleanUp:
> - gBS->SignalEvent (RxData->RecycleSignal);
> -
> -Resume:
> - Ip4->Receive (Ip4, &(Private->IcmpErrorRcvToken));
> -}
> -
> -/**
> - Request IcmpErrorListenHandlerDpc as a DPC at TPL_CALLBACK
> -
> - @param Event The event signaled.
> - @param Context The context passed in by the event notifier.
> -
> -**/
> -VOID
> -EFIAPI
> -IcmpErrorListenHandler (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - )
> -{
> - //
> - // Request IpIoListenHandlerDpc as a DPC at TPL_CALLBACK
> - //
> - QueueDpc (TPL_CALLBACK, IcmpErrorListenHandlerDpc, Context);
> -}
> -
> -/**
> - Enables the use of the PXE Base Code Protocol functions.
> -
> - This function enables the use of the PXE Base Code Protocol functions. If the
> - Started field of the EFI_PXE_BASE_CODE_MODE structure is already TRUE,
> then
> - EFI_ALREADY_STARTED will be returned. If UseIpv6 is TRUE, then IPv6
> formatted
> - addresses will be used in this session. If UseIpv6 is FALSE, then IPv4 formatted
> - addresses will be used in this session. If UseIpv6 is TRUE, and the
> Ipv6Supported
> - field of the EFI_PXE_BASE_CODE_MODE structure is FALSE, then
> EFI_UNSUPPORTED will
> - be returned. If there is not enough memory or other resources to start the PXE
> - Base Code Protocol, then EFI_OUT_OF_RESOURCES will be returned.
> Otherwise, the
> - PXE Base Code Protocol will be started, and all of the fields of the
> EFI_PXE_BASE_CODE_MODE
> - structure will be initialized as follows:
> - StartedSet to TRUE.
> - Ipv6SupportedUnchanged.
> - Ipv6AvailableUnchanged.
> - UsingIpv6Set to UseIpv6.
> - BisSupportedUnchanged.
> - BisDetectedUnchanged.
> - AutoArpSet to TRUE.
> - SendGUIDSet to FALSE.
> - TTLSet to DEFAULT_TTL.
> - ToSSet to DEFAULT_ToS.
> - DhcpCompletedSet to FALSE.
> - ProxyOfferReceivedSet to FALSE.
> - StationIpSet to an address of all zeros.
> - SubnetMaskSet to a subnet mask of all zeros.
> - DhcpDiscoverZero-filled.
> - DhcpAckZero-filled.
> - ProxyOfferZero-filled.
> - PxeDiscoverValidSet to FALSE.
> - PxeDiscoverZero-filled.
> - PxeReplyValidSet to FALSE.
> - PxeReplyZero-filled.
> - PxeBisReplyValidSet to FALSE.
> - PxeBisReplyZero-filled.
> - IpFilterSet the Filters field to 0 and the IpCnt field to 0.
> - ArpCacheEntriesSet to 0.
> - ArpCacheZero-filled.
> - RouteTableEntriesSet to 0.
> - RouteTableZero-filled.
> - IcmpErrorReceivedSet to FALSE.
> - IcmpErrorZero-filled.
> - TftpErroReceivedSet to FALSE.
> - TftpErrorZero-filled.
> - MakeCallbacksSet to TRUE if the PXE Base Code Callback Protocol is available.
> - Set to FALSE if the PXE Base Code Callback Protocol is not available.
> -
> - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL
> instance.
> - @param UseIpv6 Specifies the type of IP addresses that are to be used
> during the session
> - that is being started. Set to TRUE for IPv6 addresses, and
> FALSE for
> - IPv4 addresses.
> -
> - @retval EFI_SUCCESS The PXE Base Code Protocol was started.
> - @retval EFI_DEVICE_ERROR The network device encountered an error
> during this oper
> - @retval EFI_UNSUPPORTED UseIpv6 is TRUE, but the Ipv6Supported field
> of the
> - EFI_PXE_BASE_CODE_MODE structure is FALSE.
> - @retval EFI_ALREADY_STARTED The PXE Base Code Protocol is already in the
> started state.
> - @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not
> point to a valid
> - EFI_PXE_BASE_CODE_PROTOCOL structure.
> - @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory or
> other resources to start the
> - PXE Base Code Protocol.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiPxeBcStart (
> - IN EFI_PXE_BASE_CODE_PROTOCOL *This,
> - IN BOOLEAN UseIpv6
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - EFI_STATUS Status;
> -
> - if (This == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
> - Mode = Private->PxeBc.Mode;
> -
> - if (Mode->Started) {
> - return EFI_ALREADY_STARTED;
> - }
> -
> - if (UseIpv6) {
> - //
> - // IPv6 is not supported now.
> - //
> - return EFI_UNSUPPORTED;
> - }
> -
> - AsciiPrint ("\n>>Start PXE over IPv4");
> -
> - //
> - // Configure the udp4 instance to let it receive data
> - //
> - Status = Private->Udp4Read->Configure (
> - Private->Udp4Read,
> - &Private->Udp4CfgData
> - );
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> -
> - //
> - // Configure block size for TFTP as a default value to handle all link layers.
> - //
> - Private->BlockSize = MIN (Private->Ip4MaxPacketSize,
> PXEBC_DEFAULT_PACKET_SIZE) -
> - PXEBC_DEFAULT_UDP_OVERHEAD_SIZE -
> PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE;
> - //
> - // If PcdTftpBlockSize is set to non-zero, override the default value.
> - //
> - if (PcdGet64 (PcdTftpBlockSize) != 0) {
> - Private->BlockSize = (UINTN) PcdGet64 (PcdTftpBlockSize);
> - }
> -
> - Private->AddressIsOk = FALSE;
> -
> - ZeroMem (Mode, sizeof (EFI_PXE_BASE_CODE_MODE));
> -
> - Mode->Started = TRUE;
> - Mode->TTL = DEFAULT_TTL;
> - Mode->ToS = DEFAULT_ToS;
> - Mode->AutoArp = TRUE;
> -
> - //
> - // Create the event for Arp Cache checking.
> - //
> - Status = gBS->CreateEvent (
> - EVT_TIMER | EVT_NOTIFY_SIGNAL,
> - TPL_CALLBACK,
> - ArpCacheUpdateTimeout,
> - This,
> - &Private->GetArpCacheEvent
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - //
> - // Start the timeout timer event.
> - //
> - Status = gBS->SetTimer (
> - Private->GetArpCacheEvent,
> - TimerPeriodic,
> - TICKS_PER_SECOND
> - );
> -
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - //
> - // Create ICMP error receiving event
> - //
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_SIGNAL,
> - TPL_NOTIFY,
> - IcmpErrorListenHandler,
> - Private,
> - &(Private->IcmpErrorRcvToken.Event)
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - //
> - //DHCP4 service allows only one of its children to be configured in
> - //the active state, If the DHCP4 D.O.R.A started by IP4 auto
> - //configuration and has not been completed, the Dhcp4 state machine
> - //will not be in the right state for the PXE to start a new round D.O.R.A.
> - //so we need to switch it's policy to static.
> - //
> - Status = PxeBcSetIp4Policy (Private);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4ConfigData);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - //
> - // start to listen incoming packet
> - //
> - Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpErrorRcvToken);
> - if (!EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> -ON_EXIT:
> - Private->Ip4->Configure (Private->Ip4, NULL);
> -
> - if (Private->IcmpErrorRcvToken.Event != NULL) {
> - gBS->CloseEvent (Private->IcmpErrorRcvToken.Event);
> - }
> -
> - if (Private->GetArpCacheEvent != NULL) {
> - gBS->SetTimer (Private->GetArpCacheEvent, TimerCancel, 0);
> - gBS->CloseEvent (Private->GetArpCacheEvent);
> - }
> -
> - Mode->Started = FALSE;
> - Mode->TTL = 0;
> - Mode->ToS = 0;
> - Mode->AutoArp = FALSE;
> -
> - return Status;
> -}
> -
> -
> -/**
> - Disables the use of the PXE Base Code Protocol functions.
> -
> - This function stops all activity on the network device. All the resources
> allocated
> - in Start() are released, the Started field of the EFI_PXE_BASE_CODE_MODE
> structure is
> - set to FALSE and EFI_SUCCESS is returned. If the Started field of the
> EFI_PXE_BASE_CODE_MODE
> - structure is already FALSE, then EFI_NOT_STARTED will be returned.
> -
> - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL
> instance.
> -
> - @retval EFI_SUCCESS The PXE Base Code Protocol was stopped.
> - @retval EFI_NOT_STARTED The PXE Base Code Protocol is already in the
> stopped state.
> - @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not
> point to a valid
> - EFI_PXE_BASE_CODE_PROTOCOL structure.
> - @retval EFI_DEVICE_ERROR The network device encountered an error
> during this operation.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiPxeBcStop (
> - IN EFI_PXE_BASE_CODE_PROTOCOL *This
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> -
> - if (This == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
> - Mode = Private->PxeBc.Mode;
> -
> - if (!Mode->Started) {
> - return EFI_NOT_STARTED;
> - }
> -
> - Private->Ip4->Cancel (Private->Ip4, NULL);
> - //
> - // Dispatch the DPCs queued by the NotifyFunction of the canceled rx token's
> - // events.
> - //
> - DispatchDpc ();
> -
> - Private->Ip4->Configure (Private->Ip4, NULL);
> -
> - //
> - // Close the ICMP error receiving event.
> - //
> - gBS->CloseEvent (Private->IcmpErrorRcvToken.Event);
> -
> - //
> - // Cancel the TimeoutEvent timer.
> - //
> - gBS->SetTimer (Private->GetArpCacheEvent, TimerCancel, 0);
> -
> - //
> - // Close the TimeoutEvent event.
> - //
> - gBS->CloseEvent (Private->GetArpCacheEvent);
> -
> - Mode->Started = FALSE;
> -
> - Private->CurrentUdpSrcPort = 0;
> - Private->Udp4Write->Configure (Private->Udp4Write, NULL);
> - Private->Udp4Read->Groups (Private->Udp4Read, FALSE, NULL);
> - Private->Udp4Read->Configure (Private->Udp4Read, NULL);
> -
> - Private->Dhcp4->Stop (Private->Dhcp4);
> - Private->Dhcp4->Configure (Private->Dhcp4, NULL);
> -
> - Private->FileSize = 0;
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -/**
> - Attempts to complete a DHCPv4 D.O.R.A. (discover / offer / request /
> acknowledge) or DHCPv6
> - S.A.R.R (solicit / advertise / request / reply) sequence.
> -
> - This function attempts to complete the DHCP sequence. If this sequence is
> completed,
> - then EFI_SUCCESS is returned, and the DhcpCompleted, ProxyOfferReceived,
> StationIp,
> - SubnetMask, DhcpDiscover, DhcpAck, and ProxyOffer fields of the
> EFI_PXE_BASE_CODE_MODE
> - structure are filled in.
> - If SortOffers is TRUE, then the cached DHCP offer packets will be sorted
> before
> - they are tried. If SortOffers is FALSE, then the cached DHCP offer packets will
> - be tried in the order in which they are received. Please see the Preboot
> Execution
> - Environment (PXE) Specification for additional details on the implementation
> of DHCP.
> - This function can take at least 31 seconds to timeout and return control to the
> - caller. If the DHCP sequence does not complete, then EFI_TIMEOUT will be
> returned.
> - If the Callback Protocol does not return
> EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
> - then the DHCP sequence will be stopped and EFI_ABORTED will be returned.
> -
> - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL
> instance.
> - @param SortOffers TRUE if the offers received should be sorted. Set to
> FALSE to try the
> - offers in the order that they are received.
> -
> - @retval EFI_SUCCESS Valid DHCP has completed.
> - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped
> state.
> - @retval EFI_INVALID_PARAMETER The This parameter is NULL or does not
> point to a valid
> - EFI_PXE_BASE_CODE_PROTOCOL structure.
> - @retval EFI_DEVICE_ERROR The network device encountered an error
> during this operation.
> - @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory to
> complete the DHCP Protocol.
> - @retval EFI_ABORTED The callback function aborted the DHCP Protocol.
> - @retval EFI_TIMEOUT The DHCP Protocol timed out.
> - @retval EFI_ICMP_ERROR An ICMP error packet was received during the
> DHCP session.
> - @retval EFI_NO_RESPONSE Valid PXE offer was not received.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiPxeBcDhcp (
> - IN EFI_PXE_BASE_CODE_PROTOCOL *This,
> - IN BOOLEAN SortOffers
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - EFI_DHCP4_PROTOCOL *Dhcp4;
> - EFI_DHCP4_CONFIG_DATA Dhcp4CfgData;
> - EFI_DHCP4_MODE_DATA Dhcp4Mode;
> - EFI_DHCP4_PACKET_OPTION
> *OptList[PXEBC_DHCP4_MAX_OPTION_NUM];
> - UINT32 OptCount;
> - EFI_STATUS Status;
> - EFI_ARP_CONFIG_DATA ArpConfigData;
> - EFI_PXE_BASE_CODE_IP_FILTER IpFilter;
> -
> - if (This == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Status = EFI_SUCCESS;
> - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
> - Mode = Private->PxeBc.Mode;
> - Dhcp4 = Private->Dhcp4;
> - Private->Function = EFI_PXE_BASE_CODE_FUNCTION_DHCP;
> - Private->SortOffers = SortOffers;
> -
> - if (!Mode->Started) {
> - return EFI_NOT_STARTED;
> - }
> -
> - Mode->IcmpErrorReceived = FALSE;
> -
> - //
> - // Stop Udp4Read instance
> - //
> - Private->Udp4Read->Configure (Private->Udp4Read, NULL);
> -
> - //
> - // Initialize the DHCP options and build the option list
> - //
> - OptCount = PxeBcBuildDhcpOptions (Private, OptList, TRUE);
> -
> - //
> - // Set the DHCP4 config data.
> - // The four discovery timeouts are 4, 8, 16, 32 seconds respectively.
> - //
> - ZeroMem (&Dhcp4CfgData, sizeof (EFI_DHCP4_CONFIG_DATA));
> - Dhcp4CfgData.OptionCount = OptCount;
> - Dhcp4CfgData.OptionList = OptList;
> - Dhcp4CfgData.Dhcp4Callback = PxeBcDhcpCallBack;
> - Dhcp4CfgData.CallbackContext = Private;
> - Dhcp4CfgData.DiscoverTryCount = 4;
> - Dhcp4CfgData.DiscoverTimeout = mPxeDhcpTimeout;
> -
> - Status = Dhcp4->Configure (Dhcp4, &Dhcp4CfgData);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - //
> - // Zero those arrays to record the varies numbers of DHCP OFFERS.
> - //
> - Private->GotProxyOffer = FALSE;
> - Private->NumOffers = 0;
> - Private->BootpIndex = 0;
> - ZeroMem (Private->ServerCount, sizeof (Private->ServerCount));
> - ZeroMem (Private->ProxyIndex, sizeof (Private->ProxyIndex));
> -
> - Status = Dhcp4->Start (Dhcp4, NULL);
> - if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {
> - if (Status == EFI_ICMP_ERROR) {
> - Mode->IcmpErrorReceived = TRUE;
> - }
> - goto ON_EXIT;
> - }
> -
> - Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4Mode);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - ASSERT (Dhcp4Mode.State == Dhcp4Bound);
> -
> - CopyMem (&Private->StationIp, &Dhcp4Mode.ClientAddress, sizeof
> (EFI_IPv4_ADDRESS));
> - CopyMem (&Private->SubnetMask, &Dhcp4Mode.SubnetMask, sizeof
> (EFI_IPv4_ADDRESS));
> - CopyMem (&Private->GatewayIp, &Dhcp4Mode.RouterAddress, sizeof
> (EFI_IPv4_ADDRESS));
> -
> - CopyMem (&Mode->StationIp, &Private->StationIp, sizeof
> (EFI_IPv4_ADDRESS));
> - CopyMem (&Mode->SubnetMask, &Private->SubnetMask, sizeof
> (EFI_IPv4_ADDRESS));
> -
> - //
> - // Check the selected offer to see whether BINL is required, if no or BINL is
> - // finished, set the various Mode members.
> - //
> - Status = PxeBcCheckSelectedOffer (Private);
> -
> - AsciiPrint ("\n Station IP address is ");
> -
> - PxeBcShowIp4Addr (&Private->StationIp.v4);
> - AsciiPrint ("\n");
> -
> -ON_EXIT:
> - if (EFI_ERROR (Status)) {
> - Dhcp4->Stop (Dhcp4);
> - Dhcp4->Configure (Dhcp4, NULL);
> - } else {
> - //
> - // Remove the previously configured option list and callback function
> - //
> - ZeroMem (&Dhcp4CfgData, sizeof (EFI_DHCP4_CONFIG_DATA));
> - Dhcp4->Configure (Dhcp4, &Dhcp4CfgData);
> -
> - Private->AddressIsOk = TRUE;
> -
> - if (!Mode->UsingIpv6) {
> - //
> - // If in IPv4 mode, configure the corresponding ARP with this new
> - // station IP address.
> - //
> - ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA));
> -
> - ArpConfigData.SwAddressType = 0x0800;
> - ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS);
> - ArpConfigData.StationAddress = &Private->StationIp.v4;
> -
> - Private->Arp->Configure (Private->Arp, NULL);
> - Private->Arp->Configure (Private->Arp, &ArpConfigData);
> -
> - //
> - // Updated the route table. Fill the first entry.
> - //
> - Mode->RouteTableEntries = 1;
> - Mode->RouteTable[0].IpAddr.Addr[0] = Private->StationIp.Addr[0] &
> Private->SubnetMask.Addr[0];
> - Mode->RouteTable[0].SubnetMask.Addr[0] = Private->SubnetMask.Addr[0];
> - Mode->RouteTable[0].GwAddr.Addr[0] = 0;
> -
> - //
> - // Create the default route entry if there is a default router.
> - //
> - if (Private->GatewayIp.Addr[0] != 0) {
> - Mode->RouteTableEntries = 2;
> - Mode->RouteTable[1].IpAddr.Addr[0] = 0;
> - Mode->RouteTable[1].SubnetMask.Addr[0] = 0;
> - Mode->RouteTable[1].GwAddr.Addr[0] = Private->GatewayIp.Addr[0];
> - }
> -
> - //
> - // Flush new station IP address into Udp4CfgData and Ip4ConfigData
> - //
> - CopyMem (&Private->Udp4CfgData.StationAddress, &Private->StationIp,
> sizeof (EFI_IPv4_ADDRESS));
> - CopyMem (&Private->Udp4CfgData.SubnetMask, &Private->SubnetMask,
> sizeof (EFI_IPv4_ADDRESS));
> - CopyMem (&Private->Ip4ConfigData.StationAddress, &Private->StationIp,
> sizeof (EFI_IPv4_ADDRESS));
> - CopyMem (&Private->Ip4ConfigData.SubnetMask, &Private->SubnetMask,
> sizeof (EFI_IPv4_ADDRESS));
> -
> - //
> - // Reconfigure the Ip4 instance to capture background ICMP packets with
> new station Ip address.
> - //
> - Private->Ip4->Cancel (Private->Ip4, &Private->IcmpErrorRcvToken);
> - Private->Ip4->Configure (Private->Ip4, NULL);
> -
> - Status = Private->Ip4->Configure (Private->Ip4, &Private->Ip4ConfigData);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpErrorRcvToken);
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> - }
> - }
> -
> - Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData);
> -
> - //
> - // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP
> - // receive filter list emptied and the filter set to
> EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.
> - //
> - ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER));
> - IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP;
> - This->SetIpFilter (This, &IpFilter);
> -
> - return Status;
> -}
> -
> -
> -/**
> - Attempts to complete the PXE Boot Server and/or boot image discovery
> sequence.
> -
> - This function attempts to complete the PXE Boot Server and/or boot image
> discovery
> - sequence. If this sequence is completed, then EFI_SUCCESS is returned, and
> the
> - PxeDiscoverValid, PxeDiscover, PxeReplyReceived, and PxeReply fields of the
> - EFI_PXE_BASE_CODE_MODE structure are filled in. If UseBis is TRUE, then the
> - PxeBisReplyReceived and PxeBisReply fields of the
> EFI_PXE_BASE_CODE_MODE structure
> - will also be filled in. If UseBis is FALSE, then PxeBisReplyValid will be set to
> FALSE.
> - In the structure referenced by parameter Info, the PXE Boot Server list,
> SrvList[],
> - has two uses: It is the Boot Server IP address list used for unicast discovery
> - (if the UseUCast field is TRUE), and it is the list used for Boot Server
> verification
> - (if the MustUseList field is TRUE). Also, if the MustUseList field in that
> structure
> - is TRUE and the AcceptAnyResponse field in the SrvList[] array is TRUE, any
> Boot
> - Server reply of that type will be accepted. If the AcceptAnyResponse field is
> - FALSE, only responses from Boot Servers with matching IP addresses will be
> accepted.
> - This function can take at least 10 seconds to timeout and return control to the
> - caller. If the Discovery sequence does not complete, then EFI_TIMEOUT will
> be
> - returned. Please see the Preboot Execution Environment (PXE) Specification
> for
> - additional details on the implementation of the Discovery sequence.
> - If the Callback Protocol does not return
> EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
> - then the Discovery sequence is stopped and EFI_ABORTED will be returned.
> -
> - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL
> instance.
> - @param Type The type of bootstrap to perform.
> - @param Layer Pointer to the boot server layer number to discover,
> which must be
> - PXE_BOOT_LAYER_INITIAL when a new server type is being
> - discovered.
> - @param UseBis TRUE if Boot Integrity Services are to be used. FALSE
> otherwise.
> - @param Info Pointer to a data structure that contains additional
> information on the
> - type of discovery operation that is to be performed.
> -
> - @retval EFI_SUCCESS The Discovery sequence has been completed.
> - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped
> state.
> - @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
> - @retval EFI_DEVICE_ERROR The network device encountered an error
> during this operation.
> - @retval EFI_OUT_OF_RESOURCES Could not allocate enough memory to
> complete Discovery.
> - @retval EFI_ABORTED The callback function aborted the Discovery
> sequence.
> - @retval EFI_TIMEOUT The Discovery sequence timed out.
> - @retval EFI_ICMP_ERROR An ICMP error packet was received during the
> PXE discovery
> - session.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiPxeBcDiscover (
> - IN EFI_PXE_BASE_CODE_PROTOCOL *This,
> - IN UINT16 Type,
> - IN UINT16 *Layer,
> - IN BOOLEAN UseBis,
> - IN EFI_PXE_BASE_CODE_DISCOVER_INFO *Info OPTIONAL
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - EFI_PXE_BASE_CODE_DISCOVER_INFO DefaultInfo;
> - EFI_PXE_BASE_CODE_DISCOVER_INFO *CreatedInfo;
> - EFI_PXE_BASE_CODE_SRVLIST *SrvList;
> - EFI_PXE_BASE_CODE_SRVLIST DefaultSrvList;
> - PXEBC_CACHED_DHCP4_PACKET *Packet;
> - PXEBC_VENDOR_OPTION *VendorOpt;
> - UINT16 Index;
> - EFI_STATUS Status;
> - PXEBC_BOOT_SVR_ENTRY *BootSvrEntry;
> - EFI_PXE_BASE_CODE_IP_FILTER IpFilter;
> -
> - if (This == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
> - Mode = Private->PxeBc.Mode;
> - BootSvrEntry = NULL;
> - SrvList = NULL;
> - CreatedInfo = NULL;
> - Status = EFI_DEVICE_ERROR;
> - Private->Function = EFI_PXE_BASE_CODE_FUNCTION_DISCOVER;
> -
> - if (!Private->AddressIsOk) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (!Mode->Started) {
> - return EFI_NOT_STARTED;
> - }
> -
> - //
> - // Stop Udp4Read instance
> - //
> - Private->Udp4Read->Configure (Private->Udp4Read, NULL);
> -
> - Mode->IcmpErrorReceived = FALSE;
> -
> - //
> - // If layer isn't EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL,
> - // use the previous setting;
> - // If info isn't offered,
> - // use the cached DhcpAck and ProxyOffer packets.
> - //
> - ZeroMem (&DefaultInfo, sizeof (EFI_PXE_BASE_CODE_DISCOVER_INFO));
> - if (*Layer != EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL) {
> -
> - if (!Mode->PxeDiscoverValid || !Mode->PxeReplyReceived || (!Mode-
> >PxeBisReplyReceived && UseBis)) {
> -
> - Status = EFI_INVALID_PARAMETER;
> - goto ON_EXIT;
> - }
> -
> - DefaultInfo.IpCnt = 1;
> - DefaultInfo.UseUCast = TRUE;
> -
> - DefaultSrvList.Type = Type;
> - DefaultSrvList.AcceptAnyResponse = FALSE;
> - DefaultSrvList.IpAddr.Addr[0] = Private->ServerIp.Addr[0];
> -
> - SrvList = &DefaultSrvList;
> - Info = &DefaultInfo;
> - } else if (Info == NULL) {
> - //
> - // Create info by the cached packet before
> - //
> - Packet = (Mode->ProxyOfferReceived) ? &Private->ProxyOffer : &Private-
> >Dhcp4Ack;
> - VendorOpt = &Packet->PxeVendorOption;
> -
> - if (!Mode->DhcpAckReceived || !IS_VALID_DISCOVER_VENDOR_OPTION
> (VendorOpt->BitMap)) {
> - //
> - // Address is not acquired or no discovery options.
> - //
> - Status = EFI_INVALID_PARAMETER;
> - goto ON_EXIT;
> - }
> -
> - DefaultInfo.UseMCast = (BOOLEAN)!IS_DISABLE_MCAST_DISCOVER
> (VendorOpt->DiscoverCtrl);
> - DefaultInfo.UseBCast = (BOOLEAN)!IS_DISABLE_BCAST_DISCOVER
> (VendorOpt->DiscoverCtrl);
> - DefaultInfo.MustUseList = (BOOLEAN) IS_ENABLE_USE_SERVER_LIST
> (VendorOpt->DiscoverCtrl);
> - DefaultInfo.UseUCast = DefaultInfo.MustUseList;
> -
> - if (DefaultInfo.UseMCast) {
> - //
> - // Get the multicast discover ip address from vendor option.
> - //
> - CopyMem (
> - &DefaultInfo.ServerMCastIp.Addr,
> - &VendorOpt->DiscoverMcastIp,
> - sizeof (EFI_IPv4_ADDRESS)
> - );
> - }
> -
> - DefaultInfo.IpCnt = 0;
> - Info = &DefaultInfo;
> - SrvList = Info->SrvList;
> -
> - if (DefaultInfo.MustUseList) {
> - BootSvrEntry = VendorOpt->BootSvr;
> - Status = EFI_INVALID_PARAMETER;
> -
> - while (((UINT8) (BootSvrEntry - VendorOpt->BootSvr)) < VendorOpt-
> >BootSvrLen) {
> -
> - if (BootSvrEntry->Type == HTONS (Type)) {
> - Status = EFI_SUCCESS;
> - break;
> - }
> -
> - BootSvrEntry = GET_NEXT_BOOT_SVR_ENTRY (BootSvrEntry);
> - }
> -
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - DefaultInfo.IpCnt = BootSvrEntry->IpCnt;
> -
> - if (DefaultInfo.IpCnt >= 1) {
> - CreatedInfo = AllocatePool (sizeof (DefaultInfo) + (DefaultInfo.IpCnt - 1) *
> sizeof (*SrvList));
> - if (CreatedInfo == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto ON_EXIT;
> -
> - }
> -
> - CopyMem (CreatedInfo, &DefaultInfo, sizeof (DefaultInfo));
> - Info = CreatedInfo;
> - SrvList = Info->SrvList;
> - }
> -
> - for (Index = 0; Index < DefaultInfo.IpCnt; Index++) {
> - CopyMem (&SrvList[Index].IpAddr, &BootSvrEntry->IpAddr[Index], sizeof
> (EFI_IPv4_ADDRESS));
> - SrvList[Index].AcceptAnyResponse = FALSE;
> - SrvList[Index].Type = BootSvrEntry->Type;
> - }
> - }
> -
> - } else {
> -
> - SrvList = Info->SrvList;
> -
> - if (!SrvList[0].AcceptAnyResponse) {
> -
> - for (Index = 1; Index < Info->IpCnt; Index++) {
> - if (SrvList[Index].AcceptAnyResponse) {
> - break;
> - }
> - }
> -
> - if (Index != Info->IpCnt) {
> - Status = EFI_INVALID_PARAMETER;
> - goto ON_EXIT;
> - }
> - }
> - }
> -
> - if ((!Info->UseUCast && !Info->UseBCast && !Info->UseMCast) || (Info-
> >MustUseList && Info->IpCnt == 0)) {
> -
> - Status = EFI_INVALID_PARAMETER;
> - goto ON_EXIT;
> - }
> - //
> - // Execute discover by UniCast/BroadCast/MultiCast
> - //
> - if (Info->UseUCast) {
> -
> - for (Index = 0; Index < Info->IpCnt; Index++) {
> -
> - if (BootSvrEntry == NULL) {
> - Private->ServerIp.Addr[0] = SrvList[Index].IpAddr.Addr[0];
> - } else {
> - CopyMem (
> - &Private->ServerIp,
> - &BootSvrEntry->IpAddr[Index],
> - sizeof (EFI_IPv4_ADDRESS)
> - );
> - }
> -
> - Status = PxeBcDiscvBootService (
> - Private,
> - Type,
> - Layer,
> - UseBis,
> - &SrvList[Index].IpAddr,
> - 0,
> - NULL,
> - TRUE,
> - &Private->PxeReply.Packet.Ack
> - );
> - if (!EFI_ERROR (Status)) {
> - break;
> - }
> - }
> -
> - } else if (Info->UseMCast) {
> -
> - Status = PxeBcDiscvBootService (
> - Private,
> - Type,
> - Layer,
> - UseBis,
> - &Info->ServerMCastIp,
> - 0,
> - NULL,
> - TRUE,
> - &Private->PxeReply.Packet.Ack
> - );
> -
> - } else if (Info->UseBCast) {
> -
> - Status = PxeBcDiscvBootService (
> - Private,
> - Type,
> - Layer,
> - UseBis,
> - NULL,
> - Info->IpCnt,
> - SrvList,
> - TRUE,
> - &Private->PxeReply.Packet.Ack
> - );
> - }
> -
> - if (EFI_ERROR (Status) || !Mode->PxeReplyReceived || (!Mode-
> >PxeBisReplyReceived && UseBis)) {
> - if (Status == EFI_ICMP_ERROR) {
> - Mode->IcmpErrorReceived = TRUE;
> - } else {
> - Status = EFI_DEVICE_ERROR;
> - }
> - goto ON_EXIT;
> - } else {
> - PxeBcParseCachedDhcpPacket (&Private->PxeReply);
> - }
> -
> - if (Mode->PxeBisReplyReceived) {
> - CopyMem (
> - &Private->ServerIp,
> - &Mode->PxeReply.Dhcpv4.BootpSiAddr,
> - sizeof (EFI_IPv4_ADDRESS)
> - );
> - }
> -
> - if (CreatedInfo != NULL) {
> - FreePool (CreatedInfo);
> - }
> -
> -ON_EXIT:
> -
> - Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData);
> -
> - //
> - // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP
> - // receive filter list emptied and the filter set to
> EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.
> - //
> - ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER));
> - IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP;
> - This->SetIpFilter (This, &IpFilter);
> -
> - return Status;
> -}
> -
> -
> -/**
> - Used to perform TFTP and MTFTP services.
> -
> - This function is used to perform TFTP and MTFTP services. This includes the
> - TFTP operations to get the size of a file, read a directory, read a file, and
> - write a file. It also includes the MTFTP operations to get the size of a file,
> - read a directory, and read a file. The type of operation is specified by
> Operation.
> - If the callback function that is invoked during the TFTP/MTFTP operation does
> - not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then
> EFI_ABORTED will
> - be returned.
> - For read operations, the return data will be placed in the buffer specified by
> - BufferPtr. If BufferSize is too small to contain the entire downloaded file,
> - then EFI_BUFFER_TOO_SMALL will be returned and BufferSize will be set to
> zero
> - or the size of the requested file (the size of the requested file is only returned
> - if the TFTP server supports TFTP options). If BufferSize is large enough for the
> - read operation, then BufferSize will be set to the size of the downloaded file,
> - and EFI_SUCCESS will be returned. Applications using the PxeBc.Mtftp()
> services
> - should use the get-file-size operations to determine the size of the
> downloaded
> - file prior to using the read-file operations-especially when downloading large
> - (greater than 64 MB) files-instead of making two calls to the read-file
> operation.
> - Following this recommendation will save time if the file is larger than expected
> - and the TFTP server does not support TFTP option extensions. Without TFTP
> option
> - extension support, the client has to download the entire file, counting and
> discarding
> - the received packets, to determine the file size.
> - For write operations, the data to be sent is in the buffer specified by BufferPtr.
> - BufferSize specifies the number of bytes to send. If the write operation
> completes
> - successfully, then EFI_SUCCESS will be returned.
> - For TFTP "get file size" operations, the size of the requested file or directory
> - is returned in BufferSize, and EFI_SUCCESS will be returned. If the TFTP server
> - does not support options, the file will be downloaded into a bit bucket and the
> - length of the downloaded file will be returned. For MTFTP "get file size"
> operations,
> - if the MTFTP server does not support the "get file size" option,
> EFI_UNSUPPORTED
> - will be returned.
> - This function can take up to 10 seconds to timeout and return control to the
> caller.
> - If the TFTP sequence does not complete, EFI_TIMEOUT will be returned.
> - If the Callback Protocol does not return
> EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
> - then the TFTP sequence is stopped and EFI_ABORTED will be returned.
> - The format of the data returned from a TFTP read directory operation is a null-
> terminated
> - filename followed by a null-terminated information string, of the form
> - "size year-month-day hour:minute:second" (i.e. %d %d-%d-%d %d:%d:%f -
> note that
> - the seconds field can be a decimal number), where the date and time are UTC.
> For
> - an MTFTP read directory command, there is additionally a null-terminated
> multicast
> - IP address preceding the filename of the form %d.%d.%d.%d for IP v4. The
> final
> - entry is itself null-terminated, so that the final information string is terminated
> - with two null octets.
> -
> - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL
> instance.
> - @param Operation The type of operation to perform.
> - @param BufferPtr A pointer to the data buffer.
> - @param Overwrite Only used on write file operations. TRUE if a file on
> a remote server can
> - be overwritten.
> - @param BufferSize For get-file-size operations, *BufferSize returns the
> size of the
> - requested file.
> - @param BlockSize The requested block size to be used during a TFTP
> transfer.
> - @param ServerIp The TFTP / MTFTP server IP address.
> - @param Filename A Null-terminated ASCII string that specifies a
> directory name or a file
> - name.
> - @param Info Pointer to the MTFTP information.
> - @param DontUseBuffer Set to FALSE for normal TFTP and MTFTP read
> file operation.
> -
> - @retval EFI_SUCCESS The TFTP/MTFTP operation was completed.
> - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped
> state.
> - @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
> - @retval EFI_DEVICE_ERROR The network device encountered an error
> during this operation.
> - @retval EFI_BUFFER_TOO_SMALL The buffer is not large enough to complete
> the read operation.
> - @retval EFI_ABORTED The callback function aborted the TFTP/MTFTP
> operation.
> - @retval EFI_TIMEOUT The TFTP/MTFTP operation timed out.
> - @retval EFI_ICMP_ERROR An ICMP error packet was received during the
> MTFTP session.
> - @retval EFI_TFTP_ERROR A TFTP error packet was received during the
> MTFTP session.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiPxeBcMtftp (
> - IN EFI_PXE_BASE_CODE_PROTOCOL *This,
> - IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation,
> - IN OUT VOID *BufferPtr,
> - IN BOOLEAN Overwrite,
> - IN OUT UINT64 *BufferSize,
> - IN UINTN *BlockSize OPTIONAL,
> - IN EFI_IP_ADDRESS *ServerIp,
> - IN UINT8 *Filename,
> - IN EFI_PXE_BASE_CODE_MTFTP_INFO *Info OPTIONAL,
> - IN BOOLEAN DontUseBuffer
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_MTFTP4_CONFIG_DATA Mtftp4Config;
> - EFI_STATUS Status;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - EFI_MAC_ADDRESS TempMacAddr;
> - EFI_PXE_BASE_CODE_IP_FILTER IpFilter;
> -
> - if ((This == NULL) ||
> - (Filename == NULL) ||
> - (BufferSize == NULL) ||
> - ((ServerIp == NULL) ||
> - (IP4_IS_UNSPECIFIED (NTOHL (ServerIp->Addr[0])) ||
> - IP4_IS_LOCAL_BROADCAST (NTOHL (ServerIp->Addr[0])))) ||
> - ((BufferPtr == NULL) && DontUseBuffer) ||
> - ((BlockSize != NULL) && (*BlockSize < 512))) {
> -
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Status = EFI_DEVICE_ERROR;
> - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
> - Mode = &Private->Mode;
> -
> - if (!Mode->AutoArp) {
> - //
> - // If AutoArp is set false, check arp cache
> - //
> - UpdateArpCache (This);
> - if (!FindInArpCache (Mode, &ServerIp->v4, &TempMacAddr)) {
> - return EFI_DEVICE_ERROR;
> - }
> - }
> -
> - //
> - // Stop Udp4Read instance
> - //
> - Private->Udp4Read->Configure (Private->Udp4Read, NULL);
> -
> - Mode->TftpErrorReceived = FALSE;
> - Mode->IcmpErrorReceived = FALSE;
> -
> - Mtftp4Config.UseDefaultSetting = FALSE;
> - Mtftp4Config.TimeoutValue = PXEBC_MTFTP_TIMEOUT;
> - Mtftp4Config.TryCount = PXEBC_MTFTP_RETRIES;
> -
> - CopyMem (
> - &Mtftp4Config.StationIp,
> - &Private->StationIp,
> - sizeof (EFI_IPv4_ADDRESS)
> - );
> - CopyMem (
> - &Mtftp4Config.SubnetMask,
> - &Private->SubnetMask,
> - sizeof (EFI_IPv4_ADDRESS)
> - );
> - CopyMem (
> - &Mtftp4Config.GatewayIp,
> - &Private->GatewayIp,
> - sizeof (EFI_IPv4_ADDRESS)
> - );
> - CopyMem (
> - &Mtftp4Config.ServerIp,
> - ServerIp,
> - sizeof (EFI_IPv4_ADDRESS)
> - );
> -
> - switch (Operation) {
> -
> - case EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE:
> -
> - Status = PxeBcTftpGetFileSize (
> - Private,
> - &Mtftp4Config,
> - Filename,
> - BlockSize,
> - BufferSize
> - );
> -
> - break;
> -
> - case EFI_PXE_BASE_CODE_TFTP_READ_FILE:
> -
> - Status = PxeBcTftpReadFile (
> - Private,
> - &Mtftp4Config,
> - Filename,
> - BlockSize,
> - BufferPtr,
> - BufferSize,
> - DontUseBuffer
> - );
> -
> - break;
> -
> - case EFI_PXE_BASE_CODE_TFTP_WRITE_FILE:
> -
> - Status = PxeBcTftpWriteFile (
> - Private,
> - &Mtftp4Config,
> - Filename,
> - Overwrite,
> - BlockSize,
> - BufferPtr,
> - BufferSize
> - );
> -
> - break;
> -
> - case EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY:
> -
> - Status = PxeBcTftpReadDirectory (
> - Private,
> - &Mtftp4Config,
> - Filename,
> - BlockSize,
> - BufferPtr,
> - BufferSize,
> - DontUseBuffer
> - );
> -
> - break;
> -
> - case EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE:
> - case EFI_PXE_BASE_CODE_MTFTP_READ_FILE:
> - case EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY:
> - Status = EFI_UNSUPPORTED;
> - break;
> -
> - default:
> -
> - Status = EFI_INVALID_PARAMETER;
> - break;
> - }
> -
> - if (Status == EFI_ICMP_ERROR) {
> - Mode->IcmpErrorReceived = TRUE;
> - }
> -
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> -ON_EXIT:
> - Private->Udp4Read->Configure (Private->Udp4Read, &Private->Udp4CfgData);
> - //
> - // Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP
> - // receive filter list emptied and the filter set to
> EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.
> - //
> - ZeroMem(&IpFilter, sizeof (EFI_PXE_BASE_CODE_IP_FILTER));
> - IpFilter.Filters = EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP;
> - This->SetIpFilter (This, &IpFilter);
> -
> - return Status;
> -}
> -
> -
> -/**
> - Writes a UDP packet to the network interface.
> -
> - This function writes a UDP packet specified by the (optional HeaderPtr and)
> - BufferPtr parameters to the network interface. The UDP header is
> automatically
> - built by this routine. It uses the parameters OpFlags, DestIp, DestPort,
> GatewayIp,
> - SrcIp, and SrcPort to build this header. If the packet is successfully built and
> - transmitted through the network interface, then EFI_SUCCESS will be returned.
> - If a timeout occurs during the transmission of the packet, then EFI_TIMEOUT
> will
> - be returned. If an ICMP error occurs during the transmission of the packet,
> then
> - the IcmpErrorReceived field is set to TRUE, the IcmpError field is filled in and
> - EFI_ICMP_ERROR will be returned. If the Callback Protocol does not return
> - EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then EFI_ABORTED will
> be returned.
> -
> - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL
> instance.
> - @param OpFlags The UDP operation flags.
> - @param DestIp The destination IP address.
> - @param DestPort The destination UDP port number.
> - @param GatewayIp The gateway IP address.
> - @param SrcIp The source IP address.
> - @param SrcPort The source UDP port number.
> - @param HeaderSize An optional field which may be set to the length of
> a header at
> - HeaderPtr to be prefixed to the data at BufferPtr.
> - @param HeaderPtr If HeaderSize is not NULL, a pointer to a header to
> be prefixed to the
> - data at BufferPtr.
> - @param BufferSize A pointer to the size of the data at BufferPtr.
> - @param BufferPtr A pointer to the data to be written.
> -
> - @retval EFI_SUCCESS The UDP Write operation was completed.
> - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped
> state.
> - @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
> - @retval EFI_BAD_BUFFER_SIZE The buffer is too long to be transmitted.
> - @retval EFI_ABORTED The callback function aborted the UDP Write
> operation.
> - @retval EFI_TIMEOUT The UDP Write operation timed out.
> - @retval EFI_ICMP_ERROR An ICMP error packet was received during the
> UDP write session.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiPxeBcUdpWrite (
> - IN EFI_PXE_BASE_CODE_PROTOCOL *This,
> - IN UINT16 OpFlags,
> - IN EFI_IP_ADDRESS *DestIp,
> - IN EFI_PXE_BASE_CODE_UDP_PORT *DestPort,
> - IN EFI_IP_ADDRESS *GatewayIp OPTIONAL,
> - IN EFI_IP_ADDRESS *SrcIp OPTIONAL,
> - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL,
> - IN UINTN *HeaderSize OPTIONAL,
> - IN VOID *HeaderPtr OPTIONAL,
> - IN UINTN *BufferSize,
> - IN VOID *BufferPtr
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_UDP4_PROTOCOL *Udp4;
> - EFI_UDP4_COMPLETION_TOKEN Token;
> - EFI_UDP4_TRANSMIT_DATA *Udp4TxData;
> - UINT32 FragCount;
> - UINT32 DataLength;
> - EFI_UDP4_SESSION_DATA Udp4Session;
> - EFI_STATUS Status;
> - BOOLEAN IsDone;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - EFI_MAC_ADDRESS TempMacAddr;
> -
> - IsDone = FALSE;
> -
> - if ((This == NULL) || (DestIp == NULL) || (DestPort == NULL)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if ((GatewayIp != NULL) && (IP4_IS_UNSPECIFIED (NTOHL (GatewayIp-
> >Addr[0])) || IP4_IS_LOCAL_BROADCAST (NTOHL (GatewayIp->Addr[0])))) {
> - //
> - // Gateway is provided but it's not a unicast IP address.
> - //
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if ((HeaderSize != NULL) && ((*HeaderSize == 0) || (HeaderPtr == NULL))) {
> - //
> - // The HeaderSize ptr isn't NULL and: 1. the value is zero; or 2. the HeaderPtr
> - // is NULL.
> - //
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if ((BufferSize == NULL) || ((*BufferSize != 0) && (BufferPtr == NULL))) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
> - Udp4 = Private->Udp4Write;
> - Mode = &Private->Mode;
> - if (!Mode->Started) {
> - return EFI_NOT_STARTED;
> - }
> -
> - if (!Private->AddressIsOk && (SrcIp == NULL)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (!Mode->AutoArp) {
> - //
> - // If AutoArp is set false, check arp cache
> - //
> - UpdateArpCache (This);
> - if (!FindInArpCache (Mode, &DestIp->v4, &TempMacAddr)) {
> - return EFI_DEVICE_ERROR;
> - }
> - }
> -
> - Mode->IcmpErrorReceived = FALSE;
> -
> - if ((Private->CurrentUdpSrcPort == 0) ||
> - ((SrcPort != NULL) && (*SrcPort != Private->CurrentUdpSrcPort))) {
> - //
> - // Port is changed, (re)configure the Udp4Write instance
> - //
> - if (SrcPort != NULL) {
> - Private->CurrentUdpSrcPort = *SrcPort;
> - }
> - }
> -
> - Status = PxeBcConfigureUdpWriteInstance (
> - Udp4,
> - &Private->StationIp.v4,
> - &Private->SubnetMask.v4,
> - &Private->GatewayIp.v4,
> - &Private->CurrentUdpSrcPort,
> - Private->Mode.TTL,
> - Private->Mode.ToS
> - );
> - if (EFI_ERROR (Status)) {
> - Private->CurrentUdpSrcPort = 0;
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - ZeroMem (&Token, sizeof (EFI_UDP4_COMPLETION_TOKEN));
> - ZeroMem (&Udp4Session, sizeof (EFI_UDP4_SESSION_DATA));
> -
> - CopyMem (&Udp4Session.DestinationAddress, DestIp, sizeof
> (EFI_IPv4_ADDRESS));
> - Udp4Session.DestinationPort = *DestPort;
> - if (SrcIp != NULL) {
> - CopyMem (&Udp4Session.SourceAddress, SrcIp, sizeof (EFI_IPv4_ADDRESS));
> - }
> - if (SrcPort != NULL) {
> - Udp4Session.SourcePort = *SrcPort;
> - }
> -
> - FragCount = (HeaderSize != NULL) ? 2 : 1;
> - Udp4TxData = (EFI_UDP4_TRANSMIT_DATA *) AllocateZeroPool (sizeof
> (EFI_UDP4_TRANSMIT_DATA) + (FragCount - 1) * sizeof
> (EFI_UDP4_FRAGMENT_DATA));
> - if (Udp4TxData == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Udp4TxData->FragmentCount = FragCount;
> - Udp4TxData->FragmentTable[FragCount - 1].FragmentLength = (UINT32)
> *BufferSize;
> - Udp4TxData->FragmentTable[FragCount - 1].FragmentBuffer = BufferPtr;
> - DataLength = (UINT32) *BufferSize;
> -
> - if (FragCount == 2) {
> -
> - Udp4TxData->FragmentTable[0].FragmentLength = (UINT32) *HeaderSize;
> - Udp4TxData->FragmentTable[0].FragmentBuffer = HeaderPtr;
> - DataLength += (UINT32) *HeaderSize;
> - }
> -
> - if (GatewayIp != NULL) {
> - Udp4TxData->GatewayAddress = (EFI_IPv4_ADDRESS *) GatewayIp;
> - }
> - Udp4TxData->UdpSessionData = &Udp4Session;
> - Udp4TxData->DataLength = DataLength;
> - Token.Packet.TxData = Udp4TxData;
> -
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_SIGNAL,
> - TPL_NOTIFY,
> - PxeBcCommonNotify,
> - &IsDone,
> - &Token.Event
> - );
> - if (EFI_ERROR (Status)) {
> - goto ON_EXIT;
> - }
> -
> - Status = Udp4->Transmit (Udp4, &Token);
> - if (EFI_ERROR (Status)) {
> - if (Status == EFI_ICMP_ERROR) {
> - Mode->IcmpErrorReceived = TRUE;
> - }
> - goto ON_EXIT;
> - }
> -
> - while (!IsDone) {
> -
> - Udp4->Poll (Udp4);
> - }
> -
> - Status = Token.Status;
> -
> -ON_EXIT:
> -
> - if (Token.Event != NULL) {
> - gBS->CloseEvent (Token.Event);
> - }
> -
> - FreePool (Udp4TxData);
> -
> - //
> - // Reset the instance.
> - //
> - Udp4->Configure (Udp4, NULL);
> - return Status;
> -}
> -
> -/**
> - Decide whether the incoming UDP packet is acceptable per IP filter settings
> - in provided PxeBcMode.
> -
> - @param PxeBcMode Pointer to EFI_PXE_BASE_CODE_MODE.
> - @param Session Received UDP session.
> -
> - @retval TRUE The UDP package matches IP filters.
> - @retval FALSE The UDP package doesn't matches IP filters.
> -
> -**/
> -BOOLEAN
> -CheckIpByFilter (
> - IN EFI_PXE_BASE_CODE_MODE *PxeBcMode,
> - IN EFI_UDP4_SESSION_DATA *Session
> - )
> -{
> - UINTN Index;
> - EFI_IPv4_ADDRESS Ip4Address;
> - EFI_IPv4_ADDRESS DestIp4Address;
> -
> - if ((PxeBcMode->IpFilter.Filters &
> EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) != 0) {
> - return TRUE;
> - }
> -
> - CopyMem (&DestIp4Address, &Session->DestinationAddress, sizeof
> (DestIp4Address));
> - if (((PxeBcMode->IpFilter.Filters &
> EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0) &&
> - IP4_IS_MULTICAST (EFI_NTOHL (DestIp4Address))
> - ) {
> - return TRUE;
> - }
> -
> - if (((PxeBcMode->IpFilter.Filters &
> EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0) &&
> - IP4_IS_LOCAL_BROADCAST (EFI_NTOHL (DestIp4Address))
> - ) {
> - return TRUE;
> - }
> -
> - CopyMem (&Ip4Address, &PxeBcMode->StationIp.v4, sizeof (Ip4Address));
> - if (((PxeBcMode->IpFilter.Filters &
> EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0) &&
> - EFI_IP4_EQUAL (&Ip4Address, &DestIp4Address)
> - ) {
> - return TRUE;
> - }
> -
> - ASSERT (PxeBcMode->IpFilter.IpCnt < EFI_PXE_BASE_CODE_MAX_IPCNT);
> -
> - for (Index = 0; Index < PxeBcMode->IpFilter.IpCnt; Index++) {
> - CopyMem (
> - &Ip4Address,
> - &PxeBcMode->IpFilter.IpList[Index].v4,
> - sizeof (Ip4Address)
> - );
> - if (EFI_IP4_EQUAL (&Ip4Address, &DestIp4Address)) {
> - return TRUE;
> - }
> - }
> -
> - return FALSE;
> -}
> -
> -/**
> - Reads a UDP packet from the network interface.
> -
> - This function reads a UDP packet from a network interface. The data contents
> - are returned in (the optional HeaderPtr and) BufferPtr, and the size of the
> - buffer received is returned in BufferSize . If the input BufferSize is smaller
> - than the UDP packet received (less optional HeaderSize), it will be set to the
> - required size, and EFI_BUFFER_TOO_SMALL will be returned. In this case, the
> - contents of BufferPtr are undefined, and the packet is lost. If a UDP packet is
> - successfully received, then EFI_SUCCESS will be returned, and the information
> - from the UDP header will be returned in DestIp, DestPort, SrcIp, and SrcPort if
> - they are not NULL. Depending on the values of OpFlags and the DestIp,
> DestPort,
> - SrcIp, and SrcPort input values, different types of UDP packet receive filtering
> - will be performed. The following tables summarize these receive filter
> operations.
> -
> - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL
> instance.
> - @param OpFlags The UDP operation flags.
> - @param DestIp The destination IP address.
> - @param DestPort The destination UDP port number.
> - @param SrcIp The source IP address.
> - @param SrcPort The source UDP port number.
> - @param HeaderSize An optional field which may be set to the length of
> a header at
> - HeaderPtr to be prefixed to the data at BufferPtr.
> - @param HeaderPtr If HeaderSize is not NULL, a pointer to a header to
> be prefixed to the
> - data at BufferPtr.
> - @param BufferSize A pointer to the size of the data at BufferPtr.
> - @param BufferPtr A pointer to the data to be read.
> -
> - @retval EFI_SUCCESS The UDP Read operation was completed.
> - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped
> state.
> - @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
> - @retval EFI_DEVICE_ERROR The network device encountered an error
> during this operation.
> - @retval EFI_BUFFER_TOO_SMALL The packet is larger than Buffer can hold.
> - @retval EFI_ABORTED The callback function aborted the UDP Read
> operation.
> - @retval EFI_TIMEOUT The UDP Read operation timed out.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiPxeBcUdpRead (
> - IN EFI_PXE_BASE_CODE_PROTOCOL *This,
> - IN UINT16 OpFlags,
> - IN OUT EFI_IP_ADDRESS *DestIp OPTIONAL,
> - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort OPTIONAL,
> - IN OUT EFI_IP_ADDRESS *SrcIp OPTIONAL,
> - IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort OPTIONAL,
> - IN UINTN *HeaderSize OPTIONAL,
> - IN VOID *HeaderPtr OPTIONAL,
> - IN OUT UINTN *BufferSize,
> - IN VOID *BufferPtr
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - EFI_UDP4_PROTOCOL *Udp4;
> - EFI_UDP4_COMPLETION_TOKEN Token;
> - EFI_UDP4_RECEIVE_DATA *RxData;
> - EFI_UDP4_SESSION_DATA *Session;
> - EFI_STATUS Status;
> - BOOLEAN IsDone;
> - BOOLEAN Matched;
> - UINTN CopiedLen;
> - UINTN HeaderLen;
> - UINTN HeaderCopiedLen;
> - UINTN BufferCopiedLen;
> - UINT32 FragmentLength;
> - UINTN FragmentIndex;
> - UINT8 *FragmentBuffer;
> -
> - if (This == NULL || DestIp == NULL || DestPort == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) == 0
> && (DestPort == NULL)) ||
> - ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) == 0
> && (SrcIp == NULL)) ||
> - ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) == 0 &&
> (SrcPort == NULL))) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (((HeaderSize != NULL) && (*HeaderSize == 0)) || ((HeaderSize != NULL) &&
> (HeaderPtr == NULL))) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if ((BufferSize == NULL) || (BufferPtr == NULL)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
> - Mode = Private->PxeBc.Mode;
> - Udp4 = Private->Udp4Read;
> -
> - if (!Mode->Started) {
> - return EFI_NOT_STARTED;
> - }
> -
> - Mode->IcmpErrorReceived = FALSE;
> -
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_SIGNAL,
> - TPL_NOTIFY,
> - PxeBcCommonNotify,
> - &IsDone,
> - &Token.Event
> - );
> - if (EFI_ERROR (Status)) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> -TRY_AGAIN:
> -
> - IsDone = FALSE;
> - Status = Udp4->Receive (Udp4, &Token);
> - if (EFI_ERROR (Status)) {
> - if (Status == EFI_ICMP_ERROR) {
> - Mode->IcmpErrorReceived = TRUE;
> - }
> - goto ON_EXIT;
> - }
> -
> - Udp4->Poll (Udp4);
> -
> - if (!IsDone) {
> - Status = EFI_TIMEOUT;
> - } else {
> -
> - //
> - // check whether this packet matches the filters
> - //
> - if (EFI_ERROR (Token.Status)){
> - goto ON_EXIT;
> - }
> -
> - RxData = Token.Packet.RxData;
> - Session = &RxData->UdpSession;
> -
> - Matched = TRUE;
> -
> - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER) != 0) {
> - Matched = FALSE;
> - //
> - // Check UDP package by IP filter settings
> - //
> - if (CheckIpByFilter (Mode, Session)) {
> - Matched = TRUE;
> - }
> - }
> -
> - if (Matched) {
> - Matched = FALSE;
> -
> - //
> - // Match the destination ip of the received udp dgram
> - //
> - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP) != 0) {
> - Matched = TRUE;
> -
> - if (DestIp != NULL) {
> - CopyMem (DestIp, &Session->DestinationAddress, sizeof
> (EFI_IPv4_ADDRESS));
> - }
> - } else {
> - if (DestIp != NULL) {
> - if (EFI_IP4_EQUAL (DestIp, &Session->DestinationAddress)) {
> - Matched = TRUE;
> - }
> - } else {
> - if (EFI_IP4_EQUAL (&Private->StationIp, &Session->DestinationAddress)) {
> - Matched = TRUE;
> - }
> - }
> - }
> - }
> -
> - if (Matched) {
> - //
> - // Match the destination port of the received udp dgram
> - //
> - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT) != 0)
> {
> -
> - if (DestPort != NULL) {
> - *DestPort = Session->DestinationPort;
> - }
> - } else {
> -
> - if (*DestPort != Session->DestinationPort) {
> - Matched = FALSE;
> - }
> - }
> - }
> -
> - if (Matched) {
> - //
> - // Match the source ip of the received udp dgram
> - //
> - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP) != 0) {
> -
> - if (SrcIp != NULL) {
> - CopyMem (SrcIp, &Session->SourceAddress, sizeof (EFI_IPv4_ADDRESS));
> - }
> - } else {
> -
> - if (!EFI_IP4_EQUAL (SrcIp, &Session->SourceAddress)) {
> - Matched = FALSE;
> - }
> - }
> - }
> -
> - if (Matched) {
> - //
> - // Match the source port of the received udp dgram
> - //
> - if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT) != 0) {
> -
> - if (SrcPort != NULL) {
> - *SrcPort = Session->SourcePort;
> - }
> - } else {
> -
> - if (*SrcPort != Session->SourcePort) {
> - Matched = FALSE;
> - }
> - }
> - }
> -
> - if (Matched) {
> - ASSERT (RxData != NULL);
> -
> - HeaderLen = 0;
> - if (HeaderSize != NULL) {
> - HeaderLen = MIN (*HeaderSize, RxData->DataLength);
> - }
> -
> - if (RxData->DataLength - HeaderLen > *BufferSize) {
> - Status = EFI_BUFFER_TOO_SMALL;
> - } else {
> - *HeaderSize = HeaderLen;
> - *BufferSize = RxData->DataLength - HeaderLen;
> -
> - HeaderCopiedLen = 0;
> - BufferCopiedLen = 0;
> - for (FragmentIndex = 0; FragmentIndex < RxData->FragmentCount;
> FragmentIndex++) {
> - FragmentLength = RxData-
> >FragmentTable[FragmentIndex].FragmentLength;
> - FragmentBuffer = RxData-
> >FragmentTable[FragmentIndex].FragmentBuffer;
> - if (HeaderCopiedLen + FragmentLength < HeaderLen) {
> - //
> - // Copy the header part of received data.
> - //
> - CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, FragmentBuffer,
> FragmentLength);
> - HeaderCopiedLen += FragmentLength;
> - } else if (HeaderCopiedLen < HeaderLen) {
> - //
> - // Copy the header part of received data.
> - //
> - CopiedLen = HeaderLen - HeaderCopiedLen;
> - CopyMem ((UINT8 *) HeaderPtr + HeaderCopiedLen, FragmentBuffer,
> CopiedLen);
> - HeaderCopiedLen += CopiedLen;
> -
> - //
> - // Copy the other part of received data.
> - //
> - CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, FragmentBuffer +
> CopiedLen, FragmentLength - CopiedLen);
> - BufferCopiedLen += (FragmentLength - CopiedLen);
> - } else {
> - //
> - // Copy the other part of received data.
> - //
> - CopyMem ((UINT8 *) BufferPtr + BufferCopiedLen, FragmentBuffer,
> FragmentLength);
> - BufferCopiedLen += FragmentLength;
> - }
> - }
> - }
> - } else {
> -
> - Status = EFI_TIMEOUT;
> - }
> -
> - //
> - // Recycle the RxData
> - //
> - gBS->SignalEvent (RxData->RecycleSignal);
> -
> - if (!Matched) {
> - goto TRY_AGAIN;
> - }
> - }
> -
> -ON_EXIT:
> -
> - Udp4->Cancel (Udp4, &Token);
> -
> - gBS->CloseEvent (Token.Event);
> -
> - return Status;
> -}
> -
> -/**
> - Updates the IP receive filters of a network device and enables software
> filtering.
> -
> - The NewFilter field is used to modify the network device's current IP receive
> - filter settings and to enable a software filter. This function updates the IpFilter
> - field of the EFI_PXE_BASE_CODE_MODE structure with the contents of
> NewIpFilter.
> - The software filter is used when the USE_FILTER in OpFlags is set to UdpRead().
> - The current hardware filter remains in effect no matter what the settings of
> OpFlags
> - are, so that the meaning of ANY_DEST_IP set in OpFlags to UdpRead() is from
> those
> - packets whose reception is enabled in hardware-physical NIC address (unicast),
> - broadcast address, logical address or addresses (multicast), or all
> (promiscuous).
> - UdpRead() does not modify the IP filter settings.
> - Dhcp(), Discover(), and Mtftp() set the IP filter, and return with the IP receive
> - filter list emptied and the filter set to
> EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP.
> - If an application or driver wishes to preserve the IP receive filter settings,
> - it will have to preserve the IP receive filter settings before these calls, and
> - use SetIpFilter() to restore them after the calls. If incompatible filtering is
> - requested (for example, PROMISCUOUS with anything else) or if the device
> does not
> - support a requested filter setting and it cannot be accommodated in software
> - (for example, PROMISCUOUS not supported), EFI_INVALID_PARAMETER will
> be returned.
> - The IPlist field is used to enable IPs other than the StationIP. They may be
> - multicast or unicast. If IPcnt is set as well as
> EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP,
> - then both the StationIP and the IPs from the IPlist will be used.
> -
> - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL
> instance.
> - @param NewFilter Pointer to the new set of IP receive filters.
> -
> - @retval EFI_SUCCESS The IP receive filter settings were updated.
> - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped
> state.
> - @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiPxeBcSetIpFilter (
> - IN EFI_PXE_BASE_CODE_PROTOCOL *This,
> - IN EFI_PXE_BASE_CODE_IP_FILTER *NewFilter
> - )
> -{
> - EFI_STATUS Status;
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - UINTN Index;
> - EFI_UDP4_CONFIG_DATA *Udp4Cfg;
> - BOOLEAN PromiscuousNeed;
> - BOOLEAN AcceptPromiscuous;
> - BOOLEAN AcceptBroadcast;
> - BOOLEAN MultiCastUpdate;
> -
> - if (This == NULL) {
> - DEBUG ((EFI_D_ERROR, "This == NULL.\n"));
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
> - Mode = Private->PxeBc.Mode;
> -
> - if (NewFilter == NULL) {
> - DEBUG ((EFI_D_ERROR, "NewFilter == NULL.\n"));
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (NewFilter->IpCnt > EFI_PXE_BASE_CODE_MAX_IPCNT) {
> - DEBUG ((EFI_D_ERROR, "NewFilter->IpCnt > %d.\n",
> EFI_PXE_BASE_CODE_MAX_IPCNT));
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (!Mode->Started) {
> - DEBUG ((EFI_D_ERROR, "BC was not started.\n"));
> - return EFI_NOT_STARTED;
> - }
> -
> - if (Mode->UsingIpv6) {
> - DEBUG ((EFI_D_ERROR, "This driver is PXE for IPv4 Only.\n"));
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - PromiscuousNeed = FALSE;
> -
> - for (Index = 0; Index < NewFilter->IpCnt; ++Index) {
> - if (IP4_IS_LOCAL_BROADCAST (EFI_IP4 (NewFilter->IpList[Index].v4))) {
> - //
> - // The IP is a broadcast address.
> - //
> - DEBUG ((EFI_D_ERROR, "There is broadcast address in NewFilter.\n"));
> - return EFI_INVALID_PARAMETER;
> - }
> - if ((EFI_NTOHL(Mode->StationIp) != 0) &&
> - (EFI_NTOHL(Mode->SubnetMask) != 0) &&
> - IP4_NET_EQUAL(EFI_NTOHL(Mode->StationIp), EFI_NTOHL(NewFilter-
> >IpList[Index].v4), EFI_NTOHL(Mode->SubnetMask)) &&
> - NetIp4IsUnicast (EFI_IP4 (NewFilter->IpList[Index].v4), EFI_NTOHL(Mode-
> >SubnetMask)) &&
> - ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0)) {
> - //
> - // If EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP is set and IP4 address is in
> IpList,
> - // promiscuous mode is needed.
> - //
> - PromiscuousNeed = TRUE;
> - }
> - }
> -
> - AcceptPromiscuous = FALSE;
> - AcceptBroadcast = FALSE;
> - MultiCastUpdate = FALSE;
> -
> - if (PromiscuousNeed ||
> - ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS) != 0)
> ||
> - ((NewFilter->Filters &
> EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST) != 0)
> - ) {
> - //
> - // Configure the udp4 filter to receive all packages.
> - //
> - AcceptPromiscuous = TRUE;
> - } else if ((NewFilter->Filters &
> EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST) != 0) {
> - //
> - // Configure the udp4 filter to receive all broadcast packages.
> - //
> - AcceptBroadcast = TRUE;
> - }
> -
> - //
> - // In multicast condition when Promiscuous FALSE and IpCnt no-zero.
> - // Here check if there is any update of the multicast ip address. If yes,
> - // we need leave the old multicast group (by Config UDP instance to NULL),
> - // and join the new multicast group.
> - //
> - if (!AcceptPromiscuous) {
> - if ((NewFilter->Filters & EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP) != 0) {
> - if (Mode->IpFilter.IpCnt != NewFilter->IpCnt) {
> - MultiCastUpdate = TRUE;
> - } else if (CompareMem (Mode->IpFilter.IpList, NewFilter->IpList, NewFilter-
> >IpCnt * sizeof (EFI_IP_ADDRESS)) != 0 ) {
> - MultiCastUpdate = TRUE;
> - }
> - }
> - }
> -
> - //
> - // Check whether we need reconfigure the UDP instance.
> - //
> - Udp4Cfg = &Private->Udp4CfgData;
> - if ((AcceptPromiscuous != Udp4Cfg->AcceptPromiscuous) ||
> - (AcceptBroadcast != Udp4Cfg->AcceptBroadcast) || MultiCastUpdate) {
> - //
> - // Clear the UDP instance configuration, all joined groups will be left
> - // during the operation.
> - //
> - Private->Udp4Read->Configure (Private->Udp4Read, NULL);
> -
> - //
> - // Configure the UDP instance with the new configuration.
> - //
> - Udp4Cfg->AcceptPromiscuous = AcceptPromiscuous;
> - Udp4Cfg->AcceptBroadcast = AcceptBroadcast;
> - Status = Private->Udp4Read->Configure (Private->Udp4Read, Udp4Cfg);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - //
> - // In not Promiscuous mode, need to join the new multicast group.
> - //
> - if (!AcceptPromiscuous) {
> - for (Index = 0; Index < NewFilter->IpCnt; ++Index) {
> - if (IP4_IS_MULTICAST (EFI_NTOHL (NewFilter->IpList[Index].v4))) {
> - //
> - // Join the mutilcast group.
> - //
> - Status = Private->Udp4Read->Groups (Private->Udp4Read, TRUE,
> &NewFilter->IpList[Index].v4);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> - }
> - }
> - }
> - }
> -
> -
> - //
> - // Save the new filter.
> - //
> - CopyMem (&Mode->IpFilter, NewFilter, sizeof (Mode->IpFilter));
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -/**
> - Uses the ARP protocol to resolve a MAC address.
> -
> - This function uses the ARP protocol to resolve a MAC address. The UsingIpv6
> field
> - of the EFI_PXE_BASE_CODE_MODE structure is used to determine if IPv4 or
> IPv6
> - addresses are being used. The IP address specified by IpAddr is used to resolve
> - a MAC address. If the ARP protocol succeeds in resolving the specified address,
> - then the ArpCacheEntries and ArpCache fields of the
> EFI_PXE_BASE_CODE_MODE structure
> - are updated, and EFI_SUCCESS is returned. If MacAddr is not NULL, the
> resolved
> - MAC address is placed there as well. If the PXE Base Code protocol is in the
> - stopped state, then EFI_NOT_STARTED is returned. If the ARP protocol
> encounters
> - a timeout condition while attempting to resolve an address, then
> EFI_TIMEOUT is
> - returned. If the Callback Protocol does not return
> EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,
> - then EFI_ABORTED is returned.
> -
> - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL
> instance.
> - @param IpAddr Pointer to the IP address that is used to resolve a
> MAC address.
> - @param MacAddr If not NULL, a pointer to the MAC address that was
> resolved with the
> - ARP protocol.
> -
> - @retval EFI_SUCCESS The IP or MAC address was resolved.
> - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped
> state.
> - @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
> - @retval EFI_DEVICE_ERROR The network device encountered an error
> during this operation.
> - @retval EFI_ICMP_ERROR Something error occur with the ICMP packet
> message.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiPxeBcArp (
> - IN EFI_PXE_BASE_CODE_PROTOCOL * This,
> - IN EFI_IP_ADDRESS * IpAddr,
> - IN EFI_MAC_ADDRESS * MacAddr OPTIONAL
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - EFI_STATUS Status;
> - EFI_MAC_ADDRESS TempMacAddr;
> -
> - if (This == NULL || IpAddr == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
> - Mode = Private->PxeBc.Mode;
> -
> - if (!Mode->Started) {
> - return EFI_NOT_STARTED;
> - }
> -
> - if (!Private->AddressIsOk || Mode->UsingIpv6) {
> - //
> - // We can't resolve the IP address if we don't have a local address now.
> - // Don't have ARP for IPv6.
> - //
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Mode->IcmpErrorReceived = FALSE;
> -
> - if (!Mode->AutoArp) {
> - //
> - // If AutoArp is set false, check arp cache
> - //
> - UpdateArpCache (This);
> - if (!FindInArpCache (Mode, &IpAddr->v4, &TempMacAddr)) {
> - return EFI_DEVICE_ERROR;
> - }
> - } else {
> - Status = Private->Arp->Request (Private->Arp, &IpAddr->v4, NULL,
> &TempMacAddr);
> - if (EFI_ERROR (Status)) {
> - if (Status == EFI_ICMP_ERROR) {
> - Mode->IcmpErrorReceived = TRUE;
> - }
> - return Status;
> - }
> - }
> -
> - if (MacAddr != NULL) {
> - CopyMem (MacAddr, &TempMacAddr, sizeof (EFI_MAC_ADDRESS));
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Updates the parameters that affect the operation of the PXE Base Code
> Protocol.
> -
> - This function sets parameters that affect the operation of the PXE Base Code
> Protocol.
> - The parameter specified by NewAutoArp is used to control the generation of
> ARP
> - protocol packets. If NewAutoArp is TRUE, then ARP Protocol packets will be
> generated
> - as required by the PXE Base Code Protocol. If NewAutoArp is FALSE, then no
> ARP
> - Protocol packets will be generated. In this case, the only mappings that are
> - available are those stored in the ArpCache of the EFI_PXE_BASE_CODE_MODE
> structure.
> - If there are not enough mappings in the ArpCache to perform a PXE Base Code
> Protocol
> - service, then the service will fail. This function updates the AutoArp field of
> - the EFI_PXE_BASE_CODE_MODE structure to NewAutoArp.
> - The SetParameters() call must be invoked after a Callback Protocol is installed
> - to enable the use of callbacks.
> -
> - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL
> instance.
> - @param NewAutoArp If not NULL, a pointer to a value that specifies
> whether to replace the
> - current value of AutoARP.
> - @param NewSendGUID If not NULL, a pointer to a value that specifies
> whether to replace the
> - current value of SendGUID.
> - @param NewTTL If not NULL, a pointer to be used in place of the
> current value of TTL,
> - the "time to live" field of the IP header.
> - @param NewToS If not NULL, a pointer to be used in place of the
> current value of ToS,
> - the "type of service" field of the IP header.
> - @param NewMakeCallback If not NULL, a pointer to a value that specifies
> whether to replace the
> - current value of the MakeCallback field of the Mode structure.
> -
> - @retval EFI_SUCCESS The new parameters values were updated.
> - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped
> state.
> - @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiPxeBcSetParameters (
> - IN EFI_PXE_BASE_CODE_PROTOCOL *This,
> - IN BOOLEAN *NewAutoArp OPTIONAL,
> - IN BOOLEAN *NewSendGUID OPTIONAL,
> - IN UINT8 *NewTTL OPTIONAL,
> - IN UINT8 *NewToS OPTIONAL,
> - IN BOOLEAN *NewMakeCallback // OPTIONAL
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - EFI_STATUS Status;
> -
> - Status = EFI_SUCCESS;
> -
> - if (This == NULL) {
> - Status = EFI_INVALID_PARAMETER;
> - goto ON_EXIT;
> - }
> -
> - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
> - Mode = Private->PxeBc.Mode;
> -
> - if (NewSendGUID != NULL && *NewSendGUID) {
> - //
> - // FixMe, cann't locate SendGuid
> - //
> - }
> -
> - if (NewMakeCallback != NULL && *NewMakeCallback) {
> -
> - Status = gBS->HandleProtocol (
> - Private->Controller,
> - &gEfiPxeBaseCodeCallbackProtocolGuid,
> - (VOID **) &Private->PxeBcCallback
> - );
> - if (EFI_ERROR (Status) || (Private->PxeBcCallback->Callback == NULL)) {
> -
> - Status = EFI_INVALID_PARAMETER;
> - goto ON_EXIT;
> - }
> - }
> -
> - if (!Mode->Started) {
> - Status = EFI_NOT_STARTED;
> - goto ON_EXIT;
> - }
> -
> - if (NewMakeCallback != NULL) {
> -
> - if (*NewMakeCallback) {
> - //
> - // Update the Callback protocol.
> - //
> - Status = gBS->HandleProtocol (
> - Private->Controller,
> - &gEfiPxeBaseCodeCallbackProtocolGuid,
> - (VOID **) &Private->PxeBcCallback
> - );
> -
> - if (EFI_ERROR (Status) || (Private->PxeBcCallback->Callback == NULL)) {
> - Status = EFI_INVALID_PARAMETER;
> - goto ON_EXIT;
> - }
> - } else {
> - Private->PxeBcCallback = NULL;
> - }
> -
> - Mode->MakeCallbacks = *NewMakeCallback;
> - }
> -
> - if (NewAutoArp != NULL) {
> - Mode->AutoArp = *NewAutoArp;
> - }
> -
> - if (NewSendGUID != NULL) {
> - Mode->SendGUID = *NewSendGUID;
> - }
> -
> - if (NewTTL != NULL) {
> - Mode->TTL = *NewTTL;
> - }
> -
> - if (NewToS != NULL) {
> - Mode->ToS = *NewToS;
> - }
> -
> -ON_EXIT:
> - return Status;
> -}
> -
> -/**
> - Updates the station IP address and/or subnet mask values of a network device.
> -
> - This function updates the station IP address and/or subnet mask values of a
> network
> - device. The NewStationIp field is used to modify the network device's current
> IP address.
> - If NewStationIP is NULL, then the current IP address will not be modified.
> Otherwise,
> - this function updates the StationIp field of the EFI_PXE_BASE_CODE_MODE
> structure
> - with NewStationIp. The NewSubnetMask field is used to modify the network
> device's current subnet
> - mask. If NewSubnetMask is NULL, then the current subnet mask will not be
> modified.
> - Otherwise, this function updates the SubnetMask field of the
> EFI_PXE_BASE_CODE_MODE
> - structure with NewSubnetMask.
> -
> - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL
> instance.
> - @param NewStationIp Pointer to the new IP address to be used by the
> network device.
> - @param NewSubnetMask Pointer to the new subnet mask to be used by
> the network device.
> -
> - @retval EFI_SUCCESS The new station IP address and/or subnet mask
> were updated.
> - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped
> state.
> - @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiPxeBcSetStationIP (
> - IN EFI_PXE_BASE_CODE_PROTOCOL * This,
> - IN EFI_IP_ADDRESS * NewStationIp OPTIONAL,
> - IN EFI_IP_ADDRESS * NewSubnetMask OPTIONAL
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - EFI_ARP_CONFIG_DATA ArpConfigData;
> -
> - if (This == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (NewSubnetMask != NULL && !IP4_IS_VALID_NETMASK (NTOHL
> (NewSubnetMask->Addr[0]))) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (NewStationIp != NULL) {
> - if (IP4_IS_UNSPECIFIED(NTOHL (NewStationIp->Addr[0])) ||
> - IP4_IS_LOCAL_BROADCAST(NTOHL (NewStationIp->Addr[0])) ||
> - (NewSubnetMask != NULL && NewSubnetMask->Addr[0] != 0
> && !NetIp4IsUnicast (NTOHL (NewStationIp->Addr[0]), NTOHL
> (NewSubnetMask->Addr[0])))) {
> - return EFI_INVALID_PARAMETER;
> - }
> - }
> -
> - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
> - Mode = Private->PxeBc.Mode;
> -
> - if (!Mode->Started) {
> - return EFI_NOT_STARTED;
> - }
> -
> - if (NewStationIp != NULL) {
> - CopyMem (&Mode->StationIp, NewStationIp, sizeof (EFI_IP_ADDRESS));
> - CopyMem (&Private->StationIp, NewStationIp, sizeof (EFI_IP_ADDRESS));
> - }
> -
> - if (NewSubnetMask != NULL) {
> - CopyMem (&Mode->SubnetMask, NewSubnetMask, sizeof
> (EFI_IP_ADDRESS));
> - CopyMem (&Private->SubnetMask ,NewSubnetMask, sizeof
> (EFI_IP_ADDRESS));
> - }
> -
> - Private->AddressIsOk = TRUE;
> -
> - if (!Mode->UsingIpv6) {
> - //
> - // If in IPv4 mode, configure the corresponding ARP with this new
> - // station IP address.
> - //
> - ZeroMem (&ArpConfigData, sizeof (EFI_ARP_CONFIG_DATA));
> -
> - ArpConfigData.SwAddressType = 0x0800;
> - ArpConfigData.SwAddressLength = (UINT8) sizeof (EFI_IPv4_ADDRESS);
> - ArpConfigData.StationAddress = &Private->StationIp.v4;
> -
> - Private->Arp->Configure (Private->Arp, NULL);
> - Private->Arp->Configure (Private->Arp, &ArpConfigData);
> -
> - //
> - // Update the route table.
> - //
> - Mode->RouteTableEntries = 1;
> - Mode->RouteTable[0].IpAddr.Addr[0] = Private->StationIp.Addr[0] &
> Private->SubnetMask.Addr[0];
> - Mode->RouteTable[0].SubnetMask.Addr[0] = Private->SubnetMask.Addr[0];
> - Mode->RouteTable[0].GwAddr.Addr[0] = 0;
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -/**
> - Updates the contents of the cached DHCP and Discover packets.
> -
> - The pointers to the new packets are used to update the contents of the
> cached
> - packets in the EFI_PXE_BASE_CODE_MODE structure.
> -
> - @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL
> instance.
> - @param NewDhcpDiscoverValid Pointer to a value that will replace the
> current
> - DhcpDiscoverValid field.
> - @param NewDhcpAckReceived Pointer to a value that will replace the
> current
> - DhcpAckReceived field.
> - @param NewProxyOfferReceived Pointer to a value that will replace the
> current
> - ProxyOfferReceived field.
> - @param NewPxeDiscoverValid Pointer to a value that will replace the
> current
> - ProxyOfferReceived field.
> - @param NewPxeReplyReceived Pointer to a value that will replace the
> current
> - PxeReplyReceived field.
> - @param NewPxeBisReplyReceived Pointer to a value that will replace the
> current
> - PxeBisReplyReceived field.
> - @param NewDhcpDiscover Pointer to the new cached DHCP Discover
> packet contents.
> - @param NewDhcpAck Pointer to the new cached DHCP Ack packet
> contents.
> - @param NewProxyOffer Pointer to the new cached Proxy Offer packet
> contents.
> - @param NewPxeDiscover Pointer to the new cached PXE Discover packet
> contents.
> - @param NewPxeReply Pointer to the new cached PXE Reply packet
> contents.
> - @param NewPxeBisReply Pointer to the new cached PXE BIS Reply
> packet contents.
> -
> - @retval EFI_SUCCESS The cached packet contents were updated.
> - @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped
> state.
> - @retval EFI_INVALID_PARAMETER This is NULL or not point to a valid
> EFI_PXE_BASE_CODE_PROTOCOL structure.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiPxeBcSetPackets (
> - IN EFI_PXE_BASE_CODE_PROTOCOL * This,
> - IN BOOLEAN * NewDhcpDiscoverValid OPTIONAL,
> - IN BOOLEAN * NewDhcpAckReceived OPTIONAL,
> - IN BOOLEAN * NewProxyOfferReceived OPTIONAL,
> - IN BOOLEAN * NewPxeDiscoverValid OPTIONAL,
> - IN BOOLEAN * NewPxeReplyReceived OPTIONAL,
> - IN BOOLEAN * NewPxeBisReplyReceived OPTIONAL,
> - IN EFI_PXE_BASE_CODE_PACKET * NewDhcpDiscover OPTIONAL,
> - IN EFI_PXE_BASE_CODE_PACKET * NewDhcpAck OPTIONAL,
> - IN EFI_PXE_BASE_CODE_PACKET * NewProxyOffer OPTIONAL,
> - IN EFI_PXE_BASE_CODE_PACKET * NewPxeDiscover OPTIONAL,
> - IN EFI_PXE_BASE_CODE_PACKET * NewPxeReply OPTIONAL,
> - IN EFI_PXE_BASE_CODE_PACKET * NewPxeBisReply OPTIONAL
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> -
> - if (This == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = PXEBC_PRIVATE_DATA_FROM_PXEBC (This);
> - Mode = Private->PxeBc.Mode;
> -
> - if (!Mode->Started) {
> - return EFI_NOT_STARTED;
> - }
> -
> - if (NewDhcpDiscoverValid != NULL) {
> - Mode->DhcpDiscoverValid = *NewDhcpDiscoverValid;
> - }
> -
> - if (NewDhcpAckReceived != NULL) {
> - Mode->DhcpAckReceived = *NewDhcpAckReceived;
> - }
> -
> - if (NewProxyOfferReceived != NULL) {
> - Mode->ProxyOfferReceived = *NewProxyOfferReceived;
> - }
> -
> - if (NewPxeDiscoverValid != NULL) {
> - Mode->PxeDiscoverValid = *NewPxeDiscoverValid;
> - }
> -
> - if (NewPxeReplyReceived != NULL) {
> - Mode->PxeReplyReceived = *NewPxeReplyReceived;
> - }
> -
> - if (NewPxeBisReplyReceived != NULL) {
> - Mode->PxeBisReplyReceived = *NewPxeBisReplyReceived;
> - }
> -
> - if (NewDhcpDiscover != NULL) {
> - CopyMem (&Mode->DhcpDiscover, NewDhcpDiscover, sizeof
> (EFI_PXE_BASE_CODE_PACKET));
> - }
> -
> - if (NewDhcpAck != NULL) {
> - CopyMem (&Mode->DhcpAck, NewDhcpAck, sizeof
> (EFI_PXE_BASE_CODE_PACKET));
> - }
> -
> - if (NewProxyOffer != NULL) {
> - CopyMem (&Mode->ProxyOffer, NewProxyOffer, sizeof
> (EFI_PXE_BASE_CODE_PACKET));
> - }
> -
> - if (NewPxeDiscover != NULL) {
> - CopyMem (&Mode->PxeDiscover, NewPxeDiscover, sizeof
> (EFI_PXE_BASE_CODE_PACKET));
> - }
> -
> - if (NewPxeReply != NULL) {
> - CopyMem (&Mode->PxeReply, NewPxeReply, sizeof
> (EFI_PXE_BASE_CODE_PACKET));
> - }
> -
> - if (NewPxeBisReply != NULL) {
> - CopyMem (&Mode->PxeBisReply, NewPxeBisReply, sizeof
> (EFI_PXE_BASE_CODE_PACKET));
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -EFI_PXE_BASE_CODE_PROTOCOL mPxeBcProtocolTemplate = {
> - EFI_PXE_BASE_CODE_PROTOCOL_REVISION,
> - EfiPxeBcStart,
> - EfiPxeBcStop,
> - EfiPxeBcDhcp,
> - EfiPxeBcDiscover,
> - EfiPxeBcMtftp,
> - EfiPxeBcUdpWrite,
> - EfiPxeBcUdpRead,
> - EfiPxeBcSetIpFilter,
> - EfiPxeBcArp,
> - EfiPxeBcSetParameters,
> - EfiPxeBcSetStationIP,
> - EfiPxeBcSetPackets,
> - NULL
> -};
> -
> -/**
> - Callback function that is invoked when the PXE Base Code Protocol is about to
> transmit, has
> - received, or is waiting to receive a packet.
> -
> - This function is invoked when the PXE Base Code Protocol is about to transmit,
> has received,
> - or is waiting to receive a packet. Parameters Function and Received specify
> the type of event.
> - Parameters PacketLen and Packet specify the packet that generated the event.
> If these fields
> - are zero and NULL respectively, then this is a status update callback. If the
> operation specified
> - by Function is to continue, then CALLBACK_STATUS_CONTINUE should be
> returned. If the operation
> - specified by Function should be aborted, then CALLBACK_STATUS_ABORT
> should be returned. Due to
> - the polling nature of UEFI device drivers, a callback function should not
> execute for more than 5 ms.
> - The SetParameters() function must be called after a Callback Protocol is
> installed to enable the
> - use of callbacks.
> -
> - @param This Pointer to the
> EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL instance.
> - @param Function The PXE Base Code Protocol function that is waiting
> for an event.
> - @param Received TRUE if the callback is being invoked due to a
> receive event. FALSE if
> - the callback is being invoked due to a transmit event.
> - @param PacketLength The length, in bytes, of Packet. This field will have
> a value of zero if
> - this is a wait for receive event.
> - @param PacketPtr If Received is TRUE, a pointer to the packet that
> was just received;
> - otherwise a pointer to the packet that is about to be
> transmitted.
> -
> - @retval EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE if Function
> specifies a continue operation
> - @retval EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT if Function
> specifies an abort operation
> -
> -**/
> -EFI_PXE_BASE_CODE_CALLBACK_STATUS
> -EFIAPI
> -EfiPxeLoadFileCallback (
> - IN EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL * This,
> - IN EFI_PXE_BASE_CODE_FUNCTION Function,
> - IN BOOLEAN Received,
> - IN UINT32 PacketLength,
> - IN EFI_PXE_BASE_CODE_PACKET * PacketPtr OPTIONAL
> - )
> -{
> - EFI_INPUT_KEY Key;
> - EFI_STATUS Status;
> -
> - //
> - // Catch Ctrl-C or ESC to abort.
> - //
> - Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
> -
> - if (!EFI_ERROR (Status)) {
> -
> - if (Key.ScanCode == SCAN_ESC || Key.UnicodeChar == (0x1F & 'c')) {
> -
> - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT;
> - }
> - }
> - //
> - // No print if receive packet
> - //
> - if (Received) {
> - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE;
> - }
> - //
> - // Print only for three functions
> - //
> - switch (Function) {
> -
> - case EFI_PXE_BASE_CODE_FUNCTION_MTFTP:
> - //
> - // Print only for open MTFTP packets, not every MTFTP packets
> - //
> - if (PacketLength != 0 && PacketPtr != NULL) {
> - if (PacketPtr->Raw[0x1C] != 0x00 || PacketPtr->Raw[0x1D] != 0x01) {
> - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE;
> - }
> - }
> - break;
> -
> - case EFI_PXE_BASE_CODE_FUNCTION_DHCP:
> - case EFI_PXE_BASE_CODE_FUNCTION_DISCOVER:
> - break;
> -
> - default:
> - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE;
> - }
> -
> - if (PacketLength != 0 && PacketPtr != NULL) {
> - //
> - // Print '.' when transmit a packet
> - //
> - AsciiPrint (".");
> -
> - }
> -
> - return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE;
> -}
> -
> -EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL mPxeBcCallBackTemplate = {
> - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL_REVISION,
> - EfiPxeLoadFileCallback
> -};
> -
> -
> -/**
> - Find the boot file.
> -
> - @param Private Pointer to PxeBc private data.
> - @param BufferSize Pointer to buffer size.
> - @param Buffer Pointer to buffer.
> -
> - @retval EFI_SUCCESS Discover the boot file successfully.
> - @retval EFI_TIMEOUT The TFTP/MTFTP operation timed out.
> - @retval EFI_ABORTED PXE bootstrap server, so local boot need abort.
> - @retval EFI_BUFFER_TOO_SMALL The buffer is too small to load the boot file.
> -
> -**/
> -EFI_STATUS
> -DiscoverBootFile (
> - IN PXEBC_PRIVATE_DATA *Private,
> - IN OUT UINT64 *BufferSize,
> - IN VOID *Buffer
> - )
> -{
> - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;
> - EFI_PXE_BASE_CODE_MODE *Mode;
> - EFI_STATUS Status;
> - UINT16 Type;
> - UINT16 Layer;
> - BOOLEAN UseBis;
> - PXEBC_CACHED_DHCP4_PACKET *Packet;
> - UINT16 Value;
> -
> - PxeBc = &Private->PxeBc;
> - Mode = PxeBc->Mode;
> - Type = EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP;
> - Layer = EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL;
> -
> - //
> - // do DHCP.
> - //
> - Status = PxeBc->Dhcp (PxeBc, TRUE);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> -
> - //
> - // Select a boot server
> - //
> - Status = PxeBcSelectBootPrompt (Private);
> -
> - if (Status == EFI_SUCCESS) {
> - Status = PxeBcSelectBootMenu (Private, &Type, TRUE);
> - } else if (Status == EFI_TIMEOUT) {
> - Status = PxeBcSelectBootMenu (Private, &Type, FALSE);
> - }
> -
> - if (!EFI_ERROR (Status)) {
> -
> - if (Type == EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP) {
> - //
> - // Local boot(PXE bootstrap server) need abort
> - //
> - return EFI_ABORTED;
> - }
> -
> - UseBis = (BOOLEAN) (Mode->BisSupported && Mode->BisDetected);
> - Status = PxeBc->Discover (PxeBc, Type, &Layer, UseBis, NULL);
> - if (EFI_ERROR (Status)) {
> - return Status;
> - }
> - }
> -
> - *BufferSize = 0;
> -
> - //
> - // Get bootfile name and (m)tftp server ip addresss
> - //
> - if (Mode->PxeReplyReceived) {
> - Packet = &Private->PxeReply;
> - } else if (Mode->ProxyOfferReceived) {
> - Packet = &Private->ProxyOffer;
> - } else {
> - Packet = &Private->Dhcp4Ack;
> - }
> -
> - //
> - // Use siaddr(next server) in DHCPOFFER packet header, if zero, use option
> 54(server identifier)
> - // in DHCPOFFER packet.
> - // (It does not comply with PXE Spec, Ver2.1)
> - //
> - if (EFI_IP4_EQUAL (&Packet->Packet.Offer.Dhcp4.Header.ServerAddr,
> &mZeroIp4Addr)) {
> - CopyMem (
> - &Private->ServerIp,
> - Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]->Data,
> - sizeof (EFI_IPv4_ADDRESS)
> - );
> - } else {
> - CopyMem (
> - &Private->ServerIp,
> - &Packet->Packet.Offer.Dhcp4.Header.ServerAddr,
> - sizeof (EFI_IPv4_ADDRESS)
> - );
> - }
> - if (Private->ServerIp.Addr[0] == 0) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - ASSERT (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] !=
> NULL);
> -
> - //
> - // bootlfile name
> - //
> - Private->BootFileName = (CHAR8 *) (Packet-
> >Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Data);
> -
> - if (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN] != NULL)
> {
> - //
> - // Already have the bootfile length option, compute the file size
> - //
> - CopyMem (&Value, Packet-
> >Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN]->Data, sizeof
> (Value));
> - Value = NTOHS (Value);
> - *BufferSize = 512 * Value;
> - Status = EFI_BUFFER_TOO_SMALL;
> - } else {
> - //
> - // Get the bootfile size from tftp
> - //
> - Status = PxeBc->Mtftp (
> - PxeBc,
> - EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE,
> - Buffer,
> - FALSE,
> - BufferSize,
> - &Private->BlockSize,
> - &Private->ServerIp,
> - (UINT8 *) Private->BootFileName,
> - NULL,
> - FALSE
> - );
> - }
> -
> - Private->FileSize = (UINTN) *BufferSize;
> -
> - //
> - // Display all the information: boot server address, boot file name and boot
> file size.
> - //
> - AsciiPrint ("\n Server IP address is ");
> - PxeBcShowIp4Addr (&Private->ServerIp.v4);
> - AsciiPrint ("\n NBP filename is %a", Private->BootFileName);
> - AsciiPrint ("\n NBP filesize is %d Bytes", Private->FileSize);
> -
> - return Status;
> -}
> -
> -/**
> - Causes the driver to load a specified file.
> -
> - @param This Protocol instance pointer.
> - @param FilePath The device specific path of the file to load.
> - @param BootPolicy If TRUE, indicates that the request originates from
> the
> - boot manager is attempting to load FilePath as a boot
> - selection. If FALSE, then FilePath must match as exact file
> - to be loaded.
> - @param BufferSize On input the size of Buffer in bytes. On output with
> a return
> - code of EFI_SUCCESS, the amount of data transferred to
> - Buffer. On output with a return code of
> EFI_BUFFER_TOO_SMALL,
> - the size of Buffer required to retrieve the requested file.
> - @param Buffer The memory buffer to transfer the file to. IF Buffer is
> NULL,
> - then no the size of the requested file is returned in
> - BufferSize.
> -
> - @retval EFI_SUCCESS The file was loaded.
> - @retval EFI_UNSUPPORTED The device does not support the provided
> BootPolicy
> - @retval EFI_INVALID_PARAMETER FilePath is not a valid device path, or
> - BufferSize is NULL.
> - @retval EFI_NO_MEDIA No medium was present to load the file.
> - @retval EFI_DEVICE_ERROR The file was not loaded due to a device
> error.
> - @retval EFI_NO_RESPONSE The remote system did not respond.
> - @retval EFI_NOT_FOUND The file was not found.
> - @retval EFI_ABORTED The file load process was manually cancelled.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiPxeLoadFile (
> - IN EFI_LOAD_FILE_PROTOCOL * This,
> - IN EFI_DEVICE_PATH_PROTOCOL * FilePath,
> - IN BOOLEAN BootPolicy,
> - IN OUT UINTN *BufferSize,
> - IN VOID *Buffer OPTIONAL
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_PXE_BASE_CODE_PROTOCOL *PxeBc;
> - BOOLEAN NewMakeCallback;
> - EFI_STATUS Status;
> - UINT64 TmpBufSize;
> - EFI_STATUS MediaStatus;
> -
> - if (FilePath == NULL || !IsDevicePathEnd (FilePath)) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = PXEBC_PRIVATE_DATA_FROM_LOADFILE (This);
> - PxeBc = &Private->PxeBc;
> - NewMakeCallback = FALSE;
> - Status = EFI_DEVICE_ERROR;
> -
> - if (This == NULL || BufferSize == NULL) {
> -
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - //
> - // Only support BootPolicy
> - //
> - if (!BootPolicy) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - //
> - // Check media status before PXE start
> - //
> - MediaStatus = EFI_SUCCESS;
> - NetLibDetectMediaWaitTimeout (Private->Controller,
> PXEBC_CHECK_MEDIA_WAITING_TIME, &MediaStatus);
> - if (MediaStatus != EFI_SUCCESS) {
> - return EFI_NO_MEDIA;
> - }
> -
> - Status = PxeBc->Start (PxeBc, FALSE);
> - if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {
> - return Status;
> - }
> -
> - Status = gBS->HandleProtocol (
> - Private->Controller,
> - &gEfiPxeBaseCodeCallbackProtocolGuid,
> - (VOID **) &Private->PxeBcCallback
> - );
> - if (Status == EFI_UNSUPPORTED) {
> -
> - CopyMem (&Private->LoadFileCallback, &mPxeBcCallBackTemplate, sizeof
> (Private->LoadFileCallback));
> -
> - Status = gBS->InstallProtocolInterface (
> - &Private->Controller,
> - &gEfiPxeBaseCodeCallbackProtocolGuid,
> - EFI_NATIVE_INTERFACE,
> - &Private->LoadFileCallback
> - );
> -
> - NewMakeCallback = (BOOLEAN) (Status == EFI_SUCCESS);
> -
> - Status = PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL,
> &NewMakeCallback);
> - if (EFI_ERROR (Status)) {
> - PxeBc->Stop (PxeBc);
> - return Status;
> - }
> - }
> -
> - if (Private->FileSize == 0) {
> - TmpBufSize = 0;
> - Status = DiscoverBootFile (Private, &TmpBufSize, Buffer);
> -
> - if (sizeof (UINTN) < sizeof (UINT64) && (TmpBufSize > 0xFFFFFFFF)) {
> - Status = EFI_DEVICE_ERROR;
> - } else if (TmpBufSize > 0 && *BufferSize >= (UINTN) TmpBufSize && Buffer !=
> NULL) {
> - AsciiPrint ("\n Downloading NBP file...\n");
> - *BufferSize = (UINTN) TmpBufSize;
> - Status = PxeBc->Mtftp (
> - PxeBc,
> - EFI_PXE_BASE_CODE_TFTP_READ_FILE,
> - Buffer,
> - FALSE,
> - &TmpBufSize,
> - &Private->BlockSize,
> - &Private->ServerIp,
> - (UINT8 *) Private->BootFileName,
> - NULL,
> - FALSE
> - );
> - } else if (TmpBufSize > 0) {
> - *BufferSize = (UINTN) TmpBufSize;
> - Status = EFI_BUFFER_TOO_SMALL;
> - }
> - } else if (Buffer == NULL || Private->FileSize > *BufferSize) {
> - *BufferSize = Private->FileSize;
> - Status = EFI_BUFFER_TOO_SMALL;
> - } else {
> - //
> - // Download the file.
> - //
> - AsciiPrint ("\n Downloading NBP file...\n");
> - TmpBufSize = (UINT64) (*BufferSize);
> - Status = PxeBc->Mtftp (
> - PxeBc,
> - EFI_PXE_BASE_CODE_TFTP_READ_FILE,
> - Buffer,
> - FALSE,
> - &TmpBufSize,
> - &Private->BlockSize,
> - &Private->ServerIp,
> - (UINT8 *) Private->BootFileName,
> - NULL,
> - FALSE
> - );
> - }
> - //
> - // If we added a callback protocol, now is the time to remove it.
> - //
> - if (NewMakeCallback) {
> -
> - NewMakeCallback = FALSE;
> -
> - PxeBc->SetParameters (PxeBc, NULL, NULL, NULL, NULL,
> &NewMakeCallback);
> -
> - gBS->UninstallProtocolInterface (
> - Private->Controller,
> - &gEfiPxeBaseCodeCallbackProtocolGuid,
> - &Private->LoadFileCallback
> - );
> - }
> -
> - //
> - // Check download status
> - //
> - if (Status == EFI_SUCCESS) {
> - AsciiPrint ("\n NBP file downloaded successfully.\n");
> - //
> - // The DHCP4 can have only one configured child instance so we need to stop
> - // reset the DHCP4 child before we return. Otherwise the other programs
> which
> - // also need to use DHCP4 will be impacted.
> - // The functionality of PXE Base Code protocol will not be stopped,
> - // when downloading is successfully.
> - //
> - Private->Dhcp4->Stop (Private->Dhcp4);
> - Private->Dhcp4->Configure (Private->Dhcp4, NULL);
> - return EFI_SUCCESS;
> -
> - } else if (Status == EFI_BUFFER_TOO_SMALL) {
> - if (Buffer != NULL) {
> - AsciiPrint ("PXE-E05: Download buffer is smaller than requested file.\n");
> - } else {
> - //
> - // The functionality of PXE Base Code protocol will not be stopped.
> - //
> - return Status;
> - }
> -
> - } else if (Status == EFI_DEVICE_ERROR) {
> - AsciiPrint ("PXE-E07: Network device error.\n");
> -
> - } else if (Status == EFI_OUT_OF_RESOURCES) {
> - AsciiPrint ("PXE-E09: Could not allocate I/O buffers.\n");
> -
> - } else if (Status == EFI_NO_MEDIA) {
> - AsciiPrint ("PXE-E12: Could not detect network connection.\n");
> -
> - } else if (Status == EFI_NO_RESPONSE) {
> - AsciiPrint ("PXE-E16: No offer received.\n");
> -
> - } else if (Status == EFI_TIMEOUT) {
> - AsciiPrint ("PXE-E18: Server response timeout.\n");
> -
> - } else if (Status == EFI_ABORTED) {
> - AsciiPrint ("PXE-E21: Remote boot cancelled.\n");
> -
> - } else if (Status == EFI_ICMP_ERROR) {
> - AsciiPrint ("PXE-E22: Client received ICMP error from server.\n");
> -
> - } else if (Status == EFI_TFTP_ERROR) {
> - AsciiPrint ("PXE-E23: Client received TFTP error from server.\n");
> -
> - } else {
> - AsciiPrint ("PXE-E99: Unexpected network error.\n");
> - }
> -
> - PxeBc->Stop (PxeBc);
> -
> - return Status;
> -}
> -
> -EFI_LOAD_FILE_PROTOCOL mLoadFileProtocolTemplate = { EfiPxeLoadFile };
> -
> diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c
> b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c
> deleted file mode 100644
> index 88767c8394ab..000000000000
> --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c
> +++ /dev/null
> @@ -1,454 +0,0 @@
> -/** @file
> - PxeBc MTFTP functions.
> -
> -Copyright (c) 2007 - 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.
> -
> -**/
> -
> -#include "PxeBcImpl.h"
> -
> -CHAR8 *mMtftpOptions[PXE_MTFTP_OPTION_MAXIMUM_INDEX] = {
> - "blksize",
> - "timeout",
> - "tsize",
> - "multicast"
> -};
> -
> -
> -/**
> - This is a callback function when packets received/transmitted in Mtftp driver.
> -
> - A callback function that is provided by the caller to intercept
> - the EFI_MTFTP4_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets
> processed in the
> - EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept
> - EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during
> a call to
> - EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().
> -
> - @param This Pointer to Mtftp protocol instance
> - @param Token Pointer to Mtftp token
> - @param PacketLen Length of Mtftp packet
> - @param Packet Pointer to Mtftp packet
> -
> - @retval EFI_SUCCESS Operation sucess
> - @retval EFI_ABORTED Abort transfer process
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -PxeBcCheckPacket (
> - IN EFI_MTFTP4_PROTOCOL *This,
> - IN EFI_MTFTP4_TOKEN *Token,
> - IN UINT16 PacketLen,
> - IN EFI_MTFTP4_PACKET *Packet
> - )
> -{
> - PXEBC_PRIVATE_DATA *Private;
> - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback;
> - EFI_STATUS Status;
> -
> - Private = (PXEBC_PRIVATE_DATA *) Token->Context;
> - Callback = Private->PxeBcCallback;
> - Status = EFI_SUCCESS;
> -
> - if (Packet->OpCode == EFI_MTFTP4_OPCODE_ERROR) {
> - Private->Mode.TftpErrorReceived = TRUE;
> - Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;
> - AsciiStrnCpyS (Private->Mode.TftpError.ErrorString,
> PXE_MTFTP_ERROR_STRING_LENGTH, (CHAR8 *) Packet->Error.ErrorMessage,
> PXE_MTFTP_ERROR_STRING_LENGTH - 1);
> - Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH -
> 1] = '\0';
> - }
> -
> - if (Callback != NULL) {
> -
> - Status = Callback->Callback (
> - Callback,
> - Private->Function,
> - TRUE,
> - PacketLen,
> - (EFI_PXE_BASE_CODE_PACKET *) Packet
> - );
> - if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {
> -
> - Status = EFI_ABORTED;
> - } else {
> -
> - Status = EFI_SUCCESS;
> - }
> - }
> -
> - return Status;
> -}
> -
> -
> -/**
> - This function is to get size of a file by Tftp.
> -
> - @param Private Pointer to PxeBc private data
> - @param Config Pointer to Mtftp configuration data
> - @param Filename Pointer to file name
> - @param BlockSize Pointer to block size
> - @param BufferSize Pointer to buffer size
> -
> - @retval EFI_SUCCESS Get the size of file success
> - @retval EFI_NOT_FOUND Parse the tftp ptions failed.
> - @retval EFI_DEVICE_ERROR The network device encountered an error during
> this operation.
> - @retval Other Has not get the size of the file.
> -
> -**/
> -EFI_STATUS
> -PxeBcTftpGetFileSize (
> - IN PXEBC_PRIVATE_DATA *Private,
> - IN EFI_MTFTP4_CONFIG_DATA *Config,
> - IN UINT8 *Filename,
> - IN UINTN *BlockSize,
> - IN OUT UINT64 *BufferSize
> - )
> -{
> - EFI_MTFTP4_PROTOCOL *Mtftp4;
> - EFI_MTFTP4_OPTION ReqOpt[2];
> - EFI_MTFTP4_PACKET *Packet;
> - EFI_MTFTP4_OPTION *Option;
> - UINT32 PktLen;
> - UINT8 OptBuf[128];
> - UINT32 OptCnt;
> - EFI_STATUS Status;
> -
> - *BufferSize = 0;
> - Status = EFI_DEVICE_ERROR;
> - Mtftp4 = Private->Mtftp4;
> - Packet = NULL;
> - Option = NULL;
> - PktLen = 0;
> - OptCnt = 1;
> - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;
> -
> - Status = Mtftp4->Configure (Mtftp4, Config);
> - if (EFI_ERROR (Status)) {
> -
> - return Status;
> - }
> -
> - ReqOpt[0].OptionStr =
> (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX];
> - UtoA10 (0, (CHAR8 *) OptBuf, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);
> - ReqOpt[0].ValueStr = OptBuf;
> -
> - if (BlockSize != NULL) {
> - ReqOpt[1].OptionStr =
> (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];
> - ReqOpt[1].ValueStr = ReqOpt[0].ValueStr + AsciiStrLen ((CHAR8 *)
> ReqOpt[0].ValueStr) + 1;
> - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[1].ValueStr,
> PXE_MTFTP_OPTBUF_MAXNUM_INDEX - (AsciiStrLen ((CHAR8 *)
> ReqOpt[0].ValueStr) + 1));
> - OptCnt++;
> - }
> -
> - Status = Mtftp4->GetInfo (
> - Mtftp4,
> - NULL,
> - Filename,
> - NULL,
> - (UINT8) OptCnt,
> - ReqOpt,
> - &PktLen,
> - &Packet
> - );
> -
> - if (EFI_ERROR (Status)) {
> - if (Status == EFI_TFTP_ERROR) {
> - Private->Mode.TftpErrorReceived = TRUE;
> - Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;
> - AsciiStrnCpyS (
> - Private->Mode.TftpError.ErrorString,
> - PXE_MTFTP_ERROR_STRING_LENGTH,
> - (CHAR8 *) Packet->Error.ErrorMessage,
> - PXE_MTFTP_ERROR_STRING_LENGTH - 1
> - );
> - Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH
> - 1] = '\0';
> - }
> - goto ON_ERROR;
> - }
> -
> - OptCnt = 0;
> -
> - Status = Mtftp4->ParseOptions (
> - Mtftp4,
> - PktLen,
> - Packet,
> - (UINT32 *) &OptCnt,
> - &Option
> - );
> -
> - if (EFI_ERROR (Status)) {
> -
> - goto ON_ERROR;
> - }
> -
> - Status = EFI_NOT_FOUND;
> -
> - while (OptCnt != 0) {
> -
> - if (AsciiStrnCmp ((CHAR8 *) Option[OptCnt - 1].OptionStr, "tsize", 5) == 0) {
> -
> - *BufferSize = AtoU64 (Option[OptCnt - 1].ValueStr);
> - Status = EFI_SUCCESS;
> - }
> -
> - OptCnt--;
> - }
> -
> - FreePool (Option);
> -
> -ON_ERROR:
> -
> - if (Packet != NULL) {
> - FreePool (Packet);
> - }
> -
> - Mtftp4->Configure (Mtftp4, NULL);
> -
> - return Status;
> -}
> -
> -
> -/**
> - This function is to get data of a file by Tftp.
> -
> - @param Private Pointer to PxeBc private data
> - @param Config Pointer to Mtftp configuration data
> - @param Filename Pointer to file name
> - @param BlockSize Pointer to block size
> - @param BufferPtr Pointer to buffer
> - @param BufferSize Pointer to buffer size
> - @param DontUseBuffer Indicate whether with a receive buffer
> -
> - @retval EFI_SUCCESS Read the data success from the special file.
> - @retval EFI_DEVICE_ERROR The network device encountered an error during
> this operation.
> - @retval other Read data from file failed.
> -
> -**/
> -EFI_STATUS
> -PxeBcTftpReadFile (
> - IN PXEBC_PRIVATE_DATA *Private,
> - IN EFI_MTFTP4_CONFIG_DATA *Config,
> - IN UINT8 *Filename,
> - IN UINTN *BlockSize,
> - IN UINT8 *BufferPtr,
> - IN OUT UINT64 *BufferSize,
> - IN BOOLEAN DontUseBuffer
> - )
> -{
> - EFI_MTFTP4_PROTOCOL *Mtftp4;
> - EFI_MTFTP4_TOKEN Token;
> - EFI_MTFTP4_OPTION ReqOpt[1];
> - UINT32 OptCnt;
> - UINT8 OptBuf[128];
> - EFI_STATUS Status;
> -
> - Status = EFI_DEVICE_ERROR;
> - Mtftp4 = Private->Mtftp4;
> - OptCnt = 0;
> - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;
> -
> - Status = Mtftp4->Configure (Mtftp4, Config);
> - if (EFI_ERROR (Status)) {
> -
> - return Status;
> - }
> -
> - if (BlockSize != NULL) {
> -
> - ReqOpt[0].OptionStr = (UINT8*)
> mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];
> - ReqOpt[0].ValueStr = OptBuf;
> - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr,
> PXE_MTFTP_OPTBUF_MAXNUM_INDEX);
> - OptCnt++;
> - }
> -
> - Token.Event = NULL;
> - Token.OverrideData = NULL;
> - Token.Filename = Filename;
> - Token.ModeStr = NULL;
> - Token.OptionCount = OptCnt;
> - Token.OptionList = ReqOpt;
> - Token.Context = Private;
> -
> - if (DontUseBuffer) {
> - Token.BufferSize = 0;
> - Token.Buffer = NULL;
> - } else {
> - Token.BufferSize = *BufferSize;
> - Token.Buffer = BufferPtr;
> - }
> -
> - Token.CheckPacket = PxeBcCheckPacket;
> - Token.TimeoutCallback = NULL;
> - Token.PacketNeeded = NULL;
> -
> - Status = Mtftp4->ReadFile (Mtftp4, &Token);
> -
> - *BufferSize = Token.BufferSize;
> -
> - Mtftp4->Configure (Mtftp4, NULL);
> -
> - return Status;
> -}
> -
> -
> -/**
> - This function is put data of a file by Tftp.
> -
> - @param Private Pointer to PxeBc private data
> - @param Config Pointer to Mtftp configuration data
> - @param Filename Pointer to file name
> - @param Overwrite Indicate whether with overwrite attribute
> - @param BlockSize Pointer to block size
> - @param BufferPtr Pointer to buffer
> - @param BufferSize Pointer to buffer size
> -
> - @retval EFI_SUCCESS Write the data success into the special file.
> - @retval EFI_DEVICE_ERROR The network device encountered an error during
> this operation.
> - @retval other Write data into file failed.
> -
> -**/
> -EFI_STATUS
> -PxeBcTftpWriteFile (
> - IN PXEBC_PRIVATE_DATA *Private,
> - IN EFI_MTFTP4_CONFIG_DATA *Config,
> - IN UINT8 *Filename,
> - IN BOOLEAN Overwrite,
> - IN UINTN *BlockSize,
> - IN UINT8 *BufferPtr,
> - IN OUT UINT64 *BufferSize
> - )
> -{
> - EFI_MTFTP4_PROTOCOL *Mtftp4;
> - EFI_MTFTP4_TOKEN Token;
> - EFI_MTFTP4_OPTION ReqOpt[1];
> - UINT32 OptCnt;
> - UINT8 OptBuf[128];
> - EFI_STATUS Status;
> -
> - Status = EFI_DEVICE_ERROR;
> - Mtftp4 = Private->Mtftp4;
> - OptCnt = 0;
> - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;
> -
> - Status = Mtftp4->Configure (Mtftp4, Config);
> - if (EFI_ERROR (Status)) {
> -
> - return Status;
> - }
> -
> - if (BlockSize != NULL) {
> -
> - ReqOpt[0].OptionStr = (UINT8*)
> mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];
> - ReqOpt[0].ValueStr = OptBuf;
> - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr,
> PXE_MTFTP_OPTBUF_MAXNUM_INDEX);
> - OptCnt++;
> - }
> -
> - Token.Event = NULL;
> - Token.OverrideData = NULL;
> - Token.Filename = Filename;
> - Token.ModeStr = NULL;
> - Token.OptionCount = OptCnt;
> - Token.OptionList = ReqOpt;
> - Token.BufferSize = *BufferSize;
> - Token.Buffer = BufferPtr;
> - Token.CheckPacket = PxeBcCheckPacket;
> - Token.TimeoutCallback = NULL;
> - Token.PacketNeeded = NULL;
> -
> - Status = Mtftp4->WriteFile (Mtftp4, &Token);
> - *BufferSize = Token.BufferSize;
> -
> - Mtftp4->Configure (Mtftp4, NULL);
> -
> - return Status;
> -}
> -
> -
> -/**
> - This function is to get data(file) from a directory(may be a server) by Tftp.
> -
> - @param Private Pointer to PxeBc private data.
> - @param Config Pointer to Mtftp configuration data.
> - @param Filename Pointer to file name.
> - @param BlockSize Pointer to block size.
> - @param BufferPtr Pointer to buffer.
> - @param BufferSize Pointer to buffer size.
> - @param DontUseBuffer Indicate whether with a receive buffer.
> -
> - @retval EFI_SUCCES Get the data from the file included in directory
> success.
> - @retval EFI_DEVICE_ERROR The network device encountered an error during
> this operation.
> - @retval other Operation failed.
> -
> -**/
> -EFI_STATUS
> -PxeBcTftpReadDirectory (
> - IN PXEBC_PRIVATE_DATA *Private,
> - IN EFI_MTFTP4_CONFIG_DATA *Config,
> - IN UINT8 *Filename,
> - IN UINTN *BlockSize,
> - IN UINT8 *BufferPtr,
> - IN OUT UINT64 *BufferSize,
> - IN BOOLEAN DontUseBuffer
> - )
> -{
> - EFI_MTFTP4_PROTOCOL *Mtftp4;
> - EFI_MTFTP4_TOKEN Token;
> - EFI_MTFTP4_OPTION ReqOpt[1];
> - UINT32 OptCnt;
> - UINT8 OptBuf[128];
> - EFI_STATUS Status;
> -
> - Status = EFI_DEVICE_ERROR;
> - Mtftp4 = Private->Mtftp4;
> - OptCnt = 0;
> - Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;
> -
> - Status = Mtftp4->Configure (Mtftp4, Config);
> - if (EFI_ERROR (Status)) {
> -
> - return Status;
> - }
> -
> - if (BlockSize != NULL) {
> -
> - ReqOpt[0].OptionStr = (UINT8*)
> mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];
> - ReqOpt[0].ValueStr = OptBuf;
> - UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr,
> PXE_MTFTP_OPTBUF_MAXNUM_INDEX);
> - OptCnt++;
> - }
> -
> - Token.Event = NULL;
> - Token.OverrideData = NULL;
> - Token.Filename = Filename;
> - Token.ModeStr = NULL;
> - Token.OptionCount = OptCnt;
> - Token.OptionList = ReqOpt;
> - Token.Context = Private;
> -
> - if (DontUseBuffer) {
> - Token.BufferSize = 0;
> - Token.Buffer = NULL;
> - } else {
> - Token.BufferSize = *BufferSize;
> - Token.Buffer = BufferPtr;
> - }
> -
> - Token.CheckPacket = PxeBcCheckPacket;
> - Token.TimeoutCallback = NULL;
> - Token.PacketNeeded = NULL;
> -
> - Status = Mtftp4->ReadDirectory (Mtftp4, &Token);
> -
> - *BufferSize = Token.BufferSize;
> -
> - Mtftp4->Configure (Mtftp4, NULL);
> -
> - return Status;
> -}
> -
> diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c
> b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c
> deleted file mode 100644
> index 1401ca5ec2fd..000000000000
> --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.c
> +++ /dev/null
> @@ -1,221 +0,0 @@
> -/** @file
> - Support routines for PxeBc.
> -
> -Copyright (c) 2007 - 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.
> -
> -**/
> -
> -
> -#include "PxeBcImpl.h"
> -
> -
> -/**
> - The common notify function associated with various PxeBc events.
> -
> - @param Event The event signaled.
> - @param Context The context.
> -
> -**/
> -VOID
> -EFIAPI
> -PxeBcCommonNotify (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - )
> -{
> - *((BOOLEAN *) Context) = TRUE;
> -}
> -
> -
> -/**
> - This function initialize(or configure) the Udp4Write instance.
> -
> - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance.
> - @param StationIp Pointer to the station ip address.
> - @param SubnetMask Pointer to the subnetmask of the station ip address.
> - @param Gateway Pointer to the gateway ip address.
> - @param SrcPort Pointer to the srouce port of the station.
> - @param Ttl The time to live field of the IP header.
> - @param ToS The type of service field of the IP header.
> -
> - @retval EFI_SUCCESS The configuration settings were set, changed, or
> reset successfully.
> - @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 following conditions are
> TRUE:
> - @retval EFI_ALREADY_STARTED The EFI UDPv4 Protocol instance is already
> started/configured
> - and must be stopped/reset before it can be reconfigured.
> - @retval EFI_ACCESS_DENIED UdpConfigData. AllowDuplicatePort is FALSE
> - and UdpConfigData.StationPort is already used by
> - other instance.
> - @retval EFI_OUT_OF_RESOURCES The EFI UDPv4 Protocol driver cannot
> allocate memory for this
> - EFI UDPv4 Protocol instance.
> - @retval EFI_DEVICE_ERROR An unexpected network or system error
> occurred and this instance
> - was not opened.
> - @retval Others Please examine the function Udp4->Routes(Udp4,
> FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway) returns.
> -
> -**/
> -EFI_STATUS
> -PxeBcConfigureUdpWriteInstance (
> - IN EFI_UDP4_PROTOCOL *Udp4,
> - IN EFI_IPv4_ADDRESS *StationIp,
> - IN EFI_IPv4_ADDRESS *SubnetMask,
> - IN EFI_IPv4_ADDRESS *Gateway,
> - IN OUT UINT16 *SrcPort,
> - IN UINT8 Ttl,
> - IN UINT8 ToS
> - )
> -{
> - EFI_UDP4_CONFIG_DATA Udp4CfgData;
> - EFI_STATUS Status;
> -
> - ZeroMem (&Udp4CfgData, sizeof (Udp4CfgData));
> -
> - Udp4CfgData.ReceiveTimeout = PXEBC_DEFAULT_LIFETIME;
> - Udp4CfgData.TypeOfService = ToS;
> - Udp4CfgData.TimeToLive = Ttl;
> - Udp4CfgData.AllowDuplicatePort = TRUE;
> -
> - CopyMem (&Udp4CfgData.StationAddress, StationIp, sizeof (*StationIp));
> - CopyMem (&Udp4CfgData.SubnetMask, SubnetMask, sizeof (*SubnetMask));
> -
> - Udp4CfgData.StationPort = *SrcPort;
> -
> - //
> - // Reset the instance.
> - //
> - Udp4->Configure (Udp4, NULL);
> -
> - Status = Udp4->Configure (Udp4, &Udp4CfgData);
> - if (!EFI_ERROR (Status) && (Gateway->Addr[0] != 0)) {
> - //
> - // basic configuration OK, need to add the default route entry
> - //
> - Status = Udp4->Routes (Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr,
> Gateway);
> - if (EFI_ERROR (Status)) {
> - //
> - // roll back
> - //
> - Udp4->Configure (Udp4, NULL);
> - }
> - }
> -
> - if (!EFI_ERROR (Status) && (*SrcPort == 0)) {
> - Udp4->GetModeData (Udp4, &Udp4CfgData, NULL, NULL, NULL);
> - *SrcPort = Udp4CfgData.StationPort;
> - }
> -
> - return Status;
> -}
> -
> -/**
> - This function is to display the IPv4 address.
> -
> - @param[in] Ip The pointer to the IPv4 address.
> -
> -**/
> -VOID
> -PxeBcShowIp4Addr (
> - IN EFI_IPv4_ADDRESS *Ip
> - )
> -{
> - UINTN Index;
> -
> - for (Index = 0; Index < 4; Index++) {
> - AsciiPrint ("%d", Ip->Addr[Index]);
> - if (Index < 3) {
> - AsciiPrint (".");
> - }
> - }
> -}
> -
> -/**
> - Convert number to ASCII value.
> -
> - @param Number Numeric value to convert to decimal ASCII value.
> - @param Buffer Buffer to place ASCII version of the Number.
> - @param Length Length of Buffer.
> -
> -**/
> -VOID
> -CvtNum (
> - IN UINTN Number,
> - IN UINT8 *Buffer,
> - IN UINTN Length
> - )
> -{
> - UINTN Remainder;
> -
> - for (; Length > 0; Length--) {
> - Remainder = Number % 10;
> - Number /= 10;
> - Buffer[Length - 1] = (UINT8) ('0' + Remainder);
> - }
> -}
> -
> -
> -/**
> - Convert unsigned int number to decimal number.
> -
> - @param Number The unsigned int number will be converted.
> - @param Buffer Pointer to the buffer to store the decimal number after
> transform.
> - @param[in] BufferSize The maxsize of the buffer.
> -
> - @return the length of the number after transform.
> -
> -**/
> -UINTN
> -UtoA10 (
> - IN UINTN Number,
> - IN CHAR8 *Buffer,
> - IN UINTN BufferSize
> - )
> -{
> - UINTN Index;
> - CHAR8 TempStr[64];
> -
> - Index = 63;
> - TempStr[Index] = 0;
> -
> - do {
> - Index--;
> - TempStr[Index] = (CHAR8) ('0' + (Number % 10));
> - Number = Number / 10;
> - } while (Number != 0);
> -
> - AsciiStrCpyS (Buffer, BufferSize, &TempStr[Index]);
> -
> - return AsciiStrLen (Buffer);
> -}
> -
> -
> -/**
> - Convert ASCII numeric string to a UINTN value.
> -
> - @param Buffer Pointer to the 8-byte unsigned int value.
> -
> - @return UINTN value of the ASCII string.
> -
> -**/
> -UINT64
> -AtoU64 (
> - IN UINT8 *Buffer
> - )
> -{
> - UINT64 Value;
> - UINT8 Character;
> -
> - Value = 0;
> - while ((Character = *Buffer++) != '\0') {
> - Value = MultU64x32 (Value, 10) + (Character - '0');
> - }
> -
> - return Value;
> -}
> -
> diff --git a/MdeModulePkg/MdeModulePkg.dsc
> b/MdeModulePkg/MdeModulePkg.dsc
> index b787fb5692d3..5d042be3a862 100644
> --- a/MdeModulePkg/MdeModulePkg.dsc
> +++ b/MdeModulePkg/MdeModulePkg.dsc
> @@ -420,7 +420,6 @@ [Components]
> MdeModulePkg/Library/DxeCapsuleLibFmp/DxeRuntimeCapsuleLib.inf
>
> [Components.IA32, Components.X64, Components.AARCH64]
> - MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
> MdeModulePkg/Universal/DebugSupportDxe/DebugSupportDxe.inf
> MdeModulePkg/Universal/EbcDxe/EbcDxe.inf
> MdeModulePkg/Universal/EbcDxe/EbcDebugger.inf
> diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h
> b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h
> deleted file mode 100644
> index d8336c5e82e9..000000000000
> --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.h
> +++ /dev/null
> @@ -1,502 +0,0 @@
> -/** @file
> - Dhcp and Discover routines for PxeBc.
> -
> -Copyright (c) 2013, Red Hat, Inc.
> -Copyright (c) 2007 - 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.
> -
> -**/
> -
> -#ifndef __EFI_PXEBC_DHCP_H__
> -#define __EFI_PXEBC_DHCP_H__
> -
> -#define PXEBC_DHCP4_MAX_OPTION_NUM 16
> -#define PXEBC_DHCP4_MAX_OPTION_SIZE 312
> -#define PXEBC_DHCP4_MAX_PACKET_SIZE (sizeof
> (EFI_PXE_BASE_CODE_PACKET))
> -
> -#define PXEBC_DHCP4_S_PORT 67
> -#define PXEBC_DHCP4_C_PORT 68
> -#define PXEBC_BS_DOWNLOAD_PORT 69
> -#define PXEBC_BS_DISCOVER_PORT 4011
> -
> -#define PXEBC_DHCP4_OPCODE_REQUEST 1
> -#define PXEBC_DHCP4_OPCODE_REPLY 2
> -#define PXEBC_DHCP4_MSG_TYPE_REQUEST 3
> -#define PXEBC_DHCP4_MAGIC 0x63538263 // network byte order
> -
> -//
> -// Sub-Options in Dhcp Vendor Option
> -//
> -#define PXEBC_VENDOR_TAG_MTFTP_IP 1
> -#define PXEBC_VENDOR_TAG_MTFTP_CPORT 2
> -#define PXEBC_VENDOR_TAG_MTFTP_SPORT 3
> -#define PXEBC_VENDOR_TAG_MTFTP_TIMEOUT 4
> -#define PXEBC_VENDOR_TAG_MTFTP_DELAY 5
> -#define PXEBC_VENDOR_TAG_DISCOVER_CTRL 6
> -#define PXEBC_VENDOR_TAG_DISCOVER_MCAST 7
> -#define PXEBC_VENDOR_TAG_BOOT_SERVERS 8
> -#define PXEBC_VENDOR_TAG_BOOT_MENU 9
> -#define PXEBC_VENDOR_TAG_MENU_PROMPT 10
> -#define PXEBC_VENDOR_TAG_MCAST_ALLOC 11
> -#define PXEBC_VENDOR_TAG_CREDENTIAL_TYPES 12
> -#define PXEBC_VENDOR_TAG_BOOT_ITEM 71
> -
> -#define PXEBC_DHCP4_DISCOVER_INIT_TIMEOUT 4
> -#define PXEBC_DHCP4_DISCOVER_RETRIES 4
> -
> -#define PXEBC_MAX_MENU_NUM 24
> -#define PXEBC_MAX_OFFER_NUM 16
> -
> -#define PXEBC_BOOT_REQUEST_TIMEOUT 1
> -#define PXEBC_BOOT_REQUEST_RETRIES 4
> -
> -#define PXEBC_DHCP4_OVERLOAD_FILE 1
> -#define PXEBC_DHCP4_OVERLOAD_SERVER_NAME 2
> -
> -//
> -// The array index of the DHCP4 option tag interested
> -//
> -#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE_LEN 0
> -#define PXEBC_DHCP4_TAG_INDEX_VENDOR 1
> -#define PXEBC_DHCP4_TAG_INDEX_OVERLOAD 2
> -#define PXEBC_DHCP4_TAG_INDEX_MSG_TYPE 3
> -#define PXEBC_DHCP4_TAG_INDEX_SERVER_ID 4
> -#define PXEBC_DHCP4_TAG_INDEX_CLASS_ID 5
> -#define PXEBC_DHCP4_TAG_INDEX_BOOTFILE 6
> -#define PXEBC_DHCP4_TAG_INDEX_MAX 7
> -
> -//
> -// The type of DHCP OFFER, arranged by priority, PXE10 has the highest priority.
> -//
> -#define DHCP4_PACKET_TYPE_PXE10 0
> -#define DHCP4_PACKET_TYPE_WFM11A 1
> -#define DHCP4_PACKET_TYPE_BINL 2
> -#define DHCP4_PACKET_TYPE_DHCP_ONLY 3
> -#define DHCP4_PACKET_TYPE_BOOTP 4
> -#define DHCP4_PACKET_TYPE_MAX 5
> -
> -#define BIT(x) (1 << x)
> -#define CTRL(x) (0x1F & (x))
> -
> -//
> -// WfM11a options
> -//
> -#define MTFTP_VENDOR_OPTION_BIT_MAP (BIT
> (PXEBC_VENDOR_TAG_MTFTP_IP) | \
> - BIT (PXEBC_VENDOR_TAG_MTFTP_CPORT) | \
> - BIT (PXEBC_VENDOR_TAG_MTFTP_SPORT) | \
> - BIT (PXEBC_VENDOR_TAG_MTFTP_TIMEOUT) | \
> - BIT (PXEBC_VENDOR_TAG_MTFTP_DELAY))
> -//
> -// Discoverty options
> -//
> -#define DISCOVER_VENDOR_OPTION_BIT_MAP (BIT
> (PXEBC_VENDOR_TAG_DISCOVER_CTRL) | \
> - BIT (PXEBC_VENDOR_TAG_DISCOVER_MCAST) | \
> - BIT (PXEBC_VENDOR_TAG_BOOT_SERVERS) | \
> - BIT (PXEBC_VENDOR_TAG_BOOT_MENU) | \
> - BIT (PXEBC_VENDOR_TAG_MENU_PROMPT))
> -
> -#define IS_VALID_BOOT_PROMPT(x) \
> - ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_MENU_PROMPT)) == BIT
> (PXEBC_VENDOR_TAG_MENU_PROMPT))
> -
> -#define IS_VALID_BOOT_MENU(x) \
> - ((((x)[0]) & BIT (PXEBC_VENDOR_TAG_BOOT_MENU)) == BIT
> (PXEBC_VENDOR_TAG_BOOT_MENU))
> -
> -#define IS_VALID_MTFTP_VENDOR_OPTION(x) \
> - (((UINT32) ((x)[0]) & MTFTP_VENDOR_OPTION_BIT_MAP) ==
> MTFTP_VENDOR_OPTION_BIT_MAP)
> -
> -#define IS_VALID_DISCOVER_VENDOR_OPTION(x) (((UINT32) ((x)[0]) &
> DISCOVER_VENDOR_OPTION_BIT_MAP) != 0)
> -
> -#define IS_VALID_CREDENTIAL_VENDOR_OPTION(x) \
> - (((UINT32) ((x)[0]) & BIT (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES)) == BIT
> (PXEBC_VENDOR_TAG_CREDENTIAL_TYPES))
> -
> -#define IS_VALID_BOOTITEM_VENDOR_OPTION(x) \
> - (((UINT32) ((x)[PXEBC_VENDOR_TAG_BOOT_ITEM / 32]) & BIT
> (PXEBC_VENDOR_TAG_BOOT_ITEM % 32)) \
> - == BIT (PXEBC_VENDOR_TAG_BOOT_ITEM % 32))
> -
> -#define IS_DISABLE_BCAST_DISCOVER(x) (((x) & BIT (0)) == BIT (0))
> -#define IS_DISABLE_MCAST_DISCOVER(x) (((x) & BIT (1)) == BIT (1))
> -#define IS_ENABLE_USE_SERVER_LIST(x) (((x) & BIT (2)) == BIT (2))
> -#define IS_DISABLE_PROMPT_MENU(x) (((x) & BIT (3)) == BIT (3))
> -
> -#define SET_VENDOR_OPTION_BIT_MAP(x, y) (((x)[(y) / 32]) = (UINT32) ((x)[(y) /
> 32]) | BIT ((y) % 32))
> -
> -#pragma pack(1)
> -typedef struct {
> - UINT8 ParaList[135];
> -} PXEBC_DHCP4_OPTION_PARA;
> -
> -typedef struct {
> - UINT16 Size;
> -} PXEBC_DHCP4_OPTION_MAX_MESG_SIZE;
> -
> -typedef struct {
> - UINT8 Type;
> - UINT8 MajorVer;
> - UINT8 MinorVer;
> -} PXEBC_DHCP4_OPTION_UNDI;
> -
> -typedef struct {
> - UINT8 Type;
> -} PXEBC_DHCP4_OPTION_MESG;
> -
> -typedef struct {
> - UINT16 Type;
> -} PXEBC_DHCP4_OPTION_ARCH;
> -
> -#define DEFAULT_CLASS_ID_DATA "PXEClient:Arch:xxxxx:UNDI:003000"
> -#define DEFAULT_UNDI_TYPE 1
> -#define DEFAULT_UNDI_MAJOR 3
> -#define DEFAULT_UNDI_MINOR 0
> -
> -typedef struct {
> - UINT8 ClassIdentifier[10];
> - UINT8 ArchitecturePrefix[5];
> - UINT8 ArchitectureType[5];
> - UINT8 Lit3[1];
> - UINT8 InterfaceName[4];
> - UINT8 Lit4[1];
> - UINT8 UndiMajor[3];
> - UINT8 UndiMinor[3];
> -} PXEBC_DHCP4_OPTION_CLID;
> -
> -typedef struct {
> - UINT8 Type;
> - UINT8 Guid[16];
> -} PXEBC_DHCP4_OPTION_UUID;
> -
> -typedef struct {
> - UINT16 Type;
> - UINT16 Layer;
> -} PXEBC_OPTION_BOOT_ITEM;
> -
> -#pragma pack()
> -
> -typedef union {
> - PXEBC_DHCP4_OPTION_PARA *Para;
> - PXEBC_DHCP4_OPTION_UNDI *Undi;
> - PXEBC_DHCP4_OPTION_ARCH *Arch;
> - PXEBC_DHCP4_OPTION_CLID *Clid;
> - PXEBC_DHCP4_OPTION_UUID *Uuid;
> - PXEBC_DHCP4_OPTION_MESG *Mesg;
> - PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *MaxMesgSize;
> -} PXEBC_DHCP4_OPTION_ENTRY;
> -
> -typedef struct {
> - UINT16 Type;
> - UINT8 IpCnt;
> - EFI_IPv4_ADDRESS IpAddr[1];
> -} PXEBC_BOOT_SVR_ENTRY;
> -
> -typedef struct {
> - UINT16 Type;
> - UINT8 DescLen;
> - UINT8 DescStr[1];
> -} PXEBC_BOOT_MENU_ENTRY;
> -
> -typedef struct {
> - UINT8 Timeout;
> - UINT8 Prompt[1];
> -} PXEBC_MENU_PROMPT;
> -
> -typedef struct {
> - UINT32 BitMap[8];
> - EFI_IPv4_ADDRESS MtftpIp;
> - UINT16 MtftpCPort;
> - UINT16 MtftpSPort;
> - UINT8 MtftpTimeout;
> - UINT8 MtftpDelay;
> - UINT8 DiscoverCtrl;
> - EFI_IPv4_ADDRESS DiscoverMcastIp;
> - EFI_IPv4_ADDRESS McastIpBase;
> - UINT16 McastIpBlock;
> - UINT16 McastIpRange;
> - UINT16 BootSrvType;
> - UINT16 BootSrvLayer;
> - PXEBC_BOOT_SVR_ENTRY *BootSvr;
> - UINT8 BootSvrLen;
> - PXEBC_BOOT_MENU_ENTRY *BootMenu;
> - UINT8 BootMenuLen;
> - PXEBC_MENU_PROMPT *MenuPrompt;
> - UINT8 MenuPromptLen;
> - UINT32 *CredType;
> - UINT8 CredTypeLen;
> -} PXEBC_VENDOR_OPTION;
> -
> -#define PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE (OFFSET_OF
> (EFI_DHCP4_PACKET, Dhcp4) + PXEBC_DHCP4_MAX_PACKET_SIZE)
> -
> -typedef union {
> - EFI_DHCP4_PACKET Offer;
> - EFI_DHCP4_PACKET Ack;
> - UINT8 Buffer[PXEBC_CACHED_DHCP4_PACKET_MAX_SIZE];
> -} PXEBC_DHCP4_PACKET;
> -
> -typedef struct {
> - PXEBC_DHCP4_PACKET Packet;
> - BOOLEAN IsPxeOffer;
> - UINT8 OfferType;
> - EFI_DHCP4_PACKET_OPTION
> *Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_MAX];
> - PXEBC_VENDOR_OPTION PxeVendorOption;
> -} PXEBC_CACHED_DHCP4_PACKET;
> -
> -#define GET_NEXT_DHCP_OPTION(Opt) \
> - (EFI_DHCP4_PACKET_OPTION *) ((UINT8 *) (Opt) + sizeof
> (EFI_DHCP4_PACKET_OPTION) + (Opt)->Length - 1)
> -
> -#define GET_OPTION_BUFFER_LEN(Pkt) ((Pkt)->Length - sizeof
> (EFI_DHCP4_HEADER) - 4)
> -#define IS_PROXY_DHCP_OFFER(Offer) EFI_IP4_EQUAL (&((Offer)-
> >Dhcp4.Header.YourAddr), &mZeroIp4Addr)
> -
> -#define GET_NEXT_BOOT_SVR_ENTRY(Ent) \
> - (PXEBC_BOOT_SVR_ENTRY *) ((UINT8 *) Ent + sizeof (*(Ent)) + ((Ent)->IpCnt - 1)
> * sizeof (EFI_IPv4_ADDRESS))
> -
> -
> -/**
> - This function initialize the DHCP4 message instance.
> -
> - This function will pad each item of dhcp4 message packet.
> -
> - @param Seed Pointer to the message instance of the DHCP4 packet.
> - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance.
> -
> -**/
> -VOID
> -PxeBcInitSeedPacket (
> - IN EFI_DHCP4_PACKET *Seed,
> - IN EFI_UDP4_PROTOCOL *Udp4
> - );
> -
> -
> -/**
> - Parse the cached dhcp packet.
> -
> - @param CachedPacket Pointer to cached dhcp packet.
> -
> - @retval TRUE Succeed to parse and validation.
> - @retval FALSE Fail to parse or validation.
> -
> -**/
> -BOOLEAN
> -PxeBcParseCachedDhcpPacket (
> - IN PXEBC_CACHED_DHCP4_PACKET *CachedPacket
> - );
> -
> -/**
> - This function is to check the selected proxy offer (include BINL dhcp offer and
> - DHCP_ONLY offer ) and set the flag and copy the DHCP packets to the Pxe
> base code
> - mode structure.
> -
> - @param Private Pointer to PxeBc private data.
> -
> - @retval EFI_SUCCESS Operational successful.
> - @retval EFI_NO_RESPONSE Offer dhcp service failed.
> - @retval EFI_BUFFER_TOO_SMALL Failed to copy the packet to Pxe base
> code mode.
> -
> -**/
> -EFI_STATUS
> -PxeBcCheckSelectedOffer (
> - IN PXEBC_PRIVATE_DATA *Private
> - );
> -
> -
> -/**
> - Callback routine.
> -
> - EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4
> Protocol driver
> - to intercept events that occurred in the configuration process. This structure
> - provides advanced control of each state transition of the DHCP process. The
> - returned status code determines the behavior of the EFI DHCPv4 Protocol
> driver.
> - There are three possible returned values, which are described in the following
> - table.
> -
> - @param This Pointer to the EFI DHCPv4 Protocol instance that is
> used to
> - configure this callback function.
> - @param Context Pointer to the context that is initialized by
> - EFI_DHCP4_PROTOCOL.Configure().
> - @param CurrentState The current operational state of the EFI DHCPv4
> Protocol
> - driver.
> - @param Dhcp4Event The event that occurs in the current state, which
> usually means a
> - state transition.
> - @param Packet The DHCP packet that is going to be sent or already
> received.
> - @param NewPacket The packet that is used to replace the above
> Packet.
> -
> - @retval EFI_SUCCESS Tells the EFI DHCPv4 Protocol driver to continue
> the DHCP process.
> - @retval EFI_NOT_READY Only used in the Dhcp4Selecting state. The EFI
> DHCPv4 Protocol
> - driver will continue to wait for more DHCPOFFER packets until
> the retry
> - timeout expires.
> - @retval EFI_ABORTED Tells the EFI DHCPv4 Protocol driver to abort the
> current process and
> - return to the Dhcp4Init or Dhcp4InitReboot state.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -PxeBcDhcpCallBack (
> - IN EFI_DHCP4_PROTOCOL * This,
> - IN VOID *Context,
> - IN EFI_DHCP4_STATE CurrentState,
> - IN EFI_DHCP4_EVENT Dhcp4Event,
> - IN EFI_DHCP4_PACKET * Packet OPTIONAL,
> - OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL
> - );
> -
> -/**
> - Switch the Ip4 policy to static.
> -
> - @param[in] Private The pointer to PXEBC_PRIVATE_DATA.
> -
> - @retval EFI_SUCCESS The policy is already configured to static.
> - @retval Others Other error as indicated..
> -
> -**/
> -EFI_STATUS
> -PxeBcSetIp4Policy (
> - IN PXEBC_PRIVATE_DATA *Private
> - );
> -
> -/**
> - Discover the boot of service and initialize the vendor option if exists.
> -
> - @param Private Pointer to PxeBc private data.
> - @param Type PxeBc option boot item type
> - @param Layer PxeBc option boot item layer
> - @param UseBis Use BIS or not
> - @param DestIp Ip address for server
> - @param IpCount The total count of the server ip address
> - @param SrvList Server list
> - @param IsDiscv Discover the vendor or not
> - @param Reply The dhcp4 packet of Pxe reply
> -
> - @retval EFI_SUCCESS Operation succeeds.
> - @retval EFI_OUT_OF_RESOURCES Allocate memory pool failed.
> - @retval EFI_NOT_FOUND There is no vendor option exists.
> - @retval EFI_TIMEOUT Send Pxe Discover time out.
> -
> -**/
> -EFI_STATUS
> -PxeBcDiscvBootService (
> - IN PXEBC_PRIVATE_DATA * Private,
> - IN UINT16 Type,
> - IN UINT16 *Layer,
> - IN BOOLEAN UseBis,
> - IN EFI_IP_ADDRESS * DestIp,
> - IN UINT16 IpCount,
> - IN EFI_PXE_BASE_CODE_SRVLIST * SrvList,
> - IN BOOLEAN IsDiscv,
> - OUT EFI_DHCP4_PACKET * Reply OPTIONAL
> - );
> -
> -
> -/**
> - Initialize the DHCP options and build the option list.
> -
> - @param Private Pointer to PxeBc private data.
> - @param OptList Pointer to a DHCP option list.
> -
> - @param IsDhcpDiscover Discover dhcp option or not.
> -
> - @return The index item number of the option list.
> -
> -**/
> -UINT32
> -PxeBcBuildDhcpOptions (
> - IN PXEBC_PRIVATE_DATA *Private,
> - IN EFI_DHCP4_PACKET_OPTION **OptList,
> - IN BOOLEAN IsDhcpDiscover
> - );
> -
> -
> -/**
> - Create the boot options.
> -
> - @param OptList Pointer to the list of the options
> - @param Type the type of option
> - @param Layer the layer of the boot options
> - @param OptLen length of opotion
> -
> -**/
> -VOID
> -PxeBcCreateBootOptions (
> - IN EFI_DHCP4_PACKET_OPTION *OptList,
> - IN UINT16 Type,
> - IN UINT16 *Layer,
> - OUT UINT32 *OptLen
> - );
> -
> -
> -/**
> - Parse interested dhcp options.
> -
> - @param Buffer Pointer to the dhcp options packet.
> - @param Length The length of the dhcp options.
> - @param OptTag The option OpCode.
> -
> - @return NULL if the buffer length is 0 and OpCode is not
> - DHCP4_TAG_EOP, or the pointer to the buffer.
> -
> -**/
> -EFI_DHCP4_PACKET_OPTION *
> -PxeBcParseExtendOptions (
> - IN UINT8 *Buffer,
> - IN UINT32 Length,
> - IN UINT8 OptTag
> - );
> -
> -
> -/**
> - This function is to parse and check vendor options.
> -
> - @param Dhcp4Option Pointer to dhcp options
> - @param VendorOption Pointer to vendor options
> -
> - @return TRUE if valid for vendor options, or FALSE.
> -
> -**/
> -BOOLEAN
> -PxeBcParseVendorOptions (
> - IN EFI_DHCP4_PACKET_OPTION *Dhcp4Option,
> - IN PXEBC_VENDOR_OPTION *VendorOption
> - );
> -
> -
> -/**
> - Choose the boot prompt.
> -
> - @param Private Pointer to PxeBc private data.
> -
> - @retval EFI_SUCCESS Select boot prompt done.
> - @retval EFI_TIMEOUT Select boot prompt time out.
> - @retval EFI_NOT_FOUND The proxy offer is not Pxe10.
> - @retval EFI_ABORTED User cancel the operation.
> - @retval EFI_NOT_READY Read the input key from the keybroad has not
> finish.
> -
> -**/
> -EFI_STATUS
> -PxeBcSelectBootPrompt (
> - IN PXEBC_PRIVATE_DATA *Private
> - );
> -
> -
> -/**
> - Select the boot menu.
> -
> - @param Private Pointer to PxeBc private data.
> - @param Type The type of the menu.
> - @param UseDefaultItem Use default item or not.
> -
> - @retval EFI_ABORTED User cancel operation.
> - @retval EFI_SUCCESS Select the boot menu success.
> - @retval EFI_NOT_READY Read the input key from the keybroad has not finish.
> -
> -**/
> -EFI_STATUS
> -PxeBcSelectBootMenu (
> - IN PXEBC_PRIVATE_DATA *Private,
> - OUT UINT16 *Type,
> - IN BOOLEAN UseDefaultItem
> - );
> -
> -#endif
> -
> diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h
> b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h
> deleted file mode 100644
> index b7bf069dd637..000000000000
> --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.h
> +++ /dev/null
> @@ -1,102 +0,0 @@
> -/** @file
> -
> -Copyright (c) 2007 - 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.
> -
> -**/
> -
> -#ifndef __EFI_PXEBC_DRIVER_H__
> -#define __EFI_PXEBC_DRIVER_H__
> -
> -/**
> - Test to see if this driver supports ControllerHandle. This service
> - is called by the EFI boot service ConnectController(). In
> - order to make drivers as small as possible, there are a few calling
> - restrictions for this service. ConnectController() must
> - follow these calling restrictions. If any other agent wishes to call
> - Supported() it must also follow these calling restrictions.
> - PxeBc requires DHCP4 and MTFTP4 protocols.
> -
> - @param This Protocol instance pointer.
> - @param ControllerHandle Handle of device to test
> - @param RemainingDevicePath Optional parameter use to pick a specific child
> - device to start.
> -
> - @retval EFI_SUCCESS This driver supports this device
> - @retval EFI_ALREADY_STARTED This driver is already running on this device
> - @retval other This driver does not support this device
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -PxeBcDriverBindingSupported (
> - IN EFI_DRIVER_BINDING_PROTOCOL * This,
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL
> - );
> -
> -/**
> - Start this driver on ControllerHandle. This service is called by the
> - EFI boot service ConnectController(). In order to make
> - drivers as small as possible, there are a few calling restrictions for
> - this service. ConnectController() must follow these
> - calling restrictions. If any other agent wishes to call Start() it
> - must also follow these calling restrictions.
> -
> - @param This Protocol instance pointer.
> - @param ControllerHandle Handle of device to bind driver to
> - @param RemainingDevicePath Optional parameter use to pick a specific child
> - device to start.
> -
> - @retval EFI_SUCCESS This driver is added to ControllerHandle
> - @retval EFI_ALREADY_STARTED This driver is already running on
> ControllerHandle
> - @retval other This driver does not support this device
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -PxeBcDriverBindingStart (
> - IN EFI_DRIVER_BINDING_PROTOCOL * This,
> - IN EFI_HANDLE ControllerHandle,
> - IN EFI_DEVICE_PATH_PROTOCOL * RemainingDevicePath OPTIONAL
> - );
> -
> -/**
> - Stop this driver on ControllerHandle. This service is called by the
> - EFI boot service DisconnectController(). In order to
> - make drivers as small as possible, there are a few calling
> - restrictions for this service. DisconnectController()
> - must follow these calling restrictions. If any other agent wishes
> - to call Stop() it must also follow these calling restrictions.
> -
> - @param This Protocol instance pointer.
> - @param ControllerHandle Handle of device to stop driver on
> - @param NumberOfChildren Number of Handles in ChildHandleBuffer. If
> number of
> - children is zero stop the entire bus driver.
> - @param ChildHandleBuffer List of Child Handles to Stop.
> -
> - @retval EFI_SUCCESS This driver is removed ControllerHandle
> - @retval other This driver was not removed from this device
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -PxeBcDriverBindingStop (
> - IN EFI_DRIVER_BINDING_PROTOCOL *This,
> - IN EFI_HANDLE ControllerHandle,
> - IN UINTN NumberOfChildren,
> - IN EFI_HANDLE *ChildHandleBuffer
> - );
> -
> -extern EFI_COMPONENT_NAME2_PROTOCOL gPxeBcComponentName2;
> -extern EFI_COMPONENT_NAME_PROTOCOL gPxeBcComponentName;
> -extern EFI_DRIVER_BINDING_PROTOCOL gPxeBcDriverBinding;
> -
> -#endif
> -
> diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h
> b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h
> deleted file mode 100644
> index e96b6f2c5d14..000000000000
> --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h
> +++ /dev/null
> @@ -1,189 +0,0 @@
> -/** @file
> -
> -Copyright (c) 2007 - 2016, 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.
> -
> -**/
> -
> -#ifndef __EFI_PXEBC_IMPL_H__
> -#define __EFI_PXEBC_IMPL_H__
> -
> -
> -typedef struct _PXEBC_PRIVATE_DATA PXEBC_PRIVATE_DATA;
> -
> -#include <Uefi.h>
> -
> -#include <Guid/SmBios.h>
> -#include <IndustryStandard/SmBios.h>
> -#include <IndustryStandard/Dhcp.h>
> -#include <Protocol/Dhcp4.h>
> -#include <Protocol/PxeBaseCode.h>
> -#include <Protocol/Mtftp4.h>
> -#include <Protocol/Udp4.h>
> -#include <Protocol/LoadFile.h>
> -#include <Protocol/NetworkInterfaceIdentifier.h>
> -#include <Protocol/PxeBaseCodeCallBack.h>
> -#include <Protocol/Arp.h>
> -#include <Protocol/Ip4.h>
> -#include <Protocol/Ip4Config2.h>
> -
> -#include <Library/DebugLib.h>
> -#include <Library/DevicePathLib.h>
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/MemoryAllocationLib.h>
> -#include <Library/UefiDriverEntryPoint.h>
> -#include <Library/UefiBootServicesTableLib.h>
> -#include <Library/UefiLib.h>
> -#include <Library/BaseLib.h>
> -#include <Library/NetLib.h>
> -#include <Library/DpcLib.h>
> -#include <Library/PcdLib.h>
> -
> -#include "PxeBcDriver.h"
> -#include "PxeBcDhcp.h"
> -#include "PxeBcMtftp.h"
> -#include "PxeBcSupport.h"
> -
> -#define PXEBC_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('P', 'X', 'E', 'P')
> -#define PXEBC_MTFTP_TIMEOUT 4
> -#define PXEBC_MTFTP_RETRIES 6
> -#define PXEBC_DEFAULT_UDP_OVERHEAD_SIZE 8
> -#define PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE 4
> -#define PXEBC_DEFAULT_PACKET_SIZE 1480
> -#define PXEBC_DEFAULT_LIFETIME 50000 // 50ms, unit is microsecond
> -#define PXEBC_CHECK_MEDIA_WAITING_TIME
> EFI_TIMER_PERIOD_SECONDS(20)
> -
> -struct _PXEBC_PRIVATE_DATA {
> - UINT32 Signature;
> - EFI_HANDLE Controller;
> - EFI_HANDLE Image;
> - EFI_HANDLE ArpChild;
> - EFI_HANDLE Dhcp4Child;
> - EFI_HANDLE Ip4Child;
> - EFI_HANDLE Mtftp4Child;
> - EFI_HANDLE Udp4ReadChild;
> - EFI_HANDLE Udp4WriteChild;
> -
> - EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *Nii;
> -
> - EFI_PXE_BASE_CODE_PROTOCOL PxeBc;
> - EFI_LOAD_FILE_PROTOCOL LoadFile;
> - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL LoadFileCallback;
> - EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *PxeBcCallback;
> - EFI_ARP_PROTOCOL *Arp;
> - EFI_DHCP4_PROTOCOL *Dhcp4;
> - EFI_IP4_PROTOCOL *Ip4;
> - EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
> - EFI_IP4_CONFIG_DATA Ip4ConfigData;
> - EFI_MTFTP4_PROTOCOL *Mtftp4;
> - EFI_UDP4_PROTOCOL *Udp4Read;
> - EFI_UDP4_PROTOCOL *Udp4Write;
> - UINT16 CurrentUdpSrcPort;
> - EFI_UDP4_CONFIG_DATA Udp4CfgData;
> -
> -
> - EFI_PXE_BASE_CODE_MODE Mode;
> - EFI_PXE_BASE_CODE_FUNCTION Function;
> -
> - CHAR8 *BootFileName;
> -
> - EFI_IP_ADDRESS StationIp;
> - EFI_IP_ADDRESS SubnetMask;
> - EFI_IP_ADDRESS GatewayIp;
> - EFI_IP_ADDRESS ServerIp;
> - BOOLEAN AddressIsOk;
> - UINT32 Ip4MaxPacketSize;
> - UINTN BlockSize;
> - UINTN FileSize;
> -
> - UINT8 OptionBuffer[PXEBC_DHCP4_MAX_OPTION_SIZE];
> - EFI_DHCP4_PACKET SeedPacket;
> - EFI_MAC_ADDRESS Mac;
> - UINT8 MacLen;
> -
> - BOOLEAN SortOffers;
> - BOOLEAN GotProxyOffer;
> - UINT32 NumOffers;
> - UINT32 SelectedOffer;
> - UINT32 ProxyOfferType;
> -
> - //
> - // Cached packets as complements of pxe mode data
> - //
> - PXEBC_CACHED_DHCP4_PACKET ProxyOffer;
> - PXEBC_CACHED_DHCP4_PACKET Dhcp4Ack;
> - PXEBC_CACHED_DHCP4_PACKET PxeReply;
> - PXEBC_CACHED_DHCP4_PACKET
> Dhcp4Offers[PXEBC_MAX_OFFER_NUM];
> -
> - //
> - // Arrays for different types of offers:
> - // ServerCount records the count of the servers we got the offers,
> - // OfferIndex records the index of the offer sent by the server indexed by
> ServerCount.
> - //
> - UINT32 ServerCount[DHCP4_PACKET_TYPE_MAX];
> - UINT32
> OfferIndex[DHCP4_PACKET_TYPE_MAX][PXEBC_MAX_OFFER_NUM];
> - UINT32 BootpIndex;
> - UINT32 ProxyIndex[DHCP4_PACKET_TYPE_MAX];
> - UINT32 BinlIndex[PXEBC_MAX_OFFER_NUM];
> -
> - EFI_EVENT GetArpCacheEvent;
> - //
> - // token and event used to get ICMP error data from IP
> - //
> - EFI_IP4_COMPLETION_TOKEN IcmpErrorRcvToken;
> -};
> -
> -#define PXEBC_PRIVATE_DATA_FROM_PXEBC(a) CR (a,
> PXEBC_PRIVATE_DATA, PxeBc, PXEBC_PRIVATE_DATA_SIGNATURE)
> -
> -#define PXEBC_PRIVATE_DATA_FROM_LOADFILE(a) CR (a,
> PXEBC_PRIVATE_DATA, LoadFile, PXEBC_PRIVATE_DATA_SIGNATURE)
> -
> -#define PXEBC_PRIVATE_DATA_FROM_PXEBCCALLBACK(a) CR (a,
> PXEBC_PRIVATE_DATA, PxeBcCallback, PXEBC_PRIVATE_DATA_SIGNATURE)
> -
> -extern EFI_PXE_BASE_CODE_PROTOCOL mPxeBcProtocolTemplate;
> -extern EFI_LOAD_FILE_PROTOCOL mLoadFileProtocolTemplate;
> -
> -/**
> - Causes the driver to load a specified file.
> -
> - @param This Protocol instance pointer.
> - @param FilePath The device specific path of the file to load.
> - @param BootPolicy If TRUE, indicates that the request originates from
> the
> - boot manager is attempting to load FilePath as a boot
> - selection. If FALSE, then FilePath must match as exact file
> - to be loaded.
> - @param BufferSize On input the size of Buffer in bytes. On output with
> a return
> - code of EFI_SUCCESS, the amount of data transferred to
> - Buffer. On output with a return code of
> EFI_BUFFER_TOO_SMALL,
> - the size of Buffer required to retrieve the requested file.
> - @param Buffer The memory buffer to transfer the file to. IF Buffer is
> NULL,
> - then no the size of the requested file is returned in
> - BufferSize.
> -
> - @retval EFI_SUCCESS The file was loaded.
> - @retval EFI_UNSUPPORTED The device does not support the provided
> BootPolicy
> - @retval EFI_INVALID_PARAMETER FilePath is not a valid device path, or
> - BufferSize is NULL.
> - @retval EFI_NO_MEDIA No medium was present to load the file.
> - @retval EFI_DEVICE_ERROR The file was not loaded due to a device
> error.
> - @retval EFI_NO_RESPONSE The remote system did not respond.
> - @retval EFI_NOT_FOUND The file was not found.
> - @retval EFI_ABORTED The file load process was manually cancelled.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EfiPxeLoadFile (
> - IN EFI_LOAD_FILE_PROTOCOL * This,
> - IN EFI_DEVICE_PATH_PROTOCOL * FilePath,
> - IN BOOLEAN BootPolicy,
> - IN OUT UINTN *BufferSize,
> - IN VOID *Buffer OPTIONAL
> - );
> -
> -#endif
> diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h
> b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h
> deleted file mode 100644
> index 903dd4fbb69a..000000000000
> --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.h
> +++ /dev/null
> @@ -1,137 +0,0 @@
> -/** @file
> - Mtftp routines for PxeBc.
> -
> -Copyright (c) 2007 - 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.
> -
> -**/
> -
> -#ifndef __EFI_PXEBC_MTFTP_H__
> -#define __EFI_PXEBC_MTFTP_H__
> -
> -#define PXE_MTFTP_OPTION_BLKSIZE_INDEX 0
> -#define PXE_MTFTP_OPTION_TIMEOUT_INDEX 1
> -#define PXE_MTFTP_OPTION_TSIZE_INDEX 2
> -#define PXE_MTFTP_OPTION_MULTICAST_INDEX 3
> -#define PXE_MTFTP_OPTION_MAXIMUM_INDEX 4
> -
> -#define PXE_MTFTP_ERROR_STRING_LENGTH 127
> -#define PXE_MTFTP_OPTBUF_MAXNUM_INDEX 128
> -
> -
> -/**
> - This function is to get size of a file by Tftp.
> -
> - @param Private Pointer to PxeBc private data
> - @param Config Pointer to Mtftp configuration data
> - @param Filename Pointer to file name
> - @param BlockSize Pointer to block size
> - @param BufferSize Pointer to buffer size
> -
> - @retval EFI_SUCCESS Get the size of file success
> - @retval EFI_NOT_FOUND Parse the tftp ptions failed.
> - @retval EFI_DEVICE_ERROR The network device encountered an error during
> this operation.
> - @retval Other Has not get the size of the file.
> -
> -**/
> -EFI_STATUS
> -PxeBcTftpGetFileSize (
> - IN PXEBC_PRIVATE_DATA *Private,
> - IN EFI_MTFTP4_CONFIG_DATA *Config,
> - IN UINT8 *Filename,
> - IN UINTN *BlockSize,
> - IN OUT UINT64 *BufferSize
> - );
> -
> -
> -/**
> - This function is to get data of a file by Tftp.
> -
> - @param Private Pointer to PxeBc private data
> - @param Config Pointer to Mtftp configuration data
> - @param Filename Pointer to file name
> - @param BlockSize Pointer to block size
> - @param BufferPtr Pointer to buffer
> - @param BufferSize Pointer to buffer size
> - @param DontUseBuffer Indicate whether with a receive buffer
> -
> - @retval EFI_SUCCESS Read the data success from the special file.
> - @retval EFI_DEVICE_ERROR The network device encountered an error during
> this operation.
> - @retval other Read data from file failed.
> -
> -**/
> -EFI_STATUS
> -PxeBcTftpReadFile (
> - IN PXEBC_PRIVATE_DATA *Private,
> - IN EFI_MTFTP4_CONFIG_DATA *Config,
> - IN UINT8 *Filename,
> - IN UINTN *BlockSize,
> - IN UINT8 *BufferPtr,
> - IN OUT UINT64 *BufferSize,
> - IN BOOLEAN DontUseBuffer
> - );
> -
> -
> -/**
> - This function is put data of a file by Tftp.
> -
> - @param Private Pointer to PxeBc private data
> - @param Config Pointer to Mtftp configuration data
> - @param Filename Pointer to file name
> - @param Overwrite Indicate whether with overwrite attribute
> - @param BlockSize Pointer to block size
> - @param BufferPtr Pointer to buffer
> - @param BufferSize Pointer to buffer size
> -
> - @retval EFI_SUCCESS Write the data success into the special file.
> - @retval EFI_DEVICE_ERROR The network device encountered an error during
> this operation.
> - @retval other Write data into file failed.
> -
> -**/
> -EFI_STATUS
> -PxeBcTftpWriteFile (
> - IN PXEBC_PRIVATE_DATA *Private,
> - IN EFI_MTFTP4_CONFIG_DATA *Config,
> - IN UINT8 *Filename,
> - IN BOOLEAN Overwrite,
> - IN UINTN *BlockSize,
> - IN UINT8 *BufferPtr,
> - IN OUT UINT64 *BufferSize
> - );
> -
> -
> -/**
> - This function is to get data(file) from a directory(may be a server) by Tftp.
> -
> - @param Private Pointer to PxeBc private data.
> - @param Config Pointer to Mtftp configuration data.
> - @param Filename Pointer to file name.
> - @param BlockSize Pointer to block size.
> - @param BufferPtr Pointer to buffer.
> - @param BufferSize Pointer to buffer size.
> - @param DontUseBuffer Indicate whether with a receive buffer.
> -
> - @retval EFI_SUCCES Get the data from the file included in directory
> success.
> - @retval EFI_DEVICE_ERROR The network device encountered an error during
> this operation.
> - @retval other Operation failed.
> -
> -**/
> -EFI_STATUS
> -PxeBcTftpReadDirectory (
> - IN PXEBC_PRIVATE_DATA *Private,
> - IN EFI_MTFTP4_CONFIG_DATA *Config,
> - IN UINT8 *Filename,
> - IN UINTN *BlockSize,
> - IN UINT8 *BufferPtr,
> - IN OUT UINT64 *BufferSize,
> - IN BOOLEAN DontUseBuffer
> - );
> -
> -#endif
> -
> diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h
> b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h
> deleted file mode 100644
> index a28c9740c171..000000000000
> --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcSupport.h
> +++ /dev/null
> @@ -1,134 +0,0 @@
> -/** @file
> - Support routines for PxeBc.
> -Copyright (c) 2007 - 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.
> -
> -**/
> -
> -#ifndef __EFI_PXEBC_SUPPORT_H__
> -#define __EFI_PXEBC_SUPPORT_H__
> -
> -
> -/**
> - The common notify function associated with various PxeBc events.
> -
> - @param Event The event signaled.
> - @param Context The context.
> -
> -**/
> -VOID
> -EFIAPI
> -PxeBcCommonNotify (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - );
> -
> -
> -/**
> - This function initialize(or configure) the Udp4Write instance.
> -
> - @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance.
> - @param StationIp Pointer to the station ip address.
> - @param SubnetMask Pointer to the subnetmask of the station ip address.
> - @param Gateway Pointer to the gateway ip address.
> - @param SrcPort Pointer to the srouce port of the station.
> - @param Ttl The time to live field of the IP header.
> - @param ToS The type of service field of the IP header.
> -
> - @retval EFI_SUCCESS The configuration settings were set, changed, or
> reset successfully.
> - @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 following conditions are
> TRUE:
> - @retval EFI_ALREADY_STARTED The EFI UDPv4 Protocol instance is already
> started/configured
> - and must be stopped/reset before it can be reconfigured.
> - @retval EFI_ACCESS_DENIED UdpConfigData. AllowDuplicatePort is FALSE
> - and UdpConfigData.StationPort is already used by
> - other instance.
> - @retval EFI_OUT_OF_RESOURCES The EFI UDPv4 Protocol driver cannot
> allocate memory for this
> - EFI UDPv4 Protocol instance.
> - @retval EFI_DEVICE_ERROR An unexpected network or system error
> occurred and this instance
> - was not opened.
> - @retval Others Please examine the function Udp4->Routes(Udp4,
> FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway) returns.
> -
> -**/
> -EFI_STATUS
> -PxeBcConfigureUdpWriteInstance (
> - IN EFI_UDP4_PROTOCOL *Udp4,
> - IN EFI_IPv4_ADDRESS *StationIp,
> - IN EFI_IPv4_ADDRESS *SubnetMask,
> - IN EFI_IPv4_ADDRESS *Gateway,
> - IN OUT UINT16 *SrcPort,
> - IN UINT8 Ttl,
> - IN UINT8 ToS
> - );
> -
> -
> -/**
> - This function is to display the IPv4 address.
> -
> - @param[in] Ip The pointer to the IPv4 address.
> -
> -**/
> -VOID
> -PxeBcShowIp4Addr (
> - IN EFI_IPv4_ADDRESS *Ip
> - );
> -
> -
> -/**
> - Convert number to ASCII value.
> -
> - @param Number Numeric value to convert to decimal ASCII value.
> - @param Buffer Buffer to place ASCII version of the Number.
> - @param Length Length of Buffer.
> -
> -**/
> -VOID
> -CvtNum (
> - IN UINTN Number,
> - IN UINT8 *Buffer,
> - IN UINTN Length
> - );
> -
> -
> -/**
> - Convert unsigned int number to decimal number.
> -
> - @param Number The unsigned int number will be converted.
> - @param Buffer Pointer to the buffer to store the decimal number after
> transform.
> - @param[in] BufferSize The maxsize of the buffer.
> -
> - @return the length of the number after transform.
> -
> -**/
> -UINTN
> -UtoA10 (
> - IN UINTN Number,
> - IN CHAR8 *Buffer,
> - IN UINTN BufferSize
> -
> - );
> -
> -
> -/**
> - Convert ASCII numeric string to a UINTN value.
> -
> - @param Buffer Pointer to the 8-byte unsigned int value.
> -
> - @return UINTN value of the ASCII string.
> -
> -**/
> -UINT64
> -AtoU64 (
> - IN UINT8 *Buffer
> - );
> -
> -
> -#endif
> -
> diff --git
> a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni
> b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni
> deleted file mode 100644
> index e97c3cadd973..000000000000
> --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxe.uni
> +++ /dev/null
> @@ -1,25 +0,0 @@
> -// /** @file
> -// This module produces EFI Preboot Execution Environment (PXE) Base Code
> Protocol.
> -//
> -// This module produces EFI PXE Base Code Protocol upon EFI MMP Protocl and
> IPv4
> -// network stack, used to control PXE-compatible devices. It produces EFI Load
> File
> -// Protocol to provide one clean way to otain control from the boot manager if
> the
> -// boot patch is from the remote device.
> -//
> -// Copyright (c) 2007 - 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
> Preboot Execution Environment (PXE) Base Code Protocol"
> -
> -#string STR_MODULE_DESCRIPTION #language en-US "This module
> produces EFI PXE Base Code Protocol upon the EFI MMP Protocol and the IPv4
> network stack, and is used to control PXE-compatible devices. It produces the
> EFI Load File Protocol to provide a clean method to obtain control from the
> boot manager if the boot patch is from the remote device."
> -
> diff --git
> a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni
> b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni
> deleted file mode 100644
> index 2c1bda1a8bd2..000000000000
> ---
> a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxe4BcDxeExtra.uni
> +++ /dev/null
> @@ -1,20 +0,0 @@
> -// /** @file
> -// UefiPxe4BcDxe 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
> -"UEFI PXE Base Code DXE Driver"
> -
> -
> diff --git a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
> b/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
> deleted file mode 100644
> index 042401992945..000000000000
> --- a/MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
> +++ /dev/null
> @@ -1,102 +0,0 @@
> -## @file
> -# This module produces EFI Preboot Execution Environment (PXE) Base Code
> Protocol.
> -#
> -# This module produces EFI PXE Base Code Protocol upon EFI MMP Protocl and
> IPv4
> -# network stack, used to control PXE-compatible devices. It produces EFI Load
> File
> -# Protocol to provide one clean way to otain control from the boot manager if
> the
> -# boot patch is from the remote device. This driver only supports IPv4 network
> stack.
> -#
> -# Notes:
> -# 1) This driver can't co-work with the UefiPxeBcDxe driver in NetworkPkg.
> -# 2) This driver might have some issues that have been fixed in the
> UefiPxeBcDxe
> -# driver in NetworkPkg.
> -# 3) This driver supports fewer features than the UefiPxeBcDxe driver in
> NetworkPkg
> -# (e.g. IPv6, MTFTP windowsize).
> -# 4) UefiPxeBcDxe driver in NetworkPkg is recommended for use instead of this
> one even
> -# though both of them can be used.
> -#
> -# Copyright (c) 2007 - 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 = UefiPxe4BcDxe
> - MODULE_UNI_FILE = UefiPxe4BcDxe.uni
> - FILE_GUID = 3B1DEAB5-C75D-442e-9238-8E2FFB62B0BB
> - MODULE_TYPE = UEFI_DRIVER
> - VERSION_STRING = 1.0
> - ENTRY_POINT = PxeBcDriverEntryPoint
> - UNLOAD_IMAGE = NetLibDefaultUnload
> -
> -#
> -# The following information is for reference only and not required by the build
> tools.
> -#
> -# VALID_ARCHITECTURES = IA32 X64
> -#
> -# DRIVER_BINDING = gPxeBcDriverBinding
> -# COMPONENT_NAME = gPxeBcComponentName
> -# COMPONENT_NAME2 = gPxeBcComponentName2
> -#
> -
> -[Sources]
> - PxeBcMtftp.c
> - PxeBcSupport.h
> - PxeBcSupport.c
> - PxeBcDriver.c
> - PxeBcDhcp.h
> - ComponentName.c
> - PxeBcImpl.c
> - PxeBcImpl.h
> - PxeBcDhcp.c
> - PxeBcMtftp.h
> - PxeBcDriver.h
> -
> -
> -[Packages]
> - MdePkg/MdePkg.dec
> - MdeModulePkg/MdeModulePkg.dec
> -
> -[LibraryClasses]
> - BaseLib
> - UefiLib
> - UefiBootServicesTableLib
> - UefiDriverEntryPoint
> - BaseMemoryLib
> - MemoryAllocationLib
> - DebugLib
> - NetLib
> - DpcLib
> - PcdLib
> -
> -[Protocols]
> - gEfiPxeBaseCodeCallbackProtocolGuid ## SOMETIMES_PRODUCES
> - gEfiPxeBaseCodeProtocolGuid ## BY_START
> - gEfiLoadFileProtocolGuid ## BY_START
> - gEfiNetworkInterfaceIdentifierProtocolGuid_31 ## SOMETIMES_CONSUMES
> - gEfiArpServiceBindingProtocolGuid ## TO_START
> - gEfiArpProtocolGuid ## TO_START
> - gEfiMtftp4ServiceBindingProtocolGuid ## TO_START
> - gEfiMtftp4ProtocolGuid ## TO_START
> - gEfiUdp4ServiceBindingProtocolGuid ## TO_START
> - gEfiUdp4ProtocolGuid ## TO_START
> - gEfiDhcp4ServiceBindingProtocolGuid ## TO_START
> - gEfiDhcp4ProtocolGuid ## TO_START
> - gEfiIp4ServiceBindingProtocolGuid ## TO_START
> - gEfiIp4ProtocolGuid ## TO_START
> - gEfiIp4Config2ProtocolGuid ## TO_START
> -
> -[Pcd]
> - gEfiMdeModulePkgTokenSpaceGuid.PcdTftpBlockSize ##
> SOMETIMES_CONSUMES
> -
> -[UserExtensions.TianoCore."ExtraFiles"]
> - UefiPxe4BcDxeExtra.uni
> --
> 2.19.1.windows.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 6/6] NetworkPkg: Remove some clarification from UefiPxeBcDxe.inf
2018-12-20 1:41 [PATCH v2 0/6] Delete TCP, PXE, iSCSI driver in MdeModulePkg Siyuan Fu
` (4 preceding siblings ...)
2018-12-20 1:41 ` [PATCH v2 5/6] MdeModulePkg: Delete UefiPxeBcDxe in MdeModulePkg Siyuan Fu
@ 2018-12-20 1:41 ` Siyuan Fu
5 siblings, 0 replies; 12+ messages in thread
From: Siyuan Fu @ 2018-12-20 1:41 UTC (permalink / raw)
To: edk2-devel; +Cc: Jiaxin Wu
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1278
This patch is to remove the clarification about usage/difference between
those drivers in MdeModulePkg and NetworkPkg, since the MdeModulePkg one
have been deleted.
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.
NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf | 6 ------
1 file changed, 6 deletions(-)
diff --git a/NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf b/NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf
index 130a5456e2c1..63430711e71b 100644
--- a/NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf
+++ b/NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf
@@ -5,12 +5,6 @@
# PXE-compatible device for network access or booting. This driver supports
# both IPv4 and IPv6 network stack.
#
-# Notes:
-# 1) This driver can't co-work with the UefiPxeBcDxe driver in MdeModulePkg.
-# 2) This driver includes more bug fixes and supports more features (e.g. IPv6,
-# MTFTP windowsize) than the UefiPxeBcDxe driver in MdeModulePkg. So, we
-# recommend using this driver even though both of them can be used.
-#
# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
#
# This program and the accompanying materials
--
2.19.1.windows.1
^ permalink raw reply related [flat|nested] 12+ messages in thread