/** @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>
(c) Copyright 2025 HP Development Company, L.P.
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_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
