mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-10-31 01:35:30 +00:00 
			
		
		
		
	 9344f09215
			
		
	
	
		9344f09215
		
	
	
	
	
		
			
			https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
		
			
				
	
	
		
			859 lines
		
	
	
		
			38 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			859 lines
		
	
	
		
			38 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   EFI TCPv6(Transmission Control Protocol version 6) Protocol Definition
 | |
|   The EFI TCPv6 Service Binding Protocol is used to locate EFI TCPv6 Protocol drivers to create
 | |
|   and destroy child of the driver to communicate with other host using TCP protocol.
 | |
|   The EFI TCPv6 Protocol provides services to send and receive data stream.
 | |
| 
 | |
|   Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.<BR>
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
|   @par Revision Reference:
 | |
|   This Protocol is introduced in UEFI Specification 2.2
 | |
| 
 | |
| **/
 | |
| 
 | |
| #ifndef __EFI_TCP6_PROTOCOL_H__
 | |
| #define __EFI_TCP6_PROTOCOL_H__
 | |
| 
 | |
| #include <Protocol/ManagedNetwork.h>
 | |
| #include <Protocol/Ip6.h>
 | |
| 
 | |
| #define EFI_TCP6_SERVICE_BINDING_PROTOCOL_GUID \
 | |
|   { \
 | |
|     0xec20eb79, 0x6c1a, 0x4664, {0x9a, 0x0d, 0xd2, 0xe4, 0xcc, 0x16, 0xd6, 0x64 } \
 | |
|   }
 | |
| 
 | |
| #define EFI_TCP6_PROTOCOL_GUID \
 | |
|   { \
 | |
|     0x46e44855, 0xbd60, 0x4ab7, {0xab, 0x0d, 0xa6, 0x79, 0xb9, 0x44, 0x7d, 0x77 } \
 | |
|   }
 | |
| 
 | |
| 
 | |
| typedef struct _EFI_TCP6_PROTOCOL EFI_TCP6_PROTOCOL;
 | |
| 
 | |
| ///
 | |
| /// EFI_TCP6_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 {
 | |
|   ///
 | |
|   /// The EFI TCPv6 Protocol instance handle that is using this
 | |
|   /// address/port pair.
 | |
|   ///
 | |
|   EFI_HANDLE        InstanceHandle;
 | |
|   ///
 | |
|   /// The local IPv6 address to which this TCP instance is bound. Set
 | |
|   /// to 0::/128, if this TCP instance is configured to listen on all
 | |
|   /// available source addresses.
 | |
|   ///
 | |
|   EFI_IPv6_ADDRESS  LocalAddress;
 | |
|   ///
 | |
|   /// The local port number in host byte order.
 | |
|   ///
 | |
|   UINT16            LocalPort;
 | |
|   ///
 | |
|   /// The remote IPv6 address. It may be 0::/128 if this TCP instance is
 | |
|   /// not connected to any remote host.
 | |
|   ///
 | |
|   EFI_IPv6_ADDRESS  RemoteAddress;
 | |
|   ///
 | |
|   /// The remote port number in host byte order. It may be zero if this
 | |
|   /// TCP instance is not connected to any remote host.
 | |
|   ///
 | |
|   UINT16            RemotePort;
 | |
| } EFI_TCP6_SERVICE_POINT;
 | |
| 
 | |
| ///
 | |
| /// EFI_TCP6_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; ///< The handle of the driver that creates this entry.
 | |
|   UINT32                 ServiceCount; ///< The number of address/port pairs following this data structure.
 | |
|   EFI_TCP6_SERVICE_POINT Services[1];  ///< List of address/port pairs that are currently in use.
 | |
| } EFI_TCP6_VARIABLE_DATA;
 | |
| 
 | |
| ///
 | |
| /// EFI_TCP6_ACCESS_POINT
 | |
| ///
 | |
