]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/UefiPxeBcDxe/PxeBcMtftp.c
NetworkPkg/UefiPxeBcDxe: Use the specified MTFTP windowsize.
[mirror_edk2.git] / NetworkPkg / UefiPxeBcDxe / PxeBcMtftp.c
index 270190d42e4b75f6bbc1c34bf1e955d775501ef1..9725fb40dd8f1c3519149cf796e8dd3cc7acb1f8 100644 (file)
@@ -19,7 +19,8 @@ CHAR8 *mMtftpOptions[PXE_MTFTP_OPTION_MAXIMUM_INDEX] = {
   "blksize",\r
   "timeout",\r
   "tsize",\r
-  "multicast"\r
+  "multicast",\r
+  "windowsize"\r
 };\r
 \r
 \r
@@ -122,15 +123,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
@@ -140,6 +143,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
@@ -152,13 +156,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, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\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, PXE_MTFTP_OPTBUF_MAXNUM_INDEX - (AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1));\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
@@ -250,6 +263,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
@@ -257,9 +271,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
@@ -273,12 +288,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, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\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
@@ -408,6 +431,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
@@ -415,9 +439,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
@@ -431,9 +456,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, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\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
@@ -568,15 +600,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
@@ -586,6 +620,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
@@ -598,13 +633,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, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\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, PXE_MTFTP_OPTBUF_MAXNUM_INDEX - (AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1));\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
@@ -696,6 +740,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
@@ -703,9 +748,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
@@ -719,9 +765,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, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\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
@@ -854,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
@@ -861,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
@@ -877,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, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\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
@@ -936,6 +998,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
@@ -945,6 +1008,7 @@ PxeBcTftpGetFileSize (
              (EFI_MTFTP6_CONFIG_DATA *) Config,\r
              Filename,\r
              BlockSize,\r
+             WindowSize,\r
              BufferSize\r
              );\r
   } else {\r
@@ -953,6 +1017,7 @@ PxeBcTftpGetFileSize (
              (EFI_MTFTP4_CONFIG_DATA *) Config,\r
              Filename,\r
              BlockSize,\r
+             WindowSize,\r
              BufferSize\r
              );\r
   }\r
@@ -981,6 +1046,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
@@ -992,6 +1058,7 @@ PxeBcTftpReadFile (
              (EFI_MTFTP6_CONFIG_DATA *) Config,\r
              Filename,\r
              BlockSize,\r
+             WindowSize,\r
              BufferPtr,\r
              BufferSize,\r
              DontUseBuffer\r
@@ -1002,6 +1069,7 @@ PxeBcTftpReadFile (
              (EFI_MTFTP4_CONFIG_DATA *) Config,\r
              Filename,\r
              BlockSize,\r
+             WindowSize,\r
              BufferPtr,\r
              BufferSize,\r
              DontUseBuffer\r
@@ -1083,6 +1151,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
@@ -1094,6 +1163,7 @@ PxeBcTftpReadDirectory (
              (EFI_MTFTP6_CONFIG_DATA *) Config,\r
              Filename,\r
              BlockSize,\r
+             WindowSize,\r
              BufferPtr,\r
              BufferSize,\r
              DontUseBuffer\r
@@ -1104,6 +1174,7 @@ PxeBcTftpReadDirectory (
              (EFI_MTFTP4_CONFIG_DATA *) Config,\r
              Filename,\r
              BlockSize,\r
+             WindowSize,\r
              BufferPtr,\r
              BufferSize,\r
              DontUseBuffer\r