home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 5 / FreshFish_July-August1994.bin / bbs / gnu / ixemul-39.47-env-bin.lha / include / sys / socketvar.h < prev    next >
C/C++ Source or Header  |  1994-02-23  |  8KB  |  200 lines

  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
  200.