From 2be45bfe2779043bc3566e879e7ec279412012dc Mon Sep 17 00:00:00 2001 From: Fu Siyuan Date: Fri, 6 May 2016 10:30:09 +0800 Subject: ShellPkg: Add argument to set block size for tftp command. TFTP block size has a big impact on the transmit performance, this patch is to add new argument [-s ] for shell "tftp" command to configure the block size for file download. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Fu Siyuan Reviewed-by: Ye Ting Reviewed-by: Qiu Shumin Reviewed-by: Jaben Carsey --- ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c | 46 +++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) (limited to 'ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c') diff --git a/ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c b/ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c index 831b9c3d02..cb8cb9fb16 100644 --- a/ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c +++ b/ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c @@ -2,7 +2,7 @@ The implementation for the 'tftp' Shell command. Copyright (c) 2015, ARM Ltd. All rights reserved.
- Copyright (c) 2015, Intel Corporation. All rights reserved.
+ Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.
(C) Copyright 2015 Hewlett Packard Enterprise Development LP
This program and the accompanying materials @@ -163,6 +163,7 @@ GetFileSize ( @param[in] FilePath Path of the file, Unicode encoded @param[in] AsciiFilePath Path of the file, ASCII encoded @param[in] FileSize Size of the file in number of bytes + @param[in] BlockSize Value of the TFTP blksize option @param[out] Data Address where to store the address of the buffer where the data of the file were downloaded in case of success. @@ -180,6 +181,7 @@ DownloadFile ( IN CONST CHAR16 *FilePath, IN CONST CHAR8 *AsciiFilePath, IN UINTN FileSize, + IN UINT16 BlockSize, OUT VOID **Data ); @@ -223,9 +225,21 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = { {L"-r", TypeValue}, {L"-c", TypeValue}, {L"-t", TypeValue}, + {L"-s", TypeValue}, {NULL , TypeMax} }; +/// +/// The default block size (512) of tftp is defined in the RFC1350. +/// +#define MTFTP_DEFAULT_BLKSIZE 512 +/// +/// The valid range of block size option is defined in the RFC2348. +/// +#define MTFTP_MIN_BLKSIZE 8 +#define MTFTP_MAX_BLKSIZE 65464 + + /** Function for 'tftp' command. @@ -271,6 +285,7 @@ ShellCommandRunTftp ( UINTN FileSize; VOID *Data; SHELL_FILE_HANDLE FileHandle; + UINT16 BlockSize; ShellStatus = SHELL_INVALID_PARAMETER; ProblemParam = NULL; @@ -278,6 +293,7 @@ ShellCommandRunTftp ( AsciiRemoteFilePath = NULL; Handles = NULL; FileSize = 0; + BlockSize = MTFTP_DEFAULT_BLKSIZE; // // Initialize the Shell library (we must be in non-auto-init...) @@ -404,6 +420,20 @@ ShellCommandRunTftp ( } } + ValueStr = ShellCommandLineGetValue (CheckPackage, L"-s"); + if (ValueStr != NULL) { + if (!StringToUint16 (ValueStr, &BlockSize)) { + goto Error; + } + if (BlockSize < MTFTP_MIN_BLKSIZE || BlockSize > MTFTP_MAX_BLKSIZE) { + ShellPrintHiiEx ( + -1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), + gShellTftpHiiHandle, L"tftp", ValueStr + ); + goto Error; + } + } + // // Locate all MTFTP4 Service Binding protocols // @@ -478,7 +508,7 @@ ShellCommandRunTftp ( goto NextHandle; } - Status = DownloadFile (Mtftp4, RemoteFilePath, AsciiRemoteFilePath, FileSize, &Data); + Status = DownloadFile (Mtftp4, RemoteFilePath, AsciiRemoteFilePath, FileSize, BlockSize, &Data); if (EFI_ERROR (Status)) { ShellPrintHiiEx ( -1, -1, NULL, STRING_TOKEN (STR_TFTP_ERR_DOWNLOAD), @@ -843,6 +873,7 @@ Error : @param[in] FilePath Path of the file, Unicode encoded @param[in] AsciiFilePath Path of the file, ASCII encoded @param[in] FileSize Size of the file in number of bytes + @param[in] BlockSize Value of the TFTP blksize option @param[out] Data Address where to store the address of the buffer where the data of the file were downloaded in case of success. @@ -860,6 +891,7 @@ DownloadFile ( IN CONST CHAR16 *FilePath, IN CONST CHAR8 *AsciiFilePath, IN UINTN FileSize, + IN UINT16 BlockSize, OUT VOID **Data ) { @@ -868,6 +900,8 @@ DownloadFile ( VOID *Buffer; DOWNLOAD_CONTEXT *TftpContext; EFI_MTFTP4_TOKEN Mtftp4Token; + EFI_MTFTP4_OPTION ReqOpt; + UINT8 OptBuf[10]; // Downloaded file can be large. BS.AllocatePages() is more faster // than AllocatePool() and avoid fragmentation. @@ -900,6 +934,14 @@ DownloadFile ( Mtftp4Token.Buffer = Buffer; Mtftp4Token.CheckPacket = CheckPacket; Mtftp4Token.Context = (VOID*)TftpContext; + if (BlockSize != MTFTP_DEFAULT_BLKSIZE) { + ReqOpt.OptionStr = "blksize"; + AsciiSPrint (OptBuf, sizeof (OptBuf), "%d", BlockSize); + ReqOpt.ValueStr = OptBuf; + + Mtftp4Token.OptionCount = 1; + Mtftp4Token.OptionList = &ReqOpt; + } ShellPrintHiiEx ( -1, -1, NULL, STRING_TOKEN (STR_TFTP_DOWNLOADING), -- cgit v1.2.3