/* if_loop.c 4.13 82/06/20 */ /* * Loopback interface driver for protocol testing and timing. */ #include "sys/param.h" #include "sys/config.h" #include "sys/errno.h" #include "sys/types.h" #include "sys/systm.h" #include "net/misc.h" #include "net/mbuf.h" #include "net/socket.h" #include "net/in.h" #include "net/in_systm.h" #include "net/if.h" #include "net/ip.h" #include "net/ip_var.h" #include "net/route.h" #include "errno.h" #define LONET 0x7f000000 #define LOMTU (1024+512) struct ifnet loif; int looutput(); loattach() { register struct ifnet *ifp = &loif; register struct sockaddr_in *sin; ifp->if_name = "lo"; ifp->if_mtu = LOMTU; ifp->if_net = htonl((u_long)LONET); sin = (struct sockaddr_in *)&ifp->if_addr; sin->sin_family = AF_INET; /* sin->sin_addr = if_makeaddr((u_long)ifp->if_net, (u_long)0); */ sin->sin_addr = if_makeaddr((u_long)ifp->if_net, (u_long)1); ifp->if_flags = IFF_UP; ifp->if_output = looutput; if_attach(ifp); if_rtinit(ifp, RTF_UP); } looutput(ifp, m0, dst) register struct ifnet *ifp; register struct mbuf *m0; register struct sockaddr *dst; { register int s = splimp(); register struct ifqueue *ifq; ifp->if_opackets++; switch (dst->sa_family) { #ifdef INET 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 default: splx(s); printf("lo%d: can't handle af%d\n", ifp->if_unit, dst->sa_family); m_freem(m0); return (EAFNOSUPPORT); } ifp->if_ipackets++; splx(s); return (0); }