Signed-off-by: lpleahy git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13802 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			651 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			651 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Definitions for the EFI Socket protocol.
 | |
| 
 | |
|   Copyright (c) 2011, 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.php
 | |
| 
 | |
|   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_H_
 | |
| #define _EFI_SOCKET_H_
 | |
| 
 | |
| #include <errno.h>
 | |
| #include <Uefi.h>
 | |
| 
 | |
| #include <netinet/in.h>
 | |
| 
 | |
| #include <sys/poll.h>
 | |
| #include <sys/socket.h>
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| //  Data Types
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| /**
 | |
| EfiSocketLib (SocketDxe) interface 
 | |
| **/
 | |
| typedef struct _EFI_SOCKET_PROTOCOL EFI_SOCKET_PROTOCOL;
 | |
| 
 | |
| /**
 | |
|   Constructor/Destructor
 | |
| 
 | |
|   @retval EFI_SUCCESS       The operation was successful
 | |
| 
 | |
|  **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (* PFN_ESL_xSTRUCTOR) (
 | |
|   VOID
 | |
|   );
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // Data
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| extern PFN_ESL_xSTRUCTOR mpfnEslConstructor;  ///<  Constructor address for EslSocketLib
 | |
| extern PFN_ESL_xSTRUCTOR mpfnEslDestructor;   ///<  Destructor address for EslSocketLib
 | |
| 
 | |
| extern EFI_GUID  gEfiSocketProtocolGuid;      ///<  Socket protocol GUID
 | |
| extern EFI_GUID  gEfiSocketServiceBindingProtocolGuid;  ///<  Socket layer service binding protocol GUID
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| //  Socket API
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| /**
 | |
|   Accept a network connection.
 | |
| 
 | |
|   This routine calls the network specific layer to remove the next
 | |
|   connection from the FIFO.
 | |
| 
 | |
|   The ::accept calls this routine to poll for a network
 | |
|   connection to the socket.  When a connection is available
 | |
|   this routine returns the ::EFI_SOCKET_PROTOCOL structure address
 | |
|   associated with the new socket and the remote network address
 | |
|   if requested.
 | |
| 
 | |
|   @param [in] pSocketProtocol Address of the ::EFI_SOCKET_PROTOCOL structure.
 | |
| 
 | |
|   @param [in] pSockAddr       Address of a buffer to receive the remote
 | |
|                               network address.
 | |
| 
 | |
|   @param [in, out] pSockAddrLength  Length in bytes of the address buffer.
 | |
|                                     On output specifies the length of the
 | |
|                                     remote network address.
 | |
| 
 | |
|   @param [out] ppSocketProtocol Address of a buffer to receive the
 | |
|                                 ::EFI_SOCKET_PROTOCOL instance
 | |
|                                 associated with the new socket.
 | |
| 
 | |
|   @param [out] pErrno   Address to receive the errno value upon completion.
 | |
| 
 | |
|   @retval EFI_SUCCESS   New connection successfully created
 | |
|   @retval EFI_NOT_READY No connection is available
 | |
| 
 | |
|  **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (* PFN_ACCEPT) (
 | |
|   IN EFI_SOCKET_PROTOCOL * pSocketProtocol,
 | |
|   IN struct sockaddr * pSockAddr,
 | |
|   IN OUT socklen_t * pSockAddrLength,
 | |
|   IN EFI_SOCKET_PROTOCOL ** ppSocketProtocol,
 | |
|   IN int * pErrno
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   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 the ::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] SockAddrLen   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
 | |
| 
 | |
|  **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (* PFN_BIND) (
 | |
|   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 the ::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
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (* PFN_CLOSE_POLL) (
 | |
|   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 the ::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
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (* PFN_CLOSE_START) (
 | |
|   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 the ::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.
 | |
| 
 | |
|  **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (* PFN_CONNECT) (
 | |
|   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 the ::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
 | |
| 
 | |
|  **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (* PFN_GET_LOCAL) (
 | |
|   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 the ::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
 | |
| 
 | |
|  **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (* PFN_GET_PEER) (
 | |
|   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 the 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
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (* PFN_LISTEN) (
 | |
|   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 the ::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
 | |
| 
 | |
|  **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (* PFN_OPTION_GET) (
 | |
|   IN EFI_SOCKET_PROTOCOL * pSocketProtocol,
 | |
|   IN int level,
 | |
|   IN int OptionName,
 | |
|   OUT void * __restrict pOptionValue,
 | |
|   IN OUT socklen_t * __restrict pOptionLength,
 | |
|   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 the ::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
 | |
| 
 | |
|  **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (* PFN_OPTION_SET) (
 | |
|   IN EFI_SOCKET_PROTOCOL * pSocketProtocol,
 | |
|   IN int level,
 | |
|   IN int OptionName,
 | |
|   IN CONST void * pOptionValue,
 | |
|   IN socklen_t OptionLength,
 | |
|   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 the ::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
 | |
| 
 | |
|  **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (* PFN_POLL) (
 | |
|   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 the ::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
 | |
| 
 | |
|  **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (* PFN_RECEIVE) (
 | |
|   IN EFI_SOCKET_PROTOCOL * pSocketProtocol,
 | |
|   IN int 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 the ::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
 | |
| 
 | |
|  **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (* PFN_SHUTDOWN) (
 | |
|   IN EFI_SOCKET_PROTOCOL * pSocketProtocol,
 | |
|   IN int How,
 | |
|   IN int * pErrno
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Initialize an endpoint for network communication.
 | |
| 
 | |
|   This routine initializes the communication endpoint.
 | |
| 
 | |
|   The ::socket routine calls this routine indirectly to create
 | |
|   the communication endpoint.
 | |
| 
 | |
|   @param [in] pSocketProtocol Address of the socket protocol structure.
 | |
|   @param [in] domain    Select the family of protocols for the client or server
 | |
|                         application.  See the ::socket documentation for values.
 | |
|   @param [in] type      Specifies how to make the network connection.
 | |
|                         See the ::socket documentation for values.
 | |
|   @param [in] protocol  Specifies the lower layer protocol to use.
 | |
|                         See the ::socket documentation for values.
 | |
|   @param [out] pErrno   Address to receive the errno value upon completion.
 | |
| 
 | |
|   @retval EFI_SUCCESS - Socket successfully created
 | |
|   @retval EFI_INVALID_PARAMETER - Invalid domain value, errno = EAFNOSUPPORT
 | |
|   @retval EFI_INVALID_PARAMETER - Invalid type value, errno = EINVAL
 | |
|   @retval EFI_INVALID_PARAMETER - Invalid protocol value, errno = EINVAL
 | |
| 
 | |
|  **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (*PFN_SOCKET) (
 | |
|   IN EFI_SOCKET_PROTOCOL * pSocketProtocol,
 | |
|   IN int domain,
 | |
|   IN int type,
 | |
|   IN int protocol,
 | |
|   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 the ::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
 | |
| 
 | |
|  **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (* PFN_TRANSMIT) (
 | |
|   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
 | |
|   );
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| //  Socket Protocol
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| /**
 | |
|   Socket protocol declaration
 | |
| **/
 | |
