10f1702c5SYu Xiangning /* 20f1702c5SYu Xiangning * CDDL HEADER START 30f1702c5SYu Xiangning * 40f1702c5SYu Xiangning * The contents of this file are subject to the terms of the 50f1702c5SYu Xiangning * Common Development and Distribution License (the "License"). 60f1702c5SYu Xiangning * You may not use this file except in compliance with the License. 70f1702c5SYu Xiangning * 80f1702c5SYu Xiangning * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 90f1702c5SYu Xiangning * or http://www.opensolaris.org/os/licensing. 100f1702c5SYu Xiangning * See the License for the specific language governing permissions 110f1702c5SYu Xiangning * and limitations under the License. 120f1702c5SYu Xiangning * 130f1702c5SYu Xiangning * When distributing Covered Code, include this CDDL HEADER in each 140f1702c5SYu Xiangning * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 150f1702c5SYu Xiangning * If applicable, add the following below this CDDL HEADER, with the 160f1702c5SYu Xiangning * fields enclosed by brackets "[]" replaced with your own identifying 170f1702c5SYu Xiangning * information: Portions Copyright [yyyy] [name of copyright owner] 180f1702c5SYu Xiangning * 190f1702c5SYu Xiangning * CDDL HEADER END 200f1702c5SYu Xiangning */ 210f1702c5SYu Xiangning 220f1702c5SYu Xiangning /* 233e95bd4aSAnders Persson * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 240f1702c5SYu Xiangning */ 250f1702c5SYu Xiangning 260f1702c5SYu Xiangning #ifndef _SOCKCOMMON_H_ 270f1702c5SYu Xiangning #define _SOCKCOMMON_H_ 280f1702c5SYu Xiangning 290f1702c5SYu Xiangning #ifdef __cplusplus 300f1702c5SYu Xiangning extern "C" { 310f1702c5SYu Xiangning #endif 320f1702c5SYu Xiangning 330f1702c5SYu Xiangning #include <sys/filio.h> 340f1702c5SYu Xiangning #include <sys/socket_proto.h> 350f1702c5SYu Xiangning 360f1702c5SYu Xiangning struct sonode; 370f1702c5SYu Xiangning 380f1702c5SYu Xiangning extern kmem_cache_t *socket_cache; 390f1702c5SYu Xiangning 400f1702c5SYu Xiangning /* 410f1702c5SYu Xiangning * Socket access functions 420f1702c5SYu Xiangning * 430f1702c5SYu Xiangning * The following functions should only be used by sockfs, and are common 440f1702c5SYu Xiangning * functions that can be used both by kernel sockets (i.e., no file 450f1702c5SYu Xiangning * descriptors should ever be expected, or created), and to implement 460f1702c5SYu Xiangning * the socket system calls. 470f1702c5SYu Xiangning */ 480f1702c5SYu Xiangning extern struct sonode *socket_create(int, int, int, char *, char *, int, int, 490f1702c5SYu Xiangning struct cred *, int *); 500f1702c5SYu Xiangning extern struct sonode *socket_newconn(struct sonode *, sock_lower_handle_t, 510f1702c5SYu Xiangning sock_downcalls_t *, int, int *); 520f1702c5SYu Xiangning extern int socket_bind(struct sonode *, struct sockaddr *, socklen_t, int, 530f1702c5SYu Xiangning struct cred *); 540f1702c5SYu Xiangning extern int socket_accept(struct sonode *, int, struct cred *, struct sonode **); 550f1702c5SYu Xiangning extern int socket_listen(struct sonode *, int, struct cred *); 563e95bd4aSAnders Persson extern int socket_connect(struct sonode *, struct sockaddr *, 570f1702c5SYu Xiangning socklen_t, int, int, struct cred *); 580f1702c5SYu Xiangning extern int socket_getpeername(struct sonode *, struct sockaddr *, socklen_t *, 590f1702c5SYu Xiangning boolean_t, struct cred *); 600f1702c5SYu Xiangning extern int socket_getsockname(struct sonode *, struct sockaddr *, socklen_t *, 610f1702c5SYu Xiangning struct cred *); 620f1702c5SYu Xiangning extern int socket_shutdown(struct sonode *, int, struct cred *); 630f1702c5SYu Xiangning extern int socket_getsockopt(struct sonode *, int, int, void *, socklen_t *, 640f1702c5SYu Xiangning int, struct cred *); 650f1702c5SYu Xiangning extern int socket_setsockopt(struct sonode *, int, int, const void *, 660f1702c5SYu Xiangning socklen_t, struct cred *); 670f1702c5SYu Xiangning extern int socket_recvmsg(struct sonode *, struct nmsghdr *, struct uio *, 680f1702c5SYu Xiangning struct cred *); 690f1702c5SYu Xiangning extern int socket_sendmsg(struct sonode *, struct nmsghdr *, struct uio *, 700f1702c5SYu Xiangning struct cred *); 710f1702c5SYu Xiangning extern int socket_sendmblk(struct sonode *, struct nmsghdr *, int, 720f1702c5SYu Xiangning struct cred *, mblk_t **); 730f1702c5SYu Xiangning extern int socket_ioctl(struct sonode *, int, intptr_t, int, struct cred *, 740f1702c5SYu Xiangning int32_t *); 750f1702c5SYu Xiangning extern int socket_poll(struct sonode *, short, int, short *, 760f1702c5SYu Xiangning struct pollhead **); 770f1702c5SYu Xiangning extern int socket_close(struct sonode *, int, struct cred *); 780f1702c5SYu Xiangning extern void socket_destroy(struct sonode *); 790f1702c5SYu Xiangning 800f1702c5SYu Xiangning /* 810f1702c5SYu Xiangning * Cancel the socket push timer. 820f1702c5SYu Xiangning */ 830f1702c5SYu Xiangning #define SOCKET_TIMER_CANCEL(so) { \ 840f1702c5SYu Xiangning timeout_id_t tid; \ 850f1702c5SYu Xiangning \ 860f1702c5SYu Xiangning ASSERT(MUTEX_HELD(&(so)->so_lock)); \ 870f1702c5SYu Xiangning if ((so)->so_rcv_timer_tid != 0) { \ 880f1702c5SYu Xiangning tid = (so)->so_rcv_timer_tid; \ 890f1702c5SYu Xiangning (so)->so_rcv_timer_tid = 0; \ 900f1702c5SYu Xiangning mutex_exit(&(so)->so_lock); \ 910f1702c5SYu Xiangning \ 920f1702c5SYu Xiangning (void) untimeout(tid); \ 930f1702c5SYu Xiangning \ 940f1702c5SYu Xiangning mutex_enter(&(so)->so_lock); \ 950f1702c5SYu Xiangning } \ 960f1702c5SYu Xiangning } 970f1702c5SYu Xiangning 980f1702c5SYu Xiangning #define SOCKET_TIMER_START(so) { \ 990f1702c5SYu Xiangning ASSERT(MUTEX_HELD(&(so)->so_lock)); \ 1000f1702c5SYu Xiangning if ((so)->so_rcv_timer_interval != SOCKET_NO_RCVTIMER) { \ 1010f1702c5SYu Xiangning (so)->so_rcv_timer_tid = timeout(so_timer_callback, \ 1020f1702c5SYu Xiangning (so), MSEC_TO_TICK((so)->so_rcv_timer_interval)); \ 1030f1702c5SYu Xiangning } \ 1040f1702c5SYu Xiangning } 1050f1702c5SYu Xiangning 1060f1702c5SYu Xiangning /* Common sonode ops not support */ 1070f1702c5SYu Xiangning extern int so_listen_notsupp(struct sonode *, int, struct cred *); 1080f1702c5SYu Xiangning extern int so_accept_notsupp(struct sonode *, int, struct cred *, 1090f1702c5SYu Xiangning struct sonode **); 1100f1702c5SYu Xiangning extern int so_getpeername_notsupp(struct sonode *, struct sockaddr *, 1110f1702c5SYu Xiangning socklen_t *, boolean_t, struct cred *); 1120f1702c5SYu Xiangning extern int so_shutdown_notsupp(struct sonode *, int, struct cred *); 1130f1702c5SYu Xiangning extern int so_sendmblk_notsupp(struct sonode *, struct nmsghdr *, 1140f1702c5SYu Xiangning int, struct cred *, mblk_t **); 1150f1702c5SYu Xiangning 1160f1702c5SYu Xiangning /* Common sonode ops */ 1170f1702c5SYu Xiangning extern int so_init(struct sonode *, struct sonode *, struct cred *, int); 1180f1702c5SYu Xiangning extern int so_accept(struct sonode *, int, struct cred *, struct sonode **); 1190f1702c5SYu Xiangning extern int so_bind(struct sonode *, struct sockaddr *, socklen_t, int, 1200f1702c5SYu Xiangning struct cred *); 1210f1702c5SYu Xiangning extern int so_listen(struct sonode *, int, struct cred *); 1223e95bd4aSAnders Persson extern int so_connect(struct sonode *, struct sockaddr *, 1230f1702c5SYu Xiangning socklen_t, int, int, struct cred *); 1240f1702c5SYu Xiangning extern int so_getsockopt(struct sonode *, int, int, void *, 1250f1702c5SYu Xiangning socklen_t *, int, struct cred *); 1260f1702c5SYu Xiangning extern int so_setsockopt(struct sonode *, int, int, const void *, 1270f1702c5SYu Xiangning socklen_t, struct cred *); 1280f1702c5SYu Xiangning extern int so_getpeername(struct sonode *, struct sockaddr *, 1290f1702c5SYu Xiangning socklen_t *, boolean_t, struct cred *); 1300f1702c5SYu Xiangning extern int so_getsockname(struct sonode *, struct sockaddr *, 1310f1702c5SYu Xiangning socklen_t *, struct cred *); 1320f1702c5SYu Xiangning extern int so_ioctl(struct sonode *, int, intptr_t, int, struct cred *, 1330f1702c5SYu Xiangning int32_t *); 1340f1702c5SYu Xiangning extern int so_poll(struct sonode *, short, int, short *, 1350f1702c5SYu Xiangning struct pollhead **); 1360f1702c5SYu Xiangning extern int so_sendmsg(struct sonode *, struct nmsghdr *, struct uio *, 1370f1702c5SYu Xiangning struct cred *); 1383e95bd4aSAnders Persson extern int so_sendmblk_impl(struct sonode *, struct nmsghdr *, int, 1393e95bd4aSAnders Persson struct cred *, mblk_t **, struct sof_instance *, boolean_t); 1400f1702c5SYu Xiangning extern int so_sendmblk(struct sonode *, struct nmsghdr *, int, 1410f1702c5SYu Xiangning struct cred *, mblk_t **); 1420f1702c5SYu Xiangning extern int so_recvmsg(struct sonode *, struct nmsghdr *, struct uio *, 1430f1702c5SYu Xiangning struct cred *); 1440f1702c5SYu Xiangning extern int so_shutdown(struct sonode *, int, struct cred *); 1450f1702c5SYu Xiangning extern int so_close(struct sonode *, int, struct cred *); 1460f1702c5SYu Xiangning 1470f1702c5SYu Xiangning extern int so_tpi_fallback(struct sonode *, struct cred *); 1480f1702c5SYu Xiangning 1490f1702c5SYu Xiangning /* Common upcalls */ 1500f1702c5SYu Xiangning extern sock_upper_handle_t so_newconn(sock_upper_handle_t, 1510f1702c5SYu Xiangning sock_lower_handle_t, sock_downcalls_t *, struct cred *, pid_t, 1520f1702c5SYu Xiangning sock_upcalls_t **); 1530f1702c5SYu Xiangning extern void so_set_prop(sock_upper_handle_t, 1540f1702c5SYu Xiangning struct sock_proto_props *); 1550f1702c5SYu Xiangning extern ssize_t so_queue_msg(sock_upper_handle_t, mblk_t *, size_t, int, 1560f1702c5SYu Xiangning int *, boolean_t *); 1573e95bd4aSAnders Persson extern ssize_t so_queue_msg_impl(struct sonode *, mblk_t *, size_t, int, 1583e95bd4aSAnders Persson int *, boolean_t *, struct sof_instance *); 1590f1702c5SYu Xiangning extern void so_signal_oob(sock_upper_handle_t, ssize_t); 1600f1702c5SYu Xiangning 1610f1702c5SYu Xiangning extern void so_connected(sock_upper_handle_t, sock_connid_t, struct cred *, 1620f1702c5SYu Xiangning pid_t); 1630f1702c5SYu Xiangning extern int so_disconnected(sock_upper_handle_t, sock_connid_t, int); 1640f1702c5SYu Xiangning extern void so_txq_full(sock_upper_handle_t, boolean_t); 1650f1702c5SYu Xiangning extern void so_opctl(sock_upper_handle_t, sock_opctl_action_t, uintptr_t); 1660f1702c5SYu Xiangning /* Common misc. functions */ 1670f1702c5SYu Xiangning 1680f1702c5SYu Xiangning /* accept queue */ 1690f1702c5SYu Xiangning extern int so_acceptq_enqueue(struct sonode *, struct sonode *); 1700f1702c5SYu Xiangning extern int so_acceptq_enqueue_locked(struct sonode *, struct sonode *); 1710f1702c5SYu Xiangning extern int so_acceptq_dequeue(struct sonode *, boolean_t, 1720f1702c5SYu Xiangning struct sonode **); 1732320a8c1SAnders Persson extern void so_acceptq_flush(struct sonode *, boolean_t); 1740f1702c5SYu Xiangning 1750f1702c5SYu Xiangning /* connect */ 1760f1702c5SYu Xiangning extern int so_wait_connected(struct sonode *, boolean_t, sock_connid_t); 1770f1702c5SYu Xiangning 1780f1702c5SYu Xiangning /* send */ 1790f1702c5SYu Xiangning extern int so_snd_wait_qnotfull(struct sonode *, boolean_t); 1800f1702c5SYu Xiangning extern void so_snd_qfull(struct sonode *so); 1810f1702c5SYu Xiangning extern void so_snd_qnotfull(struct sonode *so); 1820f1702c5SYu Xiangning 1830f1702c5SYu Xiangning extern int socket_chgpgrp(struct sonode *, pid_t); 1840f1702c5SYu Xiangning extern void socket_sendsig(struct sonode *, int); 1850f1702c5SYu Xiangning extern int so_dequeue_msg(struct sonode *, mblk_t **, struct uio *, 1860f1702c5SYu Xiangning rval_t *, int); 1870f1702c5SYu Xiangning extern void so_enqueue_msg(struct sonode *, mblk_t *, size_t); 188e4b767e8SAnders Persson extern void so_process_new_message(struct sonode *, mblk_t *, mblk_t *); 189*a215d4ebSKacheong Poon extern boolean_t so_check_flow_control(struct sonode *); 1900f1702c5SYu Xiangning 191bd670b35SErik Nordmark extern mblk_t *socopyinuio(uio_t *, ssize_t, size_t, ssize_t, size_t, int *); 1920f1702c5SYu Xiangning extern mblk_t *socopyoutuio(mblk_t *, struct uio *, ssize_t, int *); 1930f1702c5SYu Xiangning 1940f1702c5SYu Xiangning extern boolean_t somsghasdata(mblk_t *); 1950f1702c5SYu Xiangning extern void so_rcv_flush(struct sonode *); 1960f1702c5SYu Xiangning extern int sorecvoob(struct sonode *, struct nmsghdr *, struct uio *, 1970f1702c5SYu Xiangning int, boolean_t); 1980f1702c5SYu Xiangning 1990f1702c5SYu Xiangning extern void so_timer_callback(void *); 2000f1702c5SYu Xiangning 2010f1702c5SYu Xiangning extern struct sonode *socket_sonode_create(struct sockparams *, int, int, int, 2020f1702c5SYu Xiangning int, int, int *, struct cred *); 2030f1702c5SYu Xiangning 2040f1702c5SYu Xiangning extern void socket_sonode_destroy(struct sonode *); 2050f1702c5SYu Xiangning extern int socket_init_common(struct sonode *, struct sonode *, int flags, 2060f1702c5SYu Xiangning struct cred *); 207a5adac4dSYu Xiangning extern int socket_getopt_common(struct sonode *, int, int, void *, socklen_t *, 208a5adac4dSYu Xiangning int); 2090f1702c5SYu Xiangning extern int socket_ioctl_common(struct sonode *, int, intptr_t, int, 2100f1702c5SYu Xiangning struct cred *, int32_t *); 2110f1702c5SYu Xiangning extern int socket_strioc_common(struct sonode *, int, intptr_t, int, 2120f1702c5SYu Xiangning struct cred *, int32_t *); 2130f1702c5SYu Xiangning 2140f1702c5SYu Xiangning extern int so_zcopy_wait(struct sonode *); 2150f1702c5SYu Xiangning extern int so_get_mod_version(struct sockparams *); 2160f1702c5SYu Xiangning 2170f1702c5SYu Xiangning /* Notification functions */ 2180f1702c5SYu Xiangning extern void so_notify_connected(struct sonode *); 2190f1702c5SYu Xiangning extern void so_notify_disconnecting(struct sonode *); 2203e95bd4aSAnders Persson extern void so_notify_disconnected(struct sonode *, boolean_t, int); 2210f1702c5SYu Xiangning extern void so_notify_writable(struct sonode *); 2220f1702c5SYu Xiangning extern void so_notify_data(struct sonode *, size_t); 2230f1702c5SYu Xiangning extern void so_notify_oobsig(struct sonode *); 2240f1702c5SYu Xiangning extern void so_notify_oobdata(struct sonode *, boolean_t); 2250f1702c5SYu Xiangning extern void so_notify_eof(struct sonode *); 2260f1702c5SYu Xiangning extern void so_notify_newconn(struct sonode *); 2270f1702c5SYu Xiangning extern void so_notify_shutdown(struct sonode *); 2280f1702c5SYu Xiangning extern void so_notify_error(struct sonode *); 2290f1702c5SYu Xiangning 2300f1702c5SYu Xiangning /* Common sonode functions */ 2310f1702c5SYu Xiangning extern int sonode_constructor(void *, void *, int); 2320f1702c5SYu Xiangning extern void sonode_destructor(void *, void *); 2330f1702c5SYu Xiangning extern void sonode_init(struct sonode *, struct sockparams *, 2340f1702c5SYu Xiangning int, int, int, sonodeops_t *); 2350f1702c5SYu Xiangning extern void sonode_fini(struct sonode *); 2360f1702c5SYu Xiangning 2370f1702c5SYu Xiangning /* 2380f1702c5SYu Xiangning * Event flags to socket_sendsig(). 2390f1702c5SYu Xiangning */ 2400f1702c5SYu Xiangning #define SOCKETSIG_WRITE 0x1 2410f1702c5SYu Xiangning #define SOCKETSIG_READ 0x2 2420f1702c5SYu Xiangning #define SOCKETSIG_URG 0x4 2430f1702c5SYu Xiangning 2440f1702c5SYu Xiangning extern sonodeops_t so_sonodeops; 2450f1702c5SYu Xiangning extern sock_upcalls_t so_upcalls; 2460f1702c5SYu Xiangning 2470f1702c5SYu Xiangning #ifdef __cplusplus 2480f1702c5SYu Xiangning } 2490f1702c5SYu Xiangning #endif 2500f1702c5SYu Xiangning #endif /* _SOCKCOMMON_H_ */ 251