1*8348SEric.Yu@Sun.COM /* 2*8348SEric.Yu@Sun.COM * CDDL HEADER START 3*8348SEric.Yu@Sun.COM * 4*8348SEric.Yu@Sun.COM * The contents of this file are subject to the terms of the 5*8348SEric.Yu@Sun.COM * Common Development and Distribution License (the "License"). 6*8348SEric.Yu@Sun.COM * You may not use this file except in compliance with the License. 7*8348SEric.Yu@Sun.COM * 8*8348SEric.Yu@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*8348SEric.Yu@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*8348SEric.Yu@Sun.COM * See the License for the specific language governing permissions 11*8348SEric.Yu@Sun.COM * and limitations under the License. 12*8348SEric.Yu@Sun.COM * 13*8348SEric.Yu@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*8348SEric.Yu@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*8348SEric.Yu@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*8348SEric.Yu@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*8348SEric.Yu@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*8348SEric.Yu@Sun.COM * 19*8348SEric.Yu@Sun.COM * CDDL HEADER END 20*8348SEric.Yu@Sun.COM */ 21*8348SEric.Yu@Sun.COM 22*8348SEric.Yu@Sun.COM /* 23*8348SEric.Yu@Sun.COM * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24*8348SEric.Yu@Sun.COM * Use is subject to license terms. 25*8348SEric.Yu@Sun.COM */ 26*8348SEric.Yu@Sun.COM 27*8348SEric.Yu@Sun.COM #ifndef _SOCKCOMMON_H_ 28*8348SEric.Yu@Sun.COM #define _SOCKCOMMON_H_ 29*8348SEric.Yu@Sun.COM 30*8348SEric.Yu@Sun.COM #pragma ident "@(#)sockcommon.h 1.1 07/06/14 SMI" 31*8348SEric.Yu@Sun.COM 32*8348SEric.Yu@Sun.COM #ifdef __cplusplus 33*8348SEric.Yu@Sun.COM extern "C" { 34*8348SEric.Yu@Sun.COM #endif 35*8348SEric.Yu@Sun.COM 36*8348SEric.Yu@Sun.COM #include <sys/filio.h> 37*8348SEric.Yu@Sun.COM #include <sys/socket_proto.h> 38*8348SEric.Yu@Sun.COM 39*8348SEric.Yu@Sun.COM struct sonode; 40*8348SEric.Yu@Sun.COM 41*8348SEric.Yu@Sun.COM extern kmem_cache_t *socket_cache; 42*8348SEric.Yu@Sun.COM 43*8348SEric.Yu@Sun.COM /* 44*8348SEric.Yu@Sun.COM * Socket access functions 45*8348SEric.Yu@Sun.COM * 46*8348SEric.Yu@Sun.COM * The following functions should only be used by sockfs, and are common 47*8348SEric.Yu@Sun.COM * functions that can be used both by kernel sockets (i.e., no file 48*8348SEric.Yu@Sun.COM * descriptors should ever be expected, or created), and to implement 49*8348SEric.Yu@Sun.COM * the socket system calls. 50*8348SEric.Yu@Sun.COM */ 51*8348SEric.Yu@Sun.COM extern struct sonode *socket_create(int, int, int, char *, char *, int, int, 52*8348SEric.Yu@Sun.COM struct cred *, int *); 53*8348SEric.Yu@Sun.COM extern struct sonode *socket_newconn(struct sonode *, sock_lower_handle_t, 54*8348SEric.Yu@Sun.COM sock_downcalls_t *, int, int *); 55*8348SEric.Yu@Sun.COM extern int socket_bind(struct sonode *, struct sockaddr *, socklen_t, int, 56*8348SEric.Yu@Sun.COM struct cred *); 57*8348SEric.Yu@Sun.COM extern int socket_accept(struct sonode *, int, struct cred *, struct sonode **); 58*8348SEric.Yu@Sun.COM extern int socket_listen(struct sonode *, int, struct cred *); 59*8348SEric.Yu@Sun.COM extern int socket_connect(struct sonode *, const struct sockaddr *, 60*8348SEric.Yu@Sun.COM socklen_t, int, int, struct cred *); 61*8348SEric.Yu@Sun.COM extern int socket_getpeername(struct sonode *, struct sockaddr *, socklen_t *, 62*8348SEric.Yu@Sun.COM boolean_t, struct cred *); 63*8348SEric.Yu@Sun.COM extern int socket_getsockname(struct sonode *, struct sockaddr *, socklen_t *, 64*8348SEric.Yu@Sun.COM struct cred *); 65*8348SEric.Yu@Sun.COM extern int socket_shutdown(struct sonode *, int, struct cred *); 66*8348SEric.Yu@Sun.COM extern int socket_getsockopt(struct sonode *, int, int, void *, socklen_t *, 67*8348SEric.Yu@Sun.COM int, struct cred *); 68*8348SEric.Yu@Sun.COM extern int socket_setsockopt(struct sonode *, int, int, const void *, 69*8348SEric.Yu@Sun.COM socklen_t, struct cred *); 70*8348SEric.Yu@Sun.COM extern int socket_recvmsg(struct sonode *, struct nmsghdr *, struct uio *, 71*8348SEric.Yu@Sun.COM struct cred *); 72*8348SEric.Yu@Sun.COM extern int socket_sendmsg(struct sonode *, struct nmsghdr *, struct uio *, 73*8348SEric.Yu@Sun.COM struct cred *); 74*8348SEric.Yu@Sun.COM extern int socket_sendmblk(struct sonode *, struct nmsghdr *, int, 75*8348SEric.Yu@Sun.COM struct cred *, mblk_t **); 76*8348SEric.Yu@Sun.COM extern int socket_ioctl(struct sonode *, int, intptr_t, int, struct cred *, 77*8348SEric.Yu@Sun.COM int32_t *); 78*8348SEric.Yu@Sun.COM extern int socket_poll(struct sonode *, short, int, short *, 79*8348SEric.Yu@Sun.COM struct pollhead **); 80*8348SEric.Yu@Sun.COM extern int socket_close(struct sonode *, int, struct cred *); 81*8348SEric.Yu@Sun.COM extern void socket_destroy(struct sonode *); 82*8348SEric.Yu@Sun.COM 83*8348SEric.Yu@Sun.COM /* 84*8348SEric.Yu@Sun.COM * Cancel the socket push timer. 85*8348SEric.Yu@Sun.COM */ 86*8348SEric.Yu@Sun.COM #define SOCKET_TIMER_CANCEL(so) { \ 87*8348SEric.Yu@Sun.COM timeout_id_t tid; \ 88*8348SEric.Yu@Sun.COM \ 89*8348SEric.Yu@Sun.COM ASSERT(MUTEX_HELD(&(so)->so_lock)); \ 90*8348SEric.Yu@Sun.COM if ((so)->so_rcv_timer_tid != 0) { \ 91*8348SEric.Yu@Sun.COM tid = (so)->so_rcv_timer_tid; \ 92*8348SEric.Yu@Sun.COM (so)->so_rcv_timer_tid = 0; \ 93*8348SEric.Yu@Sun.COM mutex_exit(&(so)->so_lock); \ 94*8348SEric.Yu@Sun.COM \ 95*8348SEric.Yu@Sun.COM (void) untimeout(tid); \ 96*8348SEric.Yu@Sun.COM \ 97*8348SEric.Yu@Sun.COM mutex_enter(&(so)->so_lock); \ 98*8348SEric.Yu@Sun.COM } \ 99*8348SEric.Yu@Sun.COM } 100*8348SEric.Yu@Sun.COM 101*8348SEric.Yu@Sun.COM #define SOCKET_TIMER_START(so) { \ 102*8348SEric.Yu@Sun.COM ASSERT(MUTEX_HELD(&(so)->so_lock)); \ 103*8348SEric.Yu@Sun.COM if ((so)->so_rcv_timer_interval != SOCKET_NO_RCVTIMER) { \ 104*8348SEric.Yu@Sun.COM (so)->so_rcv_timer_tid = timeout(so_timer_callback, \ 105*8348SEric.Yu@Sun.COM (so), MSEC_TO_TICK((so)->so_rcv_timer_interval)); \ 106*8348SEric.Yu@Sun.COM } \ 107*8348SEric.Yu@Sun.COM } 108*8348SEric.Yu@Sun.COM 109*8348SEric.Yu@Sun.COM /* Common sonode ops not support */ 110*8348SEric.Yu@Sun.COM extern int so_listen_notsupp(struct sonode *, int, struct cred *); 111*8348SEric.Yu@Sun.COM extern int so_accept_notsupp(struct sonode *, int, struct cred *, 112*8348SEric.Yu@Sun.COM struct sonode **); 113*8348SEric.Yu@Sun.COM extern int so_getpeername_notsupp(struct sonode *, struct sockaddr *, 114*8348SEric.Yu@Sun.COM socklen_t *, boolean_t, struct cred *); 115*8348SEric.Yu@Sun.COM extern int so_shutdown_notsupp(struct sonode *, int, struct cred *); 116*8348SEric.Yu@Sun.COM extern int so_sendmblk_notsupp(struct sonode *, struct nmsghdr *, 117*8348SEric.Yu@Sun.COM int, struct cred *, mblk_t **); 118*8348SEric.Yu@Sun.COM 119*8348SEric.Yu@Sun.COM /* Common sonode ops */ 120*8348SEric.Yu@Sun.COM extern int so_init(struct sonode *, struct sonode *, struct cred *, int); 121*8348SEric.Yu@Sun.COM extern int so_accept(struct sonode *, int, struct cred *, struct sonode **); 122*8348SEric.Yu@Sun.COM extern int so_bind(struct sonode *, struct sockaddr *, socklen_t, int, 123*8348SEric.Yu@Sun.COM struct cred *); 124*8348SEric.Yu@Sun.COM extern int so_listen(struct sonode *, int, struct cred *); 125*8348SEric.Yu@Sun.COM extern int so_connect(struct sonode *, const struct sockaddr *, 126*8348SEric.Yu@Sun.COM socklen_t, int, int, struct cred *); 127*8348SEric.Yu@Sun.COM extern int so_getsockopt(struct sonode *, int, int, void *, 128*8348SEric.Yu@Sun.COM socklen_t *, int, struct cred *); 129*8348SEric.Yu@Sun.COM extern int so_setsockopt(struct sonode *, int, int, const void *, 130*8348SEric.Yu@Sun.COM socklen_t, struct cred *); 131*8348SEric.Yu@Sun.COM extern int so_getpeername(struct sonode *, struct sockaddr *, 132*8348SEric.Yu@Sun.COM socklen_t *, boolean_t, struct cred *); 133*8348SEric.Yu@Sun.COM extern int so_getsockname(struct sonode *, struct sockaddr *, 134*8348SEric.Yu@Sun.COM socklen_t *, struct cred *); 135*8348SEric.Yu@Sun.COM extern int so_ioctl(struct sonode *, int, intptr_t, int, struct cred *, 136*8348SEric.Yu@Sun.COM int32_t *); 137*8348SEric.Yu@Sun.COM extern int so_poll(struct sonode *, short, int, short *, 138*8348SEric.Yu@Sun.COM struct pollhead **); 139*8348SEric.Yu@Sun.COM extern int so_sendmsg(struct sonode *, struct nmsghdr *, struct uio *, 140*8348SEric.Yu@Sun.COM struct cred *); 141*8348SEric.Yu@Sun.COM extern int so_sendmblk(struct sonode *, struct nmsghdr *, int, 142*8348SEric.Yu@Sun.COM struct cred *, mblk_t **); 143*8348SEric.Yu@Sun.COM extern int so_recvmsg(struct sonode *, struct nmsghdr *, struct uio *, 144*8348SEric.Yu@Sun.COM struct cred *); 145*8348SEric.Yu@Sun.COM extern int so_shutdown(struct sonode *, int, struct cred *); 146*8348SEric.Yu@Sun.COM extern int so_close(struct sonode *, int, struct cred *); 147*8348SEric.Yu@Sun.COM 148*8348SEric.Yu@Sun.COM extern int so_tpi_fallback(struct sonode *, struct cred *); 149*8348SEric.Yu@Sun.COM 150*8348SEric.Yu@Sun.COM /* Common upcalls */ 151*8348SEric.Yu@Sun.COM extern sock_upper_handle_t so_newconn(sock_upper_handle_t, 152*8348SEric.Yu@Sun.COM sock_lower_handle_t, sock_downcalls_t *, struct cred *, pid_t, 153*8348SEric.Yu@Sun.COM sock_upcalls_t **); 154*8348SEric.Yu@Sun.COM extern void so_set_prop(sock_upper_handle_t, 155*8348SEric.Yu@Sun.COM struct sock_proto_props *); 156*8348SEric.Yu@Sun.COM extern ssize_t so_queue_msg(sock_upper_handle_t, mblk_t *, size_t, int, 157*8348SEric.Yu@Sun.COM int *, boolean_t *); 158*8348SEric.Yu@Sun.COM extern void so_signal_oob(sock_upper_handle_t, ssize_t); 159*8348SEric.Yu@Sun.COM 160*8348SEric.Yu@Sun.COM extern void so_connected(sock_upper_handle_t, sock_connid_t, struct cred *, 161*8348SEric.Yu@Sun.COM pid_t); 162*8348SEric.Yu@Sun.COM extern int so_disconnected(sock_upper_handle_t, sock_connid_t, int); 163*8348SEric.Yu@Sun.COM extern void so_txq_full(sock_upper_handle_t, boolean_t); 164*8348SEric.Yu@Sun.COM extern void so_opctl(sock_upper_handle_t, sock_opctl_action_t, uintptr_t); 165*8348SEric.Yu@Sun.COM /* Common misc. functions */ 166*8348SEric.Yu@Sun.COM 167*8348SEric.Yu@Sun.COM /* accept queue */ 168*8348SEric.Yu@Sun.COM extern int so_acceptq_enqueue(struct sonode *, struct sonode *); 169*8348SEric.Yu@Sun.COM extern int so_acceptq_enqueue_locked(struct sonode *, struct sonode *); 170*8348SEric.Yu@Sun.COM extern int so_acceptq_dequeue(struct sonode *, boolean_t, 171*8348SEric.Yu@Sun.COM struct sonode **); 172*8348SEric.Yu@Sun.COM extern void so_acceptq_flush(struct sonode *); 173*8348SEric.Yu@Sun.COM 174*8348SEric.Yu@Sun.COM /* connect */ 175*8348SEric.Yu@Sun.COM extern int so_wait_connected(struct sonode *, boolean_t, sock_connid_t); 176*8348SEric.Yu@Sun.COM 177*8348SEric.Yu@Sun.COM /* send */ 178*8348SEric.Yu@Sun.COM extern int so_snd_wait_qnotfull(struct sonode *, boolean_t); 179*8348SEric.Yu@Sun.COM extern void so_snd_qfull(struct sonode *so); 180*8348SEric.Yu@Sun.COM extern void so_snd_qnotfull(struct sonode *so); 181*8348SEric.Yu@Sun.COM 182*8348SEric.Yu@Sun.COM extern int socket_chgpgrp(struct sonode *, pid_t); 183*8348SEric.Yu@Sun.COM extern void socket_sendsig(struct sonode *, int); 184*8348SEric.Yu@Sun.COM extern int so_dequeue_msg(struct sonode *, mblk_t **, struct uio *, 185*8348SEric.Yu@Sun.COM rval_t *, int); 186*8348SEric.Yu@Sun.COM extern void so_enqueue_msg(struct sonode *, mblk_t *, size_t); 187*8348SEric.Yu@Sun.COM 188*8348SEric.Yu@Sun.COM extern mblk_t *socopyinuio(uio_t *, ssize_t, size_t, ssize_t, size_t, int *); 189*8348SEric.Yu@Sun.COM extern mblk_t *socopyoutuio(mblk_t *, struct uio *, ssize_t, int *); 190*8348SEric.Yu@Sun.COM 191*8348SEric.Yu@Sun.COM extern boolean_t somsghasdata(mblk_t *); 192*8348SEric.Yu@Sun.COM extern void so_rcv_flush(struct sonode *); 193*8348SEric.Yu@Sun.COM extern int sorecvoob(struct sonode *, struct nmsghdr *, struct uio *, 194*8348SEric.Yu@Sun.COM int, boolean_t); 195*8348SEric.Yu@Sun.COM 196*8348SEric.Yu@Sun.COM extern void so_timer_callback(void *); 197*8348SEric.Yu@Sun.COM 198*8348SEric.Yu@Sun.COM extern struct sonode *socket_sonode_create(struct sockparams *, int, int, int, 199*8348SEric.Yu@Sun.COM int, int, int *, struct cred *); 200*8348SEric.Yu@Sun.COM 201*8348SEric.Yu@Sun.COM extern void socket_sonode_destroy(struct sonode *); 202*8348SEric.Yu@Sun.COM extern int socket_init_common(struct sonode *, struct sonode *, int flags, 203*8348SEric.Yu@Sun.COM struct cred *); 204*8348SEric.Yu@Sun.COM extern int socket_getopt_common(struct sonode *, int, int, void *, socklen_t *); 205*8348SEric.Yu@Sun.COM extern int socket_ioctl_common(struct sonode *, int, intptr_t, int, 206*8348SEric.Yu@Sun.COM struct cred *, int32_t *); 207*8348SEric.Yu@Sun.COM extern int socket_strioc_common(struct sonode *, int, intptr_t, int, 208*8348SEric.Yu@Sun.COM struct cred *, int32_t *); 209*8348SEric.Yu@Sun.COM 210*8348SEric.Yu@Sun.COM extern int so_zcopy_wait(struct sonode *); 211*8348SEric.Yu@Sun.COM extern int so_get_mod_version(struct sockparams *); 212*8348SEric.Yu@Sun.COM 213*8348SEric.Yu@Sun.COM /* Notification functions */ 214*8348SEric.Yu@Sun.COM extern void so_notify_connected(struct sonode *); 215*8348SEric.Yu@Sun.COM extern void so_notify_disconnecting(struct sonode *); 216*8348SEric.Yu@Sun.COM extern void so_notify_disconnected(struct sonode *, int); 217*8348SEric.Yu@Sun.COM extern void so_notify_writable(struct sonode *); 218*8348SEric.Yu@Sun.COM extern void so_notify_data(struct sonode *, size_t); 219*8348SEric.Yu@Sun.COM extern void so_notify_oobsig(struct sonode *); 220*8348SEric.Yu@Sun.COM extern void so_notify_oobdata(struct sonode *, boolean_t); 221*8348SEric.Yu@Sun.COM extern void so_notify_eof(struct sonode *); 222*8348SEric.Yu@Sun.COM extern void so_notify_newconn(struct sonode *); 223*8348SEric.Yu@Sun.COM extern void so_notify_shutdown(struct sonode *); 224*8348SEric.Yu@Sun.COM extern void so_notify_error(struct sonode *); 225*8348SEric.Yu@Sun.COM 226*8348SEric.Yu@Sun.COM /* Common sonode functions */ 227*8348SEric.Yu@Sun.COM extern int sonode_constructor(void *, void *, int); 228*8348SEric.Yu@Sun.COM extern void sonode_destructor(void *, void *); 229*8348SEric.Yu@Sun.COM extern void sonode_init(struct sonode *, struct sockparams *, 230*8348SEric.Yu@Sun.COM int, int, int, sonodeops_t *); 231*8348SEric.Yu@Sun.COM extern void sonode_fini(struct sonode *); 232*8348SEric.Yu@Sun.COM 233*8348SEric.Yu@Sun.COM /* 234*8348SEric.Yu@Sun.COM * Event flags to socket_sendsig(). 235*8348SEric.Yu@Sun.COM */ 236*8348SEric.Yu@Sun.COM #define SOCKETSIG_WRITE 0x1 237*8348SEric.Yu@Sun.COM #define SOCKETSIG_READ 0x2 238*8348SEric.Yu@Sun.COM #define SOCKETSIG_URG 0x4 239*8348SEric.Yu@Sun.COM 240*8348SEric.Yu@Sun.COM extern sonodeops_t so_sonodeops; 241*8348SEric.Yu@Sun.COM extern sock_upcalls_t so_upcalls; 242*8348SEric.Yu@Sun.COM 243*8348SEric.Yu@Sun.COM #ifdef __cplusplus 244*8348SEric.Yu@Sun.COM } 245*8348SEric.Yu@Sun.COM #endif 246*8348SEric.Yu@Sun.COM #endif /* _SOCKCOMMON_H_ */ 247