/** @file
  Header file of the Driver Binding and Service Binding Protocol for TlsDxe driver.

  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __EFI_TLS_DRIVER_H__
#define __EFI_TLS_DRIVER_H__

#include <Uefi.h>

//
// Driver Protocols
//
#include <Protocol/ServiceBinding.h>

//
// Driver Version
//
#define TLS_VERSION  0x00000000

#define TLS_SERVICE_SIGNATURE  SIGNATURE_32 ('T', 'L', 'S', 'S')

#define TLS_INSTANCE_SIGNATURE  SIGNATURE_32 ('T', 'L', 'S', 'I')

///
/// TLS Service Data
///
typedef struct _TLS_SERVICE TLS_SERVICE;

///
/// TLS Instance Data
///
typedef struct _TLS_INSTANCE TLS_INSTANCE;

struct _TLS_SERVICE {
  UINT32                          Signature;
  EFI_SERVICE_BINDING_PROTOCOL    ServiceBinding;

  UINT16                          TlsChildrenNum;
  LIST_ENTRY                      TlsChildrenList;

  //
  // Handle to install TlsServiceBinding protocol.
  //
  EFI_HANDLE                      Handle;
  EFI_HANDLE                      ImageHandle;

  //
  // Main SSL Context object which is created by a server or client once per program
  // life-time and which holds mainly default values for the SSL object which are later
  // created for the connections.
  //
  VOID                            *TlsCtx;
};

struct _TLS_INSTANCE {
  UINT32                            Signature;
  LIST_ENTRY                        Link;

  BOOLEAN                           InDestroy;

  TLS_SERVICE                       *Service;
  EFI_HANDLE                        ChildHandle;

  EFI_TLS_PROTOCOL                  Tls;
  EFI_TLS_CONFIGURATION_PROTOCOL    TlsConfig;

  EFI_TLS_SESSION_STATE             TlsSessionState;

  //
  // Main SSL Connection which is created by a server or a client
  // per established connection.
  //
  VOID                              *TlsConn;
};

#define TLS_SERVICE_FROM_THIS(a)   \
  CR (a, TLS_SERVICE, ServiceBinding, TLS_SERVICE_SIGNATURE)

#define TLS_INSTANCE_FROM_PROTOCOL(a)  \
  CR (a, TLS_INSTANCE, Tls, TLS_INSTANCE_SIGNATURE)

#define TLS_INSTANCE_FROM_CONFIGURATION(a)  \
  CR (a, TLS_INSTANCE, TlsConfig, TLS_INSTANCE_SIGNATURE)

/**
  Release all the resources used by the TLS instance.

  @param[in]  Instance        The TLS instance data.

**/
VOID
TlsCleanInstance (
  IN TLS_INSTANCE  *Instance
  );

/**
  Create the TLS instance and initialize it.

  @param[in]  Service              The pointer to the TLS service.
  @param[out] Instance             The pointer to the TLS instance.

  @retval EFI_OUT_OF_RESOURCES   Failed to allocate resources.
  @retval EFI_SUCCESS            The TLS instance is created.

**/
EFI_STATUS
TlsCreateInstance (
  IN  TLS_SERVICE   *Service,
  OUT TLS_INSTANCE  **Instance
  );

/**
  Release all the resources used by the TLS service binding instance.

  @param[in]  Service        The TLS service data.

**/
VOID
TlsCleanService (
  IN TLS_SERVICE  *Service
  );

/**
  Create then initialize a TLS service.

  @param[in]  Image                  ImageHandle of the TLS driver
  @param[out] Service                The service for TLS driver

  @retval EFI_OUT_OF_RESOURCES   Failed to allocate resource to create the service.
  @retval EFI_SUCCESS            The service is created for the driver.

**/
EFI_STATUS
TlsCreateService (
  IN  EFI_HANDLE   Image,
  OUT TLS_SERVICE  **Service
  );

/**
  Unloads an image.

  @param[in]  ImageHandle       Handle that identifies the image to be unloaded.

  @retval EFI_SUCCESS           The image has been unloaded.
  @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle.

**/
EFI_STATUS
EFIAPI
TlsUnload (
  IN EFI_HANDLE  ImageHandle
  );

/**
  This is the declaration of an EFI image entry point. This entry point is
  the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
  both device drivers and bus drivers.

  @param  ImageHandle           The firmware allocated handle for the UEFI image.
  @param  SystemTable           A pointer to the EFI System Table.

  @retval EFI_SUCCESS           The operation completed successfully.
  @retval Others                An unexpected error occurred.
**/
EFI_STATUS
EFIAPI
TlsDriverEntryPoint (
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE  *SystemTable
  );

/**
  Creates a child handle and installs a protocol.

  The CreateChild() function installs a protocol on ChildHandle.
  If ChildHandle is a pointer to NULL, then a new handle is created and returned in ChildHandle.
  If ChildHandle is not a pointer to NULL, then the protocol installs on the existing ChildHandle.

  @param[in] This        Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance.
  @param[in] ChildHandle Pointer to the handle of the child to create. If it is NULL,
                         then a new handle is created. If it is a pointer to an existing UEFI handle,
                         then the protocol is added to the existing UEFI handle.

  @retval EFI_SUCCESS           The protocol was added to ChildHandle.
  @retval EFI_INVALID_PARAMETER ChildHandle is NULL.
  @retval EFI_OUT_OF_RESOURCES  There are not enough resources available to create
                                the child.
  @retval other                 The child handle was not created.

**/
EFI_STATUS
EFIAPI
TlsServiceBindingCreateChild (
  IN EFI_SERVICE_BINDING_PROTOCOL  *This,
  IN EFI_HANDLE                    *ChildHandle
  );

/**
  Destroys a child handle with a protocol installed on it.

  The DestroyChild() function does the opposite of CreateChild(). It removes a protocol
  that was installed by CreateChild() from ChildHandle. If the removed protocol is the
  last protocol on ChildHandle, then ChildHandle is destroyed.

  @param  This        Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance.
  @param  ChildHandle Handle of the child to destroy.

  @retval EFI_SUCCESS           The protocol was removed from ChildHandle.
  @retval EFI_UNSUPPORTED       ChildHandle does not support the protocol that is being removed.
  @retval EFI_INVALID_PARAMETER Child handle is NULL.
  @retval EFI_ACCESS_DENIED     The protocol could not be removed from the ChildHandle
                                because its services are being used.
  @retval other                 The child handle was not destroyed.

**/
EFI_STATUS
EFIAPI
TlsServiceBindingDestroyChild (
  IN EFI_SERVICE_BINDING_PROTOCOL  *This,
  IN EFI_HANDLE                    ChildHandle
  );

#endif
