|
ADC Home > Reference Library > Reference > Darwin > Kernel Framework Reference
|
kpi_socket.h |
| Includes: |
This header defines an API for creating and interacting with sockets in the kernel. It is possible to create sockets in the kernel without an associated file descriptor. In some cases, a reference to the socket may be known while the file descriptor is not. These functions can be used for interacting with sockets in the kernel. The API is similar to the user space socket API.
sock_accept |
errno_t sock_accept( socket_t so, struct sockaddr *from, int fromlen, int flags, sock_upcall callback, void *cookie, socket_t *new_so);
soThe listening socket you'd like to accept a connection on.
fromA pointer to a socket address that will be filled in with the address the connection is from.
fromlenMaximum length of from.
flagsSupports MSG_DONTWAIT and MSG_USEUPCALL. If MSG_DONTWAIT is set, accept will return EWOULDBLOCK if there are no connections ready to be accepted. If MSG_USEUPCALL is set, the created socket will use the same upcall function attached to the original socket.
callbackA notifier function to be called when an event occurs on the socket. This may be NULL.
cookieA cookie passed directly to the callback.
new_soUpon success, *new_so will be a reference to a new socket for tracking the connection.
0 on success otherwise the errno error.
Accepts an incoming connection on a socket. See 'man 2 accept' for more information. Allocating a socket in this manner creates a socket with no associated file descriptor.
sock_bind |
errno_t sock_bind( socket_t so, const struct sockaddr *to);
soThe socket to be bound.
toThe local address the socket should be bound to.
0 on success otherwise the errno error.
Binds a socket to a specific address. See 'man 2 bind' for more information.
sock_close |
void sock_close( socket_t so);
soThe socket to close. This should only ever be a socket created with sock_socket. Closing a socket created in user space using sock_close may leave a file descriptor pointing to the closed socket, resulting in undefined behavior.
Close the socket.
sock_connect |
errno_t sock_connect( socket_t so, const struct sockaddr *to, int flags);
soThe socket to be connect.
toThe remote address the socket should connect to.
flagsFlags for connecting. The only flag supported so far is MSG_DONTWAIT. MSG_DONTWAIT will perform a non-blocking connect. sock_connect will return immediately with EINPROGRESS. The upcall, if supplied, will be called when the connection is completed.
0 on success, EINPROGRESS for a non-blocking connect that has not completed, otherwise the errno error.
Initiates a connection on the socket. See 'man 2 connect' for more information.
sock_getpeername |
errno_t sock_getpeername( socket_t so, struct sockaddr *peername, int peernamelen);
soThe socket.
peernameStorage for the peer name.
peernamelenLength of storage for the peer name.
0 on success otherwise the errno error.
Retrieves the remote address of a connected socket. See 'man 2 getpeername'.
sock_getsockname |
errno_t sock_getsockname( socket_t so, struct sockaddr *sockname, int socknamelen);
soThe socket.
socknameStorage for the local name.
socknamelenLength of storage for the socket name.
0 on success otherwise the errno error.
Retrieves the local address of a socket. See 'man 2 getsockname'.
sock_getsockopt |
errno_t sock_getsockopt( socket_t so, int level, int optname, void *optval, int *optlen);
soThe socket.
levelLevel of the socket option.
optnameThe option name.
optvalThe option value.
optlenThe length of optval, returns the actual length.
0 on success otherwise the errno error.
Retrieves a socket option. See 'man 2 getsockopt'.
sock_gettype |
errno_t sock_gettype( socket_t so, int *domain, int *type, int *protocol);
soThe socket to check.
domainThe domain of the socket (PF_INET, etc...). May be NULL.
typeThe socket type (SOCK_STREAM, SOCK_DGRAM, etc...). May be NULL.
protocolThe socket protocol. May be NULL.
0 on success otherwise the errno error.
Retrieves information about the socket. This is the same information that was used to create the socket. If any of the parameters following so are NULL, that information is not retrieved.
sock_ioctl |
errno_t sock_ioctl( socket_t so, unsigned long request, void *argp);
soThe socket.
requestThe ioctl name.
argpThe argument.
0 on success otherwise the errno error.
Performs an ioctl operation on a socket. See 'man 2 ioctl'.
sock_isconnected |
int sock_isconnected( socket_t so);
soThe socket to check.
0 - socket is not connected. 1 - socket is connected.
Returns whether or not the socket is connected.
sock_isnonblocking |
int sock_isnonblocking( socket_t so);
0 - socket will block. 1 - socket will not block.
Returns whether or not the socket is non-blocking. In the context of this KPI, non-blocking means that functions to perform operations on a socket will not wait for completion.
To enable or disable blocking, use the FIONBIO ioctl. The parameter is an int. If the int is zero, the socket will block. If the parameter is non-zero, the socket will not block.
sock_listen |
errno_t sock_listen( socket_t so, int backlog);
soThe socket.
backlogThe maximum length of the queue of pending connections.
0 on success otherwise the errno error.
Indicate that the socket should start accepting incoming connections. See 'man 2 listen'.
sock_receive |
errno_t sock_receive( socket_t so, struct msghdr *msg, int flags, size_t *recvdlen);
soThe socket.
msgThe msg describing how the data should be received.
flagsSee 'man 2 recvmsg'.
recvdlenNumber of bytes received, same as return value of userland recvmsg.
0 on success, EWOULDBLOCK if non-blocking and operation would cause the thread to block, otherwise the errno error.
Receive data from a socket. Similar to recvmsg. See 'man 2 recvmsg' for more information about receiving data.
sock_receivembuf |
errno_t sock_receivembuf( socket_t so, struct msghdr *msg, mbuf_t *data, int flags, size_t *recvlen);
soThe socket.
msgThe msg describing how the data should be received. May be NULL. The msg_iov is ignored.
dataUpon return *data will be a reference to an mbuf chain containing the data received. This eliminates copying the data out of the mbufs. Caller is responsible for freeing the mbufs.
flagsSee 'man 2 recvmsg'.
recvlenMaximum number of bytes to receive in the mbuf chain. Upon return, this value will be set to the number of bytes received, same as return value of userland recvmsg.
0 on success, EWOULDBLOCK if non-blocking and operation would cause the thread to block, otherwise the errno error.
Receive data from a socket. Similar to sock_receive though data is returned as a chain of mbufs. See 'man 2 recvmsg' for more information about receiving data.
sock_send |
errno_t sock_send( socket_t so, const struct msghdr *msg, int flags, size_t *sentlen);
soThe socket.
msgThe msg describing how the data should be sent. Any pointers must point to data in the kernel.
flagsSee 'man 2 sendmsg'.
sentlenThe number of bytes sent.
0 on success, EWOULDBLOCK if non-blocking and operation would cause the thread to block, otherwise the errno error.
Send data on a socket. Similar to sendmsg. See 'man 2 sendmsg' for more information about sending data.
sock_sendmbuf |
errno_t sock_sendmbuf( socket_t so, const struct msghdr *msg, mbuf_t data, int flags, size_t *sentlen);
soThe socket.
msgThe msg describing how the data should be sent. The msg_iov is ignored. msg may be NULL.
dataThe mbuf chain of data to send.
flagsSee 'man 2 sendmsg'.
sentlenThe number of bytes sent.
0 on success, EWOULDBLOCK if non-blocking and operation would cause the thread to block, otherwise the errno error. Regardless of return value, the mbuf chain 'data' will be freed.
Send data in an mbuf on a socket. Similar to sock_send only the data to be sent is taken from the mbuf chain.
sock_setpriv |
errno_t sock_setpriv( socket_t so, int on);
soThe socket on which to modify the SS_PRIV flag.
onIndicate whether or not the SS_PRIV flag should be set.
0 on success otherwise the errno error.
Set the privileged bit in the socket. Allows for operations that require root privileges.
sock_setsockopt |
errno_t sock_setsockopt( socket_t so, int level, int optname, const void *optval, int optlen);
soThe socket.
levelLevel of the socket option.
optnameThe option name.
optvalThe option value.
optlenThe length of optval.
0 on success otherwise the errno error.
Sets a socket option. See 'man 2 setsockopt'.
sock_shutdown |
errno_t sock_shutdown( socket_t so, int how);
soThe socket.
howSHUT_RD - shutdown receive. SHUT_WR - shutdown send. SHUT_RDWR - shutdown both.
0 on success otherwise the errno error.
Shutdown one or both directions of a connection. See 'man 2 shutdown' for more information.
sock_socket |
errno_t sock_socket( int domain, int type, int protocol, sock_upcall callback, void *cookie, socket_t *new_so);
domainThe socket domain (PF_INET, etc...).
typeThe socket type (SOCK_STREAM, SOCK_DGRAM, etc...).
protocolThe socket protocol.
callbackA notifier function to be called when an event occurs on the socket. This may be NULL.
cookieA cookie passed directly to the callback.
new_soUpon success, a reference to the new socket.
0 on success otherwise the errno error.
Allocate a socket. Allocating a socket in this manner creates a socket with no associated file descriptor. For more information, see 'man 2 socket'.
sock_upcall |
typedef void ( *sock_upcall)( socket_t so, void *cookie, int waitf);
soA reference to the socket that's ready.
cookieThe cookie passed in when the socket was created.
waitfIndicates whether or not it's safe to block.
sock_upcall is used by a socket to notify an in kernel client that data is waiting. Instead of making blocking calls in the kernel, a client can specify an upcall which will be called when data is available or the socket is ready for sending.
Calls to your upcall function are not serialized and may be called concurrently from multiple threads in the kernel.
Your upcall function will be called when:
|
Last Updated: 2008-12-19