Reviewed-by: Fu Siyuan <siyuan...@intel.com>

> -----Original Message-----
> From: Ye, Ting
> Sent: Thursday, September 29, 2016 1:59 PM
> To: edk2-devel@lists.01.org
> Cc: Subramanian; Sriram <srira...@hpe.com>; Fu, Siyuan
> <siyuan...@intel.com>; Zhang, Lubo <lubo.zh...@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...@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 = &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

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to