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