/** @file
  EFI TCPv4(Transmission Control Protocol version 4) Protocol Definition
  The EFI TCPv4 Service Binding Protocol is used to locate EFI TCPv4 Protocol drivers to create
  and destroy child of the driver to communicate with other host using TCP protocol.
  The EFI TCPv4 Protocol provides services to send and receive data stream.

Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This Protocol is introduced in UEFI Specification 2.0.

**/

#ifndef __EFI_TCP4_PROTOCOL_H__
#define __EFI_TCP4_PROTOCOL_H__

#include <Protocol/Ip4.h>

#define EFI_TCP4_SERVICE_BINDING_PROTOCOL_GUID \
  { \
    0x00720665, 0x67EB, 0x4a99, {0xBA, 0xF7, 0xD3, 0xC3, 0x3A, 0x1C, 0x7C, 0xC9 } \
  }

#define EFI_TCP4_PROTOCOL_GUID \
  { \
    0x65530BC7, 0xA359, 0x410f, {0xB0, 0x10, 0x5A, 0xAD, 0xC7, 0xEC, 0x2B, 0x62 } \
  }

typedef struct _EFI_TCP4_PROTOCOL EFI_TCP4_PROTOCOL;

///
/// EFI_TCP4_SERVICE_POINT is deprecated in the UEFI 2.4B and should not be used any more.
/// The definition in here is only present to provide backwards compatability.
///
typedef struct {
  EFI_HANDLE          InstanceHandle;
  EFI_IPv4_ADDRESS    LocalAddress;
  UINT16              LocalPort;
  EFI_IPv4_ADDRESS    RemoteAddress;
  UINT16              RemotePort;
} EFI_TCP4_SERVICE_POINT;

///
/// EFI_TCP4_VARIABLE_DATA is deprecated in the UEFI 2.4B and should not be used any more.
/// The definition in here is only present to provide backwards compatability.
///
typedef struct {
  EFI_HANDLE                DriverHandle;
  UINT32                    ServiceCount;
  EFI_TCP4_SERVICE_POINT    Services[1];
} EFI_TCP4_VARIABLE_DATA;

typedef struct {
  BOOLEAN             UseDefaultAddress;
  EFI_IPv4_ADDRESS    StationAddress;
  EFI_IPv4_ADDRESS    SubnetMask;
  UINT16              StationPort;
  EFI_IPv4_ADDRESS    RemoteAddress;
  UINT16              RemotePort;
  BOOLEAN             ActiveFlag;
} EFI_TCP4_ACCESS_POINT;

typedef struct {
  UINT32     ReceiveBufferSize;
  UINT32     SendBufferSize;
  UINT32     MaxSynBackLog;
  UINT32     ConnectionTimeout;
  UINT32     DataRetries;
  UINT32     FinTimeout;
  UINT32     TimeWaitTimeout;
  UINT32     KeepAliveProbes;
  UINT32     KeepAliveTime;
  UINT32     KeepAliveInterval;
  BOOLEAN    EnableNagle;
  BOOLEAN    EnableTimeStamp;
  BOOLEAN    EnableWindowScaling;
  BOOLEAN    EnableSelectiveAck;
  BOOLEAN    EnablePathMtuDiscovery;
} EFI_TCP4_OPTION;

typedef struct {
  //
  // I/O parameters
  //
  UINT8                    TypeOfService;
  UINT8                    TimeToLive;

  //
  // Access Point
  //
  EFI_TCP4_ACCESS_POINT    AccessPoint;

  //
  // TCP Control Options
  //
  EFI_TCP4_OPTION          *ControlOption;
} EFI_TCP4_CONFIG_DATA;

///
/// TCP4 connnection state
///
typedef enum {
  Tcp4StateClosed      = 0,
  Tcp4StateListen      = 1,
  Tcp4StateSynSent     = 2,
  Tcp4StateSynReceived = 3,
  Tcp4StateEstablished = 4,
  Tcp4StateFinWait1    = 5,
  Tcp4StateFinWait2    = 6,
  Tcp4StateClosing     = 7,
  Tcp4StateTimeWait    = 8,
  Tcp4StateCloseWait   = 9,
  Tcp4StateLastAck     = 10
} EFI_TCP4_CONNECTION_STATE;

