+++ /dev/null
-/** @file\r
- PxeBc MTFTP functions.\r
-\r
-Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "PxeBcImpl.h"\r
-\r
-CHAR8 *mMtftpOptions[PXE_MTFTP_OPTION_MAXIMUM_INDEX] = {\r
- "blksize",\r
- "timeout",\r
- "tsize",\r
- "multicast"\r
-};\r
-\r
-\r
-/**\r
- This is a callback function when packets received/transmitted in Mtftp driver.\r
-\r
- A callback function that is provided by the caller to intercept\r
- the EFI_MTFTP4_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the\r
- EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept\r
- EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to\r
- EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().\r
-\r
- @param This Pointer to Mtftp protocol instance\r
- @param Token Pointer to Mtftp token\r
- @param PacketLen Length of Mtftp packet\r
- @param Packet Pointer to Mtftp packet\r
-\r
- @retval EFI_SUCCESS Operation sucess\r
- @retval EFI_ABORTED Abort transfer process\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PxeBcCheckPacket (\r
- IN EFI_MTFTP4_PROTOCOL *This,\r
- IN EFI_MTFTP4_TOKEN *Token,\r
- IN UINT16 PacketLen,\r
- IN EFI_MTFTP4_PACKET *Packet\r
- )\r
-{\r
- PXEBC_PRIVATE_DATA *Private;\r
- EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback;\r
- EFI_STATUS Status;\r
-\r
- Private = (PXEBC_PRIVATE_DATA *) Token->Context;\r
- Callback = Private->PxeBcCallback;\r
- Status = EFI_SUCCESS;\r
-\r
- if (Packet->OpCode == EFI_MTFTP4_OPCODE_ERROR) {\r
- Private->Mode.TftpErrorReceived = TRUE;\r
- Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
- AsciiStrnCpyS (Private->Mode.TftpError.ErrorString, PXE_MTFTP_ERROR_STRING_LENGTH, (CHAR8 *) Packet->Error.ErrorMessage, PXE_MTFTP_ERROR_STRING_LENGTH - 1);\r
- Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';\r
- }\r
-\r
- if (Callback != NULL) {\r
-\r
- Status = Callback->Callback (\r
- Callback,\r
- Private->Function,\r
- TRUE,\r
- PacketLen,\r
- (EFI_PXE_BASE_CODE_PACKET *) Packet\r
- );\r
- if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {\r
-\r
- Status = EFI_ABORTED;\r
- } else {\r
-\r
- Status = EFI_SUCCESS;\r
- }\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- This function is to get size of a file by Tftp.\r
-\r
- @param Private Pointer to PxeBc private data\r
- @param Config Pointer to Mtftp configuration data\r
- @param Filename Pointer to file name\r
- @param BlockSize Pointer to block size\r
- @param BufferSize Pointer to buffer size\r
-\r
- @retval EFI_SUCCESS Get the size of file success\r
- @retval EFI_NOT_FOUND Parse the tftp ptions failed.\r
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
- @retval Other Has not get the size of the file.\r
-\r
-**/\r
-EFI_STATUS\r
-PxeBcTftpGetFileSize (\r
- IN PXEBC_PRIVATE_DATA *Private,\r
- IN EFI_MTFTP4_CONFIG_DATA *Config,\r
- IN UINT8 *Filename,\r
- IN UINTN *BlockSize,\r
- IN OUT UINT64 *BufferSize\r
- )\r
-{\r
- EFI_MTFTP4_PROTOCOL *Mtftp4;\r
- EFI_MTFTP4_OPTION ReqOpt[2];\r
- EFI_MTFTP4_PACKET *Packet;\r
- EFI_MTFTP4_OPTION *Option;\r
- UINT32 PktLen;\r
- UINT8 OptBuf[128];\r
- UINT32 OptCnt;\r
- EFI_STATUS Status;\r
-\r
- *BufferSize = 0;\r
- Status = EFI_DEVICE_ERROR;\r
- Mtftp4 = Private->Mtftp4;\r
- Packet = NULL;\r
- Option = NULL;\r
- PktLen = 0;\r
- OptCnt = 1;\r
- Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
-\r
- Status = Mtftp4->Configure (Mtftp4, Config);\r
- if (EFI_ERROR (Status)) {\r
-\r
- return Status;\r
- }\r
-\r
- ReqOpt[0].OptionStr = (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX];\r
- UtoA10 (0, (CHAR8 *) OptBuf, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\r
- ReqOpt[0].ValueStr = OptBuf;\r
-\r
- if (BlockSize != NULL) {\r
- ReqOpt[1].OptionStr = (UINT8*)mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
- ReqOpt[1].ValueStr = ReqOpt[0].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1;\r
- UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[1].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX - (AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1));\r
- OptCnt++;\r
- }\r
-\r
- Status = Mtftp4->GetInfo (\r
- Mtftp4,\r
- NULL,\r
- Filename,\r
- NULL,\r
- (UINT8) OptCnt,\r
- ReqOpt,\r
- &PktLen,\r
- &Packet\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- if (Status == EFI_TFTP_ERROR) {\r
- Private->Mode.TftpErrorReceived = TRUE;\r
- Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
- AsciiStrnCpyS (\r
- Private->Mode.TftpError.ErrorString,\r
- PXE_MTFTP_ERROR_STRING_LENGTH,\r
- (CHAR8 *) Packet->Error.ErrorMessage,\r
- PXE_MTFTP_ERROR_STRING_LENGTH - 1\r
- );\r
- Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';\r
- }\r
- goto ON_ERROR;\r
- }\r
-\r
- OptCnt = 0;\r
-\r
- Status = Mtftp4->ParseOptions (\r
- Mtftp4,\r
- PktLen,\r
- Packet,\r
- (UINT32 *) &OptCnt,\r
- &Option\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
-\r
- goto ON_ERROR;\r
- }\r
-\r
- Status = EFI_NOT_FOUND;\r
-\r
- while (OptCnt != 0) {\r
-\r
- if (AsciiStrnCmp ((CHAR8 *) Option[OptCnt - 1].OptionStr, "tsize", 5) == 0) {\r
-\r
- *BufferSize = AtoU64 (Option[OptCnt - 1].ValueStr);\r
- Status = EFI_SUCCESS;\r
- }\r
-\r
- OptCnt--;\r
- }\r
-\r
- FreePool (Option);\r
-\r
-ON_ERROR:\r
-\r
- if (Packet != NULL) {\r
- FreePool (Packet);\r
- }\r
-\r
- Mtftp4->Configure (Mtftp4, NULL);\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- This function is to get data of a file by Tftp.\r
-\r
- @param Private Pointer to PxeBc private data\r
- @param Config Pointer to Mtftp configuration data\r
- @param Filename Pointer to file name\r
- @param BlockSize Pointer to block size\r
- @param BufferPtr Pointer to buffer\r
- @param BufferSize Pointer to buffer size\r
- @param DontUseBuffer Indicate whether with a receive buffer\r
-\r
- @retval EFI_SUCCESS Read the data success from the special file.\r
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
- @retval other Read data from file failed.\r
-\r
-**/\r
-EFI_STATUS\r
-PxeBcTftpReadFile (\r
- IN PXEBC_PRIVATE_DATA *Private,\r
- IN EFI_MTFTP4_CONFIG_DATA *Config,\r
- IN UINT8 *Filename,\r
- IN UINTN *BlockSize,\r
- IN UINT8 *BufferPtr,\r
- IN OUT UINT64 *BufferSize,\r
- IN BOOLEAN DontUseBuffer\r
- )\r
-{\r
- EFI_MTFTP4_PROTOCOL *Mtftp4;\r
- EFI_MTFTP4_TOKEN Token;\r
- EFI_MTFTP4_OPTION ReqOpt[1];\r
- UINT32 OptCnt;\r
- UINT8 OptBuf[128];\r
- EFI_STATUS Status;\r
-\r
- Status = EFI_DEVICE_ERROR;\r
- Mtftp4 = Private->Mtftp4;\r
- OptCnt = 0;\r
- Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
-\r
- Status = Mtftp4->Configure (Mtftp4, Config);\r
- if (EFI_ERROR (Status)) {\r
-\r
- return Status;\r
- }\r
-\r
- if (BlockSize != NULL) {\r
-\r
- ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
- ReqOpt[0].ValueStr = OptBuf;\r
- UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\r
- OptCnt++;\r
- }\r
-\r
- Token.Event = NULL;\r
- Token.OverrideData = NULL;\r
- Token.Filename = Filename;\r
- Token.ModeStr = NULL;\r
- Token.OptionCount = OptCnt;\r
- Token.OptionList = ReqOpt;\r
- Token.Context = Private;\r
-\r
- if (DontUseBuffer) {\r
- Token.BufferSize = 0;\r
- Token.Buffer = NULL;\r
- } else {\r
- Token.BufferSize = *BufferSize;\r
- Token.Buffer = BufferPtr;\r
- }\r
-\r
- Token.CheckPacket = PxeBcCheckPacket;\r
- Token.TimeoutCallback = NULL;\r
- Token.PacketNeeded = NULL;\r
-\r
- Status = Mtftp4->ReadFile (Mtftp4, &Token);\r
-\r
- *BufferSize = Token.BufferSize;\r
-\r
- Mtftp4->Configure (Mtftp4, NULL);\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- This function is put data of a file by Tftp.\r
-\r
- @param Private Pointer to PxeBc private data\r
- @param Config Pointer to Mtftp configuration data\r
- @param Filename Pointer to file name\r
- @param Overwrite Indicate whether with overwrite attribute\r
- @param BlockSize Pointer to block size\r
- @param BufferPtr Pointer to buffer\r
- @param BufferSize Pointer to buffer size\r
-\r
- @retval EFI_SUCCESS Write the data success into the special file.\r
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
- @retval other Write data into file failed.\r
-\r
-**/\r
-EFI_STATUS\r
-PxeBcTftpWriteFile (\r
- IN PXEBC_PRIVATE_DATA *Private,\r
- IN EFI_MTFTP4_CONFIG_DATA *Config,\r
- IN UINT8 *Filename,\r
- IN BOOLEAN Overwrite,\r
- IN UINTN *BlockSize,\r
- IN UINT8 *BufferPtr,\r
- IN OUT UINT64 *BufferSize\r
- )\r
-{\r
- EFI_MTFTP4_PROTOCOL *Mtftp4;\r
- EFI_MTFTP4_TOKEN Token;\r
- EFI_MTFTP4_OPTION ReqOpt[1];\r
- UINT32 OptCnt;\r
- UINT8 OptBuf[128];\r
- EFI_STATUS Status;\r
-\r
- Status = EFI_DEVICE_ERROR;\r
- Mtftp4 = Private->Mtftp4;\r
- OptCnt = 0;\r
- Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
-\r
- Status = Mtftp4->Configure (Mtftp4, Config);\r
- if (EFI_ERROR (Status)) {\r
-\r
- return Status;\r
- }\r
-\r
- if (BlockSize != NULL) {\r
-\r
- ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
- ReqOpt[0].ValueStr = OptBuf;\r
- UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\r
- OptCnt++;\r
- }\r
-\r
- Token.Event = NULL;\r
- Token.OverrideData = NULL;\r
- Token.Filename = Filename;\r
- Token.ModeStr = NULL;\r
- Token.OptionCount = OptCnt;\r
- Token.OptionList = ReqOpt;\r
- Token.BufferSize = *BufferSize;\r
- Token.Buffer = BufferPtr;\r
- Token.CheckPacket = PxeBcCheckPacket;\r
- Token.TimeoutCallback = NULL;\r
- Token.PacketNeeded = NULL;\r
-\r
- Status = Mtftp4->WriteFile (Mtftp4, &Token);\r
- *BufferSize = Token.BufferSize;\r
-\r
- Mtftp4->Configure (Mtftp4, NULL);\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- This function is to get data(file) from a directory(may be a server) by Tftp.\r
-\r
- @param Private Pointer to PxeBc private data.\r
- @param Config Pointer to Mtftp configuration data.\r
- @param Filename Pointer to file name.\r
- @param BlockSize Pointer to block size.\r
- @param BufferPtr Pointer to buffer.\r
- @param BufferSize Pointer to buffer size.\r
- @param DontUseBuffer Indicate whether with a receive buffer.\r
-\r
- @retval EFI_SUCCES Get the data from the file included in directory success.\r
- @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
- @retval other Operation failed.\r
-\r
-**/\r
-EFI_STATUS\r
-PxeBcTftpReadDirectory (\r
- IN PXEBC_PRIVATE_DATA *Private,\r
- IN EFI_MTFTP4_CONFIG_DATA *Config,\r
- IN UINT8 *Filename,\r
- IN UINTN *BlockSize,\r
- IN UINT8 *BufferPtr,\r
- IN OUT UINT64 *BufferSize,\r
- IN BOOLEAN DontUseBuffer\r
- )\r
-{\r
- EFI_MTFTP4_PROTOCOL *Mtftp4;\r
- EFI_MTFTP4_TOKEN Token;\r
- EFI_MTFTP4_OPTION ReqOpt[1];\r
- UINT32 OptCnt;\r
- UINT8 OptBuf[128];\r
- EFI_STATUS Status;\r
-\r
- Status = EFI_DEVICE_ERROR;\r
- Mtftp4 = Private->Mtftp4;\r
- OptCnt = 0;\r
- Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
-\r
- Status = Mtftp4->Configure (Mtftp4, Config);\r
- if (EFI_ERROR (Status)) {\r
-\r
- return Status;\r
- }\r
-\r
- if (BlockSize != NULL) {\r
-\r
- ReqOpt[0].OptionStr = (UINT8*) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
- ReqOpt[0].ValueStr = OptBuf;\r
- UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\r
- OptCnt++;\r
- }\r
-\r
- Token.Event = NULL;\r
- Token.OverrideData = NULL;\r
- Token.Filename = Filename;\r
- Token.ModeStr = NULL;\r
- Token.OptionCount = OptCnt;\r
- Token.OptionList = ReqOpt;\r
- Token.Context = Private;\r
-\r
- if (DontUseBuffer) {\r
- Token.BufferSize = 0;\r
- Token.Buffer = NULL;\r
- } else {\r
- Token.BufferSize = *BufferSize;\r
- Token.Buffer = BufferPtr;\r
- }\r
-\r
- Token.CheckPacket = PxeBcCheckPacket;\r
- Token.TimeoutCallback = NULL;\r
- Token.PacketNeeded = NULL;\r
-\r
- Status = Mtftp4->ReadDirectory (Mtftp4, &Token);\r
-\r
- *BufferSize = Token.BufferSize;\r
-\r
- Mtftp4->Configure (Mtftp4, NULL);\r
-\r
- return Status;\r
-}\r
-\r