From 5c6fdb5e8345840224b7fa77f1e1b4650b5b0769 Mon Sep 17 00:00:00 2001 From: Jiaxin Wu Date: Fri, 14 Sep 2018 15:48:17 +0800 Subject: [PATCH] ShellPkg/TftpDynamicCommand: Add one option for tftp command to specify windowsize. Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=886 This patch is to define one new option for TFTP shell command to specify the windowsize option as defined in RFC 7440. Valid range is between 1 and 64, default value is 1. Note that: RFC 7440 does not mention max window size value, but for the stability reason, the value is limited to 64. Cc: Ye Ting Cc: Fu Siyuan Cc: Carsey Jaben Cc: Shao Ming Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Wu Jiaxin Reviewed-by: Jaben Carsey Reviewed-by: Fu Siyuan Reviewed-by: Ye Ting --- .../DynamicCommand/TftpDynamicCommand/Tftp.c | 65 ++++++++++++++++--- .../TftpDynamicCommand/Tftp.uni | 6 +- 2 files changed, 59 insertions(+), 12 deletions(-) diff --git a/ShellPkg/DynamicCommand/TftpDynamicCommand/Tftp.c b/ShellPkg/DynamicCommand/TftpDynamicCommand/Tftp.c index 44be6d4e76..c66be6b9d9 100644 --- a/ShellPkg/DynamicCommand/TftpDynamicCommand/Tftp.c +++ b/ShellPkg/DynamicCommand/TftpDynamicCommand/Tftp.c @@ -183,6 +183,7 @@ DownloadFile ( IN CONST CHAR8 *AsciiFilePath, IN UINTN FileSize, IN UINT16 BlockSize, + IN UINT16 WindowSize, OUT VOID **Data ); @@ -227,6 +228,7 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = { {L"-c", TypeValue}, {L"-t", TypeValue}, {L"-s", TypeValue}, + {L"-w", TypeValue}, {NULL , TypeMax} }; @@ -239,7 +241,17 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = { /// #define MTFTP_MIN_BLKSIZE 8 #define MTFTP_MAX_BLKSIZE 65464 - +/// +/// The default windowsize (1) of tftp. +/// +#define MTFTP_DEFAULT_WINDOWSIZE 1 +/// +/// The valid range of window size option. +/// Note that: RFC 7440 does not mention max window size value, but for the +/// stability reason, the value is limited to 64. +/// +#define MTFTP_MIN_WINDOWSIZE 1 +#define MTFTP_MAX_WINDOWSIZE 64 /** Function for 'tftp' command. @@ -288,6 +300,7 @@ RunTftp ( VOID *Data; SHELL_FILE_HANDLE FileHandle; UINT16 BlockSize; + UINT16 WindowSize; ShellStatus = SHELL_INVALID_PARAMETER; ProblemParam = NULL; @@ -297,6 +310,7 @@ RunTftp ( FileSize = 0; DataSize = 0; BlockSize = MTFTP_DEFAULT_BLKSIZE; + WindowSize = MTFTP_DEFAULT_WINDOWSIZE; // // Initialize the Shell library (we must be in non-auto-init...) @@ -436,6 +450,20 @@ RunTftp ( } } + ValueStr = ShellCommandLineGetValue (CheckPackage, L"-w"); + if (ValueStr != NULL) { + if (!StringToUint16 (ValueStr, &WindowSize)) { + goto Error; + } + if (WindowSize < MTFTP_MIN_WINDOWSIZE || WindowSize > MTFTP_MAX_WINDOWSIZE) { + ShellPrintHiiEx ( + -1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), + mTftpHiiHandle, L"tftp", ValueStr + ); + goto Error; + } + } + // // Locate all MTFTP4 Service Binding protocols // @@ -510,7 +538,7 @@ RunTftp ( goto NextHandle; } - Status = DownloadFile (Mtftp4, RemoteFilePath, AsciiRemoteFilePath, FileSize, BlockSize, &Data); + Status = DownloadFile (Mtftp4, RemoteFilePath, AsciiRemoteFilePath, FileSize, BlockSize, WindowSize, &Data); if (EFI_ERROR (Status)) { ShellPrintHiiEx ( -1, -1, NULL, STRING_TOKEN (STR_TFTP_ERR_DOWNLOAD), @@ -896,6 +924,7 @@ DownloadFile ( IN CONST CHAR8 *AsciiFilePath, IN UINTN FileSize, IN UINT16 BlockSize, + IN UINT16 WindowSize, OUT VOID **Data ) { @@ -904,8 +933,8 @@ DownloadFile ( VOID *Buffer; DOWNLOAD_CONTEXT *TftpContext; EFI_MTFTP4_TOKEN Mtftp4Token; - EFI_MTFTP4_OPTION ReqOpt; - UINT8 OptBuf[10]; + UINT8 BlksizeBuf[10]; + UINT8 WindowsizeBuf[10]; // Downloaded file can be large. BS.AllocatePages() is more faster // than AllocatePool() and avoid fragmentation. @@ -938,13 +967,25 @@ DownloadFile ( Mtftp4Token.Buffer = Buffer; Mtftp4Token.CheckPacket = CheckPacket; Mtftp4Token.Context = (VOID*)TftpContext; + Mtftp4Token.OptionCount = 0; + Mtftp4Token.OptionList = AllocatePool (sizeof (EFI_MTFTP4_OPTION) * 2); + if (Mtftp4Token.OptionList == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto Error; + } + if (BlockSize != MTFTP_DEFAULT_BLKSIZE) { - ReqOpt.OptionStr = (UINT8 *) "blksize"; - AsciiSPrint ((CHAR8 *)OptBuf, sizeof (OptBuf), "%d", BlockSize); - ReqOpt.ValueStr = OptBuf; + Mtftp4Token.OptionList[Mtftp4Token.OptionCount].OptionStr = (UINT8 *) "blksize"; + AsciiSPrint ((CHAR8 *) BlksizeBuf, sizeof (BlksizeBuf), "%d", BlockSize); + Mtftp4Token.OptionList[Mtftp4Token.OptionCount].ValueStr = BlksizeBuf; + Mtftp4Token.OptionCount ++; + } - Mtftp4Token.OptionCount = 1; - Mtftp4Token.OptionList = &ReqOpt; + if (WindowSize != MTFTP_DEFAULT_WINDOWSIZE) { + Mtftp4Token.OptionList[Mtftp4Token.OptionCount].OptionStr = (UINT8 *) "windowsize"; + AsciiSPrint ((CHAR8 *) WindowsizeBuf, sizeof (WindowsizeBuf), "%d", WindowSize); + Mtftp4Token.OptionList[Mtftp4Token.OptionCount].ValueStr = WindowsizeBuf; + Mtftp4Token.OptionCount ++; } ShellPrintHiiEx ( @@ -960,10 +1001,14 @@ DownloadFile ( Error : - if (TftpContext == NULL) { + if (TftpContext != NULL) { FreePool (TftpContext); } + if (Mtftp4Token.OptionList != NULL) { + FreePool (Mtftp4Token.OptionList); + } + if (EFI_ERROR (Status)) { gBS->FreePages (PagesAddress, EFI_SIZE_TO_PAGES (FileSize)); return Status; diff --git a/ShellPkg/DynamicCommand/TftpDynamicCommand/Tftp.uni b/ShellPkg/DynamicCommand/TftpDynamicCommand/Tftp.uni index 1393ba5679..654e42ad23 100644 --- a/ShellPkg/DynamicCommand/TftpDynamicCommand/Tftp.uni +++ b/ShellPkg/DynamicCommand/TftpDynamicCommand/Tftp.uni @@ -1,7 +1,7 @@ // /** // // (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP
-// Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.
+// Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.
// 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 ] [-r ] [-c ] [-t ]\r\n" -" [-s ] host remotefilepath [localfilepath]\r\n" +" [-s ] [-w ] host remotefilepath [localfilepath]\r\n" ".SH OPTIONS\r\n" " \r\n" " -i interface - Specifies an adapter name, i.e., eth0.\r\n" @@ -63,6 +63,8 @@ " sending a request packet. Default value is 4s.\r\n" " -s - 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" +" -w - Specifies the TFTP windowsize option as defined in RFC 7440.\r\n" +" Valid range is between 1 and 64, default value is 1.\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.39.2