]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Io.c
Use Mde library and definition instead of some native definitions in NetLib, to simpl...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Dhcp4Dxe / Dhcp4Io.c
index 17c61007f1c902d39408a1cd9ac49892ac756329..19b897ae0d20b4b9448b50948d6f18017978cd20 100644 (file)
@@ -52,8 +52,6 @@ DhcpInitRequest (
       DhcpSb->DhcpState = Dhcp4Init;\r
       return Status;\r
     }\r
-\r
-    DhcpSb->WaitOffer = DHCP_WAIT_OFFER;\r
   } else {\r
     DhcpSetState (DhcpSb, Dhcp4Rebooting, FALSE);\r
     Status = DhcpSendMessage (DhcpSb, NULL, NULL, DHCP_MSG_REQUEST, NULL);\r
@@ -225,7 +223,7 @@ DhcpSetState (
   // This will clear the retry count. This is also why the rule\r
   // first transit the state, then send packets.\r
   //\r
-  if (State == Dhcp4Init) {\r
+  if (State == Dhcp4Selecting) {\r
     DhcpSb->MaxRetries = DhcpSb->ActiveConfig.DiscoverTryCount;\r
   } else {\r
     DhcpSb->MaxRetries = DhcpSb->ActiveConfig.RequestTryCount;\r
@@ -262,7 +260,7 @@ DhcpSetTransmitTimer (
 \r
   ASSERT (DhcpSb->MaxRetries > DhcpSb->CurRetry);\r
 \r
-  if (DhcpSb->DhcpState == Dhcp4Init) {\r
+  if (DhcpSb->DhcpState == Dhcp4Selecting) {\r
     Times = DhcpSb->ActiveConfig.DiscoverTimeout;\r
   } else {\r
     Times = DhcpSb->ActiveConfig.RequestTimeout;\r
@@ -273,8 +271,11 @@ DhcpSetTransmitTimer (
   }\r
 \r
   DhcpSb->PacketToLive = Times[DhcpSb->CurRetry];\r
-}\r
 \r
+  if (DhcpSb->DhcpState == Dhcp4Selecting) {\r
+    DhcpSb->WaitOffer = DhcpSb->PacketToLive;\r
+  }\r
+}\r
 \r
 /**\r
   Compute the lease. If the server grants a permanent lease, just\r
@@ -357,12 +358,12 @@ DhcpConfigLeaseIoPort (
   UdpConfigData.RemotePort          = DHCP_SERVER_PORT;\r
 \r
   Ip = HTONL (DhcpSb->ClientAddr);\r
-  NetCopyMem (&UdpConfigData.StationAddress, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
+  CopyMem (&UdpConfigData.StationAddress, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
 \r
   Ip = HTONL (DhcpSb->Netmask);\r
-  NetCopyMem (&UdpConfigData.SubnetMask, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
+  CopyMem (&UdpConfigData.SubnetMask, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
 \r
-  NetZeroMem (&UdpConfigData.RemoteAddress, sizeof (EFI_IPv4_ADDRESS));\r
+  ZeroMem (&UdpConfigData.RemoteAddress, sizeof (EFI_IPv4_ADDRESS));\r
 \r
   Status = UdpIo->Udp->Configure (UdpIo->Udp, &UdpConfigData);\r
 \r
@@ -374,10 +375,10 @@ DhcpConfigLeaseIoPort (
   // Add a default route if received from the server.\r
   //\r
   if ((DhcpSb->Para != NULL) && (DhcpSb->Para->Router != 0)) {\r
-    NetZeroMem (&Subnet, sizeof (EFI_IPv4_ADDRESS));\r
+    ZeroMem (&Subnet, sizeof (EFI_IPv4_ADDRESS));\r
 \r
     Ip = HTONL (DhcpSb->Para->Router);\r
-    NetCopyMem (&Gateway, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
+    CopyMem (&Gateway, &Ip, sizeof (EFI_IPv4_ADDRESS));\r
 \r
     UdpIo->Udp->Routes (UdpIo->Udp, FALSE, &Subnet, &Subnet, &Gateway);\r
   }\r
@@ -464,17 +465,17 @@ DhcpCleanLease (
   DhcpSb->ServerAddr  = 0;\r
 \r
   if (DhcpSb->LastOffer != NULL) {\r
-    NetFreePool (DhcpSb->LastOffer);\r
+    gBS->FreePool (DhcpSb->LastOffer);\r
     DhcpSb->LastOffer = NULL;\r
   }\r
 \r
   if (DhcpSb->Selected != NULL) {\r
-    NetFreePool (DhcpSb->Selected);\r
+    gBS->FreePool (DhcpSb->Selected);\r
     DhcpSb->Selected = NULL;\r
   }\r
 \r
   if (DhcpSb->Para != NULL) {\r
-    NetFreePool (DhcpSb->Para);\r
+    gBS->FreePool (DhcpSb->Para);\r
     DhcpSb->Para = NULL;\r
   }\r
 \r
@@ -519,6 +520,7 @@ DhcpChooseOffer (
 {\r
   EFI_DHCP4_PACKET          *Selected;\r
   EFI_DHCP4_PACKET          *NewPacket;\r
+  EFI_DHCP4_PACKET          *TempPacket;\r
   EFI_STATUS                Status;\r
 \r
   ASSERT (DhcpSb->LastOffer != NULL);\r
@@ -542,12 +544,12 @@ DhcpChooseOffer (
 \r
   Selected = DhcpSb->LastOffer;\r
 \r
-  if (NewPacket != NULL) {\r
-    if (EFI_ERROR (DhcpValidateOptions (NewPacket, NULL))) {\r
-      NetFreePool (NewPacket);\r
-    } else {\r
-      NetFreePool (Selected);\r
-      Selected = NewPacket;\r
+  if ((NewPacket != NULL) && !EFI_ERROR (DhcpValidateOptions (NewPacket, NULL))) {\r
+    TempPacket = (EFI_DHCP4_PACKET *) AllocatePool (NewPacket->Size);\r
+    if (TempPacket != NULL) {\r
+      CopyMem (TempPacket, NewPacket, NewPacket->Size);\r
+      gBS->FreePool (Selected);\r
+      Selected = TempPacket;\r
     }\r
   }\r
 \r
@@ -637,7 +639,6 @@ DhcpHandleSelect (
   IN DHCP_PARAMETER         *Para\r
   )\r
 {\r
-  EFI_DHCP4_HEADER          *Head;\r
   EFI_STATUS                Status;\r
 \r
   Status = EFI_SUCCESS;\r
@@ -648,12 +649,6 @@ DhcpHandleSelect (
   // 2. if it is a DHCP message, it must contains a server ID.\r
   // Don't return a error for these two case otherwise the session is ended.\r
   //\r
-  Head = &Packet->Dhcp4.Header;\r
-\r
-  if (!Ip4IsUnicast (EFI_NTOHL (Head->YourAddr), (Para == NULL ? 0 : Para->NetMask))) {\r
-    goto ON_EXIT;\r
-  }\r
-\r
   if (!DHCP_IS_BOOTP (Para) &&\r
      ((Para->DhcpType != DHCP_MSG_OFFER) || (Para->ServerId == 0))) {\r
     goto ON_EXIT;\r
@@ -669,7 +664,7 @@ DhcpHandleSelect (
 \r
   if (Status == EFI_SUCCESS) {\r
     if (DhcpSb->LastOffer != NULL) {\r
-      NetFreePool (DhcpSb->LastOffer);\r
+      gBS->FreePool (DhcpSb->LastOffer);\r
     }\r
 \r
     DhcpSb->LastOffer = Packet;\r
@@ -678,7 +673,7 @@ DhcpHandleSelect (
 \r
   } else if (Status == EFI_NOT_READY) {\r
     if (DhcpSb->LastOffer != NULL) {\r
-      NetFreePool (DhcpSb->LastOffer);\r
+      gBS->FreePool (DhcpSb->LastOffer);\r
     }\r
 \r
     DhcpSb->LastOffer = Packet;\r
@@ -694,7 +689,7 @@ DhcpHandleSelect (
   return EFI_SUCCESS;\r
 \r
 ON_EXIT:\r
-  NetFreePool (Packet);\r
+  gBS->FreePool (Packet);\r
   return Status;\r
 }\r
 \r
@@ -780,14 +775,14 @@ DhcpHandleRequest (
   DhcpSb->IoStatus = EFI_SUCCESS;\r
   DhcpNotifyUser (DhcpSb, DHCP_NOTIFY_COMPLETION);\r
 \r
-  NetFreePool (Packet);\r
+  gBS->FreePool (Packet);\r
   return EFI_SUCCESS;\r
 \r
 REJECT:\r
   DhcpSendMessage (DhcpSb, DhcpSb->Selected, DhcpSb->Para, DHCP_MSG_DECLINE, Message);\r
 \r
 ON_EXIT:\r
-  NetFreePool (Packet);\r
+  gBS->FreePool (Packet);\r
   return Status;\r
 }\r
 \r
@@ -871,7 +866,7 @@ DhcpHandleRenewRebind (
   }\r
 \r
 ON_EXIT:\r
-  NetFreePool (Packet);\r
+  gBS->FreePool (Packet);\r
   return Status;\r
 }\r
 \r
@@ -940,7 +935,7 @@ DhcpHandleReboot (
   //\r
   // OK, get the parameter from server, record the lease\r
   //\r
-  DhcpSb->Para = NetAllocatePool (sizeof (DHCP_PARAMETER));\r
+  DhcpSb->Para = AllocatePool (sizeof (DHCP_PARAMETER));\r
 \r
   if (DhcpSb->Para == NULL) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
@@ -961,7 +956,7 @@ DhcpHandleReboot (
   return EFI_SUCCESS;\r
 \r
 ON_EXIT:\r
-  NetFreePool (Packet);\r
+  gBS->FreePool (Packet);\r
   return Status;\r
 }\r
 \r
@@ -1023,7 +1018,7 @@ DhcpInput (
   // Copy the DHCP message to a continuous memory block\r
   //\r
   Len     = sizeof (EFI_DHCP4_PACKET) + UdpPacket->TotalSize - sizeof (EFI_DHCP4_HEADER);\r
-  Packet  = (EFI_DHCP4_PACKET *) NetAllocatePool (Len);\r
+  Packet  = (EFI_DHCP4_PACKET *) AllocatePool (Len);\r
 \r
   if (Packet == NULL) {\r
     goto RESTART;\r
@@ -1083,7 +1078,7 @@ DhcpInput (
     //\r
     // Ignore the packet in INITREBOOT, INIT and BOUND states\r
     //\r
-    NetFreePool (Packet);\r
+    gBS->FreePool (Packet);\r
     Status = EFI_SUCCESS;\r
     break;\r
 \r
@@ -1098,7 +1093,7 @@ DhcpInput (
   }\r
 \r
   if (Para != NULL) {\r
-    NetFreePool (Para);\r
+    gBS->FreePool (Para);\r
   }\r
 \r
   Packet = NULL;\r
@@ -1113,7 +1108,7 @@ RESTART:
   NetbufFree (UdpPacket);\r
 \r
   if (Packet != NULL) {\r
-    NetFreePool (Packet);\r
+    gBS->FreePool (Packet);\r
   }\r
 \r
   Status = UdpIoRecvDatagram (DhcpSb->UdpIo, DhcpInput, DhcpSb, 0);\r
@@ -1137,7 +1132,7 @@ DhcpReleasePacket (
   IN VOID                   *Arg\r
   )\r
 {\r
-  NetFreePool (Arg);\r
+  gBS->FreePool (Arg);\r
 }\r
 \r
 \r
@@ -1217,7 +1212,7 @@ DhcpSendMessage (
     Len += (UINT32)AsciiStrLen ((CHAR8 *) Msg);\r
   }\r
 \r
-  Packet = NetAllocatePool (Len);\r
+  Packet = AllocatePool (Len);\r
 \r
   if (Packet == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
@@ -1237,7 +1232,7 @@ DhcpSendMessage (
   }\r
 \r
   Head = &Packet->Dhcp4.Header;\r
-  NetZeroMem (Head, sizeof (EFI_DHCP4_HEADER));\r
+  ZeroMem (Head, sizeof (EFI_DHCP4_HEADER));\r
 \r
   Head->OpCode       = BOOTP_REQUEST;\r
   Head->HwType       = DhcpSb->HwType;\r
@@ -1246,7 +1241,7 @@ DhcpSendMessage (
   Head->Reserved     = HTONS (0x8000);  //Server, broadcast the message please.\r
 \r
   EFI_IP4 (Head->ClientAddr) = HTONL (DhcpSb->ClientAddr);\r
-  NetCopyMem (Head->ClientHwAddr, DhcpSb->Mac.Addr, DhcpSb->HwLen);\r
+  CopyMem (Head->ClientHwAddr, DhcpSb->Mac.Addr, DhcpSb->HwLen);\r
 \r
   //\r
   // Append the DHCP message type\r
@@ -1310,7 +1305,7 @@ DhcpSendMessage (
   // Append the user's message if it isn't NULL\r
   //\r
   if (Msg != NULL) {\r
-    Len     = NET_MIN ((UINT32) AsciiStrLen ((CHAR8 *) Msg), 255);\r
+    Len     = MIN ((UINT32) AsciiStrLen ((CHAR8 *) Msg), 255);\r
     Buf     = DhcpAppendOption (Buf, DHCP_TAG_MESSAGE, (UINT16) Len, Msg);\r
   }\r
 \r
@@ -1357,12 +1352,12 @@ DhcpSendMessage (
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
-    NetFreePool (Packet);\r
+    gBS->FreePool (Packet);\r
     return Status;\r
   }\r
 \r
   if (NewPacket != NULL) {\r
-    NetFreePool (Packet);\r
+    gBS->FreePool (Packet);\r
     Packet = NewPacket;\r
   }\r
 \r
@@ -1374,7 +1369,7 @@ DhcpSendMessage (
   Wrap      = NetbufFromExt (&Frag, 1, 0, 0, DhcpReleasePacket, Packet);\r
 \r
   if (Wrap == NULL) {\r
-    NetFreePool (Packet);\r
+    gBS->FreePool (Packet);\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
@@ -1495,12 +1490,32 @@ DhcpOnTimerTick (
   )\r
 {\r
   DHCP_SERVICE              *DhcpSb;\r
+  DHCP_PROTOCOL             *Instance;\r
   EFI_STATUS                Status;\r
+  \r
+  DhcpSb   = (DHCP_SERVICE *) Context;\r
+  Instance = DhcpSb->ActiveChild;\r
 \r
-  DhcpSb = (DHCP_SERVICE *) Context;\r
+  //\r
+  // Check the time to wait offer\r
+  //\r
+  if ((DhcpSb->WaitOffer > 0) && (--DhcpSb->WaitOffer == 0)) {\r
+    //\r
+    // OK, offer collection finished, select a offer\r
+    //\r
+    ASSERT (DhcpSb->DhcpState == Dhcp4Selecting);\r
+\r
+    if (DhcpSb->LastOffer == NULL) {\r
+      goto END_SESSION;\r
+    }\r
 \r
+    if (EFI_ERROR (DhcpChooseOffer (DhcpSb))) {\r
+      goto END_SESSION;\r
+    }\r
+  }\r
+  \r
   //\r
-  // Check the retransmit timer first\r
+  // Check the retransmit timer\r
   //\r
   if ((DhcpSb->PacketToLive > 0) && (--DhcpSb->PacketToLive == 0)) {\r
 \r
@@ -1543,22 +1558,7 @@ DhcpOnTimerTick (
       }\r
     }\r
   }\r
-\r
-  if ((DhcpSb->WaitOffer > 0) && (--DhcpSb->WaitOffer == 0)) {\r
-    //\r
-    // OK, offer collection finished, select a offer\r
-    //\r
-    ASSERT (DhcpSb->DhcpState == Dhcp4Selecting);\r
-\r
-    if (DhcpSb->LastOffer == NULL) {\r
-      goto END_SESSION;\r
-    }\r
-\r
-    if (EFI_ERROR (DhcpChooseOffer (DhcpSb))) {\r
-      goto END_SESSION;\r
-    }\r
-  }\r
-\r
+  \r
   //\r
   // If an address has been acquired, check whether need to\r
   // refresh or whether it has expired.\r
@@ -1622,6 +1622,16 @@ DhcpOnTimerTick (
     }\r
   }\r
 \r
+  //\r
+  //\r
+  //\r
+  if ((Instance != NULL) && (Instance->Token != NULL)) {\r
+    Instance->Timeout--;\r
+    if (Instance->Timeout == 0) {\r
+      PxeDhcpDone (Instance);\r
+    }\r
+  }\r
+\r
   return ;\r
 \r
 END_SESSION:\r