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 | ||||
|   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> | ||||
| // | ||||
|   | ||||
| @@ -65,6 +65,7 @@ | ||||
|   gEfiTlsServiceBindingProtocolGuid                ## SOMETIMES_CONSUMES | ||||
|   gEfiTlsProtocolGuid                              ## SOMETIMES_CONSUMES | ||||
|   gEfiTlsConfigurationProtocolGuid                 ## SOMETIMES_CONSUMES | ||||
|   gEdkiiHttpCallbackProtocolGuid                   ## SOMETIMES_CONSUMES | ||||
|  | ||||
| [Guids] | ||||
|   gEfiTlsCaCertificateGuid                         ## SOMETIMES_CONSUMES  ## Variable:L"TlsCaCertificate" | ||||
|   | ||||
| @@ -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; | ||||
|   } | ||||
|   | ||||
| @@ -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); | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
							
								
								
									
										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 | ||||
|   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. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user