Reviewed-by: Qiu Shumin <shumin....@intel.com> -----Original Message----- From: Fu, Siyuan Sent: Friday, May 06, 2016 1:16 PM To: edk2-devel@lists.01.org Cc: Carsey, Jaben; Qiu, Shumin Subject: [PATCH v2] ShellPkg: Add argument to set block size for tftp command.
V2 update: Define macros for the max and min block size value. TFTP block size has a big impact on the transmit performance, this patch is to add new argument [-s <block size>] for shell "tftp" command to configure the block size for file download. Cc: Jaben Carsey <jaben.car...@intel.com> Cc: Shumin Qiu <shumin....@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Fu Siyuan <siyuan...@intel.com> --- ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c | 84 +++++++++++++++++++++- .../UefiShellTftpCommandLib.uni | 6 +- 2 files changed, 86 insertions(+), 4 deletions(-) diff --git a/ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c b/ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c index 831b9c3..e0215a9 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.<BR> - Copyright (c) 2015, Intel Corporation. All rights reserved. <BR> + Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved. + <BR> (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> 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), @@ -584,6 +614,44 @@ StringToUint16 ( } /** + This function is to convert a UINTN to a ASCII string, and return the + actual length of the buffer. + + @param[in] Number Numeric value to be converted. + @param[in] Buffer The pointer to the buffer for ASCII string. + @param[in] BufferSize The maxsize of the buffer. + + @return Length The actual length of the ASCII string. + +**/ +UINTN +UintnToAscDec ( + IN UINTN Number, + IN UINT8 *Buffer, + IN UINTN BufferSize + ) +{ + UINTN Index; + UINTN Length; + CHAR8 TempStr[64]; + + Index = 63; + TempStr[Index] = 0; + + do { + Index--; + TempStr[Index] = (CHAR8) ('0' + (Number % 10)); + Number = (UINTN) (Number / 10); + } while (Number != 0); + + AsciiStrCpyS ((CHAR8 *) Buffer, BufferSize, &TempStr[Index]); + + Length = AsciiStrLen ((CHAR8 *) Buffer); + + return Length; +} + +/** Get the name of the NIC. @param[in] ControllerHandle The network physical device handle. @@ -843,6 +911,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 +929,7 @@ DownloadFile ( IN CONST CHAR16 *FilePath, IN CONST CHAR8 *AsciiFilePath, IN UINTN FileSize, + IN UINT16 BlockSize, OUT VOID **Data ) { @@ -868,6 +938,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 +972,14 @@ DownloadFile ( Mtftp4Token.Buffer = Buffer; Mtftp4Token.CheckPacket = CheckPacket; Mtftp4Token.Context = (VOID*)TftpContext; + if (BlockSize != MTFTP_DEFAULT_BLKSIZE) { + ReqOpt.OptionStr = "blksize"; + UintnToAscDec (BlockSize, OptBuf, sizeof (OptBuf)); + ReqOpt.ValueStr = OptBuf; + + Mtftp4Token.OptionCount = 1; + Mtftp4Token.OptionList = &ReqOpt; + } ShellPrintHiiEx ( -1, -1, NULL, STRING_TOKEN (STR_TFTP_DOWNLOADING), diff --git a/ShellPkg/Library/UefiShellTftpCommandLib/UefiShellTftpCommandLib.uni b/ShellPkg/Library/UefiShellTftpCommandLib/UefiShellTftpCommandLib.uni index 33a8944..a16265c 100644 --- a/ShellPkg/Library/UefiShellTftpCommandLib/UefiShellTftpCommandLib.uni +++ b/ShellPkg/Library/UefiShellTftpCommandLib/UefiShellTftpCommandLib.u +++ ni @@ -1,7 +1,7 @@ // /** // // (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR> -// Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved. <BR> +// Copyright (c) 2010 - 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 @@ -50,7 +50,7 @@ ".SH SYNOPSIS\r\n" " \r\n" "TFTP [-i interface] [-l <port>] [-r <port>] [-c <retry count>] [-t <timeout>]\r\n" -" host remotefilepath [localfilepath]\r\n" +" [-s <block size>] host remotefilepath [localfilepath]\r\n" ".SH OPTIONS\r\n" " \r\n" " -i interface - Specifies an adapter name, i.e., eth0.\r\n" @@ -61,6 +61,8 @@ " wait for a response. The default value is 6.\r\n" " -t <timeout> - The number of seconds to wait for a response after\r\n" " sending a request packet. Default value is 4s.\r\n" +" -s <block size> - Specifies the TFTP blksize option as defined in RFC 2348.\r\n" +" Valid range is between 8 and 65464, default value is 512.\r\n" " host - Specify TFTP Server IPv4 address.\r\n" " remotefilepath - TFTP server file path to download the file.\r\n" " localfilepath - Local destination file path.\r\n" -- 2.7.4.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel