Hi Siyuan, Thanks a lot for thorough explanation. The default 512B won't be changed then - PCD and extending tftp command seem a good alternative. We will come back later with more proper solution.
Best regards, Marcin 2016-04-29 10:40 GMT+02:00 Fu, Siyuan <[email protected]>: > Hi, Marcin > > The RFC2348 has a detail discussion about the block size setting in tftp and > give the answer: using value of MTU is not the best choice. You may find you > still can gain more efficiency by increasing the block size over the path > MTU, until the IP fragmentation gives more overhead than the tftp package > frame and process. > > The default block size (512) of tftp is defined in the RFC1350, that's why > the Mtftp driver use 512 as the default macro value. The MTFTP4 prococol does > provide the interface to allow the caller to provide a "blksize" option in > the MTFTP request, so I prefer to keep the default value to 512 in the Mtftp4 > driver, to follow RFC's definition. Another driver in edk2 stack which is > using the mtftp protocol, like the PXE driver, provides a PCD > gEfiMdeModulePkgTokenSpaceGuid.PcdTftpBlockSize which allow the users to > configure the default block size during PXE mtftp download. > > For the shell "tftp" command, I also suggest to add a new argument to let > user set the block size, not simply override it with 1468. > > Best Regards > Siyuan > >> -----Original Message----- >> From: edk2-devel [mailto:[email protected]] On Behalf Of >> Marcin Wojtas >> Sent: Friday, April 29, 2016 9:09 AM >> To: [email protected] >> Cc: [email protected]; [email protected]; [email protected]; Gao, >> Liming <[email protected]>; Kinney, Michael D >> <[email protected]> >> Subject: [edk2] [RFC] MdeModulePkg, ShellPkg: increase TFTP block size >> >> From: Bartosz Szczepanek <[email protected]> >> >> Hi, >> >> When dealing with low network speed during tftp, the analysis showed >> two issues - UEFI tftp and network stack spend a lot of time (~3.5ms, >> comparing to U-Boot's ~0.6ms) on preparing ACK packet after receiving >> data block from host. The network driver itself is using SNP and its >> time spent on executing SnpTransmit routine is negligible, so it is >> definitely not a problem. >> >> This patch however is only releated to above mentioned problem. It >> occurred that despite our MTU is set to 1500, each block of data has >> to be split to 512 chunks, so the very long receive/ack sequence was >> executed three times more than needed. >> >> Below is an example of a solution of increasing TFTP block size >> to maximum allowed by 1500 MTU. The default block size is changed, >> as well as this option is negotiatied with host. For sure a situation, >> when proposed, increased block size is rejected by host (a default >> fall back to 512 should happen) should be handled properly. >> >> Also a dynamic dependency between port's MTU was considered, but there >> are two problems - how to pass it to Mtftp4 module and way of negotiating >> size with host - option requires string format. Hence IMO it's better >> to stick to arbitrary size. >> >> I would be very grateful for any comments and ideas, how to handle >> this issue properly. >> >> Best reards, >> Marcin >> >> --- >> MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.h | 2 +- >> ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c | 5 +++++ >> 2 files changed, 6 insertions(+), 1 deletion(-) >> >> diff --git a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.h >> b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.h >> index 527fd1d..9a2d409 100644 >> --- a/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.h >> +++ b/MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Impl.h >> @@ -55,7 +55,7 @@ typedef struct _MTFTP4_PROTOCOL >> MTFTP4_PROTOCOL; >> #define MTFTP4_DEFAULT_SERVER_PORT 69 >> #define MTFTP4_DEFAULT_TIMEOUT 3 >> #define MTFTP4_DEFAULT_RETRY 5 >> -#define MTFTP4_DEFAULT_BLKSIZE 512 >> +#define MTFTP4_DEFAULT_BLKSIZE 1468 >> #define MTFTP4_TIME_TO_GETMAP 5 >> >> #define MTFTP4_STATE_UNCONFIGED 0 >> diff --git a/ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c >> b/ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c >> index 831b9c3..3e06b67 100644 >> --- a/ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c >> +++ b/ShellPkg/Library/UefiShellTftpCommandLib/Tftp.c >> @@ -894,12 +894,17 @@ DownloadFile ( >> TftpContext->DownloadedNbOfBytes = 0; >> TftpContext->LastReportedNbOfBytes = 0; >> >> + UINT8 name[] = "blksize"; >> + UINT8 val[] = "1468"; >> + EFI_MTFTP4_OPTION Blksize = { name, val }; >> ZeroMem (&Mtftp4Token, sizeof (EFI_MTFTP4_TOKEN)); >> Mtftp4Token.Filename = (UINT8*)AsciiFilePath; >> Mtftp4Token.BufferSize = FileSize; >> Mtftp4Token.Buffer = Buffer; >> Mtftp4Token.CheckPacket = CheckPacket; >> Mtftp4Token.Context = (VOID*)TftpContext; >> + Mtftp4Token.OptionCount = 1; >> + Mtftp4Token.OptionList = &Blksize; >> >> ShellPrintHiiEx ( >> -1, -1, NULL, STRING_TOKEN (STR_TFTP_DOWNLOADING), >> -- >> 1.8.3.1 >> >> _______________________________________________ >> edk2-devel mailing list >> [email protected] >> https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