typedef struct {
  EFI_EVENT     Event;
  EFI_STATUS    Status;
} EFI_TCP4_COMPLETION_TOKEN;

typedef struct {
  ///
  /// The Status in the CompletionToken will be set to one of
  /// the following values if the active open succeeds or an unexpected
  /// error happens:
  /// EFI_SUCCESS:              The active open succeeds and the instance's
  ///                           state is Tcp4StateEstablished.
  /// EFI_CONNECTION_RESET:     The connect fails because the connection is reset
  ///                           either by instance itself or the communication peer.
  /// EFI_CONNECTION_REFUSED:   The connect fails because this connection is initiated with
  ///                           an active open and the connection is refused.
  /// EFI_ABORTED:              The active open is aborted.
  /// EFI_TIMEOUT:              The connection establishment timer expires and
  ///                           no more specific information is available.
  /// EFI_NETWORK_UNREACHABLE:  The active open fails because
  ///                           an ICMP network unreachable error is received.
  /// EFI_HOST_UNREACHABLE:     The active open fails because an
  ///                           ICMP host unreachable error is received.
  /// EFI_PROTOCOL_UNREACHABLE: The active open fails
  ///                           because an ICMP protocol unreachable error is received.
  /// EFI_PORT_UNREACHABLE:     The connection establishment
  ///                           timer times out and an ICMP port unreachable error is received.
  /// EFI_ICMP_ERROR:           The connection establishment timer timeout and some other ICMP
  ///                           error is received.
  /// EFI_DEVICE_ERROR:         An unexpected system or network error occurred.
  /// EFI_NO_MEDIA:             There was a media error.
  ///
  EFI_TCP4_COMPLETION_TOKEN    CompletionToken;
} EFI_TCP4_CONNECTION_TOKEN;

typedef struct {
  EFI_TCP4_COMPLETION_TOKEN    CompletionToken;
  EFI_HANDLE                   NewChildHandle;
} EFI_TCP4_LISTEN_TOKEN;

typedef struct {
  UINT32    FragmentLength;
  VOID      *FragmentBuffer;
} EFI_TCP4_FRAGMENT_DATA;

typedef struct {
  BOOLEAN                   UrgentFlag;
  UINT32                    DataLength;
  UINT32                    FragmentCount;
  EFI_TCP4_FRAGMENT_DATA    FragmentTable[1];
} EFI_TCP4_RECEIVE_DATA;

typedef struct {
  BOOLEAN                   Push;
  BOOLEAN                   Urgent;
  UINT32                    DataLength;
  UINT32                    FragmentCount;
  EFI_TCP4_FRAGMENT_DATA    FragmentTable[1];
} EFI_TCP4_TRANSMIT_DATA;

typedef struct {
  ///
  /// When transmission finishes or meets any unexpected error it will
  /// be set to one of the following values:
  /// EFI_SUCCESS:              The receiving or transmission operation
  ///                           completes successfully.
  /// EFI_CONNECTION_FIN:       The receiving operation fails because the communication peer
  ///                           has closed the connection and there is no more data in the
  ///                           receive buffer of the instance.
  /// EFI_CONNECTION_RESET:     The receiving or transmission operation fails
  ///                           because this connection is reset either by instance
  ///                           itself or the communication peer.
  /// EFI_ABORTED:              The receiving or transmission is aborted.
  /// EFI_TIMEOUT:              The transmission timer expires and no more
  ///                           specific information is available.
  /// EFI_NETWORK_UNREACHABLE:  The transmission fails
  ///                           because an ICMP network unreachable error is received.
  /// EFI_HOST_UNREACHABLE:     The transmission fails because an
  ///                           ICMP host unreachable error is received.
  /// EFI_PROTOCOL_UNREACHABLE: The transmission fails
  ///                           because an ICMP protocol unreachable error is received.
  /// EFI_PORT_UNREACHABLE:     The transmission fails and an
  ///                           ICMP port unreachable error is received.
  /// EFI_ICMP_ERROR:           The transmission fails and some other
  ///                           ICMP error is received.
  /// EFI_DEVICE_ERROR:         An unexpected system or network error occurs.
  /// EFI_NO_MEDIA:             There was a media error.
  ///
  EFI_TCP4_COMPLETION_TOKEN    CompletionToken;
  union {
    ///
    /// When this token is used for receiving, RxData is a pointer to EFI_TCP4_RECEIVE_DATA.
    ///
    EFI_TCP4_RECEIVE_DATA     *RxData;
    ///
    /// When this token is used for transmitting, TxData is a pointer to EFI_TCP4_TRANSMIT_DATA.
    ///
    EFI_TCP4_TRANSMIT_DATA    *TxData;
  } Packet;
} EFI_TCP4_IO_TOKEN;

