]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/DxeNetLib/DxeNetLib.c
Fix name conflict between User Credential protocol and User Credential2 protocol.
[mirror_edk2.git] / MdeModulePkg / Library / DxeNetLib / DxeNetLib.c
index 034031d09f68ecfc0a0ac5bdca23de3de2daead0..dbd77e5bda145d4afe3eda93fb52f5468f1fd147 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
   Network library.\r
 \r
-Copyright (c) 2005 - 2010, Intel Corporation.<BR>\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved.<BR>\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
@@ -13,6 +13,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include <Uefi.h>\r
 \r
+#include <IndustryStandard/SmBios.h>\r
+\r
 #include <Protocol/DriverBinding.h>\r
 #include <Protocol/ServiceBinding.h>\r
 #include <Protocol/SimpleNetwork.h>\r
@@ -20,8 +22,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Protocol/HiiConfigRouting.h>\r
 #include <Protocol/ComponentName.h>\r
 #include <Protocol/ComponentName2.h>\r
+#include <Protocol/HiiConfigAccess.h>\r
 \r
 #include <Guid/NicIp4ConfigNvData.h>\r
+#include <Guid/SmBios.h>\r
 \r
 #include <Library/NetLib.h>\r
 #include <Library/BaseLib.h>\r
@@ -33,6 +37,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/DevicePathLib.h>\r
 #include <Library/HiiLib.h>\r
 #include <Library/PrintLib.h>\r
+#include <Library/UefiLib.h>\r
 \r
 #define NIC_ITEM_CONFIG_SIZE   sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * MAX_IP4_CONFIG_IN_VARIABLE\r
 \r
