]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
MdeModulePkg: Delete IScsiDxe in MdeModulePkg.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / IScsiDxe / IScsiMisc.c
diff --git a/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c b/MdeModulePkg/Universal/Network/IScsiDxe/IScsiMisc.c
deleted file mode 100644 (file)
index d924a8b..0000000
+++ /dev/null
@@ -1,948 +0,0 @@
-/** @file\r
-  Miscellaneous routines for iSCSI driver.\r
-\r
-Copyright (c) 2004 - 2018, 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
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "IScsiImpl.h"\r
-\r
-GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8  IScsiHexString[] = "0123456789ABCDEFabcdef";\r
-\r
-/**\r
-  Removes (trims) specified leading and trailing characters from a string.\r
-\r
-  @param[in, out]  Str  Pointer to the null-terminated string to be trimmed. On return,\r
-                        Str will hold the trimmed string.\r
-\r
-  @param[in]      CharC Character will be trimmed from str.\r
-**/\r
-VOID\r
-StrTrim (\r
-  IN OUT CHAR16   *Str,\r
-  IN     CHAR16   CharC\r
-  )\r
-{\r
-  CHAR16  *Pointer1;\r
-  CHAR16  *Pointer2;\r
-\r
-  if (*Str == 0) {\r
-    return;\r
-  }\r
-\r
-  //\r
-  // Trim off the leading and trailing characters c\r
-  //\r
-  for (Pointer1 = Str; (*Pointer1 != 0) && (*Pointer1 == CharC); Pointer1++) {\r
-    ;\r
-  }\r
-\r
-  Pointer2 = Str;\r
-  if (Pointer2 == Pointer1) {\r
-    while (*Pointer1 != 0) {\r
-      Pointer2++;\r
-      Pointer1++;\r
-    }\r
-  } else {\r
-    while (*Pointer1 != 0) {\r
-    *Pointer2 = *Pointer1;\r
-    Pointer1++;\r
-    Pointer2++;\r
-    }\r
-    *Pointer2 = 0;\r
-  }\r
-\r
-\r
-  for (Pointer1 = Str + StrLen(Str) - 1; Pointer1 >= Str && *Pointer1 == CharC; Pointer1--) {\r
-    ;\r
-  }\r
-  if  (Pointer1 !=  Str + StrLen(Str) - 1) {\r
-    *(Pointer1 + 1) = 0;\r
-  }\r
-}\r
-\r
-/**\r
-  Calculate the prefix length of the IPv4 subnet mask.\r
-\r
-  @param[in]  SubnetMask The IPv4 subnet mask.\r
-\r
-  @return The prefix length of the subnet mask.\r
-  @retval 0 Other errors as indicated.\r
-**/\r
-UINT8\r
-IScsiGetSubnetMaskPrefixLength (\r
-  IN EFI_IPv4_ADDRESS  *SubnetMask\r
-  )\r
-{\r
-  UINT8   Len;\r
-  UINT32  ReverseMask;\r
-\r
-  //\r
-  // The SubnetMask is in network byte order.\r
-  //\r
-  ReverseMask = (SubnetMask->Addr[0] << 24) | (SubnetMask->Addr[1] << 16) | (SubnetMask->Addr[2] << 8) | (SubnetMask->Addr[3]);\r
-\r
-  //\r
-  // Reverse it.\r
-  //\r
-  ReverseMask = ~ReverseMask;\r
-\r
-  if ((ReverseMask & (ReverseMask + 1)) != 0) {\r
-    return 0;\r
-  }\r
-\r
-  Len = 0;\r
-\r
-  while (ReverseMask != 0) {\r
-    ReverseMask = ReverseMask >> 1;\r
-    Len++;\r
-  }\r
-\r
-  return (UINT8) (32 - Len);\r
-}\r
-\r
-/**\r
-  Convert the hexadecimal encoded LUN string into the 64-bit LUN.\r
-\r
-  @param[in]   Str             The hexadecimal encoded LUN string.\r
-  @param[out]  Lun             Storage to return the 64-bit LUN.\r
-\r
-  @retval EFI_SUCCESS           The 64-bit LUN is stored in Lun.\r
-  @retval EFI_INVALID_PARAMETER The string is malformatted.\r
-**/\r
-EFI_STATUS\r
-IScsiAsciiStrToLun (\r
-  IN  CHAR8  *Str,\r
-  OUT UINT8  *Lun\r
-  )\r
-{\r
-  UINTN   Index, IndexValue, IndexNum, SizeStr;\r
-  CHAR8   TemStr[2];\r
-  UINT8   TemValue;\r
-  UINT16  Value[4];\r
-\r
-  ZeroMem (Lun, 8);\r
-  ZeroMem (TemStr, 2);\r
-  ZeroMem ((UINT8 *) Value, sizeof (Value));\r
-  SizeStr    = AsciiStrLen (Str);\r
-  IndexValue = 0;\r
-  IndexNum   = 0;\r
-\r
-  for (Index = 0; Index < SizeStr; Index ++) {\r
-    TemStr[0] = Str[Index];\r
-    TemValue = (UINT8) AsciiStrHexToUint64 (TemStr);\r
-    if (TemValue == 0 && TemStr[0] != '0') {\r
-      if ((TemStr[0] != '-') || (IndexNum == 0)) {\r
-        //\r
-        // Invalid Lun Char\r
-        //\r
-        return EFI_INVALID_PARAMETER;\r
-      }\r
-    }\r
-\r
-    if ((TemValue == 0) && (TemStr[0] == '-')) {\r
-      //\r
-      // Next Lun value\r
-      //\r
-      if (++IndexValue >= 4) {\r
-        //\r
-        // Max 4 Lun value\r
-        //\r
-        return EFI_INVALID_PARAMETER;\r
-      }\r
-      //\r
-      // Restart str index for the next lun value\r
-      //\r
-      IndexNum = 0;\r
-      continue;\r
-    }\r
-\r
-    if (++IndexNum > 4) {\r
-      //\r
-      // Each Lun Str can't exceed size 4, because it will be as UINT16 value\r
-      //\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    //\r
-    // Combine UINT16 value\r
-    //\r
-    Value[IndexValue] = (UINT16) ((Value[IndexValue] << 4) + TemValue);\r
-  }\r
-\r
-  for (Index = 0; Index <= IndexValue; Index ++) {\r
-    *((UINT16 *) &Lun[Index * 2]) =  HTONS (Value[Index]);\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Convert the 64-bit LUN into the hexadecimal encoded LUN string.\r
-\r
-  @param[in]   Lun The 64-bit LUN.\r
-  @param[out]  Str The storage to return the hexadecimal encoded LUN string.\r
-**/\r
-VOID\r
-IScsiLunToUnicodeStr (\r
-  IN UINT8    *Lun,\r
-  OUT CHAR16  *Str\r
-  )\r
-{\r
-  UINTN   Index;\r
-  CHAR16  *TempStr;\r
-\r
-  TempStr = Str;\r
-\r
-  for (Index = 0; Index < 4; Index++) {\r
-\r
-    if ((Lun[2 * Index] | Lun[2 * Index + 1]) == 0) {\r
-      CopyMem(TempStr, L"0-", sizeof (L"0-"));\r
-    } else {\r
-      TempStr[0]  = (CHAR16) IScsiHexString[Lun[2 * Index] >> 4];\r
-      TempStr[1]  = (CHAR16) IScsiHexString[Lun[2 * Index] & 0x0F];\r
-      TempStr[2]  = (CHAR16) IScsiHexString[Lun[2 * Index + 1] >> 4];\r
-      TempStr[3]  = (CHAR16) IScsiHexString[Lun[2 * Index + 1] & 0x0F];\r
-      TempStr[4]  = L'-';\r
-      TempStr[5]  = 0;\r
-\r
-      StrTrim (TempStr, L'0');\r
-    }\r
-\r
-    TempStr += StrLen (TempStr);\r
-  }\r
-\r
-  ASSERT (StrLen(Str) >= 1);\r
-  Str[StrLen (Str) - 1] = 0;\r
-\r
-  for (Index = StrLen (Str) - 1; Index > 1; Index = Index - 2) {\r
-    if ((Str[Index] == L'0') && (Str[Index - 1] == L'-')) {\r
-      Str[Index - 1] = 0;\r
-    } else {\r
-      break;\r
-    }\r
-  }\r
-}\r
-\r
-/**\r
-  Convert the ASCII string into a UNICODE string.\r
-\r
-  @param[in]   Source      The ASCII string.\r
-  @param[out]  Destination The storage to return the UNICODE string.\r
-\r
-  @return CHAR16 *         Pointer to the UNICODE string.\r
-**/\r
-CHAR16 *\r
-IScsiAsciiStrToUnicodeStr (\r
-  IN  CHAR8   *Source,\r
-  OUT CHAR16  *Destination\r
-  )\r
-{\r
-  ASSERT (Destination != NULL);\r
-  ASSERT (Source != NULL);\r
-\r
-  while (*Source != '\0') {\r
-    *(Destination++) = (CHAR16) *(Source++);\r
-  }\r
-\r
-  *Destination = '\0';\r
-\r
-  return Destination;\r
-}\r
-\r
-/**\r
-  Convert the UNICODE string into an ASCII string.\r
-\r
-  @param[in]  Source       The UNICODE string.\r
-  @param[out] Destination  The storage to return the ASCII string.\r
-\r
-  @return CHAR8 *          Pointer to the ASCII string.\r
-**/\r
-CHAR8 *\r
-IScsiUnicodeStrToAsciiStr (\r
-  IN  CHAR16  *Source,\r
-  OUT CHAR8   *Destination\r
-  )\r
-{\r
-  ASSERT (Destination != NULL);\r
-  ASSERT (Source != NULL);\r
-\r
-  while (*Source != '\0') {\r
-    //\r
-    // If any Unicode characters in Source contain\r
-    // non-zero value in the upper 8 bits, then ASSERT().\r
-    //\r
-    ASSERT (*Source < 0x100);\r
-    *(Destination++) = (CHAR8) *(Source++);\r
-  }\r
-\r
-  *Destination = '\0';\r
-\r
-  return Destination;\r
-}\r
-\r
-/**\r
-  Convert the decimal dotted IPv4 address into the binary IPv4 address.\r
-\r
-  @param[in]   Str             The UNICODE string.\r
-  @param[out]  Ip              The storage to return the ASCII string.\r
-\r
-  @retval EFI_SUCCESS           The binary IP address is returned in Ip.\r
-  @retval EFI_INVALID_PARAMETER The IP string is malformatted.\r
-**/\r
-EFI_STATUS\r
-IScsiAsciiStrToIp (\r
-  IN  CHAR8             *Str,\r
-  OUT EFI_IPv4_ADDRESS  *Ip\r
-  )\r
-{\r
-  UINTN Index;\r
-  UINTN Number;\r
-\r
-  Index = 0;\r
-\r
-  while (*Str != 0) {\r
-\r
-    if (Index > 3) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    Number = 0;\r
-    while (NET_IS_DIGIT (*Str)) {\r
-      Number = Number * 10 + (*Str - '0');\r
-      Str++;\r
-    }\r
-\r
-    if (Number > 0xFF) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    Ip->Addr[Index] = (UINT8) Number;\r
-\r
-    if ((*Str != '\0') && (*Str != '.')) {\r
-      //\r
-      // The current character should be either the NULL terminator or\r
-      // the dot delimiter.\r
-      //\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    if (*Str == '.') {\r
-      //\r
-      // Skip the delimiter.\r
-      //\r
-      Str++;\r
-    }\r
-\r
-    Index++;\r
-  }\r
-\r
-  if (Index != 4) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Convert the mac address into a hexadecimal encoded "-" seperated string.\r
-\r
-  @param[in]  Mac     The mac address.\r
-  @param[in]  Len     Length in bytes of the mac address.\r
-  @param[in]  VlanId  VLAN ID of the network device.\r
-  @param[out] Str     The storage to return the mac string.\r
-**/\r
-VOID\r
-IScsiMacAddrToStr (\r
-  IN  EFI_MAC_ADDRESS  *Mac,\r
-  IN  UINT32           Len,\r
-  IN  UINT16           VlanId,\r
-  OUT CHAR16           *Str\r
-  )\r
-{\r
-  UINT32  Index;\r
-  CHAR16  *String;\r
-\r
-  for (Index = 0; Index < Len; Index++) {\r
-    Str[3 * Index]      = (CHAR16) IScsiHexString[(Mac->Addr[Index] >> 4) & 0x0F];\r
-    Str[3 * Index + 1]  = (CHAR16) IScsiHexString[Mac->Addr[Index] & 0x0F];\r
-    Str[3 * Index + 2]  = L'-';\r
-  }\r
-\r
-  String = &Str[3 * Index - 1] ;\r
-  if (VlanId != 0) {\r
-    String += UnicodeSPrint (String, 6 * sizeof (CHAR16), L"\\%04x", (UINTN) VlanId);\r
-  }\r
-\r
-  *String = L'\0';\r
-}\r
-\r
-/**\r
-  Convert the binary encoded buffer into a hexadecimal encoded string.\r
-\r
-  @param[in]       BinBuffer   The buffer containing the binary data.\r
-  @param[in]       BinLength   Length of the binary buffer.\r
-  @param[in, out]  HexStr      Pointer to the string.\r
-  @param[in, out]  HexLength   The length of the string.\r
-\r
-  @retval EFI_SUCCESS          The binary data is converted to the hexadecimal string\r
-                               and the length of the string is updated.\r
-  @retval EFI_BUFFER_TOO_SMALL The string is too small.\r
-  @retval EFI_INVALID_PARAMETER The IP string is malformatted.\r
-**/\r
-EFI_STATUS\r
-IScsiBinToHex (\r
-  IN     UINT8  *BinBuffer,\r
-  IN     UINT32 BinLength,\r
-  IN OUT CHAR8  *HexStr,\r
-  IN OUT UINT32 *HexLength\r
-  )\r
-{\r
-  UINTN Index;\r
-\r
-  if ((HexStr == NULL) || (BinBuffer == NULL) || (BinLength == 0)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (((*HexLength) - 3) < BinLength * 2) {\r
-    *HexLength = BinLength * 2 + 3;\r
-    return EFI_BUFFER_TOO_SMALL;\r
-  }\r
-\r
-  *HexLength = BinLength * 2 + 3;\r
-  //\r
-  // Prefix for Hex String\r
-  //\r
-  HexStr[0] = '0';\r
-  HexStr[1] = 'x';\r
-\r
-  for (Index = 0; Index < BinLength; Index++) {\r
-    HexStr[Index * 2 + 2] = IScsiHexString[BinBuffer[Index] >> 4];\r
-    HexStr[Index * 2 + 3] = IScsiHexString[BinBuffer[Index] & 0x0F];\r
-  }\r
-\r
-  HexStr[Index * 2 + 2] = '\0';\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Convert the hexadecimal string into a binary encoded buffer.\r
-\r
-  @param[in, out]  BinBuffer   The binary buffer.\r
-  @param[in, out]  BinLength   Length of the binary buffer.\r
-  @param[in]       HexStr      The hexadecimal string.\r
-\r
-  @retval EFI_SUCCESS          The hexadecimal string is converted into a binary\r
-                               encoded buffer.\r
-  @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the converted data.\r
-**/\r
-EFI_STATUS\r
-IScsiHexToBin (\r
-  IN OUT UINT8  *BinBuffer,\r
-  IN OUT UINT32 *BinLength,\r
-  IN     CHAR8  *HexStr\r
-  )\r
-{\r
-  UINTN   Index;\r
-  UINTN   Length;\r
-  UINT8   Digit;\r
-  CHAR8   TemStr[2];\r
-\r
-  ZeroMem (TemStr, sizeof (TemStr));\r
-\r
-  //\r
-  // Find out how many hex characters the string has.\r
-  //\r
-  if ((HexStr[0] == '0') && ((HexStr[1] == 'x') || (HexStr[1] == 'X'))) {\r
-    HexStr += 2;\r
-  }\r
-\r
-  Length = AsciiStrLen (HexStr);\r
-\r
-  for (Index = 0; Index < Length; Index ++) {\r
-    TemStr[0] = HexStr[Index];\r
-    Digit = (UINT8) AsciiStrHexToUint64 (TemStr);\r
-    if (Digit == 0 && TemStr[0] != '0') {\r
-      //\r
-      // Invalid Lun Char\r
-      //\r
-      break;\r
-    }\r
-    if ((Index & 1) == 0) {\r
-      BinBuffer [Index/2] = Digit;\r
-    } else {\r
-      BinBuffer [Index/2] = (UINT8) ((BinBuffer [Index/2] << 4) + Digit);\r
-    }\r
-  }\r
-\r
-  *BinLength = (UINT32) ((Index + 1)/2);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Generate random numbers.\r
-\r
-  @param[in, out]  Rand       The buffer to contain random numbers.\r
-  @param[in]       RandLength The length of the Rand buffer.\r
-**/\r
-VOID\r
-IScsiGenRandom (\r
-  IN OUT UINT8  *Rand,\r
-  IN     UINTN  RandLength\r
-  )\r
-{\r
-  UINT32  Random;\r
-\r
-  while (RandLength > 0) {\r
-    Random  = NET_RANDOM (NetRandomInitSeed ());\r
-    *Rand++ = (UINT8) (Random);\r
-    RandLength--;\r
-  }\r
-}\r
-\r
-/**\r
-  Create the iSCSI driver data..\r
-\r
-  @param[in] Image      The handle of the driver image.\r
-  @param[in] Controller The handle of the controller.\r
-\r
-  @return The iSCSI driver data created.\r
-  @retval NULL Other errors as indicated.\r
-**/\r
-ISCSI_DRIVER_DATA *\r
-IScsiCreateDriverData (\r
-  IN EFI_HANDLE  Image,\r
-  IN EFI_HANDLE  Controller\r
-  )\r
-{\r
-  ISCSI_DRIVER_DATA *Private;\r
-  EFI_STATUS        Status;\r
-\r
-  Private = AllocateZeroPool (sizeof (ISCSI_DRIVER_DATA));\r
-  if (Private == NULL) {\r
-    return NULL;\r
-  }\r
-\r
-  Private->Signature  = ISCSI_DRIVER_DATA_SIGNATURE;\r
-  Private->Image      = Image;\r
-  Private->Controller = Controller;\r
-\r
-  //\r
-  // Create an event to be signal when the BS to RT transition is triggerd so\r
-  // as to abort the iSCSI session.\r
-  //\r
-  Status = gBS->CreateEventEx (\r
-                  EVT_NOTIFY_SIGNAL,\r
-                  TPL_CALLBACK,\r
-                  IScsiOnExitBootService,\r
-                  Private,\r
-                  &gEfiEventExitBootServicesGuid,\r
-                  &Private->ExitBootServiceEvent\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    FreePool (Private);\r
-    return NULL;\r
-  }\r
-\r
-  CopyMem(&Private->IScsiExtScsiPassThru, &gIScsiExtScsiPassThruProtocolTemplate, sizeof(EFI_EXT_SCSI_PASS_THRU_PROTOCOL));\r
-\r
-  //\r
-  // 0 is designated to the TargetId, so use another value for the AdapterId.\r
-  //\r
-  Private->ExtScsiPassThruMode.AdapterId = 2;\r
-  Private->ExtScsiPassThruMode.Attributes = EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL | EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL;\r
-  Private->ExtScsiPassThruMode.IoAlign  = 4;\r
-  Private->IScsiExtScsiPassThru.Mode    = &Private->ExtScsiPassThruMode;\r
-\r
-  //\r
-  // Install the Ext SCSI PASS THRU protocol.\r
-  //\r
-  Status = gBS->InstallProtocolInterface (\r
-                  &Private->ExtScsiPassThruHandle,\r
-                  &gEfiExtScsiPassThruProtocolGuid,\r
-                  EFI_NATIVE_INTERFACE,\r
-                  &Private->IScsiExtScsiPassThru\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->CloseEvent (Private->ExitBootServiceEvent);\r
-    FreePool (Private);\r
-\r
-    return NULL;\r
-  }\r
-\r
-  IScsiSessionInit (&Private->Session, FALSE);\r
-\r
-  return Private;\r
-}\r
-\r
-/**\r
-  Clean the iSCSI driver data.\r
-\r
-  @param[in]              Private The iSCSI driver data.\r
-\r
-  @retval EFI_SUCCESS     The clean operation is successful.\r
-  @retval Others          Other errors as indicated.\r
-\r
-**/\r
-EFI_STATUS\r
-IScsiCleanDriverData (\r
-  IN ISCSI_DRIVER_DATA  *Private\r
-  )\r
-{\r
-  EFI_STATUS             Status;\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-  if (Private->DevicePath != NULL) {\r
-    Status = gBS->UninstallProtocolInterface (\r
-                    Private->ExtScsiPassThruHandle,\r
-                    &gEfiDevicePathProtocolGuid,\r
-                    Private->DevicePath\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      goto EXIT;\r
-    }\r
-\r
-    FreePool (Private->DevicePath);\r
-  }\r
-\r
-  if (Private->ExtScsiPassThruHandle != NULL) {\r
-    Status = gBS->UninstallProtocolInterface (\r
-                    Private->ExtScsiPassThruHandle,\r
-                    &gEfiExtScsiPassThruProtocolGuid,\r
-                    &Private->IScsiExtScsiPassThru\r
-                    );\r
-  }\r
-\r
-EXIT:\r
-  if (Private->ExitBootServiceEvent != NULL) {\r
-    gBS->CloseEvent (Private->ExitBootServiceEvent);\r
-  }\r
-\r
-  FreePool (Private);\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Check wheather the Controller is configured to use DHCP protocol.\r
-\r
-  @param[in]  Controller           The handle of the controller.\r
-\r
-  @retval TRUE                     The handle of the controller need the Dhcp protocol.\r
-  @retval FALSE                    The handle of the controller does not need the Dhcp protocol.\r
-\r
-**/\r
-BOOLEAN\r
-IScsiDhcpIsConfigured (\r
-  IN EFI_HANDLE  Controller\r
-  )\r
-{\r
-  EFI_STATUS                  Status;\r
-  EFI_MAC_ADDRESS             MacAddress;\r
-  UINTN                       HwAddressSize;\r
-  UINT16                      VlanId;\r
-  CHAR16                      MacString[70];\r
-  ISCSI_SESSION_CONFIG_NVDATA *ConfigDataTmp;\r
-\r
-  //\r
-  // Get the mac string, it's the name of various variable\r
-  //\r
-  Status = NetLibGetMacAddress (Controller, &MacAddress, &HwAddressSize);\r
-  if (EFI_ERROR (Status)) {\r
-    return FALSE;\r
-  }\r
-  VlanId = NetLibGetVlanId (Controller);\r
-  IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString);\r
-\r
-  //\r
-  // Get the normal configuration.\r
-  //\r
-  Status = GetVariable2 (\r
-             MacString,\r
-             &gEfiIScsiInitiatorNameProtocolGuid,\r
-             (VOID**)&ConfigDataTmp,\r
-             NULL\r
-             );\r
-  if (ConfigDataTmp == NULL || EFI_ERROR (Status)) {\r
-    return FALSE;\r
-  }\r
-\r
-  if (ConfigDataTmp->Enabled && ConfigDataTmp->InitiatorInfoFromDhcp) {\r
-    FreePool (ConfigDataTmp);\r
-    return TRUE;\r
-  }\r
-\r
-  FreePool (ConfigDataTmp);\r
-  return FALSE;\r
-}\r
-\r
-/**\r
-  Get the various configuration data of this iSCSI instance.\r
-\r
-  @param[in]  Private   The iSCSI driver data.\r
-\r
-  @retval EFI_SUCCESS   The configuration of this instance is got.\r
-  @retval EFI_ABORTED   The operation was aborted.\r
-  @retval Others        Other errors as indicated.\r
-**/\r
-EFI_STATUS\r
-IScsiGetConfigData (\r
-  IN ISCSI_DRIVER_DATA  *Private\r
-  )\r
-{\r
-  EFI_STATUS                  Status;\r
-  ISCSI_SESSION               *Session;\r
-  UINTN                       BufferSize;\r
-  EFI_MAC_ADDRESS             MacAddress;\r
-  UINTN                       HwAddressSize;\r
-  UINT16                      VlanId;\r
-  CHAR16                      MacString[70];\r
-\r
-  //\r
-  // get the iSCSI Initiator Name\r
-  //\r
-  Session                       = &Private->Session;\r
-  Session->InitiatorNameLength  = ISCSI_NAME_MAX_SIZE;\r
-  Status = gIScsiInitiatorName.Get (\r
-                                &gIScsiInitiatorName,\r
-                                &Session->InitiatorNameLength,\r
-                                Session->InitiatorName\r
-                                );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Get the mac string, it's the name of various variable\r
-  //\r
-  Status = NetLibGetMacAddress (Private->Controller, &MacAddress, &HwAddressSize);\r
-  ASSERT (Status == EFI_SUCCESS);\r
-  VlanId = NetLibGetVlanId (Private->Controller);\r
-  IScsiMacAddrToStr (&MacAddress, (UINT32) HwAddressSize, VlanId, MacString);\r
-\r
-  //\r
-  // Get the normal configuration.\r
-  //\r
-  BufferSize = sizeof (Session->ConfigData.NvData);\r
-  Status = gRT->GetVariable (\r
-                  MacString,\r
-                  &gEfiIScsiInitiatorNameProtocolGuid,\r
-                  NULL,\r
-                  &BufferSize,\r
-                  &Session->ConfigData.NvData\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  if (!Session->ConfigData.NvData.Enabled) {\r
-    return EFI_ABORTED;\r
-  }\r
-  //\r
-  // Get the CHAP Auth information.\r
-  //\r
-  BufferSize = sizeof (Session->AuthData.AuthConfig);\r
-  Status = gRT->GetVariable (\r
-                  MacString,\r
-                  &gIScsiCHAPAuthInfoGuid,\r
-                  NULL,\r
-                  &BufferSize,\r
-                  &Session->AuthData.AuthConfig\r
-                  );\r
-\r
-  if (!EFI_ERROR (Status) && Session->ConfigData.NvData.InitiatorInfoFromDhcp) {\r
-    //\r
-    // Start dhcp.\r
-    //\r
-    Status = IScsiDoDhcp (Private->Image, Private->Controller, &Session->ConfigData);\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Get the device path of the iSCSI tcp connection and update it.\r
-\r
-  @param[in]  Private The iSCSI driver data.\r
-\r
-  @return The updated device path.\r
-  @retval NULL Other errors as indicated.\r
-**/\r
-EFI_DEVICE_PATH_PROTOCOL *\r
-IScsiGetTcpConnDevicePath (\r
-  IN ISCSI_DRIVER_DATA  *Private\r
-  )\r
-{\r
-  ISCSI_SESSION             *Session;\r
-  ISCSI_CONNECTION          *Conn;\r
-  TCP4_IO                   *Tcp4Io;\r
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
-  EFI_STATUS                Status;\r
-  EFI_DEV_PATH              *DPathNode;\r
-\r
-  Session = &Private->Session;\r
-  if (Session->State != SESSION_STATE_LOGGED_IN) {\r
-    return NULL;\r
-  }\r
-\r
-  Conn = NET_LIST_USER_STRUCT_S (\r
-          Session->Conns.ForwardLink,\r
-          ISCSI_CONNECTION,\r
-          Link,\r
-          ISCSI_CONNECTION_SIGNATURE\r
-          );\r
-  Tcp4Io = &Conn->Tcp4Io;\r
-\r
-  Status = gBS->HandleProtocol (\r
-                  Tcp4Io->Handle,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  (VOID **)&DevicePath\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return NULL;\r
-  }\r
-  //\r
-  // Duplicate it.\r
-  //\r
-  DevicePath  = DuplicateDevicePath (DevicePath);\r
-  if (DevicePath == NULL) {\r
-    return NULL;\r
-  }\r
-\r
-  DPathNode   = (EFI_DEV_PATH *) DevicePath;\r
-\r
-  while (!IsDevicePathEnd (&DPathNode->DevPath)) {\r
-    if ((DevicePathType (&DPathNode->DevPath) == MESSAGING_DEVICE_PATH) &&\r
-        (DevicePathSubType (&DPathNode->DevPath) == MSG_IPv4_DP)\r
-        ) {\r
-\r
-      DPathNode->Ipv4.LocalPort       = 0;\r
-      DPathNode->Ipv4.StaticIpAddress =\r
-        (BOOLEAN) (!Session->ConfigData.NvData.InitiatorInfoFromDhcp);\r
-\r
-      //\r
-      //  Add a judgement here to support previous versions of IPv4_DEVICE_PATH.\r
-      //  In previous versions of IPv4_DEVICE_PATH, GatewayIpAddress and SubnetMask\r
-      //  do not exist.\r
-      //  In new version of IPv4_DEVICE_PATH, structcure length is 27.\r
-      //\r
-      if (DevicePathNodeLength (&DPathNode->Ipv4) == IP4_NODE_LEN_NEW_VERSIONS) {\r
-\r
-        IP4_COPY_ADDRESS (\r
-          &DPathNode->Ipv4.GatewayIpAddress,\r
-          &Session->ConfigData.NvData.Gateway\r
-          );\r
-\r
-        IP4_COPY_ADDRESS (\r
-          &DPathNode->Ipv4.SubnetMask,\r
-          &Session->ConfigData.NvData.SubnetMask\r
-          );\r
-      }\r
-\r
-      break;\r
-    }\r
-\r
-    DPathNode = (EFI_DEV_PATH *) NextDevicePathNode (&DPathNode->DevPath);\r
-  }\r
-\r
-  return DevicePath;\r
-}\r
-\r
-/**\r
-  Abort the session when the transition from BS to RT is initiated.\r
-\r
-  @param[in]   Event  The event signaled.\r
-  @param[in]  Context The iSCSI driver data.\r
-**/\r
-VOID\r
-EFIAPI\r
-IScsiOnExitBootService (\r
-  IN EFI_EVENT  Event,\r
-  IN VOID       *Context\r
-  )\r
-{\r
-  ISCSI_DRIVER_DATA *Private;\r
-\r
-  Private = (ISCSI_DRIVER_DATA *) Context;\r
-\r
-  gBS->CloseEvent (Private->ExitBootServiceEvent);\r
-  Private->ExitBootServiceEvent = NULL;\r
-\r
-  IScsiSessionAbort (&Private->Session);\r
-}\r
-\r
-/**\r
-  Tests whether a controller handle is being managed by IScsi driver.\r
-\r
-  This function tests whether the driver specified by DriverBindingHandle is\r
-  currently managing the controller specified by ControllerHandle.  This test\r
-  is performed by evaluating if the the protocol specified by ProtocolGuid is\r
-  present on ControllerHandle and is was opened by DriverBindingHandle and Nic\r
-  Device handle with an attribute of EFI_OPEN_PROTOCOL_BY_DRIVER.\r
-  If ProtocolGuid is NULL, then ASSERT().\r
-\r
-  @param  ControllerHandle     A handle for a controller to test.\r
-  @param  DriverBindingHandle  Specifies the driver binding handle for the\r
-                               driver.\r
-  @param  ProtocolGuid         Specifies the protocol that the driver specified\r
-                               by DriverBindingHandle opens in its Start()\r
-                               function.\r
-\r
-  @retval EFI_SUCCESS          ControllerHandle is managed by the driver\r
-                               specified by DriverBindingHandle.\r
-  @retval EFI_UNSUPPORTED      ControllerHandle is not managed by the driver\r
-                               specified by DriverBindingHandle.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IScsiTestManagedDevice (\r
-  IN  EFI_HANDLE       ControllerHandle,\r
-  IN  EFI_HANDLE       DriverBindingHandle,\r
-  IN  EFI_GUID         *ProtocolGuid\r
-  )\r
-{\r
-  EFI_STATUS     Status;\r
-  VOID           *ManagedInterface;\r
-  EFI_HANDLE     NicControllerHandle;\r
-\r
-  ASSERT (ProtocolGuid != NULL);\r
-\r
-  NicControllerHandle = NetLibGetNicHandle (ControllerHandle, ProtocolGuid);\r
-  if (NicControllerHandle == NULL) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  Status = gBS->OpenProtocol (\r
-                  ControllerHandle,\r
-                  (EFI_GUID *) ProtocolGuid,\r
-                  &ManagedInterface,\r
-                  DriverBindingHandle,\r
-                  NicControllerHandle,\r
-                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
-                  );\r
-  if (!EFI_ERROR (Status)) {\r
-    gBS->CloseProtocol (\r
-           ControllerHandle,\r
-           (EFI_GUID *) ProtocolGuid,\r
-           DriverBindingHandle,\r
-           NicControllerHandle\r
-           );\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  if (Status != EFI_ALREADY_STARTED) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r