| typedef struct {
 | |
|   ///
 | |
|   /// The local IP address assigned to this TCP instance. The EFI
 | |
|   /// TCPv6 driver will only deliver incoming packets whose
 | |
|   /// destination addresses exactly match the IP address. Set to zero to
 | |
|   /// let the underlying IPv6 driver choose a source address. If not zero
 | |
|   /// it must be one of the configured IP addresses in the underlying
 | |
|   /// IPv6 driver.
 | |
|   ///
 | |
|   EFI_IPv6_ADDRESS  StationAddress;
 | |
|   ///
 | |
|   /// The local port number to which this EFI TCPv6 Protocol instance
 | |
|   /// is bound. If the instance doesn't care the local port number, set
 | |
|   /// StationPort to zero to use an ephemeral port.
 | |
|   ///
 | |
|   UINT16            StationPort;
 | |
|   ///
 | |
|   /// The remote IP address to which this EFI TCPv6 Protocol instance
 | |
|   /// is connected. If ActiveFlag is FALSE (i.e. a passive TCPv6
 | |
|   /// instance), the instance only accepts connections from the
 | |
|   /// RemoteAddress. If ActiveFlag is TRUE the instance will
 | |
|   /// connect to the RemoteAddress, i.e., outgoing segments will be
 | |
|   /// sent to this address and only segments from this address will be
 | |
|   /// delivered to the application. When ActiveFlag is FALSE, it
 | |
|   /// can be set to zero and means that incoming connection requests
 | |
|   /// from any address will be accepted.
 | |
|   ///
 | |
|   EFI_IPv6_ADDRESS  RemoteAddress;
 | |
|   ///
 | |
|   /// The remote port to which this EFI TCPv6 Protocol instance
 | |
|   /// connects or from which connection request will be accepted by
 | |
|   /// this EFI TCPv6 Protocol instance. If ActiveFlag is FALSE it
 | |
|   /// can be zero and means that incoming connection request from
 | |
|   /// any port will be accepted. Its value can not be zero when
 | |
|   /// ActiveFlag is TRUE.
 | |
|   ///
 | |
|   UINT16            RemotePort;
 | |
|   ///
 | |
|   /// Set it to TRUE to initiate an active open. Set it to FALSE to
 | |
|   /// initiate a passive open to act as a server.
 | |
|   ///
 | |
|   BOOLEAN           ActiveFlag;
 | |
| } EFI_TCP6_ACCESS_POINT;
 | |
| 
 | |
| ///
 | |
| /// EFI_TCP6_OPTION
 | |
| ///
 | |
| typedef struct {
 | |
|   ///
 | |
|   /// The size of the TCP receive buffer.
 | |
|   ///
 | |
|   UINT32   ReceiveBufferSize;
 | |
|   ///
 | |
|   /// The size of the TCP send buffer.
 | |
|   ///
 | |
|   UINT32   SendBufferSize;
 | |
|   ///
 | |
|   /// The length of incoming connect request queue for a passive
 | |
|   /// instance. When set to zero, the value is implementation specific.
 | |
|   ///
 | |
|   UINT32   MaxSynBackLog;
 | |
|   ///
 | |
|   /// The maximum seconds a TCP instance will wait for before a TCP
 | |
|   /// connection established. When set to zero, the value is
 | |
|   /// implementation specific.
 | |
|   ///
 | |
|   UINT32   ConnectionTimeout;
 | |
|   ///
 | |
|   ///The number of times TCP will attempt to retransmit a packet on
 | |
|   ///an established connection. When set to zero, the value is
 | |
|   ///implementation specific.
 | |
|   ///
 | |
|   UINT32   DataRetries;
 | |
|   ///
 | |
|   /// How many seconds to wait in the FIN_WAIT_2 states for a final
 | |
|   /// FIN flag before the TCP instance is closed. This timeout is in
 | |
|   /// effective only if the application has called Close() to
 | |
|   /// disconnect the connection completely. It is also called
 | |
|   /// FIN_WAIT_2 timer in other implementations. When set to zero,
 | |
|   /// it should be disabled because the FIN_WAIT_2 timer itself is
 | |
|   /// against the standard. The default value is 60.
 | |
|   ///
 | |
|   UINT32   FinTimeout;
 | |
|   ///
 | |
|   /// How many seconds to wait in TIME_WAIT state before the TCP
 | |
|   /// instance is closed. The timer is disabled completely to provide a
 | |
|   /// method to close the TCP connection quickly if it is set to zero. It
 | |
|   /// is against the related RFC documents.
 | |
|   ///
 | |
|   UINT32   TimeWaitTimeout;
 | |
|   ///
 | |
|   /// The maximum number of TCP keep-alive probes to send before
 | |
|   /// giving up and resetting the connection if no response from the
 | |
|   /// other end. Set to zero to disable keep-alive probe.
 | |
|   ///
 | |
|   UINT32   KeepAliveProbes;
 | |
|   ///
 | |
|   /// The number of seconds a connection needs to be idle before TCP
 | |
|   /// sends out periodical keep-alive probes. When set to zero, the
 | |
|   /// value is implementation specific. It should be ignored if keep-
 | |
|   /// alive probe is disabled.
 | |
|   ///
 | |
|   UINT32   KeepAliveTime;
 | |
|   ///
 | |
|   /// The number of seconds between TCP keep-alive probes after the
 | |
|   /// periodical keep-alive probe if no response. When set to zero, the
 | |
|   /// value is implementation specific. It should be ignored if keep-
 | |
|   /// alive probe is disabled.
 | |
|   ///
 | |
|   UINT32   KeepAliveInterval;
 | |
|   ///
 | |
|   /// Set it to TRUE to enable the Nagle algorithm as defined in
 | |
|   /// RFC896. Set it to FALSE to disable it.
 | |
|   ///
 | |
|   BOOLEAN  EnableNagle;
 | |
|   ///
 | |
|   /// Set it to TRUE to enable TCP timestamps option as defined in
 | |
|   /// RFC1323. Set to FALSE to disable it.
 | |
|   ///
 | |
|   BOOLEAN  EnableTimeStamp;
 | |
|   ///
 | |
|   /// Set it to TRUE to enable TCP window scale option as defined in
 | |
|   /// RFC1323. Set it to FALSE to disable it.
 | |
|   ///
 | |
|   BOOLEAN  EnableWindowScaling;
 | |
|   ///
 | |
|   /// Set it to TRUE to enable selective acknowledge mechanism
 | |
|   /// described in RFC 2018. Set it to FALSE to disable it.
 | |
|   /// Implementation that supports SACK can optionally support
 | |
|   /// DSAK as defined in RFC 2883.
 | |
|   ///
 | |
|   BOOLEAN  EnableSelectiveAck;
 | |
|   ///
 | |
|   /// Set it to TRUE to enable path MTU discovery as defined in
 | |
|   /// RFC 1191. Set to FALSE to disable it.
 | |
|   ///
 | |
|   BOOLEAN  EnablePathMtuDiscovery;
 | |
| } EFI_TCP6_OPTION;
 | |
