-/** @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