+++ /dev/null
-/** @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