]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h
Update to support to produce Component Name and & Component Name 2 protocol based...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Tcp4Dxe / Socket.h
index 75efa045b1b5e6a1a0406d24e46804e4cf0e540c..34b098bcde5e798387ce41157b125dfdce0062f1 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\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\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
+Module Name:\r
+\r
+  Socket.h\r
+\r
+Abstract:\r
+\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/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
-  EFI_DEVICE_PATH_PROTOCOL  *ParentDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
-  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
+typedef enum {\r
+  SO_CLOSED       = 0,\r
+  SO_LISTENING,\r
+  SO_CONNECTING,\r
+  SO_CONNECTED,\r
+  SO_DISCONNECTING\r
+} SOCK_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
+typedef struct _SOCK_COMPLETION_TOKEN {\r
+  EFI_EVENT   Event;\r
+  EFI_STATUS  Status;\r
+} SOCK_COMPLETION_TOKEN;\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 handler of protocol for request from socket\r
+//\r
+typedef\r
+EFI_STATUS\r
+(*SOCK_PROTO_HANDLER) (\r
+  IN SOCKET       * Socket,  // the socket issuing the request to protocol\r
+  IN SOCK_REQUEST Request,   // the request issued by socket\r
+  IN VOID *RequestData       // the request related data\r
+  );\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 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
+  SOCK_PROTO_HANDLER  ProtoHandler;\r
+\r
+  EFI_HANDLE   DriverBinding; // the driver binding handle\r
+} SOCK_INIT_DATA;\r
+\r
+//\r
+// socket provided oprerations for low layer protocol\r
+//\r
+\r
+//\r
+// socket provided operations for user interface\r
+//\r
+VOID\r
+SockSetState (\r
+  IN SOCKET     *Sock,\r
+  IN SOCK_STATE State\r
+  );\r
+\r
+//\r
+// when the connection establishment process for a Sock\r
+// is finished low layer protocol calling this function\r
+// to notify socket layer\r
+//\r
+VOID\r
+SockConnEstablished (\r
+  IN SOCKET *Sock\r
+  );\r
+\r
+VOID\r
+SockConnClosed (\r
+  IN SOCKET *Sock\r
+  );\r
+\r
+//\r
+// called by low layer protocol to trim send buffer of\r
+// Sock, when Count data is sent out completely\r
+//\r
+VOID\r
+SockDataSent (\r
+  IN SOCKET  *Sock,\r
+  IN UINT32  Count\r
+  );\r
+\r
+//\r
+// called by low layer protocol to get Len of data from\r
+// socket to send and copy it in Dest\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 low layer protocol to notify socket no more data can be\r
+//  received\r
+//\r
+VOID\r
+SockNoMoreData (\r
+  IN SOCKET *Sock\r
+  );\r
+\r
+//\r
+// called by low layer protocol to append a NetBuffer\r
+// to rcv buffer of sock\r
+//\r
+VOID\r
+SockDataRcvd (\r
+  IN SOCKET    *Sock,\r
+  IN NET_BUF   *NetBuffer,\r
+  IN UINT32     UrgLen\r
+  );\r
+\r
+UINT32\r
+SockGetFreeSpace (\r
+  IN SOCKET   *Sock,\r
+  IN UINT32   Which\r
+  );\r
+\r
+SOCKET  *\r
+SockClone (\r
+  IN SOCKET *Sock\r
+  );\r
+\r
+VOID\r
+SockRcvdErr (\r
+  IN SOCKET       *Sock,\r
+  IN EFI_STATUS   Error\r
+  );\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;\r
+  EFI_HANDLE            SockHandle;     // the virtual handle of the socket\r
+  EFI_HANDLE            DriverBinding;  // socket't driver binding protocol\r
+  EFI_DEVICE_PATH_PROTOCOL  *ParentDevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
+  SOCK_CONFIGURE_STATE  ConfigureState;\r
+  SOCK_TYPE             Type;\r
+  SOCK_STATE            State;\r
+  UINT16                Flag;\r
+  NET_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
+  NET_LIST_ENTRY  ConnectionList; // the connections maintained by this socket\r
+  //\r
+  // the queue to buffer application's asynchronous token\r
+  //\r
+  NET_LIST_ENTRY  ListenTokenList;\r
+  NET_LIST_ENTRY  RcvTokenList;\r
+  NET_LIST_ENTRY  SndTokenList;\r
+  NET_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
+  union {\r
+    EFI_TCP4_PROTOCOL TcpProtocol;\r
+    EFI_UDP4_PROTOCOL UdpProtocol;\r
+  } NetProtocol;\r
+};\r
+\r
+//\r
+// the token structure buffered in socket layer\r
+//\r
+typedef struct _SOCK_TOKEN {\r
+  NET_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
+// call it to creat a socket and attach it to a PCB\r
+//\r
+SOCKET  *\r
+SockCreateChild (\r
+  IN SOCK_INIT_DATA *SockInitData,\r
+  IN VOID           *ProtoData,\r
+  IN UINT32         Len\r
+  );\r
+\r
+//\r
+// call it to destroy a socket and its related PCB\r
+//\r
+EFI_STATUS\r
+SockDestroyChild (\r
+  IN SOCKET *Sock\r
+  );\r
+\r
+//\r
+// call it to configure a socket and its related PCB\r
+//\r
+EFI_STATUS\r
+SockConfigure (\r
+  IN SOCKET *Sock,\r
+  IN VOID   *ConfigData\r
+  );\r
+\r
+//\r
+// call it to connect a socket to the peer\r
+//\r
+EFI_STATUS\r
+SockConnect (\r
+  IN SOCKET *Sock,\r
+  IN VOID   *Token\r
+  );\r
+\r
+//\r
+// call it to issue an asynchronous listen token to the socket\r
+//\r
+EFI_STATUS\r
+SockAccept (\r
+  IN SOCKET *Sock,\r
+  IN VOID   *Token\r
+  );\r
+\r
+//\r
+// Call it to send data using this socket\r
+//\r
+EFI_STATUS\r
+SockSend (\r
+  IN SOCKET *Sock,\r
+  IN VOID   *Token\r
+  );\r
+\r
+//\r
+// Call it to receive data from this socket\r
+//\r
+EFI_STATUS\r
+SockRcv (\r
+  IN SOCKET *Sock,\r
+  IN VOID   *Token\r
+  );\r
+\r
+//\r
+// Call it to flush a socket\r
+//\r
+EFI_STATUS\r
+SockFlush (\r
+  IN SOCKET *Sock\r
+  );\r
+\r
+//\r
+// Call it to close a socket in the light of policy in Token\r
+//\r
+EFI_STATUS\r
+SockClose (\r
+  IN SOCKET  *Sock,\r
+  IN VOID    *Token,\r
+  IN BOOLEAN OnAbort\r
+  );\r
+\r
+//\r
+// Call it to get the mode data of low layer protocol\r
+//\r
+EFI_STATUS\r
+SockGetMode (\r
+  IN SOCKET *Sock,\r
+  IN VOID   *Mode\r
+  );\r
+\r
+//\r
+// call it to add this socket instance into a group\r
+//\r
+EFI_STATUS\r
+SockGroup (\r
+  IN SOCKET *Sock,\r
+  IN VOID   *GroupInfo\r
+  );\r
+\r
+//\r
+// call it to add a route entry for this socket instance\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
+NET_BUF *\r
+SockBufFirst (\r
+  IN SOCK_BUFFER *Sockbuf\r
+  );\r
+\r
+NET_BUF *\r
+SockBufNext (\r
+  IN SOCK_BUFFER *Sockbuf,\r
+  IN NET_BUF     *SockEntry\r
+  );\r
+\r
+#endif\r