]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/Dhcp6Dxe/Dhcp6Io.c
NetworkPkg: Apply uncrustify changes
[mirror_edk2.git] / NetworkPkg / Dhcp6Dxe / Dhcp6Io.c
index 7320642eddf9b4498bbbe7207e9f43a507297393..dcd01e6268b14a6733aad366c545dacebb6637e6 100644 (file)
@@ -1,21 +1,15 @@
 /** @file\r
   Dhcp6 internal functions implementation.\r
 \r
-  Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>\r
+  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
 \r
-  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
-  http://opensource.org/licenses/bsd-license.php.\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include "Dhcp6Impl.h"\r
 \r
-\r
 /**\r
   Enqueue the packet into the retry list in case of timeout.\r
 \r
@@ -39,8 +33,8 @@ Dhcp6EnqueueRetry (
   IN EFI_DHCP6_RETRANSMISSION  *RetryCtl     OPTIONAL\r
   )\r
 {\r
-  DHCP6_TX_CB                  *TxCb;\r
-  DHCP6_IA_CB                  *IaCb;\r
+  DHCP6_TX_CB  *TxCb;\r
+  DHCP6_IA_CB  *IaCb;\r
 \r
   ASSERT (Packet != NULL);\r
 \r
@@ -52,7 +46,7 @@ Dhcp6EnqueueRetry (
   }\r
 \r
   //\r
-  // Save tx packet pointer, and it will be destoryed when reply received.\r
+  // Save tx packet pointer, and it will be destroyed when reply received.\r
   //\r
   TxCb->TxPacket = Packet;\r
   TxCb->Xid      = Packet->Dhcp6.Header.TransactionId;\r
@@ -60,155 +54,156 @@ Dhcp6EnqueueRetry (
   //\r
   // Save pointer to elapsed-time value so we can update it on retransmits.\r
   //\r
-  TxCb->Elapsed  = Elapsed;\r
+  TxCb->Elapsed = Elapsed;\r
 \r
   //\r
-  // Calculate the retransmission according to the the message type.\r
+  // Calculate the retransmission according to the message type.\r
   //\r
   switch (Packet->Dhcp6.Header.MessageType) {\r
-  case Dhcp6MsgSolicit:\r
-    //\r
-    // Calculate the retransmission threshold value for solicit packet.\r
-    // Use the default value by rfc-3315 if user doesn't configure.\r
-    //\r
-    if (RetryCtl == NULL) {\r
-      TxCb->RetryCtl.Irt = DHCP6_SOL_IRT;\r
-      TxCb->RetryCtl.Mrc = DHCP6_SOL_MRC;\r
-      TxCb->RetryCtl.Mrt = DHCP6_SOL_MRT;\r
-      TxCb->RetryCtl.Mrd = DHCP6_SOL_MRD;\r
-    } else {\r
-      TxCb->RetryCtl.Irt = (RetryCtl->Irt != 0) ? RetryCtl->Irt : DHCP6_SOL_IRT;\r
-      TxCb->RetryCtl.Mrc = (RetryCtl->Mrc != 0) ? RetryCtl->Mrc : DHCP6_SOL_MRC;\r
-      TxCb->RetryCtl.Mrt = (RetryCtl->Mrt != 0) ? RetryCtl->Mrt : DHCP6_SOL_MRT;\r
-      TxCb->RetryCtl.Mrd = (RetryCtl->Mrd != 0) ? RetryCtl->Mrd : DHCP6_SOL_MRD;\r
-    }\r
+    case Dhcp6MsgSolicit:\r
+      //\r
+      // Calculate the retransmission threshold value for solicit packet.\r
+      // Use the default value by rfc-3315 if user doesn't configure.\r
+      //\r
+      if (RetryCtl == NULL) {\r
+        TxCb->RetryCtl.Irt = DHCP6_SOL_IRT;\r
+        TxCb->RetryCtl.Mrc = DHCP6_SOL_MRC;\r
+        TxCb->RetryCtl.Mrt = DHCP6_SOL_MRT;\r
+        TxCb->RetryCtl.Mrd = DHCP6_SOL_MRD;\r
+      } else {\r
+        TxCb->RetryCtl.Irt = (RetryCtl->Irt != 0) ? RetryCtl->Irt : DHCP6_SOL_IRT;\r
+        TxCb->RetryCtl.Mrc = (RetryCtl->Mrc != 0) ? RetryCtl->Mrc : DHCP6_SOL_MRC;\r
+        TxCb->RetryCtl.Mrt = (RetryCtl->Mrt != 0) ? RetryCtl->Mrt : DHCP6_SOL_MRT;\r
+        TxCb->RetryCtl.Mrd = (RetryCtl->Mrd != 0) ? RetryCtl->Mrd : DHCP6_SOL_MRD;\r
+      }\r
 \r
-    TxCb->RetryExp       = Dhcp6CalculateExpireTime (\r
+      TxCb->RetryExp = Dhcp6CalculateExpireTime (\r
+                         TxCb->RetryCtl.Irt,\r
+                         TRUE,\r
+                         FALSE\r
+                         );\r
+      break;\r
+\r
+    case Dhcp6MsgRequest:\r
+      //\r
+      // Calculate the retransmission threshold value for request packet.\r
+      //\r
+      TxCb->RetryCtl.Irt = DHCP6_REQ_IRT;\r
+      TxCb->RetryCtl.Mrc = DHCP6_REQ_MRC;\r
+      TxCb->RetryCtl.Mrt = DHCP6_REQ_MRT;\r
+      TxCb->RetryCtl.Mrd = DHCP6_REQ_MRD;\r
+      TxCb->RetryExp     = Dhcp6CalculateExpireTime (\r
                              TxCb->RetryCtl.Irt,\r
                              TRUE,\r
-                             FALSE\r
+                             TRUE\r
                              );\r
-    break;\r
-\r
-  case Dhcp6MsgRequest:\r
-    //\r
-    // Calculate the retransmission threshold value for request packet.\r
-    //\r
-    TxCb->RetryCtl.Irt = DHCP6_REQ_IRT;\r
-    TxCb->RetryCtl.Mrc = DHCP6_REQ_MRC;\r
-    TxCb->RetryCtl.Mrt = DHCP6_REQ_MRT;\r
-    TxCb->RetryCtl.Mrd = DHCP6_REQ_MRD;\r
-    TxCb->RetryExp     = Dhcp6CalculateExpireTime (\r
-                           TxCb->RetryCtl.Irt,\r
-                           TRUE,\r
-                           TRUE\r
-                           );\r
-    break;\r
-\r
-  case Dhcp6MsgConfirm:\r
-    //\r
-    // Calculate the retransmission threshold value for confirm packet.\r
-    //\r
-    TxCb->RetryCtl.Irt = DHCP6_CNF_IRT;\r
-    TxCb->RetryCtl.Mrc = DHCP6_CNF_MRC;\r
-    TxCb->RetryCtl.Mrt = DHCP6_CNF_MRT;\r
-    TxCb->RetryCtl.Mrd = DHCP6_CNF_MRD;\r
-    TxCb->RetryExp     = Dhcp6CalculateExpireTime (\r
-                           TxCb->RetryCtl.Irt,\r
-                           TRUE,\r
-                           TRUE\r
-                           );\r
-    break;\r
-\r
-  case Dhcp6MsgRenew:\r
-    //\r
-    // Calculate the retransmission threshold value for renew packet.\r
-    //\r
-    TxCb->RetryCtl.Irt = DHCP6_REB_IRT;\r
-    TxCb->RetryCtl.Mrc = DHCP6_REB_MRC;\r
-    TxCb->RetryCtl.Mrt = DHCP6_REB_MRT;\r
-    TxCb->RetryCtl.Mrd = IaCb->T2 - IaCb->T1;\r
-    TxCb->RetryExp     = Dhcp6CalculateExpireTime (\r
-                           TxCb->RetryCtl.Irt,\r
-                           TRUE,\r
-                           TRUE\r
-                           );\r
-    break;\r
+      break;\r
 \r
-  case Dhcp6MsgRebind:\r
-    //\r
-    // Calculate the retransmission threshold value for rebind packet.\r
-    //\r
-    TxCb->RetryCtl.Irt = DHCP6_REN_IRT;\r
-    TxCb->RetryCtl.Mrc = DHCP6_REN_MRC;\r
-    TxCb->RetryCtl.Mrt = DHCP6_REN_MRT;\r
-    TxCb->RetryCtl.Mrd = IaCb->AllExpireTime - IaCb->T2;\r
-    TxCb->RetryExp     = Dhcp6CalculateExpireTime (\r
-                           TxCb->RetryCtl.Irt,\r
-                           TRUE,\r
-                           TRUE\r
-                           );\r
-    break;\r
+    case Dhcp6MsgConfirm:\r
+      //\r
+      // Calculate the retransmission threshold value for confirm packet.\r
+      //\r
+      TxCb->RetryCtl.Irt = DHCP6_CNF_IRT;\r
+      TxCb->RetryCtl.Mrc = DHCP6_CNF_MRC;\r
+      TxCb->RetryCtl.Mrt = DHCP6_CNF_MRT;\r
+      TxCb->RetryCtl.Mrd = DHCP6_CNF_MRD;\r
+      TxCb->RetryExp     = Dhcp6CalculateExpireTime (\r
+                             TxCb->RetryCtl.Irt,\r
+                             TRUE,\r
+                             TRUE\r
+                             );\r
+      break;\r
 \r
-  case Dhcp6MsgDecline:\r
-    //\r
-    // Calculate the retransmission threshold value for decline packet.\r
-    //\r
-    TxCb->RetryCtl.Irt = DHCP6_DEC_IRT;\r
-    TxCb->RetryCtl.Mrc = DHCP6_DEC_MRC;\r
-    TxCb->RetryCtl.Mrt = DHCP6_DEC_MRT;\r
-    TxCb->RetryCtl.Mrd = DHCP6_DEC_MRD;\r
-    TxCb->RetryExp     = Dhcp6CalculateExpireTime (\r
-                           TxCb->RetryCtl.Irt,\r
-                           TRUE,\r
-                           TRUE\r
-                           );\r
-    break;\r
+    case Dhcp6MsgRenew:\r
+      //\r
+      // Calculate the retransmission threshold value for renew packet.\r
+      //\r
+      TxCb->RetryCtl.Irt = DHCP6_REB_IRT;\r
+      TxCb->RetryCtl.Mrc = DHCP6_REB_MRC;\r
+      TxCb->RetryCtl.Mrt = DHCP6_REB_MRT;\r
+      TxCb->RetryCtl.Mrd = IaCb->T2 - IaCb->T1;\r
+      TxCb->RetryExp     = Dhcp6CalculateExpireTime (\r
+                             TxCb->RetryCtl.Irt,\r
+                             TRUE,\r
+                             TRUE\r
+                             );\r
+      break;\r
 \r
-  case Dhcp6MsgRelease:\r
-    //\r
-    // Calculate the retransmission threshold value for release packet.\r
-    //\r
-    TxCb->RetryCtl.Irt = DHCP6_REL_IRT;\r
-    TxCb->RetryCtl.Mrc = DHCP6_REL_MRC;\r
-    TxCb->RetryCtl.Mrt = DHCP6_REL_MRT;\r
-    TxCb->RetryCtl.Mrd = DHCP6_REL_MRD;\r
-    TxCb->RetryExp     = Dhcp6CalculateExpireTime (\r
-                           TxCb->RetryCtl.Irt,\r
-                           TRUE,\r
-                           TRUE\r
-                           );\r
-    break;\r
+    case Dhcp6MsgRebind:\r
+      //\r
+      // Calculate the retransmission threshold value for rebind packet.\r
+      //\r
+      TxCb->RetryCtl.Irt = DHCP6_REN_IRT;\r
+      TxCb->RetryCtl.Mrc = DHCP6_REN_MRC;\r
+      TxCb->RetryCtl.Mrt = DHCP6_REN_MRT;\r
+      TxCb->RetryCtl.Mrd = IaCb->AllExpireTime - IaCb->T2;\r
+      TxCb->RetryExp     = Dhcp6CalculateExpireTime (\r
+                             TxCb->RetryCtl.Irt,\r
+                             TRUE,\r
+                             TRUE\r
+                             );\r
+      break;\r
 \r
-  case Dhcp6MsgInfoRequest:\r
-    //\r
-    // Calculate the retransmission threshold value for info-request packet.\r
-    // Use the default value by rfc-3315 if user doesn't configure.\r
-    //\r
-    if (RetryCtl == NULL) {\r
-      TxCb->RetryCtl.Irt = DHCP6_INF_IRT;\r
-      TxCb->RetryCtl.Mrc = DHCP6_INF_MRC;\r
-      TxCb->RetryCtl.Mrt = DHCP6_INF_MRT;\r
-      TxCb->RetryCtl.Mrd = DHCP6_INF_MRD;\r
-    } else {\r
-      TxCb->RetryCtl.Irt = (RetryCtl->Irt != 0) ? RetryCtl->Irt : DHCP6_INF_IRT;\r
-      TxCb->RetryCtl.Mrc = (RetryCtl->Mrc != 0) ? RetryCtl->Mrc : DHCP6_INF_MRC;\r
-      TxCb->RetryCtl.Mrt = (RetryCtl->Mrt != 0) ? RetryCtl->Mrt : DHCP6_INF_MRT;\r
-      TxCb->RetryCtl.Mrd = (RetryCtl->Mrd != 0) ? RetryCtl->Mrd : DHCP6_INF_MRD;\r
-    }\r
+    case Dhcp6MsgDecline:\r
+      //\r
+      // Calculate the retransmission threshold value for decline packet.\r
+      //\r
+      TxCb->RetryCtl.Irt = DHCP6_DEC_IRT;\r
+      TxCb->RetryCtl.Mrc = DHCP6_DEC_MRC;\r
+      TxCb->RetryCtl.Mrt = DHCP6_DEC_MRT;\r
+      TxCb->RetryCtl.Mrd = DHCP6_DEC_MRD;\r
+      TxCb->RetryExp     = Dhcp6CalculateExpireTime (\r
+                             TxCb->RetryCtl.Irt,\r
+                             TRUE,\r
+                             TRUE\r
+                             );\r
+      break;\r
 \r
-    TxCb->RetryExp       = Dhcp6CalculateExpireTime (\r
+    case Dhcp6MsgRelease:\r
+      //\r
+      // Calculate the retransmission threshold value for release packet.\r
+      //\r
+      TxCb->RetryCtl.Irt = DHCP6_REL_IRT;\r
+      TxCb->RetryCtl.Mrc = DHCP6_REL_MRC;\r
+      TxCb->RetryCtl.Mrt = DHCP6_REL_MRT;\r
+      TxCb->RetryCtl.Mrd = DHCP6_REL_MRD;\r
+      TxCb->RetryExp     = Dhcp6CalculateExpireTime (\r
                              TxCb->RetryCtl.Irt,\r
                              TRUE,\r
                              TRUE\r
                              );\r
-    break;\r
+      break;\r
 \r
-  default:\r
-    //\r
-    // Unexpected message type.\r
-    //\r
-    return EFI_DEVICE_ERROR;\r
+    case Dhcp6MsgInfoRequest:\r
+      //\r
+      // Calculate the retransmission threshold value for info-request packet.\r
+      // Use the default value by rfc-3315 if user doesn't configure.\r
+      //\r
+      if (RetryCtl == NULL) {\r
+        TxCb->RetryCtl.Irt = DHCP6_INF_IRT;\r
+        TxCb->RetryCtl.Mrc = DHCP6_INF_MRC;\r
+        TxCb->RetryCtl.Mrt = DHCP6_INF_MRT;\r
+        TxCb->RetryCtl.Mrd = DHCP6_INF_MRD;\r
+      } else {\r
+        TxCb->RetryCtl.Irt = (RetryCtl->Irt != 0) ? RetryCtl->Irt : DHCP6_INF_IRT;\r
+        TxCb->RetryCtl.Mrc = (RetryCtl->Mrc != 0) ? RetryCtl->Mrc : DHCP6_INF_MRC;\r
+        TxCb->RetryCtl.Mrt = (RetryCtl->Mrt != 0) ? RetryCtl->Mrt : DHCP6_INF_MRT;\r
+        TxCb->RetryCtl.Mrd = (RetryCtl->Mrd != 0) ? RetryCtl->Mrd : DHCP6_INF_MRD;\r
+      }\r
+\r
+      TxCb->RetryExp = Dhcp6CalculateExpireTime (\r
+                         TxCb->RetryCtl.Irt,\r
+                         TRUE,\r
+                         TRUE\r
+                         );\r
+      break;\r
+\r
+    default:\r
+      //\r
+      // Unexpected message type.\r
+      //\r
+      FreePool (TxCb);\r
+      return EFI_DEVICE_ERROR;\r
   }\r
 \r
   //\r
@@ -219,7 +214,6 @@ Dhcp6EnqueueRetry (
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Dequeue the packet from retry list if reply received or timeout at last.\r
 \r
@@ -234,40 +228,36 @@ Dhcp6EnqueueRetry (
 **/\r
 EFI_STATUS\r
 Dhcp6DequeueRetry (\r
-  IN DHCP6_INSTANCE         *Instance,\r
-  IN UINT32                 PacketXid,\r
-  IN BOOLEAN                NeedSignal\r
+  IN DHCP6_INSTANCE  *Instance,\r
+  IN UINT32          PacketXid,\r
+  IN BOOLEAN         NeedSignal\r
   )\r
 {\r
-  LIST_ENTRY                *Entry;\r
-  LIST_ENTRY                *NextEntry;\r
-  DHCP6_TX_CB               *TxCb;\r
-  DHCP6_INF_CB              *InfCb;\r
+  LIST_ENTRY    *Entry;\r
+  LIST_ENTRY    *NextEntry;\r
+  DHCP6_TX_CB   *TxCb;\r
+  DHCP6_INF_CB  *InfCb;\r
 \r
   //\r
   // Seek the retransmit node in the retransmit list by packet xid.\r
   //\r
   NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &Instance->TxList) {\r
-\r
     TxCb = NET_LIST_USER_STRUCT (Entry, DHCP6_TX_CB, Link);\r
-    ASSERT(TxCb->TxPacket);\r
+    ASSERT (TxCb->TxPacket);\r
 \r
     if (TxCb->Xid == PacketXid) {\r
-\r
       if (TxCb->TxPacket->Dhcp6.Header.MessageType == Dhcp6MsgInfoRequest) {\r
-\r
         //\r
         // Seek the info-request node in the info-request list by packet xid.\r
         //\r
         NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &Instance->InfList) {\r
-\r
           InfCb = NET_LIST_USER_STRUCT (Entry, DHCP6_INF_CB, Link);\r
 \r
           if (InfCb->Xid == PacketXid) {\r
             //\r
             // Remove the info-request node, and signal the event if timeout.\r
             //\r
-            if (InfCb->TimeoutEvent != NULL && NeedSignal) {\r
+            if ((InfCb->TimeoutEvent != NULL) && NeedSignal) {\r
               gBS->SignalEvent (InfCb->TimeoutEvent);\r
             }\r
 \r
@@ -276,11 +266,12 @@ Dhcp6DequeueRetry (
           }\r
         }\r
       }\r
+\r
       //\r
       // Remove the retransmit node.\r
       //\r
       RemoveEntryList (&TxCb->Link);\r
-      ASSERT(TxCb->TxPacket);\r
+      ASSERT (TxCb->TxPacket);\r
       FreePool (TxCb->TxPacket);\r
       FreePool (TxCb);\r
       return EFI_SUCCESS;\r
@@ -290,7 +281,6 @@ Dhcp6DequeueRetry (
   return EFI_NOT_FOUND;\r
 }\r
 \r
-\r
 /**\r
   Clean up the specific nodes in the retry list.\r
 \r
@@ -300,24 +290,22 @@ Dhcp6DequeueRetry (
 **/\r
 VOID\r
 Dhcp6CleanupRetry (\r
-  IN DHCP6_INSTANCE         *Instance,\r
-  IN UINT32                 Scope\r
+  IN DHCP6_INSTANCE  *Instance,\r
+  IN UINT32          Scope\r
   )\r
 {\r
-  LIST_ENTRY                *Entry;\r
-  LIST_ENTRY                *NextEntry;\r
-  DHCP6_TX_CB               *TxCb;\r
-  DHCP6_INF_CB              *InfCb;\r
+  LIST_ENTRY    *Entry;\r
+  LIST_ENTRY    *NextEntry;\r
+  DHCP6_TX_CB   *TxCb;\r
+  DHCP6_INF_CB  *InfCb;\r
 \r
   //\r
   // Clean up all the stateful messages from the retransmit list.\r
   //\r
-  if (Scope == DHCP6_PACKET_STATEFUL || Scope == DHCP6_PACKET_ALL) {\r
-\r
+  if ((Scope == DHCP6_PACKET_STATEFUL) || (Scope == DHCP6_PACKET_ALL)) {\r
     NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &Instance->TxList) {\r
-\r
       TxCb = NET_LIST_USER_STRUCT (Entry, DHCP6_TX_CB, Link);\r
-      ASSERT(TxCb->TxPacket);\r
+      ASSERT (TxCb->TxPacket);\r
 \r
       if (TxCb->TxPacket->Dhcp6.Header.MessageType != Dhcp6MsgInfoRequest) {\r
         RemoveEntryList (&TxCb->Link);\r
@@ -330,15 +318,13 @@ Dhcp6CleanupRetry (
   //\r
   // Clean up all the stateless messages from the retransmit list.\r
   //\r
-  if (Scope == DHCP6_PACKET_STATELESS || Scope == DHCP6_PACKET_ALL) {\r
-\r
+  if ((Scope == DHCP6_PACKET_STATELESS) || (Scope == DHCP6_PACKET_ALL)) {\r
     //\r
     // Clean up all the retransmit list for stateless messages.\r
     //\r
     NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &Instance->TxList) {\r
-\r
       TxCb = NET_LIST_USER_STRUCT (Entry, DHCP6_TX_CB, Link);\r
-      ASSERT(TxCb->TxPacket);\r
+      ASSERT (TxCb->TxPacket);\r
 \r
       if (TxCb->TxPacket->Dhcp6.Header.MessageType == Dhcp6MsgInfoRequest) {\r
         RemoveEntryList (&TxCb->Link);\r
@@ -351,18 +337,44 @@ Dhcp6CleanupRetry (
     // Clean up all the info-request messages list.\r
     //\r
     NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &Instance->InfList) {\r
-\r
       InfCb = NET_LIST_USER_STRUCT (Entry, DHCP6_INF_CB, Link);\r
 \r
       if (InfCb->TimeoutEvent != NULL) {\r
         gBS->SignalEvent (InfCb->TimeoutEvent);\r
       }\r
+\r
       RemoveEntryList (&InfCb->Link);\r
       FreePool (InfCb);\r
     }\r
   }\r
 }\r
 \r
+/**\r
+  Check whether the TxCb is still a valid control block in the instance's retry list.\r
+\r
+  @param[in]  Instance       The pointer to DHCP6_INSTANCE.\r
+  @param[in]  TxCb           The control block for a transmitted message.\r
+\r
+  @retval   TRUE      The control block is in Instance's retry list.\r
+  @retval   FALSE     The control block is NOT in Instance's retry list.\r
+\r
+**/\r
+BOOLEAN\r
+Dhcp6IsValidTxCb (\r
+  IN  DHCP6_INSTANCE  *Instance,\r
+  IN  DHCP6_TX_CB     *TxCb\r
+  )\r
+{\r
+  LIST_ENTRY  *Entry;\r
+\r
+  NET_LIST_FOR_EACH (Entry, &Instance->TxList) {\r
+    if (TxCb == NET_LIST_USER_STRUCT (Entry, DHCP6_TX_CB, Link)) {\r
+      return TRUE;\r
+    }\r
+  }\r
+\r
+  return FALSE;\r
+}\r
 \r
 /**\r
   Clean up the session of the instance stateful exchange.\r
@@ -373,15 +385,15 @@ Dhcp6CleanupRetry (
 **/\r
 VOID\r
 Dhcp6CleanupSession (\r
-  IN OUT DHCP6_INSTANCE          *Instance,\r
-  IN     EFI_STATUS              Status\r
+  IN OUT DHCP6_INSTANCE  *Instance,\r
+  IN     EFI_STATUS      Status\r
   )\r
 {\r
-  UINTN                          Index;\r
-  EFI_DHCP6_IA                   *Ia;\r
+  UINTN         Index;\r
+  EFI_DHCP6_IA  *Ia;\r
 \r
-  ASSERT(Instance->Config);\r
-  ASSERT(Instance->IaCb.Ia);\r
+  ASSERT (Instance->Config);\r
+  ASSERT (Instance->IaCb.Ia);\r
 \r
   //\r
   // Clean up the retransmit list for stateful messages.\r
@@ -403,23 +415,23 @@ Dhcp6CleanupSession (
   //\r
   // Reinitialize the Ia fields of the instance.\r
   //\r
-  Instance->UdpSts                  = Status;\r
-  Instance->AdSelect                = NULL;\r
-  Instance->AdPref                  = 0;\r
-  Instance->Unicast                 = NULL;\r
-  Instance->IaCb.T1                 = 0;\r
-  Instance->IaCb.T2                 = 0;\r
-  Instance->IaCb.AllExpireTime      = 0;\r
-  Instance->IaCb.LeaseTime          = 0;\r
+  Instance->UdpSts             = Status;\r
+  Instance->AdSelect           = NULL;\r
+  Instance->AdPref             = 0;\r
+  Instance->Unicast            = NULL;\r
+  Instance->IaCb.T1            = 0;\r
+  Instance->IaCb.T2            = 0;\r
+  Instance->IaCb.AllExpireTime = 0;\r
+  Instance->IaCb.LeaseTime     = 0;\r
 \r
   //\r
   // Clear start time\r
   //\r
-  Instance->StartTime               = 0;\r
+  Instance->StartTime = 0;\r
 \r
-  Ia                                = Instance->IaCb.Ia;\r
-  Ia->State                         = Dhcp6Init;\r
-  Ia->ReplyPacket                   = NULL;\r
+  Ia              = Instance->IaCb.Ia;\r
+  Ia->State       = Dhcp6Init;\r
+  Ia->ReplyPacket = NULL;\r
 \r
   //\r
   // Set the addresses as zero lifetime, and then the notify\r
@@ -439,7 +451,6 @@ Dhcp6CleanupSession (
   }\r
 }\r
 \r
-\r
 /**\r
   Callback to user when Dhcp6 transmit/receive occurs.\r
 \r
@@ -455,15 +466,15 @@ Dhcp6CleanupSession (
 EFI_STATUS\r
 EFIAPI\r
 Dhcp6CallbackUser (\r
-  IN     DHCP6_INSTANCE       *Instance,\r
-  IN     EFI_DHCP6_EVENT      Event,\r
-  IN OUT EFI_DHCP6_PACKET     **Packet\r
+  IN     DHCP6_INSTANCE    *Instance,\r
+  IN     EFI_DHCP6_EVENT   Event,\r
+  IN OUT EFI_DHCP6_PACKET  **Packet\r
   )\r
 {\r
-  EFI_STATUS                  Status;\r
-  EFI_DHCP6_PACKET            *NewPacket;\r
-  EFI_DHCP6_CALLBACK          Callback;\r
-  VOID                        *Context;\r
+  EFI_STATUS          Status;\r
+  EFI_DHCP6_PACKET    *NewPacket;\r
+  EFI_DHCP6_CALLBACK  Callback;\r
+  VOID                *Context;\r
 \r
   ASSERT (Packet != NULL);\r
   ASSERT (Instance->Config != NULL);\r
@@ -478,7 +489,6 @@ Dhcp6CallbackUser (
   // Callback to user with the new message if has.\r
   //\r
   if (Callback != NULL) {\r
-\r
     Status = Callback (\r
                &Instance->Dhcp6,\r
                Context,\r
@@ -500,7 +510,6 @@ Dhcp6CallbackUser (
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Update Ia according to the new reply message.\r
 \r
@@ -513,33 +522,31 @@ Dhcp6CallbackUser (
 **/\r
 EFI_STATUS\r
 Dhcp6UpdateIaInfo (\r
-  IN OUT DHCP6_INSTANCE           *Instance,\r
-  IN     EFI_DHCP6_PACKET         *Packet\r
+  IN OUT DHCP6_INSTANCE    *Instance,\r
+  IN     EFI_DHCP6_PACKET  *Packet\r
   )\r
 {\r
-  EFI_STATUS                  Status;\r
-  EFI_DHCP6_STATE             State;\r
-  UINT8                       *Option;\r
-  UINT8                       *IaInnerOpt;\r
-  UINT16                      IaInnerLen;\r
-  UINT16                      StsCode;\r
-  UINT32                      T1;\r
-  UINT32                      T2;\r
+  EFI_STATUS  Status;\r
+  UINT8       *Option;\r
+  UINT8       *IaInnerOpt;\r
+  UINT16      IaInnerLen;\r
+  UINT16      StsCode;\r
+  UINT32      T1;\r
+  UINT32      T2;\r
 \r
   ASSERT (Instance->Config != NULL);\r
   //\r
-  // If the reply was received in reponse to a solicit with rapid commit option,\r
+  // If the reply was received in response to a solicit with rapid commit option,\r
   // request, renew or rebind message, the client updates the information it has\r
   // recorded about IAs from the IA options contained in the reply message:\r
   //   1. record the T1 and T2 times\r
   //   2. add any new addresses in the IA\r
   //   3. discard any addresses from the IA, that have a valid lifetime of 0\r
-  //   4. update lifetimes for any addresses that alread recorded\r
+  //   4. update lifetimes for any addresses that already recorded\r
   //   5. leave unchanged any information about addresses\r
   //\r
   // See details in the section-18.1.8 of rfc-3315.\r
   //\r
-  State  = Dhcp6Init;\r
   Option = Dhcp6SeekIaOption (\r
              Packet->Dhcp6.Option,\r
              Packet->Length - sizeof (EFI_DHCP6_HEADER),\r
@@ -591,15 +598,24 @@ Dhcp6UpdateIaInfo (
   // The inner options still start with 2 bytes option-code and 2 bytes option-len.\r
   //\r
   if (Instance->Config->IaDescriptor.Type == Dhcp6OptIana) {\r
-    T1 = NTOHL (ReadUnaligned32 ((UINT32 *) (Option + 8)));\r
-    T2 = NTOHL (ReadUnaligned32 ((UINT32 *) (Option + 12)));\r
+    T1 = NTOHL (ReadUnaligned32 ((UINT32 *)(Option + 8)));\r
+    T2 = NTOHL (ReadUnaligned32 ((UINT32 *)(Option + 12)));\r
+    //\r
+    // Refer to RFC3155 Chapter 22.4. If a client receives an IA_NA with T1 greater than T2,\r
+    // and both T1 and T2 are greater than 0, the client discards the IA_NA option and processes\r
+    // the remainder of the message as though the server had not  included the invalid IA_NA option.\r
+    //\r
+    if ((T1 > T2) && (T2 > 0)) {\r
+      return EFI_DEVICE_ERROR;\r
+    }\r
+\r
     IaInnerOpt = Option + 16;\r
-    IaInnerLen = (UINT16) (NTOHS (ReadUnaligned16 ((UINT16 *) (Option + 2))) - 12);\r
+    IaInnerLen = (UINT16)(NTOHS (ReadUnaligned16 ((UINT16 *)(Option + 2))) - 12);\r
   } else {\r
-    T1 = 0;\r
-    T2 = 0;\r
+    T1         = 0;\r
+    T2         = 0;\r
     IaInnerOpt = Option + 8;\r
-    IaInnerLen = (UINT16) (NTOHS (ReadUnaligned16 ((UINT16 *) (Option + 2))) - 4);\r
+    IaInnerLen = (UINT16)(NTOHS (ReadUnaligned16 ((UINT16 *)(Option + 2))) - 4);\r
   }\r
 \r
   //\r
@@ -625,7 +641,7 @@ Dhcp6UpdateIaInfo (
   Option  = Dhcp6SeekOption (IaInnerOpt, IaInnerLen, Dhcp6OptStatusCode);\r
 \r
   if (Option != NULL) {\r
-    StsCode = NTOHS (ReadUnaligned16 ((UINT16 *) (Option + 4)));\r
+    StsCode = NTOHS (ReadUnaligned16 ((UINT16 *)(Option + 4)));\r
     if (StsCode != Dhcp6StsSuccess) {\r
       return EFI_DEVICE_ERROR;\r
     }\r
@@ -645,8 +661,6 @@ Dhcp6UpdateIaInfo (
   return Status;\r
 }\r
 \r
-\r
-\r
 /**\r
   Seek StatusCode Option in package. A Status Code option may appear in the\r
   options field of a DHCP message and/or in the options field of another option.\r
@@ -662,14 +676,14 @@ Dhcp6UpdateIaInfo (
 **/\r
 EFI_STATUS\r
 Dhcp6SeekStsOption (\r
-  IN     DHCP6_INSTANCE           *Instance,\r
-  IN     EFI_DHCP6_PACKET         *Packet,\r
-  OUT    UINT8                    **Option\r
+  IN     DHCP6_INSTANCE    *Instance,\r
+  IN     EFI_DHCP6_PACKET  *Packet,\r
+  OUT    UINT8             **Option\r
   )\r
 {\r
-  UINT8                       *IaInnerOpt;\r
-  UINT16                      IaInnerLen;\r
-  UINT16                      StsCode;\r
+  UINT8   *IaInnerOpt;\r
+  UINT16  IaInnerLen;\r
+  UINT16  StsCode;\r
 \r
   //\r
   // Seek StatusCode option directly in DHCP message body. That is, search in\r
@@ -682,7 +696,7 @@ Dhcp6SeekStsOption (
               );\r
 \r
   if (*Option != NULL) {\r
-    StsCode = NTOHS (ReadUnaligned16 ((UINT16 *) (*Option + 4)));\r
+    StsCode = NTOHS (ReadUnaligned16 ((UINT16 *)(*Option + 4)));\r
     if (StsCode != Dhcp6StsSuccess) {\r
       return EFI_DEVICE_ERROR;\r
     }\r
@@ -697,7 +711,7 @@ Dhcp6SeekStsOption (
               &Instance->Config->IaDescriptor\r
               );\r
   if (*Option == NULL) {\r
-    return EFI_DEVICE_ERROR;\r
+    return EFI_SUCCESS;\r
   }\r
 \r
   //\r
@@ -743,10 +757,10 @@ Dhcp6SeekStsOption (
   //\r
   if (Instance->Config->IaDescriptor.Type == Dhcp6OptIana) {\r
     IaInnerOpt = *Option + 16;\r
-    IaInnerLen = (UINT16) (NTOHS (ReadUnaligned16 ((UINT16 *) (*Option + 2))) - 12);\r
+    IaInnerLen = (UINT16)(NTOHS (ReadUnaligned16 ((UINT16 *)(*Option + 2))) - 12);\r
   } else {\r
     IaInnerOpt = *Option + 8;\r
-    IaInnerLen = (UINT16) (NTOHS (ReadUnaligned16 ((UINT16 *) (*Option + 2))) - 4);\r
+    IaInnerLen = (UINT16)(NTOHS (ReadUnaligned16 ((UINT16 *)(*Option + 2))) - 4);\r
   }\r
 \r
   //\r
@@ -768,9 +782,9 @@ Dhcp6SeekStsOption (
   //\r
   // sizeof (option-code + option-len) = 4\r
   //\r
-  *Option  = Dhcp6SeekOption (IaInnerOpt, IaInnerLen, Dhcp6OptStatusCode);\r
+  *Option = Dhcp6SeekOption (IaInnerOpt, IaInnerLen, Dhcp6OptStatusCode);\r
   if (*Option != NULL) {\r
-    StsCode = NTOHS (ReadUnaligned16 ((UINT16 *) (*Option + 4)));\r
+    StsCode = NTOHS (ReadUnaligned16 ((UINT16 *)(*Option + 4)));\r
     if (StsCode != Dhcp6StsSuccess) {\r
       return EFI_DEVICE_ERROR;\r
     }\r
@@ -779,7 +793,6 @@ Dhcp6SeekStsOption (
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Transmit Dhcp6 message by udpio.\r
 \r
@@ -794,23 +807,23 @@ Dhcp6SeekStsOption (
 **/\r
 EFI_STATUS\r
 Dhcp6TransmitPacket (\r
-  IN DHCP6_INSTANCE         *Instance,\r
-  IN EFI_DHCP6_PACKET       *Packet,\r
-  IN UINT16                 *Elapsed\r
+  IN DHCP6_INSTANCE    *Instance,\r
+  IN EFI_DHCP6_PACKET  *Packet,\r
+  IN UINT16            *Elapsed\r
   )\r
 {\r
-  EFI_STATUS                Status;\r
-  NET_BUF                   *Wrap;\r
-  NET_FRAGMENT              Frag;\r
-  UDP_END_POINT             EndPt;\r
-  DHCP6_SERVICE             *Service;\r
+  EFI_STATUS     Status;\r
+  NET_BUF        *Wrap;\r
+  NET_FRAGMENT   Frag;\r
+  UDP_END_POINT  EndPt;\r
+  DHCP6_SERVICE  *Service;\r
 \r
   Service = Instance->Service;\r
 \r
   //\r
   // Wrap it into a netbuf then send it.\r
   //\r
-  Frag.Bulk = (UINT8 *) &Packet->Dhcp6.Header;\r
+  Frag.Bulk = (UINT8 *)&Packet->Dhcp6.Header;\r
   Frag.Len  = Packet->Length;\r
 \r
   //\r
@@ -871,7 +884,6 @@ Dhcp6TransmitPacket (
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Create the solicit message and send it.\r
 \r
@@ -884,19 +896,19 @@ Dhcp6TransmitPacket (
 **/\r
 EFI_STATUS\r
 Dhcp6SendSolicitMsg   (\r
-  IN DHCP6_INSTANCE            *Instance\r
+  IN DHCP6_INSTANCE  *Instance\r
   )\r
 {\r
-  EFI_STATUS                   Status;\r
-  EFI_DHCP6_PACKET             *Packet;\r
-  EFI_DHCP6_PACKET_OPTION      *UserOpt;\r
-  EFI_DHCP6_DUID               *ClientId;\r
-  DHCP6_SERVICE                *Service;\r
-  UINT8                        *Cursor;\r
-  UINT16                       *Elapsed;\r
-  UINT32                       UserLen;\r
-  UINTN                        Index;\r
-  UINT16                       Length;\r
+  EFI_STATUS               Status;\r
+  EFI_DHCP6_PACKET         *Packet;\r
+  EFI_DHCP6_PACKET_OPTION  *UserOpt;\r
+  EFI_DHCP6_DUID           *ClientId;\r
+  DHCP6_SERVICE            *Service;\r
+  UINT8                    *Cursor;\r
+  UINT16                   *Elapsed;\r
+  UINT32                   UserLen;\r
+  UINTN                    Index;\r
+  UINT16                   Length;\r
 \r
   Service  = Instance->Service;\r
   ClientId = Service->ClientId;\r
@@ -914,7 +926,7 @@ Dhcp6SendSolicitMsg   (
   }\r
 \r
   //\r
-  // Create the Dhcp6 packet and initialize commone fields.\r
+  // Create the Dhcp6 packet and initialize common fields.\r
   //\r
   Packet = AllocateZeroPool (DHCP6_BASE_PACKET_SIZE + UserLen);\r
   if (Packet == NULL) {\r
@@ -949,16 +961,16 @@ Dhcp6SendSolicitMsg   (
              Cursor,\r
              Instance->IaCb.Ia,\r
              Instance->IaCb.T1,\r
-             Instance->IaCb.T2\r
+             Instance->IaCb.T2,\r
+             Packet->Dhcp6.Header.MessageType\r
              );\r
 \r
   //\r
   // Append user-defined when configurate Dhcp6 service.\r
   //\r
   for (Index = 0; Index < Instance->Config->OptionCount; Index++) {\r
-\r
     UserOpt = Instance->Config->OptionList[Index];\r
-    Cursor  = Dhcp6AppendOption(\r
+    Cursor  = Dhcp6AppendOption (\r
                 Cursor,\r
                 UserOpt->OpCode,\r
                 UserOpt->OpLen,\r
@@ -969,7 +981,7 @@ Dhcp6SendSolicitMsg   (
   //\r
   // Determine the size/length of packet.\r
   //\r
-  Packet->Length += (UINT32) (Cursor - Packet->Dhcp6.Option);\r
+  Packet->Length += (UINT32)(Cursor - Packet->Dhcp6.Option);\r
   ASSERT (Packet->Size > Packet->Length + 8);\r
 \r
   //\r
@@ -987,6 +999,10 @@ Dhcp6SendSolicitMsg   (
   // Dhcp6selecting.\r
   //\r
   Instance->IaCb.Ia->State = Dhcp6Selecting;\r
+  //\r
+  // Clear initial time for current transaction.\r
+  //\r
+  Instance->StartTime = 0;\r
 \r
   Status = Dhcp6TransmitPacket (Instance, Packet, Elapsed);\r
 \r
@@ -1018,17 +1034,16 @@ Dhcp6SendSolicitMsg   (
 **/\r
 EFI_STATUS\r
 Dhcp6InitSolicitMsg   (\r
-  IN DHCP6_INSTANCE            *Instance\r
+  IN DHCP6_INSTANCE  *Instance\r
   )\r
 {\r
-  Instance->IaCb.T1 = 0;\r
-  Instance->IaCb.T2 = 0;\r
+  Instance->IaCb.T1                 = 0;\r
+  Instance->IaCb.T2                 = 0;\r
   Instance->IaCb.Ia->IaAddressCount = 0;\r
 \r
   return Dhcp6SendSolicitMsg (Instance);\r
 }\r
 \r
-\r
 /**\r
   Create the request message and send it.\r
 \r
@@ -1042,31 +1057,31 @@ Dhcp6InitSolicitMsg   (
 **/\r
 EFI_STATUS\r
 Dhcp6SendRequestMsg (\r
-  IN DHCP6_INSTANCE            *Instance\r
+  IN DHCP6_INSTANCE  *Instance\r
   )\r
 {\r
-  EFI_STATUS                   Status;\r
-  EFI_DHCP6_PACKET             *Packet;\r
-  EFI_DHCP6_PACKET_OPTION      *UserOpt;\r
-  EFI_DHCP6_DUID               *ClientId;\r
-  EFI_DHCP6_DUID               *ServerId;\r
-  DHCP6_SERVICE                *Service;\r
-  UINT8                        *Option;\r
-  UINT8                        *Cursor;\r
-  UINT16                       *Elapsed;\r
-  UINT32                       UserLen;\r
-  UINTN                        Index;\r
-  UINT16                       Length;\r
-\r
-  ASSERT(Instance->AdSelect != NULL);\r
-  ASSERT(Instance->Config != NULL);\r
-  ASSERT(Instance->IaCb.Ia != NULL);\r
-  ASSERT(Instance->Service != NULL);\r
+  EFI_STATUS               Status;\r
+  EFI_DHCP6_PACKET         *Packet;\r
+  EFI_DHCP6_PACKET_OPTION  *UserOpt;\r
+  EFI_DHCP6_DUID           *ClientId;\r
+  EFI_DHCP6_DUID           *ServerId;\r
+  DHCP6_SERVICE            *Service;\r
+  UINT8                    *Option;\r
+  UINT8                    *Cursor;\r
+  UINT16                   *Elapsed;\r
+  UINT32                   UserLen;\r
+  UINTN                    Index;\r
+  UINT16                   Length;\r
+\r
+  ASSERT (Instance->AdSelect != NULL);\r
+  ASSERT (Instance->Config != NULL);\r
+  ASSERT (Instance->IaCb.Ia != NULL);\r
+  ASSERT (Instance->Service != NULL);\r
 \r
   Service  = Instance->Service;\r
   ClientId = Service->ClientId;\r
 \r
-  ASSERT(ClientId != NULL);\r
+  ASSERT (ClientId != NULL);\r
 \r
   //\r
   // Get the server Id from the selected advertisement message.\r
@@ -1080,7 +1095,7 @@ Dhcp6SendRequestMsg (
     return EFI_DEVICE_ERROR;\r
   }\r
 \r
-  ServerId = (EFI_DHCP6_DUID *) (Option + 2);\r
+  ServerId = (EFI_DHCP6_DUID *)(Option + 2);\r
 \r
   //\r
   // Calculate the added length of customized option list.\r
@@ -1091,7 +1106,7 @@ Dhcp6SendRequestMsg (
   }\r
 \r
   //\r
-  // Create the Dhcp6 packet and initialize commone fields.\r
+  // Create the Dhcp6 packet and initialize common fields.\r
   //\r
   Packet = AllocateZeroPool (DHCP6_BASE_PACKET_SIZE + UserLen);\r
   if (Packet == NULL) {\r
@@ -1133,16 +1148,16 @@ Dhcp6SendRequestMsg (
              Cursor,\r
              Instance->IaCb.Ia,\r
              Instance->IaCb.T1,\r
-             Instance->IaCb.T2\r
+             Instance->IaCb.T2,\r
+             Packet->Dhcp6.Header.MessageType\r
              );\r
 \r
   //\r
   // Append user-defined when configurate Dhcp6 service.\r
   //\r
   for (Index = 0; Index < Instance->Config->OptionCount; Index++) {\r
-\r
     UserOpt = Instance->Config->OptionList[Index];\r
-    Cursor  = Dhcp6AppendOption(\r
+    Cursor  = Dhcp6AppendOption (\r
                 Cursor,\r
                 UserOpt->OpCode,\r
                 UserOpt->OpLen,\r
@@ -1153,7 +1168,7 @@ Dhcp6SendRequestMsg (
   //\r
   // Determine the size/length of packet.\r
   //\r
-  Packet->Length += (UINT32) (Cursor - Packet->Dhcp6.Option);\r
+  Packet->Length += (UINT32)(Cursor - Packet->Dhcp6.Option);\r
   ASSERT (Packet->Size > Packet->Length + 8);\r
 \r
   //\r
@@ -1171,6 +1186,10 @@ Dhcp6SendRequestMsg (
   // Dhcp6requesting.\r
   //\r
   Instance->IaCb.Ia->State = Dhcp6Requesting;\r
+  //\r
+  // Clear initial time for current transaction.\r
+  //\r
+  Instance->StartTime = 0;\r
 \r
   Status = Dhcp6TransmitPacket (Instance, Packet, Elapsed);\r
 \r
@@ -1185,7 +1204,6 @@ Dhcp6SendRequestMsg (
   return Dhcp6EnqueueRetry (Instance, Packet, Elapsed, NULL);\r
 }\r
 \r
-\r
 /**\r
   Create the decline message and send it.\r
 \r
@@ -1200,20 +1218,20 @@ Dhcp6SendRequestMsg (
 **/\r
 EFI_STATUS\r
 Dhcp6SendDeclineMsg (\r
-  IN DHCP6_INSTANCE            *Instance,\r
-  IN EFI_DHCP6_IA              *DecIa\r
+  IN DHCP6_INSTANCE  *Instance,\r
+  IN EFI_DHCP6_IA    *DecIa\r
   )\r
 {\r
-  EFI_STATUS                   Status;\r
-  EFI_DHCP6_PACKET             *Packet;\r
-  EFI_DHCP6_PACKET             *LastReply;\r
-  EFI_DHCP6_DUID               *ClientId;\r
-  EFI_DHCP6_DUID               *ServerId;\r
-  DHCP6_SERVICE                *Service;\r
-  UINT8                        *Option;\r
-  UINT8                        *Cursor;\r
-  UINT16                       *Elapsed;\r
-  UINT16                       Length;\r
+  EFI_STATUS        Status;\r
+  EFI_DHCP6_PACKET  *Packet;\r
+  EFI_DHCP6_PACKET  *LastReply;\r
+  EFI_DHCP6_DUID    *ClientId;\r
+  EFI_DHCP6_DUID    *ServerId;\r
+  DHCP6_SERVICE     *Service;\r
+  UINT8             *Option;\r
+  UINT8             *Cursor;\r
+  UINT16            *Elapsed;\r
+  UINT16            Length;\r
 \r
   ASSERT (Instance->Config != NULL);\r
   ASSERT (Instance->IaCb.Ia != NULL);\r
@@ -1241,10 +1259,10 @@ Dhcp6SendDeclineMsg (
   //\r
   // EFI_DHCP6_DUID contains a length field of 2 bytes.\r
   //\r
-  ServerId = (EFI_DHCP6_DUID *) (Option + 2);\r
+  ServerId = (EFI_DHCP6_DUID *)(Option + 2);\r
 \r
   //\r
-  // Create the Dhcp6 packet and initialize commone fields.\r
+  // Create the Dhcp6 packet and initialize common fields.\r
   //\r
   Packet = AllocateZeroPool (DHCP6_BASE_PACKET_SIZE);\r
   if (Packet == NULL) {\r
@@ -1282,12 +1300,12 @@ Dhcp6SendDeclineMsg (
              ServerId->Duid\r
              );\r
 \r
-  Cursor = Dhcp6AppendIaOption (Cursor, DecIa, 0, 0);\r
+  Cursor = Dhcp6AppendIaOption (Cursor, DecIa, 0, 0, Packet->Dhcp6.Header.MessageType);\r
 \r
   //\r
   // Determine the size/length of packet.\r
   //\r
-  Packet->Length += (UINT32) (Cursor - Packet->Dhcp6.Option);\r
+  Packet->Length += (UINT32)(Cursor - Packet->Dhcp6.Option);\r
   ASSERT (Packet->Size > Packet->Length + 8);\r
 \r
   //\r
@@ -1305,6 +1323,10 @@ Dhcp6SendDeclineMsg (
   // Dhcp6declining.\r
   //\r
   Instance->IaCb.Ia->State = Dhcp6Declining;\r
+  //\r
+  // Clear initial time for current transaction.\r
+  //\r
+  Instance->StartTime = 0;\r
 \r
   Status = Dhcp6TransmitPacket (Instance, Packet, Elapsed);\r
 \r
@@ -1319,7 +1341,6 @@ Dhcp6SendDeclineMsg (
   return Dhcp6EnqueueRetry (Instance, Packet, Elapsed, NULL);\r
 }\r
 \r
-\r
 /**\r
   Create the release message and send it.\r
 \r
@@ -1334,30 +1355,30 @@ Dhcp6SendDeclineMsg (
 **/\r
 EFI_STATUS\r
 Dhcp6SendReleaseMsg (\r
-  IN DHCP6_INSTANCE            *Instance,\r
-  IN EFI_DHCP6_IA              *RelIa\r
+  IN DHCP6_INSTANCE  *Instance,\r
+  IN EFI_DHCP6_IA    *RelIa\r
   )\r
 {\r
-  EFI_STATUS                   Status;\r
-  EFI_DHCP6_PACKET             *Packet;\r
-  EFI_DHCP6_PACKET             *LastReply;\r
-  EFI_DHCP6_DUID               *ClientId;\r
-  EFI_DHCP6_DUID               *ServerId;\r
-  DHCP6_SERVICE                *Service;\r
-  UINT8                        *Option;\r
-  UINT8                        *Cursor;\r
-  UINT16                       *Elapsed;\r
-  UINT16                       Length;\r
-\r
-  ASSERT(Instance->Config);\r
-  ASSERT(Instance->IaCb.Ia);\r
+  EFI_STATUS        Status;\r
+  EFI_DHCP6_PACKET  *Packet;\r
+  EFI_DHCP6_PACKET  *LastReply;\r
+  EFI_DHCP6_DUID    *ClientId;\r
+  EFI_DHCP6_DUID    *ServerId;\r
+  DHCP6_SERVICE     *Service;\r
+  UINT8             *Option;\r
+  UINT8             *Cursor;\r
+  UINT16            *Elapsed;\r
+  UINT16            Length;\r
+\r
+  ASSERT (Instance->Config);\r
+  ASSERT (Instance->IaCb.Ia);\r
 \r
   Service   = Instance->Service;\r
   ClientId  = Service->ClientId;\r
   LastReply = Instance->IaCb.Ia->ReplyPacket;\r
 \r
-  ASSERT(ClientId);\r
-  ASSERT(LastReply);\r
+  ASSERT (ClientId);\r
+  ASSERT (LastReply);\r
 \r
   //\r
   // Get the server Id from the last reply message.\r
@@ -1371,10 +1392,10 @@ Dhcp6SendReleaseMsg (
     return EFI_DEVICE_ERROR;\r
   }\r
 \r
-  ServerId = (EFI_DHCP6_DUID *) (Option + 2);\r
+  ServerId = (EFI_DHCP6_DUID *)(Option + 2);\r
 \r
   //\r
-  // Create the Dhcp6 packet and initialize commone fields.\r
+  // Create the Dhcp6 packet and initialize common fields.\r
   //\r
   Packet = AllocateZeroPool (DHCP6_BASE_PACKET_SIZE);\r
   if (Packet == NULL) {\r
@@ -1415,12 +1436,12 @@ Dhcp6SendReleaseMsg (
              &Elapsed\r
              );\r
 \r
-  Cursor = Dhcp6AppendIaOption (Cursor, RelIa, 0, 0);\r
+  Cursor = Dhcp6AppendIaOption (Cursor, RelIa, 0, 0, Packet->Dhcp6.Header.MessageType);\r
 \r
   //\r
   // Determine the size/length of packet\r
   //\r
-  Packet->Length += (UINT32) (Cursor - Packet->Dhcp6.Option);\r
+  Packet->Length += (UINT32)(Cursor - Packet->Dhcp6.Option);\r
   ASSERT (Packet->Size > Packet->Length + 8);\r
 \r
   //\r
@@ -1452,7 +1473,6 @@ Dhcp6SendReleaseMsg (
   return Dhcp6EnqueueRetry (Instance, Packet, Elapsed, NULL);\r
 }\r
 \r
-\r
 /**\r
   Create the renew/rebind message and send it.\r
 \r
@@ -1468,33 +1488,33 @@ Dhcp6SendReleaseMsg (
 **/\r
 EFI_STATUS\r
 Dhcp6SendRenewRebindMsg (\r
-  IN DHCP6_INSTANCE         *Instance,\r
-  IN BOOLEAN                RebindRequest\r
+  IN DHCP6_INSTANCE  *Instance,\r
+  IN BOOLEAN         RebindRequest\r
   )\r
 {\r
-  EFI_STATUS                Status;\r
-  EFI_DHCP6_PACKET          *Packet;\r
-  EFI_DHCP6_PACKET          *LastReply;\r
-  EFI_DHCP6_PACKET_OPTION   *UserOpt;\r
-  EFI_DHCP6_DUID            *ClientId;\r
-  EFI_DHCP6_DUID            *ServerId;\r
-  EFI_DHCP6_STATE           State;\r
-  EFI_DHCP6_EVENT           Event;\r
-  DHCP6_SERVICE             *Service;\r
-  UINT8                     *Option;\r
-  UINT8                     *Cursor;\r
-  UINT16                    *Elapsed;\r
-  UINT32                    UserLen;\r
-  UINTN                     Index;\r
-  UINT16                    Length;\r
-\r
-  ASSERT(Instance->Config);\r
-  ASSERT(Instance->IaCb.Ia);\r
+  EFI_STATUS               Status;\r
+  EFI_DHCP6_PACKET         *Packet;\r
+  EFI_DHCP6_PACKET         *LastReply;\r
+  EFI_DHCP6_PACKET_OPTION  *UserOpt;\r
+  EFI_DHCP6_DUID           *ClientId;\r
+  EFI_DHCP6_DUID           *ServerId;\r
+  EFI_DHCP6_STATE          State;\r
+  EFI_DHCP6_EVENT          Event;\r
+  DHCP6_SERVICE            *Service;\r
+  UINT8                    *Option;\r
+  UINT8                    *Cursor;\r
+  UINT16                   *Elapsed;\r
+  UINT32                   UserLen;\r
+  UINTN                    Index;\r
+  UINT16                   Length;\r
 \r
-  Service   = Instance->Service;\r
-  ClientId  = Service->ClientId;\r
+  ASSERT (Instance->Config);\r
+  ASSERT (Instance->IaCb.Ia);\r
+\r
+  Service  = Instance->Service;\r
+  ClientId = Service->ClientId;\r
 \r
-  ASSERT(ClientId);\r
+  ASSERT (ClientId);\r
 \r
   //\r
   // Calculate the added length of customized option list.\r
@@ -1505,7 +1525,7 @@ Dhcp6SendRenewRebindMsg (
   }\r
 \r
   //\r
-  // Create the Dhcp6 packet and initialize commone fields.\r
+  // Create the Dhcp6 packet and initialize common fields.\r
   //\r
   Packet = AllocateZeroPool (DHCP6_BASE_PACKET_SIZE + UserLen);\r
   if (Packet == NULL) {\r
@@ -1540,7 +1560,8 @@ Dhcp6SendRenewRebindMsg (
              Cursor,\r
              Instance->IaCb.Ia,\r
              Instance->IaCb.T1,\r
-             Instance->IaCb.T2\r
+             Instance->IaCb.T2,\r
+             Packet->Dhcp6.Header.MessageType\r
              );\r
 \r
   if (!RebindRequest) {\r
@@ -1561,7 +1582,7 @@ Dhcp6SendRenewRebindMsg (
       return EFI_DEVICE_ERROR;\r
     }\r
 \r
-    ServerId = (EFI_DHCP6_DUID *) (Option + 2);\r
+    ServerId = (EFI_DHCP6_DUID *)(Option + 2);\r
 \r
     Cursor = Dhcp6AppendOption (\r
                Cursor,\r
@@ -1575,9 +1596,8 @@ Dhcp6SendRenewRebindMsg (
   // Append user-defined when configurate Dhcp6 service.\r
   //\r
   for (Index = 0; Index < Instance->Config->OptionCount; Index++) {\r
-\r
     UserOpt = Instance->Config->OptionList[Index];\r
-    Cursor  = Dhcp6AppendOption(\r
+    Cursor  = Dhcp6AppendOption (\r
                 Cursor,\r
                 UserOpt->OpCode,\r
                 UserOpt->OpLen,\r
@@ -1588,14 +1608,14 @@ Dhcp6SendRenewRebindMsg (
   //\r
   // Determine the size/length of packet.\r
   //\r
-  Packet->Length += (UINT32) (Cursor - Packet->Dhcp6.Option);\r
+  Packet->Length += (UINT32)(Cursor - Packet->Dhcp6.Option);\r
   ASSERT (Packet->Size > Packet->Length + 8);\r
 \r
   //\r
   // Callback to user with the packet to be sent and check the user's feedback.\r
   //\r
-  State  = (RebindRequest) ? Dhcp6Rebinding : Dhcp6Renewing;\r
-  Event  = (RebindRequest) ? Dhcp6EnterRebinding : Dhcp6EnterRenewing;\r
+  State = (RebindRequest) ? Dhcp6Rebinding : Dhcp6Renewing;\r
+  Event = (RebindRequest) ? Dhcp6EnterRebinding : Dhcp6EnterRenewing;\r
 \r
   Status = Dhcp6CallbackUser (Instance, Event, &Packet);\r
 \r
@@ -1612,6 +1632,10 @@ Dhcp6SendRenewRebindMsg (
   //\r
   Instance->IaCb.Ia->State = State;\r
   Instance->IaCb.LeaseTime = (RebindRequest) ? Instance->IaCb.T2 : Instance->IaCb.T1;\r
+  //\r
+  // Clear initial time for current transaction.\r
+  //\r
+  Instance->StartTime = 0;\r
 \r
   Status = Dhcp6TransmitPacket (Instance, Packet, Elapsed);\r
 \r
@@ -1626,6 +1650,106 @@ Dhcp6SendRenewRebindMsg (
   return Dhcp6EnqueueRetry (Instance, Packet, Elapsed, NULL);\r
 }\r
 \r
+/**\r
+  Start the information request process.\r
+\r
+  @param[in]  Instance          The pointer to the Dhcp6 instance.\r
+  @param[in]  SendClientId      If TRUE, the client identifier option will be included in\r
+                                information request message. Otherwise, the client identifier\r
+                                option will not be included.\r
+  @param[in]  OptionRequest     The pointer to the option request option.\r
+  @param[in]  OptionCount       The number options in the OptionList.\r
+  @param[in]  OptionList        The array pointers to the appended options.\r
+  @param[in]  Retransmission    The pointer to the retransmission control.\r
+  @param[in]  TimeoutEvent      The event of timeout.\r
+  @param[in]  ReplyCallback     The callback function when the reply was received.\r
+  @param[in]  CallbackContext   The pointer to the parameter passed to the callback.\r
+\r
+  @retval EFI_SUCCESS           Start the info-request process successfully.\r
+  @retval EFI_OUT_OF_RESOURCES  Required system resources could not be allocated.\r
+  @retval EFI_NO_MAPPING        No source address is available for use.\r
+  @retval Others                Failed to start the info-request process.\r
+\r
+**/\r
+EFI_STATUS\r
+Dhcp6StartInfoRequest (\r
+  IN DHCP6_INSTANCE            *Instance,\r
+  IN BOOLEAN                   SendClientId,\r
+  IN EFI_DHCP6_PACKET_OPTION   *OptionRequest,\r
+  IN UINT32                    OptionCount,\r
+  IN EFI_DHCP6_PACKET_OPTION   *OptionList[]    OPTIONAL,\r
+  IN EFI_DHCP6_RETRANSMISSION  *Retransmission,\r
+  IN EFI_EVENT                 TimeoutEvent     OPTIONAL,\r
+  IN EFI_DHCP6_INFO_CALLBACK   ReplyCallback,\r
+  IN VOID                      *CallbackContext OPTIONAL\r
+  )\r
+{\r
+  EFI_STATUS     Status;\r
+  DHCP6_INF_CB   *InfCb;\r
+  DHCP6_SERVICE  *Service;\r
+  EFI_TPL        OldTpl;\r
+\r
+  Service = Instance->Service;\r
+\r
+  OldTpl           = gBS->RaiseTPL (TPL_CALLBACK);\r
+  Instance->UdpSts = EFI_ALREADY_STARTED;\r
+  //\r
+  // Create and initialize the control block for the info-request.\r
+  //\r
+  InfCb = AllocateZeroPool (sizeof (DHCP6_INF_CB));\r
+\r
+  if (InfCb == NULL) {\r
+    gBS->RestoreTPL (OldTpl);\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  InfCb->ReplyCallback   = ReplyCallback;\r
+  InfCb->CallbackContext = CallbackContext;\r
+  InfCb->TimeoutEvent    = TimeoutEvent;\r
+\r
+  InsertTailList (&Instance->InfList, &InfCb->Link);\r
+\r
+  //\r
+  // Send the info-request message to start exchange process.\r
+  //\r
+  Status = Dhcp6SendInfoRequestMsg (\r
+             Instance,\r
+             InfCb,\r
+             SendClientId,\r
+             OptionRequest,\r
+             OptionCount,\r
+             OptionList,\r
+             Retransmission\r
+             );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    goto ON_ERROR;\r
+  }\r
+\r
+  //\r
+  // Register receive callback for the stateless exchange process.\r
+  //\r
+  Status = UdpIoRecvDatagram (\r
+             Service->UdpIo,\r
+             Dhcp6ReceivePacket,\r
+             Service,\r
+             0\r
+             );\r
+\r
+  if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {\r
+    goto ON_ERROR;\r
+  }\r
+\r
+  gBS->RestoreTPL (OldTpl);\r
+  return EFI_SUCCESS;\r
+\r
+ON_ERROR:\r
+  gBS->RestoreTPL (OldTpl);\r
+  RemoveEntryList (&InfCb->Link);\r
+  FreePool (InfCb);\r
+\r
+  return Status;\r
+}\r
 \r
 /**\r
   Create the information request message and send it.\r
@@ -1656,24 +1780,24 @@ Dhcp6SendInfoRequestMsg (
   IN EFI_DHCP6_RETRANSMISSION  *Retransmission\r
   )\r
 {\r
-  EFI_STATUS                   Status;\r
-  EFI_DHCP6_PACKET             *Packet;\r
-  EFI_DHCP6_PACKET_OPTION      *UserOpt;\r
-  EFI_DHCP6_DUID               *ClientId;\r
-  DHCP6_SERVICE                *Service;\r
-  UINT8                        *Cursor;\r
-  UINT16                       *Elapsed;\r
-  UINT32                       UserLen;\r
-  UINTN                        Index;\r
-  UINT16                       Length;\r
-\r
-  ASSERT(OptionRequest);\r
+  EFI_STATUS               Status;\r
+  EFI_DHCP6_PACKET         *Packet;\r
+  EFI_DHCP6_PACKET_OPTION  *UserOpt;\r
+  EFI_DHCP6_DUID           *ClientId;\r
+  DHCP6_SERVICE            *Service;\r
+  UINT8                    *Cursor;\r
+  UINT16                   *Elapsed;\r
+  UINT32                   UserLen;\r
+  UINTN                    Index;\r
+  UINT16                   Length;\r
+\r
+  ASSERT (OptionRequest);\r
 \r
   Service  = Instance->Service;\r
   ClientId = Service->ClientId;\r
   UserLen  = NTOHS (OptionRequest->OpLen) + 4;\r
 \r
-  ASSERT(ClientId);\r
+  ASSERT (ClientId);\r
 \r
   //\r
   // Calculate the added length of customized option list.\r
@@ -1683,7 +1807,7 @@ Dhcp6SendInfoRequestMsg (
   }\r
 \r
   //\r
-  // Create the Dhcp6 packet and initialize commone fields.\r
+  // Create the Dhcp6 packet and initialize common fields.\r
   //\r
   Packet = AllocateZeroPool (DHCP6_BASE_PACKET_SIZE + UserLen);\r
   if (Packet == NULL) {\r
@@ -1695,7 +1819,7 @@ Dhcp6SendInfoRequestMsg (
   Packet->Dhcp6.Header.MessageType   = Dhcp6MsgInfoRequest;\r
   Packet->Dhcp6.Header.TransactionId = Service->Xid++;\r
 \r
-  InfCb->Xid                         = Packet->Dhcp6.Header.TransactionId;\r
+  InfCb->Xid = Packet->Dhcp6.Header.TransactionId;\r
 \r
   //\r
   // Assembly Dhcp6 options for info-request message.\r
@@ -1729,9 +1853,8 @@ Dhcp6SendInfoRequestMsg (
   // Append user-defined when configurate Dhcp6 service.\r
   //\r
   for (Index = 0; Index < OptionCount; Index++) {\r
-\r
     UserOpt = OptionList[Index];\r
-    Cursor  = Dhcp6AppendOption(\r
+    Cursor  = Dhcp6AppendOption (\r
                 Cursor,\r
                 UserOpt->OpCode,\r
                 UserOpt->OpLen,\r
@@ -1742,9 +1865,14 @@ Dhcp6SendInfoRequestMsg (
   //\r
   // Determine the size/length of packet.\r
   //\r
-  Packet->Length += (UINT32) (Cursor - Packet->Dhcp6.Option);\r
+  Packet->Length += (UINT32)(Cursor - Packet->Dhcp6.Option);\r
   ASSERT (Packet->Size > Packet->Length + 8);\r
 \r
+  //\r
+  // Clear initial time for current transaction.\r
+  //\r
+  Instance->StartTime = 0;\r
+\r
   //\r
   // Send info-request packet with no state.\r
   //\r
@@ -1761,7 +1889,6 @@ Dhcp6SendInfoRequestMsg (
   return Dhcp6EnqueueRetry (Instance, Packet, Elapsed, Retransmission);\r
 }\r
 \r
-\r
 /**\r
   Create the Confirm message and send it.\r
 \r
@@ -1775,19 +1902,19 @@ Dhcp6SendInfoRequestMsg (
 **/\r
 EFI_STATUS\r
 Dhcp6SendConfirmMsg (\r
-  IN DHCP6_INSTANCE            *Instance\r
+  IN DHCP6_INSTANCE  *Instance\r
   )\r
 {\r
-  UINT8                        *Cursor;\r
-  UINTN                        Index;\r
-  UINT16                       Length;\r
-  UINT32                       UserLen;\r
-  EFI_STATUS                   Status;\r
-  DHCP6_SERVICE                *Service;\r
-  EFI_DHCP6_DUID               *ClientId;\r
-  EFI_DHCP6_PACKET             *Packet;\r
-  EFI_DHCP6_PACKET_OPTION      *UserOpt;\r
-  UINT16                       *Elapsed;\r
+  UINT8                    *Cursor;\r
+  UINTN                    Index;\r
+  UINT16                   Length;\r
+  UINT32                   UserLen;\r
+  EFI_STATUS               Status;\r
+  DHCP6_SERVICE            *Service;\r
+  EFI_DHCP6_DUID           *ClientId;\r
+  EFI_DHCP6_PACKET         *Packet;\r
+  EFI_DHCP6_PACKET_OPTION  *UserOpt;\r
+  UINT16                   *Elapsed;\r
 \r
   ASSERT (Instance->Config != NULL);\r
   ASSERT (Instance->IaCb.Ia != NULL);\r
@@ -1841,7 +1968,8 @@ Dhcp6SendConfirmMsg (
              Cursor,\r
              Instance->IaCb.Ia,\r
              Instance->IaCb.T1,\r
-             Instance->IaCb.T2\r
+             Instance->IaCb.T2,\r
+             Packet->Dhcp6.Header.MessageType\r
              );\r
 \r
   //\r
@@ -1860,7 +1988,7 @@ Dhcp6SendConfirmMsg (
   //\r
   // Determine the size/length of packet.\r
   //\r
-  Packet->Length += (UINT32) (Cursor - Packet->Dhcp6.Option);\r
+  Packet->Length += (UINT32)(Cursor - Packet->Dhcp6.Option);\r
   ASSERT (Packet->Size > Packet->Length + 8);\r
 \r
   //\r
@@ -1878,6 +2006,10 @@ Dhcp6SendConfirmMsg (
   // Dhcp6Confirming.\r
   //\r
   Instance->IaCb.Ia->State = Dhcp6Confirming;\r
+  //\r
+  // Clear initial time for current transaction.\r
+  //\r
+  Instance->StartTime = 0;\r
 \r
   Status = Dhcp6TransmitPacket (Instance, Packet, Elapsed);\r
 \r
@@ -1892,8 +2024,6 @@ Dhcp6SendConfirmMsg (
   return Dhcp6EnqueueRetry (Instance, Packet, Elapsed, NULL);\r
 }\r
 \r
-\r
-\r
 /**\r
   Handle with the Dhcp6 reply message.\r
 \r
@@ -1908,18 +2038,20 @@ Dhcp6SendConfirmMsg (
 **/\r
 EFI_STATUS\r
 Dhcp6HandleReplyMsg (\r
-  IN DHCP6_INSTANCE           *Instance,\r
-  IN EFI_DHCP6_PACKET         *Packet\r
+  IN DHCP6_INSTANCE    *Instance,\r
+  IN EFI_DHCP6_PACKET  *Packet\r
   )\r
 {\r
-  EFI_STATUS                  Status;\r
-  UINT8                       *Option;\r
-  UINT16                      StsCode;\r
+  EFI_STATUS  Status;\r
+  UINT8       *Option;\r
+  UINT16      StsCode;\r
 \r
   ASSERT (Instance->Config != NULL);\r
   ASSERT (Instance->IaCb.Ia != NULL);\r
   ASSERT (Packet != NULL);\r
 \r
+  Status = EFI_SUCCESS;\r
+\r
   if (Packet->Dhcp6.Header.MessageType != Dhcp6MsgReply) {\r
     return EFI_DEVICE_ERROR;\r
   }\r
@@ -1937,7 +2069,7 @@ Dhcp6HandleReplyMsg (
              Dhcp6OptRapidCommit\r
              );\r
 \r
-  if ((Option != NULL && !Instance->Config->RapidCommit) || (Option == NULL && Instance->Config->RapidCommit)) {\r
+  if (((Option != NULL) && !Instance->Config->RapidCommit) || ((Option == NULL) && Instance->Config->RapidCommit)) {\r
     return EFI_DEVICE_ERROR;\r
   }\r
 \r
@@ -1945,18 +2077,18 @@ Dhcp6HandleReplyMsg (
   // As to a valid reply packet in response to a request/renew/rebind packet,\r
   // ignore the packet if not contains the Ia option\r
   //\r
-  if (Instance->IaCb.Ia->State == Dhcp6Requesting ||\r
-      Instance->IaCb.Ia->State == Dhcp6Renewing ||\r
-      Instance->IaCb.Ia->State == Dhcp6Rebinding\r
-      ) {\r
-\r
+  if ((Instance->IaCb.Ia->State == Dhcp6Requesting) ||\r
+      (Instance->IaCb.Ia->State == Dhcp6Renewing) ||\r
+      (Instance->IaCb.Ia->State == Dhcp6Rebinding)\r
+      )\r
+  {\r
     Option = Dhcp6SeekIaOption (\r
                Packet->Dhcp6.Option,\r
                Packet->Length,\r
                &Instance->Config->IaDescriptor\r
                );\r
     if (Option == NULL) {\r
-      return EFI_DEVICE_ERROR;\r
+      return EFI_SUCCESS;\r
     }\r
   }\r
 \r
@@ -1969,28 +2101,14 @@ Dhcp6HandleReplyMsg (
     return Status;\r
   }\r
 \r
-  //\r
-  // Dequeue the sent packet from retransmit list since reply received.\r
-  //\r
-  Status = Dhcp6DequeueRetry (\r
-             Instance,\r
-             Packet->Dhcp6.Header.TransactionId,\r
-             FALSE\r
-             );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
   //\r
   // When receive a valid reply packet in response to a decline/release packet,\r
   // the client considers the decline/release event completed regardless of the\r
   // status code.\r
   //\r
-  if (Instance->IaCb.Ia->State == Dhcp6Declining || Instance->IaCb.Ia->State == Dhcp6Releasing) {\r
-\r
+  if ((Instance->IaCb.Ia->State == Dhcp6Declining) || (Instance->IaCb.Ia->State == Dhcp6Releasing)) {\r
     if (Instance->IaCb.Ia->IaAddressCount != 0) {\r
-      Instance->IaCb.Ia->State       = Dhcp6Bound;\r
+      Instance->IaCb.Ia->State = Dhcp6Bound;\r
     } else {\r
       ASSERT (Instance->IaCb.Ia->ReplyPacket);\r
       FreePool (Instance->IaCb.Ia->ReplyPacket);\r
@@ -2004,7 +2122,7 @@ Dhcp6HandleReplyMsg (
     Instance->UdpSts = EFI_SUCCESS;\r
 \r
     //\r
-    // For async, signal the Ia event to inform Ia infomation update.\r
+    // For async, signal the Ia event to inform Ia information update.\r
     //\r
     if (Instance->Config->IaInfoEvent != NULL) {\r
       gBS->SignalEvent (Instance->Config->IaInfoEvent);\r
@@ -2013,9 +2131,10 @@ Dhcp6HandleReplyMsg (
     //\r
     // Reset start time for next exchange.\r
     //\r
-    Instance->StartTime       = 0;\r
+    Instance->StartTime = 0;\r
 \r
-    return EFI_SUCCESS;\r
+    Status = EFI_SUCCESS;\r
+    goto ON_EXIT;\r
   }\r
 \r
   //\r
@@ -2031,112 +2150,146 @@ Dhcp6HandleReplyMsg (
              );\r
 \r
   if (!EFI_ERROR (Status)) {\r
-    //\r
-    // Reset start time for next exchange.\r
-    //\r
-    Instance->StartTime       = 0;\r
-\r
     //\r
     // No status code or no error status code means succeed to reply.\r
     //\r
     Status = Dhcp6UpdateIaInfo (Instance, Packet);\r
+    if (!EFI_ERROR (Status)) {\r
+      //\r
+      // Reset start time for next exchange.\r
+      //\r
+      Instance->StartTime = 0;\r
 \r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-\r
-    //\r
-    // Set bound state and store the reply packet.\r
-    //\r
-    if (Instance->IaCb.Ia->ReplyPacket != NULL) {\r
-      FreePool (Instance->IaCb.Ia->ReplyPacket);\r
-    }\r
-\r
-    Instance->IaCb.Ia->ReplyPacket = AllocateZeroPool (Packet->Size);\r
+      //\r
+      // Set bound state and store the reply packet.\r
+      //\r
+      if (Instance->IaCb.Ia->ReplyPacket != NULL) {\r
+        FreePool (Instance->IaCb.Ia->ReplyPacket);\r
+      }\r
 \r
-    if (Instance->IaCb.Ia->ReplyPacket == NULL) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
+      Instance->IaCb.Ia->ReplyPacket = AllocateZeroPool (Packet->Size);\r
 \r
-    CopyMem (Instance->IaCb.Ia->ReplyPacket, Packet, Packet->Size);\r
+      if (Instance->IaCb.Ia->ReplyPacket == NULL) {\r
+        Status = EFI_OUT_OF_RESOURCES;\r
+        goto ON_EXIT;\r
+      }\r
 \r
-    Instance->IaCb.Ia->State = Dhcp6Bound;\r
+      CopyMem (Instance->IaCb.Ia->ReplyPacket, Packet, Packet->Size);\r
 \r
-    //\r
-    // For sync, set the success flag out of polling in start/renewrebind.\r
-    //\r
-    Instance->UdpSts         = EFI_SUCCESS;\r
+      Instance->IaCb.Ia->State = Dhcp6Bound;\r
 \r
-    //\r
-    // Maybe this is a new round DHCP process due to some reason, such as NotOnLink\r
-    // ReplyMsg for ConfirmMsg should triger new round to acquire new address. In that\r
-    // case, clear old address.ValidLifetime and append to new address. Therefore, DHCP\r
-    // consumers can be notified to flush old address.\r
-    //\r
-    Dhcp6AppendCacheIa (Instance);\r
+      //\r
+      // For sync, set the success flag out of polling in start/renewrebind.\r
+      //\r
+      Instance->UdpSts = EFI_SUCCESS;\r
 \r
-    //\r
-    // For async, signal the Ia event to inform Ia infomation update.\r
-    //\r
-    if (Instance->Config->IaInfoEvent != NULL) {\r
-      gBS->SignalEvent (Instance->Config->IaInfoEvent);\r
-    }\r
-  } else if (Option != NULL) {\r
-    //\r
-    // Any error status code option is found.\r
-    //\r
-    StsCode = NTOHS (ReadUnaligned16 ((UINT16 *) (Option + 4)));\r
-    switch (StsCode) {\r
-    case Dhcp6StsUnspecFail:\r
       //\r
-      // It indicates the server is unable to process the message due to an\r
-      // unspecified failure condition, so just retry if possible.\r
+      // Maybe this is a new round DHCP process due to some reason, such as NotOnLink\r
+      // ReplyMsg for ConfirmMsg should trigger new round to acquire new address. In that\r
+      // case, clear old address.ValidLifetime and append to new address. Therefore, DHCP\r
+      // consumers can be notified to flush old address.\r
       //\r
-      break;\r
+      Dhcp6AppendCacheIa (Instance);\r
 \r
-    case Dhcp6StsUseMulticast:\r
       //\r
-      // It indicates the server receives a message via unicast from a client\r
-      // to which the server has not sent a unicast option, so retry it by\r
-      // multi-cast address.\r
+      // For async, signal the Ia event to inform Ia information update.\r
       //\r
-      if (Instance->Unicast != NULL) {\r
-        FreePool (Instance->Unicast);\r
-        Instance->Unicast = NULL;\r
+      if (Instance->Config->IaInfoEvent != NULL) {\r
+        gBS->SignalEvent (Instance->Config->IaInfoEvent);\r
       }\r
-      break;\r
+    } else if (Status == EFI_NOT_FOUND) {\r
+      //\r
+      // Refer to RFC3315 Chapter 18.1.8, for each IA in the original Renew or Rebind message,\r
+      // the client sends a Renew or Rebind if the IA is not in the Reply message.\r
+      // Return EFI_SUCCESS so we can continue to restart the Renew/Rebind process.\r
+      //\r
+      return EFI_SUCCESS;\r
+    }\r
 \r
-    case Dhcp6StsNotOnLink:\r
-      if (Instance->IaCb.Ia->State == Dhcp6Confirming) {\r
+    goto ON_EXIT;\r
+  } else if (Option != NULL) {\r
+    //\r
+    // Any error status code option is found.\r
+    //\r
+    StsCode = NTOHS (ReadUnaligned16 ((UINT16 *)(Option + 4)));\r
+    switch (StsCode) {\r
+      case Dhcp6StsUnspecFail:\r
         //\r
-        // Before initiate new round DHCP, cache the current IA.\r
+        // It indicates the server is unable to process the message due to an\r
+        // unspecified failure condition, so just retry if possible.\r
         //\r
-        Status = Dhcp6CacheIa (Instance);\r
-        if (EFI_ERROR (Status)) {\r
-          return  Status;\r
-        }\r
+        break;\r
 \r
+      case Dhcp6StsUseMulticast:\r
         //\r
-        // Restart S.A.R.R process to acquire new address.\r
+        // It indicates the server receives a message via unicast from a client\r
+        // to which the server has not sent a unicast option, so retry it by\r
+        // multi-cast address.\r
         //\r
-        Status = Dhcp6InitSolicitMsg (Instance);\r
-        if (EFI_ERROR (Status)) {\r
-          return Status;\r
+        if (Instance->Unicast != NULL) {\r
+          FreePool (Instance->Unicast);\r
+          Instance->Unicast = NULL;\r
         }\r
-      }\r
-      break;\r
 \r
-    default:\r
-      //\r
-      // The other status code, just restart solicitation.\r
-      //\r
-      break;\r
+        break;\r
+\r
+      case Dhcp6StsNotOnLink:\r
+        if (Instance->IaCb.Ia->State == Dhcp6Confirming) {\r
+          //\r
+          // Before initiate new round DHCP, cache the current IA.\r
+          //\r
+          Status = Dhcp6CacheIa (Instance);\r
+          if (EFI_ERROR (Status)) {\r
+            return Status;\r
+          }\r
+\r
+          //\r
+          // Restart S.A.R.R process to acquire new address.\r
+          //\r
+          Status = Dhcp6InitSolicitMsg (Instance);\r
+          if (EFI_ERROR (Status)) {\r
+            return Status;\r
+          }\r
+        }\r
+\r
+        break;\r
+\r
+      case Dhcp6StsNoBinding:\r
+        if ((Instance->IaCb.Ia->State == Dhcp6Renewing) || (Instance->IaCb.Ia->State == Dhcp6Rebinding)) {\r
+          //\r
+          // Refer to RFC3315 Chapter 18.1.8, for each IA in the original Renew or Rebind message, the client\r
+          // sends a Request message if the IA contained a Status Code option with the NoBinding status.\r
+          //\r
+          Status = Dhcp6SendRequestMsg (Instance);\r
+          if (EFI_ERROR (Status)) {\r
+            return Status;\r
+          }\r
+        }\r
+\r
+        break;\r
+\r
+      default:\r
+        //\r
+        // The other status code, just restart solicitation.\r
+        //\r
+        break;\r
     }\r
   }\r
 \r
   return EFI_SUCCESS;\r
-}\r
 \r
+ON_EXIT:\r
+\r
+  if (!EFI_ERROR (Status)) {\r
+    Status = Dhcp6DequeueRetry (\r
+               Instance,\r
+               Packet->Dhcp6.Header.TransactionId,\r
+               FALSE\r
+               );\r
+  }\r
+\r
+  return Status;\r
+}\r
 \r
 /**\r
   Select the appointed Dhcp6 advertisement message.\r
@@ -2151,12 +2304,12 @@ Dhcp6HandleReplyMsg (
 **/\r
 EFI_STATUS\r
 Dhcp6SelectAdvertiseMsg (\r
-  IN DHCP6_INSTANCE           *Instance,\r
-  IN EFI_DHCP6_PACKET         *AdSelect\r
+  IN DHCP6_INSTANCE    *Instance,\r
+  IN EFI_DHCP6_PACKET  *AdSelect\r
   )\r
 {\r
-  EFI_STATUS                  Status;\r
-  UINT8                       *Option;\r
+  EFI_STATUS  Status;\r
+  UINT8       *Option;\r
 \r
   ASSERT (AdSelect != NULL);\r
 \r
@@ -2181,7 +2334,7 @@ Dhcp6SelectAdvertiseMsg (
              FALSE\r
              );\r
 \r
-  if (EFI_ERROR(Status)) {\r
+  if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
 \r
@@ -2189,21 +2342,20 @@ Dhcp6SelectAdvertiseMsg (
   // Check whether there is server unicast option in the selected advertise\r
   // packet, and update it.\r
   //\r
-  Option = Dhcp6SeekOption(\r
+  Option = Dhcp6SeekOption (\r
              AdSelect->Dhcp6.Option,\r
              AdSelect->Length - 4,\r
              Dhcp6OptServerUnicast\r
              );\r
 \r
   if (Option != NULL) {\r
-\r
-    Instance->Unicast = AllocateZeroPool (sizeof(EFI_IPv6_ADDRESS));\r
+    Instance->Unicast = AllocateZeroPool (sizeof (EFI_IPv6_ADDRESS));\r
 \r
     if (Instance->Unicast == NULL) {\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
 \r
-    CopyMem (Instance->Unicast, Option + 4, sizeof(EFI_IPv6_ADDRESS));\r
+    CopyMem (Instance->Unicast, Option + 4, sizeof (EFI_IPv6_ADDRESS));\r
   }\r
 \r
   //\r
@@ -2221,7 +2373,6 @@ Dhcp6SelectAdvertiseMsg (
   return Dhcp6SendRequestMsg (Instance);\r
 }\r
 \r
-\r
 /**\r
   Handle with the Dhcp6 advertisement message.\r
 \r
@@ -2236,35 +2387,32 @@ Dhcp6SelectAdvertiseMsg (
 **/\r
 EFI_STATUS\r
 Dhcp6HandleAdvertiseMsg (\r
-  IN DHCP6_INSTANCE           *Instance,\r
-  IN EFI_DHCP6_PACKET         *Packet\r
+  IN DHCP6_INSTANCE    *Instance,\r
+  IN EFI_DHCP6_PACKET  *Packet\r
   )\r
 {\r
-  EFI_STATUS                  Status;\r
-  UINT8                       *Option;\r
-  UINT16                      StsCode;\r
-  BOOLEAN                     Timeout;\r
+  EFI_STATUS  Status;\r
+  UINT8       *Option;\r
+  BOOLEAN     Timeout;\r
 \r
-  ASSERT(Instance->Config);\r
-  ASSERT(Instance->IaCb.Ia);\r
+  ASSERT (Instance->Config);\r
+  ASSERT (Instance->IaCb.Ia);\r
 \r
   Timeout = FALSE;\r
-  StsCode = Dhcp6StsSuccess;\r
 \r
   //\r
   // If the client does receives a valid reply message that includes a rapid\r
-  // commit option since a solicit with rapid commit optioin sent before, select\r
+  // commit option since a solicit with rapid commit option sent before, select\r
   // this reply message. Or else, process the advertise messages as normal.\r
   // See details in the section-17.1.4 of rfc-3315.\r
   //\r
-  Option = Dhcp6SeekOption(\r
+  Option = Dhcp6SeekOption (\r
              Packet->Dhcp6.Option,\r
              Packet->Length - 4,\r
              Dhcp6OptRapidCommit\r
              );\r
 \r
-  if (Option != NULL && Instance->Config->RapidCommit && Packet->Dhcp6.Header.MessageType == Dhcp6MsgReply) {\r
-\r
+  if ((Option != NULL) && Instance->Config->RapidCommit && (Packet->Dhcp6.Header.MessageType == Dhcp6MsgReply)) {\r
     return Dhcp6HandleReplyMsg (Instance, Packet);\r
   }\r
 \r
@@ -2278,17 +2426,13 @@ Dhcp6HandleAdvertiseMsg (
   // display the associated status message to the user.\r
   // See the details in the section-17.1.3 of rfc-3315.\r
   //\r
-  Option = Dhcp6SeekOption(\r
-             Packet->Dhcp6.Option,\r
-             Packet->Length - 4,\r
-             Dhcp6OptStatusCode\r
+  Status = Dhcp6SeekStsOption (\r
+             Instance,\r
+             Packet,\r
+             &Option\r
              );\r
-\r
-  if (Option != NULL) {\r
-    StsCode = NTOHS (ReadUnaligned16 ((UINT16 *) (Option + 4)));\r
-    if (StsCode != Dhcp6StsSuccess) {\r
-      return EFI_DEVICE_ERROR;\r
-    }\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_DEVICE_ERROR;\r
   }\r
 \r
   //\r
@@ -2316,12 +2460,11 @@ Dhcp6HandleAdvertiseMsg (
     CopyMem (Instance->AdSelect, Packet, Packet->Size);\r
 \r
     Instance->AdPref = 0xff;\r
-\r
   } else if (Status == EFI_NOT_READY) {\r
     //\r
     // Not_ready means user wants to continue to receive more advertise packets.\r
     //\r
-    if (Instance->AdPref == 0xff && Instance->AdSelect == NULL) {\r
+    if ((Instance->AdPref == 0xff) && (Instance->AdSelect == NULL)) {\r
       //\r
       // It's a tricky point. The timer routine set adpref as 0xff if the first\r
       // rt timeout and no advertisement received, which means any advertisement\r
@@ -2334,13 +2477,13 @@ Dhcp6HandleAdvertiseMsg (
     // Check whether the current packet has a 255 preference option or not.\r
     // Take non-preference option as 0 value.\r
     //\r
-    Option = Dhcp6SeekOption(\r
+    Option = Dhcp6SeekOption (\r
                Packet->Dhcp6.Option,\r
                Packet->Length - 4,\r
                Dhcp6OptPreference\r
                );\r
 \r
-    if (Instance->AdSelect == NULL || (Option != NULL && *(Option + 4) > Instance->AdPref)) {\r
+    if ((Instance->AdSelect == NULL) || ((Option != NULL) && (*(Option + 4) > Instance->AdPref))) {\r
       //\r
       // No advertisements received before or preference is more than other\r
       // advertisements received before. Then store the new packet and the\r
@@ -2367,7 +2510,6 @@ Dhcp6HandleAdvertiseMsg (
       // preference is less than other advertisements received before.\r
       // Leave the packet alone.\r
     }\r
-\r
   } else {\r
     //\r
     // Other error status means termination.\r
@@ -2380,14 +2522,13 @@ Dhcp6HandleAdvertiseMsg (
   // RT has elapsed, or get a highest preference 255 advertise.\r
   // See details in the section-17.1.2 of rfc-3315.\r
   //\r
-  if (Instance->AdPref == 0xff || Timeout) {\r
+  if ((Instance->AdPref == 0xff) || Timeout) {\r
     Status = Dhcp6SelectAdvertiseMsg (Instance, Instance->AdSelect);\r
   }\r
 \r
   return Status;\r
 }\r
 \r
-\r
 /**\r
   The Dhcp6 stateful exchange process routine.\r
 \r
@@ -2397,20 +2538,20 @@ Dhcp6HandleAdvertiseMsg (
 **/\r
 VOID\r
 Dhcp6HandleStateful (\r
-  IN DHCP6_INSTANCE         *Instance,\r
-  IN EFI_DHCP6_PACKET       *Packet\r
+  IN DHCP6_INSTANCE    *Instance,\r
+  IN EFI_DHCP6_PACKET  *Packet\r
   )\r
 {\r
-  EFI_STATUS                Status;\r
-  EFI_DHCP6_DUID            *ClientId;\r
-  DHCP6_SERVICE             *Service;\r
-  UINT8                     *Option;\r
+  EFI_STATUS      Status;\r
+  EFI_DHCP6_DUID  *ClientId;\r
+  DHCP6_SERVICE   *Service;\r
+  UINT8           *Option;\r
 \r
   Service  = Instance->Service;\r
   ClientId = Service->ClientId;\r
   Status   = EFI_SUCCESS;\r
 \r
-  if (Instance->InDestory || Instance->Config == NULL) {\r
+  if (Instance->Config == NULL) {\r
     goto ON_CONTINUE;\r
   }\r
 \r
@@ -2421,27 +2562,27 @@ Dhcp6HandleStateful (
   //\r
   // Discard the packet if not advertisement or reply packet.\r
   //\r
-  if (Packet->Dhcp6.Header.MessageType != Dhcp6MsgAdvertise && Packet->Dhcp6.Header.MessageType != Dhcp6MsgReply) {\r
+  if ((Packet->Dhcp6.Header.MessageType != Dhcp6MsgAdvertise) && (Packet->Dhcp6.Header.MessageType != Dhcp6MsgReply)) {\r
     goto ON_CONTINUE;\r
   }\r
 \r
   //\r
   // Check whether include client Id or not.\r
   //\r
-  Option = Dhcp6SeekOption(\r
+  Option = Dhcp6SeekOption (\r
              Packet->Dhcp6.Option,\r
              Packet->Length - 4,\r
              Dhcp6OptClientId\r
              );\r
 \r
-  if (Option == NULL || CompareMem (Option + 4, ClientId->Duid, ClientId->Length) != 0) {\r
+  if ((Option == NULL) || (CompareMem (Option + 4, ClientId->Duid, ClientId->Length) != 0)) {\r
     goto ON_CONTINUE;\r
   }\r
 \r
   //\r
   // Check whether include server Id or not.\r
   //\r
-  Option = Dhcp6SeekOption(\r
+  Option = Dhcp6SeekOption (\r
              Packet->Dhcp6.Option,\r
              Packet->Length - 4,\r
              Dhcp6OptServerId\r
@@ -2452,35 +2593,36 @@ Dhcp6HandleStateful (
   }\r
 \r
   switch (Instance->IaCb.Ia->State) {\r
-  case Dhcp6Selecting:\r
-    //\r
-    // Handle the advertisement message when in the Dhcp6Selecting state.\r
-    // Do not need check return status, if failed, just continue to the next.\r
-    //\r
-    Dhcp6HandleAdvertiseMsg (Instance, Packet);\r
-    break;\r
-\r
-  case Dhcp6Requesting:\r
-  case Dhcp6Confirming:\r
-  case Dhcp6Renewing:\r
-  case Dhcp6Rebinding:\r
-  case Dhcp6Releasing:\r
-  case Dhcp6Declining:\r
-    //\r
-    // Handle the reply message when in the Dhcp6Requesting,  Dhcp6Renewing\r
-    // Dhcp6Rebinding, Dhcp6Releasing and Dhcp6Declining state.\r
-    // If failed here, it should reset the current session.\r
-    //\r
-    Status = Dhcp6HandleReplyMsg (Instance, Packet);\r
-    if (EFI_ERROR (Status)) {\r
-      goto ON_EXIT;\r
-    }\r
-    break;\r
-  default:\r
-    //\r
-    // Other state has not supported yet.\r
-    //\r
-    break;\r
+    case Dhcp6Selecting:\r
+      //\r
+      // Handle the advertisement message when in the Dhcp6Selecting state.\r
+      // Do not need check return status, if failed, just continue to the next.\r
+      //\r
+      Dhcp6HandleAdvertiseMsg (Instance, Packet);\r
+      break;\r
+\r
+    case Dhcp6Requesting:\r
+    case Dhcp6Confirming:\r
+    case Dhcp6Renewing:\r
+    case Dhcp6Rebinding:\r
+    case Dhcp6Releasing:\r
+    case Dhcp6Declining:\r
+      //\r
+      // Handle the reply message when in the Dhcp6Requesting,  Dhcp6Renewing\r
+      // Dhcp6Rebinding, Dhcp6Releasing and Dhcp6Declining state.\r
+      // If failed here, it should reset the current session.\r
+      //\r
+      Status = Dhcp6HandleReplyMsg (Instance, Packet);\r
+      if (EFI_ERROR (Status)) {\r
+        goto ON_EXIT;\r
+      }\r
+\r
+      break;\r
+    default:\r
+      //\r
+      // Other state has not supported yet.\r
+      //\r
+      break;\r
   }\r
 \r
 ON_CONTINUE:\r
@@ -2499,7 +2641,6 @@ ON_EXIT:
   }\r
 }\r
 \r
-\r
 /**\r
   The Dhcp6 stateless exchange process routine.\r
 \r
@@ -2509,25 +2650,21 @@ ON_EXIT:
 **/\r
 VOID\r
 Dhcp6HandleStateless (\r
-  IN DHCP6_INSTANCE         *Instance,\r
-  IN EFI_DHCP6_PACKET       *Packet\r
+  IN DHCP6_INSTANCE    *Instance,\r
+  IN EFI_DHCP6_PACKET  *Packet\r
   )\r
 {\r
-  EFI_STATUS                Status;\r
-  DHCP6_SERVICE             *Service;\r
-  DHCP6_INF_CB              *InfCb;\r
-  UINT8                     *Option;\r
-  BOOLEAN                   IsMatched;\r
+  EFI_STATUS     Status;\r
+  DHCP6_SERVICE  *Service;\r
+  DHCP6_INF_CB   *InfCb;\r
+  UINT8          *Option;\r
+  BOOLEAN        IsMatched;\r
 \r
   Service   = Instance->Service;\r
   Status    = EFI_SUCCESS;\r
   IsMatched = FALSE;\r
   InfCb     = NULL;\r
 \r
-  if (Instance->InDestory) {\r
-    goto ON_EXIT;\r
-  }\r
-\r
   if (Packet->Dhcp6.Header.MessageType != Dhcp6MsgReply) {\r
     goto ON_EXIT;\r
   }\r
@@ -2606,7 +2743,6 @@ ON_EXIT:
   }\r
 }\r
 \r
-\r
 /**\r
   The receive callback function for Dhcp6 exchange process.\r
 \r
@@ -2619,43 +2755,48 @@ ON_EXIT:
 VOID\r
 EFIAPI\r
 Dhcp6ReceivePacket (\r
-  IN NET_BUF                *Udp6Wrap,\r
-  IN UDP_END_POINT          *EndPoint,\r
-  IN EFI_STATUS             IoStatus,\r
-  IN VOID                   *Context\r
+  IN NET_BUF        *Udp6Wrap,\r
+  IN UDP_END_POINT  *EndPoint,\r
+  IN EFI_STATUS     IoStatus,\r
+  IN VOID           *Context\r
   )\r
 {\r
-  EFI_DHCP6_HEADER          *Head;\r
-  EFI_DHCP6_PACKET          *Packet;\r
-  DHCP6_SERVICE             *Service;\r
-  DHCP6_INSTANCE            *Instance;\r
-  DHCP6_TX_CB               *TxCb;\r
-  UINT32                    Size;\r
-  BOOLEAN                   IsDispatched;\r
-  BOOLEAN                   IsStateless;\r
-  LIST_ENTRY                *Entry1;\r
-  LIST_ENTRY                *Next1;\r
-  LIST_ENTRY                *Entry2;\r
-  LIST_ENTRY                *Next2;\r
+  EFI_DHCP6_HEADER  *Head;\r
+  EFI_DHCP6_PACKET  *Packet;\r
+  DHCP6_SERVICE     *Service;\r
+  DHCP6_INSTANCE    *Instance;\r
+  DHCP6_TX_CB       *TxCb;\r
+  UINT32            Size;\r
+  BOOLEAN           IsDispatched;\r
+  BOOLEAN           IsStateless;\r
+  LIST_ENTRY        *Entry1;\r
+  LIST_ENTRY        *Next1;\r
+  LIST_ENTRY        *Entry2;\r
+  LIST_ENTRY        *Next2;\r
+  EFI_STATUS        Status;\r
 \r
   ASSERT (Udp6Wrap != NULL);\r
   ASSERT (Context != NULL);\r
 \r
-  Service      = (DHCP6_SERVICE *) Context;\r
+  Service      = (DHCP6_SERVICE *)Context;\r
   Instance     = NULL;\r
   Packet       = NULL;\r
   IsDispatched = FALSE;\r
   IsStateless  = FALSE;\r
 \r
   if (EFI_ERROR (IoStatus)) {\r
-    return ;\r
+    return;\r
+  }\r
+\r
+  if (Udp6Wrap->TotalSize < sizeof (EFI_DHCP6_HEADER)) {\r
+    goto ON_CONTINUE;\r
   }\r
 \r
   //\r
   // Copy the net buffer received from upd6 to a Dhcp6 packet.\r
   //\r
   Size   = sizeof (EFI_DHCP6_PACKET) + Udp6Wrap->TotalSize;\r
-  Packet = (EFI_DHCP6_PACKET *) AllocateZeroPool (Size);\r
+  Packet = (EFI_DHCP6_PACKET *)AllocateZeroPool (Size);\r
 \r
   if (Packet == NULL) {\r
     goto ON_CONTINUE;\r
@@ -2663,7 +2804,7 @@ Dhcp6ReceivePacket (
 \r
   Packet->Size   = Size;\r
   Head           = &Packet->Dhcp6.Header;\r
-  Packet->Length = NetbufCopy (Udp6Wrap, 0, Udp6Wrap->TotalSize, (UINT8 *) Head);\r
+  Packet->Length = NetbufCopy (Udp6Wrap, 0, Udp6Wrap->TotalSize, (UINT8 *)Head);\r
 \r
   if (Packet->Length == 0) {\r
     goto ON_CONTINUE;\r
@@ -2673,11 +2814,9 @@ Dhcp6ReceivePacket (
   // Dispatch packet to right instance by transaction id.\r
   //\r
   NET_LIST_FOR_EACH_SAFE (Entry1, Next1, &Service->Child) {\r
-\r
     Instance = NET_LIST_USER_STRUCT (Entry1, DHCP6_INSTANCE, Link);\r
 \r
     NET_LIST_FOR_EACH_SAFE (Entry2, Next2, &Instance->TxList) {\r
-\r
       TxCb = NET_LIST_USER_STRUCT (Entry2, DHCP6_TX_CB, Link);\r
 \r
       if (Packet->Dhcp6.Header.TransactionId == TxCb->Xid) {\r
@@ -2688,7 +2827,8 @@ Dhcp6ReceivePacket (
         if (TxCb->TxPacket->Dhcp6.Header.MessageType == Dhcp6MsgInfoRequest) {\r
           IsStateless = TRUE;\r
         }\r
-        IsDispatched  = TRUE;\r
+\r
+        IsDispatched = TRUE;\r
         break;\r
       }\r
     }\r
@@ -2716,6 +2856,21 @@ Dhcp6ReceivePacket (
 \r
 ON_CONTINUE:\r
 \r
+  if (!IsDispatched) {\r
+    Status = UdpIoRecvDatagram (\r
+               Service->UdpIo,\r
+               Dhcp6ReceivePacket,\r
+               Service,\r
+               0\r
+               );\r
+    if (EFI_ERROR (Status)) {\r
+      NET_LIST_FOR_EACH_SAFE (Entry1, Next1, &Service->Child) {\r
+        Instance = NET_LIST_USER_STRUCT (Entry1, DHCP6_INSTANCE, Link);\r
+        Dhcp6CleanupRetry (Instance, DHCP6_PACKET_ALL);\r
+      }\r
+    }\r
+  }\r
+\r
   NetbufFree (Udp6Wrap);\r
 \r
   if (Packet != NULL) {\r
@@ -2739,7 +2894,7 @@ ON_CONTINUE:
 **/\r
 BOOLEAN\r
 Dhcp6LinkMovDetect (\r
-  IN  DHCP6_INSTANCE            *Instance\r
+  IN  DHCP6_INSTANCE  *Instance\r
   )\r
 {\r
   UINT32                       InterruptStatus;\r
@@ -2748,7 +2903,7 @@ Dhcp6LinkMovDetect (
   EFI_SIMPLE_NETWORK_PROTOCOL  *Snp;\r
 \r
   ASSERT (Instance != NULL);\r
-  Snp = Instance->Service->Snp;\r
+  Snp          = Instance->Service->Snp;\r
   MediaPresent = Instance->MediaPresent;\r
 \r
   //\r
@@ -2773,10 +2928,10 @@ Dhcp6LinkMovDetect (
   if (!MediaPresent && Instance->MediaPresent) {\r
     return TRUE;\r
   }\r
+\r
   return FALSE;\r
 }\r
 \r
-\r
 /**\r
   The timer routine of the Dhcp6 instance for each second.\r
 \r
@@ -2787,28 +2942,27 @@ Dhcp6LinkMovDetect (
 VOID\r
 EFIAPI\r
 Dhcp6OnTimerTick (\r
-  IN EFI_EVENT              Event,\r
-  IN VOID                   *Context\r
+  IN EFI_EVENT  Event,\r
+  IN VOID       *Context\r
   )\r
 {\r
-  LIST_ENTRY                *Entry;\r
-  LIST_ENTRY                *NextEntry;\r
-  DHCP6_INSTANCE            *Instance;\r
-  DHCP6_TX_CB               *TxCb;\r
-  DHCP6_IA_CB               *IaCb;\r
-  UINT32                    LossTime;\r
-  EFI_STATUS                Status;\r
+  LIST_ENTRY      *Entry;\r
+  LIST_ENTRY      *NextEntry;\r
+  DHCP6_INSTANCE  *Instance;\r
+  DHCP6_TX_CB     *TxCb;\r
+  DHCP6_IA_CB     *IaCb;\r
+  UINT32          LossTime;\r
+  EFI_STATUS      Status;\r
 \r
   ASSERT (Context != NULL);\r
 \r
-  Instance = (DHCP6_INSTANCE *) Context;\r
+  Instance = (DHCP6_INSTANCE *)Context;\r
 \r
   //\r
   // 1. Loop the tx list, count live time of every tx packet to check whether\r
   //    need re-transmit or not.\r
   //\r
   NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &Instance->TxList) {\r
-\r
     TxCb = NET_LIST_USER_STRUCT (Entry, DHCP6_TX_CB, Link);\r
 \r
     TxCb->TickTime++;\r
@@ -2817,7 +2971,7 @@ Dhcp6OnTimerTick (
       //\r
       // Handle the first rt in the transmission of solicit specially.\r
       //\r
-      if ((TxCb->RetryCnt == 0 || TxCb->SolicitRetry) && TxCb->TxPacket->Dhcp6.Header.MessageType == Dhcp6MsgSolicit) {\r
+      if (((TxCb->RetryCnt == 0) || TxCb->SolicitRetry) && (TxCb->TxPacket->Dhcp6.Header.MessageType == Dhcp6MsgSolicit)) {\r
         if (Instance->AdSelect == NULL) {\r
           //\r
           // Set adpref as 0xff here to indicate select any advertisement\r
@@ -2829,12 +2983,16 @@ Dhcp6OnTimerTick (
           // Select the advertisement received before.\r
           //\r
           Status = Dhcp6SelectAdvertiseMsg (Instance, Instance->AdSelect);\r
-          if (EFI_ERROR (Status)) {\r
+          if (Status == EFI_ABORTED) {\r
+            goto ON_CLOSE;\r
+          } else if (EFI_ERROR (Status)) {\r
             TxCb->RetryCnt++;\r
           }\r
+\r
           return;\r
         }\r
       }\r
+\r
       //\r
       // Increase the retry count for the packet and add up the total loss time.\r
       //\r
@@ -2844,14 +3002,16 @@ Dhcp6OnTimerTick (
       //\r
       // Check whether overflow the max retry count limit for this packet\r
       //\r
-      if (TxCb->RetryCtl.Mrc != 0 && TxCb->RetryCtl.Mrc < TxCb->RetryCnt) {\r
+      if ((TxCb->RetryCtl.Mrc != 0) && (TxCb->RetryCtl.Mrc < TxCb->RetryCnt)) {\r
+        Status = EFI_NO_RESPONSE;\r
         goto ON_CLOSE;\r
       }\r
 \r
       //\r
       // Check whether overflow the max retry duration for this packet\r
       //\r
-      if (TxCb->RetryCtl.Mrd != 0 && TxCb->RetryCtl.Mrd <= TxCb->RetryLos) {\r
+      if ((TxCb->RetryCtl.Mrd != 0) && (TxCb->RetryCtl.Mrd <= TxCb->RetryLos)) {\r
+        Status = EFI_NO_RESPONSE;\r
         goto ON_CLOSE;\r
       }\r
 \r
@@ -2867,7 +3027,7 @@ Dhcp6OnTimerTick (
                          TRUE\r
                          );\r
 \r
-      if (TxCb->RetryCtl.Mrt != 0 && TxCb->RetryCtl.Mrt < TxCb->RetryExp) {\r
+      if ((TxCb->RetryCtl.Mrt != 0) && (TxCb->RetryCtl.Mrt < TxCb->RetryExp)) {\r
         TxCb->RetryExp = Dhcp6CalculateExpireTime (\r
                            TxCb->RetryCtl.Mrt,\r
                            TRUE,\r
@@ -2880,7 +3040,7 @@ Dhcp6OnTimerTick (
       // duration time.\r
       //\r
       LossTime = TxCb->RetryLos + TxCb->RetryExp;\r
-      if (TxCb->RetryCtl.Mrd != 0 && TxCb->RetryCtl.Mrd < LossTime) {\r
+      if ((TxCb->RetryCtl.Mrd != 0) && (TxCb->RetryCtl.Mrd < LossTime)) {\r
         TxCb->RetryExp = TxCb->RetryCtl.Mrd - TxCb->RetryLos;\r
       }\r
 \r
@@ -2906,22 +3066,19 @@ Dhcp6OnTimerTick (
   //\r
   IaCb = &Instance->IaCb;\r
 \r
-  if (Instance->Config == NULL || IaCb->Ia == NULL) {\r
+  if ((Instance->Config == NULL) || (IaCb->Ia == NULL)) {\r
     return;\r
   }\r
 \r
-  if (IaCb->Ia->State == Dhcp6Bound || IaCb->Ia->State == Dhcp6Renewing || IaCb->Ia->State == Dhcp6Rebinding) {\r
-\r
+  if ((IaCb->Ia->State == Dhcp6Bound) || (IaCb->Ia->State == Dhcp6Renewing) || (IaCb->Ia->State == Dhcp6Rebinding)) {\r
     IaCb->LeaseTime++;\r
 \r
-    if (IaCb->LeaseTime > IaCb->T2 && IaCb->Ia->State == Dhcp6Bound) {\r
+    if ((IaCb->LeaseTime > IaCb->T2) && (IaCb->Ia->State == Dhcp6Bound)) {\r
       //\r
       // Exceed t2, send rebind packet to extend the Ia lease.\r
       //\r
       Dhcp6SendRenewRebindMsg (Instance, TRUE);\r
-\r
-    } else if (IaCb->LeaseTime > IaCb->T1 && IaCb->Ia->State == Dhcp6Bound) {\r
-\r
+    } else if ((IaCb->LeaseTime > IaCb->T1) && (IaCb->Ia->State == Dhcp6Bound)) {\r
       //\r
       // Exceed t1, send renew packet to extend the Ia lease.\r
       //\r
@@ -2939,26 +3096,32 @@ Dhcp6OnTimerTick (
 \r
   return;\r
 \r
- ON_CLOSE:\r
+ON_CLOSE:\r
 \r
-  if (TxCb->TxPacket->Dhcp6.Header.MessageType == Dhcp6MsgInfoRequest ||\r
-      TxCb->TxPacket->Dhcp6.Header.MessageType == Dhcp6MsgRenew       ||\r
-      TxCb->TxPacket->Dhcp6.Header.MessageType == Dhcp6MsgConfirm\r
-      ) {\r
+  if (Dhcp6IsValidTxCb (Instance, TxCb) &&\r
+      (TxCb->TxPacket != NULL) &&\r
+      ((TxCb->TxPacket->Dhcp6.Header.MessageType == Dhcp6MsgInfoRequest) ||\r
+       (TxCb->TxPacket->Dhcp6.Header.MessageType == Dhcp6MsgRenew) ||\r
+       (TxCb->TxPacket->Dhcp6.Header.MessageType == Dhcp6MsgConfirm))\r
+      )\r
+  {\r
     //\r
     // The failure of renew/Confirm will still switch to the bound state.\r
     //\r
     if ((TxCb->TxPacket->Dhcp6.Header.MessageType == Dhcp6MsgRenew) ||\r
-        (TxCb->TxPacket->Dhcp6.Header.MessageType == Dhcp6MsgConfirm)) {\r
+        (TxCb->TxPacket->Dhcp6.Header.MessageType == Dhcp6MsgConfirm))\r
+    {\r
       ASSERT (Instance->IaCb.Ia);\r
       Instance->IaCb.Ia->State = Dhcp6Bound;\r
     }\r
+\r
     //\r
     // The failure of info-request will return no response.\r
     //\r
     if (TxCb->TxPacket->Dhcp6.Header.MessageType == Dhcp6MsgInfoRequest) {\r
       Instance->UdpSts = EFI_NO_RESPONSE;\r
     }\r
+\r
     Dhcp6DequeueRetry (\r
       Instance,\r
       TxCb->Xid,\r
@@ -2968,6 +3131,6 @@ Dhcp6OnTimerTick (
     //\r
     // The failure of the others will terminate current state machine if timeout.\r
     //\r
-    Dhcp6CleanupSession (Instance, EFI_NO_RESPONSE);\r
+    Dhcp6CleanupSession (Instance, Status);\r
   }\r
 }\r