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

Reply via email to