]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/UefiPxeBcDxe/PxeBcSupport.c
NetworkPkg:Replace unsafe string functions.
[mirror_edk2.git] / NetworkPkg / UefiPxeBcDxe / PxeBcSupport.c
index 7ad070c5e3f6f17c354ac81ea837ff2561a5e94b..36b0665a96b888a9753ffa493d3c1b5d6d34a12e 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Support functions implementation for UefiPxeBc Driver.\r
 \r
-  Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2007 - 2015, 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
 #include "PxeBcImpl.h"\r
 \r
 \r
-\r
-/**\r
-  This function returns SMBIOS string given the string number.\r
-\r
-  @param[in]  Smbios              The pointer to the SMBIOS structure\r
-  @param[in]  StringNumber        String number to return. 0 is used to skip all\r
-                                  strings and point to the next SMBIOS structure.\r
-\r
-  @return String                  The pointer to the next SMBIOS structure if\r
-                                  StringNumber == 0.\r
-\r
-**/\r
-CHAR8 *\r
-PxeBcGetSmbiosString (\r
-  IN  SMBIOS_STRUCTURE_POINTER  *Smbios,\r
-  IN  UINT16                    StringNumber\r
-  )\r
-{\r
-  UINT16                        Index;\r
-  CHAR8                         *String;\r
-\r
-  //\r
-  // Skip over formatted section.\r
-  //\r
-  String = (CHAR8 *) (Smbios->Raw + Smbios->Hdr->Length);\r
-\r
-  //\r
-  // Look through unformated section.\r
-  //\r
-  for (Index = 1; Index <= StringNumber || StringNumber == 0; Index++) {\r
-    if (StringNumber == Index) {\r
-      return String;\r
-    }\r
-\r
-    //\r
-    // Skip zero string.\r
-    //\r
-    while (*String != 0) {\r
-      String++;\r
-    }\r
-    String++;\r
-\r
-    if (*String == 0) {\r
-      //\r
-      // If double NULL then we are done.\r
-      //  Return pointer to next structure in Smbios.\r
-      //  if you pass in a 0 you will always get here\r
-      //\r
-      Smbios->Raw = (UINT8 *)++String;\r
-      return NULL;\r
-    }\r
-  }\r
-\r
-  return NULL;\r
-}\r
-\r
-\r
-/**\r
-  This function obtains the system guid and the serial number from the smbios table.\r
-\r
-  @param[out]  SystemGuid     The pointer of the returned system guid.\r
-\r
-  @retval EFI_SUCCESS         Successfully obtained the system guid.\r
-  @retval EFI_NOT_FOUND       Did not find the SMBIOS table.\r
-\r
-**/\r
-EFI_STATUS\r
-PxeBcGetSystemGuid (\r
-  OUT EFI_GUID              *SystemGuid\r
-  )\r
-{\r
-  EFI_STATUS                Status;\r
-  SMBIOS_TABLE_ENTRY_POINT  *SmbiosTable;\r
-  SMBIOS_STRUCTURE_POINTER  Smbios;\r
-  SMBIOS_STRUCTURE_POINTER  SmbiosEnd;\r
-  UINT16                    Index;\r
-\r
-  SmbiosTable = NULL;\r
-  Status      = EfiGetSystemConfigurationTable (&gEfiSmbiosTableGuid, (VOID **) &SmbiosTable);\r
-\r
-  if (EFI_ERROR (Status) || SmbiosTable == NULL) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  Smbios.Hdr    = (SMBIOS_STRUCTURE *) (UINTN) SmbiosTable->TableAddress;\r
-  SmbiosEnd.Raw = (UINT8 *) (UINTN) (SmbiosTable->TableAddress + SmbiosTable->TableLength);\r
-\r
-  for (Index = 0; Index < SmbiosTable->TableLength; Index++) {\r
-    if (Smbios.Hdr->Type == 1) {\r
-      if (Smbios.Hdr->Length < 0x19) {\r
-        //\r
-        // Older version did not support Guid and Serial number\r
-        //\r
-        continue;\r
-      }\r
-      //\r
-      // SMBIOS tables are byte packed so we need to do a byte copy to\r
-      // prevend alignment faults on Itanium-based platform.\r
-      //\r
-      CopyMem (SystemGuid, &Smbios.Type1->Uuid, sizeof (EFI_GUID));\r
-      PxeBcGetSmbiosString (&Smbios, Smbios.Type1->SerialNumber);\r
-\r
-      return EFI_SUCCESS;\r
-    }\r
-    //\r
-    // Make Smbios point to the next record\r
-    //\r
-    PxeBcGetSmbiosString (&Smbios, 0);\r
-\r
-    if (Smbios.Raw >= SmbiosEnd.Raw) {\r
-      //\r
-      // SMBIOS 2.1 incorrectly stated the length of SmbiosTable as 0x1e.\r
-      // given this we must double check against the length of the structure.\r
-      //\r
-      return EFI_SUCCESS;\r
-    }\r
-  }\r
-\r
-  return EFI_NOT_FOUND;\r
-}\r
-\r
-\r
 /**\r
   Flush the previous configration using the new station Ip address.\r
 \r
@@ -150,7 +28,7 @@ PxeBcGetSystemGuid (
 \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
@@ -181,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
@@ -204,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
@@ -1081,7 +951,7 @@ PxeBcCheckByDestIp (
 /**\r
   Check the received packet using the destination port.\r
 \r
-  @param[in]       PxeBcMode      The pointer to the mode data of PxeBc.\r
+  @param[in]       Mode           The pointer to the mode data of PxeBc.\r
   @param[in]       Session        The pointer to the current UDPv4 session.\r
   @param[in, out]  DestPort       The pointer to the destination port.\r
   @param[in]       OpFlags        Operation flag for UdpRead/UdpWrite.\r
@@ -1522,6 +1392,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
@@ -1529,7 +1400,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
@@ -1545,7 +1417,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
@@ -1586,3 +1458,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