mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-10-31 05:28:13 +00:00 
			
		
		
		
	 e826679b5c
			
		
	
	
		e826679b5c
		
	
	
	
	
		
			
			warter -> water Maunual -> Manual Cc: Ye Ting <ting.ye@intel.com> Cc: Fu Siyuan <siyuan.fu@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Wu Jiaxin <jiaxin.wu@intel.com> Reviewed-by: Fu Siyuan <siyuan.fu@intel.com>
		
			
				
	
	
		
			987 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			987 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Socket header file.
 | |
| 
 | |
| Copyright (c) 2005 - 2012, Intel Corporation. All rights reserved.<BR>
 | |
| This program and the accompanying materials
 | |
| are licensed and made available under the terms and conditions of the BSD License
 | |
| which accompanies this distribution.  The full text of the license may be found at
 | |
| http://opensource.org/licenses/bsd-license.php<BR>
 | |
| 
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #ifndef _SOCKET_H_
 | |
| #define _SOCKET_H_
 | |
| 
 | |
| #include <Uefi.h>
 | |
| 
 | |
| #include <Protocol/Ip4.h>
 | |
| #include <Protocol/Tcp4.h>
 | |
| #include <Protocol/Udp4.h>
 | |
| 
 | |
| #include <Library/NetLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/BaseMemoryLib.h>
 | |
| #include <Library/MemoryAllocationLib.h>
 | |
| #include <Library/UefiRuntimeServicesTableLib.h>
 | |
| #include <Library/UefiBootServicesTableLib.h>
 | |
| #include <Library/UefiDriverEntryPoint.h>
 | |
| #include <Library/UefiLib.h>
 | |
| #include <Library/DpcLib.h>
 | |
| #include <Library/PrintLib.h>
 | |
| 
 | |
| #define SOCK_SND_BUF        0
 | |
| #define SOCK_RCV_BUF        1
 | |
| 
 | |
| #define SOCK_BUFF_LOW_WATER (2 * 1024)
 | |
| #define SOCK_RCV_BUFF_SIZE  (8 * 1024)
 | |
| #define SOCK_SND_BUFF_SIZE  (8 * 1024)
 | |
| #define SOCK_BACKLOG        5
 | |
| 
 | |
| #define PROTO_RESERVED_LEN  20
 | |
| 
 | |
| #define SO_NO_MORE_DATA     0x0001
 | |
| 
 | |
| //
 | |
| //
 | |
| //
 | |
| // When a socket is created it enters into SO_UNCONFIGURED,
 | |
| // no actions can be taken on this socket, only after calling
 | |
| // SockConfigure. The state transition diagram of socket is
 | |
| // as following:
 | |
| //
 | |
| // SO_UNCONFIGURED --- SO_CONFIGURED --- SO_CONNECTING
 | |
| //  ^      |                                    |
 | |
| //  |      --->  SO_LISTENING                   |
 | |
| //  |                                           |
 | |
| //  |------------------SO_DISCONNECTING<-- SO_CONNECTED
 | |
| //
 | |
| // A passive socket can only go into SO_LISTENING and
 | |
| // SO_UNCONFIGURED state. SO_XXXING state is a middle state
 | |
| // when a socket is undergoing a protocol procedure such
 | |
| // as requesting a TCP connection.
 | |
| //
 | |
| //
 | |
| //
 | |
| 
 | |
| ///
 | |
| /// Socket state
 | |
| ///
 | |
| #define SO_CLOSED        0
 | |
| #define SO_LISTENING     1
 | |
| #define SO_CONNECTING    2
 | |
| #define SO_CONNECTED     3
 | |
| #define SO_DISCONNECTING 4
 | |
| 
 | |
| ///
 | |
| /// Socket configure state
 | |
| ///
 | |
| #define SO_UNCONFIGURED        0
 | |
| #define SO_CONFIGURED_ACTIVE   1
 | |
| #define SO_CONFIGURED_PASSIVE  2
 | |
| #define SO_NO_MAPPING          3
 | |
| 
 | |
| /**
 | |
|   Set socket SO_NO_MORE_DATA flag.
 | |
|   
 | |
|   @param Sock               Pointer to the socket
 | |
|   
 | |
| **/
 | |
| #define SOCK_NO_MORE_DATA(Sock)     ((Sock)->Flag |= SO_NO_MORE_DATA)
 | |
| 
 | |
| /**
 | |
|   Check whether the socket is unconfigured.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   
 | |
|   @retval True               The socket is unconfigued
 | |
|   @retval False              The socket is not unconfigued
 | |
|   
 | |
| **/
 | |
| #define SOCK_IS_UNCONFIGURED(Sock)  ((Sock)->ConfigureState == SO_UNCONFIGURED)
 | |
