ASSERT (Private->Dhcp4Offers[Index].OfferType == DHCP4_PACKET_TYPE_BINL);\r
\r
Offer = &Private->Dhcp4Offers[Index].Packet.Offer;\r
- if (Offer->Dhcp4.Header.ServerAddr.Addr[0] == 0) {\r
- //\r
- // next server ip address is zero, use server id option instead.\r
- //\r
+\r
+ //\r
+ // use option 54, if zero, use siaddr in header\r
+ //\r
+ ZeroMem (&ServerIp, sizeof(EFI_IP_ADDRESS));\r
+ if (Private->Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID] != NULL) {\r
CopyMem (\r
&ServerIp.Addr[0],\r
Private->Dhcp4Offers[Index].Dhcp4Option[PXEBC_DHCP4_TAG_INDEX_SERVER_ID]->Data,\r
sizeof (EFI_IPv4_ADDRESS)\r
);\r
} else {\r
- //\r
- // use next server ip address.\r
- //\r
- CopyMem (&ServerIp.Addr[0], &Offer->Dhcp4.Header.ServerAddr, sizeof (EFI_IPv4_ADDRESS));\r
+ CopyMem (\r
+ &ServerIp.Addr[0], \r
+ &Offer->Dhcp4.Header.ServerAddr, \r
+ sizeof (EFI_IPv4_ADDRESS)\r
+ );\r
+ }\r
+ if (ServerIp.Addr[0] == 0) {\r
+ return FALSE;\r
}\r
\r
CachedPacket = &Private->ProxyOffer;\r
\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
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
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
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
\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