Re: [Patch V3] NetworkPkg: Add HTTP Additional Event Notifications


Maciej Rabeda
 

On 28-Jul-21 15:50, Maciej Rabeda wrote:
Reviewed-by: Maciej Rabeda <maciej.rabeda@linux.intel.com>

On 28-Jul-21 13:58, Heng Luo wrote:
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>
---

  NetworkPkg/HttpDxe/HttpDriver.h            |  3 ++-
  NetworkPkg/HttpDxe/HttpDxe.inf             |  3 ++-
  NetworkPkg/HttpDxe/HttpImpl.c              |  4 +++-
  NetworkPkg/HttpDxe/HttpProto.c             | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
  NetworkPkg/HttpDxe/HttpProto.h             | 15 ++++++++++++++-
  NetworkPkg/Include/Protocol/HttpCallback.h | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  NetworkPkg/NetworkPkg.dec                  |  3 +++
  7 files changed, 166 insertions(+), 5 deletions(-)

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.<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>
  //
diff --git a/NetworkPkg/HttpDxe/HttpDxe.inf b/NetworkPkg/HttpDxe/HttpDxe.inf
index 35fe31af18..23fb9ec394 100644
--- a/NetworkPkg/HttpDxe/HttpDxe.inf
+++ b/NetworkPkg/HttpDxe/HttpDxe.inf
@@ -1,7 +1,7 @@
  ## @file
  #  Implementation of EFI HTTP protocol interfaces.
  #
-#  Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
+#  Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR>
  #
  #  SPDX-License-Identifier: BSD-2-Clause-Patent
  #
@@ -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 5a6ecbc9d9..97f15d229f 100644
--- a/NetworkPkg/HttpDxe/HttpImpl.c
+++ b/NetworkPkg/HttpDxe/HttpImpl.c
@@ -1,7 +1,7 @@
  /** @file
    Implementation of EFI_HTTP_PROTOCOL protocol interfaces.
  -  Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR>
    (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>
      SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -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.<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);
+  }
+}
diff --git a/NetworkPkg/HttpDxe/HttpProto.h b/NetworkPkg/HttpDxe/HttpProto.h
index 00ba26aca4..5b90a6b074 100644
--- a/NetworkPkg/HttpDxe/HttpProto.h
+++ b/NetworkPkg/HttpDxe/HttpProto.h
@@ -1,7 +1,7 @@
  /** @file
    The header files of 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
  @@ -609,4 +609,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..d036a8a4be
--- /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.<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
diff --git a/NetworkPkg/NetworkPkg.dec b/NetworkPkg/NetworkPkg.dec
index b81f10ef6e..0f9f7bb15e 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.



Join devel@edk2.groups.io to automatically receive all group messages.