]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/IScsiDxe/IScsiMisc.c
NetworkPkg: Add dns support for target URL configuration in ISCSI.
[mirror_edk2.git] / NetworkPkg / IScsiDxe / IScsiMisc.c
index a1f2672f3709725a0fa79acddea07535b976f0b2..e8e8f9c9efa1e0a77dfaac3498154f49aa077d57 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Miscellaneous routines for iSCSI driver.\r
 \r
-Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2017, 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
@@ -900,6 +900,8 @@ EXIT:
 \r
   gBS->CloseEvent (Private->ExitBootServiceEvent);\r
 \r
+  mCallbackInfo->Current = NULL;\r
+\r
   FreePool (Private);\r
   return Status;\r
 }\r
@@ -999,6 +1001,94 @@ IScsiDhcpIsConfigured (
   return FALSE;\r
 }\r
 \r
+/**\r
+  Check wheather the Controller handle is configured to use DNS protocol.\r
+\r
+  @param[in]  Controller           The handle of the controller.\r
+  \r
+  @retval TRUE                     The handle of the controller need the Dns protocol.\r
+  @retval FALSE                    The handle of the controller does not need the Dns protocol.\r
+  \r
+**/\r
+BOOLEAN\r
+IScsiDnsIsConfigured (\r
+  IN EFI_HANDLE  Controller\r
+  )\r
+{\r
+  ISCSI_ATTEMPT_CONFIG_NVDATA *AttemptTmp;\r
+  UINT8                       *AttemptConfigOrder;\r
+  UINTN                       AttemptConfigOrderSize;\r
+  UINTN                       Index;\r
+  EFI_STATUS                  Status;\r
+  EFI_MAC_ADDRESS             MacAddr;\r
+  UINTN                       HwAddressSize;\r
+  UINT16                      VlanId;\r
+  CHAR16                      MacString[ISCSI_MAX_MAC_STRING_LEN];\r
+  CHAR16                      AttemptName[ISCSI_NAME_IFR_MAX_SIZE];\r
+  \r
+  AttemptConfigOrder = IScsiGetVariableAndSize (\r
+                         L"AttemptOrder",\r
+                         &gIScsiConfigGuid,\r
+                         &AttemptConfigOrderSize\r
+                         );\r
+  if (AttemptConfigOrder == NULL || AttemptConfigOrderSize == 0) {\r
+    return FALSE;\r
+  }\r
+  \r
+  //\r
+  // Get MAC address of this network device.\r
+  //\r
+  Status = NetLibGetMacAddress (Controller, &MacAddr, &HwAddressSize);\r
+  if(EFI_ERROR (Status)) {\r
+    return FALSE;\r
+  }\r
+  //\r
+  // Get VLAN ID of this network device.\r
+  //\r
+  VlanId = NetLibGetVlanId (Controller);\r
+  IScsiMacAddrToStr (&MacAddr, (UINT32) HwAddressSize, VlanId, MacString);\r
+  \r
+  for (Index = 0; Index < AttemptConfigOrderSize / sizeof (UINT8); Index++) {\r
+    UnicodeSPrint (\r
+      AttemptName,\r
+      (UINTN) 128,\r
+      L"%s%d",\r
+      MacString,\r
+      (UINTN) AttemptConfigOrder[Index]\r
+      );\r
+    Status = GetVariable2 (\r
+               AttemptName,\r
+               &gEfiIScsiInitiatorNameProtocolGuid,\r
+               (VOID**)&AttemptTmp,\r
+               NULL\r
+               );\r
+    if(AttemptTmp == NULL || EFI_ERROR (Status)) {\r
+      continue;\r
+    }\r
+    \r
+    ASSERT (AttemptConfigOrder[Index] == AttemptTmp->AttemptConfigIndex);\r
+\r
+    if (AttemptTmp->SessionConfigData.Enabled == ISCSI_DISABLED) {\r
+      FreePool (AttemptTmp);\r
+      continue;\r
+    }\r
+    \r
+    if (AttemptTmp->SessionConfigData.DnsMode) {\r
+      FreePool (AttemptTmp);\r
+      FreePool (AttemptConfigOrder);\r
+      return TRUE;\r
+    } else {\r
+      FreePool (AttemptTmp);\r
+      continue;\r
+    }\r
+\r
+  }\r
+\r
+  FreePool (AttemptConfigOrder);\r
+  return FALSE;\r
+\r
+}\r
+\r
 /**\r
   Get the various configuration data.\r
 \r
@@ -1006,6 +1096,7 @@ IScsiDhcpIsConfigured (
 \r
   @retval EFI_SUCCESS            The configuration data is retrieved.\r
   @retval EFI_NOT_FOUND          This iSCSI driver is not configured yet.\r
+  @retval EFI_OUT_OF_RESOURCES   Failed to allocate memory.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1106,7 +1197,7 @@ IScsiGetConfigData (
           //\r
           // Refresh the state of this attempt to NVR.\r
           //\r
-          AsciiStrToUnicodeStr (AttemptTmp->MacString, MacString);\r
+          AsciiStrToUnicodeStrS (AttemptTmp->MacString, MacString, ARRAY_SIZE (MacString));\r
           UnicodeSPrint (\r
             mPrivate->PortString,\r
             (UINTN) ISCSI_NAME_IFR_MAX_SIZE,\r
@@ -1145,7 +1236,7 @@ IScsiGetConfigData (
         //\r
         // Refresh the state of this attempt to NVR.\r
         //\r
-        AsciiStrToUnicodeStr (AttemptTmp->MacString, MacString);\r
+        AsciiStrToUnicodeStrS (AttemptTmp->MacString, MacString, ARRAY_SIZE (MacString));\r
         UnicodeSPrint (\r
           mPrivate->PortString,\r
           (UINTN) ISCSI_NAME_IFR_MAX_SIZE,\r
@@ -1185,11 +1276,11 @@ IScsiGetConfigData (
       );\r
 \r
     GetVariable2 (\r
-                 mPrivate->PortString,\r
-                 &gEfiIScsiInitiatorNameProtocolGuid,\r
-                 (VOID**)&AttemptConfigData,\r
-                 NULL\r
-                 );\r
+      mPrivate->PortString,\r
+      &gEfiIScsiInitiatorNameProtocolGuid,\r
+      (VOID**)&AttemptConfigData,\r
+      NULL\r
+      );\r
 \r
     if (AttemptConfigData == NULL) {\r
       continue;\r
@@ -1236,7 +1327,7 @@ IScsiGetConfigData (
       //\r
       // Refresh the state of this attempt to NVR.\r
       //\r
-      AsciiStrToUnicodeStr (AttemptConfigData->MacString, MacString);\r
+      AsciiStrToUnicodeStrS (AttemptConfigData->MacString, MacString, ARRAY_SIZE (MacString));\r
       UnicodeSPrint (\r
         mPrivate->PortString,\r
         (UINTN) ISCSI_NAME_IFR_MAX_SIZE,\r
@@ -1292,7 +1383,9 @@ IScsiGetConfigData (
                                                  mPrivate->PortString,\r
                                                  NULL\r
                                                  );\r
-    ASSERT (AttemptConfigData->AttemptTitleHelpToken != 0);\r
+    if (AttemptConfigData->AttemptTitleHelpToken == 0) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
 \r
     //\r
     // Record the attempt in global link list.\r