| 
 | |
| /**
 | |
|   Check whether the socket is configured.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   
 | |
|   @retval True               The socket is configued
 | |
|   @retval False              The socket is not configued
 | |
|   
 | |
| **/
 | |
| #define SOCK_IS_CONFIGURED(Sock) \
 | |
|     (((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) || \
 | |
|     ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE))
 | |
| 
 | |
| /**
 | |
|   Check whether the socket is configured to active mode.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   
 | |
|   @retval True               The socket is configued to active mode
 | |
|   @retval False              The socket is not configued to active mode
 | |
|   
 | |
| **/
 | |
| #define SOCK_IS_CONFIGURED_ACTIVE(Sock) \
 | |
|   ((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE)
 | |
| 
 | |
| /**
 | |
|   Check whether the socket is configured to passive mode.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   
 | |
|   @retval True               The socket is configued to passive mode
 | |
|   @retval False              The socket is not configued to passive mode
 | |
|   
 | |
| **/
 | |
| #define SOCK_IS_CONNECTED_PASSIVE(Sock) \
 | |
|   ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE)
 | |
| 
 | |
| /**
 | |
|   Check whether the socket is mapped.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   
 | |
|   @retval True               The socket is no mapping
 | |
|   @retval False              The socket is mapped
 | |
|   
 | |
| **/
 | |
| #define SOCK_IS_NO_MAPPING(Sock) \
 | |
|   ((Sock)->ConfigureState == SO_NO_MAPPING)
 | |
| 
 | |
| /**
 | |
|   Check whether the socket is closed.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   
 | |
|   @retval True               The socket is closed
 | |
|   @retval False              The socket is not closed
 | |
|   
 | |
| **/
 | |
| #define SOCK_IS_CLOSED(Sock)          ((Sock)->State == SO_CLOSED)
 | |
| 
 | |
| /**
 | |
|   Check whether the socket is listening.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   
 | |
|   @retval True               The socket is listening
 | |
|   @retval False              The socket is not listening
 | |
|   
 | |
| **/
 | |
| #define SOCK_IS_LISTENING(Sock)       ((Sock)->State == SO_LISTENING)
 | |
| 
 | |
| /**
 | |
|   Check whether the socket is connecting.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   
 | |
|   @retval True               The socket is connecting
 | |
|   @retval False              The socket is not connecting
 | |
|   
 | |
| **/
 | |
| #define SOCK_IS_CONNECTING(Sock)      ((Sock)->State == SO_CONNECTING)
 | |
| 
 | |
| /**
 | |
|   Check whether the socket has connected.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   
 | |
|   @retval True               The socket has connected
 | |
|   @retval False              The socket has not connected
 | |
|   
 | |
| **/
 | |
| #define SOCK_IS_CONNECTED(Sock)       ((Sock)->State == SO_CONNECTED)
 | |
| 
 | |
| /**
 | |
|   Check whether the socket is disconnecting.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   
 | |
|   @retval True               The socket is disconnecting
 | |
|   @retval False              The socket is not disconnecting
 | |
|   
 | |
| **/
 | |
| #define SOCK_IS_DISCONNECTING(Sock)   ((Sock)->State == SO_DISCONNECTING)
 | |
| 
 | |
| /**
 | |
|   Check whether the socket is no more data.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   
 | |
|   @retval True               The socket is no more data
 | |
|   @retval False              The socket still has data
 | |
|   
 | |
| **/
 | |
| #define SOCK_IS_NO_MORE_DATA(Sock)    (0 != ((Sock)->Flag & SO_NO_MORE_DATA))
 | |
| 
 | |
| /**
 | |
|   Set the size of the receive buffer.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   @param  Size               The size to set
 | |
| 
 | |
| **/
 | |
| #define SET_RCV_BUFFSIZE(Sock, Size)  ((Sock)->RcvBuffer.HighWater = (Size))
 | |
| 
 | |
| /**
 | |
|   Get the size of the receive buffer.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   
 | |
|   @return The receive buffer size
 | |
| 
 | |
| **/
 | |
| #define GET_RCV_BUFFSIZE(Sock)        ((Sock)->RcvBuffer.HighWater)
 | |
| 
 | |
| /**
 | |
|   Get the size of the receive data.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   
 | |
|   @return The received data size
 | |
| 
 | |
| **/
 | |
| #define GET_RCV_DATASIZE(Sock)        (((Sock)->RcvBuffer.DataQueue)->BufSize)
 | |
| 
 | |
| /**
 | |
|   Set the size of the send buffer.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   @param  Size               The size to set
 | |
| 
 | |
| **/
 | |
