|
|
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.