4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
26 #ifndef _SOCKCOMMON_H_
27 #define _SOCKCOMMON_H_
33 #include <sys/filio.h>
34 #include <sys/socket_proto.h>
38 extern kmem_cache_t
*socket_cache
;
41 * Socket access functions
43 * The following functions should only be used by sockfs, and are common
44 * functions that can be used both by kernel sockets (i.e., no file
45 * descriptors should ever be expected, or created), and to implement
46 * the socket system calls.
48 extern struct sonode
*socket_create(int, int, int, char *, char *, int,
49 struct cred
*, int *);
50 extern struct sonode
*socket_newconn(struct sonode
*, sock_lower_handle_t
,
51 sock_downcalls_t
*, int, int *);
52 extern int socket_bind(struct sonode
*, struct sockaddr
*, socklen_t
, int,
54 extern int socket_accept(struct sonode
*, int, struct cred
*, struct sonode
**);
55 extern int socket_listen(struct sonode
*, int, struct cred
*);
56 extern int socket_connect(struct sonode
*, struct sockaddr
*,
57 socklen_t
, int, int, struct cred
*);
58 extern int socket_getpeername(struct sonode
*, struct sockaddr
*, socklen_t
*,
59 boolean_t
, struct cred
*);
60 extern int socket_getsockname(struct sonode
*, struct sockaddr
*, socklen_t
*,
62 extern int socket_shutdown(struct sonode
*, int, struct cred
*);
63 extern int socket_getsockopt(struct sonode
*, int, int, void *, socklen_t
*,
65 extern int socket_setsockopt(struct sonode
*, int, int, const void *,
66 socklen_t
, struct cred
*);
67 extern int socket_recvmsg(struct sonode
*, struct msghdr
*, struct uio
*,
69 extern int socket_sendmsg(struct sonode
*, struct msghdr
*, struct uio
*,
71 extern int socket_sendmblk(struct sonode
*, struct msghdr
*, int,
72 struct cred
*, mblk_t
**);
73 extern int socket_ioctl(struct sonode
*, int, intptr_t, int, struct cred
*,
75 extern int socket_poll(struct sonode
*, short, int, short *,
77 extern int socket_close(struct sonode
*, int, struct cred
*);
78 extern void socket_destroy(struct sonode
*);
81 * Cancel the socket push timer.
83 #define SOCKET_TIMER_CANCEL(so) { \
86 ASSERT(MUTEX_HELD(&(so)->so_lock)); \
87 if ((so)->so_rcv_timer_tid != 0) { \
88 tid = (so)->so_rcv_timer_tid; \
89 (so)->so_rcv_timer_tid = 0; \
90 mutex_exit(&(so)->so_lock); \
92 (void) untimeout(tid); \
94 mutex_enter(&(so)->so_lock); \
98 #define SOCKET_TIMER_START(so) { \
99 ASSERT(MUTEX_HELD(&(so)->so_lock)); \
100 if ((so)->so_rcv_timer_interval != SOCKET_NO_RCVTIMER) { \
101 (so)->so_rcv_timer_tid = timeout(so_timer_callback, \
102 (so), MSEC_TO_TICK((so)->so_rcv_timer_interval)); \
106 /* Common sonode ops not support */
107 extern int so_listen_notsupp(struct sonode
*, int, struct cred
*);
108 extern int so_accept_notsupp(struct sonode
*, int, struct cred
*,
110 extern int so_getpeername_notsupp(struct sonode
*, struct sockaddr
*,
111 socklen_t
*, boolean_t
, struct cred
*);
112 extern int so_shutdown_notsupp(struct sonode
*, int, struct cred
*);
113 extern int so_sendmblk_notsupp(struct sonode
*, struct msghdr
*,
114 int, struct cred
*, mblk_t
**);
116 /* Common sonode ops */
117 extern int so_init(struct sonode
*, struct sonode
*, struct cred
*, int);
118 extern int so_accept(struct sonode
*, int, struct cred
*, struct sonode
**);
119 extern int so_bind(struct sonode
*, struct sockaddr
*, socklen_t
, int,
121 extern int so_listen(struct sonode
*, int, struct cred
*);
122 extern int so_connect(struct sonode
*, struct sockaddr
*,
123 socklen_t
, int, int, struct cred
*);
124 extern int so_getsockopt(struct sonode
*, int, int, void *,
125 socklen_t
*, int, struct cred
*);
126 extern int so_setsockopt(struct sonode
*, int, int, const void *,
127 socklen_t
, struct cred
*);
128 extern int so_getpeername(struct sonode
*, struct sockaddr
*,
129 socklen_t
*, boolean_t
, struct cred
*);
130 extern int so_getsockname(struct sonode
*, struct sockaddr
*,
131 socklen_t
*, struct cred
*);
132 extern int so_ioctl(struct sonode
*, int, intptr_t, int, struct cred
*,
134 extern int so_poll(struct sonode
*, short, int, short *,
136 extern int so_sendmsg(struct sonode
*, struct msghdr
*, struct uio
*,
138 extern int so_sendmblk_impl(struct sonode
*, struct msghdr
*, int,
139 struct cred
*, mblk_t
**, struct sof_instance
*, boolean_t
);
140 extern int so_sendmblk(struct sonode
*, struct msghdr
*, int,
141 struct cred
*, mblk_t
**);
142 extern int so_recvmsg(struct sonode
*, struct msghdr
*, struct uio
*,
144 extern int so_shutdown(struct sonode
*, int, struct cred
*);
145 extern int so_close(struct sonode
*, int, struct cred
*);
147 extern int so_tpi_fallback(struct sonode
*, struct cred
*);
150 extern sock_upper_handle_t
so_newconn(sock_upper_handle_t
,
151 sock_lower_handle_t
, sock_downcalls_t
*, struct cred
*, pid_t
,
153 extern void so_set_prop(sock_upper_handle_t
,
154 struct sock_proto_props
*);
155 extern ssize_t
so_queue_msg(sock_upper_handle_t
, mblk_t
*, size_t, int,
157 extern ssize_t
so_queue_msg_impl(struct sonode
*, mblk_t
*, size_t, int,
158 int *, boolean_t
*, struct sof_instance
*);
159 extern void so_signal_oob(sock_upper_handle_t
, ssize_t
);
161 extern void so_connected(sock_upper_handle_t
, sock_connid_t
, struct cred
*,
163 extern int so_disconnected(sock_upper_handle_t
, sock_connid_t
, int);
164 extern void so_txq_full(sock_upper_handle_t
, boolean_t
);
165 extern void so_opctl(sock_upper_handle_t
, sock_opctl_action_t
, uintptr_t);
166 /* Common misc. functions */
169 extern int so_acceptq_enqueue(struct sonode
*, struct sonode
*);
170 extern int so_acceptq_enqueue_locked(struct sonode
*, struct sonode
*);
171 extern int so_acceptq_dequeue(struct sonode
*, boolean_t
,
173 extern void so_acceptq_flush(struct sonode
*, boolean_t
);
176 extern int so_wait_connected(struct sonode
*, boolean_t
, sock_connid_t
);
179 extern int so_snd_wait_qnotfull(struct sonode
*, boolean_t
);
180 extern void so_snd_qfull(struct sonode
*so
);
181 extern void so_snd_qnotfull(struct sonode
*so
);
183 extern int socket_chgpgrp(struct sonode
*, pid_t
);
184 extern void socket_sendsig(struct sonode
*, int);
185 extern int so_dequeue_msg(struct sonode
*, mblk_t
**, struct uio
*,
187 extern void so_enqueue_msg(struct sonode
*, mblk_t
*, size_t);
188 extern void so_process_new_message(struct sonode
*, mblk_t
*, mblk_t
*);
189 extern boolean_t
so_check_flow_control(struct sonode
*);
191 extern mblk_t
*socopyinuio(uio_t
*, ssize_t
, size_t, ssize_t
, size_t, int *);
192 extern mblk_t
*socopyoutuio(mblk_t
*, struct uio
*, ssize_t
, int *);
194 extern boolean_t
somsghasdata(mblk_t
*);
195 extern void so_rcv_flush(struct sonode
*);
196 extern int sorecvoob(struct sonode
*, struct msghdr
*, struct uio
*,
199 extern void so_timer_callback(void *);
201 extern struct sonode
*socket_sonode_create(struct sockparams
*, int, int, int,
202 int, int *, struct cred
*);
204 extern void socket_sonode_destroy(struct sonode
*);
205 extern int socket_init_common(struct sonode
*, struct sonode
*, int flags
,
207 extern int socket_getopt_common(struct sonode
*, int, int, void *, socklen_t
*,
209 extern int socket_ioctl_common(struct sonode
*, int, intptr_t, int,
210 struct cred
*, int32_t *);
211 extern int socket_strioc_common(struct sonode
*, int, intptr_t, int,
212 struct cred
*, int32_t *);
214 extern int so_zcopy_wait(struct sonode
*);
215 extern int so_get_mod_version(struct sockparams
*);
217 /* Notification functions */
218 extern void so_notify_connected(struct sonode
*);
219 extern void so_notify_disconnecting(struct sonode
*);
220 extern void so_notify_disconnected(struct sonode
*, boolean_t
, int);
221 extern void so_notify_writable(struct sonode
*);
222 extern void so_notify_data(struct sonode
*, size_t);
223 extern void so_notify_oobsig(struct sonode
*);
224 extern void so_notify_oobdata(struct sonode
*, boolean_t
);
225 extern void so_notify_eof(struct sonode
*);
226 extern void so_notify_newconn(struct sonode
*);
227 extern void so_notify_shutdown(struct sonode
*);
228 extern void so_notify_error(struct sonode
*);
230 /* Common sonode functions */
231 extern int sonode_constructor(void *, void *, int);
232 extern void sonode_destructor(void *, void *);
233 extern void sonode_init(struct sonode
*, struct sockparams
*,
234 int, int, int, sonodeops_t
*);
235 extern void sonode_fini(struct sonode
*);
238 * Event flags to socket_sendsig().
240 #define SOCKETSIG_WRITE 0x1
241 #define SOCKETSIG_READ 0x2
242 #define SOCKETSIG_URG 0x4
244 extern sonodeops_t so_sonodeops
;
245 extern sock_upcalls_t so_upcalls
;
250 #endif /* _SOCKCOMMON_H_ */