]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/Tcp4Dxe/Socket.h
Remove the EDK build infrastructure, which was the temp solution when EDKII build...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Tcp4Dxe / Socket.h
CommitLineData
83cbd279 1/** @file\r
2\r
3Copyright (c) 2005 - 2006, Intel Corporation\r
4All rights reserved. This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12Module Name:\r
13\r
14 Socket.h\r
15\r
16Abstract:\r
17\r
18\r
19**/\r
20\r
21#ifndef _SOCKET_H_\r
22#define _SOCKET_H_\r
23\r
8a67d61d 24#include <PiDxe.h>\r
25\r
26#include <Protocol/IP4.h>\r
83cbd279 27#include <Protocol/Tcp4.h>\r
8a67d61d 28#include <Protocol/Udp4.h>\r
83cbd279 29\r
8a67d61d 30#include <Library/NetLib.h>\r
31#include <Library/DebugLib.h>\r
32#include <Library/UefiRuntimeServicesTableLib.h>\r
33#include <Library/UefiDriverEntryPoint.h>\r
34#include <Library/UefiBootServicesTableLib.h>\r
35#include <Library/BaseLib.h>\r
83cbd279 36#include <Library/UefiLib.h>\r
37#include <Library/MemoryAllocationLib.h>\r
38#include <Library/BaseMemoryLib.h>\r
39\r
40#define SOCK_SND_BUF 0\r
41#define SOCK_RCV_BUF 1\r
42\r
43#define SOCK_BUFF_LOW_WATER 2 * 1024\r
44#define SOCK_RCV_BUFF_SIZE 8 * 1024\r
45#define SOCK_SND_BUFF_SIZE 8 * 1024\r
46#define SOCK_BACKLOG 5\r
47\r
48#define PROTO_RESERVED_LEN 20\r
49\r
50#define SO_NO_MORE_DATA 0x0001\r
51\r
52//\r
53//\r
54//\r
55// When a socket is created it enters into SO_UNCONFIGURED,\r
56// no actions can be taken on this socket, only after calling\r
57// SockConfigure. The state transition diagram of socket is\r
58// as following:\r
59//\r
60// SO_UNCONFIGURED --- SO_CONFIGURED --- SO_CONNECTING\r
61// ^ | |\r
62// | ---> SO_LISTENING |\r
63// | |\r
64// |------------------SO_DISCONNECTING<-- SO_CONNECTED\r
65//\r
66// A passive socket can only go into SO_LISTENING and\r
67// SO_UNCONFIGURED state. SO_XXXING state is a middle state\r
68// when a socket is undergoing a protocol procedure such\r
69// as requesting a TCP connection.\r
70//\r
71//\r
72//\r
73typedef enum {\r
74 SO_CLOSED = 0,\r
75 SO_LISTENING,\r
76 SO_CONNECTING,\r
77 SO_CONNECTED,\r
78 SO_DISCONNECTING\r
79} SOCK_STATE;\r
80\r
81typedef enum {\r
82 SO_UNCONFIGURED = 0,\r
83 SO_CONFIGURED_ACTIVE,\r
84 SO_CONFIGURED_PASSIVE,\r
85 SO_NO_MAPPING\r
86} SOCK_CONFIGURE_STATE;\r
87\r
88#define SOCK_NO_MORE_DATA(Sock) ((Sock)->Flag |= SO_NO_MORE_DATA)\r
89\r
90#define SOCK_IS_UNCONFIGURED(Sock) ((Sock)->ConfigureState == SO_UNCONFIGURED)\r
91\r
92#define SOCK_IS_CONFIGURED(Sock) \\r
93 (((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) || \\r
94 ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE))\r
95\r
96#define SOCK_IS_CONFIGURED_ACTIVE(Sock) \\r
97 ((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE)\r
98\r
99#define SOCK_IS_CONNECTED_PASSIVE(Sock) \\r
100 ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE)\r
101\r
102#define SOCK_IS_NO_MAPPING(Sock) \\r
103 ((Sock)->ConfigureState == SO_NO_MAPPING)\r
104\r
105#define SOCK_IS_CLOSED(Sock) ((Sock)->State == SO_CLOSED)\r
106\r
107#define SOCK_IS_LISTENING(Sock) ((Sock)->State == SO_LISTENING)\r
108\r
109#define SOCK_IS_CONNECTING(Sock) ((Sock)->State == SO_CONNECTING)\r
110\r
111#define SOCK_IS_CONNECTED(Sock) ((Sock)->State == SO_CONNECTED)\r
112\r
113#define SOCK_IS_DISCONNECTING(Sock) ((Sock)->State == SO_DISCONNECTING)\r
114\r
115#define SOCK_IS_NO_MORE_DATA(Sock) (0 != ((Sock)->Flag & SO_NO_MORE_DATA))\r
116\r
117#define SOCK_SIGNATURE EFI_SIGNATURE_32 ('S', 'O', 'C', 'K')\r
118\r
119#define SOCK_FROM_THIS(a) CR ((a), SOCKET, NetProtocol, SOCK_SIGNATURE)\r
120\r
121#define SET_RCV_BUFFSIZE(Sock, Size) ((Sock)->RcvBuffer.HighWater = (Size))\r
122\r
123#define GET_RCV_BUFFSIZE(Sock) ((Sock)->RcvBuffer.HighWater)\r
124\r
125#define GET_RCV_DATASIZE(Sock) (((Sock)->RcvBuffer.DataQueue)->BufSize)\r
126\r
127#define SET_SND_BUFFSIZE(Sock, Size) ((Sock)->SndBuffer.HighWater = (Size))\r
128\r
129#define GET_SND_BUFFSIZE(Sock) ((Sock)->SndBuffer.HighWater)\r
130\r
131#define GET_SND_DATASIZE(Sock) (((Sock)->SndBuffer.DataQueue)->BufSize)\r
132\r
133#define SET_BACKLOG(Sock, Value) ((Sock)->BackLog = (Value))\r
134\r
135#define GET_BACKLOG(Sock) ((Sock)->BackLog)\r
136\r
137#define SOCK_ERROR(Sock, Error) ((Sock)->SockError = (Error))\r
138\r
139#define SND_BUF_HDR_LEN(Sock) \\r
140 ((SockBufFirst (&((Sock)->SndBuffer)))->TotalSize)\r
141\r
142#define RCV_BUF_HDR_LEN(Sock) \\r
143 ((SockBufFirst (&((Sock)->RcvBuffer)))->TotalSize)\r
144\r
145#define SOCK_FROM_TOKEN(Token) (((SOCK_TOKEN *) (Token))->Sock)\r
146\r
147#define PROTO_TOKEN_FORM_SOCK(SockToken, Type) \\r
148 ((Type *) (((SOCK_TOKEN *) (SockToken))->Token))\r
149\r
150typedef struct _SOCKET SOCKET;\r
151\r
152typedef struct _SOCK_COMPLETION_TOKEN {\r
153 EFI_EVENT Event;\r
154 EFI_STATUS Status;\r
155} SOCK_COMPLETION_TOKEN;\r
156\r
157typedef struct _SOCK_IO_TOKEN {\r
158 SOCK_COMPLETION_TOKEN Token;\r
159 union {\r
160 VOID *RxData;\r
161 VOID *TxData;\r
162 } Packet;\r
163} SOCK_IO_TOKEN;\r
164\r
165//\r
166// the request issued from socket layer to protocol layer\r
167//\r
168typedef enum {\r
169 SOCK_ATTACH, // attach current socket to a new PCB\r
170 SOCK_DETACH, // detach current socket from the PCB\r
171 SOCK_CONFIGURE, // configure attached PCB\r
172 SOCK_FLUSH, // flush attached PCB\r
173 SOCK_SND, // need protocol to send something\r
174 SOCK_SNDPUSH, // need protocol to send pushed data\r
175 SOCK_SNDURG, // need protocol to send urgent data\r
176 SOCK_CONSUMED, // application has retrieved data from socket\r
177 SOCK_CONNECT, // need to connect to a peer\r
178 SOCK_CLOSE, // need to close the protocol process\r
179 SOCK_ABORT, // need to reset the protocol process\r
180 SOCK_POLL, // need to poll to the protocol layer\r
181 SOCK_ROUTE, // need to add a route information\r
182 SOCK_MODE, // need to get the mode data of the protocol\r
183 SOCK_GROUP // need to join a mcast group\r
184} SOCK_REQUEST;\r
185\r
186//\r
187// the socket type\r
188//\r
189typedef enum {\r
190 SOCK_DGRAM, // this socket providing datagram service\r
191 SOCK_STREAM // this socket providing stream service\r
192} SOCK_TYPE;\r
193\r
194//\r
195// the handler of protocol for request from socket\r
196//\r
197typedef\r
198EFI_STATUS\r
199(*SOCK_PROTO_HANDLER) (\r
200 IN SOCKET * Socket, // the socket issuing the request to protocol\r
201 IN SOCK_REQUEST Request, // the request issued by socket\r
202 IN VOID *RequestData // the request related data\r
203 );\r
204\r
205//\r
206// the buffer structure of rcvd data and send data used by socket\r
207//\r
208typedef struct _SOCK_BUFFER {\r
209 UINT32 HighWater; // the buffersize upper limit of sock_buffer\r
210 UINT32 LowWater; // the low warter mark of sock_buffer\r
211 NET_BUF_QUEUE *DataQueue; // the queue to buffer data\r
212} SOCK_BUFFER;\r
213\r
214//\r
215// the initialize data for create a new socket\r
216//\r
217typedef struct _SOCK_INIT_DATA {\r
218 SOCK_TYPE Type;\r
219 SOCK_STATE State;\r
220\r
221 SOCKET *Parent; // the parent of this socket\r
222 UINT32 BackLog; // the connection limit for listening socket\r
223 UINT32 SndBufferSize; // the high warter mark of send buffer\r
224 UINT32 RcvBufferSize; // the high warter mark of receive buffer\r
225 VOID *Protocol; // the pointer to protocol function template\r
226 // wanted to install on socket\r
227\r
228 SOCK_PROTO_HANDLER ProtoHandler;\r
229\r
230 EFI_HANDLE DriverBinding; // the driver binding handle\r
231} SOCK_INIT_DATA;\r
232\r
233//\r
234// socket provided oprerations for low layer protocol\r
235//\r
236\r
237//\r
238// socket provided operations for user interface\r
239//\r
240VOID\r
241SockSetState (\r
242 IN SOCKET *Sock,\r
243 IN SOCK_STATE State\r
244 );\r
245\r
246//\r
247// when the connection establishment process for a Sock\r
248// is finished low layer protocol calling this function\r
249// to notify socket layer\r
250//\r
251VOID\r
252SockConnEstablished (\r
253 IN SOCKET *Sock\r
254 );\r
255\r
256VOID\r
257SockConnClosed (\r
258 IN SOCKET *Sock\r
259 );\r
260\r
261//\r
262// called by low layer protocol to trim send buffer of\r
263// Sock, when Count data is sent out completely\r
264//\r
265VOID\r
266SockDataSent (\r
267 IN SOCKET *Sock,\r
268 IN UINT32 Count\r
269 );\r
270\r
271//\r
272// called by low layer protocol to get Len of data from\r
273// socket to send and copy it in Dest\r
274//\r
275UINT32\r
276SockGetDataToSend (\r
277 IN SOCKET *Sock,\r
278 IN UINT32 Offset,\r
279 IN UINT32 Len,\r
280 IN UINT8 *Dest\r
281 );\r
282\r
283//\r
284// called by low layer protocol to notify socket no more data can be\r
285// received\r
286//\r
287VOID\r
288SockNoMoreData (\r
289 IN SOCKET *Sock\r
290 );\r
291\r
292//\r
293// called by low layer protocol to append a NetBuffer\r
294// to rcv buffer of sock\r
295//\r
296VOID\r
297SockDataRcvd (\r
298 IN SOCKET *Sock,\r
299 IN NET_BUF *NetBuffer,\r
300 IN UINT32 UrgLen\r
301 );\r
302\r
303UINT32\r
304SockGetFreeSpace (\r
305 IN SOCKET *Sock,\r
306 IN UINT32 Which\r
307 );\r
308\r
309SOCKET *\r
310SockClone (\r
311 IN SOCKET *Sock\r
312 );\r
313\r
314VOID\r
315SockRcvdErr (\r
316 IN SOCKET *Sock,\r
317 IN EFI_STATUS Error\r
318 );\r
319\r
320//\r
321// the socket structure representing a network service access point\r
322//\r
323struct _SOCKET {\r
324\r
325 //\r
326 // socket description information\r
327 //\r
328 UINT32 Signature;\r
329 EFI_HANDLE SockHandle; // the virtual handle of the socket\r
330 EFI_HANDLE DriverBinding; // socket't driver binding protocol\r
331 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
332 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
c4a62a12 333 NET_LIST_ENTRY Link; \r
83cbd279 334 SOCK_CONFIGURE_STATE ConfigureState;\r
335 SOCK_TYPE Type;\r
336 SOCK_STATE State;\r
337 UINT16 Flag;\r
338 NET_LOCK Lock; // the lock of socket\r
339 SOCK_BUFFER SndBuffer; // send buffer of application's data\r
340 SOCK_BUFFER RcvBuffer; // receive buffer of received data\r
341 EFI_STATUS SockError; // the error returned by low layer protocol\r
342 BOOLEAN IsDestroyed;\r
343\r
344 //\r
345 // fields used to manage the connection request\r
346 //\r
347 UINT32 BackLog; // the limit of connection to this socket\r
348 UINT32 ConnCnt; // the current count of connections to it\r
349 SOCKET *Parent; // listening parent that accept the connection\r
350 NET_LIST_ENTRY ConnectionList; // the connections maintained by this socket\r
351 //\r
352 // the queue to buffer application's asynchronous token\r
353 //\r
354 NET_LIST_ENTRY ListenTokenList;\r
355 NET_LIST_ENTRY RcvTokenList;\r
356 NET_LIST_ENTRY SndTokenList;\r
357 NET_LIST_ENTRY ProcessingSndTokenList;\r
358\r
359 SOCK_COMPLETION_TOKEN *ConnectionToken; // app's token to signal if connected\r
360 SOCK_COMPLETION_TOKEN *CloseToken; // app's token to signal if closed\r
361\r
362 //\r
363 // interface for low level protocol\r
364 //\r
365 SOCK_PROTO_HANDLER ProtoHandler; // the request handler of protocol\r
366 UINT8 ProtoReserved[PROTO_RESERVED_LEN]; // Data fields reserved for protocol\r
367 union {\r
368 EFI_TCP4_PROTOCOL TcpProtocol;\r
369 EFI_UDP4_PROTOCOL UdpProtocol;\r
370 } NetProtocol;\r
371};\r
372\r
373//\r
374// the token structure buffered in socket layer\r
375//\r
376typedef struct _SOCK_TOKEN {\r
377 NET_LIST_ENTRY TokenList; // the entry to add in the token list\r
378 SOCK_COMPLETION_TOKEN *Token; // The application's token\r
379 UINT32 RemainDataLen; // unprocessed data length\r
380 SOCKET *Sock; // the poninter to the socket this token\r
381 // belongs to\r
382} SOCK_TOKEN;\r
383\r
384//\r
385// reserved data to access the NET_BUF delivered by UDP driver\r
386//\r
387typedef struct _UDP_RSV_DATA {\r
388 EFI_TIME TimeStamp;\r
389 EFI_UDP4_SESSION_DATA Session;\r
390} UDP_RSV_DATA;\r
391\r
392//\r
393// reserved data to access the NET_BUF delivered by TCP driver\r
394//\r
395typedef struct _TCP_RSV_DATA {\r
396 UINT32 UrgLen;\r
397} TCP_RSV_DATA;\r
398\r
399//\r
400// call it to creat a socket and attach it to a PCB\r
401//\r
402SOCKET *\r
403SockCreateChild (\r
404 IN SOCK_INIT_DATA *SockInitData,\r
405 IN VOID *ProtoData,\r
406 IN UINT32 Len\r
407 );\r
408\r
409//\r
410// call it to destroy a socket and its related PCB\r
411//\r
412EFI_STATUS\r
413SockDestroyChild (\r
414 IN SOCKET *Sock\r
415 );\r
416\r
417//\r
418// call it to configure a socket and its related PCB\r
419//\r
420EFI_STATUS\r
421SockConfigure (\r
422 IN SOCKET *Sock,\r
423 IN VOID *ConfigData\r
424 );\r
425\r
426//\r
427// call it to connect a socket to the peer\r
428//\r
429EFI_STATUS\r
430SockConnect (\r
431 IN SOCKET *Sock,\r
432 IN VOID *Token\r
433 );\r
434\r
435//\r
436// call it to issue an asynchronous listen token to the socket\r
437//\r
438EFI_STATUS\r
439SockAccept (\r
440 IN SOCKET *Sock,\r
441 IN VOID *Token\r
442 );\r
443\r
444//\r
445// Call it to send data using this socket\r
446//\r
447EFI_STATUS\r
448SockSend (\r
449 IN SOCKET *Sock,\r
450 IN VOID *Token\r
451 );\r
452\r
453//\r
454// Call it to receive data from this socket\r
455//\r
456EFI_STATUS\r
457SockRcv (\r
458 IN SOCKET *Sock,\r
459 IN VOID *Token\r
460 );\r
461\r
462//\r
463// Call it to flush a socket\r
464//\r
465EFI_STATUS\r
466SockFlush (\r
467 IN SOCKET *Sock\r
468 );\r
469\r
470//\r
471// Call it to close a socket in the light of policy in Token\r
472//\r
473EFI_STATUS\r
474SockClose (\r
475 IN SOCKET *Sock,\r
476 IN VOID *Token,\r
477 IN BOOLEAN OnAbort\r
478 );\r
479\r
480//\r
481// Call it to get the mode data of low layer protocol\r
482//\r
483EFI_STATUS\r
484SockGetMode (\r
485 IN SOCKET *Sock,\r
486 IN VOID *Mode\r
487 );\r
488\r
489//\r
490// call it to add this socket instance into a group\r
491//\r
492EFI_STATUS\r
493SockGroup (\r
494 IN SOCKET *Sock,\r
495 IN VOID *GroupInfo\r
496 );\r
497\r
498//\r
499// call it to add a route entry for this socket instance\r
500//\r
501EFI_STATUS\r
502SockRoute (\r
503 IN SOCKET *Sock,\r
504 IN VOID *RouteInfo\r
505 );\r
506\r
507//\r
508// Supporting function to operate on socket buffer\r
509//\r
510NET_BUF *\r
511SockBufFirst (\r
512 IN SOCK_BUFFER *Sockbuf\r
513 );\r
514\r
515NET_BUF *\r
516SockBufNext (\r
517 IN SOCK_BUFFER *Sockbuf,\r
518 IN NET_BUF *SockEntry\r
519 );\r
520\r
521#endif\r