1*94b08229Smvs /* $OpenBSD: socketvar.h,v 1.124 2024/02/12 22:48:27 mvs Exp $ */ 2ad43b9c6Smickey /* $NetBSD: socketvar.h,v 1.18 1996/02/09 18:25:38 christos Exp $ */ 3df930be7Sderaadt 4df930be7Sderaadt /*- 5df930be7Sderaadt * Copyright (c) 1982, 1986, 1990, 1993 6df930be7Sderaadt * The Regents of the University of California. All rights reserved. 7df930be7Sderaadt * 8df930be7Sderaadt * Redistribution and use in source and binary forms, with or without 9df930be7Sderaadt * modification, are permitted provided that the following conditions 10df930be7Sderaadt * are met: 11df930be7Sderaadt * 1. Redistributions of source code must retain the above copyright 12df930be7Sderaadt * notice, this list of conditions and the following disclaimer. 13df930be7Sderaadt * 2. Redistributions in binary form must reproduce the above copyright 14df930be7Sderaadt * notice, this list of conditions and the following disclaimer in the 15df930be7Sderaadt * documentation and/or other materials provided with the distribution. 1629295d1cSmillert * 3. Neither the name of the University nor the names of its contributors 17df930be7Sderaadt * may be used to endorse or promote products derived from this software 18df930be7Sderaadt * without specific prior written permission. 19df930be7Sderaadt * 20df930be7Sderaadt * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21df930be7Sderaadt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22df930be7Sderaadt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23df930be7Sderaadt * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24df930be7Sderaadt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25df930be7Sderaadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26df930be7Sderaadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27df930be7Sderaadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28df930be7Sderaadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29df930be7Sderaadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30df930be7Sderaadt * SUCH DAMAGE. 31df930be7Sderaadt * 32df930be7Sderaadt * @(#)socketvar.h 8.1 (Berkeley) 6/2/93 33df930be7Sderaadt */ 34df930be7Sderaadt 3569690c9bSmvs #ifndef _SYS_SOCKETVAR_H_ 3669690c9bSmvs #define _SYS_SOCKETVAR_H_ 3769690c9bSmvs 3880b1b8fbSmvs #include <sys/event.h> 39145e6cebSprovos #include <sys/queue.h> 40e22141d5Svisa #include <sys/sigio.h> /* for struct sigio_ref */ 411c3052b5Sbluhm #include <sys/task.h> 4204ba85d2Smikeb #include <sys/timeout.h> 43104c0a83Smvs #include <sys/mutex.h> 44451a9593Smvs #include <sys/rwlock.h> 45cf85347fSmvs #include <sys/refcnt.h> 46145e6cebSprovos 47de9f3fadSguenther #ifndef _SOCKLEN_T_DEFINED_ 48de9f3fadSguenther #define _SOCKLEN_T_DEFINED_ 49de9f3fadSguenther typedef __socklen_t socklen_t; /* length type for network syscalls */ 50de9f3fadSguenther #endif 51de9f3fadSguenther 52145e6cebSprovos TAILQ_HEAD(soqhead, socket); 53df930be7Sderaadt 54df930be7Sderaadt /* 55df930be7Sderaadt * Kernel structure per socket. 56df930be7Sderaadt * Contains send and receive buffer queues, 57df930be7Sderaadt * handle on protocol and pointer to protocol 58df930be7Sderaadt * private data and error information. 59df930be7Sderaadt */ 60df930be7Sderaadt struct socket { 6169dc22ffSmpi const struct protosw *so_proto; /* protocol handle */ 62451a9593Smvs struct rwlock so_lock; /* this socket lock */ 63cf85347fSmvs struct refcnt so_refcnt; /* references to this socket */ 6469dc22ffSmpi void *so_pcb; /* protocol control block */ 6569dc22ffSmpi u_int so_state; /* internal state flags SS_*, below */ 66df930be7Sderaadt short so_type; /* generic type, see socket.h */ 67df930be7Sderaadt short so_options; /* from socket call, see socket.h */ 68df930be7Sderaadt short so_linger; /* time to linger while closing */ 69df930be7Sderaadt /* 70df930be7Sderaadt * Variables for connection queueing. 71df930be7Sderaadt * Socket where accepts occur is so_head in all subsidiary sockets. 72df930be7Sderaadt * If so_head is 0, socket is not related to an accept. 73df930be7Sderaadt * For head socket so_q0 queues partially completed connections, 74df930be7Sderaadt * while so_q is a queue of connections ready to be accepted. 75df930be7Sderaadt * If a connection is aborted and it has so_head set, then 76df930be7Sderaadt * it has to be pulled out of either so_q0 or so_q. 77df930be7Sderaadt * We allow connections to queue up based on current queue lengths 78df930be7Sderaadt * and limit on number of queued connections for this socket. 79df930be7Sderaadt */ 80df930be7Sderaadt struct socket *so_head; /* back pointer to accept socket */ 81145e6cebSprovos struct soqhead *so_onq; /* queue (q or q0) that we're on */ 82145e6cebSprovos struct soqhead so_q0; /* queue of partial connections */ 83145e6cebSprovos struct soqhead so_q; /* queue of incoming connections */ 84e22141d5Svisa struct sigio_ref so_sigio; /* async I/O registration */ 85145e6cebSprovos TAILQ_ENTRY(socket) so_qe; /* our queue entry (q or q0) */ 86df930be7Sderaadt short so_q0len; /* partials on so_q0 */ 87df930be7Sderaadt short so_qlen; /* number of connections on so_q */ 88df930be7Sderaadt short so_qlimit; /* max number queued connections */ 89cf85347fSmvs u_long so_newconn; /* # of pending sonewconn() threads */ 90df930be7Sderaadt short so_timeo; /* connection timeout */ 91df930be7Sderaadt u_long so_oobmark; /* chars to oob mark */ 92e22141d5Svisa u_int so_error; /* error affecting connection */ 9368d360c0Sbluhm /* 9468d360c0Sbluhm * Variables for socket splicing, allocated only when needed. 9568d360c0Sbluhm */ 9668d360c0Sbluhm struct sosplice { 9768d360c0Sbluhm struct socket *ssp_socket; /* send data to drain socket */ 9868d360c0Sbluhm struct socket *ssp_soback; /* back ref to source socket */ 9968d360c0Sbluhm off_t ssp_len; /* number of bytes spliced */ 10068d360c0Sbluhm off_t ssp_max; /* maximum number of bytes */ 10168d360c0Sbluhm struct timeval ssp_idletv; /* idle timeout */ 10268d360c0Sbluhm struct timeout ssp_idleto; 1031c3052b5Sbluhm struct task ssp_task; /* task for somove */ 10468d360c0Sbluhm } *so_sp; 105df930be7Sderaadt /* 106df930be7Sderaadt * Variables for socket buffering. 107df930be7Sderaadt */ 108df930be7Sderaadt struct sockbuf { 109104c0a83Smvs struct mutex sb_mtx; 110d89d5c74Smpi /* The following fields are all zeroed on flush. */ 111d89d5c74Smpi #define sb_startzero sb_cc 112df930be7Sderaadt u_long sb_cc; /* actual chars in buffer */ 113e3cfaa00Skurt u_long sb_datacc; /* data only chars in buffer */ 114df930be7Sderaadt u_long sb_hiwat; /* max actual char count */ 1155d991f01Sclaudio u_long sb_wat; /* default watermark */ 116df930be7Sderaadt u_long sb_mbcnt; /* chars of mbufs used */ 117df930be7Sderaadt u_long sb_mbmax; /* max chars of mbufs to use */ 118df930be7Sderaadt long sb_lowat; /* low water mark */ 119df930be7Sderaadt struct mbuf *sb_mb; /* the mbuf chain */ 120a3c9d230Sprovos struct mbuf *sb_mbtail; /* the last mbuf in the chain */ 121a3c9d230Sprovos struct mbuf *sb_lastrecord;/* first mbuf of last record in 122a3c9d230Sprovos socket buffer */ 123d89d5c74Smpi short sb_flags; /* flags, see below */ 124d89d5c74Smpi /* End area that is zeroed on flush. */ 125d89d5c74Smpi #define sb_endzero sb_flags 1269e437519Smvs short sb_state; /* socket state on sockbuf */ 1271a273344Smpi uint64_t sb_timeo_nsecs;/* timeout for read/write */ 12880b1b8fbSmvs struct klist sb_klist; /* process selecting read/write */ 129df930be7Sderaadt } so_rcv, so_snd; 130f94c55a9Sbluhm #define SB_MAX (2*1024*1024) /* default for max chars in sockbuf */ 131777bd9b3Sbluhm #define SB_LOCK 0x01 /* lock on data queue */ 132777bd9b3Sbluhm #define SB_WANT 0x02 /* someone is waiting to lock */ 133df930be7Sderaadt #define SB_WAIT 0x04 /* someone is waiting for data/space */ 134df930be7Sderaadt #define SB_ASYNC 0x10 /* ASYNC I/O, need signals */ 135cfc885acSbluhm #define SB_SPLICE 0x20 /* buffer is splice source or drain */ 136df930be7Sderaadt #define SB_NOINTR 0x40 /* operations not interruptible */ 137c75e434fSmvs #define SB_MTXLOCK 0x80 /* use sb_mtx for sockbuf protection */ 138df930be7Sderaadt 139c4071fd1Smillert void (*so_upcall)(struct socket *so, caddr_t arg, int waitf); 140df930be7Sderaadt caddr_t so_upcallarg; /* Arg for above */ 14173e0ad59Sderaadt uid_t so_euid, so_ruid; /* who opened the socket */ 14273e0ad59Sderaadt gid_t so_egid, so_rgid; 14373db9b26Sdhartmei pid_t so_cpid; /* pid of process that opened socket */ 144df930be7Sderaadt }; 145df930be7Sderaadt 146df930be7Sderaadt /* 147df930be7Sderaadt * Socket state bits. 1489e437519Smvs * 1499e437519Smvs * NOTE: The following states should be used with corresponding socket's 1509e437519Smvs * buffer `sb_state' only: 1519e437519Smvs * 1529e437519Smvs * SS_CANTSENDMORE with `so_snd' 153a651bdb4Smvs * SS_ISSENDING with `so_snd' 1544b9bfff3Smvs * SS_CANTRCVMORE with `so_rcv' 1554b9bfff3Smvs * SS_RCVATMARK with `so_rcv' 156df930be7Sderaadt */ 1579e437519Smvs 158df930be7Sderaadt #define SS_NOFDREF 0x001 /* no file table ref any more */ 159df930be7Sderaadt #define SS_ISCONNECTED 0x002 /* socket connected to a peer */ 160df930be7Sderaadt #define SS_ISCONNECTING 0x004 /* in process of connecting to peer */ 161df930be7Sderaadt #define SS_ISDISCONNECTING 0x008 /* in process of disconnecting */ 16233da1efbStb #define SS_CANTSENDMORE 0x010 /* can't send more data to peer */ 163df930be7Sderaadt #define SS_CANTRCVMORE 0x020 /* can't receive more data from peer */ 164df930be7Sderaadt #define SS_RCVATMARK 0x040 /* at mark on input */ 165751be64bSmillert #define SS_ISDISCONNECTED 0x800 /* socket disconnected from peer */ 166df930be7Sderaadt 167df930be7Sderaadt #define SS_PRIV 0x080 /* privileged for broadcast, raw... */ 168f1ea8dcbSderaadt #define SS_CONNECTOUT 0x1000 /* connect, not accept, at this end */ 169f620b6f9Smarkus #define SS_ISSENDING 0x2000 /* hint for lower layer */ 170f062910fSsemarie #define SS_DNS 0x4000 /* created using SOCK_DNS socket(2) */ 171cf85347fSmvs #define SS_NEWCONN_WAIT 0x8000 /* waiting sonewconn() relock */ 17288d6f328Sderaadt #define SS_YP 0x10000 /* created using ypconnect(2) */ 173df930be7Sderaadt 174228601a4Sclaudio #ifdef _KERNEL 17506235387Smpi 176d452b926Smvs #include <sys/protosw.h> 17706235387Smpi #include <lib/libkern/libkern.h> 17806235387Smpi 17906235387Smpi void soassertlocked(struct socket *); 180104c0a83Smvs void soassertlocked_readonly(struct socket *); 18106235387Smpi 182cf85347fSmvs static inline void 183cf85347fSmvs soref(struct socket *so) 184cf85347fSmvs { 185cf85347fSmvs refcnt_take(&so->so_refcnt); 186cf85347fSmvs } 187cf85347fSmvs 188cf85347fSmvs static inline void 189cf85347fSmvs sorele(struct socket *so) 190cf85347fSmvs { 191cf85347fSmvs refcnt_rele_wake(&so->so_refcnt); 192cf85347fSmvs } 193cf85347fSmvs 194df930be7Sderaadt /* 195df930be7Sderaadt * Macros for sockets and socket buffering. 196df930be7Sderaadt */ 197df930be7Sderaadt 19868d360c0Sbluhm #define isspliced(so) ((so)->so_sp && (so)->so_sp->ssp_socket) 19968d360c0Sbluhm #define issplicedback(so) ((so)->so_sp && (so)->so_sp->ssp_soback) 20068d360c0Sbluhm 201c75e434fSmvs static inline void 202c75e434fSmvs sb_mtx_lock(struct sockbuf *sb) 203c75e434fSmvs { 204c75e434fSmvs if (sb->sb_flags & SB_MTXLOCK) 205c75e434fSmvs mtx_enter(&sb->sb_mtx); 206c75e434fSmvs } 207c75e434fSmvs 208c75e434fSmvs static inline void 209c75e434fSmvs sb_mtx_unlock(struct sockbuf *sb) 210c75e434fSmvs { 211c75e434fSmvs if (sb->sb_flags & SB_MTXLOCK) 212c75e434fSmvs mtx_leave(&sb->sb_mtx); 213c75e434fSmvs } 214c75e434fSmvs 215c75e434fSmvs void sbmtxassertlocked(struct socket *so, struct sockbuf *); 216c75e434fSmvs 217df930be7Sderaadt /* 218df930be7Sderaadt * Do we need to notify the other side when I/O is possible? 219df930be7Sderaadt */ 22006235387Smpi static inline int 22106235387Smpi sb_notify(struct socket *so, struct sockbuf *sb) 22206235387Smpi { 223104c0a83Smvs int rv; 224104c0a83Smvs 22506235387Smpi soassertlocked(so); 226104c0a83Smvs 227104c0a83Smvs mtx_enter(&sb->sb_mtx); 228104c0a83Smvs rv = ((sb->sb_flags & (SB_WAIT|SB_ASYNC|SB_SPLICE)) != 0 || 22980b1b8fbSmvs !klist_empty(&sb->sb_klist)); 230104c0a83Smvs mtx_leave(&sb->sb_mtx); 231104c0a83Smvs 232104c0a83Smvs return rv; 23306235387Smpi } 234df930be7Sderaadt 235df930be7Sderaadt /* 236df930be7Sderaadt * How much space is there in a socket buffer (so->so_snd or so->so_rcv)? 237df930be7Sderaadt * This is problematical if the fields are unsigned, as the space might 238df930be7Sderaadt * still be negative (cc > hiwat or mbcnt > mbmax). Should detect 239105fe0afSmarkus * overflow and return 0. 240df930be7Sderaadt */ 241104c0a83Smvs 24206235387Smpi static inline long 24306235387Smpi sbspace(struct socket *so, struct sockbuf *sb) 24406235387Smpi { 245104c0a83Smvs soassertlocked_readonly(so); 246104c0a83Smvs 24706235387Smpi return lmin(sb->sb_hiwat - sb->sb_cc, sb->sb_mbmax - sb->sb_mbcnt); 24806235387Smpi } 249df930be7Sderaadt 250df930be7Sderaadt /* do we have to send all at once on a socket? */ 251df930be7Sderaadt #define sosendallatonce(so) \ 252df930be7Sderaadt ((so)->so_proto->pr_flags & PR_ATOMIC) 253df930be7Sderaadt 254f620b6f9Smarkus /* are we sending on this socket? */ 255f620b6f9Smarkus #define soissending(so) \ 256a651bdb4Smvs ((so)->so_snd.sb_state & SS_ISSENDING) 257f620b6f9Smarkus 258df930be7Sderaadt /* can we read something from so? */ 25924fc5127Smpi static inline int 26024fc5127Smpi soreadable(struct socket *so) 26124fc5127Smpi { 262104c0a83Smvs soassertlocked_readonly(so); 26324fc5127Smpi if (isspliced(so)) 26424fc5127Smpi return 0; 2654b9bfff3Smvs return (so->so_rcv.sb_state & SS_CANTRCVMORE) || so->so_qlen || 2664b9bfff3Smvs so->so_error || so->so_rcv.sb_cc >= so->so_rcv.sb_lowat; 26724fc5127Smpi } 268df930be7Sderaadt 269df930be7Sderaadt /* can we write something to so? */ 270d452b926Smvs static inline int 271d452b926Smvs sowriteable(struct socket *so) 272d452b926Smvs { 273104c0a83Smvs soassertlocked_readonly(so); 274d452b926Smvs return ((sbspace(so, &so->so_snd) >= so->so_snd.sb_lowat && 275d452b926Smvs ((so->so_state & SS_ISCONNECTED) || 276d452b926Smvs (so->so_proto->pr_flags & PR_CONNREQUIRED)==0)) || 2779e437519Smvs (so->so_snd.sb_state & SS_CANTSENDMORE) || so->so_error); 278d452b926Smvs } 279df930be7Sderaadt 280df930be7Sderaadt /* adjust counters in sb reflecting allocation of m */ 281d452b926Smvs static inline void 282d452b926Smvs sballoc(struct socket *so, struct sockbuf *sb, struct mbuf *m) 283d452b926Smvs { 284d452b926Smvs sb->sb_cc += m->m_len; 285d452b926Smvs if (m->m_type != MT_CONTROL && m->m_type != MT_SONAME) 286d452b926Smvs sb->sb_datacc += m->m_len; 287d452b926Smvs sb->sb_mbcnt += MSIZE; 288d452b926Smvs if (m->m_flags & M_EXT) 289d452b926Smvs sb->sb_mbcnt += m->m_ext.ext_size; 290d452b926Smvs } 291df930be7Sderaadt 292df930be7Sderaadt /* adjust counters in sb reflecting freeing of m */ 293d452b926Smvs static inline void 294d452b926Smvs sbfree(struct socket *so, struct sockbuf *sb, struct mbuf *m) 295d452b926Smvs { 296d452b926Smvs sb->sb_cc -= m->m_len; 297d452b926Smvs if (m->m_type != MT_CONTROL && m->m_type != MT_SONAME) 298d452b926Smvs sb->sb_datacc -= m->m_len; 299d452b926Smvs sb->sb_mbcnt -= MSIZE; 300d452b926Smvs if (m->m_flags & M_EXT) 301d452b926Smvs sb->sb_mbcnt -= m->m_ext.ext_size; 302d452b926Smvs } 303df930be7Sderaadt 304df930be7Sderaadt /* 3059f40d4acSmvs * Flags to sblock() 3069f40d4acSmvs */ 3079f40d4acSmvs #define SBL_WAIT 0x01 /* Wait if lock not immediately available. */ 3089f40d4acSmvs #define SBL_NOINTR 0x02 /* Enforce non-interruptible sleep. */ 3099f40d4acSmvs 3109f40d4acSmvs /* 311df930be7Sderaadt * Set lock on sockbuf sb; sleep if lock is already held. 3129f40d4acSmvs * Unless SB_NOINTR is set on sockbuf or SBL_NOINTR passed, 3139f40d4acSmvs * sleep is interruptible. Returns error without lock if 3149f40d4acSmvs * sleep is interrupted. 315df930be7Sderaadt */ 316d20db565Smpi int sblock(struct socket *, struct sockbuf *, int); 317df930be7Sderaadt 318df930be7Sderaadt /* release lock on sockbuf sb */ 319886de0baSmpi void sbunlock(struct socket *, struct sockbuf *); 320df930be7Sderaadt 321228601a4Sclaudio #define SB_EMPTY_FIXUP(sb) do { \ 322228601a4Sclaudio if ((sb)->sb_mb == NULL) { \ 323228601a4Sclaudio (sb)->sb_mbtail = NULL; \ 324228601a4Sclaudio (sb)->sb_lastrecord = NULL; \ 325228601a4Sclaudio } \ 326228601a4Sclaudio } while (/*CONSTCOND*/0) 327df930be7Sderaadt 3284c366c49Smiod extern u_long sb_max; 329df930be7Sderaadt 3308f4b9dbeSprovos extern struct pool socket_pool; 3318f4b9dbeSprovos 332ad43b9c6Smickey struct mbuf; 333ad43b9c6Smickey struct sockaddr; 334ad43b9c6Smickey struct proc; 335ad43b9c6Smickey struct msghdr; 336ad43b9c6Smickey struct stat; 337cc90df54Sprovos struct knote; 338ad43b9c6Smickey 339df930be7Sderaadt /* 340df930be7Sderaadt * File operations on sockets. 341df930be7Sderaadt */ 3422bd648c0Smpi int soo_read(struct file *, struct uio *, int); 3432bd648c0Smpi int soo_write(struct file *, struct uio *, int); 3442bd648c0Smpi int soo_ioctl(struct file *, u_long, caddr_t, struct proc *); 3452bd648c0Smpi int soo_kqfilter(struct file *, struct knote *); 3462bd648c0Smpi int soo_close(struct file *, struct proc *); 347c4071fd1Smillert int soo_stat(struct file *, struct stat *, struct proc *); 34806235387Smpi void sbappend(struct socket *, struct sockbuf *, struct mbuf *); 34906235387Smpi void sbappendstream(struct socket *, struct sockbuf *, struct mbuf *); 350c80d9406Sbluhm int sbappendaddr(struct socket *, struct sockbuf *, 351c80d9406Sbluhm const struct sockaddr *, struct mbuf *, struct mbuf *); 35206235387Smpi int sbappendcontrol(struct socket *, struct sockbuf *, struct mbuf *, 35306235387Smpi struct mbuf *); 35406235387Smpi void sbappendrecord(struct socket *, struct sockbuf *, struct mbuf *); 355d3407632Smpi void sbcompress(struct socket *, struct sockbuf *, struct mbuf *, 356d3407632Smpi struct mbuf *); 357287546eaSitojun struct mbuf * 35834befb6eSmvs sbcreatecontrol(const void *, size_t, int, int); 35906235387Smpi void sbdrop(struct socket *, struct sockbuf *, int); 360d3407632Smpi void sbdroprecord(struct socket *, struct sockbuf *); 36106235387Smpi void sbflush(struct socket *, struct sockbuf *); 36206235387Smpi void sbrelease(struct socket *, struct sockbuf *); 36334befb6eSmvs int sbcheckreserve(u_long, u_long); 3645d991f01Sclaudio int sbchecklowmem(void); 36506235387Smpi int sbreserve(struct socket *, struct sockbuf *, u_long); 36634befb6eSmvs int sbwait(struct socket *, struct sockbuf *); 3678f4b9dbeSprovos void soinit(void); 368621c49c5Smvs void soabort(struct socket *); 36934befb6eSmvs int soaccept(struct socket *, struct mbuf *); 37034befb6eSmvs int sobind(struct socket *, struct mbuf *, struct proc *); 37134befb6eSmvs void socantrcvmore(struct socket *); 37234befb6eSmvs void socantsendmore(struct socket *); 3734a4dc3eaSmpi int soclose(struct socket *, int); 37434befb6eSmvs int soconnect(struct socket *, struct mbuf *); 37534befb6eSmvs int soconnect2(struct socket *, struct socket *); 37634befb6eSmvs int socreate(int, struct socket **, int, int); 37734befb6eSmvs int sodisconnect(struct socket *); 378*94b08229Smvs struct socket *soalloc(const struct protosw *, int); 37934befb6eSmvs void sofree(struct socket *, int); 38034befb6eSmvs int sogetopt(struct socket *, int, int, struct mbuf *); 38134befb6eSmvs void sohasoutofband(struct socket *); 38234befb6eSmvs void soisconnected(struct socket *); 38334befb6eSmvs void soisconnecting(struct socket *); 38434befb6eSmvs void soisdisconnected(struct socket *); 38534befb6eSmvs void soisdisconnecting(struct socket *); 38634befb6eSmvs int solisten(struct socket *, int); 38762440853Sbluhm struct socket *sonewconn(struct socket *, int, int); 38834befb6eSmvs void soqinsque(struct socket *, struct socket *, int); 38934befb6eSmvs int soqremque(struct socket *, int); 39034befb6eSmvs int soreceive(struct socket *, struct mbuf **, struct uio *, 39134befb6eSmvs struct mbuf **, struct mbuf **, int *, socklen_t); 39234befb6eSmvs int soreserve(struct socket *, u_long, u_long); 39334befb6eSmvs int sosend(struct socket *, struct mbuf *, struct uio *, 39434befb6eSmvs struct mbuf *, struct mbuf *, int); 39534befb6eSmvs int sosetopt(struct socket *, int, int, struct mbuf *); 39634befb6eSmvs int soshutdown(struct socket *, int); 39734befb6eSmvs void sowakeup(struct socket *, struct sockbuf *); 398228601a4Sclaudio void sorwakeup(struct socket *); 399228601a4Sclaudio void sowwakeup(struct socket *); 400db68a6b1Stedu int sockargs(struct mbuf **, const void *, size_t, int); 401ad43b9c6Smickey 4021a273344Smpi int sosleep_nsec(struct socket *, void *, int, const char *, uint64_t); 40384245c07Sclaudio void solock(struct socket *); 4049bbbb445Sbluhm void solock_shared(struct socket *); 405cf85347fSmvs int solock_persocket(struct socket *); 406cf85347fSmvs void solock_pair(struct socket *, struct socket *); 40784245c07Sclaudio void sounlock(struct socket *); 4089bbbb445Sbluhm void sounlock_shared(struct socket *); 4091f21cadaSmpi 410c4071fd1Smillert int sendit(struct proc *, int, struct msghdr *, int, register_t *); 41134befb6eSmvs int recvit(struct proc *, int, struct msghdr *, caddr_t, register_t *); 4126ff2606cSguenther int doaccept(struct proc *, int, struct sockaddr *, socklen_t *, int, 4136ff2606cSguenther register_t *); 414ad43b9c6Smickey 415a3c9d230Sprovos #ifdef SOCKBUF_DEBUG 416a3c9d230Sprovos void sblastrecordchk(struct sockbuf *, const char *); 417a3c9d230Sprovos #define SBLASTRECORDCHK(sb, where) sblastrecordchk((sb), (where)) 418a3c9d230Sprovos 419a3c9d230Sprovos void sblastmbufchk(struct sockbuf *, const char *); 420a3c9d230Sprovos #define SBLASTMBUFCHK(sb, where) sblastmbufchk((sb), (where)) 421d3407632Smpi void sbcheck(struct socket *, struct sockbuf *); 422d3407632Smpi #define SBCHECK(so, sb) sbcheck((so), (sb)) 423a3c9d230Sprovos #else 424a3c9d230Sprovos #define SBLASTRECORDCHK(sb, where) /* nothing */ 425a3c9d230Sprovos #define SBLASTMBUFCHK(sb, where) /* nothing */ 426d3407632Smpi #define SBCHECK(so, sb) /* nothing */ 427a3c9d230Sprovos #endif /* SOCKBUF_DEBUG */ 428a3c9d230Sprovos 429df930be7Sderaadt #endif /* _KERNEL */ 43069690c9bSmvs 43169690c9bSmvs #endif /* _SYS_SOCKETVAR_H_ */ 432