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