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

Reply via email to