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 918