]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/UefiPxeBcDxe/PxeBcMtftp.c
NetworkPkg/UefiPxeBcDxe: Fix various typos
[mirror_edk2.git] / NetworkPkg / UefiPxeBcDxe / PxeBcMtftp.c
index 9a80dc5e38d2417ce107fce8507690b4fb8470c4..addcafc0c88cc7ffe79b630a17db758ad207deb1 100644 (file)
@@ -1,15 +1,9 @@
 /** @file\r
   Functions implementation related with Mtftp for UefiPxeBc Driver.\r
 \r
-  Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
 \r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php.\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -19,7 +13,8 @@ CHAR8 *mMtftpOptions[PXE_MTFTP_OPTION_MAXIMUM_INDEX] = {
   "blksize",\r
   "timeout",\r
   "tsize",\r
-  "multicast"\r
+  "multicast",\r
+  "windowsize"\r
 };\r
 \r
 \r
@@ -64,11 +59,13 @@ PxeBcMtftp6CheckPacket (
     //\r
     Private->Mode.TftpErrorReceived   = TRUE;\r
     Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
-    AsciiStrnCpy (\r
+    AsciiStrnCpyS (\r
       Private->Mode.TftpError.ErrorString,\r
+      PXE_MTFTP_ERROR_STRING_LENGTH,\r
       (CHAR8 *) Packet->Error.ErrorMessage,\r
-      PXE_MTFTP_ERROR_STRING_LENGTH\r
+      PXE_MTFTP_ERROR_STRING_LENGTH - 1\r
       );\r
+    Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';\r
   }\r
 \r
   if (Callback != NULL) {\r
@@ -106,10 +103,11 @@ PxeBcMtftp6CheckPacket (
   @param[in]      Config         Pointer to EFI_MTFTP6_CONFIG_DATA.\r
   @param[in]      Filename       Pointer to boot file name.\r
   @param[in]      BlockSize      Pointer to required block size.\r
+  @param[in]      WindowSize     Pointer to required window size.\r
   @param[in, out] BufferSize     Pointer to buffer size.\r
 \r
-  @retval EFI_SUCCESS        Sucessfully obtained the size of file.\r
-  @retval EFI_NOT_FOUND      Parse the tftp ptions failed.\r
+  @retval EFI_SUCCESS        Successfully obtained the size of file.\r
+  @retval EFI_NOT_FOUND      Parse the tftp options failed.\r
   @retval EFI_DEVICE_ERROR   The network device encountered an error during this operation.\r
   @retval Others             Has not obtained the size of the file.\r
 \r
@@ -120,15 +118,17 @@ PxeBcMtftp6GetFileSize (
   IN     EFI_MTFTP6_CONFIG_DATA       *Config,\r
   IN     UINT8                        *Filename,\r
   IN     UINTN                        *BlockSize,\r
+  IN     UINTN                        *WindowSize,\r
   IN OUT UINT64                       *BufferSize\r
   )\r
 {\r
   EFI_MTFTP6_PROTOCOL                 *Mtftp6;\r
-  EFI_MTFTP6_OPTION                   ReqOpt[2];\r
+  EFI_MTFTP6_OPTION                   ReqOpt[3];\r
   EFI_MTFTP6_PACKET                   *Packet;\r
   EFI_MTFTP6_OPTION                   *Option;\r
   UINT32                              PktLen;\r
-  UINT8                               OptBuf[128];\r
+  UINT8                               OptBuf[PXE_MTFTP_OPTBUF_MAXNUM_INDEX];\r
+  UINTN                               OptBufSize;\r
   UINT32                              OptCnt;\r
   EFI_STATUS                          Status;\r
 \r
@@ -138,6 +138,7 @@ PxeBcMtftp6GetFileSize (
   Packet                    = NULL;\r
   Option                    = NULL;\r
   PktLen                    = 0;\r
+  OptBufSize                = PXE_MTFTP_OPTBUF_MAXNUM_INDEX;\r
   OptCnt                    = 1;\r
   Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
 \r
@@ -150,13 +151,22 @@ PxeBcMtftp6GetFileSize (
   // Build the required options for get info.\r
   //\r
   ReqOpt[0].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX];\r
-  PxeBcUintnToAscDec (0, OptBuf);\r
+  PxeBcUintnToAscDec (0, OptBuf, OptBufSize);\r
   ReqOpt[0].ValueStr  = OptBuf;\r
 \r
   if (BlockSize != NULL) {\r
-    ReqOpt[1].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
-    ReqOpt[1].ValueStr  = (UINT8 *) (ReqOpt[0].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1);\r
-    PxeBcUintnToAscDec (*BlockSize, ReqOpt[1].ValueStr);\r
+    ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
+    ReqOpt[OptCnt].ValueStr  = (UINT8 *) (ReqOpt[OptCnt-1].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
+    OptBufSize -= (AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
+    PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, OptBufSize);\r
+    OptCnt++;\r
+  }\r
+\r
+  if (WindowSize != NULL) {\r
+    ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
+    ReqOpt[OptCnt].ValueStr  = (UINT8 *) (ReqOpt[OptCnt-1].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
+    OptBufSize -= (AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
+    PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, OptBufSize);\r
     OptCnt++;\r
   }\r
 \r
@@ -177,11 +187,13 @@ PxeBcMtftp6GetFileSize (
       //\r
       Private->Mode.TftpErrorReceived   = TRUE;\r
       Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
-      AsciiStrnCpy (\r
+      AsciiStrnCpyS (\r
         Private->Mode.TftpError.ErrorString,\r
+        PXE_MTFTP_ERROR_STRING_LENGTH,\r
         (CHAR8 *) Packet->Error.ErrorMessage,\r
-        PXE_MTFTP_ERROR_STRING_LENGTH\r
+        PXE_MTFTP_ERROR_STRING_LENGTH - 1\r
         );\r
+      Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';\r
     }\r
     goto ON_ERROR;\r
   }\r
@@ -231,6 +243,7 @@ ON_ERROR:
   @param[in]      Config         Pointer to EFI_MTFTP6_CONFIG_DATA.\r
   @param[in]      Filename       Pointer to boot file name.\r
   @param[in]      BlockSize      Pointer to required block size.\r
+  @param[in]      WindowSize     Pointer to required window size.\r
   @param[in]      BufferPtr      Pointer to buffer.\r
   @param[in, out] BufferSize     Pointer to buffer size.\r
   @param[in]      DontUseBuffer  Indicates whether with a receive buffer.\r
@@ -246,6 +259,7 @@ PxeBcMtftp6ReadFile (
   IN     EFI_MTFTP6_CONFIG_DATA       *Config,\r
   IN     UINT8                        *Filename,\r
   IN     UINTN                        *BlockSize,\r
+  IN     UINTN                        *WindowSize,\r
   IN     UINT8                        *BufferPtr,\r
   IN OUT UINT64                       *BufferSize,\r
   IN     BOOLEAN                      DontUseBuffer\r
@@ -253,9 +267,10 @@ PxeBcMtftp6ReadFile (
 {\r
   EFI_MTFTP6_PROTOCOL                 *Mtftp6;\r
   EFI_MTFTP6_TOKEN                    Token;\r
-  EFI_MTFTP6_OPTION                   ReqOpt[1];\r
+  EFI_MTFTP6_OPTION                   ReqOpt[2];\r
   UINT32                              OptCnt;\r
-  UINT8                               OptBuf[128];\r
+  UINT8                               BlksizeBuf[10];\r
+  UINT8                               WindowsizeBuf[10];\r
   EFI_STATUS                          Status;\r
 \r
   Status                    = EFI_DEVICE_ERROR;\r
@@ -269,12 +284,20 @@ PxeBcMtftp6ReadFile (
   }\r
 \r
   if (BlockSize != NULL) {\r
-    ReqOpt[0].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
-    ReqOpt[0].ValueStr  = OptBuf;\r
-    PxeBcUintnToAscDec (*BlockSize, ReqOpt[0].ValueStr);\r
+    ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
+    ReqOpt[OptCnt].ValueStr  = BlksizeBuf;\r
+    PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, sizeof (BlksizeBuf));\r
+    OptCnt++;\r
+  }\r
+\r
+  if (WindowSize != NULL) {\r
+    ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
+    ReqOpt[OptCnt].ValueStr  = WindowsizeBuf;\r
+    PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, sizeof (WindowsizeBuf));\r
     OptCnt++;\r
   }\r
 \r
+\r
   Token.Event         = NULL;\r
   Token.OverrideData  = NULL;\r
   Token.Filename      = Filename;\r
@@ -354,7 +377,7 @@ PxeBcMtftp6WriteFile (
   if (BlockSize != NULL) {\r
     ReqOpt[0].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
     ReqOpt[0].ValueStr  = OptBuf;\r
-    PxeBcUintnToAscDec (*BlockSize, ReqOpt[0].ValueStr);\r
+    PxeBcUintnToAscDec (*BlockSize, ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\r
     OptCnt++;\r
   }\r
 \r
@@ -389,6 +412,7 @@ PxeBcMtftp6WriteFile (
   @param[in]       Config         Pointer to EFI_MTFTP6_CONFIG_DATA.\r
   @param[in]       Filename       Pointer to boot file name.\r
   @param[in]       BlockSize      Pointer to required block size.\r
+  @param[in]       WindowSize     Pointer to required window size.\r
   @param[in]       BufferPtr      Pointer to buffer.\r
   @param[in, out]  BufferSize     Pointer to buffer size.\r
   @param[in]       DontUseBuffer  Indicates whether to use a receive buffer.\r
@@ -404,6 +428,7 @@ PxeBcMtftp6ReadDirectory (
   IN     EFI_MTFTP6_CONFIG_DATA        *Config,\r
   IN     UINT8                         *Filename,\r
   IN     UINTN                         *BlockSize,\r
+  IN     UINTN                         *WindowSize,\r
   IN     UINT8                         *BufferPtr,\r
   IN OUT UINT64                        *BufferSize,\r
   IN     BOOLEAN                       DontUseBuffer\r
@@ -411,9 +436,10 @@ PxeBcMtftp6ReadDirectory (
 {\r
   EFI_MTFTP6_PROTOCOL                  *Mtftp6;\r
   EFI_MTFTP6_TOKEN                     Token;\r
-  EFI_MTFTP6_OPTION                    ReqOpt[1];\r
+  EFI_MTFTP6_OPTION                    ReqOpt[2];\r
   UINT32                               OptCnt;\r
-  UINT8                                OptBuf[128];\r
+  UINT8                                BlksizeBuf[10];\r
+  UINT8                                WindowsizeBuf[10];\r
   EFI_STATUS                           Status;\r
 \r
   Status                    = EFI_DEVICE_ERROR;\r
@@ -427,9 +453,16 @@ PxeBcMtftp6ReadDirectory (
   }\r
 \r
   if (BlockSize != NULL) {\r
-    ReqOpt[0].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
-    ReqOpt[0].ValueStr  = OptBuf;\r
-    PxeBcUintnToAscDec (*BlockSize, ReqOpt[0].ValueStr);\r
+    ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
+    ReqOpt[OptCnt].ValueStr  = BlksizeBuf;\r
+    PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, sizeof (BlksizeBuf));\r
+    OptCnt++;\r
+  }\r
+\r
+  if (WindowSize != NULL) {\r
+    ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
+    ReqOpt[OptCnt].ValueStr  = WindowsizeBuf;\r
+    PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, sizeof (WindowsizeBuf));\r
     OptCnt++;\r
   }\r
 \r
@@ -479,7 +512,7 @@ PxeBcMtftp6ReadDirectory (
   @param[in]  PacketLen      Length of EFI_MTFTP4_PACKET.\r
   @param[in]  Packet         Pointer to EFI_MTFTP4_PACKET to be checked.\r
 \r
-  @retval EFI_SUCCESS    The current operation succeeeded.\r
+  @retval EFI_SUCCESS    The current operation succeeded.\r
   @retval EFI_ABORTED    Abort the current transfer process.\r
 \r
 **/\r