| typedef struct _EFI_SOCKET_PROTOCOL {
 | |
|   EFI_HANDLE SocketHandle;        ///<  Handle for the socket
 | |
|   PFN_ACCEPT pfnAccept;           ///<  Accept a network connection
 | |
|   PFN_BIND pfnBind;               ///<  Bind a local address to the socket
 | |
|   PFN_CLOSE_POLL pfnClosePoll;    ///<  Determine if the socket is closed
 | |
|   PFN_CLOSE_START pfnCloseStart;  ///<  Start the close operation
 | |
|   PFN_CONNECT pfnConnect;         ///<  Connect to a remote system
 | |
|   PFN_GET_LOCAL pfnGetLocal;      ///<  Get local address
 | |
|   PFN_GET_PEER pfnGetPeer;        ///<  Get peer address
 | |
|   PFN_LISTEN pfnListen;           ///<  Enable connection attempts on known port
 | |
|   PFN_OPTION_GET pfnOptionGet;    ///<  Get socket options
 | |
|   PFN_OPTION_SET pfnOptionSet;    ///<  Set socket options
 | |
|   PFN_POLL pfnPoll;               ///<  Poll for socket activity
 | |
|   PFN_RECEIVE pfnReceive;         ///<  Receive data from a socket
 | |
|   PFN_SHUTDOWN pfnShutdown;       ///<  Shutdown receive and transmit operations
 | |
|   PFN_SOCKET pfnSocket;           ///<  Initialize the socket
 | |
|   PFN_TRANSMIT pfnTransmit;       ///<  Transmit data using the socket
 | |
| } GCC_EFI_SOCKET_PROTOCOL;
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| //  Non-blocking routines
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| /**
 | |
|   Non blocking version of ::accept.
 | |
| 
 | |
|   @param [in] s         Socket file descriptor returned from ::socket.
 | |
| 
 | |
|   @param [in] address   Address of a buffer to receive the remote network address.
 | |
| 
 | |
|   @param [in, out] address_len  Address of a buffer containing the Length in bytes
 | |
|                                 of the remote network address buffer.  Upon return,
 | |
|                                 contains the length of the remote network address.
 | |
| 
 | |
|   @return     This routine returns zero if successful and -1 when an error occurs.
 | |
|               In the case of an error, ::errno contains more details.
 | |
| 
 | |
|  **/
 | |
| int
 | |
| AcceptNB (
 | |
|   int s,
 | |
|   struct sockaddr * address,
 | |
|   socklen_t * address_len
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Free the socket resources
 | |
| 
 | |
|   This releases the socket resources allocated by calling
 | |
|   EslServiceGetProtocol.
 | |
| 
 | |
|   This routine is called from the ::close routine in BsdSocketLib
 | |
|   to release the socket resources.
 | |
| 
 | |
|   @param [in] pSocketProtocol   Address of an ::EFI_SOCKET_PROTOCOL
 | |
|                                 structure
 | |
| 
 | |
|   @return       Value for ::errno, zero (0) indicates success.
 | |
| 
 | |
|  **/
 | |
| int
 | |
| EslServiceFreeProtocol (
 | |
|   IN EFI_SOCKET_PROTOCOL * pSocketProtocol
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Connect to the EFI socket library
 | |
| 
 | |
|   @param [in] ppSocketProtocol  Address to receive the socket protocol address
 | |
| 
 | |
|   @return       Value for ::errno, zero (0) indicates success.
 | |
| 
 | |
|  **/
 | |
| int
 | |
| EslServiceGetProtocol (
 | |
|   IN EFI_SOCKET_PROTOCOL ** ppSocketProtocol
 | |
|   );
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| #endif  //  _EFI_SOCKET_H_
 |