[BACK]Return to socketvar.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / sys

Annotation of src/sys/sys/socketvar.h, Revision 1.6

1.1       cgd         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:  *
1.4       cgd        33:  *     from: @(#)socketvar.h   7.17 (Berkeley) 5/5/91
1.6     ! andrew     34:  *     $Id: socketvar.h,v 1.5 1993/05/20 11:49:03 cgd Exp $
1.1       cgd        35:  */
                     36:
1.3       mycroft    37: #ifndef _SYS_SOCKETVAR_H_
                     38: #define _SYS_SOCKETVAR_H_
1.5       cgd        39:
                     40: #include <sys/select.h>                        /* for struct selinfo */
1.3       mycroft    41:
1.1       cgd        42: /*
                     43:  * Kernel structure per socket.
                     44:  * Contains send and receive buffer queues,
                     45:  * handle on protocol and pointer to protocol
                     46:  * private data and error information.
                     47:  */
                     48: struct socket {
                     49:        short   so_type;                /* generic type, see socket.h */
                     50:        short   so_options;             /* from socket call, see socket.h */
                     51:        short   so_linger;              /* time to linger while closing */
                     52:        short   so_state;               /* internal state flags SS_*, below */
                     53:        caddr_t so_pcb;                 /* protocol control block */
                     54:        struct  protosw *so_proto;      /* protocol handle */
                     55: /*
                     56:  * Variables for connection queueing.
                     57:  * Socket where accepts occur is so_head in all subsidiary sockets.
                     58:  * If so_head is 0, socket is not related to an accept.
                     59:  * For head socket so_q0 queues partially completed connections,
                     60:  * while so_q is a queue of connections ready to be accepted.
                     61:  * If a connection is aborted and it has so_head set, then
                     62:  * it has to be pulled out of either so_q0 or so_q.
                     63:  * We allow connections to queue up based on current queue lengths
                     64:  * and limit on number of queued connections for this socket.
                     65:  */
                     66:        struct  socket *so_head;        /* back pointer to accept socket */
                     67:        struct  socket *so_q0;          /* queue of partial connections */
                     68:        struct  socket *so_q;           /* queue of incoming connections */
                     69:        short   so_q0len;               /* partials on so_q0 */
                     70:        short   so_qlen;                /* number of connections on so_q */
                     71:        short   so_qlimit;              /* max number queued connections */
                     72:        short   so_timeo;               /* connection timeout */
                     73:        u_short so_error;               /* error affecting connection */
                     74:        pid_t   so_pgid;                /* pgid for signals */
                     75:        u_long  so_oobmark;             /* chars to oob mark */
                     76: /*
                     77:  * Variables for socket buffering.
                     78:  */
                     79:        struct  sockbuf {
                     80:                u_long  sb_cc;          /* actual chars in buffer */
                     81:                u_long  sb_hiwat;       /* max actual char count */
                     82:                u_long  sb_mbcnt;       /* chars of mbufs used */
                     83:                u_long  sb_mbmax;       /* max chars of mbufs to use */
                     84:                long    sb_lowat;       /* low water mark */
                     85:                struct  mbuf *sb_mb;    /* the mbuf chain */
1.4       cgd        86:                struct selinfo sb_sel;  /* process selecting read/write */
1.1       cgd        87:                short   sb_flags;       /* flags, see below */
                     88:                short   sb_timeo;       /* timeout for read/write */
                     89:        } so_rcv, so_snd;
                     90: #define        SB_MAX          (64*1024)       /* default for max chars in sockbuf */
                     91: #define        SB_LOCK         0x01            /* lock on data queue */
                     92: #define        SB_WANT         0x02            /* someone is waiting to lock */
                     93: #define        SB_WAIT         0x04            /* someone is waiting for data/space */
                     94: #define        SB_SEL          0x08            /* someone is selecting */
                     95: #define        SB_ASYNC        0x10            /* ASYNC I/O, need signals */
                     96: #define        SB_NOTIFY       (SB_WAIT|SB_SEL|SB_ASYNC)
1.6     ! andrew     97: /* was SB_COLL         0x20             * collision selecting */
1.1       cgd        98: #define        SB_NOINTR       0x40            /* operations not interruptible */
                     99:
                    100:        caddr_t so_tpcb;                /* Wisc. protocol control block XXX */
                    101: };
                    102:
                    103: /*
                    104:  * Socket state bits.
                    105:  */
                    106: #define        SS_NOFDREF              0x001   /* no file table ref any more */
                    107: #define        SS_ISCONNECTED          0x002   /* socket connected to a peer */
                    108: #define        SS_ISCONNECTING         0x004   /* in process of connecting to peer */
                    109: #define        SS_ISDISCONNECTING      0x008   /* in process of disconnecting */
                    110: #define        SS_CANTSENDMORE         0x010   /* can't send more data to peer */
                    111: #define        SS_CANTRCVMORE          0x020   /* can't receive more data from peer */
                    112: #define        SS_RCVATMARK            0x040   /* at mark on input */
                    113:
                    114: #define        SS_PRIV                 0x080   /* privileged for broadcast, raw... */
                    115: #define        SS_NBIO                 0x100   /* non-blocking ops */
                    116: #define        SS_ASYNC                0x200   /* async i/o notify */
                    117: #define        SS_ISCONFIRMING         0x400   /* deciding to accept connection req */
                    118:
                    119:
                    120: /*
                    121:  * Macros for sockets and socket buffering.
                    122:  */
                    123:
                    124: /*
                    125:  * How much space is there in a socket buffer (so->so_snd or so->so_rcv)?
                    126:  * This is problematical if the fields are unsigned, as the space might
                    127:  * still be negative (cc > hiwat or mbcnt > mbmax).  Should detect
                    128:  * overflow and return 0.  Should use "lmin" but it doesn't exist now.
                    129:  */
                    130: #define        sbspace(sb) \
                    131:     ((long) imin((int)((sb)->sb_hiwat - (sb)->sb_cc), \
                    132:         (int)((sb)->sb_mbmax - (sb)->sb_mbcnt)))
                    133:
                    134: /* do we have to send all at once on a socket? */
                    135: #define        sosendallatonce(so) \
                    136:     ((so)->so_proto->pr_flags & PR_ATOMIC)
                    137:
                    138: /* can we read something from so? */
                    139: #define        soreadable(so) \
                    140:     ((so)->so_rcv.sb_cc >= (so)->so_rcv.sb_lowat || \
                    141:        ((so)->so_state & SS_CANTRCVMORE) || \
                    142:        (so)->so_qlen || (so)->so_error)
                    143:
                    144: /* can we write something to so? */
                    145: #define        sowriteable(so) \
                    146:     (sbspace(&(so)->so_snd) >= (so)->so_snd.sb_lowat && \
                    147:        (((so)->so_state&SS_ISCONNECTED) || \
                    148:          ((so)->so_proto->pr_flags&PR_CONNREQUIRED)==0) || \
                    149:      ((so)->so_state & SS_CANTSENDMORE) || \
                    150:      (so)->so_error)
                    151:
                    152: /* adjust counters in sb reflecting allocation of m */
                    153: #define        sballoc(sb, m) { \
                    154:        (sb)->sb_cc += (m)->m_len; \
                    155:        (sb)->sb_mbcnt += MSIZE; \
                    156:        if ((m)->m_flags & M_EXT) \
                    157:                (sb)->sb_mbcnt += (m)->m_ext.ext_size; \
                    158: }
                    159:
                    160: /* adjust counters in sb reflecting freeing of m */
                    161: #define        sbfree(sb, m) { \
                    162:        (sb)->sb_cc -= (m)->m_len; \
                    163:        (sb)->sb_mbcnt -= MSIZE; \
                    164:        if ((m)->m_flags & M_EXT) \
                    165:                (sb)->sb_mbcnt -= (m)->m_ext.ext_size; \
                    166: }
                    167:
                    168: /*
                    169:  * Set lock on sockbuf sb; sleep if lock is already held.
                    170:  * Unless SB_NOINTR is set on sockbuf, sleep is interruptible.
                    171:  * Returns error without lock if sleep is interrupted.
                    172:  */
                    173: #define sblock(sb) ((sb)->sb_flags & SB_LOCK ? sb_lock(sb) : \
                    174:                ((sb)->sb_flags |= SB_LOCK, 0))
                    175:
                    176: /* release lock on sockbuf sb */
                    177: #define        sbunlock(sb) { \
                    178:        (sb)->sb_flags &= ~SB_LOCK; \
                    179:        if ((sb)->sb_flags & SB_WANT) { \
                    180:                (sb)->sb_flags &= ~SB_WANT; \
                    181:                wakeup((caddr_t)&(sb)->sb_flags); \
                    182:        } \
                    183: }
                    184:
                    185: #define        sorwakeup(so)   sowakeup((so), &(so)->so_rcv)
                    186: #define        sowwakeup(so)   sowakeup((so), &(so)->so_snd)
                    187:
                    188: #ifdef KERNEL
                    189: u_long sb_max;
                    190: /* to catch callers missing new second argument to sonewconn: */
                    191: #define        sonewconn(head, connstatus)     sonewconn1((head), (connstatus))
                    192: struct socket *sonewconn1 __P((struct socket *head, int connstatus));
                    193:
                    194: /* strings for sleep message: */
                    195: extern char netio[], netcon[], netcls[];
                    196:
                    197: /*
                    198:  * File operations on sockets.
                    199:  */
                    200: int    soo_read __P((struct file *fp, struct uio *uio, struct ucred *cred));
                    201: int    soo_write __P((struct file *fp, struct uio *uio, struct ucred *cred));
                    202: int    soo_ioctl __P((struct file *fp, int com, caddr_t data, struct proc *p));
                    203: int    soo_select __P((struct file *fp, int which, struct proc *p));
                    204: int    soo_close __P((struct file *fp, struct proc *p));
                    205: #endif
1.3       mycroft   206:
                    207: #endif /* !_SYS_SOCKETVAR_H_ */

CVSweb <webmaster@jp.NetBSD.org>