From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by mx.groups.io with SMTP id smtpd.web11.4987.1627480263293283437 for ; Wed, 28 Jul 2021 06:51:03 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=none, err=permanent DNS error (domain: linux.intel.com, ip: 192.55.52.115, mailfrom: maciej.rabeda@linux.intel.com) X-IronPort-AV: E=McAfee;i="6200,9189,10058"; a="212391840" X-IronPort-AV: E=Sophos;i="5.84,276,1620716400"; d="scan'208";a="212391840" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 06:51:01 -0700 X-IronPort-AV: E=Sophos;i="5.84,276,1620716400"; d="scan'208";a="437776030" Received: from mrabeda-mobl.ger.corp.intel.com (HELO [10.102.8.134]) ([10.102.8.134]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 06:50:53 -0700 Subject: Re: [edk2-devel] [Patch V3] NetworkPkg: Add HTTP Additional Event Notifications To: devel@edk2.groups.io, heng.luo@intel.com Cc: Jiaxin Wu , Siyuan Fu References: <20210728115805.2218-1-heng.luo@intel.com> From: "Maciej Rabeda" Message-ID: <0fbb591c-f851-4c06-ed0b-55fdb113137c@linux.intel.com> Date: Wed, 28 Jul 2021 15:50:46 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.12.0 MIME-Version: 1.0 In-Reply-To: <20210728115805.2218-1-heng.luo@intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Content-Language: pl Reviewed-by: Maciej Rabeda On 28-Jul-21 13:58, Heng Luo wrote: > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3496 > > Add new EDKII_HTTP_CALLBACK_PROTOCOL in NetworkPkg, > Send HTTP Events via EDKII_HTTP_CALLBACK_PROTOCOL > when Dns/ConnectTcp/TlsConnectSession/InitSession > occurs. > > Signed-off-by: Heng Luo > Cc: Maciej Rabeda > Cc: Jiaxin Wu > Cc: Siyuan Fu > --- > > NetworkPkg/HttpDxe/HttpDriver.h | 3 ++- > NetworkPkg/HttpDxe/HttpDxe.inf | 3 ++- > NetworkPkg/HttpDxe/HttpImpl.c | 4 +++- > NetworkPkg/HttpDxe/HttpProto.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- > NetworkPkg/HttpDxe/HttpProto.h | 15 ++++++++++++++- > NetworkPkg/Include/Protocol/HttpCallback.h | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > NetworkPkg/NetworkPkg.dec | 3 +++ > 7 files changed, 166 insertions(+), 5 deletions(-) > > diff --git a/NetworkPkg/HttpDxe/HttpDriver.h b/NetworkPkg/HttpDxe/HttpDriver.h > index 5fe8c5b5e9..b701b80858 100644 > --- a/NetworkPkg/HttpDxe/HttpDriver.h > +++ b/NetworkPkg/HttpDxe/HttpDriver.h > @@ -1,7 +1,7 @@ > /** @file > The header files of the driver binding and service binding protocol for HttpDxe driver. > > - Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.
> + Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.
> (C) Copyright 2016 Hewlett Packard Enterprise Development LP
> > SPDX-License-Identifier: BSD-2-Clause-Patent > @@ -47,6 +47,7 @@ > #include > #include > #include > +#include > > #include > // > diff --git a/NetworkPkg/HttpDxe/HttpDxe.inf b/NetworkPkg/HttpDxe/HttpDxe.inf > index 35fe31af18..23fb9ec394 100644 > --- a/NetworkPkg/HttpDxe/HttpDxe.inf > +++ b/NetworkPkg/HttpDxe/HttpDxe.inf > @@ -1,7 +1,7 @@ > ## @file > # Implementation of EFI HTTP protocol interfaces. > # > -# Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.
> +# Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.
> # > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > @@ -65,6 +65,7 @@ > gEfiTlsServiceBindingProtocolGuid ## SOMETIMES_CONSUMES > gEfiTlsProtocolGuid ## SOMETIMES_CONSUMES > gEfiTlsConfigurationProtocolGuid ## SOMETIMES_CONSUMES > + gEdkiiHttpCallbackProtocolGuid ## SOMETIMES_CONSUMES > > [Guids] > gEfiTlsCaCertificateGuid ## SOMETIMES_CONSUMES ## Variable:L"TlsCaCertificate" > diff --git a/NetworkPkg/HttpDxe/HttpImpl.c b/NetworkPkg/HttpDxe/HttpImpl.c > index 5a6ecbc9d9..97f15d229f 100644 > --- a/NetworkPkg/HttpDxe/HttpImpl.c > +++ b/NetworkPkg/HttpDxe/HttpImpl.c > @@ -1,7 +1,7 @@ > /** @file > Implementation of EFI_HTTP_PROTOCOL protocol interfaces. > > - Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.
> + Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.
> (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP
> > SPDX-License-Identifier: BSD-2-Clause-Patent > @@ -527,6 +527,7 @@ EfiHttpRequest ( > } else { > Status = HttpDns6 (HttpInstance, HostNameStr, &HttpInstance->RemoteIpv6Addr); > } > + HttpNotify (HttpEventDns, Status); > > FreePool (HostNameStr); > if (EFI_ERROR (Status)) { > @@ -588,6 +589,7 @@ EfiHttpRequest ( > Configure || ReConfigure, > TlsConfigure > ); > + HttpNotify (HttpEventInitSession, Status); > if (EFI_ERROR (Status)) { > goto Error2; > } > diff --git a/NetworkPkg/HttpDxe/HttpProto.c b/NetworkPkg/HttpDxe/HttpProto.c > index afc7db5a72..affa916bd6 100644 > --- a/NetworkPkg/HttpDxe/HttpProto.c > +++ b/NetworkPkg/HttpDxe/HttpProto.c > @@ -1,7 +1,7 @@ > /** @file > Miscellaneous routines for HttpDxe driver. > > -Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.
> +Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.
> (C) Copyright 2016 Hewlett Packard Enterprise Development LP
> SPDX-License-Identifier: BSD-2-Clause-Patent > > @@ -966,6 +966,7 @@ HttpCreateConnection ( > HttpInstance->IsTcp4ConnDone = FALSE; > HttpInstance->Tcp4ConnToken.CompletionToken.Status = EFI_NOT_READY; > Status = HttpInstance->Tcp4->Connect (HttpInstance->Tcp4, &HttpInstance->Tcp4ConnToken); > + HttpNotify (HttpEventConnectTcp, Status); > if (EFI_ERROR (Status)) { > DEBUG ((EFI_D_ERROR, "HttpCreateConnection: Tcp4->Connect() = %r\n", Status)); > return Status; > @@ -981,6 +982,7 @@ HttpCreateConnection ( > HttpInstance->IsTcp6ConnDone = FALSE; > HttpInstance->Tcp6ConnToken.CompletionToken.Status = EFI_NOT_READY; > Status = HttpInstance->Tcp6->Connect (HttpInstance->Tcp6, &HttpInstance->Tcp6ConnToken); > + HttpNotify (HttpEventConnectTcp, Status); > if (EFI_ERROR (Status)) { > DEBUG ((EFI_D_ERROR, "HttpCreateConnection: Tcp6->Connect() = %r\n", Status)); > return Status; > @@ -1277,6 +1279,7 @@ HttpConnectTcp4 ( > } > > Status = TlsConnectSession (HttpInstance, HttpInstance->TimeoutEvent); > + HttpNotify (HttpEventTlsConnectSession, Status); > > gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0); > > @@ -1369,6 +1372,7 @@ HttpConnectTcp6 ( > } > > Status = TlsConnectSession (HttpInstance, HttpInstance->TimeoutEvent); > + HttpNotify (HttpEventTlsConnectSession, Status); > > gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0); > > @@ -2195,3 +2199,55 @@ HttpTcpTokenCleanup ( > } > > } > + > +/** > + Send Events via EDKII_HTTP_CALLBACK_PROTOCOL. > + > + @param[in] Event The event that occurs in the current state. > + @param[in] EventStatus The Status of Event, EFI_SUCCESS or other errors. > + > +**/ > +VOID > +HttpNotify ( > + IN EDKII_HTTP_CALLBACK_EVENT Event, > + IN EFI_STATUS EventStatus > + ) > +{ > + EFI_STATUS Status; > + EFI_HANDLE *Handles; > + UINTN Index; > + UINTN HandleCount; > + EFI_HANDLE Handle; > + EDKII_HTTP_CALLBACK_PROTOCOL *HttpCallback; > + > + DEBUG ((DEBUG_INFO, "HttpNotify: Event - %d, EventStatus - %r\n", Event, EventStatus)); > + > + Handles = NULL; > + HandleCount = 0; > + Status = gBS->LocateHandleBuffer ( > + ByProtocol, > + &gEdkiiHttpCallbackProtocolGuid, > + NULL, > + &HandleCount, > + &Handles > + ); > + if (Status == EFI_SUCCESS) { > + for (Index = 0; Index < HandleCount; Index++) { > + Handle = Handles[Index]; > + Status = gBS->HandleProtocol ( > + Handle, > + &gEdkiiHttpCallbackProtocolGuid, > + (VOID **) &HttpCallback > + ); > + if (Status == EFI_SUCCESS) { > + DEBUG ((DEBUG_INFO, "HttpNotify: Notifying %p\n", HttpCallback)); > + HttpCallback->Callback ( > + HttpCallback, > + Event, > + EventStatus > + ); > + } > + } > + FreePool (Handles); > + } > +} > diff --git a/NetworkPkg/HttpDxe/HttpProto.h b/NetworkPkg/HttpDxe/HttpProto.h > index 00ba26aca4..5b90a6b074 100644 > --- a/NetworkPkg/HttpDxe/HttpProto.h > +++ b/NetworkPkg/HttpDxe/HttpProto.h > @@ -1,7 +1,7 @@ > /** @file > The header files of miscellaneous routines for HttpDxe driver. > > -Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.
> +Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.
> (C) Copyright 2016 Hewlett Packard Enterprise Development LP
> SPDX-License-Identifier: BSD-2-Clause-Patent > > @@ -609,4 +609,17 @@ HttpResponseWorker ( > IN HTTP_TOKEN_WRAP *Wrap > ); > > +/** > + Send Events via EDKII_HTTP_CALLBACK_PROTOCOL. > + > + @param[in] Event The event that occurs in the current state. > + @param[in] EventStatus The Status of Event, EFI_SUCCESS or other errors. > + > +**/ > +VOID > +HttpNotify ( > + IN EDKII_HTTP_CALLBACK_EVENT Event, > + IN EFI_STATUS EventStatus > + ); > + > #endif > diff --git a/NetworkPkg/Include/Protocol/HttpCallback.h b/NetworkPkg/Include/Protocol/HttpCallback.h > new file mode 100644 > index 0000000000..d036a8a4be > --- /dev/null > +++ b/NetworkPkg/Include/Protocol/HttpCallback.h > @@ -0,0 +1,85 @@ > +/** @file > + This file defines the EDKII HTTP Callback Protocol interface. > + > + Copyright (c) 2021, Intel Corporation. All rights reserved.
> + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#ifndef __EDKII_HTTP_CALLBACK_H__ > +#define __EDKII_HTTP_CALLBACK_H__ > + > +#define EDKII_HTTP_CALLBACK_PROTOCOL_GUID \ > + { \ > + 0x611114f1, 0xa37b, 0x4468, {0xa4, 0x36, 0x5b, 0xdd, 0xa1, 0x6a, 0xa2, 0x40} \ > + } > + > +typedef struct _EDKII_HTTP_CALLBACK_PROTOCOL EDKII_HTTP_CALLBACK_PROTOCOL; > + > +/// > +/// EDKII_HTTP_CALLBACK_EVENT > +/// > +typedef enum { > + /// > + /// The Status of DNS Event to retrieve the host address. > + /// EventStatus: > + /// EFI_SUCCESS Operation succeeded. > + /// EFI_OUT_OF_RESOURCES Failed to allocate needed resources. > + /// EFI_DEVICE_ERROR An unexpected network error occurred. > + /// Others Other errors as indicated. > + /// > + HttpEventDns, > + > + /// > + /// The Status of Event to initiate a nonblocking TCP connection request. > + /// EventStatus: > + /// EFI_SUCCESS The connection request is successfully initiated. > + /// EFI_NOT_STARTED This EFI TCP Protocol instance has not been configured. > + /// EFI_DEVICE_ERROR An unexpected system or network error occurred. > + /// Others Other errors as indicated. > + /// > + HttpEventConnectTcp, > + > + /// > + /// The Status of Event to connect one TLS session by finishing the TLS handshake process. > + /// EventStatus: > + /// EFI_SUCCESS The TLS session is established. > + /// EFI_OUT_OF_RESOURCES Can't allocate memory resources. > + /// EFI_ABORTED TLS session state is incorrect. > + /// Others Other error as indicated. > + /// > + HttpEventTlsConnectSession, > + > + /// > + /// The Status of Event to initialize Http session > + /// EventStatus: > + /// EFI_SUCCESS The initialization of session is done. > + /// Others Other error as indicated. > + /// > + HttpEventInitSession > +} EDKII_HTTP_CALLBACK_EVENT; > + > +/** > + Callback function that is invoked when HTTP event occurs. > + > + @param[in] This Pointer to the EDKII_HTTP_CALLBACK_PROTOCOL instance. > + @param[in] Event The event that occurs in the current state. > + @param[in] EventStatus The Status of Event, EFI_SUCCESS or other errors. > +**/ > +typedef > +VOID > +(EFIAPI * EDKII_HTTP_CALLBACK) ( > + IN EDKII_HTTP_CALLBACK_PROTOCOL *This, > + IN EDKII_HTTP_CALLBACK_EVENT Event, > + IN EFI_STATUS EventStatus > + ); > + > +/// > +/// EFI HTTP Callback Protocol is invoked when HTTP event occurs. > +/// > +struct _EDKII_HTTP_CALLBACK_PROTOCOL { > + EDKII_HTTP_CALLBACK Callback; > +}; > + > +extern EFI_GUID gEdkiiHttpCallbackProtocolGuid; > + > +#endif > diff --git a/NetworkPkg/NetworkPkg.dec b/NetworkPkg/NetworkPkg.dec > index b81f10ef6e..0f9f7bb15e 100644 > --- a/NetworkPkg/NetworkPkg.dec > +++ b/NetworkPkg/NetworkPkg.dec > @@ -88,6 +88,9 @@ > ## Include/Protocol/Dpc.h > gEfiDpcProtocolGuid = {0x480f8ae9, 0xc46, 0x4aa9, { 0xbc, 0x89, 0xdb, 0x9f, 0xba, 0x61, 0x98, 0x6 }} > > + ## Include/Protocol/HttpCallback.h > + gEdkiiHttpCallbackProtocolGuid = {0x611114f1, 0xa37b, 0x4468, {0xa4, 0x36, 0x5b, 0xdd, 0xa1, 0x6a, 0xa2, 0x40}} > + > [PcdsFixedAtBuild] > ## The max attempt number will be created by iSCSI driver. > # @Prompt Max attempt number.