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 <heng.luo@intel.com>
Cc: Maciej Rabeda <maciej.rabeda@linux.intel.com>
Cc: Jiaxin Wu <jiaxin.wu@intel.com>
Cc: Siyuan Fu <siyuan.fu@intel.com>
Reviewed-by: Maciej Rabeda <maciej.rabeda@linux.intel.com>
Reviewed-by: Jiaxin Wu <jiaxin.wu@intel.com>
This commit is contained in:
Heng Luo
2021-07-28 19:58:05 +08:00
committed by mergify[bot]
parent ac70e71b1f
commit ab796d3e2a
7 changed files with 163 additions and 2 deletions

View File

@ -1,7 +1,7 @@
/** @file /** @file
The header files of the driver binding and service binding protocol for HttpDxe driver. The header files of the driver binding and service binding protocol for HttpDxe driver.
Copyright (c) 2015 - 2018, 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>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
@ -47,6 +47,7 @@
#include <Protocol/Ip6Config.h> #include <Protocol/Ip6Config.h>
#include <Protocol/Tls.h> #include <Protocol/Tls.h>
#include <Protocol/TlsConfig.h> #include <Protocol/TlsConfig.h>
#include <Protocol/HttpCallback.h>
#include <Guid/ImageAuthentication.h> #include <Guid/ImageAuthentication.h>
// //

View File

@ -65,6 +65,7 @@
gEfiTlsServiceBindingProtocolGuid ## SOMETIMES_CONSUMES gEfiTlsServiceBindingProtocolGuid ## SOMETIMES_CONSUMES
gEfiTlsProtocolGuid ## SOMETIMES_CONSUMES gEfiTlsProtocolGuid ## SOMETIMES_CONSUMES
gEfiTlsConfigurationProtocolGuid ## SOMETIMES_CONSUMES gEfiTlsConfigurationProtocolGuid ## SOMETIMES_CONSUMES
gEdkiiHttpCallbackProtocolGuid ## SOMETIMES_CONSUMES
[Guids] [Guids]
gEfiTlsCaCertificateGuid ## SOMETIMES_CONSUMES ## Variable:L"TlsCaCertificate" gEfiTlsCaCertificateGuid ## SOMETIMES_CONSUMES ## Variable:L"TlsCaCertificate"

View File

@ -527,6 +527,7 @@ EfiHttpRequest (
} else { } else {
Status = HttpDns6 (HttpInstance, HostNameStr, &HttpInstance->RemoteIpv6Addr); Status = HttpDns6 (HttpInstance, HostNameStr, &HttpInstance->RemoteIpv6Addr);
} }
HttpNotify (HttpEventDns, Status);
FreePool (HostNameStr); FreePool (HostNameStr);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
@ -588,6 +589,7 @@ EfiHttpRequest (
Configure || ReConfigure, Configure || ReConfigure,
TlsConfigure TlsConfigure
); );
HttpNotify (HttpEventInitSession, Status);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto Error2; goto Error2;
} }

View File

@ -1,7 +1,7 @@
/** @file /** @file
Miscellaneous routines for HttpDxe driver. Miscellaneous routines for HttpDxe driver.
Copyright (c) 2015 - 2018, 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>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
@ -966,6 +966,7 @@ HttpCreateConnection (
HttpInstance->IsTcp4ConnDone = FALSE; HttpInstance->IsTcp4ConnDone = FALSE;
HttpInstance->Tcp4ConnToken.CompletionToken.Status = EFI_NOT_READY; HttpInstance->Tcp4ConnToken.CompletionToken.Status = EFI_NOT_READY;
Status = HttpInstance->Tcp4->Connect (HttpInstance->Tcp4, &HttpInstance->Tcp4ConnToken); Status = HttpInstance->Tcp4->Connect (HttpInstance->Tcp4, &HttpInstance->Tcp4ConnToken);
HttpNotify (HttpEventConnectTcp, Status);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((EFI_D_ERROR, "HttpCreateConnection: Tcp4->Connect() = %r\n", Status)); DEBUG ((EFI_D_ERROR, "HttpCreateConnection: Tcp4->Connect() = %r\n", Status));
return Status; return Status;
@ -981,6 +982,7 @@ HttpCreateConnection (
HttpInstance->IsTcp6ConnDone = FALSE; HttpInstance->IsTcp6ConnDone = FALSE;
HttpInstance->Tcp6ConnToken.CompletionToken.Status = EFI_NOT_READY; HttpInstance->Tcp6ConnToken.CompletionToken.Status = EFI_NOT_READY;
Status = HttpInstance->Tcp6->Connect (HttpInstance->Tcp6, &HttpInstance->Tcp6ConnToken); Status = HttpInstance->Tcp6->Connect (HttpInstance->Tcp6, &HttpInstance->Tcp6ConnToken);
HttpNotify (HttpEventConnectTcp, Status);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((EFI_D_ERROR, "HttpCreateConnection: Tcp6->Connect() = %r\n", Status)); DEBUG ((EFI_D_ERROR, "HttpCreateConnection: Tcp6->Connect() = %r\n", Status));
return Status; return Status;
@ -1277,6 +1279,7 @@ HttpConnectTcp4 (
} }
Status = TlsConnectSession (HttpInstance, HttpInstance->TimeoutEvent); Status = TlsConnectSession (HttpInstance, HttpInstance->TimeoutEvent);
HttpNotify (HttpEventTlsConnectSession, Status);
gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0); gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0);
@ -1369,6 +1372,7 @@ HttpConnectTcp6 (
} }
Status = TlsConnectSession (HttpInstance, HttpInstance->TimeoutEvent); Status = TlsConnectSession (HttpInstance, HttpInstance->TimeoutEvent);
HttpNotify (HttpEventTlsConnectSession, Status);
gBS->SetTimer (HttpInstance->TimeoutEvent, TimerCancel, 0); 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);
}
}

View File

@ -608,4 +608,17 @@ HttpResponseWorker (
IN HTTP_TOKEN_WRAP *Wrap 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 #endif

View File

@ -0,0 +1,85 @@
/** @file
This file defines the EDKII HTTP Callback Protocol interface.
Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
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_ */

View File

@ -88,6 +88,9 @@
## Include/Protocol/Dpc.h ## Include/Protocol/Dpc.h
gEfiDpcProtocolGuid = {0x480f8ae9, 0xc46, 0x4aa9, { 0xbc, 0x89, 0xdb, 0x9f, 0xba, 0x61, 0x98, 0x6 }} 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] [PcdsFixedAtBuild]
## The max attempt number will be created by iSCSI driver. ## The max attempt number will be created by iSCSI driver.
# @Prompt Max attempt number. # @Prompt Max attempt number.