DhcpSb->DhcpState = Dhcp4Init;\r
return Status;\r
}\r
-\r
- DhcpSb->WaitOffer = DHCP_WAIT_OFFER;\r
} else {\r
DhcpSetState (DhcpSb, Dhcp4Rebooting, FALSE);\r
Status = DhcpSendMessage (DhcpSb, NULL, NULL, DHCP_MSG_REQUEST, NULL);\r
// This will clear the retry count. This is also why the rule\r
// first transit the state, then send packets.\r
//\r
- if (State == Dhcp4Init) {\r
+ if (State == Dhcp4Selecting) {\r
DhcpSb->MaxRetries = DhcpSb->ActiveConfig.DiscoverTryCount;\r
} else {\r
DhcpSb->MaxRetries = DhcpSb->ActiveConfig.RequestTryCount;\r
\r
ASSERT (DhcpSb->MaxRetries > DhcpSb->CurRetry);\r
\r
- if (DhcpSb->DhcpState == Dhcp4Init) {\r
+ if (DhcpSb->DhcpState == Dhcp4Selecting) {\r
Times = DhcpSb->ActiveConfig.DiscoverTimeout;\r
} else {\r
Times = DhcpSb->ActiveConfig.RequestTimeout;\r
}\r
\r
DhcpSb->PacketToLive = Times[DhcpSb->CurRetry];\r
-}\r
\r
+ if (DhcpSb->DhcpState == Dhcp4Selecting) {\r
+ DhcpSb->WaitOffer = DhcpSb->PacketToLive;\r
+ }\r
+}\r
\r
/**\r
Compute the lease. If the server grants a permanent lease, just\r
{\r
EFI_DHCP4_PACKET *Selected;\r
EFI_DHCP4_PACKET *NewPacket;\r
+ EFI_DHCP4_PACKET *TempPacket;\r
EFI_STATUS Status;\r
\r
ASSERT (DhcpSb->LastOffer != NULL);\r
\r
Selected = DhcpSb->LastOffer;\r
\r
- if (NewPacket != NULL) {\r
- if (EFI_ERROR (DhcpValidateOptions (NewPacket, NULL))) {\r
- NetFreePool (NewPacket);\r
- } else {\r
+ if ((NewPacket != NULL) && !EFI_ERROR (DhcpValidateOptions (NewPacket, NULL))) {\r
+ TempPacket = (EFI_DHCP4_PACKET *) NetAllocatePool (NewPacket->Size);\r
+ if (TempPacket != NULL) {\r
+ NetCopyMem (TempPacket, NewPacket, NewPacket->Size);\r
NetFreePool (Selected);\r
- Selected = NewPacket;\r
+ Selected = TempPacket;\r
}\r
}\r
\r
//\r
Head = &Packet->Dhcp4.Header;\r
\r
- if (!Ip4IsUnicast (EFI_NTOHL (Head->YourAddr), (Para == NULL ? 0 : Para->NetMask))) {\r
- goto ON_EXIT;\r
- }\r
-\r
if (!DHCP_IS_BOOTP (Para) &&\r
((Para->DhcpType != DHCP_MSG_OFFER) || (Para->ServerId == 0))) {\r
goto ON_EXIT;\r
)\r
{\r
DHCP_SERVICE *DhcpSb;\r
+ DHCP_PROTOCOL *Instance;\r
EFI_STATUS Status;\r
+ \r
+ DhcpSb = (DHCP_SERVICE *) Context;\r
+ Instance = DhcpSb->ActiveChild;\r
\r
- DhcpSb = (DHCP_SERVICE *) Context;\r
+ //\r
+ // Check the time to wait offer\r
+ //\r
+ if ((DhcpSb->WaitOffer > 0) && (--DhcpSb->WaitOffer == 0)) {\r
+ //\r
+ // OK, offer collection finished, select a offer\r
+ //\r
+ ASSERT (DhcpSb->DhcpState == Dhcp4Selecting);\r
\r
+ if (DhcpSb->LastOffer == NULL) {\r
+ goto END_SESSION;\r
+ }\r
+\r
+ if (EFI_ERROR (DhcpChooseOffer (DhcpSb))) {\r
+ goto END_SESSION;\r
+ }\r
+ }\r
+ \r
//\r
- // Check the retransmit timer first\r
+ // Check the retransmit timer\r
//\r
if ((DhcpSb->PacketToLive > 0) && (--DhcpSb->PacketToLive == 0)) {\r
\r
}\r
}\r
}\r
-\r
- if ((DhcpSb->WaitOffer > 0) && (--DhcpSb->WaitOffer == 0)) {\r
- //\r
- // OK, offer collection finished, select a offer\r
- //\r
- ASSERT (DhcpSb->DhcpState == Dhcp4Selecting);\r
-\r
- if (DhcpSb->LastOffer == NULL) {\r
- goto END_SESSION;\r
- }\r
-\r
- if (EFI_ERROR (DhcpChooseOffer (DhcpSb))) {\r
- goto END_SESSION;\r
- }\r
- }\r
-\r
+ \r
//\r
// If an address has been acquired, check whether need to\r
// refresh or whether it has expired.\r
}\r
}\r
\r
+ //\r
+ //\r
+ //\r
+ if ((Instance != NULL) && (Instance->Token != NULL)) {\r
+ Instance->Timeout--;\r
+ if (Instance->Timeout == 0) {\r
+ PxeDhcpDone (Instance);\r
+ }\r
+ }\r
+\r
return ;\r
\r
END_SESSION:\r