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

