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