NetworkPkg/HttpDxe: Refactor TlsCreateChild

- Use HTTP instance as the parameter for TlsCreateChild function.
- Install TLS protocol on the HTTP instance thats create TLS child.

Signed-off-by: Abner Chang <abner.chang@amd.com>
Cc: Saloni Kasbekar <saloni.kasbekar@intel.com>
Cc: Zachary Clark-williams <zachary.clark-williams@intel.com>
Cc: Michael Brown <mcb30@ipxe.org>
Cc: Nickle Wang <nicklew@nvidia.com>
Cc: Igor Kulchytskyy <igork@ami.com>
Reviewed-by: Michael Brown <mcb30@ipxe.org>
Reviewed-by: Saloni Kasbekar <saloni.kasbekar@intel.com>
This commit is contained in:
Abner Chang 2023-12-30 14:42:05 +08:00 committed by mergify[bot]
parent edba0779ba
commit 0abd598e3f
5 changed files with 67 additions and 68 deletions

View File

@ -3,6 +3,7 @@
Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR> Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR>
(C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR> (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>
Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
@ -248,7 +249,6 @@ EfiHttpRequest (
HTTP_TOKEN_WRAP *Wrap; HTTP_TOKEN_WRAP *Wrap;
CHAR8 *FileUrl; CHAR8 *FileUrl;
UINTN RequestMsgSize; UINTN RequestMsgSize;
EFI_HANDLE ImageHandle;
// //
// Initializations // Initializations
@ -371,23 +371,10 @@ EfiHttpRequest (
// //
// Check whether we need to create Tls child and open the TLS protocol. // Check whether we need to create Tls child and open the TLS protocol.
// //
if (HttpInstance->UseHttps && (HttpInstance->TlsChildHandle == NULL)) { if (HttpInstance->UseHttps && !HttpInstance->TlsAlreadyCreated) {
// // Create TLS child for this HTTP instance.
// Use TlsSb to create Tls child and open the TLS protocol. Status = TlsCreateChild (HttpInstance);
// if (EFI_ERROR (Status)) {
if (HttpInstance->LocalAddressIsIPv6) {
ImageHandle = HttpInstance->Service->Ip6DriverBindingHandle;
} else {
ImageHandle = HttpInstance->Service->Ip4DriverBindingHandle;
}
HttpInstance->TlsChildHandle = TlsCreateChild (
ImageHandle,
&(HttpInstance->TlsSb),
&(HttpInstance->Tls),
&(HttpInstance->TlsConfiguration)
);
if (HttpInstance->TlsChildHandle == NULL) {
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }

View File

@ -3,6 +3,7 @@
Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR> Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR>
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR> (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
@ -852,12 +853,12 @@ HttpCleanProtocol (
NetMapClean (&HttpInstance->TxTokens); NetMapClean (&HttpInstance->TxTokens);
NetMapClean (&HttpInstance->RxTokens); NetMapClean (&HttpInstance->RxTokens);
if ((HttpInstance->TlsSb != NULL) && (HttpInstance->TlsChildHandle != NULL)) { if ((HttpInstance->TlsSb != NULL) && HttpInstance->TlsAlreadyCreated) {
// //
// Destroy the TLS instance. // Destroy the TLS instance.
// //
HttpInstance->TlsSb->DestroyChild (HttpInstance->TlsSb, HttpInstance->TlsChildHandle); HttpInstance->TlsSb->DestroyChild (HttpInstance->TlsSb, HttpInstance->Handle);
HttpInstance->TlsChildHandle = NULL; HttpInstance->TlsAlreadyCreated = FALSE;
} }
if (HttpInstance->Tcp4ChildHandle != NULL) { if (HttpInstance->Tcp4ChildHandle != NULL) {

View File

@ -3,6 +3,7 @@
Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR> Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR>
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR> (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
@ -171,7 +172,7 @@ typedef struct _HTTP_PROTOCOL {
BOOLEAN UseHttps; BOOLEAN UseHttps;
EFI_SERVICE_BINDING_PROTOCOL *TlsSb; EFI_SERVICE_BINDING_PROTOCOL *TlsSb;
EFI_HANDLE TlsChildHandle; /// Tls ChildHandle BOOLEAN TlsAlreadyCreated;
TLS_CONFIG_DATA TlsConfigData; TLS_CONFIG_DATA TlsConfigData;
EFI_TLS_PROTOCOL *Tls; EFI_TLS_PROTOCOL *Tls;
EFI_TLS_CONFIGURATION_PROTOCOL *TlsConfiguration; EFI_TLS_CONFIGURATION_PROTOCOL *TlsConfiguration;

View File

@ -3,6 +3,7 @@
Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR> Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR> (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
@ -134,27 +135,31 @@ IsHttpsUrl (
/** /**
Creates a Tls child handle, open EFI_TLS_PROTOCOL and EFI_TLS_CONFIGURATION_PROTOCOL. Creates a Tls child handle, open EFI_TLS_PROTOCOL and EFI_TLS_CONFIGURATION_PROTOCOL.
@param[in] ImageHandle The firmware allocated handle for the UEFI image. @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
@param[out] TlsSb Pointer to the TLS SERVICE_BINDING_PROTOCOL.
@param[out] TlsProto Pointer to the EFI_TLS_PROTOCOL instance.
@param[out] TlsConfiguration Pointer to the EFI_TLS_CONFIGURATION_PROTOCOL instance.
@return The child handle with opened EFI_TLS_PROTOCOL and EFI_TLS_CONFIGURATION_PROTOCOL. @return EFI_SUCCESS TLS child handle is returned in HttpInstance->TlsChildHandle
with opened EFI_TLS_PROTOCOL and EFI_TLS_CONFIGURATION_PROTOCOL.
EFI_DEVICE_ERROR TLS service binding protocol is not found.
Otherwise Fail to create TLS chile handle.
**/ **/
EFI_HANDLE EFI_STATUS
EFIAPI EFIAPI
TlsCreateChild ( TlsCreateChild (
IN EFI_HANDLE ImageHandle, IN HTTP_PROTOCOL *HttpInstance
OUT EFI_SERVICE_BINDING_PROTOCOL **TlsSb,
OUT EFI_TLS_PROTOCOL **TlsProto,
OUT EFI_TLS_CONFIGURATION_PROTOCOL **TlsConfiguration
) )
{ {
EFI_HANDLE ImageHandle;
EFI_STATUS Status; EFI_STATUS Status;
EFI_HANDLE TlsChildHandle;
TlsChildHandle = 0; //
// Use TlsSb to create Tls child and open the TLS protocol.
//
if (HttpInstance->LocalAddressIsIPv6) {
ImageHandle = HttpInstance->Service->Ip6DriverBindingHandle;
} else {
ImageHandle = HttpInstance->Service->Ip4DriverBindingHandle;
}
// //
// Locate TlsServiceBinding protocol. // Locate TlsServiceBinding protocol.
@ -162,44 +167,51 @@ TlsCreateChild (
gBS->LocateProtocol ( gBS->LocateProtocol (
&gEfiTlsServiceBindingProtocolGuid, &gEfiTlsServiceBindingProtocolGuid,
NULL, NULL,
(VOID **)TlsSb (VOID **)&HttpInstance->TlsSb
); );
if (*TlsSb == NULL) { if (HttpInstance->TlsSb == NULL) {
return NULL; return EFI_DEVICE_ERROR;
} }
Status = (*TlsSb)->CreateChild (*TlsSb, &TlsChildHandle); //
// Create TLS protocol on HTTP handle, this creates the association between HTTP and TLS
// for HTTP driver external usages.
//
Status = HttpInstance->TlsSb->CreateChild (HttpInstance->TlsSb, &HttpInstance->Handle);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return NULL; return Status;
}
HttpInstance->TlsAlreadyCreated = TRUE;
Status = gBS->OpenProtocol (
HttpInstance->Handle,
&gEfiTlsProtocolGuid,
(VOID **)&HttpInstance->Tls,
ImageHandle,
HttpInstance->Handle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
if (EFI_ERROR (Status)) {
HttpInstance->TlsSb->DestroyChild (HttpInstance->TlsSb, HttpInstance->Handle);
HttpInstance->TlsAlreadyCreated = FALSE;
return Status;
} }
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
TlsChildHandle, HttpInstance->Handle,
&gEfiTlsProtocolGuid,
(VOID **)TlsProto,
ImageHandle,
TlsChildHandle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
if (EFI_ERROR (Status)) {
(*TlsSb)->DestroyChild (*TlsSb, TlsChildHandle);
return NULL;
}
Status = gBS->OpenProtocol (
TlsChildHandle,
&gEfiTlsConfigurationProtocolGuid, &gEfiTlsConfigurationProtocolGuid,
(VOID **)TlsConfiguration, (VOID **)&HttpInstance->TlsConfiguration,
ImageHandle, ImageHandle,
TlsChildHandle, HttpInstance->Handle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
(*TlsSb)->DestroyChild (*TlsSb, TlsChildHandle); HttpInstance->TlsSb->DestroyChild (HttpInstance->TlsSb, HttpInstance->Handle);
return NULL; HttpInstance->TlsAlreadyCreated = FALSE;
return Status;
} }
return TlsChildHandle; return EFI_SUCCESS;
} }
/** /**

View File

@ -2,6 +2,7 @@
The header files of miscellaneous routines specific to Https for HttpDxe driver. The header files of miscellaneous routines specific to Https for HttpDxe driver.
Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR> Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
@ -30,21 +31,18 @@ IsHttpsUrl (
/** /**
Creates a Tls child handle, open EFI_TLS_PROTOCOL and EFI_TLS_CONFIGURATION_PROTOCOL. Creates a Tls child handle, open EFI_TLS_PROTOCOL and EFI_TLS_CONFIGURATION_PROTOCOL.
@param[in] ImageHandle The firmware allocated handle for the UEFI image. @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
@param[out] TlsSb Pointer to the TLS SERVICE_BINDING_PROTOCOL.
@param[out] TlsProto Pointer to the EFI_TLS_PROTOCOL instance.
@param[out] TlsConfiguration Pointer to the EFI_TLS_CONFIGURATION_PROTOCOL instance.
@return The child handle with opened EFI_TLS_PROTOCOL and EFI_TLS_CONFIGURATION_PROTOCOL. @return EFI_SUCCESS TLS child handle is returned in HttpInstance->TlsChildHandle
with opened EFI_TLS_PROTOCOL and EFI_TLS_CONFIGURATION_PROTOCOL.
EFI_DEVICE_ERROR TLS service binding protocol is not found.
Otherwise Fail to create TLS chile handle.
**/ **/
EFI_HANDLE EFI_STATUS
EFIAPI EFIAPI
TlsCreateChild ( TlsCreateChild (
IN EFI_HANDLE ImageHandle, IN HTTP_PROTOCOL *HttpInstance
OUT EFI_SERVICE_BINDING_PROTOCOL **TlsSb,
OUT EFI_TLS_PROTOCOL **TlsProto,
OUT EFI_TLS_CONFIGURATION_PROTOCOL **TlsConfiguration
); );
/** /**