|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: *
17: * @(#)if_loop.c 7.4 (Berkeley) 6/27/88
18: */
19:
20: /*
21: * Loopback interface driver for protocol testing and timing.
22: */
23:
24: #include "param.h"
25: #include "systm.h"
26: #include "mbuf.h"
27: #include "socket.h"
28: #include "errno.h"
29: #include "ioctl.h"
30:
31: #include "../net/if.h"
32: #include "../net/netisr.h"
33: #include "../net/route.h"
34:
35: #include "../machine/mtpr.h"
36:
37: #ifdef INET
38: #include "../netinet/in.h"
39: #include "../netinet/in_systm.h"
40: #include "../netinet/in_var.h"
41: #include "../netinet/ip.h"
42: #endif
43:
44: #ifdef NS
45: #include "../netns/ns.h"
46: #include "../netns/ns_if.h"
47: #endif
48:
49: #define LOMTU (1024+512)
50:
51: struct ifnet loif;
52: int looutput(), loioctl();
53:
54: loattach()
55: {
56: register struct ifnet *ifp = &loif;
57:
58: ifp->if_name = "lo";
59: ifp->if_mtu = LOMTU;
60: ifp->if_flags = IFF_LOOPBACK;
61: ifp->if_ioctl = loioctl;
62: ifp->if_output = looutput;
63: if_attach(ifp);
64: }
65:
66: looutput(ifp, m0, dst)
67: struct ifnet *ifp;
68: register struct mbuf *m0;
69: struct sockaddr *dst;
70: {
71: int s;
72: register struct ifqueue *ifq;
73: struct mbuf *m;
74:
75: /*
76: * Place interface pointer before the data
77: * for the receiving protocol.
78: */
79: if (m0->m_off <= MMAXOFF &&
80: m0->m_off >= MMINOFF + sizeof(struct ifnet *)) {
81: m0->m_off -= sizeof(struct ifnet *);
82: m0->m_len += sizeof(struct ifnet *);
83: } else {
84: MGET(m, M_DONTWAIT, MT_HEADER);
85: if (m == (struct mbuf *)0)
86: return (ENOBUFS);
87: m->m_off = MMINOFF;
88: m->m_len = sizeof(struct ifnet *);
89: m->m_next = m0;
90: m0 = m;
91: }
92: *(mtod(m0, struct ifnet **)) = ifp;
93: s = splimp();
94: ifp->if_opackets++;
95: switch (dst->sa_family) {
96:
97: #ifdef INET
98: case AF_INET:
99: ifq = &ipintrq;
100: if (IF_QFULL(ifq)) {
101: IF_DROP(ifq);
102: m_freem(m0);
103: splx(s);
104: return (ENOBUFS);
105: }
106: IF_ENQUEUE(ifq, m0);
107: schednetisr(NETISR_IP);
108: break;
109: #endif
110: #ifdef NS
111: case AF_NS:
112: ifq = &nsintrq;
113: if (IF_QFULL(ifq)) {
114: IF_DROP(ifq);
115: m_freem(m0);
116: splx(s);
117: return (ENOBUFS);
118: }
119: IF_ENQUEUE(ifq, m0);
120: schednetisr(NETISR_NS);
121: break;
122: #endif
123: default:
124: splx(s);
125: printf("lo%d: can't handle af%d\n", ifp->if_unit,
126: dst->sa_family);
127: m_freem(m0);
128: return (EAFNOSUPPORT);
129: }
130: ifp->if_ipackets++;
131: splx(s);
132: return (0);
133: }
134:
135: /*
136: * Process an ioctl request.
137: */
138: /* ARGSUSED */
139: loioctl(ifp, cmd, data)
140: register struct ifnet *ifp;
141: int cmd;
142: caddr_t data;
143: {
144: int error = 0;
145:
146: switch (cmd) {
147:
148: case SIOCSIFADDR:
149: ifp->if_flags |= IFF_UP;
150: /*
151: * Everything else is done at a higher level.
152: */
153: break;
154:
155: default:
156: error = EINVAL;
157: }
158: return (error);
159: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.