summaryrefslogtreecommitdiff
path: root/ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c
diff options
context:
space:
mode:
authorFu Siyuan <siyuan.fu@intel.com>2016-05-06 10:30:09 +0800
committerFu Siyuan <siyuan.fu@intel.com>2016-05-20 11:30:47 +0800
commit2be45bfe2779043bc3566e879e7ec279412012dc (patch)
treee13ca98085b50fc388a6a15295accfa035e37589 /ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c
parent1f1ec99dea4d6d04fed96fa8a2e299212f6bc8cb (diff)
downloadedk2-platforms-2be45bfe2779043bc3566e879e7ec279412012dc.tar.xz
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 <block size>] for shell "tftp" command to configure the block size for file download. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> Reviewed-by: Ye Ting <ting.ye@intel.com> Reviewed-by: Qiu Shumin <shumin.qiu@intel.com> Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
Diffstat (limited to 'ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c')
-rw-r--r--ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c46
1 files changed, 44 insertions, 2 deletions
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.<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),
@@ -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),