/** @file\r
- Helper functions for configuring or getting the parameters relating to ISCSI.\r
+ Helper functions for configuring or getting the parameters relating to iSCSI.\r
\r
Copyright (c) 2004 - 2008, Intel Corporation.<BR>\r
All rights reserved. This program and the accompanying materials\r
#include "IScsiImpl.h"\r
\r
EFI_GUID mVendorGuid = ISCSI_CONFIG_GUID;\r
+CHAR16 mVendorStorageName[] = L"ISCSI_CONFIG_IFR_NVDATA";\r
BOOLEAN mIScsiDeviceListUpdated = FALSE;\r
UINTN mNumberOfIScsiDevices = 0;\r
ISCSI_FORM_CALLBACK_INFO *mCallbackInfo = NULL;\r
&mIScsiConfigFormList\r
};\r
\r
+HII_VENDOR_DEVICE_PATH mIScsiHiiVendorDevicePath = {\r
+ {\r
+ {\r
+ HARDWARE_DEVICE_PATH,\r
+ HW_VENDOR_DP,\r
+ {\r
+ (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
+ (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
+ }\r
+ },\r
+ //\r
+ // {49D7B73E-143D-4716-977B-C45F1CB038CC}\r
+ //\r
+ { 0x49d7b73e, 0x143d, 0x4716, { 0x97, 0x7b, 0xc4, 0x5f, 0x1c, 0xb0, 0x38, 0xcc } }\r
+ },\r
+ {\r
+ END_DEVICE_PATH_TYPE,\r
+ END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+ { \r
+ (UINT8) (END_DEVICE_PATH_LENGTH),\r
+ (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
+ }\r
+ }\r
+};\r
+\r
/**\r
Convert the IPv4 address into a dotted string.\r
\r
UnicodeSPrint ( Str, 2 * IP4_STR_MAX_SIZE, L"%d.%d.%d.%d", Ip->Addr[0], Ip->Addr[1], Ip->Addr[2], Ip->Addr[3]);\r
}\r
\r
-/**\r
- Pop up an invalid notify which displays the message in Warning.\r
-\r
- @param[in] Warning The warning message.\r
-**/\r
-VOID\r
-PopUpInvalidNotify (\r
- IN CHAR16 *Warning\r
- )\r
-{\r
- EFI_INPUT_KEY Key;\r
-\r
- IfrLibCreatePopUp (1, &Key, Warning);\r
-}\r
-\r
/**\r
Update the list of iSCSI devices the iSCSI driver is controlling.\r
\r
/**\r
Convert the iSCSI configuration data into the IFR data.\r
\r
- @param[in] ConfigFormEntry The iSCSI configuration form entry.\r
- @param[in] IfrNvData The IFR nv data.\r
+ @param[in] ConfigFormEntry The iSCSI configuration form entry.\r
+ @param[out] IfrNvData The IFR nv data.\r
**/\r
VOID\r
IScsiConvertDeviceConfigDataToIfrNvData (\r
- IN ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry,\r
- IN ISCSI_CONFIG_IFR_NVDATA *IfrNvData\r
+ IN ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry,\r
+ OUT ISCSI_CONFIG_IFR_NVDATA *IfrNvData\r
)\r
{\r
ISCSI_SESSION_CONFIG_NVDATA *SessionConfigData;\r
ISCSI_FORM_CALLBACK_INFO *Private;\r
EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;\r
\r
- if (Request == NULL) {\r
+ if (Request == NULL || Progress == NULL || Results == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
+ *Progress = Request;\r
\r
if (!mIScsiDeviceListUpdated) {\r
//\r
driver followed by name / value configuration pairs. The driver\r
must apply those pairs to its configurable storage. If the\r
driver's configuration is stored in a linear block of data\r
- and the driver????s name / value pairs are in <BlockConfig>\r
+ and the driver's name / value pairs are in <BlockConfig>\r
format, it may use the ConfigToBlock helper function (above) to\r
simplify the job. Currently not implemented.\r
\r
\r
@retval EFI_SUCCESS The results have been distributed or are\r
awaiting distribution. \r
- @retval EFI_OUT_OF_MEMORY Not enough memory to store the\r
+ @retval EFI_OUT_OF_RESOURCES Not enough memory to store the\r
parts of the results that must be\r
stored awaiting possible future\r
protocols.\r
OUT EFI_STRING *Progress\r
)\r
{\r
+ if (Configuration == NULL || Progress == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ //\r
+ // Check routing data in <ConfigHdr>.\r
+ // Note: if only one Storage is used, then this checking could be skipped.\r
+ //\r
+ if (!HiiIsConfigHdrMatch (Configuration, &mVendorGuid, mVendorStorageName)) {\r
+ *Progress = Configuration;\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ *Progress = Configuration + StrLen (Configuration);\r
return EFI_SUCCESS;\r
}\r
\r
EFI_IP_ADDRESS SubnetMask;\r
EFI_IP_ADDRESS Gateway;\r
EFI_STATUS Status;\r
+ EFI_INPUT_KEY Key;\r
\r
Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);\r
\r
//\r
// Retrive uncommitted data from Browser\r
//\r
- BufferSize = sizeof (ISCSI_CONFIG_IFR_NVDATA);\r
- IfrNvData = AllocateZeroPool (BufferSize);\r
+ IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA));\r
ASSERT (IfrNvData != NULL);\r
- Status = GetBrowserData (NULL, NULL, &BufferSize, (UINT8 *) IfrNvData);\r
- if (EFI_ERROR (Status)) {\r
- gBS->FreePool (IfrNvData);\r
- return Status;\r
+ if (!HiiGetBrowserData (&mVendorGuid, mVendorStorageName, sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData)) {\r
+ FreePool (IfrNvData);\r
+ return EFI_NOT_FOUND;\r
}\r
+ \r
+ Status = EFI_SUCCESS;\r
\r
switch (QuestionId) {\r
case KEY_INITIATOR_NAME:\r
\r
Status = gIScsiInitiatorName.Set (&gIScsiInitiatorName, &BufferSize, IScsiName);\r
if (EFI_ERROR (Status)) {\r
- PopUpInvalidNotify (L"Invalid iSCSI Name!");\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL);\r
}\r
\r
break;\r
IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String);\r
Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);\r
if (EFI_ERROR (Status) || !Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {\r
- PopUpInvalidNotify (L"Invalid IP address!");\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);\r
Status = EFI_INVALID_PARAMETER;\r
} else {\r
CopyMem (&Private->Current->SessionConfigData.LocalIp, &HostIp.v4, sizeof (HostIp.v4));\r
IScsiUnicodeStrToAsciiStr (IfrNvData->SubnetMask, Ip4String);\r
Status = IScsiAsciiStrToIp (Ip4String, &SubnetMask.v4);\r
if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) && (IScsiGetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) {\r
- PopUpInvalidNotify (L"Invalid Subnet Mask!");\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Subnet Mask!", NULL);\r
Status = EFI_INVALID_PARAMETER;\r
} else {\r
CopyMem (&Private->Current->SessionConfigData.SubnetMask, &SubnetMask.v4, sizeof (SubnetMask.v4));\r
IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String);\r
Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4);\r
if (EFI_ERROR (Status) || ((Gateway.Addr[0] != 0) && !Ip4IsUnicast (NTOHL (Gateway.Addr[0]), 0))) {\r
- PopUpInvalidNotify (L"Invalid Gateway!");\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Gateway!", NULL);\r
Status = EFI_INVALID_PARAMETER;\r
} else {\r
CopyMem (&Private->Current->SessionConfigData.Gateway, &Gateway.v4, sizeof (Gateway.v4));\r
IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String);\r
Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);\r
if (EFI_ERROR (Status) || !Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {\r
- PopUpInvalidNotify (L"Invalid IP address!");\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);\r
Status = EFI_INVALID_PARAMETER;\r
} else {\r
CopyMem (&Private->Current->SessionConfigData.TargetIp, &HostIp.v4, sizeof (HostIp.v4));\r
IScsiUnicodeStrToAsciiStr (IfrNvData->TargetName, IScsiName);\r
Status = IScsiNormalizeName (IScsiName, AsciiStrLen (IScsiName));\r
if (EFI_ERROR (Status)) {\r
- PopUpInvalidNotify (L"Invalid iSCSI Name!");\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL);\r
} else {\r
AsciiStrCpy (Private->Current->SessionConfigData.TargetName, IScsiName);\r
}\r
IScsiUnicodeStrToAsciiStr (IfrNvData->BootLun, LunString);\r
Status = IScsiAsciiStrToLun (LunString, (UINT8 *) &Lun);\r
if (EFI_ERROR (Status)) {\r
- PopUpInvalidNotify (L"Invalid LUN string!");\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid LUN string!", NULL);\r
} else {\r
CopyMem (Private->Current->SessionConfigData.BootLun, &Lun, sizeof (Lun));\r
}\r
\r
if ((Gateway.Addr[0] != 0)) {\r
if (SubnetMask.Addr[0] == 0) {\r
- PopUpInvalidNotify (L"Gateway address is set but subnet mask is zero.");\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Gateway address is set but subnet mask is zero.", NULL);\r
Status = EFI_INVALID_PARAMETER;\r
break;\r
} else if (!IP4_NET_EQUAL (HostIp.Addr[0], Gateway.Addr[0], SubnetMask.Addr[0])) {\r
- PopUpInvalidNotify (L"Local IP and Gateway are not in the same subnet.");\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Local IP and Gateway are not in the same subnet.", NULL);\r
Status = EFI_INVALID_PARAMETER;\r
break;\r
}\r
if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) {\r
CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.TargetIp, sizeof (HostIp.v4));\r
if (!Ip4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {\r
- PopUpInvalidNotify (L"Target IP is invalid!");\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Target IP is invalid!", NULL);\r
Status = EFI_INVALID_PARAMETER;\r
break;\r
}\r
\r
if (IfrNvData->CHAPType != ISCSI_CHAP_NONE) {\r
if ((IfrNvData->CHAPName[0] == '\0') || (IfrNvData->CHAPSecret[0] == '\0')) {\r
- PopUpInvalidNotify (L"CHAP Name or CHAP Secret is invalid!");\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"CHAP Name or CHAP Secret is invalid!", NULL);\r
Status = EFI_INVALID_PARAMETER;\r
break;\r
}\r
if ((IfrNvData->CHAPType == ISCSI_CHAP_MUTUAL) &&\r
((IfrNvData->ReverseCHAPName[0] == '\0') || (IfrNvData->ReverseCHAPSecret[0] == '\0'))\r
) {\r
- PopUpInvalidNotify (L"Reverse CHAP Name or Reverse CHAP Secret is invalid!");\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Reverse CHAP Name or Reverse CHAP Secret is invalid!", NULL);\r
Status = EFI_INVALID_PARAMETER;\r
break;\r
}\r
\r
UnicodeSPrint (PortString, (UINTN) 128, L"Port %s", ConfigFormEntry->MacString);\r
DeviceFormTitleToken = (EFI_STRING_ID) STR_ISCSI_DEVICE_FORM_TITLE;\r
- HiiLibSetString (Private->RegisteredHandle, DeviceFormTitleToken, PortString);\r
+ HiiSetString (Private->RegisteredHandle, DeviceFormTitleToken, PortString, NULL);\r
\r
IScsiConvertDeviceConfigDataToIfrNvData (ConfigFormEntry, IfrNvData);\r
\r
//\r
// Pass changed uncommitted data back to Form Browser\r
//\r
- BufferSize = sizeof (ISCSI_CONFIG_IFR_NVDATA);\r
- Status = SetBrowserData (NULL, NULL, BufferSize, (UINT8 *) IfrNvData, NULL);\r
+ HiiSetBrowserData (&mVendorGuid, mVendorStorageName, sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData, NULL);\r
}\r
\r
- gBS->FreePool (IfrNvData);\r
+ FreePool (IfrNvData);\r
return Status;\r
}\r
\r
ISCSI_CONFIG_FORM_ENTRY *ConfigFormEntry;\r
BOOLEAN EntryExisted;\r
EFI_STATUS Status;\r
- EFI_HII_UPDATE_DATA UpdateData;\r
EFI_SIMPLE_NETWORK_PROTOCOL *Snp;\r
CHAR16 PortString[128];\r
UINT16 FormIndex;\r
UINTN BufferSize;\r
-\r
+ VOID *StartOpCodeHandle;\r
+ VOID *EndOpCodeHandle;\r
+ EFI_IFR_GUID_LABEL *StartLabel;\r
+ EFI_IFR_GUID_LABEL *EndLabel;\r
\r
ConfigFormEntry = NULL;\r
EntryExisted = FALSE;\r
// Compose the Port string and create a new EFI_STRING_ID.\r
//\r
UnicodeSPrint (PortString, 128, L"Port %s", ConfigFormEntry->MacString);\r
- HiiLibNewString (mCallbackInfo->RegisteredHandle, &ConfigFormEntry->PortTitleToken, PortString);\r
+ ConfigFormEntry->PortTitleToken = HiiSetString (mCallbackInfo->RegisteredHandle, 0, PortString, NULL);\r
\r
//\r
// Compose the help string of this port and create a new EFI_STRING_ID.\r
//\r
UnicodeSPrint (PortString, 128, L"Set the iSCSI parameters on port %s", ConfigFormEntry->MacString);\r
- HiiLibNewString (mCallbackInfo->RegisteredHandle, &ConfigFormEntry->PortTitleHelpToken, PortString);\r
+ ConfigFormEntry->PortTitleHelpToken = HiiSetString (mCallbackInfo->RegisteredHandle, 0, PortString, NULL);\r
\r
InsertTailList (&mIScsiConfigFormList, &ConfigFormEntry->Link);\r
mNumberOfIScsiDevices++;\r
//\r
// Allocate space for creation of Buffer\r
//\r
- UpdateData.BufferSize = 0x1000;\r
- UpdateData.Data = AllocateZeroPool (0x1000);\r
- UpdateData.Offset = 0;\r
+\r
+ //\r
+ // Init OpCode Handle\r
+ //\r
+ StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (StartOpCodeHandle != NULL);\r
+\r
+ EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+ ASSERT (EndOpCodeHandle != NULL);\r
+\r
+ //\r
+ // Create Hii Extend Label OpCode as the start opcode\r
+ //\r
+ StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+ StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+ StartLabel->Number = DEVICE_ENTRY_LABEL;\r
+\r
+ //\r
+ // Create Hii Extend Label OpCode as the end opcode\r
+ //\r
+ EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+ EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+ EndLabel->Number = LABEL_END;\r
\r
FormIndex = 0;\r
NET_LIST_FOR_EACH (Entry, &mIScsiConfigFormList) {\r
ConfigFormEntry = NET_LIST_USER_STRUCT (Entry, ISCSI_CONFIG_FORM_ENTRY, Link);\r
\r
- CreateGotoOpCode (\r
- FORMID_DEVICE_FORM,\r
- ConfigFormEntry->PortTitleToken,\r
- ConfigFormEntry->PortTitleHelpToken,\r
- EFI_IFR_FLAG_CALLBACK,\r
- (UINT16)(KEY_DEVICE_ENTRY_BASE + FormIndex),\r
- &UpdateData\r
+ HiiCreateGotoOpCode (\r
+ StartOpCodeHandle, // Container for dynamic created opcodes\r
+ FORMID_DEVICE_FORM, // Target Form ID\r
+ ConfigFormEntry->PortTitleToken, // Prompt text\r
+ ConfigFormEntry->PortTitleHelpToken, // Help text\r
+ EFI_IFR_FLAG_CALLBACK, // Question flag\r
+ (UINT16)(KEY_DEVICE_ENTRY_BASE + FormIndex) // Question ID\r
);\r
\r
FormIndex++;\r
}\r
\r
- IfrLibUpdateForm (\r
+ HiiUpdateForm (\r
mCallbackInfo->RegisteredHandle,\r
&mVendorGuid,\r
FORMID_MAIN_FORM,\r
- DEVICE_ENTRY_LABEL,\r
- FALSE,\r
- &UpdateData\r
+ StartOpCodeHandle, // Label DEVICE_ENTRY_LABEL\r
+ EndOpCodeHandle // LABEL_END\r
);\r
\r
- gBS->FreePool (UpdateData.Data);\r
+ HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+ HiiFreeOpCodeHandle (EndOpCodeHandle);\r
\r
return EFI_SUCCESS;\r
}\r
{\r
EFI_STATUS Status;\r
EFI_HII_DATABASE_PROTOCOL *HiiDatabase;\r
- EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
ISCSI_FORM_CALLBACK_INFO *CallbackInfo;\r
\r
Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **)&HiiDatabase);\r
return Status;\r
}\r
\r
- CallbackInfo = (ISCSI_FORM_CALLBACK_INFO *) AllocatePool (sizeof (ISCSI_FORM_CALLBACK_INFO));\r
+ CallbackInfo = (ISCSI_FORM_CALLBACK_INFO *) AllocateZeroPool (sizeof (ISCSI_FORM_CALLBACK_INFO));\r
if (CallbackInfo == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
}\r
\r
//\r
- // Create driver handle used by HII database\r
+ // Install Device Path Protocol and Config Access protocol to driver handle\r
//\r
- Status = HiiLibCreateHiiDriverHandle (&CallbackInfo->DriverHandle);\r
- if (EFI_ERROR (Status)) {\r
- FreePool(CallbackInfo);\r
- return Status;\r
- }\r
- \r
- //\r
- // Install Config Access protocol to driver handle\r
- //\r
- Status = gBS->InstallProtocolInterface (\r
+ Status = gBS->InstallMultipleProtocolInterfaces (\r
&CallbackInfo->DriverHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ &mIScsiHiiVendorDevicePath,\r
&gEfiHiiConfigAccessProtocolGuid,\r
- EFI_NATIVE_INTERFACE,\r
- &CallbackInfo->ConfigAccess\r
+ &CallbackInfo->ConfigAccess,\r
+ NULL\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
//\r
// Publish our HII data\r
//\r
- PackageList = HiiLibPreparePackageList (2, &mVendorGuid, IScsiDxeStrings, IScsiConfigDxeBin);\r
- ASSERT (PackageList != NULL);\r
- \r
- Status = HiiDatabase->NewPackageList (\r
- HiiDatabase,\r
- PackageList,\r
- CallbackInfo->DriverHandle,\r
- &CallbackInfo->RegisteredHandle\r
- );\r
- FreePool (PackageList);\r
- if (EFI_ERROR (Status)) {\r
+ CallbackInfo->RegisteredHandle = HiiAddPackages (\r
+ &mVendorGuid,\r
+ CallbackInfo->DriverHandle,\r
+ IScsiDxeStrings,\r
+ IScsiConfigDxeBin,\r
+ NULL\r
+ );\r
+ if (CallbackInfo->RegisteredHandle == NULL) {\r
FreePool(CallbackInfo);\r
- return Status;\r
+ return EFI_OUT_OF_RESOURCES;\r
}\r
\r
mCallbackInfo = CallbackInfo;\r
//\r
// Uninstall EFI_HII_CONFIG_ACCESS_PROTOCOL\r
//\r
- gBS->UninstallProtocolInterface (\r
- mCallbackInfo->DriverHandle,\r
- &gEfiHiiConfigAccessProtocolGuid,\r
- &mCallbackInfo->ConfigAccess\r
- );\r
- HiiLibDestroyHiiDriverHandle (mCallbackInfo->DriverHandle);\r
-\r
+ gBS->UninstallMultipleProtocolInterfaces (\r
+ mCallbackInfo->DriverHandle,\r
+ &gEfiDevicePathProtocolGuid,\r
+ &mIScsiHiiVendorDevicePath,\r
+ &gEfiHiiConfigAccessProtocolGuid,\r
+ &mCallbackInfo->ConfigAccess,\r
+ NULL\r
+ );\r
gBS->FreePool (mCallbackInfo);\r
\r
return EFI_SUCCESS;\r