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:
		| @@ -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> | ||||||
| // | // | ||||||
|   | |||||||
| @@ -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" | ||||||
|   | |||||||
| @@ -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; | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -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); | ||||||
|  |   } | ||||||
|  | } | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
							
								
								
									
										85
									
								
								NetworkPkg/Include/Protocol/HttpCallback.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										85
									
								
								NetworkPkg/Include/Protocol/HttpCallback.h
									
									
									
									
									
										Normal 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_ */ | ||||||
| @@ -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. | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user