Sync the bug that list node is free before it is removed from the list. That made...
[people/mcb30/edk2.git] / edk2 / MdeModulePkg / Universal / Network / Tcp4Dxe / Socket.h
1 /** @file\r
2 \r
3 Copyright (c) 2005 - 2006, Intel Corporation\r
4 All rights reserved. This program and the accompanying materials\r
5 are licensed and made available under the terms and conditions of the BSD License\r
6 which accompanies this distribution.  The full text of the license may be found at\r
7 http://opensource.org/licenses/bsd-license.php\r
8 \r
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11 \r
12 Module Name:\r
13 \r
14   Socket.h\r
15 \r
16 Abstract:\r
17 \r
18 \r
19 **/\r
20 \r
21 #ifndef _SOCKET_H_\r
22 #define _SOCKET_H_\r
23 \r
24 #include <PiDxe.h>\r
25 \r
26 #include <Protocol/IP4.h>\r
27 #include <Protocol/Tcp4.h>\r
28 #include <Protocol/Udp4.h>\r
29 \r
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
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
73 typedef 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
81 typedef 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
150 typedef struct _SOCKET SOCKET;\r
151 \r
152 typedef struct _SOCK_COMPLETION_TOKEN {\r
153   EFI_EVENT   Event;\r
154   EFI_STATUS  Status;\r
155 } SOCK_COMPLETION_TOKEN;\r
156 \r
157 typedef 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
168 typedef 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
189 typedef 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
197 typedef\r
198 EFI_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
208 typedef 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 //\r
216 // socket provided oprerations for low layer protocol\r
217 //\r
218 \r
219 //\r
220 // socket provided operations for user interface\r
221 //\r
222 VOID\r
223 SockSetState (\r
224   IN SOCKET     *Sock,\r
225   IN SOCK_STATE State\r
226   );\r
227 \r
228 //\r
229 // when the connection establishment process for a Sock\r
230 // is finished low layer protocol calling this function\r
231 // to notify socket layer\r
232 //\r
233 VOID\r
234 SockConnEstablished (\r
235   IN SOCKET *Sock\r
236   );\r
237 \r
238 VOID\r
239 SockConnClosed (\r
240   IN SOCKET *Sock\r
241   );\r
242 \r
243 //\r
244 // called by low layer protocol to trim send buffer of\r
245 // Sock, when Count data is sent out completely\r
246 //\r
247 VOID\r
248 SockDataSent (\r
249   IN SOCKET  *Sock,\r
250   IN UINT32  Count\r
251   );\r
252 \r
253 //\r
254 // called by low layer protocol to get Len of data from\r
255 // socket to send and copy it in Dest\r
256 //\r
257 UINT32\r
258 SockGetDataToSend (\r
259   IN SOCKET *Sock,\r
260   IN UINT32 Offset,\r
261   IN UINT32 Len,\r
262   IN UINT8  *Dest\r
263   );\r
264 \r
265 //\r
266 //  called by low layer protocol to notify socket no more data can be\r
267 //  received\r
268 //\r
269 VOID\r
270 SockNoMoreData (\r
271   IN SOCKET *Sock\r
272   );\r
273 \r
274 //\r
275 // called by low layer protocol to append a NetBuffer\r
276 // to rcv buffer of sock\r
277 //\r
278 VOID\r
279 SockDataRcvd (\r
280   IN SOCKET    *Sock,\r
281   IN NET_BUF   *NetBuffer,\r
282   IN UINT32     UrgLen\r
283   );\r
284 \r
285 UINT32\r
286 SockGetFreeSpace (\r
287   IN SOCKET   *Sock,\r
288   IN UINT32   Which\r
289   );\r
290 \r
291 SOCKET  *\r
292 SockClone (\r
293   IN SOCKET *Sock\r
294   );\r
295 \r
296 VOID\r
297 SockRcvdErr (\r
298   IN SOCKET       *Sock,\r
299   IN EFI_STATUS   Error\r
300   );\r
301 \r
302 typedef\r
303 EFI_STATUS\r
304 (*SOCK_CREATE_CALLBACK) (\r
305   IN SOCKET  *This,\r
306   IN VOID    *Context\r
307   );\r
308 \r
309 typedef\r
310 VOID\r
311 (*SOCK_DESTROY_CALLBACK) (\r
312   IN SOCKET  *This,\r
313   IN VOID    *Context\r
314   );\r
315 \r
316 //\r
317 // the initialize data for create a new socket\r
318 //\r
319 typedef struct _SOCK_INIT_DATA {\r
320   SOCK_TYPE   Type;\r
321   SOCK_STATE  State;\r
322 \r
323   SOCKET      *Parent;        // the parent of this socket\r
324   UINT32      BackLog;        // the connection limit for listening socket\r
325   UINT32      SndBufferSize;  // the high warter mark of send buffer\r
326   UINT32      RcvBufferSize;  // the high warter mark of receive buffer\r
327   VOID        *Protocol;      // the pointer to protocol function template\r
328                               // wanted to install on socket\r
329 \r
330   //\r
331   // Callbacks after socket is created and before socket is to be destroyed.\r
332   //\r
333   SOCK_CREATE_CALLBACK   CreateCallback;\r
334   SOCK_DESTROY_CALLBACK  DestroyCallback;\r
335   VOID                   *Context;\r
336 \r
337   //\r
338   // Opaque protocol data.\r
339   //\r
340   VOID                   *ProtoData;\r
341   UINT32                 DataSize;\r
342 \r
343   SOCK_PROTO_HANDLER     ProtoHandler;\r
344 \r
345   EFI_HANDLE   DriverBinding; // the driver binding handle\r
346 } SOCK_INIT_DATA;\r
347 //\r
348 // the socket structure representing a network service access point\r
349 //\r
350 struct _SOCKET {\r
351 \r
352   //\r
353   // socket description information\r
354   //\r
355   UINT32                Signature;\r
356   EFI_HANDLE            SockHandle;     // the virtual handle of the socket\r
357   EFI_HANDLE            DriverBinding;  // socket't driver binding protocol\r
358   EFI_DEVICE_PATH_PROTOCOL  *ParentDevicePath;\r
359   EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
360   NET_LIST_ENTRY            Link;  \r
361   SOCK_CONFIGURE_STATE  ConfigureState;\r
362   SOCK_TYPE             Type;\r
363   SOCK_STATE            State;\r
364   UINT16                Flag;\r
365   NET_LOCK              Lock;       // the lock of socket\r
366   SOCK_BUFFER           SndBuffer;  // send buffer of application's data\r
367   SOCK_BUFFER           RcvBuffer;  // receive buffer of received data\r
368   EFI_STATUS            SockError;  // the error returned by low layer protocol\r
369   BOOLEAN               IsDestroyed;\r
370 \r
371   //\r
372   // fields used to manage the connection request\r
373   //\r
374   UINT32          BackLog;        // the limit of connection to this socket\r
375   UINT32          ConnCnt;        // the current count of connections to it\r
376   SOCKET          *Parent;        // listening parent that accept the connection\r
377   NET_LIST_ENTRY  ConnectionList; // the connections maintained by this socket\r
378   //\r
379   // the queue to buffer application's asynchronous token\r
380   //\r
381   NET_LIST_ENTRY  ListenTokenList;\r
382   NET_LIST_ENTRY  RcvTokenList;\r
383   NET_LIST_ENTRY  SndTokenList;\r
384   NET_LIST_ENTRY  ProcessingSndTokenList;\r
385 \r
386   SOCK_COMPLETION_TOKEN *ConnectionToken; // app's token to signal if connected\r
387   SOCK_COMPLETION_TOKEN *CloseToken;      // app's token to signal if closed\r
388 \r
389   //\r
390   // interface for low level protocol\r
391   //\r
392   SOCK_PROTO_HANDLER    ProtoHandler; // the request handler of protocol\r
393   UINT8 ProtoReserved[PROTO_RESERVED_LEN];  // Data fields reserved for protocol\r
394   union {\r
395     EFI_TCP4_PROTOCOL TcpProtocol;\r
396     EFI_UDP4_PROTOCOL UdpProtocol;\r
397   } NetProtocol;\r
398 \r
399   //\r
400   // Callbacks.\r
401   //\r
402   SOCK_CREATE_CALLBACK   CreateCallback;\r
403   SOCK_DESTROY_CALLBACK  DestroyCallback;\r
404   VOID                   *Context;\r
405 };\r
406 \r
407 //\r
408 // the token structure buffered in socket layer\r
409 //\r
410 typedef struct _SOCK_TOKEN {\r
411   NET_LIST_ENTRY        TokenList;      // the entry to add in the token list\r
412   SOCK_COMPLETION_TOKEN *Token;         // The application's token\r
413   UINT32                RemainDataLen;  // unprocessed data length\r
414   SOCKET                *Sock;          // the poninter to the socket this token\r
415                                         // belongs to\r
416 } SOCK_TOKEN;\r
417 \r
418 //\r
419 // reserved data to access the NET_BUF delivered by UDP driver\r
420 //\r
421 typedef struct _UDP_RSV_DATA {\r
422   EFI_TIME              TimeStamp;\r
423   EFI_UDP4_SESSION_DATA Session;\r
424 } UDP_RSV_DATA;\r
425 \r
426 //\r
427 // reserved data to access the NET_BUF delivered by TCP driver\r
428 //\r
429 typedef struct _TCP_RSV_DATA {\r
430   UINT32 UrgLen;\r
431 } TCP_RSV_DATA;\r
432 \r
433 //\r
434 // call it to creat a socket and attach it to a PCB\r
435 //\r
436 SOCKET  *\r
437 SockCreateChild (\r
438   IN SOCK_INIT_DATA *SockInitData\r
439   );\r
440 \r
441 //\r
442 // call it to destroy a socket and its related PCB\r
443 //\r
444 EFI_STATUS\r
445 SockDestroyChild (\r
446   IN SOCKET *Sock\r
447   );\r
448 \r
449 //\r
450 // call it to configure a socket and its related PCB\r
451 //\r
452 EFI_STATUS\r
453 SockConfigure (\r
454   IN SOCKET *Sock,\r
455   IN VOID   *ConfigData\r
456   );\r
457 \r
458 //\r
459 // call it to connect a socket to the peer\r
460 //\r
461 EFI_STATUS\r
462 SockConnect (\r
463   IN SOCKET *Sock,\r
464   IN VOID   *Token\r
465   );\r
466 \r
467 //\r
468 // call it to issue an asynchronous listen token to the socket\r
469 //\r
470 EFI_STATUS\r
471 SockAccept (\r
472   IN SOCKET *Sock,\r
473   IN VOID   *Token\r
474   );\r
475 \r
476 //\r
477 // Call it to send data using this socket\r
478 //\r
479 EFI_STATUS\r
480 SockSend (\r
481   IN SOCKET *Sock,\r
482   IN VOID   *Token\r
483   );\r
484 \r
485 //\r
486 // Call it to receive data from this socket\r
487 //\r
488 EFI_STATUS\r
489 SockRcv (\r
490   IN SOCKET *Sock,\r
491   IN VOID   *Token\r
492   );\r
493 \r
494 //\r
495 // Call it to flush a socket\r
496 //\r
497 EFI_STATUS\r
498 SockFlush (\r
499   IN SOCKET *Sock\r
500   );\r
501 \r
502 //\r
503 // Call it to close a socket in the light of policy in Token\r
504 //\r
505 EFI_STATUS\r
506 SockClose (\r
507   IN SOCKET  *Sock,\r
508   IN VOID    *Token,\r
509   IN BOOLEAN OnAbort\r
510   );\r
511 \r
512 //\r
513 // Call it to get the mode data of low layer protocol\r
514 //\r
515 EFI_STATUS\r
516 SockGetMode (\r
517   IN SOCKET *Sock,\r
518   IN VOID   *Mode\r
519   );\r
520 \r
521 //\r
522 // call it to add this socket instance into a group\r
523 //\r
524 EFI_STATUS\r
525 SockGroup (\r
526   IN SOCKET *Sock,\r
527   IN VOID   *GroupInfo\r
528   );\r
529 \r
530 //\r
531 // call it to add a route entry for this socket instance\r
532 //\r
533 EFI_STATUS\r
534 SockRoute (\r
535   IN SOCKET    *Sock,\r
536   IN VOID      *RouteInfo\r
537   );\r
538 \r
539 //\r
540 // Supporting function to operate on socket buffer\r
541 //\r
542 NET_BUF *\r
543 SockBufFirst (\r
544   IN SOCK_BUFFER *Sockbuf\r
545   );\r
546 \r
547 NET_BUF *\r
548 SockBufNext (\r
549   IN SOCK_BUFFER *Sockbuf,\r
550   IN NET_BUF     *SockEntry\r
551   );\r
552 \r
553 #endif\r