xref: /openbsd/sys/sys/socketvar.h (revision 751be64b)
1*751be64bSmillert /*	$OpenBSD: socketvar.h,v 1.16 1999/02/19 15:06:52 millert 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 */
98df930be7Sderaadt 
99ad43b9c6Smickey 	void	*so_internal;		/* Space for svr4 stream data */
100df930be7Sderaadt 	void	(*so_upcall) __P((struct socket *so, caddr_t arg, int waitf));
101df930be7Sderaadt 	caddr_t	so_upcallarg;		/* Arg for above */
102c9414e36Sderaadt 	uid_t	so_euid;		/* who opened the socket */
103c9414e36Sderaadt 	uid_t	so_ruid;		/* who opened the socket */
104df930be7Sderaadt };
105df930be7Sderaadt 
106df930be7Sderaadt /*
107df930be7Sderaadt  * Socket state bits.
108df930be7Sderaadt  */
109df930be7Sderaadt #define	SS_NOFDREF		0x001	/* no file table ref any more */
110df930be7Sderaadt #define	SS_ISCONNECTED		0x002	/* socket connected to a peer */
111df930be7Sderaadt #define	SS_ISCONNECTING		0x004	/* in process of connecting to peer */
112df930be7Sderaadt #define	SS_ISDISCONNECTING	0x008	/* in process of disconnecting */
113df930be7Sderaadt #define	SS_CANTSENDMORE		0x010	/* can't send more data to peer */
114df930be7Sderaadt #define	SS_CANTRCVMORE		0x020	/* can't receive more data from peer */
115df930be7Sderaadt #define	SS_RCVATMARK		0x040	/* at mark on input */
116*751be64bSmillert #define	SS_ISDISCONNECTED	0x800	/* socket disconnected from peer */
117df930be7Sderaadt 
118df930be7Sderaadt #define	SS_PRIV			0x080	/* privileged for broadcast, raw... */
119df930be7Sderaadt #define	SS_NBIO			0x100	/* non-blocking ops */
120df930be7Sderaadt #define	SS_ASYNC		0x200	/* async i/o notify */
121df930be7Sderaadt #define	SS_ISCONFIRMING		0x400	/* deciding to accept connection req */
122f1ea8dcbSderaadt #define	SS_CONNECTOUT		0x1000	/* connect, not accept, at this end */
123df930be7Sderaadt 
124df930be7Sderaadt /*
125df930be7Sderaadt  * Macros for sockets and socket buffering.
126df930be7Sderaadt  */
127df930be7Sderaadt 
128df930be7Sderaadt /*
129df930be7Sderaadt  * Do we need to notify the other side when I/O is possible?
130df930be7Sderaadt  */
131df930be7Sderaadt #define	sb_notify(sb)	(((sb)->sb_flags & (SB_WAIT|SB_SEL|SB_ASYNC)) != 0)
132df930be7Sderaadt 
133df930be7Sderaadt /*
134df930be7Sderaadt  * How much space is there in a socket buffer (so->so_snd or so->so_rcv)?
135df930be7Sderaadt  * This is problematical if the fields are unsigned, as the space might
136df930be7Sderaadt  * still be negative (cc > hiwat or mbcnt > mbmax).  Should detect
137df930be7Sderaadt  * overflow and return 0.  Should use "lmin" but it doesn't exist now.
138df930be7Sderaadt  */
139df930be7Sderaadt #define	sbspace(sb) \
140df930be7Sderaadt     ((long) imin((int)((sb)->sb_hiwat - (sb)->sb_cc), \
141df930be7Sderaadt 	 (int)((sb)->sb_mbmax - (sb)->sb_mbcnt)))
142df930be7Sderaadt 
143df930be7Sderaadt /* do we have to send all at once on a socket? */
144df930be7Sderaadt #define	sosendallatonce(so) \
145df930be7Sderaadt     ((so)->so_proto->pr_flags & PR_ATOMIC)
146df930be7Sderaadt 
147df930be7Sderaadt /* can we read something from so? */
148df930be7Sderaadt #define	soreadable(so) \
149df930be7Sderaadt     ((so)->so_rcv.sb_cc >= (so)->so_rcv.sb_lowat || \
150df930be7Sderaadt 	((so)->so_state & SS_CANTRCVMORE) || \
151df930be7Sderaadt 	(so)->so_qlen || (so)->so_error)
152df930be7Sderaadt 
153df930be7Sderaadt /* can we write something to so? */
154df930be7Sderaadt #define	sowriteable(so) \
155ad43b9c6Smickey     ((sbspace(&(so)->so_snd) >= (so)->so_snd.sb_lowat && \
156df930be7Sderaadt 	(((so)->so_state&SS_ISCONNECTED) || \
157ad43b9c6Smickey 	  ((so)->so_proto->pr_flags&PR_CONNREQUIRED)==0)) || \
158df930be7Sderaadt      ((so)->so_state & SS_CANTSENDMORE) || \
159df930be7Sderaadt      (so)->so_error)
160df930be7Sderaadt 
161df930be7Sderaadt /* adjust counters in sb reflecting allocation of m */
162df930be7Sderaadt #define	sballoc(sb, m) { \
163df930be7Sderaadt 	(sb)->sb_cc += (m)->m_len; \
164df930be7Sderaadt 	(sb)->sb_mbcnt += MSIZE; \
165df930be7Sderaadt 	if ((m)->m_flags & M_EXT) \
166df930be7Sderaadt 		(sb)->sb_mbcnt += (m)->m_ext.ext_size; \
167df930be7Sderaadt }
168df930be7Sderaadt 
169df930be7Sderaadt /* adjust counters in sb reflecting freeing of m */
170df930be7Sderaadt #define	sbfree(sb, m) { \
171df930be7Sderaadt 	(sb)->sb_cc -= (m)->m_len; \
172df930be7Sderaadt 	(sb)->sb_mbcnt -= MSIZE; \
173df930be7Sderaadt 	if ((m)->m_flags & M_EXT) \
174df930be7Sderaadt 		(sb)->sb_mbcnt -= (m)->m_ext.ext_size; \
175df930be7Sderaadt }
176df930be7Sderaadt 
177df930be7Sderaadt /*
178df930be7Sderaadt  * Set lock on sockbuf sb; sleep if lock is already held.
179df930be7Sderaadt  * Unless SB_NOINTR is set on sockbuf, sleep is interruptible.
180df930be7Sderaadt  * Returns error without lock if sleep is interrupted.
181df930be7Sderaadt  */
182df930be7Sderaadt #define sblock(sb, wf) ((sb)->sb_flags & SB_LOCK ? \
183df930be7Sderaadt 		(((wf) == M_WAITOK) ? sb_lock(sb) : EWOULDBLOCK) : \
184df930be7Sderaadt 		((sb)->sb_flags |= SB_LOCK), 0)
185df930be7Sderaadt 
186df930be7Sderaadt /* release lock on sockbuf sb */
187df930be7Sderaadt #define	sbunlock(sb) { \
188df930be7Sderaadt 	(sb)->sb_flags &= ~SB_LOCK; \
189df930be7Sderaadt 	if ((sb)->sb_flags & SB_WANT) { \
190df930be7Sderaadt 		(sb)->sb_flags &= ~SB_WANT; \
191df930be7Sderaadt 		wakeup((caddr_t)&(sb)->sb_flags); \
192df930be7Sderaadt 	} \
193df930be7Sderaadt }
194df930be7Sderaadt 
195df930be7Sderaadt #define	sorwakeup(so)	{ sowakeup((so), &(so)->so_rcv); \
196df930be7Sderaadt 			  if ((so)->so_upcall) \
197df930be7Sderaadt 			    (*((so)->so_upcall))((so), (so)->so_upcallarg, M_DONTWAIT); \
198df930be7Sderaadt 			}
199df930be7Sderaadt 
200df930be7Sderaadt #define	sowwakeup(so)	sowakeup((so), &(so)->so_snd)
201df930be7Sderaadt 
202df930be7Sderaadt #ifdef _KERNEL
203df930be7Sderaadt u_long	sb_max;
204df930be7Sderaadt /* to catch callers missing new second argument to sonewconn: */
205df930be7Sderaadt #define	sonewconn(head, connstatus)	sonewconn1((head), (connstatus))
206df930be7Sderaadt struct	socket *sonewconn1 __P((struct socket *head, int connstatus));
207df930be7Sderaadt 
208df930be7Sderaadt /* strings for sleep message: */
209df930be7Sderaadt extern	char netio[], netcon[], netcls[];
210df930be7Sderaadt 
211ad43b9c6Smickey struct mbuf;
212ad43b9c6Smickey struct sockaddr;
213ad43b9c6Smickey struct proc;
214ad43b9c6Smickey struct msghdr;
215ad43b9c6Smickey struct stat;
216ad43b9c6Smickey 
217df930be7Sderaadt /*
218df930be7Sderaadt  * File operations on sockets.
219df930be7Sderaadt  */
220df930be7Sderaadt int	soo_read __P((struct file *fp, struct uio *uio, struct ucred *cred));
221df930be7Sderaadt int	soo_write __P((struct file *fp, struct uio *uio, struct ucred *cred));
222df930be7Sderaadt int	soo_ioctl __P((struct file *fp, u_long cmd, caddr_t data,
223df930be7Sderaadt 	    struct proc *p));
224df930be7Sderaadt int	soo_select __P((struct file *fp, int which, struct proc *p));
225df930be7Sderaadt int 	soo_close __P((struct file *fp, struct proc *p));
226ad43b9c6Smickey int	soo_stat __P((struct socket *, struct stat *));
227ad43b9c6Smickey int	uipc_usrreq __P((struct socket *, int , struct mbuf *,
228ad43b9c6Smickey 			 struct mbuf *, struct mbuf *));
229df930be7Sderaadt void	sbappend __P((struct sockbuf *sb, struct mbuf *m));
230df930be7Sderaadt int	sbappendaddr __P((struct sockbuf *sb, struct sockaddr *asa,
231df930be7Sderaadt 	    struct mbuf *m0, struct mbuf *control));
232df930be7Sderaadt int	sbappendcontrol __P((struct sockbuf *sb, struct mbuf *m0,
233df930be7Sderaadt 	    struct mbuf *control));
234df930be7Sderaadt void	sbappendrecord __P((struct sockbuf *sb, struct mbuf *m0));
235df930be7Sderaadt void	sbcheck __P((struct sockbuf *sb));
236df930be7Sderaadt void	sbcompress __P((struct sockbuf *sb, struct mbuf *m, struct mbuf *n));
237df930be7Sderaadt void	sbdrop __P((struct sockbuf *sb, int len));
238df930be7Sderaadt void	sbdroprecord __P((struct sockbuf *sb));
239df930be7Sderaadt void	sbflush __P((struct sockbuf *sb));
240df930be7Sderaadt void	sbinsertoob __P((struct sockbuf *sb, struct mbuf *m0));
241df930be7Sderaadt void	sbrelease __P((struct sockbuf *sb));
242df930be7Sderaadt int	sbreserve __P((struct sockbuf *sb, u_long cc));
243df930be7Sderaadt int	sbwait __P((struct sockbuf *sb));
244df930be7Sderaadt int	sb_lock __P((struct sockbuf *sb));
245df930be7Sderaadt int	soabort __P((struct socket *so));
246df930be7Sderaadt int	soaccept __P((struct socket *so, struct mbuf *nam));
247df930be7Sderaadt int	sobind __P((struct socket *so, struct mbuf *nam));
248df930be7Sderaadt void	socantrcvmore __P((struct socket *so));
249df930be7Sderaadt void	socantsendmore __P((struct socket *so));
250df930be7Sderaadt int	soclose __P((struct socket *so));
251df930be7Sderaadt int	soconnect __P((struct socket *so, struct mbuf *nam));
252df930be7Sderaadt int	soconnect2 __P((struct socket *so1, struct socket *so2));
253df930be7Sderaadt int	socreate __P((int dom, struct socket **aso, int type, int proto));
254df930be7Sderaadt int	sodisconnect __P((struct socket *so));
255ad43b9c6Smickey void	sofree __P((struct socket *so));
256df930be7Sderaadt int	sogetopt __P((struct socket *so, int level, int optname,
257df930be7Sderaadt 	    struct mbuf **mp));
258df930be7Sderaadt void	sohasoutofband __P((struct socket *so));
259df930be7Sderaadt void	soisconnected __P((struct socket *so));
260df930be7Sderaadt void	soisconnecting __P((struct socket *so));
261df930be7Sderaadt void	soisdisconnected __P((struct socket *so));
262df930be7Sderaadt void	soisdisconnecting __P((struct socket *so));
263df930be7Sderaadt int	solisten __P((struct socket *so, int backlog));
264df930be7Sderaadt struct socket *
265df930be7Sderaadt 	sonewconn1 __P((struct socket *head, int connstatus));
266df930be7Sderaadt void	soqinsque __P((struct socket *head, struct socket *so, int q));
267df930be7Sderaadt int	soqremque __P((struct socket *so, int q));
268df930be7Sderaadt int	soreceive __P((struct socket *so, struct mbuf **paddr, struct uio *uio,
269df930be7Sderaadt 		       struct mbuf **mp0, struct mbuf **controlp, int *flagsp));
270df930be7Sderaadt int	soreserve __P((struct socket *so, u_long sndcc, u_long rcvcc));
271df930be7Sderaadt void	sorflush __P((struct socket *so));
272df930be7Sderaadt int	sosend __P((struct socket *so, struct mbuf *addr, struct uio *uio,
273df930be7Sderaadt 	    struct mbuf *top, struct mbuf *control, int flags));
274df930be7Sderaadt int	sosetopt __P((struct socket *so, int level, int optname,
275df930be7Sderaadt 	    struct mbuf *m0));
276df930be7Sderaadt int	soshutdown __P((struct socket *so, int how));
277df930be7Sderaadt void	sowakeup __P((struct socket *so, struct sockbuf *sb));
27802703533Smillert int	sockargs __P((struct mbuf **, caddr_t, socklen_t, int));
279ad43b9c6Smickey 
280ad43b9c6Smickey int	sendit __P((struct proc *, int, struct msghdr *, int, register_t *));
281ad43b9c6Smickey int	recvit __P((struct proc *, int, struct msghdr *, caddr_t,
282ad43b9c6Smickey 		    register_t *));
283ad43b9c6Smickey 
284df930be7Sderaadt #endif /* _KERNEL */
285