pass flags from device close to l_close
[unix-history] / usr / src / sys / net / raw_cb.c
index 6107b38..7f80d51 100644 (file)
@@ -1,9 +1,10 @@
 /*
 /*
- * Copyright (c) 1980 Regents of the University of California.
- * All rights reserved.  The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
+ * Copyright (c) 1980, 1986 Regents of the University of California.
+ * All rights reserved.
  *
  *
- *     @(#)raw_cb.c    6.7 (Berkeley) %G%
+ * %sccs.include.redist.c%
+ *
+ *     @(#)raw_cb.c    7.11 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
 #include "route.h"
 #include "raw_cb.h"
 #include "../netinet/in.h"
 #include "route.h"
 #include "raw_cb.h"
 #include "../netinet/in.h"
-#ifdef PUP
-#include "../netpup/pup.h"
-#endif
 
 
-#include "../vax/mtpr.h"
+#include "machine/mtpr.h"
 
 /*
  * Routines to manage the raw protocol control blocks. 
 
 /*
  * Routines to manage the raw protocol control blocks. 
@@ -34,6 +32,9 @@
  *     redo address binding to allow wildcards
  */
 
  *     redo address binding to allow wildcards
  */
 
+u_long raw_sendspace = RAWSNDQ;
+u_long raw_recvspace = RAWRCVQ;
+
 /*
  * Allocate a control block and a nominal amount
  * of buffer space for the socket.
 /*
  * Allocate a control block and a nominal amount
  * of buffer space for the socket.
@@ -42,29 +43,23 @@ raw_attach(so, proto)
        register struct socket *so;
        int proto;
 {
        register struct socket *so;
        int proto;
 {
-       struct mbuf *m;
-       register struct rawcb *rp;
+       register struct rawcb *rp = sotorawcb(so);
+       int error;
 
 
-       m = m_getclr(M_DONTWAIT, MT_PCB);
-       if (m == 0)
+       /*
+        * It is assumed that raw_attach is called
+        * after space has been allocated for the
+        * rawcb.
+        */
+       if (rp == 0)
                return (ENOBUFS);
                return (ENOBUFS);
-       if (sbreserve(&so->so_snd, RAWSNDQ) == 0)
-               goto bad;
-       if (sbreserve(&so->so_rcv, RAWRCVQ) == 0)
-               goto bad2;
-       rp = mtod(m, struct rawcb *);
+       if (error = soreserve(so, raw_sendspace, raw_recvspace))
+               return (error);
        rp->rcb_socket = so;
        rp->rcb_socket = so;
-       so->so_pcb = (caddr_t)rp;
-       rp->rcb_pcb = 0;
        rp->rcb_proto.sp_family = so->so_proto->pr_domain->dom_family;
        rp->rcb_proto.sp_protocol = proto;
        insque(rp, &rawcb);
        return (0);
        rp->rcb_proto.sp_family = so->so_proto->pr_domain->dom_family;
        rp->rcb_proto.sp_protocol = proto;
        insque(rp, &rawcb);
        return (0);
-bad2:
-       sbrelease(&so->so_snd);
-bad:
-       (void) m_free(m);
-       return (ENOBUFS);
 }
 
 /*
 }
 
 /*
@@ -76,12 +71,15 @@ raw_detach(rp)
 {
        struct socket *so = rp->rcb_socket;
 
 {
        struct socket *so = rp->rcb_socket;
 
-       if (rp->rcb_route.ro_rt)
-               rtfree(rp->rcb_route.ro_rt);
        so->so_pcb = 0;
        sofree(so);
        remque(rp);
        so->so_pcb = 0;
        sofree(so);
        remque(rp);
-       m_freem(dtom(rp));
+#ifdef notdef
+       if (rp->rcb_laddr)
+               m_freem(dtom(rp->rcb_laddr));
+       rp->rcb_laddr = 0;
+#endif
+       free((caddr_t)(rp), M_PCB);
 }
 
 /*
 }
 
 /*
@@ -91,11 +89,16 @@ raw_disconnect(rp)
        struct rawcb *rp;
 {
 
        struct rawcb *rp;
 {
 
-       rp->rcb_flags &= ~RAW_FADDR;
+#ifdef notdef
+       if (rp->rcb_faddr)
+               m_freem(dtom(rp->rcb_faddr));
+       rp->rcb_faddr = 0;
+#endif
        if (rp->rcb_socket->so_state & SS_NOFDREF)
                raw_detach(rp);
 }
 
        if (rp->rcb_socket->so_state & SS_NOFDREF)
                raw_detach(rp);
 }
 
+#ifdef notdef
 raw_bind(so, nam)
        register struct socket *so;
        struct mbuf *nam;
 raw_bind(so, nam)
        register struct socket *so;
        struct mbuf *nam;
@@ -105,65 +108,9 @@ raw_bind(so, nam)
 
        if (ifnet == 0)
                return (EADDRNOTAVAIL);
 
        if (ifnet == 0)
                return (EADDRNOTAVAIL);
-/* BEGIN DUBIOUS */
-       /*
-        * Should we verify address not already in use?
-        * Some say yes, others no.
-        */
-       switch (addr->sa_family) {
-
-#if defined(INET) || defined(BBNNET)
-       case AF_IMPLINK:
-       case AF_INET: {
-               if (((struct sockaddr_in *)addr)->sin_addr.s_addr &&
-                   ifa_ifwithaddr(addr) == 0)
-                       return (EADDRNOTAVAIL);
-               break;
-       }
-#endif
-
-#ifdef PUP
-       /*
-        * Curious, we convert PUP address format to internet
-        * to allow us to verify we're asking for an Ethernet
-        * interface.  This is wrong, but things are heavily
-        * oriented towards the internet addressing scheme, and
-        * converting internet to PUP would be very expensive.
-        */
-       case AF_PUP: {
-               struct sockaddr_pup *spup = (struct sockaddr_pup *)addr;
-               struct sockaddr_in inpup;
-
-               bzero((caddr_t)&inpup, (unsigned)sizeof(inpup));
-               inpup.sin_family = AF_INET;
-               inpup.sin_addr = in_makeaddr(spup->spup_net, spup->spup_host);
-               if (inpup.sin_addr.s_addr &&
-                   ifa_ifwithaddr((struct sockaddr *)&inpup) == 0)
-                       return (EADDRNOTAVAIL);
-               break;
-       }
-#endif
-
-       default:
-               return (EAFNOSUPPORT);
-       }
-/* END DUBIOUS */
        rp = sotorawcb(so);
        rp = sotorawcb(so);
-       bcopy((caddr_t)addr, (caddr_t)&rp->rcb_laddr, sizeof (*addr));
-       rp->rcb_flags |= RAW_LADDR;
+       nam = m_copym(nam, 0, M_COPYALL, M_WAITOK);
+       rp->rcb_laddr = mtod(nam, struct sockaddr *);
        return (0);
 }
        return (0);
 }
-
-/*
- * Associate a peer's address with a
- * raw connection block.
- */
-raw_connaddr(rp, nam)
-       struct rawcb *rp;
-       struct mbuf *nam;
-{
-       struct sockaddr *addr = mtod(nam, struct sockaddr *);
-
-       bcopy((caddr_t)addr, (caddr_t)&rp->rcb_faddr, sizeof(*addr));
-       rp->rcb_flags |= RAW_FADDR;
-}
+#endif