Why write the function UintnToAscDec to convert UINTN to ascii string? PrintLib can do that for you.
Reviewed-by: Jaben Carsey <jaben.car...@intel.com> > -----Original Message----- > From: Fu, Siyuan > Sent: Thursday, May 05, 2016 7:33 PM > To: edk2-devel@lists.01.org > Cc: Carsey, Jaben <jaben.car...@intel.com>; Qiu, Shumin > <shumin....@intel.com> > Subject: [Patch] ShellPkg: Add argument to set block size for tftp command. > Importance: High > > 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 | 81 > +++++++++++++++++++++- > .../UefiShellTftpCommandLib.uni | 6 +- > 2 files changed, 83 insertions(+), 4 deletions(-) > > diff --git a/ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c > b/ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c > index 831b9c3..e72e6f6 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,15 @@ 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 > + > /** > Function for 'tftp' command. > > @@ -271,6 +279,7 @@ ShellCommandRunTftp ( > UINTN FileSize; > VOID *Data; > SHELL_FILE_HANDLE FileHandle; > + UINT16 BlockSize; > > ShellStatus = SHELL_INVALID_PARAMETER; > ProblemParam = NULL; > @@ -278,6 +287,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 +414,23 @@ ShellCommandRunTftp ( > } > } > > + ValueStr = ShellCommandLineGetValue (CheckPackage, L"-s"); > + if (ValueStr != NULL) { > + if (!StringToUint16 (ValueStr, &BlockSize)) { > + goto Error; > + } > + // > + // Valid range of block size is between "8" and "65464" according to > RFC2348. > + // > + if (BlockSize < 8 || BlockSize > 65464) { > + ShellPrintHiiEx ( > + -1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), > + gShellTftpHiiHandle, L"tftp", ValueStr > + ); > + goto Error; > + } > + } > + > // > // Locate all MTFTP4 Service Binding protocols > // > @@ -478,7 +505,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 +611,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 +908,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 +926,7 @@ DownloadFile ( > IN CONST CHAR16 *FilePath, > IN CONST CHAR8 *AsciiFilePath, > IN UINTN FileSize, > + IN UINT16 BlockSize, > OUT VOID **Data > ) > { > @@ -868,6 +935,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 +969,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.uni > @@ -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