1bca1dae6587a640359abee04337c0463b0a3893tuexen/*- 2bca1dae6587a640359abee04337c0463b0a3893tuexen * Copyright (c) 1982, 1986, 1990, 1993 3bca1dae6587a640359abee04337c0463b0a3893tuexen * The Regents of the University of California. All rights reserved. 4bca1dae6587a640359abee04337c0463b0a3893tuexen * 5bca1dae6587a640359abee04337c0463b0a3893tuexen * Redistribution and use in source and binary forms, with or without 6bca1dae6587a640359abee04337c0463b0a3893tuexen * modification, are permitted provided that the following conditions 7bca1dae6587a640359abee04337c0463b0a3893tuexen * are met: 8bca1dae6587a640359abee04337c0463b0a3893tuexen * 1. Redistributions of source code must retain the above copyright 9bca1dae6587a640359abee04337c0463b0a3893tuexen * notice, this list of conditions and the following disclaimer. 10bca1dae6587a640359abee04337c0463b0a3893tuexen * 2. Redistributions in binary form must reproduce the above copyright 11bca1dae6587a640359abee04337c0463b0a3893tuexen * notice, this list of conditions and the following disclaimer in the 12bca1dae6587a640359abee04337c0463b0a3893tuexen * documentation and/or other materials provided with the distribution. 13bca1dae6587a640359abee04337c0463b0a3893tuexen * 4. Neither the name of the University nor the names of its contributors 14bca1dae6587a640359abee04337c0463b0a3893tuexen * may be used to endorse or promote products derived from this software 15bca1dae6587a640359abee04337c0463b0a3893tuexen * without specific prior written permission. 16bca1dae6587a640359abee04337c0463b0a3893tuexen * 17bca1dae6587a640359abee04337c0463b0a3893tuexen * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18bca1dae6587a640359abee04337c0463b0a3893tuexen * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19bca1dae6587a640359abee04337c0463b0a3893tuexen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20bca1dae6587a640359abee04337c0463b0a3893tuexen * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21bca1dae6587a640359abee04337c0463b0a3893tuexen * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22bca1dae6587a640359abee04337c0463b0a3893tuexen * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23bca1dae6587a640359abee04337c0463b0a3893tuexen * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24bca1dae6587a640359abee04337c0463b0a3893tuexen * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25bca1dae6587a640359abee04337c0463b0a3893tuexen * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26bca1dae6587a640359abee04337c0463b0a3893tuexen * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27bca1dae6587a640359abee04337c0463b0a3893tuexen * SUCH DAMAGE. 28bca1dae6587a640359abee04337c0463b0a3893tuexen * 29bca1dae6587a640359abee04337c0463b0a3893tuexen */ 30bca1dae6587a640359abee04337c0463b0a3893tuexen 31bca1dae6587a640359abee04337c0463b0a3893tuexen/* __Userspace__ version of <sys/socketvar.h> goes here.*/ 32bca1dae6587a640359abee04337c0463b0a3893tuexen 33829d1a776d2fc5124c1701da541079d0e17da6b3tuexen#ifndef _USER_SOCKETVAR_H_ 34829d1a776d2fc5124c1701da541079d0e17da6b3tuexen#define _USER_SOCKETVAR_H_ 35bca1dae6587a640359abee04337c0463b0a3893tuexen 363ab67fee2e89498e06d10f12109b818bdc49ddc3tuexen#if defined(__Userspace_os_Darwin) 373ab67fee2e89498e06d10f12109b818bdc49ddc3tuexen#include <sys/types.h> 383ab67fee2e89498e06d10f12109b818bdc49ddc3tuexen#include <unistd.h> 393ab67fee2e89498e06d10f12109b818bdc49ddc3tuexen#endif 403ab67fee2e89498e06d10f12109b818bdc49ddc3tuexen 41bca1dae6587a640359abee04337c0463b0a3893tuexen/* #include <sys/selinfo.h> */ /*__Userspace__ alternative?*/ /* for struct selinfo */ 42bca1dae6587a640359abee04337c0463b0a3893tuexen/* #include <sys/_lock.h> was 0 byte file */ 43bca1dae6587a640359abee04337c0463b0a3893tuexen/* #include <sys/_mutex.h> was 0 byte file */ 44bca1dae6587a640359abee04337c0463b0a3893tuexen/* #include <sys/_sx.h> */ /*__Userspace__ alternative?*/ 4522a33a1debfe70529be4aa018a2912bfe5dcd8dat#if !defined(__Userspace_os_DragonFly) && !defined(__Userspace_os_FreeBSD) && !defined(__Userspace_os_NetBSD) && !defined(__Userspace_os_Windows) 46cd78deb883f0edfcdcde56ea7a2f972afc3bfbcdtuexen#include <sys/uio.h> 4713d353b983c3032a6b374eb514084878774efb98tuexen#endif 48bca1dae6587a640359abee04337c0463b0a3893tuexen#define SOCK_MAXADDRLEN 255 49bca1dae6587a640359abee04337c0463b0a3893tuexen#if !defined(MSG_NOTIFICATION) 50c7108437de5af4d0b9f9a24979710b39197ec6cetuexen#define MSG_NOTIFICATION 0x2000 /* SCTP notification */ 51bca1dae6587a640359abee04337c0463b0a3893tuexen#endif 52907b9e7d7c75f02c3d1f6c70016127990e8fe648t#define SCTP_SO_LINGER 0x0001 53907b9e7d7c75f02c3d1f6c70016127990e8fe648t#define SCTP_SO_ACCEPTCONN 0x0002 54c7108437de5af4d0b9f9a24979710b39197ec6cetuexen#define SS_CANTRCVMORE 0x020 55bca1dae6587a640359abee04337c0463b0a3893tuexen#define SS_CANTSENDMORE 0x010 56bca1dae6587a640359abee04337c0463b0a3893tuexen 57ea5ff51a35e8a387ea45cd11101c102ce01115c7t#if defined(__Userspace_os_Darwin) || defined(__Userspace_os_DragonFly) || defined(__Userspace_os_FreeBSD) || defined(__Userspace_os_OpenBSD) || defined (__Userspace_os_Windows) 58bca1dae6587a640359abee04337c0463b0a3893tuexen#define UIO_MAXIOV 1024 59bca1dae6587a640359abee04337c0463b0a3893tuexen#define ERESTART (-1) 60bca1dae6587a640359abee04337c0463b0a3893tuexen#endif 61bca1dae6587a640359abee04337c0463b0a3893tuexen 62ea5ff51a35e8a387ea45cd11101c102ce01115c7t#if !defined(__Userspace_os_Darwin) && !defined(__Userspace_os_NetBSD) && !defined(__Userspace_os_OpenBSD) 63bca1dae6587a640359abee04337c0463b0a3893tuexenenum uio_rw { UIO_READ, UIO_WRITE }; 643ab67fee2e89498e06d10f12109b818bdc49ddc3tuexen#endif 65bca1dae6587a640359abee04337c0463b0a3893tuexen 6622a33a1debfe70529be4aa018a2912bfe5dcd8dat#if !defined(__Userspace_os_NetBSD) && !defined(__Userspace_os_OpenBSD) 67bca1dae6587a640359abee04337c0463b0a3893tuexen/* Segment flag values. */ 68bca1dae6587a640359abee04337c0463b0a3893tuexenenum uio_seg { 69bca1dae6587a640359abee04337c0463b0a3893tuexen UIO_USERSPACE, /* from user data space */ 701d4c1f0ed4280f04149ea33f8133a2d0f5bae42ct UIO_SYSSPACE /* from system space */ 71bca1dae6587a640359abee04337c0463b0a3893tuexen}; 729dfb98267721c0a55822dc47b244cbdf435bb30et#endif 73bca1dae6587a640359abee04337c0463b0a3893tuexen 74bca1dae6587a640359abee04337c0463b0a3893tuexenstruct proc { 75bca1dae6587a640359abee04337c0463b0a3893tuexen int stub; /* struct proc is a dummy for __Userspace__ */ 76bca1dae6587a640359abee04337c0463b0a3893tuexen}; 77bca1dae6587a640359abee04337c0463b0a3893tuexen 78a804fa53b20093a975fc501f62a08313110328cetuexenMALLOC_DECLARE(M_ACCF); 79a804fa53b20093a975fc501f62a08313110328cetuexenMALLOC_DECLARE(M_PCB); 80a804fa53b20093a975fc501f62a08313110328cetuexenMALLOC_DECLARE(M_SONAME); 81bca1dae6587a640359abee04337c0463b0a3893tuexen 82bca1dae6587a640359abee04337c0463b0a3893tuexen/* __Userspace__ Are these all the fields we need? 83bca1dae6587a640359abee04337c0463b0a3893tuexen * Removing struct thread *uio_td; owner field 84bca1dae6587a640359abee04337c0463b0a3893tuexen*/ 85bca1dae6587a640359abee04337c0463b0a3893tuexenstruct uio { 86bca1dae6587a640359abee04337c0463b0a3893tuexen struct iovec *uio_iov; /* scatter/gather list */ 87bca1dae6587a640359abee04337c0463b0a3893tuexen int uio_iovcnt; /* length of scatter/gather list */ 88bca1dae6587a640359abee04337c0463b0a3893tuexen off_t uio_offset; /* offset in target object */ 89bca1dae6587a640359abee04337c0463b0a3893tuexen int uio_resid; /* remaining bytes to process */ 90bca1dae6587a640359abee04337c0463b0a3893tuexen enum uio_seg uio_segflg; /* address space */ 91bca1dae6587a640359abee04337c0463b0a3893tuexen enum uio_rw uio_rw; /* operation */ 92bca1dae6587a640359abee04337c0463b0a3893tuexen}; 93bca1dae6587a640359abee04337c0463b0a3893tuexen 94bca1dae6587a640359abee04337c0463b0a3893tuexen 95bca1dae6587a640359abee04337c0463b0a3893tuexen/* __Userspace__ */ 96bca1dae6587a640359abee04337c0463b0a3893tuexen 97bca1dae6587a640359abee04337c0463b0a3893tuexen/* 98bca1dae6587a640359abee04337c0463b0a3893tuexen * Kernel structure per socket. 99bca1dae6587a640359abee04337c0463b0a3893tuexen * Contains send and receive buffer queues, 100bca1dae6587a640359abee04337c0463b0a3893tuexen * handle on protocol and pointer to protocol 101bca1dae6587a640359abee04337c0463b0a3893tuexen * private data and error information. 102bca1dae6587a640359abee04337c0463b0a3893tuexen */ 103e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#if defined (__Userspace_os_Windows) 104e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define AF_ROUTE 17 105e56b472f55ba49fa71e57f488d1ac801953e417ftuexentypedef __int32 pid_t; 106e56b472f55ba49fa71e57f488d1ac801953e417ftuexentypedef unsigned __int32 uid_t; 107e56b472f55ba49fa71e57f488d1ac801953e417ftuexenenum sigType { 108e56b472f55ba49fa71e57f488d1ac801953e417ftuexen SIGNAL = 0, 109e56b472f55ba49fa71e57f488d1ac801953e417ftuexen BROADCAST = 1, 110e56b472f55ba49fa71e57f488d1ac801953e417ftuexen MAX_EVENTS = 2 111e56b472f55ba49fa71e57f488d1ac801953e417ftuexen}; 112e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#endif 113bca1dae6587a640359abee04337c0463b0a3893tuexen 114bca1dae6587a640359abee04337c0463b0a3893tuexen/*- 115bca1dae6587a640359abee04337c0463b0a3893tuexen * Locking key to struct socket: 116bca1dae6587a640359abee04337c0463b0a3893tuexen * (a) constant after allocation, no locking required. 117bca1dae6587a640359abee04337c0463b0a3893tuexen * (b) locked by SOCK_LOCK(so). 118bca1dae6587a640359abee04337c0463b0a3893tuexen * (c) locked by SOCKBUF_LOCK(&so->so_rcv). 119bca1dae6587a640359abee04337c0463b0a3893tuexen * (d) locked by SOCKBUF_LOCK(&so->so_snd). 120bca1dae6587a640359abee04337c0463b0a3893tuexen * (e) locked by ACCEPT_LOCK(). 121bca1dae6587a640359abee04337c0463b0a3893tuexen * (f) not locked since integer reads/writes are atomic. 122bca1dae6587a640359abee04337c0463b0a3893tuexen * (g) used only as a sleep/wakeup address, no value. 123bca1dae6587a640359abee04337c0463b0a3893tuexen * (h) locked by global mutex so_global_mtx. 124bca1dae6587a640359abee04337c0463b0a3893tuexen */ 125bca1dae6587a640359abee04337c0463b0a3893tuexenstruct socket { 126bca1dae6587a640359abee04337c0463b0a3893tuexen int so_count; /* (b) reference count */ 127bca1dae6587a640359abee04337c0463b0a3893tuexen short so_type; /* (a) generic type, see socket.h */ 128bca1dae6587a640359abee04337c0463b0a3893tuexen short so_options; /* from socket call, see socket.h */ 129bca1dae6587a640359abee04337c0463b0a3893tuexen short so_linger; /* time to linger while closing */ 130bca1dae6587a640359abee04337c0463b0a3893tuexen short so_state; /* (b) internal state flags SS_* */ 131bca1dae6587a640359abee04337c0463b0a3893tuexen int so_qstate; /* (e) internal state flags SQ_* */ 132bca1dae6587a640359abee04337c0463b0a3893tuexen void *so_pcb; /* protocol control block */ 1330d570ca57391cf9e8bfcbf88be8994c56aadbdf4tuexen int so_dom; 134bca1dae6587a640359abee04337c0463b0a3893tuexen/* 135bca1dae6587a640359abee04337c0463b0a3893tuexen * Variables for connection queuing. 136bca1dae6587a640359abee04337c0463b0a3893tuexen * Socket where accepts occur is so_head in all subsidiary sockets. 137bca1dae6587a640359abee04337c0463b0a3893tuexen * If so_head is 0, socket is not related to an accept. 138bca1dae6587a640359abee04337c0463b0a3893tuexen * For head socket so_incomp queues partially completed connections, 139bca1dae6587a640359abee04337c0463b0a3893tuexen * while so_comp is a queue of connections ready to be accepted. 140bca1dae6587a640359abee04337c0463b0a3893tuexen * If a connection is aborted and it has so_head set, then 141bca1dae6587a640359abee04337c0463b0a3893tuexen * it has to be pulled out of either so_incomp or so_comp. 142bca1dae6587a640359abee04337c0463b0a3893tuexen * We allow connections to queue up based on current queue lengths 143bca1dae6587a640359abee04337c0463b0a3893tuexen * and limit on number of queued connections for this socket. 144bca1dae6587a640359abee04337c0463b0a3893tuexen */ 145bca1dae6587a640359abee04337c0463b0a3893tuexen struct socket *so_head; /* (e) back pointer to listen socket */ 146bca1dae6587a640359abee04337c0463b0a3893tuexen TAILQ_HEAD(, socket) so_incomp; /* (e) queue of partial unaccepted connections */ 147bca1dae6587a640359abee04337c0463b0a3893tuexen TAILQ_HEAD(, socket) so_comp; /* (e) queue of complete unaccepted connections */ 148bca1dae6587a640359abee04337c0463b0a3893tuexen TAILQ_ENTRY(socket) so_list; /* (e) list of unaccepted connections */ 149bca1dae6587a640359abee04337c0463b0a3893tuexen u_short so_qlen; /* (e) number of unaccepted connections */ 150bca1dae6587a640359abee04337c0463b0a3893tuexen u_short so_incqlen; /* (e) number of unaccepted incomplete 151bca1dae6587a640359abee04337c0463b0a3893tuexen connections */ 152bca1dae6587a640359abee04337c0463b0a3893tuexen u_short so_qlimit; /* (e) max number queued connections */ 153bca1dae6587a640359abee04337c0463b0a3893tuexen short so_timeo; /* (g) connection timeout */ 154e56b472f55ba49fa71e57f488d1ac801953e417ftuexen userland_cond_t timeo_cond; /* timeo_cond condition variable being used in wakeup */ 155bca1dae6587a640359abee04337c0463b0a3893tuexen 156e56b472f55ba49fa71e57f488d1ac801953e417ftuexen u_short so_error; /* (f) error affecting connection */ 157bca1dae6587a640359abee04337c0463b0a3893tuexen struct sigio *so_sigio; /* [sg] information for async I/O or 158bca1dae6587a640359abee04337c0463b0a3893tuexen out of band data (SIGURG) */ 159bca1dae6587a640359abee04337c0463b0a3893tuexen u_long so_oobmark; /* (c) chars to oob mark */ 160bca1dae6587a640359abee04337c0463b0a3893tuexen TAILQ_HEAD(, aiocblist) so_aiojobq; /* AIO ops waiting on socket */ 161bca1dae6587a640359abee04337c0463b0a3893tuexen/* 162bca1dae6587a640359abee04337c0463b0a3893tuexen * Variables for socket buffering. 163bca1dae6587a640359abee04337c0463b0a3893tuexen */ 164bca1dae6587a640359abee04337c0463b0a3893tuexen struct sockbuf { 165e56b472f55ba49fa71e57f488d1ac801953e417ftuexen /* __Userspace__ Many of these fields may 166e56b472f55ba49fa71e57f488d1ac801953e417ftuexen * not be required for the sctp stack. 167e56b472f55ba49fa71e57f488d1ac801953e417ftuexen * Commenting out the following. 168c7108437de5af4d0b9f9a24979710b39197ec6cetuexen * Including pthread mutex and condition variable to be 169e56b472f55ba49fa71e57f488d1ac801953e417ftuexen * used by sbwait, sorwakeup and sowwakeup. 170e56b472f55ba49fa71e57f488d1ac801953e417ftuexen */ 171e56b472f55ba49fa71e57f488d1ac801953e417ftuexen /* struct selinfo sb_sel;*/ /* process selecting read/write */ 172e56b472f55ba49fa71e57f488d1ac801953e417ftuexen /* struct mtx sb_mtx;*/ /* sockbuf lock */ 173e56b472f55ba49fa71e57f488d1ac801953e417ftuexen /* struct sx sb_sx;*/ /* prevent I/O interlacing */ 174e56b472f55ba49fa71e57f488d1ac801953e417ftuexen userland_cond_t sb_cond; /* sockbuf condition variable */ 175e56b472f55ba49fa71e57f488d1ac801953e417ftuexen userland_mutex_t sb_mtx; /* sockbuf lock associated with sb_cond */ 176bca1dae6587a640359abee04337c0463b0a3893tuexen short sb_state; /* (c/d) socket state on sockbuf */ 177bca1dae6587a640359abee04337c0463b0a3893tuexen#define sb_startzero sb_mb 178bca1dae6587a640359abee04337c0463b0a3893tuexen struct mbuf *sb_mb; /* (c/d) the mbuf chain */ 179bca1dae6587a640359abee04337c0463b0a3893tuexen struct mbuf *sb_mbtail; /* (c/d) the last mbuf in the chain */ 180bca1dae6587a640359abee04337c0463b0a3893tuexen struct mbuf *sb_lastrecord; /* (c/d) first mbuf of last 181bca1dae6587a640359abee04337c0463b0a3893tuexen * record in socket buffer */ 182bca1dae6587a640359abee04337c0463b0a3893tuexen struct mbuf *sb_sndptr; /* (c/d) pointer into mbuf chain */ 183bca1dae6587a640359abee04337c0463b0a3893tuexen u_int sb_sndptroff; /* (c/d) byte offset of ptr into chain */ 184bca1dae6587a640359abee04337c0463b0a3893tuexen u_int sb_cc; /* (c/d) actual chars in buffer */ 185bca1dae6587a640359abee04337c0463b0a3893tuexen u_int sb_hiwat; /* (c/d) max actual char count */ 186bca1dae6587a640359abee04337c0463b0a3893tuexen u_int sb_mbcnt; /* (c/d) chars of mbufs used */ 187bca1dae6587a640359abee04337c0463b0a3893tuexen u_int sb_mbmax; /* (c/d) max chars of mbufs to use */ 188bca1dae6587a640359abee04337c0463b0a3893tuexen u_int sb_ctl; /* (c/d) non-data chars in buffer */ 189bca1dae6587a640359abee04337c0463b0a3893tuexen int sb_lowat; /* (c/d) low water mark */ 190bca1dae6587a640359abee04337c0463b0a3893tuexen int sb_timeo; /* (c/d) timeout for read/write */ 191bca1dae6587a640359abee04337c0463b0a3893tuexen short sb_flags; /* (c/d) flags, see below */ 192bca1dae6587a640359abee04337c0463b0a3893tuexen } so_rcv, so_snd; 193bca1dae6587a640359abee04337c0463b0a3893tuexen/* 194bca1dae6587a640359abee04337c0463b0a3893tuexen * Constants for sb_flags field of struct sockbuf. 195bca1dae6587a640359abee04337c0463b0a3893tuexen */ 196bca1dae6587a640359abee04337c0463b0a3893tuexen#define SB_MAX (256*1024) /* default for max chars in sockbuf */ 197bca1dae6587a640359abee04337c0463b0a3893tuexen#define SB_RAW (64*1024*2) /*Aligning so->so_rcv.sb_hiwat with the receive buffer size of raw socket*/ 198bca1dae6587a640359abee04337c0463b0a3893tuexen/* 199bca1dae6587a640359abee04337c0463b0a3893tuexen * Constants for sb_flags field of struct sockbuf. 200bca1dae6587a640359abee04337c0463b0a3893tuexen */ 201bca1dae6587a640359abee04337c0463b0a3893tuexen#define SB_WAIT 0x04 /* someone is waiting for data/space */ 202bca1dae6587a640359abee04337c0463b0a3893tuexen#define SB_SEL 0x08 /* someone is selecting */ 203bca1dae6587a640359abee04337c0463b0a3893tuexen#define SB_ASYNC 0x10 /* ASYNC I/O, need signals */ 204bca1dae6587a640359abee04337c0463b0a3893tuexen#define SB_UPCALL 0x20 /* someone wants an upcall */ 205bca1dae6587a640359abee04337c0463b0a3893tuexen#define SB_NOINTR 0x40 /* operations not interruptible */ 206bca1dae6587a640359abee04337c0463b0a3893tuexen#define SB_AIO 0x80 /* AIO operations queued */ 207bca1dae6587a640359abee04337c0463b0a3893tuexen#define SB_KNOTE 0x100 /* kernel note attached */ 208bca1dae6587a640359abee04337c0463b0a3893tuexen#define SB_AUTOSIZE 0x800 /* automatically size socket buffer */ 209bca1dae6587a640359abee04337c0463b0a3893tuexen 210bca1dae6587a640359abee04337c0463b0a3893tuexen void (*so_upcall)(struct socket *, void *, int); 211bca1dae6587a640359abee04337c0463b0a3893tuexen void *so_upcallarg; 212bca1dae6587a640359abee04337c0463b0a3893tuexen struct ucred *so_cred; /* (a) user credentials */ 213bca1dae6587a640359abee04337c0463b0a3893tuexen struct label *so_label; /* (b) MAC label for socket */ 214bca1dae6587a640359abee04337c0463b0a3893tuexen struct label *so_peerlabel; /* (b) cached MAC label for peer */ 215bca1dae6587a640359abee04337c0463b0a3893tuexen /* NB: generation count must not be first. */ 216bcfa3d7d4e8813ae20605288d1d6d873705b48c0t uint32_t so_gencnt; /* (h) generation count */ 217bca1dae6587a640359abee04337c0463b0a3893tuexen void *so_emuldata; /* (b) private data for emulators */ 218bca1dae6587a640359abee04337c0463b0a3893tuexen struct so_accf { 219bca1dae6587a640359abee04337c0463b0a3893tuexen struct accept_filter *so_accept_filter; 220bca1dae6587a640359abee04337c0463b0a3893tuexen void *so_accept_filter_arg; /* saved filter args */ 221bca1dae6587a640359abee04337c0463b0a3893tuexen char *so_accept_filter_str; /* saved user args */ 222bca1dae6587a640359abee04337c0463b0a3893tuexen } *so_accf; 223bca1dae6587a640359abee04337c0463b0a3893tuexen}; 224bca1dae6587a640359abee04337c0463b0a3893tuexen 225bca1dae6587a640359abee04337c0463b0a3893tuexen#define SB_EMPTY_FIXUP(sb) do { \ 226bca1dae6587a640359abee04337c0463b0a3893tuexen if ((sb)->sb_mb == NULL) { \ 227bca1dae6587a640359abee04337c0463b0a3893tuexen (sb)->sb_mbtail = NULL; \ 228bca1dae6587a640359abee04337c0463b0a3893tuexen (sb)->sb_lastrecord = NULL; \ 229bca1dae6587a640359abee04337c0463b0a3893tuexen } \ 230bca1dae6587a640359abee04337c0463b0a3893tuexen} while (/*CONSTCOND*/0) 231bca1dae6587a640359abee04337c0463b0a3893tuexen 232bca1dae6587a640359abee04337c0463b0a3893tuexen/* 233bca1dae6587a640359abee04337c0463b0a3893tuexen * Global accept mutex to serialize access to accept queues and 234bca1dae6587a640359abee04337c0463b0a3893tuexen * fields associated with multiple sockets. This allows us to 235bca1dae6587a640359abee04337c0463b0a3893tuexen * avoid defining a lock order between listen and accept sockets 236bca1dae6587a640359abee04337c0463b0a3893tuexen * until such time as it proves to be a good idea. 237bca1dae6587a640359abee04337c0463b0a3893tuexen */ 238cd78deb883f0edfcdcde56ea7a2f972afc3bfbcdtuexen#if defined(__Userspace_os_Windows) 239a4442f35c4ce4ced0642c564879fea90322aec95iruengelerextern userland_mutex_t accept_mtx; 240a4442f35c4ce4ced0642c564879fea90322aec95iruengelerextern userland_cond_t accept_cond; 241c7108437de5af4d0b9f9a24979710b39197ec6cetuexen#define ACCEPT_LOCK_ASSERT() 242e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define ACCEPT_LOCK() do { \ 243e56b472f55ba49fa71e57f488d1ac801953e417ftuexen EnterCriticalSection(&accept_mtx); \ 244e56b472f55ba49fa71e57f488d1ac801953e417ftuexen} while (0) 245e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define ACCEPT_UNLOCK() do { \ 246e56b472f55ba49fa71e57f488d1ac801953e417ftuexen LeaveCriticalSection(&accept_mtx); \ 247e56b472f55ba49fa71e57f488d1ac801953e417ftuexen} while (0) 248e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define ACCEPT_UNLOCK_ASSERT() 249e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#else 250e56b472f55ba49fa71e57f488d1ac801953e417ftuexenextern userland_mutex_t accept_mtx; 251334aac245024f2dd2de46c4b8f3b28e833d88592textern userland_cond_t accept_cond; 252c7108437de5af4d0b9f9a24979710b39197ec6cetuexen#define ACCEPT_LOCK_ASSERT() KASSERT(pthread_mutex_trylock(&accept_mtx) == EBUSY, ("%s: accept_mtx not locked", __func__)) 253e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define ACCEPT_LOCK() (void)pthread_mutex_lock(&accept_mtx) 254e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define ACCEPT_UNLOCK() (void)pthread_mutex_unlock(&accept_mtx) 255c7108437de5af4d0b9f9a24979710b39197ec6cetuexen#define ACCEPT_UNLOCK_ASSERT() do{ \ 256c7108437de5af4d0b9f9a24979710b39197ec6cetuexen KASSERT(pthread_mutex_trylock(&accept_mtx) == 0, ("%s: accept_mtx locked", __func__)); \ 257c7108437de5af4d0b9f9a24979710b39197ec6cetuexen (void)pthread_mutex_unlock(&accept_mtx); \ 258c7108437de5af4d0b9f9a24979710b39197ec6cetuexen} while (0) 259e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#endif 260bca1dae6587a640359abee04337c0463b0a3893tuexen 261bca1dae6587a640359abee04337c0463b0a3893tuexen/* 262bca1dae6587a640359abee04337c0463b0a3893tuexen * Per-socket buffer mutex used to protect most fields in the socket 263bca1dae6587a640359abee04337c0463b0a3893tuexen * buffer. 264bca1dae6587a640359abee04337c0463b0a3893tuexen */ 265e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define SOCKBUF_MTX(_sb) (&(_sb)->sb_mtx) 266e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#if defined (__Userspace_os_Windows) 267e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define SOCKBUF_LOCK_INIT(_sb, _name) \ 268e56b472f55ba49fa71e57f488d1ac801953e417ftuexen InitializeCriticalSection(SOCKBUF_MTX(_sb)) 269e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define SOCKBUF_LOCK_DESTROY(_sb) DeleteCriticalSection(SOCKBUF_MTX(_sb)) 270e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define SOCKBUF_COND_INIT(_sb) InitializeConditionVariable((&(_sb)->sb_cond)) 2716c804e779f60cdeb134e6a35149e80955286768et#define SOCKBUF_COND_DESTROY(_sb) DeleteConditionVariable((&(_sb)->sb_cond)) 272e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define SOCK_COND_INIT(_so) InitializeConditionVariable((&(_so)->timeo_cond)) 2736c804e779f60cdeb134e6a35149e80955286768et#define SOCK_COND_DESTROY(_so) DeleteConditionVariable((&(_so)->timeo_cond)) 274e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define SOCK_COND(_so) (&(_so)->timeo_cond) 275e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#else 276e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define SOCKBUF_LOCK_INIT(_sb, _name) \ 277bca1dae6587a640359abee04337c0463b0a3893tuexen pthread_mutex_init(SOCKBUF_MTX(_sb), NULL) 278e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define SOCKBUF_LOCK_DESTROY(_sb) pthread_mutex_destroy(SOCKBUF_MTX(_sb)) 279e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define SOCKBUF_COND_INIT(_sb) pthread_cond_init((&(_sb)->sb_cond), NULL) 280e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define SOCKBUF_COND_DESTROY(_sb) pthread_cond_destroy((&(_sb)->sb_cond)) 281e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define SOCK_COND_INIT(_so) pthread_cond_init((&(_so)->timeo_cond), NULL) 282e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define SOCK_COND_DESTROY(_so) pthread_cond_destroy((&(_so)->timeo_cond)) 283e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#define SOCK_COND(_so) (&(_so)->timeo_cond) 284e56b472f55ba49fa71e57f488d1ac801953e417ftuexen#endif 285bca1dae6587a640359abee04337c0463b0a3893tuexen/*__Userspace__ SOCKBUF_LOCK(_sb) is now defined in netinet/sctp_process_lock.h */ 286bca1dae6587a640359abee04337c0463b0a3893tuexen 287bca1dae6587a640359abee04337c0463b0a3893tuexen/* #define SOCKBUF_OWNED(_sb) mtx_owned(SOCKBUF_MTX(_sb)) unused */ 288bca1dae6587a640359abee04337c0463b0a3893tuexen/*__Userspace__ SOCKBUF_UNLOCK(_sb) is now defined in netinet/sctp_process_lock.h */ 289bca1dae6587a640359abee04337c0463b0a3893tuexen 290bca1dae6587a640359abee04337c0463b0a3893tuexen/*__Userspace__ SOCKBUF_LOCK_ASSERT(_sb) is now defined in netinet/sctp_process_lock.h */ 291bca1dae6587a640359abee04337c0463b0a3893tuexen 292bca1dae6587a640359abee04337c0463b0a3893tuexen/* #define SOCKBUF_UNLOCK_ASSERT(_sb) mtx_assert(SOCKBUF_MTX(_sb), MA_NOTOWNED) unused */ 293bca1dae6587a640359abee04337c0463b0a3893tuexen 294bca1dae6587a640359abee04337c0463b0a3893tuexen/* 295bca1dae6587a640359abee04337c0463b0a3893tuexen * Per-socket mutex: we reuse the receive socket buffer mutex for space 296bca1dae6587a640359abee04337c0463b0a3893tuexen * efficiency. This decision should probably be revisited as we optimize 297bca1dae6587a640359abee04337c0463b0a3893tuexen * locking for the socket code. 298bca1dae6587a640359abee04337c0463b0a3893tuexen */ 299c7108437de5af4d0b9f9a24979710b39197ec6cetuexen#define SOCK_MTX(_so) SOCKBUF_MTX(&(_so)->so_rcv) 300bca1dae6587a640359abee04337c0463b0a3893tuexen/*__Userspace__ SOCK_LOCK(_so) is now defined in netinet/sctp_process_lock.h */ 301bca1dae6587a640359abee04337c0463b0a3893tuexen 302bca1dae6587a640359abee04337c0463b0a3893tuexen/* #define SOCK_OWNED(_so) SOCKBUF_OWNED(&(_so)->so_rcv) unused */ 303bca1dae6587a640359abee04337c0463b0a3893tuexen/*__Userspace__ SOCK_UNLOCK(_so) is now defined in netinet/sctp_process_lock.h */ 304bca1dae6587a640359abee04337c0463b0a3893tuexen 305c7108437de5af4d0b9f9a24979710b39197ec6cetuexen#define SOCK_LOCK_ASSERT(_so) SOCKBUF_LOCK_ASSERT(&(_so)->so_rcv) 306bca1dae6587a640359abee04337c0463b0a3893tuexen 307bca1dae6587a640359abee04337c0463b0a3893tuexen/* 308bca1dae6587a640359abee04337c0463b0a3893tuexen * Socket state bits. 309bca1dae6587a640359abee04337c0463b0a3893tuexen * 310bca1dae6587a640359abee04337c0463b0a3893tuexen * Historically, this bits were all kept in the so_state field. For 311bca1dae6587a640359abee04337c0463b0a3893tuexen * locking reasons, they are now in multiple fields, as they are 312bca1dae6587a640359abee04337c0463b0a3893tuexen * locked differently. so_state maintains basic socket state protected 313bca1dae6587a640359abee04337c0463b0a3893tuexen * by the socket lock. so_qstate holds information about the socket 314bca1dae6587a640359abee04337c0463b0a3893tuexen * accept queues. Each socket buffer also has a state field holding 315bca1dae6587a640359abee04337c0463b0a3893tuexen * information relevant to that socket buffer (can't send, rcv). Many 316bca1dae6587a640359abee04337c0463b0a3893tuexen * fields will be read without locks to improve performance and avoid 317bca1dae6587a640359abee04337c0463b0a3893tuexen * lock order issues. However, this approach must be used with caution. 318bca1dae6587a640359abee04337c0463b0a3893tuexen */ 319bca1dae6587a640359abee04337c0463b0a3893tuexen#define SS_NOFDREF 0x0001 /* no file table ref any more */ 320bca1dae6587a640359abee04337c0463b0a3893tuexen#define SS_ISCONNECTED 0x0002 /* socket connected to a peer */ 321bca1dae6587a640359abee04337c0463b0a3893tuexen#define SS_ISCONNECTING 0x0004 /* in process of connecting to peer */ 322bca1dae6587a640359abee04337c0463b0a3893tuexen#define SS_ISDISCONNECTING 0x0008 /* in process of disconnecting */ 323bca1dae6587a640359abee04337c0463b0a3893tuexen#define SS_NBIO 0x0100 /* non-blocking ops */ 324bca1dae6587a640359abee04337c0463b0a3893tuexen#define SS_ASYNC 0x0200 /* async i/o notify */ 325bca1dae6587a640359abee04337c0463b0a3893tuexen#define SS_ISCONFIRMING 0x0400 /* deciding to accept connection req */ 326bca1dae6587a640359abee04337c0463b0a3893tuexen#define SS_ISDISCONNECTED 0x2000 /* socket disconnected from peer */ 327bca1dae6587a640359abee04337c0463b0a3893tuexen/* 328bca1dae6587a640359abee04337c0463b0a3893tuexen * Protocols can mark a socket as SS_PROTOREF to indicate that, following 329bca1dae6587a640359abee04337c0463b0a3893tuexen * pru_detach, they still want the socket to persist, and will free it 330bca1dae6587a640359abee04337c0463b0a3893tuexen * themselves when they are done. Protocols should only ever call sofree() 331bca1dae6587a640359abee04337c0463b0a3893tuexen * following setting this flag in pru_detach(), and never otherwise, as 332bca1dae6587a640359abee04337c0463b0a3893tuexen * sofree() bypasses socket reference counting. 333bca1dae6587a640359abee04337c0463b0a3893tuexen */ 334bca1dae6587a640359abee04337c0463b0a3893tuexen#define SS_PROTOREF 0x4000 /* strong protocol reference */ 335bca1dae6587a640359abee04337c0463b0a3893tuexen 336bca1dae6587a640359abee04337c0463b0a3893tuexen/* 337bca1dae6587a640359abee04337c0463b0a3893tuexen * Socket state bits now stored in the socket buffer state field. 338bca1dae6587a640359abee04337c0463b0a3893tuexen */ 339bca1dae6587a640359abee04337c0463b0a3893tuexen#define SBS_CANTSENDMORE 0x0010 /* can't send more data to peer */ 340bca1dae6587a640359abee04337c0463b0a3893tuexen#define SBS_CANTRCVMORE 0x0020 /* can't receive more data from peer */ 341bca1dae6587a640359abee04337c0463b0a3893tuexen#define SBS_RCVATMARK 0x0040 /* at mark on input */ 342bca1dae6587a640359abee04337c0463b0a3893tuexen 343bca1dae6587a640359abee04337c0463b0a3893tuexen/* 344bca1dae6587a640359abee04337c0463b0a3893tuexen * Socket state bits stored in so_qstate. 345bca1dae6587a640359abee04337c0463b0a3893tuexen */ 346bca1dae6587a640359abee04337c0463b0a3893tuexen#define SQ_INCOMP 0x0800 /* unaccepted, incomplete connection */ 347bca1dae6587a640359abee04337c0463b0a3893tuexen#define SQ_COMP 0x1000 /* unaccepted, complete connection */ 348bca1dae6587a640359abee04337c0463b0a3893tuexen 349bca1dae6587a640359abee04337c0463b0a3893tuexen/* 350bca1dae6587a640359abee04337c0463b0a3893tuexen * Externalized form of struct socket used by the sysctl(3) interface. 351bca1dae6587a640359abee04337c0463b0a3893tuexen */ 352bca1dae6587a640359abee04337c0463b0a3893tuexenstruct xsocket { 353bca1dae6587a640359abee04337c0463b0a3893tuexen size_t xso_len; /* length of this structure */ 354bca1dae6587a640359abee04337c0463b0a3893tuexen struct socket *xso_so; /* makes a convenient handle sometimes */ 355bca1dae6587a640359abee04337c0463b0a3893tuexen short so_type; 356bca1dae6587a640359abee04337c0463b0a3893tuexen short so_options; 357bca1dae6587a640359abee04337c0463b0a3893tuexen short so_linger; 358bca1dae6587a640359abee04337c0463b0a3893tuexen short so_state; 359bca1dae6587a640359abee04337c0463b0a3893tuexen caddr_t so_pcb; /* another convenient handle */ 360bca1dae6587a640359abee04337c0463b0a3893tuexen int xso_protocol; 361bca1dae6587a640359abee04337c0463b0a3893tuexen int xso_family; 362bca1dae6587a640359abee04337c0463b0a3893tuexen u_short so_qlen; 363bca1dae6587a640359abee04337c0463b0a3893tuexen u_short so_incqlen; 364bca1dae6587a640359abee04337c0463b0a3893tuexen u_short so_qlimit; 365bca1dae6587a640359abee04337c0463b0a3893tuexen short so_timeo; 366bca1dae6587a640359abee04337c0463b0a3893tuexen u_short so_error; 367bca1dae6587a640359abee04337c0463b0a3893tuexen pid_t so_pgid; 368bca1dae6587a640359abee04337c0463b0a3893tuexen u_long so_oobmark; 369bca1dae6587a640359abee04337c0463b0a3893tuexen struct xsockbuf { 370bca1dae6587a640359abee04337c0463b0a3893tuexen u_int sb_cc; 371bca1dae6587a640359abee04337c0463b0a3893tuexen u_int sb_hiwat; 372bca1dae6587a640359abee04337c0463b0a3893tuexen u_int sb_mbcnt; 373bca1dae6587a640359abee04337c0463b0a3893tuexen u_int sb_mbmax; 374bca1dae6587a640359abee04337c0463b0a3893tuexen int sb_lowat; 375bca1dae6587a640359abee04337c0463b0a3893tuexen int sb_timeo; 376bca1dae6587a640359abee04337c0463b0a3893tuexen short sb_flags; 377bca1dae6587a640359abee04337c0463b0a3893tuexen } so_rcv, so_snd; 378bca1dae6587a640359abee04337c0463b0a3893tuexen uid_t so_uid; /* XXX */ 379bca1dae6587a640359abee04337c0463b0a3893tuexen}; 380bca1dae6587a640359abee04337c0463b0a3893tuexen 381bca1dae6587a640359abee04337c0463b0a3893tuexen#if defined(_KERNEL) 382bca1dae6587a640359abee04337c0463b0a3893tuexen 383bca1dae6587a640359abee04337c0463b0a3893tuexen 384bca1dae6587a640359abee04337c0463b0a3893tuexen/* 385bca1dae6587a640359abee04337c0463b0a3893tuexen * Macros for sockets and socket buffering. 386bca1dae6587a640359abee04337c0463b0a3893tuexen */ 387bca1dae6587a640359abee04337c0463b0a3893tuexen 388bca1dae6587a640359abee04337c0463b0a3893tuexen/* 389bca1dae6587a640359abee04337c0463b0a3893tuexen * Do we need to notify the other side when I/O is possible? 390bca1dae6587a640359abee04337c0463b0a3893tuexen */ 391bca1dae6587a640359abee04337c0463b0a3893tuexen#define sb_notify(sb) (((sb)->sb_flags & (SB_WAIT | SB_SEL | SB_ASYNC | \ 392bca1dae6587a640359abee04337c0463b0a3893tuexen SB_UPCALL | SB_AIO | SB_KNOTE)) != 0) 393bca1dae6587a640359abee04337c0463b0a3893tuexen 394bca1dae6587a640359abee04337c0463b0a3893tuexen/* 395bca1dae6587a640359abee04337c0463b0a3893tuexen * How much space is there in a socket buffer (so->so_snd or so->so_rcv)? 396bca1dae6587a640359abee04337c0463b0a3893tuexen * This is problematical if the fields are unsigned, as the space might 397bca1dae6587a640359abee04337c0463b0a3893tuexen * still be negative (cc > hiwat or mbcnt > mbmax). Should detect 398bca1dae6587a640359abee04337c0463b0a3893tuexen * overflow and return 0. Should use "lmin" but it doesn't exist now. 399bca1dae6587a640359abee04337c0463b0a3893tuexen */ 400bca1dae6587a640359abee04337c0463b0a3893tuexen#define sbspace(sb) \ 401bca1dae6587a640359abee04337c0463b0a3893tuexen ((long) imin((int)((sb)->sb_hiwat - (sb)->sb_cc), \ 402bca1dae6587a640359abee04337c0463b0a3893tuexen (int)((sb)->sb_mbmax - (sb)->sb_mbcnt))) 403bca1dae6587a640359abee04337c0463b0a3893tuexen 404bca1dae6587a640359abee04337c0463b0a3893tuexen/* do we have to send all at once on a socket? */ 405bca1dae6587a640359abee04337c0463b0a3893tuexen#define sosendallatonce(so) \ 406bca1dae6587a640359abee04337c0463b0a3893tuexen ((so)->so_proto->pr_flags & PR_ATOMIC) 407bca1dae6587a640359abee04337c0463b0a3893tuexen 408bca1dae6587a640359abee04337c0463b0a3893tuexen/* can we read something from so? */ 409bca1dae6587a640359abee04337c0463b0a3893tuexen#define soreadable(so) \ 410bca1dae6587a640359abee04337c0463b0a3893tuexen ((so)->so_rcv.sb_cc >= (so)->so_rcv.sb_lowat || \ 411bca1dae6587a640359abee04337c0463b0a3893tuexen ((so)->so_rcv.sb_state & SBS_CANTRCVMORE) || \ 412bca1dae6587a640359abee04337c0463b0a3893tuexen !TAILQ_EMPTY(&(so)->so_comp) || (so)->so_error) 413bca1dae6587a640359abee04337c0463b0a3893tuexen 414bca1dae6587a640359abee04337c0463b0a3893tuexen/* can we write something to so? */ 415bca1dae6587a640359abee04337c0463b0a3893tuexen#define sowriteable(so) \ 416bca1dae6587a640359abee04337c0463b0a3893tuexen ((sbspace(&(so)->so_snd) >= (so)->so_snd.sb_lowat && \ 417bca1dae6587a640359abee04337c0463b0a3893tuexen (((so)->so_state&SS_ISCONNECTED) || \ 418bca1dae6587a640359abee04337c0463b0a3893tuexen ((so)->so_proto->pr_flags&PR_CONNREQUIRED)==0)) || \ 419bca1dae6587a640359abee04337c0463b0a3893tuexen ((so)->so_snd.sb_state & SBS_CANTSENDMORE) || \ 420bca1dae6587a640359abee04337c0463b0a3893tuexen (so)->so_error) 421bca1dae6587a640359abee04337c0463b0a3893tuexen 422bca1dae6587a640359abee04337c0463b0a3893tuexen/* adjust counters in sb reflecting allocation of m */ 423bca1dae6587a640359abee04337c0463b0a3893tuexen#define sballoc(sb, m) { \ 424bca1dae6587a640359abee04337c0463b0a3893tuexen (sb)->sb_cc += (m)->m_len; \ 425bca1dae6587a640359abee04337c0463b0a3893tuexen if ((m)->m_type != MT_DATA && (m)->m_type != MT_OOBDATA) \ 426bca1dae6587a640359abee04337c0463b0a3893tuexen (sb)->sb_ctl += (m)->m_len; \ 427bca1dae6587a640359abee04337c0463b0a3893tuexen (sb)->sb_mbcnt += MSIZE; \ 428bca1dae6587a640359abee04337c0463b0a3893tuexen if ((m)->m_flags & M_EXT) \ 429bca1dae6587a640359abee04337c0463b0a3893tuexen (sb)->sb_mbcnt += (m)->m_ext.ext_size; \ 430bca1dae6587a640359abee04337c0463b0a3893tuexen} 431bca1dae6587a640359abee04337c0463b0a3893tuexen 432bca1dae6587a640359abee04337c0463b0a3893tuexen/* adjust counters in sb reflecting freeing of m */ 433bca1dae6587a640359abee04337c0463b0a3893tuexen#define sbfree(sb, m) { \ 434bca1dae6587a640359abee04337c0463b0a3893tuexen (sb)->sb_cc -= (m)->m_len; \ 435bca1dae6587a640359abee04337c0463b0a3893tuexen if ((m)->m_type != MT_DATA && (m)->m_type != MT_OOBDATA) \ 436bca1dae6587a640359abee04337c0463b0a3893tuexen (sb)->sb_ctl -= (m)->m_len; \ 437bca1dae6587a640359abee04337c0463b0a3893tuexen (sb)->sb_mbcnt -= MSIZE; \ 438bca1dae6587a640359abee04337c0463b0a3893tuexen if ((m)->m_flags & M_EXT) \ 439bca1dae6587a640359abee04337c0463b0a3893tuexen (sb)->sb_mbcnt -= (m)->m_ext.ext_size; \ 440bca1dae6587a640359abee04337c0463b0a3893tuexen if ((sb)->sb_sndptr == (m)) { \ 441bca1dae6587a640359abee04337c0463b0a3893tuexen (sb)->sb_sndptr = NULL; \ 442bca1dae6587a640359abee04337c0463b0a3893tuexen (sb)->sb_sndptroff = 0; \ 443bca1dae6587a640359abee04337c0463b0a3893tuexen } \ 444bca1dae6587a640359abee04337c0463b0a3893tuexen if ((sb)->sb_sndptroff != 0) \ 445bca1dae6587a640359abee04337c0463b0a3893tuexen (sb)->sb_sndptroff -= (m)->m_len; \ 446bca1dae6587a640359abee04337c0463b0a3893tuexen} 447bca1dae6587a640359abee04337c0463b0a3893tuexen 448bca1dae6587a640359abee04337c0463b0a3893tuexen/* 449bca1dae6587a640359abee04337c0463b0a3893tuexen * soref()/sorele() ref-count the socket structure. Note that you must 450bca1dae6587a640359abee04337c0463b0a3893tuexen * still explicitly close the socket, but the last ref count will free 451bca1dae6587a640359abee04337c0463b0a3893tuexen * the structure. 452bca1dae6587a640359abee04337c0463b0a3893tuexen */ 453bca1dae6587a640359abee04337c0463b0a3893tuexen#define soref(so) do { \ 454bca1dae6587a640359abee04337c0463b0a3893tuexen SOCK_LOCK_ASSERT(so); \ 455bca1dae6587a640359abee04337c0463b0a3893tuexen ++(so)->so_count; \ 456bca1dae6587a640359abee04337c0463b0a3893tuexen} while (0) 457bca1dae6587a640359abee04337c0463b0a3893tuexen 458bca1dae6587a640359abee04337c0463b0a3893tuexen#define sorele(so) do { \ 459bca1dae6587a640359abee04337c0463b0a3893tuexen ACCEPT_LOCK_ASSERT(); \ 460bca1dae6587a640359abee04337c0463b0a3893tuexen SOCK_LOCK_ASSERT(so); \ 461edd4507cda024159552eb3574f9ba93766ea33d8tuexen KASSERT((so)->so_count > 0, ("sorele")); \ 462bca1dae6587a640359abee04337c0463b0a3893tuexen if (--(so)->so_count == 0) \ 463bca1dae6587a640359abee04337c0463b0a3893tuexen sofree(so); \ 464bca1dae6587a640359abee04337c0463b0a3893tuexen else { \ 465bca1dae6587a640359abee04337c0463b0a3893tuexen SOCK_UNLOCK(so); \ 466bca1dae6587a640359abee04337c0463b0a3893tuexen ACCEPT_UNLOCK(); \ 467bca1dae6587a640359abee04337c0463b0a3893tuexen } \ 468bca1dae6587a640359abee04337c0463b0a3893tuexen} while (0) 469bca1dae6587a640359abee04337c0463b0a3893tuexen 470bca1dae6587a640359abee04337c0463b0a3893tuexen#define sotryfree(so) do { \ 471bca1dae6587a640359abee04337c0463b0a3893tuexen ACCEPT_LOCK_ASSERT(); \ 472bca1dae6587a640359abee04337c0463b0a3893tuexen SOCK_LOCK_ASSERT(so); \ 473bca1dae6587a640359abee04337c0463b0a3893tuexen if ((so)->so_count == 0) \ 474bca1dae6587a640359abee04337c0463b0a3893tuexen sofree(so); \ 475bca1dae6587a640359abee04337c0463b0a3893tuexen else { \ 476bca1dae6587a640359abee04337c0463b0a3893tuexen SOCK_UNLOCK(so); \ 477bca1dae6587a640359abee04337c0463b0a3893tuexen ACCEPT_UNLOCK(); \ 478bca1dae6587a640359abee04337c0463b0a3893tuexen } \ 479bca1dae6587a640359abee04337c0463b0a3893tuexen} while(0) 480bca1dae6587a640359abee04337c0463b0a3893tuexen 481bca1dae6587a640359abee04337c0463b0a3893tuexen/* 482bca1dae6587a640359abee04337c0463b0a3893tuexen * In sorwakeup() and sowwakeup(), acquire the socket buffer lock to 483bca1dae6587a640359abee04337c0463b0a3893tuexen * avoid a non-atomic test-and-wakeup. However, sowakeup is 484bca1dae6587a640359abee04337c0463b0a3893tuexen * responsible for releasing the lock if it is called. We unlock only 485bca1dae6587a640359abee04337c0463b0a3893tuexen * if we don't call into sowakeup. If any code is introduced that 486bca1dae6587a640359abee04337c0463b0a3893tuexen * directly invokes the underlying sowakeup() primitives, it must 487bca1dae6587a640359abee04337c0463b0a3893tuexen * maintain the same semantics. 488bca1dae6587a640359abee04337c0463b0a3893tuexen */ 489bca1dae6587a640359abee04337c0463b0a3893tuexen#define sorwakeup_locked(so) do { \ 490bca1dae6587a640359abee04337c0463b0a3893tuexen SOCKBUF_LOCK_ASSERT(&(so)->so_rcv); \ 491bca1dae6587a640359abee04337c0463b0a3893tuexen if (sb_notify(&(so)->so_rcv)) \ 492bca1dae6587a640359abee04337c0463b0a3893tuexen sowakeup((so), &(so)->so_rcv); \ 493bca1dae6587a640359abee04337c0463b0a3893tuexen else \ 494bca1dae6587a640359abee04337c0463b0a3893tuexen SOCKBUF_UNLOCK(&(so)->so_rcv); \ 495bca1dae6587a640359abee04337c0463b0a3893tuexen} while (0) 496bca1dae6587a640359abee04337c0463b0a3893tuexen 497bca1dae6587a640359abee04337c0463b0a3893tuexen#define sorwakeup(so) do { \ 498bca1dae6587a640359abee04337c0463b0a3893tuexen SOCKBUF_LOCK(&(so)->so_rcv); \ 499bca1dae6587a640359abee04337c0463b0a3893tuexen sorwakeup_locked(so); \ 500bca1dae6587a640359abee04337c0463b0a3893tuexen} while (0) 501bca1dae6587a640359abee04337c0463b0a3893tuexen 502bca1dae6587a640359abee04337c0463b0a3893tuexen#define sowwakeup_locked(so) do { \ 503bca1dae6587a640359abee04337c0463b0a3893tuexen SOCKBUF_LOCK_ASSERT(&(so)->so_snd); \ 504bca1dae6587a640359abee04337c0463b0a3893tuexen if (sb_notify(&(so)->so_snd)) \ 505bca1dae6587a640359abee04337c0463b0a3893tuexen sowakeup((so), &(so)->so_snd); \ 506bca1dae6587a640359abee04337c0463b0a3893tuexen else \ 507bca1dae6587a640359abee04337c0463b0a3893tuexen SOCKBUF_UNLOCK(&(so)->so_snd); \ 508bca1dae6587a640359abee04337c0463b0a3893tuexen} while (0) 509bca1dae6587a640359abee04337c0463b0a3893tuexen 510bca1dae6587a640359abee04337c0463b0a3893tuexen#define sowwakeup(so) do { \ 511bca1dae6587a640359abee04337c0463b0a3893tuexen SOCKBUF_LOCK(&(so)->so_snd); \ 512bca1dae6587a640359abee04337c0463b0a3893tuexen sowwakeup_locked(so); \ 513bca1dae6587a640359abee04337c0463b0a3893tuexen} while (0) 514bca1dae6587a640359abee04337c0463b0a3893tuexen 515bca1dae6587a640359abee04337c0463b0a3893tuexen/* 516bca1dae6587a640359abee04337c0463b0a3893tuexen * Argument structure for sosetopt et seq. This is in the KERNEL 517bca1dae6587a640359abee04337c0463b0a3893tuexen * section because it will never be visible to user code. 518bca1dae6587a640359abee04337c0463b0a3893tuexen */ 519bca1dae6587a640359abee04337c0463b0a3893tuexenenum sopt_dir { SOPT_GET, SOPT_SET }; 520bca1dae6587a640359abee04337c0463b0a3893tuexenstruct sockopt { 521bca1dae6587a640359abee04337c0463b0a3893tuexen enum sopt_dir sopt_dir; /* is this a get or a set? */ 522bca1dae6587a640359abee04337c0463b0a3893tuexen int sopt_level; /* second arg of [gs]etsockopt */ 523bca1dae6587a640359abee04337c0463b0a3893tuexen int sopt_name; /* third arg of [gs]etsockopt */ 524bca1dae6587a640359abee04337c0463b0a3893tuexen void *sopt_val; /* fourth arg of [gs]etsockopt */ 525bca1dae6587a640359abee04337c0463b0a3893tuexen size_t sopt_valsize; /* (almost) fifth arg of [gs]etsockopt */ 526bca1dae6587a640359abee04337c0463b0a3893tuexen struct thread *sopt_td; /* calling thread or null if kernel */ 527bca1dae6587a640359abee04337c0463b0a3893tuexen}; 528bca1dae6587a640359abee04337c0463b0a3893tuexen 529bca1dae6587a640359abee04337c0463b0a3893tuexenstruct accept_filter { 530bca1dae6587a640359abee04337c0463b0a3893tuexen char accf_name[16]; 531bca1dae6587a640359abee04337c0463b0a3893tuexen void (*accf_callback) 532bca1dae6587a640359abee04337c0463b0a3893tuexen (struct socket *so, void *arg, int waitflag); 533bca1dae6587a640359abee04337c0463b0a3893tuexen void * (*accf_create) 534bca1dae6587a640359abee04337c0463b0a3893tuexen (struct socket *so, char *arg); 535bca1dae6587a640359abee04337c0463b0a3893tuexen void (*accf_destroy) 536bca1dae6587a640359abee04337c0463b0a3893tuexen (struct socket *so); 537bca1dae6587a640359abee04337c0463b0a3893tuexen SLIST_ENTRY(accept_filter) accf_next; 538bca1dae6587a640359abee04337c0463b0a3893tuexen}; 539bca1dae6587a640359abee04337c0463b0a3893tuexen 540bca1dae6587a640359abee04337c0463b0a3893tuexenextern int maxsockets; 541bca1dae6587a640359abee04337c0463b0a3893tuexenextern u_long sb_max; 542bca1dae6587a640359abee04337c0463b0a3893tuexenextern struct uma_zone *socket_zone; 543bca1dae6587a640359abee04337c0463b0a3893tuexenextern so_gen_t so_gencnt; 544bca1dae6587a640359abee04337c0463b0a3893tuexen 545bca1dae6587a640359abee04337c0463b0a3893tuexenstruct mbuf; 546bca1dae6587a640359abee04337c0463b0a3893tuexenstruct sockaddr; 547bca1dae6587a640359abee04337c0463b0a3893tuexenstruct ucred; 548bca1dae6587a640359abee04337c0463b0a3893tuexenstruct uio; 549bca1dae6587a640359abee04337c0463b0a3893tuexen 550bca1dae6587a640359abee04337c0463b0a3893tuexen/* 551bca1dae6587a640359abee04337c0463b0a3893tuexen * From uipc_socket and friends 552bca1dae6587a640359abee04337c0463b0a3893tuexen */ 553bca1dae6587a640359abee04337c0463b0a3893tuexenint do_getopt_accept_filter(struct socket *so, struct sockopt *sopt); 554bca1dae6587a640359abee04337c0463b0a3893tuexenint do_setopt_accept_filter(struct socket *so, struct sockopt *sopt); 555bca1dae6587a640359abee04337c0463b0a3893tuexenint so_setsockopt(struct socket *so, int level, int optname, 556bca1dae6587a640359abee04337c0463b0a3893tuexen void *optval, size_t optlen); 557bca1dae6587a640359abee04337c0463b0a3893tuexenint sockargs(struct mbuf **mp, caddr_t buf, int buflen, int type); 558bca1dae6587a640359abee04337c0463b0a3893tuexenint getsockaddr(struct sockaddr **namp, caddr_t uaddr, size_t len); 559bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbappend(struct sockbuf *sb, struct mbuf *m); 560bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbappend_locked(struct sockbuf *sb, struct mbuf *m); 561bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbappendstream(struct sockbuf *sb, struct mbuf *m); 562bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbappendstream_locked(struct sockbuf *sb, struct mbuf *m); 563bca1dae6587a640359abee04337c0463b0a3893tuexenint sbappendaddr(struct sockbuf *sb, const struct sockaddr *asa, 564bca1dae6587a640359abee04337c0463b0a3893tuexen struct mbuf *m0, struct mbuf *control); 565bca1dae6587a640359abee04337c0463b0a3893tuexenint sbappendaddr_locked(struct sockbuf *sb, const struct sockaddr *asa, 566bca1dae6587a640359abee04337c0463b0a3893tuexen struct mbuf *m0, struct mbuf *control); 567bca1dae6587a640359abee04337c0463b0a3893tuexenint sbappendcontrol(struct sockbuf *sb, struct mbuf *m0, 568bca1dae6587a640359abee04337c0463b0a3893tuexen struct mbuf *control); 569bca1dae6587a640359abee04337c0463b0a3893tuexenint sbappendcontrol_locked(struct sockbuf *sb, struct mbuf *m0, 570bca1dae6587a640359abee04337c0463b0a3893tuexen struct mbuf *control); 571bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbappendrecord(struct sockbuf *sb, struct mbuf *m0); 572bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbappendrecord_locked(struct sockbuf *sb, struct mbuf *m0); 573bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbcheck(struct sockbuf *sb); 574bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbcompress(struct sockbuf *sb, struct mbuf *m, struct mbuf *n); 575bca1dae6587a640359abee04337c0463b0a3893tuexenstruct mbuf * 576bca1dae6587a640359abee04337c0463b0a3893tuexen sbcreatecontrol(caddr_t p, int size, int type, int level); 577bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbdestroy(struct sockbuf *sb, struct socket *so); 578bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbdrop(struct sockbuf *sb, int len); 579bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbdrop_locked(struct sockbuf *sb, int len); 580bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbdroprecord(struct sockbuf *sb); 581bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbdroprecord_locked(struct sockbuf *sb); 582bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbflush(struct sockbuf *sb); 583bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbflush_locked(struct sockbuf *sb); 584bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbrelease(struct sockbuf *sb, struct socket *so); 585bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbrelease_locked(struct sockbuf *sb, struct socket *so); 586bca1dae6587a640359abee04337c0463b0a3893tuexenint sbreserve(struct sockbuf *sb, u_long cc, struct socket *so, 587bca1dae6587a640359abee04337c0463b0a3893tuexen struct thread *td); 588bca1dae6587a640359abee04337c0463b0a3893tuexenint sbreserve_locked(struct sockbuf *sb, u_long cc, struct socket *so, 589bca1dae6587a640359abee04337c0463b0a3893tuexen struct thread *td); 590bca1dae6587a640359abee04337c0463b0a3893tuexenstruct mbuf * 591bca1dae6587a640359abee04337c0463b0a3893tuexen sbsndptr(struct sockbuf *sb, u_int off, u_int len, u_int *moff); 592bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbtoxsockbuf(struct sockbuf *sb, struct xsockbuf *xsb); 593bca1dae6587a640359abee04337c0463b0a3893tuexenint sbwait(struct sockbuf *sb); 594bca1dae6587a640359abee04337c0463b0a3893tuexenint sblock(struct sockbuf *sb, int flags); 595bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sbunlock(struct sockbuf *sb); 596bca1dae6587a640359abee04337c0463b0a3893tuexenvoid soabort(struct socket *so); 597bca1dae6587a640359abee04337c0463b0a3893tuexenint soaccept(struct socket *so, struct sockaddr **nam); 598bca1dae6587a640359abee04337c0463b0a3893tuexenint socheckuid(struct socket *so, uid_t uid); 599bca1dae6587a640359abee04337c0463b0a3893tuexenint sobind(struct socket *so, struct sockaddr *nam, struct thread *td); 600bca1dae6587a640359abee04337c0463b0a3893tuexenvoid socantrcvmore(struct socket *so); 601bca1dae6587a640359abee04337c0463b0a3893tuexenvoid socantrcvmore_locked(struct socket *so); 602bca1dae6587a640359abee04337c0463b0a3893tuexenvoid socantsendmore(struct socket *so); 603bca1dae6587a640359abee04337c0463b0a3893tuexenvoid socantsendmore_locked(struct socket *so); 604bca1dae6587a640359abee04337c0463b0a3893tuexenint soclose(struct socket *so); 605bca1dae6587a640359abee04337c0463b0a3893tuexenint soconnect(struct socket *so, struct sockaddr *nam, struct thread *td); 606bca1dae6587a640359abee04337c0463b0a3893tuexenint soconnect2(struct socket *so1, struct socket *so2); 607bca1dae6587a640359abee04337c0463b0a3893tuexenint socow_setup(struct mbuf *m0, struct uio *uio); 608bca1dae6587a640359abee04337c0463b0a3893tuexenint socreate(int dom, struct socket **aso, int type, int proto, 609bca1dae6587a640359abee04337c0463b0a3893tuexen struct ucred *cred, struct thread *td); 610bca1dae6587a640359abee04337c0463b0a3893tuexenint sodisconnect(struct socket *so); 611bca1dae6587a640359abee04337c0463b0a3893tuexenstruct sockaddr *sodupsockaddr(const struct sockaddr *sa, int mflags); 612bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sofree(struct socket *so); 613bca1dae6587a640359abee04337c0463b0a3893tuexenint sogetopt(struct socket *so, struct sockopt *sopt); 614bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sohasoutofband(struct socket *so); 615bca1dae6587a640359abee04337c0463b0a3893tuexenvoid soisconnected(struct socket *so); 616bca1dae6587a640359abee04337c0463b0a3893tuexenvoid soisconnecting(struct socket *so); 617bca1dae6587a640359abee04337c0463b0a3893tuexenvoid soisdisconnected(struct socket *so); 618bca1dae6587a640359abee04337c0463b0a3893tuexenvoid soisdisconnecting(struct socket *so); 619bca1dae6587a640359abee04337c0463b0a3893tuexenint solisten(struct socket *so, int backlog, struct thread *td); 620bca1dae6587a640359abee04337c0463b0a3893tuexenvoid solisten_proto(struct socket *so, int backlog); 621bca1dae6587a640359abee04337c0463b0a3893tuexenint solisten_proto_check(struct socket *so); 622bca1dae6587a640359abee04337c0463b0a3893tuexenstruct socket * 623bca1dae6587a640359abee04337c0463b0a3893tuexen sonewconn(struct socket *head, int connstatus); 624bca1dae6587a640359abee04337c0463b0a3893tuexenint sooptcopyin(struct sockopt *sopt, void *buf, size_t len, size_t minlen); 625bca1dae6587a640359abee04337c0463b0a3893tuexenint sooptcopyout(struct sockopt *sopt, const void *buf, size_t len); 626bca1dae6587a640359abee04337c0463b0a3893tuexen 627bca1dae6587a640359abee04337c0463b0a3893tuexen/* XXX; prepare mbuf for (__FreeBSD__ < 3) routines. */ 628bca1dae6587a640359abee04337c0463b0a3893tuexenint soopt_getm(struct sockopt *sopt, struct mbuf **mp); 629bca1dae6587a640359abee04337c0463b0a3893tuexenint soopt_mcopyin(struct sockopt *sopt, struct mbuf *m); 630bca1dae6587a640359abee04337c0463b0a3893tuexenint soopt_mcopyout(struct sockopt *sopt, struct mbuf *m); 631bca1dae6587a640359abee04337c0463b0a3893tuexen 632bca1dae6587a640359abee04337c0463b0a3893tuexenint sopoll(struct socket *so, int events, struct ucred *active_cred, 633bca1dae6587a640359abee04337c0463b0a3893tuexen struct thread *td); 634bca1dae6587a640359abee04337c0463b0a3893tuexenint sopoll_generic(struct socket *so, int events, 635bca1dae6587a640359abee04337c0463b0a3893tuexen struct ucred *active_cred, struct thread *td); 636bca1dae6587a640359abee04337c0463b0a3893tuexenint soreceive(struct socket *so, struct sockaddr **paddr, struct uio *uio, 637bca1dae6587a640359abee04337c0463b0a3893tuexen struct mbuf **mp0, struct mbuf **controlp, int *flagsp); 638bca1dae6587a640359abee04337c0463b0a3893tuexenint soreceive_generic(struct socket *so, struct sockaddr **paddr, 639bca1dae6587a640359abee04337c0463b0a3893tuexen struct uio *uio, struct mbuf **mp0, struct mbuf **controlp, 640bca1dae6587a640359abee04337c0463b0a3893tuexen int *flagsp); 641bca1dae6587a640359abee04337c0463b0a3893tuexenint soreserve(struct socket *so, u_long sndcc, u_long rcvcc); 642bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sorflush(struct socket *so); 643bca1dae6587a640359abee04337c0463b0a3893tuexenint sosend(struct socket *so, struct sockaddr *addr, struct uio *uio, 644bca1dae6587a640359abee04337c0463b0a3893tuexen struct mbuf *top, struct mbuf *control, int flags, 645bca1dae6587a640359abee04337c0463b0a3893tuexen struct thread *td); 646bca1dae6587a640359abee04337c0463b0a3893tuexenint sosend_dgram(struct socket *so, struct sockaddr *addr, 647bca1dae6587a640359abee04337c0463b0a3893tuexen struct uio *uio, struct mbuf *top, struct mbuf *control, 648bca1dae6587a640359abee04337c0463b0a3893tuexen int flags, struct thread *td); 649bca1dae6587a640359abee04337c0463b0a3893tuexenint sosend_generic(struct socket *so, struct sockaddr *addr, 650bca1dae6587a640359abee04337c0463b0a3893tuexen struct uio *uio, struct mbuf *top, struct mbuf *control, 651bca1dae6587a640359abee04337c0463b0a3893tuexen int flags, struct thread *td); 652bca1dae6587a640359abee04337c0463b0a3893tuexenint sosetopt(struct socket *so, struct sockopt *sopt); 653bca1dae6587a640359abee04337c0463b0a3893tuexenint soshutdown(struct socket *so, int how); 654bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sotoxsocket(struct socket *so, struct xsocket *xso); 655bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sowakeup(struct socket *so, struct sockbuf *sb); 656bca1dae6587a640359abee04337c0463b0a3893tuexen 657bca1dae6587a640359abee04337c0463b0a3893tuexen#ifdef SOCKBUF_DEBUG 658bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sblastrecordchk(struct sockbuf *, const char *, int); 659bca1dae6587a640359abee04337c0463b0a3893tuexen#define SBLASTRECORDCHK(sb) sblastrecordchk((sb), __FILE__, __LINE__) 660bca1dae6587a640359abee04337c0463b0a3893tuexen 661bca1dae6587a640359abee04337c0463b0a3893tuexenvoid sblastmbufchk(struct sockbuf *, const char *, int); 662bca1dae6587a640359abee04337c0463b0a3893tuexen#define SBLASTMBUFCHK(sb) sblastmbufchk((sb), __FILE__, __LINE__) 663bca1dae6587a640359abee04337c0463b0a3893tuexen#else 664bca1dae6587a640359abee04337c0463b0a3893tuexen#define SBLASTRECORDCHK(sb) /* nothing */ 665bca1dae6587a640359abee04337c0463b0a3893tuexen#define SBLASTMBUFCHK(sb) /* nothing */ 666bca1dae6587a640359abee04337c0463b0a3893tuexen#endif /* SOCKBUF_DEBUG */ 667bca1dae6587a640359abee04337c0463b0a3893tuexen 668bca1dae6587a640359abee04337c0463b0a3893tuexen/* 669bca1dae6587a640359abee04337c0463b0a3893tuexen * Accept filter functions (duh). 670bca1dae6587a640359abee04337c0463b0a3893tuexen */ 671bca1dae6587a640359abee04337c0463b0a3893tuexenint accept_filt_add(struct accept_filter *filt); 672bca1dae6587a640359abee04337c0463b0a3893tuexenint accept_filt_del(char *name); 673bca1dae6587a640359abee04337c0463b0a3893tuexenstruct accept_filter *accept_filt_get(char *name); 674bca1dae6587a640359abee04337c0463b0a3893tuexen#ifdef ACCEPT_FILTER_MOD 675bca1dae6587a640359abee04337c0463b0a3893tuexen#ifdef SYSCTL_DECL 676bca1dae6587a640359abee04337c0463b0a3893tuexenSYSCTL_DECL(_net_inet_accf); 677bca1dae6587a640359abee04337c0463b0a3893tuexen#endif 678bca1dae6587a640359abee04337c0463b0a3893tuexenint accept_filt_generic_mod_event(module_t mod, int event, void *data); 679bca1dae6587a640359abee04337c0463b0a3893tuexen#endif 680bca1dae6587a640359abee04337c0463b0a3893tuexen 681bca1dae6587a640359abee04337c0463b0a3893tuexen#endif /* _KERNEL */ 682bca1dae6587a640359abee04337c0463b0a3893tuexen 683bca1dae6587a640359abee04337c0463b0a3893tuexen 684bca1dae6587a640359abee04337c0463b0a3893tuexen/*-------------------------------------------------------------*/ 685bca1dae6587a640359abee04337c0463b0a3893tuexen/*-------------------------------------------------------------*/ 686bca1dae6587a640359abee04337c0463b0a3893tuexen/* __Userspace__ */ 687bca1dae6587a640359abee04337c0463b0a3893tuexen/*-------------------------------------------------------------*/ 688bca1dae6587a640359abee04337c0463b0a3893tuexen/*-------------------------------------------------------------*/ 689bca1dae6587a640359abee04337c0463b0a3893tuexen/* this new __Userspace__ section is to copy portions of the _KERNEL block 690bca1dae6587a640359abee04337c0463b0a3893tuexen * above into, avoiding having to port the entire thing at once... 691bca1dae6587a640359abee04337c0463b0a3893tuexen * For function prototypes, the full bodies are in user_socket.c . 692bca1dae6587a640359abee04337c0463b0a3893tuexen */ 693bca1dae6587a640359abee04337c0463b0a3893tuexen#if defined(__Userspace__) 694bca1dae6587a640359abee04337c0463b0a3893tuexen 695bca1dae6587a640359abee04337c0463b0a3893tuexen/* ---------------------------------------------------------- */ 696bca1dae6587a640359abee04337c0463b0a3893tuexen/* --- function prototypes (implemented in user_socket.c) --- */ 697bca1dae6587a640359abee04337c0463b0a3893tuexen/* ---------------------------------------------------------- */ 698bca1dae6587a640359abee04337c0463b0a3893tuexenvoid soisconnecting(struct socket *so); 699bca1dae6587a640359abee04337c0463b0a3893tuexenvoid soisdisconnecting(struct socket *so); 700bca1dae6587a640359abee04337c0463b0a3893tuexenvoid soisconnected(struct socket *so); 701bca1dae6587a640359abee04337c0463b0a3893tuexenstruct socket * sonewconn(struct socket *head, int connstatus); 702bca1dae6587a640359abee04337c0463b0a3893tuexenvoid socantrcvmore(struct socket *so); 703bca1dae6587a640359abee04337c0463b0a3893tuexenvoid socantsendmore(struct socket *so); 704bca1dae6587a640359abee04337c0463b0a3893tuexen 705bca1dae6587a640359abee04337c0463b0a3893tuexen 706bca1dae6587a640359abee04337c0463b0a3893tuexen 707bca1dae6587a640359abee04337c0463b0a3893tuexen/* -------------- */ 708bca1dae6587a640359abee04337c0463b0a3893tuexen/* --- macros --- */ 709bca1dae6587a640359abee04337c0463b0a3893tuexen/* -------------- */ 710bca1dae6587a640359abee04337c0463b0a3893tuexen 711bca1dae6587a640359abee04337c0463b0a3893tuexen#define soref(so) do { \ 712bca1dae6587a640359abee04337c0463b0a3893tuexen SOCK_LOCK_ASSERT(so); \ 713bca1dae6587a640359abee04337c0463b0a3893tuexen ++(so)->so_count; \ 714bca1dae6587a640359abee04337c0463b0a3893tuexen} while (0) 715bca1dae6587a640359abee04337c0463b0a3893tuexen 716bca1dae6587a640359abee04337c0463b0a3893tuexen#define sorele(so) do { \ 717bca1dae6587a640359abee04337c0463b0a3893tuexen ACCEPT_LOCK_ASSERT(); \ 718bca1dae6587a640359abee04337c0463b0a3893tuexen SOCK_LOCK_ASSERT(so); \ 719edd4507cda024159552eb3574f9ba93766ea33d8tuexen KASSERT((so)->so_count > 0, ("sorele")); \ 720bca1dae6587a640359abee04337c0463b0a3893tuexen if (--(so)->so_count == 0) \ 721bca1dae6587a640359abee04337c0463b0a3893tuexen sofree(so); \ 722bca1dae6587a640359abee04337c0463b0a3893tuexen else { \ 723bca1dae6587a640359abee04337c0463b0a3893tuexen SOCK_UNLOCK(so); \ 724bca1dae6587a640359abee04337c0463b0a3893tuexen ACCEPT_UNLOCK(); \ 725bca1dae6587a640359abee04337c0463b0a3893tuexen } \ 726bca1dae6587a640359abee04337c0463b0a3893tuexen} while (0) 727bca1dae6587a640359abee04337c0463b0a3893tuexen 728bca1dae6587a640359abee04337c0463b0a3893tuexen 729bca1dae6587a640359abee04337c0463b0a3893tuexen/* replacing imin with min (user_environment.h) */ 730bca1dae6587a640359abee04337c0463b0a3893tuexen#define sbspace(sb) \ 731bca1dae6587a640359abee04337c0463b0a3893tuexen ((long) min((int)((sb)->sb_hiwat - (sb)->sb_cc), \ 732bca1dae6587a640359abee04337c0463b0a3893tuexen (int)((sb)->sb_mbmax - (sb)->sb_mbcnt))) 733bca1dae6587a640359abee04337c0463b0a3893tuexen 734bca1dae6587a640359abee04337c0463b0a3893tuexen/* do we have to send all at once on a socket? */ 735bca1dae6587a640359abee04337c0463b0a3893tuexen#define sosendallatonce(so) \ 736bca1dae6587a640359abee04337c0463b0a3893tuexen ((so)->so_proto->pr_flags & PR_ATOMIC) 737bca1dae6587a640359abee04337c0463b0a3893tuexen 738bca1dae6587a640359abee04337c0463b0a3893tuexen/* can we read something from so? */ 739bca1dae6587a640359abee04337c0463b0a3893tuexen#define soreadable(so) \ 74018818c8dd0d4cafdb259fa73f01f7825948faadct ((int)((so)->so_rcv.sb_cc) >= (so)->so_rcv.sb_lowat || \ 741bca1dae6587a640359abee04337c0463b0a3893tuexen ((so)->so_rcv.sb_state & SBS_CANTRCVMORE) || \ 742bca1dae6587a640359abee04337c0463b0a3893tuexen !TAILQ_EMPTY(&(so)->so_comp) || (so)->so_error) 743bca1dae6587a640359abee04337c0463b0a3893tuexen 744bca1dae6587a640359abee04337c0463b0a3893tuexen#if 0 /* original */ 745bca1dae6587a640359abee04337c0463b0a3893tuexen#define PR_CONNREQUIRED 0x04 /* from sys/protosw.h "needed" for sowriteable */ 746bca1dae6587a640359abee04337c0463b0a3893tuexen#define sowriteable(so) \ 747bca1dae6587a640359abee04337c0463b0a3893tuexen ((sbspace(&(so)->so_snd) >= (so)->so_snd.sb_lowat && \ 748bca1dae6587a640359abee04337c0463b0a3893tuexen (((so)->so_state&SS_ISCONNECTED) || \ 749bca1dae6587a640359abee04337c0463b0a3893tuexen ((so)->so_proto->pr_flags&PR_CONNREQUIRED)==0)) || \ 750bca1dae6587a640359abee04337c0463b0a3893tuexen ((so)->so_snd.sb_state & SBS_CANTSENDMORE) || \ 751bca1dae6587a640359abee04337c0463b0a3893tuexen (so)->so_error) 752bca1dae6587a640359abee04337c0463b0a3893tuexen#else /* line with PR_CONNREQUIRED removed */ 753bca1dae6587a640359abee04337c0463b0a3893tuexen/* can we write something to so? */ 754bca1dae6587a640359abee04337c0463b0a3893tuexen#define sowriteable(so) \ 755bca1dae6587a640359abee04337c0463b0a3893tuexen ((sbspace(&(so)->so_snd) >= (so)->so_snd.sb_lowat && \ 756bca1dae6587a640359abee04337c0463b0a3893tuexen (((so)->so_state&SS_ISCONNECTED))) || \ 757bca1dae6587a640359abee04337c0463b0a3893tuexen ((so)->so_snd.sb_state & SBS_CANTSENDMORE) || \ 758bca1dae6587a640359abee04337c0463b0a3893tuexen (so)->so_error) 759bca1dae6587a640359abee04337c0463b0a3893tuexen#endif 760bca1dae6587a640359abee04337c0463b0a3893tuexen 761bca1dae6587a640359abee04337c0463b0a3893tuexenextern void solisten_proto(struct socket *so, int backlog); 762bca1dae6587a640359abee04337c0463b0a3893tuexenextern int solisten_proto_check(struct socket *so); 763bca1dae6587a640359abee04337c0463b0a3893tuexenextern int sctp_listen(struct socket *so, int backlog, struct proc *p); 7643ab67fee2e89498e06d10f12109b818bdc49ddc3tuexenextern void socantrcvmore_locked(struct socket *so); 765bca1dae6587a640359abee04337c0463b0a3893tuexenextern int sctp_bind(struct socket *so, struct sockaddr *addr); 766cd78deb883f0edfcdcde56ea7a2f972afc3bfbcdtuexenextern int sctp6_bind(struct socket *so, struct sockaddr *addr, void *proc); 7671fa2625e04d88d696ec65744d8b101480224ee1ctuexen#if defined(__Userspace__) 7681fa2625e04d88d696ec65744d8b101480224ee1ctuexenextern int sctpconn_bind(struct socket *so, struct sockaddr *addr); 7691fa2625e04d88d696ec65744d8b101480224ee1ctuexen#endif 770bca1dae6587a640359abee04337c0463b0a3893tuexenextern int sctp_accept(struct socket *so, struct sockaddr **addr); 771bca1dae6587a640359abee04337c0463b0a3893tuexenextern int sctp_attach(struct socket *so, int proto, uint32_t vrf_id); 772cd78deb883f0edfcdcde56ea7a2f972afc3bfbcdtuexenextern int sctp6_attach(struct socket *so, int proto, uint32_t vrf_id); 773bca1dae6587a640359abee04337c0463b0a3893tuexenextern int sctp_abort(struct socket *so); 774cd78deb883f0edfcdcde56ea7a2f972afc3bfbcdtuexenextern int sctp6_abort(struct socket *so); 775bca1dae6587a640359abee04337c0463b0a3893tuexenextern void sctp_close(struct socket *so); 776bca1dae6587a640359abee04337c0463b0a3893tuexenextern int soaccept(struct socket *so, struct sockaddr **nam); 777bca1dae6587a640359abee04337c0463b0a3893tuexenextern int solisten(struct socket *so, int backlog); 778bca1dae6587a640359abee04337c0463b0a3893tuexenextern int soreserve(struct socket *so, u_long sndcc, u_long rcvcc); 779bca1dae6587a640359abee04337c0463b0a3893tuexenextern void sowakeup(struct socket *so, struct sockbuf *sb); 780bca1dae6587a640359abee04337c0463b0a3893tuexenextern void wakeup(void *ident, struct socket *so); /*__Userspace__ */ 781bca1dae6587a640359abee04337c0463b0a3893tuexenextern int uiomove(void *cp, int n, struct uio *uio); 782bca1dae6587a640359abee04337c0463b0a3893tuexenextern int sbwait(struct sockbuf *sb); 783bca1dae6587a640359abee04337c0463b0a3893tuexenextern int sodisconnect(struct socket *so); 784bca1dae6587a640359abee04337c0463b0a3893tuexenextern int soconnect(struct socket *so, struct sockaddr *nam); 785bca1dae6587a640359abee04337c0463b0a3893tuexenextern int sctp_disconnect(struct socket *so); 786bca1dae6587a640359abee04337c0463b0a3893tuexenextern int sctp_connect(struct socket *so, struct sockaddr *addr); 787cd78deb883f0edfcdcde56ea7a2f972afc3bfbcdtuexenextern int sctp6_connect(struct socket *so, struct sockaddr *addr); 7881fa2625e04d88d696ec65744d8b101480224ee1ctuexen#if defined(__Userspace__) 7891fa2625e04d88d696ec65744d8b101480224ee1ctuexenextern int sctpconn_connect(struct socket *so, struct sockaddr *addr); 7901fa2625e04d88d696ec65744d8b101480224ee1ctuexen#endif 791bca1dae6587a640359abee04337c0463b0a3893tuexenextern void sctp_finish(void); 792bca1dae6587a640359abee04337c0463b0a3893tuexen 793bca1dae6587a640359abee04337c0463b0a3893tuexen/* ------------------------------------------------ */ 794bca1dae6587a640359abee04337c0463b0a3893tuexen/* ----- macros copied from above ---- */ 795bca1dae6587a640359abee04337c0463b0a3893tuexen/* ------------------------------------------------ */ 796bca1dae6587a640359abee04337c0463b0a3893tuexen 797bca1dae6587a640359abee04337c0463b0a3893tuexen/* 798bca1dae6587a640359abee04337c0463b0a3893tuexen * Do we need to notify the other side when I/O is possible? 799bca1dae6587a640359abee04337c0463b0a3893tuexen */ 800bca1dae6587a640359abee04337c0463b0a3893tuexen#define sb_notify(sb) (((sb)->sb_flags & (SB_WAIT | SB_SEL | SB_ASYNC | \ 801bca1dae6587a640359abee04337c0463b0a3893tuexen SB_UPCALL | SB_AIO | SB_KNOTE)) != 0) 802bca1dae6587a640359abee04337c0463b0a3893tuexen 803bca1dae6587a640359abee04337c0463b0a3893tuexen 804bca1dae6587a640359abee04337c0463b0a3893tuexen/* 805bca1dae6587a640359abee04337c0463b0a3893tuexen * In sorwakeup() and sowwakeup(), acquire the socket buffer lock to 806bca1dae6587a640359abee04337c0463b0a3893tuexen * avoid a non-atomic test-and-wakeup. However, sowakeup is 807bca1dae6587a640359abee04337c0463b0a3893tuexen * responsible for releasing the lock if it is called. We unlock only 808bca1dae6587a640359abee04337c0463b0a3893tuexen * if we don't call into sowakeup. If any code is introduced that 809bca1dae6587a640359abee04337c0463b0a3893tuexen * directly invokes the underlying sowakeup() primitives, it must 810bca1dae6587a640359abee04337c0463b0a3893tuexen * maintain the same semantics. 811bca1dae6587a640359abee04337c0463b0a3893tuexen */ 812bca1dae6587a640359abee04337c0463b0a3893tuexen#define sorwakeup_locked(so) do { \ 813bca1dae6587a640359abee04337c0463b0a3893tuexen SOCKBUF_LOCK_ASSERT(&(so)->so_rcv); \ 814bca1dae6587a640359abee04337c0463b0a3893tuexen if (sb_notify(&(so)->so_rcv)) \ 815bca1dae6587a640359abee04337c0463b0a3893tuexen sowakeup((so), &(so)->so_rcv); \ 816bca1dae6587a640359abee04337c0463b0a3893tuexen else \ 817bca1dae6587a640359abee04337c0463b0a3893tuexen SOCKBUF_UNLOCK(&(so)->so_rcv); \ 818bca1dae6587a640359abee04337c0463b0a3893tuexen} while (0) 819bca1dae6587a640359abee04337c0463b0a3893tuexen 820bca1dae6587a640359abee04337c0463b0a3893tuexen#define sorwakeup(so) do { \ 821bca1dae6587a640359abee04337c0463b0a3893tuexen SOCKBUF_LOCK(&(so)->so_rcv); \ 822bca1dae6587a640359abee04337c0463b0a3893tuexen sorwakeup_locked(so); \ 823bca1dae6587a640359abee04337c0463b0a3893tuexen} while (0) 824bca1dae6587a640359abee04337c0463b0a3893tuexen 825bca1dae6587a640359abee04337c0463b0a3893tuexen#define sowwakeup_locked(so) do { \ 826bca1dae6587a640359abee04337c0463b0a3893tuexen SOCKBUF_LOCK_ASSERT(&(so)->so_snd); \ 827bca1dae6587a640359abee04337c0463b0a3893tuexen if (sb_notify(&(so)->so_snd)) \ 828bca1dae6587a640359abee04337c0463b0a3893tuexen sowakeup((so), &(so)->so_snd); \ 829bca1dae6587a640359abee04337c0463b0a3893tuexen else \ 830bca1dae6587a640359abee04337c0463b0a3893tuexen SOCKBUF_UNLOCK(&(so)->so_snd); \ 831bca1dae6587a640359abee04337c0463b0a3893tuexen} while (0) 832bca1dae6587a640359abee04337c0463b0a3893tuexen 833bca1dae6587a640359abee04337c0463b0a3893tuexen#define sowwakeup(so) do { \ 834bca1dae6587a640359abee04337c0463b0a3893tuexen SOCKBUF_LOCK(&(so)->so_snd); \ 835bca1dae6587a640359abee04337c0463b0a3893tuexen sowwakeup_locked(so); \ 836bca1dae6587a640359abee04337c0463b0a3893tuexen} while (0) 837bca1dae6587a640359abee04337c0463b0a3893tuexen 838bca1dae6587a640359abee04337c0463b0a3893tuexen 839bca1dae6587a640359abee04337c0463b0a3893tuexen 840bca1dae6587a640359abee04337c0463b0a3893tuexen#endif /* __Userspace__ */ 841bca1dae6587a640359abee04337c0463b0a3893tuexen 842bca1dae6587a640359abee04337c0463b0a3893tuexen#endif /* !_SYS_SOCKETVAR_H_ */ 843