/** @file\r
Support for PxeBc dhcp functions.\r
\r
-Copyright (c) 2007 - 2008, Intel Corporation.<BR> \r
+Copyright (c) 2007 - 2009, Intel Corporation.<BR> \r
All rights reserved. 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
@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
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
PxeBcDhcpCallBack (\r
IN EFI_DHCP4_PROTOCOL * This,\r
IN VOID *Context,\r
OptList[Index]->OpCode = PXEBC_PXE_DHCP4_TAG_UNDI;\r
OptList[Index]->Length = sizeof (PXEBC_DHCP4_OPTION_UNDI);\r
OptEnt.Undi = (PXEBC_DHCP4_OPTION_UNDI *) OptList[Index]->Data;\r
- OptEnt.Undi->Type = Private->Nii->Type;\r
- OptEnt.Undi->MajorVer = Private->Nii->MajorVer;\r
- OptEnt.Undi->MinorVer = Private->Nii->MinorVer;\r
+ if (Private->Nii != NULL) {\r
+ OptEnt.Undi->Type = Private->Nii->Type;\r
+ OptEnt.Undi->MajorVer = Private->Nii->MajorVer;\r
+ OptEnt.Undi->MinorVer = Private->Nii->MinorVer;\r
+ } else {\r
+ OptEnt.Undi->Type = DEFAULT_UNDI_TYPE;\r
+ OptEnt.Undi->MajorVer = DEFAULT_UNDI_MAJOR;\r
+ OptEnt.Undi->MinorVer = DEFAULT_UNDI_MINOR;\r
+ }\r
\r
Index++;\r
OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);\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
- CopyMem (OptEnt.Clid->InterfaceName, Private->Nii->StringId, sizeof (OptEnt.Clid->InterfaceName));\r
- CvtNum (Private->Nii->MajorVer, OptEnt.Clid->UndiMajor, sizeof (OptEnt.Clid->UndiMajor));\r
- CvtNum (Private->Nii->MinorVer, OptEnt.Clid->UndiMinor, sizeof (OptEnt.Clid->UndiMinor));\r
+\r
+ if (Private->Nii != NULL) {\r
+ // \r
+ // If NII protocol exists, update DHCP option data\r
+ //\r
+ CopyMem (OptEnt.Clid->InterfaceName, Private->Nii->StringId, sizeof (OptEnt.Clid->InterfaceName));\r
+ CvtNum (Private->Nii->MajorVer, OptEnt.Clid->UndiMajor, sizeof (OptEnt.Clid->UndiMajor));\r
+ CvtNum (Private->Nii->MinorVer, OptEnt.Clid->UndiMinor, sizeof (OptEnt.Clid->UndiMinor));\r
+ }\r
+\r
Index++;\r
\r
return Index;\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