/** @file\r
Helper functions for configuring or getting the parameters relating to iSCSI.\r
\r
-Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
\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
(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
+ IP4_ISCSI_CONFIG_GUID\r
},\r
{\r
END_DEVICE_PATH_TYPE,\r
if (StrLen (IsIdStr) != 6) {\r
UnicodeSPrint (\r
PortString,\r
- (UINTN) ISCSI_NAME_IFR_MAX_SIZE,\r
+ (UINTN) sizeof (PortString),\r
L"Error! Input is incorrect, please input 6 hex numbers!\n"\r
);\r
\r
DataSize = 0;\r
Status = gRT->GetVariable (\r
L"iSCSIDeviceList",\r
- &mVendorGuid,\r
+ &gIp4IScsiConfigGuid,\r
NULL,\r
&DataSize,\r
NULL\r
);\r
if (Status == EFI_BUFFER_TOO_SMALL) {\r
DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DataSize);\r
+ ASSERT (DeviceList != NULL);\r
\r
gRT->GetVariable (\r
L"iSCSIDeviceList",\r
- &mVendorGuid,\r
+ &gIp4IScsiConfigGuid,\r
NULL,\r
&DataSize,\r
DeviceList\r
CurMacInfo = &DeviceList->MacInfo[Index];\r
IScsiMacAddrToStr (&CurMacInfo->Mac, CurMacInfo->Len, CurMacInfo->VlanId, MacString);\r
gRT->SetVariable (MacString, &gEfiIScsiInitiatorNameProtocolGuid, 0, 0, NULL);\r
- gRT->SetVariable (MacString, &mIScsiCHAPAuthInfoGuid, 0, 0, NULL);\r
+ gRT->SetVariable (MacString, &gIScsiCHAPAuthInfoGuid, 0, 0, NULL);\r
}\r
\r
FreePool (DeviceList);\r
//\r
DeviceListSize = sizeof (ISCSI_DEVICE_LIST) + (NumHandles - 1) * sizeof (ISCSI_MAC_INFO);\r
DeviceList = (ISCSI_DEVICE_LIST *) AllocatePool (DeviceListSize);\r
+ ASSERT (DeviceList != NULL);\r
DeviceList->NumDevice = (UINT8) NumHandles;\r
\r
for (Index = 0; Index < NumHandles; Index++) {\r
\r
gRT->SetVariable (\r
L"iSCSIDeviceList",\r
- &mVendorGuid,\r
+ &gIp4IScsiConfigGuid,\r
ISCSI_CONFIG_VAR_ATTR,\r
DeviceListSize,\r
DeviceList\r
}\r
\r
*Progress = Request;\r
- if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, &mVendorGuid, mVendorStorageName)) {\r
+ if ((Request != NULL) && !HiiIsConfigHdrMatch (Request, &gIp4IScsiConfigGuid, mVendorStorageName)) {\r
return EFI_NOT_FOUND;\r
}\r
\r
// Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
// followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
//\r
- ConfigRequestHdr = HiiConstructConfigHdr (&mVendorGuid, mVendorStorageName, Private->DriverHandle);\r
+ ConfigRequestHdr = HiiConstructConfigHdr (&gIp4IScsiConfigGuid, mVendorStorageName, Private->DriverHandle);\r
Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
ConfigRequest = AllocateZeroPool (Size);\r
ASSERT (ConfigRequest != NULL);\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
+ if (!HiiIsConfigHdrMatch (Configuration, &gIp4IScsiConfigGuid, mVendorStorageName)) {\r
*Progress = Configuration;\r
return EFI_NOT_FOUND;\r
}\r
EFI_STATUS Status;\r
EFI_INPUT_KEY Key;\r
\r
+ if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);\r
+ //\r
+ // Retrieve uncommitted data from Browser\r
+ //\r
+ IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA));\r
+ ASSERT (IfrNvData != NULL);\r
+ if (!HiiGetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData)) {\r
+ FreePool (IfrNvData);\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ Status = EFI_SUCCESS;\r
+\r
if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
- Private = ISCSI_FORM_CALLBACK_INFO_FROM_FORM_CALLBACK (This);\r
- //\r
- // Retrive uncommitted data from Browser\r
- //\r
- IfrNvData = AllocateZeroPool (sizeof (ISCSI_CONFIG_IFR_NVDATA));\r
- ASSERT (IfrNvData != NULL);\r
- if (!HiiGetBrowserData (&mVendorGuid, mVendorStorageName, sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData)) {\r
- FreePool (IfrNvData);\r
- return EFI_NOT_FOUND;\r
- }\r
- Status = EFI_SUCCESS;\r
+ if ((QuestionId >= KEY_DEVICE_ENTRY_BASE) && (QuestionId < (mNumberOfIScsiDevices + KEY_DEVICE_ENTRY_BASE))) {\r
+ //\r
+ // In case goto the device configuration form, update the device form title.\r
+ //\r
+ ConfigFormEntry = IScsiGetConfigFormEntryByIndex ((UINT32) (QuestionId - KEY_DEVICE_ENTRY_BASE));\r
+ ASSERT (ConfigFormEntry != NULL);\r
\r
- switch (QuestionId) {\r
+ UnicodeSPrint (PortString, (UINTN) sizeof (PortString), L"Port %s", ConfigFormEntry->MacString);\r
+ DeviceFormTitleToken = (EFI_STRING_ID) STR_ISCSI_DEVICE_FORM_TITLE;\r
+ HiiSetString (Private->RegisteredHandle, DeviceFormTitleToken, PortString, NULL);\r
+\r
+ IScsiConvertDeviceConfigDataToIfrNvData (ConfigFormEntry, IfrNvData);\r
+\r
+ Private->Current = ConfigFormEntry;\r
+ }\r
+ } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
+ switch (QuestionId) { \r
case KEY_INITIATOR_NAME:\r
IScsiUnicodeStrToAsciiStr (IfrNvData->InitiatorName, IScsiName);\r
BufferSize = AsciiStrSize (IScsiName);\r
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL);\r
}\r
\r
+ *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
break;\r
\r
case KEY_LOCAL_IP:\r
IScsiUnicodeStrToAsciiStr (IfrNvData->LocalIp, Ip4String);\r
Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);\r
- if (EFI_ERROR (Status) || !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {\r
+ if (EFI_ERROR (Status) || \r
+ ((Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) && \r
+ !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr)))) {\r
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);\r
Status = EFI_INVALID_PARAMETER;\r
} else {\r
case KEY_GATE_WAY:\r
IScsiUnicodeStrToAsciiStr (IfrNvData->Gateway, Ip4String);\r
Status = IScsiAsciiStrToIp (Ip4String, &Gateway.v4);\r
- if (EFI_ERROR (Status) || ((Gateway.Addr[0] != 0) && !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), 0))) {\r
+ if (EFI_ERROR (Status) || \r
+ ((Gateway.Addr[0] != 0) && \r
+ (Private->Current->SessionConfigData.SubnetMask.Addr[0] != 0) && \r
+ !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), NTOHL(*(UINT32*)Private->Current->SessionConfigData.SubnetMask.Addr)))) {\r
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Gateway!", NULL);\r
Status = EFI_INVALID_PARAMETER;\r
} else {\r
case KEY_TARGET_IP:\r
IScsiUnicodeStrToAsciiStr (IfrNvData->TargetIp, Ip4String);\r
Status = IScsiAsciiStrToIp (Ip4String, &HostIp.v4);\r
- if (EFI_ERROR (Status) || !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {\r
+ if (EFI_ERROR (Status) || IP4_IS_LOCAL_BROADCAST (EFI_NTOHL(HostIp.v4)) || IP4_IS_UNSPECIFIED (EFI_NTOHL(HostIp.v4))) {\r
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);\r
Status = EFI_INVALID_PARAMETER;\r
} else {\r
if (EFI_ERROR (Status)) {\r
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid iSCSI Name!", NULL);\r
} else {\r
- AsciiStrCpy (Private->Current->SessionConfigData.TargetName, IScsiName);\r
+ AsciiStrCpyS (Private->Current->SessionConfigData.TargetName, ISCSI_NAME_MAX_SIZE, IScsiName);\r
}\r
\r
break;\r
//\r
if (!Private->Current->SessionConfigData.TargetInfoFromDhcp) {\r
CopyMem (&HostIp.v4, &Private->Current->SessionConfigData.TargetIp, sizeof (HostIp.v4));\r
- if (!NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {\r
+ if (IP4_IS_UNSPECIFIED (NTOHL (HostIp.Addr[0])) || IP4_IS_LOCAL_BROADCAST (NTOHL (HostIp.Addr[0]))) {\r
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Target IP is invalid!", NULL);\r
Status = EFI_INVALID_PARAMETER;\r
break;\r
}\r
+\r
+ //\r
+ // Validate iSCSI target name configuration again:\r
+ // The format of iSCSI target name is already verified when user input the name;\r
+ // here we only check the case user does not input the name.\r
+ //\r
+ if (Private->Current->SessionConfigData.TargetName[0] == '\0') {\r
+ CreatePopUp (\r
+ EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+ &Key,\r
+ L"iSCSI target name is NULL!",\r
+ NULL\r
+ );\r
+ Status = EFI_INVALID_PARAMETER;\r
+ break;\r
+ }\r
+\r
}\r
\r
if (IfrNvData->CHAPType != ISCSI_CHAP_NONE) {\r
BufferSize = sizeof (Private->Current->AuthConfigData);\r
gRT->SetVariable (\r
Private->Current->MacString,\r
- &mIScsiCHAPAuthInfoGuid,\r
+ &gIScsiCHAPAuthInfoGuid,\r
ISCSI_CONFIG_VAR_ATTR,\r
BufferSize,\r
&Private->Current->AuthConfigData\r
break;\r
\r
default:\r
- if ((QuestionId >= KEY_DEVICE_ENTRY_BASE) && (QuestionId < (mNumberOfIScsiDevices + KEY_DEVICE_ENTRY_BASE))) {\r
- //\r
- // In case goto the device configuration form, update the device form title.\r
- //\r
- ConfigFormEntry = IScsiGetConfigFormEntryByIndex ((UINT32) (QuestionId - KEY_DEVICE_ENTRY_BASE));\r
- ASSERT (ConfigFormEntry != NULL);\r
-\r
- UnicodeSPrint (PortString, (UINTN) 128, L"Port %s", ConfigFormEntry->MacString);\r
- DeviceFormTitleToken = (EFI_STRING_ID) STR_ISCSI_DEVICE_FORM_TITLE;\r
- HiiSetString (Private->RegisteredHandle, DeviceFormTitleToken, PortString, NULL);\r
-\r
- IScsiConvertDeviceConfigDataToIfrNvData (ConfigFormEntry, IfrNvData);\r
-\r
- Private->Current = ConfigFormEntry;\r
- }\r
-\r
break;\r
}\r
-\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // Pass changed uncommitted data back to Form Browser\r
- //\r
- HiiSetBrowserData (&mVendorGuid, mVendorStorageName, sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData, NULL);\r
- }\r
- \r
- FreePool (IfrNvData);\r
-\r
- return Status;\r
}\r
\r
- //\r
- // All other action return unsupported.\r
- //\r
- return EFI_UNSUPPORTED;\r
+ if (!EFI_ERROR (Status)) {\r
+ //\r
+ // Pass changed uncommitted data back to Form Browser\r
+ //\r
+ HiiSetBrowserData (&gIp4IScsiConfigGuid, mVendorStorageName, sizeof (ISCSI_CONFIG_IFR_NVDATA), (UINT8 *) IfrNvData, NULL);\r
+ }\r
+ \r
+ FreePool (IfrNvData);\r
+ \r
+ return Status;\r
}\r
\r
/**\r
BufferSize = sizeof (ConfigFormEntry->AuthConfigData);\r
Status = gRT->GetVariable (\r
ConfigFormEntry->MacString,\r
- &mIScsiCHAPAuthInfoGuid,\r
+ &gIScsiCHAPAuthInfoGuid,\r
NULL,\r
&BufferSize,\r
&ConfigFormEntry->AuthConfigData\r
//\r
// Compose the Port string and create a new EFI_STRING_ID.\r
//\r
- UnicodeSPrint (PortString, 128, L"Port %s", ConfigFormEntry->MacString);\r
+ UnicodeSPrint (PortString, sizeof (PortString), L"Port %s", ConfigFormEntry->MacString);\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
+ UnicodeSPrint (PortString, sizeof (PortString), L"Set the iSCSI parameters on port %s", ConfigFormEntry->MacString);\r
ConfigFormEntry->PortTitleHelpToken = HiiSetString (mCallbackInfo->RegisteredHandle, 0, PortString, NULL);\r
\r
InsertTailList (&mIScsiConfigFormList, &ConfigFormEntry->Link);\r
\r
HiiUpdateForm (\r
mCallbackInfo->RegisteredHandle,\r
- &mVendorGuid,\r
+ &gIp4IScsiConfigGuid,\r
FORMID_MAIN_FORM,\r
StartOpCodeHandle, // Label DEVICE_ENTRY_LABEL\r
EndOpCodeHandle // LABEL_END\r
// Publish our HII data\r
//\r
CallbackInfo->RegisteredHandle = HiiAddPackages (\r
- &mVendorGuid,\r
+ &gIp4IScsiConfigGuid,\r
CallbackInfo->DriverHandle,\r
- IScsiDxeStrings,\r
+ IScsi4DxeStrings,\r
IScsiConfigDxeBin,\r
NULL\r
);\r