xref: /csrg-svn/sys/net/if_loop.c (revision 5207)
1*5207Swnj /*	if_loop.c	4.4	81/12/07	*/
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 
185122Swnj #define	LONET	254
19*5207Swnj #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