| 
 | |
| ///
 | |
| /// EFI_TCP6_CONFIG_DATA
 | |
| ///
 | |
| typedef struct {
 | |
|   ///
 | |
|   /// TrafficClass field in transmitted IPv6 packets.
 | |
|   ///
 | |
|   UINT8                 TrafficClass;
 | |
|   ///
 | |
|   /// HopLimit field in transmitted IPv6 packets.
 | |
|   ///
 | |
|   UINT8                 HopLimit;
 | |
|   ///
 | |
|   /// Used to specify TCP communication end settings for a TCP instance.
 | |
|   ///
 | |
|   EFI_TCP6_ACCESS_POINT AccessPoint;
 | |
|   ///
 | |
|   /// Used to configure the advance TCP option for a connection. If set
 | |
|   /// to NULL, implementation specific options for TCP connection will be used.
 | |
|   ///
 | |
|   EFI_TCP6_OPTION       *ControlOption;
 | |
| } EFI_TCP6_CONFIG_DATA;
 | |
| 
 | |
| ///
 | |
| /// EFI_TCP6_CONNECTION_STATE
 | |
| ///
 | |
| typedef enum {
 | |
|   Tcp6StateClosed      = 0,
 | |
|   Tcp6StateListen      = 1,
 | |
|   Tcp6StateSynSent     = 2,
 | |
|   Tcp6StateSynReceived = 3,
 | |
|   Tcp6StateEstablished = 4,
 | |
|   Tcp6StateFinWait1    = 5,
 | |
|   Tcp6StateFinWait2    = 6,
 | |
|   Tcp6StateClosing     = 7,
 | |
|   Tcp6StateTimeWait    = 8,
 | |
|   Tcp6StateCloseWait   = 9,
 | |
|   Tcp6StateLastAck     = 10
 | |
| } EFI_TCP6_CONNECTION_STATE;
 | |
| 
 | |
| ///
 | |
| /// EFI_TCP6_COMPLETION_TOKEN
 | |
| /// is used as a common header for various asynchronous tokens.
 | |
| ///
 | |
| typedef struct {
 | |
|   ///
 | |
|   /// The Event to signal after request is finished and Status field is
 | |
|   /// updated by the EFI TCPv6 Protocol driver.
 | |
|   ///
 | |
|   EFI_EVENT   Event;
 | |
|   ///
 | |
|   /// The result of the completed operation.
 | |
|   ///
 | |
|   EFI_STATUS  Status;
 | |
| } EFI_TCP6_COMPLETION_TOKEN;
 | |
| 
 | |
| ///
 | |
| /// EFI_TCP6_CONNECTION_TOKEN
 | |
| /// will be set if the active open succeeds or an unexpected
 | |
| /// error happens.
 | |
| ///
 | |
| 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 Tcp6StateEstablished.
 | |
