]> git.proxmox.com Git - mirror_edk2.git/blob - NetworkPkg/TcpDxe/Socket.h
MdeModulePkg-DxeCore: rename CoreGetMemoryMapPropertiesTable
[mirror_edk2.git] / NetworkPkg / TcpDxe / Socket.h
1 /** @file
2 Common head file for TCP socket.
3
4 Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>
5
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php.
10
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14 **/
15
16 #ifndef _SOCKET_H_
17 #define _SOCKET_H_
18
19 #include <Uefi.h>
20
21 #include <Protocol/Tcp4.h>
22 #include <Protocol/Tcp6.h>
23
24 #include <Library/NetLib.h>
25 #include <Library/DebugLib.h>
26 #include <Library/BaseMemoryLib.h>
27 #include <Library/MemoryAllocationLib.h>
28 #include <Library/UefiRuntimeServicesTableLib.h>
29 #include <Library/UefiBootServicesTableLib.h>
30 #include <Library/UefiLib.h>
31 #include <Library/DpcLib.h>
32
33 #define SOCK_SND_BUF 0
34 #define SOCK_RCV_BUF 1
35
36 #define SOCK_BUFF_LOW_WATER (2 * 1024)
37 #define SOCK_RCV_BUFF_SIZE (8 * 1024)
38 #define SOCK_SND_BUFF_SIZE (8 * 1024)
39 #define SOCK_BACKLOG 5
40
41 #define PROTO_RESERVED_LEN 20
42
43 #define SO_NO_MORE_DATA 0x0001
44
45 //
46 //
47 //
48 // When a socket is created it enters into SO_UNCONFIGURED,
49 // no actions can be taken on this socket, only after calling
50 // SockConfigure. The state transition diagram of socket is
51 // as following:
52 //
53 // SO_UNCONFIGURED --- SO_CONFIGURED --- SO_CONNECTING
54 // ^ | |
55 // | ---> SO_LISTENING |
56 // | |
57 // |------------------SO_DISCONNECTING<-- SO_CONNECTED
58 //
59 // A passive socket can only go into SO_LISTENING and
60 // SO_UNCONFIGURED state. SO_XXXING state is a middle state
61 // when a socket is undergoing a protocol procedure such
62 // as requesting a TCP connection.
63 //
64 //
65 //
66
67 ///
68 /// Socket state
69 ///
70 #define SO_CLOSED 0
71 #define SO_LISTENING 1
72 #define SO_CONNECTING 2
73 #define SO_CONNECTED 3
74 #define SO_DISCONNECTING 4
75
76 ///
77 /// Socket configure state
78 ///
79 #define SO_UNCONFIGURED 0
80 #define SO_CONFIGURED_ACTIVE 1
81 #define SO_CONFIGURED_PASSIVE 2
82 #define SO_NO_MAPPING 3
83
84 ///
85 /// The request issued from socket layer to protocol layer.
86 ///
87 #define SOCK_ATTACH 0 ///< Attach current socket to a new PCB
88 #define SOCK_DETACH 1 ///< Detach current socket from the PCB
89 #define SOCK_CONFIGURE 2 ///< Configure attached PCB
90 #define SOCK_FLUSH 3 ///< Flush attached PCB
91 #define SOCK_SND 4 ///< Need protocol to send something
92 #define SOCK_SNDPUSH 5 ///< Need protocol to send pushed data
93 #define SOCK_SNDURG 6 ///< Need protocol to send urgent data
94 #define SOCK_CONSUMED 7 ///< Application has retrieved data from socket
95 #define SOCK_CONNECT 8 ///< Need to connect to a peer
96 #define SOCK_CLOSE 9 ///< Need to close the protocol process
97 #define SOCK_ABORT 10 ///< Need to reset the protocol process
98 #define SOCK_POLL 11 ///< Need to poll to the protocol layer
99 #define SOCK_ROUTE 12 ///< Need to add a route information
100 #define SOCK_MODE 13 ///< Need to get the mode data of the protocol
101 #define SOCK_GROUP 14 ///< Need to join a mcast group
102
103 /**
104 Set socket SO_NO_MORE_DATA flag.
105
106 @param[in] Sock Pointer to the socket
107
108 **/
109 #define SOCK_NO_MORE_DATA(Sock) ((Sock)->Flag |= SO_NO_MORE_DATA)
110
111 /**
112 Check whether the socket is unconfigured.
113
114 @param[in] Sock Pointer to the socket.
115
116 @retval TRUE The socket is unconfigued.
117 @retval FALSE The socket is not unconfigued.
118
119 **/
120 #define SOCK_IS_UNCONFIGURED(Sock) ((Sock)->ConfigureState == SO_UNCONFIGURED)
121
122 /**
123 Check whether the socket is configured.
124
125 @param[in] Sock Pointer to the socket
126
127 @retval TRUE The socket is configued
128 @retval FALSE The socket is not configued
129
130 **/
131 #define SOCK_IS_CONFIGURED(Sock) \
132 (((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE) || \
133 ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE))
134
135 /**
136 Check whether the socket is configured to active mode.
137
138 @param[in] Sock Pointer to the socket.
139
140 @retval TRUE The socket is configued to active mode.
141 @retval FALSE The socket is not configued to active mode.
142
143 **/
144 #define SOCK_IS_CONFIGURED_ACTIVE(Sock) ((Sock)->ConfigureState == SO_CONFIGURED_ACTIVE)
145
146 /**
147 Check whether the socket is configured to passive mode.
148
149 @param[in] Sock Pointer to the socket.
150
151 @retval TRUE The socket is configued to passive mode.
152 @retval FALSE The socket is not configued to passive mode.
153
154 **/
155 #define SOCK_IS_CONNECTED_PASSIVE(Sock) ((Sock)->ConfigureState == SO_CONFIGURED_PASSIVE)
156
157 /**
158 Check whether the socket is mapped.
159
160 @param[in] Sock Pointer to the socket.
161
162 @retval TRUE The socket is not mapping.
163 @retval FALSE The socket is mapped.
164
165 **/
166 #define SOCK_IS_NO_MAPPING(Sock) ((Sock)->ConfigureState == SO_NO_MAPPING)
167
168 /**
169 Check whether the socket is closed.
170
171 @param[in] Sock Pointer to the socket.
172
173 @retval TRUE The socket is closed.
174 @retval FALSE The socket is not closed.
175
176 **/
177 #define SOCK_IS_CLOSED(Sock) ((Sock)->State == SO_CLOSED)
178
179 /**
180 Check whether the socket is listening.
181
182 @param[in] Sock Pointer to the socket.
183
184 @retval TRUE The socket is listening.
185 @retval FALSE The socket is not listening.
186
187 **/
188 #define SOCK_IS_LISTENING(Sock) ((Sock)->State == SO_LISTENING)
189
190 /**
191 Check whether the socket is connecting.
192
193 @param[in] Sock Pointer to the socket.
194
195 @retval TRUE The socket is connecting.
196 @retval FALSE The socket is not connecting.
197
198 **/
199 #define SOCK_IS_CONNECTING(Sock) ((Sock)->State == SO_CONNECTING)
200
201 /**
202 Check whether the socket has connected.
203
204 @param[in] Sock Pointer to the socket.
205
206 @retval TRUE The socket has connected.
207 @retval FALSE The socket has not connected.
208
209 **/
210 #define SOCK_IS_CONNECTED(Sock) ((Sock)->State == SO_CONNECTED)
211
212 /**
213 Check whether the socket is disconnecting.
214
215 @param[in] Sock Pointer to the socket.
216
217 @retval TRUE The socket is disconnecting.
218 @retval FALSE The socket is not disconnecting.
219
220 **/
221 #define SOCK_IS_DISCONNECTING(Sock) ((Sock)->State == SO_DISCONNECTING)
222
223 /**
224 Check whether the socket is no more data.
225
226 @param[in] Sock Pointer to the socket.
227
228 @retval TRUE The socket is no more data.
229 @retval FALSE The socket still has data.
230
231 **/
232 #define SOCK_IS_NO_MORE_DATA(Sock) (0 != ((Sock)->Flag & SO_NO_MORE_DATA))
233
234 /**
235 Set the size of the receive buffer.
236
237 @param[in] Sock Pointer to the socket.
238 @param[in] Size The size to set.
239
240 **/
241 #define SET_RCV_BUFFSIZE(Sock, Size) ((Sock)->RcvBuffer.HighWater = (Size))
242
243 /**
244 Get the size of the receive buffer.
245
246 @param[in] Sock Pointer to the socket.
247
248 @return The receive buffer size.
249
250 **/
251 #define GET_RCV_BUFFSIZE(Sock) ((Sock)->RcvBuffer.HighWater)
252
253 /**
254 Get the size of the receive data.
255
256 @param[in] Sock Pointer to the socket.
257
258 @return The received data size.
259
260 **/
261 #define GET_RCV_DATASIZE(Sock) (((Sock)->RcvBuffer.DataQueue)->BufSize)
262
263 /**
264 Set the size of the send buffer.
265
266 @param[in] Sock Pointer to the socket.
267 @param[in] Size The size to set.
268
269 **/
270 #define SET_SND_BUFFSIZE(Sock, Size) ((Sock)->SndBuffer.HighWater = (Size))
271
272 /**
273 Get the size of the send buffer.
274
275 @param[in] Sock Pointer to the socket.
276
277 @return The send buffer size.
278
279 **/
280 #define GET_SND_BUFFSIZE(Sock) ((Sock)->SndBuffer.HighWater)
281
282 /**
283 Get the size of the send data.
284
285 @param[in] Sock Pointer to the socket.
286
287 @return The send data size.
288
289 **/
290 #define GET_SND_DATASIZE(Sock) (((Sock)->SndBuffer.DataQueue)->BufSize)
291
292 /**
293 Set the backlog value of the socket.
294
295 @param[in] Sock Pointer to the socket.
296 @param[in] Value The value to set.
297
298 **/
299 #define SET_BACKLOG(Sock, Value) ((Sock)->BackLog = (Value))
300
301 /**
302 Get the backlog value of the socket.
303
304 @param[in] Sock Pointer to the socket.
305
306 @return The backlog value.
307
308 **/
309 #define GET_BACKLOG(Sock) ((Sock)->BackLog)
310
311 /**
312 Set the socket with error state.
313
314 @param[in] Sock Pointer to the socket.
315 @param[in] Error The error state.
316
317 **/
318 #define SOCK_ERROR(Sock, Error) ((Sock)->SockError = (Error))
319
320 #define SOCK_SIGNATURE SIGNATURE_32 ('S', 'O', 'C', 'K')
321
322 #define SOCK_FROM_THIS(a) CR ((a), SOCKET, NetProtocol, SOCK_SIGNATURE)
323
324 #define SOCK_FROM_TOKEN(Token) (((SOCK_TOKEN *) (Token))->Sock)
325
326 #define PROTO_TOKEN_FORM_SOCK(SockToken, Type) ((Type *) (((SOCK_TOKEN *) (SockToken))->Token))
327
328 typedef struct _TCP_SOCKET SOCKET;
329
330 ///
331 /// Socket completion token
332 ///
333 typedef struct _SOCK_COMPLETION_TOKEN {
334 EFI_EVENT Event; ///< The event to be issued
335 EFI_STATUS Status; ///< The status to be issued
336 } SOCK_COMPLETION_TOKEN;
337
338 typedef union {
339 VOID *RxData;
340 VOID *TxData;
341 } SOCK_IO_DATA;
342
343 ///
344 /// The application token with data packet
345 ///
346 typedef struct _SOCK_IO_TOKEN {
347 SOCK_COMPLETION_TOKEN Token;
348 SOCK_IO_DATA Packet;
349 } SOCK_IO_TOKEN;
350
351 ///
352 /// The socket type.
353 ///
354 typedef enum {
355 SockDgram, ///< This socket providing datagram service
356 SockStream ///< This socket providing stream service
357 } SOCK_TYPE;
358
359 ///
360 /// The buffer structure of rcvd data and send data used by socket.
361 ///
362 typedef struct _SOCK_BUFFER {
363 UINT32 HighWater; ///< The buffersize upper limit of sock_buffer
364 UINT32 LowWater; ///< The low warter mark of sock_buffer
365 NET_BUF_QUEUE *DataQueue; ///< The queue to buffer data
366 } SOCK_BUFFER;
367
368 /**
369 The handler of protocol for request from socket.
370
371 @param[in] Socket The socket issuing the request to protocol.
372 @param[in] Request The request issued by socket.
373 @param[in] RequestData The request related data.
374
375 @retval EFI_SUCCESS The socket request is completed successfully.
376 @retval other The error status returned by the corresponding TCP
377 layer function.
378
379 **/
380 typedef
381 EFI_STATUS
382 (*SOCK_PROTO_HANDLER) (
383 IN SOCKET *Socket,
384 IN UINT8 Request,
385 IN VOID *RequestData
386 );
387
388 /**
389 The Callback funtion called after the TCP socket is created.
390
391 @param[in] This Pointer to the socket just created.
392 @param[in] Context Context of the socket.
393
394 @retval EFI_SUCCESS This protocol installed successfully.
395 @retval other Some error occured.
396
397 **/
398 typedef
399 EFI_STATUS
400 (*SOCK_CREATE_CALLBACK) (
401 IN SOCKET *This,
402 IN VOID *Context
403 );
404
405 /**
406 The callback function called before the TCP socket is to be destroyed.
407
408 @param[in] This The TCP socket to be destroyed.
409 @param[in] Context The context.
410
411 **/
412 typedef
413 VOID
414 (*SOCK_DESTROY_CALLBACK) (
415 IN SOCKET *This,
416 IN VOID *Context
417 );
418
419 ///
420 /// The initialize data for create a new socket.
421 ///
422 typedef struct _SOCK_INIT_DATA {
423 SOCK_TYPE Type;
424 UINT8 State;
425
426 SOCKET *Parent; ///< The parent of this socket
427 UINT32 BackLog; ///< The connection limit for listening socket
428 UINT32 SndBufferSize; ///< The high warter mark of send buffer
429 UINT32 RcvBufferSize; ///< The high warter mark of receive buffer
430 UINT8 IpVersion;
431 VOID *Protocol; ///< The pointer to protocol function template
432 ///< wanted to install on socket
433
434 //
435 // Callbacks after socket is created and before socket is to be destroyed.
436 //
437 SOCK_CREATE_CALLBACK CreateCallback; ///< Callback after created
438 SOCK_DESTROY_CALLBACK DestroyCallback; ///< Callback before destroied
439 VOID *Context; ///< The context of the callback
440
441 //
442 // Opaque protocol data.
443 //
444 VOID *ProtoData;
445 UINT32 DataSize;
446
447 SOCK_PROTO_HANDLER ProtoHandler; ///< The handler of protocol for socket request
448
449 EFI_HANDLE DriverBinding; ///< The driver binding handle
450 } SOCK_INIT_DATA;
451
452 ///
453 /// The union type of TCP and UDP protocol.
454 ///
455 typedef union _NET_PROTOCOL {
456 EFI_TCP4_PROTOCOL Tcp4Protocol; ///< Tcp4 protocol
457 EFI_TCP6_PROTOCOL Tcp6Protocol; ///< Tcp6 protocol
458 } NET_PROTOCOL;
459 ///
460 /// The socket structure representing a network service access point.
461 ///
462 struct _TCP_SOCKET {
463 //
464 // Socket description information
465 //
466 UINT32 Signature; ///< Signature of the socket
467 EFI_HANDLE SockHandle; ///< The virtual handle of the socket
468 EFI_HANDLE DriverBinding; ///< Socket's driver binding protocol
469 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
470 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
471 LIST_ENTRY Link;
472 UINT8 ConfigureState;
473 SOCK_TYPE Type;
474 UINT8 State;
475 UINT16 Flag;
476 EFI_LOCK Lock; ///< The lock of socket
477 SOCK_BUFFER SndBuffer; ///< Send buffer of application's data
478 SOCK_BUFFER RcvBuffer; ///< Receive buffer of received data
479 EFI_STATUS SockError; ///< The error returned by low layer protocol
480 BOOLEAN InDestroy;
481
482 //
483 // Fields used to manage the connection request
484 //
485 UINT32 BackLog; ///< the limit of connection to this socket
486 UINT32 ConnCnt; ///< the current count of connections to it
487 SOCKET *Parent; ///< listening parent that accept the connection
488 LIST_ENTRY ConnectionList; ///< the connections maintained by this socket
489 //
490 // The queue to buffer application's asynchronous token
491 //
492 LIST_ENTRY ListenTokenList;
493 LIST_ENTRY RcvTokenList;
494 LIST_ENTRY SndTokenList;
495 LIST_ENTRY ProcessingSndTokenList;
496
497 SOCK_COMPLETION_TOKEN *ConnectionToken; ///< app's token to signal if connected
498 SOCK_COMPLETION_TOKEN *CloseToken; ///< app's token to signal if closed
499 //
500 // Interface for low level protocol
501 //
502 SOCK_PROTO_HANDLER ProtoHandler; ///< The request handler of protocol
503 UINT8 ProtoReserved[PROTO_RESERVED_LEN]; ///< Data fields reserved for protocol
504 UINT8 IpVersion;
505 NET_PROTOCOL NetProtocol; ///< TCP or UDP protocol socket used
506 //
507 // Callbacks after socket is created and before socket is to be destroyed.
508 //
509 SOCK_CREATE_CALLBACK CreateCallback; ///< Callback after created
510 SOCK_DESTROY_CALLBACK DestroyCallback; ///< Callback before destroied
511 VOID *Context; ///< The context of the callback
512 };
513
514 ///
515 /// The token structure buffered in socket layer.
516 ///
517 typedef struct _SOCK_TOKEN {
518 LIST_ENTRY TokenList; ///< The entry to add in the token list
519 SOCK_COMPLETION_TOKEN *Token; ///< The application's token
520 UINT32 RemainDataLen; ///< Unprocessed data length
521 SOCKET *Sock; ///< The poninter to the socket this token
522 ///< belongs to
523 } SOCK_TOKEN;
524
525 ///
526 /// Reserved data to access the NET_BUF delivered by TCP driver.
527 ///
528 typedef struct _TCP_RSV_DATA {
529 UINT32 UrgLen;
530 } TCP_RSV_DATA;
531
532 //
533 // Socket provided oprerations for low layer protocol implemented in SockImpl.c
534 //
535
536 /**
537 Set the state of the socket.
538
539 @param[in, out] Sock Pointer to the socket.
540 @param[in] State The new socket state to be set.
541
542 **/
543 VOID
544 SockSetState (
545 IN OUT SOCKET *Sock,
546 IN UINT8 State
547 );
548
549 /**
550 Clone a new socket including its associated protocol control block.
551
552 @param[in] Sock Pointer to the socket to be cloned.
553
554 @return Pointer to the newly cloned socket. If NULL, an error condition occurred.
555
556 **/
557 SOCKET *
558 SockClone (
559 IN SOCKET *Sock
560 );
561
562 /**
563 Called by the low layer protocol to indicate the socket a connection is
564 established.
565
566 This function just changes the socket's state to SO_CONNECTED
567 and signals the token used for connection establishment.
568
569 @param[in, out] Sock Pointer to the socket associated with the
570 established connection.
571
572 **/
573 VOID
574 SockConnEstablished (
575 IN OUT SOCKET *Sock
576 );
577
578 /**
579 Called by the low layer protocol to indicate that the connection is closed.
580
581 This function flushes the socket, sets the state to SO_CLOSED, and signals
582 the close token.
583
584 @param[in, out] Sock Pointer to the socket associated with the closed
585 connection.
586
587 **/
588 VOID
589 SockConnClosed (
590 IN OUT SOCKET *Sock
591 );
592
593 /**
594 Called by low layer protocol to indicate that some data is sent or processed.
595
596 This function trims the sent data in the socket send buffer and signals the data
597 token, if proper.
598
599 @param[in, out] Sock Pointer to the socket.
600 @param[in] Count The length of the data processed or sent, in bytes.
601
602 **/
603 VOID
604 SockDataSent (
605 IN OUT SOCKET *Sock,
606 IN UINT32 Count
607 );
608
609 /**
610 Called by the low layer protocol to copy some data in socket send
611 buffer starting from the specific offset to a buffer provided by
612 the caller.
613
614 @param[in] Sock Pointer to the socket.
615 @param[in] Offset The start point of the data to be copied.
616 @param[in] Len The length of the data to be copied.
617 @param[out] Dest Pointer to the destination to copy the data.
618
619 @return The data size copied.
620
621 **/
622 UINT32
623 SockGetDataToSend (
624 IN SOCKET *Sock,
625 IN UINT32 Offset,
626 IN UINT32 Len,
627 OUT UINT8 *Dest
628 );
629
630 /**
631 Called by the low layer protocol to deliver received data to socket layer.
632
633 This function appends the data to the socket receive buffer, set the
634 urgent data length, then checks if any receive token can be signaled.
635
636 @param[in, out] Sock Pointer to the socket.
637 @param[in, out] NetBuffer Pointer to the buffer that contains the received data.
638 @param[in] UrgLen The length of the urgent data in the received data.
639
640 **/
641 VOID
642 SockDataRcvd (
643 IN OUT SOCKET *Sock,
644 IN OUT NET_BUF *NetBuffer,
645 IN UINT32 UrgLen
646 );
647
648 /**
649 Get the length of the free space of the specific socket buffer.
650
651 @param[in] Sock Pointer to the socket.
652 @param[in] Which Flag to indicate which socket buffer to check:
653 either send buffer or receive buffer.
654
655 @return The length of the free space, in bytes.
656
657 **/
658 UINT32
659 SockGetFreeSpace (
660 IN SOCKET *Sock,
661 IN UINT32 Which
662 );
663
664 /**
665 Called by the low layer protocol to indicate that there will be no more data
666 from the communication peer.
667
668 This function sets the socket's state to SO_NO_MORE_DATA and signals all queued
669 IO tokens with the error status EFI_CONNECTION_FIN.
670
671 @param[in, out] Sock Pointer to the socket.
672
673 **/
674 VOID
675 SockNoMoreData (
676 IN OUT SOCKET *Sock
677 );
678
679 //
680 // Socket provided operations for user interface implemented in SockInterface.c
681 //
682
683 /**
684 Create a socket and its associated protocol control block
685 with the intial data SockInitData and protocol specific
686 data ProtoData.
687
688 @param[in] SockInitData Inital data to setting the socket.
689
690 @return Pointer to the newly created socket. If NULL, an error condition occured.
691
692 **/
693 SOCKET *
694 SockCreateChild (
695 IN SOCK_INIT_DATA *SockInitData
696 );
697
698 /**
699 Destroy the socket Sock and its associated protocol control block.
700
701 @param[in, out] Sock The socket to be destroyed.
702
703 @retval EFI_SUCCESS The socket Sock was destroyed successfully.
704 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket.
705
706 **/
707 EFI_STATUS
708 SockDestroyChild (
709 IN OUT SOCKET *Sock
710 );
711
712 /**
713 Configure the specific socket Sock using configuration data ConfigData.
714
715 @param[in] Sock Pointer to the socket to be configured.
716 @param[in] ConfigData Pointer to the configuration data.
717
718 @retval EFI_SUCCESS The socket configured successfully.
719 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
720 socket is already configured.
721
722 **/
723 EFI_STATUS
724 SockConfigure (
725 IN SOCKET *Sock,
726 IN VOID *ConfigData
727 );
728
729 /**
730 Initiate a connection establishment process.
731
732 @param[in] Sock Pointer to the socket to initiate the initate the
733 connection.
734 @param[in] Token Pointer to the token used for the connection
735 operation.
736
737 @retval EFI_SUCCESS The connection initialized successfully.
738 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
739 socket is closed, or the socket is not configured to
740 be an active one, or the token is already in one of
741 this socket's lists.
742 @retval EFI_NO_MAPPING The IP address configuration operation is not
743 finished.
744 @retval EFI_NOT_STARTED The socket is not configured.
745
746 **/
747 EFI_STATUS
748 SockConnect (
749 IN SOCKET *Sock,
750 IN VOID *Token
751 );
752
753 /**
754 Issue a listen token to get an existed connected network instance,
755 or wait for a connection if there is none.
756
757 @param[in] Sock Pointer to the socket to accept connections.
758 @param[in] Token The token to accept a connection.
759
760 @retval EFI_SUCCESS Either a connection is accepted or the Token is
761 buffered for further acceptance.
762 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
763 socket is closed, or the socket is not configured to
764 be a passive one, or the token is already in one of
765 this socket's lists.
766 @retval EFI_NO_MAPPING The IP address configuration operation is not
767 finished.
768 @retval EFI_NOT_STARTED The socket is not configured.
769 @retval EFI_OUT_OF_RESOURCE Failed to buffer the Token due to memory limit.
770
771 **/
772 EFI_STATUS
773 SockAccept (
774 IN SOCKET *Sock,
775 IN VOID *Token
776 );
777
778 /**
779 Issue a token with data to the socket to send out.
780
781 @param[in] Sock Pointer to the socket to process the token with
782 data.
783 @param[in] Token The token with data that needs to send out.
784
785 @retval EFI_SUCCESS The token processed successfully.
786 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
787 socket is closed, or the socket is not in a
788 synchronized state , or the token is already in one
789 of this socket's lists.
790 @retval EFI_NO_MAPPING The IP address configuration operation is not
791 finished.
792 @retval EFI_NOT_STARTED The socket is not configured.
793 @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to a memory limit.
794
795 **/
796 EFI_STATUS
797 SockSend (
798 IN SOCKET *Sock,
799 IN VOID *Token
800 );
801
802 /**
803 Issue a token to get data from the socket.
804
805 @param[in] Sock Pointer to the socket to get data from.
806 @param[in] Token The token to store the received data from the
807 socket.
808
809 @retval EFI_SUCCESS The token processed successfully.
810 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
811 socket is closed, or the socket is not in a
812 synchronized state , or the token is already in one
813 of this socket's lists.
814 @retval EFI_NO_MAPPING The IP address configuration operation is not
815 finished.
816 @retval EFI_NOT_STARTED The socket is not configured.
817 @retval EFI_CONNECTION_FIN The connection is closed and there is no more data.
818 @retval EFI_OUT_OF_RESOURCE Failed to buffer the token due to a memory limit.
819
820 **/
821 EFI_STATUS
822 SockRcv (
823 IN SOCKET *Sock,
824 IN VOID *Token
825 );
826
827 /**
828 Reset the socket and its associated protocol control block.
829
830 @param[in, out] Sock Pointer to the socket to be flushed.
831
832 @retval EFI_SUCCESS The socket flushed successfully.
833 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket.
834
835 **/
836 EFI_STATUS
837 SockFlush (
838 IN OUT SOCKET *Sock
839 );
840
841 /**
842 Close or abort the socket associated connection.
843
844 @param[in, out] Sock Pointer to the socket of the connection to close
845 or abort.
846 @param[in] Token The token for close operation.
847 @param[in] OnAbort TRUE for aborting the connection, FALSE to close it.
848
849 @retval EFI_SUCCESS The close or abort operation initialized
850 successfully.
851 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket, or the
852 socket is closed, or the socket is not in a
853 synchronized state , or the token is already in one
854 of this socket's lists.
855 @retval EFI_NO_MAPPING The IP address configuration operation is not
856 finished.
857 @retval EFI_NOT_STARTED The socket is not configured.
858
859 **/
860 EFI_STATUS
861 SockClose (
862 IN OUT SOCKET *Sock,
863 IN VOID *Token,
864 IN BOOLEAN OnAbort
865 );
866
867 /**
868 Get the mode data of the low layer protocol.
869
870 @param[in] Sock Pointer to the socket to get mode data from.
871 @param[in, out] Mode Pointer to the data to store the low layer mode
872 information.
873
874 @retval EFI_SUCCESS The mode data was obtained successfully.
875 @retval EFI_NOT_STARTED The socket is not configured.
876
877 **/
878 EFI_STATUS
879 SockGetMode (
880 IN SOCKET *Sock,
881 IN OUT VOID *Mode
882 );
883
884 /**
885 Configure the low level protocol to join a multicast group for
886 this socket's connection.
887
888 @param[in] Sock Pointer to the socket of the connection to join the
889 specific multicast group.
890 @param[in] GroupInfo Pointer to the multicast group information.
891
892 @retval EFI_SUCCESS The configuration completed successfully.
893 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket.
894 @retval EFI_NOT_STARTED The socket is not configured.
895
896 **/
897 EFI_STATUS
898 SockGroup (
899 IN SOCKET *Sock,
900 IN VOID *GroupInfo
901 );
902
903 /**
904 Add or remove route information in IP route table associated
905 with this socket.
906
907 @param[in] Sock Pointer to the socket associated with the IP route
908 table to operate on.
909 @param[in] RouteInfo Pointer to the route information to be processed.
910
911 @retval EFI_SUCCESS The route table updated successfully.
912 @retval EFI_ACCESS_DENIED Failed to get the lock to access the socket.
913 @retval EFI_NO_MAPPING The IP address configuration operation is not
914 finished.
915 @retval EFI_NOT_STARTED The socket is not configured.
916
917 **/
918 EFI_STATUS
919 SockRoute (
920 IN SOCKET *Sock,
921 IN VOID *RouteInfo
922 );
923
924 #endif