From nobody Thu May 2 16:45:40 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Authentication-Results: mx.zoho.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org; Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1489713751516338.19169411424457; Thu, 16 Mar 2017 18:22:31 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id DE0F48042E; Thu, 16 Mar 2017 18:22:26 -0700 (PDT) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 08E758042C for ; Thu, 16 Mar 2017 18:22:26 -0700 (PDT) Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 16 Mar 2017 18:22:25 -0700 Received: from jiaxinwu-mobl2.ccr.corp.intel.com ([10.239.196.130]) by fmsmga004.fm.intel.com with ESMTP; 16 Mar 2017 18:22:24 -0700 X-Original-To: edk2-devel@lists.01.org DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=intel.com; i=@intel.com; q=dns/txt; s=intel; t=1489713746; x=1521249746; h=from:to:cc:subject:date:message-id; bh=xIU6qtQ3kZcDlXD282Ah8naWWYrboAxm00HypSZ5N0s=; b=YI0xhmFUcKIRCpPJpeQk/QG/HbyYp4TReJmly3Fk3S+WCq9WQeYlKGRy cOo0SViV8gZVjCZnupNaKcseqiKRpA==; X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.36,174,1486454400"; d="scan'208";a="237319727" From: Jiaxin Wu To: edk2-devel@lists.01.org Date: Fri, 17 Mar 2017 09:22:23 +0800 Message-Id: <1489713743-16028-1-git-send-email-jiaxin.wu@intel.com> X-Mailer: git-send-email 1.9.5.msysgit.1 Subject: [edk2] [PATCH v2] ShellPkg/tftp: Add one option for tftp command to specify windowsize X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ye Ting , Carsey Jaben , Fu Siyuan , Wu Jiaxin MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" v2: * Refine the constants definitions. Define -w option for tftp shell command to specify the TFTP windowsize option. That will benefit the big file download for tftp server. Cc: Ye Ting Cc: Fu Siyuan Cc: Carsey Jaben Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Wu Jiaxin Reviewed-by: Jaben Carsey Reviewed-by: Ye Ting =20 --- ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c | 67 ++++++++++++++++++= ---- .../UefiShellTftpCommandLib.uni | 6 +- 2 files changed, 60 insertions(+), 13 deletions(-) diff --git a/ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c b/ShellPkg/Lib= rary/UefiShellTftpCommandLib/Tftp.c index 5c50797..9b47839 100755 --- a/ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c +++ b/ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c @@ -1,10 +1,10 @@ /** @file The implementation for the 'tftp' Shell command. =20 Copyright (c) 2015, ARM Ltd. All rights reserved.
- Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.
+ Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.
(C) Copyright 2015 Hewlett Packard Enterprise Development LP
=20 This program and the accompanying materials are licensed and made available under the terms and conditions of the BS= D License which accompanies this distribution. The full text of the license may b= e found at @@ -180,10 +180,11 @@ DownloadFile ( IN EFI_MTFTP4_PROTOCOL *Mtftp4, IN CONST CHAR16 *FilePath, IN CONST CHAR8 *AsciiFilePath, IN UINTN FileSize, IN UINT16 BlockSize, + IN UINT16 WindowSize, OUT VOID **Data ); =20 /** Update the progress of a file download @@ -224,10 +225,11 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] =3D { {L"-l", TypeValue}, {L"-r", TypeValue}, {L"-c", TypeValue}, {L"-t", TypeValue}, {L"-s", TypeValue}, + {L"-w", TypeValue}, {NULL , TypeMax} }; =20 /// /// The default block size (512) of tftp is defined in the RFC1350. @@ -236,11 +238,21 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] =3D { /// /// The valid range of block size option is defined in the RFC2348. /// #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.=20 +/// Note that: RFC 7440 does not mention max window size value, but for th= e=20 +/// stability reason, the value is limited to 64. +/// +#define MTFTP_MIN_WINDOWSIZE 1 +#define MTFTP_MAX_WINDOWSIZE 64 =20 /** Function for 'tftp' command. =20 @param[in] ImageHandle Handle to the Image (NULL if Internal). @@ -285,18 +297,20 @@ ShellCommandRunTftp ( EFI_MTFTP4_PROTOCOL *Mtftp4; UINTN FileSize; VOID *Data; SHELL_FILE_HANDLE FileHandle; UINT16 BlockSize; + UINT16 WindowSize; =20 ShellStatus =3D SHELL_INVALID_PARAMETER; ProblemParam =3D NULL; NicFound =3D FALSE; AsciiRemoteFilePath =3D NULL; Handles =3D NULL; FileSize =3D 0; BlockSize =3D MTFTP_DEFAULT_BLKSIZE; + WindowSize =3D MTFTP_DEFAULT_WINDOWSIZE; =20 // // Initialize the Shell library (we must be in non-auto-init...) // Status =3D ShellInitialize (); @@ -432,10 +446,24 @@ ShellCommandRunTftp ( ); goto Error; } } =20 + ValueStr =3D ShellCommandLineGetValue (CheckPackage, L"-w"); + if (ValueStr !=3D NULL) { + if (!StringToUint16 (ValueStr, &WindowSize)) { + goto Error; + } + if (WindowSize < MTFTP_MIN_WINDOWSIZE || WindowSize > MTFTP_MAX_WINDOW= SIZE) { + ShellPrintHiiEx ( + -1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), + gShellTftpHiiHandle, L"tftp", ValueStr + ); + goto Error; + } + } + // // Locate all MTFTP4 Service Binding protocols // ShellStatus =3D SHELL_NOT_FOUND; Status =3D gBS->LocateHandleBuffer ( @@ -506,11 +534,11 @@ ShellCommandRunTftp ( gShellTftpHiiHandle, RemoteFilePath, NicName, Status ); goto NextHandle; } =20 - Status =3D DownloadFile (Mtftp4, RemoteFilePath, AsciiRemoteFilePath, = FileSize, BlockSize, &Data); + Status =3D DownloadFile (Mtftp4, RemoteFilePath, AsciiRemoteFilePath, = FileSize, BlockSize, WindowSize, &Data); if (EFI_ERROR (Status)) { ShellPrintHiiEx ( -1, -1, NULL, STRING_TOKEN (STR_TFTP_ERR_DOWNLOAD), gShellTftpHiiHandle, RemoteFilePath, NicName, Status ); @@ -890,20 +918,21 @@ DownloadFile ( IN EFI_MTFTP4_PROTOCOL *Mtftp4, IN CONST CHAR16 *FilePath, IN CONST CHAR8 *AsciiFilePath, IN UINTN FileSize, IN UINT16 BlockSize, + IN UINT16 WindowSize, OUT VOID **Data ) { EFI_STATUS Status; EFI_PHYSICAL_ADDRESS PagesAddress; VOID *Buffer; DOWNLOAD_CONTEXT *TftpContext; EFI_MTFTP4_TOKEN Mtftp4Token; - EFI_MTFTP4_OPTION ReqOpt; - UINT8 OptBuf[10]; + UINT8 BlksizeBuf[10]; + UINT8 WindowsizeBuf[10]; =20 // Downloaded file can be large. BS.AllocatePages() is more faster // than AllocatePool() and avoid fragmentation. // The downloaded file could be an EFI application. Marking the // allocated page as EfiBootServicesCode would allow to execute a @@ -932,17 +961,29 @@ DownloadFile ( Mtftp4Token.Filename =3D (UINT8*)AsciiFilePath; Mtftp4Token.BufferSize =3D FileSize; Mtftp4Token.Buffer =3D Buffer; Mtftp4Token.CheckPacket =3D CheckPacket; Mtftp4Token.Context =3D (VOID*)TftpContext; + Mtftp4Token.OptionCount =3D 0; + Mtftp4Token.OptionList =3D AllocatePool (sizeof (EFI_MTFTP4_OPTION) * 2= ); + if (Mtftp4Token.OptionList =3D=3D NULL) { + Status =3D EFI_OUT_OF_RESOURCES; + goto Error; + } + if (BlockSize !=3D MTFTP_DEFAULT_BLKSIZE) { - ReqOpt.OptionStr =3D (UINT8 *) "blksize"; - AsciiSPrint ((CHAR8 *)OptBuf, sizeof (OptBuf), "%d", BlockSize); - ReqOpt.ValueStr =3D OptBuf; + Mtftp4Token.OptionList[Mtftp4Token.OptionCount].OptionStr =3D (UINT8 *= ) "blksize"; + AsciiSPrint ((CHAR8 *) BlksizeBuf, sizeof (BlksizeBuf), "%d", BlockSiz= e); + Mtftp4Token.OptionList[Mtftp4Token.OptionCount].ValueStr =3D BlksizeB= uf; + Mtftp4Token.OptionCount ++; + } =20 - Mtftp4Token.OptionCount =3D 1; - Mtftp4Token.OptionList =3D &ReqOpt; + if (WindowSize !=3D MTFTP_DEFAULT_WINDOWSIZE) { + Mtftp4Token.OptionList[Mtftp4Token.OptionCount].OptionStr =3D (UINT8 *= ) "windowsize"; + AsciiSPrint ((CHAR8 *) WindowsizeBuf, sizeof (WindowsizeBuf), "%d", Wi= ndowSize); + Mtftp4Token.OptionList[Mtftp4Token.OptionCount].ValueStr =3D Windowsi= zeBuf; + Mtftp4Token.OptionCount ++; } =20 ShellPrintHiiEx ( -1, -1, NULL, STRING_TOKEN (STR_TFTP_DOWNLOADING), gShellTftpHiiHandle, FilePath @@ -954,14 +995,18 @@ DownloadFile ( gShellTftpHiiHandle ); =20 Error : =20 - if (TftpContext =3D=3D NULL) { + if (TftpContext !=3D NULL) { FreePool (TftpContext); } =20 + if (Mtftp4Token.OptionList !=3D NULL) { + FreePool (Mtftp4Token.OptionList); + } + if (EFI_ERROR (Status)) { gBS->FreePages (PagesAddress, EFI_SIZE_TO_PAGES (FileSize)); return Status; } =20 diff --git a/ShellPkg/Library/UefiShellTftpCommandLib/UefiShellTftpCommandL= ib.uni b/ShellPkg/Library/UefiShellTftpCommandLib/UefiShellTftpCommandLib.u= ni index 4f4447d..ca6fa44 100644 --- a/ShellPkg/Library/UefiShellTftpCommandLib/UefiShellTftpCommandLib.uni +++ b/ShellPkg/Library/UefiShellTftpCommandLib/UefiShellTftpCommandLib.uni @@ -1,9 +1,9 @@ // /** // // (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP
-// Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.
+// Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.
// This program and the accompanying materials // are licensed and made available under the terms and conditions of the B= SD License // which accompanies this distribution. The full text of the license may b= e found at // http://opensource.org/licenses/bsd-license.php // @@ -48,11 +48,11 @@ ".SH NAME\r\n" "Download a file from TFTP server.\r\n" ".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 [localfilep= ath]\r\n" ".SH OPTIONS\r\n" " \r\n" " -i interface - Specifies an adapter name, i.e., eth0.\r\n" " -l port - Specifies the local port number. Default value is 0\= r\n" " and the port number is automatically assigned.\r\n" @@ -61,10 +61,12 @@ " wait for a response. The default value is 6.\r\n" " -t - The number of seconds to wait for a response after\r= \n" " 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 R= FC 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" ".SH DESCRIPTION\r\n" " \r\n" --=20 1.9.5.msysgit.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel