xref: /openbsd/sys/sys/socketvar.h (revision f94c55a9)
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