-/** @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
-//
-typedef 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;
-} SOCKET;
-
-//
-// 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 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
+//\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. 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; This \r
+ function flushes the socket, sets the state to SO_CLOSED and signals the close \r
+ 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
+ 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; This\r
+ function set the socket's state to SO_NO_MORE_DATA and\r
+ signal all queued IO tokens with the error status\r
+ 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
+ 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 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