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