2. Fix the driver binding Stop() hang issue in the network stack. 3. Add Ip4 raw data support. 4. Add iSCSI Dhcp option 60 support. Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> Reviewed-by: Ye Ting <ting.ye@intel.com> Reviewed-by: Ouyang Qian <qian.ouyang@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13995 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			925 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			925 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Common head file for TCP socket.
 | 
						|
 | 
						|
  Copyright (c) 2009 - 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.
 | 
						|
 | 
						|
  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/Tcp4.h>
 | 
						|
#include <Protocol/Tcp6.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/UefiLib.h>
 | 
						|
#include <Library/DpcLib.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
 | 
						|
 | 
						|
///
 | 
						|
///  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
 | 
						|
 | 
						|
/**
 | 
						|
  Set socket SO_NO_MORE_DATA flag.
 | 
						|
 | 
						|
  @param[in] Sock            Pointer to the socket
 | 
						|
 | 
						|
**/
 | 
						|
#define SOCK_NO_MORE_DATA(Sock)     ((Sock)->Flag |= SO_NO_MORE_DATA)
 | 
						|
 | 
						|
/**
 | 
						|
  Check whether the socket is unconfigured.
 | 
						|
 | 
						|
  @param[in]  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[in] 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[in] 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[in] 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[in] Sock            Pointer to the socket.
 | 
						|
 | 
						|
  @retval TRUE               The socket is not 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[in] 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[in] 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[in] 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[in] 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[in] 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[in] 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[in] Sock            Pointer to the socket.
 | 
						|
  @param[in] Size            The size to set.
 | 
						|
 | 
						|
**/
 | 
						|
#define SET_RCV_BUFFSIZE(Sock, Size)  ((Sock)->RcvBuffer.HighWater = (Size))
 | 
						|
 | 
						|
/**
 | 
						|
  Get the size of the receive buffer.
 | 
						|
 | 
						|
  @param[in] 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[in] 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[in] Sock            Pointer to the socket.
 | 
						|
  @param[in] Size            The size to set.
 | 
						|
 | 
						|
**/
 | 
						|
#define SET_SND_BUFFSIZE(Sock, Size)  ((Sock)->SndBuffer.HighWater = (Size))
 | 
						|
 | 
						|
/**
 | 
						|
  Get the size of the send buffer.
 | 
						|
 | 
						|
  @param[in] 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[in] 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[in] Sock            Pointer to the socket.
 | 
						|
  @param[in] Value           The value to set.
 | 
						|
 | 
						|
**/
 | 
						|
#define SET_BACKLOG(Sock, Value)      ((Sock)->BackLog = (Value))
 | 
						|
 | 
						|
/**
 | 
						|
  Get the backlog value of the socket.
 | 
						|
 | 
						|
  @param[in] Sock            Pointer to the socket.
 | 
						|
 | 
						|
  @return The backlog value.
 | 
						|
 | 
						|
**/
 | 
						|
#define GET_BACKLOG(Sock)             ((Sock)->BackLog)
 | 
						|
 | 
						|
/**
 | 
						|
  Set the socket with error state.
 | 
						|
 | 
						|
  @param[in] Sock            Pointer to the socket.
 | 
						|
  @param[in] Error           The error state.
 | 
						|
 | 
						|
**/
 | 
						|
#define SOCK_ERROR(Sock, Error)       ((Sock)->SockError = (Error))
 | 
						|
 | 
						|
#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 _TCP_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 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 warter mark of sock_buffer
 | 
						|
  NET_BUF_QUEUE *DataQueue; ///< The queue to buffer data
 | 
						|
} SOCK_BUFFER;
 | 
						|
 | 
						|
