1*5296Sroot /* if_loop.c 4.5 81/12/22 */ 25122Swnj 35122Swnj /* 45122Swnj * Loopback interface driver for protocol testing and timing. 55122Swnj */ 65122Swnj 75122Swnj #include "../h/param.h" 85122Swnj #include "../h/systm.h" 95122Swnj #include "../h/mbuf.h" 105122Swnj #include "../h/socket.h" 115122Swnj #include "../net/in.h" 125122Swnj #include "../net/in_systm.h" 135122Swnj #include "../net/if.h" 145122Swnj #include "../net/ip.h" 155122Swnj #include "../net/ip_var.h" 165122Swnj #include "../h/mtpr.h" 175122Swnj 18*5296Sroot #define LONET 127 195207Swnj #define LOMTU (1024+512) 205122Swnj 215122Swnj struct ifnet loif; 225122Swnj int looutput(); 235122Swnj 245122Swnj loattach() 255122Swnj { 265122Swnj register struct ifnet *ifp = &loif; 275122Swnj 285172Swnj ifp->if_name = "lo"; 295122Swnj ifp->if_mtu = LOMTU; 305122Swnj ifp->if_net = LONET; 315172Swnj ifp->if_addr = if_makeaddr(ifp->if_net, 0); 325122Swnj ifp->if_output = looutput; 335161Swnj if_attach(ifp); 345122Swnj } 355122Swnj 365122Swnj looutput(ifp, m0, pf) 375122Swnj struct ifnet *ifp; 385122Swnj struct mbuf *m0; 395122Swnj int pf; 405122Swnj { 415122Swnj int s = splimp(); 425122Swnj 435172Swnj ifp->if_opackets++; 445122Swnj switch (pf) { 455122Swnj 465122Swnj #ifdef INET 475122Swnj case PF_INET: 485122Swnj IF_ENQUEUE(&ipintrq, m0); 495122Swnj setipintr(); 505122Swnj break; 515122Swnj #endif 525122Swnj 535122Swnj default: 545122Swnj splx(s); 555122Swnj printf("lo%d: can't encapsulate pf%d\n", ifp->if_unit, pf); 565122Swnj m_freem(m0); 575122Swnj return (0); 585122Swnj } 595172Swnj ifp->if_ipackets++; 605122Swnj splx(s); 615122Swnj return (1); 625122Swnj } 63