]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcDhcp.c
Update these library instances module type to UEFI_DIRVER, because they only depends...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / UefiPxeBcDxe / PxeBcDhcp.c
index ee17ea358dcaefee387db275ad217d5100e13460..c70390ab2e72c9375c78c5b829e84df0e7c7bbd4 100644 (file)
@@ -754,11 +754,14 @@ PxeBcDhcpCallBack (
   UINT16                              Value;\r
   EFI_STATUS                          Status;\r
   BOOLEAN                             Received;\r
+  CHAR8                               *SystemSerialNumber;\r
+  EFI_DHCP4_HEADER                    *DhcpHeader;\r
 \r
   if ((Dhcp4Event != Dhcp4RcvdOffer) &&\r
       (Dhcp4Event != Dhcp4SelectOffer) &&\r
       (Dhcp4Event != Dhcp4SendDiscover) &&\r
-      (Dhcp4Event != Dhcp4RcvdAck)) {\r
+      (Dhcp4Event != Dhcp4RcvdAck) &&\r
+      (Dhcp4Event != Dhcp4SendRequest)) {\r
     return EFI_SUCCESS;\r
   }\r
 \r
@@ -798,10 +801,32 @@ PxeBcDhcpCallBack (
   switch (Dhcp4Event) {\r
 \r
   case Dhcp4SendDiscover:\r
-    //\r
-    // Cache the dhcp discover packet, of which some information will be used later.\r
-    //\r
-    CopyMem (Mode->DhcpDiscover.Raw, &Packet->Dhcp4, Packet->Length);\r
+  case Dhcp4SendRequest:\r
+    if (Mode->SendGUID) {\r
+      //\r
+      // send the system GUID instead of the MAC address as the hardware address\r
+      // in the DHCP packet header.\r
+      //\r
+      DhcpHeader = &Packet->Dhcp4.Header;\r
+\r
+      if (EFI_ERROR (GetSmbiosSystemGuidAndSerialNumber ((EFI_GUID *) DhcpHeader->ClientHwAddr, &SystemSerialNumber))) {\r
+        //\r
+        // GUID not yet set - send all 0xff's to show programable (via SetVariable)\r
+        // SetMem(DHCPV4_OPTIONS_BUFFER.DhcpPlatformId.Guid, sizeof(EFI_GUID), 0xff);\r
+        // GUID not yet set - send all 0's to show not programable\r
+        //\r
+        ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID));\r
+      }\r
+\r
+      DhcpHeader->HwAddrLen = sizeof (EFI_GUID);\r
+    }\r
+\r
+    if (Dhcp4Event == Dhcp4SendDiscover) {\r
+      //\r
+      // Cache the dhcp discover packet, of which some information will be used later.\r
+      //\r
+      CopyMem (Mode->DhcpDiscover.Raw, &Packet->Dhcp4, Packet->Length);\r
+    }\r
 \r
     break;\r
 \r
@@ -839,6 +864,9 @@ PxeBcDhcpCallBack (
 \r
     PxeBcCopyEfiDhcp4Packet (&Private->Dhcp4Ack.Packet.Ack, Packet);\r
     break;\r
+\r
+  default:\r
+    break;\r
   }\r
 \r
   return Status;\r
@@ -1041,6 +1069,9 @@ PxeBcDiscvBootService (
   EFI_DHCP4_PACKET_OPTION             *PxeOpt;\r
   PXEBC_OPTION_BOOT_ITEM              *PxeBootItem;\r
   UINT8                               VendorOptLen;\r
+  CHAR8                               *SystemSerialNumber;\r
+  EFI_DHCP4_HEADER                    *DhcpHeader;\r
+\r
 \r
   Mode      = Private->PxeBc.Mode;\r
   Dhcp4     = Private->Dhcp4;\r
@@ -1095,6 +1126,18 @@ PxeBcDiscvBootService (
     return Status;\r
   }\r
 \r
+  DhcpHeader = &Token.Packet->Dhcp4.Header;\r
+  if (Mode->SendGUID) {\r
+    if (EFI_ERROR (GetSmbiosSystemGuidAndSerialNumber ((EFI_GUID *) DhcpHeader->ClientHwAddr, &SystemSerialNumber))) {\r
+      //\r
+      // GUID not yet set - send all 0's to show not programable\r
+      //\r
+      ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID));\r
+    }\r
+\r
+    DhcpHeader->HwAddrLen = sizeof (EFI_GUID);\r
+  }\r
+\r
   Token.Packet->Dhcp4.Header.Xid      = NET_RANDOM (NetRandomInitSeed ());\r
   Token.Packet->Dhcp4.Header.Reserved = (UINT16) ((IsBCast) ? 0xf000 : 0x0);\r
   CopyMem (&Token.Packet->Dhcp4.Header.ClientAddr, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS));\r
@@ -1626,7 +1669,8 @@ PxeBcSelectBootMenu (
   }\r
 \r
   if (UseDefaultItem) {\r
-    *Type = NTOHS (MenuArray[0]->Type);\r
+    CopyMem (Type, &MenuArray[0]->Type, sizeof (UINT16));\r
+    *Type = NTOHS (*Type);\r
     return EFI_SUCCESS;\r
   }\r
 \r
@@ -1726,7 +1770,8 @@ PxeBcSelectBootMenu (
   //\r
   // Swap the byte order\r
   //\r
-  *Type = NTOHS (MenuArray[Select]->Type);\r
+  CopyMem (Type, &MenuArray[Select]->Type, sizeof (UINT16));\r
+  *Type = NTOHS (*Type);\r
 \r
   return EFI_SUCCESS;\r
 }\r