|   /// EFI_CONNECTION_RESET:     The connect fails because the connection is reset
 | |
|   ///                           either by instance itself or the communication peer.
 | |
|   /// EFI_CONNECTION_REFUSED:   The receiving or transmission operation fails because this
 | |
|   ///                           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 times
 | |
|   ///                           out and some other ICMP error is received.
 | |
|   /// EFI_DEVICE_ERROR:         An unexpected system or network error occurred.
 | |
|   /// EFI_SECURITY_VIOLATION:   The active open was failed because of IPSec policy check.
 | |
|   /// EFI_NO_MEDIA:             There was a media error.
 | |
|   ///
 | |
|   EFI_TCP6_COMPLETION_TOKEN CompletionToken;
 | |
| } EFI_TCP6_CONNECTION_TOKEN;
 | |
| 
 | |
| ///
 | |
| /// EFI_TCP6_LISTEN_TOKEN
 | |
| /// returns when list operation finishes.
 | |
| ///
 | |
| typedef struct {
 | |
|   ///
 | |
|   /// The Status in CompletionToken will be set to the
 | |
|   /// following value if accept finishes:
 | |
|   /// EFI_SUCCESS:            A remote peer has successfully established a
 | |
|   ///                         connection to this instance. A new TCP instance has also been
 | |
|   ///                         created for the connection.
 | |
|   /// EFI_CONNECTION_RESET:   The accept fails because the connection is reset either
 | |
|   ///                         by instance itself or communication peer.
 | |
|   /// EFI_ABORTED:            The accept request has been aborted.
 | |
|   /// EFI_SECURITY_VIOLATION: The accept operation was failed because of IPSec policy check.
 | |
|   ///
 | |
|   EFI_TCP6_COMPLETION_TOKEN CompletionToken;
 | |
|   EFI_HANDLE                NewChildHandle;
 | |
| } EFI_TCP6_LISTEN_TOKEN;
 | |
| 
 | |
| ///
 | |
| /// EFI_TCP6_FRAGMENT_DATA
 | |
| /// allows multiple receive or transmit buffers to be specified. The
 | |
| /// purpose of this structure is to provide scattered read and write.
 | |
| ///
 | |
| typedef struct {
 | |
|   UINT32 FragmentLength;   ///< Length of data buffer in the fragment.
 | |
|   VOID   *FragmentBuffer;  ///< Pointer to the data buffer in the fragment.
 | |
| } EFI_TCP6_FRAGMENT_DATA;
 | |
| 
 | |
| ///
 | |
| /// EFI_TCP6_RECEIVE_DATA
 | |
| /// When TCPv6 driver wants to deliver received data to the application,
 | |
| /// it will pick up the first queued receiving token, update its
 | |
| /// Token->Packet.RxData then signal the Token->CompletionToken.Event.
 | |
| ///
 | |
| typedef struct {
 | |
|   ///
 | |
|   /// Whether the data is urgent. When this flag is set, the instance is in
 | |
|   /// urgent mode.
 | |
|   ///
 | |
|   BOOLEAN                 UrgentFlag;
 | |
|   ///
 | |
|   /// When calling Receive() function, it is the byte counts of all
 | |
|   /// Fragmentbuffer in FragmentTable allocated by user.
 | |
|   /// When the token is signaled by TCPv6 driver it is the length of
 | |
|   /// received data in the fragments.
 | |
|   ///
 | |
|   UINT32                  DataLength;
 | |
|   ///
 | |
|   /// Number of fragments.
 | |
|   ///
 | |
|   UINT32                  FragmentCount;
 | |
|   ///
 | |
|   /// An array of fragment descriptors.
 | |
|   ///
 | |
|   EFI_TCP6_FRAGMENT_DATA  FragmentTable[1];
 | |
| } EFI_TCP6_RECEIVE_DATA;
 | |
| 
 | |
| ///
 | |
| /// EFI_TCP6_TRANSMIT_DATA
 | |
| /// The EFI TCPv6 Protocol user must fill this data structure before sending a packet.
 | |
| /// The packet may contain multiple buffers in non-continuous memory locations.
 | |
| ///
 | |
