]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcImpl.c
1. sync PXE boot trackers for Windows 2008 server.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / UefiPxeBcDxe / PxeBcImpl.c
index bed82ae21cff71f2cd27bfa31c81bfb0b472cd57..5a17537b1266b51bf7dbfe74e7a1698219ca8a01 100644 (file)
@@ -642,21 +642,12 @@ EfiPxeBcDhcp (
 \r
     ASSERT (Dhcp4Mode.State == Dhcp4Bound);\r
 \r
-    CopyMem (\r
-      &Private->StationIp, \r
-      &Dhcp4Mode.ClientAddress, \r
-      sizeof (EFI_IPv4_ADDRESS)\r
-      );\r
-    CopyMem (\r
-      &Private->SubnetMask, \r
-      &Dhcp4Mode.SubnetMask, \r
-      sizeof (EFI_IPv4_ADDRESS)\r
-      );\r
-    CopyMem (\r
-      &Private->GatewayIp, \r
-      &Dhcp4Mode.RouterAddress, \r
-      sizeof (EFI_IPv4_ADDRESS)\r
-      );\r
+    CopyMem (&Private->StationIp, &Dhcp4Mode.ClientAddress, sizeof (EFI_IPv4_ADDRESS));\r
+    CopyMem (&Private->SubnetMask, &Dhcp4Mode.SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
+    CopyMem (&Private->GatewayIp, &Dhcp4Mode.RouterAddress, sizeof (EFI_IPv4_ADDRESS));\r
+\r
+    CopyMem (&Mode->StationIp, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS));\r
+    CopyMem (&Mode->SubnetMask, &Private->SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
 \r
     //\r
     // Check the selected offer to see whether BINL is required, if no or BINL is\r
@@ -1138,10 +1129,6 @@ EfiPxeBcMtftp (
               BufferSize\r
               );\r
 \r
-    if (!EFI_ERROR (Status)) {\r
-      Status = EFI_BUFFER_TOO_SMALL;\r
-    }\r
-\r
     break;\r
 \r
   case EFI_PXE_BASE_CODE_TFTP_READ_FILE:\r
@@ -1603,9 +1590,10 @@ TRY_AGAIN:
     RxData  = Token.Packet.RxData;\r
     Session = &RxData->UdpSession;\r
 \r
-    Matched = FALSE;\r
+    Matched = TRUE;\r
 \r
     if ((OpFlags & EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER) != 0) {\r
+      Matched = FALSE;\r
       //\r
       // Check UDP package by IP filter settings\r
       //\r
@@ -2509,16 +2497,24 @@ DiscoverBootFile (
     Packet = &Private->Dhcp4Ack;\r
   }\r
 \r
-  CopyMem (&Private->ServerIp, &Packet->Packet.Offer.Dhcp4.Header.ServerAddr, sizeof (EFI_IPv4_ADDRESS));\r
-  if (Private->ServerIp.Addr[0] == 0) {\r
-    //\r
-    // next server ip address is zero, use option 54 instead\r
-    //\r
+  //\r
+  // use option 54, if zero, use siaddr in header\r
+  //\r
+  if (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID] != NULL) {\r
     CopyMem (\r
       &Private->ServerIp,\r
       Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]->Data,\r
       sizeof (EFI_IPv4_ADDRESS)\r
       );\r
+  } else {\r
+    CopyMem (\r
+      &Private->ServerIp, \r
+      &Packet->Packet.Offer.Dhcp4.Header.ServerAddr, \r
+      sizeof (EFI_IPv4_ADDRESS)\r
+      );\r
+  }\r
+  if (Private->ServerIp.Addr[0] == 0) {\r
+    return EFI_DEVICE_ERROR;\r
   }\r
 \r
   ASSERT (Packet->Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL);\r
@@ -2658,10 +2654,25 @@ EfiPxeLoadFile (
 \r
     if (sizeof (UINTN) < sizeof (UINT64) && (TmpBufSize > 0xFFFFFFFF)) {\r
       Status = EFI_DEVICE_ERROR;\r
-    } else {\r
+    } else if (*BufferSize >= (UINTN) TmpBufSize && Buffer != NULL) {\r
+      *BufferSize = (UINTN) TmpBufSize;\r
+      Status = PxeBc->Mtftp (\r
+                        PxeBc,\r
+                        EFI_PXE_BASE_CODE_TFTP_READ_FILE,\r
+                        Buffer,\r
+                        FALSE,\r
+                        &TmpBufSize,\r
+                        &BlockSize,\r
+                        &Private->ServerIp,\r
+                        (UINT8 *) Private->BootFileName,\r
+                        NULL,\r
+                        FALSE\r
+                        );\r
+       } else {\r
       *BufferSize = (UINTN) TmpBufSize;\r
+      Status      = EFI_BUFFER_TOO_SMALL;\r
     }\r
-  } else if (Buffer == NULL) {\r
+  } else if (Buffer == NULL || Private->FileSize > *BufferSize) {\r
     *BufferSize = Private->FileSize;\r
     Status      = EFI_BUFFER_TOO_SMALL;\r
   } else {\r