@param Seed Pointer to the message instance of the DHCP4 packet.\r
@param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance.\r
\r
- @return none.\r
-\r
**/\r
VOID\r
PxeBcInitSeedPacket (\r
@param Dst Pointer to the EFI_DHCP4_PROTOCOL instance.\r
@param Src Pointer to the EFI_DHCP4_PROTOCOL instance.\r
\r
- @return None.\r
-\r
**/\r
VOID\r
PxeBcCopyEfiDhcp4Packet (\r
@param OfferIndex Index of cached packets as complements of pxe mode data,\r
the index is maximum offer number.\r
\r
- @return None.\r
-\r
**/\r
VOID\r
PxeBcCopyProxyOffer (\r
EFI_DHCP4_PACKET *Offer;\r
\r
ASSERT (OfferIndex < Private->NumOffers);\r
+ ASSERT (OfferIndex < PXEBC_MAX_OFFER_NUM);\r
\r
Mode = Private->PxeBc.Mode;\r
Offer = &Private->Dhcp4Offers[OfferIndex].Packet.Offer;\r
PXEBC_CACHED_DHCP4_PACKET *CachedPacket;\r
EFI_DHCP4_PACKET *Reply;\r
\r
+ ASSERT (Index < PXEBC_MAX_OFFER_NUM);\r
ASSERT (Private->Dhcp4Offers[Index].OfferType == DHCP4_PACKET_TYPE_BINL);\r
\r
Offer = &Private->Dhcp4Offers[Index].Packet.Offer;\r
\r
//\r
- // use option 54, if zero, use siaddr in header\r
+ // Use siaddr(next server) in DHCPOFFER packet header, if zero, use option 54(server identifier)\r
+ // in DHCPOFFER packet.\r
+ // (It does not comply with PXE Spec, Ver2.1)\r
//\r
- ZeroMem (&ServerIp, sizeof(EFI_IP_ADDRESS));\r
- if (Private->Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID] != NULL) {\r
+ if (EFI_IP4_EQUAL (&Offer->Dhcp4.Header.ServerAddr.Addr, &mZeroIp4Addr)) {\r
CopyMem (\r
&ServerIp.Addr[0],\r
Private->Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]->Data,\r
@param Private Pointer to PxeBc private data.\r
@param RcvdOffer Pointer to the received Dhcp proxy offer packet.\r
\r
- @return None.\r
-\r
**/\r
VOID\r
PxeBcCacheDhcpOffer (\r
}\r
\r
OfferType = CachedOffer->OfferType;\r
+ ASSERT (OfferType < DHCP4_PACKET_TYPE_MAX);\r
\r
if (OfferType == DHCP4_PACKET_TYPE_BOOTP) {\r
\r
//\r
// It's a dhcp offer with your address.\r
//\r
+ ASSERT (Private->ServerCount[OfferType] < PXEBC_MAX_OFFER_NUM);\r
Private->OfferIndex[OfferType][Private->ServerCount[OfferType]] = Private->NumOffers;\r
Private->ServerCount[OfferType]++;\r
}\r
\r
@param Private Pointer to PxeBc private data.\r
\r
- @return None\r
-\r
**/\r
VOID\r
PxeBcSelectOffer (\r
UINT8 VendorOptLen;\r
CHAR8 *SystemSerialNumber;\r
EFI_DHCP4_HEADER *DhcpHeader;\r
-\r
+ UINT32 Xid;\r
\r
Mode = Private->PxeBc.Mode;\r
Dhcp4 = Private->Dhcp4;\r
OptCount = PxeBcBuildDhcpOptions (Private, OptList, FALSE);\r
\r
if (IsDiscv) {\r
+ ASSERT (Layer != NULL);\r
//\r
// Add vendor option of PXE_BOOT_ITEM\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
+ \r
+ Xid = NET_RANDOM (NetRandomInitSeed ());\r
+ Token.Packet->Dhcp4.Header.Xid = HTONL(Xid);\r
+ Token.Packet->Dhcp4.Header.Reserved = HTONS((IsBCast) ? 0x8000 : 0);\r
CopyMem (&Token.Packet->Dhcp4.Header.ClientAddr, &Private->StationIp, sizeof (EFI_IPv4_ADDRESS));\r
\r
Token.RemotePort = Sport;\r
\r
- if (DestIp == NULL) {\r
+ if (IsBCast) {\r
SetMem (&Token.RemoteAddress, sizeof (EFI_IPv4_ADDRESS), 0xff);\r
} else {\r
CopyMem (&Token.RemoteAddress, DestIp, sizeof (EFI_IPv4_ADDRESS));\r
//\r
for (TryIndex = 1; TryIndex <= PXEBC_BOOT_REQUEST_RETRIES; TryIndex++) {\r
\r
- Token.TimeoutValue = PXEBC_BOOT_REQUEST_TIMEOUT * TryIndex;\r
+ Token.TimeoutValue = (UINT16) (PXEBC_BOOT_REQUEST_TIMEOUT * TryIndex);\r
+ Token.Packet->Dhcp4.Header.Seconds = (UINT16) (PXEBC_BOOT_REQUEST_TIMEOUT * (TryIndex - 1));\r
\r
Status = Dhcp4->TransmitReceive (Dhcp4, &Token);\r
\r
@param Str Pointer to a string (boot item string).\r
@param Len The length of string.\r
\r
- @return None.\r
-\r
**/\r
VOID\r
PxeBcDisplayBootItem (\r
MenuSize = VendorOpt->BootMenuLen;\r
MenuItem = VendorOpt->BootMenu;\r
\r
+ if (MenuSize == 0) {\r
+ return EFI_NOT_READY;\r
+ }\r
+\r
while (MenuSize > 0) {\r
- MenuArray[Index] = MenuItem;\r
+ MenuArray[Index++] = MenuItem;\r
MenuSize = (UINT8) (MenuSize - (MenuItem->DescLen + 3));\r
MenuItem = (PXEBC_BOOT_MENU_ENTRY *) ((UINT8 *) MenuItem + MenuItem->DescLen + 3);\r
- Index++;\r
+ if (Index >= PXEBC_MAX_MENU_NUM) {\r
+ break;\r
+ }\r
}\r
\r
if (UseDefaultItem) {\r
- CopyMem (Type, &MenuArray[0]->Type, sizeof (UINT16));\r
+ *Type = MenuArray[0]->Type;\r
*Type = NTOHS (*Type);\r
return EFI_SUCCESS;\r
}\r
TopRow = gST->ConOut->Mode->CursorRow - MenuNum;\r
\r
do {\r
+ ASSERT (Select < PXEBC_MAX_MENU_NUM);\r
//\r
// highlight selected row\r
//\r