]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Get MaxPacketSize from IP4 mode data and reduce the head size of UDP and MTFTP, and...
authorljin6 <ljin6@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 1 Feb 2010 03:32:28 +0000 (03:32 +0000)
committerljin6 <ljin6@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 1 Feb 2010 03:32:28 +0000 (03:32 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9894 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c
MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDriver.c
MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c
MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.h

index f2d8eecfe2b1cb335a65f8064db5670723259e48..d2e60b6a592f339a8ad92532229dda9dd761e93b 100644 (file)
@@ -1270,7 +1270,9 @@ PxeBcDiscvBootService (
     //\r
     // free the responselist\r
     //\r
-    FreePool (Token.ResponseList);\r
+    if (Token.ResponseList != NULL) {\r
+      FreePool (Token.ResponseList);\r
+    }\r
   }\r
   //\r
   // Free the dhcp packet\r
index 9dc32f2ce7faf0de6d15122a10766ca8fe403c33..f82f744b762fb0a022b4089892e19207280c5bc0 100644 (file)
@@ -152,6 +152,7 @@ PxeBcDriverBindingStart (
   PXEBC_PRIVATE_DATA  *Private;\r
   UINTN               Index;\r
   EFI_STATUS          Status;\r
+  EFI_IP4_MODE_DATA   Ip4ModeData;\r
 \r
   Private = AllocateZeroPool (sizeof (PXEBC_PRIVATE_DATA));\r
   if (Private == NULL) {\r
@@ -253,6 +254,16 @@ PxeBcDriverBindingStart (
   if (EFI_ERROR (Status)) {\r
     goto ON_ERROR;\r
   }\r
+
+  //
+  // Get max packet size from Ip4 to calculate block size for Tftp later.\r
+  //
+  Status = Private->Ip4->GetModeData (Private->Ip4, &Ip4ModeData, NULL, NULL);
+  if (EFI_ERROR (Status)) {
+    goto ON_ERROR;  
+  }
+
+  Private->Ip4MaxPacketSize = Ip4ModeData.MaxPacketSize;\r
 \r
   Status = NetLibCreateServiceChild (\r
              ControllerHandle,\r
index e5ff4addf67fee01f60df4cf5c8af7ef74a956b5..df9d2df5be2ad76c4b9d6c6e2540101528aed2fb 100644 (file)
@@ -347,6 +347,11 @@ EfiPxeBcStart (
     return Status;\r
   }\r
 \r
+  //\r
+  // Configure block size for TFTP as a default value to handle all link layers.\r
+  // \r
+  Private->BlockSize   = (UINTN) (MIN (Private->Ip4MaxPacketSize, PXEBC_DEFAULT_PACKET_SIZE) - \r
+                           PXEBC_DEFAULT_UDP_OVERHEAD_SIZE - PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE);\r
   Private->AddressIsOk = FALSE;\r
 \r
   ZeroMem (Mode, sizeof (EFI_PXE_BASE_CODE_MODE));\r
@@ -2421,7 +2426,6 @@ DiscoverBootFile (
   UINT16                      Type;\r
   UINT16                      Layer;\r
   BOOLEAN                     UseBis;\r
-  UINTN                       BlockSize;\r
   PXEBC_CACHED_DHCP4_PACKET   *Packet;\r
   UINT16                      Value;\r
 \r
@@ -2466,7 +2470,6 @@ DiscoverBootFile (
   }\r
 \r
   *BufferSize = 0;\r
-  BlockSize   = 0x8000;\r
 \r
   //\r
   // Get bootfile name and (m)tftp server ip addresss\r
@@ -2526,7 +2529,7 @@ DiscoverBootFile (
                       Buffer,\r
                       FALSE,\r
                       BufferSize,\r
-                      &BlockSize,\r
+                      &Private->BlockSize,\r
                       &Private->ServerIp,\r
                       (UINT8 *) Private->BootFileName,\r
                       NULL,\r
@@ -2580,14 +2583,12 @@ EfiPxeLoadFile (
   PXEBC_PRIVATE_DATA          *Private;\r
   EFI_PXE_BASE_CODE_PROTOCOL  *PxeBc;\r
   BOOLEAN                     NewMakeCallback;\r
-  UINTN                       BlockSize;\r
   EFI_STATUS                  Status;\r
   UINT64                      TmpBufSize;\r
 \r
   Private         = PXEBC_PRIVATE_DATA_FROM_LOADFILE (This);\r
   PxeBc           = &Private->PxeBc;\r
   NewMakeCallback = FALSE;\r
-  BlockSize       = 0x8000;\r
   Status          = EFI_DEVICE_ERROR;\r
 \r
   if (This == NULL || BufferSize == NULL) {\r
@@ -2646,7 +2647,7 @@ EfiPxeLoadFile (
                         Buffer,\r
                         FALSE,\r
                         &TmpBufSize,\r
-                        &BlockSize,\r
+                        &Private->BlockSize,\r
                         &Private->ServerIp,\r
                         (UINT8 *) Private->BootFileName,\r
                         NULL,\r
@@ -2670,7 +2671,7 @@ EfiPxeLoadFile (
                       Buffer,\r
                       FALSE,\r
                       &TmpBufSize,\r
-                      &BlockSize,\r
+                      &Private->BlockSize,\r
                       &Private->ServerIp,\r
                       (UINT8 *) Private->BootFileName,\r
                       NULL,\r
index e8c278db04466875ec14739235a30614a5316a16..807e4d128a7ed94001fa5ec38054992e243d9a83 100644 (file)
@@ -47,8 +47,11 @@ typedef struct _PXEBC_PRIVATE_DATA  PXEBC_PRIVATE_DATA;
 #include "PxeBcSupport.h"\r
 \r
 #define PXEBC_PRIVATE_DATA_SIGNATURE  SIGNATURE_32 ('P', 'X', 'E', 'P')\r
-#define PXEBC_MTFTP_TIMEOUT           4\r
-#define PXEBC_MTFTP_RETRIES           6\r
+#define PXEBC_MTFTP_TIMEOUT                4\r
+#define PXEBC_MTFTP_RETRIES                6\r
+#define PXEBC_DEFAULT_UDP_OVERHEAD_SIZE    8
+#define PXEBC_DEFAULT_TFTP_OVERHEAD_SIZE   4\r
+#define PXEBC_DEFAULT_PACKET_SIZE          1480 \r
 \r
 struct _PXEBC_PRIVATE_DATA {\r
   UINT32                                    Signature;\r
@@ -88,7 +91,8 @@ struct _PXEBC_PRIVATE_DATA {
   EFI_IP_ADDRESS                            GatewayIp;\r
   EFI_IP_ADDRESS                            ServerIp;\r
   BOOLEAN                                   AddressIsOk;\r
-\r
+  UINT32                                    Ip4MaxPacketSize;\r
+  UINTN                                     BlockSize;\r
   UINTN                                     FileSize;\r
 \r
   UINT8                                     OptionBuffer[PXEBC_DHCP4_MAX_OPTION_SIZE];\r