From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) (using TLSv1 with cipher CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 874771A1E9E for ; Fri, 14 Oct 2016 00:55:00 -0700 (PDT) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga102.jf.intel.com with ESMTP; 14 Oct 2016 00:55:00 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,491,1473145200"; d="scan'208";a="1064693737" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by orsmga002.jf.intel.com with ESMTP; 14 Oct 2016 00:54:43 -0700 Received: from fmsmsx117.amr.corp.intel.com (10.18.116.17) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.248.2; Fri, 14 Oct 2016 00:54:40 -0700 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by fmsmsx117.amr.corp.intel.com (10.18.116.17) with Microsoft SMTP Server (TLS) id 14.3.248.2; Fri, 14 Oct 2016 00:54:40 -0700 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.206]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.139]) with mapi id 14.03.0248.002; Fri, 14 Oct 2016 15:54:38 +0800 From: "Zhang, Lubo" To: "Ye, Ting" , "edk2-devel@lists.01.org" CC: Sriram , "Fu, Siyuan" Thread-Topic: [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT Thread-Index: AQHSGha6SkWopBRpnE2sjiYYKFJxI6Cnq/5g Date: Fri, 14 Oct 2016 07:54:38 +0000 Message-ID: <7619447B08B8F74DA4FF2A813B79803B378E4394@shsmsx102.ccr.corp.intel.com> References: <20160929055911.22972-1-ting.ye@intel.com> In-Reply-To: <20160929055911.22972-1-ting.ye@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 14 Oct 2016 07:55:00 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Zhang Lubo -----Original Message----- From: Ye, Ting=20 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 re= direction occurs, which removes the possibility of the OS to reconnect to t= he configured IP for load balancing. The behavior is not explicitly describ= ed in IBFT spec, though the MSFT expert confirm we should record original u= ser 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/IScsiD= river.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; =20 // // Test to see if iSCSI driver supports the given controller. // =20 @@ -699,10 +700,28 @@ IScsiStart ( Status =3D IScsiSessionLogin (Session); } else if (Status =3D=3D EFI_NOT_READY) { Status =3D IScsiSessionReLogin (Session); } =20 + // + // Restore the origial user setting which specifies the proxy/virtual = iSCSI target to NV region. + // + NvData =3D &AttemptConfigData->SessionConfigData; + if (NvData->RedirectFlag) { + NvData->TargetPort =3D NvData->OriginalTargetPort; + CopyMem (&NvData->TargetIp, &NvData->OriginalTargetIp, sizeof (EFI_I= P_ADDRESS)); + NvData->RedirectFlag =3D 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 recor= ded in iBFT. // diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.c b/NetworkPkg/IScsiDxe/IScsiMis= c.c index a39c268..64bb2ad 100644 --- a/NetworkPkg/IScsiDxe/IScsiMisc.c +++ b/NetworkPkg/IScsiDxe/IScsiMisc.c @@ -1186,15 +1186,15 @@ IScsiGetConfigData ( MacString, (UINTN) AttemptConfigOrder[Index] ); =20 GetVariable2 ( - mPrivate->PortString, - &gEfiIScsiInitiatorNameProtocolGuid, - (VOID**)&AttemptConfigData, - NULL - ); + mPrivate->PortString, + &gEfiIScsiInitiatorNameProtocolGuid, + (VOID**)&AttemptConfigData, + NULL + ); =20 if (AttemptConfigData =3D=3D NULL) { continue; } =20 diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.h b/NetworkPkg/IScsiDxe/IScsiMis= c.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]; =20 - 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 t= arget. + EFI_IP_ADDRESS OriginalTargetIp; // The address of proxy/virtua= l target. + =20 } ISCSI_SESSION_CONFIG_NVDATA; #pragma pack() =20 /** Calculate the prefix length of the IPv4 subnet mask. diff --git a/NetworkPkg/IScsiDxe/IScsiProto.c b/NetworkPkg/IScsiDxe/IScsiPr= oto.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; =20 KeyValueList =3D IScsiBuildKeyValueList (Data, Len); if (KeyValueList =3D=3D NULL) { return EFI_OUT_OF_RESOURCES; } =20 Status =3D EFI_NOT_FOUND; - + NvData =3D &Session->ConfigData->SessionConfigData; +=20 while (TRUE) { TargetAddress =3D IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_= TARGET_ADDRESS); if (TargetAddress =3D=3D NULL) { break; } @@ -1096,10 +1098,15 @@ IScsiUpdateTargetAddress ( // IPv4 address. // continue; } =20 + // + // Save the origial user setting which specifies the proxy/virtual iSC= SI target. + // + NvData->OriginalTargetPort =3D NvData->TargetPort; + IpStr =3D TargetAddress; =20 while ((*TargetAddress !=3D 0) && (*TargetAddress !=3D ':') && (*Targe= tAddress !=3D ',')) { // // NULL, ':', or ',' ends the IPv4 string. @@ -1120,23 +1127,29 @@ IScsiUpdateTargetAddress ( =20 Number =3D AsciiStrDecimalToUintn (TargetAddress); if (Number > 0xFFFF) { continue; } else { - Session->ConfigData->SessionConfigData.TargetPort =3D (UINT16) Num= ber; + NvData->TargetPort =3D (UINT16) Number; } } else { // // The string only contains the IPv4 address. Use the well-known por= t. // - Session->ConfigData->SessionConfigData.TargetPort =3D ISCSI_WELL_KNO= WN_PORT; + NvData->TargetPort =3D ISCSI_WELL_KNOWN_PORT; } + + // + // Save the origial user setting which specifies the proxy/virtual iSC= SI target. + // =20 + CopyMem (&NvData->OriginalTargetIp, &NvData->TargetIp, sizeof=20 + (EFI_IP_ADDRESS)); + // // Update the target IP address. // - if (Session->ConfigData->SessionConfigData.IpMode < IP_MODE_AUTOCONFIG= ) { - IpMode =3D Session->ConfigData->SessionConfigData.IpMode; + if (NvData->IpMode < IP_MODE_AUTOCONFIG) { + IpMode =3D NvData->IpMode; } else { IpMode =3D Session->ConfigData->AutoConfigureMode; } =20 Status =3D IScsiAsciiStrToIp ( @@ -1146,10 +1159,11 @@ IScsiUpdateTargetAddress ( ); =20 if (EFI_ERROR (Status)) { continue; } else { + NvData->RedirectFlag =3D TRUE; break; } } =20 IScsiFreeKeyValueList (KeyValueList); -- 1.9.0.msysgit.0