icmp works with tcp and friends
[unix-history] / usr / src / sys / net / if_loop.c
... / ...
CommitLineData
1/* if_loop.c 4.11 82/04/16 */
2
3/*
4 * Loopback interface driver for protocol testing and timing.
5 */
6
7#include "../h/param.h"
8#include "../h/systm.h"
9#include "../h/mbuf.h"
10#include "../h/socket.h"
11#include "../net/in.h"
12#include "../net/in_systm.h"
13#include "../net/if.h"
14#include "../net/ip.h"
15#include "../net/ip_var.h"
16#include "../h/mtpr.h"
17#include "../net/route.h"
18#include <errno.h>
19
20#define LONET 127
21#define LOMTU (1024+512)
22
23struct ifnet loif;
24int looutput();
25
26loattach()
27{
28 register struct ifnet *ifp = &loif;
29 register struct sockaddr_in *sin;
30
31COUNT(LOATTACH);
32 ifp->if_name = "lo";
33 ifp->if_mtu = LOMTU;
34 ifp->if_net = LONET;
35 sin = (struct sockaddr_in *)&ifp->if_addr;
36 sin->sin_family = AF_INET;
37 sin->sin_addr = if_makeaddr(ifp->if_net, 0);
38 ifp->if_flags = IFF_UP;
39 ifp->if_output = looutput;
40 if_attach(ifp);
41 if_rtinit(ifp, RTF_DIRECT|RTF_UP);
42}
43
44looutput(ifp, m0, dst)
45 struct ifnet *ifp;
46 struct mbuf *m0;
47 struct sockaddr *dst;
48{
49 int s = splimp();
50 register struct ifqueue *ifq;
51
52COUNT(LOOUTPUT);
53 ifp->if_opackets++;
54 switch (dst->sa_family) {
55
56#ifdef INET
57 case AF_INET:
58 ifq = &ipintrq;
59 if (IF_QFULL(ifq)) {
60 IF_DROP(ifq);
61 m_freem(m0);
62 splx(s);
63 return (ENOBUFS);
64 }
65 IF_ENQUEUE(ifq, m0);
66 schednetisr(NETISR_IP);
67 break;
68#endif
69 default:
70 splx(s);
71 printf("lo%d: can't handle af%d\n", ifp->if_unit,
72 dst->sa_family);
73 m_freem(m0);
74 return (EAFNOSUPPORT);
75 }
76 ifp->if_ipackets++;
77 splx(s);
78 return (0);
79}