/**
 | 
						|
  The handler of protocol for request from socket.
 | 
						|
 | 
						|
  @param[in] Socket          The socket issuing the request to protocol.
 | 
						|
  @param[in] Request         The request issued by socket.
 | 
						|
  @param[in] 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
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  The Callback funtion called after the TCP socket is created.
 | 
						|
 | 
						|
  @param[in]  This            Pointer to the socket just created.
 | 
						|
  @param[in]  Context         Context of the socket.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS         This protocol installed successfully.
 | 
						|
  @retval other               Some error occured.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(*SOCK_CREATE_CALLBACK) (
 | 
						|
  IN SOCKET  *This,
 | 
						|
  IN VOID    *Context
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  The callback function called before the TCP socket is to be destroyed.
 | 
						|
 | 
						|
  @param[in]  This                   The TCP socket to be destroyed.
 | 
						|
  @param[in]  Context                The context.
 | 
						|
 | 
						|
**/
 | 
						|
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 warter mark of send buffer
 | 
						|
  UINT32                 RcvBufferSize;  ///< The high warter mark of receive buffer
 | 
						|
  UINT8                  IpVersion;
 | 
						|
  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      Tcp4Protocol;    ///< Tcp4 protocol
 | 
						|
  EFI_TCP6_PROTOCOL      Tcp6Protocol;    ///< Tcp6 protocol
 | 
						|
} NET_PROTOCOL;
 | 
						|
///
 | 
						|
/// The socket structure representing a network service access point.
 | 
						|
///
 | 
						|
struct _TCP_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
 | 
						|
  UINT8                     IpVersion;
 | 
						|
  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 TCP driver.
 | 
						|
///
 | 
						|
typedef struct _TCP_RSV_DATA {
 | 
						|
  UINT32 UrgLen;
 | 
						|
} TCP_RSV_DATA;
 | 
						|
 | 
						|
//
 | 
						|
// Socket provided oprerations for low layer protocol implemented in SockImpl.c
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
  Set the state of the socket.
 | 
						|
 | 
						|
  @param[in, out]  Sock                  Pointer to the socket.
 | 
						|
  @param[in]       State                 The new socket state to be set.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
