Re: [edk2] [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT

2016-10-14 Thread Zhang, Lubo
Reviewed-by: Zhang Lubo 

-Original Message-
From: Ye, Ting 
Sent: Thursday, September 29, 2016 1:59 PM
To: edk2-devel@lists.01.org
Cc: Subramanian; Sriram ; Fu, Siyuan ; 
Zhang, Lubo 
Subject: [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT

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.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ye Ting 
Cc: Subramanian, Sriram 
Cc: Fu Siyuan 
Cc: Zhang Lubo 
---
 NetworkPkg/IScsiDxe/IScsiDriver.c | 19 +++
 NetworkPkg/IScsiDxe/IScsiMisc.c   | 10 +-
 NetworkPkg/IScsiDxe/IScsiMisc.h   |  7 ++-
 NetworkPkg/IScsiDxe/IScsiProto.c  | 36 +---
 4 files changed, 55 insertions(+), 17 deletions(-)

diff --git a/NetworkPkg/IScsiDxe/IScsiDriver.c 
b/NetworkPkg/IScsiDxe/IScsiDriver.c
index c3ab2c9..279f1c0 100644
--- a/NetworkPkg/IScsiDxe/IScsiDriver.c
+++ b/NetworkPkg/IScsiDxe/IScsiDriver.c
@@ -356,10 +356,11 @@ IScsiStart (
   CHAR16  MacString[ISCSI_MAX_MAC_STRING_LEN];
   BOOLEAN NeedUpdate;
   VOID*Interface;
   EFI_GUID*ProtocolGuid;
   UINT8   NetworkBootPolicy;
+  ISCSI_SESSION_CONFIG_NVDATA *NvData;
 
   //
   // Test to see if iSCSI driver supports the given controller.
   //
 
@@ -699,10 +700,28 @@ IScsiStart (
   Status = IScsiSessionLogin (Session);
 } else if (Status == EFI_NOT_READY) {
   Status = IScsiSessionReLogin (Session);
 }
 
+//
+// Restore the origial user setting which specifies the proxy/virtual 
iSCSI target to NV region.
+//
+NvData = >SessionConfigData;
+if (NvData->RedirectFlag) {
+  NvData->TargetPort = NvData->OriginalTargetPort;
+  CopyMem (>TargetIp, >OriginalTargetIp, sizeof 
(EFI_IP_ADDRESS));
+  NvData->RedirectFlag = FALSE;
+
+  gRT->SetVariable (
+ mPrivate->PortString,
+ ,
+ ISCSI_CONFIG_VAR_ATTR,
+ sizeof (ISCSI_ATTEMPT_CONFIG_NVDATA),
+ AttemptConfigData
+ );
+}
+
 if (EFI_ERROR (Status)) {
   //
   // In Single path mode, only the successful attempt will be recorded in 
iBFT;
   // in multi-path mode, all the attempt entries in MPIO will be recorded 
in iBFT.
   //
diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.c b/NetworkPkg/IScsiDxe/IScsiMisc.c 
index a39c268..64bb2ad 100644
--- a/NetworkPkg/IScsiDxe/IScsiMisc.c
+++ b/NetworkPkg/IScsiDxe/IScsiMisc.c
@@ -1186,15 +1186,15 @@ IScsiGetConfigData (
   MacString,
   (UINTN) AttemptConfigOrder[Index]
   );
 
 GetVariable2 (
- mPrivate->PortString,
- ,
- (VOID**),
- NULL
- );
+  mPrivate->PortString,
+  ,
+  (VOID**),
+  NULL
+  );
 
 if (AttemptConfigData == NULL) {
   continue;
 }
 
diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.h b/NetworkPkg/IScsiDxe/IScsiMisc.h 
index 1bcaeb8..912a871 100644
--- a/NetworkPkg/IScsiDxe/IScsiMisc.h
+++ b/NetworkPkg/IScsiDxe/IScsiMisc.h
@@ -48,13 +48,18 @@ typedef struct _ISCSI_SESSION_CONFIG_NVDATA {
   CHAR8 TargetName[ISCSI_NAME_MAX_SIZE];
   EFI_IP_ADDRESSTargetIp;
   UINT8 PrefixLength;
   UINT8 BootLun[8];
 
-  UINT16ConnectTimeout; ///< timout value in milliseconds
+  UINT16ConnectTimeout; ///< timout value in milliseconds.
   UINT8 ConnectRetryCount;
   UINT8 IsId[6];
+
+  BOOLEAN   RedirectFlag;
+  UINT16OriginalTargetPort; // The port of proxy/virtual 
target.
+  EFI_IP_ADDRESSOriginalTargetIp;   // The address of proxy/virtual 
target.
+  
 } ISCSI_SESSION_CONFIG_NVDATA;
 #pragma pack()
 
 /**
   Calculate the prefix length of the IPv4 subnet mask.
diff --git a/NetworkPkg/IScsiDxe/IScsiProto.c b/NetworkPkg/IScsiDxe/IScsiProto.c
index 5092365..88d9bdd 100644
--- a/NetworkPkg/IScsiDxe/IScsiProto.c
+++ b/NetworkPkg/IScsiDxe/IScsiProto.c
@@ -1067,24 +1067,26 @@ IScsiUpdateTargetAddress (
   IN OUT ISCSI_SESSION *Session,
   IN CHAR8 *Data,
   IN UINT32Len
   )
 {
-  LIST_ENTRY  *KeyValueList;
-  CHAR8   *TargetAddress;
-  CHAR8   *IpStr;
-  EFI_STATUS  Status;
-  UINTN   Number;
-  UINT8   IpMode;
+  LIST_ENTRY  

Re: [edk2] [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT

2016-10-13 Thread Fu, Siyuan
Reviewed-by: Fu Siyuan 


> -Original Message-
> From: Ye, Ting
> Sent: Thursday, September 29, 2016 1:59 PM
> To: edk2-devel@lists.01.org
> Cc: Subramanian; Sriram ; Fu, Siyuan
> ; Zhang, Lubo 
> Subject: [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT
> 
> 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.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Ye Ting 
> Cc: Subramanian, Sriram 
> Cc: Fu Siyuan 
> Cc: Zhang Lubo 
> ---
>  NetworkPkg/IScsiDxe/IScsiDriver.c | 19 +++
>  NetworkPkg/IScsiDxe/IScsiMisc.c   | 10 +-
>  NetworkPkg/IScsiDxe/IScsiMisc.h   |  7 ++-
>  NetworkPkg/IScsiDxe/IScsiProto.c  | 36 +-
> --
>  4 files changed, 55 insertions(+), 17 deletions(-)
> 
> diff --git a/NetworkPkg/IScsiDxe/IScsiDriver.c
> b/NetworkPkg/IScsiDxe/IScsiDriver.c
> index c3ab2c9..279f1c0 100644
> --- a/NetworkPkg/IScsiDxe/IScsiDriver.c
> +++ b/NetworkPkg/IScsiDxe/IScsiDriver.c
> @@ -356,10 +356,11 @@ IScsiStart (
>CHAR16  MacString[ISCSI_MAX_MAC_STRING_LEN];
>BOOLEAN NeedUpdate;
>VOID*Interface;
>EFI_GUID*ProtocolGuid;
>UINT8   NetworkBootPolicy;
> +  ISCSI_SESSION_CONFIG_NVDATA *NvData;
> 
>//
>// Test to see if iSCSI driver supports the given controller.
>//
> 
> @@ -699,10 +700,28 @@ IScsiStart (
>Status = IScsiSessionLogin (Session);
>  } else if (Status == EFI_NOT_READY) {
>Status = IScsiSessionReLogin (Session);
>  }
> 
> +//
> +// Restore the origial user setting which specifies the proxy/virtual
> iSCSI target to NV region.
> +//
> +NvData = >SessionConfigData;
> +if (NvData->RedirectFlag) {
> +  NvData->TargetPort = NvData->OriginalTargetPort;
> +  CopyMem (>TargetIp, >OriginalTargetIp, sizeof
> (EFI_IP_ADDRESS));
> +  NvData->RedirectFlag = FALSE;
> +
> +  gRT->SetVariable (
> + mPrivate->PortString,
> + ,
> + ISCSI_CONFIG_VAR_ATTR,
> + sizeof (ISCSI_ATTEMPT_CONFIG_NVDATA),
> + AttemptConfigData
> + );
> +}
> +
>  if (EFI_ERROR (Status)) {
>//
>// In Single path mode, only the successful attempt will be
> recorded in iBFT;
>// in multi-path mode, all the attempt entries in MPIO will be
> recorded in iBFT.
>//
> diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.c
> b/NetworkPkg/IScsiDxe/IScsiMisc.c
> index a39c268..64bb2ad 100644
> --- a/NetworkPkg/IScsiDxe/IScsiMisc.c
> +++ b/NetworkPkg/IScsiDxe/IScsiMisc.c
> @@ -1186,15 +1186,15 @@ IScsiGetConfigData (
>MacString,
>(UINTN) AttemptConfigOrder[Index]
>);
> 
>  GetVariable2 (
> - mPrivate->PortString,
> - ,
> - (VOID**),
> - NULL
> - );
> +  mPrivate->PortString,
> +  ,
> +  (VOID**),
> +  NULL
> +  );
> 
>  if (AttemptConfigData == NULL) {
>continue;
>  }
> 
> diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.h
> b/NetworkPkg/IScsiDxe/IScsiMisc.h
> index 1bcaeb8..912a871 100644
> --- a/NetworkPkg/IScsiDxe/IScsiMisc.h
> +++ b/NetworkPkg/IScsiDxe/IScsiMisc.h
> @@ -48,13 +48,18 @@ typedef struct _ISCSI_SESSION_CONFIG_NVDATA {
>CHAR8 TargetName[ISCSI_NAME_MAX_SIZE];
>EFI_IP_ADDRESSTargetIp;
>UINT8 PrefixLength;
>UINT8 BootLun[8];
> 
> -  UINT16ConnectTimeout; ///< timout value in milliseconds
> +  UINT16ConnectTimeout; ///< timout value in milliseconds.
>UINT8 ConnectRetryCount;
>UINT8 IsId[6];
> +
> +  BOOLEAN   RedirectFlag;
> +  UINT16OriginalTargetPort; // The port of proxy/virtual
> target.
> +  EFI_IP_ADDRESSOriginalTargetIp;   // The address of
> proxy/virtual target.
> +
>  } ISCSI_SESSION_CONFIG_NVDATA;
>  #pragma pack()
> 
>  /**
>Calculate the prefix length of the IPv4 subnet mask.
> diff --git a/NetworkPkg/IScsiDxe/IScsiProto.c
> b/NetworkPkg/IScsiDxe/IScsiProto.c
> index 5092365..88d9bdd 100644
> --- a/NetworkPkg/IScsiDxe/IScsiProto.c
> +++ b/NetworkPkg/IScsiDxe/IScsiProto.c
> @@ -1067,24 +1067,26 @@ IScsiUpdateTargetAddress (
>IN OUT ISCSI_SESSION *Session,
>IN CHAR8   

Re: [edk2] [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT

2016-10-09 Thread Ye, Ting
Hi All,

If there is no objection, I will check in the patch before 5 pm on Oct 14th, 
(UTC+08:00) Beijing Time. Let me know if you have any concern about that.

Best Regards,
Ye Ting


-Original Message-
From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Ye, Ting
Sent: Thursday, September 29, 2016 2:10 PM
To: edk2-devel@lists.01.org; Subramanian, Sriram (System FW, HP Servers) 
(srira...@hpe.com) <srira...@hpe.com>
Cc: Zhang, Lubo <lubo.zh...@intel.com>; Fu, Siyuan <siyuan...@intel.com>
Subject: Re: [edk2] [Patch] NetworkPkg: Record user configured TargetIP/Port in 
iBFT

Correct the email address for Sriram. 

For the EDKII iSCSI users: Since this patch introduces incompatible changes to 
iBFT, please help to validate the patch in your scenario to guarantee it does 
not break any existing functionalities.  This patch impacts the iSCSI boot 
using redirecting iSCSI target.

Best Regards,
Ye Ting

-Original Message-
From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Ye Ting
Sent: Thursday, September 29, 2016 1:59 PM
To: edk2-devel@lists.01.org
Cc: Zhang, Lubo <lubo.zh...@intel.com>; subraman...@ml01.01.org; Fu, Siyuan 
<siyuan...@intel.com>
Subject: [edk2] [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT

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.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ye Ting <ting...@intel.com>
Cc: Subramanian, Sriram <srira...@hpe.com>
Cc: Fu Siyuan <siyuan...@intel.com>
Cc: Zhang Lubo <lubo.zh...@intel.com>
---
 NetworkPkg/IScsiDxe/IScsiDriver.c | 19 +++
 NetworkPkg/IScsiDxe/IScsiMisc.c   | 10 +-
 NetworkPkg/IScsiDxe/IScsiMisc.h   |  7 ++-
 NetworkPkg/IScsiDxe/IScsiProto.c  | 36 +---
 4 files changed, 55 insertions(+), 17 deletions(-)

diff --git a/NetworkPkg/IScsiDxe/IScsiDriver.c 
b/NetworkPkg/IScsiDxe/IScsiDriver.c
index c3ab2c9..279f1c0 100644
--- a/NetworkPkg/IScsiDxe/IScsiDriver.c
+++ b/NetworkPkg/IScsiDxe/IScsiDriver.c
@@ -356,10 +356,11 @@ IScsiStart (
   CHAR16  MacString[ISCSI_MAX_MAC_STRING_LEN];
   BOOLEAN NeedUpdate;
   VOID*Interface;
   EFI_GUID*ProtocolGuid;
   UINT8   NetworkBootPolicy;
+  ISCSI_SESSION_CONFIG_NVDATA *NvData;
 
   //
   // Test to see if iSCSI driver supports the given controller.
   //
 
@@ -699,10 +700,28 @@ IScsiStart (
   Status = IScsiSessionLogin (Session);
 } else if (Status == EFI_NOT_READY) {
   Status = IScsiSessionReLogin (Session);
 }
 
+//
+// Restore the origial user setting which specifies the proxy/virtual 
iSCSI target to NV region.
+//
+NvData = >SessionConfigData;
+if (NvData->RedirectFlag) {
+  NvData->TargetPort = NvData->OriginalTargetPort;
+  CopyMem (>TargetIp, >OriginalTargetIp, sizeof 
(EFI_IP_ADDRESS));
+  NvData->RedirectFlag = FALSE;
+
+  gRT->SetVariable (
+ mPrivate->PortString,
+ ,
+ ISCSI_CONFIG_VAR_ATTR,
+ sizeof (ISCSI_ATTEMPT_CONFIG_NVDATA),
+ AttemptConfigData
+ );
+}
+
 if (EFI_ERROR (Status)) {
   //
   // In Single path mode, only the successful attempt will be recorded in 
iBFT;
   // in multi-path mode, all the attempt entries in MPIO will be recorded 
in iBFT.
   //
diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.c b/NetworkPkg/IScsiDxe/IScsiMisc.c 
index a39c268..64bb2ad 100644
--- a/NetworkPkg/IScsiDxe/IScsiMisc.c
+++ b/NetworkPkg/IScsiDxe/IScsiMisc.c
@@ -1186,15 +1186,15 @@ IScsiGetConfigData (
   MacString,
   (UINTN) AttemptConfigOrder[Index]
   );
 
 GetVariable2 (
- mPrivate->PortString,
- ,
- (VOID**),
- NULL
- );
+  mPrivate->PortString,
+  ,
+  (VOID**),
+  NULL
+  );
 
 if (AttemptConfigData == NULL) {
   continue;
 }
 
diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.h b/NetworkPkg/IScsiDxe/IScsiMisc.h 
index 1bcaeb8..912a871 100644
--- a/NetworkPkg/IScsiDxe/IScsiMisc.h
+++ b/NetworkPkg/IScsiDxe/IScsiMisc.h
@@ -48,13 +48,18 @@ typedef struct _ISCSI_SESSION_CONFIG_NVDATA {
   CHAR8 TargetName[ISCSI_NAME_MAX_SIZE];
   EFI_IP_ADDRESSTargetIp;
   UINT8 PrefixLength;
   UINT8 BootLun[8];
 
-  UINT16ConnectTimeout; ///< timout value in mil

Re: [edk2] [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT

2016-09-29 Thread Subramanian, Sriram (EG Servers Platform SW)
Reviewed-by: Sriram Subramanian 

-Original Message-
From: Ye Ting [mailto:ting...@intel.com] 
Sent: Thursday, September 29, 2016 11:29 AM
To: edk2-devel@lists.01.org
Cc: Subramanian@domain.invalid; Subramanian, Sriram (EG Servers Platform SW) 
; Fu Siyuan ; Zhang Lubo 

Subject: [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT

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.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ye Ting 
Cc: Subramanian, Sriram 
Cc: Fu Siyuan 
Cc: Zhang Lubo 
---
 NetworkPkg/IScsiDxe/IScsiDriver.c | 19 +++
 NetworkPkg/IScsiDxe/IScsiMisc.c   | 10 +-
 NetworkPkg/IScsiDxe/IScsiMisc.h   |  7 ++-
 NetworkPkg/IScsiDxe/IScsiProto.c  | 36 +---
 4 files changed, 55 insertions(+), 17 deletions(-)

diff --git a/NetworkPkg/IScsiDxe/IScsiDriver.c 
b/NetworkPkg/IScsiDxe/IScsiDriver.c
index c3ab2c9..279f1c0 100644
--- a/NetworkPkg/IScsiDxe/IScsiDriver.c
+++ b/NetworkPkg/IScsiDxe/IScsiDriver.c
@@ -356,10 +356,11 @@ IScsiStart (
   CHAR16  MacString[ISCSI_MAX_MAC_STRING_LEN];
   BOOLEAN NeedUpdate;
   VOID*Interface;
   EFI_GUID*ProtocolGuid;
   UINT8   NetworkBootPolicy;
+  ISCSI_SESSION_CONFIG_NVDATA *NvData;
 
   //
   // Test to see if iSCSI driver supports the given controller.
   //
 
@@ -699,10 +700,28 @@ IScsiStart (
   Status = IScsiSessionLogin (Session);
 } else if (Status == EFI_NOT_READY) {
   Status = IScsiSessionReLogin (Session);
 }
 
+//
+// Restore the origial user setting which specifies the proxy/virtual 
iSCSI target to NV region.
+//
+NvData = >SessionConfigData;
+if (NvData->RedirectFlag) {
+  NvData->TargetPort = NvData->OriginalTargetPort;
+  CopyMem (>TargetIp, >OriginalTargetIp, sizeof 
(EFI_IP_ADDRESS));
+  NvData->RedirectFlag = FALSE;
+
+  gRT->SetVariable (
+ mPrivate->PortString,
+ ,
+ ISCSI_CONFIG_VAR_ATTR,
+ sizeof (ISCSI_ATTEMPT_CONFIG_NVDATA),
+ AttemptConfigData
+ );
+}
+
 if (EFI_ERROR (Status)) {
   //
   // In Single path mode, only the successful attempt will be recorded in 
iBFT;
   // in multi-path mode, all the attempt entries in MPIO will be recorded 
in iBFT.
   //
diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.c b/NetworkPkg/IScsiDxe/IScsiMisc.c
index a39c268..64bb2ad 100644
--- a/NetworkPkg/IScsiDxe/IScsiMisc.c
+++ b/NetworkPkg/IScsiDxe/IScsiMisc.c
@@ -1186,15 +1186,15 @@ IScsiGetConfigData (
   MacString,
   (UINTN) AttemptConfigOrder[Index]
   );
 
 GetVariable2 (
- mPrivate->PortString,
- ,
- (VOID**),
- NULL
- );
+  mPrivate->PortString,
+  ,
+  (VOID**),
+  NULL
+  );
 
 if (AttemptConfigData == NULL) {
   continue;
 }
 
diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.h b/NetworkPkg/IScsiDxe/IScsiMisc.h
index 1bcaeb8..912a871 100644
--- a/NetworkPkg/IScsiDxe/IScsiMisc.h
+++ b/NetworkPkg/IScsiDxe/IScsiMisc.h
@@ -48,13 +48,18 @@ typedef struct _ISCSI_SESSION_CONFIG_NVDATA {
   CHAR8 TargetName[ISCSI_NAME_MAX_SIZE];
   EFI_IP_ADDRESSTargetIp;
   UINT8 PrefixLength;
   UINT8 BootLun[8];
 
-  UINT16ConnectTimeout; ///< timout value in milliseconds
+  UINT16ConnectTimeout; ///< timout value in milliseconds.
   UINT8 ConnectRetryCount;
   UINT8 IsId[6];
+
+  BOOLEAN   RedirectFlag;
+  UINT16OriginalTargetPort; // The port of proxy/virtual 
target.
+  EFI_IP_ADDRESSOriginalTargetIp;   // The address of proxy/virtual 
target.
+  
 } ISCSI_SESSION_CONFIG_NVDATA;
 #pragma pack()
 
 /**
   Calculate the prefix length of the IPv4 subnet mask.
diff --git a/NetworkPkg/IScsiDxe/IScsiProto.c b/NetworkPkg/IScsiDxe/IScsiProto.c
index 5092365..88d9bdd 100644
--- a/NetworkPkg/IScsiDxe/IScsiProto.c
+++ b/NetworkPkg/IScsiDxe/IScsiProto.c
@@ -1067,24 +1067,26 @@ IScsiUpdateTargetAddress (
   IN OUT ISCSI_SESSION *Session,
   IN CHAR8 *Data,
   IN UINT32Len
   )
 {
-  LIST_ENTRY  *KeyValueList;
-  CHAR8   *TargetAddress;
-  CHAR8   *IpStr;
-  EFI_STATUS  Status;

Re: [edk2] [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT

2016-09-29 Thread Ye, Ting
Correct the email address for Sriram. 

For the EDKII iSCSI users: Since this patch introduces incompatible changes to 
iBFT, please help to validate the patch in your scenario to guarantee it does 
not break any existing functionalities.  This patch impacts the iSCSI boot 
using redirecting iSCSI target.

Best Regards,
Ye Ting

-Original Message-
From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Ye Ting
Sent: Thursday, September 29, 2016 1:59 PM
To: edk2-devel@lists.01.org
Cc: Zhang, Lubo <lubo.zh...@intel.com>; subraman...@ml01.01.org; Fu, Siyuan 
<siyuan...@intel.com>
Subject: [edk2] [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT

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.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ye Ting <ting...@intel.com>
Cc: Subramanian, Sriram <srira...@hpe.com>
Cc: Fu Siyuan <siyuan...@intel.com>
Cc: Zhang Lubo <lubo.zh...@intel.com>
---
 NetworkPkg/IScsiDxe/IScsiDriver.c | 19 +++
 NetworkPkg/IScsiDxe/IScsiMisc.c   | 10 +-
 NetworkPkg/IScsiDxe/IScsiMisc.h   |  7 ++-
 NetworkPkg/IScsiDxe/IScsiProto.c  | 36 +---
 4 files changed, 55 insertions(+), 17 deletions(-)

diff --git a/NetworkPkg/IScsiDxe/IScsiDriver.c 
b/NetworkPkg/IScsiDxe/IScsiDriver.c
index c3ab2c9..279f1c0 100644
--- a/NetworkPkg/IScsiDxe/IScsiDriver.c
+++ b/NetworkPkg/IScsiDxe/IScsiDriver.c
@@ -356,10 +356,11 @@ IScsiStart (
   CHAR16  MacString[ISCSI_MAX_MAC_STRING_LEN];
   BOOLEAN NeedUpdate;
   VOID*Interface;
   EFI_GUID*ProtocolGuid;
   UINT8   NetworkBootPolicy;
+  ISCSI_SESSION_CONFIG_NVDATA *NvData;
 
   //
   // Test to see if iSCSI driver supports the given controller.
   //
 
@@ -699,10 +700,28 @@ IScsiStart (
   Status = IScsiSessionLogin (Session);
 } else if (Status == EFI_NOT_READY) {
   Status = IScsiSessionReLogin (Session);
 }
 
+//
+// Restore the origial user setting which specifies the proxy/virtual 
iSCSI target to NV region.
+//
+NvData = >SessionConfigData;
+if (NvData->RedirectFlag) {
+  NvData->TargetPort = NvData->OriginalTargetPort;
+  CopyMem (>TargetIp, >OriginalTargetIp, sizeof 
(EFI_IP_ADDRESS));
+  NvData->RedirectFlag = FALSE;
+
+  gRT->SetVariable (
+ mPrivate->PortString,
+ ,
+ ISCSI_CONFIG_VAR_ATTR,
+ sizeof (ISCSI_ATTEMPT_CONFIG_NVDATA),
+ AttemptConfigData
+ );
+}
+
 if (EFI_ERROR (Status)) {
   //
   // In Single path mode, only the successful attempt will be recorded in 
iBFT;
   // in multi-path mode, all the attempt entries in MPIO will be recorded 
in iBFT.
   //
diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.c b/NetworkPkg/IScsiDxe/IScsiMisc.c 
index a39c268..64bb2ad 100644
--- a/NetworkPkg/IScsiDxe/IScsiMisc.c
+++ b/NetworkPkg/IScsiDxe/IScsiMisc.c
@@ -1186,15 +1186,15 @@ IScsiGetConfigData (
   MacString,
   (UINTN) AttemptConfigOrder[Index]
   );
 
 GetVariable2 (
- mPrivate->PortString,
- ,
- (VOID**),
- NULL
- );
+  mPrivate->PortString,
+  ,
+  (VOID**),
+  NULL
+  );
 
 if (AttemptConfigData == NULL) {
   continue;
 }
 
diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.h b/NetworkPkg/IScsiDxe/IScsiMisc.h 
index 1bcaeb8..912a871 100644
--- a/NetworkPkg/IScsiDxe/IScsiMisc.h
+++ b/NetworkPkg/IScsiDxe/IScsiMisc.h
@@ -48,13 +48,18 @@ typedef struct _ISCSI_SESSION_CONFIG_NVDATA {
   CHAR8 TargetName[ISCSI_NAME_MAX_SIZE];
   EFI_IP_ADDRESSTargetIp;
   UINT8 PrefixLength;
   UINT8 BootLun[8];
 
-  UINT16ConnectTimeout; ///< timout value in milliseconds
+  UINT16ConnectTimeout; ///< timout value in milliseconds.
   UINT8 ConnectRetryCount;
   UINT8 IsId[6];
+
+  BOOLEAN   RedirectFlag;
+  UINT16OriginalTargetPort; // The port of proxy/virtual 
target.
+  EFI_IP_ADDRESSOriginalTargetIp;   // The address of proxy/virtual 
target.
+  
 } ISCSI_SESSION_CONFIG_NVDATA;
 #pragma pack()
 
 /**
   Calculate the prefix length of the IPv4 subnet mask.
diff --git a/NetworkPkg/IScsiDxe/IScsiProto.c b/NetworkPkg/IScsiDxe/IScsiProto.c
index 5092365..88d9bdd 100644
--- a/NetworkPkg/IScsiD

[edk2] [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT

2016-09-29 Thread Ye Ting
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.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ye Ting 
Cc: Subramanian, Sriram 
Cc: Fu Siyuan 
Cc: Zhang Lubo 
---
 NetworkPkg/IScsiDxe/IScsiDriver.c | 19 +++
 NetworkPkg/IScsiDxe/IScsiMisc.c   | 10 +-
 NetworkPkg/IScsiDxe/IScsiMisc.h   |  7 ++-
 NetworkPkg/IScsiDxe/IScsiProto.c  | 36 +---
 4 files changed, 55 insertions(+), 17 deletions(-)

diff --git a/NetworkPkg/IScsiDxe/IScsiDriver.c 
b/NetworkPkg/IScsiDxe/IScsiDriver.c
index c3ab2c9..279f1c0 100644
--- a/NetworkPkg/IScsiDxe/IScsiDriver.c
+++ b/NetworkPkg/IScsiDxe/IScsiDriver.c
@@ -356,10 +356,11 @@ IScsiStart (
   CHAR16  MacString[ISCSI_MAX_MAC_STRING_LEN];
   BOOLEAN NeedUpdate;
   VOID*Interface;
   EFI_GUID*ProtocolGuid;
   UINT8   NetworkBootPolicy;
+  ISCSI_SESSION_CONFIG_NVDATA *NvData;
 
   //
   // Test to see if iSCSI driver supports the given controller.
   //
 
@@ -699,10 +700,28 @@ IScsiStart (
   Status = IScsiSessionLogin (Session);
 } else if (Status == EFI_NOT_READY) {
   Status = IScsiSessionReLogin (Session);
 }
 
+//
+// Restore the origial user setting which specifies the proxy/virtual 
iSCSI target to NV region.
+//
+NvData = >SessionConfigData;
+if (NvData->RedirectFlag) {
+  NvData->TargetPort = NvData->OriginalTargetPort;
+  CopyMem (>TargetIp, >OriginalTargetIp, sizeof 
(EFI_IP_ADDRESS));
+  NvData->RedirectFlag = FALSE;
+
+  gRT->SetVariable (
+ mPrivate->PortString,
+ ,
+ ISCSI_CONFIG_VAR_ATTR,
+ sizeof (ISCSI_ATTEMPT_CONFIG_NVDATA),
+ AttemptConfigData
+ );
+}
+
 if (EFI_ERROR (Status)) {
   //
   // In Single path mode, only the successful attempt will be recorded in 
iBFT;
   // in multi-path mode, all the attempt entries in MPIO will be recorded 
in iBFT.
   //
diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.c b/NetworkPkg/IScsiDxe/IScsiMisc.c
index a39c268..64bb2ad 100644
--- a/NetworkPkg/IScsiDxe/IScsiMisc.c
+++ b/NetworkPkg/IScsiDxe/IScsiMisc.c
@@ -1186,15 +1186,15 @@ IScsiGetConfigData (
   MacString,
   (UINTN) AttemptConfigOrder[Index]
   );
 
 GetVariable2 (
- mPrivate->PortString,
- ,
- (VOID**),
- NULL
- );
+  mPrivate->PortString,
+  ,
+  (VOID**),
+  NULL
+  );
 
 if (AttemptConfigData == NULL) {
   continue;
 }
 
diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.h b/NetworkPkg/IScsiDxe/IScsiMisc.h
index 1bcaeb8..912a871 100644
--- a/NetworkPkg/IScsiDxe/IScsiMisc.h
+++ b/NetworkPkg/IScsiDxe/IScsiMisc.h
@@ -48,13 +48,18 @@ typedef struct _ISCSI_SESSION_CONFIG_NVDATA {
   CHAR8 TargetName[ISCSI_NAME_MAX_SIZE];
   EFI_IP_ADDRESSTargetIp;
   UINT8 PrefixLength;
   UINT8 BootLun[8];
 
-  UINT16ConnectTimeout; ///< timout value in milliseconds
+  UINT16ConnectTimeout; ///< timout value in milliseconds.
   UINT8 ConnectRetryCount;
   UINT8 IsId[6];
+
+  BOOLEAN   RedirectFlag;
+  UINT16OriginalTargetPort; // The port of proxy/virtual 
target.
+  EFI_IP_ADDRESSOriginalTargetIp;   // The address of proxy/virtual 
target.
+  
 } ISCSI_SESSION_CONFIG_NVDATA;
 #pragma pack()
 
 /**
   Calculate the prefix length of the IPv4 subnet mask.
diff --git a/NetworkPkg/IScsiDxe/IScsiProto.c b/NetworkPkg/IScsiDxe/IScsiProto.c
index 5092365..88d9bdd 100644
--- a/NetworkPkg/IScsiDxe/IScsiProto.c
+++ b/NetworkPkg/IScsiDxe/IScsiProto.c
@@ -1067,24 +1067,26 @@ IScsiUpdateTargetAddress (
   IN OUT ISCSI_SESSION *Session,
   IN CHAR8 *Data,
   IN UINT32Len
   )
 {
-  LIST_ENTRY  *KeyValueList;
-  CHAR8   *TargetAddress;
-  CHAR8   *IpStr;
-  EFI_STATUS  Status;
-  UINTN   Number;
-  UINT8   IpMode;
+  LIST_ENTRY   *KeyValueList;
+  CHAR8*TargetAddress;
+  CHAR8*IpStr;
+  EFI_STATUS   Status;
+  UINTNNumber;
+  UINT8IpMode;
+  ISCSI_SESSION_CONFIG_NVDATA  *NvData;
 
   KeyValueList = IScsiBuildKeyValueList (Data, Len);
   if (KeyValueList ==