X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FNetwork%2FTcp4Dxe%2FSocket.h;h=2e35f5ecd715ca8e0d53ef1394be8607038daa4a;hb=4f6e31e47bc014da5055fa03779888d87c5e4c2a;hp=7c219e3b9b67db23bb5037ae21e94396c8f4e7be;hpb=4eb65aff715faafd9040c6fc85a5d59e22343978;p=mirror_edk2.git diff --git a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h b/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h index 7c219e3b9b..2e35f5ecd7 100644 --- a/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h +++ b/MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h @@ -1,518 +1,553 @@ -/** @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 + +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_ + #include #include -#include +#include #include - + #include #include #include #include #include #include -#include -#include -#include - -#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 +#include +#include + +#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; + + +// +// 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 + ); + +typedef +EFI_STATUS +(*SOCK_CREATE_CALLBACK) ( + IN SOCKET *This, + IN VOID *Context + ); + +typedef +VOID +(*SOCK_DESTROY_CALLBACK) ( + IN SOCKET *This, + IN VOID *Context + ); + +// +// the initialize data for create a new socket +// +typedef struct _SOCK_INIT_DATA { + SOCK_TYPE Type; + 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 + + // + // Callbacks after socket is created and before socket is to be destroyed. + // + SOCK_CREATE_CALLBACK CreateCallback; + SOCK_DESTROY_CALLBACK DestroyCallback; + VOID *Context; + + // + // Opaque protocol data. + // + VOID *ProtoData; + UINT32 DataSize; + + SOCK_PROTO_HANDLER ProtoHandler; + + EFI_HANDLE DriverBinding; // the driver binding handle +} SOCK_INIT_DATA; +// +// 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; + NET_LIST_ENTRY Link; + 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; + + // + // Callbacks. + // + SOCK_CREATE_CALLBACK CreateCallback; + SOCK_DESTROY_CALLBACK DestroyCallback; + VOID *Context; +}; + +// +// 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 + ); + +// +// 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