BSD 4_3_Reno release
[unix-history] / usr / src / sys / net / if_loop.c
index 61e0d80..919178c 100644 (file)
@@ -2,9 +2,22 @@
  * Copyright (c) 1982, 1986 Regents of the University of California.
  * All rights reserved.
  *
  * Copyright (c) 1982, 1986 Regents of the University of California.
  * All rights reserved.
  *
- * %sccs.include.redist.c%
+ * Redistribution is only permitted until one year after the first shipment
+ * of 4.4BSD by the Regents.  Otherwise, redistribution and use in source and
+ * binary forms are permitted provided that: (1) source distributions retain
+ * this entire copyright notice and comment, and (2) distributions including
+ * binaries display the following acknowledgement:  This product includes
+ * software developed by the University of California, Berkeley and its
+ * contributors'' in the documentation or other materials provided with the
+ * distribution and in all advertising materials mentioning features or use
+ * of this software.  Neither the name of the University nor the names of
+ * its contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  *
- *     @(#)if_loop.c   7.12 (Berkeley) %G%
+ *     @(#)if_loop.c   7.10 (Berkeley) 6/28/90
  */
 
 /*
  */
 
 /*
 #include "../netiso/iso_var.h"
 #endif
 
 #include "../netiso/iso_var.h"
 #endif
 
-#ifdef CCITT
-#include "../netccitt/x25.h"
-#include "../netccitt/hdlc.h"
-#include "../netccitt/hd_var.h"
-#endif
-
 #define        LOMTU   (1024+512)
 
 struct ifnet loif;
 #define        LOMTU   (1024+512)
 
 struct ifnet loif;
@@ -68,23 +75,31 @@ loattach()
        if_attach(ifp);
 }
 
        if_attach(ifp);
 }
 
-looutput(ifp, m, dst, rt)
+struct mbuf *Loop_Sanity;
+
+looutput(ifp, m, dst)
        struct ifnet *ifp;
        register struct mbuf *m;
        struct sockaddr *dst;
        struct ifnet *ifp;
        register struct mbuf *m;
        struct sockaddr *dst;
-       register struct rtentry *rt;
 {
 {
-       int s, isr;
-       register struct ifqueue *ifq = 0;
+       int s;
+       register struct ifqueue *ifq;
 
        if ((m->m_flags & M_PKTHDR) == 0)
                panic("looutput no HDR");
        m->m_pkthdr.rcvif = ifp;
 
 
        if ((m->m_flags & M_PKTHDR) == 0)
                panic("looutput no HDR");
        m->m_pkthdr.rcvif = ifp;
 
-       if (rt && rt->rt_flags & RTF_REJECT) {
-               m_freem(m);
-               return (rt->rt_flags & RTF_HOST ? EHOSTUNREACH : ENETUNREACH);
-       }
+{struct mbuf *mm; int mlen = 0;
+for (mm = m; m; m = m->m_next) /* XXX debugging code -- sklower */
+    mlen += m->m_len;
+m = mm;
+if (mlen != m->m_pkthdr.len) {
+       if (Loop_Sanity)
+               m_freem(Loop_Sanity);
+       Loop_Sanity = m_copy(m, 0, (int)M_COPYALL);
+}
+}
+
        s = splimp();
        ifp->if_opackets++;
        ifp->if_obytes += m->m_pkthdr.len;
        s = splimp();
        ifp->if_opackets++;
        ifp->if_obytes += m->m_pkthdr.len;
@@ -93,25 +108,40 @@ looutput(ifp, m, dst, rt)
 #ifdef INET
        case AF_INET:
                ifq = &ipintrq;
 #ifdef INET
        case AF_INET:
                ifq = &ipintrq;
-               isr = NETISR_IP;
+               if (IF_QFULL(ifq)) {
+                       IF_DROP(ifq);
+                       m_freem(m);
+                       splx(s);
+                       return (ENOBUFS);
+               }
+               IF_ENQUEUE(ifq, m);
+               schednetisr(NETISR_IP);
                break;
 #endif
 #ifdef NS
        case AF_NS:
                ifq = &nsintrq;
                break;
 #endif
 #ifdef NS
        case AF_NS:
                ifq = &nsintrq;
-               isr = NETISR_NS;
+               if (IF_QFULL(ifq)) {
+                       IF_DROP(ifq);
+                       m_freem(m);
+                       splx(s);
+                       return (ENOBUFS);
+               }
+               IF_ENQUEUE(ifq, m);
+               schednetisr(NETISR_NS);
                break;
 #endif
 #ifdef ISO
        case AF_ISO:
                ifq = &clnlintrq;
                break;
 #endif
 #ifdef ISO
        case AF_ISO:
                ifq = &clnlintrq;
-               isr = NETISR_ISO;
-               break;
-#endif
-#ifdef CCITT
-       case AF_CCITT:
-               ifq = &hdintrq;
-               isr = NETISR_CCITT;
+               if (IF_QFULL(ifq)) {
+                       IF_DROP(ifq);
+                       m_freem(m);
+                       splx(s);
+                       return (ENOBUFS);
+               }
+               IF_ENQUEUE(ifq, m);
+               schednetisr(NETISR_ISO);
                break;
 #endif
        default:
                break;
 #endif
        default:
@@ -121,14 +151,6 @@ looutput(ifp, m, dst, rt)
                m_freem(m);
                return (EAFNOSUPPORT);
        }
                m_freem(m);
                return (EAFNOSUPPORT);
        }
-       if (IF_QFULL(ifq)) {
-               IF_DROP(ifq);
-               m_freem(m);
-               splx(s);
-               return (ENOBUFS);
-       }
-       IF_ENQUEUE(ifq, m);
-       schednetisr(isr);
        ifp->if_ipackets++;
        ifp->if_ibytes += m->m_pkthdr.len;
        splx(s);
        ifp->if_ipackets++;
        ifp->if_ibytes += m->m_pkthdr.len;
        splx(s);
@@ -148,9 +170,6 @@ loioctl(ifp, cmd, data)
 
        switch (cmd) {
 
 
        switch (cmd) {
 
-#ifdef CCITT
-       case SIOCSIFCONF_X25:
-#endif
        case SIOCSIFADDR:
                ifp->if_flags |= IFF_UP;
                /*
        case SIOCSIFADDR:
                ifp->if_flags |= IFF_UP;
                /*