public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
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



  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