|
|
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: * @(#)if_ether.h 8.3 (Berkeley) 5/2/95 ! 55: */ ! 56: ! 57: #ifndef _NETINET_IF_ETHER_H_ ! 58: #define _NETINET_IF_ETHER_H_ ! 59: ! 60: ! 61: #include <net/ethernet.h> ! 62: ! 63: #include <netinet/in.h> ! 64: #include <net/if_arp.h> ! 65: #include <net/etherdefs.h> ! 66: #define ea_byte ether_addr_octet ! 67: ! 68: ! 69: /* ! 70: * Macro for looking up the ether_multi record for a given range of Ethernet ! 71: * multicast addresses connected to a given arpcom structure. If no matching ! 72: * record is found, "enm" returns NULL. ! 73: */ ! 74: #define ETHER_LOOKUP_MULTI(addrlo, addrhi, ac, enm) \ ! 75: /* u_char addrlo[6]; */ \ ! 76: /* u_char addrhi[6]; */ \ ! 77: /* struct arpcom *ac; */ \ ! 78: /* struct ether_multi *enm; */ \ ! 79: { \ ! 80: for ((enm) = (ac)->ac_multiaddrs; \ ! 81: (enm) != NULL && \ ! 82: (bcmp((enm)->enm_addrlo, (addrlo), 6) != 0 || \ ! 83: bcmp((enm)->enm_addrhi, (addrhi), 6) != 0); \ ! 84: (enm) = (enm)->enm_next); \ ! 85: } ! 86: ! 87: /* ! 88: * Macro to step through all of the ether_multi records, one at a time. ! 89: * The current position is remembered in "step", which the caller must ! 90: * provide. ETHER_FIRST_MULTI(), below, must be called to initialize "step" ! 91: * and get the first record. Both macros return a NULL "enm" when there ! 92: * are no remaining records. ! 93: */ ! 94: #define ETHER_NEXT_MULTI(step, enm) \ ! 95: /* struct ether_multistep step; */ \ ! 96: /* struct ether_multi *enm; */ \ ! 97: { \ ! 98: if (((enm) = (step).e_enm) != NULL) \ ! 99: (step).e_enm = (enm)->enm_next; \ ! 100: } ! 101: ! 102: #define ETHER_FIRST_MULTI(step, ac, enm) \ ! 103: /* struct ether_multistep step; */ \ ! 104: /* struct arpcom *ac; */ \ ! 105: /* struct ether_multi *enm; */ \ ! 106: { \ ! 107: (step).e_enm = (ac)->ac_multiaddrs; \ ! 108: ETHER_NEXT_MULTI((step), (enm)); \ ! 109: } ! 110: ! 111: /* ! 112: * Macro to map an IP multicast address to an Ethernet multicast address. ! 113: * The high-order 25 bits of the Ethernet address are statically assigned, ! 114: * and the low-order 23 bits are taken from the low end of the IP address. ! 115: */ ! 116: #define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr) \ ! 117: /* struct in_addr *ipaddr; */ \ ! 118: /* u_char enaddr[ETHER_ADDR_LEN]; */ \ ! 119: { \ ! 120: (enaddr)[0] = 0x01; \ ! 121: (enaddr)[1] = 0x00; \ ! 122: (enaddr)[2] = 0x5e; \ ! 123: (enaddr)[3] = ((u_char *)ipaddr)[1] & 0x7f; \ ! 124: (enaddr)[4] = ((u_char *)ipaddr)[2]; \ ! 125: (enaddr)[5] = ((u_char *)ipaddr)[3]; \ ! 126: } ! 127: ! 128: /* ! 129: * Ethernet Address Resolution Protocol. ! 130: * ! 131: * See RFC 826 for protocol description. Structure below is adapted ! 132: * to resolving internet addresses. Field names used correspond to ! 133: * RFC 826. ! 134: */ ! 135: struct ether_arp { ! 136: struct arphdr ea_hdr; /* fixed-size header */ ! 137: u_char arp_sha[ETHER_ADDR_LEN]; /* sender hardware address */ ! 138: u_char arp_spa[4]; /* sender protocol address */ ! 139: u_char arp_tha[ETHER_ADDR_LEN]; /* target hardware address */ ! 140: u_char arp_tpa[4]; /* target protocol address */ ! 141: }; ! 142: #define arp_hrd ea_hdr.ar_hrd ! 143: #define arp_pro ea_hdr.ar_pro ! 144: #define arp_hln ea_hdr.ar_hln ! 145: #define arp_pln ea_hdr.ar_pln ! 146: #define arp_op ea_hdr.ar_op ! 147: ! 148: struct sockaddr_inarp { ! 149: u_char sin_len; ! 150: u_char sin_family; ! 151: u_short sin_port; ! 152: struct in_addr sin_addr; ! 153: struct in_addr sin_srcaddr; ! 154: u_short sin_tos; ! 155: u_short sin_other; ! 156: #define SIN_PROXY 1 ! 157: }; ! 158: /* ! 159: * IP and ethernet specific routing flags ! 160: */ ! 161: #define RTF_USETRAILERS RTF_PROTO1 /* use trailers */ ! 162: #define RTF_ANNOUNCE RTF_PROTO2 /* announce new arp entry */ ! 163: ! 164: #ifdef KERNEL ! 165: extern u_char ether_ipmulticast_min[ETHER_ADDR_LEN]; ! 166: extern u_char ether_ipmulticast_max[ETHER_ADDR_LEN]; ! 167: extern struct ifqueue arpintrq; ! 168: ! 169: int arpresolve __P((struct arpcom *, struct rtentry *, struct mbuf *, ! 170: struct sockaddr *, u_char *, struct rtentry *)); ! 171: void arp_ifinit __P((struct arpcom *, struct ifaddr *)); ! 172: #endif ! 173: ! 174: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.