4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Miscellaneous routines for iSCSI driver.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwhich accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "IScsiImpl.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 IScsiHexString[] = "0123456789ABCDEFabcdef";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Removes (trims) specified leading and trailing characters from a string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Str Pointer to the null-terminated string to be trimmed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync On return, Str will hold the trimmed string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CharC Character will be trimmed from str.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiStrTrim (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT CHAR16 *Str,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 CharC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Pointer1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Pointer2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Str == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Trim off the leading and trailing characters c
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Pointer1 = Str; (*Pointer1 != 0) && (*Pointer1 == CharC); Pointer1++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pointer2 = Str;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Pointer2 == Pointer1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*Pointer1 != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pointer2++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pointer1++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*Pointer1 != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Pointer2 = *Pointer1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pointer1++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pointer2++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Pointer2 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Pointer1 = Str + StrLen(Str) - 1; Pointer1 >= Str && *Pointer1 == CharC; Pointer1--) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Pointer1 != Str + StrLen(Str) - 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(Pointer1 + 1) = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Calculate the prefix length of the IPv4 subnet mask.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SubnetMask The IPv4 subnet mask.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The prefix length of the subnet mask.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval 0 Other errors as indicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiGetSubnetMaskPrefixLength (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IPv4_ADDRESS *SubnetMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 ReverseMask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The SubnetMask is in network byte order.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReverseMask = (SubnetMask->Addr[0] << 24) | (SubnetMask->Addr[1] << 16) | (SubnetMask->Addr[2] << 8) | (SubnetMask->Addr[3]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Reverse it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReverseMask = ~ReverseMask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((ReverseMask & (ReverseMask + 1)) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Len = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (ReverseMask != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReverseMask = ReverseMask >> 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Len++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (UINT8) (32 - Len);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert the hexadecimal encoded LUN string into the 64-bit LUN.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Str The hexadecimal encoded LUN string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Lun Storage to return the 64-bit LUN.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The 64-bit LUN is stored in Lun.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER The string is malformatted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiAsciiStrToLun (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR8 *Str,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT8 *Lun
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index, IndexValue, IndexNum, SizeStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 TemStr[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 TemValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Value[4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (Lun, 8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (TemStr, 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem ((UINT8 *) Value, sizeof (Value));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SizeStr = AsciiStrLen (Str);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IndexValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IndexNum = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < SizeStr; Index ++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemStr[0] = Str[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemValue = (UINT8) AsciiStrHexToUint64 (TemStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TemValue == 0 && TemStr[0] != '0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((TemStr[0] != '-') || (IndexNum == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Invalid Lun Char.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((TemValue == 0) && (TemStr[0] == '-')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Next Lun value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (++IndexValue >= 4) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Max 4 Lun value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Restart str index for the next lun value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IndexNum = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (++IndexNum > 4) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Each Lun Str can't exceed size 4, because it will be as UINT16 value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Combine UINT16 value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value[IndexValue] = (UINT16) ((Value[IndexValue] << 4) + TemValue);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index <= IndexValue; Index ++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *((UINT16 *) &Lun[Index * 2]) = HTONS (Value[Index]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert the 64-bit LUN into the hexadecimal encoded LUN string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Lun The 64-bit LUN.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Str The storage to return the hexadecimal encoded LUN string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiLunToUnicodeStr (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Lun,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT CHAR16 *Str
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr = Str;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < 4; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Lun[2 * Index] | Lun[2 * Index + 1]) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (TempStr, L"0-");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr[0] = (CHAR16) IScsiHexString[Lun[2 * Index] >> 4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr[1] = (CHAR16) IScsiHexString[Lun[2 * Index] & 0x0F];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr[2] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] >> 4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr[3] = (CHAR16) IScsiHexString[Lun[2 * Index + 1] & 0x0F];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr[4] = L'-';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr[5] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IScsiStrTrim (TempStr, L'0');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr += StrLen (TempStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str[StrLen (Str) - 1] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = StrLen (Str) - 1; Index > 1; Index = Index - 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Str[Index] == L'0') && (Str[Index - 1] == L'-')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str[Index - 1] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert the formatted IP address into the binary IP address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Str The UNICODE string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] IpMode Indicates whether the IP address is v4 or v6.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Ip The storage to return the ASCII string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The binary IP address is returned in Ip.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER The IP string is malformatted or IpMode is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiAsciiStrToIp (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR8 *Str,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 IpMode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_IP_ADDRESS *Ip
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IpMode == IP_MODE_IP4 || IpMode == IP_MODE_AUTOCONFIG_IP4) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NetLibAsciiStrToIp4 (Str, &Ip->v4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IpMode == IP_MODE_IP6 || IpMode == IP_MODE_AUTOCONFIG_IP6) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NetLibAsciiStrToIp6 (Str, &Ip->v6);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IpMode == IP_MODE_AUTOCONFIG) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = NetLibAsciiStrToIp4 (Str, &Ip->v4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NetLibAsciiStrToIp6 (Str, &Ip->v6);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert the mac address into a hexadecimal encoded "-" seperated string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Mac The mac address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Len Length in bytes of the mac address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VlanId VLAN ID of the network device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Str The storage to return the mac string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiMacAddrToStr (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_MAC_ADDRESS *Mac,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Len,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 VlanId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT CHAR16 *Str
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Len; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str[3 * Index] = (CHAR16) IScsiHexString[(Mac->Addr[Index] >> 4) & 0x0F];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str[3 * Index + 1] = (CHAR16) IScsiHexString[Mac->Addr[Index] & 0x0F];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str[3 * Index + 2] = L':';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = &Str[3 * Index - 1] ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VlanId != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String += UnicodeSPrint (String, 6 * sizeof (CHAR16), L"\\%04x", (UINTN) VlanId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *String = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert the binary encoded buffer into a hexadecimal encoded string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] BinBuffer The buffer containing the binary data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] BinLength Length of the binary buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] HexStr Pointer to the string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] HexLength The length of the string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The binary data is converted to the hexadecimal string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and the length of the string is updated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BUFFER_TOO_SMALL The string is too small.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER The IP string is malformatted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiBinToHex (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *BinBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 BinLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT CHAR8 *HexStr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINT32 *HexLength
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((HexStr == NULL) || (BinBuffer == NULL) || (BinLength == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((*HexLength) - 3) < BinLength * 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *HexLength = BinLength * 2 + 3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_BUFFER_TOO_SMALL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *HexLength = BinLength * 2 + 3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Prefix for Hex String.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HexStr[0] = '0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HexStr[1] = 'x';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < BinLength; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HexStr[Index * 2 + 2] = IScsiHexString[BinBuffer[Index] >> 4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HexStr[Index * 2 + 3] = IScsiHexString[BinBuffer[Index] & 0xf];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HexStr[Index * 2 + 2] = '\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert the hexadecimal string into a binary encoded buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BinBuffer The binary buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BinLength Length of the binary buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] HexStr The hexadecimal string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The hexadecimal string is converted into a binary
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync encoded buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BUFFER_TOO_SMALL The binary buffer is too small to hold the converted data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiHexToBin (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINT8 *BinBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINT32 *BinLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR8 *HexStr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Digit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 TemStr[2];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (TemStr, sizeof (TemStr));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find out how many hex characters the string has.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((HexStr[0] == '0') && ((HexStr[1] == 'x') || (HexStr[1] == 'X'))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HexStr += 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = AsciiStrLen (HexStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Length; Index ++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TemStr[0] = HexStr[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Digit = (UINT8) AsciiStrHexToUint64 (TemStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Digit == 0 && TemStr[0] != '0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Invalid Lun Char.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Index & 1) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BinBuffer [Index/2] = Digit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BinBuffer [Index/2] = (UINT8) ((BinBuffer [Index/2] << 4) + Digit);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *BinLength = (UINT32) ((Index + 1)/2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert the decimal-constant string or hex-constant string into a numerical value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Str String in decimal or hex.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The numerical value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiNetNtoi (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR8 *Str
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Str[0] == '0') && ((Str[1] == 'x') || (Str[1] == 'X'))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str += 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return AsciiStrHexToUintn (Str);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return AsciiStrDecimalToUintn (Str);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Generate random numbers.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Rand The buffer to contain random numbers.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] RandLength The length of the Rand buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiGenRandom (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINT8 *Rand,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN RandLength
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Random;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (RandLength > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Random = NET_RANDOM (NetRandomInitSeed ());
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Rand++ = (UINT8) (Random);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RandLength--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Record the NIC info in global structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Controller The handle of the controller.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation is completed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Do not have sufficient resources to finish this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiAddNic (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Controller
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_NIC_INFO *NicInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Entry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_MAC_ADDRESS MacAddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HwAddressSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 VlanId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get MAC address of this network device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = NetLibGetMacAddress (Controller, &MacAddr, &HwAddressSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get VLAN ID of this network device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VlanId = NetLibGetVlanId (Controller);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether the NIC info already exists. Return directly if so.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_LIST_FOR_EACH (Entry, &mPrivate->NicInfoList) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NicInfo = NET_LIST_USER_STRUCT (Entry, ISCSI_NIC_INFO, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NicInfo->HwAddressSize == HwAddressSize &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CompareMem (&NicInfo->PermanentAddress, MacAddr.Addr, HwAddressSize) == 0 &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NicInfo->VlanId == VlanId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->CurrentNic = NicInfo->NicIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mPrivate->MaxNic < NicInfo->NicIndex) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->MaxNic = NicInfo->NicIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Record the NIC info in private structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NicInfo = AllocateZeroPool (sizeof (ISCSI_NIC_INFO));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NicInfo == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&NicInfo->PermanentAddress, MacAddr.Addr, HwAddressSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NicInfo->HwAddressSize = (UINT32) HwAddressSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NicInfo->VlanId = VlanId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NicInfo->NicIndex = (UINT8) (mPrivate->MaxNic + 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->MaxNic = NicInfo->NicIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the PCI location.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IScsiGetNICPciLocation (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &NicInfo->BusNumber,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &NicInfo->DeviceNumber,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &NicInfo->FunctionNumber
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (&mPrivate->NicInfoList, &NicInfo->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->NicCount++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->CurrentNic = NicInfo->NicIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delete the recorded NIC info from global structure. Also delete corresponding
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync attempts.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Controller The handle of the controller.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation is completed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The NIC info to be deleted is not recorded.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiRemoveNic (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Controller
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_NIC_INFO *NicInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Entry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *NextEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_ATTEMPT_CONFIG_NVDATA *AttemptConfigData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_NIC_INFO *ThisNic;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_MAC_ADDRESS MacAddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HwAddressSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 VlanId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get MAC address of this network device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = NetLibGetMacAddress (Controller, &MacAddr, &HwAddressSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get VLAN ID of this network device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VlanId = NetLibGetVlanId (Controller);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether the NIC information exists.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ThisNic = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_LIST_FOR_EACH (Entry, &mPrivate->NicInfoList) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NicInfo = NET_LIST_USER_STRUCT (Entry, ISCSI_NIC_INFO, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NicInfo->HwAddressSize == HwAddressSize &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CompareMem (&NicInfo->PermanentAddress, MacAddr.Addr, HwAddressSize) == 0 &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NicInfo->VlanId == VlanId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ThisNic = NicInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ThisNic == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->CurrentNic = ThisNic->NicIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&ThisNic->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ThisNic);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->NicCount--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Remove all attempts related to this NIC.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &mPrivate->AttemptConfigs) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData = NET_LIST_USER_STRUCT (Entry, ISCSI_ATTEMPT_CONFIG_NVDATA, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AttemptConfigData->NicIndex == mPrivate->CurrentNic) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&AttemptConfigData->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->AttemptCount--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AttemptConfigData->SessionConfigData.Enabled == ISCSI_ENABLED_FOR_MPIO && mPrivate->MpioCount > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (--mPrivate->MpioCount == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->EnableMpio = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AttemptConfigData->AuthenticationType == ISCSI_AUTH_TYPE_KRB && mPrivate->Krb5MpioCount > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->Krb5MpioCount--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (AttemptConfigData->SessionConfigData.Enabled == ISCSI_ENABLED && mPrivate->SinglePathCount > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->SinglePathCount--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mPrivate->ValidSinglePathCount > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->ValidSinglePathCount--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (AttemptConfigData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free attempt is created but not saved to system.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mPrivate->NewAttempt != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (mPrivate->NewAttempt);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->NewAttempt = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the recorded NIC info from global structure by the Index.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] NicIndex The index indicates the position of NIC info.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Pointer to the NIC info, or NULL if not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncISCSI_NIC_INFO *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiGetNicInfoByIndex (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 NicIndex
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Entry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_NIC_INFO *NicInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_LIST_FOR_EACH (Entry, &mPrivate->NicInfoList) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NicInfo = NET_LIST_USER_STRUCT (Entry, ISCSI_NIC_INFO, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NicInfo->NicIndex == NicIndex) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NicInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the NIC's PCI location and return it accroding to the composited
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync format defined in iSCSI Boot Firmware Table.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Controller The handle of the controller.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Bus The bus number.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Device The device number.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Function The function number.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The composited representation of the NIC PCI location.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiGetNICPciLocation (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *Bus,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *Device,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *Function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE PciIoHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_PCI_IO_PROTOCOL *PciIo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Segment;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateDevicePath (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiPciIoProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &PciIoHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (PciIoHandle, &gEfiPciIoProtocolGuid, (VOID **) &PciIo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PciIo->GetLocation (PciIo, &Segment, Bus, Device, Function);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (UINT16) ((*Bus << 8) | (*Device << 3) | *Function);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Read the EFI variable (VendorGuid/Name) and return a dynamically allocated
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer, and the size of the buffer. If failure, return NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Name String part of EFI variable name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VendorGuid GUID part of EFI variable name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] VariableSize Returns the size of the EFI variable that was read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Dynamically allocated memory that contains a copy of the EFI variable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Caller is responsible freeing the buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL Variable was not read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiGetVariableAndSize (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *Name,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *VendorGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *VariableSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pass in a zero size buffer to find the required buffer size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetVariable (Name, VendorGuid, NULL, &BufferSize, Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate the buffer to return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = AllocateZeroPool (BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Read variable into the allocated buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetVariable (Name, VendorGuid, NULL, &BufferSize, Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *VariableSize = BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create the iSCSI driver data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Image The handle of the driver image.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Controller The handle of the controller.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The iSCSI driver data created.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL Other errors as indicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncISCSI_DRIVER_DATA *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiCreateDriverData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Image,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Controller
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_DRIVER_DATA *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = AllocateZeroPool (sizeof (ISCSI_DRIVER_DATA));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Private == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->Signature = ISCSI_DRIVER_DATA_SIGNATURE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->Image = Image;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->Controller = Controller;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->Session = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Create an event to be signaled when the BS to RT transition is triggerd so
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // as to abort the iSCSI session.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->CreateEventEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EVT_NOTIFY_SIGNAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TPL_CALLBACK,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IScsiOnExitBootService,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiEventExitBootServicesGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Private->ExitBootServiceEvent
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Private);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->ExtScsiPassThruHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(&Private->IScsiExtScsiPassThru, &gIScsiExtScsiPassThruProtocolTemplate, sizeof(EFI_EXT_SCSI_PASS_THRU_PROTOCOL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 0 is designated to the TargetId, so use another value for the AdapterId.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->ExtScsiPassThruMode.AdapterId = 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->ExtScsiPassThruMode.Attributes = EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL | EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->ExtScsiPassThruMode.IoAlign = 4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->IScsiExtScsiPassThru.Mode = &Private->ExtScsiPassThruMode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Clean the iSCSI driver data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Private The iSCSI driver data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiCleanDriverData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN ISCSI_DRIVER_DATA *Private
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Private->DevicePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->UninstallProtocolInterface (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->ExtScsiPassThruHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Private->DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Private->ExtScsiPassThruHandle != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->UninstallProtocolInterface (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->ExtScsiPassThruHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiExtScsiPassThruProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Private->IScsiExtScsiPassThru
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->OneSessionEstablished = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseEvent (Private->ExitBootServiceEvent);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Private);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the various configuration data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Private The iSCSI driver data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The configuration data is retrieved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND This iSCSI driver is not configured yet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiGetConfigData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN ISCSI_DRIVER_DATA *Private
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 MacString[ISCSI_MAX_MAC_STRING_LEN];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_NIC_INFO *NicInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_ATTEMPT_CONFIG_NVDATA *AttemptConfigData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_ATTEMPT_CONFIG_NVDATA *AttemptTmp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *AttemptConfigOrder;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN AttemptConfigOrderSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 IScsiMode[64];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 IpMode[64];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // There should be at least one attempt configured.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigOrder = IScsiGetVariableAndSize (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"AttemptOrder",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gIScsiConfigGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &AttemptConfigOrderSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AttemptConfigOrder == NULL || AttemptConfigOrderSize == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the iSCSI Initiator Name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->InitiatorNameLength = ISCSI_NAME_MAX_SIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gIScsiInitiatorName.Get (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gIScsiInitiatorName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &mPrivate->InitiatorNameLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->InitiatorName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the normal configuration.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < AttemptConfigOrderSize / sizeof (UINT8); Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether the attempt exists in AttemptConfig.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptTmp = IScsiConfigGetAttemptByConfigIndex (AttemptConfigOrder[Index]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AttemptTmp != NULL && AttemptTmp->SessionConfigData.Enabled == ISCSI_DISABLED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (AttemptTmp != NULL && AttemptTmp->SessionConfigData.Enabled != ISCSI_DISABLED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check the autoconfig path to see whether it should be retried.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AttemptTmp->SessionConfigData.IpMode == IP_MODE_AUTOCONFIG &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptTmp->AutoConfigureMode != IP_MODE_AUTOCONFIG_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mPrivate->Ipv6Flag &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptTmp->AutoConfigureMode == IP_MODE_AUTOCONFIG_IP6) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Autoconfigure for IP6 already attempted but failed. Do not try again.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (!mPrivate->Ipv6Flag &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptTmp->AutoConfigureMode == IP_MODE_AUTOCONFIG_IP4) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Autoconfigure for IP4 already attempted but failed. Do not try again.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try another approach for this autoconfigure path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptTmp->AutoConfigureMode =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT8) (mPrivate->Ipv6Flag ? IP_MODE_AUTOCONFIG_IP6 : IP_MODE_AUTOCONFIG_IP4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptTmp->SessionConfigData.InitiatorInfoFromDhcp = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptTmp->SessionConfigData.TargetInfoFromDhcp = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptTmp->DhcpSuccess = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get some information from the dhcp server.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!mPrivate->Ipv6Flag) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = IScsiDoDhcp (Private->Image, Private->Controller, AttemptTmp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptTmp->DhcpSuccess = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = IScsiDoDhcp6 (Private->Image, Private->Controller, AttemptTmp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptTmp->DhcpSuccess = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Refresh the state of this attempt to NVR.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiStrToUnicodeStr (AttemptTmp->MacString, MacString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINTN) ISCSI_NAME_IFR_MAX_SIZE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"%s%d",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINTN) AttemptTmp->AttemptConfigIndex
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gRT->SetVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiIScsiInitiatorNameProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_CONFIG_VAR_ATTR,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (ISCSI_ATTEMPT_CONFIG_NVDATA),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptTmp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (AttemptTmp->SessionConfigData.InitiatorInfoFromDhcp && !AttemptTmp->ValidPath) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get DHCP information for already added, but failed, attempt.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptTmp->DhcpSuccess = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!mPrivate->Ipv6Flag && (AttemptTmp->SessionConfigData.IpMode == IP_MODE_IP4)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = IScsiDoDhcp (Private->Image, Private->Controller, AttemptTmp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptTmp->DhcpSuccess = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (mPrivate->Ipv6Flag && (AttemptTmp->SessionConfigData.IpMode == IP_MODE_IP6)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = IScsiDoDhcp6 (Private->Image, Private->Controller, AttemptTmp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptTmp->DhcpSuccess = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Refresh the state of this attempt to NVR.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiStrToUnicodeStr (AttemptTmp->MacString, MacString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINTN) ISCSI_NAME_IFR_MAX_SIZE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"%s%d",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINTN) AttemptTmp->AttemptConfigIndex
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gRT->SetVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiIScsiInitiatorNameProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_CONFIG_VAR_ATTR,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (ISCSI_ATTEMPT_CONFIG_NVDATA),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptTmp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This attempt does not exist in AttemptConfig. Try to add a new one.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NicInfo = IScsiGetNicInfoByIndex (mPrivate->CurrentNic);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (NicInfo != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IScsiMacAddrToStr (&NicInfo->PermanentAddress, NicInfo->HwAddressSize, NicInfo->VlanId, MacString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINTN) 128,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"%s%d",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINTN) AttemptConfigOrder[Index]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData = (ISCSI_ATTEMPT_CONFIG_NVDATA *) GetVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiIScsiInitiatorNameProtocolGuid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AttemptConfigData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (AttemptConfigOrder[Index] == AttemptConfigData->AttemptConfigIndex);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData->NicIndex = NicInfo->NicIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData->DhcpSuccess = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData->ValidiBFTPath = (BOOLEAN) (mPrivate->EnableMpio ? TRUE : FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData->ValidPath = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AttemptConfigData->SessionConfigData.IpMode == IP_MODE_AUTOCONFIG) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData->SessionConfigData.InitiatorInfoFromDhcp = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData->SessionConfigData.TargetInfoFromDhcp = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData->AutoConfigureMode =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT8) (mPrivate->Ipv6Flag ? IP_MODE_AUTOCONFIG_IP6 : IP_MODE_AUTOCONFIG_IP4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get some information from dhcp server.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AttemptConfigData->SessionConfigData.Enabled != ISCSI_DISABLED &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData->SessionConfigData.InitiatorInfoFromDhcp) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!mPrivate->Ipv6Flag &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (AttemptConfigData->SessionConfigData.IpMode == IP_MODE_IP4 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData->AutoConfigureMode == IP_MODE_AUTOCONFIG_IP4)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = IScsiDoDhcp (Private->Image, Private->Controller, AttemptConfigData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData->DhcpSuccess = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (mPrivate->Ipv6Flag &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (AttemptConfigData->SessionConfigData.IpMode == IP_MODE_IP6 ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData->AutoConfigureMode == IP_MODE_AUTOCONFIG_IP6)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = IScsiDoDhcp6 (Private->Image, Private->Controller, AttemptConfigData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData->DhcpSuccess = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Refresh the state of this attempt to NVR.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiStrToUnicodeStr (AttemptConfigData->MacString, MacString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINTN) ISCSI_NAME_IFR_MAX_SIZE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"%s%d",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINTN) AttemptConfigData->AttemptConfigIndex
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gRT->SetVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiIScsiInitiatorNameProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_CONFIG_VAR_ATTR,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (ISCSI_ATTEMPT_CONFIG_NVDATA),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update Attempt Help Info.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AttemptConfigData->SessionConfigData.Enabled == ISCSI_DISABLED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (IScsiMode, 64, L"Disabled");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (AttemptConfigData->SessionConfigData.Enabled == ISCSI_ENABLED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (IScsiMode, 64, L"Enabled");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (AttemptConfigData->SessionConfigData.Enabled == ISCSI_ENABLED_FOR_MPIO) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (IScsiMode, 64, L"Enabled for MPIO");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AttemptConfigData->SessionConfigData.IpMode == IP_MODE_IP4) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (IpMode, 64, L"IP4");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (AttemptConfigData->SessionConfigData.IpMode == IP_MODE_IP6) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (IpMode, 64, L"IP6");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (AttemptConfigData->SessionConfigData.IpMode == IP_MODE_AUTOCONFIG) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (IpMode, 64, L"Autoconfigure");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINTN) ISCSI_NAME_IFR_MAX_SIZE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"MAC: %s, PFA: Bus %d | Dev %d | Func %d, iSCSI mode: %s, IP version: %s",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MacString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NicInfo->BusNumber,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NicInfo->DeviceNumber,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NicInfo->FunctionNumber,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IScsiMode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpMode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData->AttemptTitleHelpToken = HiiSetString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mCallbackInfo->RegisteredHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (AttemptConfigData->AttemptTitleHelpToken != 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Record the attempt in global link list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (&mPrivate->AttemptConfigs, &AttemptConfigData->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->AttemptCount++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AttemptConfigData->SessionConfigData.Enabled == ISCSI_ENABLED_FOR_MPIO) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->MpioCount++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->EnableMpio = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AttemptConfigData->AuthenticationType == ISCSI_AUTH_TYPE_KRB) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->Krb5MpioCount++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (AttemptConfigData->SessionConfigData.Enabled == ISCSI_ENABLED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->SinglePathCount++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Reorder the AttemptConfig by the configured order.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < AttemptConfigOrderSize / sizeof (UINT8); Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AttemptConfigData = IScsiConfigGetAttemptByConfigIndex (AttemptConfigOrder[Index]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AttemptConfigData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&AttemptConfigData->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (&mPrivate->AttemptConfigs, &AttemptConfigData->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update the Main Form.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IScsiConfigUpdateAttempt ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (AttemptConfigOrder);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // There should be at least one attempt configuration.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!mPrivate->EnableMpio) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mPrivate->SinglePathCount == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPrivate->ValidSinglePathCount = mPrivate->SinglePathCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the device path of the iSCSI tcp connection and update it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Session The iSCSI session.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The updated device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL Other errors as indicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_DEVICE_PATH_PROTOCOL *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiGetTcpConnDevicePath (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN ISCSI_SESSION *Session
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_CONNECTION *Conn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEV_PATH *DPathNode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Session->State != SESSION_STATE_LOGGED_IN) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Conn = NET_LIST_USER_STRUCT_S (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Session->Conns.ForwardLink,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_CONNECTION,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Link,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_CONNECTION_SIGNATURE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Conn->TcpIo.Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Duplicate it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = DuplicateDevicePath (DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DPathNode = (EFI_DEV_PATH *) DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsDevicePathEnd (&DPathNode->DevPath)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePathType (&DPathNode->DevPath) == MESSAGING_DEVICE_PATH) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!Conn->Ipv6Flag && DevicePathSubType (&DPathNode->DevPath) == MSG_IPv4_DP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DPathNode->Ipv4.LocalPort = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DPathNode->Ipv4.StaticIpAddress =
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (BOOLEAN) (!Session->ConfigData->SessionConfigData.InitiatorInfoFromDhcp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP4_COPY_ADDRESS (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DPathNode->Ipv4.GatewayIpAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Session->ConfigData->SessionConfigData.Gateway
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP4_COPY_ADDRESS (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DPathNode->Ipv4.SubnetMask,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Session->ConfigData->SessionConfigData.SubnetMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Conn->Ipv6Flag && DevicePathSubType (&DPathNode->DevPath) == MSG_IPv6_DP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DPathNode->Ipv6.LocalPort = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DPathNode->Ipv6.IpAddressOrigin = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DPathNode->Ipv6.PrefixLength = IP6_PREFIX_LENGTH;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&DPathNode->Ipv6.GatewayIpAddress, sizeof (EFI_IPv6_ADDRESS));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DPathNode = (EFI_DEV_PATH *) NextDevicePathNode (&DPathNode->DevPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Abort the session when the transition from BS to RT is initiated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Event The event signaled.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Context The iSCSI driver data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIScsiOnExitBootService (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EVENT Event,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ISCSI_DRIVER_DATA *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = (ISCSI_DRIVER_DATA *) Context;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseEvent (Private->ExitBootServiceEvent);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Private->Session != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IScsiSessionAbort (Private->Session);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync