0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * CDDL HEADER START
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * The contents of this file are subject to the terms of the
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Common Development and Distribution License (the "License").
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * You may not use this file except in compliance with the License.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * or http://www.opensolaris.org/os/licensing.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * See the License for the specific language governing permissions
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * and limitations under the License.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * When distributing Covered Code, include this CDDL HEADER in each
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * If applicable, add the following below this CDDL HEADER, with the
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * fields enclosed by brackets "[]" replaced with your own identifying
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * information: Portions Copyright [yyyy] [name of copyright owner]
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * CDDL HEADER END
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/*
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Persson * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#ifndef _SOCKCOMMON_H_
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define _SOCKCOMMON_H_
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#ifdef __cplusplus
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern "C" {
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#endif
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#include <sys/filio.h>
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#include <sys/socket_proto.h>
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningstruct sonode;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern kmem_cache_t *socket_cache;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Socket access functions
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning *
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * The following functions should only be used by sockfs, and are common
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * functions that can be used both by kernel sockets (i.e., no file
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * descriptors should ever be expected, or created), and to implement
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * the socket system calls.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern struct sonode *socket_create(int, int, int, char *, char *, int, int,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct cred *, int *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern struct sonode *socket_newconn(struct sonode *, sock_lower_handle_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning sock_downcalls_t *, int, int *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_bind(struct sonode *, struct sockaddr *, socklen_t, int,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_accept(struct sonode *, int, struct cred *, struct sonode **);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_listen(struct sonode *, int, struct cred *);
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Perssonextern int socket_connect(struct sonode *, struct sockaddr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning socklen_t, int, int, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_getpeername(struct sonode *, struct sockaddr *, socklen_t *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning boolean_t, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_getsockname(struct sonode *, struct sockaddr *, socklen_t *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_shutdown(struct sonode *, int, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_getsockopt(struct sonode *, int, int, void *, socklen_t *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_setsockopt(struct sonode *, int, int, const void *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning socklen_t, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_recvmsg(struct sonode *, struct nmsghdr *, struct uio *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_sendmsg(struct sonode *, struct nmsghdr *, struct uio *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_sendmblk(struct sonode *, struct nmsghdr *, int,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct cred *, mblk_t **);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_ioctl(struct sonode *, int, intptr_t, int, struct cred *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int32_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_poll(struct sonode *, short, int, short *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct pollhead **);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_close(struct sonode *, int, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void socket_destroy(struct sonode *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Cancel the socket push timer.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKET_TIMER_CANCEL(so) { \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning timeout_id_t tid; \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning ASSERT(MUTEX_HELD(&(so)->so_lock)); \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning if ((so)->so_rcv_timer_tid != 0) { \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning tid = (so)->so_rcv_timer_tid; \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning (so)->so_rcv_timer_tid = 0; \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning mutex_exit(&(so)->so_lock); \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning (void) untimeout(tid); \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning mutex_enter(&(so)->so_lock); \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning } \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning}
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKET_TIMER_START(so) { \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning ASSERT(MUTEX_HELD(&(so)->so_lock)); \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning if ((so)->so_rcv_timer_interval != SOCKET_NO_RCVTIMER) { \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning (so)->so_rcv_timer_tid = timeout(so_timer_callback, \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning (so), MSEC_TO_TICK((so)->so_rcv_timer_interval)); \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning } \
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning}
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/* Common sonode ops not support */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_listen_notsupp(struct sonode *, int, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_accept_notsupp(struct sonode *, int, struct cred *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct sonode **);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_getpeername_notsupp(struct sonode *, struct sockaddr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning socklen_t *, boolean_t, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_shutdown_notsupp(struct sonode *, int, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_sendmblk_notsupp(struct sonode *, struct nmsghdr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int, struct cred *, mblk_t **);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/* Common sonode ops */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_init(struct sonode *, struct sonode *, struct cred *, int);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_accept(struct sonode *, int, struct cred *, struct sonode **);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_bind(struct sonode *, struct sockaddr *, socklen_t, int,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_listen(struct sonode *, int, struct cred *);
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Perssonextern int so_connect(struct sonode *, struct sockaddr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning socklen_t, int, int, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_getsockopt(struct sonode *, int, int, void *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning socklen_t *, int, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_setsockopt(struct sonode *, int, int, const void *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning socklen_t, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_getpeername(struct sonode *, struct sockaddr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning socklen_t *, boolean_t, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_getsockname(struct sonode *, struct sockaddr *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning socklen_t *, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_ioctl(struct sonode *, int, intptr_t, int, struct cred *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int32_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_poll(struct sonode *, short, int, short *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct pollhead **);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_sendmsg(struct sonode *, struct nmsghdr *, struct uio *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct cred *);
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Perssonextern int so_sendmblk_impl(struct sonode *, struct nmsghdr *, int,
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Persson struct cred *, mblk_t **, struct sof_instance *, boolean_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_sendmblk(struct sonode *, struct nmsghdr *, int,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct cred *, mblk_t **);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_recvmsg(struct sonode *, struct nmsghdr *, struct uio *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_shutdown(struct sonode *, int, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_close(struct sonode *, int, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_tpi_fallback(struct sonode *, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/* Common upcalls */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern sock_upper_handle_t so_newconn(sock_upper_handle_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning sock_lower_handle_t, sock_downcalls_t *, struct cred *, pid_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning sock_upcalls_t **);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_set_prop(sock_upper_handle_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct sock_proto_props *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern ssize_t so_queue_msg(sock_upper_handle_t, mblk_t *, size_t, int,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int *, boolean_t *);
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Perssonextern ssize_t so_queue_msg_impl(struct sonode *, mblk_t *, size_t, int,
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Persson int *, boolean_t *, struct sof_instance *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_signal_oob(sock_upper_handle_t, ssize_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_connected(sock_upper_handle_t, sock_connid_t, struct cred *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning pid_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_disconnected(sock_upper_handle_t, sock_connid_t, int);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_txq_full(sock_upper_handle_t, boolean_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_opctl(sock_upper_handle_t, sock_opctl_action_t, uintptr_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/* Common misc. functions */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning /* accept queue */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_acceptq_enqueue(struct sonode *, struct sonode *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_acceptq_enqueue_locked(struct sonode *, struct sonode *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_acceptq_dequeue(struct sonode *, boolean_t,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct sonode **);
2320a8c1cca132d99d97f0f0025b5b4b4bfaf5b6Anders Perssonextern void so_acceptq_flush(struct sonode *, boolean_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning /* connect */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_wait_connected(struct sonode *, boolean_t, sock_connid_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning /* send */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_snd_wait_qnotfull(struct sonode *, boolean_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_snd_qfull(struct sonode *so);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_snd_qnotfull(struct sonode *so);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_chgpgrp(struct sonode *, pid_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void socket_sendsig(struct sonode *, int);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_dequeue_msg(struct sonode *, mblk_t **, struct uio *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning rval_t *, int);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_enqueue_msg(struct sonode *, mblk_t *, size_t);
e4b767e87eacd08854eda4dbb32906316ba2db8bAnders Perssonextern void so_process_new_message(struct sonode *, mblk_t *, mblk_t *);
a215d4eb400e2ff52f7a17e0781964c37aabfc04Kacheong Poonextern boolean_t so_check_flow_control(struct sonode *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
bd670b35a010421b6e1a5536c34453a827007c81Erik Nordmarkextern mblk_t *socopyinuio(uio_t *, ssize_t, size_t, ssize_t, size_t, int *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern mblk_t *socopyoutuio(mblk_t *, struct uio *, ssize_t, int *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern boolean_t somsghasdata(mblk_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_rcv_flush(struct sonode *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int sorecvoob(struct sonode *, struct nmsghdr *, struct uio *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int, boolean_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_timer_callback(void *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern struct sonode *socket_sonode_create(struct sockparams *, int, int, int,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int, int, int *, struct cred *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void socket_sonode_destroy(struct sonode *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_init_common(struct sonode *, struct sonode *, int flags,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct cred *);
a5adac4d8d51bc60d7d7f5763966ce1290dc1277Yu Xiangningextern int socket_getopt_common(struct sonode *, int, int, void *, socklen_t *,
a5adac4d8d51bc60d7d7f5763966ce1290dc1277Yu Xiangning int);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_ioctl_common(struct sonode *, int, intptr_t, int,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct cred *, int32_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int socket_strioc_common(struct sonode *, int, intptr_t, int,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning struct cred *, int32_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_zcopy_wait(struct sonode *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int so_get_mod_version(struct sockparams *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/* Notification functions */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_notify_connected(struct sonode *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_notify_disconnecting(struct sonode *);
3e95bd4ab92abca814bd28e854607d1975c7dc88Anders Perssonextern void so_notify_disconnected(struct sonode *, boolean_t, int);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_notify_writable(struct sonode *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_notify_data(struct sonode *, size_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_notify_oobsig(struct sonode *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_notify_oobdata(struct sonode *, boolean_t);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_notify_eof(struct sonode *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_notify_newconn(struct sonode *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_notify_shutdown(struct sonode *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void so_notify_error(struct sonode *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/* Common sonode functions */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern int sonode_constructor(void *, void *, int);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void sonode_destructor(void *, void *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void sonode_init(struct sonode *, struct sockparams *,
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning int, int, int, sonodeops_t *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern void sonode_fini(struct sonode *);
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning/*
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning * Event flags to socket_sendsig().
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning */
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKETSIG_WRITE 0x1
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKETSIG_READ 0x2
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#define SOCKETSIG_URG 0x4
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern sonodeops_t so_sonodeops;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangningextern sock_upcalls_t so_upcalls;
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#ifdef __cplusplus
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning}
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#endif
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning#endif /* _SOCKCOMMON_H_ */