From: "Fu, Siyuan" <siyuan.fu@intel.com>
To: "Ye, Ting" <ting.ye@intel.com>,
"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: Sriram <sriram-s@hpe.com>, "Zhang, Lubo" <lubo.zhang@intel.com>
Subject: Re: [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT
Date: Fri, 14 Oct 2016 02:11:40 +0000 [thread overview]
Message-ID: <B1FF2E9001CE9041BD10B825821D5BC58A82AF6F@shsmsx102.ccr.corp.intel.com> (raw)
In-Reply-To: <20160929055911.22972-1-ting.ye@intel.com>
Reviewed-by: Fu Siyuan <siyuan.fu@intel.com>
> -----Original Message-----
> From: Ye, Ting
> Sent: Thursday, September 29, 2016 1:59 PM
> To: edk2-devel@lists.01.org
> Cc: Subramanian; Sriram <sriram-s@hpe.com>; Fu, Siyuan
> <siyuan.fu@intel.com>; Zhang, Lubo <lubo.zhang@intel.com>
> 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 <ting.ye@intel.com>
> Cc: Subramanian, Sriram <sriram-s@hpe.com>
> Cc: Fu Siyuan <siyuan.fu@intel.com>
> Cc: Zhang Lubo <lubo.zhang@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 = &AttemptConfigData->SessionConfigData;
> + if (NvData->RedirectFlag) {
> + NvData->TargetPort = NvData->OriginalTargetPort;
> + CopyMem (&NvData->TargetIp, &NvData->OriginalTargetIp, sizeof
> (EFI_IP_ADDRESS));
> + NvData->RedirectFlag = FALSE;
> +
> + gRT->SetVariable (
> + mPrivate->PortString,
> + &gEfiIScsiInitiatorNameProtocolGuid,
> + 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,
> - &gEfiIScsiInitiatorNameProtocolGuid,
> - (VOID**)&AttemptConfigData,
> - NULL
> - );
> + mPrivate->PortString,
> + &gEfiIScsiInitiatorNameProtocolGuid,
> + (VOID**)&AttemptConfigData,
> + 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_ADDRESS TargetIp;
> UINT8 PrefixLength;
> UINT8 BootLun[8];
>
> - UINT16 ConnectTimeout; ///< timout value in milliseconds
> + UINT16 ConnectTimeout; ///< timout value in milliseconds.
> UINT8 ConnectRetryCount;
> UINT8 IsId[6];
> +
> + BOOLEAN RedirectFlag;
> + UINT16 OriginalTargetPort; // The port of proxy/virtual
> target.
> + EFI_IP_ADDRESS OriginalTargetIp; // 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 UINT32 Len
> )
> {
> - LIST_ENTRY *KeyValueList;
> - CHAR8 *TargetAddress;
> - CHAR8 *IpStr;
> - EFI_STATUS Status;
> - UINTN Number;
> - UINT8 IpMode;
> + LIST_ENTRY *KeyValueList;
> + CHAR8 *TargetAddress;
> + CHAR8 *IpStr;
> + EFI_STATUS Status;
> + UINTN Number;
> + UINT8 IpMode;
> + ISCSI_SESSION_CONFIG_NVDATA *NvData;
>
> KeyValueList = IScsiBuildKeyValueList (Data, Len);
> if (KeyValueList == NULL) {
> return EFI_OUT_OF_RESOURCES;
> }
>
> Status = EFI_NOT_FOUND;
> -
> + NvData = &Session->ConfigData->SessionConfigData;
> +
> while (TRUE) {
> TargetAddress = IScsiGetValueByKeyFromList (KeyValueList,
> ISCSI_KEY_TARGET_ADDRESS);
> if (TargetAddress == NULL) {
> break;
> }
> @@ -1096,10 +1098,15 @@ IScsiUpdateTargetAddress (
> // IPv4 address.
> //
> continue;
> }
>
> + //
> + // Save the origial user setting which specifies the proxy/virtual
> iSCSI target.
> + //
> + NvData->OriginalTargetPort = NvData->TargetPort;
> +
> IpStr = TargetAddress;
>
> while ((*TargetAddress != 0) && (*TargetAddress != ':') &&
> (*TargetAddress != ',')) {
> //
> // NULL, ':', or ',' ends the IPv4 string.
> @@ -1120,23 +1127,29 @@ IScsiUpdateTargetAddress (
>
> Number = AsciiStrDecimalToUintn (TargetAddress);
> if (Number > 0xFFFF) {
> continue;
> } else {
> - Session->ConfigData->SessionConfigData.TargetPort = (UINT16)
> Number;
> + NvData->TargetPort = (UINT16) Number;
> }
> } else {
> //
> // The string only contains the IPv4 address. Use the well-known
> port.
> //
> - Session->ConfigData->SessionConfigData.TargetPort =
> ISCSI_WELL_KNOWN_PORT;
> + NvData->TargetPort = ISCSI_WELL_KNOWN_PORT;
> }
> +
> + //
> + // Save the origial user setting which specifies the proxy/virtual
> iSCSI target.
> + //
> + CopyMem (&NvData->OriginalTargetIp, &NvData->TargetIp, sizeof
> (EFI_IP_ADDRESS));
> +
> //
> // Update the target IP address.
> //
> - if (Session->ConfigData->SessionConfigData.IpMode <
> IP_MODE_AUTOCONFIG) {
> - IpMode = Session->ConfigData->SessionConfigData.IpMode;
> + if (NvData->IpMode < IP_MODE_AUTOCONFIG) {
> + IpMode = NvData->IpMode;
> } else {
> IpMode = Session->ConfigData->AutoConfigureMode;
> }
>
> Status = IScsiAsciiStrToIp (
> @@ -1146,10 +1159,11 @@ IScsiUpdateTargetAddress (
> );
>
> if (EFI_ERROR (Status)) {
> continue;
> } else {
> + NvData->RedirectFlag = TRUE;
> break;
> }
> }
>
> IScsiFreeKeyValueList (KeyValueList);
> --
> 1.9.0.msysgit.0
next prev parent reply other threads:[~2016-10-14 2:11 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-29 5:59 [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT Ye Ting
2016-09-29 6:10 ` Ye, Ting
2016-10-10 2:26 ` Ye, Ting
2016-09-29 16:12 ` Subramanian, Sriram (EG Servers Platform SW)
2016-10-14 2:11 ` Fu, Siyuan [this message]
2016-10-14 7:54 ` Zhang, Lubo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=B1FF2E9001CE9041BD10B825821D5BC58A82AF6F@shsmsx102.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox