/** @file
  The header files of miscellaneous routines for HttpDxe driver.

Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __EFI_HTTP_PROTO_H__
#define __EFI_HTTP_PROTO_H__

#define DEF_BUF_LEN  2048

#define HTTP_SERVICE_SIGNATURE  SIGNATURE_32('H', 't', 't', 'S')

#define HTTP_SERVICE_FROM_PROTOCOL(a) \
  CR ( \
  (a), \
  HTTP_SERVICE, \
  ServiceBinding, \
  HTTP_SERVICE_SIGNATURE \
  )

//
// The state of HTTP protocol. It starts from UNCONFIGED.
//
#define HTTP_STATE_UNCONFIGED      0
#define HTTP_STATE_HTTP_CONFIGED   1
#define HTTP_STATE_TCP_CONFIGED    2
#define HTTP_STATE_TCP_UNCONFIGED  3
#define HTTP_STATE_TCP_CONNECTED   4
#define HTTP_STATE_TCP_CLOSED      5

//
// TCP configured data.
//
#define HTTP_TOS_DEAULT           8
#define HTTP_TTL_DEAULT           255
#define HTTP_BUFFER_SIZE_DEAULT   0x200000
#define HTTP_MAX_SYN_BACK_LOG     5
#define HTTP_CONNECTION_TIMEOUT   60
#define HTTP_DATA_RETRIES         12
#define HTTP_FIN_TIMEOUT          2
#define HTTP_KEEP_ALIVE_PROBES    6
#define HTTP_KEEP_ALIVE_TIME      7200
#define HTTP_KEEP_ALIVE_INTERVAL  30

#define HTTP_URL_BUFFER_LEN  4096

typedef struct _HTTP_SERVICE {
  UINT32                          Signature;
  EFI_SERVICE_BINDING_PROTOCOL    ServiceBinding;
  EFI_HANDLE                      Ip4DriverBindingHandle;
  EFI_HANDLE                      Ip6DriverBindingHandle;
  EFI_HANDLE                      ControllerHandle;
  EFI_HANDLE                      Tcp4ChildHandle;
  EFI_HANDLE                      Tcp6ChildHandle;
  LIST_ENTRY                      ChildrenList;
  UINTN                           ChildrenNumber;
  INTN                            State;
} HTTP_SERVICE;

typedef struct {
  EFI_TCP4_IO_TOKEN         Tx4Token;
  EFI_TCP4_TRANSMIT_DATA    Tx4Data;
  EFI_TCP6_IO_TOKEN         Tx6Token;
  EFI_TCP6_TRANSMIT_DATA    Tx6Data;
  EFI_TCP4_IO_TOKEN         Rx4Token;
  EFI_TCP4_RECEIVE_DATA     Rx4Data;
  EFI_TCP6_IO_TOKEN         Rx6Token;
  EFI_TCP6_RECEIVE_DATA     Rx6Data;
  BOOLEAN                   IsTxDone;
  BOOLEAN                   IsRxDone;
  UINTN                     BodyLen;
  EFI_HTTP_METHOD           Method;
} HTTP_TCP_TOKEN_WRAP;

typedef struct {
  EFI_TLS_VERSION           Version;
  EFI_TLS_CONNECTION_END    ConnectionEnd;
  EFI_TLS_VERIFY            VerifyMethod;
  EFI_TLS_VERIFY_HOST       VerifyHost;
  EFI_TLS_SESSION_STATE     SessionState;
} TLS_CONFIG_DATA;

//
// Callback data for HTTP_PARSER_CALLBACK()
//
typedef struct {
  UINTN    ParseDataLength;
  VOID     *ParseData;
  VOID     *Wrap;
} HTTP_CALLBACK_DATA;

typedef struct _HTTP_PROTOCOL {
  UINT32                            Signature;
  EFI_HTTP_PROTOCOL                 Http;
  EFI_HANDLE                        Handle;
  HTTP_SERVICE                      *Service;
  LIST_ENTRY                        Link; // Link to all HTTP instance from the service.
  BOOLEAN                           InDestroy;
  INTN                              State;
  EFI_HTTP_METHOD                   Method;

  UINTN                             StatusCode;

  EFI_EVENT                         TimeoutEvent;

  EFI_HANDLE                        Tcp4ChildHandle;
  EFI_TCP4_PROTOCOL                 *Tcp4;
  EFI_TCP4_CONFIG_DATA              Tcp4CfgData;
  EFI_TCP4_OPTION                   Tcp4Option;

  EFI_TCP4_CONNECTION_TOKEN         Tcp4ConnToken;
  BOOLEAN                           IsTcp4ConnDone;
  EFI_TCP4_CLOSE_TOKEN              Tcp4CloseToken;
  BOOLEAN                           IsTcp4CloseDone;
  CHAR8                             *RemoteHost;
  UINT16                            RemotePort;
  EFI_IPv4_ADDRESS                  RemoteAddr;

  EFI_HANDLE                        Tcp6ChildHandle;
  EFI_TCP6_PROTOCOL                 *Tcp6;
  EFI_TCP6_CONFIG_DATA              Tcp6CfgData;
  EFI_TCP6_OPTION                   Tcp6Option;

  EFI_TCP6_CONNECTION_TOKEN         Tcp6ConnToken;
  BOOLEAN                           IsTcp6ConnDone;
  EFI_TCP6_CLOSE_TOKEN              Tcp6CloseToken;
  BOOLEAN                           IsTcp6CloseDone;
  EFI_IPv6_ADDRESS                  RemoteIpv6Addr;

  //
  // Rx4Token or Rx6Token used for receiving HTTP header.
  //
  EFI_TCP4_IO_TOKEN                 Rx4Token;
  EFI_TCP4_RECEIVE_DATA             Rx4Data;
  EFI_TCP6_IO_TOKEN                 Rx6Token;
  EFI_TCP6_RECEIVE_DATA             Rx6Data;
  BOOLEAN                           IsRxDone;

  CHAR8                             **EndofHeader;
  CHAR8                             **HttpHeaders;
  CHAR8                             *CacheBody;
  CHAR8                             *NextMsg;
  UINTN                             CacheLen;
  UINTN                             CacheOffset;

  //
  // HTTP message-body parser.
  //
  VOID                              *MsgParser;
  HTTP_CALLBACK_DATA                CallbackData;

  EFI_HTTP_VERSION                  HttpVersion;
  UINT32                            TimeOutMillisec;
  BOOLEAN                           LocalAddressIsIPv6;

  EFI_HTTPv4_ACCESS_POINT           IPv4Node;
  EFI_HTTPv6_ACCESS_POINT           Ipv6Node;

  NET_MAP                           TxTokens;
  NET_MAP                           RxTokens;

  CHAR8                             *Url;
  UINTN                             UrlLen;

  //
  // Proxy support
  //
  CHAR8                             *ProxyUrl;
  UINTN                             ProxyUrlLen;
  BOOLEAN                           ProxyConnected;
  CHAR8                             *EndPointHostName;

  //
  // Https Support
  //
  BOOLEAN                           UseHttps;

  EFI_SERVICE_BINDING_PROTOCOL      *TlsSb;
  BOOLEAN                           TlsAlreadyCreated;
  TLS_CONFIG_DATA                   TlsConfigData;
  EFI_TLS_PROTOCOL                  *Tls;
  EFI_TLS_CONFIGURATION_PROTOCOL    *TlsConfiguration;
  EFI_TLS_SESSION_STATE             TlsSessionState;

  //
  // TlsTxData used for transmitting TLS related messages.
  //
  EFI_TCP4_IO_TOKEN                 Tcp4TlsTxToken;
  EFI_TCP4_TRANSMIT_DATA            Tcp4TlsTxData;
  EFI_TCP6_IO_TOKEN                 Tcp6TlsTxToken;
  EFI_TCP6_TRANSMIT_DATA            Tcp6TlsTxData;
  BOOLEAN                           TlsIsTxDone;

  //
  // TlsRxData used for receiving TLS related messages.
  //
  EFI_TCP4_IO_TOKEN                 Tcp4TlsRxToken;
  EFI_TCP4_RECEIVE_DATA             Tcp4TlsRxData;
  EFI_TCP6_IO_TOKEN                 Tcp6TlsRxToken;
  EFI_TCP6_RECEIVE_DATA             Tcp6TlsRxData;
  BOOLEAN                           TlsIsRxDone;

  BOOLEAN                           ConnectionClose;
} HTTP_PROTOCOL;

typedef struct {
  EFI_HTTP_TOKEN         *HttpToken;
  HTTP_PROTOCOL          *HttpInstance;
  HTTP_TCP_TOKEN_WRAP    TcpWrap;
} HTTP_TOKEN_WRAP;

#define HTTP_PROTOCOL_SIGNATURE  SIGNATURE_32('H', 't', 't', 'P')

#define HTTP_INSTANCE_FROM_PROTOCOL(a) \
  CR ( \
  (a), \
  HTTP_PROTOCOL, \
  Http, \
  HTTP_PROTOCOL_SIGNATURE \
  )

/**
  The common notify function used in HTTP driver.

  @param[in]  Event   The event signaled.
  @param[in]  Context The context.

**/
VOID
EFIAPI
HttpCommonNotify (
  IN EFI_EVENT  Event,
  IN VOID       *Context
  );

/**
  Create events for the TCP connection token and TCP close token.

  @param[in]  HttpInstance       Pointer to HTTP_PROTOCOL structure.

  @retval EFI_SUCCESS            The events are created successfully.
  @retval others                 Other error as indicated.

**/
EFI_STATUS
HttpCreateTcpConnCloseEvent (
  IN  HTTP_PROTOCOL  *HttpInstance
  );

/**
  Close events in the TCP connection token and TCP close token.

  @param[in]  HttpInstance   Pointer to HTTP_PROTOCOL structure.

**/
VOID
HttpCloseTcpConnCloseEvent (
  IN  HTTP_PROTOCOL  *HttpInstance
  );

/**
  Create event for the TCP transmit token.

  @param[in]  Wrap               Point to HTTP token's wrap data.

  @retval EFI_SUCCESS            The events is created successfully.
  @retval others                 Other error as indicated.

**/
EFI_STATUS
HttpCreateTcpTxEvent (
  IN  HTTP_TOKEN_WRAP  *Wrap
  );

/**
  Create event for the TCP receive token which is used to receive HTTP header.

  @param[in]  HttpInstance       Pointer to HTTP_PROTOCOL structure.

  @retval EFI_SUCCESS            The events is created successfully.
  @retval others                 Other error as indicated.

**/
EFI_STATUS
HttpCreateTcpRxEventForHeader (
  IN  HTTP_PROTOCOL  *HttpInstance
  );

