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
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>
SPDX-License-Identifier: BSD-2-Clause-Patent
@ -47,6 +47,7 @@
#include <Protocol/Ip6Config.h>
#include <Protocol/Tls.h>
#include <Protocol/TlsConfig.h>
#include <Protocol/HttpCallback.h>
#include <Guid/ImageAuthentication.h>
//

View File

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

View File

@ -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;
}

View File

@ -1,7 +1,7 @@
/** @file
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>
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);
}
}

View File

@ -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

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
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.