1*f94c55a9Sbluhm /* $OpenBSD: socketvar.h,v 1.65 2016/09/04 11:10:19 bluhm 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 3539539e65Smillert #include <sys/selinfo.h> /* for struct selinfo */ 36145e6cebSprovos #include <sys/queue.h> 371c3052b5Sbluhm #include <sys/task.h> 3804ba85d2Smikeb #include <sys/timeout.h> 397990f0c4Stedu #include <sys/rwlock.h> 40145e6cebSprovos 41de9f3fadSguenther #ifndef _SOCKLEN_T_DEFINED_ 42de9f3fadSguenther #define _SOCKLEN_T_DEFINED_ 43de9f3fadSguenther typedef __socklen_t socklen_t; /* length type for network syscalls */ 44de9f3fadSguenther #endif 45de9f3fadSguenther 46145e6cebSprovos TAILQ_HEAD(soqhead, socket); 47df930be7Sderaadt 48df930be7Sderaadt /* 49df930be7Sderaadt * Kernel structure per socket. 50df930be7Sderaadt * Contains send and receive buffer queues, 51df930be7Sderaadt * handle on protocol and pointer to protocol 52df930be7Sderaadt * private data and error information. 53df930be7Sderaadt */ 54df930be7Sderaadt struct socket { 55df930be7Sderaadt short so_type; /* generic type, see socket.h */ 56df930be7Sderaadt short so_options; /* from socket call, see socket.h */ 57df930be7Sderaadt short so_linger; /* time to linger while closing */ 58df930be7Sderaadt short so_state; /* internal state flags SS_*, below */ 59df930be7Sderaadt void *so_pcb; /* protocol control block */ 60df930be7Sderaadt struct protosw *so_proto; /* protocol handle */ 61df930be7Sderaadt /* 62df930be7Sderaadt * Variables for connection queueing. 63df930be7Sderaadt * Socket where accepts occur is so_head in all subsidiary sockets. 64df930be7Sderaadt * If so_head is 0, socket is not related to an accept. 65df930be7Sderaadt * For head socket so_q0 queues partially completed connections, 66df930be7Sderaadt * while so_q is a queue of connections ready to be accepted. 67df930be7Sderaadt * If a connection is aborted and it has so_head set, then 68df930be7Sderaadt * it has to be pulled out of either so_q0 or so_q. 69df930be7Sderaadt * We allow connections to queue up based on current queue lengths 70df930be7Sderaadt * and limit on number of queued connections for this socket. 71df930be7Sderaadt */ 72df930be7Sderaadt struct socket *so_head; /* back pointer to accept socket */ 73145e6cebSprovos struct soqhead *so_onq; /* queue (q or q0) that we're on */ 74145e6cebSprovos struct soqhead so_q0; /* queue of partial connections */ 75145e6cebSprovos struct soqhead so_q; /* queue of incoming connections */ 76145e6cebSprovos TAILQ_ENTRY(socket) so_qe; /* our queue entry (q or q0) */ 77df930be7Sderaadt short so_q0len; /* partials on so_q0 */ 78df930be7Sderaadt short so_qlen; /* number of connections on so_q */ 79df930be7Sderaadt short so_qlimit; /* max number queued connections */ 80df930be7Sderaadt short so_timeo; /* connection timeout */ 81df930be7Sderaadt u_short so_error; /* error affecting connection */ 82df930be7Sderaadt pid_t so_pgid; /* pgid for signals */ 8331e15491Sderaadt uid_t so_siguid; /* uid of process who set so_pgid */ 8431e15491Sderaadt uid_t so_sigeuid; /* euid of process who set so_pgid */ 85df930be7Sderaadt u_long so_oobmark; /* chars to oob mark */ 8668d360c0Sbluhm /* 8768d360c0Sbluhm * Variables for socket splicing, allocated only when needed. 8868d360c0Sbluhm */ 8968d360c0Sbluhm struct sosplice { 9068d360c0Sbluhm struct socket *ssp_socket; /* send data to drain socket */ 9168d360c0Sbluhm struct socket *ssp_soback; /* back ref to source socket */ 9268d360c0Sbluhm off_t ssp_len; /* number of bytes spliced */ 9368d360c0Sbluhm off_t ssp_max; /* maximum number of bytes */ 9468d360c0Sbluhm struct timeval ssp_idletv; /* idle timeout */ 9568d360c0Sbluhm struct timeout ssp_idleto; 961c3052b5Sbluhm struct task ssp_task; /* task for somove */ 9768d360c0Sbluhm } *so_sp; 98df930be7Sderaadt /* 99df930be7Sderaadt * Variables for socket buffering. 100df930be7Sderaadt */ 101df930be7Sderaadt struct sockbuf { 102df930be7Sderaadt u_long sb_cc; /* actual chars in buffer */ 103e3cfaa00Skurt u_long sb_datacc; /* data only chars in buffer */ 104df930be7Sderaadt u_long sb_hiwat; /* max actual char count */ 1055d991f01Sclaudio u_long sb_wat; /* default watermark */ 106df930be7Sderaadt u_long sb_mbcnt; /* chars of mbufs used */ 107df930be7Sderaadt u_long sb_mbmax; /* max chars of mbufs to use */ 108df930be7Sderaadt long sb_lowat; /* low water mark */ 109df930be7Sderaadt struct mbuf *sb_mb; /* the mbuf chain */ 110a3c9d230Sprovos struct mbuf *sb_mbtail; /* the last mbuf in the chain */ 111a3c9d230Sprovos struct mbuf *sb_lastrecord;/* first mbuf of last record in 112a3c9d230Sprovos socket buffer */ 113df930be7Sderaadt struct selinfo sb_sel; /* process selecting read/write */ 1147990f0c4Stedu struct rwlock sb_lock; /* exclusive access from process */ 115cfc885acSbluhm int sb_flagsintr; /* flags, changed during interrupt */ 116df930be7Sderaadt short sb_flags; /* flags, see below */ 117e6364943Sderaadt u_short sb_timeo; /* timeout for read/write */ 118df930be7Sderaadt } so_rcv, so_snd; 119*f94c55a9Sbluhm #define SB_MAX (2*1024*1024) /* default for max chars in sockbuf */ 120df930be7Sderaadt #define SB_WAIT 0x04 /* someone is waiting for data/space */ 121df930be7Sderaadt #define SB_SEL 0x08 /* someone is selecting */ 122df930be7Sderaadt #define SB_ASYNC 0x10 /* ASYNC I/O, need signals */ 123cfc885acSbluhm #define SB_SPLICE 0x20 /* buffer is splice source or drain */ 124df930be7Sderaadt #define SB_NOINTR 0x40 /* operations not interruptible */ 1251a12e8a7Sprovos #define SB_KNOTE 0x80 /* kernel note attached */ 126df930be7Sderaadt 127c4071fd1Smillert void (*so_upcall)(struct socket *so, caddr_t arg, int waitf); 128df930be7Sderaadt caddr_t so_upcallarg; /* Arg for above */ 12973e0ad59Sderaadt uid_t so_euid, so_ruid; /* who opened the socket */ 13073e0ad59Sderaadt gid_t so_egid, so_rgid; 13173db9b26Sdhartmei pid_t so_cpid; /* pid of process that opened socket */ 132df930be7Sderaadt }; 133df930be7Sderaadt 134df930be7Sderaadt /* 135df930be7Sderaadt * Socket state bits. 136df930be7Sderaadt */ 137df930be7Sderaadt #define SS_NOFDREF 0x001 /* no file table ref any more */ 138df930be7Sderaadt #define SS_ISCONNECTED 0x002 /* socket connected to a peer */ 139df930be7Sderaadt #define SS_ISCONNECTING 0x004 /* in process of connecting to peer */ 140df930be7Sderaadt #define SS_ISDISCONNECTING 0x008 /* in process of disconnecting */ 141df930be7Sderaadt #define SS_CANTSENDMORE 0x010 /* can't send more data to peer */ 142df930be7Sderaadt #define SS_CANTRCVMORE 0x020 /* can't receive more data from peer */ 143df930be7Sderaadt #define SS_RCVATMARK 0x040 /* at mark on input */ 144751be64bSmillert #define SS_ISDISCONNECTED 0x800 /* socket disconnected from peer */ 145df930be7Sderaadt 146df930be7Sderaadt #define SS_PRIV 0x080 /* privileged for broadcast, raw... */ 147df930be7Sderaadt #define SS_NBIO 0x100 /* non-blocking ops */ 148df930be7Sderaadt #define SS_ASYNC 0x200 /* async i/o notify */ 149f1ea8dcbSderaadt #define SS_CONNECTOUT 0x1000 /* connect, not accept, at this end */ 150f620b6f9Smarkus #define SS_ISSENDING 0x2000 /* hint for lower layer */ 151f062910fSsemarie #define SS_DNS 0x4000 /* created using SOCK_DNS socket(2) */ 152df930be7Sderaadt 153228601a4Sclaudio #ifdef _KERNEL 154df930be7Sderaadt /* 155df930be7Sderaadt * Macros for sockets and socket buffering. 156df930be7Sderaadt */ 157df930be7Sderaadt 15868d360c0Sbluhm #define isspliced(so) ((so)->so_sp && (so)->so_sp->ssp_socket) 15968d360c0Sbluhm #define issplicedback(so) ((so)->so_sp && (so)->so_sp->ssp_soback) 16068d360c0Sbluhm 161df930be7Sderaadt /* 162df930be7Sderaadt * Do we need to notify the other side when I/O is possible? 163df930be7Sderaadt */ 164cfc885acSbluhm #define sb_notify(sb) ((((sb)->sb_flags | (sb)->sb_flagsintr) & \ 165cfc885acSbluhm (SB_WAIT|SB_SEL|SB_ASYNC|SB_SPLICE|SB_KNOTE)) != 0) 166df930be7Sderaadt 167df930be7Sderaadt /* 168df930be7Sderaadt * How much space is there in a socket buffer (so->so_snd or so->so_rcv)? 169df930be7Sderaadt * This is problematical if the fields are unsigned, as the space might 170df930be7Sderaadt * still be negative (cc > hiwat or mbcnt > mbmax). Should detect 171105fe0afSmarkus * overflow and return 0. 172df930be7Sderaadt */ 173df930be7Sderaadt #define sbspace(sb) \ 174105fe0afSmarkus lmin((sb)->sb_hiwat - (sb)->sb_cc, (sb)->sb_mbmax - (sb)->sb_mbcnt) 175df930be7Sderaadt 176df930be7Sderaadt /* do we have to send all at once on a socket? */ 177df930be7Sderaadt #define sosendallatonce(so) \ 178df930be7Sderaadt ((so)->so_proto->pr_flags & PR_ATOMIC) 179df930be7Sderaadt 180f620b6f9Smarkus /* are we sending on this socket? */ 181f620b6f9Smarkus #define soissending(so) \ 182f620b6f9Smarkus ((so)->so_state & SS_ISSENDING) 183f620b6f9Smarkus 184df930be7Sderaadt /* can we read something from so? */ 18583e2f23dSclaudio #define soreadable(so) \ 18668d360c0Sbluhm (!isspliced(so) && \ 187df930be7Sderaadt ((so)->so_rcv.sb_cc >= (so)->so_rcv.sb_lowat || \ 188df930be7Sderaadt ((so)->so_state & SS_CANTRCVMORE) || \ 18983e2f23dSclaudio (so)->so_qlen || (so)->so_error)) 190df930be7Sderaadt 191df930be7Sderaadt /* can we write something to so? */ 192df930be7Sderaadt #define sowriteable(so) \ 193ad43b9c6Smickey ((sbspace(&(so)->so_snd) >= (so)->so_snd.sb_lowat && \ 194df930be7Sderaadt (((so)->so_state & SS_ISCONNECTED) || \ 195ad43b9c6Smickey ((so)->so_proto->pr_flags & PR_CONNREQUIRED)==0)) || \ 1967ad69040Sderaadt ((so)->so_state & SS_CANTSENDMORE) || (so)->so_error) 197df930be7Sderaadt 198df930be7Sderaadt /* adjust counters in sb reflecting allocation of m */ 199cabc23fbSderaadt #define sballoc(sb, m) do { \ 200df930be7Sderaadt (sb)->sb_cc += (m)->m_len; \ 201e3cfaa00Skurt if ((m)->m_type != MT_CONTROL && (m)->m_type != MT_SONAME) \ 202e3cfaa00Skurt (sb)->sb_datacc += (m)->m_len; \ 203df930be7Sderaadt (sb)->sb_mbcnt += MSIZE; \ 204df930be7Sderaadt if ((m)->m_flags & M_EXT) \ 205df930be7Sderaadt (sb)->sb_mbcnt += (m)->m_ext.ext_size; \ 206cabc23fbSderaadt } while (/* CONSTCOND */ 0) 207df930be7Sderaadt 208df930be7Sderaadt /* adjust counters in sb reflecting freeing of m */ 209cabc23fbSderaadt #define sbfree(sb, m) do { \ 210df930be7Sderaadt (sb)->sb_cc -= (m)->m_len; \ 211e3cfaa00Skurt if ((m)->m_type != MT_CONTROL && (m)->m_type != MT_SONAME) \ 212e3cfaa00Skurt (sb)->sb_datacc -= (m)->m_len; \ 213df930be7Sderaadt (sb)->sb_mbcnt -= MSIZE; \ 214df930be7Sderaadt if ((m)->m_flags & M_EXT) \ 215df930be7Sderaadt (sb)->sb_mbcnt -= (m)->m_ext.ext_size; \ 216cabc23fbSderaadt } while (/* CONSTCOND */ 0) 217df930be7Sderaadt 218df930be7Sderaadt /* 219df930be7Sderaadt * Set lock on sockbuf sb; sleep if lock is already held. 220df930be7Sderaadt * Unless SB_NOINTR is set on sockbuf, sleep is interruptible. 221df930be7Sderaadt * Returns error without lock if sleep is interrupted. 222df930be7Sderaadt */ 2237990f0c4Stedu int sblock(struct sockbuf *sb, int wf); 224df930be7Sderaadt 225df930be7Sderaadt /* release lock on sockbuf sb */ 2267990f0c4Stedu void sbunlock(struct sockbuf *sb); 227df930be7Sderaadt 228228601a4Sclaudio #define SB_EMPTY_FIXUP(sb) do { \ 229228601a4Sclaudio if ((sb)->sb_mb == NULL) { \ 230228601a4Sclaudio (sb)->sb_mbtail = NULL; \ 231228601a4Sclaudio (sb)->sb_lastrecord = NULL; \ 232228601a4Sclaudio } \ 233228601a4Sclaudio } while (/*CONSTCOND*/0) 234df930be7Sderaadt 2354c366c49Smiod extern u_long sb_max; 236df930be7Sderaadt 2378f4b9dbeSprovos extern struct pool socket_pool; 2388f4b9dbeSprovos 239ad43b9c6Smickey struct mbuf; 240ad43b9c6Smickey struct sockaddr; 241ad43b9c6Smickey struct proc; 242ad43b9c6Smickey struct msghdr; 243ad43b9c6Smickey struct stat; 244cc90df54Sprovos struct knote; 245ad43b9c6Smickey 246df930be7Sderaadt /* 247df930be7Sderaadt * File operations on sockets. 248df930be7Sderaadt */ 249c4071fd1Smillert int soo_read(struct file *fp, off_t *, struct uio *uio, 250c4071fd1Smillert struct ucred *cred); 251c4071fd1Smillert int soo_write(struct file *fp, off_t *, struct uio *uio, 252c4071fd1Smillert struct ucred *cred); 253c4071fd1Smillert int soo_ioctl(struct file *fp, u_long cmd, caddr_t data, 254c4071fd1Smillert struct proc *p); 255154dfaaaSmillert int soo_poll(struct file *fp, int events, struct proc *p); 256c4071fd1Smillert int soo_kqfilter(struct file *fp, struct knote *kn); 257c4071fd1Smillert int soo_close(struct file *fp, struct proc *p); 258c4071fd1Smillert int soo_stat(struct file *, struct stat *, struct proc *); 259c4071fd1Smillert int uipc_usrreq(struct socket *, int , struct mbuf *, 260621c015eSthib struct mbuf *, struct mbuf *, struct proc *); 261c4071fd1Smillert void sbappend(struct sockbuf *sb, struct mbuf *m); 262a3c9d230Sprovos void sbappendstream(struct sockbuf *sb, struct mbuf *m); 263c4071fd1Smillert int sbappendaddr(struct sockbuf *sb, struct sockaddr *asa, 264c4071fd1Smillert struct mbuf *m0, struct mbuf *control); 265c4071fd1Smillert int sbappendcontrol(struct sockbuf *sb, struct mbuf *m0, 266c4071fd1Smillert struct mbuf *control); 267c4071fd1Smillert void sbappendrecord(struct sockbuf *sb, struct mbuf *m0); 268c4071fd1Smillert void sbcompress(struct sockbuf *sb, struct mbuf *m, struct mbuf *n); 269287546eaSitojun struct mbuf * 270c4071fd1Smillert sbcreatecontrol(caddr_t p, int size, int type, int level); 271c4071fd1Smillert void sbdrop(struct sockbuf *sb, int len); 272c4071fd1Smillert void sbdroprecord(struct sockbuf *sb); 273c4071fd1Smillert void sbflush(struct sockbuf *sb); 274c4071fd1Smillert void sbinsertoob(struct sockbuf *sb, struct mbuf *m0); 275c4071fd1Smillert void sbrelease(struct sockbuf *sb); 276c1ea8f77Sderaadt int sbcheckreserve(u_long cnt, u_long defcnt); 2775d991f01Sclaudio int sbchecklowmem(void); 278c4071fd1Smillert int sbreserve(struct sockbuf *sb, u_long cc); 279c4071fd1Smillert int sbwait(struct sockbuf *sb); 280c4071fd1Smillert int sb_lock(struct sockbuf *sb); 2818f4b9dbeSprovos void soinit(void); 282c4071fd1Smillert int soabort(struct socket *so); 283c4071fd1Smillert int soaccept(struct socket *so, struct mbuf *nam); 284621c015eSthib int sobind(struct socket *so, struct mbuf *nam, struct proc *p); 285c4071fd1Smillert void socantrcvmore(struct socket *so); 286c4071fd1Smillert void socantsendmore(struct socket *so); 287c4071fd1Smillert int soclose(struct socket *so); 288c4071fd1Smillert int soconnect(struct socket *so, struct mbuf *nam); 289c4071fd1Smillert int soconnect2(struct socket *so1, struct socket *so2); 290c4071fd1Smillert int socreate(int dom, struct socket **aso, int type, int proto); 291c4071fd1Smillert int sodisconnect(struct socket *so); 292c4071fd1Smillert void sofree(struct socket *so); 293c4071fd1Smillert int sogetopt(struct socket *so, int level, int optname, 294c4071fd1Smillert struct mbuf **mp); 295c4071fd1Smillert void sohasoutofband(struct socket *so); 296c4071fd1Smillert void soisconnected(struct socket *so); 297c4071fd1Smillert void soisconnecting(struct socket *so); 298c4071fd1Smillert void soisdisconnected(struct socket *so); 299c4071fd1Smillert void soisdisconnecting(struct socket *so); 300c4071fd1Smillert int solisten(struct socket *so, int backlog); 301c4071fd1Smillert struct socket *sonewconn(struct socket *head, int connstatus); 302c4071fd1Smillert void soqinsque(struct socket *head, struct socket *so, int q); 303c4071fd1Smillert int soqremque(struct socket *so, int q); 304c4071fd1Smillert int soreceive(struct socket *so, struct mbuf **paddr, struct uio *uio, 30501d36b92Sotto struct mbuf **mp0, struct mbuf **controlp, int *flagsp, 30601d36b92Sotto socklen_t controllen); 307c4071fd1Smillert int soreserve(struct socket *so, u_long sndcc, u_long rcvcc); 308c4071fd1Smillert void sorflush(struct socket *so); 309c4071fd1Smillert int sosend(struct socket *so, struct mbuf *addr, struct uio *uio, 310c4071fd1Smillert struct mbuf *top, struct mbuf *control, int flags); 311c4071fd1Smillert int sosetopt(struct socket *so, int level, int optname, 312c4071fd1Smillert struct mbuf *m0); 313c4071fd1Smillert int soshutdown(struct socket *so, int how); 314c4071fd1Smillert void sowakeup(struct socket *so, struct sockbuf *sb); 315228601a4Sclaudio void sorwakeup(struct socket *); 316228601a4Sclaudio void sowwakeup(struct socket *); 317db68a6b1Stedu int sockargs(struct mbuf **, const void *, size_t, int); 318ad43b9c6Smickey 319c4071fd1Smillert int sendit(struct proc *, int, struct msghdr *, int, register_t *); 320c4071fd1Smillert int recvit(struct proc *, int, struct msghdr *, caddr_t, 321c4071fd1Smillert register_t *); 3226ff2606cSguenther int doaccept(struct proc *, int, struct sockaddr *, socklen_t *, int, 3236ff2606cSguenther register_t *); 324ad43b9c6Smickey 325a3c9d230Sprovos #ifdef SOCKBUF_DEBUG 326a3c9d230Sprovos void sblastrecordchk(struct sockbuf *, const char *); 327a3c9d230Sprovos #define SBLASTRECORDCHK(sb, where) sblastrecordchk((sb), (where)) 328a3c9d230Sprovos 329a3c9d230Sprovos void sblastmbufchk(struct sockbuf *, const char *); 330a3c9d230Sprovos #define SBLASTMBUFCHK(sb, where) sblastmbufchk((sb), (where)) 3312ff0994fSbluhm void sbcheck(struct sockbuf *sb); 3322ff0994fSbluhm #define SBCHECK(sb) sbcheck(sb) 333a3c9d230Sprovos #else 334a3c9d230Sprovos #define SBLASTRECORDCHK(sb, where) /* nothing */ 335a3c9d230Sprovos #define SBLASTMBUFCHK(sb, where) /* nothing */ 3362ff0994fSbluhm #define SBCHECK(sb) /* nothing */ 337a3c9d230Sprovos #endif /* SOCKBUF_DEBUG */ 338a3c9d230Sprovos 339df930be7Sderaadt #endif /* _KERNEL */ 340