make changes to RTM_GET so that you can indicate that you want
[unix-history] / usr / src / sys / net / if_loop.c
index 5791e6f..61e0d80 100644 (file)
@@ -4,7 +4,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)if_loop.c   7.10 (Berkeley) %G%
+ *     @(#)if_loop.c   7.12 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
 #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;
@@ -62,31 +68,23 @@ loattach()
        if_attach(ifp);
 }
 
        if_attach(ifp);
 }
 
-struct mbuf *Loop_Sanity;
-
-looutput(ifp, m, dst)
+looutput(ifp, m, dst, rt)
        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;
-       register struct ifqueue *ifq;
+       int s, isr;
+       register struct ifqueue *ifq = 0;
 
        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;
 
-{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);
-}
-}
-
+       if (rt && rt->rt_flags & RTF_REJECT) {
+               m_freem(m);
+               return (rt->rt_flags & RTF_HOST ? EHOSTUNREACH : ENETUNREACH);
+       }
        s = splimp();
        ifp->if_opackets++;
        ifp->if_obytes += m->m_pkthdr.len;
        s = splimp();
        ifp->if_opackets++;
        ifp->if_obytes += m->m_pkthdr.len;
@@ -95,40 +93,25 @@ if (mlen != m->m_pkthdr.len) {
 #ifdef INET
        case AF_INET:
                ifq = &ipintrq;
 #ifdef INET
        case AF_INET:
                ifq = &ipintrq;
-               if (IF_QFULL(ifq)) {
-                       IF_DROP(ifq);
-                       m_freem(m);
-                       splx(s);
-                       return (ENOBUFS);
-               }
-               IF_ENQUEUE(ifq, m);
-               schednetisr(NETISR_IP);
+               isr = NETISR_IP;
                break;
 #endif
 #ifdef NS
        case AF_NS:
                ifq = &nsintrq;
                break;
 #endif
 #ifdef NS
        case AF_NS:
                ifq = &nsintrq;
-               if (IF_QFULL(ifq)) {
-                       IF_DROP(ifq);
-                       m_freem(m);
-                       splx(s);
-                       return (ENOBUFS);
-               }
-               IF_ENQUEUE(ifq, m);
-               schednetisr(NETISR_NS);
+               isr = NETISR_NS;
                break;
 #endif
 #ifdef ISO
        case AF_ISO:
                ifq = &clnlintrq;
                break;
 #endif
 #ifdef ISO
        case AF_ISO:
                ifq = &clnlintrq;
-               if (IF_QFULL(ifq)) {
-                       IF_DROP(ifq);
-                       m_freem(m);
-                       splx(s);
-                       return (ENOBUFS);
-               }
-               IF_ENQUEUE(ifq, m);
-               schednetisr(NETISR_ISO);
+               isr = NETISR_ISO;
+               break;
+#endif
+#ifdef CCITT
+       case AF_CCITT:
+               ifq = &hdintrq;
+               isr = NETISR_CCITT;
                break;
 #endif
        default:
                break;
 #endif
        default:
@@ -138,6 +121,14 @@ if (mlen != m->m_pkthdr.len) {
                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);
@@ -157,6 +148,9 @@ 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;
                /*