]> git.proxmox.com Git - mirror_edk2.git/commitdiff
NetworkPkg: Record user configured TargetIP/Port in iBFT
authorYe Ting <ting.ye@intel.com>
Thu, 29 Sep 2016 05:52:05 +0000 (13:52 +0800)
committerYe Ting <ting.ye@intel.com>
Fri, 14 Oct 2016 02:54:26 +0000 (10:54 +0800)
Current ISCSI driver records redirected iSCSI targetIP/Port in iBFT
once redirection occurs, which removes the possibility of the OS
to reconnect to the configured IP for load balancing. The behavior
is not explicitly described in IBFT spec, though the MSFT expert
confirm we should record original user setting rather than
publish the redirected IP.

Thanks Sriram for reviewing and validating this patch in his test-bed.

Cc: Subramanian Sriram <sriram-s@hpe.com>
Cc: Fu Siyuan <siyuan.fu@intel.com>
Cc: Zhang Lubo <lubo.zhang@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ye Ting <ting.ye@intel.com>
Reviewed-by: Fu Siyuan <siyuan.fu@intel.com>
Reviewed-by: Subramanian Sriram <sriram-s@hpe.com>
NetworkPkg/IScsiDxe/IScsiDriver.c
NetworkPkg/IScsiDxe/IScsiMisc.c
NetworkPkg/IScsiDxe/IScsiMisc.h
NetworkPkg/IScsiDxe/IScsiProto.c

index c3ab2c92881d6041aceac0329732f3cfee2a6c0c..279f1c04967935d0e5c008ec07852e0bb74d4e05 100644 (file)
@@ -358,6 +358,7 @@ IScsiStart (
   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
@@ -701,6 +702,24 @@ IScsiStart (
       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
index a39c268d655a97ff1099e8b9cccfa49e62e560c2..64bb2ade7b0af8f0d9474bc5a81a0b77809750bf 100644 (file)
@@ -1188,11 +1188,11 @@ IScsiGetConfigData (
       );\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
index 1bcaeb8bcc815cbfb4033eecab359eebe341a5f1..912a8711fab3de1d7077868b91fba97c5686362a 100644 (file)
@@ -50,9 +50,14 @@ typedef struct _ISCSI_SESSION_CONFIG_NVDATA {
   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
index 50923654644194d77b2bc8cc77ea39d660dbc457..88d9bdd8f08c24077cfcf902a1bffbb13af80526 100644 (file)
@@ -1069,12 +1069,13 @@ IScsiUpdateTargetAddress (
   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
@@ -1082,7 +1083,8 @@ IScsiUpdateTargetAddress (
   }\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
@@ -1098,6 +1100,11 @@ IScsiUpdateTargetAddress (
       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
@@ -1122,19 +1129,25 @@ IScsiUpdateTargetAddress (
       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
@@ -1148,6 +1161,7 @@ IScsiUpdateTargetAddress (
     if (EFI_ERROR (Status)) {\r
       continue;\r
     } else {\r
+      NvData->RedirectFlag = TRUE;\r
       break;\r
     }\r
   }\r