typedef struct {
  EFI_TCP4_COMPLETION_TOKEN    CompletionToken;
  BOOLEAN                      AbortOnClose;
} EFI_TCP4_CLOSE_TOKEN;

//
// Interface definition for TCP4 protocol
//

/**
  Get the current operational status.

  @param  This           The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  Tcp4State      The pointer to the buffer to receive the current TCP state.
  @param  Tcp4ConfigData The pointer to the buffer to receive the current TCP configuration.
  @param  Ip4ModeData    The pointer to the buffer to receive the current IPv4 configuration
                         data used by the TCPv4 instance.
  @param  MnpConfigData  The pointer to the buffer to receive the current MNP configuration
                         data used indirectly by the TCPv4 instance.
  @param  SnpModeData    The pointer to the buffer to receive the current SNP configuration
                         data used indirectly by the TCPv4 instance.

  @retval EFI_SUCCESS           The mode data was read.
  @retval EFI_INVALID_PARAMETER This is NULL.
  @retval EFI_NOT_STARTED       No configuration data is available because this instance hasn't
                                 been started.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_GET_MODE_DATA)(
  IN   EFI_TCP4_PROTOCOL                  *This,
  OUT  EFI_TCP4_CONNECTION_STATE          *Tcp4State      OPTIONAL,
  OUT  EFI_TCP4_CONFIG_DATA               *Tcp4ConfigData OPTIONAL,
  OUT  EFI_IP4_MODE_DATA                  *Ip4ModeData    OPTIONAL,
  OUT  EFI_MANAGED_NETWORK_CONFIG_DATA    *MnpConfigData  OPTIONAL,
  OUT  EFI_SIMPLE_NETWORK_MODE            *SnpModeData    OPTIONAL
  );

/**
  Initialize or brutally reset the operational parameters for this EFI TCPv4 instance.

  @param  This           The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  Tcp4ConfigData The pointer to the configure data to configure the instance.

  @retval EFI_SUCCESS           The operational settings are set, changed, or reset
                                successfully.
  @retval EFI_INVALID_PARAMETER Some parameter is invalid.
  @retval EFI_NO_MAPPING        When using a default address, configuration (through
                                DHCP, BOOTP, RARP, etc.) is not finished yet.
  @retval EFI_ACCESS_DENIED     Configuring TCP instance when it is configured without
                                calling Configure() with NULL to reset it.
  @retval EFI_DEVICE_ERROR      An unexpected network or system error occurred.
  @retval EFI_UNSUPPORTED       One or more of the control options are not supported in
                                the implementation.
  @retval EFI_OUT_OF_RESOURCES  Could not allocate enough system resources when
                                executing Configure().

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_CONFIGURE)(
  IN EFI_TCP4_PROTOCOL                   *This,
  IN EFI_TCP4_CONFIG_DATA                *TcpConfigData OPTIONAL
  );

/**
  Add or delete a route entry to the route table

  @param  This           The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  DeleteRoute    Set it to TRUE to delete this route from the routing table. Set it to
                         FALSE to add this route to the routing table.
                         DestinationAddress and SubnetMask are used as the
                         keywords to search route entry.
  @param  SubnetAddress  The destination network.
  @param  SubnetMask     The subnet mask of the destination network.
  @param  GatewayAddress The gateway address for this route. It must be on the same
                         subnet with the station address unless a direct route is specified.

  @retval EFI_SUCCESS           The operation completed successfully.
  @retval EFI_NOT_STARTED       The EFI TCPv4 Protocol instance has not been configured.
  @retval EFI_NO_MAPPING        When using a default address, configuration (DHCP, BOOTP,
                                RARP, etc.) is not finished yet.
  @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
                                - This is NULL.
                                - SubnetAddress is NULL.
                                - SubnetMask is NULL.
                                - GatewayAddress is NULL.
                                - *SubnetAddress is not NULL a valid subnet address.
                                - *SubnetMask is not a valid subnet mask.
                                - *GatewayAddress is not a valid unicast IP address or it
                                is not in the same subnet.
  @retval EFI_OUT_OF_RESOURCES  Could not allocate enough resources to add the entry to the
                                routing table.
  @retval EFI_NOT_FOUND         This route is not in the routing table.
  @retval EFI_ACCESS_DENIED     The route is already defined in the routing table.
  @retval EFI_UNSUPPORTED       The TCP driver does not support this operation.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_ROUTES)(
  IN EFI_TCP4_PROTOCOL                   *This,
  IN BOOLEAN                             DeleteRoute,
  IN EFI_IPv4_ADDRESS                    *SubnetAddress,
  IN EFI_IPv4_ADDRESS                    *SubnetMask,
  IN EFI_IPv4_ADDRESS                    *GatewayAddress
  );

/**
  Initiate a nonblocking TCP connection request for an active TCP instance.

  @param  This                  The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  ConnectionToken       The pointer to the connection token to return when the TCP three
                                way handshake finishes.

  @retval EFI_SUCCESS           The connection request is successfully initiated and the state
                                of this TCPv4 instance has been changed to Tcp4StateSynSent.
  @retval EFI_NOT_STARTED       This EFI TCPv4 Protocol instance has not been configured.
  @retval EFI_ACCESS_DENIED     One or more of the following conditions are TRUE:
                                - This instance is not configured as an active one.
                                - This instance is not in Tcp4StateClosed state.
  @retval EFI_INVALID_PARAMETER One or more of the following are TRUE:
                                - This is NULL.
                                - ConnectionToken is NULL.
                                - ConnectionToken->CompletionToken.Event is NULL.
  @retval EFI_OUT_OF_RESOURCES  The driver can't allocate enough resource to initiate the activ eopen.
  @retval EFI_DEVICE_ERROR      An unexpected system or network error occurred.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_CONNECT)(
  IN EFI_TCP4_PROTOCOL                   *This,
  IN EFI_TCP4_CONNECTION_TOKEN           *ConnectionToken
  );

/**
  Listen on the passive instance to accept an incoming connection request. This is a nonblocking operation.

  @param  This        The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  ListenToken The pointer to the listen token to return when operation finishes.

  @retval EFI_SUCCESS           The listen token has been queued successfully.
  @retval EFI_NOT_STARTED       This EFI TCPv4 Protocol instance has not been configured.
  @retval EFI_ACCESS_DENIED     One or more of the following are TRUE:
                                - This instance is not a passive instance.
                                - This instance is not in Tcp4StateListen state.
                                - The same listen token has already existed in the listen
                                token queue of this TCP instance.
  @retval EFI_INVALID_PARAMETER One or more of the following are TRUE:
                                - This is NULL.
                                - ListenToken is NULL.
                                - ListentToken->CompletionToken.Event is NULL.
  @retval EFI_OUT_OF_RESOURCES  Could not allocate enough resource to finish the operation.
  @retval EFI_DEVICE_ERROR      Any unexpected and not belonged to above category error.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_ACCEPT)(
  IN EFI_TCP4_PROTOCOL                   *This,
  IN EFI_TCP4_LISTEN_TOKEN               *ListenToken
  );

/**
  Queues outgoing data into the transmit queue.

  @param  This  The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  Token The pointer to the completion token to queue to the transmit queue.

  @retval EFI_SUCCESS             The data has been queued for transmission.
  @retval EFI_NOT_STARTED         This EFI TCPv4 Protocol instance has not been configured.
  @retval EFI_NO_MAPPING          When using a default address, configuration (DHCP, BOOTP,
                                  RARP, etc.) is not finished yet.
  @retval EFI_INVALID_PARAMETER   One or more of the following are TRUE:
                                  - This is NULL.
                                  - Token is NULL.
                                  - Token->CompletionToken.Event is NULL.
                                  - Token->Packet.TxData is NULL L.
                                  - Token->Packet.FragmentCount is zero.
                                  - Token->Packet.DataLength is not equal to the sum of fragment lengths.
  @retval EFI_ACCESS_DENIED       One or more of the following conditions is TRUE:
                                  - A transmit completion token with the same Token->CompletionToken.Event
                                  was already in the transmission queue.
                                  - The current instance is in Tcp4StateClosed state.
                                  - The current instance is a passive one and it is in
                                  Tcp4StateListen state.
                                  - User has called Close() to disconnect this connection.
  @retval EFI_NOT_READY           The completion token could not be queued because the
                                  transmit queue is full.
  @retval EFI_OUT_OF_RESOURCES    Could not queue the transmit data because of resource
                                  shortage.
  @retval EFI_NETWORK_UNREACHABLE There is no route to the destination network or address.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_TRANSMIT)(
  IN EFI_TCP4_PROTOCOL                   *This,
  IN EFI_TCP4_IO_TOKEN                   *Token
  );

/**
  Places an asynchronous receive request into the receiving queue.

  @param  This  The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  Token The pointer to a token that is associated with the receive data
                descriptor.

  @retval EFI_SUCCESS           The receive completion token was cached.
  @retval EFI_NOT_STARTED       This EFI TCPv4 Protocol instance has not been configured.
  @retval EFI_NO_MAPPING        When using a default address, configuration (DHCP, BOOTP, RARP,
                                etc.) is not finished yet.
  @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
                                - This is NULL.
                                - Token is NULL.
                                - Token->CompletionToken.Event is NULL.
                                - Token->Packet.RxData is NULL.
                                - Token->Packet.RxData->DataLength is 0.
                                - The Token->Packet.RxData->DataLength is not
                                the sum of all FragmentBuffer length in FragmentTable.
  @retval EFI_OUT_OF_RESOURCES The receive completion token could not be queued due to a lack of
                               system resources (usually memory).
  @retval EFI_DEVICE_ERROR     An unexpected system or network error occurred.
  @retval EFI_ACCESS_DENIED    One or more of the following conditions is TRUE:
                               - A receive completion token with the same Token-
                               >CompletionToken.Event was already in the receive
                               queue.
                               - The current instance is in Tcp4StateClosed state.
                               - The current instance is a passive one and it is in
                               Tcp4StateListen state.
                               - User has called Close() to disconnect this connection.
  @retval EFI_CONNECTION_FIN   The communication peer has closed the connection and there is
                               no any buffered data in the receive buffer of this instance.
  @retval EFI_NOT_READY        The receive request could not be queued because the receive queue is full.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_RECEIVE)(
  IN EFI_TCP4_PROTOCOL                   *This,
  IN EFI_TCP4_IO_TOKEN                   *Token
  );

/**
  Disconnecting a TCP connection gracefully or reset a TCP connection. This function is a
  nonblocking operation.

  @param  This       The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  CloseToken The pointer to the close token to return when operation finishes.

  @retval EFI_SUCCESS           The Close() is called successfully.
  @retval EFI_NOT_STARTED       This EFI TCPv4 Protocol instance has not been configured.
  @retval EFI_ACCESS_DENIED     One or more of the following are TRUE:
                                - Configure() has been called with
                                TcpConfigData set to NULL and this function has
                                not returned.
                                - Previous Close() call on this instance has not
                                finished.
  @retval EFI_INVALID_PARAMETER One or more of the following are TRUE:
                                - This is NULL.
                                - CloseToken is NULL.
                                - CloseToken->CompletionToken.Event is NULL.
  @retval EFI_OUT_OF_RESOURCES  Could not allocate enough resource to finish the operation.
  @retval EFI_DEVICE_ERROR      Any unexpected and not belonged to above category error.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_CLOSE)(
  IN EFI_TCP4_PROTOCOL                   *This,
  IN EFI_TCP4_CLOSE_TOKEN                *CloseToken
  );

/**
  Abort an asynchronous connection, listen, transmission or receive request.

  @param  This  The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  Token The pointer to a token that has been issued by
                EFI_TCP4_PROTOCOL.Connect(),
                EFI_TCP4_PROTOCOL.Accept(),
                EFI_TCP4_PROTOCOL.Transmit() or
                EFI_TCP4_PROTOCOL.Receive(). If NULL, all pending
                tokens issued by above four functions will be aborted. Type
                EFI_TCP4_COMPLETION_TOKEN is defined in
                EFI_TCP4_PROTOCOL.Connect().

  @retval  EFI_SUCCESS             The asynchronous I/O request is aborted and Token->Event
                                   is signaled.
  @retval  EFI_INVALID_PARAMETER   This is NULL.
  @retval  EFI_NOT_STARTED         This instance hasn't been configured.
  @retval  EFI_NO_MAPPING          When using the default address, configuration
                                   (DHCP, BOOTP,RARP, etc.) hasn't finished yet.
  @retval  EFI_NOT_FOUND           The asynchronous I/O request isn't found in the
                                   transmission or receive queue. It has either
                                   completed or wasn't issued by Transmit() and Receive().
  @retval  EFI_UNSUPPORTED         The implementation does not support this function.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_CANCEL)(
  IN EFI_TCP4_PROTOCOL                   *This,
  IN EFI_TCP4_COMPLETION_TOKEN           *Token OPTIONAL
  );

/**
  Poll to receive incoming data and transmit outgoing segments.

  @param  This The pointer to the EFI_TCP4_PROTOCOL instance.

  @retval  EFI_SUCCESS           Incoming or outgoing data was processed.
  @retval  EFI_INVALID_PARAMETER This is NULL.
  @retval  EFI_DEVICE_ERROR      An unexpected system or network error occurred.
  @retval  EFI_NOT_READY         No incoming or outgoing data is processed.
  @retval  EFI_TIMEOUT           Data was dropped out of the transmission or receive queue.
                                 Consider increasing the polling rate.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_POLL)(
  IN EFI_TCP4_PROTOCOL                   *This
  );

///
/// The EFI_TCP4_PROTOCOL defines the EFI TCPv4 Protocol child to be used by
/// any network drivers or applications to send or receive data stream.
/// It can either listen on a specified port as a service or actively connected
/// to remote peer as a client. Each instance has its own independent settings,
/// such as the routing table.
///
struct _EFI_TCP4_PROTOCOL {
  EFI_TCP4_GET_MODE_DATA    GetModeData;
  EFI_TCP4_CONFIGURE        Configure;
  EFI_TCP4_ROUTES           Routes;
  EFI_TCP4_CONNECT          Connect;
  EFI_TCP4_ACCEPT           Accept;
  EFI_TCP4_TRANSMIT         Transmit;
  EFI_TCP4_RECEIVE          Receive;
  EFI_TCP4_CLOSE            Close;
  EFI_TCP4_CANCEL           Cancel;
  EFI_TCP4_POLL             Poll;
};

extern EFI_GUID  gEfiTcp4ServiceBindingProtocolGuid;
extern EFI_GUID  gEfiTcp4ProtocolGuid;

#endif
