/*
- * Copyright (c) 2004 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2008 Apple Computer, Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
@param cookie The cookie passed in when the socket was created.
@param waitf Indicates whether or not it's safe to block.
*/
-typedef void (*sock_upcall)(socket_t so, void* cookie, int waitf);
+typedef void (*sock_upcall)(socket_t so, void *cookie, int waitf);
/*!
@function sock_accept
socket for tracking the connection.
@result 0 on success otherwise the errno error.
*/
-errno_t sock_accept(socket_t so, struct sockaddr *from, int fromlen,
- int flags, sock_upcall callback, void* cookie, socket_t *new_so);
+extern errno_t sock_accept(socket_t so, struct sockaddr *from, int fromlen,
+ int flags, sock_upcall callback, void *cookie, socket_t *new_so);
/*!
@function sock_bind
@param to The local address the socket should be bound to.
@result 0 on success otherwise the errno error.
*/
-errno_t sock_bind(socket_t so, const struct sockaddr *to);
+extern errno_t sock_bind(socket_t so, const struct sockaddr *to);
/*!
@function sock_connect
@result 0 on success, EINPROGRESS for a non-blocking connect that
has not completed, otherwise the errno error.
*/
-errno_t sock_connect(socket_t so, const struct sockaddr *to, int flags);
+extern errno_t sock_connect(socket_t so, const struct sockaddr *to, int flags);
#ifdef KERNEL_PRIVATE
/*
returned if the connection did not complete in the timeout
specified.
*/
-errno_t sock_connectwait(socket_t so, const struct timeval *tv);
+extern errno_t sock_connectwait(socket_t so, const struct timeval *tv);
#endif /* KERNEL_PRIVATE */
/*!
@param peernamelen Length of storage for the peer name.
@result 0 on success otherwise the errno error.
*/
-errno_t sock_getpeername(socket_t so, struct sockaddr *peername,
+extern errno_t sock_getpeername(socket_t so, struct sockaddr *peername,
int peernamelen);
/*!
@param socknamelen Length of storage for the socket name.
@result 0 on success otherwise the errno error.
*/
-errno_t sock_getsockname(socket_t so, struct sockaddr *sockname,
+extern errno_t sock_getsockname(socket_t so, struct sockaddr *sockname,
int socknamelen);
/*!
@param optlen The length of optval, returns the actual length.
@result 0 on success otherwise the errno error.
*/
-errno_t sock_getsockopt(socket_t so, int level, int optname, void *optval,
- int *optlen);
+extern errno_t sock_getsockopt(socket_t so, int level, int optname,
+ void *optval, int *optlen);
/*!
@function sock_ioctl
@param argp The argument.
@result 0 on success otherwise the errno error.
*/
-errno_t sock_ioctl(socket_t so, unsigned long request, void *argp);
+extern errno_t sock_ioctl(socket_t so, unsigned long request, void *argp);
/*!
@function sock_setsockopt
@param optlen The length of optval.
@result 0 on success otherwise the errno error.
*/
-errno_t sock_setsockopt(socket_t so, int level, int optname, const void *optval,
- int optlen);
+extern errno_t sock_setsockopt(socket_t so, int level, int optname,
+ const void *optval, int optlen);
+
+#ifdef KERNEL_PRIVATE
+/*
+ This function was added to support AFP setting the traffic class
+ for a backup stream within a wireless LAN or over link-local address.
+
+ If you feel you need to use this function, please contact us to
+ explain why.
+
+ @function sock_settclassopt
+ @discussion Allows a caller to set the traffic class.
+ @param so The socket.
+ @param optval The option value.
+ @param optlen The length of optval.
+ @result 0 on success otherwise the errno error.
+ */
+extern errno_t sock_settclassopt(socket_t so, const void* optval, size_t optlen);
+
+/*
+ This function was added to support AFP getting the traffic class
+ set on a stream.
+
+ This is also a private API, please contact us if you need to use it.
+
+ @function sockgettclassopt
+ @discussion Allows a caller to get the traffic class.
+ @param so The socket.
+ @param optval The option value.
+ @param optlen The length of optval, returns the actual length.
+ @result 0 on success otherwise the errno error.
+*/
+extern errno_t sock_gettclassopt(socket_t so, void* optval, size_t* optlen);
+
+#ifdef BSD_KERNEL_PRIVATE
+extern void socket_set_traffic_mgt_flags(socket_t so, u_int32_t flags);
+extern void socket_clear_traffic_mgt_flags(socket_t so, u_int32_t flags);
+#endif /* BSD_KERNEL_PRIVATE */
+#endif
/*!
@function sock_listen
@param backlog The maximum length of the queue of pending connections.
@result 0 on success otherwise the errno error.
*/
-errno_t sock_listen(socket_t so, int backlog);
+extern errno_t sock_listen(socket_t so, int backlog);
/*!
@function sock_receive
@result 0 on success, EWOULDBLOCK if non-blocking and operation
would cause the thread to block, otherwise the errno error.
*/
-errno_t sock_receive(socket_t so, struct msghdr *msg, int flags,
+extern errno_t sock_receive(socket_t so, struct msghdr *msg, int flags,
size_t *recvdlen);
/*!
@result 0 on success, EWOULDBLOCK if non-blocking and operation
would cause the thread to block, otherwise the errno error.
*/
-errno_t sock_receivembuf(socket_t so, struct msghdr *msg, mbuf_t *data,
+extern errno_t sock_receivembuf(socket_t so, struct msghdr *msg, mbuf_t *data,
int flags, size_t *recvlen);
/*!
@result 0 on success, EWOULDBLOCK if non-blocking and operation
would cause the thread to block, otherwise the errno error.
*/
-errno_t sock_send(socket_t so, const struct msghdr *msg, int flags,
+extern errno_t sock_send(socket_t so, const struct msghdr *msg, int flags,
size_t *sentlen);
/*!
would cause the thread to block, otherwise the errno error.
Regardless of return value, the mbuf chain 'data' will be freed.
*/
-errno_t sock_sendmbuf(socket_t so, const struct msghdr *msg, mbuf_t data,
+extern errno_t sock_sendmbuf(socket_t so, const struct msghdr *msg, mbuf_t data,
int flags, size_t *sentlen);
/*!
@discussion Shutdown one or both directions of a connection. See
'man 2 shutdown' for more information.
@param so The socket.
- @param how SHUT_RD - shutdown receive. SHUT_WR - shutdown send. SHUT_RDWR - shutdown both.
+ @param how SHUT_RD - shutdown receive.
+ SHUT_WR - shutdown send.
+ SHUT_RDWR - shutdown both.
@result 0 on success otherwise the errno error.
*/
-errno_t sock_shutdown(socket_t so, int how);
+extern errno_t sock_shutdown(socket_t so, int how);
/*!
@function sock_socket
@param new_so Upon success, a reference to the new socket.
@result 0 on success otherwise the errno error.
*/
-errno_t sock_socket(int domain, int type, int protocol, sock_upcall callback,
- void* cookie, socket_t *new_so);
+extern errno_t sock_socket(int domain, int type, int protocol,
+ sock_upcall callback, void *cookie, socket_t *new_so);
/*!
@function sock_close
@discussion Close the socket.
@param so The 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.
+ using sock_close may leave a file descriptor pointing to the
+ closed socket, resulting in undefined behavior.
*/
-void sock_close(socket_t so);
+extern void sock_close(socket_t so);
#ifdef KERNEL_PRIVATE
/*
that socket. It is used in conjunction with
sock_release(socket_t so).
*/
-void sock_retain(socket_t so);
+extern void sock_retain(socket_t so);
/*
@function sock_release
on a socket acquired with sock_retain. When the last retain
count is reached, this will call sock_close to close the socket.
*/
-void sock_release(socket_t so);
+extern void sock_release(socket_t so);
#endif /* KERNEL_PRIVATE */
/*!
@param on Indicate whether or not the SS_PRIV flag should be set.
@result 0 on success otherwise the errno error.
*/
-errno_t sock_setpriv(socket_t so, int on);
+extern errno_t sock_setpriv(socket_t so, int on);
/*!
@function sock_isconnected
@param so The socket to check.
@result 0 - socket is not connected. 1 - socket is connected.
*/
-int sock_isconnected(socket_t so);
+extern int sock_isconnected(socket_t so);
/*!
@function sock_isnonblocking
If the parameter is non-zero, the socket will not block.
@result 0 - socket will block. 1 - socket will not block.
*/
-int sock_isnonblocking(socket_t so);
+extern int sock_isnonblocking(socket_t so);
/*!
@function sock_gettype
parameters following so are NULL, that information is not
retrieved.
@param so The socket to check.
- @param domain The domain of the socket (PF_INET, etc...). May be NULL.
- @param type The socket type (SOCK_STREAM, SOCK_DGRAM, etc...). May be NULL.
+ @param domain The domain of the socket (PF_INET, ...). May be NULL.
+ @param type The socket type (SOCK_STREAM, SOCK_DGRAM, ...). May be NULL.
@param protocol The socket protocol. May be NULL.
@result 0 on success otherwise the errno error.
*/
-errno_t sock_gettype(socket_t so, int *domain, int *type, int *protocol);
+extern errno_t sock_gettype(socket_t so, int *domain, int *type, int *protocol);
#ifdef KERNEL_PRIVATE
/*
@param on Indicate whether or not the SB_NOINTR flag should be set.
@result 0 on success otherwise the errno error.
*/
-errno_t sock_nointerrupt(socket_t so, int on);
+extern errno_t sock_nointerrupt(socket_t so, int on);
/*
@function sock_getlistener
NULL if the socket is not in the incomplete/completed list
of a listener.
*/
-socket_t sock_getlistener(socket_t so);
+extern socket_t sock_getlistener(socket_t so);
/*
@function sock_getaddr
@param peername 0 for local address, and non-zero for peer address.
@result 0 on success otherwise the errno error.
*/
-errno_t sock_getaddr(socket_t so, struct sockaddr **psockname, int peername);
+extern errno_t sock_getaddr(socket_t so, struct sockaddr **psockname,
+ int peername);
/*
@function sock_freeaddr
@discussion Frees the socket address allocated by sock_getaddr.
@param sockname The socket name to be freed.
*/
-void sock_freeaddr(struct sockaddr *sockname);
+extern void sock_freeaddr(struct sockaddr *sockname);
#endif /* KERNEL_PRIVATE */
__END_DECLS