@@ -443,6 +448,7 @@ SyslogBuildPacket (
 \r
 **/\r
 CHAR8 *\r
+EFIAPI\r
 NetDebugASPrint (\r
   IN CHAR8                  *Format,\r
   ...\r
@@ -482,6 +488,7 @@ NetDebugASPrint (
                                 than the mNetDebugLevelMax. Or, it has been sent out.\r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 NetDebugOutput (\r
   IN UINT32                    Level,\r
   IN UINT8                     *Module,\r
@@ -676,6 +683,7 @@ NetIp4IsUnicast (
 \r
 **/\r
 BOOLEAN\r
+EFIAPI\r
 NetIp6IsValidUnicast (\r
   IN EFI_IPv6_ADDRESS       *Ip6\r
   )\r
@@ -712,6 +720,7 @@ NetIp6IsValidUnicast (
 \r
 **/\r
 BOOLEAN\r
+EFIAPI\r
 NetIp6IsUnspecifiedAddr (\r
   IN EFI_IPv6_ADDRESS       *Ip6\r
   )\r
@@ -737,6 +746,7 @@ NetIp6IsUnspecifiedAddr (
 \r
 **/\r
 BOOLEAN\r
+EFIAPI\r
 NetIp6IsLinkLocalAddr (\r
   IN EFI_IPv6_ADDRESS *Ip6\r
   )\r
@@ -774,6 +784,7 @@ NetIp6IsLinkLocalAddr (
 \r
 **/\r
 BOOLEAN\r
+EFIAPI\r
 NetIp6IsNetEqual (\r
   EFI_IPv6_ADDRESS *Ip1,\r
   EFI_IPv6_ADDRESS *Ip2,\r
@@ -823,6 +834,7 @@ NetIp6IsNetEqual (
 \r
 **/\r
 EFI_IPv6_ADDRESS *\r
+EFIAPI\r
 Ip6Swap128 (\r
   EFI_IPv6_ADDRESS *Ip6\r
   )\r
@@ -1563,6 +1575,86 @@ NetMapIterate (
 }\r
 \r
 \r
+/**\r
+  Internal function to get the child handle of the NIC handle.\r
+\r
+  @param[in]   Controller    NIC controller handle.\r
+  @param[out]  ChildHandle   Returned child handle.\r
+\r
+  @retval EFI_SUCCESS        Successfully to get child handle.\r
+  @retval Others             Failed to get child handle.\r
+\r
+**/\r
+EFI_STATUS\r
+NetGetChildHandle (\r
+  IN EFI_HANDLE         Controller,\r
+  OUT EFI_HANDLE        *ChildHandle\r
+  )\r
+{\r
+  EFI_STATUS                 Status;\r
+  EFI_HANDLE                 *Handles;\r
+  UINTN                      HandleCount;\r
+  UINTN                      Index;\r
+  EFI_DEVICE_PATH_PROTOCOL   *ChildDeviceDevicePath;\r
+  VENDOR_DEVICE_PATH         *VendorDeviceNode;\r
+\r
+  //\r
+  // Locate all EFI Hii Config Access protocols\r
+  //\r
+  Status = gBS->LocateHandleBuffer (\r
+                 ByProtocol,\r
+                 &gEfiHiiConfigAccessProtocolGuid,\r
+                 NULL,\r
+                 &HandleCount,\r
+                 &Handles\r
+                 );\r
+  if (EFI_ERROR (Status) || (HandleCount == 0)) {\r
+    return Status;\r
+  }\r
+\r
+  Status = EFI_NOT_FOUND;\r
+\r
+  for (Index = 0; Index < HandleCount; Index++) {\r
+\r
+    Status = EfiTestChildHandle (Controller, Handles[Index], &gEfiManagedNetworkServiceBindingProtocolGuid);\r
+    if (!EFI_ERROR (Status)) {\r
+      //\r
+      // Get device path on the child handle\r
+      //\r
+      Status = gBS->HandleProtocol (\r
+                     Handles[Index],\r
+                     &gEfiDevicePathProtocolGuid,\r
+                     (VOID **) &ChildDeviceDevicePath\r
+                     );\r
+\r
+      if (!EFI_ERROR (Status)) {\r
+        while (!IsDevicePathEnd (ChildDeviceDevicePath)) {\r
+          ChildDeviceDevicePath = NextDevicePathNode (ChildDeviceDevicePath);\r
+          //\r
+          // Parse one instance\r
+          //\r
+          if (ChildDeviceDevicePath->Type == HARDWARE_DEVICE_PATH &&\r
+              ChildDeviceDevicePath->SubType == HW_VENDOR_DP) {\r
+            VendorDeviceNode = (VENDOR_DEVICE_PATH *) ChildDeviceDevicePath;\r
+            if (CompareMem (&VendorDeviceNode->Guid, &gEfiNicIp4ConfigVariableGuid, sizeof (EFI_GUID)) == 0) {\r
+              //\r
+              // Found item matched gEfiNicIp4ConfigVariableGuid\r
+              //\r
+              *ChildHandle = Handles[Index];\r
+              FreePool (Handles);\r
+              return EFI_SUCCESS;\r
+            }\r
+          }\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  FreePool (Handles);\r
+  return Status;\r
+}\r
+\r
+\r
 /**\r
   This is the default unload handle for all the network drivers.\r
 \r
@@ -2384,6 +2476,7 @@ NetLibDefaultAddressIsStatic (
   EFI_STRING                       AccessProgress;\r
   EFI_STRING                       AccessResults;\r
   EFI_STRING                       String;\r
+  EFI_HANDLE                       ChildHandle;\r
 \r
   ConfigInfo       = NULL;\r
   ConfigHdr        = NULL;\r
@@ -2401,10 +2494,15 @@ NetLibDefaultAddressIsStatic (
     return TRUE;\r
   }\r
 \r
+  Status = NetGetChildHandle (Controller, &ChildHandle);\r
+  if (EFI_ERROR (Status)) {\r
+    return TRUE;\r
+  }\r
+\r
   //\r
   // Construct config request string header\r
   //\r
-  ConfigHdr = HiiConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, Controller);\r
+  ConfigHdr = HiiConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);\r
   if (ConfigHdr == NULL) {\r
     return TRUE;\r
   }\r
@@ -2435,7 +2533,7 @@ NetLibDefaultAddressIsStatic (
     goto ON_EXIT;\r
   }\r
 \r
-  ConfigInfo = AllocateZeroPool (sizeof (NIC_ITEM_CONFIG_SIZE));\r
+  ConfigInfo = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);\r
   if (ConfigInfo == NULL) {\r
     goto ON_EXIT;\r
   }\r
@@ -2630,6 +2728,7 @@ NetLibGetNicHandle (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 NetLibAsciiStrToIp4 (\r
   IN CONST CHAR8                 *String,\r
   OUT      EFI_IPv4_ADDRESS      *Ip4Address\r
@@ -2696,6 +2795,7 @@ NetLibAsciiStrToIp4 (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 NetLibAsciiStrToIp6 (\r
   IN CONST CHAR8                 *String,\r
   OUT      EFI_IPv6_ADDRESS      *Ip6Address\r
@@ -2711,13 +2811,17 @@ NetLibAsciiStrToIp6 (
   UINTN                          NodeVal;\r
   BOOLEAN                        Short;\r
   BOOLEAN                        Update;\r
+  BOOLEAN                        LeadZero;\r
+  UINT8                          LeadZeroCnt;\r
+  UINT8                          Cnt;\r
 \r
   if ((String == NULL) || (Ip6Address == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Ip6Str     = (CHAR8 *) String;\r
-  AllowedCnt = 6;\r
+  Ip6Str      = (CHAR8 *) String;\r
+  AllowedCnt  = 6;\r
+  LeadZeroCnt = 0;\r
 \r
   //\r
   // An IPv6 address leading with : looks strange.\r
@@ -2736,6 +2840,7 @@ NetLibAsciiStrToIp6 (
   TailNodeCnt = 0;\r
   Short       = FALSE;\r
   Update      = FALSE;\r
+  LeadZero    = FALSE;\r
 \r
   for (Index = 0; Index < 15; Index = (UINT8) (Index + 2)) {\r
     TempStr = Ip6Str;\r
@@ -2750,12 +2855,17 @@ NetLibAsciiStrToIp6 (
 \r
     if (*Ip6Str == ':') {\r
       if (*(Ip6Str + 1) == ':') {\r
-        if ((*(Ip6Str + 2) == '0') || (NodeCnt > 6)) {\r
+        if ((NodeCnt > 6) || \r
+            ((*(Ip6Str + 2) != '\0') && (AsciiStrHexToUintn (Ip6Str + 2) == 0))) {\r
           //\r
           // ::0 looks strange. report error to user.\r
           //\r
           return EFI_INVALID_PARAMETER;\r
         }\r
+        if ((NodeCnt == 6) && (*(Ip6Str + 2) != '\0') && \r
+            (AsciiStrHexToUintn (Ip6Str + 2) != 0)) {\r
+          return EFI_INVALID_PARAMETER;\r
+        }\r
 \r
         //\r
         // Skip the abbreviation part of IPv6 address.\r
@@ -2787,6 +2897,9 @@ NetLibAsciiStrToIp6 (
 \r
         Ip6Str = Ip6Str + 2;\r
       } else {\r
+        if (*(Ip6Str + 1) == '\0') {\r
+          return EFI_INVALID_PARAMETER;\r
+        }\r
         Ip6Str++;\r
         NodeCnt++;\r
         if ((Short && (NodeCnt > 6)) || (!Short && (NodeCnt > 7))) {\r
@@ -2806,6 +2919,46 @@ NetLibAsciiStrToIp6 (
     if ((NodeVal > 0xFFFF) || (Index > 14)) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
+    if (NodeVal != 0) {\r
+      if ((*TempStr  == '0') && \r
+          ((*(TempStr + 2) == ':') || (*(TempStr + 3) == ':') || \r
+          (*(TempStr + 2) == '\0') || (*(TempStr + 3) == '\0'))) {\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
+      if ((*TempStr  == '0') && (*(TempStr + 4) != '\0') && \r
+          (*(TempStr + 4) != ':')) { \r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
+    } else {\r
+      if (((*TempStr  == '0') && (*(TempStr + 1) == '0') && \r
+          ((*(TempStr + 2) == ':') || (*(TempStr + 2) == '\0'))) ||\r
+          ((*TempStr  == '0') && (*(TempStr + 1) == '0') && (*(TempStr + 2) == '0') && \r
+          ((*(TempStr + 3) == ':') || (*(TempStr + 3) == '\0')))) {\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
+    }\r
+\r
+    Cnt = 0;\r
+    while ((TempStr[Cnt] != ':') && (TempStr[Cnt] != '\0')) {\r
+      Cnt++; \r
+    }\r
+    if (LeadZeroCnt == 0) {\r
+      if ((Cnt == 4) && (*TempStr  == '0')) {\r
+        LeadZero = TRUE;\r
+        LeadZeroCnt++;\r
+      }\r
+      if ((Cnt != 0) && (Cnt < 4)) {\r
+        LeadZero = FALSE;\r
+        LeadZeroCnt++;\r
+      }\r
+    } else {\r
+      if ((Cnt == 4) && (*TempStr  == '0') && !LeadZero) {\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
+      if ((Cnt != 0) && (Cnt < 4) && LeadZero) {\r
+        return EFI_INVALID_PARAMETER;\r
+      }\r
+    } \r
 \r
     Ip6Address->Addr[Index] = (UINT8) (NodeVal >> 8);\r
     Ip6Address->Addr[Index + 1] = (UINT8) (NodeVal & 0xFF);\r
@@ -2839,6 +2992,7 @@ NetLibAsciiStrToIp6 (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 NetLibStrToIp4 (\r
   IN CONST CHAR16                *String,\r
   OUT      EFI_IPv4_ADDRESS      *Ip4Address\r
@@ -2879,6 +3033,7 @@ NetLibStrToIp4 (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 NetLibStrToIp6 (\r
   IN CONST CHAR16                *String,\r
   OUT      EFI_IPv6_ADDRESS      *Ip6Address\r
@@ -2920,6 +3075,7 @@ NetLibStrToIp6 (
 \r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 NetLibStrToIp6andPrefix (\r
   IN CONST CHAR16                *String,\r
   OUT      EFI_IPv6_ADDRESS      *Ip6Address,\r
@@ -2971,7 +3127,7 @@ NetLibStrToIp6andPrefix (
   // If input string doesn't indicate the prefix length, return 0xff.\r
   //\r
   Length = 0xFF;\r
-  \r
+\r
   //\r
   // Convert the string to prefix length\r
   //\r
@@ -3002,3 +3158,86 @@ Exit:
   return Status;\r
 }\r
 \r
+\r
+\r
+/**\r
+  This function obtains the system guid 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
+EFIAPI\r
+NetLibGetSystemGuid (\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
+  CHAR8                     *String;\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
+  do {\r
+    if (Smbios.Hdr->Type == 1) {\r
+      if (Smbios.Hdr->Length < 0x19) {\r
+        //\r
+        // Older version did not support UUID.\r
+        //\r
+        return EFI_NOT_FOUND;\r
+      }\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
+      return EFI_SUCCESS;\r
+    }\r
+\r
+    //\r
+    // Go to the next SMBIOS structure. Each SMBIOS structure may include 2 parts:\r
+    // 1. Formatted section; 2. Unformatted string section. So, 2 steps are needed\r
+    // to skip one SMBIOS structure.\r
+    //\r
+    \r
+    //\r
+    // Step 1: Skip over formatted section.\r
+    //\r
+    String = (CHAR8 *) (Smbios.Raw + Smbios.Hdr->Length);\r
+  \r
+    //\r
+    // Step 2: Skip over unformated string section.\r
+    //\r
+    do {\r
+      //\r
+      // Each string is terminated with a NULL(00h) BYTE and the sets of strings\r
+      // is terminated with an additional NULL(00h) BYTE.\r
+      //\r
+      for ( ; *String != 0; String++) {\r
+      }\r
+\r
+      if (*(UINT8*)++String == 0) {\r
+        //\r
+        // Pointer to the next SMBIOS structure.\r
+        //\r
+        Smbios.Raw = (UINT8 *)++String;\r
+        break;\r
+      }    \r
+    } while (TRUE);\r
+  } while (Smbios.Raw < SmbiosEnd.Raw);\r
+  return EFI_NOT_FOUND;\r
+}\r