| #define SET_SND_BUFFSIZE(Sock, Size)  ((Sock)->SndBuffer.HighWater = (Size))
 | |
| 
 | |
| /**
 | |
|   Get the size of the send buffer.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   
 | |
|   @return The send buffer size
 | |
| 
 | |
| **/
 | |
| #define GET_SND_BUFFSIZE(Sock)        ((Sock)->SndBuffer.HighWater)
 | |
| 
 | |
| /**
 | |
|   Get the size of the send data.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   
 | |
|   @return The send data size
 | |
| 
 | |
| **/
 | |
| #define GET_SND_DATASIZE(Sock)        (((Sock)->SndBuffer.DataQueue)->BufSize)
 | |
| 
 | |
| /**
 | |
|   Set the backlog value of the socket.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   @param  Value              The value to set
 | |
| 
 | |
| **/
 | |
| #define SET_BACKLOG(Sock, Value)      ((Sock)->BackLog = (Value))
 | |
| 
 | |
| /**
 | |
|   Get the backlog value of the socket.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   
 | |
|   @return The backlog value
 | |
| 
 | |
| **/
 | |
| #define GET_BACKLOG(Sock)             ((Sock)->BackLog)
 | |
| 
 | |
| /**
 | |
|   Set the socket with error state.
 | |
|   
 | |
|   @param  Sock               Pointer to the socket
 | |
|   @param  Error              The error state
 | |
| 
 | |
| **/
 | |
| #define SOCK_ERROR(Sock, Error)       ((Sock)->SockError = (Error))
 | |
| 
 | |
| #define SND_BUF_HDR_LEN(Sock) \
 | |
|   ((SockBufFirst (&((Sock)->SndBuffer)))->TotalSize)
 | |
| 
 | |
| #define RCV_BUF_HDR_LEN(Sock) \
 | |
|   ((SockBufFirst (&((Sock)->RcvBuffer)))->TotalSize)
 | |
| 
 | |
| #define SOCK_SIGNATURE                SIGNATURE_32 ('S', 'O', 'C', 'K')
 | |
| 
 | |
| #define SOCK_FROM_THIS(a)             CR ((a), SOCKET, NetProtocol, SOCK_SIGNATURE)
 | |
| 
 | |
| #define SOCK_FROM_TOKEN(Token)        (((SOCK_TOKEN *) (Token))->Sock)
 | |
| 
 | |
| #define PROTO_TOKEN_FORM_SOCK(SockToken, Type) \
 | |
|   ((Type *) (((SOCK_TOKEN *) (SockToken))->Token))
 | |
| 
 | |
| typedef struct _SOCKET SOCKET;
 | |
| 
 | |
| ///
 | |
| /// Socket completion token
 | |
| ///
 | |
| typedef struct _SOCK_COMPLETION_TOKEN {
 | |
|   EFI_EVENT   Event;            ///< The event to be issued
 | |
|   EFI_STATUS  Status;           ///< The status to be issued
 | |
| } SOCK_COMPLETION_TOKEN;
 | |
| 
 | |
| typedef union {
 | |
|   VOID  *RxData;
 | |
|   VOID  *TxData;
 | |
| } SOCK_IO_DATA;
 | |
| 
 | |
| ///
 | |
| /// The application token with data packet
 | |
| ///
 | |
| typedef struct _SOCK_IO_TOKEN {
 | |
|   SOCK_COMPLETION_TOKEN Token;
 | |
|   SOCK_IO_DATA          Packet;
 | |
| } SOCK_IO_TOKEN;
 | |
| 
 | |
| ///
 | |
| ///  The request issued from socket layer to protocol layer.  
 | |
| ///
 | |
| #define SOCK_ATTACH     0    ///< Attach current socket to a new PCB
 | |
| #define SOCK_DETACH     1    ///< Detach current socket from the PCB
 | |
| #define SOCK_CONFIGURE  2    ///< Configure attached PCB
 | |
| #define SOCK_FLUSH      3    ///< Flush attached PCB
 | |
| #define SOCK_SND        4    ///< Need protocol to send something
 | |
| #define SOCK_SNDPUSH    5    ///< Need protocol to send pushed data
 | |
| #define SOCK_SNDURG     6    ///< Need protocol to send urgent data
 | |
| #define SOCK_CONSUMED   7    ///< Application has retrieved data from socket
 | |
| #define SOCK_CONNECT    8    ///< Need to connect to a peer
 | |
| #define SOCK_CLOSE      9    ///< Need to close the protocol process
 | |
| #define SOCK_ABORT      10   ///< Need to reset the protocol process
 | |
| #define SOCK_POLL       11   ///< Need to poll to the protocol layer
 | |