| typedef struct {
 | |
|   ///
 | |
|   /// Push If TRUE, data must be transmitted promptly, and the PUSH bit in
 | |
|   /// the last TCP segment created will be set. If FALSE, data
 | |
|   /// transmission may be delayed to combine with data from
 | |
|   /// subsequent Transmit()s for efficiency.
 | |
|   ///
 | |
|   BOOLEAN                 Push;
 | |
|   ///
 | |
|   /// The data in the fragment table are urgent and urgent point is in
 | |
|   /// effect if TRUE. Otherwise those data are NOT considered urgent.
 | |
|   ///
 | |
|   BOOLEAN                 Urgent;
 | |
|   ///
 | |
|   /// Length of the data in the fragments.
 | |
|   ///
 | |
|   UINT32                  DataLength;
 | |
|   ///
 | |
|   /// Number of fragments.
 | |
|   ///
 | |
|   UINT32                  FragmentCount;
 | |
|   ///
 | |
|   /// An array of fragment descriptors.
 | |
|   ///
 | |
|   EFI_TCP6_FRAGMENT_DATA  FragmentTable[1];
 | |
| } EFI_TCP6_TRANSMIT_DATA;
 | |
| 
 | |
| ///
 | |
| /// EFI_TCP6_IO_TOKEN
 | |
| /// returns When transmission finishes or meets any unexpected error.
 | |
| ///
 | |
| 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_SECURITY_VIOLATION:   The receiving or transmission
 | |
|   ///                           operation was failed because of IPSec policy check
 | |
|   /// EFI_NO_MEDIA:             There was a media error.
 | |
|   ///
 | |
|   EFI_TCP6_COMPLETION_TOKEN CompletionToken;
 | |
|   union {
 | |
|     ///
 | |
|     /// When this token is used for receiving, RxData is a pointer to
 | |
|     /// EFI_TCP6_RECEIVE_DATA.
 | |
|     ///
 | |
|     EFI_TCP6_RECEIVE_DATA   *RxData;
 | |
|     ///
 | |
|     /// When this token is used for transmitting, TxData is a pointer to
 | |
|     /// EFI_TCP6_TRANSMIT_DATA.
 | |
|     ///
 | |
|     EFI_TCP6_TRANSMIT_DATA  *TxData;
 | |
|   } Packet;
 | |
| } EFI_TCP6_IO_TOKEN;
 | |
| 
 | |
| ///
 | |
| /// EFI_TCP6_CLOSE_TOKEN
 | |
| /// returns when close operation finishes.
 | |
| ///
 | |
| typedef struct {
 | |
|   ///
 | |
|   /// When close finishes or meets any unexpected error it will be set
 | |
|   /// to one of the following values:
 | |
|   /// EFI_SUCCESS:            The close operation completes successfully.
 | |
|   /// EFI_ABORTED:            User called configure with NULL without close stopping.
 | |
|   /// EFI_SECURITY_VIOLATION: The close operation was failed because of IPSec policy check.
 | |
|   ///
 | |
|   EFI_TCP6_COMPLETION_TOKEN CompletionToken;
 | |
|   ///
 | |
|   /// Abort the TCP connection on close instead of the standard TCP
 | |
|   /// close process when it is set to TRUE. This option can be used to
 | |
|   /// satisfy a fast disconnect.
 | |
|   ///
 | |
|   BOOLEAN                   AbortOnClose;
 | |
| } EFI_TCP6_CLOSE_TOKEN;
 | |
| 
 | |
