syncache_socket(): fix abort path by calling pru_abort directly
[dragonfly.git] / sys / sys / socketvar.h
index 92bddc3..4300a06 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)socketvar.h 8.3 (Berkeley) 2/19/95
  * $FreeBSD: src/sys/sys/socketvar.h,v 1.46.2.10 2003/08/24 08:24:39 hsu Exp $
- * $DragonFly: src/sys/sys/socketvar.h,v 1.28 2007/04/22 01:13:17 dillon Exp $
+ * $DragonFly: src/sys/sys/socketvar.h,v 1.35 2008/08/28 23:15:45 dillon Exp $
  */
 
 #ifndef _SYS_SOCKETVAR_H_
@@ -83,6 +83,7 @@ struct signalsockbuf {
 #define SSB_AIO                0x80            /* AIO operations queued */
 #define SSB_KNOTE      0x100           /* kernel note attached */
 #define SSB_MEVENT     0x200           /* need message event notification */
+#define SSB_STOP       0x400           /* backpressure indicator */
 
 /*
  * Per-socket kernel structure.  Contains universal send and receive queues,
@@ -145,7 +146,7 @@ struct socket {
 #define        SS_CANTRCVMORE          0x0020  /* can't receive more data from peer */
 #define        SS_RCVATMARK            0x0040  /* at mark on input */
 
-#define        SS_UNUSED0100           0x0100
+#define        SS_ABORTING             0x0100  /* so_abort() in progress */
 #define        SS_ASYNC                0x0200  /* async i/o notify */
 #define        SS_ISCONFIRMING         0x0400  /* deciding to accept connection req */
 
@@ -215,33 +216,33 @@ struct    xsocket {
        SSB_AIO | SSB_KNOTE | SSB_MEVENT)))
 
 /* do we have to send all at once on a socket? */
-/*
- * Set lock on sockbuf sb; sleep if lock is already held.
- * Unless SSB_NOINTR is set on signalsockbuf, sleep is interruptible.
- * Returns error without lock if sleep is interrupted.
- */
-#define ssb_lock(ssb, wf) ((ssb)->ssb_flags & SSB_LOCK ? \
-               (((wf) == M_WAITOK) ? _ssb_lock(ssb) : EWOULDBLOCK) : \
-               ((ssb)->ssb_flags |= SSB_LOCK), 0)
-
-/* release lock on signalsockbuf sb */
-#define        ssb_unlock(ssb) { \
-       (ssb)->ssb_flags &= ~SSB_LOCK; \
-       if ((ssb)->ssb_flags & SSB_WANT) { \
-               (ssb)->ssb_flags &= ~SSB_WANT; \
-               wakeup((caddr_t)&(ssb)->ssb_flags); \
-       } \
-}
+
+#ifdef _KERNEL
 
 /*
  * How much space is there in a socket buffer (so->so_snd or so->so_rcv)?
  * This is problematical if the fields are unsigned, as the space might
  * still be negative (cc > hiwat or mbcnt > mbmax).  Should detect
- * overflow and return 0.  Should use "lmin" but it doesn't exist now.
+ * overflow and return 0.
+ *
+ * SSB_STOP ignores cc/hiwat and returns 0.  This is used by unix domain
+ * stream sockets to signal backpressure.
  */
-#define ssb_space(ssb)                                                         \
-       ((long)imin((int)((ssb)->ssb_hiwat - (ssb)->ssb_cc),            \
-                   (int)((ssb)->ssb_mbmax - (ssb)->ssb_mbcnt)))
+static __inline
+long
+ssb_space(struct signalsockbuf *ssb)
+{
+       long bleft;
+       long mleft;
+
+       if (ssb->ssb_flags & SSB_STOP)
+               return(0);
+       bleft = ssb->ssb_hiwat - ssb->ssb_cc;
+       mleft = ssb->ssb_mbmax - ssb->ssb_mbcnt;
+       return((bleft < mleft) ? bleft : mleft);
+}
+
+#endif
 
 #define ssb_append(ssb, m)                                             \
        sbappend(&(ssb)->sb, m)
@@ -253,10 +254,10 @@ struct    xsocket {
        sbappendrecord(&(ssb)->sb, m)
 
 #define ssb_appendaddr(ssb, src, m, control)                           \
-       ((ssb_space(ssb) <= 0) ? 1 : sbappendaddr(&(ssb)->sb, src, m, control))
+       ((ssb_space(ssb) <= 0) ? 0 : sbappendaddr(&(ssb)->sb, src, m, control))
 
 #define ssb_appendcontrol(ssb, m, control)                             \
-       ((ssb_space(ssb) <= 0) ? 1 : sbappendcontrol(&(ssb)->sb, m, control))
+       ((ssb_space(ssb) <= 0) ? 0 : sbappendcontrol(&(ssb)->sb, m, control))
 
 #define ssb_insert_knote(ssb, kn) {                                    \
         SLIST_INSERT_HEAD(&(ssb)->ssb_sel.si_note, kn, kn_selnext);    \
@@ -315,7 +316,6 @@ MALLOC_DECLARE(M_ACCF);
 extern int     maxsockets;
 extern u_long  sb_max;         /* nominal limit */
 extern u_long  sb_max_adj;     /* actual limit used by sbreserve() */
-extern struct  vm_zone *socket_zone;
 
 struct file;
 struct filedesc;
@@ -355,7 +355,9 @@ void        ssbtoxsockbuf (struct signalsockbuf *sb, struct xsockbuf *xsb);
 int    ssb_wait (struct signalsockbuf *sb);
 int    _ssb_lock (struct signalsockbuf *sb);
 
-int    soabort (struct socket *so);
+void   soabort (struct socket *so);
+void   soaborta (struct socket *so);
+void   soabort_oncpu (struct socket *so);
 int    soaccept (struct socket *so, struct sockaddr **nam);
 struct socket *soalloc (int waitok);
 int    sobind (struct socket *so, struct sockaddr *nam, struct thread *td);
@@ -379,12 +381,17 @@ int       solisten (struct socket *so, int backlog, struct thread *td);
 struct socket *sonewconn (struct socket *head, int connstatus);
 int    sooptcopyin (struct sockopt *sopt, void *buf, size_t len,
                         size_t minlen);
+int    soopt_to_kbuf (struct sockopt *sopt, void *buf, size_t len,
+                        size_t minlen);
 int    sooptcopyout (struct sockopt *sopt, const void *buf, size_t len);
+void   soopt_from_kbuf (struct sockopt *sopt, const void *buf, size_t len);
 
 /* XXX; prepare mbuf for (__FreeBSD__ < 3) routines. */
 int    soopt_getm (struct sockopt *sopt, struct mbuf **mp);
 int    soopt_mcopyin (struct sockopt *sopt, struct mbuf *m);
+void   soopt_to_mbuf (struct sockopt *sopt, struct mbuf *m);
 int    soopt_mcopyout (struct sockopt *sopt, struct mbuf *m);
+int    soopt_from_mbuf (struct sockopt *sopt, struct mbuf *m);
 
 int    sopoll (struct socket *so, int events, struct ucred *cred,
                    struct thread *td);