From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 81B481A1EC3 for ; Thu, 13 Oct 2016 19:11:45 -0700 (PDT) Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga105.jf.intel.com with ESMTP; 13 Oct 2016 19:11:45 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,491,1473145200"; d="scan'208";a="179679691" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by fmsmga004.fm.intel.com with ESMTP; 13 Oct 2016 19:11:43 -0700 Received: from shsmsx104.ccr.corp.intel.com (10.239.4.70) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.248.2; Thu, 13 Oct 2016 19:11:43 -0700 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.206]) by SHSMSX104.ccr.corp.intel.com ([169.254.5.209]) with mapi id 14.03.0248.002; Fri, 14 Oct 2016 10:11:41 +0800 From: "Fu, Siyuan" To: "Ye, Ting" , "edk2-devel@lists.01.org" CC: Sriram , "Zhang, Lubo" Thread-Topic: [Patch] NetworkPkg: Record user configured TargetIP/Port in iBFT Thread-Index: AQHSGha6knAbhokg2U6Ws+DnCB2DtaCnSpDQ Date: Fri, 14 Oct 2016 02:11:40 +0000 Message-ID: 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-ctpclassification: CTP_IC x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiYjEwZmZlZWYtNGU3YS00ZmE2LWE2NjEtMzdiNmNhMzU3MmY0IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX0lDIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE1LjkuNi42IiwiVHJ1c3RlZExhYmVsSGFzaCI6IjFQNkp2Z1hoS21laTM4UFpZd3FHenNITHJlOStCT2tcL0RseHdxaTVxbTJJPSJ9 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 02:11:45 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Fu Siyuan > -----Original Message----- > From: Ye, Ting > 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 >=20 > 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. >=20 > Thanks Sriram for reviewing and validating this patch in his test-bed. >=20 > 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(-) >=20 > 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; >=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/virtua= l > iSCSI target to NV region. > + // > + NvData =3D &AttemptConfigData->SessionConfigData; > + if (NvData->RedirectFlag) { > + NvData->TargetPort =3D NvData->OriginalTargetPort; > + CopyMem (&NvData->TargetIp, &NvData->OriginalTargetIp, sizeof > (EFI_IP_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 > 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] > ); >=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/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]; >=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 > target. > + EFI_IP_ADDRESS OriginalTargetIp; // The address of > proxy/virtual target. > + > } 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/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; >=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; > + > 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 > iSCSI target. > + // > + NvData->OriginalTargetPort =3D NvData->TargetPort; > + > IpStr =3D TargetAddress; >=20 > while ((*TargetAddress !=3D 0) && (*TargetAddress !=3D ':') && > (*TargetAddress !=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) > Number; > + NvData->TargetPort =3D (UINT16) Number; > } > } else { > // > // The string only contains the IPv4 address. Use the well-known > port. > // > - Session->ConfigData->SessionConfigData.TargetPort =3D > ISCSI_WELL_KNOWN_PORT; > + NvData->TargetPort =3D 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 =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