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 925