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