From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (using TLSv1 with cipher CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 7B1E91A1DEB for ; Wed, 28 Sep 2016 23:10:27 -0700 (PDT) Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga104.fm.intel.com with ESMTP; 28 Sep 2016 23:10:21 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.30,413,1470726000"; d="scan'208";a="14401020" Received: from fmsmsx104.amr.corp.intel.com ([10.18.124.202]) by fmsmga006.fm.intel.com with ESMTP; 28 Sep 2016 23:10:21 -0700 Received: from fmsmsx153.amr.corp.intel.com (10.18.125.6) by fmsmsx104.amr.corp.intel.com (10.18.124.202) with Microsoft SMTP Server (TLS) id 14.3.248.2; Wed, 28 Sep 2016 23:10:21 -0700 Received: from shsmsx151.ccr.corp.intel.com (10.239.6.50) by FMSMSX153.amr.corp.intel.com (10.18.125.6) with Microsoft SMTP Server (TLS) id 14.3.248.2; Wed, 28 Sep 2016 23:10:21 -0700 Received: from shsmsx103.ccr.corp.intel.com ([169.254.4.234]) by SHSMSX151.ccr.corp.intel.com ([169.254.3.96]) with mapi id 14.03.0248.002; Thu, 29 Sep 2016 14:10:17 +0800 From: "Ye, Ting" To: "edk2-devel@lists.01.org" , "Subramanian, Sriram (System FW, HP Servers) (sriram-s@hpe.com)" CC: "Zhang, Lubo" , "Fu, Siyuan" Thread-Topic: [edk2] [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT Thread-Index: AQHSGhbE22YJCrEhUUSfLfTWJ2SkXqCP+fxQ Date: Thu, 29 Sep 2016 06:10:17 +0000 Message-ID: References: <20160929055911.22972-1-ting.ye@intel.com> In-Reply-To: <20160929055911.22972-1-ting.ye@intel.com> Accept-Language: zh-CN, 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: Thu, 29 Sep 2016 06:10:27 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Correct the email address for Sriram.=20 For the EDKII iSCSI users: Since this patch introduces incompatible changes= to iBFT, please help to validate the patch in your scenario to guarantee i= t does not break any existing functionalities. This patch impacts the iSCS= I boot using redirecting iSCSI target. Best Regards, Ye Ting -----Original Message----- From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Ye T= ing Sent: Thursday, September 29, 2016 1:59 PM To: edk2-devel@lists.01.org Cc: Zhang, Lubo ; Subramanian@ml01.01.org; Fu, Siyuan= Subject: [edk2] [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 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel