]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.c
updated interface comments per UEFI Spec.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Dhcp4Dxe / Dhcp4Io.c
index e0fdcd382c66ef0da001dbe5e2ac7dbc4cc24400..b09eb4f5f3107f67e2b944cef0f4e72750bcc398 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 2006 - 2007, Intel Corporation\r
+Copyright (c) 2006 - 2008, Intel Corporation\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
@@ -52,8 +52,6 @@ DhcpInitRequest (
       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
@@ -84,7 +82,6 @@ DhcpInitRequest (
   @retval EFI_ABORTED           The user function ask it to abort.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 DhcpCallUser (\r
   IN  DHCP_SERVICE          *DhcpSb,\r
@@ -120,7 +117,7 @@ DhcpCallUser (
   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
@@ -225,7 +222,7 @@ DhcpSetState (
   // 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
@@ -252,7 +249,6 @@ DhcpSetState (
   @return None\r
 \r
 **/\r
-STATIC\r
 VOID\r
 DhcpSetTransmitTimer (\r
   IN DHCP_SERVICE           *DhcpSb\r
@@ -262,7 +258,7 @@ DhcpSetTransmitTimer (
 \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
@@ -273,8 +269,9 @@ DhcpSetTransmitTimer (
   }\r
 \r
   DhcpSb->PacketToLive = Times[DhcpSb->CurRetry];\r
-}\r
 \r
+  return;\r
+}\r
 \r
 /**\r
   Compute the lease. If the server grants a permanent lease, just\r
@@ -288,7 +285,6 @@ DhcpSetTransmitTimer (
   @return None\r
 \r
 **/\r
-STATIC\r
 VOID\r
 DhcpComputeLease (\r
   IN DHCP_SERVICE           *DhcpSb,\r
@@ -357,12 +353,12 @@ DhcpConfigLeaseIoPort (
   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
@@ -374,10 +370,10 @@ DhcpConfigLeaseIoPort (
   // 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
@@ -397,7 +393,6 @@ DhcpConfigLeaseIoPort (
   @retval EFI_SUCCESS           The lease is recorded.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 DhcpLeaseAcquired (\r
   IN DHCP_SERVICE           *DhcpSb\r
@@ -414,7 +409,7 @@ DhcpLeaseAcquired (
 \r
   if (DhcpSb->Netmask == 0) {\r
     Class           = NetGetIpClass (DhcpSb->ClientAddr);\r
-    DhcpSb->Netmask = mIp4AllMasks[Class << 3];\r
+    DhcpSb->Netmask = gIp4AllMasks[Class << 3];\r
   }\r
 \r
   if (DhcpSb->LeaseIoPort != NULL) {\r
@@ -464,17 +459,17 @@ DhcpCleanLease (
   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
@@ -496,7 +491,6 @@ DhcpCleanLease (
   DhcpSb->PacketToLive  = 0;\r
   DhcpSb->CurRetry      = 0;\r
   DhcpSb->MaxRetries    = 0;\r
-  DhcpSb->WaitOffer     = 0;\r
   DhcpSb->LeaseLife     = 0;\r
 }\r
 \r
@@ -511,7 +505,6 @@ DhcpCleanLease (
   @retval EFI_SUCCESS           One of the offer is selected.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 DhcpChooseOffer (\r
   IN DHCP_SERVICE           *DhcpSb\r
@@ -519,15 +512,11 @@ DhcpChooseOffer (
 {\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
-  //\r
-  // Stop waiting more offers\r
-  //\r
-  DhcpSb->WaitOffer = 0;\r
-\r
   //\r
   // User will cache previous offers if he wants to select\r
   // from multiple offers. If user provides an invalid packet,\r
@@ -542,12 +531,12 @@ DhcpChooseOffer (
 \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
@@ -597,7 +586,6 @@ DhcpChooseOffer (
   @return None\r
 \r
 **/\r
-STATIC\r
 VOID\r
 DhcpEndSession (\r
   IN DHCP_SERVICE           *DhcpSb,\r
@@ -629,7 +617,6 @@ DhcpEndSession (
   @retval Others                Some error occured.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 DhcpHandleSelect (\r
   IN DHCP_SERVICE           *DhcpSb,\r
@@ -637,7 +624,6 @@ DhcpHandleSelect (
   IN DHCP_PARAMETER         *Para\r
   )\r
 {\r
-  EFI_DHCP4_HEADER          *Head;\r
   EFI_STATUS                Status;\r
 \r
   Status = EFI_SUCCESS;\r
@@ -648,12 +634,6 @@ DhcpHandleSelect (
   // 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
@@ -669,7 +649,7 @@ DhcpHandleSelect (
 \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
@@ -678,7 +658,7 @@ DhcpHandleSelect (
 \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
@@ -694,7 +674,7 @@ DhcpHandleSelect (
   return EFI_SUCCESS;\r
 \r
 ON_EXIT:\r
-  NetFreePool (Packet);\r
+  gBS->FreePool (Packet);\r
   return Status;\r
 }\r
 \r
@@ -711,7 +691,6 @@ ON_EXIT:
   @retval Others                Some error occured.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 DhcpHandleRequest (\r
   IN DHCP_SERVICE           *DhcpSb,\r
@@ -755,15 +734,15 @@ DhcpHandleRequest (
   //\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
@@ -773,21 +752,21 @@ DhcpHandleRequest (
   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
@@ -804,7 +783,6 @@ ON_EXIT:
   @retval Others                Some error occured.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 DhcpHandleRenewRebind (\r
   IN DHCP_SERVICE           *DhcpSb,\r
@@ -846,7 +824,7 @@ DhcpHandleRenewRebind (
   // 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
@@ -863,7 +841,7 @@ DhcpHandleRenewRebind (
   DhcpSb->LeaseLife = 0;\r
   DhcpSetState (DhcpSb, Dhcp4Bound, TRUE);\r
 \r
-  if (DhcpSb->ExtraRefresh) {\r
+  if (DhcpSb->ExtraRefresh != 0) {\r
     DhcpSb->ExtraRefresh  = FALSE;\r
 \r
     DhcpSb->IoStatus      = EFI_SUCCESS;\r
@@ -871,7 +849,7 @@ DhcpHandleRenewRebind (
   }\r
 \r
 ON_EXIT:\r
-  NetFreePool (Packet);\r
+  gBS->FreePool (Packet);\r
   return Status;\r
 }\r
 \r
@@ -888,7 +866,6 @@ ON_EXIT:
   @retval Others                Some error occured.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 DhcpHandleReboot (\r
   IN DHCP_SERVICE           *DhcpSb,\r
@@ -940,7 +917,7 @@ DhcpHandleReboot (
   //\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
@@ -948,7 +925,7 @@ DhcpHandleReboot (
   }\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
@@ -961,7 +938,7 @@ DhcpHandleReboot (
   return EFI_SUCCESS;\r
 \r
 ON_EXIT:\r
-  NetFreePool (Packet);\r
+  gBS->FreePool (Packet);\r
   return Status;\r
 }\r
 \r
@@ -1023,7 +1000,7 @@ DhcpInput (
   // 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
@@ -1042,7 +1019,7 @@ DhcpInput (
   //\r
   if ((Head->OpCode != BOOTP_REPLY) ||\r
       (NTOHL (Head->Xid) != DhcpSb->Xid) ||\r
-      !NET_MAC_EQUAL (&DhcpSb->Mac, Head->ClientHwAddr, DhcpSb->HwLen)) {\r
+      (CompareMem (DhcpSb->ClientAddressSendOut, Head->ClientHwAddr, Head->HwAddrLen) != 0)) {\r
     goto RESTART;\r
   }\r
 \r
@@ -1083,7 +1060,7 @@ DhcpInput (
     //\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
@@ -1098,7 +1075,7 @@ DhcpInput (
   }\r
 \r
   if (Para != NULL) {\r
-    NetFreePool (Para);\r
+    gBS->FreePool (Para);\r
   }\r
 \r
   Packet = NULL;\r
@@ -1113,7 +1090,7 @@ RESTART:
   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
@@ -1137,7 +1114,7 @@ DhcpReleasePacket (
   IN VOID                   *Arg\r
   )\r
 {\r
-  NetFreePool (Arg);\r
+  gBS->FreePool (Arg);\r
 }\r
 \r
 \r
@@ -1214,10 +1191,10 @@ DhcpSendMessage (
   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
@@ -1237,7 +1214,7 @@ DhcpSendMessage (
   }\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
@@ -1246,7 +1223,7 @@ DhcpSendMessage (
   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
@@ -1310,7 +1287,7 @@ DhcpSendMessage (
   // 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
@@ -1357,15 +1334,21 @@ DhcpSendMessage (
   }\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
+  //\r
+  // Save the Client Address will be sent out\r
+  //\r
+  CopyMem (&DhcpSb->ClientAddressSendOut[0], &Packet->Dhcp4.Header.ClientHwAddr[0], Packet->Dhcp4.Header.HwAddrLen);\r
+\r
+\r
   //\r
   // Wrap it into a netbuf then send it.\r
   //\r
@@ -1374,7 +1357,7 @@ DhcpSendMessage (
   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
@@ -1495,15 +1478,32 @@ DhcpOnTimerTick (
   )\r
 {\r
   DHCP_SERVICE              *DhcpSb;\r
+  DHCP_PROTOCOL             *Instance;\r
   EFI_STATUS                Status;\r
 \r
-  DhcpSb = (DHCP_SERVICE *) Context;\r
-\r
+  DhcpSb   = (DHCP_SERVICE *) Context;\r
+  Instance = DhcpSb->ActiveChild;\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
+    // Select offer at each timeout if any offer received.\r
+    //\r
+    if (DhcpSb->DhcpState == Dhcp4Selecting && DhcpSb->LastOffer != NULL) {\r
+\r
+      Status = DhcpChooseOffer (DhcpSb);\r
+\r
+      if (EFI_ERROR(Status)) {\r
+        FreePool (DhcpSb->LastOffer);\r
+        DhcpSb->LastOffer = NULL;\r
+      } else {\r
+        goto ON_EXIT;\r
+      }\r
+    }\r
+    \r
     if (++DhcpSb->CurRetry < DhcpSb->MaxRetries) {\r
       //\r
       // Still has another try\r
@@ -1511,17 +1511,14 @@ DhcpOnTimerTick (
       DhcpRetransmit (DhcpSb);\r
       DhcpSetTransmitTimer (DhcpSb);\r
 \r
-    } else {\r
-      if (!DHCP_CONNECTED (DhcpSb->DhcpState)) {\r
-        goto END_SESSION;\r
-      }\r
+    } else if (DHCP_CONNECTED (DhcpSb->DhcpState)) {\r
 \r
       //\r
       // Retransmission failed, if the DHCP request is initiated by\r
       // user, adjust the current state according to the lease life.\r
       // Otherwise do nothing to wait the lease to timeout\r
       //\r
-      if (DhcpSb->ExtraRefresh) {\r
+      if (DhcpSb->ExtraRefresh != 0) {\r
         Status = EFI_SUCCESS;\r
 \r
         if (DhcpSb->LeaseLife < DhcpSb->T1) {\r
@@ -1541,24 +1538,11 @@ DhcpOnTimerTick (
         DhcpSb->IoStatus = EFI_TIMEOUT;\r
         DhcpNotifyUser (DhcpSb, DHCP_NOTIFY_RENEWREBIND);\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
+    } else {\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
@@ -1570,7 +1554,7 @@ DhcpOnTimerTick (
     // Don't timeout the lease, only count the life if user is\r
     // requesting extra renew/rebind. Adjust the state after that.\r
     //\r
-    if (DhcpSb->ExtraRefresh) {\r
+    if (DhcpSb->ExtraRefresh != 0) {\r
       return ;\r
     }\r
 \r
@@ -1622,6 +1606,14 @@ DhcpOnTimerTick (
     }\r
   }\r
 \r
+ON_EXIT:\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