| #define SOCK_ROUTE      12   ///< Need to add a route information
 | |
| #define SOCK_MODE       13   ///< Need to get the mode data of the protocol
 | |
| #define SOCK_GROUP      14   ///< Need to join a mcast group
 | |
| 
 | |
| ///
 | |
| ///  The socket type.
 | |
| ///
 | |
| typedef enum {
 | |
|   SockDgram, ///< This socket providing datagram service
 | |
|   SockStream ///< This socket providing stream service
 | |
| } SOCK_TYPE;
 | |
| 
 | |
| ///
 | |
| ///  The buffer structure of rcvd data and send data used by socket.
 | |
| ///
 | |
| typedef struct _SOCK_BUFFER {
 | |
|   UINT32        HighWater;  ///< The buffersize upper limit of sock_buffer
 | |
|   UINT32        LowWater;   ///< The low water mark of sock_buffer
 | |
|   NET_BUF_QUEUE *DataQueue; ///< The queue to buffer data
 | |
| } SOCK_BUFFER;
 | |
| 
 | |
| /**
 | |
|   The handler of protocol for request from socket.
 | |
|   
 | |
|   @param Socket              The socket issuing the request to protocol
 | |
|   @param Request             The request issued by socket
 | |
|   @param RequestData         The request related data
 | |
|   
 | |
|   @retval EFI_SUCCESS        The socket request is completed successfully.
 | |
|   @retval other              The error status returned by the corresponding TCP
 | |
|                              layer function.
 | |
|                              
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (*SOCK_PROTO_HANDLER) (
 | |
|   IN SOCKET       *Socket,
 | |
|   IN UINT8        Request,
 | |
|   IN VOID         *RequestData
 | |
|   );
 | |
|   
 | |
|   
 | |
| //
 | |
| // Socket provided oprerations for low layer protocol
 | |
| //
 | |
| 
 | |
| //
 | |
| // Socket provided operations for user interface
 | |
| //
 | |
| 
 | |
| /**
 | |
|   Set the state of the socket.
 | |
| 
 | |
|   @param  Sock                  Pointer to the socket.
 | |
|   @param  State                 The new socket state to be set.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| SockSetState (
 | |
|   IN OUT SOCKET     *Sock,
 | |
|   IN     UINT8      State
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Called by the low layer protocol to indicate the socket a connection is 
 | |
|   established. 
 | |
|   
 | |
|   This function just changes the socket's state to SO_CONNECTED 
 | |
|   and signals the token used for connection establishment.
 | |
| 
 | |
|   @param  Sock                  Pointer to the socket associated with the
 | |
|                                 established connection.
 | |
|                                 
 | |
| **/
 | |
| VOID
 | |
