/** @file\r
Support for PxeBc dhcp functions.\r
\r
-Copyright (c) 2007 - 2010, Intel Corporation.<BR>\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>\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
EFI_DHCP4_PACKET_OPTION *Option;\r
UINT8 OfferType;\r
UINTN Index;\r
+ UINT8 *Ptr8;\r
\r
CachedPacket->IsPxeOffer = FALSE;\r
ZeroMem (CachedPacket->Dhcp4Option, sizeof (CachedPacket->Dhcp4Option));\r
sizeof (Offer->Dhcp4.Header.BootFileName),\r
PXEBC_DHCP4_TAG_BOOTFILE\r
);\r
+ //\r
+ // RFC 2132, Section 9.5 does not strictly state Bootfile name (option 67) is null \r
+ // terminated string. So force to append null terminated character at the end of string.\r
+ //\r
+ if (Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] != NULL) {\r
+ Ptr8 = (UINT8*)&Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Data[0];\r
+ Ptr8 += Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE]->Length;\r
+ *Ptr8 = '\0';\r
+ }\r
\r
} else if ((Options[PXEBC_DHCP4_TAG_INDEX_BOOTFILE] == NULL) &&\r
(Offer->Dhcp4.Header.BootFileName[0] != 0)) {\r
UINT16 Value;\r
EFI_STATUS Status;\r
BOOLEAN Received;\r
- CHAR8 *SystemSerialNumber;\r
EFI_DHCP4_HEADER *DhcpHeader;\r
\r
if ((Dhcp4Event != Dhcp4RcvdOffer) &&\r
//\r
DhcpHeader = &Packet->Dhcp4.Header;\r
\r
- if (EFI_ERROR (GetSmbiosSystemGuidAndSerialNumber ((EFI_GUID *) DhcpHeader->ClientHwAddr, &SystemSerialNumber))) {\r
+ if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) DhcpHeader->ClientHwAddr))) {\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
ZeroMem (DhcpHeader->ClientHwAddr, sizeof (EFI_GUID));\r
}\r
\r
- DhcpHeader->HwAddrLen = sizeof (EFI_GUID);\r
+ DhcpHeader->HwAddrLen = (UINT8) sizeof (EFI_GUID);\r
}\r
\r
if (Dhcp4Event == Dhcp4SendDiscover) {\r
UINT32 Index;\r
PXEBC_DHCP4_OPTION_ENTRY OptEnt;\r
UINT16 Value;\r
- CHAR8 *SystemSerialNumber;\r
\r
Index = 0;\r
OptList[0] = (EFI_DHCP4_PACKET_OPTION *) Private->OptionBuffer;\r
// Append max message size.\r
//\r
OptList[Index]->OpCode = PXEBC_DHCP4_TAG_MAXMSG;\r
- OptList[Index]->Length = sizeof (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE);\r
+ OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE);\r
OptEnt.MaxMesgSize = (PXEBC_DHCP4_OPTION_MAX_MESG_SIZE *) OptList[Index]->Data;\r
Value = NTOHS (PXEBC_DHCP4_MAX_PACKET_SIZE);\r
CopyMem (&OptEnt.MaxMesgSize->Size, &Value, sizeof (UINT16));\r
// Append UUID/Guid-based client identifier option\r
//\r
OptList[Index]->OpCode = PXEBC_PXE_DHCP4_TAG_UUID;\r
- OptList[Index]->Length = sizeof (PXEBC_DHCP4_OPTION_UUID);\r
+ OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_UUID);\r
OptEnt.Uuid = (PXEBC_DHCP4_OPTION_UUID *) OptList[Index]->Data;\r
OptEnt.Uuid->Type = 0;\r
Index++;\r
OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);\r
\r
- if (EFI_ERROR (GetSmbiosSystemGuidAndSerialNumber ((EFI_GUID *) OptEnt.Uuid->Guid, &SystemSerialNumber))) {\r
+ if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) OptEnt.Uuid->Guid))) {\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
// Append client network device interface option\r
//\r
OptList[Index]->OpCode = PXEBC_PXE_DHCP4_TAG_UNDI;\r
- OptList[Index]->Length = sizeof (PXEBC_DHCP4_OPTION_UNDI);\r
+ OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_UNDI);\r
OptEnt.Undi = (PXEBC_DHCP4_OPTION_UNDI *) OptList[Index]->Data;\r
if (Private->Nii != NULL) {\r
OptEnt.Undi->Type = Private->Nii->Type;\r
// Append client system architecture option\r
//\r
OptList[Index]->OpCode = PXEBC_PXE_DHCP4_TAG_ARCH;\r
- OptList[Index]->Length = sizeof (PXEBC_DHCP4_OPTION_ARCH);\r
+ OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_ARCH);\r
OptEnt.Arch = (PXEBC_DHCP4_OPTION_ARCH *) OptList[Index]->Data;\r
- Value = HTONS (SYS_ARCH);\r
+ Value = HTONS (EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE);\r
CopyMem (&OptEnt.Arch->Type, &Value, sizeof (UINT16));\r
Index++;\r
OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);\r
// Append client system architecture option\r
//\r
OptList[Index]->OpCode = PXEBC_DHCP4_TAG_CLASS_ID;\r
- OptList[Index]->Length = sizeof (PXEBC_DHCP4_OPTION_CLID);\r
+ OptList[Index]->Length = (UINT8) sizeof (PXEBC_DHCP4_OPTION_CLID);\r
OptEnt.Clid = (PXEBC_DHCP4_OPTION_CLID *) OptList[Index]->Data;\r
CopyMem (OptEnt.Clid, DEFAULT_CLASS_ID_DATA, sizeof (PXEBC_DHCP4_OPTION_CLID));\r
- CvtNum (SYS_ARCH, OptEnt.Clid->ArchitectureType, sizeof (OptEnt.Clid->ArchitectureType));\r
+ CvtNum (EFI_PXE_CLIENT_SYSTEM_ARCHITECTURE, OptEnt.Clid->ArchitectureType, sizeof (OptEnt.Clid->ArchitectureType));\r
\r
if (Private->Nii != NULL) {\r
//\r
EFI_DHCP4_PACKET_OPTION *PxeOpt;\r
PXEBC_OPTION_BOOT_ITEM *PxeBootItem;\r
UINT8 VendorOptLen;\r
- CHAR8 *SystemSerialNumber;\r
EFI_DHCP4_HEADER *DhcpHeader;\r
UINT32 Xid;\r
\r
//\r
// Add vendor option of PXE_BOOT_ITEM\r
//\r
- VendorOptLen = (sizeof (EFI_DHCP4_PACKET_OPTION) - 1) * 2 + sizeof (PXEBC_OPTION_BOOT_ITEM) + 1;\r
+ VendorOptLen = (UINT8) ((sizeof (EFI_DHCP4_PACKET_OPTION) - 1) * 2 + sizeof (PXEBC_OPTION_BOOT_ITEM) + 1);\r
OptList[OptCount] = AllocatePool (VendorOptLen);\r
if (OptList[OptCount] == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
OptList[OptCount]->Length = (UINT8) (VendorOptLen - 2);\r
PxeOpt = (EFI_DHCP4_PACKET_OPTION *) OptList[OptCount]->Data;\r
PxeOpt->OpCode = PXEBC_VENDOR_TAG_BOOT_ITEM;\r
- PxeOpt->Length = sizeof (PXEBC_OPTION_BOOT_ITEM);\r
+ PxeOpt->Length = (UINT8) sizeof (PXEBC_OPTION_BOOT_ITEM);\r
PxeBootItem = (PXEBC_OPTION_BOOT_ITEM *) PxeOpt->Data;\r
PxeBootItem->Type = HTONS (Type);\r
PxeBootItem->Layer = HTONS (*Layer);\r
\r
DhcpHeader = &Token.Packet->Dhcp4.Header;\r
if (Mode->SendGUID) {\r
- if (EFI_ERROR (GetSmbiosSystemGuidAndSerialNumber ((EFI_GUID *) DhcpHeader->ClientHwAddr, &SystemSerialNumber))) {\r
+ if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) DhcpHeader->ClientHwAddr))) {\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
+ DhcpHeader->HwAddrLen = (UINT8) sizeof (EFI_GUID);\r
}\r
\r
Xid = NET_RANDOM (NetRandomInitSeed ());\r
}\r
}\r
\r
+ if (TryIndex > PXEBC_BOOT_REQUEST_RETRIES) {\r
+ //\r
+ // No server response our PXE request\r
+ //\r
+ Status = EFI_TIMEOUT;\r
+ }\r
+\r
if (!EFI_ERROR (Status)) {\r
//\r
// Find Pxe Reply\r
//\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
gST->ConOut->SetCursorPosition (gST->ConOut, 0, TopRow + MenuNum);\r
} while (!Finish);\r
\r
+ ASSERT (Select < PXEBC_MAX_MENU_NUM);\r
+\r
//\r
// Swap the byte order\r
//\r