VOID *Interface;\r
EFI_GUID *ProtocolGuid;\r
UINT8 NetworkBootPolicy;\r
+ ISCSI_SESSION_CONFIG_NVDATA *NvData;\r
\r
//\r
// Test to see if iSCSI driver supports the given controller.\r
Status = IScsiSessionReLogin (Session);\r
}\r
\r
+ //\r
+ // Restore the origial user setting which specifies the proxy/virtual iSCSI target to NV region.\r
+ //\r
+ NvData = &AttemptConfigData->SessionConfigData;\r
+ if (NvData->RedirectFlag) {\r
+ NvData->TargetPort = NvData->OriginalTargetPort;\r
+ CopyMem (&NvData->TargetIp, &NvData->OriginalTargetIp, sizeof (EFI_IP_ADDRESS));\r
+ NvData->RedirectFlag = FALSE;\r
+\r
+ gRT->SetVariable (\r
+ mPrivate->PortString,\r
+ &gEfiIScsiInitiatorNameProtocolGuid,\r
+ ISCSI_CONFIG_VAR_ATTR,\r
+ sizeof (ISCSI_ATTEMPT_CONFIG_NVDATA),\r
+ AttemptConfigData\r
+ );\r
+ }\r
+\r
if (EFI_ERROR (Status)) {\r
//\r
// In Single path mode, only the successful attempt will be recorded in iBFT;\r
);\r
\r
GetVariable2 (\r
- mPrivate->PortString,\r
- &gEfiIScsiInitiatorNameProtocolGuid,\r
- (VOID**)&AttemptConfigData,\r
- NULL\r
- );\r
+ mPrivate->PortString,\r
+ &gEfiIScsiInitiatorNameProtocolGuid,\r
+ (VOID**)&AttemptConfigData,\r
+ NULL\r
+ );\r
\r
if (AttemptConfigData == NULL) {\r
continue;\r
UINT8 PrefixLength;\r
UINT8 BootLun[8];\r
\r
- UINT16 ConnectTimeout; ///< timout value in milliseconds\r
+ UINT16 ConnectTimeout; ///< timout value in milliseconds.\r
UINT8 ConnectRetryCount;\r
UINT8 IsId[6];\r
+\r
+ BOOLEAN RedirectFlag;\r
+ UINT16 OriginalTargetPort; // The port of proxy/virtual target.\r
+ EFI_IP_ADDRESS OriginalTargetIp; // The address of proxy/virtual target.\r
+ \r
} ISCSI_SESSION_CONFIG_NVDATA;\r
#pragma pack()\r
\r
IN UINT32 Len\r
)\r
{\r
- LIST_ENTRY *KeyValueList;\r
- CHAR8 *TargetAddress;\r
- CHAR8 *IpStr;\r
- EFI_STATUS Status;\r
- UINTN Number;\r
- UINT8 IpMode;\r
+ LIST_ENTRY *KeyValueList;\r
+ CHAR8 *TargetAddress;\r
+ CHAR8 *IpStr;\r
+ EFI_STATUS Status;\r
+ UINTN Number;\r
+ UINT8 IpMode;\r
+ ISCSI_SESSION_CONFIG_NVDATA *NvData;\r
\r
KeyValueList = IScsiBuildKeyValueList (Data, Len);\r
if (KeyValueList == NULL) {\r
}\r
\r
Status = EFI_NOT_FOUND;\r
-\r
+ NvData = &Session->ConfigData->SessionConfigData;\r
+ \r
while (TRUE) {\r
TargetAddress = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ADDRESS);\r
if (TargetAddress == NULL) {\r
continue;\r
}\r
\r
+ //\r
+ // Save the origial user setting which specifies the proxy/virtual iSCSI target.\r
+ //\r
+ NvData->OriginalTargetPort = NvData->TargetPort;\r
+\r
IpStr = TargetAddress;\r
\r
while ((*TargetAddress != 0) && (*TargetAddress != ':') && (*TargetAddress != ',')) {\r
if (Number > 0xFFFF) {\r
continue;\r
} else {\r
- Session->ConfigData->SessionConfigData.TargetPort = (UINT16) Number;\r
+ NvData->TargetPort = (UINT16) Number;\r
}\r
} else {\r
//\r
// The string only contains the IPv4 address. Use the well-known port.\r
//\r
- Session->ConfigData->SessionConfigData.TargetPort = ISCSI_WELL_KNOWN_PORT;\r
+ NvData->TargetPort = ISCSI_WELL_KNOWN_PORT;\r
}\r
+\r
+ //\r
+ // Save the origial user setting which specifies the proxy/virtual iSCSI target.\r
+ // \r
+ CopyMem (&NvData->OriginalTargetIp, &NvData->TargetIp, sizeof (EFI_IP_ADDRESS));\r
+\r
//\r
// Update the target IP address.\r
//\r
- if (Session->ConfigData->SessionConfigData.IpMode < IP_MODE_AUTOCONFIG) {\r
- IpMode = Session->ConfigData->SessionConfigData.IpMode;\r
+ if (NvData->IpMode < IP_MODE_AUTOCONFIG) {\r
+ IpMode = NvData->IpMode;\r
} else {\r
IpMode = Session->ConfigData->AutoConfigureMode;\r
}\r
if (EFI_ERROR (Status)) {\r
continue;\r
} else {\r
+ NvData->RedirectFlag = TRUE;\r
break;\r
}\r
}\r