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