SockSetState (
 | 
						|
  IN OUT SOCKET     *Sock,
 | 
						|
  IN     UINT8      State
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Clone a new socket including its associated protocol control block.
 | 
						|
 | 
						|
  @param[in]  Sock                  Pointer to the socket to be cloned.
 | 
						|
 | 
						|
  @return Pointer to the newly cloned socket. If NULL, an error condition occurred.
 | 
						|
 | 
						|
**/
 | 
						|
SOCKET *
 | 
						|
SockClone (
 | 
						|
  IN SOCKET *Sock
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  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[in, out]  Sock         Pointer to the socket associated with the
 | 
						|
                                established connection.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
SockConnEstablished (
 | 
						|
  IN OUT SOCKET *Sock
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Called by the low layer protocol to indicate that the connection is closed.
 | 
						|
 | 
						|
  This function flushes the socket, sets the state to SO_CLOSED, and signals
 | 
						|
  the close token.
 | 
						|
 | 
						|
  @param[in, out]  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 and signals the data
 | 
						|
  token, if proper.
 | 
						|
 | 
						|
  @param[in, out]  Sock      Pointer to the socket.
 | 
						|
  @param[in]       Count     The length of the data processed or sent, in bytes.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
SockDataSent (
 | 
						|
  IN OUT 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[in]  Sock                  Pointer to the socket.
 | 
						|
  @param[in]  Offset                The start point of the data to be copied.
 | 
						|
  @param[in]  Len                   The length of the data to be copied.
 | 
						|
  @param[out] 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,
 | 
						|
  OUT UINT8       *Dest
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Called by the low layer protocol to deliver received data to socket layer.
 | 
						|
 | 
						|
  This function appends the data to the socket receive buffer, set the
 | 
						|
  urgent data length, then checks if any receive token can be signaled.
 | 
						|
 | 
						|
  @param[in, out]  Sock       Pointer to the socket.
 | 
						|
  @param[in, out]  NetBuffer  Pointer to the buffer that contains the received data.
 | 
						|
  @param[in]       UrgLen     The length of the urgent data in the received data.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
SockDataRcvd (
 | 
						|
  IN OUT SOCKET    *Sock,
 | 
						|
  IN OUT NET_BUF   *NetBuffer,
 | 
						|
  IN     UINT32    UrgLen
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Get the length of the free space of the specific socket buffer.
 | 
						|
 | 
						|
  @param[in]  Sock              Pointer to the socket.
 | 
						|
  @param[in]  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
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Called by the low layer protocol to indicate that there will be no more data
 | 
						|
  from the communication peer.
 | 
						|
 | 
						|
  This function sets the socket's state to SO_NO_MORE_DATA and signals all queued
 | 
						|
  IO tokens with the error status EFI_CONNECTION_FIN.
 | 
						|
 | 
						|
  @param[in, out]  Sock                  Pointer to the socket.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
SockNoMoreData (
 | 
						|
  IN OUT SOCKET *Sock
 | 
						|
  );
 | 
						|
 | 
						|
//
 | 
						|
// Socket provided operations for user interface implemented in SockInterface.c
 | 
						|
//
 | 
						|
 | 
						|
/**
 | 
						|
  Create a socket and its associated protocol control block
 | 
						|
  with the intial data SockInitData and protocol specific
 | 
						|
  data ProtoData.
 | 
						|
 | 
						|
  @param[in]  SockInitData         Inital data to setting the socket.
 | 
						|
 | 
						|
  @return Pointer to the newly created socket. If NULL, an error condition occured.
 | 
						|
 | 
						|
**/
 | 
						|
SOCKET *
 | 
						|
SockCreateChild (
 | 
						|
  IN SOCK_INIT_DATA *SockInitData
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Destroy the socket Sock and its associated protocol control block.
 | 
						|
 | 
						|
  @param[in, out]  Sock                 The socket to be destroyed.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          The socket Sock was destroyed successfully.
 | 
						|
  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
SockDestroyChild (
 | 
						|
  IN OUT SOCKET *Sock
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Configure the specific socket Sock using configuration data ConfigData.
 | 
						|
 | 
						|
  @param[in]  Sock             Pointer to the socket to be configured.
 | 
						|
  @param[in]  ConfigData       Pointer to the configuration data.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          The socket 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[in]  Sock             Pointer to the socket to initiate the initate the
 | 
						|
                               connection.
 | 
						|
  @param[in]  Token            Pointer to the token used for the connection
 | 
						|
                               operation.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          The connection 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[in]  Sock             Pointer to the socket to accept connections.
 | 
						|
  @param[in]  Token            The token to accept a connection.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          Either a connection is accepted or the Token is
 | 
						|
                               buffered for further acceptance.
 | 
						|
  @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[in]  Sock             Pointer to the socket to process the token with
 | 
						|
                               data.
 | 
						|
  @param[in]  Token            The token with data that needs to send out.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          The token 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 a memory limit.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
SockSend (
 | 
						|
  IN SOCKET *Sock,
 | 
						|
  IN VOID   *Token
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Issue a token to get data from the socket.
 | 
						|
 | 
						|
  @param[in]  Sock             Pointer to the socket to get data from.
 | 
						|
  @param[in]  Token            The token to store the received data from the
 | 
						|
                               socket.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          The token 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 a memory limit.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
SockRcv (
 | 
						|
  IN SOCKET *Sock,
 | 
						|
  IN VOID   *Token
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Reset the socket and its associated protocol control block.
 | 
						|
 | 
						|
  @param[in, out]  Sock        Pointer to the socket to be flushed.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          The socket flushed successfully.
 | 
						|
  @retval EFI_ACCESS_DENIED    Failed to get the lock to access the socket.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
SockFlush (
 | 
						|
  IN OUT SOCKET *Sock
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Close or abort the socket associated connection.
 | 
						|
 | 
						|
  @param[in, out]  Sock        Pointer to the socket of the connection to close
 | 
						|
                               or abort.
 | 
						|
  @param[in]  Token            The token for close operation.
 | 
						|
  @param[in]  OnAbort          TRUE for aborting the connection, FALSE to close it.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          The close or abort operation 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 OUT SOCKET  *Sock,
 | 
						|
  IN     VOID    *Token,
 | 
						|
  IN     BOOLEAN OnAbort
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Get the mode data of the low layer protocol.
 | 
						|
 | 
						|
  @param[in]       Sock        Pointer to the socket to get mode data from.
 | 
						|
  @param[in, out]  Mode        Pointer to the data to store the low layer mode
 | 
						|
                               information.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          The mode data was obtained 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[in]  Sock             Pointer to the socket of the connection to join the
 | 
						|
                               specific multicast group.
 | 
						|
  @param[in]  GroupInfo        Pointer to the multicast group information.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          The configuration completed 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[in]  Sock             Pointer to the socket associated with the IP route
 | 
						|
                               table to operate on.
 | 
						|
  @param[in]  RouteInfo        Pointer to the route information to be processed.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS          The route table 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
 | 
						|
  );
 | 
						|
 | 
						|
#endif
 |