@@ -506,11 +539,13 @@ PxeBcMtftp4CheckPacket (
     //\r
     Private->Mode.TftpErrorReceived   = TRUE;\r
     Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
-    AsciiStrnCpy (\r
+    AsciiStrnCpyS (\r
       Private->Mode.TftpError.ErrorString,\r
+      PXE_MTFTP_ERROR_STRING_LENGTH,\r
       (CHAR8 *) Packet->Error.ErrorMessage,\r
-      PXE_MTFTP_ERROR_STRING_LENGTH\r
+      PXE_MTFTP_ERROR_STRING_LENGTH - 1\r
       );\r
+    Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';\r
   }\r
 \r
   if (Callback != NULL) {\r
@@ -548,6 +583,7 @@ PxeBcMtftp4CheckPacket (
   @param[in]      Config         Pointer to EFI_MTFTP4_CONFIG_DATA.\r
   @param[in]      Filename       Pointer to boot file name.\r
   @param[in]      BlockSize      Pointer to required block size.\r
+  @param[in]      WindowSize     Pointer to required window size.\r
   @param[in, out] BufferSize     Pointer to buffer size.\r
 \r
   @retval EFI_SUCCESS        Successfully obtained the size of file.\r
@@ -562,15 +598,17 @@ PxeBcMtftp4GetFileSize (
   IN     EFI_MTFTP4_CONFIG_DATA     *Config,\r
   IN     UINT8                      *Filename,\r
   IN     UINTN                      *BlockSize,\r
+  IN     UINTN                      *WindowSize,\r
   IN OUT UINT64                     *BufferSize\r
   )\r
 {\r
   EFI_MTFTP4_PROTOCOL *Mtftp4;\r
-  EFI_MTFTP4_OPTION   ReqOpt[2];\r
+  EFI_MTFTP4_OPTION   ReqOpt[3];\r
   EFI_MTFTP4_PACKET   *Packet;\r
   EFI_MTFTP4_OPTION   *Option;\r
   UINT32              PktLen;\r
-  UINT8               OptBuf[128];\r
+  UINT8               OptBuf[PXE_MTFTP_OPTBUF_MAXNUM_INDEX];\r
+  UINTN               OptBufSize;\r
   UINT32              OptCnt;\r
   EFI_STATUS          Status;\r
 \r
@@ -580,6 +618,7 @@ PxeBcMtftp4GetFileSize (
   Packet                    = NULL;\r
   Option                    = NULL;\r
   PktLen                    = 0;\r
+  OptBufSize                = PXE_MTFTP_OPTBUF_MAXNUM_INDEX;\r
   OptCnt                    = 1;\r
   Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
 \r
@@ -592,13 +631,22 @@ PxeBcMtftp4GetFileSize (
   // Build the required options for get info.\r
   //\r
   ReqOpt[0].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX];\r
-  PxeBcUintnToAscDec (0, OptBuf);\r
+  PxeBcUintnToAscDec (0, OptBuf, OptBufSize);\r
   ReqOpt[0].ValueStr  = OptBuf;\r
 \r
   if (BlockSize != NULL) {\r
-    ReqOpt[1].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
-    ReqOpt[1].ValueStr  = (UINT8 *) (ReqOpt[0].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1);\r
-    PxeBcUintnToAscDec (*BlockSize, ReqOpt[1].ValueStr);\r
+    ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
+    ReqOpt[OptCnt].ValueStr  = (UINT8 *) (ReqOpt[OptCnt-1].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
+    OptBufSize -= (AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
+    PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, OptBufSize);\r
+    OptCnt++;\r
+  }\r
+\r
+  if (WindowSize != NULL) {\r
+    ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
+    ReqOpt[OptCnt].ValueStr  = (UINT8 *) (ReqOpt[OptCnt-1].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
+    OptBufSize -= (AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
+    PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, OptBufSize);\r
     OptCnt++;\r
   }\r
 \r
@@ -619,11 +667,13 @@ PxeBcMtftp4GetFileSize (
       //\r
       Private->Mode.TftpErrorReceived   = TRUE;\r
       Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
-      AsciiStrnCpy (\r
+      AsciiStrnCpyS (\r
         Private->Mode.TftpError.ErrorString,\r
+        PXE_MTFTP_ERROR_STRING_LENGTH,\r
         (CHAR8 *) Packet->Error.ErrorMessage,\r
-        PXE_MTFTP_ERROR_STRING_LENGTH\r
+        PXE_MTFTP_ERROR_STRING_LENGTH - 1\r
         );\r
+      Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';\r
     }\r
     goto ON_ERROR;\r
   }\r
@@ -673,6 +723,7 @@ ON_ERROR:
   @param[in]      Config         Pointer to EFI_MTFTP4_CONFIG_DATA.\r
   @param[in]      Filename       Pointer to boot file name.\r
   @param[in]      BlockSize      Pointer to required block size.\r
+  @param[in]      WindowSize     Pointer to required window size.\r
   @param[in]      BufferPtr      Pointer to buffer.\r
   @param[in, out] BufferSize     Pointer to buffer size.\r
   @param[in]      DontUseBuffer  Indicates whether to use a receive buffer.\r
@@ -688,6 +739,7 @@ PxeBcMtftp4ReadFile (
   IN     EFI_MTFTP4_CONFIG_DATA     *Config,\r
   IN     UINT8                      *Filename,\r
   IN     UINTN                      *BlockSize,\r
+  IN     UINTN                      *WindowSize,\r
   IN     UINT8                      *BufferPtr,\r
   IN OUT UINT64                     *BufferSize,\r
   IN     BOOLEAN                    DontUseBuffer\r
@@ -695,9 +747,10 @@ PxeBcMtftp4ReadFile (
 {\r
   EFI_MTFTP4_PROTOCOL *Mtftp4;\r
   EFI_MTFTP4_TOKEN    Token;\r
-  EFI_MTFTP4_OPTION   ReqOpt[1];\r
+  EFI_MTFTP4_OPTION   ReqOpt[2];\r
   UINT32              OptCnt;\r
-  UINT8               OptBuf[128];\r
+  UINT8               BlksizeBuf[10];\r
+  UINT8               WindowsizeBuf[10];\r
   EFI_STATUS          Status;\r
 \r
   Status                    = EFI_DEVICE_ERROR;\r
@@ -711,9 +764,16 @@ PxeBcMtftp4ReadFile (
   }\r
 \r
   if (BlockSize != NULL) {\r
-    ReqOpt[0].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
-    ReqOpt[0].ValueStr  = OptBuf;\r
-    PxeBcUintnToAscDec (*BlockSize, ReqOpt[0].ValueStr);\r
+    ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
+    ReqOpt[OptCnt].ValueStr  = BlksizeBuf;\r
+    PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, sizeof (BlksizeBuf));\r
+    OptCnt++;\r
+  }\r
+\r
+  if (WindowSize != NULL) {\r
+    ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
+    ReqOpt[OptCnt].ValueStr  = WindowsizeBuf;\r
+    PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, sizeof (WindowsizeBuf));\r
     OptCnt++;\r
   }\r
 \r
@@ -796,7 +856,7 @@ PxeBcMtftp4WriteFile (
   if (BlockSize != NULL) {\r
     ReqOpt[0].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
     ReqOpt[0].ValueStr  = OptBuf;\r
-    PxeBcUintnToAscDec (*BlockSize, ReqOpt[0].ValueStr);\r
+    PxeBcUintnToAscDec (*BlockSize, ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\r
     OptCnt++;\r
   }\r
 \r
@@ -831,11 +891,12 @@ PxeBcMtftp4WriteFile (
   @param[in]       Config         Pointer to EFI_MTFTP4_CONFIG_DATA.\r
   @param[in]       Filename       Pointer to boot file name.\r
   @param[in]       BlockSize      Pointer to required block size.\r
+  @param[in]       WindowSize     Pointer to required window size.\r
   @param[in]       BufferPtr      Pointer to buffer.\r
   @param[in, out]  BufferSize     Pointer to buffer size.\r
   @param[in]       DontUseBuffer  Indicates whether to use a receive buffer.\r
 \r
-  @retval EFI_SUCCES         Successfully obtained the data from the file included in the directory.\r
+  @retval EFI_SUCCESS        Successfully obtained the data from the file included in the directory.\r
   @retval EFI_DEVICE_ERROR   The network device encountered an error during this operation.\r
   @retval Others             Operation failed.\r
 \r
@@ -846,6 +907,7 @@ PxeBcMtftp4ReadDirectory (
   IN     EFI_MTFTP4_CONFIG_DATA        *Config,\r
   IN     UINT8                         *Filename,\r
   IN     UINTN                         *BlockSize,\r
+  IN     UINTN                         *WindowSize,\r
   IN     UINT8                         *BufferPtr,\r
   IN OUT UINT64                        *BufferSize,\r
   IN     BOOLEAN                       DontUseBuffer\r
@@ -853,9 +915,10 @@ PxeBcMtftp4ReadDirectory (
 {\r
   EFI_MTFTP4_PROTOCOL *Mtftp4;\r
   EFI_MTFTP4_TOKEN    Token;\r
-  EFI_MTFTP4_OPTION   ReqOpt[1];\r
+  EFI_MTFTP4_OPTION   ReqOpt[2];\r
   UINT32              OptCnt;\r
-  UINT8               OptBuf[128];\r
+  UINT8               BlksizeBuf[10];\r
+  UINT8               WindowsizeBuf[10];\r
   EFI_STATUS          Status;\r
 \r
   Status                    = EFI_DEVICE_ERROR;\r
@@ -869,9 +932,16 @@ PxeBcMtftp4ReadDirectory (
   }\r
 \r
   if (BlockSize != NULL) {\r
-    ReqOpt[0].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
-    ReqOpt[0].ValueStr  = OptBuf;\r
-    PxeBcUintnToAscDec (*BlockSize, ReqOpt[0].ValueStr);\r
+    ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
+    ReqOpt[OptCnt].ValueStr  = BlksizeBuf;\r
+    PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, sizeof (BlksizeBuf));\r
+    OptCnt++;\r
+  }\r
+\r
+  if (WindowSize != NULL) {\r
+    ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
+    ReqOpt[OptCnt].ValueStr  = WindowsizeBuf;\r
+    PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, sizeof (WindowsizeBuf));\r
     OptCnt++;\r
   }\r
 \r
@@ -914,6 +984,7 @@ PxeBcMtftp4ReadDirectory (
   @param[in]      Config         Pointer to configure data.\r
   @param[in]      Filename       Pointer to boot file name.\r
   @param[in]      BlockSize      Pointer to required block size.\r
+  @param[in]      WindowSize     Pointer to required window size.\r
   @param[in, out] BufferSize     Pointer to buffer size.\r
 \r
   @retval EFI_SUCCESS        Successfully obtained the size of file.\r
@@ -928,6 +999,7 @@ PxeBcTftpGetFileSize (
   IN     VOID                       *Config,\r
   IN     UINT8                      *Filename,\r
   IN     UINTN                      *BlockSize,\r
+  IN     UINTN                      *WindowSize,\r
   IN OUT UINT64                     *BufferSize\r
   )\r
 {\r
@@ -937,6 +1009,7 @@ PxeBcTftpGetFileSize (
              (EFI_MTFTP6_CONFIG_DATA *) Config,\r
              Filename,\r
              BlockSize,\r
+             WindowSize,\r
              BufferSize\r
              );\r
   } else {\r
@@ -945,6 +1018,7 @@ PxeBcTftpGetFileSize (
              (EFI_MTFTP4_CONFIG_DATA *) Config,\r
              Filename,\r
              BlockSize,\r
+             WindowSize,\r
              BufferSize\r
              );\r
   }\r
@@ -958,11 +1032,12 @@ PxeBcTftpGetFileSize (
   @param[in]      Config         Pointer to config data.\r
   @param[in]      Filename       Pointer to boot file name.\r
   @param[in]      BlockSize      Pointer to required block size.\r
+  @param[in]      WindowSize     Pointer to required window size.\r
   @param[in]      BufferPtr      Pointer to buffer.\r
   @param[in, out] BufferSize     Pointer to buffer size.\r
   @param[in]      DontUseBuffer  Indicates whether to use a receive buffer.\r
 \r
-  @retval EFI_SUCCESS        Sucessfully read the data from the special file.\r
+  @retval EFI_SUCCESS        Successfully read the data from the special file.\r
   @retval EFI_DEVICE_ERROR   The network device encountered an error during this operation.\r
   @retval Others             Read data from file failed.\r
 \r
@@ -973,6 +1048,7 @@ PxeBcTftpReadFile (
   IN     VOID                       *Config,\r
   IN     UINT8                      *Filename,\r
   IN     UINTN                      *BlockSize,\r
+  IN     UINTN                      *WindowSize,\r
   IN     UINT8                      *BufferPtr,\r
   IN OUT UINT64                     *BufferSize,\r
   IN     BOOLEAN                    DontUseBuffer\r
@@ -984,6 +1060,7 @@ PxeBcTftpReadFile (
              (EFI_MTFTP6_CONFIG_DATA *) Config,\r
              Filename,\r
              BlockSize,\r
+             WindowSize,\r
              BufferPtr,\r
              BufferSize,\r
              DontUseBuffer\r
@@ -994,6 +1071,7 @@ PxeBcTftpReadFile (
              (EFI_MTFTP4_CONFIG_DATA *) Config,\r
              Filename,\r
              BlockSize,\r
+             WindowSize,\r
              BufferPtr,\r
              BufferSize,\r
              DontUseBuffer\r
@@ -1060,11 +1138,12 @@ PxeBcTftpWriteFile (
   @param[in]       Config         Pointer to config data.\r
   @param[in]       Filename       Pointer to boot file name.\r
   @param[in]       BlockSize      Pointer to required block size.\r
+  @param[in]       WindowSize     Pointer to required window size.\r
   @param[in]       BufferPtr      Pointer to buffer.\r
   @param[in, out]  BufferSize     Pointer to buffer size.\r
   @param[in]       DontUseBuffer  Indicatse whether to use a receive buffer.\r
 \r
-  @retval EFI_SUCCES         Successfully obtained the data from the file included in the directory.\r
+  @retval EFI_SUCCESS        Successfully obtained the data from the file included in the directory.\r
   @retval EFI_DEVICE_ERROR   The network device encountered an error during this operation.\r
   @retval Others             Operation failed.\r
 \r
@@ -1075,6 +1154,7 @@ PxeBcTftpReadDirectory (
   IN     VOID                          *Config,\r
   IN     UINT8                         *Filename,\r
   IN     UINTN                         *BlockSize,\r
+  IN     UINTN                         *WindowSize,\r
   IN     UINT8                         *BufferPtr,\r
   IN OUT UINT64                        *BufferSize,\r
   IN     BOOLEAN                       DontUseBuffer\r
@@ -1086,6 +1166,7 @@ PxeBcTftpReadDirectory (
              (EFI_MTFTP6_CONFIG_DATA *) Config,\r
              Filename,\r
              BlockSize,\r
+             WindowSize,\r
              BufferPtr,\r
              BufferSize,\r
              DontUseBuffer\r
@@ -1096,6 +1177,7 @@ PxeBcTftpReadDirectory (
              (EFI_MTFTP4_CONFIG_DATA *) Config,\r
              Filename,\r
              BlockSize,\r
+             WindowSize,\r
              BufferPtr,\r
              BufferSize,\r
              DontUseBuffer\r