]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.c
BaseTools:Change the path of the file that Binary Cache
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Dhcp4Dxe / Dhcp4Io.c
index 7c1fa4746a7fac43a18b5b09cd51318daf454cbc..4728b94c5803110d05bb2209032ef28643183841 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   EFI DHCP protocol implementation.\r
-  \r
-Copyright (c) 2006 - 2009, Intel Corporation.<BR>\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
-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
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -37,6 +31,11 @@ DhcpInitRequest (
 \r
   ASSERT ((DhcpSb->DhcpState == Dhcp4Init) || (DhcpSb->DhcpState == Dhcp4InitReboot));\r
 \r
+  //\r
+  // Clear initial time to make sure that elapsed-time is set to 0 for first Discover or REQUEST message.\r
+  //\r
+  DhcpSb->ActiveChild->ElaspedTime= 0;\r
+\r
   if (DhcpSb->DhcpState == Dhcp4Init) {\r
     DhcpSetState (DhcpSb, Dhcp4Selecting, FALSE);\r
     Status = DhcpSendMessage (DhcpSb, NULL, NULL, DHCP_MSG_DISCOVER, NULL);\r
@@ -272,7 +271,7 @@ DhcpSetTransmitTimer (
 \r
   @param  DhcpSb                The DHCP service instance\r
   @param  Para                  The DHCP parameter extracted from the server's\r
-                                response.                             \r
+                                response.\r
 **/\r
 VOID\r
 DhcpComputeLease (\r
@@ -313,6 +312,7 @@ DhcpComputeLease (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 DhcpConfigLeaseIoPort (\r
   IN UDP_IO                 *UdpIo,\r
   IN VOID                   *Context\r
@@ -387,8 +387,6 @@ DhcpLeaseAcquired (
   IN OUT DHCP_SERVICE           *DhcpSb\r
   )\r
 {\r
-  INTN                      Class;\r
-\r
   DhcpSb->ClientAddr = EFI_NTOHL (DhcpSb->Selected->Dhcp4.Header.YourAddr);\r
 \r
   if (DhcpSb->Para != NULL) {\r
@@ -397,8 +395,7 @@ DhcpLeaseAcquired (
   }\r
 \r
   if (DhcpSb->Netmask == 0) {\r
-    Class           = NetGetIpClass (DhcpSb->ClientAddr);\r
-    DhcpSb->Netmask = gIp4AllMasks[Class << 3];\r
+    return EFI_ABORTED;\r
   }\r
 \r
   if (DhcpSb->LeaseIoPort != NULL) {\r
@@ -482,6 +479,11 @@ DhcpCleanLease (
   DhcpSb->CurRetry      = 0;\r
   DhcpSb->MaxRetries    = 0;\r
   DhcpSb->LeaseLife     = 0;\r
+\r
+  //\r
+  // Clean active config data.\r
+  //\r
+  DhcpCleanConfigure (&DhcpSb->ActiveConfig);\r
 }\r
 \r
 \r
@@ -525,7 +527,7 @@ DhcpChooseOffer (
     TempPacket = (EFI_DHCP4_PACKET *) AllocatePool (NewPacket->Size);\r
     if (TempPacket != NULL) {\r
       CopyMem (TempPacket, NewPacket, NewPacket->Size);\r
-      gBS->FreePool (Selected);\r
+      FreePool (Selected);\r
       Selected = TempPacket;\r
     }\r
   }\r
@@ -663,7 +665,7 @@ DhcpHandleSelect (
   return EFI_SUCCESS;\r
 \r
 ON_EXIT:\r
-  gBS->FreePool (Packet);\r
+  FreePool (Packet);\r
   return Status;\r
 }\r
 \r
@@ -749,14 +751,14 @@ DhcpHandleRequest (
   DhcpSb->IoStatus = EFI_SUCCESS;\r
   DhcpNotifyUser (DhcpSb, DHCP_NOTIFY_COMPLETION);\r
 \r
-  gBS->FreePool (Packet);\r
+  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
-  gBS->FreePool (Packet);\r
+  FreePool (Packet);\r
   return Status;\r
 }\r
 \r
@@ -840,7 +842,7 @@ DhcpHandleRenewRebind (
   }\r
 \r
 ON_EXIT:\r
-  gBS->FreePool (Packet);\r
+  FreePool (Packet);\r
   return Status;\r
 }\r
 \r
@@ -926,7 +928,7 @@ DhcpHandleReboot (
   return EFI_SUCCESS;\r
 \r
 ON_EXIT:\r
-  gBS->FreePool (Packet);\r
+  FreePool (Packet);\r
   return Status;\r
 }\r
 \r
@@ -942,6 +944,7 @@ ON_EXIT:
 \r
 **/\r
 VOID\r
+EFIAPI\r
 DhcpInput (\r
   NET_BUF                   *UdpPacket,\r
   UDP_END_POINT             *EndPoint,\r
@@ -960,11 +963,11 @@ DhcpInput (
   DhcpSb  = (DHCP_SERVICE *) Context;\r
 \r
   //\r
-  // Don't restart receive if error occurs or DHCP is destoried.\r
+  // Don't restart receive if error occurs or DHCP is destroyed.\r
   //\r
   if (EFI_ERROR (IoStatus)) {\r
     return ;\r
-  } else if (DhcpSb->ServiceState == DHCP_DESTORY) {\r
+  } else if (DhcpSb->ServiceState == DHCP_DESTROY) {\r
     NetbufFree (UdpPacket);\r
     return ;\r
   }\r
@@ -1046,7 +1049,7 @@ DhcpInput (
     //\r
     // Ignore the packet in INITREBOOT, INIT and BOUND states\r
     //\r
-    gBS->FreePool (Packet);\r
+    FreePool (Packet);\r
     Status = EFI_SUCCESS;\r
     break;\r
 \r
@@ -1077,7 +1080,7 @@ RESTART:
   NetbufFree (UdpPacket);\r
 \r
   if (Packet != NULL) {\r
-    gBS->FreePool (Packet);\r
+    FreePool (Packet);\r
   }\r
 \r
   Status = UdpIoRecvDatagram (DhcpSb->UdpIo, DhcpInput, DhcpSb, 0);\r
@@ -1087,22 +1090,6 @@ RESTART:
   }\r
 }\r
 \r
-\r
-/**\r
-  Release the packet.\r
-\r
-  @param[in]  Arg                   The packet to release\r
-\r
-**/\r
-VOID\r
-DhcpReleasePacket (\r
-  IN VOID                   *Arg\r
-  )\r
-{\r
-  gBS->FreePool (Arg);\r
-}\r
-\r
-\r
 /**\r
   Release the net buffer when packet is sent.\r
 \r
@@ -1113,6 +1100,7 @@ DhcpReleasePacket (
 \r
 **/\r
 VOID\r
+EFIAPI\r
 DhcpOnPacketSent (\r
   NET_BUF                   *Packet,\r
   UDP_END_POINT             *EndPoint,\r
@@ -1209,12 +1197,23 @@ DhcpSendMessage (
   EFI_IP4 (Head->ClientAddr) = HTONL (DhcpSb->ClientAddr);\r
   CopyMem (Head->ClientHwAddr, DhcpSb->Mac.Addr, DhcpSb->HwLen);\r
 \r
+  if ((Type == DHCP_MSG_DECLINE) || (Type == DHCP_MSG_RELEASE)) {\r
+    Head->Seconds = 0;\r
+  } else if ((Type == DHCP_MSG_REQUEST) && (DhcpSb->DhcpState == Dhcp4Requesting)) {\r
+    //\r
+    // Use the same value as the original DHCPDISCOVER message.\r
+    //\r
+    Head->Seconds = DhcpSb->LastPacket->Dhcp4.Header.Seconds;\r
+  } else {\r
+    SetElapsedTime(&Head->Seconds, DhcpSb->ActiveChild);\r
+  }\r
+\r
   //\r
   // Append the DHCP message type\r
   //\r
   Packet->Dhcp4.Magik = DHCP_OPTION_MAGIC;\r
   Buf                 = Packet->Dhcp4.Option;\r
-  Buf                 = DhcpAppendOption (Buf, DHCP_TAG_TYPE, 1, &Type);\r
+  Buf                 = DhcpAppendOption (Buf, DHCP4_TAG_MSG_TYPE, 1, &Type);\r
 \r
   //\r
   // Append the serverid option if necessary:\r
@@ -1229,7 +1228,7 @@ DhcpSendMessage (
     ASSERT ((Para != NULL) && (Para->ServerId != 0));\r
 \r
     IpAddr  = HTONL (Para->ServerId);\r
-    Buf     = DhcpAppendOption (Buf, DHCP_TAG_SERVER_ID, 4, (UINT8 *) &IpAddr);\r
+    Buf     = DhcpAppendOption (Buf, DHCP4_TAG_SERVER_ID, 4, (UINT8 *) &IpAddr);\r
   }\r
 \r
   //\r
@@ -1255,7 +1254,7 @@ DhcpSendMessage (
   }\r
 \r
   if (IpAddr != 0) {\r
-    Buf = DhcpAppendOption (Buf, DHCP_TAG_REQUEST_IP, 4, (UINT8 *) &IpAddr);\r
+    Buf = DhcpAppendOption (Buf, DHCP4_TAG_REQUEST_IP, 4, (UINT8 *) &IpAddr);\r
   }\r
 \r
   //\r
@@ -1265,7 +1264,7 @@ DhcpSendMessage (
   //\r
   if ((Type != DHCP_MSG_DECLINE) && (Type != DHCP_MSG_RELEASE)) {\r
     MaxMsg  = HTONS (0xFF00);\r
-    Buf     = DhcpAppendOption (Buf, DHCP_TAG_MAXMSG, 2, (UINT8 *) &MaxMsg);\r
+    Buf     = DhcpAppendOption (Buf, DHCP4_TAG_MAXMSG, 2, (UINT8 *) &MaxMsg);\r
   }\r
 \r
   //\r
@@ -1273,7 +1272,7 @@ DhcpSendMessage (
   //\r
   if (Msg != NULL) {\r
     Len     = MIN ((UINT32) AsciiStrLen ((CHAR8 *) Msg), 255);\r
-    Buf     = DhcpAppendOption (Buf, DHCP_TAG_MESSAGE, (UINT16) Len, Msg);\r
+    Buf     = DhcpAppendOption (Buf, DHCP4_TAG_MESSAGE, (UINT16) Len, Msg);\r
   }\r
 \r
   //\r
@@ -1286,7 +1285,7 @@ DhcpSendMessage (
       // if it is a DHCP decline or DHCP release .\r
       //\r
       if (((Type == DHCP_MSG_DECLINE) || (Type == DHCP_MSG_RELEASE)) &&\r
-          (Config->OptionList[Index]->OpCode != DHCP_TAG_CLIENT_ID)) {\r
+          (Config->OptionList[Index]->OpCode != DHCP4_TAG_CLIENT_ID)) {\r
         continue;\r
       }\r
 \r
@@ -1299,7 +1298,7 @@ DhcpSendMessage (
     }\r
   }\r
 \r
-  *(Buf++) = DHCP_TAG_EOP;\r
+  *(Buf++) = DHCP4_TAG_EOP;\r
   Packet->Length += (UINT32) (Buf - Packet->Dhcp4.Option);\r
 \r
   //\r
@@ -1319,12 +1318,12 @@ DhcpSendMessage (
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
-    gBS->FreePool (Packet);\r
+    FreePool (Packet);\r
     return Status;\r
   }\r
 \r
   if (NewPacket != NULL) {\r
-    gBS->FreePool (Packet);\r
+    FreePool (Packet);\r
     Packet = NewPacket;\r
   }\r
 \r
@@ -1337,16 +1336,15 @@ DhcpSendMessage (
     Packet->Dhcp4.Header.HwAddrLen\r
     );\r
 \r
-\r
   //\r
   // Wrap it into a netbuf then send it.\r
   //\r
   Frag.Bulk = (UINT8 *) &Packet->Dhcp4.Header;\r
   Frag.Len  = Packet->Length;\r
-  Wrap      = NetbufFromExt (&Frag, 1, 0, 0, DhcpReleasePacket, Packet);\r
+  Wrap      = NetbufFromExt (&Frag, 1, 0, 0, DhcpDummyExtFree, NULL);\r
 \r
   if (Wrap == NULL) {\r
-    gBS->FreePool (Packet);\r
+    FreePool (Packet);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
@@ -1377,19 +1375,18 @@ DhcpSendMessage (
   }\r
 \r
   ASSERT (UdpIo != NULL);\r
-  NET_GET_REF (Wrap);\r
-  \r
+\r
   Status = UdpIoSendDatagram (\r
-             UdpIo, \r
-             Wrap, \r
-             &EndPoint, \r
-             NULL, \r
-             DhcpOnPacketSent, \r
+             UdpIo,\r
+             Wrap,\r
+             &EndPoint,\r
+             NULL,\r
+             DhcpOnPacketSent,\r
              DhcpSb\r
              );\r
 \r
   if (EFI_ERROR (Status)) {\r
-    NET_PUT_REF (Wrap);\r
+    NetbufFree (Wrap);\r
     return EFI_ACCESS_DENIED;\r
   }\r
 \r
@@ -1420,19 +1417,24 @@ DhcpRetransmit (
 \r
   ASSERT (DhcpSb->LastPacket != NULL);\r
 \r
-  DhcpSb->LastPacket->Dhcp4.Header.Seconds = HTONS (*(UINT16 *)(&DhcpSb->LastTimeout));\r
+  //\r
+  // For REQUEST message in Dhcp4Requesting state, do not change the secs fields.\r
+  //\r
+  if (DhcpSb->DhcpState != Dhcp4Requesting) {\r
+    SetElapsedTime(&DhcpSb->LastPacket->Dhcp4.Header.Seconds, DhcpSb->ActiveChild);\r
+  }\r
 \r
   //\r
   // Wrap it into a netbuf then send it.\r
   //\r
   Frag.Bulk = (UINT8 *) &DhcpSb->LastPacket->Dhcp4.Header;\r
   Frag.Len  = DhcpSb->LastPacket->Length;\r
-  Wrap      = NetbufFromExt (&Frag, 1, 0, 0, DhcpReleasePacket, DhcpSb->LastPacket);\r
+  Wrap      = NetbufFromExt (&Frag, 1, 0, 0, DhcpDummyExtFree, NULL);\r
 \r
   if (Wrap == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
-  \r
+\r
   //\r
   // Broadcast the message, unless we know the server address.\r
   //\r
@@ -1450,7 +1452,6 @@ DhcpRetransmit (
 \r
   ASSERT (UdpIo != NULL);\r
 \r
-  NET_GET_REF (Wrap);\r
   Status = UdpIoSendDatagram (\r
              UdpIo,\r
              Wrap,\r
@@ -1461,7 +1462,7 @@ DhcpRetransmit (
              );\r
 \r
   if (EFI_ERROR (Status)) {\r
-    NET_PUT_REF (Wrap);\r
+    NetbufFree (Wrap);\r
     return EFI_ACCESS_DENIED;\r
   }\r
 \r
@@ -1487,13 +1488,22 @@ DhcpOnTimerTick (
   IN VOID                   *Context\r
   )\r
 {\r
+  LIST_ENTRY                *Entry;\r
+  LIST_ENTRY                *Next;\r
   DHCP_SERVICE              *DhcpSb;\r
   DHCP_PROTOCOL             *Instance;\r
   EFI_STATUS                Status;\r
 \r
   DhcpSb   = (DHCP_SERVICE *) Context;\r
   Instance = DhcpSb->ActiveChild;\r
-  \r
+\r
+  //\r
+  // 0xffff is the maximum supported value for elapsed time according to RFC.\r
+  //\r
+  if (Instance != NULL && Instance->ElaspedTime < 0xffff) {\r
+    Instance->ElaspedTime++;\r
+  }\r
+\r
   //\r
   // Check the retransmit timer\r
   //\r
@@ -1507,13 +1517,15 @@ DhcpOnTimerTick (
       Status = DhcpChooseOffer (DhcpSb);\r
 \r
       if (EFI_ERROR(Status)) {\r
-        FreePool (DhcpSb->LastOffer);\r
-        DhcpSb->LastOffer = NULL;\r
+        if (DhcpSb->LastOffer != NULL) {\r
+          FreePool (DhcpSb->LastOffer);\r
+          DhcpSb->LastOffer = NULL;\r
+        }\r
       } else {\r
         goto ON_EXIT;\r
       }\r
     }\r
-    \r
+\r
     if (++DhcpSb->CurRetry < DhcpSb->MaxRetries) {\r
       //\r
       // Still has another try\r
@@ -1552,7 +1564,7 @@ DhcpOnTimerTick (
       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
@@ -1582,6 +1594,10 @@ DhcpOnTimerTick (
         goto END_SESSION;\r
       }\r
 \r
+      if (Instance != NULL) {\r
+        Instance->ElaspedTime= 0;\r
+      }\r
+\r
       Status = DhcpSendMessage (\r
                  DhcpSb,\r
                  DhcpSb->Selected,\r
@@ -1602,6 +1618,10 @@ DhcpOnTimerTick (
         goto END_SESSION;\r
       }\r
 \r
+      if (Instance != NULL) {\r
+        Instance->ElaspedTime= 0;\r
+      }\r
+\r
       Status = DhcpSendMessage (\r
                  DhcpSb,\r
                  DhcpSb->Selected,\r
@@ -1617,9 +1637,13 @@ DhcpOnTimerTick (
   }\r
 \r
 ON_EXIT:\r
-  if ((Instance != NULL) && (Instance->Token != NULL)) {\r
+  //\r
+  // Iterate through all the DhcpSb Children.\r
+  //\r
+  NET_LIST_FOR_EACH_SAFE (Entry, Next, &DhcpSb->Children) {\r
+    Instance = NET_LIST_USER_STRUCT (Entry, DHCP_PROTOCOL, Link);\r
     Instance->Timeout--;\r
-    if (Instance->Timeout == 0) {\r
+    if (Instance->Timeout == 0 && Instance->Token != NULL) {\r
       PxeDhcpDone (Instance);\r
     }\r
   }\r