From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.43; helo=mga05.intel.com; envelope-from=jiaxin.wu@intel.com; receiver=edk2-devel@lists.01.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 65FCD202E61A5 for ; Mon, 16 Oct 2017 18:54:52 -0700 (PDT) Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga105.fm.intel.com with ESMTP; 16 Oct 2017 18:58:28 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.43,389,1503385200"; d="scan'208";a="324004017" Received: from jiaxinwu-mobl2.ccr.corp.intel.com ([10.239.196.176]) by fmsmga004.fm.intel.com with ESMTP; 16 Oct 2017 18:58:26 -0700 From: Jiaxin Wu To: edk2-devel@lists.01.org Cc: Karunakar P , Ye Ting , Fu Siyuan , Wu Jiaxin Date: Tue, 17 Oct 2017 09:58:21 +0800 Message-Id: <1508205501-13832-3-git-send-email-jiaxin.wu@intel.com> X-Mailer: git-send-email 1.9.5.msysgit.1 In-Reply-To: <1508205501-13832-1-git-send-email-jiaxin.wu@intel.com> References: <1508205501-13832-1-git-send-email-jiaxin.wu@intel.com> Subject: [Patch 2/2] NetworkPkg/IScsiDxe: Add IPv6 support condition check. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 17 Oct 2017 01:54:52 -0000 Base on the request of https://bugzilla.tianocore.org/show_bug.cgi?id=710, we provide this patch to IPv6 condition check by leveraging AIP Protocol. Cc: Karunakar P Cc: Ye Ting Cc: Fu Siyuan Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Karunakar P Signed-off-by: Wu Jiaxin --- NetworkPkg/IScsiDxe/IScsiConfig.c | 18 +++++ NetworkPkg/IScsiDxe/IScsiDriver.c | 2 +- NetworkPkg/IScsiDxe/IScsiDriver.h | 1 + NetworkPkg/IScsiDxe/IScsiDxe.inf | 2 + NetworkPkg/IScsiDxe/IScsiImpl.h | 1 + NetworkPkg/IScsiDxe/IScsiMisc.c | 135 +++++++++++++++++++++++++++++++++++++- NetworkPkg/IScsiDxe/IScsiMisc.h | 4 +- 7 files changed, 159 insertions(+), 4 deletions(-) diff --git a/NetworkPkg/IScsiDxe/IScsiConfig.c b/NetworkPkg/IScsiDxe/IScsiConfig.c index 52e51d6..082020d 100644 --- a/NetworkPkg/IScsiDxe/IScsiConfig.c +++ b/NetworkPkg/IScsiDxe/IScsiConfig.c @@ -3419,10 +3419,13 @@ IScsiFormCallback ( EFI_IP_ADDRESS Gateway; ISCSI_CONFIG_IFR_NVDATA *IfrNvData; ISCSI_CONFIG_IFR_NVDATA OldIfrNvData; EFI_STATUS Status; EFI_INPUT_KEY Key; + ISCSI_NIC_INFO *NicInfo; + + NicInfo = NULL; if ((Action == EFI_BROWSER_ACTION_FORM_OPEN) || (Action == EFI_BROWSER_ACTION_FORM_CLOSE)) { // // Do nothing for UEFI OPEN/CLOSE Action // @@ -3589,10 +3592,25 @@ IScsiFormCallback ( break; case KEY_IP_MODE: switch (Value->u8) { case IP_MODE_IP6: + NicInfo = IScsiGetNicInfoByIndex (Private->Current->NicIndex); + if(!NicInfo->Ipv6Available) { + // + // Current NIC doesn't Support IPv6, hence use IPv4. + // + IfrNvData->IpMode = IP_MODE_IP4; + + CreatePopUp ( + EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, + &Key, + L"Current NIC doesn't Support IPv6!", + NULL + ); + } + case IP_MODE_IP4: ZeroMem (IfrNvData->TargetIp, sizeof (IfrNvData->TargetIp)); Private->Current->AutoConfigureMode = 0; break; diff --git a/NetworkPkg/IScsiDxe/IScsiDriver.c b/NetworkPkg/IScsiDxe/IScsiDriver.c index 2249919..fbeef97 100644 --- a/NetworkPkg/IScsiDxe/IScsiDriver.c +++ b/NetworkPkg/IScsiDxe/IScsiDriver.c @@ -438,11 +438,11 @@ IScsiStart ( } // // Record the incoming NIC info. // - Status = IScsiAddNic (ControllerHandle); + Status = IScsiAddNic (ControllerHandle, Image); if (EFI_ERROR (Status)) { return Status; } // diff --git a/NetworkPkg/IScsiDxe/IScsiDriver.h b/NetworkPkg/IScsiDxe/IScsiDriver.h index 6c6e11b..2db93c5 100644 --- a/NetworkPkg/IScsiDxe/IScsiDriver.h +++ b/NetworkPkg/IScsiDxe/IScsiDriver.h @@ -79,10 +79,11 @@ typedef struct { UINT8 NicIndex; UINT16 VlanId; UINTN BusNumber; UINTN DeviceNumber; UINTN FunctionNumber; + BOOLEAN Ipv6Available; } ISCSI_NIC_INFO; typedef struct _ISCSI_PRIVATE_PROTOCOL { UINT32 Reserved; } ISCSI_PRIVATE_PROTOCOL; diff --git a/NetworkPkg/IScsiDxe/IScsiDxe.inf b/NetworkPkg/IScsiDxe/IScsiDxe.inf index 01998a0..319c7fe 100644 --- a/NetworkPkg/IScsiDxe/IScsiDxe.inf +++ b/NetworkPkg/IScsiDxe/IScsiDxe.inf @@ -115,18 +115,20 @@ gEfiIScsiInitiatorNameProtocolGuid ## PRODUCES gEfiAuthenticationInfoProtocolGuid ## SOMETIMES_CONSUMES gEfiAdapterInformationProtocolGuid + gEfiNetworkInterfaceIdentifierProtocolGuid_31 ## SOMETIMES_CONSUMES [Guids] gEfiEventExitBootServicesGuid ## SOMETIMES_CONSUMES ## Event gEfiIfrTianoGuid ## SOMETIMES_PRODUCES ## UNDEFINED gEfiAcpiTableGuid ## SOMETIMES_CONSUMES ## SystemTable gEfiAcpi10TableGuid ## SOMETIMES_CONSUMES ## SystemTable gEfiAcpi20TableGuid ## SOMETIMES_CONSUMES ## SystemTable gEfiAdapterInfoNetworkBootGuid ## SOMETIMES_CONSUMES ## UNDEFINED + gEfiAdapterInfoUndiIpv6SupportGuid ## SOMETIMES_CONSUMES ## GUID ## SOMETIMES_PRODUCES ## Variable:L"AttemptOrder" ## SOMETIMES_CONSUMES ## Variable:L"AttemptOrder" ## SOMETIMES_PRODUCES ## Variable:L"InitialAttemptOrder" ## SOMETIMES_CONSUMES ## Variable:L"InitialAttemptOrder" diff --git a/NetworkPkg/IScsiDxe/IScsiImpl.h b/NetworkPkg/IScsiDxe/IScsiImpl.h index 741c497..9e36da0 100644 --- a/NetworkPkg/IScsiDxe/IScsiImpl.h +++ b/NetworkPkg/IScsiDxe/IScsiImpl.h @@ -37,10 +37,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #include #include +#include #include #include #include #include diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.c b/NetworkPkg/IScsiDxe/IScsiMisc.c index 0a0a3f5..9e4164c 100644 --- a/NetworkPkg/IScsiDxe/IScsiMisc.c +++ b/NetworkPkg/IScsiDxe/IScsiMisc.c @@ -464,22 +464,128 @@ IScsiGenRandom ( } } /** + Check whether UNDI protocol supports IPv6. + + @param[in] ControllerHandle Controller handle. + @param[in] Image Handle of the image. + @param[out] Ipv6Support TRUE if UNDI supports IPv6. + + @retval EFI_SUCCESS Get the result whether UNDI supports IPv6 by NII or AIP protocol successfully. + @retval EFI_NOT_FOUND Don't know whether UNDI supports IPv6 since NII or AIP is not available. + +**/ +EFI_STATUS +IScsiCheckIpv6Support ( + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE Image, + OUT BOOLEAN *Ipv6Support + ) +{ + EFI_HANDLE Handle; + EFI_ADAPTER_INFORMATION_PROTOCOL *Aip; + EFI_STATUS Status; + EFI_GUID *InfoTypesBuffer; + UINTN InfoTypeBufferCount; + UINTN TypeIndex; + BOOLEAN Supported; + VOID *InfoBlock; + UINTN InfoBlockSize; + + EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *Nii; + + ASSERT (Ipv6Support != NULL); + + // + // Check whether the UNDI supports IPv6 by NII protocol. + // + Status = gBS->OpenProtocol ( + ControllerHandle, + &gEfiNetworkInterfaceIdentifierProtocolGuid_31, + (VOID **) &Nii, + Image, + ControllerHandle, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (Status == EFI_SUCCESS) { + *Ipv6Support = Nii->Ipv6Supported; + return EFI_SUCCESS; + } + + // + // Get the NIC handle by SNP protocol. + // + Handle = NetLibGetSnpHandle (ControllerHandle, NULL); + if (Handle == NULL) { + return EFI_NOT_FOUND; + } + + Aip = NULL; + Status = gBS->HandleProtocol ( + Handle, + &gEfiAdapterInformationProtocolGuid, + (VOID *) &Aip + ); + if (EFI_ERROR (Status) || Aip == NULL) { + return EFI_NOT_FOUND; + } + + InfoTypesBuffer = NULL; + InfoTypeBufferCount = 0; + Status = Aip->GetSupportedTypes (Aip, &InfoTypesBuffer, &InfoTypeBufferCount); + if (EFI_ERROR (Status) || InfoTypesBuffer == NULL) { + FreePool (InfoTypesBuffer); + return EFI_NOT_FOUND; + } + + Supported = FALSE; + for (TypeIndex = 0; TypeIndex < InfoTypeBufferCount; TypeIndex++) { + if (CompareGuid (&InfoTypesBuffer[TypeIndex], &gEfiAdapterInfoUndiIpv6SupportGuid)) { + Supported = TRUE; + break; + } + } + + FreePool (InfoTypesBuffer); + if (!Supported) { + return EFI_NOT_FOUND; + } + + // + // We now have adapter information block. + // + InfoBlock = NULL; + InfoBlockSize = 0; + Status = Aip->GetInformation (Aip, &gEfiAdapterInfoUndiIpv6SupportGuid, &InfoBlock, &InfoBlockSize); + if (EFI_ERROR (Status) || InfoBlock == NULL) { + FreePool (InfoBlock); + return EFI_NOT_FOUND; + } + + *Ipv6Support = ((EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT *) InfoBlock)->Ipv6Support; + FreePool (InfoBlock); + + return EFI_SUCCESS; +} + +/** Record the NIC info in global structure. @param[in] Controller The handle of the controller. + @param[in] Image Handle of the image. @retval EFI_SUCCESS The operation is completed. @retval EFI_OUT_OF_RESOURCES Do not have sufficient resources to finish this operation. **/ EFI_STATUS IScsiAddNic ( - IN EFI_HANDLE Controller + IN EFI_HANDLE Controller, + IN EFI_HANDLE Image ) { EFI_STATUS Status; ISCSI_NIC_INFO *NicInfo; LIST_ENTRY *Entry; @@ -507,10 +613,23 @@ IScsiAddNic ( NicInfo = NET_LIST_USER_STRUCT (Entry, ISCSI_NIC_INFO, Link); if (NicInfo->HwAddressSize == HwAddressSize && CompareMem (&NicInfo->PermanentAddress, MacAddr.Addr, HwAddressSize) == 0 && NicInfo->VlanId == VlanId) { mPrivate->CurrentNic = NicInfo->NicIndex; + + // + // Set IPv6 available flag. + // + Status = IScsiCheckIpv6Support (Controller, Image, &NicInfo->Ipv6Available); + if (EFI_ERROR (Status)) { + // + // Fail to get the data whether UNDI supports IPv6. + // Set default value to TRUE. + // + NicInfo->Ipv6Available = TRUE; + } + return EFI_SUCCESS; } if (mPrivate->MaxNic < NicInfo->NicIndex) { mPrivate->MaxNic = NicInfo->NicIndex; @@ -528,11 +647,23 @@ IScsiAddNic ( CopyMem (&NicInfo->PermanentAddress, MacAddr.Addr, HwAddressSize); NicInfo->HwAddressSize = (UINT32) HwAddressSize; NicInfo->VlanId = VlanId; NicInfo->NicIndex = (UINT8) (mPrivate->MaxNic + 1); mPrivate->MaxNic = NicInfo->NicIndex; - + + // + // Set IPv6 available flag. + // + Status = IScsiCheckIpv6Support (Controller, Image, &NicInfo->Ipv6Available); + if (EFI_ERROR (Status)) { + // + // Fail to get the data whether UNDI supports IPv6. + // Set default value to TRUE. + // + NicInfo->Ipv6Available = TRUE; + } + // // Get the PCI location. // IScsiGetNICPciLocation ( Controller, diff --git a/NetworkPkg/IScsiDxe/IScsiMisc.h b/NetworkPkg/IScsiDxe/IScsiMisc.h index caa2f94..659c026 100644 --- a/NetworkPkg/IScsiDxe/IScsiMisc.h +++ b/NetworkPkg/IScsiDxe/IScsiMisc.h @@ -215,19 +215,21 @@ IScsiGenRandom ( /** Record the NIC information in a global structure. @param[in] Controller The handle of the controller. + @param[in] Image Handle of the image. @retval EFI_SUCCESS The operation is completed. @retval EFI_OUT_OF_RESOURCES Do not have sufficient resource to finish this operation. **/ EFI_STATUS IScsiAddNic ( - IN EFI_HANDLE Controller + IN EFI_HANDLE Controller, + IN EFI_HANDLE Image ); /** Delete the recorded NIC information from a global structure. Also delete corresponding attempts. -- 1.9.5.msysgit.1