]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/UefiPxeBcDxe/PxeBcSupport.c
ArmPkg/BdsLib: eliminate calls to deprecated string functions
[mirror_edk2.git] / NetworkPkg / UefiPxeBcDxe / PxeBcSupport.c
index 30418c3b6a1c2d83483c738c511fbc361d6799fe..00c652dae5be445747f1b93be9da89b8ee2ce74f 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Support functions implementation for UefiPxeBc Driver.\r
 \r
-  Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2007 - 2016, 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
@@ -28,7 +28,7 @@
 \r
 **/\r
 EFI_STATUS\r
-PxeBcFlushStaionIp (\r
+PxeBcFlushStationIp (\r
   PXEBC_PRIVATE_DATA       *Private,\r
   EFI_IP_ADDRESS           *StationIp,\r
   EFI_IP_ADDRESS           *SubnetMask     OPTIONAL\r
@@ -59,10 +59,6 @@ PxeBcFlushStaionIp (
     }\r
 \r
     Status = Private->Ip6->Receive (Private->Ip6, &Private->Icmp6Token);\r
-    if (EFI_ERROR (Status)) {\r
-      goto ON_EXIT;\r
-    }\r
-\r
   } else {\r
     ASSERT (SubnetMask != NULL);\r
     CopyMem (&Private->Udp4CfgData.StationAddress, StationIp, sizeof (EFI_IPv4_ADDRESS));\r
@@ -82,10 +78,6 @@ PxeBcFlushStaionIp (
     }\r
 \r
     Status = Private->Ip4->Receive (Private->Ip4, &Private->IcmpToken);\r
-    if (EFI_ERROR (Status)) {\r
-      goto ON_EXIT;\r
-    }\r
-\r
   }\r
 \r
 ON_EXIT:\r
@@ -266,7 +258,9 @@ PxeBcIcmpErrorDpcHandle (
   }\r
 \r
   if (EFI_IP4 (RxData->Header->SourceAddress) != 0 &&\r
-      !NetIp4IsUnicast (EFI_NTOHL (RxData->Header->SourceAddress), 0)) {\r
+      (NTOHL (Mode->SubnetMask.Addr[0]) != 0) &&\r
+      IP4_NET_EQUAL (NTOHL(Mode->StationIp.Addr[0]), EFI_NTOHL (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0])) &&\r
+      !NetIp4IsUnicast (EFI_NTOHL (RxData->Header->SourceAddress), NTOHL (Mode->SubnetMask.Addr[0]))) {\r
     //\r
     // The source address of the received packet should be a valid unicast address.\r
     //\r
@@ -497,6 +491,8 @@ PxeBcIcmp6ErrorUpdate (
   @param[in, out]  SrcPort              The pointer to the source port.\r
   @param[in]       DoNotFragment        If TRUE, fragment is not enabled.\r
                                         Otherwise, fragment is enabled.\r
+  @param[in]       Ttl                  The time to live field of the IP header. \r
+  @param[in]       ToS                  The type of service field of the IP header.\r
 \r
   @retval          EFI_SUCCESS          Successfully configured this instance.\r
   @retval          Others               Failed to configure this instance.\r
@@ -509,7 +505,9 @@ PxeBcConfigUdp4Write (
   IN     EFI_IPv4_ADDRESS   *SubnetMask,\r
   IN     EFI_IPv4_ADDRESS   *Gateway,\r
   IN OUT UINT16             *SrcPort,\r
-  IN     BOOLEAN            DoNotFragment\r
+  IN     BOOLEAN            DoNotFragment,\r
+  IN     UINT8              Ttl,\r
+  IN     UINT8              ToS\r
   )\r
 {\r
   EFI_UDP4_CONFIG_DATA  Udp4CfgData;\r
@@ -519,8 +517,8 @@ PxeBcConfigUdp4Write (
 \r
   Udp4CfgData.TransmitTimeout    = PXEBC_DEFAULT_LIFETIME;\r
   Udp4CfgData.ReceiveTimeout     = PXEBC_DEFAULT_LIFETIME;\r
-  Udp4CfgData.TypeOfService      = DEFAULT_ToS;\r
-  Udp4CfgData.TimeToLive         = DEFAULT_TTL;\r
+  Udp4CfgData.TypeOfService      = ToS;\r
+  Udp4CfgData.TimeToLive         = Ttl;\r
   Udp4CfgData.AllowDuplicatePort = TRUE;\r
   Udp4CfgData.DoNotFragment      = DoNotFragment;\r
 \r
@@ -1400,6 +1398,7 @@ PxeBcUintnToAscDecWithFormat (
 \r
   @param[in]  Number         Numeric value to be converted.\r
   @param[in]  Buffer         The pointer to the buffer for ASCII string.\r
+  @param[in]  BufferSize     The maxsize of the buffer.\r
 \r
   @return     Length         The actual length of the ASCII string.\r
 \r
@@ -1407,7 +1406,8 @@ PxeBcUintnToAscDecWithFormat (
 UINTN\r
 PxeBcUintnToAscDec (\r
   IN UINTN               Number,\r
-  IN UINT8               *Buffer\r
+  IN UINT8               *Buffer,\r
+  IN UINTN               BufferSize\r
   )\r
 {\r
   UINTN           Index;\r
@@ -1423,7 +1423,7 @@ PxeBcUintnToAscDec (
     Number         = (UINTN) (Number / 10);\r
   } while (Number != 0);\r
 \r
-  AsciiStrCpy ((CHAR8 *) Buffer, &TempStr[Index]);\r
+  AsciiStrCpyS ((CHAR8 *) Buffer, BufferSize, &TempStr[Index]);\r
 \r
   Length = AsciiStrLen ((CHAR8 *) Buffer);\r
 \r
@@ -1464,3 +1464,56 @@ PxeBcUniHexToUint8 (
 \r
   return EFI_INVALID_PARAMETER;\r
 }\r
+\r
+/**\r
+  Calculate the elapsed time.\r
+\r
+  @param[in]      Private      The pointer to PXE private data\r
+\r
+**/\r
+VOID\r
+CalcElapsedTime (\r
+  IN     PXEBC_PRIVATE_DATA     *Private\r
+  )\r
+{\r
+  EFI_TIME          Time;\r
+  UINT64            CurrentStamp;\r
+  UINT64            ElapsedTimeValue;\r
+\r
+  //\r
+  // Generate a time stamp of the centiseconds from 1900/1/1, assume 30day/month.\r
+  //\r
+  ZeroMem (&Time, sizeof (EFI_TIME));\r
+  gRT->GetTime (&Time, NULL);\r
+  CurrentStamp = (UINT64)\r
+    (\r
+      ((((((Time.Year - 1900) * 360 +\r
+       (Time.Month - 1)) * 30 +\r
+       (Time.Day - 1)) * 24 + Time.Hour) * 60 +\r
+       Time.Minute) * 60 + Time.Second) * 100\r
+       + DivU64x32(Time.Nanosecond, 10000000)\r
+    );\r
+\r
+  //\r
+  // Sentinel value of 0 means that this is the first DHCP packet that we are\r
+  // sending and that we need to initialize the value.  First DHCP Solicit\r
+  // gets 0 elapsed-time.  Otherwise, calculate based on StartTime.\r
+  //\r
+  if (Private->ElapsedTime == 0) {\r
+    Private->ElapsedTime = CurrentStamp;\r
+  } else {\r
+    ElapsedTimeValue = CurrentStamp - Private->ElapsedTime;\r
+\r
+    //\r
+    // If elapsed time cannot fit in two bytes, set it to 0xffff.\r
+    //\r
+    if (ElapsedTimeValue > 0xffff) {\r
+      ElapsedTimeValue = 0xffff;\r
+    }\r
+    //\r
+    // Save the elapsed time\r
+    //\r
+    Private->ElapsedTime = ElapsedTimeValue;\r
+  }\r
+}\r
+\r