support partial dumps
[unix-history] / usr / src / sys / netns / idp_usrreq.c
index b98ac08..e25da8a 100644 (file)
@@ -1,4 +1,10 @@
-/*      idp_usrreq.c     6.1     85/05/30     */
+/*
+ * Copyright (c) 1982 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ *
+ *      @(#)idp_usrreq.c       6.6 (Berkeley) %G%
+ */
 
 #include "param.h"
 #include "dir.h"
 
 #include "param.h"
 #include "dir.h"
 
 struct sockaddr_ns idp_ns = { AF_NS };
 
 
 struct sockaddr_ns idp_ns = { AF_NS };
 
-int
-idp_input_panic = 1;
+/*
+ *  This may also be called for raw listeners.
+ */
 idp_input(m, nsp)
        struct mbuf *m;
        register struct nspcb *nsp;
 {
        register struct idp *idp = mtod(m, struct idp *);
 idp_input(m, nsp)
        struct mbuf *m;
        register struct nspcb *nsp;
 {
        register struct idp *idp = mtod(m, struct idp *);
-       if (idp_input_panic) {
-               if ((nsp==0) || ((idp->idp_pt==5) && (!(nsp->nsp_flags&NSP_RAWIN))))
-                       panic("Impossible idp_input");
+
+       if (nsp==0) {
+               panic("No nspcb");
        }
 
        /*
        }
 
        /*
@@ -64,6 +71,30 @@ idp_abort(nsp)
        ns_pcbdisconnect(nsp);
        soisdisconnected(so);
 }
        ns_pcbdisconnect(nsp);
        soisdisconnected(so);
 }
+/*
+ * Drop connection, reporting
+ * the specified error.
+ */
+struct nspcb *
+idp_drop(nsp, errno)
+       register struct nspcb *nsp;
+       int errno;
+{
+       struct socket *so = nsp->nsp_socket;
+
+       /*
+        * someday, in the xerox world
+        * we will generate error protocol packets
+        * announcing that the socket has gone away.
+        */
+       /*if (TCPS_HAVERCVDSYN(tp->t_state)) {
+               tp->t_state = TCPS_CLOSED;
+               (void) tcp_output(tp);
+       }*/
+       so->so_error = errno;
+       ns_pcbdisconnect(nsp);
+       soisdisconnected(so);
+}
 
 idp_output(nsp, m0)
        struct nspcb *nsp;
 
 idp_output(nsp, m0)
        struct nspcb *nsp;
@@ -95,7 +126,10 @@ idp_output(nsp, m0)
                } else {
                        struct mbuf *m1 = m_get(M_DONTWAIT, MT_DATA);
 
                } else {
                        struct mbuf *m1 = m_get(M_DONTWAIT, MT_DATA);
 
-                       if (m1 == 0) return (ENOBUFS);
+                       if (m1 == 0) {
+                               m_freem(m0);
+                               return (ENOBUFS);
+                       }
                        m1->m_len = 1;
                        m1->m_off = MMAXOFF - 1;
                        * mtod(m1, char *) = 0;
                        m1->m_len = 1;
                        m1->m_off = MMAXOFF - 1;
                        * mtod(m1, char *) = 0;
@@ -170,23 +204,29 @@ idp_ctloutput(req, so, level, name, value)
        register struct mbuf *m;
        struct nspcb *nsp = sotonspcb(so);
        int mask, error = 0;
        register struct mbuf *m;
        struct nspcb *nsp = sotonspcb(so);
        int mask, error = 0;
+       extern long ns_pexseq;
 
 
-       if (nsp == NULL) {
-               error = EINVAL;
-               goto release;
-       }
+       if (nsp == NULL)
+               return (EINVAL);
 
        switch (req) {
 
        switch (req) {
+
        case PRCO_GETOPT:
        case PRCO_GETOPT:
-               if (value==NULL) {
-                       error = EINVAL;
-                       goto release;
-               }
+               if (value==NULL)
+                       return (EINVAL);
                m = m_get(M_DONTWAIT, MT_DATA);
                m = m_get(M_DONTWAIT, MT_DATA);
+               if (m==NULL)
+                       return (ENOBUFS);
                switch (name) {
                switch (name) {
+
+               case SO_ALL_PACKETS:
+                       mask = NSP_ALL_PACKETS;
+                       goto get_flags;
+
                case SO_HEADERS_ON_INPUT:
                        mask = NSP_RAWIN;
                        goto get_flags;
                case SO_HEADERS_ON_INPUT:
                        mask = NSP_RAWIN;
                        goto get_flags;
+                       
                case SO_HEADERS_ON_OUTPUT:
                        mask = NSP_RAWOUT;
                get_flags:
                case SO_HEADERS_ON_OUTPUT:
                        mask = NSP_RAWOUT;
                get_flags:
@@ -194,6 +234,7 @@ idp_ctloutput(req, so, level, name, value)
                        m->m_off = MMAXOFF - sizeof(short);
                        *mtod(m, short *) = nsp->nsp_flags & mask;
                        break;
                        m->m_off = MMAXOFF - sizeof(short);
                        *mtod(m, short *) = nsp->nsp_flags & mask;
                        break;
+
                case SO_DEFAULT_HEADERS:
                        m->m_len = sizeof(struct idp);
                        m->m_off = MMAXOFF - sizeof(struct idp);
                case SO_DEFAULT_HEADERS:
                        m->m_len = sizeof(struct idp);
                        m->m_off = MMAXOFF - sizeof(struct idp);
@@ -206,16 +247,28 @@ idp_ctloutput(req, so, level, name, value)
                                idp->idp_dna = nsp->nsp_faddr;
                                idp->idp_sna = nsp->nsp_laddr;
                        }
                                idp->idp_dna = nsp->nsp_faddr;
                                idp->idp_sna = nsp->nsp_laddr;
                        }
+                       break;
+
+               case SO_SEQNO:
+                       m->m_len = sizeof(long);
+                       m->m_off = MMAXOFF - sizeof(long);
+                       *mtod(m, long *) = ns_pexseq++;
                }
                *value = m;
                break;
                }
                *value = m;
                break;
+
        case PRCO_SETOPT:
                switch (name) {
                        int mask, *ok;
 
        case PRCO_SETOPT:
                switch (name) {
                        int mask, *ok;
 
+               case SO_ALL_PACKETS:
+                       mask = NSP_ALL_PACKETS;
+                       goto set_head;
+
                case SO_HEADERS_ON_INPUT:
                        mask = NSP_RAWIN;
                        goto set_head;
                case SO_HEADERS_ON_INPUT:
                        mask = NSP_RAWIN;
                        goto set_head;
+
                case SO_HEADERS_ON_OUTPUT:
                        mask = NSP_RAWOUT;
                set_head:
                case SO_HEADERS_ON_OUTPUT:
                        mask = NSP_RAWOUT;
                set_head:
@@ -227,6 +280,7 @@ idp_ctloutput(req, so, level, name, value)
                                        nsp->nsp_flags &= ~mask;
                        } else error = EINVAL;
                        break;
                                        nsp->nsp_flags &= ~mask;
                        } else error = EINVAL;
                        break;
+
                case SO_DEFAULT_HEADERS:
                        {
                                register struct idp *idp
                case SO_DEFAULT_HEADERS:
                        {
                                register struct idp *idp
@@ -235,17 +289,16 @@ idp_ctloutput(req, so, level, name, value)
                        }
 #ifdef NSIP
                        break;
                        }
 #ifdef NSIP
                        break;
+
                case SO_NSIP_ROUTE:
                        error = nsip_route(*value);
                case SO_NSIP_ROUTE:
                        error = nsip_route(*value);
-                       break;
 #endif NSIP
                }
                if (value && *value)
                        m_freem(*value);
                break;
        }
 #endif NSIP
                }
                if (value && *value)
                        m_freem(*value);
                break;
        }
-       release:
-               return(error);
+       return (error);
 }
 
 /*ARGSUSED*/
 }
 
 /*ARGSUSED*/
@@ -422,7 +475,7 @@ idp_raw_usrreq(so, req, m, nam, rights)
 
        case PRU_ATTACH:
 
 
        case PRU_ATTACH:
 
-               if (nsp != NULL) {
+               if (!suser() || (nsp != NULL)) {
                        error = EINVAL;
                        break;
                }
                        error = EINVAL;
                        break;
                }
@@ -439,6 +492,6 @@ idp_raw_usrreq(so, req, m, nam, rights)
        default:
                error = idp_usrreq(so, req, m, nam, rights);
        }
        default:
                error = idp_usrreq(so, req, m, nam, rights);
        }
-       return(error);
+       return (error);
 }
 
 }