| /**
 | |
|   Get the current operational status.
 | |
| 
 | |
|   The GetModeData() function copies the current operational settings of this EFI TCPv6
 | |
|   Protocol instance into user-supplied buffers. This function can also be used to retrieve
 | |
|   the operational setting of underlying drivers such as IPv6, MNP, or SNP.
 | |
| 
 | |
|   @param[in]  This              Pointer to the EFI_TCP6_PROTOCOL instance.
 | |
|   @param[out] Tcp6State         The buffer in which the current TCP state is returned.
 | |
|   @param[out] Tcp6ConfigData    The buffer in which the current TCP configuration is returned.
 | |
|   @param[out] Ip6ModeData       The buffer in which the current IPv6 configuration data used by
 | |
|                                 the TCP instance is returned.
 | |
|   @param[out] MnpConfigData     The buffer in which the current MNP configuration data used
 | |
|                                 indirectly by the TCP instance is returned.
 | |
|   @param[out] SnpModeData       The buffer in which the current SNP mode data used indirectly by
 | |
|                                 the TCP instance is returned.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The mode data was read.
 | |
|   @retval EFI_NOT_STARTED       No configuration data is available because this instance hasn't
 | |
|                                 been started.
 | |
|   @retval EFI_INVALID_PARAMETER This is NULL.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_TCP6_GET_MODE_DATA)(
 | |
|   IN  EFI_TCP6_PROTOCOL                  *This,
 | |
|   OUT EFI_TCP6_CONNECTION_STATE          *Tcp6State OPTIONAL,
 | |
|   OUT EFI_TCP6_CONFIG_DATA               *Tcp6ConfigData OPTIONAL,
 | |
|   OUT EFI_IP6_MODE_DATA                  *Ip6ModeData 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 TCPv6 instance.
 | |
| 
 | |
|   The Configure() function does the following:
 | |
|   - Initialize this TCP instance, i.e., initialize the communication end settings and
 | |
|     specify active open or passive open for an instance.
 | |
|   - Reset this TCP instance brutally, i.e., cancel all pending asynchronous tokens, flush
 | |
|     transmission and receiving buffer directly without informing the communication peer.
 | |
| 
 | |
|   No other TCPv6 Protocol operation except Poll() can be executed by this instance until
 | |
|   it is configured properly. For an active TCP instance, after a proper configuration it
 | |
|   may call Connect() to initiates the three-way handshake. For a passive TCP instance,
 | |
|   its state will transit to Tcp6StateListen after configuration, and Accept() may be
 | |
|   called to listen the incoming TCP connection requests. If Tcp6ConfigData is set to NULL,
 | |
|   the instance is reset. Resetting process will be done brutally, the state machine will
 | |
|   be set to Tcp6StateClosed directly, the receive queue and transmit queue will be flushed,
 | |
|   and no traffic is allowed through this instance.
 | |
| 
 | |
|   @param[in] This               Pointer to the EFI_TCP6_PROTOCOL instance.
 | |
|   @param[in] Tcp6ConfigData     Pointer to the configure data to configure the instance.
 | |
|                                 If Tcp6ConfigData is set to NULL, the instance is reset.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The operational settings are set, changed, or reset
 | |
|                                 successfully.
 | |
|   @retval EFI_NO_MAPPING        The underlying IPv6 driver was responsible for choosing a source
 | |
|                                 address for this instance, but no source address was available for
 | |
|                                 use.
 | |
|   @retval EFI_INVALID_PARAMETER One or more of the following conditions are TRUE:
 | |
|                                 - This is NULL.
 | |
|                                 - Tcp6ConfigData->AccessPoint.StationAddress is neither zero nor
 | |
|                                   one of the configured IP addresses in the underlying IPv6 driver.
 | |
|                                 - Tcp6ConfigData->AccessPoint.RemoteAddress isn't a valid unicast
 | |
|                                   IPv6 address.
 | |
|                                 - Tcp6ConfigData->AccessPoint.RemoteAddress is zero or
 | |
|                                   Tcp6ConfigData->AccessPoint.RemotePort is zero when
 | |
|                                   Tcp6ConfigData->AccessPoint.ActiveFlag is TRUE.
 | |
|                                 - A same access point has been configured in other TCP
 | |
|                                   instance properly.
 | |
|   @retval EFI_ACCESS_DENIED     Configuring TCP instance when it is configured without
 | |
|                                 calling Configure() with NULL to reset it.
 | |
|   @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().
 | |
|   @retval EFI_DEVICE_ERROR      An unexpected network or system error occurred.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_TCP6_CONFIGURE)(
 | |
|   IN EFI_TCP6_PROTOCOL        *This,
 | |
|   IN EFI_TCP6_CONFIG_DATA     *Tcp6ConfigData OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Initiate a nonblocking TCP connection request for an active TCP instance.
 | |
| 
 | |
|   The Connect() function will initiate an active open to the remote peer configured
 | |
|   in current TCP instance if it is configured active. If the connection succeeds or
 | |
|   fails due to any error, the ConnectionToken->CompletionToken.Event will be signaled
 | |
|   and ConnectionToken->CompletionToken.Status will be updated accordingly. This
 | |
|   function can only be called for the TCP instance in Tcp6StateClosed state. The
 | |
|   instance will transfer into Tcp6StateSynSent if the function returns EFI_SUCCESS.
 | |
|   If TCP three-way handshake succeeds, its state will become Tcp6StateEstablished,
 | |
|   otherwise, the state will return to Tcp6StateClosed.
 | |
| 
 | |
|   @param[in] This                Pointer to the EFI_TCP6_PROTOCOL instance.
 | |
|   @param[in] ConnectionToken     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 TCP instance has been changed to Tcp6StateSynSent.
 | |
|   @retval EFI_NOT_STARTED        This EFI TCPv6 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 Tcp6StateClosed 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 active open.
 | |
|   @retval EFI_DEVICE_ERROR       An unexpected system or network error occurred.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_TCP6_CONNECT)(
 | |
|   IN EFI_TCP6_PROTOCOL           *This,
 | |
|   IN EFI_TCP6_CONNECTION_TOKEN   *ConnectionToken
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Listen on the passive instance to accept an incoming connection request. This is a
 | |
|   nonblocking operation.
 | |
| 
 | |
|   The Accept() function initiates an asynchronous accept request to wait for an incoming
 | |
|   connection on the passive TCP instance. If a remote peer successfully establishes a
 | |
|   connection with this instance, a new TCP instance will be created and its handle will
 | |
|   be returned in ListenToken->NewChildHandle. The newly created instance is configured
 | |
|   by inheriting the passive instance's configuration and is ready for use upon return.
 | |
|   The new instance is in the Tcp6StateEstablished state.
 | |
| 
 | |
|   The ListenToken->CompletionToken.Event will be signaled when a new connection is
 | |
|   accepted, user aborts the listen or connection is reset.
 | |
| 
 | |
|   This function only can be called when current TCP instance is in Tcp6StateListen state.
 | |
| 
 | |
|   @param[in] This                Pointer to the EFI_TCP6_PROTOCOL instance.
 | |
|   @param[in] ListenToken         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 TCPv6 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 Tcp6StateListen 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_TCP6_ACCEPT)(
 | |
|   IN EFI_TCP6_PROTOCOL             *This,
 | |
|   IN EFI_TCP6_LISTEN_TOKEN         *ListenToken
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Queues outgoing data into the transmit queue.
 | |
| 
 | |
|   The Transmit() function queues a sending request to this TCP instance along with the
 | |
|   user data. The status of the token is updated and the event in the token will be
 | |
|   signaled once the data is sent out or some error occurs.
 | |
| 
 | |
|   @param[in] This                 Pointer to the EFI_TCP6_PROTOCOL instance.
 | |
|   @param[in] Token                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 TCPv6 Protocol instance has not been configured.
 | |
|   @retval EFI_NO_MAPPING          The underlying IPv6 driver was responsible for choosing a
 | |
|                                   source address for this instance, but no source address was
 | |
|                                   available for use.
 | |
|   @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.
 | |
|                                   - 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 are TRUE:
 | |
|                                   - A transmit completion token with the same Token->
 | |
|                                     CompletionToken.Event was already in the
 | |
|                                     transmission queue.
 | |
|                                   - The current instance is in Tcp6StateClosed state.
 | |
|                                   - The current instance is a passive one and it is in
 | |
|                                     Tcp6StateListen 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_TCP6_TRANSMIT)(
 | |
|   IN EFI_TCP6_PROTOCOL            *This,
 | |
|   IN EFI_TCP6_IO_TOKEN            *Token
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Places an asynchronous receive request into the receiving queue.
 | |
| 
 | |
|   The Receive() function places a completion token into the receive packet queue. This
 | |
|   function is always asynchronous. The caller must allocate the Token->CompletionToken.Event
 | |
|   and the FragmentBuffer used to receive data. The caller also must fill the DataLength which
 | |
|   represents the whole length of all FragmentBuffer. When the receive operation completes, the
 | |
|   EFI TCPv6 Protocol driver updates the Token->CompletionToken.Status and Token->Packet.RxData
 | |
|   fields and the Token->CompletionToken.Event is signaled. If got data the data and its length
 | |
|   will be copied into the FragmentTable, at the same time the full length of received data will
 | |
|   be recorded in the DataLength fields. Providing a proper notification function and context
 | |
|   for the event will enable the user to receive the notification and receiving status. That
 | |
|   notification function is guaranteed to not be re-entered.
 | |
| 
 | |
|   @param[in] This               Pointer to the EFI_TCP6_PROTOCOL instance.
 | |
|   @param[in] Token              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 TCPv6 Protocol instance has not been configured.
 | |
|   @retval EFI_NO_MAPPING         The underlying IPv6 driver was responsible for choosing a source
 | |
|                                  address for this instance, but no source address was available for use.
 | |
|   @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.
 | |
|                                  The EFI TCPv6 Protocol instance has been reset to startup defaults.
 | |
|   @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 Tcp6StateClosed state.
 | |
|                                  - The current instance is a passive one and it is in
 | |
|                                    Tcp6StateListen 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_TCP6_RECEIVE)(
 | |
|   IN EFI_TCP6_PROTOCOL           *This,
 | |
|   IN EFI_TCP6_IO_TOKEN           *Token
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Disconnecting a TCP connection gracefully or reset a TCP connection. This function is a
 | |
|   nonblocking operation.
 | |
| 
 | |
|   Initiate an asynchronous close token to TCP driver. After Close() is called, any buffered
 | |
|   transmission data will be sent by TCP driver and the current instance will have a graceful close
 | |
|   working flow described as RFC 793 if AbortOnClose is set to FALSE, otherwise, a rest packet
 | |
|   will be sent by TCP driver to fast disconnect this connection. When the close operation completes
 | |
|   successfully the TCP instance is in Tcp6StateClosed state, all pending asynchronous
 | |
|   operations are signaled and any buffers used for TCP network traffic are flushed.
 | |
| 
 | |
|   @param[in] This                Pointer to the EFI_TCP6_PROTOCOL instance.
 | |
|   @param[in] CloseToken          Pointer to the close token to return when operation finishes.
 | |
| 
 | |
|   @retval EFI_SUCCESS            The Close() is called successfully.
 | |
|   @retval EFI_NOT_STARTED        This EFI TCPv6 Protocol instance has not been configured.
 | |
|   @retval EFI_ACCESS_DENIED      One or more of the following are TRUE:
 | |
|                                  - CloseToken or CloseToken->CompletionToken.Event is already in use.
 | |
|                                  - 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_TCP6_CLOSE)(
 | |
|   IN EFI_TCP6_PROTOCOL           *This,
 | |
|   IN EFI_TCP6_CLOSE_TOKEN        *CloseToken
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Abort an asynchronous connection, listen, transmission or receive request.
 | |
| 
 | |
|   The Cancel() function aborts a pending connection, listen, transmit or
 | |
|   receive request.
 | |
| 
 | |
|   If Token is not NULL and the token is in the connection, listen, transmission
 | |
|   or receive queue when it is being cancelled, its Token->Status will be set
 | |
|   to EFI_ABORTED and then Token->Event will be signaled.
 | |
| 
 | |
|   If the token is not in one of the queues, which usually means that the
 | |
|   asynchronous operation has completed, EFI_NOT_FOUND is returned.
 | |
| 
 | |
|   If Token is NULL all asynchronous token issued by Connect(), Accept(),
 | |
|   Transmit() and Receive() will be aborted.
 | |
| 
 | |
|   @param[in] This                Pointer to the EFI_TCP6_PROTOCOL instance.
 | |
|   @param[in] Token               Pointer to a token that has been issued by
 | |
|                                  EFI_TCP6_PROTOCOL.Connect(),
 | |
|                                  EFI_TCP6_PROTOCOL.Accept(),
 | |
|                                  EFI_TCP6_PROTOCOL.Transmit() or
 | |
|                                  EFI_TCP6_PROTOCOL.Receive(). If NULL, all pending
 | |
|                                  tokens issued by above four functions will be aborted. Type
 | |
|                                  EFI_TCP6_COMPLETION_TOKEN is defined in
 | |
|                                  EFI_TCP_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_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_TCP6_CANCEL)(
 | |
|   IN EFI_TCP6_PROTOCOL           *This,
 | |
|   IN EFI_TCP6_COMPLETION_TOKEN   *Token OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Poll to receive incoming data and transmit outgoing segments.
 | |
| 
 | |
|   The Poll() function increases the rate that data is moved between the network
 | |
|   and application and can be called when the TCP instance is created successfully.
 | |
|   Its use is optional.
 | |
| 
 | |
|   @param[in] This                Pointer to the EFI_TCP6_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_TCP6_POLL)(
 | |
|   IN EFI_TCP6_PROTOCOL        *This
 | |
|   );
 | |
| 
 | |
| ///
 | |
| /// EFI_TCP6_PROTOCOL
 | |
| /// defines the EFI TCPv6 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 connect to remote peer as a client.
 | |
| /// Each instance has its own independent settings.
 | |
| ///
 | |
| struct _EFI_TCP6_PROTOCOL {
 | |
|   EFI_TCP6_GET_MODE_DATA  GetModeData;
 | |
|   EFI_TCP6_CONFIGURE      Configure;
 | |
|   EFI_TCP6_CONNECT        Connect;
 | |
|   EFI_TCP6_ACCEPT         Accept;
 | |
|   EFI_TCP6_TRANSMIT       Transmit;
 | |
|   EFI_TCP6_RECEIVE        Receive;
 | |
|   EFI_TCP6_CLOSE          Close;
 | |
|   EFI_TCP6_CANCEL         Cancel;
 | |
|   EFI_TCP6_POLL           Poll;
 | |
| };
 | |
| 
 | |
| extern EFI_GUID gEfiTcp6ServiceBindingProtocolGuid;
 | |
| extern EFI_GUID gEfiTcp6ProtocolGuid;
 | |
| 
 | |
| #endif
 | |
| 
 |