| /** @file | |
| Definitions for the EFI Socket layer library. | |
| Copyright (c) 2011 - 2015, Intel Corporation | |
| All rights reserved. This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #ifndef _EFI_SOCKET_LIB_H_ | |
| #define _EFI_SOCKET_LIB_H_ | |
| #include <Uefi.h> | |
| #include <Library/BaseMemoryLib.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/MemoryAllocationLib.h> | |
| #include <Library/UefiBootServicesTableLib.h> | |
| #include <Library/UefiLib.h> | |
| #include <Protocol/EfiSocket.h> | |
| #include <Protocol/Ip4Config2.h> | |
| #include <Protocol/Ip6Config.h> | |
| #include <Protocol/ServiceBinding.h> | |
| #include <Protocol/Tcp4.h> | |
| #include <Protocol/Tcp6.h> | |
| #include <Protocol/Udp4.h> | |
| #include <Protocol/Udp6.h> | |
| #include <sys/time.h> | |
| //------------------------------------------------------------------------------ | |
| // Constants | |
| //------------------------------------------------------------------------------ | |
| #define DEBUG_TPL 0x40000000 ///< Display TPL change messages | |
| #define TPL_SOCKETS TPL_CALLBACK ///< TPL for routine synchronization | |
| //------------------------------------------------------------------------------ | |
| // Macros | |
| //------------------------------------------------------------------------------ | |
| #if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ | |
| #define DBG_ENTER() DEBUG (( DEBUG_INFO, "Entering " __FUNCTION__ "\n" )) ///< Display routine entry | |
| #define DBG_EXIT() DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ "\n" )) ///< Display routine exit | |
| #define DBG_EXIT_DEC(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: %d\n", Status )) ///< Display routine exit with decimal value | |
| #define DBG_EXIT_HEX(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: 0x%08x\n", Status )) ///< Display routine exit with hex value | |
| #define DBG_EXIT_STATUS(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", Status: %r\n", Status )) ///< Display routine exit with status value | |
| #define DBG_EXIT_TF(Status) DEBUG (( DEBUG_INFO, "Exiting " __FUNCTION__ ", returning %s\n", (FALSE == Status) ? L"FALSE" : L"TRUE" )) ///< Display routine with TRUE/FALSE value | |
| #else // _MSC_VER | |
| #define DBG_ENTER() ///< Display routine entry | |
| #define DBG_EXIT() ///< Display routine exit | |
| #define DBG_EXIT_DEC(Status) ///< Display routine exit with decimal value | |
| #define DBG_EXIT_HEX(Status) ///< Display routine exit with hex value | |
| #define DBG_EXIT_STATUS(Status) ///< Display routine exit with status value | |
| #define DBG_EXIT_TF(Status) ///< Display routine with TRUE/FALSE value | |
| #endif // _MSC_VER | |
| #define DIM(x) ( sizeof ( x ) / sizeof ( x[0] )) ///< Compute the number of entries in an array | |
| /** | |
| Verify new TPL value | |
| This macro which is enabled when debug is enabled verifies that | |
| the new TPL value is >= the current TPL value. | |
| **/ | |
| #ifdef VERIFY_TPL | |
| #undef VERIFY_TPL | |
| #endif // VERIFY_TPL | |
| #if !defined(MDEPKG_NDEBUG) | |
| /** | |
| Verify that the TPL is at the correct level | |
| **/ | |
| #define VERIFY_AT_TPL(tpl) \ | |
| { \ | |
| EFI_TPL PreviousTpl; \ | |
| \ | |
| PreviousTpl = EfiGetCurrentTpl ( ); \ | |
| if ( PreviousTpl != tpl ) { \ | |
| DEBUG (( DEBUG_ERROR | DEBUG_TPL, \ | |
| "Current TPL: %d, New TPL: %d\r\n", \ | |
| PreviousTpl, tpl )); \ | |
| ASSERT ( PreviousTpl == tpl ); \ | |
| } \ | |
| } | |
| #define VERIFY_TPL(tpl) \ | |
| { \ | |
| EFI_TPL PreviousTpl; \ | |
| \ | |
| PreviousTpl = EfiGetCurrentTpl ( ); \ | |
| if ( PreviousTpl > tpl ) { \ | |
| DEBUG (( DEBUG_ERROR | DEBUG_TPL, \ | |
| "Current TPL: %d, New TPL: %d\r\n", \ | |
| PreviousTpl, tpl )); \ | |
| ASSERT ( PreviousTpl <= tpl ); \ | |
| } \ | |
| } | |
| #else // MDEPKG_NDEBUG | |
| #define VERIFY_AT_TPL(tpl) ///< Verify that the TPL is at the correct level | |
| #define VERIFY_TPL(tpl) ///< Verify that the TPL is at the correct level | |
| #endif // MDEPKG_NDEBUG | |
| /** | |
| Raise TPL to the specified level | |
| **/ | |
| #define RAISE_TPL(PreviousTpl, tpl) \ | |
| VERIFY_TPL ( tpl ); \ | |
| PreviousTpl = gBS->RaiseTPL ( tpl ); | |
| /** | |
| Restore the TPL to the previous value | |
| **/ | |
| #define RESTORE_TPL(tpl) \ | |
| gBS->RestoreTPL ( tpl ) | |
| //------------------------------------------------------------------------------ | |
| // Data Types | |
| //------------------------------------------------------------------------------ | |
| typedef struct _ESL_SERVICE ESL_SERVICE; ///< Forward delcaration | |
| /** | |
| Protocol binding and installation control structure | |
| The driver uses this structure to simplify the driver binding processing. | |
| **/ | |
| typedef struct { | |
| CHAR16 * pName; ///< Protocol name | |
| EFI_GUID * pNetworkBinding; ///< Network service binding protocol for socket support | |
| EFI_GUID * pNetworkProtocolGuid;///< Network protocol GUID | |
| CONST EFI_GUID * pTagGuid; ///< Tag to mark protocol in use | |
| UINTN ServiceListOffset; ///< Offset in ::ESL_LAYER for the list of services | |
| UINTN RxIo; ///< Number of receive ESL_IO_MGMT structures for data | |
| UINTN TxIoNormal; ///< Number of transmit ESL_IO_MGMT structures for normal data | |
| UINTN TxIoUrgent; ///< Number of transmit ESL_IO_MGMT structures for urgent data | |
| } ESL_SOCKET_BINDING; | |
| //------------------------------------------------------------------------------ | |
| // GUIDs | |
| //------------------------------------------------------------------------------ | |
| extern CONST EFI_GUID mEslIp4ServiceGuid; ///< Tag GUID for the IPv4 layer | |
| extern CONST EFI_GUID mEslIp6ServiceGuid; ///< Tag GUID for the IPv6 layer | |
| extern CONST EFI_GUID mEslTcp4ServiceGuid; ///< Tag GUID for the TCPv4 layer | |
| extern CONST EFI_GUID mEslTcp6ServiceGuid; ///< Tag GUID for the TCPv6 layer | |
| extern CONST EFI_GUID mEslUdp4ServiceGuid; ///< Tag GUID for the UDPv4 layer | |
| extern CONST EFI_GUID mEslUdp6ServiceGuid; ///< Tag GUID for the UDPv6 layer | |
| //------------------------------------------------------------------------------ | |
| // Data | |
| //------------------------------------------------------------------------------ | |
| extern CONST ESL_SOCKET_BINDING cEslSocketBinding[];///< List of network service bindings | |
| extern CONST UINTN cEslSocketBindingEntries; ///< Number of network service bindings | |
| //------------------------------------------------------------------------------ | |
| // DXE Support Routines | |
| //------------------------------------------------------------------------------ | |
| /** | |
| Creates a child handle and installs a protocol. | |
| When the socket application is linked against UseSocketDxe, the ::socket | |
| routine indirectly calls this routine in SocketDxe to create a child | |
| handle if necessary and install the socket protocol on the handle. | |
| Upon return, EslServiceGetProtocol in UseSocketLib returns the | |
| ::EFI_SOCKET_PROTOCOL address to the socket routine. | |
| @param [in] pThis Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance. | |
| @param [in] pChildHandle Pointer to the handle of the child to create. If it is NULL, | |
| then a new handle is created. If it is a pointer to an existing UEFI handle, | |
| then the protocol is added to the existing UEFI handle. | |
| @retval EFI_SUCCESS The protocol was added to ChildHandle. | |
| @retval EFI_INVALID_PARAMETER ChildHandle is NULL. | |
| @retval EFI_OUT_OF_RESOURCES There are not enough resources availabe to create | |
| the child | |
| @retval other The child handle was not created | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| EslDxeCreateChild ( | |
| IN EFI_SERVICE_BINDING_PROTOCOL * pThis, | |
| IN OUT EFI_HANDLE * pChildHandle | |
| ); | |
| /** | |
| Destroys a child handle with a protocol installed on it. | |
| When the socket application is linked against UseSocketDxe, the ::close | |
| routine indirectly calls this routine in SocketDxe to undo the operations | |
| done by the ::EslDxeCreateChild routine. This routine removes the socket | |
| protocol from the handle and then destroys the child handle if there are | |
| no other protocols attached. | |
| @param [in] pThis Pointer to the EFI_SERVICE_BINDING_PROTOCOL instance. | |
| @param [in] ChildHandle Handle of the child to destroy | |
| @retval EFI_SUCCESS The protocol was removed from ChildHandle. | |
| @retval EFI_UNSUPPORTED ChildHandle does not support the protocol that is being removed. | |
| @retval EFI_INVALID_PARAMETER Child handle is not a valid UEFI Handle. | |
| @retval EFI_ACCESS_DENIED The protocol could not be removed from the ChildHandle | |
| because its services are being used. | |
| @retval other The child handle was not destroyed | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| EslDxeDestroyChild ( | |
| IN EFI_SERVICE_BINDING_PROTOCOL * pThis, | |
| IN EFI_HANDLE ChildHandle | |
| ); | |
| /** | |
| Install the socket service | |
| SocketDxe uses this routine to announce the socket interface to | |
| the rest of EFI. | |
| @param [in] pImageHandle Address of the image handle | |
| @retval EFI_SUCCESS Service installed successfully | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| EslDxeInstall ( | |
| IN EFI_HANDLE * pImageHandle | |
| ); | |
| /** | |
| Uninstall the socket service | |
| SocketDxe uses this routine to notify EFI that the socket layer | |
| is no longer available. | |
| @param [in] ImageHandle Handle for the image. | |
| @retval EFI_SUCCESS Service installed successfully | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| EslDxeUninstall ( | |
| IN EFI_HANDLE ImageHandle | |
| ); | |
| //------------------------------------------------------------------------------ | |
| // Service Support Routines | |
| //------------------------------------------------------------------------------ | |
| /** | |
| Connect to the network service bindings | |
| Walk the network service protocols on the controller handle and | |
| locate any that are not in use. Create ::ESL_SERVICE structures to | |
| manage the network layer interfaces for the socket driver. Tag | |
| each of the network interfaces that are being used. Finally, this | |
| routine calls ESL_SOCKET_BINDING::pfnInitialize to prepare the network | |
| interface for use by the socket layer. | |
| @param [in] BindingHandle Handle for protocol binding. | |
| @param [in] Controller Handle of device to work with. | |
| @retval EFI_SUCCESS This driver is added to Controller. | |
| @retval other This driver does not support this device. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| EslServiceConnect ( | |
| IN EFI_HANDLE BindingHandle, | |
| IN EFI_HANDLE Controller | |
| ); | |
| /** | |
| Shutdown the connections to the network layer by locating the | |
| tags on the network interfaces established by ::EslServiceConnect. | |
| This routine calls ESL_SOCKET_BINDING::pfnShutdown to shutdown the any | |
| activity on the network interface and then free the ::ESL_SERVICE | |
| structures. | |
| @param [in] BindingHandle Handle for protocol binding. | |
| @param [in] Controller Handle of device to stop driver on. | |
| @retval EFI_SUCCESS This driver is removed Controller. | |
| @retval EFI_DEVICE_ERROR The device could not be stopped due to a device error. | |
| @retval other This driver was not removed from this device. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| EslServiceDisconnect ( | |
| IN EFI_HANDLE BindingHandle, | |
| IN EFI_HANDLE Controller | |
| ); | |
| /** | |
| Initialize the service layer | |
| @param [in] ImageHandle Handle for the image. | |
| **/ | |
| VOID | |
| EFIAPI | |
| EslServiceLoad ( | |
| IN EFI_HANDLE ImageHandle | |
| ); | |
| /** | |
| Shutdown the service layer | |
| **/ | |
| VOID | |
| EFIAPI | |
| EslServiceUnload ( | |
| VOID | |
| ); | |
| //------------------------------------------------------------------------------ | |
| // Socket Protocol Routines | |
| //------------------------------------------------------------------------------ | |
| /** | |
| Bind a name to a socket. | |
| This routine calls the network specific layer to save the network | |
| address of the local connection point. | |
| The ::bind routine calls this routine to connect a name | |
| (network address and port) to a socket on the local machine. | |
| @param [in] pSocketProtocol Address of an ::EFI_SOCKET_PROTOCOL structure. | |
| @param [in] pSockAddr Address of a sockaddr structure that contains the | |
| connection point on the local machine. An IPv4 address | |
| of INADDR_ANY specifies that the connection is made to | |
| all of the network stacks on the platform. Specifying a | |
| specific IPv4 address restricts the connection to the | |
| network stack supporting that address. Specifying zero | |
| for the port causes the network layer to assign a port | |
| number from the dynamic range. Specifying a specific | |
| port number causes the network layer to use that port. | |
| @param [in] SockAddrLength Specifies the length in bytes of the sockaddr structure. | |
| @param [out] pErrno Address to receive the errno value upon completion. | |
| @retval EFI_SUCCESS - Socket successfully created | |
| **/ | |
| EFI_STATUS | |
| EslSocketBind ( | |
| IN EFI_SOCKET_PROTOCOL * pSocketProtocol, | |
| IN CONST struct sockaddr * pSockAddr, | |
| IN socklen_t SockAddrLength, | |
| OUT int * pErrno | |
| ); | |
| /** | |
| Determine if the socket is closed | |
| This routine checks the state of the socket to determine if | |
| the network specific layer has completed the close operation. | |
| The ::close routine polls this routine to determine when the | |
| close operation is complete. The close operation needs to | |
| reverse the operations of the ::EslSocketAllocate routine. | |
| @param [in] pSocketProtocol Address of an ::EFI_SOCKET_PROTOCOL structure. | |
| @param [out] pErrno Address to receive the errno value upon completion. | |
| @retval EFI_SUCCESS Socket successfully closed | |
| @retval EFI_NOT_READY Close still in progress | |
| @retval EFI_ALREADY Close operation already in progress | |
| @retval Other Failed to close the socket | |
| **/ | |
| EFI_STATUS | |
| EslSocketClosePoll ( | |
| IN EFI_SOCKET_PROTOCOL * pSocketProtocol, | |
| IN int * pErrno | |
| ); | |
| /** | |
| Start the close operation on the socket | |
| This routine calls the network specific layer to initiate the | |
| close state machine. This routine then calls the network | |
| specific layer to determine if the close state machine has gone | |
| to completion. The result from this poll is returned to the | |
| caller. | |
| The ::close routine calls this routine to start the close | |
| operation which reverses the operations of the | |
| ::EslSocketAllocate routine. The close routine then polls | |
| the ::EslSocketClosePoll routine to determine when the | |
| socket is closed. | |
| @param [in] pSocketProtocol Address of an ::EFI_SOCKET_PROTOCOL structure. | |
| @param [in] bCloseNow Boolean to control close behavior | |
| @param [out] pErrno Address to receive the errno value upon completion. | |
| @retval EFI_SUCCESS Socket successfully closed | |
| @retval EFI_NOT_READY Close still in progress | |
| @retval EFI_ALREADY Close operation already in progress | |
| @retval Other Failed to close the socket | |
| **/ | |
| EFI_STATUS | |
| EslSocketCloseStart ( | |
| IN EFI_SOCKET_PROTOCOL * pSocketProtocol, | |
| IN BOOLEAN bCloseNow, | |
| IN int * pErrno | |
| ); | |
| /** | |
| Connect to a remote system via the network. | |
| This routine calls the network specific layer to establish | |
| the remote system address and establish the connection to | |
| the remote system. | |
| The ::connect routine calls this routine to establish a | |
| connection with the specified remote system. This routine | |
| is designed to be polled by the connect routine for completion | |
| of the network connection. | |
| @param [in] pSocketProtocol Address of an ::EFI_SOCKET_PROTOCOL structure. | |
| @param [in] pSockAddr Network address of the remote system. | |
| @param [in] SockAddrLength Length in bytes of the network address. | |
| @param [out] pErrno Address to receive the errno value upon completion. | |
| @retval EFI_SUCCESS The connection was successfully established. | |
| @retval EFI_NOT_READY The connection is in progress, call this routine again. | |
| @retval Others The connection attempt failed. | |
| **/ | |
| EFI_STATUS | |
| EslSocketConnect ( | |
| IN EFI_SOCKET_PROTOCOL * pSocketProtocol, | |
| IN const struct sockaddr * pSockAddr, | |
| IN socklen_t SockAddrLength, | |
| IN int * pErrno | |
| ); | |
| /** | |
| Get the local address. | |
| This routine calls the network specific layer to get the network | |
| address of the local host connection point. | |
| The ::getsockname routine calls this routine to obtain the network | |
| address associated with the local host connection point. | |
| @param [in] pSocketProtocol Address of an ::EFI_SOCKET_PROTOCOL structure. | |
| @param [out] pAddress Network address to receive the local system address | |
| @param [in,out] pAddressLength Length of the local network address structure | |
| @param [out] pErrno Address to receive the errno value upon completion. | |
| @retval EFI_SUCCESS - Local address successfully returned | |
| **/ | |
| EFI_STATUS | |
| EslSocketGetLocalAddress ( | |
| IN EFI_SOCKET_PROTOCOL * pSocketProtocol, | |
| OUT struct sockaddr * pAddress, | |
| IN OUT socklen_t * pAddressLength, | |
| IN int * pErrno | |
| ); | |
| /** | |
| Get the peer address. | |
| This routine calls the network specific layer to get the remote | |
| system connection point. | |
| The ::getpeername routine calls this routine to obtain the network | |
| address of the remote connection point. | |
| @param [in] pSocketProtocol Address of an ::EFI_SOCKET_PROTOCOL structure. | |
| @param [out] pAddress Network address to receive the remote system address | |
| @param [in,out] pAddressLength Length of the remote network address structure | |
| @param [out] pErrno Address to receive the errno value upon completion. | |
| @retval EFI_SUCCESS - Remote address successfully returned | |
| **/ | |
| EFI_STATUS | |
| EslSocketGetPeerAddress ( | |
| IN EFI_SOCKET_PROTOCOL * pSocketProtocol, | |
| OUT struct sockaddr * pAddress, | |
| IN OUT socklen_t * pAddressLength, | |
| IN int * pErrno | |
| ); | |
| /** | |
| Establish the known port to listen for network connections. | |
| This routine calls into the network protocol layer to establish | |
| a handler that is called upon connection completion. The handler | |
| is responsible for inserting the connection into the FIFO. | |
| The ::listen routine indirectly calls this routine to place the | |
| socket into a state that enables connection attempts. Connections | |
| are placed in a FIFO that is serviced by the application. The | |
| application calls the ::accept (::EslSocketAccept) routine to | |
| remove the next connection from the FIFO and get the associated | |
| socket and address. | |
| @param [in] pSocketProtocol Address of an ::EFI_SOCKET_PROTOCOL structure. | |
| @param [in] Backlog Backlog specifies the maximum FIFO depth for | |
| the connections waiting for the application | |
| to call accept. Connection attempts received | |
| while the queue is full are refused. | |
| @param [out] pErrno Address to receive the errno value upon completion. | |
| @retval EFI_SUCCESS - Socket successfully created | |
| @retval Other - Failed to enable the socket for listen | |
| **/ | |
| EFI_STATUS | |
| EslSocketListen ( | |
| IN EFI_SOCKET_PROTOCOL * pSocketProtocol, | |
| IN INT32 Backlog, | |
| OUT int * pErrno | |
| ); | |
| /** | |
| Get the socket options | |
| This routine handles the socket level options and passes the | |
| others to the network specific layer. | |
| The ::getsockopt routine calls this routine to retrieve the | |
| socket options one at a time by name. | |
| @param [in] pSocketProtocol Address of an ::EFI_SOCKET_PROTOCOL structure. | |
| @param [in] level Option protocol level | |
| @param [in] OptionName Name of the option | |
| @param [out] pOptionValue Buffer to receive the option value | |
| @param [in,out] pOptionLength Length of the buffer in bytes, | |
| upon return length of the option value in bytes | |
| @param [out] pErrno Address to receive the errno value upon completion. | |
| @retval EFI_SUCCESS - Socket data successfully received | |
| **/ | |
| EFI_STATUS | |
| EslSocketOptionGet ( | |
| IN EFI_SOCKET_PROTOCOL * pSocketProtocol, | |
| IN int level, | |
| IN int option_name, | |
| OUT void * __restrict option_value, | |
| IN OUT socklen_t * __restrict option_len, | |
| IN int * pErrno | |
| ); | |
| /** | |
| Set the socket options | |
| This routine handles the socket level options and passes the | |
| others to the network specific layer. | |
| The ::setsockopt routine calls this routine to adjust the socket | |
| options one at a time by name. | |
| @param [in] pSocketProtocol Address of an ::EFI_SOCKET_PROTOCOL structure. | |
| @param [in] level Option protocol level | |
| @param [in] OptionName Name of the option | |
| @param [in] pOptionValue Buffer containing the option value | |
| @param [in] OptionLength Length of the buffer in bytes | |
| @param [out] pErrno Address to receive the errno value upon completion. | |
| @retval EFI_SUCCESS - Option successfully set | |
| **/ | |
| EFI_STATUS | |
| EslSocketOptionSet ( | |
| IN EFI_SOCKET_PROTOCOL * pSocketProtocol, | |
| IN int level, | |
| IN int option_name, | |
| IN CONST void * option_value, | |
| IN socklen_t option_len, | |
| IN int * pErrno | |
| ); | |
| /** | |
| Poll a socket for pending activity. | |
| This routine builds a detected event mask which is returned to | |
| the caller in the buffer provided. | |
| The ::poll routine calls this routine to determine if the socket | |
| needs to be serviced as a result of connection, error, receive or | |
| transmit activity. | |
| @param [in] pSocketProtocol Address of an ::EFI_SOCKET_PROTOCOL structure. | |
| @param [in] Events Events of interest for this socket | |
| @param [in] pEvents Address to receive the detected events | |
| @param [out] pErrno Address to receive the errno value upon completion. | |
| @retval EFI_SUCCESS - Socket successfully polled | |
| @retval EFI_INVALID_PARAMETER - When pEvents is NULL | |
| **/ | |
| EFI_STATUS | |
| EslSocketPoll ( | |
| IN EFI_SOCKET_PROTOCOL * pSocketProtocol, | |
| IN short Events, | |
| IN short * pEvents, | |
| IN int * pErrno | |
| ); | |
| /** | |
| Receive data from a network connection. | |
| This routine calls the network specific routine to remove the | |
| next portion of data from the receive queue and return it to the | |
| caller. | |
| The ::recvfrom routine calls this routine to determine if any data | |
| is received from the remote system. Note that the other routines | |
| ::recv and ::read are layered on top of ::recvfrom. | |
| @param [in] pSocketProtocol Address of an ::EFI_SOCKET_PROTOCOL structure. | |
| @param [in] Flags Message control flags | |
| @param [in] BufferLength Length of the the buffer | |
| @param [in] pBuffer Address of a buffer to receive the data. | |
| @param [in] pDataLength Number of received data bytes in the buffer. | |
| @param [out] pAddress Network address to receive the remote system address | |
| @param [in,out] pAddressLength Length of the remote network address structure | |
| @param [out] pErrno Address to receive the errno value upon completion. | |
| @retval EFI_SUCCESS - Socket data successfully received | |
| **/ | |
| EFI_STATUS | |
| EslSocketReceive ( | |
| IN EFI_SOCKET_PROTOCOL * pSocketProtocol, | |
| IN INT32 Flags, | |
| IN size_t BufferLength, | |
| IN UINT8 * pBuffer, | |
| OUT size_t * pDataLength, | |
| OUT struct sockaddr * pAddress, | |
| IN OUT socklen_t * pAddressLength, | |
| IN int * pErrno | |
| ); | |
| /** | |
| Shutdown the socket receive and transmit operations | |
| This routine sets a flag to stop future transmissions and calls | |
| the network specific layer to cancel the pending receive operation. | |
| The ::shutdown routine calls this routine to stop receive and transmit | |
| operations on the socket. | |
| @param [in] pSocketProtocol Address of an ::EFI_SOCKET_PROTOCOL structure. | |
| @param [in] How Which operations to stop | |
| @param [out] pErrno Address to receive the errno value upon completion. | |
| @retval EFI_SUCCESS - Socket operations successfully shutdown | |
| **/ | |
| EFI_STATUS | |
| EslSocketShutdown ( | |
| IN EFI_SOCKET_PROTOCOL * pSocketProtocol, | |
| IN int How, | |
| IN int * pErrno | |
| ); | |
| /** | |
| Send data using a network connection. | |
| This routine calls the network specific layer to queue the data | |
| for transmission. Eventually the buffer will reach the head of | |
| the queue and will get transmitted over the network. For datagram | |
| sockets there is no guarantee that the data reaches the application | |
| running on the remote system. | |
| The ::sendto routine calls this routine to send data to the remote | |
| system. Note that ::send and ::write are layered on top of ::sendto. | |
| @param [in] pSocketProtocol Address of an ::EFI_SOCKET_PROTOCOL structure. | |
| @param [in] Flags Message control flags | |
| @param [in] BufferLength Length of the the buffer | |
| @param [in] pBuffer Address of a buffer containing the data to send | |
| @param [in] pDataLength Address to receive the number of data bytes sent | |
| @param [in] pAddress Network address of the remote system address | |
| @param [in] AddressLength Length of the remote network address structure | |
| @param [out] pErrno Address to receive the errno value upon completion. | |
| @retval EFI_SUCCESS - Socket data successfully queued for transmit | |
| **/ | |
| EFI_STATUS | |
| EslSocketTransmit ( | |
| IN EFI_SOCKET_PROTOCOL * pSocketProtocol, | |
| IN int Flags, | |
| IN size_t BufferLength, | |
| IN CONST UINT8 * pBuffer, | |
| OUT size_t * pDataLength, | |
| IN const struct sockaddr * pAddress, | |
| IN socklen_t AddressLength, | |
| IN int * pErrno | |
| ); | |
| //------------------------------------------------------------------------------ | |
| #endif // _EFI_SOCKET_LIB_H_ |