|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * Copyright (c) 1982, 1986, 1993
24: * The Regents of the University of California. All rights reserved.
25: *
26: * Redistribution and use in source and binary forms, with or without
27: * modification, are permitted provided that the following conditions
28: * are met:
29: * 1. Redistributions of source code must retain the above copyright
30: * notice, this list of conditions and the following disclaimer.
31: * 2. Redistributions in binary form must reproduce the above copyright
32: * notice, this list of conditions and the following disclaimer in the
33: * documentation and/or other materials provided with the distribution.
34: * 3. All advertising materials mentioning features or use of this software
35: * must display the following acknowledgement:
36: * This product includes software developed by the University of
37: * California, Berkeley and its contributors.
38: * 4. Neither the name of the University nor the names of its contributors
39: * may be used to endorse or promote products derived from this software
40: * without specific prior written permission.
41: *
42: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
43: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
46: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52: * SUCH DAMAGE.
53: *
54: * From: @(#)if_loop.c 8.1 (Berkeley) 6/10/93
55: */
56:
57: /*
58: * Discard interface driver for protocol testing and timing.
59: * (Based on the loopback.)
60: */
61:
62: #include <sys/param.h>
63: #include <sys/systm.h>
64: #include <sys/kernel.h>
65: #include <sys/mbuf.h>
66: #include <sys/socket.h>
67: #include <sys/sockio.h>
68:
69: #include <net/if.h>
70: #include <net/if_types.h>
71: #include <net/route.h>
72: #include <net/bpf.h>
73:
74: #include "bpfilter.h"
75: #include "opt_inet.h"
76:
77: #if TINY_DSMTU
78: #define DSMTU (1024+512)
79: #else
80: #define DSMTU 65532
81: #endif
82:
83: static void discattach __P((void *dummy));
84: PSEUDO_SET(discattach, if_disc);
85:
86: static struct ifnet discif;
87: static int discoutput(struct ifnet *, struct mbuf *, struct sockaddr *,
88: struct rtentry *);
89: static void discrtrequest(int cmd, struct rtentry *rt, struct sockaddr *sa);
90: static int discioctl(struct ifnet *, u_long, caddr_t);
91:
92: /* ARGSUSED */
93: static void
94: discattach(dummy)
95: void *dummy;
96: {
97: register struct ifnet *ifp = &discif;
98:
99: ifp->if_name = "ds";
100: ifp->if_family = APPLE_IF_FAM_DISC;
101: ifp->if_mtu = DSMTU;
102: ifp->if_flags = IFF_LOOPBACK | IFF_MULTICAST;
103: ifp->if_ioctl = discioctl;
104: ifp->if_output = discoutput;
105: ifp->if_type = IFT_LOOP;
106: ifp->if_hdrlen = 0;
107: ifp->if_addrlen = 0;
108: if_attach(ifp);
109: #if NBPFILTER > 0
110: bpfattach(ifp, DLT_NULL, sizeof(u_int));
111: #endif
112: }
113:
114: static int
115: discoutput(ifp, m, dst, rt)
116: struct ifnet *ifp;
117: register struct mbuf *m;
118: struct sockaddr *dst;
119: register struct rtentry *rt;
120: {
121: if ((m->m_flags & M_PKTHDR) == 0)
122: panic("discoutput no HDR");
123: #if NBPFILTER > 0
124: /* BPF write needs to be handled specially */
125: if (dst->sa_family == AF_UNSPEC) {
126: dst->sa_family = *(mtod(m, int *));
127: m->m_len -= sizeof(int);
128: m->m_pkthdr.len -= sizeof(int);
129: m->m_data += sizeof(int);
130: }
131:
132: if (discif.if_bpf) {
133: /*
134: * We need to prepend the address family as
135: * a four byte field. Cons up a dummy header
136: * to pacify bpf. This is safe because bpf
137: * will only read from the mbuf (i.e., it won't
138: * try to free it or keep a pointer a to it).
139: */
140: struct mbuf m0;
141: u_int af = dst->sa_family;
142:
143: m0.m_next = m;
144: m0.m_len = 4;
145: m0.m_data = (char *)⁡
146:
147: bpf_mtap(&discif, &m0);
148: }
149: #endif
150: m->m_pkthdr.rcvif = ifp;
151:
152: ifp->if_opackets++;
153: ifp->if_obytes += m->m_pkthdr.len;
154:
155: m_freem(m);
156: return 0;
157: }
158:
159: /* ARGSUSED */
160: static void
161: discrtrequest(cmd, rt, sa)
162: int cmd;
163: struct rtentry *rt;
164: struct sockaddr *sa;
165: {
166: if (rt)
167: rt->rt_rmx.rmx_mtu = DSMTU;
168: }
169:
170: /*
171: * Process an ioctl request.
172: */
173: /* ARGSUSED */
174: static int
175: discioctl(ifp, cmd, data)
176: register struct ifnet *ifp;
177: u_long cmd;
178: caddr_t data;
179: {
180: register struct ifaddr *ifa;
181: register struct ifreq *ifr = (struct ifreq *)data;
182: register int error = 0;
183:
184: switch (cmd) {
185:
186: case SIOCSIFADDR:
187: ifp->if_flags |= IFF_UP;
188: ifa = (struct ifaddr *)data;
189: if (ifa != 0)
190: ifa->ifa_rtrequest = discrtrequest;
191: /*
192: * Everything else is done at a higher level.
193: */
194: break;
195:
196: case SIOCADDMULTI:
197: case SIOCDELMULTI:
198: if (ifr == 0) {
199: error = EAFNOSUPPORT; /* XXX */
200: break;
201: }
202: switch (ifr->ifr_addr.sa_family) {
203:
204: #if INET
205: case AF_INET:
206: break;
207: #endif
208:
209: default:
210: error = EAFNOSUPPORT;
211: break;
212: }
213: break;
214:
215: case SIOCSIFMTU:
216: ifp->if_mtu = ifr->ifr_mtu;
217: break;
218:
219: default:
220: error = EINVAL;
221: }
222: return (error);
223: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.