From ab796d3e2ab41bde3a0bdd932cdcd09fd641e00c Mon Sep 17 00:00:00 2001 From: Heng Luo Date: Wed, 28 Jul 2021 19:58:05 +0800 Subject: [PATCH] NetworkPkg: Add HTTP Additional Event Notifications 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 Reviewed-by: Maciej Rabeda Reviewed-by: Jiaxin Wu --- NetworkPkg/HttpDxe/HttpDriver.h | 3 +- NetworkPkg/HttpDxe/HttpDxe.inf | 1 + NetworkPkg/HttpDxe/HttpImpl.c | 2 + NetworkPkg/HttpDxe/HttpProto.c | 58 ++++++++++++++- NetworkPkg/HttpDxe/HttpProto.h | 13 ++++ NetworkPkg/Include/Protocol/HttpCallback.h | 85 ++++++++++++++++++++++ NetworkPkg/NetworkPkg.dec | 3 + 7 files changed, 163 insertions(+), 2 deletions(-) create mode 100644 NetworkPkg/Include/Protocol/HttpCallback.h 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 8dd3838793..af681c0184 100644 --- a/NetworkPkg/HttpDxe/HttpDxe.inf +++ b/NetworkPkg/HttpDxe/HttpDxe.inf @@ -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 8790e9b4e0..7285b0fbeb 100644 --- a/NetworkPkg/HttpDxe/HttpImpl.c +++ b/NetworkPkg/HttpDxe/HttpImpl.c @@ -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 6b3e49090e..637d350539 100644 --- a/NetworkPkg/HttpDxe/HttpProto.h +++ b/NetworkPkg/HttpDxe/HttpProto.h @@ -608,4 +608,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..7e3f82ae75 --- /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 /* EDKII_HTTP_CALLBACK_H_ */ diff --git a/NetworkPkg/NetworkPkg.dec b/NetworkPkg/NetworkPkg.dec index 3e1f5c101d..928e84fec4 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. -- 2.39.2