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
Status = Config->Dhcp4Callback (\r
&DhcpSb->ActiveChild->Dhcp4Protocol,\r
Config->CallbackContext,\r
- DhcpSb->DhcpState,\r
+ (EFI_DHCP4_STATE) DhcpSb->DhcpState,\r
Event,\r
Packet,\r
NewPacket\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
UdpConfigData.RemotePort = DHCP_SERVER_PORT;\r
\r
Ip = HTONL (DhcpSb->ClientAddr);\r
- NetCopyMem (&UdpConfigData.StationAddress, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
+ CopyMem (&UdpConfigData.StationAddress, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
\r
Ip = HTONL (DhcpSb->Netmask);\r
- NetCopyMem (&UdpConfigData.SubnetMask, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
+ CopyMem (&UdpConfigData.SubnetMask, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
\r
- NetZeroMem (&UdpConfigData.RemoteAddress, sizeof (EFI_IPv4_ADDRESS));\r
+ ZeroMem (&UdpConfigData.RemoteAddress, sizeof (EFI_IPv4_ADDRESS));\r
\r
Status = UdpIo->Udp->Configure (UdpIo->Udp, &UdpConfigData);\r
\r
// Add a default route if received from the server.\r
//\r
if ((DhcpSb->Para != NULL) && (DhcpSb->Para->Router != 0)) {\r
- NetZeroMem (&Subnet, sizeof (EFI_IPv4_ADDRESS));\r
+ ZeroMem (&Subnet, sizeof (EFI_IPv4_ADDRESS));\r
\r
Ip = HTONL (DhcpSb->Para->Router);\r
- NetCopyMem (&Gateway, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
+ CopyMem (&Gateway, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
\r
UdpIo->Udp->Routes (UdpIo->Udp, FALSE, &Subnet, &Subnet, &Gateway);\r
}\r
DhcpSb->ServerAddr = 0;\r
\r
if (DhcpSb->LastOffer != NULL) {\r
- NetFreePool (DhcpSb->LastOffer);\r
+ gBS->FreePool (DhcpSb->LastOffer);\r
DhcpSb->LastOffer = NULL;\r
}\r
\r
if (DhcpSb->Selected != NULL) {\r
- NetFreePool (DhcpSb->Selected);\r
+ gBS->FreePool (DhcpSb->Selected);\r
DhcpSb->Selected = NULL;\r
}\r
\r
if (DhcpSb->Para != NULL) {\r
- NetFreePool (DhcpSb->Para);\r
+ gBS->FreePool (DhcpSb->Para);\r
DhcpSb->Para = NULL;\r
}\r
\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
- NetFreePool (Selected);\r
- Selected = NewPacket;\r
+ if ((NewPacket != NULL) && !EFI_ERROR (DhcpValidateOptions (NewPacket, NULL))) {\r
+ TempPacket = (EFI_DHCP4_PACKET *) AllocatePool (NewPacket->Size);\r
+ if (TempPacket != NULL) {\r
+ CopyMem (TempPacket, NewPacket, NewPacket->Size);\r
+ gBS->FreePool (Selected);\r
+ Selected = TempPacket;\r
}\r
}\r
\r
IN DHCP_PARAMETER *Para\r
)\r
{\r
- EFI_DHCP4_HEADER *Head;\r
EFI_STATUS Status;\r
\r
Status = EFI_SUCCESS;\r
// 2. if it is a DHCP message, it must contains a server ID.\r
// Don't return a error for these two case otherwise the session is ended.\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
if (Status == EFI_SUCCESS) {\r
if (DhcpSb->LastOffer != NULL) {\r
- NetFreePool (DhcpSb->LastOffer);\r
+ gBS->FreePool (DhcpSb->LastOffer);\r
}\r
\r
DhcpSb->LastOffer = Packet;\r
\r
} else if (Status == EFI_NOT_READY) {\r
if (DhcpSb->LastOffer != NULL) {\r
- NetFreePool (DhcpSb->LastOffer);\r
+ gBS->FreePool (DhcpSb->LastOffer);\r
}\r
\r
DhcpSb->LastOffer = Packet;\r
return EFI_SUCCESS;\r
\r
ON_EXIT:\r
- NetFreePool (Packet);\r
+ gBS->FreePool (Packet);\r
return Status;\r
}\r
\r
//\r
Message = NULL;\r
\r
- if (!EFI_IP4_EQUAL (Head->YourAddr, Selected->YourAddr)) {\r
- Message = "Lease confirmed isn't the same as that in the offer";\r
+ if (!EFI_IP4_EQUAL (&Head->YourAddr, &Selected->YourAddr)) {\r
+ Message = (UINT8 *) "Lease confirmed isn't the same as that in the offer";\r
goto REJECT;\r
}\r
\r
Status = DhcpCallUser (DhcpSb, Dhcp4RcvdAck, Packet, NULL);\r
\r
if (EFI_ERROR (Status)) {\r
- Message = "Lease is denied upon received ACK";\r
+ Message = (UINT8 *) "Lease is denied upon received ACK";\r
goto REJECT;\r
}\r
\r
Status = DhcpLeaseAcquired (DhcpSb);\r
\r
if (EFI_ERROR (Status)) {\r
- Message = "Lease is denied upon entering bound";\r
+ Message = (UINT8 *) "Lease is denied upon entering bound";\r
goto REJECT;\r
}\r
\r
DhcpSb->IoStatus = EFI_SUCCESS;\r
DhcpNotifyUser (DhcpSb, DHCP_NOTIFY_COMPLETION);\r
\r
- NetFreePool (Packet);\r
+ gBS->FreePool (Packet);\r
return EFI_SUCCESS;\r
\r
REJECT:\r
DhcpSendMessage (DhcpSb, DhcpSb->Selected, DhcpSb->Para, DHCP_MSG_DECLINE, Message);\r
\r
ON_EXIT:\r
- NetFreePool (Packet);\r
+ gBS->FreePool (Packet);\r
return Status;\r
}\r
\r
// The lease is different from the selected. Don't send a DECLINE\r
// since it isn't existed in the client's FSM.\r
//\r
- if (!EFI_IP4_EQUAL (Head->YourAddr, Selected->YourAddr)) {\r
+ if (!EFI_IP4_EQUAL (&Head->YourAddr, &Selected->YourAddr)) {\r
goto ON_EXIT;\r
}\r
\r
}\r
\r
ON_EXIT:\r
- NetFreePool (Packet);\r
+ gBS->FreePool (Packet);\r
return Status;\r
}\r
\r
//\r
// OK, get the parameter from server, record the lease\r
//\r
- DhcpSb->Para = NetAllocatePool (sizeof (DHCP_PARAMETER));\r
+ DhcpSb->Para = AllocatePool (sizeof (DHCP_PARAMETER));\r
\r
if (DhcpSb->Para == NULL) {\r
Status = EFI_OUT_OF_RESOURCES;\r
}\r
\r
DhcpSb->Selected = Packet;\r
- CopyMem (DhcpSb->Para, Para, sizeof (DHCP_PARAMETER));\r
+ CopyMem (DhcpSb->Para, Para, sizeof (*DhcpSb->Para));\r
\r
Status = DhcpLeaseAcquired (DhcpSb);\r
\r
return EFI_SUCCESS;\r
\r
ON_EXIT:\r
- NetFreePool (Packet);\r
+ gBS->FreePool (Packet);\r
return Status;\r
}\r
\r
// Copy the DHCP message to a continuous memory block\r
//\r
Len = sizeof (EFI_DHCP4_PACKET) + UdpPacket->TotalSize - sizeof (EFI_DHCP4_HEADER);\r
- Packet = (EFI_DHCP4_PACKET *) NetAllocatePool (Len);\r
+ Packet = (EFI_DHCP4_PACKET *) AllocatePool (Len);\r
\r
if (Packet == NULL) {\r
goto RESTART;\r
//\r
// Ignore the packet in INITREBOOT, INIT and BOUND states\r
//\r
- NetFreePool (Packet);\r
+ gBS->FreePool (Packet);\r
Status = EFI_SUCCESS;\r
break;\r
\r
}\r
\r
if (Para != NULL) {\r
- NetFreePool (Para);\r
+ gBS->FreePool (Para);\r
}\r
\r
Packet = NULL;\r
NetbufFree (UdpPacket);\r
\r
if (Packet != NULL) {\r
- NetFreePool (Packet);\r
+ gBS->FreePool (Packet);\r
}\r
\r
Status = UdpIoRecvDatagram (DhcpSb->UdpIo, DhcpInput, DhcpSb, 0);\r
IN VOID *Arg\r
)\r
{\r
- NetFreePool (Arg);\r
+ gBS->FreePool (Arg);\r
}\r
\r
\r
Len = sizeof (EFI_DHCP4_PACKET) + 128 + DhcpSb->UserOptionLen;\r
\r
if (Msg != NULL) {\r
- Len += (UINT32)AsciiStrLen (Msg);\r
+ Len += (UINT32)AsciiStrLen ((CHAR8 *) Msg);\r
}\r
\r
- Packet = NetAllocatePool (Len);\r
+ Packet = AllocatePool (Len);\r
\r
if (Packet == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
Head = &Packet->Dhcp4.Header;\r
- NetZeroMem (Head, sizeof (EFI_DHCP4_HEADER));\r
+ ZeroMem (Head, sizeof (EFI_DHCP4_HEADER));\r
\r
Head->OpCode = BOOTP_REQUEST;\r
Head->HwType = DhcpSb->HwType;\r
Head->Reserved = HTONS (0x8000); //Server, broadcast the message please.\r
\r
EFI_IP4 (Head->ClientAddr) = HTONL (DhcpSb->ClientAddr);\r
- NetCopyMem (Head->ClientHwAddr, DhcpSb->Mac.Addr, DhcpSb->HwLen);\r
+ CopyMem (Head->ClientHwAddr, DhcpSb->Mac.Addr, DhcpSb->HwLen);\r
\r
//\r
// Append the DHCP message type\r
// Append the user's message if it isn't NULL\r
//\r
if (Msg != NULL) {\r
- Len = NET_MIN ((UINT32) AsciiStrLen (Msg), 255);\r
+ Len = MIN ((UINT32) AsciiStrLen ((CHAR8 *) Msg), 255);\r
Buf = DhcpAppendOption (Buf, DHCP_TAG_MESSAGE, (UINT16) Len, Msg);\r
}\r
\r
}\r
\r
if (EFI_ERROR (Status)) {\r
- NetFreePool (Packet);\r
+ gBS->FreePool (Packet);\r
return Status;\r
}\r
\r
if (NewPacket != NULL) {\r
- NetFreePool (Packet);\r
+ gBS->FreePool (Packet);\r
Packet = NewPacket;\r
}\r
\r
Wrap = NetbufFromExt (&Frag, 1, 0, 0, DhcpReleasePacket, Packet);\r
\r
if (Wrap == NULL) {\r
- NetFreePool (Packet);\r
+ gBS->FreePool (Packet);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\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