/**
  Create event for the TCP receive token which is used to receive HTTP body.

  @param[in]  Wrap               Point to HTTP token's wrap data.

  @retval EFI_SUCCESS            The events is created successfully.
  @retval others                 Other error as indicated.

**/
EFI_STATUS
HttpCreateTcpRxEvent (
  IN  HTTP_TOKEN_WRAP  *Wrap
  );

/**
  Close Events for Tcp Receive Tokens for HTTP body and HTTP header.

  @param[in]  Wrap               Pointer to HTTP token's wrap data.

**/
VOID
HttpCloseTcpRxEvent (
  IN  HTTP_TOKEN_WRAP  *Wrap
  );

/**
  Initialize the HTTP_PROTOCOL structure to the unconfigured state.

  @param[in, out]  HttpInstance         Pointer to HTTP_PROTOCOL structure.
  @param[in]       IpVersion            Indicate us TCP4 protocol or TCP6 protocol.

  @retval EFI_SUCCESS       HTTP_PROTOCOL structure is initialized successfully.
  @retval Others            Other error as indicated.

**/
EFI_STATUS
HttpInitProtocol (
  IN OUT HTTP_PROTOCOL  *HttpInstance,
  IN     BOOLEAN        IpVersion
  );

/**
  Clean up the HTTP child, release all the resources used by it.

  @param[in]  HttpInstance       The HTTP child to clean up.

**/
VOID
HttpCleanProtocol (
  IN  HTTP_PROTOCOL  *HttpInstance
  );

/**
  Establish TCP connection with HTTP server.

  @param[in]  HttpInstance       The HTTP instance private data.

  @retval EFI_SUCCESS            The TCP connection is established.
  @retval Others                 Other error as indicated.

**/
EFI_STATUS
HttpCreateConnection (
  IN  HTTP_PROTOCOL  *HttpInstance
  );

/**
  Close existing TCP connection.

  @param[in]  HttpInstance       The HTTP instance private data.

  @retval EFI_SUCCESS            The TCP connection is closed.
  @retval Others                 Other error as indicated.

**/
EFI_STATUS
HttpCloseConnection (
  IN  HTTP_PROTOCOL  *HttpInstance
  );

/**
  Configure TCP4 protocol child.

  @param[in]  HttpInstance       The HTTP instance private data.
  @param[in]  Wrap               The HTTP token's wrap data.

  @retval EFI_SUCCESS            The TCP4 protocol child is configured.
  @retval Others                 Other error as indicated.

**/
EFI_STATUS
HttpConfigureTcp4 (
  IN  HTTP_PROTOCOL    *HttpInstance,
  IN  HTTP_TOKEN_WRAP  *Wrap
  );

/**
  Configure TCP6 protocol child.

  @param[in]  HttpInstance       The HTTP instance private data.
  @param[in]  Wrap               The HTTP token's wrap data.

  @retval EFI_SUCCESS            The TCP6 protocol child is configured.
  @retval Others                 Other error as indicated.

**/
EFI_STATUS
HttpConfigureTcp6 (
  IN  HTTP_PROTOCOL    *HttpInstance,
  IN  HTTP_TOKEN_WRAP  *Wrap
  );

/**
  Check existing TCP connection, if in error state, recover TCP4 connection. Then,
  connect one TLS session if required.

  @param[in]  HttpInstance       The HTTP instance private data.
  @param[in]  TlsConfigure       The Flag indicates whether it's the new Tls session.

  @retval EFI_SUCCESS            The TCP connection is established.
  @retval EFI_NOT_READY          TCP4 protocol child is not created or configured.
  @retval Others                 Other error as indicated.

**/
EFI_STATUS
HttpConnectTcp4 (
  IN  HTTP_PROTOCOL  *HttpInstance,
  IN  BOOLEAN        TlsConfigure
  );

/**
  Check existing TCP connection, if in error state, recover TCP6 connection. Then,
  connect one TLS session if required.

  @param[in]  HttpInstance       The HTTP instance private data.
  @param[in]  TlsConfigure       The Flag indicates whether it's the new Tls session.

  @retval EFI_SUCCESS            The TCP connection is established.
  @retval EFI_NOT_READY          TCP6 protocol child is not created or configured.
  @retval Others                 Other error as indicated.

**/
EFI_STATUS
HttpConnectTcp6 (
  IN  HTTP_PROTOCOL  *HttpInstance,
  IN  BOOLEAN        TlsConfigure
  );

/**
  Send the HTTP or HTTPS message through TCP4 or TCP6.

  @param[in]  HttpInstance       The HTTP instance private data.
  @param[in]  Wrap               The HTTP token's wrap data.
  @param[in]  TxString           Buffer containing the HTTP message string.
  @param[in]  TxStringLen        Length of the HTTP message string in bytes.

  @retval EFI_SUCCESS            The HTTP message is queued into TCP transmit queue.
  @retval Others                 Other error as indicated.

**/
EFI_STATUS
HttpTransmitTcp (
  IN  HTTP_PROTOCOL    *HttpInstance,
  IN  HTTP_TOKEN_WRAP  *Wrap,
  IN  UINT8            *TxString,
  IN  UINTN            TxStringLen
  );

/**
  Check whether the user's token or event has already
  been enqueue on HTTP Tx or Rx Token list.

  @param[in]  Map                The container of either user's transmit or receive
                                 token.
  @param[in]  Item               Current item to check against.
  @param[in]  Context            The Token to check against.

  @retval EFI_ACCESS_DENIED      The token or event has already been enqueued in IP
  @retval EFI_SUCCESS            The current item isn't the same token/event as the
                                 context.

**/
EFI_STATUS
EFIAPI
HttpTokenExist (
  IN NET_MAP       *Map,
  IN NET_MAP_ITEM  *Item,
  IN VOID          *Context
  );

