1*04ba85d2Smikeb /* $OpenBSD: socketvar.h,v 1.49 2011/07/04 00:33:36 mikeb 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> 37*04ba85d2Smikeb #include <sys/timeout.h> 38145e6cebSprovos 39145e6cebSprovos TAILQ_HEAD(soqhead, socket); 40df930be7Sderaadt 41df930be7Sderaadt /* 42df930be7Sderaadt * Kernel structure per socket. 43df930be7Sderaadt * Contains send and receive buffer queues, 44df930be7Sderaadt * handle on protocol and pointer to protocol 45df930be7Sderaadt * private data and error information. 46df930be7Sderaadt */ 47df930be7Sderaadt struct socket { 48df930be7Sderaadt short so_type; /* generic type, see socket.h */ 49df930be7Sderaadt short so_options; /* from socket call, see socket.h */ 50df930be7Sderaadt short so_linger; /* time to linger while closing */ 51df930be7Sderaadt short so_state; /* internal state flags SS_*, below */ 52df930be7Sderaadt void *so_pcb; /* protocol control block */ 53df930be7Sderaadt struct protosw *so_proto; /* protocol handle */ 54df930be7Sderaadt /* 55df930be7Sderaadt * Variables for connection queueing. 56df930be7Sderaadt * Socket where accepts occur is so_head in all subsidiary sockets. 57df930be7Sderaadt * If so_head is 0, socket is not related to an accept. 58df930be7Sderaadt * For head socket so_q0 queues partially completed connections, 59df930be7Sderaadt * while so_q is a queue of connections ready to be accepted. 60df930be7Sderaadt * If a connection is aborted and it has so_head set, then 61df930be7Sderaadt * it has to be pulled out of either so_q0 or so_q. 62df930be7Sderaadt * We allow connections to queue up based on current queue lengths 63df930be7Sderaadt * and limit on number of queued connections for this socket. 64df930be7Sderaadt */ 65df930be7Sderaadt struct socket *so_head; /* back pointer to accept socket */ 66145e6cebSprovos struct soqhead *so_onq; /* queue (q or q0) that we're on */ 67145e6cebSprovos struct soqhead so_q0; /* queue of partial connections */ 68145e6cebSprovos struct soqhead so_q; /* queue of incoming connections */ 69145e6cebSprovos TAILQ_ENTRY(socket) so_qe; /* our queue entry (q or q0) */ 70df930be7Sderaadt short so_q0len; /* partials on so_q0 */ 71df930be7Sderaadt short so_qlen; /* number of connections on so_q */ 72df930be7Sderaadt short so_qlimit; /* max number queued connections */ 73df930be7Sderaadt short so_timeo; /* connection timeout */ 74df930be7Sderaadt u_short so_error; /* error affecting connection */ 75df930be7Sderaadt pid_t so_pgid; /* pgid for signals */ 7631e15491Sderaadt uid_t so_siguid; /* uid of process who set so_pgid */ 7731e15491Sderaadt uid_t so_sigeuid; /* euid of process who set so_pgid */ 78df930be7Sderaadt u_long so_oobmark; /* chars to oob mark */ 793e816f04Sbluhm 803e816f04Sbluhm #if 1 /*def SOCKET_SPLICE*/ 813e816f04Sbluhm struct socket *so_splice; /* send data to drain socket */ 823e816f04Sbluhm struct socket *so_spliceback; /* back ref for notify and cleanup */ 833e816f04Sbluhm off_t so_splicelen; /* number of bytes spliced so far */ 843e816f04Sbluhm off_t so_splicemax; /* maximum number of bytes to splice */ 85*04ba85d2Smikeb struct timeval so_idletv; /* idle timeout */ 86*04ba85d2Smikeb struct timeout so_idleto; 873e816f04Sbluhm #endif /* SOCKET_SPLICE */ 88df930be7Sderaadt /* 89df930be7Sderaadt * Variables for socket buffering. 90df930be7Sderaadt */ 91df930be7Sderaadt struct sockbuf { 92df930be7Sderaadt u_long sb_cc; /* actual chars in buffer */ 93e3cfaa00Skurt u_long sb_datacc; /* data only chars in buffer */ 94df930be7Sderaadt u_long sb_hiwat; /* max actual char count */ 955d991f01Sclaudio u_long sb_wat; /* default watermark */ 96df930be7Sderaadt u_long sb_mbcnt; /* chars of mbufs used */ 97df930be7Sderaadt u_long sb_mbmax; /* max chars of mbufs to use */ 98df930be7Sderaadt long sb_lowat; /* low water mark */ 99df930be7Sderaadt struct mbuf *sb_mb; /* the mbuf chain */ 100a3c9d230Sprovos struct mbuf *sb_mbtail; /* the last mbuf in the chain */ 101a3c9d230Sprovos struct mbuf *sb_lastrecord;/* first mbuf of last record in 102a3c9d230Sprovos socket buffer */ 103df930be7Sderaadt struct selinfo sb_sel; /* process selecting read/write */ 104df930be7Sderaadt short sb_flags; /* flags, see below */ 105e6364943Sderaadt u_short sb_timeo; /* timeout for read/write */ 106df930be7Sderaadt } so_rcv, so_snd; 107df930be7Sderaadt #define SB_MAX (256*1024) /* default for max chars in sockbuf */ 108df930be7Sderaadt #define SB_LOCK 0x01 /* lock on data queue */ 109df930be7Sderaadt #define SB_WANT 0x02 /* someone is waiting to lock */ 110df930be7Sderaadt #define SB_WAIT 0x04 /* someone is waiting for data/space */ 111df930be7Sderaadt #define SB_SEL 0x08 /* someone is selecting */ 112df930be7Sderaadt #define SB_ASYNC 0x10 /* ASYNC I/O, need signals */ 113df930be7Sderaadt #define SB_NOINTR 0x40 /* operations not interruptible */ 1141a12e8a7Sprovos #define SB_KNOTE 0x80 /* kernel note attached */ 1153e816f04Sbluhm #define SB_SPLICE 0x0100 /* buffer is splice source or drain */ 116df930be7Sderaadt 117ad43b9c6Smickey void *so_internal; /* Space for svr4 stream data */ 118c4071fd1Smillert void (*so_upcall)(struct socket *so, caddr_t arg, int waitf); 119df930be7Sderaadt caddr_t so_upcallarg; /* Arg for above */ 12073e0ad59Sderaadt uid_t so_euid, so_ruid; /* who opened the socket */ 12173e0ad59Sderaadt gid_t so_egid, so_rgid; 12273db9b26Sdhartmei pid_t so_cpid; /* pid of process that opened socket */ 123df930be7Sderaadt }; 124df930be7Sderaadt 125cabc23fbSderaadt #define SB_EMPTY_FIXUP(sb) do { \ 126a3c9d230Sprovos if ((sb)->sb_mb == NULL) { \ 127a3c9d230Sprovos (sb)->sb_mbtail = NULL; \ 128a3c9d230Sprovos (sb)->sb_lastrecord = NULL; \ 129a3c9d230Sprovos } \ 130a3c9d230Sprovos } while (/*CONSTCOND*/0) 131a3c9d230Sprovos 132df930be7Sderaadt /* 133df930be7Sderaadt * Socket state bits. 134df930be7Sderaadt */ 135df930be7Sderaadt #define SS_NOFDREF 0x001 /* no file table ref any more */ 136df930be7Sderaadt #define SS_ISCONNECTED 0x002 /* socket connected to a peer */ 137df930be7Sderaadt #define SS_ISCONNECTING 0x004 /* in process of connecting to peer */ 138df930be7Sderaadt #define SS_ISDISCONNECTING 0x008 /* in process of disconnecting */ 139df930be7Sderaadt #define SS_CANTSENDMORE 0x010 /* can't send more data to peer */ 140df930be7Sderaadt #define SS_CANTRCVMORE 0x020 /* can't receive more data from peer */ 141df930be7Sderaadt #define SS_RCVATMARK 0x040 /* at mark on input */ 142751be64bSmillert #define SS_ISDISCONNECTED 0x800 /* socket disconnected from peer */ 143df930be7Sderaadt 144df930be7Sderaadt #define SS_PRIV 0x080 /* privileged for broadcast, raw... */ 145df930be7Sderaadt #define SS_NBIO 0x100 /* non-blocking ops */ 146df930be7Sderaadt #define SS_ASYNC 0x200 /* async i/o notify */ 147df930be7Sderaadt #define SS_ISCONFIRMING 0x400 /* deciding to accept connection req */ 148f1ea8dcbSderaadt #define SS_CONNECTOUT 0x1000 /* connect, not accept, at this end */ 149f620b6f9Smarkus #define SS_ISSENDING 0x2000 /* hint for lower layer */ 150df930be7Sderaadt 151df930be7Sderaadt /* 152df930be7Sderaadt * Macros for sockets and socket buffering. 153df930be7Sderaadt */ 154df930be7Sderaadt 155df930be7Sderaadt /* 156df930be7Sderaadt * Do we need to notify the other side when I/O is possible? 157df930be7Sderaadt */ 1581a12e8a7Sprovos #define sb_notify(sb) (((sb)->sb_flags & (SB_WAIT|SB_SEL|SB_ASYNC| \ 1593e816f04Sbluhm SB_KNOTE|SB_SPLICE)) != 0) 160df930be7Sderaadt 161df930be7Sderaadt /* 162df930be7Sderaadt * How much space is there in a socket buffer (so->so_snd or so->so_rcv)? 163df930be7Sderaadt * This is problematical if the fields are unsigned, as the space might 164df930be7Sderaadt * still be negative (cc > hiwat or mbcnt > mbmax). Should detect 165105fe0afSmarkus * overflow and return 0. 166df930be7Sderaadt */ 167df930be7Sderaadt #define sbspace(sb) \ 168105fe0afSmarkus lmin((sb)->sb_hiwat - (sb)->sb_cc, (sb)->sb_mbmax - (sb)->sb_mbcnt) 169df930be7Sderaadt 170df930be7Sderaadt /* do we have to send all at once on a socket? */ 171df930be7Sderaadt #define sosendallatonce(so) \ 172df930be7Sderaadt ((so)->so_proto->pr_flags & PR_ATOMIC) 173df930be7Sderaadt 174f620b6f9Smarkus /* are we sending on this socket? */ 175f620b6f9Smarkus #define soissending(so) \ 176f620b6f9Smarkus ((so)->so_state & SS_ISSENDING) 177f620b6f9Smarkus 178df930be7Sderaadt /* can we read something from so? */ 1793e816f04Sbluhm #define _soreadable(so) \ 180df930be7Sderaadt ((so)->so_rcv.sb_cc >= (so)->so_rcv.sb_lowat || \ 181df930be7Sderaadt ((so)->so_state & SS_CANTRCVMORE) || \ 182df930be7Sderaadt (so)->so_qlen || (so)->so_error) 183df930be7Sderaadt 184df930be7Sderaadt /* can we write something to so? */ 185df930be7Sderaadt #define sowriteable(so) \ 186ad43b9c6Smickey ((sbspace(&(so)->so_snd) >= (so)->so_snd.sb_lowat && \ 187df930be7Sderaadt (((so)->so_state & SS_ISCONNECTED) || \ 188ad43b9c6Smickey ((so)->so_proto->pr_flags & PR_CONNREQUIRED)==0)) || \ 1897ad69040Sderaadt ((so)->so_state & SS_CANTSENDMORE) || (so)->so_error) 190df930be7Sderaadt 191df930be7Sderaadt /* adjust counters in sb reflecting allocation of m */ 192cabc23fbSderaadt #define sballoc(sb, m) do { \ 193df930be7Sderaadt (sb)->sb_cc += (m)->m_len; \ 194e3cfaa00Skurt if ((m)->m_type != MT_CONTROL && (m)->m_type != MT_SONAME) \ 195e3cfaa00Skurt (sb)->sb_datacc += (m)->m_len; \ 196df930be7Sderaadt (sb)->sb_mbcnt += MSIZE; \ 197df930be7Sderaadt if ((m)->m_flags & M_EXT) \ 198df930be7Sderaadt (sb)->sb_mbcnt += (m)->m_ext.ext_size; \ 199cabc23fbSderaadt } while (/* CONSTCOND */ 0) 200df930be7Sderaadt 201df930be7Sderaadt /* adjust counters in sb reflecting freeing of m */ 202cabc23fbSderaadt #define sbfree(sb, m) do { \ 203df930be7Sderaadt (sb)->sb_cc -= (m)->m_len; \ 204e3cfaa00Skurt if ((m)->m_type != MT_CONTROL && (m)->m_type != MT_SONAME) \ 205e3cfaa00Skurt (sb)->sb_datacc -= (m)->m_len; \ 206df930be7Sderaadt (sb)->sb_mbcnt -= MSIZE; \ 207df930be7Sderaadt if ((m)->m_flags & M_EXT) \ 208df930be7Sderaadt (sb)->sb_mbcnt -= (m)->m_ext.ext_size; \ 209cabc23fbSderaadt } while (/* CONSTCOND */ 0) 210df930be7Sderaadt 211df930be7Sderaadt /* 212df930be7Sderaadt * Set lock on sockbuf sb; sleep if lock is already held. 213df930be7Sderaadt * Unless SB_NOINTR is set on sockbuf, sleep is interruptible. 214df930be7Sderaadt * Returns error without lock if sleep is interrupted. 215df930be7Sderaadt */ 216df930be7Sderaadt #define sblock(sb, wf) ((sb)->sb_flags & SB_LOCK ? \ 217df930be7Sderaadt (((wf) == M_WAITOK) ? sb_lock(sb) : EWOULDBLOCK) : \ 218fb355730Sdim ((sb)->sb_flags |= SB_LOCK, 0)) 219df930be7Sderaadt 220df930be7Sderaadt /* release lock on sockbuf sb */ 221cabc23fbSderaadt #define sbunlock(sb) do { \ 222df930be7Sderaadt (sb)->sb_flags &= ~SB_LOCK; \ 223df930be7Sderaadt if ((sb)->sb_flags & SB_WANT) { \ 224df930be7Sderaadt (sb)->sb_flags &= ~SB_WANT; \ 225df930be7Sderaadt wakeup((caddr_t)&(sb)->sb_flags); \ 226df930be7Sderaadt } \ 227cabc23fbSderaadt } while (/* CONSTCOND */ 0) 228df930be7Sderaadt 2293e816f04Sbluhm #define _sorwakeup(so) do { \ 230cabc23fbSderaadt sowakeup((so), &(so)->so_rcv); \ 231df930be7Sderaadt if ((so)->so_upcall) \ 232cabc23fbSderaadt (*((so)->so_upcall))((so), (so)->so_upcallarg, \ 233cabc23fbSderaadt M_DONTWAIT); \ 234cabc23fbSderaadt } while (/* CONSTCOND */ 0) 235df930be7Sderaadt 2363e816f04Sbluhm #define _sowwakeup(so) sowakeup((so), &(so)->so_snd) 2373e816f04Sbluhm 2383e816f04Sbluhm #ifdef SOCKET_SPLICE 2393e816f04Sbluhm #define soreadable(so) ((so)->so_splice == NULL && _soreadable(so)) 2403e816f04Sbluhm void sorwakeup(struct socket *); 2413e816f04Sbluhm void sowwakeup(struct socket *); 2423e816f04Sbluhm #else /* SOCKET_SPLICE */ 2433e816f04Sbluhm #define soreadable(so) _soreadable(so) 2443e816f04Sbluhm #define sorwakeup(so) _sorwakeup(so) 2453e816f04Sbluhm #define sowwakeup(so) _sowwakeup(so) 2463e816f04Sbluhm #endif /* SOCKET_SPLICE */ 247df930be7Sderaadt 248df930be7Sderaadt #ifdef _KERNEL 2494c366c49Smiod extern u_long sb_max; 250df930be7Sderaadt 2518f4b9dbeSprovos extern struct pool socket_pool; 2528f4b9dbeSprovos 253ad43b9c6Smickey struct mbuf; 254ad43b9c6Smickey struct sockaddr; 255ad43b9c6Smickey struct proc; 256ad43b9c6Smickey struct msghdr; 257ad43b9c6Smickey struct stat; 258cc90df54Sprovos struct knote; 259ad43b9c6Smickey 260df930be7Sderaadt /* 261df930be7Sderaadt * File operations on sockets. 262df930be7Sderaadt */ 263c4071fd1Smillert int soo_read(struct file *fp, off_t *, struct uio *uio, 264c4071fd1Smillert struct ucred *cred); 265c4071fd1Smillert int soo_write(struct file *fp, off_t *, struct uio *uio, 266c4071fd1Smillert struct ucred *cred); 267c4071fd1Smillert int soo_ioctl(struct file *fp, u_long cmd, caddr_t data, 268c4071fd1Smillert struct proc *p); 269154dfaaaSmillert int soo_poll(struct file *fp, int events, struct proc *p); 270c4071fd1Smillert int soo_kqfilter(struct file *fp, struct knote *kn); 271c4071fd1Smillert int soo_close(struct file *fp, struct proc *p); 272c4071fd1Smillert int soo_stat(struct file *, struct stat *, struct proc *); 273c4071fd1Smillert int uipc_usrreq(struct socket *, int , struct mbuf *, 274621c015eSthib struct mbuf *, struct mbuf *, struct proc *); 275c4071fd1Smillert void sbappend(struct sockbuf *sb, struct mbuf *m); 276a3c9d230Sprovos void sbappendstream(struct sockbuf *sb, struct mbuf *m); 277c4071fd1Smillert int sbappendaddr(struct sockbuf *sb, struct sockaddr *asa, 278c4071fd1Smillert struct mbuf *m0, struct mbuf *control); 279c4071fd1Smillert int sbappendcontrol(struct sockbuf *sb, struct mbuf *m0, 280c4071fd1Smillert struct mbuf *control); 281c4071fd1Smillert void sbappendrecord(struct sockbuf *sb, struct mbuf *m0); 282c4071fd1Smillert void sbcheck(struct sockbuf *sb); 283c4071fd1Smillert void sbcompress(struct sockbuf *sb, struct mbuf *m, struct mbuf *n); 284287546eaSitojun struct mbuf * 285c4071fd1Smillert sbcreatecontrol(caddr_t p, int size, int type, int level); 286c4071fd1Smillert void sbdrop(struct sockbuf *sb, int len); 287c4071fd1Smillert void sbdroprecord(struct sockbuf *sb); 288c4071fd1Smillert void sbflush(struct sockbuf *sb); 289c4071fd1Smillert void sbinsertoob(struct sockbuf *sb, struct mbuf *m0); 290c4071fd1Smillert void sbrelease(struct sockbuf *sb); 291c1ea8f77Sderaadt int sbcheckreserve(u_long cnt, u_long defcnt); 2925d991f01Sclaudio int sbchecklowmem(void); 293c4071fd1Smillert int sbreserve(struct sockbuf *sb, u_long cc); 294c4071fd1Smillert int sbwait(struct sockbuf *sb); 295c4071fd1Smillert int sb_lock(struct sockbuf *sb); 2968f4b9dbeSprovos void soinit(void); 297c4071fd1Smillert int soabort(struct socket *so); 298c4071fd1Smillert int soaccept(struct socket *so, struct mbuf *nam); 299621c015eSthib int sobind(struct socket *so, struct mbuf *nam, struct proc *p); 300c4071fd1Smillert void socantrcvmore(struct socket *so); 301c4071fd1Smillert void socantsendmore(struct socket *so); 302c4071fd1Smillert int soclose(struct socket *so); 303c4071fd1Smillert int soconnect(struct socket *so, struct mbuf *nam); 304c4071fd1Smillert int soconnect2(struct socket *so1, struct socket *so2); 305c4071fd1Smillert int socreate(int dom, struct socket **aso, int type, int proto); 306c4071fd1Smillert int sodisconnect(struct socket *so); 307c4071fd1Smillert void sofree(struct socket *so); 308c4071fd1Smillert int sogetopt(struct socket *so, int level, int optname, 309c4071fd1Smillert struct mbuf **mp); 310c4071fd1Smillert void sohasoutofband(struct socket *so); 311c4071fd1Smillert void soisconnected(struct socket *so); 312c4071fd1Smillert void soisconnecting(struct socket *so); 313c4071fd1Smillert void soisdisconnected(struct socket *so); 314c4071fd1Smillert void soisdisconnecting(struct socket *so); 315c4071fd1Smillert int solisten(struct socket *so, int backlog); 316c4071fd1Smillert struct socket *sonewconn(struct socket *head, int connstatus); 317c4071fd1Smillert void soqinsque(struct socket *head, struct socket *so, int q); 318c4071fd1Smillert int soqremque(struct socket *so, int q); 319c4071fd1Smillert int soreceive(struct socket *so, struct mbuf **paddr, struct uio *uio, 32001d36b92Sotto struct mbuf **mp0, struct mbuf **controlp, int *flagsp, 32101d36b92Sotto socklen_t controllen); 322c4071fd1Smillert int soreserve(struct socket *so, u_long sndcc, u_long rcvcc); 323c4071fd1Smillert void sorflush(struct socket *so); 324c4071fd1Smillert int sosend(struct socket *so, struct mbuf *addr, struct uio *uio, 325c4071fd1Smillert struct mbuf *top, struct mbuf *control, int flags); 326c4071fd1Smillert int sosetopt(struct socket *so, int level, int optname, 327c4071fd1Smillert struct mbuf *m0); 328c4071fd1Smillert int soshutdown(struct socket *so, int how); 329c4071fd1Smillert void sowakeup(struct socket *so, struct sockbuf *sb); 330db68a6b1Stedu int sockargs(struct mbuf **, const void *, size_t, int); 331ad43b9c6Smickey 332c4071fd1Smillert int sendit(struct proc *, int, struct msghdr *, int, register_t *); 333c4071fd1Smillert int recvit(struct proc *, int, struct msghdr *, caddr_t, 334c4071fd1Smillert register_t *); 335ad43b9c6Smickey 336a3c9d230Sprovos #ifdef SOCKBUF_DEBUG 337a3c9d230Sprovos void sblastrecordchk(struct sockbuf *, const char *); 338a3c9d230Sprovos #define SBLASTRECORDCHK(sb, where) sblastrecordchk((sb), (where)) 339a3c9d230Sprovos 340a3c9d230Sprovos void sblastmbufchk(struct sockbuf *, const char *); 341a3c9d230Sprovos #define SBLASTMBUFCHK(sb, where) sblastmbufchk((sb), (where)) 342a3c9d230Sprovos #else 343a3c9d230Sprovos #define SBLASTRECORDCHK(sb, where) /* nothing */ 344a3c9d230Sprovos #define SBLASTMBUFCHK(sb, where) /* nothing */ 345a3c9d230Sprovos #endif /* SOCKBUF_DEBUG */ 346a3c9d230Sprovos 347df930be7Sderaadt #endif /* _KERNEL */ 348