| SockConnEstablished (
 | |
|   IN SOCKET *Sock
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Called by the low layer protocol to indicate the connection is closed.
 | |
|   
 | |
|   This function flushes the socket, sets the state to SO_CLOSED and signals 
 | |
|   the close token.
 | |
| 
 | |
|   @param  Sock                  Pointer to the socket associated with the closed
 | |
|                                 connection.
 | |
|                                 
 | |
| **/
 | |
| VOID
 | |
| SockConnClosed (
 | |
|   IN OUT SOCKET *Sock
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Called by low layer protocol to indicate that some data is sent or processed.
 | |
|    
 | |
|   This function trims the sent data in the socket send buffer, signals the data 
 | |
|   token if proper.
 | |
| 
 | |
|   @param  Sock                  Pointer to the socket.
 | |
|   @param  Count                 The length of the data processed or sent, in bytes.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| SockDataSent (
 | |
|   IN SOCKET     *Sock,
 | |
|   IN UINT32     Count
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Called by the low layer protocol to copy some data in socket send
 | |
|   buffer starting from the specific offset to a buffer provided by
 | |
|   the caller.
 | |
| 
 | |
|   @param  Sock                  Pointer to the socket.
 | |
|   @param  Offset                The start point of the data to be copied.
 | |
|   @param  Len                   The length of the data to be copied.
 | |
|   @param  Dest                  Pointer to the destination to copy the data.
 | |
| 
 | |
|   @return The data size copied.
 | |
| 
 | |
| **/
 | |
| UINT32
 | |
| SockGetDataToSend (
 | |
|   IN SOCKET      *Sock,
 | |
|   IN UINT32      Offset,
 | |
|   IN UINT32      Len,
 | |
|   IN UINT8       *Dest
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Called by the low layer protocol to indicate that there
 | |
|   will be no more data from the communication peer.
 | |
|   
 | |
|   This function set the socket's state to SO_NO_MORE_DATA and
 | |
|   signal all queued IO tokens with the error status EFI_CONNECTION_FIN.
 | |
| 
 | |
|   @param  Sock                  Pointer to the socket.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| SockNoMoreData (
 | |
|   IN OUT SOCKET *Sock
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Called by the low layer protocol to deliver received data to socket layer.
 | |
|   
 | |
|   This function will append the data to the socket receive buffer, set ther 
 | |
|   urgent data length and then check if any receive token can be signaled.
 | |
| 
 | |
|   @param  Sock                  Pointer to the socket.
 | |
|   @param  NetBuffer             Pointer to the buffer that contains the received
 | |
|                                 data.
 | |
|   @param  UrgLen                The length of the urgent data in the received data.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| SockDataRcvd (
 | |
|   IN     SOCKET    *Sock,
 | |
|   IN OUT NET_BUF   *NetBuffer,
 | |
|   IN     UINT32    UrgLen
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Get the length of the free space of the specific socket buffer.
 | |
| 
 | |
|   @param  Sock                  Pointer to the socket.
 | |
|   @param  Which                 Flag to indicate which socket buffer to check,
 | |
|                                 either send buffer or receive buffer.
 | |
| 
 | |
|   @return The length of the free space, in bytes.
 | |
| 
 | |
| **/
 | |
| UINT32
 | |
| SockGetFreeSpace (
 | |
|   IN SOCKET  *Sock,
 | |
|   IN UINT32  Which
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Clone a new socket including its associated protocol control block.
 | |
| 
 | |
|   @param  Sock                  Pointer to the socket to be cloned.
 | |
| 
 | |
|   @return Pointer to the newly cloned socket. If NULL, error condition occurred.
 | |
| 
 | |
| **/
 | |
| SOCKET *
 | |
| SockClone (
 | |
|   IN SOCKET *Sock
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Signal the receive token with the specific error or
 | |
|   set socket error code after error is received.
 | |
| 
 | |
|   @param  Sock                  Pointer to the socket.
 | |
|   @param  Error                 The error code received.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| SockRcvdErr (
 | |
|   IN OUT SOCKET       *Sock,
 | |
|   IN     EFI_STATUS   Error
 | |
|   );
 | |
| 
 | |
| ///
 | |
| /// Proto type of the create callback
 | |
| ///
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (*SOCK_CREATE_CALLBACK) (
 | |
|   IN SOCKET  *This,
 | |
|   IN VOID    *Context
 | |
|   );
 | |
|   
 | |
| ///
 | |
| /// Proto type of the destroy callback 
 | |
| ///
 | |
| typedef
 | |
| VOID
 | |
| (*SOCK_DESTROY_CALLBACK) (
 | |
|   IN SOCKET  *This,
 | |
|   IN VOID    *Context
 | |
|   );
 | |
| 
 | |
| ///
 | |
| ///  The initialize data for create a new socket.
 | |
| ///
 | |
| typedef struct _SOCK_INIT_DATA {
 | |
|   SOCK_TYPE   Type;
 | |
|   UINT8       State;
 | |
| 
 | |
|   SOCKET      *Parent;        ///< The parent of this socket
 | |
|   UINT32      BackLog;        ///< The connection limit for listening socket
 | |
|   UINT32      SndBufferSize;  ///< The high water mark of send buffer
 | |
|   UINT32      RcvBufferSize;  ///< The high water mark of receive buffer
 | |
|   VOID        *Protocol;      ///< The pointer to protocol function template
 | |
|                               ///< wanted to install on socket
 | |
| 
 | |
|   //
 | |
|   // Callbacks after socket is created and before socket is to be destroyed.
 | |
|   //
 | |
|   SOCK_CREATE_CALLBACK   CreateCallback;  ///< Callback after created
 | |
|   SOCK_DESTROY_CALLBACK  DestroyCallback; ///< Callback before destroied
 | |
|   VOID                   *Context;        ///< The context of the callback
 | |
| 
 | |
|   //
 | |
|   // Opaque protocol data.
 | |
|   //
 | |
|   VOID                   *ProtoData;
 | |
|   UINT32                 DataSize;
 | |
| 
 | |
|   SOCK_PROTO_HANDLER     ProtoHandler;  ///< The handler of protocol for socket request
 | |
| 
 | |
|   EFI_HANDLE   DriverBinding;           ///< The driver binding handle
 | |
| } SOCK_INIT_DATA;
 | |
| 
 | |
| ///
 | |
| ///  The union type of TCP and UDP protocol.
 | |
| ///  
 | |
| typedef union _NET_PROTOCOL {
 | |
|   EFI_TCP4_PROTOCOL TcpProtocol;   ///< Tcp protocol
 | |
|   EFI_UDP4_PROTOCOL UdpProtocol;   ///< Udp protocol
 | |
| } NET_PROTOCOL;
 | |
| 
 | |
| ///
 | |
| /// The socket structure representing a network service access point
 | |
| ///
 | |
| struct _SOCKET {
 | |
| 
 | |
|   //
 | |
|   // Socket description information
 | |
|   //
 | |
|   UINT32                Signature;      ///< Signature of the socket
 | |
|   EFI_HANDLE            SockHandle;     ///< The virtual handle of the socket
 | |
|   EFI_HANDLE            DriverBinding;  ///< Socket's driver binding protocol
 | |
|   EFI_DEVICE_PATH_PROTOCOL  *ParentDevicePath;
 | |
|   EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
 | |
|   LIST_ENTRY                Link;  
 | |
|   UINT8                 ConfigureState;
 | |
|   SOCK_TYPE             Type;
 | |
|   UINT8                 State;
 | |
|   UINT16                Flag;
 | |
|   EFI_LOCK              Lock;       ///< The lock of socket
 | |
|   SOCK_BUFFER           SndBuffer;  ///< Send buffer of application's data
 | |
|   SOCK_BUFFER           RcvBuffer;  ///< Receive buffer of received data
 | |
|   EFI_STATUS            SockError;  ///< The error returned by low layer protocol
 | |
|   BOOLEAN               InDestroy;
 | |
| 
 | |
|   //
 | |
|   // Fields used to manage the connection request
 | |
|   //
 | |
|   UINT32          BackLog;        ///< the limit of connection to this socket
 | |
|   UINT32          ConnCnt;        ///< the current count of connections to it
 | |
|   SOCKET          *Parent;        ///< listening parent that accept the connection
 | |
|   LIST_ENTRY      ConnectionList; ///< the connections maintained by this socket
 | |
|   
 | |
|   //
 | |
|   // The queue to buffer application's asynchronous token
 | |
|   //
 | |
|   LIST_ENTRY      ListenTokenList;
 | |
|   LIST_ENTRY      RcvTokenList;
 | |
|   LIST_ENTRY      SndTokenList;
 | |
|   LIST_ENTRY      ProcessingSndTokenList;
 | |
| 
 | |
|   SOCK_COMPLETION_TOKEN *ConnectionToken; ///< app's token to signal if connected
 | |
|   SOCK_COMPLETION_TOKEN *CloseToken;      ///< app's token to signal if closed
 | |
| 
 | |
|   //
 | |
|   // Interface for low level protocol
 | |
|   //
 | |
|   SOCK_PROTO_HANDLER    ProtoHandler;       ///< The request handler of protocol
 | |
|   UINT8 ProtoReserved[PROTO_RESERVED_LEN];  ///< Data fields reserved for protocol
 | |
|   NET_PROTOCOL          NetProtocol;        ///< TCP or UDP protocol socket used
 | |
| 
 | |
|   //
 | |
|   // Callbacks after socket is created and before socket is to be destroyed.
 | |
|   //
 | |
|   SOCK_CREATE_CALLBACK   CreateCallback;    ///< Callback after created
 | |
|   SOCK_DESTROY_CALLBACK  DestroyCallback;   ///< Callback before destroied
 | |
|   VOID                   *Context;          ///< The context of the callback
 | |
| };
 | |
| 
 | |
| ///
 | |
| ///  The token structure buffered in socket layer.
 | |
| ///
 | |
| typedef struct _SOCK_TOKEN {
 | |
|   LIST_ENTRY            TokenList;      ///< The entry to add in the token list
 | |
|   SOCK_COMPLETION_TOKEN *Token;         ///< The application's token
 | |
|   UINT32                RemainDataLen;  ///< Unprocessed data length
 | |
|   SOCKET                *Sock;          ///< The poninter to the socket this token
 | |
|                                         ///< belongs to
 | |
| } SOCK_TOKEN;
 | |
| 
 | |
| ///
 | |
| /// Reserved data to access the NET_BUF delivered by UDP driver.
 | |
| ///
 | |
| typedef struct _UDP_RSV_DATA {
 | |
|   EFI_TIME              TimeStamp;
 | |
|   EFI_UDP4_SESSION_DATA Session;
 | |
| } UDP_RSV_DATA;
 | |
| 
 | |
| ///
 | |
| /// Reserved data to access the NET_BUF delivered by TCP driver.
 | |
| ///
 | |
| typedef struct _TCP_RSV_DATA {
 | |
|   UINT32 UrgLen;
 | |
| } TCP_RSV_DATA;
 | |
| 
 | |
| /**
 | |
|   Create a socket and its associated protocol control block
 | |
|   with the intial data SockInitData and protocol specific
 | |
|   data ProtoData.
 | |
| 
 | |
|   @param  SockInitData         Inital data to setting the socket.
 | |
|   
 | |
|   @return Pointer to the newly created socket. If NULL, error condition occured.
 | |
| 
 | |
| **/
 | |
| SOCKET *
 | |
| SockCreateChild (
 | |
|   IN SOCK_INIT_DATA *SockInitData
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Destroy the socket Sock and its associated protocol control block.
 | |
| 
 | |
|   @param  Sock                 The socket to be destroyed.
 | |
| 
 | |
|   @retval EFI_SUCCESS          The socket Sock is destroyed successfully.
 | |
|   @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| SockDestroyChild (
 | |
|   IN   SOCKET *Sock
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Configure the specific socket Sock using configuration data ConfigData.
 | |
| 
 | |
|   @param  Sock                 Pointer to the socket to be configured.
 | |
|   @param  ConfigData           Pointer to the configuration data.
 | |
| 
 | |
|   @retval EFI_SUCCESS          The socket is configured successfully.
 | |
|   @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket or the
 | |
|                                socket is already configured.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| SockConfigure (
 | |
|   IN SOCKET *Sock,
 | |
|   IN VOID   *ConfigData
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Initiate a connection establishment process.
 | |
| 
 | |
|   @param  Sock                 Pointer to the socket to initiate the initate the
 | |
|                                connection.
 | |
|   @param  Token                Pointer to the token used for the connection
 | |
|                                operation.
 | |
| 
 | |
|   @retval EFI_SUCCESS          The connection is initialized successfully.
 | |
|   @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket, or the
 | |
|                                socket is closed, or the socket is not configured to
 | |
|                                be an active one, or the token is already in one of
 | |
|                                this socket's lists.
 | |
|   @retval EFI_NO_MAPPING       The IP address configuration operation is not
 | |
|                                finished.
 | |
|   @retval EFI_NOT_STARTED      The socket is not configured.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| SockConnect (
 | |
|   IN SOCKET *Sock,
 | |
|   IN VOID   *Token
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Issue a listen token to get an existed connected network instance
 | |
|   or wait for a connection if there is none.
 | |
| 
 | |
|   @param  Sock                 Pointer to the socket to accept connections.
 | |
|   @param  Token                The token to accept a connection.
 | |
| 
 | |
|   @retval EFI_SUCCESS          Either a connection is accpeted or the Token is
 | |
|                                buffered for further acception.
 | |
|   @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket, or the
 | |
|                                socket is closed, or the socket is not configured to
 | |
|                                be a passive one, or the token is already in one of
 | |
|                                this socket's lists.
 | |
|   @retval EFI_NO_MAPPING       The IP address configuration operation is not
 | |
|                                finished.
 | |
|   @retval EFI_NOT_STARTED      The socket is not configured.
 | |
|   @retval EFI_OUT_OF_RESOURCE  Failed to buffer the Token due to memory limit.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| SockAccept (
 | |
|   IN SOCKET *Sock,
 | |
|   IN VOID   *Token
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Issue a token with data to the socket to send out.
 | |
| 
 | |
|   @param  Sock                 Pointer to the socket to process the token with
 | |
|                                data.
 | |
|   @param  Token                The token with data that needs to send out.
 | |
| 
 | |
|   @retval EFI_SUCCESS          The token is processed successfully.
 | |
|   @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket, or the
 | |
|                                socket is closed, or the socket is not in a
 | |
|                                synchronized state , or the token is already in one
 | |
|                                of this socket's lists.
 | |
|   @retval EFI_NO_MAPPING       The IP address configuration operation is not
 | |
|                                finished.
 | |
|   @retval EFI_NOT_STARTED      The socket is not configured.
 | |
|   @retval EFI_OUT_OF_RESOURCE  Failed to buffer the token due to memory limit.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| SockSend (
 | |
|   IN SOCKET *Sock,
 | |
|   IN VOID   *Token
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Issue a token to get data from the socket.
 | |
| 
 | |
|   @param  Sock                 Pointer to the socket to get data from.
 | |
|   @param  Token                The token to store the received data from the
 | |
|                                socket.
 | |
| 
 | |
|   @retval EFI_SUCCESS          The token is processed successfully.
 | |
|   @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket, or the
 | |
|                                socket is closed, or the socket is not in a
 | |
|                                synchronized state , or the token is already in one
 | |
|                                of this socket's lists.
 | |
|   @retval EFI_NO_MAPPING       The IP address configuration operation is not
 | |
|                                finished.
 | |
|   @retval EFI_NOT_STARTED      The socket is not configured.
 | |
|   @retval EFI_CONNECTION_FIN   The connection is closed and there is no more data.
 | |
|   @retval EFI_OUT_OF_RESOURCE  Failed to buffer the token due to memory limit.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| SockRcv (
 | |
|   IN SOCKET *Sock,
 | |
|   IN VOID   *Token
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Reset the socket and its associated protocol control block.
 | |
| 
 | |
|   @param  Sock                 Pointer to the socket to be flushed.
 | |
| 
 | |
|   @retval EFI_SUCCESS          The socket is flushed successfully.
 | |
|   @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| SockFlush (
 | |
|   IN SOCKET *Sock
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Close or abort the socket associated connection.
 | |
| 
 | |
|   @param  Sock                 Pointer to the socket of the connection to close or
 | |
|                                abort.
 | |
|   @param  Token                The token for close operation.
 | |
|   @param  OnAbort              TRUE for aborting the connection, FALSE to close it.
 | |
| 
 | |
|   @retval EFI_SUCCESS          The close or abort operation is initialized
 | |
|                                successfully.
 | |
|   @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket, or the
 | |
|                                socket is closed, or the socket is not in a
 | |
|                                synchronized state , or the token is already in one
 | |
|                                of this socket's lists.
 | |
|   @retval EFI_NO_MAPPING       The IP address configuration operation is not
 | |
|                                finished.
 | |
|   @retval EFI_NOT_STARTED      The socket is not configured.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| SockClose (
 | |
|   IN SOCKET  *Sock,
 | |
|   IN VOID    *Token,
 | |
|   IN BOOLEAN OnAbort
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Get the mode data of the low layer protocol.
 | |
| 
 | |
|   @param  Sock                 Pointer to the socket to get mode data from.
 | |
|   @param  Mode                 Pointer to the data to store the low layer mode
 | |
|                                information.
 | |
| 
 | |
|   @retval EFI_SUCCESS          The mode data is got successfully.
 | |
|   @retval EFI_NOT_STARTED      The socket is not configured.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| SockGetMode (
 | |
|   IN     SOCKET *Sock,
 | |
|   IN OUT VOID   *Mode
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Configure the low level protocol to join a multicast group for
 | |
|   this socket's connection.
 | |
| 
 | |
|   @param  Sock                 Pointer to the socket of the connection to join the
 | |
|                                specific multicast group.
 | |
|   @param  GroupInfo            Pointer to the multicast group info.
 | |
| 
 | |
|   @retval EFI_SUCCESS          The configuration is done successfully.
 | |
|   @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket.
 | |
|   @retval EFI_NOT_STARTED      The socket is not configured.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| SockGroup (
 | |
|   IN SOCKET *Sock,
 | |
|   IN VOID   *GroupInfo
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Add or remove route information in IP route table associated
 | |
|   with this socket.
 | |
| 
 | |
|   @param  Sock                 Pointer to the socket associated with the IP route
 | |
|                                table to operate on.
 | |
|   @param  RouteInfo            Pointer to the route information to be processed.
 | |
| 
 | |
|   @retval EFI_SUCCESS          The route table is updated successfully.
 | |
|   @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket.
 | |
|   @retval EFI_NO_MAPPING       The IP address configuration operation is  not
 | |
|                                finished.
 | |
|   @retval EFI_NOT_STARTED      The socket is not configured.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| SockRoute (
 | |
|   IN SOCKET    *Sock,
 | |
|   IN VOID      *RouteInfo
 | |
|   );
 | |
| 
 | |
| //
 | |
| // Supporting function to operate on socket buffer
 | |
| //
 | |
| 
 | |
| /**
 | |
|   Get the first buffer block in the specific socket buffer.
 | |
| 
 | |
|   @param  Sockbuf               Pointer to the socket buffer.
 | |
| 
 | |
|   @return Pointer to the first buffer in the queue. NULL if the queue is empty.
 | |
| 
 | |
| **/
 | |
| NET_BUF *
 | |
| SockBufFirst (
 | |
|   IN SOCK_BUFFER *Sockbuf
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Get the next buffer block in the specific socket buffer.
 | |
| 
 | |
|   @param  Sockbuf               Pointer to the socket buffer.
 | |
|   @param  SockEntry             Pointer to the buffer block prior to the required
 | |
|                                 one.
 | |
| 
 | |
|   @return Pointer to the buffer block next to SockEntry. NULL if SockEntry is 
 | |
|           the tail or head entry.
 | |
| 
 | |
| **/
 | |
| NET_BUF *
 | |
| SockBufNext (
 | |
|   IN SOCK_BUFFER *Sockbuf,
 | |
|   IN NET_BUF     *SockEntry
 | |
|   );
 | |
| 
 | |
| #endif
 |