typed mbufs
[unix-history] / usr / src / sys / net / if_loop.c
index 8dd37fd..e783861 100644 (file)
@@ -1,4 +1,4 @@
-/*     if_loop.c       4.1     81/11/29        */
+/*     if_loop.c       4.15    82/10/13        */
 
 /*
  * Loopback interface driver for protocol testing and timing.
 
 /*
  * Loopback interface driver for protocol testing and timing.
@@ -8,15 +8,18 @@
 #include "../h/systm.h"
 #include "../h/mbuf.h"
 #include "../h/socket.h"
 #include "../h/systm.h"
 #include "../h/mbuf.h"
 #include "../h/socket.h"
-#include "../net/in.h"
-#include "../net/in_systm.h"
+#include "../netinet/in.h"
+#include "../netinet/in_systm.h"
 #include "../net/if.h"
 #include "../net/if.h"
-#include "../net/ip.h"
-#include "../net/ip_var.h"
-#include "../h/mtpr.h"
+#include "../net/netisr.h"
+#include "../netinet/ip.h"
+#include "../netinet/ip_var.h"
+#include "../vax/mtpr.h"
+#include "../net/route.h"
+#include <errno.h>
 
 
-#define        LONET   254
-#define        LOMTU   1024
+#define        LONET   127
+#define        LOMTU   (1024+512)
 
 struct ifnet loif;
 int    looutput();
 
 struct ifnet loif;
 int    looutput();
@@ -24,36 +27,52 @@ int looutput();
 loattach()
 {
        register struct ifnet *ifp = &loif;
 loattach()
 {
        register struct ifnet *ifp = &loif;
+       register struct sockaddr_in *sin;
 
 
+       ifp->if_name = "lo";
        ifp->if_mtu = LOMTU;
        ifp->if_net = LONET;
        ifp->if_mtu = LOMTU;
        ifp->if_net = LONET;
+       sin = (struct sockaddr_in *)&ifp->if_addr;
+       sin->sin_family = AF_INET;
+       sin->sin_addr = if_makeaddr(ifp->if_net, 0);
+       ifp->if_flags = IFF_UP;
        ifp->if_output = looutput;
        ifp->if_output = looutput;
-       ifp->if_next = ifnet;
-       ifnet = ifp;
+       if_attach(ifp);
+       if_rtinit(ifp, RTF_UP);
 }
 
 }
 
-looutput(ifp, m0, pf)
+looutput(ifp, m0, dst)
        struct ifnet *ifp;
        struct mbuf *m0;
        struct ifnet *ifp;
        struct mbuf *m0;
-       int pf;
+       struct sockaddr *dst;
 {
        int s = splimp();
 {
        int s = splimp();
+       register struct ifqueue *ifq;
 
 
-       switch (pf) {
+       ifp->if_opackets++;
+       switch (dst->sa_family) {
 
 #ifdef INET
 
 #ifdef INET
-       case PF_INET:
-               IF_ENQUEUE(&ipintrq, m0);
-               setipintr();
+       case AF_INET:
+               ifq = &ipintrq;
+               if (IF_QFULL(ifq)) {
+                       IF_DROP(ifq);
+                       m_freem(m0);
+                       splx(s);
+                       return (ENOBUFS);
+               }
+               IF_ENQUEUE(ifq, m0);
+               schednetisr(NETISR_IP);
                break;
 #endif
                break;
 #endif
-
        default:
                splx(s);
        default:
                splx(s);
-               printf("lo%d: can't encapsulate pf%d\n", ifp->if_unit, pf);
+               printf("lo%d: can't handle af%d\n", ifp->if_unit,
+                       dst->sa_family);
                m_freem(m0);
                m_freem(m0);
-               return (0);
+               return (EAFNOSUPPORT);
        }
        }
+       ifp->if_ipackets++;
        splx(s);
        splx(s);
-       return (1);
+       return (0);
 }
 }