xref: /openbsd/sys/sys/socketvar.h (revision cc90df54)
1*cc90df54Sprovos /*	$OpenBSD: socketvar.h,v 1.20 2001/03/01 20:54:35 provos 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.
16df930be7Sderaadt  * 3. All advertising materials mentioning features or use of this software
17df930be7Sderaadt  *    must display the following acknowledgement:
18df930be7Sderaadt  *	This product includes software developed by the University of
19df930be7Sderaadt  *	California, Berkeley and its contributors.
20df930be7Sderaadt  * 4. Neither the name of the University nor the names of its contributors
21df930be7Sderaadt  *    may be used to endorse or promote products derived from this software
22df930be7Sderaadt  *    without specific prior written permission.
23df930be7Sderaadt  *
24df930be7Sderaadt  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25df930be7Sderaadt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26df930be7Sderaadt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27df930be7Sderaadt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28df930be7Sderaadt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29df930be7Sderaadt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30df930be7Sderaadt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31df930be7Sderaadt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32df930be7Sderaadt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33df930be7Sderaadt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34df930be7Sderaadt  * SUCH DAMAGE.
35df930be7Sderaadt  *
36df930be7Sderaadt  *	@(#)socketvar.h	8.1 (Berkeley) 6/2/93
37df930be7Sderaadt  */
38df930be7Sderaadt 
39df930be7Sderaadt #include <sys/select.h>			/* for struct selinfo */
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 */
66df930be7Sderaadt 	struct	socket *so_q0;		/* queue of partial connections */
67df930be7Sderaadt 	struct	socket *so_q;		/* queue of incoming connections */
68df930be7Sderaadt 	short	so_q0len;		/* partials on so_q0 */
69df930be7Sderaadt 	short	so_qlen;		/* number of connections on so_q */
70df930be7Sderaadt 	short	so_qlimit;		/* max number queued connections */
71df930be7Sderaadt 	short	so_timeo;		/* connection timeout */
72df930be7Sderaadt 	u_short	so_error;		/* error affecting connection */
73df930be7Sderaadt 	pid_t	so_pgid;		/* pgid for signals */
7431e15491Sderaadt 	uid_t	so_siguid;		/* uid of process who set so_pgid */
7531e15491Sderaadt 	uid_t	so_sigeuid;		/* euid of process who set so_pgid */
76df930be7Sderaadt 	u_long	so_oobmark;		/* chars to oob mark */
77df930be7Sderaadt /*
78df930be7Sderaadt  * Variables for socket buffering.
79df930be7Sderaadt  */
80df930be7Sderaadt 	struct	sockbuf {
81df930be7Sderaadt 		u_long	sb_cc;		/* actual chars in buffer */
82df930be7Sderaadt 		u_long	sb_hiwat;	/* max actual char count */
83df930be7Sderaadt 		u_long	sb_mbcnt;	/* chars of mbufs used */
84df930be7Sderaadt 		u_long	sb_mbmax;	/* max chars of mbufs to use */
85df930be7Sderaadt 		long	sb_lowat;	/* low water mark */
86df930be7Sderaadt 		struct	mbuf *sb_mb;	/* the mbuf chain */
87df930be7Sderaadt 		struct	selinfo sb_sel;	/* process selecting read/write */
88df930be7Sderaadt 		short	sb_flags;	/* flags, see below */
89df930be7Sderaadt 		short	sb_timeo;	/* timeout for read/write */
90df930be7Sderaadt 	} so_rcv, so_snd;
91df930be7Sderaadt #define	SB_MAX		(256*1024)	/* default for max chars in sockbuf */
92df930be7Sderaadt #define	SB_LOCK		0x01		/* lock on data queue */
93df930be7Sderaadt #define	SB_WANT		0x02		/* someone is waiting to lock */
94df930be7Sderaadt #define	SB_WAIT		0x04		/* someone is waiting for data/space */
95df930be7Sderaadt #define	SB_SEL		0x08		/* someone is selecting */
96df930be7Sderaadt #define	SB_ASYNC	0x10		/* ASYNC I/O, need signals */
97df930be7Sderaadt #define	SB_NOINTR	0x40		/* operations not interruptible */
981a12e8a7Sprovos #define	SB_KNOTE	0x80		/* kernel note attached */
99df930be7Sderaadt 
100ad43b9c6Smickey 	void	*so_internal;		/* Space for svr4 stream data */
101df930be7Sderaadt 	void	(*so_upcall) __P((struct socket *so, caddr_t arg, int waitf));
102df930be7Sderaadt 	caddr_t	so_upcallarg;		/* Arg for above */
103c9414e36Sderaadt 	uid_t	so_euid;		/* who opened the socket */
104c9414e36Sderaadt 	uid_t	so_ruid;		/* who opened the socket */
105df930be7Sderaadt };
106df930be7Sderaadt 
107df930be7Sderaadt /*
108df930be7Sderaadt  * Socket state bits.
109df930be7Sderaadt  */
110df930be7Sderaadt #define	SS_NOFDREF		0x001	/* no file table ref any more */
111df930be7Sderaadt #define	SS_ISCONNECTED		0x002	/* socket connected to a peer */
112df930be7Sderaadt #define	SS_ISCONNECTING		0x004	/* in process of connecting to peer */
113df930be7Sderaadt #define	SS_ISDISCONNECTING	0x008	/* in process of disconnecting */
114df930be7Sderaadt #define	SS_CANTSENDMORE		0x010	/* can't send more data to peer */
115df930be7Sderaadt #define	SS_CANTRCVMORE		0x020	/* can't receive more data from peer */
116df930be7Sderaadt #define	SS_RCVATMARK		0x040	/* at mark on input */
117751be64bSmillert #define	SS_ISDISCONNECTED	0x800	/* socket disconnected from peer */
118df930be7Sderaadt 
119df930be7Sderaadt #define	SS_PRIV			0x080	/* privileged for broadcast, raw... */
120df930be7Sderaadt #define	SS_NBIO			0x100	/* non-blocking ops */
121df930be7Sderaadt #define	SS_ASYNC		0x200	/* async i/o notify */
122df930be7Sderaadt #define	SS_ISCONFIRMING		0x400	/* deciding to accept connection req */
123f1ea8dcbSderaadt #define	SS_CONNECTOUT		0x1000	/* connect, not accept, at this end */
124df930be7Sderaadt 
125df930be7Sderaadt /*
126df930be7Sderaadt  * Macros for sockets and socket buffering.
127df930be7Sderaadt  */
128df930be7Sderaadt 
129df930be7Sderaadt /*
130df930be7Sderaadt  * Do we need to notify the other side when I/O is possible?
131df930be7Sderaadt  */
1321a12e8a7Sprovos #define	sb_notify(sb)	(((sb)->sb_flags & (SB_WAIT|SB_SEL|SB_ASYNC| \
1331a12e8a7Sprovos     SB_KNOTE)) != 0)
134df930be7Sderaadt 
135df930be7Sderaadt /*
136df930be7Sderaadt  * How much space is there in a socket buffer (so->so_snd or so->so_rcv)?
137df930be7Sderaadt  * This is problematical if the fields are unsigned, as the space might
138df930be7Sderaadt  * still be negative (cc > hiwat or mbcnt > mbmax).  Should detect
139df930be7Sderaadt  * overflow and return 0.  Should use "lmin" but it doesn't exist now.
140df930be7Sderaadt  */
141df930be7Sderaadt #define	sbspace(sb) \
142df930be7Sderaadt     ((long) imin((int)((sb)->sb_hiwat - (sb)->sb_cc), \
143df930be7Sderaadt 	 (int)((sb)->sb_mbmax - (sb)->sb_mbcnt)))
144df930be7Sderaadt 
145df930be7Sderaadt /* do we have to send all at once on a socket? */
146df930be7Sderaadt #define	sosendallatonce(so) \
147df930be7Sderaadt     ((so)->so_proto->pr_flags & PR_ATOMIC)
148df930be7Sderaadt 
149df930be7Sderaadt /* can we read something from so? */
150df930be7Sderaadt #define	soreadable(so) \
151df930be7Sderaadt     ((so)->so_rcv.sb_cc >= (so)->so_rcv.sb_lowat || \
152df930be7Sderaadt 	((so)->so_state & SS_CANTRCVMORE) || \
153df930be7Sderaadt 	(so)->so_qlen || (so)->so_error)
154df930be7Sderaadt 
155df930be7Sderaadt /* can we write something to so? */
156df930be7Sderaadt #define	sowriteable(so) \
157ad43b9c6Smickey     ((sbspace(&(so)->so_snd) >= (so)->so_snd.sb_lowat && \
158df930be7Sderaadt 	(((so)->so_state&SS_ISCONNECTED) || \
159ad43b9c6Smickey 	  ((so)->so_proto->pr_flags&PR_CONNREQUIRED)==0)) || \
160df930be7Sderaadt      ((so)->so_state & SS_CANTSENDMORE) || \
161df930be7Sderaadt      (so)->so_error)
162df930be7Sderaadt 
163df930be7Sderaadt /* adjust counters in sb reflecting allocation of m */
164df930be7Sderaadt #define	sballoc(sb, m) { \
165df930be7Sderaadt 	(sb)->sb_cc += (m)->m_len; \
166df930be7Sderaadt 	(sb)->sb_mbcnt += MSIZE; \
167df930be7Sderaadt 	if ((m)->m_flags & M_EXT) \
168df930be7Sderaadt 		(sb)->sb_mbcnt += (m)->m_ext.ext_size; \
169df930be7Sderaadt }
170df930be7Sderaadt 
171df930be7Sderaadt /* adjust counters in sb reflecting freeing of m */
172df930be7Sderaadt #define	sbfree(sb, m) { \
173df930be7Sderaadt 	(sb)->sb_cc -= (m)->m_len; \
174df930be7Sderaadt 	(sb)->sb_mbcnt -= MSIZE; \
175df930be7Sderaadt 	if ((m)->m_flags & M_EXT) \
176df930be7Sderaadt 		(sb)->sb_mbcnt -= (m)->m_ext.ext_size; \
177df930be7Sderaadt }
178df930be7Sderaadt 
179df930be7Sderaadt /*
180df930be7Sderaadt  * Set lock on sockbuf sb; sleep if lock is already held.
181df930be7Sderaadt  * Unless SB_NOINTR is set on sockbuf, sleep is interruptible.
182df930be7Sderaadt  * Returns error without lock if sleep is interrupted.
183df930be7Sderaadt  */
184df930be7Sderaadt #define sblock(sb, wf) ((sb)->sb_flags & SB_LOCK ? \
185df930be7Sderaadt 		(((wf) == M_WAITOK) ? sb_lock(sb) : EWOULDBLOCK) : \
186df930be7Sderaadt 		((sb)->sb_flags |= SB_LOCK), 0)
187df930be7Sderaadt 
188df930be7Sderaadt /* release lock on sockbuf sb */
189df930be7Sderaadt #define	sbunlock(sb) { \
190df930be7Sderaadt 	(sb)->sb_flags &= ~SB_LOCK; \
191df930be7Sderaadt 	if ((sb)->sb_flags & SB_WANT) { \
192df930be7Sderaadt 		(sb)->sb_flags &= ~SB_WANT; \
193df930be7Sderaadt 		wakeup((caddr_t)&(sb)->sb_flags); \
194df930be7Sderaadt 	} \
195df930be7Sderaadt }
196df930be7Sderaadt 
197df930be7Sderaadt #define	sorwakeup(so)	{ sowakeup((so), &(so)->so_rcv); \
198df930be7Sderaadt 			  if ((so)->so_upcall) \
199df930be7Sderaadt 			    (*((so)->so_upcall))((so), (so)->so_upcallarg, M_DONTWAIT); \
200df930be7Sderaadt 			}
201df930be7Sderaadt 
202df930be7Sderaadt #define	sowwakeup(so)	sowakeup((so), &(so)->so_snd)
203df930be7Sderaadt 
204df930be7Sderaadt #ifdef _KERNEL
205df930be7Sderaadt u_long	sb_max;
206df930be7Sderaadt /* to catch callers missing new second argument to sonewconn: */
207df930be7Sderaadt #define	sonewconn(head, connstatus)	sonewconn1((head), (connstatus))
208df930be7Sderaadt struct	socket *sonewconn1 __P((struct socket *head, int connstatus));
209df930be7Sderaadt 
210df930be7Sderaadt /* strings for sleep message: */
211df930be7Sderaadt extern	char netio[], netcon[], netcls[];
212df930be7Sderaadt 
213ad43b9c6Smickey struct mbuf;
214ad43b9c6Smickey struct sockaddr;
215ad43b9c6Smickey struct proc;
216ad43b9c6Smickey struct msghdr;
217ad43b9c6Smickey struct stat;
218*cc90df54Sprovos struct knote;
219ad43b9c6Smickey 
220df930be7Sderaadt /*
221df930be7Sderaadt  * File operations on sockets.
222df930be7Sderaadt  */
223dc974da3Scsapuntz int	soo_read __P((struct file *fp, off_t *, struct uio *uio,
224dc974da3Scsapuntz             struct ucred *cred));
225dc974da3Scsapuntz int	soo_write __P((struct file *fp, off_t *, struct uio *uio,
226dc974da3Scsapuntz             struct ucred *cred));
227df930be7Sderaadt int	soo_ioctl __P((struct file *fp, u_long cmd, caddr_t data,
228df930be7Sderaadt 	    struct proc *p));
229df930be7Sderaadt int	soo_select __P((struct file *fp, int which, struct proc *p));
230*cc90df54Sprovos int	soo_kqfilter __P((struct file *fp, struct knote *kn));
231df930be7Sderaadt int 	soo_close __P((struct file *fp, struct proc *p));
232ad43b9c6Smickey int	soo_stat __P((struct socket *, struct stat *));
233ad43b9c6Smickey int	uipc_usrreq __P((struct socket *, int , struct mbuf *,
234ad43b9c6Smickey 			 struct mbuf *, struct mbuf *));
235df930be7Sderaadt void	sbappend __P((struct sockbuf *sb, struct mbuf *m));
236df930be7Sderaadt int	sbappendaddr __P((struct sockbuf *sb, struct sockaddr *asa,
237df930be7Sderaadt 	    struct mbuf *m0, struct mbuf *control));
238df930be7Sderaadt int	sbappendcontrol __P((struct sockbuf *sb, struct mbuf *m0,
239df930be7Sderaadt 	    struct mbuf *control));
240df930be7Sderaadt void	sbappendrecord __P((struct sockbuf *sb, struct mbuf *m0));
241df930be7Sderaadt void	sbcheck __P((struct sockbuf *sb));
242df930be7Sderaadt void	sbcompress __P((struct sockbuf *sb, struct mbuf *m, struct mbuf *n));
243287546eaSitojun struct mbuf *
244287546eaSitojun 	sbcreatecontrol __P((caddr_t p, int size, int type, int level));
245df930be7Sderaadt void	sbdrop __P((struct sockbuf *sb, int len));
246df930be7Sderaadt void	sbdroprecord __P((struct sockbuf *sb));
247df930be7Sderaadt void	sbflush __P((struct sockbuf *sb));
248df930be7Sderaadt void	sbinsertoob __P((struct sockbuf *sb, struct mbuf *m0));
249df930be7Sderaadt void	sbrelease __P((struct sockbuf *sb));
250df930be7Sderaadt int	sbreserve __P((struct sockbuf *sb, u_long cc));
251df930be7Sderaadt int	sbwait __P((struct sockbuf *sb));
252df930be7Sderaadt int	sb_lock __P((struct sockbuf *sb));
253df930be7Sderaadt int	soabort __P((struct socket *so));
254df930be7Sderaadt int	soaccept __P((struct socket *so, struct mbuf *nam));
255df930be7Sderaadt int	sobind __P((struct socket *so, struct mbuf *nam));
256df930be7Sderaadt void	socantrcvmore __P((struct socket *so));
257df930be7Sderaadt void	socantsendmore __P((struct socket *so));
258df930be7Sderaadt int	soclose __P((struct socket *so));
259df930be7Sderaadt int	soconnect __P((struct socket *so, struct mbuf *nam));
260df930be7Sderaadt int	soconnect2 __P((struct socket *so1, struct socket *so2));
261df930be7Sderaadt int	socreate __P((int dom, struct socket **aso, int type, int proto));
262df930be7Sderaadt int	sodisconnect __P((struct socket *so));
263ad43b9c6Smickey void	sofree __P((struct socket *so));
264df930be7Sderaadt int	sogetopt __P((struct socket *so, int level, int optname,
265df930be7Sderaadt 	    struct mbuf **mp));
266df930be7Sderaadt void	sohasoutofband __P((struct socket *so));
267df930be7Sderaadt void	soisconnected __P((struct socket *so));
268df930be7Sderaadt void	soisconnecting __P((struct socket *so));
269df930be7Sderaadt void	soisdisconnected __P((struct socket *so));
270df930be7Sderaadt void	soisdisconnecting __P((struct socket *so));
271df930be7Sderaadt int	solisten __P((struct socket *so, int backlog));
272df930be7Sderaadt struct socket *
273df930be7Sderaadt 	sonewconn1 __P((struct socket *head, int connstatus));
274df930be7Sderaadt void	soqinsque __P((struct socket *head, struct socket *so, int q));
275df930be7Sderaadt int	soqremque __P((struct socket *so, int q));
276df930be7Sderaadt int	soreceive __P((struct socket *so, struct mbuf **paddr, struct uio *uio,
277df930be7Sderaadt 		       struct mbuf **mp0, struct mbuf **controlp, int *flagsp));
278df930be7Sderaadt int	soreserve __P((struct socket *so, u_long sndcc, u_long rcvcc));
279df930be7Sderaadt void	sorflush __P((struct socket *so));
280df930be7Sderaadt int	sosend __P((struct socket *so, struct mbuf *addr, struct uio *uio,
281df930be7Sderaadt 	    struct mbuf *top, struct mbuf *control, int flags));
282df930be7Sderaadt int	sosetopt __P((struct socket *so, int level, int optname,
283df930be7Sderaadt 	    struct mbuf *m0));
284df930be7Sderaadt int	soshutdown __P((struct socket *so, int how));
285df930be7Sderaadt void	sowakeup __P((struct socket *so, struct sockbuf *sb));
28602703533Smillert int	sockargs __P((struct mbuf **, caddr_t, socklen_t, int));
287ad43b9c6Smickey 
288ad43b9c6Smickey int	sendit __P((struct proc *, int, struct msghdr *, int, register_t *));
289ad43b9c6Smickey int	recvit __P((struct proc *, int, struct msghdr *, caddr_t,
290ad43b9c6Smickey 		    register_t *));
291ad43b9c6Smickey 
292df930be7Sderaadt #endif /* _KERNEL */
293