|
|
1.1 ! root 1: /*- ! 2: * Copyright (c) 1982, 1986, 1990 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms, with or without ! 6: * modification, are permitted provided that the following conditions ! 7: * are met: ! 8: * 1. Redistributions of source code must retain the above copyright ! 9: * notice, this list of conditions and the following disclaimer. ! 10: * 2. Redistributions in binary form must reproduce the above copyright ! 11: * notice, this list of conditions and the following disclaimer in the ! 12: * documentation and/or other materials provided with the distribution. ! 13: * 3. All advertising materials mentioning features or use of this software ! 14: * must display the following acknowledgement: ! 15: * This product includes software developed by the University of ! 16: * California, Berkeley and its contributors. ! 17: * 4. Neither the name of the University nor the names of its contributors ! 18: * may be used to endorse or promote products derived from this software ! 19: * without specific prior written permission. ! 20: * ! 21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 31: * SUCH DAMAGE. ! 32: * ! 33: * @(#)socketvar.h 7.17 (Berkeley) 5/5/91 ! 34: */ ! 35: ! 36: /* ! 37: * Kernel structure per socket. ! 38: * Contains send and receive buffer queues, ! 39: * handle on protocol and pointer to protocol ! 40: * private data and error information. ! 41: */ ! 42: struct socket { ! 43: short so_type; /* generic type, see socket.h */ ! 44: short so_options; /* from socket call, see socket.h */ ! 45: short so_linger; /* time to linger while closing */ ! 46: short so_state; /* internal state flags SS_*, below */ ! 47: caddr_t so_pcb; /* protocol control block */ ! 48: struct protosw *so_proto; /* protocol handle */ ! 49: /* ! 50: * Variables for connection queueing. ! 51: * Socket where accepts occur is so_head in all subsidiary sockets. ! 52: * If so_head is 0, socket is not related to an accept. ! 53: * For head socket so_q0 queues partially completed connections, ! 54: * while so_q is a queue of connections ready to be accepted. ! 55: * If a connection is aborted and it has so_head set, then ! 56: * it has to be pulled out of either so_q0 or so_q. ! 57: * We allow connections to queue up based on current queue lengths ! 58: * and limit on number of queued connections for this socket. ! 59: */ ! 60: struct socket *so_head; /* back pointer to accept socket */ ! 61: struct socket *so_q0; /* queue of partial connections */ ! 62: struct socket *so_q; /* queue of incoming connections */ ! 63: short so_q0len; /* partials on so_q0 */ ! 64: short so_qlen; /* number of connections on so_q */ ! 65: short so_qlimit; /* max number queued connections */ ! 66: short so_timeo; /* connection timeout */ ! 67: u_short so_error; /* error affecting connection */ ! 68: pid_t so_pgid; /* pgid for signals */ ! 69: u_long so_oobmark; /* chars to oob mark */ ! 70: /* ! 71: * Variables for socket buffering. ! 72: */ ! 73: struct sockbuf { ! 74: u_long sb_cc; /* actual chars in buffer */ ! 75: u_long sb_hiwat; /* max actual char count */ ! 76: u_long sb_mbcnt; /* chars of mbufs used */ ! 77: u_long sb_mbmax; /* max chars of mbufs to use */ ! 78: long sb_lowat; /* low water mark */ ! 79: struct mbuf *sb_mb; /* the mbuf chain */ ! 80: struct proc *sb_sel; /* process selecting read/write */ ! 81: short sb_flags; /* flags, see below */ ! 82: short sb_timeo; /* timeout for read/write */ ! 83: } so_rcv, so_snd; ! 84: #define SB_MAX (64*1024) /* default for max chars in sockbuf */ ! 85: #define SB_LOCK 0x01 /* lock on data queue */ ! 86: #define SB_WANT 0x02 /* someone is waiting to lock */ ! 87: #define SB_WAIT 0x04 /* someone is waiting for data/space */ ! 88: #define SB_SEL 0x08 /* someone is selecting */ ! 89: #define SB_ASYNC 0x10 /* ASYNC I/O, need signals */ ! 90: #define SB_NOTIFY (SB_WAIT|SB_SEL|SB_ASYNC) ! 91: #define SB_COLL 0x20 /* collision selecting */ ! 92: #define SB_NOINTR 0x40 /* operations not interruptible */ ! 93: ! 94: caddr_t so_tpcb; /* Wisc. protocol control block XXX */ ! 95: }; ! 96: ! 97: /* ! 98: * Socket state bits. ! 99: */ ! 100: #define SS_NOFDREF 0x001 /* no file table ref any more */ ! 101: #define SS_ISCONNECTED 0x002 /* socket connected to a peer */ ! 102: #define SS_ISCONNECTING 0x004 /* in process of connecting to peer */ ! 103: #define SS_ISDISCONNECTING 0x008 /* in process of disconnecting */ ! 104: #define SS_CANTSENDMORE 0x010 /* can't send more data to peer */ ! 105: #define SS_CANTRCVMORE 0x020 /* can't receive more data from peer */ ! 106: #define SS_RCVATMARK 0x040 /* at mark on input */ ! 107: ! 108: #define SS_PRIV 0x080 /* privileged for broadcast, raw... */ ! 109: #define SS_NBIO 0x100 /* non-blocking ops */ ! 110: #define SS_ASYNC 0x200 /* async i/o notify */ ! 111: #define SS_ISCONFIRMING 0x400 /* deciding to accept connection req */ ! 112: ! 113: ! 114: /* ! 115: * Macros for sockets and socket buffering. ! 116: */ ! 117: ! 118: /* ! 119: * How much space is there in a socket buffer (so->so_snd or so->so_rcv)? ! 120: * This is problematical if the fields are unsigned, as the space might ! 121: * still be negative (cc > hiwat or mbcnt > mbmax). Should detect ! 122: * overflow and return 0. Should use "lmin" but it doesn't exist now. ! 123: */ ! 124: #define sbspace(sb) \ ! 125: ((long) imin((int)((sb)->sb_hiwat - (sb)->sb_cc), \ ! 126: (int)((sb)->sb_mbmax - (sb)->sb_mbcnt))) ! 127: ! 128: /* do we have to send all at once on a socket? */ ! 129: #define sosendallatonce(so) \ ! 130: ((so)->so_proto->pr_flags & PR_ATOMIC) ! 131: ! 132: /* can we read something from so? */ ! 133: #define soreadable(so) \ ! 134: ((so)->so_rcv.sb_cc >= (so)->so_rcv.sb_lowat || \ ! 135: ((so)->so_state & SS_CANTRCVMORE) || \ ! 136: (so)->so_qlen || (so)->so_error) ! 137: ! 138: /* can we write something to so? */ ! 139: #define sowriteable(so) \ ! 140: (sbspace(&(so)->so_snd) >= (so)->so_snd.sb_lowat && \ ! 141: (((so)->so_state&SS_ISCONNECTED) || \ ! 142: ((so)->so_proto->pr_flags&PR_CONNREQUIRED)==0) || \ ! 143: ((so)->so_state & SS_CANTSENDMORE) || \ ! 144: (so)->so_error) ! 145: ! 146: /* adjust counters in sb reflecting allocation of m */ ! 147: #define sballoc(sb, m) { \ ! 148: (sb)->sb_cc += (m)->m_len; \ ! 149: (sb)->sb_mbcnt += MSIZE; \ ! 150: if ((m)->m_flags & M_EXT) \ ! 151: (sb)->sb_mbcnt += (m)->m_ext.ext_size; \ ! 152: } ! 153: ! 154: /* adjust counters in sb reflecting freeing of m */ ! 155: #define sbfree(sb, m) { \ ! 156: (sb)->sb_cc -= (m)->m_len; \ ! 157: (sb)->sb_mbcnt -= MSIZE; \ ! 158: if ((m)->m_flags & M_EXT) \ ! 159: (sb)->sb_mbcnt -= (m)->m_ext.ext_size; \ ! 160: } ! 161: ! 162: /* ! 163: * Set lock on sockbuf sb; sleep if lock is already held. ! 164: * Unless SB_NOINTR is set on sockbuf, sleep is interruptible. ! 165: * Returns error without lock if sleep is interrupted. ! 166: */ ! 167: #define sblock(sb) ((sb)->sb_flags & SB_LOCK ? sb_lock(sb) : \ ! 168: ((sb)->sb_flags |= SB_LOCK, 0)) ! 169: ! 170: /* release lock on sockbuf sb */ ! 171: #define sbunlock(sb) { \ ! 172: (sb)->sb_flags &= ~SB_LOCK; \ ! 173: if ((sb)->sb_flags & SB_WANT) { \ ! 174: (sb)->sb_flags &= ~SB_WANT; \ ! 175: wakeup((caddr_t)&(sb)->sb_flags); \ ! 176: } \ ! 177: } ! 178: ! 179: #define sorwakeup(so) sowakeup((so), &(so)->so_rcv) ! 180: #define sowwakeup(so) sowakeup((so), &(so)->so_snd) ! 181: ! 182: #ifdef KERNEL ! 183: u_long sb_max; ! 184: /* to catch callers missing new second argument to sonewconn: */ ! 185: #define sonewconn(head, connstatus) sonewconn1((head), (connstatus)) ! 186: struct socket *sonewconn1 __P((struct socket *head, int connstatus)); ! 187: ! 188: /* strings for sleep message: */ ! 189: extern char netio[], netcon[], netcls[]; ! 190: ! 191: /* ! 192: * File operations on sockets. ! 193: */ ! 194: int soo_read __P((struct file *fp, struct uio *uio, struct ucred *cred)); ! 195: int soo_write __P((struct file *fp, struct uio *uio, struct ucred *cred)); ! 196: int soo_ioctl __P((struct file *fp, int com, caddr_t data, struct proc *p)); ! 197: int soo_select __P((struct file *fp, int which, struct proc *p)); ! 198: int soo_close __P((struct file *fp, struct proc *p)); ! 199: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.