vmkdrivers/BLD/build/HEADERS/vmkapi-current-all-public-bincomp/vmkernel64/release/sockets/vmkapi_socket.h
2015-10-23 18:26:03 -04:00

594 lines
22 KiB
C

/***************************************************************************
* Copyright 2007 - 2012 VMware, Inc. All rights reserved.
***************************************************************************/
/*
* @VMKAPIMOD_LICENSE@
*/
/*
***********************************************************************
* Sockets */ /**
* \defgroup Socket Network Socket Interfaces
* @{
*
***********************************************************************
*/
#ifndef _VMKAPI_SOCKET_H_
#define _VMKAPI_SOCKET_H_
/** \cond never */
#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H
#error This vmkapi file should never be included directly but only via vmkapi.h
#endif
/** \endcond never */
/**
* \brief Opaque socket handle.
*/
typedef struct vmk_SocketInt *vmk_Socket;
/**
* \brief Definition for an invalid vmk_Socket.
*/
#define VMK_SOCKET_INVALID ((vmk_Socket)NULL)
/*
* Address families
*/
/** \brief IPv4 */
#define VMK_SOCKET_AF_INET 2
/** \brief IPv6 */
#define VMK_SOCKET_AF_INET6 28
/*
* Socket types
*/
/** \brief Streaming */
#define VMK_SOCKET_SOCK_STREAM 1
/** \brief Datagrams */
#define VMK_SOCKET_SOCK_DGRAM 2
/** \brief Raw datagrams */
#define VMK_SOCKET_SOCK_RAW 3
/*
* Flags for vmk_SocketSendTo() and vmk_SocketRecvFrom()
*/
/** \brief Send/receive of this message should not block */
#define VMK_SOCKET_MSG_DONTWAIT 0x80
/*
* Socket option levels
*/
/** \brief Operate on the socket itself */
#define VMK_SOCKET_SOL_SOCKET 0xffff
/*
* Socket-level socket options
*/
/** \brief Allow local address reuse */
#define VMK_SOCKET_SO_REUSEADDR 0x0004
/** \brief Keep connections alive */
#define VMK_SOCKET_SO_KEEPALIVE 0x0008
/** \brief Just use interface addresses */
#define VMK_SOCKET_SO_DONTROUTE 0x0010
/** \brief Linger on close if data present */
#define VMK_SOCKET_SO_LINGER 0x0080
/** \brief Allow local address and port reuse */
#define VMK_SOCKET_SO_REUSEPORT 0x0200
/** \brief Timestamp received dgram traffic */
#define VMK_SOCKET_SO_TIMESTAMP 0x0400
/** \brief Use non-blocking socket semantics */
#define VMK_SOCKET_SO_NONBLOCKING 0x1015
/** \brief Bind socket to a vmknic
* \note Note that the TCP/IP stack will only transmit the packet if the routing
* decision indicates that it can be sent out of the specified vmknic.
*/
#define VMK_SOCKET_SO_BINDTOVMK 0x1016
/*
* Values for the vmk_SocketShutdown()'s "how" parameter
*/
/** \brief Further receives will be disallowed */
#define VMK_SOCKET_SHUT_RD 0
/** \brief Further sends will be disallowed. */
#define VMK_SOCKET_SHUT_WR 1
/** \brief Further sends and receives will be disallowed. */
#define VMK_SOCKET_SHUT_RDWR 2
/**
* \brief
* Abstract socket network address
*
* A protocol-specific address is used in actual practice.
*/
typedef struct vmk_SocketAddress {
vmk_uint8 sa_len;
vmk_uint8 sa_family;
vmk_uint8 sa_data[254];
} VMK_ATTRIBUTE_PACKED vmk_SocketAddress;
/**
* \brief
* Data structure for setting the VMK_SOCKET_SO_LINGER option
*/
typedef struct vmk_SocketLingerData {
/** \brief Whether linger is enabled or not */
vmk_uint32 enabled;
/** \brief Linger duration (in seconds) */
vmk_uint32 duration;
} VMK_ATTRIBUTE_PACKED vmk_SocketLingerData;
/*
***********************************************************************
* vmk_SocketAddrToString -- */ /**
*
* \ingroup Socket
* \brief Convert an address into a simple string for a particular
* address family.
*
* \nativedriversdisallowed
*
* \note This function will not block.
*
* \param[in] addr Address to translate to a string.
* \param[out] buffer Buffer to place the converted string into.
* \param[in] bufferLength Length of the buffer in bytes.
*
* \retval VMK_OK Success.
* \retval VMK_BAD_PARAM Bad input addr or buffer
* \retval VMK_NOT_SUPPORTED Unknown address family.
*
* \note This call does *not* do any sort of network lookup. It merely
* converts an address into a human-readable format. In most
* cases the converted string is simply a numeric string.
*
***********************************************************************
*/
VMK_ReturnStatus vmk_SocketAddrToString(const vmk_SocketAddress *addr,
char *buffer,
int bufferLength);
/*
***********************************************************************
* vmk_SocketStringToAddr -- */ /**
*
* \ingroup Socket
* \brief Convert an address into a simple string for a particular
* address family.
*
* \nativedriversdisallowed
*
* \note This function will not block.
*
* \param[in] addressFamily Address family that the string address
* will be converted into.
* \param[in] buffer Buffer containing the string to convert.
* \param[in] bufferLength Length of the buffer in bytes.
* \param[in,out] addr Address the string is converted into.
*
* \retval VMK_OK Success.
* \retval VMK_BAD_PARAM Bad input addr or buffer
* \retval VMK_NOT_SUPPORTED Unknown address family.
* \note This call does *not* do any sort of network lookup. It merely
* converts a simple human-readable string into a address. In most
* cases, this is simply a conversion of a numeric string into
* a network address.
*
***********************************************************************
*/
VMK_ReturnStatus vmk_SocketStringToAddr(int addressFamily,
const char *buffer,
int bufferLength,
vmk_SocketAddress *addr);
/*
***********************************************************************
* vmk_SocketCreate -- */ /**
*
* \ingroup Socket
* \brief Create a new unbound socket.
*
* \nativedriversdisallowed
*
* \note This function will not block.
* \note The default behavior is to create a blocking socket. If
* nonblocking behavior is required then the
* VMK_SOCKET_SO_NONBLOCKING socket option must be set.
*
* \param[in] domain Protocol family for this socket.
* \param[in] type Type of communication on this socket
* \param[in] protocol Specific protocol to use from address family
* \param[out] socket Newly created socket
*
* \retval VMK_OK Success.
* \retval VMK_BAD_PARAM Bad input parameter.
* \retval VMK_NO_MODULE_HEAP The module's heap is not set.
* \retval VMK_NO_MEMORY Unable to allocate memory for socket.
* \retval VMK_EPROTONOSUPPORT Maps to BSD error code EPROTONOSUPPORT.
* \retval VMK_BAD_PARAM_TYPE Maps to BSD error code EPROTOTYPE.
* \retval VMK_NO_BUFFERSPACE Maps to BSD error code ENOBUFS.
* \retval VMK_EOPNOTSUPP Maps to BSD error code EOPNOTSUPP.
* \retval VMK_NO_ACCESS Maps to BSD error code EACCESS.
*
* \note For BSD error code definitions see the FreeBSD 7 man page
* socket(2).
*
* \note Specific domain (VMK_SOCKET_AF_*), type (VMK_SOCKET_SOCK_*),
* and protocol (VMK_SOCKET_*PROTO*) values are implementation
* dependent, an application can determine if a specific domain
* and type is supported by trying to create a socket with zero
* protocol value.
*
***********************************************************************
*/
VMK_ReturnStatus vmk_SocketCreate(int domain,
int type,
int protocol,
vmk_Socket *socket);
/*
***********************************************************************
* vmk_SocketBind -- */ /**
*
* \ingroup Socket
* \brief Bind a socket to a network address endpoint.
*
* \nativedriversdisallowed
*
* \note This function will not block.
*
* \param[in] socket Socket to bind to the network address
* \param[in] address Information describing the network address
* that the socket will be bound to.
* \param[in] addressLength Length in bytes of the network address
* information.
*
* \retval VMK_BAD_PARAM Socket was already bound
* \retval VMK_NOT_SUPPORTED Unknown socket type.
* \retval VMK_NO_MODULE_HEAP This module's heap is not set.
* \retval VMK_EOPNOTSUPP Maps to BSD error code EOPNOTSUPP.
* \retval VMK_BAD_PARAM Maps to BSD error code EINVAL.
* \retval VMK_EADDRNOTAVAIL Maps to BSD error code EADDRNOTAVAIL.
* \retval VMK_ADDRFAM_UNSUPP Maps to BSD error code EAFNOSUPPORT.
* \retval VMK_EADDRINUSE Maps to BSD error code EADDRINUSE.
* \retval VMK_NO_ACCESS Maps to BSD error code EACCESS.
*
* \note For BSD error code definitions see the FreeBSD 7 man page
* bind(2).
*
***********************************************************************
*/
VMK_ReturnStatus vmk_SocketBind(vmk_Socket socket,
vmk_SocketAddress *address,
int addressLength);
/*
***********************************************************************
* vmk_SocketConnect -- */ /**
*
* \ingroup Socket
* \brief Connect to a network address
*
* \nativedriversdisallowed
*
* \note This function may block if the socket is blocking socket
* (this is the default behavior). If nonblocking behavior is required
* then the VMK_SOCKET_SO_NONBLOCKING socket option must be set.
*
* \param[in] socket Socket to connect through.
* \param[in] address The network address info for the address
* to connect to.
* \param[in] addressLength The length of the address info.
*
* \retval VMK_NOT_SUPPORTED Unknown socket type.
* \retval VMK_EALREADY Socket already connected.
* \retval VMK_EINPROGRESS Socket is nonblocking and connection
* is still in progress.
* \retval VMK_EOPNOTSUPP Maps to BSD error code EOPNOTSUPP.
* \retval VMK_ALREADY_CONNECTED Maps to BSD error code EISCONN.
* \retval VMK_BAD_PARAM Maps to BSD error code EINVAL.
* \retval VMK_EADDRNOTAVAIL Maps to BSD error code EADDRNOTAVAIL.
* \retval VMK_ADDRFAM_UNSUPP Maps to BSD error code EAFNOSUPPORT.
* \retval VMK_EADDRINUSE Maps to BSD error code EADDRINUSE.
* \retval VMK_NO_ACCESS Maps to BSD error code EACCESS.
*
* \note For BSD error code definitions see the FreeBSD 7 man page
* connect(2).
*
***********************************************************************
*/
VMK_ReturnStatus vmk_SocketConnect(vmk_Socket socket,
vmk_SocketAddress *address,
int addressLength);
/*
***********************************************************************
* vmk_SocketShutdown -- */ /**
*
* \ingroup Socket
* \brief Shutdown part or all of a connection on a socket
*
* \nativedriversdisallowed
*
* \note This function may block if VMK_SOCKET_SO_LINGER has been set
* otherwise it will not block.
*
* \param[in] socket Socket to query.
* \param[in] how Data direction(s) to shutdown on the socket.
*
* \retval VMK_NOT_SUPPORTED Unknown socket type.
* \retval VMK_EOPNOTSUPP Maps to BSD error code EOPNOTSUPP.
* \retval VMK_ECONNRESET Maps to BSD error code ECONNRESET.
* \retval VMK_ENOTCONN Maps to BSD error code ENOTCONN.
*
* \note For BSD error code definitions see the FreeBSD 7 man page
* shutdown(2).
*
***********************************************************************
*/
VMK_ReturnStatus vmk_SocketShutdown(vmk_Socket socket,
int how);
/*
***********************************************************************
* vmk_SocketClose -- */ /**
*
* \ingroup Socket
* \brief Destroy an existing socket.
*
* \nativedriversdisallowed
*
* \note This function may block if VMK_SOCKET_SO_LINGER has been set
* otherwise will not block.
*
* \param[in] socket Socket to close
*
* \retval VMK_OK Success.
* \retval VMK_BAD_PARAM Input socket is invalid.
* \retval VMK_NO_MODULE_HEAP The module's heap is not set.
* \retval VMK_BUSY Socket is already closing.
* \retval VMK_NOT_SUPPORTED Unknown socket type.
*
***********************************************************************
*/
VMK_ReturnStatus vmk_SocketClose(vmk_Socket socket);
/*
***********************************************************************
* vmk_SocketGetSockOpt -- */ /**
*
* \ingroup Socket
* \brief Get the option information from a socket
*
* \nativedriversdisallowed
*
* \note This function will not block.
*
* \param[in] socket Socket to get the option info from.
* \param[in] level Level of communication infrastructure from which
* to get the socket option.
* \param[in] option The option to get the information about.
* \param[out] optval Data that is currently set on the option.
* \param[out] optlen The length of option data.
*
* \retval VMK_OK Success.
* \retval VMK_BAD_PARAM Input socket is invalid.
* \retval VMK_NOT_SUPPORTED Unknown socket type.
* \retval VMK_NOT_SUPPORTED Maps to BSD error code ENOPROTOOPT.
* \retval VMK_EOPNOTSUPP Maps to BSD error code EOPNOTSUPP.
* \retval VMK_BAD_PARAM Maps to BSD error code EINVAL.
*
* \note For BSD error code definitions see the FreeBSD 7 man page
* getsockopt(2).
*
***********************************************************************
*/
VMK_ReturnStatus vmk_SocketGetSockOpt(vmk_Socket socket,
int level,
int option,
void *optval,
int *optlen);
/*
***********************************************************************
* vmk_SocketSetSockOpt -- */ /**
*
* \ingroup Socket
* \brief Set the option information on a socket
*
* \nativedriversdisallowed
*
* \note This function will not block.
*
* \param[in] socket Socket to set the option info on.
* \param[in] level Level of communication infrastructure from which
* to set the socket option.
* \param[in] option The option to set the information about.
* \param[in] optval Data to set on the option.
* \param[in] optlen The length of the option data.
*
* \retval VMK_OK Success.
* \retval VMK_BAD_PARAM Input socket is invalid.
* \retval VMK_NOT_SUPPORTED Unknown socket type.
* \retval VMK_NOT_SUPPORTED Maps to BSD error code ENOPROTOOPT.
* \retval VMK_EOPNOTSUPP Maps to BSD error code EOPNOTSUPP.
* \retval VMK_BAD_PARAM Maps to BSD error code EINVAL.
*
* \note For BSD error code definitions see the FreeBSD 7 man page
* setsockopt(2).
*
***********************************************************************
*/
VMK_ReturnStatus vmk_SocketSetSockOpt(vmk_Socket socket,
int level,
int option,
const void *optval,
int optlen);
/*
***********************************************************************
* vmk_SocketSendTo -- */ /**
*
* \ingroup Socket
* \brief Send data to a network address.
*
* \nativedriversdisallowed
*
* \note This function may block if the VMK_SOCKET_MSG_DONTWAIT flag is
* not set or the socket is a blocking socket.
*
* \param[in] socket Socket to send the data through.
* \param[in] flags Settings for this send transaction.
* \param[in] address Address information describing the
* data's destination.
* \param[in] data Pointer to data buffer to send.
* \param[in] len Length in bytes of the data buffer to send.
* \param[out] bytesSent Number of bytes actually sent.
*
* \retval VMK_OK Success.
* \retval VMK_NOT_SUPPORTED Unknown socket type.
* \retval VMK_BAD_PARAM Unsupported flags setting.
* \retval VMK_EOPNOTSUPP Maps to BSD error code EOPNOTSUPP.
* \retval VMK_ENOTCONN Maps to BSD error code ENOTCONN.
* \retval VMK_EDESTADDRREQ Maps to BSD error code EDESTADDRREQ.
* \retval VMK_MESSAGE_TOO_LONG Maps to BSD error code EMSGSIZE.
* \retval VMK_WOULD_BLOCK Maps to BSD error code EAGAIN.
* \retval VMK_NO_BUFFERSPACE Maps to BSD error code ENOBUFS.
* \retval VMK_EHOSTUNREACH Maps to BSD error code EHOSTUNREACH.
* \retval VMK_ALREADY_CONNECTED Maps to BSD error code EISCONN.
* \retval VMK_ECONNREFUSED Maps to BSD error code ECONNREFUSED.
* \retval VMK_EHOSTDOWN Maps to BSD error code EHOSTDOWN.
* \retval VMK_ENETDOWN Maps to BSD error code ENETDOWN.
* \retval VMK_EADDRNOTAVAIL Maps to BSD error code EADDRNOTAVAIL.
* \retval VMK_BROKEN_PIPE Maps to BSD error code EPIPE.
*
* \note For BSD error code definitions see the FreeBSD 7 man page
* sendto(2).
*
***********************************************************************
*/
VMK_ReturnStatus vmk_SocketSendTo(vmk_Socket socket,
int flags,
vmk_SocketAddress *address,
void *data,
int len,
int *bytesSent);
/*
***********************************************************************
* vmk_SocketRecvFrom -- */ /**
*
* \ingroup Socket
* \brief Receive data from a network address.
*
* \nativedriversdisallowed
*
* \note This function may block if the VMK_SOCKET_MSG_DONTWAIT flag is
* not set or the socket is a blocking socket.
*
* \param[in] socket Socket to receive the data through.
* \param[in] flags Settings for this receive transaction.
* \param[in] address The source address information the
* messages should be received from,
* or NULL if this is not necessary for
* the socket's protocol or settings.
* \param[in,out] addressLength Length in bytes of the address
* information.
* \param[in] data Pointer to data buffer to receive to.
* \param[in] len Length in bytes of the data buffer.
* \param[out] bytesReceived Number of bytes actually received.
*
* \retval VMK_NOT_SUPPORTED Receive on unbound VMKLINK socket is
* not supported.
* \retval VMK_EOPNOTSUPP Maps to BSD error code EOPNOTSUPP.
* \retval VMK_ENOTCONN Maps to BSD error code ENOTCONN.
* \retval VMK_MESSAGE_TOO_LONG Maps to BSD error code EMSGSIZE.
* \retval VMK_WOULD_BLOCK Maps to BSD error code EAGAIN.
* \retval VMK_ECONNRESET Maps to BSD error code ECONNRESET.
* \retval VMK_INVALID_ADDRESS Maps to BSD error code EFAULT.
*
* \note For BSD error code definitions see the FreeBSD 7 man page
* recvfrom(2).
*
***********************************************************************
*/
VMK_ReturnStatus vmk_SocketRecvFrom(vmk_Socket socket,
int flags,
vmk_SocketAddress *address,
int *addressLength,
void *data,
int len,
int *bytesReceived);
/*
***********************************************************************
* vmk_SocketGetSockName -- */ /**
*
* \ingroup Socket
* \brief Get the socket's local endpoint network address information.
*
* \nativedriversdisallowed
*
* \note This function will not block.
*
* \param[in] socket Socket to query.
* \param[out] address The network address info for the socket
* local endpoint.
* \param[in,out] addressLength The length of the address info.
*
* \retval VMK_OK Success.
* \retval VMK_BAD_PARAM Bad input socket or address.
* \retval VMK_NOT_SUPPORTED Unknown socket family.
* \retval VMK_EOPNOTSUPP Maps to BSD error code EOPNOTSUPP.
* \retval VMK_BAD_PARAM Maps to BSD error code EINVAL.
* \retval VMK_NO_MEMORY Maps to BSD error code ENOMEM.
*
* \note For BSD error code definitions see the FreeBSD 7 man page
* getsockname(2).
*
***********************************************************************
*/
VMK_ReturnStatus vmk_SocketGetSockName(vmk_Socket socket,
vmk_SocketAddress *address,
int *addressLength);
/*
***********************************************************************
* vmk_SocketGetPeerName -- */ /**
*
* \ingroup Socket
* \brief Get the socket's far endpoint network address information.
*
* \nativedriversdisallowed
*
* \note This function will not block.
*
* \param[in] socket Socket to query.
* \param[out] address The network address info for the
* socket remote endpoint.
* \param[in,out] addressLength The length of the address info.
*
* \retval VMK_OK Success.
* \retval VMK_BAD_PARAM Bad input socket or address.
* \retval VMK_NOT_SUPPORTED Unknown socket family.
* \retval VMK_EOPNOTSUPP Maps to BSD error code EOPNOTSUPP.
* \retval VMK_NO_MEMORY Maps to BSD error code ENOMEM.
* \retval VMK_ENOTCONN Maps to BSD error code ENOTCONN.
*
* \note For BSD error code definitions see the FreeBSD 7 man page
* getpeername(2).
*
***********************************************************************
*/
VMK_ReturnStatus vmk_SocketGetPeerName(vmk_Socket socket,
vmk_SocketAddress *address,
int *addressLength);
#endif /* _VMKAPI_SOCKET_H_ */
/** @} */