/**
  Check whether the HTTP message associated with TxToken or Tx6Token is already sent out.

  @param[in]  Map                The container of TxToken.
  @param[in]  Item               Current item to check against.
  @param[in]  Context            The Token to check against.

  @retval EFI_NOT_READY          The HTTP message is still queued in the list.
  @retval EFI_SUCCESS            The HTTP message has been sent out.

**/
EFI_STATUS
EFIAPI
HttpTcpNotReady (
  IN NET_MAP       *Map,
  IN NET_MAP_ITEM  *Item,
  IN VOID          *Context
  );

/**
  Initialize Http session.

  @param[in]  HttpInstance       The HTTP instance private data.
  @param[in]  Wrap               The HTTP token's wrap data.
  @param[in]  Configure          The Flag indicates whether need to initialize session.
  @param[in]  TlsConfigure       The Flag indicates whether it's the new Tls session.

  @retval EFI_SUCCESS            The initialization of session is done.
  @retval Others                 Other error as indicated.

**/
EFI_STATUS
HttpInitSession (
  IN  HTTP_PROTOCOL    *HttpInstance,
  IN  HTTP_TOKEN_WRAP  *Wrap,
  IN  BOOLEAN          Configure,
  IN  BOOLEAN          TlsConfigure
  );

/**
  Transmit the HTTP or HTTPS message by processing the associated HTTP token.

  @param[in]  Map                The container of TxToken or Tx6Token.
  @param[in]  Item               Current item to check against.
  @param[in]  Context            The Token to check against.

  @retval EFI_OUT_OF_RESOURCES   Failed to allocate resources.
  @retval EFI_SUCCESS            The HTTP message is queued into TCP transmit
                                 queue.

**/
EFI_STATUS
EFIAPI
HttpTcpTransmit (
  IN NET_MAP       *Map,
  IN NET_MAP_ITEM  *Item,
  IN VOID          *Context
  );

/**
  Receive the HTTP response by processing the associated HTTP token.

  @param[in]  Map                The container of Rx4Token or Rx6Token.
  @param[in]  Item               Current item to check against.
  @param[in]  Context            The Token to check against.

  @retval EFI_SUCCESS            The HTTP response is queued into TCP receive
                                 queue.
  @retval Others                 Other error as indicated.

**/
EFI_STATUS
EFIAPI
HttpTcpReceive (
  IN NET_MAP       *Map,
  IN NET_MAP_ITEM  *Item,
  IN VOID          *Context
  );

/**
  Receive the HTTP header by processing the associated HTTP token.

  @param[in]       HttpInstance    The HTTP instance private data.
  @param[in, out]  SizeofHeaders   The HTTP header length.
  @param[in, out]  BufferSize      The size of buffer to cache the header message.
  @param[in]       Timeout         The time to wait for receiving the header packet.

  @retval EFI_SUCCESS              The HTTP header is received.
  @retval Others                   Other errors as indicated.

**/
EFI_STATUS
HttpTcpReceiveHeader (
  IN  HTTP_PROTOCOL  *HttpInstance,
  IN  OUT UINTN      *SizeofHeaders,
  IN  OUT UINTN      *BufferSize,
  IN  EFI_EVENT      Timeout
  );

/**
  Receive the HTTP body by processing the associated HTTP token.

  @param[in]  Wrap               The HTTP token's wrap data.
  @param[in]  HttpMsg            The HTTP message data.

  @retval EFI_SUCCESS            The HTTP body is received.
  @retval Others                 Other error as indicated.

**/
EFI_STATUS
HttpTcpReceiveBody (
  IN  HTTP_TOKEN_WRAP   *Wrap,
  IN  EFI_HTTP_MESSAGE  *HttpMsg
  );

/**
  Clean up Tcp Tokens while the Tcp transmission error occurs.

  @param[in]  Wrap               Pointer to HTTP token's wrap data.

**/
VOID
HttpTcpTokenCleanup (
  IN  HTTP_TOKEN_WRAP  *Wrap
  );

/**
  The work function of EfiHttpResponse().

  @param[in]  Wrap                Pointer to HTTP token's wrap data.

  @retval EFI_SUCCESS             Allocation succeeded.
  @retval EFI_OUT_OF_RESOURCES    Failed to complete the operation due to lack of resources.
  @retval EFI_NOT_READY           Can't find a corresponding TxToken.

**/
EFI_STATUS
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
